@cdx-ui/components 0.0.1-beta.5 → 0.0.1-beta.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -18
- package/lib/commonjs/components/AlertDialog/index.js +1 -1
- package/lib/commonjs/components/AlertDialog/index.js.map +1 -1
- package/lib/commonjs/components/Avatar/index.js +1 -1
- package/lib/commonjs/components/Avatar/styles.js +36 -29
- package/lib/commonjs/components/Avatar/styles.js.map +1 -1
- package/lib/commonjs/components/Button/index.js +12 -1
- package/lib/commonjs/components/Button/index.js.map +1 -1
- package/lib/commonjs/components/Button/styles.js +26 -26
- package/lib/commonjs/components/Button/styles.js.map +1 -1
- package/lib/commonjs/components/CLAUDE.md +90 -0
- package/lib/commonjs/components/Card/index.js +22 -4
- package/lib/commonjs/components/Card/index.js.map +1 -1
- package/lib/commonjs/components/Card/styles.js +27 -4
- package/lib/commonjs/components/Card/styles.js.map +1 -1
- package/lib/commonjs/components/Checkbox/index.js +5 -29
- package/lib/commonjs/components/Checkbox/index.js.map +1 -1
- package/lib/commonjs/components/Checkbox/styles.js +39 -47
- package/lib/commonjs/components/Checkbox/styles.js.map +1 -1
- package/lib/commonjs/components/Chip/index.js +78 -9
- package/lib/commonjs/components/Chip/index.js.map +1 -1
- package/lib/commonjs/components/Chip/styles.js +207 -21
- package/lib/commonjs/components/Chip/styles.js.map +1 -1
- package/lib/commonjs/components/Field/index.js +8 -2
- package/lib/commonjs/components/Field/index.js.map +1 -1
- package/lib/commonjs/components/Field/styles.js +4 -4
- package/lib/commonjs/components/Field/styles.js.map +1 -1
- package/lib/commonjs/components/Heading/styles.js +1 -1
- package/lib/commonjs/components/Heading/styles.js.map +1 -1
- package/lib/commonjs/components/Icon/index.js +3 -4
- package/lib/commonjs/components/Icon/index.js.map +1 -1
- package/lib/commonjs/components/IconButton/index.js +6 -1
- package/lib/commonjs/components/IconButton/index.js.map +1 -1
- package/lib/commonjs/components/IconButton/styles.js +135 -10
- package/lib/commonjs/components/IconButton/styles.js.map +1 -1
- package/lib/commonjs/components/Input/styles.js +7 -6
- package/lib/commonjs/components/Input/styles.js.map +1 -1
- package/lib/commonjs/components/Link/index.js +22 -3
- package/lib/commonjs/components/Link/index.js.map +1 -1
- package/lib/commonjs/components/Link/styles.js +56 -6
- package/lib/commonjs/components/Link/styles.js.map +1 -1
- package/lib/commonjs/components/ListItem/styles.js +9 -9
- package/lib/commonjs/components/ListItem/styles.js.map +1 -1
- package/lib/commonjs/components/ProgressSegmented/index.js +24 -10
- package/lib/commonjs/components/ProgressSegmented/index.js.map +1 -1
- package/lib/commonjs/components/Radio/index.js +167 -0
- package/lib/commonjs/components/Radio/index.js.map +1 -0
- package/lib/commonjs/components/Radio/styles.js +31 -0
- package/lib/commonjs/components/Radio/styles.js.map +1 -0
- package/lib/commonjs/components/ScopedTheme/index.js +24 -0
- package/lib/commonjs/components/ScopedTheme/index.js.map +1 -0
- package/lib/commonjs/components/Select/SelectTriggerHost.web.js +4 -0
- package/lib/commonjs/components/Select/SelectTriggerHost.web.js.map +1 -1
- package/lib/commonjs/components/Select/index.js +9 -3
- package/lib/commonjs/components/Select/index.js.map +1 -1
- package/lib/commonjs/components/Select/styles.js +17 -20
- package/lib/commonjs/components/Select/styles.js.map +1 -1
- package/lib/commonjs/components/Text/styles.js +2 -2
- package/lib/commonjs/components/Text/styles.js.map +1 -1
- package/lib/commonjs/components/Tile/index.js +251 -0
- package/lib/commonjs/components/Tile/index.js.map +1 -0
- package/lib/commonjs/components/Tile/styles.js +52 -0
- package/lib/commonjs/components/Tile/styles.js.map +1 -0
- package/lib/commonjs/components/index.js +36 -0
- package/lib/commonjs/components/index.js.map +1 -1
- package/lib/commonjs/figma/Avatar.figma.js +54 -0
- package/lib/commonjs/figma/Avatar.figma.js.map +1 -0
- package/lib/commonjs/figma/Button.figma.js +28 -15
- package/lib/commonjs/figma/Button.figma.js.map +1 -1
- package/lib/commonjs/figma/CLAUDE.md +30 -0
- package/lib/commonjs/figma/Card.Header.figma.js +28 -0
- package/lib/commonjs/figma/Card.Header.figma.js.map +1 -0
- package/lib/commonjs/figma/Card.figma.js +42 -0
- package/lib/commonjs/figma/Card.figma.js.map +1 -0
- package/lib/commonjs/figma/Checkbox.figma.js +55 -0
- package/lib/commonjs/figma/Checkbox.figma.js.map +1 -0
- package/lib/commonjs/figma/Chip.figma.js +68 -0
- package/lib/commonjs/figma/Chip.figma.js.map +1 -0
- package/lib/commonjs/figma/Field.Input.figma.js +57 -0
- package/lib/commonjs/figma/Field.Input.figma.js.map +1 -0
- package/lib/commonjs/figma/Field.Select.figma.js +57 -0
- package/lib/commonjs/figma/Field.Select.figma.js.map +1 -0
- package/lib/commonjs/figma/Heading.figma.js +30 -0
- package/lib/commonjs/figma/Heading.figma.js.map +1 -0
- package/lib/commonjs/figma/Icon.figma.js +20 -0
- package/lib/commonjs/figma/Icon.figma.js.map +1 -0
- package/lib/commonjs/figma/IconButton.figma.js +47 -0
- package/lib/commonjs/figma/IconButton.figma.js.map +1 -0
- package/lib/commonjs/figma/Input.figma.js +52 -0
- package/lib/commonjs/figma/Input.figma.js.map +1 -0
- package/lib/commonjs/figma/Link.figma.js +30 -0
- package/lib/commonjs/figma/Link.figma.js.map +1 -0
- package/lib/commonjs/figma/ProgressSegmented.figma.js +39 -0
- package/lib/commonjs/figma/ProgressSegmented.figma.js.map +1 -0
- package/lib/commonjs/figma/Radio.figma.js +40 -0
- package/lib/commonjs/figma/Radio.figma.js.map +1 -0
- package/lib/commonjs/figma/Select.figma.js +53 -0
- package/lib/commonjs/figma/Select.figma.js.map +1 -0
- package/lib/commonjs/figma/Text.figma.js +29 -0
- package/lib/commonjs/figma/Text.figma.js.map +1 -0
- package/lib/commonjs/figma/icons.figma.batch.js +27 -0
- package/lib/commonjs/figma/icons.figma.batch.js.map +1 -0
- package/lib/commonjs/figma/icons.figma.batch.json +17705 -0
- package/lib/commonjs/metro/withCdxMetroConfig.js +7 -18
- package/lib/commonjs/metro/withCdxMetroConfig.js.map +1 -1
- package/lib/commonjs/metro/withForgeMetroConfig.js +24 -0
- package/lib/commonjs/metro/withForgeMetroConfig.js.map +1 -0
- package/lib/commonjs/styles/primitives.js +43 -6
- package/lib/commonjs/styles/primitives.js.map +1 -1
- package/lib/module/components/AlertDialog/index.js +1 -1
- package/lib/module/components/AlertDialog/index.js.map +1 -1
- package/lib/module/components/Avatar/index.js +1 -1
- package/lib/module/components/Avatar/styles.js +36 -29
- package/lib/module/components/Avatar/styles.js.map +1 -1
- package/lib/module/components/Button/index.js +13 -2
- package/lib/module/components/Button/index.js.map +1 -1
- package/lib/module/components/Button/styles.js +26 -26
- package/lib/module/components/Button/styles.js.map +1 -1
- package/lib/module/components/CLAUDE.md +90 -0
- package/lib/module/components/Card/index.js +23 -4
- package/lib/module/components/Card/index.js.map +1 -1
- package/lib/module/components/Card/styles.js +27 -4
- package/lib/module/components/Card/styles.js.map +1 -1
- package/lib/module/components/Checkbox/index.js +6 -30
- package/lib/module/components/Checkbox/index.js.map +1 -1
- package/lib/module/components/Checkbox/styles.js +40 -48
- package/lib/module/components/Checkbox/styles.js.map +1 -1
- package/lib/module/components/Chip/index.js +82 -13
- package/lib/module/components/Chip/index.js.map +1 -1
- package/lib/module/components/Chip/styles.js +206 -20
- package/lib/module/components/Chip/styles.js.map +1 -1
- package/lib/module/components/Field/index.js +9 -3
- package/lib/module/components/Field/index.js.map +1 -1
- package/lib/module/components/Field/styles.js +4 -4
- package/lib/module/components/Field/styles.js.map +1 -1
- package/lib/module/components/Heading/styles.js +1 -1
- package/lib/module/components/Heading/styles.js.map +1 -1
- package/lib/module/components/Icon/index.js +3 -4
- package/lib/module/components/Icon/index.js.map +1 -1
- package/lib/module/components/IconButton/index.js +6 -1
- package/lib/module/components/IconButton/index.js.map +1 -1
- package/lib/module/components/IconButton/styles.js +135 -10
- package/lib/module/components/IconButton/styles.js.map +1 -1
- package/lib/module/components/Input/styles.js +7 -6
- package/lib/module/components/Input/styles.js.map +1 -1
- package/lib/module/components/Link/index.js +25 -6
- package/lib/module/components/Link/index.js.map +1 -1
- package/lib/module/components/Link/styles.js +55 -6
- package/lib/module/components/Link/styles.js.map +1 -1
- package/lib/module/components/ListItem/styles.js +10 -10
- package/lib/module/components/ListItem/styles.js.map +1 -1
- package/lib/module/components/ProgressSegmented/index.js +25 -11
- package/lib/module/components/ProgressSegmented/index.js.map +1 -1
- package/lib/module/components/Radio/index.js +164 -0
- package/lib/module/components/Radio/index.js.map +1 -0
- package/lib/module/components/Radio/styles.js +27 -0
- package/lib/module/components/Radio/styles.js.map +1 -0
- package/lib/module/components/ScopedTheme/index.js +19 -0
- package/lib/module/components/ScopedTheme/index.js.map +1 -0
- package/lib/module/components/Select/SelectTriggerHost.web.js +4 -0
- package/lib/module/components/Select/SelectTriggerHost.web.js.map +1 -1
- package/lib/module/components/Select/index.js +10 -4
- package/lib/module/components/Select/index.js.map +1 -1
- package/lib/module/components/Select/styles.js +18 -21
- package/lib/module/components/Select/styles.js.map +1 -1
- package/lib/module/components/Text/styles.js +2 -2
- package/lib/module/components/Text/styles.js.map +1 -1
- package/lib/module/components/Tile/index.js +243 -0
- package/lib/module/components/Tile/index.js.map +1 -0
- package/lib/module/components/Tile/styles.js +48 -0
- package/lib/module/components/Tile/styles.js.map +1 -0
- package/lib/module/components/index.js +3 -0
- package/lib/module/components/index.js.map +1 -1
- package/lib/module/figma/Avatar.figma.js +48 -0
- package/lib/module/figma/Avatar.figma.js.map +1 -0
- package/lib/module/figma/Button.figma.js +28 -15
- package/lib/module/figma/Button.figma.js.map +1 -1
- package/lib/module/figma/CLAUDE.md +30 -0
- package/lib/module/figma/Card.Header.figma.js +22 -0
- package/lib/module/figma/Card.Header.figma.js.map +1 -0
- package/lib/module/figma/Card.figma.js +36 -0
- package/lib/module/figma/Card.figma.js.map +1 -0
- package/lib/module/figma/Checkbox.figma.js +49 -0
- package/lib/module/figma/Checkbox.figma.js.map +1 -0
- package/lib/module/figma/Chip.figma.js +62 -0
- package/lib/module/figma/Chip.figma.js.map +1 -0
- package/lib/module/figma/Field.Input.figma.js +51 -0
- package/lib/module/figma/Field.Input.figma.js.map +1 -0
- package/lib/module/figma/Field.Select.figma.js +51 -0
- package/lib/module/figma/Field.Select.figma.js.map +1 -0
- package/lib/module/figma/Heading.figma.js +24 -0
- package/lib/module/figma/Heading.figma.js.map +1 -0
- package/lib/module/figma/Icon.figma.js +14 -0
- package/lib/module/figma/Icon.figma.js.map +1 -0
- package/lib/module/figma/IconButton.figma.js +41 -0
- package/lib/module/figma/IconButton.figma.js.map +1 -0
- package/lib/module/figma/Input.figma.js +46 -0
- package/lib/module/figma/Input.figma.js.map +1 -0
- package/lib/module/figma/Link.figma.js +24 -0
- package/lib/module/figma/Link.figma.js.map +1 -0
- package/lib/module/figma/ProgressSegmented.figma.js +33 -0
- package/lib/module/figma/ProgressSegmented.figma.js.map +1 -0
- package/lib/module/figma/Radio.figma.js +34 -0
- package/lib/module/figma/Radio.figma.js.map +1 -0
- package/lib/module/figma/Select.figma.js +47 -0
- package/lib/module/figma/Select.figma.js.map +1 -0
- package/lib/module/figma/Text.figma.js +23 -0
- package/lib/module/figma/Text.figma.js.map +1 -0
- package/lib/module/figma/icons.figma.batch.js +22 -0
- package/lib/module/figma/icons.figma.batch.js.map +1 -0
- package/lib/module/figma/icons.figma.batch.json +17705 -0
- package/lib/module/metro/withCdxMetroConfig.js +3 -17
- package/lib/module/metro/withCdxMetroConfig.js.map +1 -1
- package/lib/module/metro/withForgeMetroConfig.js +20 -0
- package/lib/module/metro/withForgeMetroConfig.js.map +1 -0
- package/lib/module/styles/primitives.js +43 -6
- package/lib/module/styles/primitives.js.map +1 -1
- package/lib/typescript/components/Avatar/styles.d.ts +4 -4
- package/lib/typescript/components/Avatar/styles.d.ts.map +1 -1
- package/lib/typescript/components/Button/index.d.ts +13 -1
- package/lib/typescript/components/Button/index.d.ts.map +1 -1
- package/lib/typescript/components/Button/styles.d.ts +3 -3
- package/lib/typescript/components/Card/index.d.ts +4 -3
- package/lib/typescript/components/Card/index.d.ts.map +1 -1
- package/lib/typescript/components/Card/styles.d.ts +13 -3
- package/lib/typescript/components/Card/styles.d.ts.map +1 -1
- package/lib/typescript/components/Checkbox/index.d.ts +1 -2
- package/lib/typescript/components/Checkbox/index.d.ts.map +1 -1
- package/lib/typescript/components/Checkbox/styles.d.ts +4 -14
- package/lib/typescript/components/Checkbox/styles.d.ts.map +1 -1
- package/lib/typescript/components/Chip/index.d.ts +19 -6
- package/lib/typescript/components/Chip/index.d.ts.map +1 -1
- package/lib/typescript/components/Chip/styles.d.ts +13 -4
- package/lib/typescript/components/Chip/styles.d.ts.map +1 -1
- package/lib/typescript/components/Field/FieldLabel.web.d.ts +2 -2
- package/lib/typescript/components/Field/FieldLabel.web.d.ts.map +1 -1
- package/lib/typescript/components/Field/index.d.ts.map +1 -1
- package/lib/typescript/components/Field/styles.d.ts.map +1 -1
- package/lib/typescript/components/Heading/styles.d.ts +1 -1
- package/lib/typescript/components/Icon/index.d.ts +5 -5
- package/lib/typescript/components/Icon/index.d.ts.map +1 -1
- package/lib/typescript/components/IconButton/index.d.ts +3 -3
- package/lib/typescript/components/IconButton/index.d.ts.map +1 -1
- package/lib/typescript/components/IconButton/styles.d.ts +6 -2
- package/lib/typescript/components/IconButton/styles.d.ts.map +1 -1
- package/lib/typescript/components/Input/styles.d.ts.map +1 -1
- package/lib/typescript/components/Link/index.d.ts +2 -2
- package/lib/typescript/components/Link/index.d.ts.map +1 -1
- package/lib/typescript/components/Link/styles.d.ts +9 -2
- package/lib/typescript/components/Link/styles.d.ts.map +1 -1
- package/lib/typescript/components/ListItem/styles.d.ts.map +1 -1
- package/lib/typescript/components/ProgressSegmented/index.d.ts +14 -3
- package/lib/typescript/components/ProgressSegmented/index.d.ts.map +1 -1
- package/lib/typescript/components/Radio/index.d.ts +40 -0
- package/lib/typescript/components/Radio/index.d.ts.map +1 -0
- package/lib/typescript/components/Radio/styles.d.ts +8 -0
- package/lib/typescript/components/Radio/styles.d.ts.map +1 -0
- package/lib/typescript/components/ScopedTheme/index.d.ts +16 -0
- package/lib/typescript/components/ScopedTheme/index.d.ts.map +1 -0
- package/lib/typescript/components/Select/SelectTriggerHost.web.d.ts +3 -0
- package/lib/typescript/components/Select/SelectTriggerHost.web.d.ts.map +1 -1
- package/lib/typescript/components/Select/index.d.ts +1 -1
- package/lib/typescript/components/Select/index.d.ts.map +1 -1
- package/lib/typescript/components/Select/styles.d.ts.map +1 -1
- package/lib/typescript/components/Stack/styles.d.ts +2 -2
- package/lib/typescript/components/Text/styles.d.ts +1 -1
- package/lib/typescript/components/Tile/index.d.ts +70 -0
- package/lib/typescript/components/Tile/index.d.ts.map +1 -0
- package/lib/typescript/components/Tile/styles.d.ts +18 -0
- package/lib/typescript/components/Tile/styles.d.ts.map +1 -0
- package/lib/typescript/components/index.d.ts +3 -0
- package/lib/typescript/components/index.d.ts.map +1 -1
- package/lib/typescript/figma/Avatar.figma.d.ts +8 -0
- package/lib/typescript/figma/Avatar.figma.d.ts.map +1 -0
- package/lib/typescript/figma/Button.figma.d.ts.map +1 -1
- package/lib/typescript/figma/Card.Header.figma.d.ts +8 -0
- package/lib/typescript/figma/Card.Header.figma.d.ts.map +1 -0
- package/lib/typescript/figma/Card.figma.d.ts +8 -0
- package/lib/typescript/figma/Card.figma.d.ts.map +1 -0
- package/lib/typescript/figma/Checkbox.figma.d.ts +8 -0
- package/lib/typescript/figma/Checkbox.figma.d.ts.map +1 -0
- package/lib/typescript/figma/Chip.figma.d.ts +8 -0
- package/lib/typescript/figma/Chip.figma.d.ts.map +1 -0
- package/lib/typescript/figma/Field.Input.figma.d.ts +8 -0
- package/lib/typescript/figma/Field.Input.figma.d.ts.map +1 -0
- package/lib/typescript/figma/Field.Select.figma.d.ts +8 -0
- package/lib/typescript/figma/Field.Select.figma.d.ts.map +1 -0
- package/lib/typescript/figma/Heading.figma.d.ts +8 -0
- package/lib/typescript/figma/Heading.figma.d.ts.map +1 -0
- package/lib/typescript/figma/Icon.figma.d.ts +8 -0
- package/lib/typescript/figma/Icon.figma.d.ts.map +1 -0
- package/lib/typescript/figma/IconButton.figma.d.ts +8 -0
- package/lib/typescript/figma/IconButton.figma.d.ts.map +1 -0
- package/lib/typescript/figma/Input.figma.d.ts +8 -0
- package/lib/typescript/figma/Input.figma.d.ts.map +1 -0
- package/lib/typescript/figma/Link.figma.d.ts +8 -0
- package/lib/typescript/figma/Link.figma.d.ts.map +1 -0
- package/lib/typescript/figma/ProgressSegmented.figma.d.ts +8 -0
- package/lib/typescript/figma/ProgressSegmented.figma.d.ts.map +1 -0
- package/lib/typescript/figma/Radio.figma.d.ts +8 -0
- package/lib/typescript/figma/Radio.figma.d.ts.map +1 -0
- package/lib/typescript/figma/Select.figma.d.ts +8 -0
- package/lib/typescript/figma/Select.figma.d.ts.map +1 -0
- package/lib/typescript/figma/Text.figma.d.ts +8 -0
- package/lib/typescript/figma/Text.figma.d.ts.map +1 -0
- package/lib/typescript/figma/icons.figma.batch.d.ts +14 -0
- package/lib/typescript/figma/icons.figma.batch.d.ts.map +1 -0
- package/lib/typescript/metro/withCdxMetroConfig.d.ts +4 -18
- package/lib/typescript/metro/withCdxMetroConfig.d.ts.map +1 -1
- package/lib/typescript/metro/withForgeMetroConfig.d.ts +19 -0
- package/lib/typescript/metro/withForgeMetroConfig.d.ts.map +1 -0
- package/lib/typescript/styles/primitives.d.ts +38 -0
- package/lib/typescript/styles/primitives.d.ts.map +1 -1
- package/package.json +8 -8
- package/src/components/AlertDialog/index.tsx +1 -1
- package/src/components/Avatar/index.tsx +1 -1
- package/src/components/Avatar/styles.ts +49 -34
- package/src/components/Button/index.tsx +37 -3
- package/src/components/Button/styles.ts +27 -27
- package/src/components/CLAUDE.md +90 -0
- package/src/components/Card/index.tsx +41 -16
- package/src/components/Card/styles.ts +42 -15
- package/src/components/Checkbox/index.tsx +8 -19
- package/src/components/Checkbox/styles.ts +82 -86
- package/src/components/Chip/index.tsx +104 -27
- package/src/components/Chip/styles.ts +232 -18
- package/src/components/Field/FieldLabel.web.tsx +1 -1
- package/src/components/Field/index.tsx +10 -3
- package/src/components/Field/styles.ts +5 -4
- package/src/components/Heading/styles.ts +1 -1
- package/src/components/Icon/index.tsx +6 -7
- package/src/components/IconButton/index.tsx +7 -6
- package/src/components/IconButton/styles.ts +136 -10
- package/src/components/Input/styles.ts +15 -9
- package/src/components/Link/index.tsx +22 -9
- package/src/components/Link/styles.ts +49 -9
- package/src/components/ListItem/styles.ts +12 -19
- package/src/components/ProgressSegmented/index.tsx +50 -14
- package/src/components/Radio/index.tsx +192 -0
- package/src/components/Radio/styles.ts +59 -0
- package/src/components/ScopedTheme/index.tsx +17 -0
- package/src/components/Select/SelectTriggerHost.web.tsx +8 -1
- package/src/components/Select/index.tsx +9 -4
- package/src/components/Select/styles.ts +49 -51
- package/src/components/Text/styles.ts +2 -2
- package/src/components/Tile/index.tsx +296 -0
- package/src/components/Tile/styles.ts +82 -0
- package/src/components/index.ts +3 -0
- package/src/metro/withCdxMetroConfig.ts +4 -29
- package/src/metro/withForgeMetroConfig.ts +29 -0
- package/src/styles/primitives.ts +43 -6
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Components — authoring & styling conventions
|
|
2
|
+
|
|
3
|
+
Auto-loaded when working in `packages/components/src/components/**`. Covers both the
|
|
4
|
+
styled component files (`index.tsx`) and their co-located CVA variant files (`styles.ts`).
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Component Authoring (`index.tsx`)
|
|
9
|
+
|
|
10
|
+
Styled components in `@cdx-ui/components` follow a consistent pattern. Read the full guides before making changes:
|
|
11
|
+
|
|
12
|
+
- `docs/internal/practices/composition.md` — compound component pattern, naming conventions
|
|
13
|
+
- `docs/internal/practices/types.md` — prop types, `I*Props` vs `*Props`, exporting
|
|
14
|
+
- `docs/internal/practices/styling.md` — `cn()`, CVA, token classes, `Platform.select()`
|
|
15
|
+
- `docs/internal/practices/state.md` — `useControllableState`, `composeEventHandlers`
|
|
16
|
+
- `docs/internal/practices/data-attributes.md` — `data-[state]` and `data-slot`
|
|
17
|
+
|
|
18
|
+
### Pattern summary
|
|
19
|
+
|
|
20
|
+
Each component follows this structure (see `Button/index.tsx` as the canonical example):
|
|
21
|
+
|
|
22
|
+
1. **Imports** — RN base components, primitive from `@cdx-ui/primitives`, `cn` + style context from `@cdx-ui/utils`, variant functions from `./styles`
|
|
23
|
+
2. **Scope constant** — `const SCOPE = 'COMPONENT_NAME'` for `withStyleContext` / `useStyleContext`
|
|
24
|
+
3. **Root wrapping** — `const Root = withStyleContext(BaseRNComponent, SCOPE)`
|
|
25
|
+
4. **Primitive instantiation** — `const Primitive = createComponent({ Root, Text, ... })` using the primitive factory
|
|
26
|
+
5. **Styled sub-components** — each wraps a single element, uses `forwardRef`, destructures variant props with defaults, computes `cn(variantFn({ ...variants }), className)`, passes `context` to the primitive root
|
|
27
|
+
6. **Compound export** — `Object.assign(RootComponent, { Sub1, Sub2 }) as CompoundType`
|
|
28
|
+
|
|
29
|
+
### Key rules
|
|
30
|
+
|
|
31
|
+
- Props interface extends RN base props + primitive `I*Props` + CVA `VariantProps` + `{ className?: string }`
|
|
32
|
+
- Always accept and spread `style` alongside `className`
|
|
33
|
+
- Variant defaults in destructuring must match CVA `defaultVariants`
|
|
34
|
+
- `displayName` set on every exported sub-component
|
|
35
|
+
- `className` is merged last via `cn()` so consumer overrides always win
|
|
36
|
+
- Never hardcode colors — use semantic token classes (`bg-surface-*`, `text-content-*`, `border-stroke-*`)
|
|
37
|
+
- Event handlers composed via `composeEventHandlers` from `@cdx-ui/utils`
|
|
38
|
+
- Third-party libraries fully abstracted — no adopted library types leak to consumers
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Styling Conventions (`styles.ts`)
|
|
43
|
+
|
|
44
|
+
Variant definitions live in co-located `styles.ts` files using CVA. Read the full guides before making changes:
|
|
45
|
+
|
|
46
|
+
- `docs/internal/practices/styling.md` — `cn()`, CVA, token architecture, dark mode, `Platform.select()`
|
|
47
|
+
- `docs/internal/practices/data-attributes.md` — `data-[state]` selectors for interaction states
|
|
48
|
+
|
|
49
|
+
### Pattern summary
|
|
50
|
+
|
|
51
|
+
Each `styles.ts` exports CVA variant functions and their derived `VariantProps` types (see `Button/styles.ts` as the canonical example):
|
|
52
|
+
|
|
53
|
+
```ts
|
|
54
|
+
import { Platform } from 'react-native';
|
|
55
|
+
import { cva, type VariantProps } from 'class-variance-authority';
|
|
56
|
+
import { DISABLED_CURSOR, TRANSITION_COLORS } from '../../styles/primitives';
|
|
57
|
+
|
|
58
|
+
export const componentRootVariants = cva(
|
|
59
|
+
[
|
|
60
|
+
/* base classes */
|
|
61
|
+
],
|
|
62
|
+
{
|
|
63
|
+
variants: {
|
|
64
|
+
/* variant axes */
|
|
65
|
+
},
|
|
66
|
+
compoundVariants: [
|
|
67
|
+
/* variant × variant combinations */
|
|
68
|
+
],
|
|
69
|
+
defaultVariants: {
|
|
70
|
+
/* defaults matching the component's destructured defaults */
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
export type ComponentVariantProps = VariantProps<typeof componentRootVariants>;
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Key rules
|
|
79
|
+
|
|
80
|
+
- **Semantic token classes only** — use `bg-surface-action-strong`, `text-content-primary`, `border-stroke-primary`, etc. Never hardcode hex colors, `bg-white`, `text-black`, or raw Tailwind color scales for themed values.
|
|
81
|
+
- **`data-[state]` selectors** — use `data-[disabled=true]:`, `data-[hover=true]:`, `data-[active=true]:`, `data-[focus-visible=true]:` for interaction states. Primitives emit these data attributes.
|
|
82
|
+
- **`Platform.select()`** for platform-specific classes — web gets `data-[hover=true]` styles (hover exists on web); native responds only to `data-[active=true]` (press). Always set `default` (native) and `web` keys.
|
|
83
|
+
- **Shared style primitives** — import `DISABLED_CURSOR`, `TRANSITION_COLORS`, etc. from `../../styles/primitives` for cross-component consistency.
|
|
84
|
+
- **`web:` prefix** for web-only utilities — e.g., `web:outline-none`, `web:focus-visible:ring-2`.
|
|
85
|
+
- **`compoundVariants`** for variant × variant combinations where simple variant merging is insufficient.
|
|
86
|
+
- **`defaultVariants`** must match the destructured defaults in the component's `index.tsx`.
|
|
87
|
+
- **One `cva()` per sub-component** — root, text, icon, spinner, etc. each get their own variant function.
|
|
88
|
+
- **Export `VariantProps` types** — derived via `VariantProps<typeof variantFn>` for the component layer to consume.
|
|
89
|
+
- **No dynamic string construction** — all Tailwind class names must be statically detectable by the Tailwind scanner.
|
|
90
|
+
- **CSS variables for token values** — use `rounded-[var(--border-radius-button)]` syntax when referencing design tokens not mapped to Tailwind utilities.
|
|
@@ -1,31 +1,48 @@
|
|
|
1
1
|
import { forwardRef, type ReactNode } from 'react';
|
|
2
2
|
import { View, type ViewProps } from 'react-native';
|
|
3
|
-
import { cn } from '@cdx-ui/utils';
|
|
3
|
+
import { cn, useStyleContext, withStyleContext } from '@cdx-ui/utils';
|
|
4
4
|
import {
|
|
5
5
|
cardContentVariants,
|
|
6
6
|
cardFooterVariants,
|
|
7
7
|
cardHeaderVariants,
|
|
8
8
|
cardRootVariants,
|
|
9
|
+
type CardContentVariantProps,
|
|
10
|
+
type CardFooterVariantProps,
|
|
11
|
+
type CardVariantProps,
|
|
9
12
|
} from './styles';
|
|
10
13
|
|
|
11
14
|
// =============================================================================
|
|
12
15
|
// STYLED ROOT COMPONENT
|
|
13
16
|
// =============================================================================
|
|
14
17
|
|
|
15
|
-
|
|
18
|
+
const SCOPE = 'CARD';
|
|
19
|
+
|
|
20
|
+
const Root = withStyleContext(View, SCOPE);
|
|
21
|
+
|
|
22
|
+
const useCardStyleContext = () => useStyleContext(SCOPE) as CardVariantProps;
|
|
23
|
+
|
|
24
|
+
export interface CardProps extends ViewProps, CardVariantProps {
|
|
16
25
|
className?: string;
|
|
17
26
|
children?: ReactNode;
|
|
18
27
|
}
|
|
19
28
|
|
|
20
|
-
const CardRoot = forwardRef<View, CardProps>(
|
|
21
|
-
|
|
29
|
+
const CardRoot = forwardRef<View, CardProps>(
|
|
30
|
+
({ className, children, style, fullBleed, ...props }, ref) => {
|
|
31
|
+
const computedClassName = cn(cardRootVariants(), className);
|
|
22
32
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
33
|
+
return (
|
|
34
|
+
<Root
|
|
35
|
+
ref={ref}
|
|
36
|
+
className={computedClassName}
|
|
37
|
+
style={style}
|
|
38
|
+
context={{ fullBleed }}
|
|
39
|
+
{...props}
|
|
40
|
+
>
|
|
41
|
+
{children}
|
|
42
|
+
</Root>
|
|
43
|
+
);
|
|
44
|
+
},
|
|
45
|
+
);
|
|
29
46
|
|
|
30
47
|
CardRoot.displayName = 'Card';
|
|
31
48
|
|
|
@@ -56,14 +73,18 @@ CardHeader.displayName = 'Card.Header';
|
|
|
56
73
|
// STYLED CONTENT COMPONENT
|
|
57
74
|
// =============================================================================
|
|
58
75
|
|
|
59
|
-
export interface CardContentProps extends ViewProps {
|
|
76
|
+
export interface CardContentProps extends ViewProps, CardContentVariantProps {
|
|
60
77
|
className?: string;
|
|
61
78
|
children?: ReactNode;
|
|
62
79
|
}
|
|
63
80
|
|
|
64
81
|
const CardContent = forwardRef<View, CardContentProps>(
|
|
65
|
-
({ className, children, style, ...props }, ref) => {
|
|
66
|
-
const
|
|
82
|
+
({ className, children, style, fullBleed, ...props }, ref) => {
|
|
83
|
+
const { fullBleed: fullBleedFromContext } = useCardStyleContext();
|
|
84
|
+
const computedClassName = cn(
|
|
85
|
+
cardContentVariants({ fullBleed: fullBleed ?? fullBleedFromContext }),
|
|
86
|
+
className,
|
|
87
|
+
);
|
|
67
88
|
|
|
68
89
|
return (
|
|
69
90
|
<View ref={ref} className={computedClassName} style={style} {...props}>
|
|
@@ -79,14 +100,18 @@ CardContent.displayName = 'Card.Content';
|
|
|
79
100
|
// STYLED FOOTER COMPONENT
|
|
80
101
|
// =============================================================================
|
|
81
102
|
|
|
82
|
-
export interface CardFooterProps extends ViewProps {
|
|
103
|
+
export interface CardFooterProps extends ViewProps, CardFooterVariantProps {
|
|
83
104
|
className?: string;
|
|
84
105
|
children?: ReactNode;
|
|
85
106
|
}
|
|
86
107
|
|
|
87
108
|
const CardFooter = forwardRef<View, CardFooterProps>(
|
|
88
|
-
({ className, children, style, ...props }, ref) => {
|
|
89
|
-
const
|
|
109
|
+
({ className, children, style, fullBleed, ...props }, ref) => {
|
|
110
|
+
const { fullBleed: fullBleedFromContext } = useCardStyleContext();
|
|
111
|
+
const computedClassName = cn(
|
|
112
|
+
cardFooterVariants({ fullBleed: fullBleed ?? fullBleedFromContext }),
|
|
113
|
+
className,
|
|
114
|
+
);
|
|
90
115
|
|
|
91
116
|
return (
|
|
92
117
|
<View ref={ref} className={computedClassName} style={style} {...props}>
|
|
@@ -1,20 +1,31 @@
|
|
|
1
|
-
import { cva } from 'class-variance-authority';
|
|
1
|
+
import { cva, VariantProps } from 'class-variance-authority';
|
|
2
2
|
|
|
3
3
|
// ── Root ────────────────────────────────────────────────────
|
|
4
4
|
|
|
5
|
-
export const cardRootVariants = cva(
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
5
|
+
export const cardRootVariants = cva(
|
|
6
|
+
[
|
|
7
|
+
'bg-surface-primary',
|
|
8
|
+
'border border-stroke-secondary',
|
|
9
|
+
'rounded-[var(--border-radius-default)]',
|
|
10
|
+
'overflow-hidden',
|
|
11
|
+
],
|
|
12
|
+
{
|
|
13
|
+
variants: {
|
|
14
|
+
fullBleed: {
|
|
15
|
+
true: '',
|
|
16
|
+
false: '',
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
);
|
|
11
21
|
|
|
12
22
|
// ── Header ──────────────────────────────────────────────────
|
|
13
23
|
|
|
14
24
|
export const cardHeaderVariants = cva([
|
|
15
|
-
'flex-row items-center justify-between p-4',
|
|
16
25
|
'border-t-8 border-t-surface-brand-strong',
|
|
17
|
-
'border-b border-
|
|
26
|
+
'border-b border-solid border-b-stroke-secondary',
|
|
27
|
+
'flex-row items-center justify-between gap-0.5',
|
|
28
|
+
'px-5 py-3',
|
|
18
29
|
]);
|
|
19
30
|
|
|
20
31
|
// ── Title ───────────────────────────────────────────────────
|
|
@@ -23,12 +34,28 @@ export const cardTitleVariants = cva(['flex-1']);
|
|
|
23
34
|
|
|
24
35
|
// ── Content ─────────────────────────────────────────────────
|
|
25
36
|
|
|
26
|
-
export const cardContentVariants = cva(['text-content-primary', 'p-
|
|
37
|
+
export const cardContentVariants = cva(['text-content-primary', 'p-5'], {
|
|
38
|
+
variants: {
|
|
39
|
+
fullBleed: {
|
|
40
|
+
true: 'p-0',
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
});
|
|
27
44
|
|
|
28
45
|
// ── Footer ──────────────────────────────────────────────────
|
|
29
46
|
|
|
30
|
-
export const cardFooterVariants = cva([
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
47
|
+
export const cardFooterVariants = cva(['flex-col items-stretch gap-2'], {
|
|
48
|
+
variants: {
|
|
49
|
+
fullBleed: {
|
|
50
|
+
true: 'p-5',
|
|
51
|
+
false: 'px-5 pb-5 pt-0',
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
defaultVariants: {
|
|
55
|
+
fullBleed: false,
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
export type CardVariantProps = VariantProps<typeof cardRootVariants>;
|
|
60
|
+
export type CardContentVariantProps = VariantProps<typeof cardContentVariants>;
|
|
61
|
+
export type CardFooterVariantProps = VariantProps<typeof cardFooterVariants>;
|
|
@@ -2,10 +2,9 @@ import { forwardRef, type ReactNode } from 'react';
|
|
|
2
2
|
import { Pressable, Text, type TextProps, View, type ViewProps } from 'react-native';
|
|
3
3
|
import { Check, CheckIndeterminateSmall } from '@cdx-ui/icons';
|
|
4
4
|
import { createCheckbox, type ICheckboxProps } from '@cdx-ui/primitives';
|
|
5
|
-
import { cn
|
|
5
|
+
import { cn } from '@cdx-ui/utils';
|
|
6
6
|
import { Icon, IconProps } from '../Icon';
|
|
7
7
|
import {
|
|
8
|
-
type CheckboxVariantProps,
|
|
9
8
|
checkboxGroupVariants,
|
|
10
9
|
checkboxIconVariants,
|
|
11
10
|
checkboxIndicatorVariants,
|
|
@@ -13,14 +12,8 @@ import {
|
|
|
13
12
|
checkboxRootVariants,
|
|
14
13
|
} from './styles';
|
|
15
14
|
|
|
16
|
-
const SCOPE = 'CHECKBOX';
|
|
17
|
-
|
|
18
|
-
const Root = withStyleContext(Pressable, SCOPE);
|
|
19
|
-
|
|
20
|
-
const useCheckboxStyleContext = () => useStyleContext(SCOPE) as CheckboxVariantProps;
|
|
21
|
-
|
|
22
15
|
const CheckboxPrimitive = createCheckbox({
|
|
23
|
-
Root,
|
|
16
|
+
Root: Pressable,
|
|
24
17
|
Indicator: View,
|
|
25
18
|
Icon: View,
|
|
26
19
|
Label: Text,
|
|
@@ -31,14 +24,14 @@ const CheckboxPrimitive = createCheckbox({
|
|
|
31
24
|
// CHECKBOX ROOT
|
|
32
25
|
// =============================================================================
|
|
33
26
|
|
|
34
|
-
export interface CheckboxProps extends ICheckboxProps
|
|
27
|
+
export interface CheckboxProps extends ICheckboxProps {
|
|
35
28
|
className?: string;
|
|
36
29
|
children?: ReactNode;
|
|
37
30
|
}
|
|
38
31
|
|
|
39
32
|
const CheckboxRoot = forwardRef<View, CheckboxProps>(
|
|
40
|
-
({
|
|
41
|
-
const computedClassName = cn(checkboxRootVariants(
|
|
33
|
+
({ className, isIndeterminate, children, style, ...props }, ref) => {
|
|
34
|
+
const computedClassName = cn(checkboxRootVariants(), className);
|
|
42
35
|
|
|
43
36
|
return (
|
|
44
37
|
<CheckboxPrimitive
|
|
@@ -46,7 +39,6 @@ const CheckboxRoot = forwardRef<View, CheckboxProps>(
|
|
|
46
39
|
className={computedClassName}
|
|
47
40
|
isIndeterminate={isIndeterminate}
|
|
48
41
|
style={style}
|
|
49
|
-
context={{ size }}
|
|
50
42
|
{...props}
|
|
51
43
|
>
|
|
52
44
|
<CheckboxIndicator>
|
|
@@ -73,8 +65,7 @@ export interface CheckboxIndicatorProps extends ViewProps {
|
|
|
73
65
|
|
|
74
66
|
const CheckboxIndicator = forwardRef<View, CheckboxIndicatorProps>(
|
|
75
67
|
({ className, children, style, ...props }, ref) => {
|
|
76
|
-
const
|
|
77
|
-
const computedClassName = cn(checkboxIndicatorVariants({ size }), className);
|
|
68
|
+
const computedClassName = cn(checkboxIndicatorVariants(), className);
|
|
78
69
|
|
|
79
70
|
return (
|
|
80
71
|
<CheckboxPrimitive.Indicator
|
|
@@ -98,8 +89,7 @@ CheckboxIndicator.displayName = 'Checkbox.Indicator';
|
|
|
98
89
|
export interface CheckboxIconProps extends Omit<IconProps, 'children'> {}
|
|
99
90
|
|
|
100
91
|
const CheckboxIcon = ({ className, style, ...props }: CheckboxIconProps) => {
|
|
101
|
-
const
|
|
102
|
-
const computedClassName = cn(checkboxIconVariants({ size }), className);
|
|
92
|
+
const computedClassName = cn(checkboxIconVariants(), className);
|
|
103
93
|
|
|
104
94
|
return <Icon className={computedClassName} style={style} {...props} />;
|
|
105
95
|
};
|
|
@@ -117,8 +107,7 @@ export interface CheckboxLabelProps extends TextProps {
|
|
|
117
107
|
|
|
118
108
|
const CheckboxLabel = forwardRef<Text, CheckboxLabelProps>(
|
|
119
109
|
({ className, children, style, ...props }, ref) => {
|
|
120
|
-
const
|
|
121
|
-
const computedClassName = cn(checkboxLabelVariants({ size }), className);
|
|
110
|
+
const computedClassName = cn(checkboxLabelVariants(), className);
|
|
122
111
|
|
|
123
112
|
return (
|
|
124
113
|
<CheckboxPrimitive.Label
|
|
@@ -1,92 +1,90 @@
|
|
|
1
1
|
import { Platform } from 'react-native';
|
|
2
|
-
import { cva
|
|
3
|
-
import {
|
|
4
|
-
COLOR_BG_PRIMARY,
|
|
5
|
-
COLOR_BORDER_STRONG,
|
|
6
|
-
COLOR_TEXT_PRIMARY,
|
|
7
|
-
DISABLED_CURSOR,
|
|
8
|
-
DISABLED_OPACITY,
|
|
9
|
-
TRANSITION_COLORS,
|
|
10
|
-
} from '../../styles/primitives';
|
|
2
|
+
import { cva } from 'class-variance-authority';
|
|
3
|
+
import { DISABLED_CURSOR, DISABLED_OPACITY, TRANSITION_COLORS } from '../../styles/primitives';
|
|
11
4
|
|
|
12
|
-
export const checkboxRootVariants = cva(
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
},
|
|
20
|
-
},
|
|
21
|
-
defaultVariants: {
|
|
22
|
-
size: 'default',
|
|
23
|
-
},
|
|
24
|
-
},
|
|
25
|
-
);
|
|
5
|
+
export const checkboxRootVariants = cva([
|
|
6
|
+
'flex-row items-center gap-2.5',
|
|
7
|
+
DISABLED_OPACITY,
|
|
8
|
+
DISABLED_CURSOR,
|
|
9
|
+
// Suppress stray outline on the Pressable/label wrapper; focus ring is drawn on Checkbox.Indicator (Radio pattern).
|
|
10
|
+
'web:outline-none web:focus:outline-none web:focus-visible:outline-none',
|
|
11
|
+
]);
|
|
26
12
|
|
|
27
|
-
export const checkboxIndicatorVariants = cva(
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
13
|
+
export const checkboxIndicatorVariants = cva([
|
|
14
|
+
'items-center justify-center',
|
|
15
|
+
'h-5 w-5',
|
|
16
|
+
'rounded',
|
|
17
|
+
'border-2 border-solid',
|
|
18
|
+
'data-[disabled=true]:opacity-50',
|
|
19
|
+
// Background — layered by specificity. checked=false acts as an explicit reset so the base bg
|
|
20
|
+
// reasserts when transitioning from checked/indeterminate on native (where absent attributes
|
|
21
|
+
// break data-[attr=false] selectors).
|
|
22
|
+
// IMPORTANT: On native (Uniwind), only the LAST data-[] condition in a compound chain is
|
|
23
|
+
// effectively evaluated. Place the most discriminating condition last to avoid false matches.
|
|
24
|
+
'data-[checked=false]:bg-surface-primary',
|
|
25
|
+
'data-[checked=true]:bg-surface-action-strong',
|
|
26
|
+
'data-[indeterminate=true]:bg-surface-action-strong',
|
|
27
|
+
// Border — invalid (later) beats checked/indeterminate.
|
|
28
|
+
'data-[checked=false]:border-content-secondary',
|
|
29
|
+
'data-[checked=true]:border-stroke-action',
|
|
30
|
+
'data-[indeterminate=true]:border-stroke-action',
|
|
31
|
+
'data-[invalid=true]:border-stroke-danger',
|
|
32
|
+
Platform.select({
|
|
33
|
+
web: [
|
|
34
|
+
// Invalid bg — compound selectors evaluate correctly on web.
|
|
35
|
+
'data-[invalid=true]:data-[checked=true]:bg-surface-danger-strong',
|
|
36
|
+
'data-[invalid=true]:data-[indeterminate=true]:bg-surface-danger-strong',
|
|
37
|
+
TRANSITION_COLORS,
|
|
38
|
+
// Hover — unchecked (Figma: border unchanged, bg overlay at opacity/hover)
|
|
39
|
+
'data-[hover=true]:data-[checked=false]:data-[indeterminate=false]:bg-content-secondary/[0.08]',
|
|
40
|
+
// Hover — unchecked + invalid (overlay uses danger token)
|
|
41
|
+
'data-[hover=true]:data-[invalid=true]:data-[checked=false]:data-[indeterminate=false]:bg-surface-danger-strong/[0.08]',
|
|
42
|
+
// Hover — checked / indeterminate (bg + border darken together)
|
|
43
|
+
'data-[hover=true]:data-[checked=true]:bg-surface-action-strong-hover',
|
|
44
|
+
'data-[hover=true]:data-[checked=true]:border-[--color-surface-action-strong-hover]',
|
|
45
|
+
'data-[hover=true]:data-[indeterminate=true]:bg-surface-action-strong-hover',
|
|
46
|
+
'data-[hover=true]:data-[indeterminate=true]:border-[--color-surface-action-strong-hover]',
|
|
47
|
+
'data-[hover=true]:data-[checked=true]:data-[invalid=true]:bg-surface-danger-strong-hover',
|
|
48
|
+
'data-[hover=true]:data-[checked=true]:data-[invalid=true]:border-[--color-surface-danger-strong-hover]',
|
|
49
|
+
'data-[hover=true]:data-[indeterminate=true]:data-[invalid=true]:bg-surface-danger-strong-hover',
|
|
50
|
+
'data-[hover=true]:data-[indeterminate=true]:data-[invalid=true]:border-[--color-surface-danger-strong-hover]',
|
|
51
|
+
// Active — CSS :active pseudo-class (web root does not track press via data-active).
|
|
52
|
+
// data-[hover=true] guard ensures active beats hover by specificity (0,3,0 > 0,2,0).
|
|
53
|
+
'web:active:data-[hover=true]:data-[checked=true]:bg-surface-action-strong-active',
|
|
54
|
+
'web:active:data-[hover=true]:data-[checked=true]:border-[--color-surface-action-strong-active]',
|
|
55
|
+
'web:active:data-[hover=true]:data-[indeterminate=true]:bg-surface-action-strong-active',
|
|
56
|
+
'web:active:data-[hover=true]:data-[indeterminate=true]:border-[--color-surface-action-strong-active]',
|
|
57
|
+
'web:active:data-[hover=true]:data-[checked=true]:data-[invalid=true]:bg-surface-danger-strong-active',
|
|
58
|
+
'web:active:data-[hover=true]:data-[checked=true]:data-[invalid=true]:border-[--color-surface-danger-strong-active]',
|
|
59
|
+
'web:active:data-[hover=true]:data-[indeterminate=true]:data-[invalid=true]:bg-surface-danger-strong-active',
|
|
60
|
+
'web:active:data-[hover=true]:data-[indeterminate=true]:data-[invalid=true]:border-[--color-surface-danger-strong-active]',
|
|
61
|
+
// Focus ring
|
|
62
|
+
'web:data-[focus-visible=true]:outline-none',
|
|
63
|
+
'web:data-[focus-visible=true]:ring-2 web:data-[focus-visible=true]:ring-[--color-stroke-ring] web:data-[focus-visible=true]:ring-offset-2',
|
|
64
|
+
].join(' '),
|
|
65
|
+
default: [
|
|
66
|
+
// Invalid bg is NOT styled on native. Compound data-[] selectors cannot express
|
|
67
|
+
// "invalid AND checked" without false-matching other states (Uniwind only evaluates
|
|
68
|
+
// the last condition). Invalid state is communicated via border-stroke-danger (single
|
|
69
|
+
// condition, always correct). The fill stays action-strong for checked/indeterminate.
|
|
70
|
+
//
|
|
71
|
+
// Active — native tracks press via data-[active] from usePress.
|
|
72
|
+
// Place data-[active=true] last so the rule only fires during press.
|
|
73
|
+
// 'data-[checked=false]:data-[invalid=true]:bg-transparent',
|
|
74
|
+
'data-[checked=true]:data-[invalid=true]:bg-surface-danger-strong',
|
|
75
|
+
'data-[checked=true]:data-[active=true]:bg-surface-action-strong-active',
|
|
76
|
+
'data-[checked=true]:data-[active=true]:data-[invalid=true]:bg-surface-danger-strong-active',
|
|
77
|
+
'data-[indeterminate=true]:data-[active=true]:bg-surface-action-strong-active',
|
|
78
|
+
].join(' '),
|
|
79
|
+
}),
|
|
80
|
+
]);
|
|
63
81
|
|
|
64
|
-
export const checkboxIconVariants = cva(['text-white'
|
|
65
|
-
variants: {
|
|
66
|
-
size: {
|
|
67
|
-
small: 'h-3 w-3',
|
|
68
|
-
default: 'h-3.5 w-3.5',
|
|
69
|
-
},
|
|
70
|
-
},
|
|
71
|
-
defaultVariants: {
|
|
72
|
-
size: 'default',
|
|
73
|
-
},
|
|
74
|
-
});
|
|
82
|
+
export const checkboxIconVariants = cva(['text-white', 'h-5 w-5']);
|
|
75
83
|
|
|
76
|
-
export const checkboxLabelVariants = cva(
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
size: {
|
|
81
|
-
small: 'text-sm',
|
|
82
|
-
default: 'text-base',
|
|
83
|
-
},
|
|
84
|
-
},
|
|
85
|
-
defaultVariants: {
|
|
86
|
-
size: 'default',
|
|
87
|
-
},
|
|
88
|
-
},
|
|
89
|
-
);
|
|
84
|
+
export const checkboxLabelVariants = cva([
|
|
85
|
+
'text-content-primary text-base',
|
|
86
|
+
'data-[disabled=true]:text-content-tertiary',
|
|
87
|
+
]);
|
|
90
88
|
|
|
91
89
|
export const checkboxGroupVariants = cva([], {
|
|
92
90
|
variants: {
|
|
@@ -99,5 +97,3 @@ export const checkboxGroupVariants = cva([], {
|
|
|
99
97
|
direction: 'column',
|
|
100
98
|
},
|
|
101
99
|
});
|
|
102
|
-
|
|
103
|
-
export type CheckboxVariantProps = VariantProps<typeof checkboxRootVariants>;
|