From eb66b480ddbc38a901345b6707ebc9ac23a53c91 Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Fri, 18 Apr 2025 18:04:07 +0200 Subject: [PATCH 1/3] Improve icons on Button + IconButton Signed-off-by: Charles de Dreuille --- .../src/components/Button/Button.stories.tsx | 45 ++++++++++++------- .../canon/src/components/Button/Button.tsx | 21 +++++++-- .../canon/src/components/Button/styles.css | 10 +++-- packages/canon/src/components/Button/types.ts | 7 +-- .../IconButton/IconButton.stories.tsx | 22 ++++++--- .../src/components/IconButton/IconButton.tsx | 9 +++- .../src/components/IconButton/styles.css | 10 +++-- .../canon/src/components/IconButton/types.ts | 7 +-- 8 files changed, 89 insertions(+), 42 deletions(-) diff --git a/packages/canon/src/components/Button/Button.stories.tsx b/packages/canon/src/components/Button/Button.stories.tsx index 7377ad497d..fffc31b488 100644 --- a/packages/canon/src/components/Button/Button.stories.tsx +++ b/packages/canon/src/components/Button/Button.stories.tsx @@ -19,6 +19,7 @@ import { Button } from './Button'; import { Flex } from '../Flex'; import { Text } from '../Text'; import { ButtonProps } from './types'; +import { Icon } from '../Icon'; const meta = { title: 'Components/Button', @@ -55,10 +56,10 @@ export const Variants: Story = { }, render: () => ( - - @@ -71,8 +72,12 @@ export const Sizes: Story = { }, render: () => ( - - + + ), }; @@ -83,9 +88,13 @@ export const WithIcons: Story = { }, render: args => ( - ); }, diff --git a/packages/canon/src/components/Button/styles.css b/packages/canon/src/components/Button/styles.css index 785fbf3b88..a4afd85c9b 100644 --- a/packages/canon/src/components/Button/styles.css +++ b/packages/canon/src/components/Button/styles.css @@ -94,12 +94,14 @@ height: 32px; } -.canon-Button[data-size='small'] .canon-ButtonIcon { +.canon-ButtonIcon[data-size='small'], +.canon-ButtonIcon[data-size='small'] svg { width: 1rem; height: 1rem; } -.canon-Button[data-size='medium'] .canon-ButtonIcon { - width: 1.5rem; - height: 1.5rem; +.canon-ButtonIcon[data-size='medium'], +.canon-ButtonIcon[data-size='medium'] svg { + width: 1.25rem; + height: 1.25rem; } diff --git a/packages/canon/src/components/Button/types.ts b/packages/canon/src/components/Button/types.ts index 0d61e1cda4..4ab62d5683 100644 --- a/packages/canon/src/components/Button/types.ts +++ b/packages/canon/src/components/Button/types.ts @@ -13,8 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { IconNames } from '../Icon'; + import type { ButtonOwnProps } from './Button.props'; +import { ReactElement } from 'react'; /** * Properties for {@link Button} @@ -43,10 +44,10 @@ export interface ButtonProps /** * Optional icon to display at the start of the button */ - iconStart?: IconNames; + iconStart?: ReactElement; /** * Optional icon to display at the end of the button */ - iconEnd?: IconNames; + iconEnd?: ReactElement; } diff --git a/packages/canon/src/components/IconButton/IconButton.stories.tsx b/packages/canon/src/components/IconButton/IconButton.stories.tsx index edac9bd7e8..d16dcd1fcb 100644 --- a/packages/canon/src/components/IconButton/IconButton.stories.tsx +++ b/packages/canon/src/components/IconButton/IconButton.stories.tsx @@ -19,6 +19,7 @@ import { IconButton } from './IconButton'; import { Flex } from '../Flex'; import { Text } from '../Text'; import { IconButtonProps } from './types'; +import { Icon } from '../Icon'; const meta = { title: 'Components/IconButton', @@ -44,7 +45,8 @@ type Story = StoryObj; export const Variants: Story = { args: { - icon: 'cloud', + icon: , + 'aria-label': 'Cloud icon button', }, parameters: { argTypes: { @@ -63,7 +65,8 @@ export const Variants: Story = { export const Sizes: Story = { args: { - icon: 'cloud', + icon: , + 'aria-label': 'Cloud icon button', }, render: args => ( @@ -75,8 +78,9 @@ export const Sizes: Story = { export const Disabled: Story = { args: { - icon: 'cloud', + icon: , disabled: true, + 'aria-label': 'Cloud icon button', }, render: args => ( @@ -88,7 +92,8 @@ export const Disabled: Story = { export const Responsive: Story = { args: { - icon: 'cloud', + icon: , + 'aria-label': 'Cloud icon button', variant: { initial: 'primary', sm: 'secondary', @@ -104,7 +109,8 @@ const variants: string[] = ['primary', 'secondary']; export const Playground: Story = { args: { - icon: 'cloud', + icon: , + 'aria-label': 'Cloud icon button', }, render: args => ( @@ -120,13 +126,15 @@ export const Playground: Story = { /> } + aria-label="Chevron right icon button" variant={variant as IconButtonProps['variant']} size={size as IconButtonProps['size']} /> } + aria-label="Chevron right icon button" variant={variant as IconButtonProps['variant']} size={size as IconButtonProps['size']} /> diff --git a/packages/canon/src/components/IconButton/IconButton.tsx b/packages/canon/src/components/IconButton/IconButton.tsx index b2581844bc..bca012cac0 100644 --- a/packages/canon/src/components/IconButton/IconButton.tsx +++ b/packages/canon/src/components/IconButton/IconButton.tsx @@ -15,7 +15,6 @@ */ import { forwardRef } from 'react'; -import { Icon } from '../Icon'; import clsx from 'clsx'; import { useResponsiveValue } from '../../hooks/useResponsiveValue'; @@ -45,7 +44,13 @@ export const IconButton = forwardRef( style={style} {...rest} > - + ); }, diff --git a/packages/canon/src/components/IconButton/styles.css b/packages/canon/src/components/IconButton/styles.css index 859c512fd6..066b0fbad5 100644 --- a/packages/canon/src/components/IconButton/styles.css +++ b/packages/canon/src/components/IconButton/styles.css @@ -94,12 +94,14 @@ width: 32px; } -.canon-IconButton[data-size='small'] .canon-IconButtonIcon { +.canon-IconButtonIcon[data-size='small'], +.canon-IconButtonIcon[data-size='small'] svg { width: 1rem; height: 1rem; } -.canon-IconButton[data-size='medium'] .canon-IconButtonIcon { - width: 1.5rem; - height: 1.5rem; +.canon-IconButtonIcon[data-size='medium'], +.canon-IconButtonIcon[data-size='medium'] svg { + width: 1.25rem; + height: 1.25rem; } diff --git a/packages/canon/src/components/IconButton/types.ts b/packages/canon/src/components/IconButton/types.ts index 90505d3352..ece1950d1b 100644 --- a/packages/canon/src/components/IconButton/types.ts +++ b/packages/canon/src/components/IconButton/types.ts @@ -13,8 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { IconNames } from '../Icon'; + import type { IconButtonOwnProps } from './IconButton.props'; +import { ReactElement } from 'react'; /** * Properties for {@link IconButton} @@ -36,7 +37,7 @@ export interface IconButtonProps variant?: IconButtonOwnProps['variant']; /** - * Icon to display at the start of the button + * Icon to display in the button */ - icon: IconNames; + icon: ReactElement; } From ea36f743fab9b650df9127dadf03322855421928 Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Fri, 18 Apr 2025 18:23:31 +0200 Subject: [PATCH 2/3] Improve stories Signed-off-by: Charles de Dreuille --- .changeset/nice-vans-vanish.md | 5 +++++ packages/canon/report.api.md | 7 ++++--- .../src/components/Collapsible/Collapsible.stories.tsx | 9 ++++++++- .../DataTable/Pagination/DataTablePagination.tsx | 5 +++-- packages/canon/src/components/Menu/Menu.stories.tsx | 3 ++- 5 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 .changeset/nice-vans-vanish.md diff --git a/.changeset/nice-vans-vanish.md b/.changeset/nice-vans-vanish.md new file mode 100644 index 0000000000..c52fc42488 --- /dev/null +++ b/.changeset/nice-vans-vanish.md @@ -0,0 +1,5 @@ +--- +'@backstage/canon': minor +--- + +**Breaking Change** Icons on Button and IconButton now need to be imported and placed like this: From 3fac350e9869acee4479b46d5c595933e2a0a7d0 Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Fri, 18 Apr 2025 18:37:45 +0200 Subject: [PATCH 3/3] Build CSS Signed-off-by: Charles de Dreuille --- packages/canon/css/button.css | 8 ++++---- packages/canon/css/components.css | 16 ++++++++-------- packages/canon/css/iconbutton.css | 8 ++++---- packages/canon/css/styles.css | 16 ++++++++-------- 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/packages/canon/css/button.css b/packages/canon/css/button.css index eb0c44ce1b..7aaad3ec48 100644 --- a/packages/canon/css/button.css +++ b/packages/canon/css/button.css @@ -78,12 +78,12 @@ height: 32px; } -.canon-Button[data-size="small"] .canon-ButtonIcon { +.canon-ButtonIcon[data-size="small"], .canon-ButtonIcon[data-size="small"] svg { width: 1rem; height: 1rem; } -.canon-Button[data-size="medium"] .canon-ButtonIcon { - width: 1.5rem; - height: 1.5rem; +.canon-ButtonIcon[data-size="medium"], .canon-ButtonIcon[data-size="medium"] svg { + width: 1.25rem; + height: 1.25rem; } diff --git a/packages/canon/css/components.css b/packages/canon/css/components.css index f67d0b332d..f4c8008673 100644 --- a/packages/canon/css/components.css +++ b/packages/canon/css/components.css @@ -134,14 +134,14 @@ height: 32px; } -.canon-Button[data-size="small"] .canon-ButtonIcon { +.canon-ButtonIcon[data-size="small"], .canon-ButtonIcon[data-size="small"] svg { width: 1rem; height: 1rem; } -.canon-Button[data-size="medium"] .canon-ButtonIcon { - width: 1.5rem; - height: 1.5rem; +.canon-ButtonIcon[data-size="medium"], .canon-ButtonIcon[data-size="medium"] svg { + width: 1.25rem; + height: 1.25rem; } .canon-CollapsiblePanel { @@ -521,14 +521,14 @@ height: 32px; } -.canon-IconButton[data-size="small"] .canon-IconButtonIcon { +.canon-IconButtonIcon[data-size="small"], .canon-IconButtonIcon[data-size="small"] svg { width: 1rem; height: 1rem; } -.canon-IconButton[data-size="medium"] .canon-IconButtonIcon { - width: 1.5rem; - height: 1.5rem; +.canon-IconButtonIcon[data-size="medium"], .canon-IconButtonIcon[data-size="medium"] svg { + width: 1.25rem; + height: 1.25rem; } .canon-TextField { diff --git a/packages/canon/css/iconbutton.css b/packages/canon/css/iconbutton.css index e867a1848e..dc3f9d94c5 100644 --- a/packages/canon/css/iconbutton.css +++ b/packages/canon/css/iconbutton.css @@ -78,12 +78,12 @@ height: 32px; } -.canon-IconButton[data-size="small"] .canon-IconButtonIcon { +.canon-IconButtonIcon[data-size="small"], .canon-IconButtonIcon[data-size="small"] svg { width: 1rem; height: 1rem; } -.canon-IconButton[data-size="medium"] .canon-IconButtonIcon { - width: 1.5rem; - height: 1.5rem; +.canon-IconButtonIcon[data-size="medium"], .canon-IconButtonIcon[data-size="medium"] svg { + width: 1.25rem; + height: 1.25rem; } diff --git a/packages/canon/css/styles.css b/packages/canon/css/styles.css index 0fa08102fd..141bc1b5fb 100644 --- a/packages/canon/css/styles.css +++ b/packages/canon/css/styles.css @@ -9358,14 +9358,14 @@ height: 32px; } -.canon-Button[data-size="small"] .canon-ButtonIcon { +.canon-ButtonIcon[data-size="small"], .canon-ButtonIcon[data-size="small"] svg { width: 1rem; height: 1rem; } -.canon-Button[data-size="medium"] .canon-ButtonIcon { - width: 1.5rem; - height: 1.5rem; +.canon-ButtonIcon[data-size="medium"], .canon-ButtonIcon[data-size="medium"] svg { + width: 1.25rem; + height: 1.25rem; } .canon-CollapsiblePanel { @@ -9745,14 +9745,14 @@ height: 32px; } -.canon-IconButton[data-size="small"] .canon-IconButtonIcon { +.canon-IconButtonIcon[data-size="small"], .canon-IconButtonIcon[data-size="small"] svg { width: 1rem; height: 1rem; } -.canon-IconButton[data-size="medium"] .canon-IconButtonIcon { - width: 1.5rem; - height: 1.5rem; +.canon-IconButtonIcon[data-size="medium"], .canon-IconButtonIcon[data-size="medium"] svg { + width: 1.25rem; + height: 1.25rem; } .canon-TextField {