From 0865c2142be2f1ecd8bdb1b7b62125b7aba18b7c Mon Sep 17 00:00:00 2001 From: Nick Fitzpatrick <nick@metabase.com> Date: Thu, 9 Nov 2023 09:38:59 -0400 Subject: [PATCH] Adding Stacked Checkbox component (#35448) * Adding Stacked Checkbox component * Switching to checkbox variant * PR Feedback * Storybook cleanup * including description --- .storybook/preview.tsx | 7 ++- .../inputs/Checkbox/Checkbox.stories.mdx | 20 +++++++++ .../inputs/Checkbox/Checkbox.styled.tsx | 45 +++++++++++++++++-- .../ChartSettingAddRemoveColumns.tsx | 10 +++-- 4 files changed, 75 insertions(+), 7 deletions(-) diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx index 22fb7a39c23..f5bb69c06b1 100644 --- a/.storybook/preview.tsx +++ b/.storybook/preview.tsx @@ -1,6 +1,7 @@ import React from "react"; import "metabase/css/index.css"; import "metabase/lib/dayjs"; +import { EmotionCacheProvider } from "metabase/styled-components/components/EmotionCacheProvider"; import { ThemeProvider } from "metabase/ui"; export const parameters = { @@ -14,5 +15,9 @@ export const parameters = { }; export const decorators = [ - renderStory => <ThemeProvider>{renderStory()}</ThemeProvider>, + renderStory => ( + <EmotionCacheProvider> + <ThemeProvider>{renderStory()}</ThemeProvider> + </EmotionCacheProvider> + ), ]; diff --git a/frontend/src/metabase/ui/components/inputs/Checkbox/Checkbox.stories.mdx b/frontend/src/metabase/ui/components/inputs/Checkbox/Checkbox.stories.mdx index 7c3bc5023b1..d43132f01bf 100644 --- a/frontend/src/metabase/ui/components/inputs/Checkbox/Checkbox.stories.mdx +++ b/frontend/src/metabase/ui/components/inputs/Checkbox/Checkbox.stories.mdx @@ -6,6 +6,7 @@ export const args = { description: undefined, disabled: false, labelPosition: "right", + size: "md", }; export const argTypes = { @@ -22,6 +23,14 @@ export const argTypes = { options: ["left", "right"], control: { type: "inline-radio" }, }, + size: { + options: ["xs", "md", "lg", "xl"], + control: { type: "inline-radio" }, + }, + variant: { + options: ["default", "stacked"], + control: { type: "inline-radio" }, + }, }; <Meta @@ -149,6 +158,17 @@ DescriptionLeft.args = { <Story name="Description, left position">{DescriptionLeft}</Story> </Canvas> +#### Stacked Variant + +export const Stacked = StateTemplate.bind({}); +Stacked.args = { + variant: "stacked", +}; + +<Canvas> + <Story name="Stacked">{Stacked}</Story> +</Canvas> + ## Related components - Radio diff --git a/frontend/src/metabase/ui/components/inputs/Checkbox/Checkbox.styled.tsx b/frontend/src/metabase/ui/components/inputs/Checkbox/Checkbox.styled.tsx index 7b70643a815..b7dd00b2a95 100644 --- a/frontend/src/metabase/ui/components/inputs/Checkbox/Checkbox.styled.tsx +++ b/frontend/src/metabase/ui/components/inputs/Checkbox/Checkbox.styled.tsx @@ -34,9 +34,6 @@ export const getCheckboxOverrides = (): MantineThemeOverride["components"] => ({ }, }, }, - body: { - alignItems: "center", - }, inner: { width: getSize({ size, sizes: SIZES }), height: getSize({ size, sizes: SIZES }), @@ -47,6 +44,7 @@ export const getCheckboxOverrides = (): MantineThemeOverride["components"] => ({ height: getSize({ size, sizes: SIZES }), cursor: "pointer", borderRadius: theme.radius.xs, + border: `1px solid ${theme.colors.bg[2]}`, "&:checked": { borderColor: theme.colors.brand[1], @@ -79,5 +77,46 @@ export const getCheckboxOverrides = (): MantineThemeOverride["components"] => ({ color: theme.colors.text[0], }, }), + variants: { + stacked: (theme, { labelPosition }) => ({ + inner: { + position: "relative", + zIndex: 0, + }, + label: { + paddingLeft: labelPosition === "right" ? "0.75rem" : "0.5rem", + }, + description: { + paddingLeft: labelPosition === "right" ? "0.75rem" : "0.5rem", + }, + input: { + "&:after": { + content: "''", + border: `1px solid ${theme.colors.bg[2]}`, + position: "absolute", + top: rem(-4), + left: rem(4), + height: "100%", + width: "100%", + borderRadius: rem(4), + zIndex: -1, + backgroundColor: theme.white, + boxSizing: "border-box", + }, + + "&:checked:not([disabled]):after": { + border: `${rem(2)} solid ${theme.colors.brand[1]}`, + }, + + "&:disabled:after": { + border: `${rem(2)} solid ${theme.colors.border[0]}`, + }, + }, + labelWrapper: { + psoition: "relative", + top: rem(-2), + }, + }), + }, }, }); diff --git a/frontend/src/metabase/visualizations/components/settings/ChartSettingAddRemoveColumns/ChartSettingAddRemoveColumns.tsx b/frontend/src/metabase/visualizations/components/settings/ChartSettingAddRemoveColumns/ChartSettingAddRemoveColumns.tsx index f7a3cbfd3d1..81a2bcfdfd0 100644 --- a/frontend/src/metabase/visualizations/components/settings/ChartSettingAddRemoveColumns/ChartSettingAddRemoveColumns.tsx +++ b/frontend/src/metabase/visualizations/components/settings/ChartSettingAddRemoveColumns/ChartSettingAddRemoveColumns.tsx @@ -5,7 +5,7 @@ import { Checkbox, TextInput, Box, Flex, Text } from "metabase/ui"; import { Icon } from "metabase/core/components/Icon"; import type { TableColumnOrderSetting } from "metabase-types/api"; import { getColumnIcon } from "metabase/common/utils/columns"; -import { StackedCheckBox } from "metabase/components/StackedCheckBox/StackedCheckBox"; + import type * as Lib from "metabase-lib"; import type { ColumnSetting, @@ -187,7 +187,9 @@ export const ChartSettingAddRemoveColumns = ({ {showAddRemoveAll(columnGroup.columns) && ( <Box mb="1rem"> {areAllColumnsInQuery(columnGroup.columns) ? ( - <StackedCheckBox + <Checkbox + variant="stacked" + size="xs" label={ <Text fw={700} @@ -201,7 +203,9 @@ export const ChartSettingAddRemoveColumns = ({ } /> ) : ( - <StackedCheckBox + <Checkbox + variant="stacked" + size="xs" label={ <Text fw={700} -- GitLab