@proyecto-viviana/ui 0.6.1 → 0.6.3

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 (301) hide show
  1. package/README.md +14 -16
  2. package/dist/_chunk/LinkButton.js +9 -9
  3. package/dist/_chunk/LinkButton.js.map +1 -1
  4. package/dist/_chunk/LinkButton.jsx +9 -9
  5. package/dist/_chunk/LinkButton.jsx.map +1 -1
  6. package/dist/_chunk/RangeCalendar.js +7 -7
  7. package/dist/_chunk/RangeCalendar.js.map +1 -1
  8. package/dist/_chunk/RangeCalendar.jsx +7 -7
  9. package/dist/_chunk/RangeCalendar.jsx.map +1 -1
  10. package/dist/_chunk/Tabs.js +2 -2
  11. package/dist/_chunk/Tabs.jsx +2 -2
  12. package/dist/_chunk/breadcrumbs.js +2 -2
  13. package/dist/_chunk/breadcrumbs.js.map +1 -1
  14. package/dist/_chunk/breadcrumbs.jsx +2 -2
  15. package/dist/_chunk/breadcrumbs.jsx.map +1 -1
  16. package/dist/_chunk/button.js +3 -3
  17. package/dist/_chunk/button.jsx +3 -3
  18. package/dist/_chunk/color.js +4 -4
  19. package/dist/_chunk/color.jsx +4 -4
  20. package/dist/_chunk/form.js +5 -7
  21. package/dist/_chunk/form.js.map +1 -1
  22. package/dist/_chunk/form.jsx +5 -8
  23. package/dist/_chunk/form.jsx.map +1 -1
  24. package/dist/_chunk/layout.js +5 -1
  25. package/dist/_chunk/layout.js.map +1 -1
  26. package/dist/_chunk/layout.jsx +5 -1
  27. package/dist/_chunk/layout.jsx.map +1 -1
  28. package/dist/_chunk/list.js +4 -4
  29. package/dist/_chunk/list.jsx +4 -4
  30. package/dist/_chunk/menu.js +1 -1
  31. package/dist/_chunk/menu.js.map +1 -1
  32. package/dist/_chunk/menu.jsx +1 -1
  33. package/dist/_chunk/menu.jsx.map +1 -1
  34. package/dist/_chunk/numberfield.js +2 -2
  35. package/dist/_chunk/numberfield.jsx +2 -2
  36. package/dist/_chunk/s2-action-button-styles.js +8 -8
  37. package/dist/_chunk/s2-action-button-styles.js.map +1 -1
  38. package/dist/_chunk/s2-action-button-styles.jsx +8 -8
  39. package/dist/_chunk/s2-action-button-styles.jsx.map +1 -1
  40. package/dist/_chunk/s2-menu-styles.js +1 -1
  41. package/dist/_chunk/s2-menu-styles.jsx +1 -1
  42. package/dist/_chunk/slider.js +6 -6
  43. package/dist/_chunk/slider.jsx +6 -6
  44. package/dist/_chunk/switch.js +2 -2
  45. package/dist/_chunk/switch.jsx +2 -2
  46. package/dist/_chunk/table.js +3 -3
  47. package/dist/_chunk/table.js.map +1 -1
  48. package/dist/_chunk/table.jsx +3 -3
  49. package/dist/_chunk/table.jsx.map +1 -1
  50. package/dist/_chunk/text.js +1 -1
  51. package/dist/_chunk/text.jsx +1 -1
  52. package/dist/_chunk/textfield.js +4 -4
  53. package/dist/_chunk/textfield.jsx +4 -4
  54. package/dist/_chunk/toast.js +3 -3
  55. package/dist/_chunk/toast.jsx +3 -3
  56. package/dist/actiongroup/index.js +2 -2
  57. package/dist/actiongroup/index.jsx +2 -2
  58. package/dist/badge/index.js +6 -6
  59. package/dist/badge/index.jsx +6 -6
  60. package/dist/breadcrumbs/index.d.ts.map +1 -1
  61. package/dist/calendar/DateField.d.ts.map +1 -1
  62. package/dist/calendar/DateField.js +2 -2
  63. package/dist/calendar/DateField.js.map +1 -1
  64. package/dist/calendar/DateField.jsx +2 -2
  65. package/dist/calendar/DateField.jsx.map +1 -1
  66. package/dist/calendar/DatePicker.d.ts.map +1 -1
  67. package/dist/calendar/DatePicker.js +2 -2
  68. package/dist/calendar/DatePicker.js.map +1 -1
  69. package/dist/calendar/DatePicker.jsx +2 -2
  70. package/dist/calendar/DatePicker.jsx.map +1 -1
  71. package/dist/calendar/DateRangePicker.js +2 -2
  72. package/dist/calendar/DateRangePicker.jsx +2 -2
  73. package/dist/calendar/RangeCalendar.d.ts.map +1 -1
  74. package/dist/calendar/TimeField.d.ts.map +1 -1
  75. package/dist/calendar/TimeField.js +2 -2
  76. package/dist/calendar/TimeField.js.map +1 -1
  77. package/dist/calendar/TimeField.jsx +2 -2
  78. package/dist/calendar/TimeField.jsx.map +1 -1
  79. package/dist/calendar/index.js +5 -5
  80. package/dist/calendar/index.js.map +1 -1
  81. package/dist/calendar/index.jsx +5 -5
  82. package/dist/calendar/index.jsx.map +1 -1
  83. package/dist/checkbox/index.js +3 -3
  84. package/dist/checkbox/index.jsx +3 -3
  85. package/dist/combobox/index.js +2 -2
  86. package/dist/combobox/index.jsx +2 -2
  87. package/dist/dropzone/index.js +1 -1
  88. package/dist/dropzone/index.jsx +1 -1
  89. package/dist/font-faces.css +13 -6
  90. package/dist/form/index.d.ts.map +1 -1
  91. package/dist/icon/pixel-icons/PixelChartIcon.d.ts.map +1 -1
  92. package/dist/icon/pixel-icons/PixelChartIcon.js.map +1 -1
  93. package/dist/icon/pixel-icons/PixelChartIcon.jsx.map +1 -1
  94. package/dist/icon/pixel-icons/PixelCheckIcon.d.ts.map +1 -1
  95. package/dist/icon/pixel-icons/PixelCheckIcon.js.map +1 -1
  96. package/dist/icon/pixel-icons/PixelCheckIcon.jsx.map +1 -1
  97. package/dist/icon/pixel-icons/PixelChevronDownIcon.d.ts.map +1 -1
  98. package/dist/icon/pixel-icons/PixelChevronDownIcon.js.map +1 -1
  99. package/dist/icon/pixel-icons/PixelChevronDownIcon.jsx.map +1 -1
  100. package/dist/icon/pixel-icons/PixelChevronRightIcon.d.ts.map +1 -1
  101. package/dist/icon/pixel-icons/PixelChevronRightIcon.js.map +1 -1
  102. package/dist/icon/pixel-icons/PixelChevronRightIcon.jsx.map +1 -1
  103. package/dist/icon/pixel-icons/PixelClockIcon.d.ts.map +1 -1
  104. package/dist/icon/pixel-icons/PixelClockIcon.js.map +1 -1
  105. package/dist/icon/pixel-icons/PixelClockIcon.jsx.map +1 -1
  106. package/dist/icon/pixel-icons/PixelCodeIcon.d.ts.map +1 -1
  107. package/dist/icon/pixel-icons/PixelCodeIcon.js.map +1 -1
  108. package/dist/icon/pixel-icons/PixelCodeIcon.jsx.map +1 -1
  109. package/dist/icon/pixel-icons/PixelCommunityIcon.d.ts.map +1 -1
  110. package/dist/icon/pixel-icons/PixelCommunityIcon.js.map +1 -1
  111. package/dist/icon/pixel-icons/PixelCommunityIcon.jsx.map +1 -1
  112. package/dist/icon/pixel-icons/PixelCubeIcon.d.ts.map +1 -1
  113. package/dist/icon/pixel-icons/PixelCubeIcon.js.map +1 -1
  114. package/dist/icon/pixel-icons/PixelCubeIcon.jsx.map +1 -1
  115. package/dist/icon/pixel-icons/PixelFlameIcon.d.ts.map +1 -1
  116. package/dist/icon/pixel-icons/PixelFlameIcon.js.map +1 -1
  117. package/dist/icon/pixel-icons/PixelFlameIcon.jsx.map +1 -1
  118. package/dist/icon/pixel-icons/PixelHomeIcon.d.ts.map +1 -1
  119. package/dist/icon/pixel-icons/PixelHomeIcon.js.map +1 -1
  120. package/dist/icon/pixel-icons/PixelHomeIcon.jsx.map +1 -1
  121. package/dist/icon/pixel-icons/PixelLayoutIcon.d.ts.map +1 -1
  122. package/dist/icon/pixel-icons/PixelLayoutIcon.js.map +1 -1
  123. package/dist/icon/pixel-icons/PixelLayoutIcon.jsx.map +1 -1
  124. package/dist/icon/pixel-icons/PixelMessageIcon.d.ts.map +1 -1
  125. package/dist/icon/pixel-icons/PixelMessageIcon.js.map +1 -1
  126. package/dist/icon/pixel-icons/PixelMessageIcon.jsx.map +1 -1
  127. package/dist/icon/pixel-icons/PixelNavCommunityIcon.d.ts.map +1 -1
  128. package/dist/icon/pixel-icons/PixelNavCommunityIcon.js.map +1 -1
  129. package/dist/icon/pixel-icons/PixelNavCommunityIcon.jsx.map +1 -1
  130. package/dist/icon/pixel-icons/PixelNavExploreIcon.d.ts.map +1 -1
  131. package/dist/icon/pixel-icons/PixelNavExploreIcon.js.map +1 -1
  132. package/dist/icon/pixel-icons/PixelNavExploreIcon.jsx.map +1 -1
  133. package/dist/icon/pixel-icons/PixelNavLiveIcon.d.ts.map +1 -1
  134. package/dist/icon/pixel-icons/PixelNavLiveIcon.js.map +1 -1
  135. package/dist/icon/pixel-icons/PixelNavLiveIcon.jsx.map +1 -1
  136. package/dist/icon/pixel-icons/PixelNavPathwaysIcon.d.ts.map +1 -1
  137. package/dist/icon/pixel-icons/PixelNavPathwaysIcon.js.map +1 -1
  138. package/dist/icon/pixel-icons/PixelNavPathwaysIcon.jsx.map +1 -1
  139. package/dist/icon/pixel-icons/PixelNavPlaygroundIcon.d.ts.map +1 -1
  140. package/dist/icon/pixel-icons/PixelNavPlaygroundIcon.js.map +1 -1
  141. package/dist/icon/pixel-icons/PixelNavPlaygroundIcon.jsx.map +1 -1
  142. package/dist/icon/pixel-icons/PixelNavProjectsIcon.d.ts.map +1 -1
  143. package/dist/icon/pixel-icons/PixelNavProjectsIcon.js.map +1 -1
  144. package/dist/icon/pixel-icons/PixelNavProjectsIcon.jsx.map +1 -1
  145. package/dist/icon/pixel-icons/PixelNavReferenceIcon.d.ts.map +1 -1
  146. package/dist/icon/pixel-icons/PixelNavReferenceIcon.js.map +1 -1
  147. package/dist/icon/pixel-icons/PixelNavReferenceIcon.jsx.map +1 -1
  148. package/dist/icon/pixel-icons/PixelNavSettingsIcon.d.ts.map +1 -1
  149. package/dist/icon/pixel-icons/PixelNavSettingsIcon.js.map +1 -1
  150. package/dist/icon/pixel-icons/PixelNavSettingsIcon.jsx.map +1 -1
  151. package/dist/icon/pixel-icons/PixelNavTopicsIcon.d.ts.map +1 -1
  152. package/dist/icon/pixel-icons/PixelNavTopicsIcon.js.map +1 -1
  153. package/dist/icon/pixel-icons/PixelNavTopicsIcon.jsx.map +1 -1
  154. package/dist/icon/pixel-icons/PixelNotificationIcon.d.ts.map +1 -1
  155. package/dist/icon/pixel-icons/PixelNotificationIcon.js.map +1 -1
  156. package/dist/icon/pixel-icons/PixelNotificationIcon.jsx.map +1 -1
  157. package/dist/icon/pixel-icons/PixelPathwaysIcon.d.ts.map +1 -1
  158. package/dist/icon/pixel-icons/PixelPathwaysIcon.js.map +1 -1
  159. package/dist/icon/pixel-icons/PixelPathwaysIcon.jsx.map +1 -1
  160. package/dist/icon/pixel-icons/PixelPlayIcon.d.ts.map +1 -1
  161. package/dist/icon/pixel-icons/PixelPlayIcon.js.map +1 -1
  162. package/dist/icon/pixel-icons/PixelPlayIcon.jsx.map +1 -1
  163. package/dist/icon/pixel-icons/PixelSearchIcon.d.ts.map +1 -1
  164. package/dist/icon/pixel-icons/PixelSearchIcon.js.map +1 -1
  165. package/dist/icon/pixel-icons/PixelSearchIcon.jsx.map +1 -1
  166. package/dist/icon/pixel-icons/PixelSettingsIcon.d.ts.map +1 -1
  167. package/dist/icon/pixel-icons/PixelSettingsIcon.js.map +1 -1
  168. package/dist/icon/pixel-icons/PixelSettingsIcon.jsx.map +1 -1
  169. package/dist/icon/pixel-icons/PixelSparkleIcon.d.ts.map +1 -1
  170. package/dist/icon/pixel-icons/PixelSparkleIcon.js.map +1 -1
  171. package/dist/icon/pixel-icons/PixelSparkleIcon.jsx.map +1 -1
  172. package/dist/icon/pixel-icons/PixelTopicsIcon.d.ts.map +1 -1
  173. package/dist/icon/pixel-icons/PixelTopicsIcon.js.map +1 -1
  174. package/dist/icon/pixel-icons/PixelTopicsIcon.jsx.map +1 -1
  175. package/dist/icon/pixel-icons/PixelUserIcon.d.ts.map +1 -1
  176. package/dist/icon/pixel-icons/PixelUserIcon.js.map +1 -1
  177. package/dist/icon/pixel-icons/PixelUserIcon.jsx.map +1 -1
  178. package/dist/icon/pixel-icons/PixelZapIcon.d.ts.map +1 -1
  179. package/dist/icon/pixel-icons/PixelZapIcon.js.map +1 -1
  180. package/dist/icon/pixel-icons/PixelZapIcon.jsx.map +1 -1
  181. package/dist/inlinealert/index.js +6 -6
  182. package/dist/inlinealert/index.jsx +6 -6
  183. package/dist/labeledvalue/index.js +1 -1
  184. package/dist/labeledvalue/index.jsx +1 -1
  185. package/dist/layout/Flex.d.ts +2 -0
  186. package/dist/layout/Flex.d.ts.map +1 -1
  187. package/dist/link/index.d.ts.map +1 -1
  188. package/dist/link/index.js +1 -4
  189. package/dist/link/index.js.map +1 -1
  190. package/dist/link/index.jsx +1 -4
  191. package/dist/link/index.jsx.map +1 -1
  192. package/dist/listbox/index.js +3 -3
  193. package/dist/listbox/index.jsx +4 -4
  194. package/dist/menu/index.d.ts.map +1 -1
  195. package/dist/meter/index.d.ts.map +1 -1
  196. package/dist/meter/index.js +2 -2
  197. package/dist/meter/index.js.map +1 -1
  198. package/dist/meter/index.jsx +2 -2
  199. package/dist/meter/index.jsx.map +1 -1
  200. package/dist/notificationbadge/index.js +1 -1
  201. package/dist/notificationbadge/index.jsx +1 -1
  202. package/dist/picker/index.js +3 -3
  203. package/dist/picker/index.jsx +3 -3
  204. package/dist/popover/index.js +1 -1
  205. package/dist/popover/index.jsx +1 -1
  206. package/dist/progress/ProgressCircle.js +2 -2
  207. package/dist/progress/ProgressCircle.js.map +1 -1
  208. package/dist/progress/ProgressCircle.jsx +2 -2
  209. package/dist/progress/ProgressCircle.jsx.map +1 -1
  210. package/dist/progress-bar/index.js +4 -4
  211. package/dist/progress-bar/index.jsx +4 -4
  212. package/dist/radio/index.js +2 -2
  213. package/dist/radio/index.jsx +2 -2
  214. package/dist/searchfield/index.js +2 -2
  215. package/dist/searchfield/index.jsx +2 -2
  216. package/dist/segmentedcontrol/index.js +2 -5
  217. package/dist/segmentedcontrol/index.js.map +1 -1
  218. package/dist/segmentedcontrol/index.jsx +2 -5
  219. package/dist/segmentedcontrol/index.jsx.map +1 -1
  220. package/dist/select/index.js +3 -3
  221. package/dist/select/index.jsx +3 -3
  222. package/dist/selectboxgroup/index.js +1 -1
  223. package/dist/selectboxgroup/index.jsx +1 -1
  224. package/dist/statuslight/index.js +1 -1
  225. package/dist/statuslight/index.jsx +1 -1
  226. package/dist/steplist/index.js +5 -5
  227. package/dist/steplist/index.jsx +5 -5
  228. package/dist/style/glasselated-ramps.d.ts.map +1 -1
  229. package/dist/style/index.js +18 -9
  230. package/dist/style/index.js.map +1 -1
  231. package/dist/style/spectrum-theme.d.ts +7 -7
  232. package/dist/style/spectrum-theme.d.ts.map +1 -1
  233. package/dist/styles.css +1 -1
  234. package/dist/table/index.d.ts.map +1 -1
  235. package/dist/tag-group/index.js +10 -10
  236. package/dist/tag-group/index.js.map +1 -1
  237. package/dist/tag-group/index.jsx +10 -10
  238. package/dist/tag-group/index.jsx.map +1 -1
  239. package/dist/toolbar/index.d.ts.map +1 -1
  240. package/dist/toolbar/index.js.map +1 -1
  241. package/dist/toolbar/index.jsx.map +1 -1
  242. package/dist/tree/index.d.ts.map +1 -1
  243. package/dist/tree/index.js +5 -5
  244. package/dist/tree/index.js.map +1 -1
  245. package/dist/tree/index.jsx +5 -5
  246. package/dist/tree/index.jsx.map +1 -1
  247. package/dist/viviana-tokens.css +39 -12
  248. package/package.json +18 -5
  249. package/src/breadcrumbs/index.tsx +14 -7
  250. package/src/button/s2-action-button-styles.ts +8 -8
  251. package/src/button/s2-button-styles.ts +8 -8
  252. package/src/calendar/DateField.tsx +2 -6
  253. package/src/calendar/DatePicker.tsx +8 -1
  254. package/src/calendar/RangeCalendar.tsx +13 -7
  255. package/src/calendar/TimeField.tsx +2 -6
  256. package/src/calendar/index.tsx +4 -4
  257. package/src/font-faces.css +13 -6
  258. package/src/form/index.tsx +5 -6
  259. package/src/icon/pixel-icons/PixelChartIcon.tsx +4 -1
  260. package/src/icon/pixel-icons/PixelCheckIcon.tsx +4 -1
  261. package/src/icon/pixel-icons/PixelChevronDownIcon.tsx +4 -1
  262. package/src/icon/pixel-icons/PixelChevronRightIcon.tsx +4 -1
  263. package/src/icon/pixel-icons/PixelClockIcon.tsx +4 -1
  264. package/src/icon/pixel-icons/PixelCodeIcon.tsx +4 -1
  265. package/src/icon/pixel-icons/PixelCommunityIcon.tsx +4 -1
  266. package/src/icon/pixel-icons/PixelCubeIcon.tsx +4 -1
  267. package/src/icon/pixel-icons/PixelFlameIcon.tsx +4 -1
  268. package/src/icon/pixel-icons/PixelHomeIcon.tsx +4 -1
  269. package/src/icon/pixel-icons/PixelLayoutIcon.tsx +4 -1
  270. package/src/icon/pixel-icons/PixelMessageIcon.tsx +4 -1
  271. package/src/icon/pixel-icons/PixelNavCommunityIcon.tsx +4 -1
  272. package/src/icon/pixel-icons/PixelNavExploreIcon.tsx +4 -1
  273. package/src/icon/pixel-icons/PixelNavLiveIcon.tsx +4 -1
  274. package/src/icon/pixel-icons/PixelNavPathwaysIcon.tsx +4 -1
  275. package/src/icon/pixel-icons/PixelNavPlaygroundIcon.tsx +4 -1
  276. package/src/icon/pixel-icons/PixelNavProjectsIcon.tsx +4 -1
  277. package/src/icon/pixel-icons/PixelNavReferenceIcon.tsx +4 -1
  278. package/src/icon/pixel-icons/PixelNavSettingsIcon.tsx +4 -1
  279. package/src/icon/pixel-icons/PixelNavTopicsIcon.tsx +4 -1
  280. package/src/icon/pixel-icons/PixelNotificationIcon.tsx +4 -1
  281. package/src/icon/pixel-icons/PixelPathwaysIcon.tsx +4 -1
  282. package/src/icon/pixel-icons/PixelPlayIcon.tsx +4 -1
  283. package/src/icon/pixel-icons/PixelSearchIcon.tsx +4 -1
  284. package/src/icon/pixel-icons/PixelSettingsIcon.tsx +4 -1
  285. package/src/icon/pixel-icons/PixelSparkleIcon.tsx +4 -1
  286. package/src/icon/pixel-icons/PixelTopicsIcon.tsx +4 -1
  287. package/src/icon/pixel-icons/PixelUserIcon.tsx +4 -1
  288. package/src/icon/pixel-icons/PixelZapIcon.tsx +4 -1
  289. package/src/layout/Flex.tsx +7 -0
  290. package/src/link/index.tsx +3 -1
  291. package/src/menu/index.tsx +1 -3
  292. package/src/meter/index.tsx +1 -3
  293. package/src/progress/ProgressCircle.tsx +1 -1
  294. package/src/segmentedcontrol/index.tsx +6 -6
  295. package/src/style/glasselated-ramps.ts +37 -33
  296. package/src/style/spectrum-theme.ts +22 -17
  297. package/src/table/index.tsx +1 -3
  298. package/src/tag-group/index.tsx +8 -8
  299. package/src/toolbar/index.tsx +4 -1
  300. package/src/tree/index.tsx +3 -11
  301. package/src/viviana-tokens.css +39 -12
@@ -17,18 +17,13 @@
17
17
  * monotonicity and was still the wrong palette, because nothing had checked the anchors
18
18
  * against the island. The island is the source of truth.
19
19
  *
20
- * ACCESSIBILITY. Components fill semantic backgrounds via lightDark("<ramp>-900",
21
- * "<ramp>-700") with white ink (calendar/RangeCalendar.tsx:373, radio/index.tsx:284,
22
- * menu/s2-menu-styles.ts:257). Those two stops per ramp are pinned to >= 4.5:1 against
23
- * white — EXCEPT blue, where 900 is re-pinned to the brand `--accent-primary` #2e90fa
24
- * in BOTH columns (see the blue ramp note: the darkened #1474e4/#338cfe stops of an
25
- * earlier revision put the entire accent-coloured population one rung off register).
26
- * White ink on the light accent fill is therefore ~3.2:1, the 3:1 large-text/graphical
27
- * floor only — which is exactly how the island spends it (primary button, white 13px/600,
28
- * glasselated.css:1361-1370; white icon masks, :808-810). It never sets body-size white
29
- * text on the light accent fill; a component needing readable text on a selected surface
30
- * takes the raised-pill idiom instead (TabSwitch, switch/index.tsx) or the soft accent
31
- * pill (`--accent-primary-soft` + blue ink, `.glx-btn-soft` glasselated.css:1382-1392).
20
+ * ACCESSIBILITY. Semantic fills with white text are pinned to >= 4.5:1. Blue is the
21
+ * exception at the ramp level: accent-900 remains the brand `--accent-primary` #2e90fa
22
+ * in both columns for decorative marks, where it only needs the 3:1 non-text floor.
23
+ * Text-bearing accent surfaces use the standalone `interactive-fill` token below
24
+ * (#135fc0 / #3670ae), matching `--interactive-fill` in viviana-tokens.css. Keeping
25
+ * decoration and readable fill as separate semantic roles prevents a contrast repair
26
+ * from moving every focus ring, indicator, and glow off the published brand accent.
32
27
  *
33
28
  * Two invariants to hold when editing:
34
29
  * - Emit EVERY stop of a ramp. A missing stop silently keeps the Adobe value.
@@ -77,18 +72,21 @@ const RAMPS: Record<string, Ramp> = {
77
72
  * the island has no token beyond it in either direction.
78
73
  *
79
74
  * 500 IS THE SECONDARY INK STOP, by the same logic one rung quieter: it is pinned to
80
- * `--text-secondary`, `--slate-500` #64748b in light (:34,43) and the hardcoded neutral
81
- * #9aa0a8 in dark (:171). Note dark `--text-secondary` is NOT dark `--slate-500` (#97a1ab,
82
- * :218) — the island de-tints its dark ink away from the slate ramp exactly as it does at
83
- * 800, so following slate here would miss by the same small margin it missed by at 800.
75
+ * `--text-secondary` in viviana-tokens.css, in NEITHER column to `--slate-500`. Dark never
76
+ * was — the island de-tints its dark ink away from the slate ramp (#97a1ab) exactly as it
77
+ * does at 800 — and light no longer is either: `--slate-500` #64748b reads 3.67-4.38:1 on
78
+ * our light surfaces, so both `--text-secondary` and this stop step one notch darker to
79
+ * #556478 (4.65:1 at worst) and dark lifts #9aa0a8 -> #a0a6ae (4.36 -> 4.68:1 on
80
+ * `--surface-raised`, the binding surface in dark). The palette rungs themselves are
81
+ * untouched; what moved is an ink role, and the two files must move together.
84
82
  * `neutral-subdued-content-color-default` is repointed onto this stop in spectrum-theme.ts;
85
83
  * Adobe resolves it to gray-700, which paints field labels, unselected tab and segment
86
84
  * labels, slider labels and breadcrumbs two rungs too heavy (61 elements, both schemes).
87
85
  *
88
- * Light 300/400/500 were #c5d0de/#93a3b8/#63748b — each exactly one off the island's
89
- * #c4d0de/#94a3b8/#64748b in the red channel. That is a round-trip through OKLCh, not a
90
- * transcription; the values are now copied from the declarations. Read these off the CSS,
91
- * never recompute them: a one-digit drift still fails an equality check against the token.
86
+ * Light 300/400 were #c5d0de/#93a3b8 — each exactly one off the island's #c4d0de/#94a3b8
87
+ * in the red channel. That is a round-trip through OKLCh, not a transcription; the values
88
+ * are now copied from the declarations. Read every anchored stop off the CSS, never
89
+ * recompute it: a one-digit drift still fails an equality check against the token.
92
90
  *
93
91
  * The dark 800->900->1000 gaps are ~0.018 OKLCh L, just under the >= 0.02 this file asks
94
92
  * for below. That is a ceiling, not a choice: the dark ink is already at L 0.964 and 1000
@@ -111,7 +109,7 @@ const RAMPS: Record<string, Ramp> = {
111
109
  200: ["#dbe3ed", "#555c64"],
112
110
  300: ["#c4d0de", "#67717d"],
113
111
  400: ["#94a3b8", "#7c8794"],
114
- 500: ["#64748b", "#9aa0a8"],
112
+ 500: ["#556478", "#a0a6ae"],
115
113
  600: ["#465569", "#a8b2c0"],
116
114
  700: ["#33455c", "#b9c4d6"],
117
115
  800: ["#17212e", "#f2f3f5"],
@@ -132,13 +130,18 @@ const RAMPS: Record<string, Ramp> = {
132
130
  * single largest off-register cluster in both schemes was accent-coloured (24 light
133
131
  * elements, 15 dark).
134
132
  *
135
- * 700's DARK column is the interactive FILL, which is the one accent value the island
136
- * does split by scheme: `--interactive-fill` is `var(--accent-primary)` in light (:83)
137
- * but the quieter #407fc1 in dark (:200). That split is exactly what Adobe's
138
- * `lightDark("accent-900", "accent-700")` idiom expresses — light takes the accent,
139
- * dark steps down — so the idiom stays and only the value it lands on moves. A filled
140
- * accent button in dark is a large area of colour; the island damps it and leaves the
141
- * small accent marks at full strength.
133
+ * 700's DARK column remains #3670ae because it was the historical landing point for
134
+ * interactive fills. The actual semantic fill is now explicit below rather than
135
+ * encoded as a cross-scheme ramp pair: #135fc0 in light and #3670ae in dark. A filled
136
+ * accent button is a large area of colour; the island damps it and leaves the small
137
+ * accent marks at full strength.
138
+ *
139
+ * The damped fill carries white label text, so it answers to 4.5:1 with white. The
140
+ * island's #407fc1 gave 4.18:1; this column is #3670ae (5.14:1), and viviana-tokens.css
141
+ * moves `--interactive-fill` to the same hex — the two are one value in two files.
142
+ * That also repairs a gap this ramp's own rule forbade: #407fc1 sat 0.009 OKLCh L below
143
+ * 800, so `nextColorStop`'s hover step off the dark fill was invisible; #3670ae restores
144
+ * it to 0.051/0.058 either side.
142
145
  *
143
146
  * Nothing else here is pinned. The island publishes no accent hover, so 800 (dark
144
147
  * hover, one step brighter than the damped fill) and 1000 (light hover, one step
@@ -151,7 +154,7 @@ const RAMPS: Record<string, Ramp> = {
151
154
  400: ["#bfd9fe", "#2d415d"],
152
155
  500: ["#9cc4fc", "#2f507f"],
153
156
  600: ["#7bb0fa", "#2e5fa1"],
154
- 700: ["#5c9ff9", "#407fc1"],
157
+ 700: ["#5c9ff9", "#3670ae"],
155
158
  800: ["#398dfa", "#267ce7"],
156
159
  900: ["#2e90fa", "#2e90fa"],
157
160
  1000: ["#0e64c8", "#569eff"],
@@ -294,15 +297,16 @@ const SEMANTIC_OVERRIDES: Record<string, Ramp> = {
294
297
  notice: RAMPS.amber,
295
298
  };
296
299
 
297
- /* The create-yellow CTA (`--accent-create-*`). Deliberately NOT a ramp: the island declares
298
- * exactly three values per scheme and they do not sit on the amber trajectory — this is a
299
- * pale wash with dark ink, where amber-900 is a saturated fill with white ink. Modelling it
300
- * as a 16-stop ramp would invent thirteen colours nobody asked for.
300
+ /* Standalone semantic colours with no honest ramp. The create-yellow CTA
301
+ * (`--accent-create-*`) declares exactly three values per scheme and does not sit on the
302
+ * amber trajectory. `interactive-fill` is likewise a role rather than a blue stop: it is
303
+ * the AA-safe fill under white text, while accent-900 remains the decorative brand blue.
301
304
  *
302
305
  * Spread into `baseColors` alongside the ramps, so `backgroundColor: "create-bg"` resolves
303
306
  * like any other token. Hover/press cannot use `nextColorStop` here (no adjacent stop
304
307
  * exists), so the button styles name the border colour explicitly for those states. */
305
308
  export const glasselatedCreateColors: Record<string, ColorToken> = {
309
+ "interactive-fill": { type: "color", light: "#135fc0", dark: "#3670ae" },
306
310
  "create-bg": { type: "color", light: "#ffedb0", dark: "#ffde81" },
307
311
  "create-border": { type: "color", light: "#f5d88a", dark: "#ffde81" },
308
312
  "create-ink": { type: "color", light: "#7a5600", dark: "#3a2e00" },
@@ -104,7 +104,12 @@ type ColorScale =
104
104
  | "amber"
105
105
  | "violet";
106
106
  /** Brand colours with no Spectrum equivalent and no ramp — see glasselatedCreateColors. */
107
- type VivianaColor = "create-bg" | "create-bg-deep" | "create-border" | "create-ink";
107
+ type VivianaColor =
108
+ | "interactive-fill"
109
+ | "create-bg"
110
+ | "create-bg-deep"
111
+ | "create-border"
112
+ | "create-ink";
108
113
  type TransparentScale = "transparent-white" | "transparent-black" | "transparent-overlay";
109
114
  type HighContrastColor =
110
115
  | "Background"
@@ -877,29 +882,29 @@ export const style = createTheme({
877
882
  }),
878
883
  backgroundColor: new SpectrumColorProperty("backgroundColor", {
879
884
  ...baseColors,
880
- /* Viviana UI v2 (Glasselated): the filled accent SURFACE, which the island names
881
- * `--interactive-fill` — and it is the one accent value the register splits by
882
- * scheme: `var(--accent-primary)` #2e90fa in light (design-handoff-v2.css:83) but
883
- * the damped #407fc1 in dark (:200). A filled accent area is large; the island
884
- * quiets it in dark and leaves the small accent marks (slider fills, checkmarks,
885
- * tab indicators, links) at full strength on accent-900.
886
- *
887
- * That split is exactly the `lightDark("accent-900", "accent-700")` pair that
888
- * Button, ActionButton and Tag already declare for their emphasized-selected
889
- * fills. Repointed here so the components that reach for the SEMANTIC instead of
890
- * the pair — Badge's bold fill, chiefly — land on the same value rather than on
891
- * Adobe's accent-800 (5 elements adrift in dark). Adobe's own resolution stepped
892
- * light and dark independently down its inverted ramp; ours doesn't invert. */
893
- accent: { type: "ref", light: "accent-900", dark: "accent-700" },
885
+ /* Viviana UI v2 (Glasselated): text-bearing accent surfaces use the explicit
886
+ * `interactive-fill` semantic (#135fc0 / #3670ae), which clears 4.5:1 under white
887
+ * in both schemes. `accent-900` remains #2e90fa for decorative marks, rings, and
888
+ * indicators that answer to the 3:1 non-text floor. Keeping the roles separate
889
+ * also puts Badge's semantic bold fill on the same contract as Button, Calendar,
890
+ * and Tag rather than encoding the role as a cross-scheme ramp pair. */
891
+ accent: baseColors["interactive-fill"],
894
892
  "accent-subtle": weirdColorToken("accent-subtle-background-color-default"),
895
893
  neutral: colorToken("neutral-background-color-default"),
896
894
  "neutral-subdued": weirdColorToken("neutral-subdued-background-color-default"),
897
895
  "neutral-subtle": weirdColorToken("neutral-subtle-background-color-default"),
898
- negative: weirdColorToken("negative-background-color-default"),
896
+ /* Same repoint as `accent` above, for the same reason and by the same pair. Adobe
897
+ * resolves these two semantics onto the -800 stop of their ramp, which in our
898
+ * register is #e0332a / #208e4d in dark — 4.49:1 and 4.17:1 under the white ink
899
+ * Badge, Toast and InlineAlert paint on their bold fills, i.e. a hair and a wide
900
+ * margin under AA respectively. The `lightDark(-900, -700)` pair clears it in both
901
+ * schemes (negative 4.74/5.52, positive 4.80/5.17) and keeps the three components
902
+ * on one value. */
903
+ negative: { type: "ref", light: "negative-900", dark: "negative-700" },
899
904
  "negative-subtle": weirdColorToken("negative-subtle-background-color-default"),
900
905
  informative: weirdColorToken("informative-background-color-default"),
901
906
  "informative-subtle": weirdColorToken("informative-subtle-background-color-default"),
902
- positive: weirdColorToken("positive-background-color-default"),
907
+ positive: { type: "ref", light: "positive-900", dark: "positive-700" },
903
908
  "positive-subtle": weirdColorToken("positive-subtle-background-color-default"),
904
909
  notice: weirdColorToken("notice-background-color-default"),
905
910
  "notice-subtle": weirdColorToken("notice-subtle-background-color-default"),
@@ -1964,9 +1964,7 @@ export function TableSelectionCheckbox(props: {
1964
1964
  isDisabled: !!props.isDisabled,
1965
1965
  })}
1966
1966
  >
1967
- {props.isSelected ? (
1968
- <Checkmark size="XS" class={selectionCheckboxIcon} />
1969
- ) : null}
1967
+ {props.isSelected ? <Checkmark size="XS" class={selectionCheckboxIcon} /> : null}
1970
1968
  </span>
1971
1969
  </span>
1972
1970
  {renderProps.isFocusVisible ? <CellFocusRing /> : null}
@@ -231,10 +231,10 @@ const tagStyle = style<TagGroupStyleProps>({
231
231
  isSelected: {
232
232
  default: baseColor("neutral"),
233
233
  isEmphasized: {
234
- default: lightDark("accent-900", "accent-700"),
235
- isHovered: lightDark("accent-1000", "accent-800"),
236
- isPressed: lightDark("accent-1000", "accent-800"),
237
- isFocusVisible: lightDark("accent-1000", "accent-800"),
234
+ default: "interactive-fill",
235
+ isHovered: lightDark("accent-1000", "accent-600"),
236
+ isPressed: lightDark("accent-1000", "accent-600"),
237
+ isFocusVisible: lightDark("accent-1000", "accent-600"),
238
238
  },
239
239
  },
240
240
  isDisabled: "disabled",
@@ -298,10 +298,10 @@ const tagStyle = style<TagGroupStyleProps>({
298
298
  isSelected: {
299
299
  default: baseColor("gray-800"),
300
300
  isEmphasized: {
301
- default: lightDark("accent-900", "accent-700"),
302
- isHovered: lightDark("accent-1000", "accent-800"),
303
- isPressed: lightDark("accent-1000", "accent-800"),
304
- isFocusVisible: lightDark("accent-1000", "accent-800"),
301
+ default: "interactive-fill",
302
+ isHovered: lightDark("accent-1000", "accent-600"),
303
+ isPressed: lightDark("accent-1000", "accent-600"),
304
+ isFocusVisible: lightDark("accent-1000", "accent-600"),
305
305
  },
306
306
  },
307
307
  isDisabled: "disabled",
@@ -51,7 +51,10 @@ export function Toolbar(props: ToolbarProps): JSX.Element {
51
51
 
52
52
  const mergedClass = (rp: ToolbarRenderProps): string => {
53
53
  const cls = local.class;
54
- return [toolbarStyles({ orientation: rp.orientation }), typeof cls === "function" ? cls(rp) : cls]
54
+ return [
55
+ toolbarStyles({ orientation: rp.orientation }),
56
+ typeof cls === "function" ? cls(rp) : cls,
57
+ ]
55
58
  .filter(Boolean)
56
59
  .join(" ");
57
60
  };
@@ -1179,10 +1179,7 @@ export function TreeExpandButton(
1179
1179
  return typeof rawChildren === "function"
1180
1180
  ? rawChildren(renderState())
1181
1181
  : (rawChildren ?? (
1182
- <Chevron
1183
- size="S"
1184
- class={treeExpandIcon({ ...renderState(), isExpanded: false })}
1185
- />
1182
+ <Chevron size="S" class={treeExpandIcon({ ...renderState(), isExpanded: false })} />
1186
1183
  ));
1187
1184
  })()}
1188
1185
  </button>
@@ -1198,10 +1195,7 @@ export function TreeExpandButton(
1198
1195
  >
1199
1196
  {local.children ??
1200
1197
  (({ isExpanded }: { isExpanded: boolean }) => (
1201
- <Chevron
1202
- size="S"
1203
- class={treeExpandIcon({ ...renderState(), isExpanded })}
1204
- />
1198
+ <Chevron size="S" class={treeExpandIcon({ ...renderState(), isExpanded })} />
1205
1199
  ))}
1206
1200
  </HeadlessTreeExpandButton>
1207
1201
  );
@@ -1243,9 +1237,7 @@ export function TreeSelectionCheckbox(props: {
1243
1237
  aria-label={props["aria-label"] ?? "Select"}
1244
1238
  />
1245
1239
  <span class={treeCheckboxBox(renderProps())}>
1246
- {renderProps().isSelected ? (
1247
- <Checkmark size="XS" class={treeCheckboxIcon} />
1248
- ) : null}
1240
+ {renderProps().isSelected ? <Checkmark size="XS" class={treeCheckboxIcon} /> : null}
1249
1241
  </span>
1250
1242
  </span>
1251
1243
  );
@@ -228,7 +228,8 @@
228
228
  * Keep both in step with the `edgeGlassShadow` / `edgeGlassSurfaceShadow`
229
229
  * fallbacks in style/spectrum-theme.ts. */
230
230
  --edge-glass: inset 0 1px 0 rgba(255, 255, 255, 0.9), inset 0 0 0 1px rgba(255, 255, 255, 0.35);
231
- --edge-glass-surface: inset 0 1px 0 rgba(255, 255, 255, 0.45), inset 0 0 0 1px rgba(255, 255, 255, 0.09);
231
+ --edge-glass-surface:
232
+ inset 0 1px 0 rgba(255, 255, 255, 0.45), inset 0 0 0 1px rgba(255, 255, 255, 0.09);
232
233
 
233
234
  /* ── Shadow + glow family (glow follows the accent, never the chrome) ── */
234
235
  --shadow-card: 0 2px 8px rgba(0, 0, 0, 0.35), 0 8px 24px rgba(0, 0, 0, 0.4);
@@ -270,11 +271,15 @@
270
271
  --slate-100: rgba(255, 255, 255, 0.06);
271
272
  --white: #ffffff;
272
273
 
273
- /* Text */
274
+ /* Text — see the light block for why the two ink roles below are pinned to
275
+ WCAG AA rather than to a ramp rung. Dark's binding surface is the opaque
276
+ `--surface-raised` #333a44, not the near-black app background: #9aa0a8 read
277
+ 7.4:1 on the app and 4.36:1 there, and #55a6f6 4.47:1. Both now clear 4.5:1
278
+ on the raised panel and sit comfortably above 6:1 everywhere else. */
274
279
  --text-primary: #f2f3f5;
275
- --text-secondary: #9aa0a8;
280
+ --text-secondary: #a0a6ae;
276
281
  --text-tertiary: #6e747c;
277
- --text-link: #55a6f6;
282
+ --text-link: #5faaf7;
278
283
  --text-on-accent: #ffffff;
279
284
 
280
285
  /* Terminal wells — matte / opaque, NEVER glass */
@@ -293,9 +298,15 @@
293
298
  --well-tutor-ink: #eaf2fb;
294
299
  --btn-secondary-bg: var(--surface-raised);
295
300
 
296
- /* Accents (app) — live pulse · create CTA · interactive fill */
301
+ /* Accents (app) — live pulse · create CTA · interactive fill
302
+ The fill is damped in dark (a filled accent button is a large area of
303
+ colour) but it still carries white label text: #407fc1 gave 4.18:1, just
304
+ under AA, so it steps down to #3670ae for 5.14:1 while staying above the
305
+ 3:1 non-text floor against the app, panel and card surfaces it sits on.
306
+ Kept in lockstep with blue-700's dark column in style/glasselated-ramps.ts,
307
+ which is the same fill for macro-styled components. */
297
308
  --accent-live: #ff6b35;
298
- --interactive-fill: #407fc1;
309
+ --interactive-fill: #3670ae;
299
310
  --accent-create-bg: rgb(255 222 129);
300
311
  --accent-create-border: rgb(255 222 129);
301
312
  --accent-create-ink: #3a2e00;
@@ -530,7 +541,8 @@
530
541
  * declared anyway so a surface never inherits the night value across a scheme
531
542
  * boundary. */
532
543
  --edge-glass: inset 0 1px 0 rgba(255, 255, 255, 0.9), inset 0 0 0 1px rgba(255, 255, 255, 0.35);
533
- --edge-glass-surface: inset 0 1px 0 rgba(255, 255, 255, 0.9), inset 0 0 0 1px rgba(255, 255, 255, 0.35);
544
+ --edge-glass-surface:
545
+ inset 0 1px 0 rgba(255, 255, 255, 0.9), inset 0 0 0 1px rgba(255, 255, 255, 0.35);
534
546
  --shadow-card: 0 2px 8px rgba(99, 115, 139, 0.08), 0 8px 24px rgba(99, 115, 139, 0.1);
535
547
  --shadow-panel: 0 12px 40px rgba(99, 115, 139, 0.14);
536
548
  --shadow-float: 0 16px 48px rgba(99, 115, 139, 0.22);
@@ -570,11 +582,22 @@
570
582
  --slate-100: #eaeff6;
571
583
  --white: #ffffff;
572
584
 
573
- /* Text */
585
+ /* Text
586
+ `--text-secondary` and `--text-link` are pinned to WCAG AA (4.5:1), not to
587
+ the nearest ramp rung, and that is why neither is an alias any more:
588
+ - `--slate-500` #64748b reads 3.67-4.38:1 across our light surfaces, so
589
+ the secondary ink steps one notch darker than the slate ramp. The rung
590
+ itself is unchanged — it is a palette entry, this is an ink role.
591
+ - `--text-link` was `var(--blue-500)`, i.e. the same #2e90fa as
592
+ `--accent-primary` (2.50-3.24:1). Accent-as-ink and accent-as-decoration
593
+ cannot share one value at AA, so the ink takes `--blue-700` and
594
+ `--accent-primary` keeps #2e90fa for glows, rings, borders and dots.
595
+ Worst case measured over every surface a docs page composites: secondary
596
+ 4.65:1 on the accent-tinted chip, link 4.73:1 on the same. */
574
597
  --text-primary: var(--slate-900);
575
- --text-secondary: var(--slate-500);
598
+ --text-secondary: #556478;
576
599
  --text-tertiary: var(--slate-400);
577
- --text-link: var(--blue-500);
600
+ --text-link: var(--blue-700);
578
601
  --text-on-accent: var(--white);
579
602
 
580
603
  /* Terminal wells — matte, darker channel ink for daylight legibility */
@@ -593,9 +616,13 @@
593
616
  --well-tutor-ink: var(--text-primary);
594
617
  --btn-secondary-bg: #e9eff6;
595
618
 
596
- /* Accents (app) */
619
+ /* Accents (app)
620
+ `--interactive-fill` is the accent used as a FILL under `--text-on-accent`,
621
+ so it answers to 4.5:1 with white the way `--accent-primary` never has to.
622
+ It was `var(--accent-primary)`; white on #2e90fa is 3.24:1, the graphical
623
+ floor only, which is fine for an icon mask and wrong for a button label. */
597
624
  --accent-live: #ff6b35;
598
- --interactive-fill: var(--accent-primary);
625
+ --interactive-fill: var(--blue-700);
599
626
  --accent-create-bg: #ffedb0;
600
627
  --accent-create-border: #f5d88a;
601
628
  --accent-create-ink: #7a5600;