@zohodesk/components 1.6.25 → 1.6.26

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.
Files changed (216) hide show
  1. package/CHANGELOG.md +2042 -0
  2. package/README.md +16 -2031
  3. package/assets/Appearance/dark/mode/Component_v1_DarkMode.module.css +5 -20
  4. package/assets/Appearance/light/mode/Component_v1_LightMode.module.css +5 -20
  5. package/assets/Appearance/pureDark/mode/Component_v1_PureDarkMode.module.css +5 -20
  6. package/es/Accordion/Accordion.js +1 -6
  7. package/es/Accordion/AccordionItem.js +1 -6
  8. package/es/Animation/Animation.js +1 -8
  9. package/es/AppContainer/AppContainer.js +1 -6
  10. package/es/AppContainer/__tests__/__snapshots__/AppContainer.spec.js.snap +16 -16
  11. package/es/Avatar/Avatar.js +1 -6
  12. package/es/AvatarTeam/AvatarTeam.js +1 -7
  13. package/es/Button/Button.js +1 -6
  14. package/es/Buttongroup/Buttongroup.js +1 -14
  15. package/es/Card/Card.js +1 -9
  16. package/es/Card/__tests__/__snapshots__/Card.spec.js.snap +17 -17
  17. package/es/Card/__tests__/__snapshots__/CardContent.spec.js.snap +12 -12
  18. package/es/Card/__tests__/__snapshots__/CardHeader.spec.js.snap +4 -4
  19. package/es/CheckBox/CheckBox.js +1 -6
  20. package/es/CheckBox/__tests__/__snapshots__/CheckBox.spec.js.snap +88 -88
  21. package/es/ColorSelect/__tests__/__snapshots__/ColorMultiSelect.spec.js.snap +48 -48
  22. package/es/ColorSelect/__tests__/__snapshots__/ColorSingleSelect.spec.js.snap +30 -30
  23. package/es/DateTime/DateWidget.js +0 -10
  24. package/es/DateTime/__tests__/__snapshots__/CalendarView.spec.js.snap +49 -49
  25. package/es/DateTime/__tests__/__snapshots__/DateTime.spec.js.snap +93 -93
  26. package/es/DateTime/__tests__/__snapshots__/DateTimePopupFooter.spec.js.snap +1 -1
  27. package/es/DateTime/__tests__/__snapshots__/DateTimePopupHeader.spec.js.snap +8 -8
  28. package/es/DateTime/__tests__/__snapshots__/DateWidget.spec.js.snap +7 -7
  29. package/es/DateTime/__tests__/__snapshots__/DaysRow.spec.js.snap +1 -1
  30. package/es/DateTime/__tests__/__snapshots__/Time.spec.js.snap +28 -28
  31. package/es/DropDown/DropDownHeading.js +1 -6
  32. package/es/DropDown/__tests__/__snapshots__/DropDown.spec.js.snap +2 -2
  33. package/es/Heading/Heading.js +1 -6
  34. package/es/Label/Label.js +1 -6
  35. package/es/Label/__tests__/__snapshots__/Label.spec.js.snap +4 -4
  36. package/es/ListItem/ListContainer.js +1 -6
  37. package/es/ListItem/ListItem.js +1 -6
  38. package/es/ListItem/ListItemWithAvatar.js +1 -6
  39. package/es/ListItem/ListItemWithCheckBox.js +1 -6
  40. package/es/ListItem/ListItemWithIcon.js +1 -6
  41. package/es/ListItem/ListItemWithRadio.js +1 -6
  42. package/es/ListItem/__tests__/__snapshots__/ListContainer.spec.js.snap +2 -2
  43. package/es/ListItem/__tests__/__snapshots__/ListItem.spec.js.snap +16 -16
  44. package/es/ListItem/__tests__/__snapshots__/ListItemWithAvatar.spec.js.snap +41 -41
  45. package/es/ListItem/__tests__/__snapshots__/ListItemWithCheckBox.spec.js.snap +62 -62
  46. package/es/ListItem/__tests__/__snapshots__/ListItemWithIcon.spec.js.snap +41 -41
  47. package/es/ListItem/__tests__/__snapshots__/ListItemWithRadio.spec.js.snap +62 -62
  48. package/es/Modal/Modal.js +1 -8
  49. package/es/MultiSelect/AdvancedGroupMultiSelect.js +1 -7
  50. package/es/MultiSelect/AdvancedMultiSelect.js +1 -9
  51. package/es/MultiSelect/MobileHeader/__tests__/__snapshots__/MobileHeader.spec.js.snap +3 -3
  52. package/es/MultiSelect/__tests__/__snapshots__/AdvancedGroupMultiSelect.spec.js.snap +6 -6
  53. package/es/MultiSelect/__tests__/__snapshots__/AdvancedMultiSelect.spec.js.snap +50 -50
  54. package/es/MultiSelect/__tests__/__snapshots__/MultiSelect.spec.js.snap +35 -35
  55. package/es/MultiSelect/__tests__/__snapshots__/MultiSelectHeader.spec.js.snap +7 -7
  56. package/es/MultiSelect/__tests__/__snapshots__/MultiSelectWithAvatar.spec.js.snap +8 -8
  57. package/es/MultiSelect/__tests__/__snapshots__/SelectedOptions.spec.js.snap +4 -4
  58. package/es/MultiSelect/__tests__/__snapshots__/Suggestions.spec.js.snap +47 -47
  59. package/es/Radio/__tests__/__snapshots__/Radio.spec.js.snap +94 -94
  60. package/es/ResponsiveDropBox/__tests__/__snapshots__/ResponsiveDropBox.spec.js.snap +1 -1
  61. package/es/RippleEffect/RippleEffect.js +1 -6
  62. package/es/Select/GroupSelect.js +1 -8
  63. package/es/Select/Select.js +1 -10
  64. package/es/Select/SelectWithAvatar.js +1 -9
  65. package/es/Select/SelectWithIcon.js +1 -7
  66. package/es/Select/__tests__/__snapshots__/GroupSelect.spec.js.snap +7 -7
  67. package/es/Select/__tests__/__snapshots__/Select.spec.js.snap +831 -831
  68. package/es/Select/__tests__/__snapshots__/SelectWithAvatar.spec.js.snap +2 -2
  69. package/es/Select/__tests__/__snapshots__/SelectWithIcon.spec.js.snap +10 -10
  70. package/es/Switch/Switch.js +1 -6
  71. package/es/Switch/__tests__/__snapshots__/Switch.spec.js.snap +44 -44
  72. package/es/Tab/Tab.js +1 -6
  73. package/es/Tab/__tests__/__snapshots__/Tab.spec.js.snap +2 -2
  74. package/es/Tab/__tests__/__snapshots__/TabContent.spec.js.snap +1 -1
  75. package/es/Tab/__tests__/__snapshots__/TabContentWrapper.spec.js.snap +1 -1
  76. package/es/Tab/__tests__/__snapshots__/TabLayout.spec.js.snap +40 -40
  77. package/es/Tab/__tests__/__snapshots__/TabWrapper.spec.js.snap +1 -1
  78. package/es/Tab/__tests__/__snapshots__/Tabs.spec.js.snap +4 -4
  79. package/es/Tag/Tag.js +1 -6
  80. package/es/Tag/__tests__/__snapshots__/Tag.spec.js.snap +94 -94
  81. package/es/TextBox/TextBox.js +1 -8
  82. package/es/TextBoxIcon/TextBoxIcon.js +1 -8
  83. package/es/TextBoxIcon/__tests__/__snapshots__/TextBoxIcon.spec.js.snap +167 -167
  84. package/es/Textarea/Textarea.js +1 -8
  85. package/es/Tooltip/Tooltip.js +1 -8
  86. package/es/VelocityAnimation/VelocityAnimation/VelocityAnimation.js +1 -5
  87. package/es/VelocityAnimation/VelocityAnimationGroup/VelocityAnimationGroup.js +1 -5
  88. package/es/semantic/Button/Button.js +1 -6
  89. package/es/shared/ArrowIcon/__tests__/__snapshots__/ArrowIcon.spec.js.snap +20 -20
  90. package/es/shared/InputFieldLine/__tests__/__snapshots__/InputFieldLine.spec.js.snap +19 -19
  91. package/es/v1/Button/Button.js +197 -113
  92. package/es/v1/Button/README.md +110 -44
  93. package/es/v1/Button/__tests__/Button.spec.js +139 -48
  94. package/es/v1/Button/__tests__/__snapshots__/Button.spec.js.snap +1236 -340
  95. package/es/v1/Button/constants/index.js +29 -23
  96. package/es/v1/Button/constants/presets.js +160 -0
  97. package/es/v1/Button/css/Button_v1.module.css +33 -16
  98. package/es/v1/Button/css/cssJSLogic.js +56 -29
  99. package/es/v1/Button/props/defaultProps.js +5 -6
  100. package/es/v1/Button/props/propTypes.js +26 -8
  101. package/es/v1/Label/__tests__/__snapshots__/Label.spec.js.snap +24 -24
  102. package/es/v1/Switch/__tests__/__snapshots__/Switch.spec.js.snap +14 -14
  103. package/es/v1/helpers/colorHelpers/__tests__/colorHelper.spec.js +357 -0
  104. package/es/v1/helpers/colorHelpers/background/backgroundColor.module.css +38 -534
  105. package/es/v1/helpers/colorHelpers/border/borderColor.module.css +28 -412
  106. package/es/v1/helpers/colorHelpers/colorHelper.js +120 -139
  107. package/es/v1/helpers/colorHelpers/constants/index.js +45 -4
  108. package/es/v1/helpers/colorHelpers/index.js +0 -1
  109. package/es/v1/helpers/colorHelpers/paletteUtilities.README.md +141 -336
  110. package/es/v1/helpers/colorHelpers/text/textColor.module.css +79 -295
  111. package/lib/Accordion/Accordion.js +1 -6
  112. package/lib/Accordion/AccordionItem.js +1 -6
  113. package/lib/Animation/Animation.js +1 -8
  114. package/lib/AppContainer/AppContainer.js +1 -6
  115. package/lib/AppContainer/__tests__/__snapshots__/AppContainer.spec.js.snap +16 -16
  116. package/lib/Avatar/Avatar.js +1 -6
  117. package/lib/AvatarTeam/AvatarTeam.js +1 -7
  118. package/lib/Button/Button.js +1 -7
  119. package/lib/Buttongroup/Buttongroup.js +1 -14
  120. package/lib/Card/Card.js +1 -8
  121. package/lib/Card/__tests__/__snapshots__/Card.spec.js.snap +17 -17
  122. package/lib/Card/__tests__/__snapshots__/CardContent.spec.js.snap +12 -12
  123. package/lib/Card/__tests__/__snapshots__/CardHeader.spec.js.snap +4 -4
  124. package/lib/CheckBox/CheckBox.js +1 -6
  125. package/lib/CheckBox/__tests__/__snapshots__/CheckBox.spec.js.snap +88 -88
  126. package/lib/ColorSelect/__tests__/__snapshots__/ColorMultiSelect.spec.js.snap +48 -48
  127. package/lib/ColorSelect/__tests__/__snapshots__/ColorSingleSelect.spec.js.snap +30 -30
  128. package/lib/DateTime/DateWidget.js +0 -10
  129. package/lib/DateTime/__tests__/__snapshots__/CalendarView.spec.js.snap +49 -49
  130. package/lib/DateTime/__tests__/__snapshots__/DateTime.spec.js.snap +93 -93
  131. package/lib/DateTime/__tests__/__snapshots__/DateTimePopupFooter.spec.js.snap +1 -1
  132. package/lib/DateTime/__tests__/__snapshots__/DateTimePopupHeader.spec.js.snap +8 -8
  133. package/lib/DateTime/__tests__/__snapshots__/DateWidget.spec.js.snap +7 -7
  134. package/lib/DateTime/__tests__/__snapshots__/DaysRow.spec.js.snap +1 -1
  135. package/lib/DateTime/__tests__/__snapshots__/Time.spec.js.snap +28 -28
  136. package/lib/DropDown/DropDownHeading.js +1 -6
  137. package/lib/DropDown/__tests__/__snapshots__/DropDown.spec.js.snap +2 -2
  138. package/lib/Heading/Heading.js +1 -6
  139. package/lib/Label/Label.js +1 -6
  140. package/lib/Label/__tests__/__snapshots__/Label.spec.js.snap +4 -4
  141. package/lib/ListItem/ListContainer.js +1 -7
  142. package/lib/ListItem/ListItem.js +1 -6
  143. package/lib/ListItem/ListItemWithAvatar.js +1 -6
  144. package/lib/ListItem/ListItemWithCheckBox.js +1 -6
  145. package/lib/ListItem/ListItemWithIcon.js +1 -6
  146. package/lib/ListItem/ListItemWithRadio.js +1 -6
  147. package/lib/ListItem/__tests__/__snapshots__/ListContainer.spec.js.snap +2 -2
  148. package/lib/ListItem/__tests__/__snapshots__/ListItem.spec.js.snap +16 -16
  149. package/lib/ListItem/__tests__/__snapshots__/ListItemWithAvatar.spec.js.snap +41 -41
  150. package/lib/ListItem/__tests__/__snapshots__/ListItemWithCheckBox.spec.js.snap +62 -62
  151. package/lib/ListItem/__tests__/__snapshots__/ListItemWithIcon.spec.js.snap +41 -41
  152. package/lib/ListItem/__tests__/__snapshots__/ListItemWithRadio.spec.js.snap +62 -62
  153. package/lib/Modal/Modal.js +1 -8
  154. package/lib/MultiSelect/AdvancedGroupMultiSelect.js +1 -7
  155. package/lib/MultiSelect/AdvancedMultiSelect.js +1 -9
  156. package/lib/MultiSelect/MobileHeader/__tests__/__snapshots__/MobileHeader.spec.js.snap +3 -3
  157. package/lib/MultiSelect/__tests__/__snapshots__/AdvancedGroupMultiSelect.spec.js.snap +6 -6
  158. package/lib/MultiSelect/__tests__/__snapshots__/AdvancedMultiSelect.spec.js.snap +50 -50
  159. package/lib/MultiSelect/__tests__/__snapshots__/MultiSelect.spec.js.snap +35 -35
  160. package/lib/MultiSelect/__tests__/__snapshots__/MultiSelectHeader.spec.js.snap +7 -7
  161. package/lib/MultiSelect/__tests__/__snapshots__/MultiSelectWithAvatar.spec.js.snap +8 -8
  162. package/lib/MultiSelect/__tests__/__snapshots__/SelectedOptions.spec.js.snap +4 -4
  163. package/lib/MultiSelect/__tests__/__snapshots__/Suggestions.spec.js.snap +47 -47
  164. package/lib/Radio/__tests__/__snapshots__/Radio.spec.js.snap +94 -94
  165. package/lib/ResponsiveDropBox/__tests__/__snapshots__/ResponsiveDropBox.spec.js.snap +1 -1
  166. package/lib/RippleEffect/RippleEffect.js +1 -6
  167. package/lib/Select/GroupSelect.js +1 -9
  168. package/lib/Select/Select.js +1 -11
  169. package/lib/Select/SelectWithAvatar.js +1 -9
  170. package/lib/Select/SelectWithIcon.js +1 -7
  171. package/lib/Select/__tests__/__snapshots__/GroupSelect.spec.js.snap +7 -7
  172. package/lib/Select/__tests__/__snapshots__/Select.spec.js.snap +831 -831
  173. package/lib/Select/__tests__/__snapshots__/SelectWithAvatar.spec.js.snap +2 -2
  174. package/lib/Select/__tests__/__snapshots__/SelectWithIcon.spec.js.snap +10 -10
  175. package/lib/Switch/Switch.js +1 -6
  176. package/lib/Switch/__tests__/__snapshots__/Switch.spec.js.snap +44 -44
  177. package/lib/Tab/Tab.js +1 -6
  178. package/lib/Tab/__tests__/__snapshots__/Tab.spec.js.snap +2 -2
  179. package/lib/Tab/__tests__/__snapshots__/TabContent.spec.js.snap +1 -1
  180. package/lib/Tab/__tests__/__snapshots__/TabContentWrapper.spec.js.snap +1 -1
  181. package/lib/Tab/__tests__/__snapshots__/TabLayout.spec.js.snap +40 -40
  182. package/lib/Tab/__tests__/__snapshots__/TabWrapper.spec.js.snap +1 -1
  183. package/lib/Tab/__tests__/__snapshots__/Tabs.spec.js.snap +4 -4
  184. package/lib/Tag/Tag.js +1 -6
  185. package/lib/Tag/__tests__/__snapshots__/Tag.spec.js.snap +94 -94
  186. package/lib/TextBox/TextBox.js +1 -8
  187. package/lib/TextBoxIcon/TextBoxIcon.js +1 -8
  188. package/lib/TextBoxIcon/__tests__/__snapshots__/TextBoxIcon.spec.js.snap +167 -167
  189. package/lib/Textarea/Textarea.js +1 -8
  190. package/lib/Tooltip/Tooltip.js +1 -8
  191. package/lib/VelocityAnimation/VelocityAnimation/VelocityAnimation.js +1 -5
  192. package/lib/VelocityAnimation/VelocityAnimationGroup/VelocityAnimationGroup.js +1 -5
  193. package/lib/semantic/Button/Button.js +1 -6
  194. package/lib/shared/ArrowIcon/__tests__/__snapshots__/ArrowIcon.spec.js.snap +20 -20
  195. package/lib/shared/InputFieldLine/__tests__/__snapshots__/InputFieldLine.spec.js.snap +19 -19
  196. package/lib/v1/Button/Button.js +207 -123
  197. package/lib/v1/Button/README.md +110 -44
  198. package/lib/v1/Button/__tests__/Button.spec.js +195 -88
  199. package/lib/v1/Button/__tests__/__snapshots__/Button.spec.js.snap +1236 -340
  200. package/lib/v1/Button/constants/index.js +34 -31
  201. package/lib/v1/Button/constants/presets.js +179 -0
  202. package/lib/v1/Button/css/Button_v1.module.css +33 -16
  203. package/lib/v1/Button/css/cssJSLogic.js +45 -25
  204. package/lib/v1/Button/props/defaultProps.js +4 -5
  205. package/lib/v1/Button/props/propTypes.js +41 -7
  206. package/lib/v1/Label/__tests__/__snapshots__/Label.spec.js.snap +24 -24
  207. package/lib/v1/Switch/__tests__/__snapshots__/Switch.spec.js.snap +14 -14
  208. package/lib/v1/helpers/colorHelpers/__tests__/colorHelper.spec.js +363 -0
  209. package/lib/v1/helpers/colorHelpers/background/backgroundColor.module.css +38 -534
  210. package/lib/v1/helpers/colorHelpers/border/borderColor.module.css +28 -412
  211. package/lib/v1/helpers/colorHelpers/colorHelper.js +130 -153
  212. package/lib/v1/helpers/colorHelpers/constants/index.js +45 -4
  213. package/lib/v1/helpers/colorHelpers/index.js +2 -24
  214. package/lib/v1/helpers/colorHelpers/paletteUtilities.README.md +141 -336
  215. package/lib/v1/helpers/colorHelpers/text/textColor.module.css +79 -295
  216. package/package.json +16 -16
@@ -1,6 +1,6 @@
1
1
  # Color Helpers
2
2
 
3
- Tailwind-inspired color utility classes and a `colorHelper` for DOT components.
3
+ CSS color utility classes and a `getPaletteClasses` helper for DOT v1 components.
4
4
 
5
5
  ---
6
6
 
@@ -9,407 +9,212 @@ Tailwind-inspired color utility classes and a `colorHelper` for DOT components.
9
9
  ```
10
10
  colorHelpers/
11
11
  ├── background/
12
- │ └── backgroundColor.module.css # Background color utilities
12
+ │ └── backgroundColor.module.css
13
13
  ├── text/
14
- │ └── textColor.module.css # Text color utilities
14
+ │ └── textColor.module.css
15
15
  ├── border/
16
- │ └── borderColor.module.css # Border color utilities
16
+ │ └── borderColor.module.css
17
17
  ├── constants/
18
- │ └── index.js # PALETTE_CONFIG (palette → tone mapping)
19
- ├── colorHelper.js # getPaletteClasses + getBgClass, getTextClass, getBorderClass
20
- └── paletteUtilities.README.md # This file
18
+ │ └── index.js # PALETTE_CONFIG, TONE_INTENSITY
19
+ └── colorHelper.js # getPaletteClasses (default export)
21
20
  ```
22
21
 
23
22
  ---
24
23
 
25
- ## Available Colors
24
+ ## CSS Class Patterns
26
25
 
27
- All three CSS files share the same 7 color tones:
26
+ All three CSS modules share the same 7 base tones: `brand`, `grey`, `blue`, `green`, `orange`, `red`, `yellow`.
28
27
 
29
- | Tone | Token Family | Use Case |
30
- |------|--------------|----------|
31
- | **default** | `--zdt_v1_palette_default_*` | Default/neutral actions |
32
- | **grey** | `--zdt_v1_palette_grey_*` | Secondary, muted elements |
33
- | **blue** | `--zdt_v1_palette_blue_*` | Information, primary actions |
34
- | **green** | `--zdt_v1_palette_green_*` | Success, positive status |
35
- | **orange** | `--zdt_v1_palette_orange_*` | Warning, caution |
36
- | **red** | `--zdt_v1_palette_red_*` | Error, danger, destructive actions |
37
- | **yellow** | `--zdt_v1_palette_yellow_*` | Alerts, highlights |
28
+ Shades are numeric values defined in `TONE_INTENSITY` per tone (e.g. for `brand`: base `80`, hover `100`, light `10`, lightHover `20`, borderLight `10`).
38
29
 
39
- ---
40
-
41
- ## Available Utilities
42
-
43
- ### Background (`background/backgroundColor.module.css`)
44
-
45
- Per color (`default`, `grey`, `blue`, `green`, `orange`, `red`, `yellow`):
30
+ ### Background (`backgroundColor.module.css`)
46
31
 
47
32
  | Class Pattern | Description |
48
- |---------------|-------------|
49
- | `.bg-{color}` | Base background |
50
- | `.bg-{color}-light` | Light background variant |
51
- | `.hover\:bg-{color}:hover` | Hover state |
52
- | `.hover\:bg-{color}-light:hover` | Light hover state |
53
- | `.focus\:bg-{color}:focus` | Focus state |
54
- | `.focus\:bg-{color}-light:focus` | Light focus state |
55
- | `.active\:bg-{color}:active` | Active state |
56
- | `.active\:bg-{color}-light:active` | Light active state |
57
- | `.selected\:bg-{color}` | Selected state |
58
- | `.selected\:bg-{color}-light` | Light selected state |
59
-
60
- **Utility classes:** `.bg-transparent`, `.bg-white`, `.bg-black`
33
+ |---|---|
34
+ | `bg-{tone}-{base}` | Filled background |
35
+ | `bg-{tone}-{light}` | Light background variant |
36
+ | `hover:bg-{tone}-{hover}` | Filled — hover state |
37
+ | `hover:bg-{tone}-{lightHover}` | Light — hover state |
38
+ | `focus:bg-{tone}-{...}` | Focus state (same shade logic) |
39
+ | `active:bg-{tone}-{...}` | Active state (same shade logic) |
40
+ | `selected:bg-{tone}-{...}` | Selected state (same shade logic) |
61
41
 
62
- ### Text (`text/textColor.module.css`)
42
+ **Utility:** `bg-transparent`, `bg-white`, `bg-black` (+ `hover:`, `focus:`, `active:`, `selected:` variants)
63
43
 
64
- Per color (`default`, `grey`, `blue`, `green`, `orange`, `red`, `yellow`):
44
+ ### Text (`textColor.module.css`)
65
45
 
66
46
  | Class Pattern | Description |
67
- |---------------|-------------|
68
- | `.text-{color}` | Base text color |
69
- | `.hover\:text-{color}:hover` | Hover state |
70
- | `.focus\:text-{color}:focus` | Focus state |
71
- | `.active\:text-{color}:active` | Active state |
72
- | `.selected\:text-{color}` | Selected state |
73
-
74
- **Special:** `.text-brand-filled` (+ hover/focus/active/selected) — uses `--zdt_v1_palette_default_filled_text` for filled default backgrounds.
47
+ |---|---|
48
+ | `text-{tone}-{base}` | Base text color |
49
+ | `hover:text-{tone}-{textHover\|hover}` | Hover state |
50
+ | `focus:text-{tone}-{...}` | Focus state |
51
+ | `active:text-{tone}-{...}` | Active state |
52
+ | `selected:text-{tone}-{...}` | Selected state |
75
53
 
76
- **Utility classes:** `.text-transparent`, `.text-white`, `.text-black`
54
+ **Special:** `text-brand-filled` (+ state variants) — used for text on filled `brand` backgrounds.
77
55
 
78
- > **Note:** Text has no `-light` variant. The `colorHelper` switches to `filledTextTone` (e.g., `white`) when the background is filled.
56
+ **Utility:** `text-transparent`, `text-white`, `text-black` (+ state variants)
79
57
 
80
- ### Border (`border/borderColor.module.css`)
58
+ > Text has no `-light` shade variant. `getPaletteClasses` automatically switches to `filledTextTone` (`white`) when rendering on a filled background.
81
59
 
82
- Per color (`default`, `grey`, `blue`, `green`, `orange`, `red`, `yellow`):
60
+ ### Border (`borderColor.module.css`)
83
61
 
84
62
  | Class Pattern | Description |
85
- |---------------|-------------|
86
- | `.border-{color}` | Base border |
87
- | `.border-{color}-light` | Light border variant (resting state only) |
88
- | `.hover\:border-{color}:hover` | Hover state |
89
- | `.focus\:border-{color}:focus` | Focus state |
90
- | `.active\:border-{color}:active` | Active state |
91
- | `.selected\:border-{color}` | Selected state |
63
+ |---|---|
64
+ | `border-{tone}-{base}` | Base border |
65
+ | `border-{tone}-{borderLight}` | Light border (resting only) |
66
+ | `hover:border-{tone}-{hover}` | Hover state (always base shade) |
67
+ | `focus:border-{tone}-{...}` | Focus state |
68
+ | `active:border-{tone}-{...}` | Active state |
69
+ | `selected:border-{tone}-{...}` | Selected state |
92
70
 
93
- **Utility classes:** `.border-transparent`, `.border-white`, `.border-black`
94
-
95
- > **Note:** Border state classes only use the base tone — no `-light` state variants. The `-light` class is available for the resting state only.
71
+ **Utility:** `border-transparent`, `border-white`, `border-black` (+ state variants)
96
72
 
97
73
  ---
98
74
 
99
- ## Direct CSS Usage (Examples)
100
-
101
- Import only the CSS modules you need and compose classes directly.
75
+ ## Direct CSS Usage
102
76
 
103
- ### Example 1: Status Tag (text + background)
77
+ Import only the modules you need and compose classes directly.
104
78
 
105
- ```javascript
79
+ ```js
106
80
  import bgStyle from './background/backgroundColor.module.css';
107
81
  import textStyle from './text/textColor.module.css';
108
-
109
- function StatusTag({ status }) {
110
- const className = compileClassNames({
111
- [bgStyle['bg-green-light']]: status === 'success',
112
- [bgStyle['bg-red-light']]: status === 'error',
113
- [bgStyle['bg-orange-light']]: status === 'warning',
114
- [textStyle['text-green']]: status === 'success',
115
- [textStyle['text-red']]: status === 'error',
116
- [textStyle['text-orange']]: status === 'warning',
117
- });
118
-
119
- return <span className={className}>{status}</span>;
120
- }
121
- ```
122
-
123
- ### Example 2: Bordered Card (border + background)
124
-
125
- ```javascript
126
- import bgStyle from './background/backgroundColor.module.css';
127
82
  import borderStyle from './border/borderColor.module.css';
128
83
 
129
- function Card({ children, variant }) {
130
- const className = compileClassNames({
131
- [bgStyle['bg-blue-light']]: variant === 'info',
132
- [bgStyle['bg-red-light']]: variant === 'error',
133
- [borderStyle['border-blue']]: variant === 'info',
134
- [borderStyle['border-red']]: variant === 'error',
135
- });
136
-
137
- return <div className={className}>{children}</div>;
138
- }
139
- ```
140
-
141
- ### Example 3: Interactive Button (text + background + border + hover)
142
-
143
- ```javascript
144
- import bgStyle from './background/backgroundColor.module.css';
145
- import textStyle from './text/textColor.module.css';
146
- import borderStyle from './border/borderColor.module.css';
147
-
148
- function Button({ label, variant }) {
149
- // Primary: blue bg, white text, blue border
150
- const primaryClasses = compileClassNames({
151
- [bgStyle['bg-blue']]: true,
152
- [bgStyle['hover:bg-blue']]: true,
153
- [textStyle['text-white']]: true,
154
- [borderStyle['border-blue']]: true,
155
- [borderStyle['hover:border-blue']]: true,
156
- });
157
-
158
- // Danger: red bg, white text, red border
159
- const dangerClasses = compileClassNames({
160
- [bgStyle['bg-red']]: true,
161
- [bgStyle['hover:bg-red']]: true,
162
- [textStyle['text-white']]: true,
163
- [borderStyle['border-red']]: true,
164
- [borderStyle['hover:border-red']]: true,
165
- });
166
-
167
- return <button className={variant === 'danger' ? dangerClasses : primaryClasses}>{label}</button>;
168
- }
169
- ```
170
- ---
171
-
172
- ## Using `colorHelper.js`
173
-
174
- ### Named Exports
175
-
176
- Three utility functions return individual CSS module classes:
177
-
178
- ```javascript
179
- import { getBgClass, getTextClass, getBorderClass } from './colorHelper';
180
- ```
181
-
182
- #### `getBgClass({ state?, tone, isLighter? })`
183
-
184
- Returns a background CSS class from `backgroundColor.module.css`.
185
-
186
- | Parameter | Type | Required | Description |
187
- |-----------|------|----------|-------------|
188
- | `tone` | `string` | Yes | Color tone (`default`, `grey`, `blue`, `green`, `orange`, `red`, `yellow`, `white`, `black`) |
189
- | `state` | `string` | No | State prefix (`hover`, `focus`, `active`, `selected`). Omit for base class. |
190
- | `isLighter` | `boolean` | No | `true` → appends `-light` to the tone |
191
-
192
- **Generated key pattern:** `[state:]bg-{tone}[-light]`
193
-
194
- ```javascript
195
- getBgClass({ tone: 'blue' }) // → paletteBgStyle['bg-blue']
196
- getBgClass({ tone: 'blue', isLighter: true }) // → paletteBgStyle['bg-blue-light']
197
- getBgClass({ state: 'hover', tone: 'red' }) // → paletteBgStyle['hover:bg-red']
198
- getBgClass({ state: 'hover', tone: 'red', isLighter: true }) // → paletteBgStyle['hover:bg-red-light']
199
- ```
200
-
201
- #### `getTextClass({ state?, textTone })`
202
-
203
- Returns a text CSS class from `textColor.module.css`.
204
-
205
- | Parameter | Type | Required | Description |
206
- |-----------|------|----------|-------------|
207
- | `textTone` | `string` | Yes | Text tone (`brand`, `grey`, `blue`, `green`, `orange`, `red`, `yellow`, `white`, `black`, `brand-filled`) |
208
- | `state` | `string` | No | State prefix (`hover`, `focus`, `active`, `selected`). Omit for base class. |
209
-
210
- > **Note:** `textTone` has no `isLighter` equivalent. Use `filledTextTone` (e.g. `white`) directly when needed.
84
+ // Status tag: light bg + colored text
85
+ <span className={`${bgStyle['bg-green-10']} ${textStyle['text-green-80']}`}>Success</span>
211
86
 
212
- **Generated key pattern:** `[state:]text-{textTone}`
87
+ // Info card: light bg + light border
88
+ <div className={`${bgStyle['bg-blue-10']} ${borderStyle['border-blue-10']}`}>{children}</div>
213
89
 
214
- ```javascript
215
- getTextClass({ textTone: 'green' }) // → paletteTextStyle['text-green']
216
- getTextClass({ state: 'hover', textTone: 'white' }) // → paletteTextStyle['hover:text-white']
217
- getTextClass({ textTone: 'brand-filled' }) // → paletteTextStyle['text-brand-filled']
90
+ // Interactive element: filled bg + white text + hover bg
91
+ <button className={`${bgStyle['bg-brand-80']} ${bgStyle['hover:bg-brand-100']} ${textStyle['text-brand-filled']}`}>
92
+ Click
93
+ </button>
218
94
  ```
219
95
 
220
- #### `getBorderClass({ state?, tone, isLighter? })`
221
-
222
- Returns a border CSS class from `borderColor.module.css`.
223
-
224
- | Parameter | Type | Required | Description |
225
- |-----------|------|----------|-------------|
226
- | `tone` | `string` | Yes | Color tone (`default`, `grey`, `blue`, `green`, `orange`, `red`, `yellow`) |
227
- | `state` | `string` | No | State prefix (`hover`, `focus`, `active`, `selected`). Omit for base class. |
228
- | `isLighter` | `boolean` | No | `true` → appends `-light` to the tone (resting state only by convention) |
229
-
230
- **Generated key pattern:** `[state:]border-{tone}[-light]`
231
-
232
- ```javascript
233
- getBorderClass({ tone: 'blue' }) // → paletteBorderStyle['border-blue']
234
- getBorderClass({ tone: 'blue', isLighter: true }) // → paletteBorderStyle['border-blue-light']
235
- getBorderClass({ state: 'hover', tone: 'red' }) // → paletteBorderStyle['hover:border-red']
236
- ```
237
-
238
- #### Internal Helpers (not exported)
239
-
240
- - **`toTone(tone, isLighter)`** — returns `'{tone}-light'` if `isLighter` is truthy, else `'{tone}'`
241
- - **`withState(state, key)`** — returns `'{state}:{key}'` if `state` is truthy, else `'{key}'`
242
-
243
96
  ---
244
97
 
245
- ### Default Export: `getPaletteClasses`
98
+ ## `getPaletteClasses`
246
99
 
247
- For components accepting `palette`, `bgAppearance`, `borderAppearance`, and `paletteShade` props.
100
+ Computes all 15 CSS class keys for a palette in one call.
248
101
 
249
- ```javascript
102
+ ```js
250
103
  import getPaletteClasses from './colorHelper';
251
104
  ```
252
105
 
253
- #### Palette → Tone Mapping (from `PALETTE_CONFIG`)
106
+ ### API
107
+
108
+ ```js
109
+ getPaletteClasses({ palette, appearance, hoverAppearance, selectedAppearance })
110
+ ```
254
111
 
255
- | Palette | Tone (bg/border) | Text Tone | Filled Text Tone |
256
- |---------|-------------------|-----------|-------------------|
257
- | `default` | `brand` | `brand` | `brand-filled` |
258
- | `primary` | `blue` | `blue` | `white` |
112
+ | Parameter | Type | Description |
113
+ |---|---|---|
114
+ | `palette` | `string` | One of the 12 palette names (see table below) |
115
+ | `appearance` | `{ bg?, border?, text? }` | Resting state |
116
+ | `hoverAppearance` | `{ bg?, border?, text? }` | Hover / focus / active states |
117
+ | `selectedAppearance` | `{ bg?, border?, text? }` | Selected state |
118
+
119
+ Each key in an appearance object accepts:
120
+ - `true` — use the palette's own tone
121
+ - `false` / omitted — no class produced
122
+ - `'paletteName'` — use a different palette's tone (e.g. `text: 'brand'`)
123
+
124
+ ### Palettes (`PALETTE_CONFIG`)
125
+
126
+ | Palette | Tone | Text tone | Filled text tone |
127
+ |---------|------|-----------|-----------------|
128
+ | `brand` | `brand` | `brand` | `brand-filled` |
129
+ | `brandLighter` | `brand` (light shades) | `brand` | `brand` |
130
+ | `info` | `blue` | `blue` | `white` |
131
+ | `infoLighter` | `blue` (light shades) | `blue` | `blue` |
259
132
  | `secondary` | `grey` | `grey` | `white` |
133
+ | `secondaryLighter` | `grey` (light shades) | `grey` | `grey` |
260
134
  | `danger` | `red` | `red` | `white` |
135
+ | `dangerLighter` | `red` (light shades) | `red` | `red` |
261
136
  | `success` | `green` | `green` | `white` |
137
+ | `successLighter` | `green` (light shades) | `green` | `green` |
138
+ | `warning` | `orange` | `orange` | `white` |
139
+ | `warningLighter` | `orange` (light shades) | `orange` | `orange` |
262
140
 
263
- Unknown palettes return `DUMMY_OBJECT` (empty frozen object).
141
+ `*Lighter` palettes use `light` / `borderLight` shades from `TONE_INTENSITY` instead of `base`.
264
142
 
265
- #### Parameters
143
+ ### Return Value
266
144
 
267
- | Parameter | Values | Effect |
268
- |-----------|--------|--------|
269
- | `palette` | `default` \| `primary` \| `secondary` \| `danger` \| `success` | Selects the color tone config from `PALETTE_CONFIG` |
270
- | `bgAppearance` | `'none'` \| `'default'` \| other | `'default'` → base bg + state bg; `'none'` → no bg, no state bg, no filled text logic; other → no base bg but state bg + filled text logic |
271
- | `isSelected` | `boolean` | `true` → folds selected-state classes into `bg`, `text`, and `border` (replaces their resting values with the `selected` state class) |
272
- | `borderAppearance` | `'none'` \| `'onHover'` \| other | `'none'` → transparent base, no state borders; `'onHover'` → transparent base, with state borders; other → visible base + state borders |
273
- | `paletteShade` | `'lighter'` \| other | `'lighter'` → `-light` variant for bg and base border; also keeps text as `textTone` instead of `filledTextTone` |
145
+ ```js
146
+ {
147
+ bg, hoverBg, focusBg, activeBg, selectedBg,
148
+ text, hoverText, focusText, activeText, selectedText,
149
+ border, hoverBorder, focusBorder, activeBorder, selectedBorder
150
+ }
151
+ ```
274
152
 
275
- #### Text Tone Logic
153
+ Each key is a CSS module class string, or `''` if not applicable for that appearance configuration.
276
154
 
277
- The text color depends on both `bgAppearance` and `paletteShade`:
155
+ > `border` always has a value — when `bg: false` and no `border` key is set, it defaults to `border-transparent`.
278
156
 
279
- | Condition | Base text (`text`) | State text (`hoverText`, etc.) |
280
- |---|---|---|
281
- | `bgAppearance: 'default'` + default shade | `filledTextTone` (e.g. `white`) | `filledTextTone` |
282
- | `bgAppearance: 'default'` + `'lighter'` shade | `textTone` (e.g. `blue`) | `textTone` |
283
- | `bgAppearance:` other (not `'none'`) + default shade | `textTone` | `filledTextTone` |
284
- | `bgAppearance:` other (not `'none'`) + `'lighter'` shade | `textTone` | `textTone` |
285
- | `bgAppearance: 'none'` | `textTone` | `textTone` |
157
+ ### Text Tone Resolution
286
158
 
287
- > **Key insight:** `baseTextTone = isFilledBg && !isLighter ? filledTextTone : textTone`. `stateTextTone = hasBgState && !isLighter ? filledTextTone : textTone`. This means state text can differ from base text when `bgAppearance` is not `'default'` but also not `'none'`.
159
+ | Background state | Text produced |
160
+ |---|---|
161
+ | Filled (`bg: true`, non-lighter palette) | `filledTextTone` (`white`) |
162
+ | Light (`bg: true`, `*Lighter` palette) | `textTone` (`brand`) |
163
+ | No background (`bg: false` or omitted) | `textTone`, or `''` if `text` not set |
288
164
 
289
- #### Return Value
165
+ ### Examples
290
166
 
291
- ```javascript
292
- {
293
- bg, // isSelected → selected bg (if bgAppearance !== 'none'); else base bg (only if bgAppearance === 'default')
294
- hoverBg, // getBgClass({ state: 'hover', tone, isLighter }) — if bgAppearance !== 'none'
295
- focusBg, // getBgClass({ state: 'focus', tone, isLighter }) — if bgAppearance !== 'none'
296
- activeBg, // getBgClass({ state: 'active', tone, isLighter }) — if bgAppearance !== 'none'
297
- text, // isSelected → selected text class; else getTextClass({ textTone: baseTextTone })
298
- hoverText, // getTextClass({ state: 'hover', textTone: stateTextTone })
299
- focusText, // getTextClass({ state: 'focus', textTone: stateTextTone })
300
- activeText, // getTextClass({ state: 'active', textTone: stateTextTone })
301
- border, // isSelected → selected border (if borderAppearance !== 'none'); else resting border
302
- hoverBorder, // getBorderClass({ state: 'hover', tone }) — if borderAppearance !== 'none'
303
- focusBorder, // getBorderClass({ state: 'focus', tone }) — if borderAppearance !== 'none'
304
- activeBorder // getBorderClass({ state: 'active', tone }) — if borderAppearance !== 'none'
305
- }
167
+ **Filled button**
168
+ ```js
169
+ getPaletteClasses({
170
+ palette: 'brand',
171
+ appearance: { bg: true, text: true, border: true },
172
+ hoverAppearance: { bg: true, text: true, border: true }
173
+ });
174
+ // bg → bg-brand-80 | text → text-brand-filled | border → border-brand-80
175
+ // hoverBg → hover:bg-brand-100 | hoverText → hover:text-brand-filled
306
176
  ```
307
177
 
308
- > **Note:** State border classes always use the base tone (no `isLighter`), even when the resting border uses `-light`.
309
-
310
- #### Example: Filled Primary Button
311
-
312
- ```javascript
313
- const classes = getPaletteClasses({
314
- palette: 'primary',
315
- bgAppearance: 'default',
316
- borderAppearance: 'visible',
317
- paletteShade: 'default',
178
+ **Ghost button (no bg, with border)**
179
+ ```js
180
+ getPaletteClasses({
181
+ palette: 'brand',
182
+ appearance: { bg: false, border: true },
183
+ hoverAppearance: { bg: false, border: true },
184
+ selectedAppearance: { bg: false, border: true }
318
185
  });
319
- // classes.bg → 'bg-blue' (bgAppearance: 'default' + default shade)
320
- // classes.hoverBg → 'hover:bg-blue'
321
- // classes.text → 'text-white' (filledTextTone — bgAppearance: 'default' + not lighter)
322
- // classes.hoverText → 'hover:text-white' (filledTextTone — hasBgState + not lighter)
323
- // classes.border → 'border-blue' (visible appearance)
324
- // classes.hoverBorder → 'hover:border-blue'
186
+ // bg → '' | border → border-brand-80 | hoverBorder → hover:border-brand-80
187
+ // selectedBorder → selected:border-brand-80
325
188
  ```
326
189
 
327
- #### Example: Light Danger Tag
328
-
329
- ```javascript
330
- const classes = getPaletteClasses({
331
- palette: 'danger',
332
- bgAppearance: 'default',
333
- borderAppearance: 'none',
334
- paletteShade: 'lighter',
190
+ **Text-only with selected fill**
191
+ ```js
192
+ getPaletteClasses({
193
+ palette: 'brand',
194
+ appearance: { bg: false, text: true },
195
+ hoverAppearance: { bg: false, text: true },
196
+ selectedAppearance: { bg: true, text: true }
335
197
  });
336
- // classes.bg → 'bg-red-light' (bgAppearance: 'default' + lighter shade)
337
- // classes.hoverBg → 'hover:bg-red-light'
338
- // classes.text → 'text-red' (textTone — lighter shade overrides filledTextTone)
339
- // classes.hoverText → 'hover:text-red' (textTone — lighter shade)
340
- // classes.border → 'border-transparent' (borderAppearance: 'none')
341
- // classes.hoverBorder → undefined (no state borders with 'none')
198
+ // text → text-brand-80 | hoverText → hover:text-brand-100
199
+ // selectedBg → selected:bg-brand-80 | selectedText → selected:text-brand-filled
342
200
  ```
343
201
 
344
- #### Example: Ghost Secondary Button
345
-
346
- ```javascript
347
- const classes = getPaletteClasses({
348
- palette: 'secondary',
349
- bgAppearance: 'none',
350
- borderAppearance: 'onHover',
351
- paletteShade: 'default',
202
+ **Cross-palette override (black text, brand on hover)**
203
+ ```js
204
+ getPaletteClasses({
205
+ palette: 'brand',
206
+ appearance: { bg: false, text: 'black' },
207
+ hoverAppearance: { bg: false }
352
208
  });
353
- // classes.bg → undefined (not filled)
354
- // classes.hoverBg → undefined (bgAppearance: 'none')
355
- // classes.text → 'text-grey' (textTone — not filled)
356
- // classes.hoverText → 'hover:text-grey' (textTone — bgAppearance 'none' → no filled text)
357
- // classes.border → 'border-transparent' (onHover → transparent base)
358
- // classes.hoverBorder → 'hover:border-grey' (onHover → state borders present)
209
+ // text → text-black | hoverText → ''
359
210
  ```
360
211
 
361
- #### Example: Hover-fill Button (bgAppearance: non-standard value)
362
-
363
- ```javascript
364
- const classes = getPaletteClasses({
365
- palette: 'primary',
366
- bgAppearance: 'hover-fill', // any value that isn't 'none' or 'default'
367
- borderAppearance: 'visible',
368
- paletteShade: 'default',
212
+ **Tinted outline (lighter palette)**
213
+ ```js
214
+ getPaletteClasses({
215
+ palette: 'brandLighter',
216
+ appearance: { border: true },
217
+ hoverAppearance: { border: true }
369
218
  });
370
- // classes.bg → undefined (not 'default' → no base bg)
371
- // classes.hoverBg → 'hover:bg-blue' (not 'none' → state bg present)
372
- // classes.text → 'text-blue' (baseTextTone — not filled, so textTone)
373
- // classes.hoverText → 'hover:text-white' (stateTextTone — hasBgState + not lighter → filledTextTone!)
374
- // classes.border → 'border-blue' (visible)
375
- // classes.hoverBorder → 'hover:border-blue'
219
+ // bg → '' | border → border-brand-10 (borderLight shade) | hoverBorder → hover:border-brand-100
376
220
  ```
377
-
378
- > This shows a key behavior: the base text is the normal tone, but **state text switches to `filledTextTone`** because the hover/state background will be filled (dark).
379
-
380
- > **Note on `isSelected`:** Pass `isSelected: true` to fold the selected state into `bg`, `text`, and `border`. Instead of the resting class, each returns its `selected:` variant class. There are no separate `selectedBg`/`selectedText`/`selectedBorder` return keys.
381
-
382
- ---
383
-
384
- ## Behavior Summary
385
-
386
- | Property | Lighter shade (`paletteShade: 'lighter'`) | Default shade |
387
- |----------|-------------------------------------------|---------------|
388
- | **Background** | Uses `-light` variant (e.g. `bg-blue-light`) | Uses base (e.g. `bg-blue`) |
389
- | **Base text** | Always `textTone` (e.g. `text-blue`) | `filledTextTone` when filled (e.g. `text-white`), else `textTone` |
390
- | **State text** | Always `textTone` (e.g. `hover:text-blue`) | `filledTextTone` when `bgAppearance !== 'none'` (e.g. `hover:text-white`), else `textTone` |
391
- | **Border (base)** | Uses `-light` variant if not transparent (e.g. `border-blue-light`) | Uses base if not transparent (e.g. `border-blue`) |
392
- | **Border (states)** | Always base tone (e.g. `hover:border-blue`) | Always base tone |
393
-
394
- ---
395
-
396
- ## FAQ
397
-
398
- **Q: Why do text classes have no `-light` variant?**
399
- A: Text on a light background should stay the base color for readability. When the background is filled (dark), text switches to a contrasting tone (e.g. `white`) instead.
400
-
401
- **Q: Why do border state classes not use `-light`?**
402
- A: Border hover/focus/active/selected states always use the full-intensity base tone for visibility, even when the resting border uses a lighter shade.
403
-
404
- **Q: What happens if I pass an unknown palette to `getPaletteClasses`?**
405
- A: It returns `DUMMY_OBJECT` (an empty frozen object), so no classes are applied.
406
-
407
- **Q: Can I use CSS classes directly without `getPaletteClasses`?**
408
- A: Yes. The CSS modules are standalone. `getPaletteClasses` is a convenience for components that accept palette/appearance/shade props.
409
-
410
- **Q: When does state text differ from base text?**
411
- A: When `bgAppearance` is neither `'none'` nor `'filled'` with default (non-lighter) shade. Base text uses `textTone` (colored), but state text uses `filledTextTone` (e.g. `white`) — because the hover/state will show a filled background.
412
-
413
- ---
414
-
415
- **Last Updated:** March 2026