From d1887280d99823a55be887d635c1c4b2a9b89785 Mon Sep 17 00:00:00 2001 From: patroswastik Date: Thu, 27 Feb 2025 16:19:31 -0600 Subject: [PATCH 01/12] add specific check for @deprecated tag in router files Signed-off-by: patroswastik --- .../lint-legacy-backend-exports.ts | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/repo-tools/src/commands/lint-legacy-backend-exports/lint-legacy-backend-exports.ts b/packages/repo-tools/src/commands/lint-legacy-backend-exports/lint-legacy-backend-exports.ts index 6025defe31..0ebc7088e3 100644 --- a/packages/repo-tools/src/commands/lint-legacy-backend-exports/lint-legacy-backend-exports.ts +++ b/packages/repo-tools/src/commands/lint-legacy-backend-exports/lint-legacy-backend-exports.ts @@ -46,10 +46,15 @@ function verifyIndex(pkg: string, packageJson?: BackstagePackageJson) { console.log(`Verifying ${pkg}`); const tsPath = path.join(pkg, 'src/index.ts'); const sourceFile = project.getSourceFile(tsPath); + + const tsRouterPath = path.join(pkg, 'src/service/router.ts'); + const routerFile = project.getSourceFile(tsRouterPath); + if (!sourceFile) { console.log(`Could not find ${tsPath}`); process.exit(1); } + const symbols = sourceFile?.getExportSymbols(); const exportCount = symbols?.length || 0; @@ -75,9 +80,23 @@ function verifyIndex(pkg: string, packageJson?: BackstagePackageJson) { .find(tag => tag.getName() === 'deprecated'); } + let routerCreateRouterDeprecated = undefined; + if (routerFile) { + const routerSymbols = routerFile?.getExportSymbols(); + const routerCreateRouterExport = routerSymbols?.find( + symbol => symbol.getName() === 'createRouter', + ); + + if (routerCreateRouterExport) { + routerCreateRouterDeprecated = routerCreateRouterExport + .getJsDocTags() + .find(tag => tag.getName() === 'deprecated'); + } + } + if (createRouterExport) { console.log(' ❌ createRouter is exported'); - if (!createRouterDeprecated) + if (!createRouterDeprecated && !routerCreateRouterDeprecated) console.log(' ❌ createRouter is NOT deprecated'); } From 18ce51c5b6d88720d131dbdbb022ce6bec4506cb Mon Sep 17 00:00:00 2001 From: patroswastik Date: Thu, 27 Feb 2025 17:20:24 -0600 Subject: [PATCH 02/12] Changeset added as per guide Signed-off-by: patroswastik --- .changeset/rich-phones-whisper.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/rich-phones-whisper.md diff --git a/.changeset/rich-phones-whisper.md b/.changeset/rich-phones-whisper.md new file mode 100644 index 0000000000..c27b6de2f8 --- /dev/null +++ b/.changeset/rich-phones-whisper.md @@ -0,0 +1,5 @@ +--- +'@backstage/repo-tools': minor +--- + +Checking through router.ts files of the packages if they exist and looking for deprecated tag inside it. If exists then only the message will appear From 95e08d175d03723f4242ad9f26c83405a4aa12bd Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Sat, 12 Apr 2025 10:01:37 +0200 Subject: [PATCH 03/12] Improve Theming docs Signed-off-by: Charles de Dreuille --- canon-docs/public/css-classname-structure.png | Bin 0 -> 43849 bytes .../src/app/(docs)/theme/theming/page.mdx | 332 +++++++++++++----- 2 files changed, 237 insertions(+), 95 deletions(-) create mode 100644 canon-docs/public/css-classname-structure.png diff --git a/canon-docs/public/css-classname-structure.png b/canon-docs/public/css-classname-structure.png new file mode 100644 index 0000000000000000000000000000000000000000..df9894ff2b7c511fa9f439a6a7fcde5d4f903732 GIT binary patch literal 43849 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%0A?n$6(Iz|bvJ3c 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 +## CSS class name structure + +All Canon components come with a set of CSS classes that you can use to style them. To make it +easier to identify the class name you can use, we use a specific structure for the class names. + + + +Every component has a unique prefix `.canon-` followed by the component name. Component props +are represented using the `data-` attribute. That way, class names are easily identifiable. + ## Available CSS variables +### Base colors + +These colors are used for special purposes like ring, scrollbar, ... + + + + + Prop + Description + + + + + + --canon-black + + + Pure black color. This one should be the same in light and dark themes. + + + + + --canon-white + + + Pure white color. This one should be the same in light and dark themes. + + + + + --canon-gray-1 + + You can use these mostly for backgrounds colors. + + + + --canon-gray-2 + + You can use these mostly for backgrounds colors. + + + + --canon-gray-3 + + You can use these mostly for backgrounds colors. + + + + --canon-gray-4 + + You can use these mostly for backgrounds colors. + + + + --canon-gray-5 + + You can use these mostly for backgrounds colors. + + + + --canon-gray-6 + + You can use these mostly for backgrounds colors. + + + + --canon-gray-7 + + You can use these mostly for backgrounds colors. + + + + --canon-gray-8 + + You can use these mostly for backgrounds colors. + + + + ### Core background colors These colors are used for the background of your application. We are mostly using for now a @@ -57,98 +149,60 @@ color of your app. Use for any panels or elevated surfaces. - - - -### Component background colors - -These colors are meants for interactive components like buttons, callout avatar, chips, ... -We have two main level of background you can customise. The accent one is mostly used as a primary option -for interactive components. The tint one is used for secondary components like callouts, avatars, ... - - - - - Prop - Description - - - - --canon-bg-accent + --canon-bg-surface-2 - Used mostly for primary interactive components. + Use for any panels or elevated surfaces. - --canon-bg-accent-hover - - - Used for interactive components when they are hovered. + --canon-bg-solid + Used for solid background colors. - --canon-bg-accent-focus - - - Used for interactive components when they are in focus. + --canon-bg-solid-hover + Used for solid background colors when hovered. - --canon-bg-accent-disabled + --canon-bg-solid-pressed + Used for solid background colors when pressed. + + - Used for interactive components when they are disabled. + --canon-bg-solid-disabled + Used for solid background colors when disabled. --canon-bg-tint - Used for secondary interactive components. + Used for tint background colors. --canon-bg-tint-hover - - Used for interactive components when they are hovered. - + Used for tint background colors when hovered. --canon-bg-tint-focus - - Used for interactive components when they are active. - + Used for tint background colors when active. --canon-bg-tint-disabled - - Used for interactive components when they are disabled. - + Used for tint background colors when disabled. - - - -### Status background colors - -These backgrounds are intended for non-interactive elements to visually convey a specific state. - - - - - Prop - Description - - - --canon-bg-danger @@ -189,7 +243,7 @@ are prefixed with `fg` to make it easier to identify. --canon-fg-primary - It should be used on top of `--canon-bg-app` or `--canon-bg-surface-1`. + It should be used on top of main background surfaces. @@ -197,7 +251,7 @@ are prefixed with `fg` to make it easier to identify. --canon-fg-secondary - It should be used on top of `--canon-bg-app` or `--canon-bg-surface-1`. + It should be used on top of main background surfaces. @@ -205,7 +259,7 @@ are prefixed with `fg` to make it easier to identify. --canon-fg-link - It should be used on top of `--canon-bg-app` or `--canon-bg-surface-1`. + It should be used on top of main background surfaces. @@ -213,38 +267,64 @@ are prefixed with `fg` to make it easier to identify. --canon-fg-link-hover - It should be used on top of `--canon-bg-app` or `--canon-bg-surface-1`. + It should be used on top of main background surfaces. - --canon-fg-accent + --canon-fg-disabled + + + It should be used on top of main background surfaces. + + + + + --canon-fg-solid + + + It should be used on top of solid background colors. - It should be used on top of `--canon-bg-accent`. --canon-fg-tint - It should be used on top of `--canon-bg-tint`. + + It should be used on top of tint background colors. + + + + + --canon-fg-tint-disabled + + + It should be used on top of tint background colors when disabled. + --canon-fg-danger - It should be used on top of `--canon-bg-danger`. + + It should be used on top of danger background colors. + --canon-fg-warning - It should be used on top of `--canon-bg-warning`. + + It should be used on top of warning background colors. + --canon-fg-success - It should be used on top of `--canon-bg-success`. + + It should be used on top of success background colors. + @@ -288,21 +368,9 @@ low contrast to help as a separator with the different background colors. - --canon-border-tint + --canon-border-disabled - It should be used on top of `--canon-bg-tint`. - - - - --canon-border-tint-hover - - Used when the component is hovered. - - - - --canon-border-tint-focus - - Used when the component is in focus. + Used when the component is disabled. @@ -325,7 +393,40 @@ low contrast to help as a separator with the different background colors. -## Font families +### Special colors + +These colors are used for special purposes like ring, scrollbar, ... + + + + + Prop + Description + + + + + + --canon-ring + + The color of the ring. + + + + --canon-scrollbar + + The color of the scrollbar. + + + + --canon-scrollbar-thumb + + The color of the scrollbar thumb. + + + + +### Font families We have two fonts that we use across Canon. The first one is the sans-serif font that we use for the body of the application. The second one is the @@ -354,9 +455,9 @@ monospace font that we use for code blocks and tables. -## Font weights +### Font weights -We have two font weights that we use across Canon. Regular or Bold +We have two font weights that we use across Canon. Regular or Bold. @@ -381,7 +482,7 @@ We have two font weights that we use across Canon. Regular or Bold -## Spacing +### Spacing We built a spacing system based on a single value `--canon-space`. This value is used to calculate the spacing for all the components. By default if you would like to @@ -520,18 +621,9 @@ tokens for pretty much each spacing properties like padding, margin, gaps, ... -### Radius (Work in progress) +### Radius -Our radius system is a little bit different from spacing as we use a factor to calculate the radius values. -Under the hood different components uses different radius values. For example, button can be set to have full radius -while a checkbox will have to remain a square. - -Here are the different radius factor we recommend to use - -- None: `0` -- Small: `0.75` -- Medium: `1` -- Large: `1.5` +We use a radius system to make sure that the components have a consistent look and feel. @@ -543,9 +635,59 @@ Here are the different radius factor we recommend to use - --canon-radius-factor + --canon-radius-1 + + + The radius of the component. Default value is `0.125rem`. + + + + + --canon-radius-2 + + + The radius of the component. Default value is `0.25rem`. + + + + + --canon-radius-3 + + + The radius of the component. Default value is `0.5rem`. + + + + + --canon-radius-4 + + + The radius of the component. Default value is `0.75rem`. + + + + + --canon-radius-5 + + + The radius of the component. Default value is `1rem`. + + + + + --canon-radius-6 + + + The radius of the component. Default value is `1.25rem`. + + + + + --canon-radius-full + + + The radius of the component. Default value is `9999px`. - By default the value is set to medium `1`. From 1fdb5b7d36a304a938bbaa460682d19312990ffc Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Sat, 12 Apr 2025 10:02:28 +0200 Subject: [PATCH 04/12] Improve Text class name structure Signed-off-by: Charles de Dreuille --- packages/canon/css/components.css | 23 +++++++++---------- packages/canon/css/styles.css | 23 +++++++++---------- packages/canon/css/text.css | 23 +++++++++---------- packages/canon/src/components/Text/Text.tsx | 11 ++++----- packages/canon/src/components/Text/styles.css | 23 +++++++++---------- 5 files changed, 48 insertions(+), 55 deletions(-) diff --git a/packages/canon/css/components.css b/packages/canon/css/components.css index 264be6375b..8cebf1937b 100644 --- a/packages/canon/css/components.css +++ b/packages/canon/css/components.css @@ -240,56 +240,55 @@ .canon-Text { font-family: var(--canon-font-regular); - color: var(--canon-fg-primary); margin: 0; padding: 0; } -.canon-Text--variant-body { +.canon-Text[data-variant="body"] { font-size: var(--canon-font-size-3); line-height: 140%; } -.canon-Text--variant-subtitle { +.canon-Text[data-variant="subtitle"] { font-size: var(--canon-font-size-4); line-height: 140%; } -.canon-Text--variant-caption { +.canon-Text[data-variant="caption"] { font-size: var(--canon-font-size-2); line-height: 140%; } -.canon-Text--variant-label { +.canon-Text[data-variant="label"] { font-size: var(--canon-font-size-1); line-height: 140%; } -.canon-Text--weight-regular { +.canon-Text[data-weight="regular"] { font-weight: var(--canon-font-weight-regular); } -.canon-Text--weight-bold { +.canon-Text[data-weight="bold"] { font-weight: var(--canon-font-weight-bold); } -.canon-Text--color-primary { +.canon-Text[data-color="primary"] { color: var(--canon-fg-primary); } -.canon-Text--color-secondary { +.canon-Text[data-color="secondary"] { color: var(--canon-fg-secondary); } -.canon-Text--color-danger { +.canon-Text[data-color="danger"] { color: var(--canon-fg-danger); } -.canon-Text--color-warning { +.canon-Text[data-color="warning"] { color: var(--canon-fg-warning); } -.canon-Text--color-success { +.canon-Text[data-color="success"] { color: var(--canon-fg-success); } diff --git a/packages/canon/css/styles.css b/packages/canon/css/styles.css index ba8fe6dab2..fd9e19a392 100644 --- a/packages/canon/css/styles.css +++ b/packages/canon/css/styles.css @@ -9464,56 +9464,55 @@ .canon-Text { font-family: var(--canon-font-regular); - color: var(--canon-fg-primary); margin: 0; padding: 0; } -.canon-Text--variant-body { +.canon-Text[data-variant="body"] { font-size: var(--canon-font-size-3); line-height: 140%; } -.canon-Text--variant-subtitle { +.canon-Text[data-variant="subtitle"] { font-size: var(--canon-font-size-4); line-height: 140%; } -.canon-Text--variant-caption { +.canon-Text[data-variant="caption"] { font-size: var(--canon-font-size-2); line-height: 140%; } -.canon-Text--variant-label { +.canon-Text[data-variant="label"] { font-size: var(--canon-font-size-1); line-height: 140%; } -.canon-Text--weight-regular { +.canon-Text[data-weight="regular"] { font-weight: var(--canon-font-weight-regular); } -.canon-Text--weight-bold { +.canon-Text[data-weight="bold"] { font-weight: var(--canon-font-weight-bold); } -.canon-Text--color-primary { +.canon-Text[data-color="primary"] { color: var(--canon-fg-primary); } -.canon-Text--color-secondary { +.canon-Text[data-color="secondary"] { color: var(--canon-fg-secondary); } -.canon-Text--color-danger { +.canon-Text[data-color="danger"] { color: var(--canon-fg-danger); } -.canon-Text--color-warning { +.canon-Text[data-color="warning"] { color: var(--canon-fg-warning); } -.canon-Text--color-success { +.canon-Text[data-color="success"] { color: var(--canon-fg-success); } diff --git a/packages/canon/css/text.css b/packages/canon/css/text.css index faa16c7f40..523574f779 100644 --- a/packages/canon/css/text.css +++ b/packages/canon/css/text.css @@ -1,54 +1,53 @@ .canon-Text { font-family: var(--canon-font-regular); - color: var(--canon-fg-primary); margin: 0; padding: 0; } -.canon-Text--variant-body { +.canon-Text[data-variant="body"] { font-size: var(--canon-font-size-3); line-height: 140%; } -.canon-Text--variant-subtitle { +.canon-Text[data-variant="subtitle"] { font-size: var(--canon-font-size-4); line-height: 140%; } -.canon-Text--variant-caption { +.canon-Text[data-variant="caption"] { font-size: var(--canon-font-size-2); line-height: 140%; } -.canon-Text--variant-label { +.canon-Text[data-variant="label"] { font-size: var(--canon-font-size-1); line-height: 140%; } -.canon-Text--weight-regular { +.canon-Text[data-weight="regular"] { font-weight: var(--canon-font-weight-regular); } -.canon-Text--weight-bold { +.canon-Text[data-weight="bold"] { font-weight: var(--canon-font-weight-bold); } -.canon-Text--color-primary { +.canon-Text[data-color="primary"] { color: var(--canon-fg-primary); } -.canon-Text--color-secondary { +.canon-Text[data-color="secondary"] { color: var(--canon-fg-secondary); } -.canon-Text--color-danger { +.canon-Text[data-color="danger"] { color: var(--canon-fg-danger); } -.canon-Text--color-warning { +.canon-Text[data-color="warning"] { color: var(--canon-fg-warning); } -.canon-Text--color-success { +.canon-Text[data-color="success"] { color: var(--canon-fg-success); } diff --git a/packages/canon/src/components/Text/Text.tsx b/packages/canon/src/components/Text/Text.tsx index 643afc539a..76f5adbb43 100644 --- a/packages/canon/src/components/Text/Text.tsx +++ b/packages/canon/src/components/Text/Text.tsx @@ -41,13 +41,10 @@ export const Text = forwardRef( return (

diff --git a/packages/canon/src/components/Text/styles.css b/packages/canon/src/components/Text/styles.css index 8252554280..9f0ed703d9 100644 --- a/packages/canon/src/components/Text/styles.css +++ b/packages/canon/src/components/Text/styles.css @@ -16,55 +16,54 @@ .canon-Text { font-family: var(--canon-font-regular); - color: var(--canon-fg-primary); padding: 0; margin: 0; } -.canon-Text--variant-body { +.canon-Text[data-variant='body'] { font-size: var(--canon-font-size-3); line-height: 140%; } -.canon-Text--variant-subtitle { +.canon-Text[data-variant='subtitle'] { font-size: var(--canon-font-size-4); line-height: 140%; } -.canon-Text--variant-caption { +.canon-Text[data-variant='caption'] { font-size: var(--canon-font-size-2); line-height: 140%; } -.canon-Text--variant-label { +.canon-Text[data-variant='label'] { font-size: var(--canon-font-size-1); line-height: 140%; } -.canon-Text--weight-regular { +.canon-Text[data-weight='regular'] { font-weight: var(--canon-font-weight-regular); } -.canon-Text--weight-bold { +.canon-Text[data-weight='bold'] { font-weight: var(--canon-font-weight-bold); } -.canon-Text--color-primary { +.canon-Text[data-color='primary'] { color: var(--canon-fg-primary); } -.canon-Text--color-secondary { +.canon-Text[data-color='secondary'] { color: var(--canon-fg-secondary); } -.canon-Text--color-danger { +.canon-Text[data-color='danger'] { color: var(--canon-fg-danger); } -.canon-Text--color-warning { +.canon-Text[data-color='warning'] { color: var(--canon-fg-warning); } -.canon-Text--color-success { +.canon-Text[data-color='success'] { color: var(--canon-fg-success); } From df4e29216b8ee6d9db8bd1ea747d3d8367a54473 Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Sat, 12 Apr 2025 12:14:50 +0200 Subject: [PATCH 05/12] Move Heading to data props Signed-off-by: Charles de Dreuille --- .changeset/neat-ducks-wish.md | 5 +++++ packages/canon/css/components.css | 12 ++++++------ packages/canon/css/heading.css | 12 ++++++------ packages/canon/css/styles.css | 12 ++++++------ packages/canon/src/components/Heading/Heading.tsx | 7 ++----- packages/canon/src/components/Heading/styles.css | 12 ++++++------ 6 files changed, 31 insertions(+), 29 deletions(-) create mode 100644 .changeset/neat-ducks-wish.md diff --git a/.changeset/neat-ducks-wish.md b/.changeset/neat-ducks-wish.md new file mode 100644 index 0000000000..2568e438c9 --- /dev/null +++ b/.changeset/neat-ducks-wish.md @@ -0,0 +1,5 @@ +--- +'@backstage/canon': minor +--- + +Improve class name structure using data attributes instead of class names. diff --git a/packages/canon/css/components.css b/packages/canon/css/components.css index 8cebf1937b..9a276a3a0a 100644 --- a/packages/canon/css/components.css +++ b/packages/canon/css/components.css @@ -300,32 +300,32 @@ line-height: 100%; } -.canon-Heading--variant-display { +.canon-Heading[data-variant="display"] { font-size: var(--canon-font-size-10); font-weight: var(--canon-font-weight-bold); } -.canon-Heading--variant-title1 { +.canon-Heading[data-variant="title1"] { font-size: var(--canon-font-size-9); font-weight: var(--canon-font-weight-bold); } -.canon-Heading--variant-title2 { +.canon-Heading[data-variant="title2"] { font-size: var(--canon-font-size-8); font-weight: var(--canon-font-weight-bold); } -.canon-Heading--variant-title3 { +.canon-Heading[data-variant="title3"] { font-size: var(--canon-font-size-7); font-weight: var(--canon-font-weight-bold); } -.canon-Heading--variant-title4 { +.canon-Heading[data-variant="title4"] { font-size: var(--canon-font-size-title4); font-weight: var(--canon-font-weight-bold); } -.canon-Heading--variant-title5 { +.canon-Heading[data-variant="title5"] { font-size: var(--canon-font-size-5); font-weight: var(--canon-font-weight-bold); } diff --git a/packages/canon/css/heading.css b/packages/canon/css/heading.css index 615e7a6e8b..f1bea873b4 100644 --- a/packages/canon/css/heading.css +++ b/packages/canon/css/heading.css @@ -6,32 +6,32 @@ line-height: 100%; } -.canon-Heading--variant-display { +.canon-Heading[data-variant="display"] { font-size: var(--canon-font-size-10); font-weight: var(--canon-font-weight-bold); } -.canon-Heading--variant-title1 { +.canon-Heading[data-variant="title1"] { font-size: var(--canon-font-size-9); font-weight: var(--canon-font-weight-bold); } -.canon-Heading--variant-title2 { +.canon-Heading[data-variant="title2"] { font-size: var(--canon-font-size-8); font-weight: var(--canon-font-weight-bold); } -.canon-Heading--variant-title3 { +.canon-Heading[data-variant="title3"] { font-size: var(--canon-font-size-7); font-weight: var(--canon-font-weight-bold); } -.canon-Heading--variant-title4 { +.canon-Heading[data-variant="title4"] { font-size: var(--canon-font-size-title4); font-weight: var(--canon-font-weight-bold); } -.canon-Heading--variant-title5 { +.canon-Heading[data-variant="title5"] { font-size: var(--canon-font-size-5); font-weight: var(--canon-font-weight-bold); } diff --git a/packages/canon/css/styles.css b/packages/canon/css/styles.css index fd9e19a392..d3e61ff556 100644 --- a/packages/canon/css/styles.css +++ b/packages/canon/css/styles.css @@ -9524,32 +9524,32 @@ line-height: 100%; } -.canon-Heading--variant-display { +.canon-Heading[data-variant="display"] { font-size: var(--canon-font-size-10); font-weight: var(--canon-font-weight-bold); } -.canon-Heading--variant-title1 { +.canon-Heading[data-variant="title1"] { font-size: var(--canon-font-size-9); font-weight: var(--canon-font-weight-bold); } -.canon-Heading--variant-title2 { +.canon-Heading[data-variant="title2"] { font-size: var(--canon-font-size-8); font-weight: var(--canon-font-weight-bold); } -.canon-Heading--variant-title3 { +.canon-Heading[data-variant="title3"] { font-size: var(--canon-font-size-7); font-weight: var(--canon-font-weight-bold); } -.canon-Heading--variant-title4 { +.canon-Heading[data-variant="title4"] { font-size: var(--canon-font-size-title4); font-weight: var(--canon-font-weight-bold); } -.canon-Heading--variant-title5 { +.canon-Heading[data-variant="title5"] { font-size: var(--canon-font-size-5); font-weight: var(--canon-font-weight-bold); } diff --git a/packages/canon/src/components/Heading/Heading.tsx b/packages/canon/src/components/Heading/Heading.tsx index 5fe69bbc57..994b1de06e 100644 --- a/packages/canon/src/components/Heading/Heading.tsx +++ b/packages/canon/src/components/Heading/Heading.tsx @@ -45,11 +45,8 @@ export const Heading = forwardRef( return ( {children} diff --git a/packages/canon/src/components/Heading/styles.css b/packages/canon/src/components/Heading/styles.css index 2db11d7eb2..c85bbca135 100644 --- a/packages/canon/src/components/Heading/styles.css +++ b/packages/canon/src/components/Heading/styles.css @@ -22,32 +22,32 @@ margin: 0; } -.canon-Heading--variant-display { +.canon-Heading[data-variant='display'] { font-size: var(--canon-font-size-10); font-weight: var(--canon-font-weight-bold); } -.canon-Heading--variant-title1 { +.canon-Heading[data-variant='title1'] { font-size: var(--canon-font-size-9); font-weight: var(--canon-font-weight-bold); } -.canon-Heading--variant-title2 { +.canon-Heading[data-variant='title2'] { font-size: var(--canon-font-size-8); font-weight: var(--canon-font-weight-bold); } -.canon-Heading--variant-title3 { +.canon-Heading[data-variant='title3'] { font-size: var(--canon-font-size-7); font-weight: var(--canon-font-weight-bold); } -.canon-Heading--variant-title4 { +.canon-Heading[data-variant='title4'] { font-size: var(--canon-font-size-title4); font-weight: var(--canon-font-weight-bold); } -.canon-Heading--variant-title5 { +.canon-Heading[data-variant='title5'] { font-size: var(--canon-font-size-5); font-weight: var(--canon-font-weight-bold); } From 95a233c631a16e095b358a4aea06dacce6a1b875 Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Sat, 12 Apr 2025 14:20:22 +0200 Subject: [PATCH 06/12] Update data attr on all components Signed-off-by: Charles de Dreuille --- packages/canon/src/components/Button/Button.tsx | 9 +++------ packages/canon/src/components/Button/styles.css | 12 ++++++------ .../canon/src/components/IconButton/IconButton.tsx | 9 +++------ packages/canon/src/components/IconButton/styles.css | 12 ++++++------ packages/canon/src/components/Link/Link.tsx | 11 +++-------- packages/canon/src/components/Link/styles.css | 12 ++++++------ .../canon/src/components/Select/Select.styles.css | 4 ++-- packages/canon/src/components/Select/Select.tsx | 6 ++---- .../src/components/TextField/TextField.styles.css | 4 ++-- .../canon/src/components/TextField/TextField.tsx | 6 ++---- 10 files changed, 35 insertions(+), 50 deletions(-) diff --git a/packages/canon/src/components/Button/Button.tsx b/packages/canon/src/components/Button/Button.tsx index 179c35323a..b9a1229fbd 100644 --- a/packages/canon/src/components/Button/Button.tsx +++ b/packages/canon/src/components/Button/Button.tsx @@ -44,12 +44,9 @@ export const Button = forwardRef( ); }, diff --git a/packages/canon/src/components/Button/styles.css b/packages/canon/src/components/Button/styles.css index a05a0b3a4f..785fbf3b88 100644 --- a/packages/canon/src/components/Button/styles.css +++ b/packages/canon/src/components/Button/styles.css @@ -94,12 +94,12 @@ height: 32px; } -.canon-Button[data-size='small'] .canon-Button--icon { +.canon-Button[data-size='small'] .canon-ButtonIcon { width: 1rem; height: 1rem; } -.canon-Button[data-size='medium'] .canon-Button--icon { +.canon-Button[data-size='medium'] .canon-ButtonIcon { width: 1.5rem; height: 1.5rem; } diff --git a/packages/canon/src/components/IconButton/IconButton.tsx b/packages/canon/src/components/IconButton/IconButton.tsx index 7e7f94d22e..b2581844bc 100644 --- a/packages/canon/src/components/IconButton/IconButton.tsx +++ b/packages/canon/src/components/IconButton/IconButton.tsx @@ -45,7 +45,7 @@ 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 089dd1fcda..859c512fd6 100644 --- a/packages/canon/src/components/IconButton/styles.css +++ b/packages/canon/src/components/IconButton/styles.css @@ -94,12 +94,12 @@ width: 32px; } -.canon-IconButton[data-size='small'] .canon-IconButton--icon { +.canon-IconButton[data-size='small'] .canon-IconButtonIcon { width: 1rem; height: 1rem; } -.canon-IconButton[data-size='medium'] .canon-IconButton--icon { +.canon-IconButton[data-size='medium'] .canon-IconButtonIcon { width: 1.5rem; height: 1.5rem; } diff --git a/packages/canon/src/components/Select/Select.styles.css b/packages/canon/src/components/Select/Select.styles.css index 718636d954..fa00d81302 100644 --- a/packages/canon/src/components/Select/Select.styles.css +++ b/packages/canon/src/components/Select/Select.styles.css @@ -21,14 +21,14 @@ width: 100%; } -.canon-Select--label { +.canon-SelectLabel { font-size: var(--canon-font-size-2); font-weight: var(--canon-font-weight-regular); color: var(--canon-fg-primary); margin-bottom: var(--canon-space-1_5); } -.canon-Select--description { +.canon-SelectDescription { font-size: var(--canon-font-size-2); font-weight: var(--canon-font-weight-regular); color: var(--canon-fg-secondary); @@ -36,7 +36,7 @@ padding-top: var(--canon-space-1_5); } -.canon-Select--error { +.canon-SelectError { font-size: var(--canon-font-size-2); font-weight: var(--canon-font-weight-regular); color: var(--canon-fg-danger); @@ -44,7 +44,7 @@ padding-top: var(--canon-space-1_5); } -.canon-Select--trigger { +.canon-SelectTrigger { box-sizing: border-box; border-radius: var(--canon-radius-3); border: 1px solid var(--canon-border); @@ -63,41 +63,41 @@ gap: var(--canon-space-2); } -.canon-Select--trigger::placeholder { +.canon-SelectTrigger::placeholder { color: var(--canon-fg-secondary); } -.canon-Select--trigger:hover { +.canon-SelectTrigger:hover { border-color: var(--canon-border-hover); } -.canon-Select--trigger:focus-visible { +.canon-SelectTrigger:focus-visible { border-color: var(--canon-border-pressed); outline: 0; } -.canon-Select--trigger[data-invalid] { +.canon-SelectTrigger[data-invalid] { border-color: var(--canon-fg-danger); } -.canon-Select--trigger[data-invalid]:hover { +.canon-SelectTrigger[data-invalid]:hover { border-width: 2px; } -.canon-Select--trigger[data-invalid]:focus-visible { +.canon-SelectTrigger[data-invalid]:focus-visible { border-width: 2px; } -.canon-Select--trigger[data-disabled] { +.canon-SelectTrigger[data-disabled] { cursor: not-allowed; border-color: var(--canon-border-disabled); color: var(--canon-fg-disabled); } -.canon-Select--trigger[data-size='small'] { +.canon-SelectTrigger[data-size='small'] { height: 2rem; } -.canon-Select--trigger[data-size='medium'] { +.canon-SelectTrigger[data-size='medium'] { height: 3rem; } @@ -106,11 +106,11 @@ transition: transform 0.2s ease; } -.canon-Select--trigger[data-popup-open] .canon-SelectIcon { +.canon-SelectTrigger[data-popup-open] .canon-SelectIcon { transform: rotate(180deg); } -.canon-Select--popup { +.canon-SelectPopup { box-sizing: border-box; max-height: var(--available-height); overflow-y: auto; @@ -125,13 +125,13 @@ transition: transform 150ms, opacity 150ms; } -.canon-Select--popup[data-starting-style], -.canon-Select--popup[data-ending-style] { +.canon-SelectPopup[data-starting-style], +.canon-SelectPopup[data-ending-style] { opacity: 0; transform: scale(0.9); } -.canon-Select--item { +.canon-SelectItem { position: relative; width: var(--anchor-width); display: grid; @@ -149,13 +149,13 @@ outline: none; } -.canon-Select--item[data-highlighted] { +.canon-SelectItem[data-highlighted] { z-index: 0; position: relative; color: var(--canon-fg-primary); } -.canon-Select--item[data-highlighted]::before { +.canon-SelectItem[data-highlighted]::before { content: ''; z-index: -1; position: absolute; @@ -165,37 +165,37 @@ background-color: var(--canon-bg-tint-hover); } -.canon-Select--item[data-disabled] { +.canon-SelectItem[data-disabled] { cursor: not-allowed; color: var(--canon-fg-disabled); } -.canon-Select--item-indicator { +.canon-SelectItemIndicator { grid-area: icon; display: flex; align-items: center; justify-content: center; } -.canon-Select--item-text { +.canon-SelectItemText { flex: 1; grid-area: text; } -.canon-Select--required { +.canon-SelectRequired { color: var(--canon-fg-secondary); font-size: var(--canon-font-size-2); font-weight: var(--canon-font-weight-regular); margin-left: var(--canon-space-1); } -.canon-Select--icon { +.canon-SelectIcon { display: flex; align-items: center; justify-content: center; } -.canon-Select--value { +.canon-SelectValue { text-overflow: ellipsis; overflow: hidden; white-space: nowrap; diff --git a/packages/canon/src/components/Select/Select.tsx b/packages/canon/src/components/Select/Select.tsx index d8760fc1ea..be8047ca02 100644 --- a/packages/canon/src/components/Select/Select.tsx +++ b/packages/canon/src/components/Select/Select.tsx @@ -48,10 +48,10 @@ export const Select = forwardRef((props, ref) => { return (

{label && ( -