@cdx-ui/components 0.2.3 → 0.2.4

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 (248) hide show
  1. package/AGENTS.md +24 -0
  2. package/README.md +2 -0
  3. package/coverage.svg +1 -1
  4. package/docs/components/accordion/content.md +538 -0
  5. package/docs/components/alert/content.md +203 -0
  6. package/docs/components/alert-dialog/content.md +319 -0
  7. package/docs/components/avatar/content.md +368 -0
  8. package/docs/components/avatar/design.md +202 -0
  9. package/docs/components/badge/content.md +235 -0
  10. package/docs/components/bottom-sheet/content.md +351 -0
  11. package/docs/components/bottom-sheet/design.md +249 -0
  12. package/docs/components/breadcrumbs/content.md +169 -0
  13. package/docs/components/button/content.md +398 -0
  14. package/docs/components/button/design.md +258 -0
  15. package/docs/components/calendar/content.md +137 -0
  16. package/docs/components/card/content.md +283 -0
  17. package/docs/components/carousel/content.md +416 -0
  18. package/docs/components/checkbox/content.md +236 -0
  19. package/docs/components/checkbox/design.md +214 -0
  20. package/docs/components/chip/content.md +439 -0
  21. package/docs/components/chip/design.md +418 -0
  22. package/docs/components/color-area/content.md +86 -0
  23. package/docs/components/color-field/content.md +134 -0
  24. package/docs/components/color-picker/content.md +208 -0
  25. package/docs/components/color-slider/content.md +120 -0
  26. package/docs/components/color-swatch/content.md +64 -0
  27. package/docs/components/color-swatch-picker/content.md +126 -0
  28. package/docs/components/content.md +97 -0
  29. package/docs/components/currency-input/content.md +205 -0
  30. package/docs/components/data-grid/content.md +522 -0
  31. package/docs/components/date-field/content.md +147 -0
  32. package/docs/components/date-picker/content.md +360 -0
  33. package/docs/components/date-range-picker/content.md +301 -0
  34. package/docs/components/date-time-field/content.md +157 -0
  35. package/docs/components/date-time-list/content.md +105 -0
  36. package/docs/components/date-time-picker/content.md +272 -0
  37. package/docs/components/dialog/content.md +436 -0
  38. package/docs/components/dialog/design.md +192 -0
  39. package/docs/components/divider/content.md +112 -0
  40. package/docs/components/drawer/content.md +436 -0
  41. package/docs/components/field/content.md +277 -0
  42. package/docs/components/form/content.md +62 -0
  43. package/docs/components/full-screen-dialog/content.md +881 -0
  44. package/docs/components/heading/content.md +55 -0
  45. package/docs/components/icon/content.md +190 -0
  46. package/docs/components/icon-button/content.md +200 -0
  47. package/docs/components/icon-button/design.md +165 -0
  48. package/docs/components/image/content.md +104 -0
  49. package/docs/components/input/content.md +281 -0
  50. package/docs/components/input/design.md +389 -0
  51. package/docs/components/insurance-disclosure/content.md +103 -0
  52. package/docs/components/link/content.md +180 -0
  53. package/docs/components/link/design.md +160 -0
  54. package/docs/components/list-item/content.md +695 -0
  55. package/docs/components/menu/content.md +1247 -0
  56. package/docs/components/month-calendar/content.md +84 -0
  57. package/docs/components/month-picker/content.md +273 -0
  58. package/docs/components/otp-input/content.md +327 -0
  59. package/docs/components/progress-bar/content.md +87 -0
  60. package/docs/components/progress-circle/content.md +176 -0
  61. package/docs/components/progress-segmented/content.md +119 -0
  62. package/docs/components/quick-action-button/content.md +154 -0
  63. package/docs/components/quick-action-button/design.md +170 -0
  64. package/docs/components/radio/content.md +224 -0
  65. package/docs/components/range-calendar/content.md +123 -0
  66. package/docs/components/reorderable-list/content.md +309 -0
  67. package/docs/components/scoped-theme/content.md +47 -0
  68. package/docs/components/scroll-shadow/content.md +686 -0
  69. package/docs/components/select/content.md +400 -0
  70. package/docs/components/select/design.md +301 -0
  71. package/docs/components/skeleton/content.md +103 -0
  72. package/docs/components/slider/content.md +423 -0
  73. package/docs/components/stack/content.md +161 -0
  74. package/docs/components/switch/content.md +150 -0
  75. package/docs/components/switch/design.md +208 -0
  76. package/docs/components/table/content.md +548 -0
  77. package/docs/components/table-pagination/content.md +177 -0
  78. package/docs/components/tabs/content.md +292 -0
  79. package/docs/components/text/content.md +142 -0
  80. package/docs/components/textarea/content.md +222 -0
  81. package/docs/components/tile/content.md +703 -0
  82. package/docs/components/toast/content.md +456 -0
  83. package/docs/components/toggle-button/content.md +505 -0
  84. package/docs/components/tooltip/content.md +350 -0
  85. package/docs/components/virtualized-list/content.md +250 -0
  86. package/docs/foundations/content.md +9 -0
  87. package/docs/foundations/expressions/icons/content.md +19 -0
  88. package/docs/foundations/styles/tokens/all-tokens/content.md +192 -0
  89. package/docs/foundations/styles/tokens/what-are-tokens/content.md +33 -0
  90. package/docs/foundations/styles/tokens/what-are-tokens/design.md +33 -0
  91. package/docs/getting-started/content.md +4 -0
  92. package/docs/getting-started/designers/content.md +13 -0
  93. package/docs/getting-started/designers/design.md +13 -0
  94. package/docs/getting-started/developers/accessibility/content.md +31 -0
  95. package/docs/getting-started/developers/content.md +612 -0
  96. package/docs/getting-started/developers/styling/content.md +193 -0
  97. package/docs/llms.txt +193 -0
  98. package/docs/patterns/account-management/content.md +75 -0
  99. package/docs/patterns/authentication/content.md +52 -0
  100. package/docs/patterns/content.md +10 -0
  101. package/docs/patterns/dashboard/content.md +39 -0
  102. package/docs/patterns/empty-states/content.md +31 -0
  103. package/docs/patterns/forms/content.md +109 -0
  104. package/docs/patterns/onboarding/content.md +69 -0
  105. package/docs/patterns/payments/content.md +35 -0
  106. package/docs/patterns/settings/content.md +72 -0
  107. package/docs/resources/content.md +9 -0
  108. package/docs/resources/figma-libraries/content.md +42 -0
  109. package/docs/resources/release-notes/0.0.1-beta.118/content.md +27 -0
  110. package/docs/resources/release-notes/0.0.1-beta.122/content.md +21 -0
  111. package/docs/resources/release-notes/0.0.1-beta.124/content.md +16 -0
  112. package/docs/resources/release-notes/0.0.1-beta.126/content.md +10 -0
  113. package/docs/resources/release-notes/0.0.1-beta.127/content.md +14 -0
  114. package/docs/resources/release-notes/0.0.1-beta.128/content.md +9 -0
  115. package/docs/resources/release-notes/0.0.1-beta.129/content.md +18 -0
  116. package/docs/resources/release-notes/0.0.1-beta.130/content.md +18 -0
  117. package/docs/resources/release-notes/0.0.1-beta.133/content.md +7 -0
  118. package/docs/resources/release-notes/0.0.1-beta.134/content.md +17 -0
  119. package/docs/resources/release-notes/0.0.1-beta.136/content.md +7 -0
  120. package/docs/resources/release-notes/0.0.1-beta.137/content.md +10 -0
  121. package/docs/resources/release-notes/0.0.1-beta.138/content.md +7 -0
  122. package/docs/resources/release-notes/0.0.1-beta.139/content.md +13 -0
  123. package/docs/resources/release-notes/0.0.1-beta.140/content.md +26 -0
  124. package/docs/resources/release-notes/0.0.1-beta.141/content.md +63 -0
  125. package/docs/resources/release-notes/0.0.1-beta.142/content.md +7 -0
  126. package/docs/resources/release-notes/0.0.1-beta.143/content.md +12 -0
  127. package/docs/resources/release-notes/0.0.1-beta.144/content.md +7 -0
  128. package/docs/resources/release-notes/0.0.1-beta.145/content.md +7 -0
  129. package/docs/resources/release-notes/0.0.1-beta.147/content.md +10 -0
  130. package/docs/resources/release-notes/0.0.1-beta.149/content.md +10 -0
  131. package/docs/resources/release-notes/0.0.1-beta.150/content.md +13 -0
  132. package/docs/resources/release-notes/0.0.1-beta.152/content.md +7 -0
  133. package/docs/resources/release-notes/0.0.1-beta.154/content.md +15 -0
  134. package/docs/resources/release-notes/0.0.1-beta.156/content.md +7 -0
  135. package/docs/resources/release-notes/0.0.1-beta.158/content.md +9 -0
  136. package/docs/resources/release-notes/0.0.1-beta.159/content.md +11 -0
  137. package/docs/resources/release-notes/0.0.1-beta.160/content.md +7 -0
  138. package/docs/resources/release-notes/0.0.1-beta.161/content.md +7 -0
  139. package/docs/resources/release-notes/0.0.1-beta.163/content.md +7 -0
  140. package/docs/resources/release-notes/0.0.1-beta.164/content.md +9 -0
  141. package/docs/resources/release-notes/0.0.1-beta.166/content.md +17 -0
  142. package/docs/resources/release-notes/0.0.1-beta.167/content.md +7 -0
  143. package/docs/resources/release-notes/0.0.1-beta.168/content.md +7 -0
  144. package/docs/resources/release-notes/0.0.1-beta.169/content.md +7 -0
  145. package/docs/resources/release-notes/0.0.1-beta.171/content.md +16 -0
  146. package/docs/resources/release-notes/0.0.1-beta.172/content.md +24 -0
  147. package/docs/resources/release-notes/0.0.1-beta.173/content.md +15 -0
  148. package/docs/resources/release-notes/0.0.1-beta.174/content.md +7 -0
  149. package/docs/resources/release-notes/0.0.1-beta.176/content.md +32 -0
  150. package/docs/resources/release-notes/0.0.1-beta.179/content.md +11 -0
  151. package/docs/resources/release-notes/0.0.1-beta.182/content.md +13 -0
  152. package/docs/resources/release-notes/0.0.1-beta.185/content.md +7 -0
  153. package/docs/resources/release-notes/0.0.1-beta.187/content.md +27 -0
  154. package/docs/resources/release-notes/0.1.1/content.md +23 -0
  155. package/docs/resources/release-notes/0.1.2/content.md +7 -0
  156. package/docs/resources/release-notes/0.1.4/content.md +19 -0
  157. package/docs/resources/release-notes/0.1.5/content.md +7 -0
  158. package/docs/resources/release-notes/0.1.6/content.md +7 -0
  159. package/docs/resources/release-notes/0.2.0/content.md +31 -0
  160. package/docs/resources/release-notes/0.2.1/content.md +17 -0
  161. package/docs/resources/release-notes/0.2.2/content.md +11 -0
  162. package/docs/resources/release-notes/0.2.3/content.md +15 -0
  163. package/docs/resources/release-notes/content.md +64 -0
  164. package/lib/commonjs/components/DateTimeList/index.js +11 -26
  165. package/lib/commonjs/components/DateTimeList/index.js.map +1 -1
  166. package/lib/commonjs/components/DateTimeList/styles.js +2 -12
  167. package/lib/commonjs/components/DateTimeList/styles.js.map +1 -1
  168. package/lib/commonjs/components/ListItem/index.js.map +1 -1
  169. package/lib/commonjs/components/ListItem/styles.js +2 -1
  170. package/lib/commonjs/components/ListItem/styles.js.map +1 -1
  171. package/lib/commonjs/components/Menu/index.js +11 -5
  172. package/lib/commonjs/components/Menu/index.js.map +1 -1
  173. package/lib/commonjs/components/ScrollShadow/gradient.js +29 -0
  174. package/lib/commonjs/components/ScrollShadow/gradient.js.map +1 -0
  175. package/lib/commonjs/components/ScrollShadow/index.js +171 -44
  176. package/lib/commonjs/components/ScrollShadow/index.js.map +1 -1
  177. package/lib/commonjs/components/ScrollShadow/styles.js +58 -14
  178. package/lib/commonjs/components/ScrollShadow/styles.js.map +1 -1
  179. package/lib/commonjs/components/ScrollShadow/useComposedScrollHandler.js +63 -0
  180. package/lib/commonjs/components/ScrollShadow/useComposedScrollHandler.js.map +1 -0
  181. package/lib/commonjs/components/ScrollShadow/useScrollShadow.js +48 -8
  182. package/lib/commonjs/components/ScrollShadow/useScrollShadow.js.map +1 -1
  183. package/lib/commonjs/components/Tabs/index.js +16 -23
  184. package/lib/commonjs/components/Tabs/index.js.map +1 -1
  185. package/lib/commonjs/components/Tabs/styles.js +1 -10
  186. package/lib/commonjs/components/Tabs/styles.js.map +1 -1
  187. package/lib/commonjs/figma/ListItem.SectionHeader.figma.js +20 -5
  188. package/lib/commonjs/figma/ListItem.SectionHeader.figma.js.map +1 -1
  189. package/lib/module/components/DateTimeList/index.js +12 -27
  190. package/lib/module/components/DateTimeList/index.js.map +1 -1
  191. package/lib/module/components/DateTimeList/styles.js +1 -11
  192. package/lib/module/components/DateTimeList/styles.js.map +1 -1
  193. package/lib/module/components/ListItem/index.js.map +1 -1
  194. package/lib/module/components/ListItem/styles.js +2 -1
  195. package/lib/module/components/ListItem/styles.js.map +1 -1
  196. package/lib/module/components/Menu/index.js +11 -5
  197. package/lib/module/components/Menu/index.js.map +1 -1
  198. package/lib/module/components/ScrollShadow/gradient.js +24 -0
  199. package/lib/module/components/ScrollShadow/gradient.js.map +1 -0
  200. package/lib/module/components/ScrollShadow/index.js +170 -48
  201. package/lib/module/components/ScrollShadow/index.js.map +1 -1
  202. package/lib/module/components/ScrollShadow/styles.js +57 -13
  203. package/lib/module/components/ScrollShadow/styles.js.map +1 -1
  204. package/lib/module/components/ScrollShadow/useComposedScrollHandler.js +57 -0
  205. package/lib/module/components/ScrollShadow/useComposedScrollHandler.js.map +1 -0
  206. package/lib/module/components/ScrollShadow/useScrollShadow.js +46 -8
  207. package/lib/module/components/ScrollShadow/useScrollShadow.js.map +1 -1
  208. package/lib/module/components/Tabs/index.js +17 -24
  209. package/lib/module/components/Tabs/index.js.map +1 -1
  210. package/lib/module/components/Tabs/styles.js +0 -9
  211. package/lib/module/components/Tabs/styles.js.map +1 -1
  212. package/lib/module/figma/ListItem.SectionHeader.figma.js +20 -5
  213. package/lib/module/figma/ListItem.SectionHeader.figma.js.map +1 -1
  214. package/lib/typescript/components/DateTimeList/index.d.ts.map +1 -1
  215. package/lib/typescript/components/DateTimeList/styles.d.ts +1 -4
  216. package/lib/typescript/components/DateTimeList/styles.d.ts.map +1 -1
  217. package/lib/typescript/components/ListItem/index.d.ts +5 -4
  218. package/lib/typescript/components/ListItem/index.d.ts.map +1 -1
  219. package/lib/typescript/components/ListItem/styles.d.ts +1 -1
  220. package/lib/typescript/components/ListItem/styles.d.ts.map +1 -1
  221. package/lib/typescript/components/Menu/index.d.ts.map +1 -1
  222. package/lib/typescript/components/ScrollShadow/gradient.d.ts +7 -0
  223. package/lib/typescript/components/ScrollShadow/gradient.d.ts.map +1 -0
  224. package/lib/typescript/components/ScrollShadow/index.d.ts +57 -15
  225. package/lib/typescript/components/ScrollShadow/index.d.ts.map +1 -1
  226. package/lib/typescript/components/ScrollShadow/styles.d.ts +8 -2
  227. package/lib/typescript/components/ScrollShadow/styles.d.ts.map +1 -1
  228. package/lib/typescript/components/ScrollShadow/useComposedScrollHandler.d.ts +13 -0
  229. package/lib/typescript/components/ScrollShadow/useComposedScrollHandler.d.ts.map +1 -0
  230. package/lib/typescript/components/ScrollShadow/useScrollShadow.d.ts +15 -2
  231. package/lib/typescript/components/ScrollShadow/useScrollShadow.d.ts.map +1 -1
  232. package/lib/typescript/components/Tabs/index.d.ts.map +1 -1
  233. package/lib/typescript/components/Tabs/styles.d.ts +0 -7
  234. package/lib/typescript/components/Tabs/styles.d.ts.map +1 -1
  235. package/lib/typescript/figma/ListItem.SectionHeader.figma.d.ts.map +1 -1
  236. package/package.json +8 -6
  237. package/src/components/DateTimeList/index.tsx +13 -26
  238. package/src/components/DateTimeList/styles.ts +1 -10
  239. package/src/components/ListItem/index.tsx +5 -4
  240. package/src/components/ListItem/styles.ts +1 -0
  241. package/src/components/Menu/index.tsx +11 -8
  242. package/src/components/ScrollShadow/gradient.ts +48 -0
  243. package/src/components/ScrollShadow/index.tsx +300 -69
  244. package/src/components/ScrollShadow/styles.ts +45 -28
  245. package/src/components/ScrollShadow/useComposedScrollHandler.ts +58 -0
  246. package/src/components/ScrollShadow/useScrollShadow.ts +72 -10
  247. package/src/components/Tabs/index.tsx +25 -35
  248. package/src/components/Tabs/styles.ts +0 -9
@@ -0,0 +1,192 @@
1
+ # All design tokens (https://design.candescent.com/docs/foundations/styles/tokens/all-tokens)
2
+
3
+ ## Primitives
4
+
5
+ Our design tokens are broken down into 3 distinct layers: **Primitives**, **FI Primitives**, and **Semantics**.
6
+
7
+ The tokens in the Primitives layer are constants defined by Tailwind CSS, which serves as the styling layer for the Forge Design System. These tokens are generally not used directly in designs. Instead, they serve as values for the tokens in our Semantics layer.
8
+
9
+ **Standard palettes**
10
+
11
+ | Scale | Steps | Example class |
12
+ | --- | --- | --- |
13
+ | `blue` | 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950 | `bg-blue-500` |
14
+ | `green` | 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950 | `bg-green-500` |
15
+ | `red` | 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950 | `bg-red-500` |
16
+ | `amber` | 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950 | `bg-amber-500` |
17
+ | `orange` | 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950 | `bg-orange-500` |
18
+ | `yellow` | 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950 | `bg-yellow-500` |
19
+ | `pink` | 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950 | `bg-pink-500` |
20
+ | `purple` | 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950 | `bg-purple-500` |
21
+ | `sky` | 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950 | `bg-sky-500` |
22
+ | `teal` | 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950 | `bg-teal-500` |
23
+ | `neutral` | 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950 | `bg-neutral-500` |
24
+
25
+ **Singular colors:** `black` (`bg-black`), `transparent` (`bg-transparent`), `white` (`bg-white`)
26
+
27
+ ## FI Primitives
28
+
29
+ Our design tokens are broken down into 3 distinct layers: **Primitives**, **FI Primitives**, and **Semantics**.
30
+
31
+ The tokens in the FI Primitives layer are similar to the Primitive tokens, but they are generated based on a FI's brand colors and other selections made in the theme editor.
32
+
33
+ Generated per FI from the brand inputs, so their values differ for every FI. The input seed keys sit alongside the 50-950 steps.
34
+
35
+ | Scale | Steps | Example class |
36
+ | --- | --- | --- |
37
+ | `brand` | 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950; inputs `input` | `bg-brand-500` |
38
+ | `accent` | 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950; inputs `input` | `bg-accent-500` |
39
+ | `base` | 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950 | `bg-base-500` |
40
+
41
+ ## Semantics
42
+
43
+ Our design tokens are broken down into 3 distinct layers: **Primitives**, **FI Primitives**, and **Semantics**.
44
+
45
+ The tokens in the Semantics layer represent design decisions. These are the core tokens that should be used directly in designs. They typically reference a token from the Primitives or FI Primitives layer.
46
+
47
+ ### Content
48
+
49
+ Text and icon colors, used as `text-*` utilities. Light and Dark name the primitive each token resolves to in the default theme. An FI theme changes what the FI primitives (`brand`, `accent`, `base`) resolve to, so use the token, never the primitive.
50
+
51
+ | Token | Utility class | Role | Light | Dark |
52
+ | --- | --- | --- | --- | --- |
53
+ | `content.brand` | `text-content-brand` | brand | `color.brand.700` | `color.brand.300` |
54
+ | `content.brand-on-strong` | `text-content-brand-on-strong` | brand, on strong | `color.white` | `color.brand.950` |
55
+ | `content.brand-on-subtle` | `text-content-brand-on-subtle` | brand, on subtle | `color.brand.800` | `color.brand.100` |
56
+ | `content.primary` | `text-content-primary` | primary | `color.base.950` | `color.white` |
57
+ | `content.secondary` | `text-content-secondary` | secondary | `color.base.600` | `color.base.300` |
58
+ | `content.tertiary` | `text-content-tertiary` | tertiary | `color.base.500` | `color.base.400` |
59
+ | `content.action` | `text-content-action` | action | `color.brand.700` | `color.brand.100` |
60
+ | `content.action-on-strong` | `text-content-action-on-strong` | action, on strong | `color.white` | `color.brand.950` |
61
+ | `content.action-on-subtle` | `text-content-action-on-subtle` | action, on subtle | `color.brand.800` | `color.brand.100` |
62
+ | `content.neutral` | `text-content-neutral` | neutral | `color.base.700` | `color.base.300` |
63
+ | `content.neutral-on-strong` | `text-content-neutral-on-strong` | neutral, on strong | `color.white` | `color.base.900` |
64
+ | `content.neutral-on-subtle` | `text-content-neutral-on-subtle` | neutral, on subtle | `color.base.800` | `color.base.100` |
65
+ | `content.info` | `text-content-info` | info | `color.sky.700` | `color.sky.500` |
66
+ | `content.info-on-strong` | `text-content-info-on-strong` | info, on strong | `color.white` | `color.white` |
67
+ | `content.info-on-subtle` | `text-content-info-on-subtle` | info, on subtle | `color.sky.900` | `color.sky.900` |
68
+ | `content.success` | `text-content-success` | success | `color.green.700` | `color.green.600` |
69
+ | `content.success-on-strong` | `text-content-success-on-strong` | success, on strong | `color.white` | `color.white` |
70
+ | `content.success-on-subtle` | `text-content-success-on-subtle` | success, on subtle | `color.green.900` | `color.green.900` |
71
+ | `content.warning` | `text-content-warning` | warning | `color.amber.700` | `color.amber.600` |
72
+ | `content.warning-on-strong` | `text-content-warning-on-strong` | warning, on strong | `color.black` | `color.black` |
73
+ | `content.warning-on-subtle` | `text-content-warning-on-subtle` | warning, on subtle | `color.amber.900` | `color.amber.900` |
74
+ | `content.danger` | `text-content-danger` | danger | `color.red.700` | `color.red.300` |
75
+ | `content.danger-on-strong` | `text-content-danger-on-strong` | danger, on strong | `color.white` | `color.red.900` |
76
+ | `content.danger-on-subtle` | `text-content-danger-on-subtle` | danger, on subtle | `color.red.900` | `color.red.100` |
77
+ | `content.link` | `text-content-link` | link | `color.blue.600` | `color.white` |
78
+ | `content.link-visited` | `text-content-link-visited` | link, visited | `color.purple.800` | `color.purple.200` |
79
+ | `content.selected` | `text-content-selected` | selected | `color.brand.700` | `color.brand.100` |
80
+ | `content.accent` | `text-content-accent` | accent | `color.accent.700` | `color.accent.300` |
81
+ | `content.accent-on-strong` | `text-content-accent-on-strong` | accent, on strong | `color.white` | `color.accent.950` |
82
+ | `content.accent-on-subtle` | `text-content-accent-on-subtle` | accent, on subtle | `color.accent.800` | `color.accent.100` |
83
+
84
+ ### Surface
85
+
86
+ Background colors, used as `bg-*` utilities. Light and Dark name the primitive each token resolves to in the default theme. An FI theme changes what the FI primitives (`brand`, `accent`, `base`) resolve to, so use the token, never the primitive.
87
+
88
+ | Token | Utility class | Role | Light | Dark |
89
+ | --- | --- | --- | --- | --- |
90
+ | `surface.background` | `bg-surface-background` | Base surfaces, background | `color.base.50` | `color.base.950` |
91
+ | `surface.backdrop` | `bg-surface-backdrop` | Base surfaces, backdrop | `rgba(0, 0, 0, 0.5)` | `rgba(0, 0, 0, 0.5)` |
92
+ | `surface.primary` | `bg-surface-primary` | Base surfaces, primary | `color.white` | `color.base.950` |
93
+ | `surface.primary-hover` | `bg-surface-primary-hover` | Base surfaces, primary, hover | `color.base.100` | `color.base.900` |
94
+ | `surface.primary-active` | `bg-surface-primary-active` | Base surfaces, primary, active | `color.base.200` | `color.base.800` |
95
+ | `surface.secondary` | `bg-surface-secondary` | Base surfaces, secondary | `color.base.100` | `color.base.900` |
96
+ | `surface.secondary-hover` | `bg-surface-secondary-hover` | Base surfaces, secondary, hover | `color.base.200` | `color.base.800` |
97
+ | `surface.secondary-active` | `bg-surface-secondary-active` | Base surfaces, secondary, active | `color.base.300` | `color.base.700` |
98
+ | `surface.tertiary` | `bg-surface-tertiary` | Base surfaces, tertiary | `color.brand.200` | `color.brand.900` |
99
+ | `surface.action.strong` | `bg-surface-action-strong` | Action, strong | `color.brand.700` | `color.brand.300` |
100
+ | `surface.action.strong-hover` | `bg-surface-action-strong-hover` | Action, strong, hover | `color.brand.800` | `color.brand.200` |
101
+ | `surface.action.strong-active` | `bg-surface-action-strong-active` | Action, strong, active | `color.brand.900` | `color.brand.100` |
102
+ | `surface.action.subtle` | `bg-surface-action-subtle` | Action, subtle | `color.brand.200` | `color.brand.900` |
103
+ | `surface.action.subtle-hover` | `bg-surface-action-subtle-hover` | Action, subtle, hover | `color.brand.300` | `color.brand.800` |
104
+ | `surface.action.subtle-active` | `bg-surface-action-subtle-active` | Action, subtle, active | `color.brand.400` | `color.brand.700` |
105
+ | `surface.action.tint` | `bg-surface-action-tint` | Action, tint | `color.brand.50` | `color.brand.950` |
106
+ | `surface.action.tint-hover` | `bg-surface-action-tint-hover` | Action, tint, hover | `color.brand.100` | `color.brand.900` |
107
+ | `surface.action.tint-active` | `bg-surface-action-tint-active` | Action, tint, active | `color.brand.200` | `color.brand.800` |
108
+ | `surface.brand.strong` | `bg-surface-brand-strong` | Brand, strong | `color.brand.700` | `color.brand.300` |
109
+ | `surface.brand.subtle` | `bg-surface-brand-subtle` | Brand, subtle | `color.brand.200` | `color.brand.900` |
110
+ | `surface.brand.tint` | `bg-surface-brand-tint` | Brand, tint | `color.brand.50` | `color.brand.950` |
111
+ | `surface.brand.core` | `bg-surface-brand-core` | Brand, core | `color.brand.input` | `color.brand.input` |
112
+ | `surface.accent.strong` | `bg-surface-accent-strong` | Accent, strong | `color.accent.700` | `color.accent.300` |
113
+ | `surface.accent.subtle` | `bg-surface-accent-subtle` | Accent, subtle | `color.accent.200` | `color.accent.900` |
114
+ | `surface.accent.tint` | `bg-surface-accent-tint` | Accent, tint | `color.accent.50` | `color.accent.950` |
115
+ | `surface.accent.core` | `bg-surface-accent-core` | Accent, core | `color.accent.input` | `color.accent.input` |
116
+ | `surface.danger.strong` | `bg-surface-danger-strong` | Danger, strong | `color.red.700` | `color.red.200` |
117
+ | `surface.danger.strong-hover` | `bg-surface-danger-strong-hover` | Danger, strong, hover | `color.red.800` | `color.red.100` |
118
+ | `surface.danger.strong-active` | `bg-surface-danger-strong-active` | Danger, strong, active | `color.red.900` | `color.red.50` |
119
+ | `surface.danger.subtle` | `bg-surface-danger-subtle` | Danger, subtle | `color.red.100` | `color.red.900` |
120
+ | `surface.danger.subtle-hover` | `bg-surface-danger-subtle-hover` | Danger, subtle, hover | `color.red.200` | `color.red.800` |
121
+ | `surface.danger.subtle-active` | `bg-surface-danger-subtle-active` | Danger, subtle, active | `color.red.300` | `color.red.700` |
122
+ | `surface.danger.tint` | `bg-surface-danger-tint` | Danger, tint | `color.red.50` | `color.red.950` |
123
+ | `surface.danger.tint-hover` | `bg-surface-danger-tint-hover` | Danger, tint, hover | `color.red.100` | `color.red.900` |
124
+ | `surface.danger.tint-active` | `bg-surface-danger-tint-active` | Danger, tint, active | `color.red.200` | `color.red.800` |
125
+ | `surface.info.strong` | `bg-surface-info-strong` | Info, strong | `color.sky.700` | `color.sky.300` |
126
+ | `surface.info.strong-hover` | `bg-surface-info-strong-hover` | Info, strong, hover | `color.sky.800` | `color.sky.200` |
127
+ | `surface.info.strong-active` | `bg-surface-info-strong-active` | Info, strong, active | `color.sky.900` | `color.sky.100` |
128
+ | `surface.info.subtle` | `bg-surface-info-subtle` | Info, subtle | `color.sky.100` | `color.sky.900` |
129
+ | `surface.info.subtle-hover` | `bg-surface-info-subtle-hover` | Info, subtle, hover | `color.sky.200` | `color.sky.800` |
130
+ | `surface.info.subtle-active` | `bg-surface-info-subtle-active` | Info, subtle, active | `color.sky.300` | `color.sky.700` |
131
+ | `surface.info.tint` | `bg-surface-info-tint` | Info, tint | `color.sky.50` | `color.sky.950` |
132
+ | `surface.info.tint-hover` | `bg-surface-info-tint-hover` | Info, tint, hover | `color.sky.100` | `color.sky.900` |
133
+ | `surface.info.tint-active` | `bg-surface-info-tint-active` | Info, tint, active | `color.sky.200` | `color.sky.800` |
134
+ | `surface.neutral.strong` | `bg-surface-neutral-strong` | Neutral, strong | `color.base.700` | `color.base.300` |
135
+ | `surface.neutral.strong-hover` | `bg-surface-neutral-strong-hover` | Neutral, strong, hover | `color.base.800` | `color.base.200` |
136
+ | `surface.neutral.strong-active` | `bg-surface-neutral-strong-active` | Neutral, strong, active | `color.base.900` | `color.base.100` |
137
+ | `surface.neutral.subtle` | `bg-surface-neutral-subtle` | Neutral, subtle | `color.base.200` | `color.base.900` |
138
+ | `surface.neutral.subtle-hover` | `bg-surface-neutral-subtle-hover` | Neutral, subtle, hover | `color.base.300` | `color.base.800` |
139
+ | `surface.neutral.subtle-active` | `bg-surface-neutral-subtle-active` | Neutral, subtle, active | `color.base.400` | `color.base.700` |
140
+ | `surface.neutral.tint` | `bg-surface-neutral-tint` | Neutral, tint | `color.base.50` | `color.base.950` |
141
+ | `surface.neutral.tint-hover` | `bg-surface-neutral-tint-hover` | Neutral, tint, hover | `color.base.100` | `color.base.900` |
142
+ | `surface.neutral.tint-active` | `bg-surface-neutral-tint-active` | Neutral, tint, active | `color.base.200` | `color.base.800` |
143
+ | `surface.success.strong` | `bg-surface-success-strong` | Success, strong | `color.green.600` | `color.green.300` |
144
+ | `surface.success.strong-hover` | `bg-surface-success-strong-hover` | Success, strong, hover | `color.green.700` | `color.green.200` |
145
+ | `surface.success.strong-active` | `bg-surface-success-strong-active` | Success, strong, active | `color.green.800` | `color.green.100` |
146
+ | `surface.success.subtle` | `bg-surface-success-subtle` | Success, subtle | `color.green.100` | `color.green.900` |
147
+ | `surface.success.subtle-hover` | `bg-surface-success-subtle-hover` | Success, subtle, hover | `color.green.200` | `color.green.800` |
148
+ | `surface.success.subtle-active` | `bg-surface-success-subtle-active` | Success, subtle, active | `color.green.300` | `color.green.700` |
149
+ | `surface.success.tint` | `bg-surface-success-tint` | Success, tint | `color.green.50` | `color.green.950` |
150
+ | `surface.success.tint-hover` | `bg-surface-success-tint-hover` | Success, tint, hover | `color.green.100` | `color.green.900` |
151
+ | `surface.success.tint-active` | `bg-surface-success-tint-active` | Success, tint, active | `color.green.200` | `color.green.800` |
152
+ | `surface.warning.strong` | `bg-surface-warning-strong` | Warning, strong | `color.amber.400` | `color.amber.300` |
153
+ | `surface.warning.strong-hover` | `bg-surface-warning-strong-hover` | Warning, strong, hover | `color.amber.500` | `color.amber.200` |
154
+ | `surface.warning.strong-active` | `bg-surface-warning-strong-active` | Warning, strong, active | `color.amber.600` | `color.amber.100` |
155
+ | `surface.warning.subtle` | `bg-surface-warning-subtle` | Warning, subtle | `color.amber.100` | `color.amber.900` |
156
+ | `surface.warning.subtle-hover` | `bg-surface-warning-subtle-hover` | Warning, subtle, hover | `color.amber.200` | `color.amber.800` |
157
+ | `surface.warning.subtle-active` | `bg-surface-warning-subtle-active` | Warning, subtle, active | `color.amber.300` | `color.amber.700` |
158
+ | `surface.warning.tint` | `bg-surface-warning-tint` | Warning, tint | `color.amber.50` | `color.amber.950` |
159
+ | `surface.warning.tint-hover` | `bg-surface-warning-tint-hover` | Warning, tint, hover | `color.amber.100` | `color.amber.900` |
160
+ | `surface.warning.tint-active` | `bg-surface-warning-tint-active` | Warning, tint, active | `color.amber.200` | `color.amber.800` |
161
+
162
+ ### Stroke
163
+
164
+ Border colors, used as `border-*` utilities. Light and Dark name the primitive each token resolves to in the default theme. An FI theme changes what the FI primitives (`brand`, `accent`, `base`) resolve to, so use the token, never the primitive.
165
+
166
+ | Token | Utility class | Role | Light | Dark |
167
+ | --- | --- | --- | --- | --- |
168
+ | `stroke.primary` | `border-stroke-primary` | primary | `color.base.500` | `color.base.400` |
169
+ | `stroke.secondary` | `border-stroke-secondary` | secondary | `color.base.200` | `color.base.800` |
170
+ | `stroke.action` | `border-stroke-action` | action | `color.brand.700` | `color.brand.300` |
171
+ | `stroke.info` | `border-stroke-info` | info | `color.sky.700` | `color.sky.200` |
172
+ | `stroke.success` | `border-stroke-success` | success | `color.green.600` | `color.green.200` |
173
+ | `stroke.warning` | `border-stroke-warning` | warning | `color.amber.700` | `color.amber.300` |
174
+ | `stroke.danger` | `border-stroke-danger` | danger | `color.red.700` | `color.red.300` |
175
+ | `stroke.focus` | `border-stroke-focus` | focus | `color.brand.700` | `color.brand.300` |
176
+ | `stroke.hover` | `border-stroke-hover` | hover | `color.base.950` | `color.base.50` |
177
+ | `stroke.ring` | `border-stroke-ring` | ring | `color.base.950` | `color.white` |
178
+
179
+ ### Chart
180
+
181
+ Data-visualization colors, used as `bg-*` utilities. Light and Dark name the primitive each token resolves to in the default theme. An FI theme changes what the FI primitives (`brand`, `accent`, `base`) resolve to, so use the token, never the primitive.
182
+
183
+ | Token | Utility class | Role | Light | Dark |
184
+ | --- | --- | --- | --- | --- |
185
+ | `chart.categorical.1` | `bg-chart-categorical-1` | Categorical, 1 | `color.blue.600` | `color.blue.600` |
186
+ | `chart.categorical.2` | `bg-chart-categorical-2` | Categorical, 2 | `color.orange.600` | `color.orange.600` |
187
+ | `chart.categorical.3` | `bg-chart-categorical-3` | Categorical, 3 | `color.teal.600` | `color.teal.600` |
188
+ | `chart.categorical.4` | `bg-chart-categorical-4` | Categorical, 4 | `color.pink.600` | `color.pink.600` |
189
+ | `chart.categorical.5` | `bg-chart-categorical-5` | Categorical, 5 | `color.purple.600` | `color.purple.600` |
190
+ | `chart.categorical.6` | `bg-chart-categorical-6` | Categorical, 6 | `color.neutral.600` | `color.neutral.600` |
191
+ | `chart.simple.primary` | `bg-chart-simple-primary` | Simple, primary | `color.brand.500` | `color.brand.500` |
192
+ | `chart.simple.secondary` | `bg-chart-simple-secondary` | Simple, secondary | `color.brand.950` | `color.brand.950` |
@@ -0,0 +1,33 @@
1
+ # What are tokens? (https://design.candescent.com/docs/foundations/styles/tokens/what-are-tokens)
2
+
3
+ Design tokens are the most atomic building blocks of our design system. They act as a bridge between design and engineering by distilling foundational design decisions down into data. A token can be a color, typography style, spacing unit, elevation, or any other style that can be reused across platforms.
4
+
5
+ _what-are-tokens\_labeled_
6
+
7
+ ## **Why use design tokens?**
8
+
9
+ Using tokens ensures consistency throughout and between experiences. Additionally, if the value of a token is updated, that new value will automatically disseminate to every component or element that uses it, eliminating the need to find and replace hard-coded values.
10
+
11
+ In addition to consistency and ease of updates, using design tokens also has the following benefits:
12
+
13
+ - Tokens enable extensibility, allowing our partners to customize their branding and theming throughout our experiences.
14
+ - Since tokens are available in Figma too, the design handoff process is streamlined for developers.
15
+
16
+ ## **How to read token names**
17
+
18
+ Knowing how to read token names will help you find the right token faster and understand what the token represents.
19
+
20
+ 1. **Token Type**: The token's type, which is related to a specific visual design attribute such as color, typography, or shadow.
21
+ 2. **Property**: The type of UI element that the token should be applied to, such content, a surface, or a border.
22
+ 3. **Group** _(optional)_: The group or color palette that the token belongs to.
23
+ - Not every token has a group. For example, color.content.primary is our default text color.
24
+ 4. **Modifier**: Additional details about the token's purpose, such as it's color role, emphasis, or interaction state.
25
+ - Some tokens have multiple modifiers, such as color.surface.action.strong-hover, where "strong" indicates the emphasis and "hover" indicates the interaction state.
26
+
27
+ ## Token layers
28
+
29
+ Our design tokens are broken down into 3 distinct layers: **Primitives**, **FI Primitives**, and **Semantics**.
30
+
31
+ - **Primitives**: These tokens are constants defined by Tailwind CSS, which serves as the styling layer for the Forge Design System. These tokens are generally not used directly in designs. Instead, they serve as values for the tokens in our Semantics layer.
32
+ - **FI Primitives**: These tokens are similar to the Primitive tokens, but they are generated based on a FI's brand colors and other selections made in the theme editor.
33
+ - **Semantics**: These tokens represent design decisions. These are the core tokens that should be used directly in designs. They typically reference a token from the Primitives or FI Primitives layer.
@@ -0,0 +1,33 @@
1
+ # What are tokens? — Design (https://design.candescent.com/docs/foundations/styles/tokens/what-are-tokens)
2
+
3
+ Design tokens are the most atomic building blocks of our design system. They act as a bridge between design and engineering by distilling foundational design decisions down into data. A token can be a color, typography style, spacing unit, elevation, or any other style that can be reused across platforms.
4
+
5
+ _what-are-tokens\_labeled_
6
+
7
+ ## **Why use design tokens?**
8
+
9
+ Using tokens ensures consistency throughout and between experiences. Additionally, if the value of a token is updated, that new value will automatically disseminate to every component or element that uses it, eliminating the need to find and replace hard-coded values.
10
+
11
+ In addition to consistency and ease of updates, using design tokens also has the following benefits:
12
+
13
+ - Tokens enable extensibility, allowing our partners to customize their branding and theming throughout our experiences.
14
+ - Since tokens are available in Figma too, the design handoff process is streamlined for developers.
15
+
16
+ ## **How to read token names**
17
+
18
+ Knowing how to read token names will help you find the right token faster and understand what the token represents.
19
+
20
+ 1. **Token Type**: The token's type, which is related to a specific visual design attribute such as color, typography, or shadow.
21
+ 2. **Property**: The type of UI element that the token should be applied to, such content, a surface, or a border.
22
+ 3. **Group** _(optional)_: The group or color palette that the token belongs to.
23
+ - Not every token has a group. For example, color.content.primary is our default text color.
24
+ 4. **Modifier**: Additional details about the token's purpose, such as it's color role, emphasis, or interaction state.
25
+ - Some tokens have multiple modifiers, such as color.surface.action.strong-hover, where "strong" indicates the emphasis and "hover" indicates the interaction state.
26
+
27
+ ## Token layers
28
+
29
+ Our design tokens are broken down into 3 distinct layers: **Primitives**, **FI Primitives**, and **Semantics**.
30
+
31
+ - **Primitives**: These tokens are constants defined by Tailwind CSS, which serves as the styling layer for the Forge Design System. These tokens are generally not used directly in designs. Instead, they serve as values for the tokens in our Semantics layer.
32
+ - **FI Primitives**: These tokens are similar to the Primitive tokens, but they are generated based on a FI's brand colors and other selections made in the theme editor.
33
+ - **Semantics**: These tokens represent design decisions. These are the core tokens that should be used directly in designs. They typically reference a token from the Primitives or FI Primitives layer.
@@ -0,0 +1,4 @@
1
+ # Getting Started (https://design.candescent.com/docs/getting-started)
2
+
3
+ - [Designers](https://design.candescent.com/docs/getting-started/designers/content.md) — Start designing with our guidelines, best practices, and Figma libraries.
4
+ - [Developers](https://design.candescent.com/docs/getting-started/developers/content.md) — Install and configure Forge UI, then build screens that keep FI theming and dark mode working.
@@ -0,0 +1,13 @@
1
+ # Designers (https://design.candescent.com/docs/getting-started/designers)
2
+
3
+ The Forge Design System (FDS) provides the tools you need to design cohesive, user-friendly interfaces. We provide reusable components in Figma, design principles, content guidelines, and patterns built for financial services and Intelligent Banking. This makes it easy for our designers and external partners to create best-in-class experiences across Candescent products.
4
+
5
+ To get started, check out our foundations to familiarize yourself with our design tokens, visual styles, and content guidelines. Then, explore our component library for reusable elements that you can incorporate into your designs, each accompanied by usage and content guidelines. Whether you're spinning up a new product or upgrading from a legacy system, the design system is here to streamline your workflow and make collaboration with developers smoother.
6
+
7
+ The core principles of our design system, including design tokens, styles, and content guidelines.
8
+
9
+ Reusable building blocks that can be combined to create consistent visuals, interactions, and accessibility.
10
+
11
+ Reusable combinations of components and templates that address common user experiences and flows.
12
+
13
+ Access our official design system Figma libraries.
@@ -0,0 +1,13 @@
1
+ # Designers — Design (https://design.candescent.com/docs/getting-started/designers)
2
+
3
+ The Forge Design System (FDS) provides the tools you need to design cohesive, user-friendly interfaces. We provide reusable components in Figma, design principles, content guidelines, and patterns built for financial services and Intelligent Banking. This makes it easy for our designers and external partners to create best-in-class experiences across Candescent products.
4
+
5
+ To get started, check out our foundations to familiarize yourself with our design tokens, visual styles, and content guidelines. Then, explore our component library for reusable elements that you can incorporate into your designs, each accompanied by usage and content guidelines. Whether you're spinning up a new product or upgrading from a legacy system, the design system is here to streamline your workflow and make collaboration with developers smoother.
6
+
7
+ The core principles of our design system, including design tokens, styles, and content guidelines.
8
+
9
+ Reusable building blocks that can be combined to create consistent visuals, interactions, and accessibility.
10
+
11
+ Reusable combinations of components and templates that address common user experiences and flows.
12
+
13
+ Access our official design system Figma libraries.
@@ -0,0 +1,31 @@
1
+ # Accessibility (https://design.candescent.com/docs/getting-started/developers/accessibility)
2
+
3
+ Forge UI components are built to work with VoiceOver on iOS, TalkBack on Android, and screen readers and keyboards on the web. Each component sets its own role, state and focus behavior, so a screen built from Forge UI parts starts accessible. Some things only your screen knows, such as what an icon-only button does or what a form field is for, and those are yours to supply.
4
+
5
+ Every component page ends with an Accessibility section that lists what that component announces and what it needs from you. This page covers what holds across all of them.
6
+
7
+ ## What the components handle
8
+
9
+ - **Roles and state.** Interactive components set their role (button, checkbox, radio, switch, tab, menu item) and report state such as checked, selected, expanded and disabled to assistive technology on every platform. Don't add a role or state a component already sets.
10
+ - **Keyboard focus on the web.** Keyboard users see a focus ring; pointer and touch users don't. Collections such as [Menu](https://design.candescent.com/docs/components/menu/content.md), [Select](https://design.candescent.com/docs/components/select/content.md) and [Tabs](https://design.candescent.com/docs/components/tabs/content.md) move focus between their items with the arrow keys.
11
+ - **Overlays.** [Dialog](https://design.candescent.com/docs/components/dialog/content.md) and [Alert Dialog](https://design.candescent.com/docs/components/alert-dialog/content.md) move focus into the popup, keep it there while the popup is open, and return it to the trigger when it closes.
12
+ - **Headings.** [Heading](https://design.candescent.com/docs/components/heading/content.md) is announced as a heading, with a level that follows its `size`: `xl` is level 1 through `xs` at level 5.
13
+ - **Announcements.** [Alert](https://design.candescent.com/docs/components/alert/content.md) is announced as a status message, or as an alert that interrupts for `danger` and `warning`. `Field.Error` is announced as soon as it appears, so validation errors reach screen reader users without moving focus.
14
+ - **Form relationships.** [Field](https://design.candescent.com/docs/components/field/content.md) connects its label, helper text and error message to the control it wraps.
15
+
16
+ ## What your screen provides
17
+
18
+ - **Names for icon-only controls.** An [IconButton](https://design.candescent.com/docs/components/icon-button/content.md) has no visible text, so give every one an `accessibilityLabel` that describes the action, such as "Close" or "Delete".
19
+ - **Meaningful icons.** An [Icon](https://design.candescent.com/docs/components/icon/content.md) is decorative and hidden from assistive technology unless you pass `accessibilityLabel`. Pass it only when the icon carries information that no nearby text does.
20
+ - **Labels for form controls.** Wrap each control in a `Field` with one `Field.Label`. Put instructions in `Field.Helper` and validation messages in `Field.Error`, not in placeholder text.
21
+ - **Required and invalid state.** Set `isRequired` and `isInvalid` from your form state. Forge UI communicates these states but does not run validation.
22
+ - **Information beyond color.** Pair a color, such as a red amount or a green badge, with text or an icon that says the same thing.
23
+ - **Right-to-left text.** Align text with `text-start` and `text-end`, never `text-left` or `text-right`, so a screen mirrors in right-to-left languages. See [Styling and customization](https://design.candescent.com/docs/getting-started/developers/styling/content.md).
24
+
25
+ ## Leave the defaults alone
26
+
27
+ Overriding a component's accessibility props is the most common way to break them. Don't hide a component from assistive technology to silence it, don't replace the role a component sets, and don't restyle a focus ring away. If a component announces something wrong for your case, [request a change](https://design.candescent.com/docs/getting-started/developers/styling/content.md) rather than patching it on the screen.
28
+
29
+ ## Testing
30
+
31
+ Test each screen with the screen reader on every platform you ship: VoiceOver on iOS, TalkBack on Android, and a desktop screen reader with keyboard-only navigation on the web. Automated checks such as axe catch missing names and roles but not whether an announcement makes sense.