@cube-dev/ui-kit 0.170.0 → 0.172.0

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 (592) hide show
  1. package/README.md +1 -1
  2. package/dist/CHANGELOG.md +41 -0
  3. package/dist/README.md +1 -1
  4. package/dist/_internal/hooks/use-chained-callback.js +1 -1
  5. package/dist/_internal/hooks/use-debounced-value.js +1 -1
  6. package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
  7. package/dist/_internal/hooks/use-event.js +1 -1
  8. package/dist/_internal/hooks/use-is-first-render.js +1 -1
  9. package/dist/_internal/hooks/use-sync-ref.js +1 -1
  10. package/dist/_internal/hooks/use-timer/timer.js +1 -1
  11. package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
  12. package/dist/_internal/hooks/use-warn.js +1 -1
  13. package/dist/components/Block.js +1 -1
  14. package/dist/components/CollectionItem.js +1 -1
  15. package/dist/components/GlobalStyles.js +6 -6
  16. package/dist/components/GlobalStyles.js.map +1 -1
  17. package/dist/components/GridProvider.js +1 -1
  18. package/dist/components/HiddenInput.js +1 -1
  19. package/dist/components/Root.js +2 -2
  20. package/dist/components/Root.js.map +1 -1
  21. package/dist/components/actions/Action/Action.js +1 -1
  22. package/dist/components/actions/Banner/Banner.js +1 -1
  23. package/dist/components/actions/Banner/Banner.js.map +1 -1
  24. package/dist/components/actions/Button/Button.js +1 -1
  25. package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  26. package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
  27. package/dist/components/actions/ButtonSplit/context.js +1 -1
  28. package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
  29. package/dist/components/actions/CommandMenu/styled.js +1 -1
  30. package/dist/components/actions/ItemAction/ItemAction.js +1 -1
  31. package/dist/components/actions/ItemActionContext.js +1 -1
  32. package/dist/components/actions/ItemButton/ItemButton.js +1 -1
  33. package/dist/components/actions/Link/Link.js +1 -1
  34. package/dist/components/actions/Menu/Menu.js +1 -1
  35. package/dist/components/actions/Menu/MenuItem.js +1 -1
  36. package/dist/components/actions/Menu/MenuSection.js +1 -1
  37. package/dist/components/actions/Menu/MenuTrigger.js +1 -1
  38. package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
  39. package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  40. package/dist/components/actions/Menu/context.js +1 -1
  41. package/dist/components/actions/Menu/styled.js +1 -1
  42. package/dist/components/actions/Menu/styled.js.map +1 -1
  43. package/dist/components/actions/index.js +1 -1
  44. package/dist/components/actions/use-action.js +1 -1
  45. package/dist/components/actions/use-anchored-menu.js +1 -1
  46. package/dist/components/actions/use-context-menu.js +1 -1
  47. package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
  48. package/dist/components/content/Alert/Alert.js +1 -1
  49. package/dist/components/content/Alert/use-alert.js +1 -1
  50. package/dist/components/content/Avatar/Avatar.js +1 -1
  51. package/dist/components/content/Badge/Badge.js +1 -1
  52. package/dist/components/content/Card/Card.js +1 -1
  53. package/dist/components/content/Content.js +1 -1
  54. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  55. package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
  56. package/dist/components/content/Disclosure/Disclosure.js +1 -1
  57. package/dist/components/content/Divider.js +1 -1
  58. package/dist/components/content/Footer.js +1 -1
  59. package/dist/components/content/Header.js +1 -1
  60. package/dist/components/content/HotKeys/HotKeys.js +1 -1
  61. package/dist/components/content/InfoBadge/InfoBadge.js +1 -1
  62. package/dist/components/content/InlineInput/InlineInput.js +1 -1
  63. package/dist/components/content/Item/Item.js +1 -1
  64. package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
  65. package/dist/components/content/ItemCard/ItemCard.js +1 -1
  66. package/dist/components/content/Layout/GridLayout.js +1 -1
  67. package/dist/components/content/Layout/Layout.js +1 -1
  68. package/dist/components/content/Layout/LayoutBlock.js +1 -1
  69. package/dist/components/content/Layout/LayoutCenter.js +1 -1
  70. package/dist/components/content/Layout/LayoutContainer.js +1 -1
  71. package/dist/components/content/Layout/LayoutContent.js +1 -1
  72. package/dist/components/content/Layout/LayoutContext.js +1 -1
  73. package/dist/components/content/Layout/LayoutFlex.js +1 -1
  74. package/dist/components/content/Layout/LayoutFooter.js +1 -1
  75. package/dist/components/content/Layout/LayoutGrid.js +1 -1
  76. package/dist/components/content/Layout/LayoutHeader.js +1 -1
  77. package/dist/components/content/Layout/LayoutPane.js +1 -1
  78. package/dist/components/content/Layout/LayoutPanel.js +1 -1
  79. package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
  80. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  81. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  82. package/dist/components/content/Layout/index.js +1 -1
  83. package/dist/components/content/Layout/utils.js +1 -1
  84. package/dist/components/content/Paragraph.js +1 -1
  85. package/dist/components/content/Placeholder/Placeholder.js +1 -1
  86. package/dist/components/content/PrismCode/PrismCode.js +1 -1
  87. package/dist/components/content/PrismCode/prismSetup.js +1 -1
  88. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  89. package/dist/components/content/Result/Result.js +1 -1
  90. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  91. package/dist/components/content/Tag/Tag.js +1 -1
  92. package/dist/components/content/Text.js +1 -1
  93. package/dist/components/content/TextItem/TextItem.js +1 -1
  94. package/dist/components/content/Title.js +1 -1
  95. package/dist/components/content/Tree/Tree.js +1 -1
  96. package/dist/components/content/Tree/TreeNode.js +1 -1
  97. package/dist/components/content/Tree/styled.js +1 -1
  98. package/dist/components/content/Tree/tree-index.js +1 -1
  99. package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
  100. package/dist/components/content/Tree/use-load-data.js +1 -1
  101. package/dist/components/content/highlightText.js +1 -1
  102. package/dist/components/content/use-auto-tooltip.js +1 -1
  103. package/dist/components/data/DataTable/DataTable.js +1 -1
  104. package/dist/components/data/ItemTable/ItemTable.js +1 -1
  105. package/dist/components/data/ItemTable/ItemTableBulkBar.js +1 -1
  106. package/dist/components/data/ItemTable/ItemTableDragPreview.js +1 -1
  107. package/dist/components/data/ItemTable/ItemTableFooter.js +1 -1
  108. package/dist/components/data/ItemTable/ItemTableToolbar.js +1 -1
  109. package/dist/components/data/TableBase/ColumnResizer.js +1 -1
  110. package/dist/components/data/TableBase/RowCollection.js +1 -1
  111. package/dist/components/data/TableBase/TableHeaderCell.js +1 -1
  112. package/dist/components/data/TableBase/TableRow.js +1 -1
  113. package/dist/components/data/TableBase/TableView.js +1 -1
  114. package/dist/components/data/TableBase/column-menu.js +1 -1
  115. package/dist/components/data/TableBase/column-tint.js +2 -2
  116. package/dist/components/data/TableBase/column-tint.js.map +1 -1
  117. package/dist/components/data/TableBase/row-menu.js +1 -1
  118. package/dist/components/data/TableBase/styled.js +1 -1
  119. package/dist/components/data/TableBase/table-tree.js +1 -1
  120. package/dist/components/data/TableBase/types.d.ts +3 -3
  121. package/dist/components/data/TableBase/types.js +1 -1
  122. package/dist/components/data/TableBase/types.js.map +1 -1
  123. package/dist/components/data/TableBase/use-cell-selection.js +0 -0
  124. package/dist/components/data/TableBase/use-column-order.js +1 -1
  125. package/dist/components/data/TableBase/use-container-width.js +1 -1
  126. package/dist/components/data/TableBase/use-row-move-animation.js +1 -1
  127. package/dist/components/data/TableBase/use-scrollability.js +1 -1
  128. package/dist/components/data/TableBase/use-table-columns.js +1 -1
  129. package/dist/components/data/TableBase/use-table-search.js +1 -1
  130. package/dist/components/data/TableBase/use-table-selection.js +1 -1
  131. package/dist/components/data/TableBase/use-table-sort.js +1 -1
  132. package/dist/components/data/TableBase/use-table-sorts.js +1 -1
  133. package/dist/components/data/TableBase/use-table-storage.js +1 -1
  134. package/dist/components/data/TableBase/use-table-tree-state.js +1 -1
  135. package/dist/components/fields/Checkbox/Checkbox.js +1 -1
  136. package/dist/components/fields/Checkbox/Checkbox.js.map +1 -1
  137. package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
  138. package/dist/components/fields/Checkbox/context.js +1 -1
  139. package/dist/components/fields/ColorInput/ColorInput.js +1 -1
  140. package/dist/components/fields/ColorPicker/ColorPicker.js +1 -1
  141. package/dist/components/fields/ColorSwatch/ColorSwatch.js +1 -1
  142. package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js +2 -2
  143. package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js.map +1 -1
  144. package/dist/components/fields/ComboBox/ComboBox.js +1 -1
  145. package/dist/components/fields/CommandTextArea/CommandTextArea.js +1 -1
  146. package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
  147. package/dist/components/fields/CommandTextArea/useCaretAnchor.js +1 -1
  148. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  149. package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
  150. package/dist/components/fields/DatePicker/DatePicker.js +1 -1
  151. package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
  152. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  153. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  154. package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
  155. package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
  156. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  157. package/dist/components/fields/DatePicker/MonthPicker.js +1 -1
  158. package/dist/components/fields/DatePicker/PeriodPicker.js +1 -1
  159. package/dist/components/fields/DatePicker/QuarterPicker.js +1 -1
  160. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  161. package/dist/components/fields/DatePicker/WeekPicker.js +1 -1
  162. package/dist/components/fields/DatePicker/YearPicker.js +1 -1
  163. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  164. package/dist/components/fields/DatePicker/period.js +1 -1
  165. package/dist/components/fields/DatePicker/props.js +1 -1
  166. package/dist/components/fields/DatePicker/utils.js +1 -1
  167. package/dist/components/fields/FileInput/FileInput.js +1 -1
  168. package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
  169. package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
  170. package/dist/components/fields/Input/Input.js +1 -1
  171. package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
  172. package/dist/components/fields/ListBox/ListBox.js +1 -1
  173. package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +1 -1
  174. package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
  175. package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +1 -1
  176. package/dist/components/fields/NumberInput/NumberInput.js +1 -1
  177. package/dist/components/fields/NumberInput/StepButton.js +1 -1
  178. package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
  179. package/dist/components/fields/Picker/Picker.js +1 -1
  180. package/dist/components/fields/RadioGroup/Radio.js +1 -1
  181. package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
  182. package/dist/components/fields/RadioGroup/context.js +1 -1
  183. package/dist/components/fields/SearchComboBox/SearchComboBox.js +1 -1
  184. package/dist/components/fields/SearchInput/SearchInput.js +1 -1
  185. package/dist/components/fields/Select/Select.js +1 -1
  186. package/dist/components/fields/Select/Select.js.map +1 -1
  187. package/dist/components/fields/Slider/Gradation.js +1 -1
  188. package/dist/components/fields/Slider/HueSlider.js +1 -1
  189. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  190. package/dist/components/fields/Slider/Slider.js +1 -1
  191. package/dist/components/fields/Slider/SliderBase.js +1 -1
  192. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  193. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  194. package/dist/components/fields/Slider/elements.js +1 -1
  195. package/dist/components/fields/Slider/index.js +1 -1
  196. package/dist/components/fields/Switch/Switch.js +1 -1
  197. package/dist/components/fields/TextArea/TextArea.js +1 -1
  198. package/dist/components/fields/TextInput/TextInput.js +1 -1
  199. package/dist/components/fields/TextInput/TextInputBase.js +1 -1
  200. package/dist/components/fields/TextInput/useAutoSizeTextArea.js +1 -1
  201. package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  202. package/dist/components/fields/color/ColorPanel.js +1 -1
  203. package/dist/components/fields/color/channels.js +1 -1
  204. package/dist/components/fields/color/color.js +2 -2
  205. package/dist/components/fields/color/color.js.map +1 -1
  206. package/dist/components/fields/color/context.js +1 -1
  207. package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
  208. package/dist/components/form/Form/Field.js +1 -1
  209. package/dist/components/form/Form/Form.js +1 -1
  210. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  211. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  212. package/dist/components/form/Form/SubmitError.js +1 -1
  213. package/dist/components/form/Form/index.js +1 -1
  214. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  215. package/dist/components/form/Form/use-field/use-field.js +1 -1
  216. package/dist/components/form/Form/use-form.js +1 -1
  217. package/dist/components/form/Form/validation.js +1 -1
  218. package/dist/components/form/Label.js +1 -1
  219. package/dist/components/form/validation/ValidationIndicator.js +1 -1
  220. package/dist/components/form/validation/resolve-validation-props.js +1 -1
  221. package/dist/components/form/validation/use-validation-props.js +1 -1
  222. package/dist/components/form/wrapper.js +1 -1
  223. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  224. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  225. package/dist/components/layout/Board/Board.d.ts +6 -4
  226. package/dist/components/layout/Board/Board.js +1 -1
  227. package/dist/components/layout/Board/Board.js.map +1 -1
  228. package/dist/components/layout/Board/BoardProvider.js +1 -1
  229. package/dist/components/layout/Board/BoardResponsive.js +1 -1
  230. package/dist/components/layout/Board/Widget.js +1 -1
  231. package/dist/components/layout/Board/WidgetHost.js +1 -1
  232. package/dist/components/layout/Board/WidgetHost.js.map +1 -1
  233. package/dist/components/layout/Board/board-context.js +1 -1
  234. package/dist/components/layout/Board/board-store.js +1 -1
  235. package/dist/components/layout/Board/grid-core/calculate.js +1 -1
  236. package/dist/components/layout/Board/grid-core/collision-modes.js +75 -7
  237. package/dist/components/layout/Board/grid-core/collision-modes.js.map +1 -1
  238. package/dist/components/layout/Board/grid-core/collision.js +1 -1
  239. package/dist/components/layout/Board/grid-core/compactors.js +1 -1
  240. package/dist/components/layout/Board/grid-core/constraints.js +1 -1
  241. package/dist/components/layout/Board/grid-core/group-move.js +1 -1
  242. package/dist/components/layout/Board/grid-core/layout.js +1 -1
  243. package/dist/components/layout/Board/grid-core/placement.js +1 -1
  244. package/dist/components/layout/Board/grid-core/sort.js +1 -1
  245. package/dist/components/layout/Board/index.js +1 -1
  246. package/dist/components/layout/Board/responsive-utils.js +1 -1
  247. package/dist/components/layout/Board/use-board-layout.js +1 -1
  248. package/dist/components/layout/Board/use-board-registry.js +95 -88
  249. package/dist/components/layout/Board/use-board-registry.js.map +1 -1
  250. package/dist/components/layout/Board/use-board-select-modifier-key.js +1 -1
  251. package/dist/components/layout/Board/use-board-selection.js +1 -1
  252. package/dist/components/layout/Flex.js +1 -1
  253. package/dist/components/layout/Flow.js +1 -1
  254. package/dist/components/layout/Grid.js +1 -1
  255. package/dist/components/layout/Panel.js +1 -1
  256. package/dist/components/layout/Prefix.js +1 -1
  257. package/dist/components/layout/ResizablePanel.js +1 -1
  258. package/dist/components/layout/Space.js +1 -1
  259. package/dist/components/layout/Suffix.js +1 -1
  260. package/dist/components/navigation/Pagination/Pagination.js +1 -1
  261. package/dist/components/navigation/Pagination/use-pagination.js +1 -1
  262. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  263. package/dist/components/navigation/Tabs/TabButton.js +1 -1
  264. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  265. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  266. package/dist/components/navigation/Tabs/TabPicker.js +1 -1
  267. package/dist/components/navigation/Tabs/Tabs.js +1 -1
  268. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  269. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  270. package/dist/components/navigation/Tabs/popover-placement.js +1 -1
  271. package/dist/components/navigation/Tabs/styled.js +1 -1
  272. package/dist/components/navigation/Tabs/types.js +1 -1
  273. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  274. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  275. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  276. package/dist/components/other/Calendar/Calendar.js +1 -1
  277. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  278. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  279. package/dist/components/other/Calendar/CalendarHeader.js +1 -1
  280. package/dist/components/other/Calendar/CalendarPanel.js +1 -1
  281. package/dist/components/other/Calendar/PeriodCalendar.js +1 -1
  282. package/dist/components/other/Calendar/PeriodGrid.js +1 -1
  283. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  284. package/dist/components/other/Calendar/styled.js +1 -1
  285. package/dist/components/other/CubeLogo/CubeLogo.d.ts +2 -2
  286. package/dist/components/other/CubeLogo/CubeLogo.js +12 -12
  287. package/dist/components/other/CubeLogo/CubeLogo.js.map +1 -1
  288. package/dist/components/other/NoDataIcon/NoDataIcon.js +1 -1
  289. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  290. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  291. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  292. package/dist/components/overlays/Dialog/Dialog.js +1 -1
  293. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  294. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  295. package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
  296. package/dist/components/overlays/Dialog/context.js +1 -1
  297. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  298. package/dist/components/overlays/Modal/Modal.js +1 -1
  299. package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
  300. package/dist/components/overlays/Modal/Overlay.js +1 -1
  301. package/dist/components/overlays/Modal/Popover.js +1 -1
  302. package/dist/components/overlays/Modal/Tray.js +1 -1
  303. package/dist/components/overlays/Modal/Underlay.js +1 -1
  304. package/dist/components/overlays/Notifications/Notification.js +1 -1
  305. package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
  306. package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
  307. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  308. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  309. package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
  310. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  311. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
  312. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  313. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  314. package/dist/components/overlays/Notifications/index.js +1 -1
  315. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  316. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  317. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  318. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  319. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  320. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  321. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  322. package/dist/components/overlays/Toast/index.js +1 -1
  323. package/dist/components/overlays/Toast/useProgressToast.js +1 -1
  324. package/dist/components/overlays/Toast/useToast.js +1 -1
  325. package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
  326. package/dist/components/overlays/Tooltip/Tooltip.js.map +1 -1
  327. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  328. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  329. package/dist/components/overlays/Tooltip/context.js +1 -1
  330. package/dist/components/portal/Portal.js +1 -1
  331. package/dist/components/portal/PortalProvider.js +1 -1
  332. package/dist/components/portal/usePortal.js +1 -1
  333. package/dist/components/shared/DraggableCollection.js +1 -1
  334. package/dist/components/shared/InvalidIcon.js +1 -1
  335. package/dist/components/shared/ValidIcon.js +1 -1
  336. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  337. package/dist/components/status/Spin/Cube.js +1 -1
  338. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  339. package/dist/components/status/Spin/Spin.js +1 -1
  340. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  341. package/dist/data/item-themes.js +1 -1
  342. package/dist/data/item-themes.js.map +1 -1
  343. package/dist/data/themes.js +1 -1
  344. package/dist/data/themes.js.map +1 -1
  345. package/dist/eslint-plugin/defaults.generated.js +1 -1
  346. package/dist/eslint-plugin/index.js +1 -1
  347. package/dist/eslint-plugin/rules/no-redundant-default-prop.js +1 -1
  348. package/dist/i18n/I18nProvider.js +1 -1
  349. package/dist/i18n/createFormatter.js +1 -1
  350. package/dist/i18n/index.js +1 -1
  351. package/dist/i18n/instance.js +1 -1
  352. package/dist/i18n/locales/de-DE/uikit.js +1 -1
  353. package/dist/i18n/locales/en-US/uikit.js +1 -1
  354. package/dist/i18n/locales/es-ES/uikit.js +1 -1
  355. package/dist/i18n/locales/es-MX/uikit.js +1 -1
  356. package/dist/i18n/locales/fr-FR/uikit.js +1 -1
  357. package/dist/i18n/locales/it-IT/uikit.js +1 -1
  358. package/dist/i18n/locales/ja-JP/uikit.js +1 -1
  359. package/dist/i18n/locales/nb-NO/uikit.js +1 -1
  360. package/dist/i18n/locales/pt-BR/uikit.js +1 -1
  361. package/dist/i18n/locales/pt-PT/uikit.js +1 -1
  362. package/dist/i18n/locales/sv-SE/uikit.js +1 -1
  363. package/dist/i18n/locales/vi-VN/uikit.js +1 -1
  364. package/dist/i18n/locales.js +1 -1
  365. package/dist/i18n/useFormatter.js +1 -1
  366. package/dist/i18n/useI18n.js +1 -1
  367. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  368. package/dist/icons/AdjustmentsIcon.js +1 -1
  369. package/dist/icons/AiIcon.js +1 -1
  370. package/dist/icons/AreaChartIcon.js +1 -1
  371. package/dist/icons/ArrowNarrowDownIcon.js +1 -1
  372. package/dist/icons/ArrowNarrowUpIcon.js +1 -1
  373. package/dist/icons/BackwardIcon.js +1 -1
  374. package/dist/icons/BarChartIcon.js +1 -1
  375. package/dist/icons/BellFilledIcon.js +1 -1
  376. package/dist/icons/BellIcon.js +1 -1
  377. package/dist/icons/BooleanIcon.js +1 -1
  378. package/dist/icons/CalendarEditIcon.js +1 -1
  379. package/dist/icons/CalendarIcon.js +1 -1
  380. package/dist/icons/CaretDownIcon.js +1 -1
  381. package/dist/icons/CaretUpIcon.js +1 -1
  382. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  383. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  384. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  385. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  386. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  387. package/dist/icons/ChartBarLineIcon.js +1 -1
  388. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  389. package/dist/icons/ChartBarStackedIcon.js +1 -1
  390. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  391. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  392. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  393. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  394. package/dist/icons/ChartBubbleIcon.js +1 -1
  395. package/dist/icons/ChartDonut2Icon.js +1 -1
  396. package/dist/icons/ChartFunnelIcon.js +1 -1
  397. package/dist/icons/ChartHeatmapIcon.js +1 -1
  398. package/dist/icons/ChartKPIIcon.js +1 -1
  399. package/dist/icons/ChartPie2Icon.js +1 -1
  400. package/dist/icons/ChartScatterIcon.js +1 -1
  401. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  402. package/dist/icons/CheckCircleIcon.js +1 -1
  403. package/dist/icons/CheckIcon.js +1 -1
  404. package/dist/icons/CircleFilledIcon.js +1 -1
  405. package/dist/icons/ClearIcon.js +1 -1
  406. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  407. package/dist/icons/CloseCircleIcon.js +1 -1
  408. package/dist/icons/CloseIcon.js +1 -1
  409. package/dist/icons/CodeIcon.js +1 -1
  410. package/dist/icons/ColumnTotalIcon.js +1 -1
  411. package/dist/icons/CopyIcon.js +1 -1
  412. package/dist/icons/CountIcon.js +1 -1
  413. package/dist/icons/CubeIcon.js +1 -1
  414. package/dist/icons/CubePauseIcon.js +1 -1
  415. package/dist/icons/CubePlayIcon.js +1 -1
  416. package/dist/icons/CurrencyDollarIcon.js +1 -1
  417. package/dist/icons/DangerIcon.js +1 -1
  418. package/dist/icons/DashboardIcon.js +1 -1
  419. package/dist/icons/DatabaseIcon.js +1 -1
  420. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  421. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  422. package/dist/icons/DirectionIcon.js +1 -1
  423. package/dist/icons/DonutIcon.js +1 -1
  424. package/dist/icons/DownIcon.js +1 -1
  425. package/dist/icons/EditIcon.js +1 -1
  426. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  427. package/dist/icons/ExclamationCircleIcon.js +1 -1
  428. package/dist/icons/ExclamationIcon.js +1 -1
  429. package/dist/icons/EyeIcon.js +1 -1
  430. package/dist/icons/EyeInvisibleIcon.js +1 -1
  431. package/dist/icons/FilterIcon.js +1 -1
  432. package/dist/icons/FolderFilledIcon.js +1 -1
  433. package/dist/icons/FolderIcon.js +1 -1
  434. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  435. package/dist/icons/FolderOpenIcon.js +1 -1
  436. package/dist/icons/ForwardIcon.js +1 -1
  437. package/dist/icons/GripVerticalIcon.js +1 -1
  438. package/dist/icons/HierarchyIcon.js +1 -1
  439. package/dist/icons/HierarchyOpenIcon.js +1 -1
  440. package/dist/icons/Icon.js +1 -1
  441. package/dist/icons/InfoCircleIcon.js +1 -1
  442. package/dist/icons/InfoIcon.js +1 -1
  443. package/dist/icons/KeyIcon.js +1 -1
  444. package/dist/icons/LeftIcon.js +1 -1
  445. package/dist/icons/LineChartIcon.js +1 -1
  446. package/dist/icons/LoadingIcon.js +1 -1
  447. package/dist/icons/LockFilledIcon.js +1 -1
  448. package/dist/icons/LockIcon.js +1 -1
  449. package/dist/icons/MoreIcon.js +1 -1
  450. package/dist/icons/NotAllowedIcon.js +1 -1
  451. package/dist/icons/Number123Icon.js +1 -1
  452. package/dist/icons/NumberIcon.js +1 -1
  453. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  454. package/dist/icons/PauseCircleIcon.js +1 -1
  455. package/dist/icons/PauseIcon.js +1 -1
  456. package/dist/icons/PercentageIcon.js +1 -1
  457. package/dist/icons/PieChartIcon.js +1 -1
  458. package/dist/icons/PipetteIcon.js +1 -1
  459. package/dist/icons/PlayCircleIcon.js +1 -1
  460. package/dist/icons/PlayIcon.js +1 -1
  461. package/dist/icons/PlusIcon.js +1 -1
  462. package/dist/icons/ProgressBarIcon.js +1 -1
  463. package/dist/icons/ReloadIcon.js +1 -1
  464. package/dist/icons/ReportIcon.js +1 -1
  465. package/dist/icons/ReturnIcon.js +1 -1
  466. package/dist/icons/RightIcon.js +1 -1
  467. package/dist/icons/RowTotalsIcon.js +1 -1
  468. package/dist/icons/SchemeIcon.js +1 -1
  469. package/dist/icons/SearchIcon.js +1 -1
  470. package/dist/icons/SemanticQueryIcon.js +1 -1
  471. package/dist/icons/SettingsIcon.js +1 -1
  472. package/dist/icons/ShieldFilledIcon.js +1 -1
  473. package/dist/icons/ShieldIcon.js +1 -1
  474. package/dist/icons/SlashIcon.js +1 -1
  475. package/dist/icons/SparklesIcon.js +1 -1
  476. package/dist/icons/SqlIcon.js +1 -1
  477. package/dist/icons/StatsIcon.js +1 -1
  478. package/dist/icons/StopIcon.js +1 -1
  479. package/dist/icons/StringIcon.js +1 -1
  480. package/dist/icons/SubtotalsIcon.js +1 -1
  481. package/dist/icons/SwitchIcon.js +1 -1
  482. package/dist/icons/TableIcon.js +1 -1
  483. package/dist/icons/ThumbsDownIcon.js +1 -1
  484. package/dist/icons/ThumbsUpIcon.js +1 -1
  485. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  486. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  487. package/dist/icons/ThunderboltIcon.js +1 -1
  488. package/dist/icons/TimeIcon.js +1 -1
  489. package/dist/icons/TrashIcon.js +1 -1
  490. package/dist/icons/UnlockIcon.js +1 -1
  491. package/dist/icons/UpIcon.js +1 -1
  492. package/dist/icons/UserGroupIcon.js +1 -1
  493. package/dist/icons/UserIcon.js +1 -1
  494. package/dist/icons/UserLockIcon.js +1 -1
  495. package/dist/icons/ViewIcon.js +1 -1
  496. package/dist/icons/WarningFilledIcon.js +1 -1
  497. package/dist/icons/WarningIcon.js +1 -1
  498. package/dist/icons/wrap-icon.js +1 -1
  499. package/dist/index.d.ts +2 -2
  500. package/dist/index.js +3 -3
  501. package/dist/probe/canonicalize.js +1 -1
  502. package/dist/probe/css.js +1 -1
  503. package/dist/probe/index.js +1 -1
  504. package/dist/provider.js +1 -1
  505. package/dist/providers/TrackingProvider.js +1 -1
  506. package/dist/providers/navigationAdapter.default.js +1 -1
  507. package/dist/tokens/all-tokens.js +1 -1
  508. package/dist/tokens/base.js +1 -1
  509. package/dist/tokens/color-seed.js +1 -1
  510. package/dist/tokens/color-theme.d.ts +2 -2
  511. package/dist/tokens/color-theme.js +2 -2
  512. package/dist/tokens/color-theme.js.map +1 -1
  513. package/dist/tokens/colors.d.ts +3 -3
  514. package/dist/tokens/colors.js +4 -4
  515. package/dist/tokens/colors.js.map +1 -1
  516. package/dist/tokens/layout.js +1 -1
  517. package/dist/tokens/lazy-styles.js +1 -1
  518. package/dist/tokens/palette-config.d.ts +1 -1
  519. package/dist/tokens/palette-config.js +1 -1
  520. package/dist/tokens/palette-config.js.map +1 -1
  521. package/dist/tokens/palette.d.ts +5 -5
  522. package/dist/tokens/palette.js +11 -11
  523. package/dist/tokens/palette.js.map +1 -1
  524. package/dist/tokens/resolve.d.ts +2 -2
  525. package/dist/tokens/resolve.js +9 -9
  526. package/dist/tokens/resolve.js.map +1 -1
  527. package/dist/tokens/shadows.d.ts +1 -1
  528. package/dist/tokens/shadows.js +2 -2
  529. package/dist/tokens/shadows.js.map +1 -1
  530. package/dist/tokens/sizes.js +1 -1
  531. package/dist/tokens/spacing.js +1 -1
  532. package/dist/tokens/typography.js +1 -1
  533. package/dist/utils/ResizeSensor.js +1 -1
  534. package/dist/utils/index.d.ts +1 -1
  535. package/dist/utils/is-dev-env.js +1 -1
  536. package/dist/utils/modules.js +1 -1
  537. package/dist/utils/promise.js +1 -1
  538. package/dist/utils/raf.js +1 -1
  539. package/dist/utils/random.js +1 -1
  540. package/dist/utils/range.js +1 -1
  541. package/dist/utils/react/RenderCache.js +1 -1
  542. package/dist/utils/react/Slots.js +1 -1
  543. package/dist/utils/react/chain.js +1 -1
  544. package/dist/utils/react/disabledProps.js +1 -1
  545. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  546. package/dist/utils/react/index.d.ts +1 -1
  547. package/dist/utils/react/index.js +2 -2
  548. package/dist/utils/react/interactions.js +1 -1
  549. package/dist/utils/react/isTextOnly.js +1 -1
  550. package/dist/utils/react/mapProps.js +1 -1
  551. package/dist/utils/react/mergeProps.js +1 -1
  552. package/dist/utils/react/nullableValue.js +1 -1
  553. package/dist/utils/react/resolveIcon.js +1 -1
  554. package/dist/utils/react/sharedStore.js +1 -1
  555. package/dist/utils/react/useBufferedValue.js +1 -1
  556. package/dist/utils/react/useCombinedRefs.js +1 -1
  557. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  558. package/dist/utils/react/useEventBus.js +1 -1
  559. package/dist/utils/react/useId.js +1 -1
  560. package/dist/utils/react/useIsDarwin.js +1 -1
  561. package/dist/utils/react/useKeySymbols.js +1 -1
  562. package/dist/utils/react/useLayoutEffect.js +1 -1
  563. package/dist/utils/react/useLocalStorage.js +1 -1
  564. package/dist/utils/react/useMergeStyles.js +1 -1
  565. package/dist/utils/react/usePopoverSync.js +1 -1
  566. package/dist/utils/react/useQaProps.js +1 -1
  567. package/dist/utils/react/{useSchema.d.ts → useScheme.d.ts} +16 -16
  568. package/dist/utils/react/{useSchema.js → useScheme.js} +30 -30
  569. package/dist/utils/react/{useSchema.js.map → useScheme.js.map} +1 -1
  570. package/dist/utils/react/useViewportSize.js +1 -1
  571. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  572. package/dist/utils/selection.js +1 -1
  573. package/dist/utils/styles.js +1 -1
  574. package/dist/utils/tree.js +1 -1
  575. package/dist/utils/warnings.js +1 -1
  576. package/dist/version.js +2 -2
  577. package/docs/Colors.md +2 -2
  578. package/docs/Introduction.md +1 -1
  579. package/docs/Theming.md +19 -19
  580. package/docs/Usage.md +19 -19
  581. package/docs/components/content/ItemCard.md +1 -1
  582. package/docs/components/content/PrismCode.md +2 -2
  583. package/docs/components/data/DataTable.md +1 -1
  584. package/docs/components/fields/Picker.md +1 -1
  585. package/docs/components/fields/RadioGroup.md +28 -8
  586. package/docs/components/layout/Board.md +2 -2
  587. package/docs/components/navigation/Tabs.md +1 -1
  588. package/docs/components/organisms/StatsCard.md +1 -1
  589. package/docs/components/other/CubeLogo.md +9 -9
  590. package/docs/components/overlays/Tooltip.md +3 -3
  591. package/docs/components/overlays/TooltipProvider.md +1 -1
  592. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"item-themes.js","names":[],"sources":["../../src/data/item-themes.ts"],"sourcesContent":["import type { Styles } from '@tenphi/tasty';\n\nexport const VALIDATION_STYLES: Styles = {\n border: {\n invalid: '#danger-accent-text',\n valid: '#success-accent-text',\n } as Record<string, string>,\n} as const;\n\n// Base styles shared between ItemAction and ItemBadge\nexport const ITEM_ACTION_BASE_STYLES: Styles = {\n display: 'inline-grid',\n flow: 'column',\n placeItems: 'center',\n placeContent: 'center',\n gap: 0,\n position: 'relative',\n margin: {\n '': '0 1bw 0 1bw',\n ':last-child & !:first-child': '0 $side-padding 0 0',\n '!:last-child & :first-child': '0 0 0 $side-padding',\n ':last-child & :first-child': '0 $side-padding',\n context: '0',\n },\n padding: 0,\n radius: '(1r - 1bw)',\n transition: 'theme',\n flexShrink: 0,\n textDecoration: 'none',\n boxSizing: 'border-box',\n whiteSpace: 'nowrap',\n border: 0,\n height: '$action-size',\n width: {\n '': '$action-size',\n 'has-label': 'auto',\n },\n placeSelf: 'center',\n\n // Side padding for the action buttons\n '$side-padding': '(($size - $action-size - 2bw) / 2)',\n // Size using custom property\n '$action-size':\n 'min(max((2x + 2bw), (($size, $size-md) - 1x - 2bw)), (3x - 2bw))',\n\n // Icon styles\n Icon: {\n $: '>',\n display: 'grid',\n placeItems: 'center',\n height: '($action-size - 2bw) ($action-size - 2bw)',\n width: '($action-size - 2bw) ($action-size - 2bw)',\n opacity: {\n '': 1,\n 'checkmark & selected': 1,\n 'checkmark & !selected': 0,\n 'checkmark & !selected & hovered': 0.4,\n },\n },\n} as const;\n\n// ---------- DEFAULT THEME ----------\nexport const DEFAULT_PRIMARY_STYLES: Styles = {\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: {\n '': '#primary-accent-surface-border',\n pressed: '#primary-accent-surface-border',\n disabled: 'transparent',\n },\n // All states share the same `#surface` base layer (opaque). Only the\n // *overlay* varies between brand color, hover shade, and disabled chip.\n // Keeping the layer shape identical (always two layers, same base, same\n // gradient overlay slot) lets `background-color`, `background-image` and\n // `--tasty-second-fill-color` all interpolate smoothly during the CSS\n // transition — without it, the gradient overlay would snap on/off and the\n // bg-color would briefly show through (the \"surface flash\" on form submit).\n //\n // The brand ramp `accent-surface` → `-2` → `-3` gives a monotonically\n // increasing contrast against `#surface` (cr ≈ 4.5 → 4.8 → 5.2 in light,\n // similar in dark), so hover and pressed read visibly *darker* than the\n // default state in both schemas. Disabled uses the brand-tinted,\n // schema-symmetric chip (`accent-disabled-surface` cr ≈ 1.4 vs surface)\n // so the muted state stays identifiable as a brand color.\n fill: {\n '': '#surface #primary-accent-surface',\n hovered: '#surface #primary-accent-surface-2',\n pressed: '#surface #primary-accent-surface-3',\n disabled: '#surface #primary-accent-disabled-surface',\n },\n color: {\n '': '#white',\n disabled: '#primary-accent-disabled-surface-text',\n },\n} as const;\n\nexport const DEFAULT_OUTLINE_STYLES: Styles = {\n // Non-selected = old OUTLINE: neutral border + surface fill.\n // Selected (= old SECONDARY): brand-tinted fill + brand border.\n // Selected BORDER uses the OPAQUE `#primary-border` token (the neutral\n // `border` ramp re-resolved at `saturation: 0.5` per primary-theme — see\n // `TINTED_SURFACE_OVERRIDE` in `palette.ts`). It replaces an alpha-blended\n // brand-text border so adjacent borders in grouped layouts (e.g.\n // `RadioGroup type=\"button\"`) don't double up at their overlap into a\n // darker stripe. Selected FILL anchors to the *fixed* `#primary-accent-surface`\n // brand: anchoring to the adaptive `#primary-accent-text` would drift the\n // bg toward the text lightness in dark mode and collapse label↔bg contrast\n // below AA. Selected label mirrors LINK: soft `#primary-accent-text-soft` at\n // rest, intensifying to `#primary-accent-text` on hover. Both are solved in\n // `palette.ts` for AA against the BASE selected fill (`accent-selected-fill`).\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: {\n '': true,\n selected: '#primary-border',\n disabled: '#border',\n ...(VALIDATION_STYLES.border as Record<string, string>),\n },\n // Every state uses a two-layer fill: `#surface-2` (opaque base) + a tint\n // overlay. Keeping the layer shape identical across non-selected, selected\n // and disabled states lets the tint, base color, and gradient slot all\n // interpolate smoothly during the CSS transition. Selected states paint the\n // brand tint on top of `#surface-2` (slightly darker base than a\n // body-composited single-layer `#primary-accent-surface.X` would be, but\n // visually almost identical and free of the overlay-snap flash on click).\n // Disabled paints the neutral `#disabled-surface` chip on top of the same\n // base. When SELECTED it keeps the enabled selected chip instead and fades\n // only the LABEL, to `#accent-disabled-text` — so a disabled segmented\n // control still shows which option is active (CUB-3912) without the chip\n // changing weight at all. Every `selected & disabled` entry in this file\n // exists for that reason.\n //\n // Fading the label alone is what keeps the state honest. The chip is the\n // thing that says \"this one is on\", and a disabled control has no business\n // saying that more loudly than a live one — which is exactly what happened\n // while the state borrowed `accent-disabled-surface`: the mid-tone pill a\n // PRIMARY button steps DOWN to is a step UP from a 9% tint, and its\n // `tone: 'max'` label resolved to literal white in light mode. Building the\n // chip from the neutral disabled tone at brand chroma fixed the weight but\n // read over-saturated next to the enabled selected chips it sits beside.\n //\n // The `.08` is `selected`'s own `.09` minus a hair, and the difference is\n // deliberately imperceptible: the two entries must not serialize to the SAME\n // string. Tasty's `mergeEntriesByValue` pass coalesces equal values into one\n // OR-entry at the group's max priority, so a literal reuse of `.09` would\n // merge `selected` into `selected & disabled` and then negate against\n // `selected & (hovered | focused)` — the \"selected-hover stays dark\" bug that\n // `SPECIAL_CLEAR_STYLES` documents at length, which escapes it the same way.\n fill: {\n '': '#surface-2 #surface-text.0',\n hovered: '#surface-2 #surface-text.03',\n pressed: '#surface-2 #surface-text.09',\n selected: '#surface-2 #primary-accent-surface.09',\n 'selected & (hovered | focused)': '#surface-2 #primary-accent-surface.12',\n 'selected & pressed': '#surface-2 #primary-accent-surface.18',\n disabled: '#surface-2 #disabled-surface',\n 'selected & disabled': '#surface-2 #primary-accent-surface.08',\n },\n color: {\n '': '#surface-text-soft',\n hovered: '#surface-text-soft',\n pressed: '#surface-text',\n selected: '#primary-accent-text-soft',\n 'selected & hovered': '#primary-accent-text',\n disabled: '#disabled-surface-text',\n 'selected & disabled': '#primary-accent-disabled-text',\n },\n} as const;\n\n// Identical to DEFAULT_OUTLINE_STYLES but uses `#surface-3` as the fill base,\n// designed to sit on `#surface-2` containers without blending in.\nexport const DEFAULT_OUTLINE_2_STYLES: Styles = {\n ...DEFAULT_OUTLINE_STYLES,\n fill: {\n '': '#surface-3 #surface-text.0',\n hovered: '#surface-3 #surface-text.03',\n pressed: '#surface-3 #surface-text.09',\n selected: '#surface-3 #primary-accent-surface.09',\n 'selected & (hovered | focused)': '#surface-3 #primary-accent-surface.12',\n 'selected & pressed': '#surface-3 #primary-accent-surface.15',\n disabled: '#surface-3 #disabled-surface',\n 'selected & disabled': '#surface-3 #primary-accent-surface.08',\n },\n} as const;\n\nexport const DEFAULT_CLEAR_STYLES: Styles = {\n // Non-selected = old NEUTRAL: transparent / dark-tinted neutral look.\n // Selected = old CLEAR: brand-tinted overlay over the surface.\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: {\n '': 'transparent',\n ...(VALIDATION_STYLES.border as Record<string, string>),\n },\n fill: {\n '': '#surface-text.0',\n 'hovered | focused': '#surface-text.04',\n pressed: '#surface-text.06',\n selected: '#primary-accent-surface.09',\n 'selected & (hovered | focused)': '#primary-accent-surface.12',\n 'selected & pressed': '#primary-accent-surface.18',\n disabled: 'transparent',\n 'selected & disabled': '#primary-accent-surface.08',\n },\n // Selected label mirrors LINK: soft at rest, `#primary-accent-text` on\n // hover. See DEFAULT_OUTLINE_STYLES.\n color: {\n '': '#surface-text-soft',\n hovered: '#surface-text-soft',\n 'pressed & !selected': '#surface-text',\n selected: '#primary-accent-text-soft',\n 'selected & hovered': '#primary-accent-text',\n disabled: '#disabled-surface-text',\n 'selected & disabled': '#primary-accent-disabled-text',\n },\n} as const;\n\nexport const DEFAULT_ITEM_STYLES: Styles = {\n border: 'transparent',\n fill: {\n '': '#surface-text.0',\n 'hovered | focused': '#surface-text.04',\n pressed: '#surface-text.06',\n selected: '#surface-text.09',\n 'selected & (hovered | focused)': '#surface-text.12',\n 'selected & pressed': '#surface-text.15',\n disabled: 'transparent',\n },\n color: {\n '': '#surface-text-soft',\n hovered: '#surface-text-soft',\n selected: '#surface-text',\n disabled: '#disabled-surface-text',\n },\n} as const;\n\nexport const DEFAULT_LINK_STYLES: Styles = {\n // Default sits at `#primary-accent-text-soft` and intensifies on hover to the\n // stronger `#primary-accent-text`. Both are solved in `palette.ts` for AA\n // against `accent-selected-fill` (the BASE selected Item fill), so they also\n // clear AA on plain surfaces; both are adaptive across light/dark/HC.\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: '0',\n fill: {\n '': 'transparent',\n },\n color: {\n '': '#primary-accent-text-soft',\n 'hovered & !pressed': '#primary-accent-text',\n disabled: '#disabled-surface-text',\n },\n} as const;\n\n// ---------- DANGER THEME ----------\nexport const DANGER_PRIMARY_STYLES: Styles = {\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: {\n '': '#white.2',\n pressed: '#danger-accent-text',\n disabled: 'transparent',\n },\n // See `DEFAULT_PRIMARY_STYLES.fill` for the layer-shape + ramp rationale.\n fill: {\n '': '#surface #danger-accent-surface',\n hovered: '#surface #danger-accent-surface-2',\n pressed: '#surface #danger-accent-surface-3',\n disabled: '#surface #danger-accent-disabled-surface',\n },\n color: {\n '': '#white',\n disabled: '#danger-accent-disabled-surface-text',\n },\n} as const;\n\nexport const DANGER_OUTLINE_STYLES: Styles = {\n // Non-selected = old DANGER OUTLINE; selected = old DANGER SECONDARY.\n // Border uses the OPAQUE `#danger-border` token (the neutral `border` ramp\n // re-resolved at `saturation: 0.5` per danger-theme — see\n // `TINTED_SURFACE_OVERRIDE` in `palette.ts`). It replaces an alpha-blended\n // brand-text border so adjacent borders in grouped layouts don't double up\n // at their overlap into a darker stripe.\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: {\n '': '#danger-border',\n disabled: '#border',\n },\n fill: {\n '': '#surface-2 #danger-accent-surface.0',\n hovered: '#surface-2 #danger-accent-surface.03',\n pressed: '#surface-2 #danger-accent-surface.09',\n selected: '#surface-2 #danger-accent-surface.09',\n 'selected & (hovered | focused)': '#surface-2 #danger-accent-surface.12',\n 'selected & pressed': '#surface-2 #danger-accent-surface.18',\n disabled: '#surface-2 #disabled-surface',\n 'selected & disabled': '#surface-2 #danger-accent-surface.08',\n },\n color: {\n '': '#danger-accent-text-soft',\n selected: '#danger-accent-text',\n disabled: '#disabled-surface-text',\n 'selected & disabled': '#danger-accent-disabled-text',\n },\n} as const;\n\nexport const DANGER_OUTLINE_2_STYLES: Styles = {\n ...DANGER_OUTLINE_STYLES,\n fill: {\n '': '#surface-3 #danger-accent-surface.0',\n hovered: '#surface-3 #danger-accent-surface.03',\n pressed: '#surface-3 #danger-accent-surface.09',\n selected: '#surface-3 #danger-accent-surface.09',\n 'selected & (hovered | focused)': '#surface-3 #danger-accent-surface.12',\n 'selected & pressed': '#surface-3 #danger-accent-surface.18',\n disabled: '#surface-3 #disabled-surface',\n 'selected & disabled': '#surface-3 #danger-accent-surface.08',\n },\n} as const;\n\nexport const DANGER_CLEAR_STYLES: Styles = {\n // Non-selected = old DANGER NEUTRAL: dark-tinted overlay; pressed switches\n // text to `#danger-accent-text` (matches old neutral).\n // Selected = old DANGER CLEAR: danger-text-tinted overlay.\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: {\n '': 'transparent',\n },\n fill: {\n '': '#surface-text.0',\n 'hovered | focused': '#surface-text.04',\n pressed: '#surface-text.06',\n selected: '#danger-accent-text.09',\n 'selected & (hovered | focused)': '#danger-accent-text.12',\n 'selected & pressed': '#danger-accent-text.18',\n disabled: 'transparent',\n 'selected & disabled': '#danger-accent-text.08',\n },\n color: {\n '': '#danger-accent-text-soft',\n selected: '#danger-accent-text',\n disabled: '#disabled-surface-text',\n 'selected & disabled': '#danger-accent-disabled-text',\n },\n} as const;\n\nexport const DANGER_LINK_STYLES: Styles = {\n // See DEFAULT_LINK_STYLES for the soft→strong rationale.\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: 0,\n fill: {\n '': 'transparent',\n },\n color: {\n '': '#danger-accent-text-soft',\n 'hovered & !pressed': '#danger-accent-text',\n disabled: '#disabled-surface-text',\n },\n} as const;\n\nexport const DANGER_ITEM_STYLES: Styles = {\n border: 'transparent',\n fill: {\n '': '#danger-accent-text.0',\n 'hovered | focused': '#danger-accent-text.03',\n selected: '#danger-accent-text.09',\n 'selected & (hovered | focused)': '#danger-accent-text.12',\n pressed: '#danger-accent-text.09',\n disabled: 'transparent',\n },\n color: {\n '': '#danger-accent-text',\n hovered: '#danger-accent-text',\n pressed: '#danger-accent-text',\n disabled: '#danger-accent-text.4',\n },\n} as const;\n\n// ---------- SUCCESS THEME ----------\nexport const SUCCESS_PRIMARY_STYLES: Styles = {\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: {\n '': '#white.2',\n pressed: '#success-accent-text',\n disabled: 'transparent',\n },\n // See `DEFAULT_PRIMARY_STYLES.fill` for the layer-shape + ramp rationale.\n fill: {\n '': '#surface #success-accent-surface',\n hovered: '#surface #success-accent-surface-2',\n pressed: '#surface #success-accent-surface-3',\n disabled: '#surface #success-accent-disabled-surface',\n },\n color: {\n '': '#white',\n disabled: '#success-accent-disabled-surface-text',\n },\n} as const;\n\nexport const SUCCESS_OUTLINE_STYLES: Styles = {\n // Non-selected = old SUCCESS OUTLINE; selected = old SUCCESS SECONDARY.\n // See DANGER_OUTLINE_STYLES for the border-anchor rationale.\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: {\n '': '#success-border',\n disabled: '#border',\n },\n fill: {\n '': '#surface-2 #success-accent-surface.0',\n hovered: '#surface-2 #success-accent-surface.03',\n pressed: '#surface-2 #success-accent-surface.09',\n selected: '#surface-2 #success-accent-surface.09',\n 'selected & (hovered | focused)': '#surface-2 #success-accent-surface.12',\n 'selected & pressed': '#surface-2 #success-accent-surface.18',\n disabled: '#surface-2 #disabled-surface',\n 'selected & disabled': '#surface-2 #success-accent-surface.08',\n },\n color: {\n '': '#success-accent-text-soft',\n selected: '#success-accent-text',\n disabled: '#disabled-surface-text',\n 'selected & disabled': '#success-accent-disabled-text',\n },\n} as const;\n\nexport const SUCCESS_OUTLINE_2_STYLES: Styles = {\n ...SUCCESS_OUTLINE_STYLES,\n fill: {\n '': '#surface-3 #success-accent-surface.0',\n hovered: '#surface-3 #success-accent-surface.03',\n pressed: '#surface-3 #success-accent-surface.09',\n selected: '#surface-3 #success-accent-surface.09',\n 'selected & (hovered | focused)': '#surface-3 #success-accent-surface.12',\n 'selected & pressed': '#surface-3 #success-accent-surface.18',\n disabled: '#surface-3 #disabled-surface',\n 'selected & disabled': '#surface-3 #success-accent-surface.08',\n },\n} as const;\n\nexport const SUCCESS_CLEAR_STYLES: Styles = {\n // Non-selected = old SUCCESS NEUTRAL; selected = old SUCCESS CLEAR.\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: {\n '': 'transparent',\n },\n fill: {\n '': '#surface-text.0',\n 'hovered | focused': '#surface-text.04',\n pressed: '#surface-text.06',\n selected: '#success-accent-text.09',\n 'selected & (hovered | focused)': '#success-accent-text.12',\n 'selected & pressed': '#success-accent-text.18',\n disabled: 'transparent',\n 'selected & disabled': '#success-accent-text.08',\n },\n color: {\n '': '#success-accent-text-soft',\n selected: '#success-accent-text',\n disabled: '#disabled-surface-text',\n 'selected & disabled': '#success-accent-disabled-text',\n },\n} as const;\n\nexport const SUCCESS_LINK_STYLES: Styles = {\n // See DEFAULT_LINK_STYLES for the soft→strong rationale.\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: 0,\n fill: {\n '': 'transparent',\n },\n color: {\n '': '#success-accent-text-soft',\n 'hovered & !pressed': '#success-accent-text',\n disabled: '#disabled-surface-text',\n },\n} as const;\n\nexport const SUCCESS_ITEM_STYLES: Styles = {\n border: 'transparent',\n fill: {\n '': '#success-accent-text.0',\n 'hovered | focused': '#success-accent-text.03',\n selected: '#success-accent-text.09',\n 'selected & (hovered | focused)': '#success-accent-text.12',\n pressed: '#success-accent-text.09',\n disabled: 'transparent',\n },\n color: {\n '': '#success-accent-text',\n hovered: '#success-accent-text',\n pressed: '#success-accent-text',\n disabled: '#success-accent-text.4',\n },\n} as const;\n\n// ---------- WARNING THEME ----------\nexport const WARNING_PRIMARY_STYLES: Styles = {\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: {\n '': '#white.2',\n pressed: '#warning-accent-text',\n disabled: 'transparent',\n },\n // See `DEFAULT_PRIMARY_STYLES.fill` for the layer-shape + ramp rationale.\n fill: {\n '': '#surface #warning-accent-surface',\n hovered: '#surface #warning-accent-surface-2',\n pressed: '#surface #warning-accent-surface-3',\n disabled: '#surface #warning-accent-disabled-surface',\n },\n color: {\n '': '#white',\n disabled: '#warning-accent-disabled-surface-text',\n },\n} as const;\n\nexport const WARNING_OUTLINE_STYLES: Styles = {\n // Non-selected = old WARNING OUTLINE; selected = old WARNING SECONDARY.\n // See DANGER_OUTLINE_STYLES for the border-anchor rationale.\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: {\n '': '#warning-border',\n disabled: '#border',\n },\n fill: {\n '': '#surface-2 #warning-accent-surface.0',\n hovered: '#surface-2 #warning-accent-surface.03',\n pressed: '#surface-2 #warning-accent-surface.09',\n selected: '#surface-2 #warning-accent-surface.09',\n 'selected & (hovered | focused)': '#surface-2 #warning-accent-surface.12',\n 'selected & pressed': '#surface-2 #warning-accent-surface.18',\n disabled: '#surface-2 #disabled-surface',\n 'selected & disabled': '#surface-2 #warning-accent-surface.08',\n },\n color: {\n '': '#warning-accent-text-soft',\n selected: '#warning-accent-text',\n disabled: '#disabled-surface-text',\n 'selected & disabled': '#warning-accent-disabled-text',\n },\n} as const;\n\nexport const WARNING_OUTLINE_2_STYLES: Styles = {\n ...WARNING_OUTLINE_STYLES,\n fill: {\n '': '#surface-3 #warning-accent-surface.0',\n hovered: '#surface-3 #warning-accent-surface.03',\n pressed: '#surface-3 #warning-accent-surface.09',\n selected: '#surface-3 #warning-accent-surface.09',\n 'selected & (hovered | focused)': '#surface-3 #warning-accent-surface.12',\n 'selected & pressed': '#surface-3 #warning-accent-surface.18',\n disabled: '#surface-3 #disabled-surface',\n 'selected & disabled': '#surface-3 #warning-accent-surface.08',\n },\n} as const;\n\nexport const WARNING_CLEAR_STYLES: Styles = {\n // Non-selected = old WARNING NEUTRAL; selected = old WARNING CLEAR.\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: {\n '': 'transparent',\n },\n fill: {\n '': '#surface-text.0',\n 'hovered | focused': '#surface-text.04',\n pressed: '#surface-text.06',\n selected: '#warning-accent-text.09',\n 'selected & (hovered | focused)': '#warning-accent-text.12',\n 'selected & pressed': '#warning-accent-text.18',\n disabled: 'transparent',\n 'selected & disabled': '#warning-accent-text.08',\n },\n color: {\n '': '#warning-accent-text-soft',\n selected: '#warning-accent-text',\n disabled: '#disabled-surface-text',\n 'selected & disabled': '#warning-accent-disabled-text',\n },\n} as const;\n\nexport const WARNING_LINK_STYLES: Styles = {\n // See DEFAULT_LINK_STYLES for the soft→strong rationale.\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: 0,\n fill: {\n '': 'transparent',\n },\n color: {\n '': '#warning-accent-text-soft',\n 'hovered & !pressed': '#warning-accent-text',\n disabled: '#disabled-surface-text',\n },\n} as const;\n\nexport const WARNING_ITEM_STYLES: Styles = {\n border: 'transparent',\n fill: {\n '': '#warning-accent-text.0',\n 'hovered | focused': '#warning-accent-text.03',\n selected: '#warning-accent-text.09',\n 'selected & (hovered | focused)': '#warning-accent-text.12',\n pressed: '#warning-accent-text.09',\n disabled: 'transparent',\n },\n color: {\n '': '#warning-accent-text',\n hovered: '#warning-accent-text',\n pressed: '#warning-accent-text',\n disabled: '#warning-accent-text.4',\n },\n} as const;\n\n// ---------- NOTE THEME ----------\nexport const NOTE_PRIMARY_STYLES: Styles = {\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: {\n '': '#white.2',\n pressed: '#note-accent-text',\n disabled: 'transparent',\n },\n // See `DEFAULT_PRIMARY_STYLES.fill` for the layer-shape + ramp rationale.\n fill: {\n '': '#surface #note-accent-surface',\n hovered: '#surface #note-accent-surface-2',\n pressed: '#surface #note-accent-surface-3',\n disabled: '#surface #note-accent-disabled-surface',\n },\n color: {\n '': '#white',\n disabled: '#note-accent-disabled-surface-text',\n },\n} as const;\n\nexport const NOTE_OUTLINE_STYLES: Styles = {\n // Non-selected = old NOTE OUTLINE; selected = old NOTE SECONDARY.\n // See DANGER_OUTLINE_STYLES for the border-anchor rationale.\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: {\n '': '#note-border',\n disabled: '#border',\n },\n fill: {\n '': '#surface-2 #note-accent-surface.0',\n hovered: '#surface-2 #note-accent-surface.03',\n pressed: '#surface-2 #note-accent-surface.09',\n selected: '#surface-2 #note-accent-surface.09',\n 'selected & (hovered | focused)': '#surface-2 #note-accent-surface.12',\n 'selected & pressed': '#surface-2 #note-accent-surface.18',\n disabled: '#surface-2 #disabled-surface',\n 'selected & disabled': '#surface-2 #note-accent-surface.08',\n },\n color: {\n '': '#note-accent-text-soft',\n selected: '#note-accent-text',\n disabled: '#disabled-surface-text',\n 'selected & disabled': '#note-accent-disabled-text',\n },\n} as const;\n\nexport const NOTE_OUTLINE_2_STYLES: Styles = {\n ...NOTE_OUTLINE_STYLES,\n fill: {\n '': '#surface-3 #note-accent-surface.0',\n hovered: '#surface-3 #note-accent-surface.03',\n pressed: '#surface-3 #note-accent-surface.09',\n selected: '#surface-3 #note-accent-surface.09',\n 'selected & (hovered | focused)': '#surface-3 #note-accent-surface.12',\n 'selected & pressed': '#surface-3 #note-accent-surface.18',\n disabled: '#surface-3 #disabled-surface',\n 'selected & disabled': '#surface-3 #note-accent-surface.08',\n },\n} as const;\n\nexport const NOTE_CLEAR_STYLES: Styles = {\n // Non-selected = old NOTE NEUTRAL; selected = old NOTE CLEAR.\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: {\n '': 'transparent',\n },\n fill: {\n '': '#surface-text.0',\n 'hovered | focused': '#surface-text.04',\n pressed: '#surface-text.06',\n selected: '#note-accent-text.09',\n 'selected & (hovered | focused)': '#note-accent-text.12',\n 'selected & pressed': '#note-accent-text.18',\n disabled: 'transparent',\n 'selected & disabled': '#note-accent-text.08',\n },\n color: {\n '': '#note-accent-text-soft',\n selected: '#note-accent-text',\n disabled: '#disabled-surface-text',\n 'selected & disabled': '#note-accent-disabled-text',\n },\n} as const;\n\nexport const NOTE_LINK_STYLES: Styles = {\n // See DEFAULT_LINK_STYLES for the soft→strong rationale.\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: 0,\n fill: {\n '': 'transparent',\n },\n color: {\n '': '#note-accent-text-soft',\n 'hovered & !pressed': '#note-accent-text',\n disabled: '#disabled-surface-text',\n },\n} as const;\n\nexport const NOTE_ITEM_STYLES: Styles = {\n border: 'transparent',\n fill: {\n '': '#note-accent-text.0',\n 'hovered | focused': '#note-accent-text.03',\n selected: '#note-accent-text.09',\n 'selected & (hovered | focused)': '#note-accent-text.12',\n pressed: '#note-accent-text.09',\n disabled: 'transparent',\n },\n color: {\n '': '#note-accent-text',\n hovered: '#note-accent-text',\n pressed: '#note-accent-text',\n disabled: '#note-accent-text.4',\n },\n} as const;\n\n// ---------- SPECIAL THEME ----------\n// Every color here resolves to a fixed-mode value (built-in `#white`, the\n// standalone `#special-*` theme in `src/tokens/palette.ts`, or `transparent`).\n// `mode: 'fixed'` makes the resolved OKHSL identical in light, dark, and\n// high-contrast, so the special theme renders the same regardless of schema.\n// The only intentionally adaptive colors are `VALIDATION_STYLES.border`\n// (`#danger-accent-text` / `#success-accent-text`) — validation state is allowed to follow\n// the active schema.\nexport const SPECIAL_PRIMARY_STYLES: Styles = {\n // Focus ring uses `#special-accent-text` — a fixed-mode dark-purple that\n // stays identical across light/dark/HC, matching the special theme's\n // \"intentionally non-inverting\" identity. Picked over `#primary-accent-text`\n // (the cross-theme default) which is `mode: 'auto'` and would shift in dark.\n outline: {\n '': '0 #special-accent-text.0',\n focused: '1bw #special-accent-text',\n },\n border: {\n '': '#special-accent-surface-border',\n pressed: '#special-accent-surface-border',\n disabled: 'transparent',\n },\n // See `DEFAULT_PRIMARY_STYLES.fill` for the layer-shape + ramp rationale.\n // The base layer is `#white` (matching the rest of the special theme's\n // anchor) instead of `#surface`, but the same monotonic `-1`/`-2`/`-3`\n // ramp gives the brand fill a visibly darker hover and pressed state.\n fill: {\n '': '#white #special-accent-surface',\n hovered: '#white #special-accent-surface-2',\n pressed: '#white #special-accent-surface-3',\n disabled: '#white #special-accent-disabled-surface',\n },\n color: {\n '': '#white',\n disabled: '#special-accent-disabled-surface-text',\n },\n} as const;\n\nexport const SPECIAL_OUTLINE_STYLES: Styles = {\n // Non-selected = old SPECIAL OUTLINE; selected = old SPECIAL SECONDARY.\n // Special is anchored on `#special-surface` (a fixed dark-purple base), so\n // contrast is added by *whitening* the overlay rather than darkening it.\n // The same default → hover → pressed monotonic-contrast pattern as the\n // light themes is preserved, just with white-alpha steps that are tuned\n // to read against the dark base.\n //\n // IMPORTANT: every alpha step within a single state-map must be a unique\n // value string. Tasty's `mergeEntriesByValue` pass coalesces entries that\n // share a serialized value into a single OR-condition entry whose priority\n // is the *max* of the merged group. If `hovered` and `disabled` were both\n // `#white.12`, the merged entry would sit at the higher priority and\n // negate against the `selected & (hovered | focused)` rule below, making\n // the latter resolve to FALSE for `selected & hovered`. Keeping every\n // alpha distinct sidesteps the collision.\n //\n // Focus ring uses the fixed-mode `#special-accent-text` so the indicator\n // stays schema-invariant alongside the rest of the special theme — see\n // `SPECIAL_PRIMARY_STYLES.outline` for the full rationale.\n outline: {\n '': '0 #special-accent-text.0',\n focused: '1bw #special-accent-text',\n },\n border: {\n '': '#white.15',\n selected: '#white.2',\n ...(VALIDATION_STYLES.border as Record<string, string>),\n },\n fill: {\n '': '#special-surface #white.0',\n hovered: '#special-surface #white.06',\n pressed: '#special-surface #white.12',\n selected: '#special-surface #white.18',\n 'selected & (hovered | focused)': '#special-surface #white.24',\n 'selected & pressed': '#special-surface #white.3',\n disabled: '#special-surface #white.04',\n // Stays in the white-alpha register: the base here is a fixed dark tone.\n // Like the colored themes, a disabled SELECTED control keeps the chip it\n // has when enabled and fades only the label — `.17` rather than a literal\n // reuse of `selected`'s `.18` so the two do not serialize identically and\n // trip `mergeEntriesByValue`, exactly as `SPECIAL_CLEAR_STYLES` documents.\n 'selected & disabled': '#special-surface #white.17',\n },\n // Mirrors the colored-theme soft→opaque pattern (`*-accent-text-soft` →\n // `*-accent-text`) using white-alpha steps: default is slightly muted so\n // that selected reads as the more prominent state.\n //\n // Both disabled labels are solved for cr ≈ 2.0 against the chip they sit on\n // — the house figure for a disabled label, which `disabled-surface-text`\n // hits against `surface` and which this theme's own `primary` disabled pair\n // hits at 1.73. They used to measure 3.24 and 4.21: not only too legible for\n // a dead control, but the wrong way round, since the selected one out-read\n // the plain one. The two alphas differ because they resolve against different chips\n // (`.04` and `.17`), which lands them on the same contrast rather than the\n // same opacity.\n color: {\n '': '#white.8',\n selected: '#white',\n disabled: '#white.23',\n 'selected & disabled': '#white.28',\n },\n} as const;\n\nexport const SPECIAL_CLEAR_STYLES: Styles = {\n // Non-selected = old SPECIAL NEUTRAL: transparent / white-tinted overlay\n // on the dark base.\n // Selected INVERTS the surface — the fill flips to a solid white pill with\n // dark accent-text on top. To express \"increasing contrast on press\" in\n // this inverted layout we go the *other* direction: pure white at rest →\n // slightly tinted on hover → more tinted on press, i.e. progressively\n // letting the dark base bleed through. This keeps the monotonic-contrast\n // pattern semantically (hover < pressed) while preserving the inversion.\n //\n // IMPORTANT: every alpha step within a single state-map must be a unique\n // value string. Tasty's `mergeEntriesByValue` pass coalesces entries that\n // share a serialized value into a single OR-condition entry whose priority\n // is the *max* of the merged group, which then negates against lower-\n // priority rules. If `'hovered | focused'` and `'selected & disabled'`\n // both used `#white.12`, the merged entry would sit at priority 7 and\n // negate against `'selected & (hovered | focused)'` (priority 4), making\n // it resolve to FALSE for `selected & hovered` — which is exactly the\n // \"selected-hover stays dark\" bug. `'selected & disabled'` therefore uses\n // `#white.98` rather than a literal reuse of `selected`'s `#white`: the 2%\n // of dark base bleeding through is invisible, and the string is distinct.\n // The default `''` and `disabled` may share `#white.0` because Tasty keeps\n // the TRUE/default entry separate from non-defaults during merging.\n //\n // Disabling a SELECTED control keeps the white pill and fades only the\n // label, the same rule the rest of this file follows — the chip is what says\n // \"this one is on\". Here that means fading the DARK label toward the pill\n // rather than a white one toward the base, so the disabled label is\n // `#special-accent-text` at `.45`: cr 1.95 against the pill, the same figure\n // the white-alpha variants are solved for.\n //\n // Focus ring uses the fixed-mode `#special-accent-text` so the indicator\n // stays schema-invariant alongside the rest of the special theme — see\n // `SPECIAL_PRIMARY_STYLES.outline` for the full rationale.\n outline: {\n '': '0 #special-accent-text.0',\n focused: '1bw #special-accent-text',\n },\n border: {\n '': 'transparent',\n ...(VALIDATION_STYLES.border as Record<string, string>),\n },\n fill: {\n '': '#white.0',\n 'hovered | focused': '#white.12',\n pressed: '#white.18',\n selected: '#white',\n 'selected & (hovered | focused)': '#white.94',\n 'selected & pressed': '#white.88',\n disabled: '#white.0',\n 'selected & disabled': '#white.98',\n },\n // Non-selected mirrors the colored-theme soft→opaque pattern with\n // white-alpha steps. Selected keeps its inverted look — dark accent-text\n // on a white pill — so the soft/opaque transition only applies to the\n // non-selected variant.\n color: {\n '': '#white.8',\n selected: '#special-accent-text',\n // Solved for cr ≈ 2.0 against what each one sits on — the bare surface, and\n // the selected white pill. See `SPECIAL_OUTLINE_STYLES.color`.\n disabled: '#white.23',\n 'selected & disabled': '#special-accent-text.45',\n },\n} as const;\n\nexport const SPECIAL_LINK_STYLES: Styles = {\n // See `SPECIAL_PRIMARY_STYLES.outline` for why we use the fixed-mode\n // `#special-accent-text` here instead of the cross-theme `#primary-accent-text`.\n outline: {\n '': '0 #special-accent-text.0',\n focused: '1bw #special-accent-text',\n },\n border: '0',\n fill: {\n '': 'transparent',\n },\n color: {\n '': '#white',\n 'hovered & !pressed': '#white.9',\n disabled: '#white.23',\n },\n} as const;\n\nexport const SPECIAL_ITEM_STYLES: Styles = {\n border: 'transparent',\n fill: {\n '': '#white.0',\n hovered: '#white.12',\n 'pressed | (selected & !hovered)': '#white.18',\n },\n color: {\n '': '#white',\n disabled: '#white.23',\n },\n} as const;\n\n// ---------- CURRENT THEME ----------\n// Every color is derived from the *inherited* text color (`#current` →\n// `currentcolor`), so the element adopts whatever color its context paints\n// with: a colored Alert, a dark banner, an image overlay, a chart tooltip.\n//\n// That makes it a THEME rather than a type. The other themes each pick a brand\n// ramp and let `type` decide the shape (filled, outlined, borderless, textual);\n// `current` picks the inherited color and lets `type` decide the same shapes.\n// Every type therefore has a flavour here, and the `theme` axis is what a host\n// component switches — `type` keeps meaning what it means everywhere else.\n//\n// `color: '#current'` compiles to `color: currentcolor`, which CSS resolves as\n// `color: inherit` — so the label stays fully opaque and, crucially, the\n// element's own `currentcolor` (used by `fill`/`border` below) is the INHERITED\n// color rather than a faded one. The alpha steps are then mixed off that same\n// color, which is why the whole ramp tracks the context automatically.\n//\n// IMPORTANT: every alpha step within one state-map must be a unique value\n// string — Tasty's `mergeEntriesByValue` pass coalesces equal values into one\n// OR-entry at the group's max priority, which then negates against\n// lower-priority rules. So no two steps in one map may share an alpha. See\n// `SPECIAL_OUTLINE_STYLES` for the full explanation.\n//\n// A note on `disabled`: fading the label also fades the element's own\n// `currentcolor`, so every other alpha is multiplied by .4 on that state.\n// Disabled `fill`/`border` are therefore written PRE-MULTIPLIED where they need\n// to stay visible.\n//\n// A note on what a single color cannot do: `primary` in every other theme is an\n// opaque brand fill under a `#white` label, and the inherited color is the only\n// thing on hand here — it can be the fill, but then nothing is left to punch the\n// label out with. `current.primary` therefore takes its label from a second\n// token, `#current-fill`, which defaults to the page and which a container can\n// redirect when the page is the wrong answer. See `CURRENT_PRIMARY_STYLES`.\n\n// The alpha ramp for the item flavour, held in custom properties rather than\n// written inline in `fill`. Two reasons:\n//\n// 1. Unlike the brand tokens, `#current` alphas do NOT adapt to the color\n// schema, so one ramp cannot serve both. Each step therefore carries the base\n// entry for the light schema and an `@dark` counterpart.\n// 2. Writing both ramps straight into one `fill` map would put twelve alpha\n// values in a single state-map, and Tasty's `mergeEntriesByValue` pass\n// coalesces any two equal value strings into one OR-entry at the group's max\n// priority, which then negates against lower-priority rules. Giving each\n// step its own 2-entry map keeps every value string unique by construction —\n// the constraint that `SPECIAL_OUTLINE_STYLES` documents the hard way.\n//\n// THE DARK STEPS ARE DERIVED, NOT AUTHORED. The same alpha is not the same step\n// in both schemas, and the direction is the opposite of what it looks like: near\n// the dark end of the scale a small sRGB move is a large perceptual one, so a\n// light tint on a dark surface reads STRONGER than the same tint of a dark label\n// on a light page. Each `@dark` value is therefore solved so its OKHST *tone*\n// delta from the surface matches the light step's — which, tone being\n// contrast-shaped, also lands the chip on the light step's contrast against the\n// page to three decimals:\n//\n// step light ΔT dark ΔT cr(chip, page)\n// hover .04 2.64 .031 2.62 1.084 / 1.083\n// press .06 3.99 .046 3.98 1.129 / 1.129\n// selected .18 12.57 .13 12.37 1.467 / 1.457\n// selected-hover .24 17.20 .175 17.16 1.689 / 1.686\n// selected-press .3 22.08 .221 22.13 1.959 / 1.961\n//\n// Every dark value is the solved one rounded to the shortest alpha that keeps it\n// within 2% of the target — `selected` is `.13` rather than the exact `.132`\n// because tasty computes the mix percentage as `parseFloat(alpha) * 100`, and\n// `.132` lands on `13.200000000000001%` in the emitted CSS.\n//\n// Measured against `#surface` / `#surface-text` in each schema, which is the only\n// tractable calibration: `current` paints from an arbitrary inherited color over\n// an arbitrary container, so a single ramp cannot be exact for all of them. The\n// neutral page pair is the common case, and matching it is what keeps the two\n// schemas recognisably the same ramp. Re-derive with Glaze's `oklabToOkhsl` +\n// `okhslToOkhst` if the neutral tokens move.\n//\n// Note that the label keeps its own margin throughout: the weakest dark step\n// still measures cr 13.3 against a near-white label and the strongest 7.3, so\n// nothing here approaches an AA floor.\n//\n// There is deliberately NO special-surface ramp. The `special` theme's fixed\n// dark-purple surface used to get its own `surface=special` steps, read from a\n// `data-surface` attribute — but only `ItemAction` and `ItemBadge` ever set it,\n// so `Button` and `Item` on the same surface silently used the light ramp, and\n// `theme` can no longer be `special` and `current` at once. A per-surface axis\n// that three of five call sites miss is worse than not having one.\n//\n// SELECTED steps jump well clear of the interaction steps rather than continuing\n// them. Every other theme marks selection with a brand *hue* — an accent-tinted\n// fill under an accent label — and `current` has exactly one color to work with,\n// so it cannot. Alpha is the only channel left, and a step that merely continued\n// the hover/press ramp (the original `.04 → .06 → .09`) read as a slightly dirty\n// background rather than an \"on\" state. Selection is a persistent state, not a\n// transient one, so it earns the bigger jump; hover and press stay subtle so an\n// unselected row full of actions does not look busy.\n//\n// The jump is authored once, on the light ramp, and the dark one follows from the\n// tone match below rather than being tuned against a contrast ceiling of its own.\n// An earlier version of this comment claimed the dark steps were capped by the AA\n// floor for their label at `.24`; that figure belonged to the SPECIAL surface,\n// whose `#white.8` label measures 4.53 against a `.21` chip. On the plain dark\n// page the label is opaque and the same steps measure 6.9-9.8, so there is no\n// ceiling to write under — which is why removing the special ramp also removes\n// the reason the dark steps were shaped by hand.\nconst CURRENT_ITEM_RAMP: Styles = {\n '$current-hover': {\n '': '#current.04',\n '@dark': '#current.031',\n },\n '$current-press': {\n '': '#current.06',\n '@dark': '#current.046',\n },\n '$current-selected': {\n '': '#current.18',\n '@dark': '#current.13',\n },\n '$current-selected-hover': {\n '': '#current.24',\n '@dark': '#current.175',\n },\n '$current-selected-press': {\n '': '#current.3',\n '@dark': '#current.221',\n },\n} as const;\n\n// The focus ring is the one color NOT taken from `#current`: every theme in this\n// file uses `#primary-accent-text` (the special theme swapping in its fixed-mode\n// counterpart), so the focus indicator stays the same wherever it appears.\nconst CURRENT_FOCUS_RING: Styles = {\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n} as const;\n\n// Item flavour — the `current` counterpart of `*_ITEM_STYLES`: no border,\n// nothing painted at rest, the fill appearing only on interaction. Used for\n// list rows (`Item`, `ItemButton`), where a resting chip on every row would read\n// as noise. Like the other `*_ITEM_STYLES` it leaves the focus ring to the base\n// styles (the collection that owns the row indicates focus), and only steps the\n// fill.\nexport const CURRENT_ITEM_STYLES: Styles = {\n ...CURRENT_ITEM_RAMP,\n border: 'transparent',\n fill: {\n '': '#current.0',\n 'hovered | focused': 'var(--current-hover)',\n pressed: 'var(--current-press)',\n selected: 'var(--current-selected)',\n 'selected & (hovered | focused)': 'var(--current-selected-hover)',\n 'selected & pressed': 'var(--current-selected-press)',\n disabled: 'transparent',\n },\n color: {\n '': '#current',\n // Fade exactly once per subtree, and only where nothing above has faded\n // already. `#current` is the color this element INHERITS, so a second `.4`\n // multiplies against the first and the label washes out — an action inside a\n // disabled row measured `.4` of an already muted token, roughly\n // `rgb(224,225,228)` on white, against the row's own `rgb(178,181,205)`.\n //\n // Two mods say \"someone above already did it\", and both are set by exactly\n // one caller:\n //\n // `inherit-disabled` `ItemAction`, when its disabled state came from the\n // surrounding `ItemActionProvider` rather than its own\n // prop — the host row already faded the color it paints\n // from.\n // `inside-wrapper` `ItemButton`, on the row it renders inside\n // `ActionsWrapper`. The wrapper reproduces this same\n // disabled color (see `ITEM_RESTING_COLOR_VARIANTS`) so\n // that actions rendered as SIBLINGS of the row inherit\n // a faded `currentcolor` too; the row is a descendant\n // of that wrapper, so it is already faded when it\n // arrives here.\n //\n // Neither mod is set on a standalone `Item` or on `Button`, so both keep\n // fading themselves exactly as before. Every `current` flavour states the\n // gate identically — a flavour that spelled it `disabled` alone would fade a\n // second time in both of those nestings.\n 'disabled & !inherit-disabled & !inside-wrapper': '#current.4',\n },\n} as const;\n\n// Clear flavour — the item ramp on a focusable control. `*_CLEAR_STYLES` and\n// `*_ITEM_STYLES` differ by exactly this in every other theme too: same\n// borderless shape, same interaction fill, plus the ring a standalone control\n// needs. It is the default flavour for `ItemAction` and `ItemBadge`.\nexport const CURRENT_CLEAR_STYLES: Styles = {\n ...CURRENT_ITEM_STYLES,\n ...CURRENT_FOCUS_RING,\n fill: {\n ...(CURRENT_ITEM_STYLES.fill as Record<string, string>),\n // The one entry `clear` adds to the item ramp, and the same split the\n // colored themes make: `*_ITEM_STYLES` let a disabled row fall back to a\n // bare `transparent`, while `*_CLEAR_STYLES` keep a chip so a disabled\n // segmented control still shows which option is active. Without it a\n // disabled selected `clear` rendered nothing at all — the state was\n // indistinguishable from an unselected one.\n //\n // `.18` is `CURRENT_OUTLINE_STYLES`' own disabled selected chip, so the two\n // differ by exactly the border, and it is authored high for the same reason\n // documented there: the disabled label dims `currentcolor` to `.4`, and\n // this alpha resolves against it, rendering as ~`.07`.\n 'selected & disabled': '#current.18',\n },\n} as const;\n\n// Outline flavour — a standalone control, so it carries its own weight: a\n// resting `#current.03` chip inside a `#current.08` border. `.03` is enough to\n// separate the button from a flat background without reading as a filled\n// surface, while leaving room for four distinguishable steps above it.\n// Disabled `fill`/`border` are pre-multiplied (`.06`/`.12` → an effective\n// `.024`/`.048`) so the chip stays a muted version of itself instead of\n// vanishing.\nexport const CURRENT_OUTLINE_STYLES: Styles = {\n ...CURRENT_FOCUS_RING,\n border: {\n '': '#current.08',\n 'hovered | focused': '#current.15',\n pressed: '#current.25',\n selected: '#current.3',\n 'selected & pressed': '#current.4',\n disabled: '#current.12',\n 'selected & disabled': '#current.35',\n },\n fill: {\n '': '#current.03',\n 'hovered | focused': '#current.07',\n pressed: '#current.1',\n selected: '#current.12',\n 'selected & (hovered | focused)': '#current.16',\n 'selected & pressed': '#current.2',\n disabled: '#current.06',\n // Alpha step rather than a brand token — `current` inherits `currentcolor`.\n // Authored high because the disabled label already dims `currentcolor` to\n // `.4`, and these alphas resolve against it: `.18` renders as ~.07.\n 'selected & disabled': '#current.18',\n },\n color: {\n '': '#current',\n // See `CURRENT_ITEM_STYLES.color` for why this is gated rather than a bare\n // `disabled`: both mods mark a color that something above already faded.\n 'disabled & !inherit-disabled & !inside-wrapper': '#current.4',\n },\n} as const;\n\n// Outline-2 flavour — `outline` for a container that is already painting\n// something. In the brand themes the difference is the opaque base (`#surface-3`\n// instead of `#surface-2`); `current` has no opaque base to swap, since every\n// step is a translucent tint over whatever is behind it. The same intent —\n// \"stay legible one rung further up the surface ladder\" — is therefore carried\n// by a heavier tint at every step: roughly double `outline`'s resting chip, so\n// the control still separates from a tinted or busy container.\nexport const CURRENT_OUTLINE_2_STYLES: Styles = {\n ...CURRENT_FOCUS_RING,\n border: {\n '': '#current.14',\n 'hovered | focused': '#current.22',\n pressed: '#current.3',\n selected: '#current.36',\n 'selected & pressed': '#current.45',\n disabled: '#current.2',\n 'selected & disabled': '#current.5',\n },\n fill: {\n '': '#current.06',\n 'hovered | focused': '#current.11',\n pressed: '#current.15',\n selected: '#current.17',\n 'selected & (hovered | focused)': '#current.21',\n // `.24` is the measured AA ceiling for a full-strength label on a dark\n // surface (see the ramp comment above) — the top step stops there rather\n // than continuing the interval.\n 'selected & pressed': '#current.24',\n disabled: '#current.1',\n 'selected & disabled': '#current.26',\n },\n color: {\n '': '#current',\n // See `CURRENT_ITEM_STYLES.color` for why this is gated rather than a bare\n // `disabled`: both mods mark a color that something above already faded.\n 'disabled & !inherit-disabled & !inside-wrapper': '#current.4',\n },\n} as const;\n\n// Primary flavour — the high-emphasis control, and the only `current` flavour\n// that fills opaquely: the fill is the inherited color at full opacity and the\n// label is punched out of it with `#current-fill`, exactly as every other\n// theme's `primary` paints `#white` on an opaque brand fill.\n//\n// `#current-fill` is the whole answer to the one problem this flavour has. The\n// pill IS `currentcolor`, so the label has to contrast with an arbitrary color,\n// and the page (`#surface`) only manages that while the inherited color sits\n// away from the page. A container whose own text color IS the page breaks it: a\n// dark banner paints `#white`, so the pill is white and a `#surface` label is\n// white too in light mode — cr 1.00, the button reads as a blank chip. Such a\n// container has the answer to hand — its own fill contrasts with its own text by\n// construction, and the pill is that text — so it sets `#current-fill` and the\n// label, the rim and the icon slots all follow. The token defaults to `#surface`\n// (see `CONTEXT_TOKENS` in `src/tokens/colors.ts`), which is what this flavour\n// always used, so nothing outside such a container moves.\n//\n// The states are the second fill layer. There is no lighter or darker sibling\n// of an arbitrary inherited color to step to — the brand ramps walk\n// `accent-surface` → `-2` → `-3` — so hover and pressed lay a translucent\n// `#black` over the same base instead, which darkens in both schemas and so\n// keeps the same monotonic direction the brand primaries have.\n//\n// The label CANNOT go through `color`. `#current` compiles to the literal\n// `currentcolor`, which in `fill` resolves against the element's OWN `color`,\n// so setting `color: '#current-fill'` would make the fill resolve to the\n// label color and paint a white pill with a white label. Tasty's `--current-color`\n// is no escape either: the `color` handler rewrites it on the same element.\n// `-webkit-text-fill-color` paints the glyphs without touching `color`, so\n// `currentcolor` keeps meaning the INHERITED color for `fill` and `border`.\n// Icons are SVG painted with `fill=\"currentColor\"`, which that property does not\n// reach, so they take the label color through the `Icon` sub-element.\nexport const CURRENT_PRIMARY_STYLES: Styles = {\n ...CURRENT_FOCUS_RING,\n // Every other `primary` rims its fill with a lighter sibling\n // (`accent-surface-border` over `accent-surface`, cr 1.48 against it in both\n // schemas). An arbitrary inherited color has no such sibling, so the rim comes\n // from the same token the label does — the one color guaranteed to sit on the\n // opposite side of the fill in either schema, and the one a container can\n // redirect, so the rim cannot come apart from the label it edges. `.25`\n // measures cr 1.82 in light and 1.55 in dark against the fill: the brand rim's\n // presence, a shade more so in light, where `current` has no other edge cue.\n //\n // Disabled swaps to the neutral text color, and has to. The chip there is a\n // `.4` tint sitting close to the page, so a `#surface` rim washes into the\n // page rather than defining the chip; `#surface-text` goes the other way and\n // holds cr ~1.5 against the chip AND 2.8–3.7 against the page. It is also\n // immune to the `.4` fade below, which `#current` is not — a `#current` rim on\n // a disabled chip resolves to the fill's own color and disappears.\n border: {\n '': '#current-fill.25',\n disabled: '#surface-text.2',\n },\n // The resting entry carries a transparent second layer so every state has the\n // same two-layer shape and the overlay interpolates instead of snapping in —\n // the same pin `DEFAULT_PRIMARY_STYLES.fill` documents. Without it the resting\n // rule emits no `background-image` at all, so hover has nothing to animate\n // from.\n fill: {\n '': '#current #black.0',\n 'hovered | focused': '#current #black.08',\n pressed: '#current #black.16',\n },\n // Disabled is expressed HERE and nowhere else, and that is the whole trick.\n // `fill` resolves `currentcolor` against this element's own `color`, so fading\n // it once fades the chip with it: the default entry still reads `#current`,\n // which under `disabled` is already the `.4` color, and the chip lands at\n // exactly `.4`. Writing `.4` in both would apply the fade twice and land it at\n // `.16` — the pre-multiply trap the other `current` ramps document at length.\n //\n // It has to fade rather than stay put, because descendants read it too: an\n // action inside a disabled row suppresses its OWN fade on the grounds that\n // the host already muted the color it paints from (see\n // `CURRENT_ITEM_STYLES.color`), so a host that stayed at full strength would\n // hand it a live color next to a dead chip.\n color: {\n '': '#current',\n // See `CURRENT_ITEM_STYLES.color` for why this is gated rather than a bare\n // `disabled`: both mods mark a color that something above already faded.\n 'disabled & !inherit-disabled & !inside-wrapper': '#current.4',\n },\n // The label. Faded on a bare `disabled`, unlike the `#current`-derived values\n // around it: the gate those carry protects an INHERITED value, since `#current`\n // is already muted by a disabled host and fading it again would multiply.\n // `#current-fill` is not inherited from that faded color — a container offers\n // the live value only — so this has to do the fading itself.\n '-webkit-text-fill-color': {\n '': '#current-fill',\n disabled: '#current-fill.5',\n },\n // Every slot that paints from `currentColor` rather than from the glyph fill.\n // `-webkit-text-fill-color` inherits into the text slots for free, but two\n // kinds of descendant escape it and would otherwise keep `color` — which on\n // this flavour is the FILL — and vanish into the chip they match:\n //\n // the icon slots, whose SVG is stroked with `currentColor`;\n // `Actions`, because a nested `Item.Action` defaults to `theme=\"current\"`\n // and mixes its own label from the `currentcolor` it inherits.\n //\n // This is the one variant where `color` is not the label, so it is the one\n // variant that has to hand the label down by hand.\n ...Object.fromEntries(\n ['Icon', 'RightIcon', 'Prefix', 'Suffix', 'Actions'].map((slot) => [\n slot,\n {\n // Icons are SVG stroked with `currentColor`, which\n // `-webkit-text-fill-color` never reaches, so each slot repeats the\n // label color — container override included.\n color: {\n '': '#current-fill',\n disabled: '#current-fill.5',\n },\n },\n ]),\n ),\n} as const;\n\n// Link flavour — no chip at all, only the label. The brand themes intensify from\n// `accent-text-soft` at rest to `accent-text` on hover; with one color to work\n// with, \"soft\" is that color at `.8` and \"strong\" is it at full opacity.\nexport const CURRENT_LINK_STYLES: Styles = {\n ...CURRENT_FOCUS_RING,\n border: 0,\n fill: {\n '': 'transparent',\n },\n color: {\n '': '#current.8',\n 'hovered & !pressed': '#current',\n // See `CURRENT_ITEM_STYLES.color`.\n 'disabled & !inherit-disabled & !inside-wrapper': '#current.4',\n },\n} as const;\n\n// Card flavour — the `current` counterpart of `*_CARD_STYLES`: a static,\n// non-interactive panel. The label stays at full opacity so the tint and border\n// resolve against the inherited color rather than a faded one.\nexport const CURRENT_CARD_STYLES: Styles = {\n border: '#current.2',\n fill: '#current.05',\n color: '#current',\n} as const;\n\n// ---------- CARD TYPE STYLES ----------\n// Card type only supports: default, success, danger, note themes (plus the\n// `current` theme — see `CURRENT_CARD_STYLES` above)\n\nexport const DEFAULT_CARD_STYLES: Styles = {\n border: '#surface-text.20',\n fill: '#surface-3',\n color: '#surface-text-soft',\n} as const;\n\nexport const SUCCESS_CARD_STYLES: Styles = {\n border: '#success-accent-surface.20',\n fill: '#success-surface',\n color: '#success-accent-text',\n} as const;\n\nexport const DANGER_CARD_STYLES: Styles = {\n border: '#danger-accent-surface.20',\n fill: '#danger-surface',\n color: '#danger-accent-text',\n} as const;\n\nexport const WARNING_CARD_STYLES: Styles = {\n border: '#warning-accent-surface.20',\n fill: '#warning-surface',\n color: '#warning-accent-text',\n} as const;\n\nexport const NOTE_CARD_STYLES: Styles = {\n border: '#note-accent-surface.20',\n fill: '#note-surface',\n color: '#note-accent-text',\n} as const;\n\nexport type ItemVariant =\n // Inherited-color theme — every flavour mixes its colors from `currentcolor`\n // instead of a brand ramp. See the CURRENT THEME section.\n | 'current.item'\n | 'current.primary'\n | 'current.outline'\n | 'current.outline-2'\n | 'current.clear'\n | 'current.link'\n | 'current.card'\n | 'default.primary'\n | 'default.outline'\n | 'default.outline-2'\n | 'default.clear'\n | 'default.link'\n | 'default.item'\n | 'default.card'\n | 'danger.primary'\n | 'danger.outline'\n | 'danger.outline-2'\n | 'danger.clear'\n | 'danger.link'\n | 'danger.item'\n | 'danger.card'\n | 'success.primary'\n | 'success.outline'\n | 'success.outline-2'\n | 'success.clear'\n | 'success.link'\n | 'success.item'\n | 'success.card'\n | 'warning.primary'\n | 'warning.outline'\n | 'warning.outline-2'\n | 'warning.clear'\n | 'warning.link'\n | 'warning.item'\n | 'warning.card'\n | 'note.primary'\n | 'note.outline'\n | 'note.outline-2'\n | 'note.clear'\n | 'note.link'\n | 'note.item'\n | 'note.card'\n | 'special.primary'\n | 'special.outline'\n | 'special.clear'\n | 'special.link'\n | 'special.item';\n\n// The single `theme.type` → styles map. Exported so `Item` and the projections\n// below cannot drift apart: `ITEM_RESTING_COLOR_VARIANTS` is derived from this\n// object rather than restating the palette.\nexport const ITEM_VARIANTS: Record<ItemVariant, Styles> = {\n // Current theme — colors mixed from the inherited `currentcolor`\n 'current.item': CURRENT_ITEM_STYLES,\n 'current.primary': CURRENT_PRIMARY_STYLES,\n 'current.outline': CURRENT_OUTLINE_STYLES,\n 'current.outline-2': CURRENT_OUTLINE_2_STYLES,\n 'current.clear': CURRENT_CLEAR_STYLES,\n 'current.link': CURRENT_LINK_STYLES,\n 'current.card': CURRENT_CARD_STYLES,\n // Default theme\n 'default.primary': DEFAULT_PRIMARY_STYLES,\n 'default.outline': DEFAULT_OUTLINE_STYLES,\n 'default.outline-2': DEFAULT_OUTLINE_2_STYLES,\n 'default.clear': DEFAULT_CLEAR_STYLES,\n 'default.link': DEFAULT_LINK_STYLES,\n 'default.item': DEFAULT_ITEM_STYLES,\n 'default.card': DEFAULT_CARD_STYLES,\n // Danger theme\n 'danger.primary': DANGER_PRIMARY_STYLES,\n 'danger.outline': DANGER_OUTLINE_STYLES,\n 'danger.outline-2': DANGER_OUTLINE_2_STYLES,\n 'danger.clear': DANGER_CLEAR_STYLES,\n 'danger.link': DANGER_LINK_STYLES,\n 'danger.item': DANGER_ITEM_STYLES,\n 'danger.card': DANGER_CARD_STYLES,\n // Success theme\n 'success.primary': SUCCESS_PRIMARY_STYLES,\n 'success.outline': SUCCESS_OUTLINE_STYLES,\n 'success.outline-2': SUCCESS_OUTLINE_2_STYLES,\n 'success.clear': SUCCESS_CLEAR_STYLES,\n 'success.link': SUCCESS_LINK_STYLES,\n 'success.item': SUCCESS_ITEM_STYLES,\n 'success.card': SUCCESS_CARD_STYLES,\n // Warning theme\n 'warning.primary': WARNING_PRIMARY_STYLES,\n 'warning.outline': WARNING_OUTLINE_STYLES,\n 'warning.outline-2': WARNING_OUTLINE_2_STYLES,\n 'warning.clear': WARNING_CLEAR_STYLES,\n 'warning.link': WARNING_LINK_STYLES,\n 'warning.item': WARNING_ITEM_STYLES,\n 'warning.card': WARNING_CARD_STYLES,\n // Note theme\n 'note.primary': NOTE_PRIMARY_STYLES,\n 'note.outline': NOTE_OUTLINE_STYLES,\n 'note.outline-2': NOTE_OUTLINE_2_STYLES,\n 'note.clear': NOTE_CLEAR_STYLES,\n 'note.link': NOTE_LINK_STYLES,\n 'note.item': NOTE_ITEM_STYLES,\n 'note.card': NOTE_CARD_STYLES,\n // Special theme\n 'special.primary': SPECIAL_PRIMARY_STYLES,\n 'special.outline': SPECIAL_OUTLINE_STYLES,\n 'special.clear': SPECIAL_CLEAR_STYLES,\n 'special.link': SPECIAL_LINK_STYLES,\n 'special.item': SPECIAL_ITEM_STYLES,\n};\n\n// Resolve a `theme` + `type` pair to the variant key that actually exists in\n// `ITEM_VARIANTS`. Two of the combinations users can write have no entry of\n// their own and are folded onto one that does.\n//\n// Shared rather than inlined because more than one component has to arrive at\n// the same answer: `Item` renders the row, and `ItemButton` repeats the lookup on\n// the wrapper that carries the row color to actions rendered outside it. Those\n// two drifted the moment they were written separately — the `special` fallback\n// below was missed, which silently resolved to a nonexistent\n// `special.outline-2`, left the wrapper with no color, and handed sibling actions\n// the page's `currentcolor` on a dark surface.\nexport function resolveItemVariant(\n theme: string | undefined,\n type: string | undefined,\n): ItemVariant {\n // The `special` theme has no `outline-2` variant (it paints over\n // `#special-surface`, not `#surface-2`/`#surface-3`); fall back to `outline`\n // so the item still renders.\n const effectiveType =\n theme === 'special' && type === 'outline-2' ? 'outline' : type;\n\n // `header` reuses the `item` visuals and is theme-agnostic.\n const variantType = effectiveType === 'header' ? 'item' : effectiveType;\n const variantTheme = effectiveType === 'header' ? 'default' : theme;\n\n return `${variantTheme}.${variantType}` as ItemVariant;\n}\n\n// Each variant reduced to the label colors an actions wrapper has to reproduce.\n//\n// The `current` theme paints from `currentcolor`, which only reaches an action\n// that is a DOM *descendant* of the row. `Item` renders its actions inside the\n// row element, so they inherit the row color for free — but `ItemButton` renders\n// them as a sibling of the button (deliberately, so the actions stay reachable\n// and are not nested inside a `<button>`), where `currentcolor` would inherit\n// from the page instead. Painting these colors on that wrapper restores the link.\n//\n// Resting AND disabled, and the second one is not optional. `ItemAction`\n// suppresses its own `.4` fade when the disabled state was inherited from the\n// host, on the grounds that the host has already faded the color it paints from —\n// which is only true if the wrapper actually reproduces the host's *disabled*\n// color. With resting alone, a disabled `ItemButton` rendered full-strength\n// actions next to its own faded label.\n//\n// The other states are still skipped: the wrapper is not the interactive element,\n// so it never carries `hovered` / `pressed` / `selected` and those entries could\n// never match there. `disabled` is different only because `ItemButton` passes it\n// down explicitly.\nconst ACTIONS_COLOR_OVERRIDES: Partial<\n Record<ItemVariant, Record<string, string>>\n> = {\n 'current.primary': {\n '': '#current-fill',\n disabled: '#current-fill.5',\n },\n};\n\nexport const ITEM_RESTING_COLOR_VARIANTS: Record<ItemVariant, Styles> =\n Object.fromEntries(\n Object.entries(ITEM_VARIANTS).map(([variant, styles]) => {\n const color = styles.color;\n\n if (!color || typeof color !== 'object') {\n return [variant, { color }];\n }\n\n // `current.primary` is the one variant whose `color` is not its label. It\n // keeps `color` as the inherited fill so `#current` resolves in `fill`,\n // and paints the label with `-webkit-text-fill-color`. Reproducing its\n // `color` on the wrapper would hand sibling actions the CHIP color and\n // they would vanish into it, so the override names the label instead —\n // the same value the `Actions` slot gets inside a plain `Item`.\n const map = (ACTIONS_COLOR_OVERRIDES[variant as ItemVariant] ??\n color) as Record<string, string>;\n // The `current` flavours state their fade as\n // `disabled & !inherit-disabled & !inside-wrapper` rather than a bare\n // `disabled`, and the wrapper wants exactly that value under a plain\n // `disabled`. It is entitled to it: the two negated mods mark \"something\n // above already faded this\", and the wrapper is the top of the subtree —\n // `ItemButton` gives it only `disabled`, never either mod. Reading just\n // `map.disabled` left those variants with no disabled color to hand down,\n // which is the failure the comment above describes: the row faded itself\n // and its sibling actions, which suppress their own fade under\n // `inherit-disabled`, stayed at full strength beside it.\n const disabled =\n map.disabled ?? map['disabled & !inherit-disabled & !inside-wrapper'];\n\n return [\n variant,\n { color: disabled ? { '': map[''], disabled } : map[''] },\n ];\n }),\n ) as Record<ItemVariant, Styles>;\n"],"mappings":"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"}
1
+ {"version":3,"file":"item-themes.js","names":[],"sources":["../../src/data/item-themes.ts"],"sourcesContent":["import type { Styles } from '@tenphi/tasty';\n\nexport const VALIDATION_STYLES: Styles = {\n border: {\n invalid: '#danger-accent-text',\n valid: '#success-accent-text',\n } as Record<string, string>,\n} as const;\n\n// Base styles shared between ItemAction and ItemBadge\nexport const ITEM_ACTION_BASE_STYLES: Styles = {\n display: 'inline-grid',\n flow: 'column',\n placeItems: 'center',\n placeContent: 'center',\n gap: 0,\n position: 'relative',\n margin: {\n '': '0 1bw 0 1bw',\n ':last-child & !:first-child': '0 $side-padding 0 0',\n '!:last-child & :first-child': '0 0 0 $side-padding',\n ':last-child & :first-child': '0 $side-padding',\n context: '0',\n },\n padding: 0,\n radius: '(1r - 1bw)',\n transition: 'theme',\n flexShrink: 0,\n textDecoration: 'none',\n boxSizing: 'border-box',\n whiteSpace: 'nowrap',\n border: 0,\n height: '$action-size',\n width: {\n '': '$action-size',\n 'has-label': 'auto',\n },\n placeSelf: 'center',\n\n // Side padding for the action buttons\n '$side-padding': '(($size - $action-size - 2bw) / 2)',\n // Size using custom property\n '$action-size':\n 'min(max((2x + 2bw), (($size, $size-md) - 1x - 2bw)), (3x - 2bw))',\n\n // Icon styles\n Icon: {\n $: '>',\n display: 'grid',\n placeItems: 'center',\n height: '($action-size - 2bw) ($action-size - 2bw)',\n width: '($action-size - 2bw) ($action-size - 2bw)',\n opacity: {\n '': 1,\n 'checkmark & selected': 1,\n 'checkmark & !selected': 0,\n 'checkmark & !selected & hovered': 0.4,\n },\n },\n} as const;\n\n// ---------- DEFAULT THEME ----------\nexport const DEFAULT_PRIMARY_STYLES: Styles = {\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: {\n '': '#primary-accent-surface-border',\n pressed: '#primary-accent-surface-border',\n disabled: 'transparent',\n },\n // All states share the same `#surface` base layer (opaque). Only the\n // *overlay* varies between brand color, hover shade, and disabled chip.\n // Keeping the layer shape identical (always two layers, same base, same\n // gradient overlay slot) lets `background-color`, `background-image` and\n // `--tasty-second-fill-color` all interpolate smoothly during the CSS\n // transition — without it, the gradient overlay would snap on/off and the\n // bg-color would briefly show through (the \"surface flash\" on form submit).\n //\n // The brand ramp `accent-surface` → `-2` → `-3` gives a monotonically\n // increasing contrast against `#surface` (cr ≈ 4.5 → 4.8 → 5.2 in light,\n // similar in dark), so hover and pressed read visibly *darker* than the\n // default state in both schemes. Disabled uses the brand-tinted,\n // scheme-symmetric chip (`accent-disabled-surface` cr ≈ 1.4 vs surface)\n // so the muted state stays identifiable as a brand color.\n fill: {\n '': '#surface #primary-accent-surface',\n hovered: '#surface #primary-accent-surface-2',\n pressed: '#surface #primary-accent-surface-3',\n disabled: '#surface #primary-accent-disabled-surface',\n },\n color: {\n '': '#white',\n disabled: '#primary-accent-disabled-surface-text',\n },\n} as const;\n\nexport const DEFAULT_OUTLINE_STYLES: Styles = {\n // Non-selected = old OUTLINE: neutral border + surface fill.\n // Selected (= old SECONDARY): brand-tinted fill + brand border.\n // Selected BORDER uses the OPAQUE `#primary-border` token (the neutral\n // `border` ramp re-resolved at `saturation: 0.5` per primary-theme — see\n // `TINTED_SURFACE_OVERRIDE` in `palette.ts`). It replaces an alpha-blended\n // brand-text border so adjacent borders in grouped layouts (e.g.\n // `RadioGroup type=\"button\"`) don't double up at their overlap into a\n // darker stripe. Selected FILL anchors to the *fixed* `#primary-accent-surface`\n // brand: anchoring to the adaptive `#primary-accent-text` would drift the\n // bg toward the text lightness in dark mode and collapse label↔bg contrast\n // below AA. Selected label mirrors LINK: soft `#primary-accent-text-soft` at\n // rest, intensifying to `#primary-accent-text` on hover. Both are solved in\n // `palette.ts` for AA against the BASE selected fill (`accent-selected-fill`).\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: {\n '': true,\n selected: '#primary-border',\n disabled: '#border',\n ...(VALIDATION_STYLES.border as Record<string, string>),\n },\n // Every state uses a two-layer fill: `#surface-2` (opaque base) + a tint\n // overlay. Keeping the layer shape identical across non-selected, selected\n // and disabled states lets the tint, base color, and gradient slot all\n // interpolate smoothly during the CSS transition. Selected states paint the\n // brand tint on top of `#surface-2` (slightly darker base than a\n // body-composited single-layer `#primary-accent-surface.X` would be, but\n // visually almost identical and free of the overlay-snap flash on click).\n // Disabled paints the neutral `#disabled-surface` chip on top of the same\n // base. When SELECTED it keeps the enabled selected chip instead and fades\n // only the LABEL, to `#accent-disabled-text` — so a disabled segmented\n // control still shows which option is active (CUB-3912) without the chip\n // changing weight at all. Every `selected & disabled` entry in this file\n // exists for that reason.\n //\n // Fading the label alone is what keeps the state honest. The chip is the\n // thing that says \"this one is on\", and a disabled control has no business\n // saying that more loudly than a live one — which is exactly what happened\n // while the state borrowed `accent-disabled-surface`: the mid-tone pill a\n // PRIMARY button steps DOWN to is a step UP from a 9% tint, and its\n // `tone: 'max'` label resolved to literal white in light mode. Building the\n // chip from the neutral disabled tone at brand chroma fixed the weight but\n // read over-saturated next to the enabled selected chips it sits beside.\n //\n // The `.08` is `selected`'s own `.09` minus a hair, and the difference is\n // deliberately imperceptible: the two entries must not serialize to the SAME\n // string. Tasty's `mergeEntriesByValue` pass coalesces equal values into one\n // OR-entry at the group's max priority, so a literal reuse of `.09` would\n // merge `selected` into `selected & disabled` and then negate against\n // `selected & (hovered | focused)` — the \"selected-hover stays dark\" bug that\n // `SPECIAL_CLEAR_STYLES` documents at length, which escapes it the same way.\n fill: {\n '': '#surface-2 #surface-text.0',\n hovered: '#surface-2 #surface-text.03',\n pressed: '#surface-2 #surface-text.09',\n selected: '#surface-2 #primary-accent-surface.09',\n 'selected & (hovered | focused)': '#surface-2 #primary-accent-surface.12',\n 'selected & pressed': '#surface-2 #primary-accent-surface.18',\n disabled: '#surface-2 #disabled-surface',\n 'selected & disabled': '#surface-2 #primary-accent-surface.08',\n },\n color: {\n '': '#surface-text-soft',\n hovered: '#surface-text-soft',\n pressed: '#surface-text',\n selected: '#primary-accent-text-soft',\n 'selected & hovered': '#primary-accent-text',\n disabled: '#disabled-surface-text',\n 'selected & disabled': '#primary-accent-disabled-text',\n },\n} as const;\n\n// Identical to DEFAULT_OUTLINE_STYLES but uses `#surface-3` as the fill base,\n// designed to sit on `#surface-2` containers without blending in.\nexport const DEFAULT_OUTLINE_2_STYLES: Styles = {\n ...DEFAULT_OUTLINE_STYLES,\n fill: {\n '': '#surface-3 #surface-text.0',\n hovered: '#surface-3 #surface-text.03',\n pressed: '#surface-3 #surface-text.09',\n selected: '#surface-3 #primary-accent-surface.09',\n 'selected & (hovered | focused)': '#surface-3 #primary-accent-surface.12',\n 'selected & pressed': '#surface-3 #primary-accent-surface.15',\n disabled: '#surface-3 #disabled-surface',\n 'selected & disabled': '#surface-3 #primary-accent-surface.08',\n },\n} as const;\n\nexport const DEFAULT_CLEAR_STYLES: Styles = {\n // Non-selected = old NEUTRAL: transparent / dark-tinted neutral look.\n // Selected = old CLEAR: brand-tinted overlay over the surface.\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: {\n '': 'transparent',\n ...(VALIDATION_STYLES.border as Record<string, string>),\n },\n fill: {\n '': '#surface-text.0',\n 'hovered | focused': '#surface-text.04',\n pressed: '#surface-text.06',\n selected: '#primary-accent-surface.09',\n 'selected & (hovered | focused)': '#primary-accent-surface.12',\n 'selected & pressed': '#primary-accent-surface.18',\n disabled: 'transparent',\n 'selected & disabled': '#primary-accent-surface.08',\n },\n // Selected label mirrors LINK: soft at rest, `#primary-accent-text` on\n // hover. See DEFAULT_OUTLINE_STYLES.\n color: {\n '': '#surface-text-soft',\n hovered: '#surface-text-soft',\n 'pressed & !selected': '#surface-text',\n selected: '#primary-accent-text-soft',\n 'selected & hovered': '#primary-accent-text',\n disabled: '#disabled-surface-text',\n 'selected & disabled': '#primary-accent-disabled-text',\n },\n} as const;\n\nexport const DEFAULT_ITEM_STYLES: Styles = {\n border: 'transparent',\n fill: {\n '': '#surface-text.0',\n 'hovered | focused': '#surface-text.04',\n pressed: '#surface-text.06',\n selected: '#surface-text.09',\n 'selected & (hovered | focused)': '#surface-text.12',\n 'selected & pressed': '#surface-text.15',\n disabled: 'transparent',\n },\n color: {\n '': '#surface-text-soft',\n hovered: '#surface-text-soft',\n selected: '#surface-text',\n disabled: '#disabled-surface-text',\n },\n} as const;\n\nexport const DEFAULT_LINK_STYLES: Styles = {\n // Default sits at `#primary-accent-text-soft` and intensifies on hover to the\n // stronger `#primary-accent-text`. Both are solved in `palette.ts` for AA\n // against `accent-selected-fill` (the BASE selected Item fill), so they also\n // clear AA on plain surfaces; both are adaptive across light/dark/HC.\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: '0',\n fill: {\n '': 'transparent',\n },\n color: {\n '': '#primary-accent-text-soft',\n 'hovered & !pressed': '#primary-accent-text',\n disabled: '#disabled-surface-text',\n },\n} as const;\n\n// ---------- DANGER THEME ----------\nexport const DANGER_PRIMARY_STYLES: Styles = {\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: {\n '': '#white.2',\n pressed: '#danger-accent-text',\n disabled: 'transparent',\n },\n // See `DEFAULT_PRIMARY_STYLES.fill` for the layer-shape + ramp rationale.\n fill: {\n '': '#surface #danger-accent-surface',\n hovered: '#surface #danger-accent-surface-2',\n pressed: '#surface #danger-accent-surface-3',\n disabled: '#surface #danger-accent-disabled-surface',\n },\n color: {\n '': '#white',\n disabled: '#danger-accent-disabled-surface-text',\n },\n} as const;\n\nexport const DANGER_OUTLINE_STYLES: Styles = {\n // Non-selected = old DANGER OUTLINE; selected = old DANGER SECONDARY.\n // Border uses the OPAQUE `#danger-border` token (the neutral `border` ramp\n // re-resolved at `saturation: 0.5` per danger-theme — see\n // `TINTED_SURFACE_OVERRIDE` in `palette.ts`). It replaces an alpha-blended\n // brand-text border so adjacent borders in grouped layouts don't double up\n // at their overlap into a darker stripe.\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: {\n '': '#danger-border',\n disabled: '#border',\n },\n fill: {\n '': '#surface-2 #danger-accent-surface.0',\n hovered: '#surface-2 #danger-accent-surface.03',\n pressed: '#surface-2 #danger-accent-surface.09',\n selected: '#surface-2 #danger-accent-surface.09',\n 'selected & (hovered | focused)': '#surface-2 #danger-accent-surface.12',\n 'selected & pressed': '#surface-2 #danger-accent-surface.18',\n disabled: '#surface-2 #disabled-surface',\n 'selected & disabled': '#surface-2 #danger-accent-surface.08',\n },\n color: {\n '': '#danger-accent-text-soft',\n selected: '#danger-accent-text',\n disabled: '#disabled-surface-text',\n 'selected & disabled': '#danger-accent-disabled-text',\n },\n} as const;\n\nexport const DANGER_OUTLINE_2_STYLES: Styles = {\n ...DANGER_OUTLINE_STYLES,\n fill: {\n '': '#surface-3 #danger-accent-surface.0',\n hovered: '#surface-3 #danger-accent-surface.03',\n pressed: '#surface-3 #danger-accent-surface.09',\n selected: '#surface-3 #danger-accent-surface.09',\n 'selected & (hovered | focused)': '#surface-3 #danger-accent-surface.12',\n 'selected & pressed': '#surface-3 #danger-accent-surface.18',\n disabled: '#surface-3 #disabled-surface',\n 'selected & disabled': '#surface-3 #danger-accent-surface.08',\n },\n} as const;\n\nexport const DANGER_CLEAR_STYLES: Styles = {\n // Non-selected = old DANGER NEUTRAL: dark-tinted overlay; pressed switches\n // text to `#danger-accent-text` (matches old neutral).\n // Selected = old DANGER CLEAR: danger-text-tinted overlay.\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: {\n '': 'transparent',\n },\n fill: {\n '': '#surface-text.0',\n 'hovered | focused': '#surface-text.04',\n pressed: '#surface-text.06',\n selected: '#danger-accent-text.09',\n 'selected & (hovered | focused)': '#danger-accent-text.12',\n 'selected & pressed': '#danger-accent-text.18',\n disabled: 'transparent',\n 'selected & disabled': '#danger-accent-text.08',\n },\n color: {\n '': '#danger-accent-text-soft',\n selected: '#danger-accent-text',\n disabled: '#disabled-surface-text',\n 'selected & disabled': '#danger-accent-disabled-text',\n },\n} as const;\n\nexport const DANGER_LINK_STYLES: Styles = {\n // See DEFAULT_LINK_STYLES for the soft→strong rationale.\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: 0,\n fill: {\n '': 'transparent',\n },\n color: {\n '': '#danger-accent-text-soft',\n 'hovered & !pressed': '#danger-accent-text',\n disabled: '#disabled-surface-text',\n },\n} as const;\n\nexport const DANGER_ITEM_STYLES: Styles = {\n border: 'transparent',\n fill: {\n '': '#danger-accent-text.0',\n 'hovered | focused': '#danger-accent-text.03',\n selected: '#danger-accent-text.09',\n 'selected & (hovered | focused)': '#danger-accent-text.12',\n pressed: '#danger-accent-text.09',\n disabled: 'transparent',\n },\n color: {\n '': '#danger-accent-text',\n hovered: '#danger-accent-text',\n pressed: '#danger-accent-text',\n disabled: '#danger-accent-text.4',\n },\n} as const;\n\n// ---------- SUCCESS THEME ----------\nexport const SUCCESS_PRIMARY_STYLES: Styles = {\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: {\n '': '#white.2',\n pressed: '#success-accent-text',\n disabled: 'transparent',\n },\n // See `DEFAULT_PRIMARY_STYLES.fill` for the layer-shape + ramp rationale.\n fill: {\n '': '#surface #success-accent-surface',\n hovered: '#surface #success-accent-surface-2',\n pressed: '#surface #success-accent-surface-3',\n disabled: '#surface #success-accent-disabled-surface',\n },\n color: {\n '': '#white',\n disabled: '#success-accent-disabled-surface-text',\n },\n} as const;\n\nexport const SUCCESS_OUTLINE_STYLES: Styles = {\n // Non-selected = old SUCCESS OUTLINE; selected = old SUCCESS SECONDARY.\n // See DANGER_OUTLINE_STYLES for the border-anchor rationale.\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: {\n '': '#success-border',\n disabled: '#border',\n },\n fill: {\n '': '#surface-2 #success-accent-surface.0',\n hovered: '#surface-2 #success-accent-surface.03',\n pressed: '#surface-2 #success-accent-surface.09',\n selected: '#surface-2 #success-accent-surface.09',\n 'selected & (hovered | focused)': '#surface-2 #success-accent-surface.12',\n 'selected & pressed': '#surface-2 #success-accent-surface.18',\n disabled: '#surface-2 #disabled-surface',\n 'selected & disabled': '#surface-2 #success-accent-surface.08',\n },\n color: {\n '': '#success-accent-text-soft',\n selected: '#success-accent-text',\n disabled: '#disabled-surface-text',\n 'selected & disabled': '#success-accent-disabled-text',\n },\n} as const;\n\nexport const SUCCESS_OUTLINE_2_STYLES: Styles = {\n ...SUCCESS_OUTLINE_STYLES,\n fill: {\n '': '#surface-3 #success-accent-surface.0',\n hovered: '#surface-3 #success-accent-surface.03',\n pressed: '#surface-3 #success-accent-surface.09',\n selected: '#surface-3 #success-accent-surface.09',\n 'selected & (hovered | focused)': '#surface-3 #success-accent-surface.12',\n 'selected & pressed': '#surface-3 #success-accent-surface.18',\n disabled: '#surface-3 #disabled-surface',\n 'selected & disabled': '#surface-3 #success-accent-surface.08',\n },\n} as const;\n\nexport const SUCCESS_CLEAR_STYLES: Styles = {\n // Non-selected = old SUCCESS NEUTRAL; selected = old SUCCESS CLEAR.\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: {\n '': 'transparent',\n },\n fill: {\n '': '#surface-text.0',\n 'hovered | focused': '#surface-text.04',\n pressed: '#surface-text.06',\n selected: '#success-accent-text.09',\n 'selected & (hovered | focused)': '#success-accent-text.12',\n 'selected & pressed': '#success-accent-text.18',\n disabled: 'transparent',\n 'selected & disabled': '#success-accent-text.08',\n },\n color: {\n '': '#success-accent-text-soft',\n selected: '#success-accent-text',\n disabled: '#disabled-surface-text',\n 'selected & disabled': '#success-accent-disabled-text',\n },\n} as const;\n\nexport const SUCCESS_LINK_STYLES: Styles = {\n // See DEFAULT_LINK_STYLES for the soft→strong rationale.\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: 0,\n fill: {\n '': 'transparent',\n },\n color: {\n '': '#success-accent-text-soft',\n 'hovered & !pressed': '#success-accent-text',\n disabled: '#disabled-surface-text',\n },\n} as const;\n\nexport const SUCCESS_ITEM_STYLES: Styles = {\n border: 'transparent',\n fill: {\n '': '#success-accent-text.0',\n 'hovered | focused': '#success-accent-text.03',\n selected: '#success-accent-text.09',\n 'selected & (hovered | focused)': '#success-accent-text.12',\n pressed: '#success-accent-text.09',\n disabled: 'transparent',\n },\n color: {\n '': '#success-accent-text',\n hovered: '#success-accent-text',\n pressed: '#success-accent-text',\n disabled: '#success-accent-text.4',\n },\n} as const;\n\n// ---------- WARNING THEME ----------\nexport const WARNING_PRIMARY_STYLES: Styles = {\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: {\n '': '#white.2',\n pressed: '#warning-accent-text',\n disabled: 'transparent',\n },\n // See `DEFAULT_PRIMARY_STYLES.fill` for the layer-shape + ramp rationale.\n fill: {\n '': '#surface #warning-accent-surface',\n hovered: '#surface #warning-accent-surface-2',\n pressed: '#surface #warning-accent-surface-3',\n disabled: '#surface #warning-accent-disabled-surface',\n },\n color: {\n '': '#white',\n disabled: '#warning-accent-disabled-surface-text',\n },\n} as const;\n\nexport const WARNING_OUTLINE_STYLES: Styles = {\n // Non-selected = old WARNING OUTLINE; selected = old WARNING SECONDARY.\n // See DANGER_OUTLINE_STYLES for the border-anchor rationale.\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: {\n '': '#warning-border',\n disabled: '#border',\n },\n fill: {\n '': '#surface-2 #warning-accent-surface.0',\n hovered: '#surface-2 #warning-accent-surface.03',\n pressed: '#surface-2 #warning-accent-surface.09',\n selected: '#surface-2 #warning-accent-surface.09',\n 'selected & (hovered | focused)': '#surface-2 #warning-accent-surface.12',\n 'selected & pressed': '#surface-2 #warning-accent-surface.18',\n disabled: '#surface-2 #disabled-surface',\n 'selected & disabled': '#surface-2 #warning-accent-surface.08',\n },\n color: {\n '': '#warning-accent-text-soft',\n selected: '#warning-accent-text',\n disabled: '#disabled-surface-text',\n 'selected & disabled': '#warning-accent-disabled-text',\n },\n} as const;\n\nexport const WARNING_OUTLINE_2_STYLES: Styles = {\n ...WARNING_OUTLINE_STYLES,\n fill: {\n '': '#surface-3 #warning-accent-surface.0',\n hovered: '#surface-3 #warning-accent-surface.03',\n pressed: '#surface-3 #warning-accent-surface.09',\n selected: '#surface-3 #warning-accent-surface.09',\n 'selected & (hovered | focused)': '#surface-3 #warning-accent-surface.12',\n 'selected & pressed': '#surface-3 #warning-accent-surface.18',\n disabled: '#surface-3 #disabled-surface',\n 'selected & disabled': '#surface-3 #warning-accent-surface.08',\n },\n} as const;\n\nexport const WARNING_CLEAR_STYLES: Styles = {\n // Non-selected = old WARNING NEUTRAL; selected = old WARNING CLEAR.\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: {\n '': 'transparent',\n },\n fill: {\n '': '#surface-text.0',\n 'hovered | focused': '#surface-text.04',\n pressed: '#surface-text.06',\n selected: '#warning-accent-text.09',\n 'selected & (hovered | focused)': '#warning-accent-text.12',\n 'selected & pressed': '#warning-accent-text.18',\n disabled: 'transparent',\n 'selected & disabled': '#warning-accent-text.08',\n },\n color: {\n '': '#warning-accent-text-soft',\n selected: '#warning-accent-text',\n disabled: '#disabled-surface-text',\n 'selected & disabled': '#warning-accent-disabled-text',\n },\n} as const;\n\nexport const WARNING_LINK_STYLES: Styles = {\n // See DEFAULT_LINK_STYLES for the soft→strong rationale.\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: 0,\n fill: {\n '': 'transparent',\n },\n color: {\n '': '#warning-accent-text-soft',\n 'hovered & !pressed': '#warning-accent-text',\n disabled: '#disabled-surface-text',\n },\n} as const;\n\nexport const WARNING_ITEM_STYLES: Styles = {\n border: 'transparent',\n fill: {\n '': '#warning-accent-text.0',\n 'hovered | focused': '#warning-accent-text.03',\n selected: '#warning-accent-text.09',\n 'selected & (hovered | focused)': '#warning-accent-text.12',\n pressed: '#warning-accent-text.09',\n disabled: 'transparent',\n },\n color: {\n '': '#warning-accent-text',\n hovered: '#warning-accent-text',\n pressed: '#warning-accent-text',\n disabled: '#warning-accent-text.4',\n },\n} as const;\n\n// ---------- NOTE THEME ----------\nexport const NOTE_PRIMARY_STYLES: Styles = {\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: {\n '': '#white.2',\n pressed: '#note-accent-text',\n disabled: 'transparent',\n },\n // See `DEFAULT_PRIMARY_STYLES.fill` for the layer-shape + ramp rationale.\n fill: {\n '': '#surface #note-accent-surface',\n hovered: '#surface #note-accent-surface-2',\n pressed: '#surface #note-accent-surface-3',\n disabled: '#surface #note-accent-disabled-surface',\n },\n color: {\n '': '#white',\n disabled: '#note-accent-disabled-surface-text',\n },\n} as const;\n\nexport const NOTE_OUTLINE_STYLES: Styles = {\n // Non-selected = old NOTE OUTLINE; selected = old NOTE SECONDARY.\n // See DANGER_OUTLINE_STYLES for the border-anchor rationale.\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: {\n '': '#note-border',\n disabled: '#border',\n },\n fill: {\n '': '#surface-2 #note-accent-surface.0',\n hovered: '#surface-2 #note-accent-surface.03',\n pressed: '#surface-2 #note-accent-surface.09',\n selected: '#surface-2 #note-accent-surface.09',\n 'selected & (hovered | focused)': '#surface-2 #note-accent-surface.12',\n 'selected & pressed': '#surface-2 #note-accent-surface.18',\n disabled: '#surface-2 #disabled-surface',\n 'selected & disabled': '#surface-2 #note-accent-surface.08',\n },\n color: {\n '': '#note-accent-text-soft',\n selected: '#note-accent-text',\n disabled: '#disabled-surface-text',\n 'selected & disabled': '#note-accent-disabled-text',\n },\n} as const;\n\nexport const NOTE_OUTLINE_2_STYLES: Styles = {\n ...NOTE_OUTLINE_STYLES,\n fill: {\n '': '#surface-3 #note-accent-surface.0',\n hovered: '#surface-3 #note-accent-surface.03',\n pressed: '#surface-3 #note-accent-surface.09',\n selected: '#surface-3 #note-accent-surface.09',\n 'selected & (hovered | focused)': '#surface-3 #note-accent-surface.12',\n 'selected & pressed': '#surface-3 #note-accent-surface.18',\n disabled: '#surface-3 #disabled-surface',\n 'selected & disabled': '#surface-3 #note-accent-surface.08',\n },\n} as const;\n\nexport const NOTE_CLEAR_STYLES: Styles = {\n // Non-selected = old NOTE NEUTRAL; selected = old NOTE CLEAR.\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: {\n '': 'transparent',\n },\n fill: {\n '': '#surface-text.0',\n 'hovered | focused': '#surface-text.04',\n pressed: '#surface-text.06',\n selected: '#note-accent-text.09',\n 'selected & (hovered | focused)': '#note-accent-text.12',\n 'selected & pressed': '#note-accent-text.18',\n disabled: 'transparent',\n 'selected & disabled': '#note-accent-text.08',\n },\n color: {\n '': '#note-accent-text-soft',\n selected: '#note-accent-text',\n disabled: '#disabled-surface-text',\n 'selected & disabled': '#note-accent-disabled-text',\n },\n} as const;\n\nexport const NOTE_LINK_STYLES: Styles = {\n // See DEFAULT_LINK_STYLES for the soft→strong rationale.\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n border: 0,\n fill: {\n '': 'transparent',\n },\n color: {\n '': '#note-accent-text-soft',\n 'hovered & !pressed': '#note-accent-text',\n disabled: '#disabled-surface-text',\n },\n} as const;\n\nexport const NOTE_ITEM_STYLES: Styles = {\n border: 'transparent',\n fill: {\n '': '#note-accent-text.0',\n 'hovered | focused': '#note-accent-text.03',\n selected: '#note-accent-text.09',\n 'selected & (hovered | focused)': '#note-accent-text.12',\n pressed: '#note-accent-text.09',\n disabled: 'transparent',\n },\n color: {\n '': '#note-accent-text',\n hovered: '#note-accent-text',\n pressed: '#note-accent-text',\n disabled: '#note-accent-text.4',\n },\n} as const;\n\n// ---------- SPECIAL THEME ----------\n// Every color here resolves to a fixed-mode value (built-in `#white`, the\n// standalone `#special-*` theme in `src/tokens/palette.ts`, or `transparent`).\n// `mode: 'fixed'` makes the resolved OKHSL identical in light, dark, and\n// high-contrast, so the special theme renders the same regardless of scheme.\n// The only intentionally adaptive colors are `VALIDATION_STYLES.border`\n// (`#danger-accent-text` / `#success-accent-text`) — validation state is allowed to follow\n// the active scheme.\nexport const SPECIAL_PRIMARY_STYLES: Styles = {\n // Focus ring uses `#special-accent-text` — a fixed-mode dark-purple that\n // stays identical across light/dark/HC, matching the special theme's\n // \"intentionally non-inverting\" identity. Picked over `#primary-accent-text`\n // (the cross-theme default) which is `mode: 'auto'` and would shift in dark.\n outline: {\n '': '0 #special-accent-text.0',\n focused: '1bw #special-accent-text',\n },\n border: {\n '': '#special-accent-surface-border',\n pressed: '#special-accent-surface-border',\n disabled: 'transparent',\n },\n // See `DEFAULT_PRIMARY_STYLES.fill` for the layer-shape + ramp rationale.\n // The base layer is `#white` (matching the rest of the special theme's\n // anchor) instead of `#surface`, but the same monotonic `-1`/`-2`/`-3`\n // ramp gives the brand fill a visibly darker hover and pressed state.\n fill: {\n '': '#white #special-accent-surface',\n hovered: '#white #special-accent-surface-2',\n pressed: '#white #special-accent-surface-3',\n disabled: '#white #special-accent-disabled-surface',\n },\n color: {\n '': '#white',\n disabled: '#special-accent-disabled-surface-text',\n },\n} as const;\n\nexport const SPECIAL_OUTLINE_STYLES: Styles = {\n // Non-selected = old SPECIAL OUTLINE; selected = old SPECIAL SECONDARY.\n // Special is anchored on `#special-surface` (a fixed dark-purple base), so\n // contrast is added by *whitening* the overlay rather than darkening it.\n // The same default → hover → pressed monotonic-contrast pattern as the\n // light themes is preserved, just with white-alpha steps that are tuned\n // to read against the dark base.\n //\n // IMPORTANT: every alpha step within a single state-map must be a unique\n // value string. Tasty's `mergeEntriesByValue` pass coalesces entries that\n // share a serialized value into a single OR-condition entry whose priority\n // is the *max* of the merged group. If `hovered` and `disabled` were both\n // `#white.12`, the merged entry would sit at the higher priority and\n // negate against the `selected & (hovered | focused)` rule below, making\n // the latter resolve to FALSE for `selected & hovered`. Keeping every\n // alpha distinct sidesteps the collision.\n //\n // Focus ring uses the fixed-mode `#special-accent-text` so the indicator\n // stays scheme-invariant alongside the rest of the special theme — see\n // `SPECIAL_PRIMARY_STYLES.outline` for the full rationale.\n outline: {\n '': '0 #special-accent-text.0',\n focused: '1bw #special-accent-text',\n },\n border: {\n '': '#white.15',\n selected: '#white.2',\n ...(VALIDATION_STYLES.border as Record<string, string>),\n },\n fill: {\n '': '#special-surface #white.0',\n hovered: '#special-surface #white.06',\n pressed: '#special-surface #white.12',\n selected: '#special-surface #white.18',\n 'selected & (hovered | focused)': '#special-surface #white.24',\n 'selected & pressed': '#special-surface #white.3',\n disabled: '#special-surface #white.04',\n // Stays in the white-alpha register: the base here is a fixed dark tone.\n // Like the colored themes, a disabled SELECTED control keeps the chip it\n // has when enabled and fades only the label — `.17` rather than a literal\n // reuse of `selected`'s `.18` so the two do not serialize identically and\n // trip `mergeEntriesByValue`, exactly as `SPECIAL_CLEAR_STYLES` documents.\n 'selected & disabled': '#special-surface #white.17',\n },\n // Mirrors the colored-theme soft→opaque pattern (`*-accent-text-soft` →\n // `*-accent-text`) using white-alpha steps: default is slightly muted so\n // that selected reads as the more prominent state.\n //\n // Both disabled labels are solved for cr ≈ 2.0 against the chip they sit on\n // — the house figure for a disabled label, which `disabled-surface-text`\n // hits against `surface` and which this theme's own `primary` disabled pair\n // hits at 1.73. They used to measure 3.24 and 4.21: not only too legible for\n // a dead control, but the wrong way round, since the selected one out-read\n // the plain one. The two alphas differ because they resolve against different chips\n // (`.04` and `.17`), which lands them on the same contrast rather than the\n // same opacity.\n color: {\n '': '#white.8',\n selected: '#white',\n disabled: '#white.23',\n 'selected & disabled': '#white.28',\n },\n} as const;\n\nexport const SPECIAL_CLEAR_STYLES: Styles = {\n // Non-selected = old SPECIAL NEUTRAL: transparent / white-tinted overlay\n // on the dark base.\n // Selected INVERTS the surface — the fill flips to a solid white pill with\n // dark accent-text on top. To express \"increasing contrast on press\" in\n // this inverted layout we go the *other* direction: pure white at rest →\n // slightly tinted on hover → more tinted on press, i.e. progressively\n // letting the dark base bleed through. This keeps the monotonic-contrast\n // pattern semantically (hover < pressed) while preserving the inversion.\n //\n // IMPORTANT: every alpha step within a single state-map must be a unique\n // value string. Tasty's `mergeEntriesByValue` pass coalesces entries that\n // share a serialized value into a single OR-condition entry whose priority\n // is the *max* of the merged group, which then negates against lower-\n // priority rules. If `'hovered | focused'` and `'selected & disabled'`\n // both used `#white.12`, the merged entry would sit at priority 7 and\n // negate against `'selected & (hovered | focused)'` (priority 4), making\n // it resolve to FALSE for `selected & hovered` — which is exactly the\n // \"selected-hover stays dark\" bug. `'selected & disabled'` therefore uses\n // `#white.98` rather than a literal reuse of `selected`'s `#white`: the 2%\n // of dark base bleeding through is invisible, and the string is distinct.\n // The default `''` and `disabled` may share `#white.0` because Tasty keeps\n // the TRUE/default entry separate from non-defaults during merging.\n //\n // Disabling a SELECTED control keeps the white pill and fades only the\n // label, the same rule the rest of this file follows — the chip is what says\n // \"this one is on\". Here that means fading the DARK label toward the pill\n // rather than a white one toward the base, so the disabled label is\n // `#special-accent-text` at `.45`: cr 1.95 against the pill, the same figure\n // the white-alpha variants are solved for.\n //\n // Focus ring uses the fixed-mode `#special-accent-text` so the indicator\n // stays scheme-invariant alongside the rest of the special theme — see\n // `SPECIAL_PRIMARY_STYLES.outline` for the full rationale.\n outline: {\n '': '0 #special-accent-text.0',\n focused: '1bw #special-accent-text',\n },\n border: {\n '': 'transparent',\n ...(VALIDATION_STYLES.border as Record<string, string>),\n },\n fill: {\n '': '#white.0',\n 'hovered | focused': '#white.12',\n pressed: '#white.18',\n selected: '#white',\n 'selected & (hovered | focused)': '#white.94',\n 'selected & pressed': '#white.88',\n disabled: '#white.0',\n 'selected & disabled': '#white.98',\n },\n // Non-selected mirrors the colored-theme soft→opaque pattern with\n // white-alpha steps. Selected keeps its inverted look — dark accent-text\n // on a white pill — so the soft/opaque transition only applies to the\n // non-selected variant.\n color: {\n '': '#white.8',\n selected: '#special-accent-text',\n // Solved for cr ≈ 2.0 against what each one sits on — the bare surface, and\n // the selected white pill. See `SPECIAL_OUTLINE_STYLES.color`.\n disabled: '#white.23',\n 'selected & disabled': '#special-accent-text.45',\n },\n} as const;\n\nexport const SPECIAL_LINK_STYLES: Styles = {\n // See `SPECIAL_PRIMARY_STYLES.outline` for why we use the fixed-mode\n // `#special-accent-text` here instead of the cross-theme `#primary-accent-text`.\n outline: {\n '': '0 #special-accent-text.0',\n focused: '1bw #special-accent-text',\n },\n border: '0',\n fill: {\n '': 'transparent',\n },\n color: {\n '': '#white',\n 'hovered & !pressed': '#white.9',\n disabled: '#white.23',\n },\n} as const;\n\nexport const SPECIAL_ITEM_STYLES: Styles = {\n border: 'transparent',\n fill: {\n '': '#white.0',\n hovered: '#white.12',\n 'pressed | (selected & !hovered)': '#white.18',\n },\n color: {\n '': '#white',\n disabled: '#white.23',\n },\n} as const;\n\n// ---------- CURRENT THEME ----------\n// Every color is derived from the *inherited* text color (`#current` →\n// `currentcolor`), so the element adopts whatever color its context paints\n// with: a colored Alert, a dark banner, an image overlay, a chart tooltip.\n//\n// That makes it a THEME rather than a type. The other themes each pick a brand\n// ramp and let `type` decide the shape (filled, outlined, borderless, textual);\n// `current` picks the inherited color and lets `type` decide the same shapes.\n// Every type therefore has a flavour here, and the `theme` axis is what a host\n// component switches — `type` keeps meaning what it means everywhere else.\n//\n// `color: '#current'` compiles to `color: currentcolor`, which CSS resolves as\n// `color: inherit` — so the label stays fully opaque and, crucially, the\n// element's own `currentcolor` (used by `fill`/`border` below) is the INHERITED\n// color rather than a faded one. The alpha steps are then mixed off that same\n// color, which is why the whole ramp tracks the context automatically.\n//\n// IMPORTANT: every alpha step within one state-map must be a unique value\n// string — Tasty's `mergeEntriesByValue` pass coalesces equal values into one\n// OR-entry at the group's max priority, which then negates against\n// lower-priority rules. So no two steps in one map may share an alpha. See\n// `SPECIAL_OUTLINE_STYLES` for the full explanation.\n//\n// A note on `disabled`: fading the label also fades the element's own\n// `currentcolor`, so every other alpha is multiplied by .4 on that state.\n// Disabled `fill`/`border` are therefore written PRE-MULTIPLIED where they need\n// to stay visible.\n//\n// A note on what a single color cannot do: `primary` in every other theme is an\n// opaque brand fill under a `#white` label, and the inherited color is the only\n// thing on hand here — it can be the fill, but then nothing is left to punch the\n// label out with. `current.primary` therefore takes its label from a second\n// token, `#current-fill`, which defaults to the page and which a container can\n// redirect when the page is the wrong answer. See `CURRENT_PRIMARY_STYLES`.\n\n// The alpha ramp for the item flavour, held in custom properties rather than\n// written inline in `fill`. Two reasons:\n//\n// 1. Unlike the brand tokens, `#current` alphas do NOT adapt to the color\n// scheme, so one ramp cannot serve both. Each step therefore carries the base\n// entry for the light scheme and an `@dark` counterpart.\n// 2. Writing both ramps straight into one `fill` map would put twelve alpha\n// values in a single state-map, and Tasty's `mergeEntriesByValue` pass\n// coalesces any two equal value strings into one OR-entry at the group's max\n// priority, which then negates against lower-priority rules. Giving each\n// step its own 2-entry map keeps every value string unique by construction —\n// the constraint that `SPECIAL_OUTLINE_STYLES` documents the hard way.\n//\n// THE DARK STEPS ARE DERIVED, NOT AUTHORED. The same alpha is not the same step\n// in both schemes, and the direction is the opposite of what it looks like: near\n// the dark end of the scale a small sRGB move is a large perceptual one, so a\n// light tint on a dark surface reads STRONGER than the same tint of a dark label\n// on a light page. Each `@dark` value is therefore solved so its OKHST *tone*\n// delta from the surface matches the light step's — which, tone being\n// contrast-shaped, also lands the chip on the light step's contrast against the\n// page to three decimals:\n//\n// step light ΔT dark ΔT cr(chip, page)\n// hover .04 2.64 .031 2.62 1.084 / 1.083\n// press .06 3.99 .046 3.98 1.129 / 1.129\n// selected .18 12.57 .13 12.37 1.467 / 1.457\n// selected-hover .24 17.20 .175 17.16 1.689 / 1.686\n// selected-press .3 22.08 .221 22.13 1.959 / 1.961\n//\n// Every dark value is the solved one rounded to the shortest alpha that keeps it\n// within 2% of the target — `selected` is `.13` rather than the exact `.132`\n// because tasty computes the mix percentage as `parseFloat(alpha) * 100`, and\n// `.132` lands on `13.200000000000001%` in the emitted CSS.\n//\n// Measured against `#surface` / `#surface-text` in each scheme, which is the only\n// tractable calibration: `current` paints from an arbitrary inherited color over\n// an arbitrary container, so a single ramp cannot be exact for all of them. The\n// neutral page pair is the common case, and matching it is what keeps the two\n// schemes recognisably the same ramp. Re-derive with Glaze's `oklabToOkhsl` +\n// `okhslToOkhst` if the neutral tokens move.\n//\n// Note that the label keeps its own margin throughout: the weakest dark step\n// still measures cr 13.3 against a near-white label and the strongest 7.3, so\n// nothing here approaches an AA floor.\n//\n// There is deliberately NO special-surface ramp. The `special` theme's fixed\n// dark-purple surface used to get its own `surface=special` steps, read from a\n// `data-surface` attribute — but only `ItemAction` and `ItemBadge` ever set it,\n// so `Button` and `Item` on the same surface silently used the light ramp, and\n// `theme` can no longer be `special` and `current` at once. A per-surface axis\n// that three of five call sites miss is worse than not having one.\n//\n// SELECTED steps jump well clear of the interaction steps rather than continuing\n// them. Every other theme marks selection with a brand *hue* — an accent-tinted\n// fill under an accent label — and `current` has exactly one color to work with,\n// so it cannot. Alpha is the only channel left, and a step that merely continued\n// the hover/press ramp (the original `.04 → .06 → .09`) read as a slightly dirty\n// background rather than an \"on\" state. Selection is a persistent state, not a\n// transient one, so it earns the bigger jump; hover and press stay subtle so an\n// unselected row full of actions does not look busy.\n//\n// The jump is authored once, on the light ramp, and the dark one follows from the\n// tone match below rather than being tuned against a contrast ceiling of its own.\n// An earlier version of this comment claimed the dark steps were capped by the AA\n// floor for their label at `.24`; that figure belonged to the SPECIAL surface,\n// whose `#white.8` label measures 4.53 against a `.21` chip. On the plain dark\n// page the label is opaque and the same steps measure 6.9-9.8, so there is no\n// ceiling to write under — which is why removing the special ramp also removes\n// the reason the dark steps were shaped by hand.\nconst CURRENT_ITEM_RAMP: Styles = {\n '$current-hover': {\n '': '#current.04',\n '@dark': '#current.031',\n },\n '$current-press': {\n '': '#current.06',\n '@dark': '#current.046',\n },\n '$current-selected': {\n '': '#current.18',\n '@dark': '#current.13',\n },\n '$current-selected-hover': {\n '': '#current.24',\n '@dark': '#current.175',\n },\n '$current-selected-press': {\n '': '#current.3',\n '@dark': '#current.221',\n },\n} as const;\n\n// The focus ring is the one color NOT taken from `#current`: every theme in this\n// file uses `#primary-accent-text` (the special theme swapping in its fixed-mode\n// counterpart), so the focus indicator stays the same wherever it appears.\nconst CURRENT_FOCUS_RING: Styles = {\n outline: {\n '': '0 #primary-accent-text.0',\n focused: '1bw #primary-accent-text',\n },\n} as const;\n\n// Item flavour — the `current` counterpart of `*_ITEM_STYLES`: no border,\n// nothing painted at rest, the fill appearing only on interaction. Used for\n// list rows (`Item`, `ItemButton`), where a resting chip on every row would read\n// as noise. Like the other `*_ITEM_STYLES` it leaves the focus ring to the base\n// styles (the collection that owns the row indicates focus), and only steps the\n// fill.\nexport const CURRENT_ITEM_STYLES: Styles = {\n ...CURRENT_ITEM_RAMP,\n border: 'transparent',\n fill: {\n '': '#current.0',\n 'hovered | focused': 'var(--current-hover)',\n pressed: 'var(--current-press)',\n selected: 'var(--current-selected)',\n 'selected & (hovered | focused)': 'var(--current-selected-hover)',\n 'selected & pressed': 'var(--current-selected-press)',\n disabled: 'transparent',\n },\n color: {\n '': '#current',\n // Fade exactly once per subtree, and only where nothing above has faded\n // already. `#current` is the color this element INHERITS, so a second `.4`\n // multiplies against the first and the label washes out — an action inside a\n // disabled row measured `.4` of an already muted token, roughly\n // `rgb(224,225,228)` on white, against the row's own `rgb(178,181,205)`.\n //\n // Two mods say \"someone above already did it\", and both are set by exactly\n // one caller:\n //\n // `inherit-disabled` `ItemAction`, when its disabled state came from the\n // surrounding `ItemActionProvider` rather than its own\n // prop — the host row already faded the color it paints\n // from.\n // `inside-wrapper` `ItemButton`, on the row it renders inside\n // `ActionsWrapper`. The wrapper reproduces this same\n // disabled color (see `ITEM_RESTING_COLOR_VARIANTS`) so\n // that actions rendered as SIBLINGS of the row inherit\n // a faded `currentcolor` too; the row is a descendant\n // of that wrapper, so it is already faded when it\n // arrives here.\n //\n // Neither mod is set on a standalone `Item` or on `Button`, so both keep\n // fading themselves exactly as before. Every `current` flavour states the\n // gate identically — a flavour that spelled it `disabled` alone would fade a\n // second time in both of those nestings.\n 'disabled & !inherit-disabled & !inside-wrapper': '#current.4',\n },\n} as const;\n\n// Clear flavour — the item ramp on a focusable control. `*_CLEAR_STYLES` and\n// `*_ITEM_STYLES` differ by exactly this in every other theme too: same\n// borderless shape, same interaction fill, plus the ring a standalone control\n// needs. It is the default flavour for `ItemAction` and `ItemBadge`.\nexport const CURRENT_CLEAR_STYLES: Styles = {\n ...CURRENT_ITEM_STYLES,\n ...CURRENT_FOCUS_RING,\n fill: {\n ...(CURRENT_ITEM_STYLES.fill as Record<string, string>),\n // The one entry `clear` adds to the item ramp, and the same split the\n // colored themes make: `*_ITEM_STYLES` let a disabled row fall back to a\n // bare `transparent`, while `*_CLEAR_STYLES` keep a chip so a disabled\n // segmented control still shows which option is active. Without it a\n // disabled selected `clear` rendered nothing at all — the state was\n // indistinguishable from an unselected one.\n //\n // `.18` is `CURRENT_OUTLINE_STYLES`' own disabled selected chip, so the two\n // differ by exactly the border, and it is authored high for the same reason\n // documented there: the disabled label dims `currentcolor` to `.4`, and\n // this alpha resolves against it, rendering as ~`.07`.\n 'selected & disabled': '#current.18',\n },\n} as const;\n\n// Outline flavour — a standalone control, so it carries its own weight: a\n// resting `#current.03` chip inside a `#current.08` border. `.03` is enough to\n// separate the button from a flat background without reading as a filled\n// surface, while leaving room for four distinguishable steps above it.\n// Disabled `fill`/`border` are pre-multiplied (`.06`/`.12` → an effective\n// `.024`/`.048`) so the chip stays a muted version of itself instead of\n// vanishing.\nexport const CURRENT_OUTLINE_STYLES: Styles = {\n ...CURRENT_FOCUS_RING,\n border: {\n '': '#current.08',\n 'hovered | focused': '#current.15',\n pressed: '#current.25',\n selected: '#current.3',\n 'selected & pressed': '#current.4',\n disabled: '#current.12',\n 'selected & disabled': '#current.35',\n },\n fill: {\n '': '#current.03',\n 'hovered | focused': '#current.07',\n pressed: '#current.1',\n selected: '#current.12',\n 'selected & (hovered | focused)': '#current.16',\n 'selected & pressed': '#current.2',\n disabled: '#current.06',\n // Alpha step rather than a brand token — `current` inherits `currentcolor`.\n // Authored high because the disabled label already dims `currentcolor` to\n // `.4`, and these alphas resolve against it: `.18` renders as ~.07.\n 'selected & disabled': '#current.18',\n },\n color: {\n '': '#current',\n // See `CURRENT_ITEM_STYLES.color` for why this is gated rather than a bare\n // `disabled`: both mods mark a color that something above already faded.\n 'disabled & !inherit-disabled & !inside-wrapper': '#current.4',\n },\n} as const;\n\n// Outline-2 flavour — `outline` for a container that is already painting\n// something. In the brand themes the difference is the opaque base (`#surface-3`\n// instead of `#surface-2`); `current` has no opaque base to swap, since every\n// step is a translucent tint over whatever is behind it. The same intent —\n// \"stay legible one rung further up the surface ladder\" — is therefore carried\n// by a heavier tint at every step: roughly double `outline`'s resting chip, so\n// the control still separates from a tinted or busy container.\nexport const CURRENT_OUTLINE_2_STYLES: Styles = {\n ...CURRENT_FOCUS_RING,\n border: {\n '': '#current.14',\n 'hovered | focused': '#current.22',\n pressed: '#current.3',\n selected: '#current.36',\n 'selected & pressed': '#current.45',\n disabled: '#current.2',\n 'selected & disabled': '#current.5',\n },\n fill: {\n '': '#current.06',\n 'hovered | focused': '#current.11',\n pressed: '#current.15',\n selected: '#current.17',\n 'selected & (hovered | focused)': '#current.21',\n // `.24` is the measured AA ceiling for a full-strength label on a dark\n // surface (see the ramp comment above) — the top step stops there rather\n // than continuing the interval.\n 'selected & pressed': '#current.24',\n disabled: '#current.1',\n 'selected & disabled': '#current.26',\n },\n color: {\n '': '#current',\n // See `CURRENT_ITEM_STYLES.color` for why this is gated rather than a bare\n // `disabled`: both mods mark a color that something above already faded.\n 'disabled & !inherit-disabled & !inside-wrapper': '#current.4',\n },\n} as const;\n\n// Primary flavour — the high-emphasis control, and the only `current` flavour\n// that fills opaquely: the fill is the inherited color at full opacity and the\n// label is punched out of it with `#current-fill`, exactly as every other\n// theme's `primary` paints `#white` on an opaque brand fill.\n//\n// `#current-fill` is the whole answer to the one problem this flavour has. The\n// pill IS `currentcolor`, so the label has to contrast with an arbitrary color,\n// and the page (`#surface`) only manages that while the inherited color sits\n// away from the page. A container whose own text color IS the page breaks it: a\n// dark banner paints `#white`, so the pill is white and a `#surface` label is\n// white too in light mode — cr 1.00, the button reads as a blank chip. Such a\n// container has the answer to hand — its own fill contrasts with its own text by\n// construction, and the pill is that text — so it sets `#current-fill` and the\n// label, the rim and the icon slots all follow. The token defaults to `#surface`\n// (see `CONTEXT_TOKENS` in `src/tokens/colors.ts`), which is what this flavour\n// always used, so nothing outside such a container moves.\n//\n// The states are the second fill layer. There is no lighter or darker sibling\n// of an arbitrary inherited color to step to — the brand ramps walk\n// `accent-surface` → `-2` → `-3` — so hover and pressed lay a translucent\n// `#black` over the same base instead, which darkens in both schemes and so\n// keeps the same monotonic direction the brand primaries have.\n//\n// The label CANNOT go through `color`. `#current` compiles to the literal\n// `currentcolor`, which in `fill` resolves against the element's OWN `color`,\n// so setting `color: '#current-fill'` would make the fill resolve to the\n// label color and paint a white pill with a white label. Tasty's `--current-color`\n// is no escape either: the `color` handler rewrites it on the same element.\n// `-webkit-text-fill-color` paints the glyphs without touching `color`, so\n// `currentcolor` keeps meaning the INHERITED color for `fill` and `border`.\n// Icons are SVG painted with `fill=\"currentColor\"`, which that property does not\n// reach, so they take the label color through the `Icon` sub-element.\nexport const CURRENT_PRIMARY_STYLES: Styles = {\n ...CURRENT_FOCUS_RING,\n // Every other `primary` rims its fill with a lighter sibling\n // (`accent-surface-border` over `accent-surface`, cr 1.48 against it in both\n // schemes). An arbitrary inherited color has no such sibling, so the rim comes\n // from the same token the label does — the one color guaranteed to sit on the\n // opposite side of the fill in either scheme, and the one a container can\n // redirect, so the rim cannot come apart from the label it edges. `.25`\n // measures cr 1.82 in light and 1.55 in dark against the fill: the brand rim's\n // presence, a shade more so in light, where `current` has no other edge cue.\n //\n // Disabled swaps to the neutral text color, and has to. The chip there is a\n // `.4` tint sitting close to the page, so a `#surface` rim washes into the\n // page rather than defining the chip; `#surface-text` goes the other way and\n // holds cr ~1.5 against the chip AND 2.8–3.7 against the page. It is also\n // immune to the `.4` fade below, which `#current` is not — a `#current` rim on\n // a disabled chip resolves to the fill's own color and disappears.\n border: {\n '': '#current-fill.25',\n disabled: '#surface-text.2',\n },\n // The resting entry carries a transparent second layer so every state has the\n // same two-layer shape and the overlay interpolates instead of snapping in —\n // the same pin `DEFAULT_PRIMARY_STYLES.fill` documents. Without it the resting\n // rule emits no `background-image` at all, so hover has nothing to animate\n // from.\n fill: {\n '': '#current #black.0',\n 'hovered | focused': '#current #black.08',\n pressed: '#current #black.16',\n },\n // Disabled is expressed HERE and nowhere else, and that is the whole trick.\n // `fill` resolves `currentcolor` against this element's own `color`, so fading\n // it once fades the chip with it: the default entry still reads `#current`,\n // which under `disabled` is already the `.4` color, and the chip lands at\n // exactly `.4`. Writing `.4` in both would apply the fade twice and land it at\n // `.16` — the pre-multiply trap the other `current` ramps document at length.\n //\n // It has to fade rather than stay put, because descendants read it too: an\n // action inside a disabled row suppresses its OWN fade on the grounds that\n // the host already muted the color it paints from (see\n // `CURRENT_ITEM_STYLES.color`), so a host that stayed at full strength would\n // hand it a live color next to a dead chip.\n color: {\n '': '#current',\n // See `CURRENT_ITEM_STYLES.color` for why this is gated rather than a bare\n // `disabled`: both mods mark a color that something above already faded.\n 'disabled & !inherit-disabled & !inside-wrapper': '#current.4',\n },\n // The label. Faded on a bare `disabled`, unlike the `#current`-derived values\n // around it: the gate those carry protects an INHERITED value, since `#current`\n // is already muted by a disabled host and fading it again would multiply.\n // `#current-fill` is not inherited from that faded color — a container offers\n // the live value only — so this has to do the fading itself.\n '-webkit-text-fill-color': {\n '': '#current-fill',\n disabled: '#current-fill.5',\n },\n // Every slot that paints from `currentColor` rather than from the glyph fill.\n // `-webkit-text-fill-color` inherits into the text slots for free, but two\n // kinds of descendant escape it and would otherwise keep `color` — which on\n // this flavour is the FILL — and vanish into the chip they match:\n //\n // the icon slots, whose SVG is stroked with `currentColor`;\n // `Actions`, because a nested `Item.Action` defaults to `theme=\"current\"`\n // and mixes its own label from the `currentcolor` it inherits.\n //\n // This is the one variant where `color` is not the label, so it is the one\n // variant that has to hand the label down by hand.\n ...Object.fromEntries(\n ['Icon', 'RightIcon', 'Prefix', 'Suffix', 'Actions'].map((slot) => [\n slot,\n {\n // Icons are SVG stroked with `currentColor`, which\n // `-webkit-text-fill-color` never reaches, so each slot repeats the\n // label color — container override included.\n color: {\n '': '#current-fill',\n disabled: '#current-fill.5',\n },\n },\n ]),\n ),\n} as const;\n\n// Link flavour — no chip at all, only the label. The brand themes intensify from\n// `accent-text-soft` at rest to `accent-text` on hover; with one color to work\n// with, \"soft\" is that color at `.8` and \"strong\" is it at full opacity.\nexport const CURRENT_LINK_STYLES: Styles = {\n ...CURRENT_FOCUS_RING,\n border: 0,\n fill: {\n '': 'transparent',\n },\n color: {\n '': '#current.8',\n 'hovered & !pressed': '#current',\n // See `CURRENT_ITEM_STYLES.color`.\n 'disabled & !inherit-disabled & !inside-wrapper': '#current.4',\n },\n} as const;\n\n// Card flavour — the `current` counterpart of `*_CARD_STYLES`: a static,\n// non-interactive panel. The label stays at full opacity so the tint and border\n// resolve against the inherited color rather than a faded one.\nexport const CURRENT_CARD_STYLES: Styles = {\n border: '#current.2',\n fill: '#current.05',\n color: '#current',\n} as const;\n\n// ---------- CARD TYPE STYLES ----------\n// Card type only supports: default, success, danger, note themes (plus the\n// `current` theme — see `CURRENT_CARD_STYLES` above)\n\nexport const DEFAULT_CARD_STYLES: Styles = {\n border: '#surface-text.20',\n fill: '#surface-3',\n color: '#surface-text-soft',\n} as const;\n\nexport const SUCCESS_CARD_STYLES: Styles = {\n border: '#success-accent-surface.20',\n fill: '#success-surface',\n color: '#success-accent-text',\n} as const;\n\nexport const DANGER_CARD_STYLES: Styles = {\n border: '#danger-accent-surface.20',\n fill: '#danger-surface',\n color: '#danger-accent-text',\n} as const;\n\nexport const WARNING_CARD_STYLES: Styles = {\n border: '#warning-accent-surface.20',\n fill: '#warning-surface',\n color: '#warning-accent-text',\n} as const;\n\nexport const NOTE_CARD_STYLES: Styles = {\n border: '#note-accent-surface.20',\n fill: '#note-surface',\n color: '#note-accent-text',\n} as const;\n\nexport type ItemVariant =\n // Inherited-color theme — every flavour mixes its colors from `currentcolor`\n // instead of a brand ramp. See the CURRENT THEME section.\n | 'current.item'\n | 'current.primary'\n | 'current.outline'\n | 'current.outline-2'\n | 'current.clear'\n | 'current.link'\n | 'current.card'\n | 'default.primary'\n | 'default.outline'\n | 'default.outline-2'\n | 'default.clear'\n | 'default.link'\n | 'default.item'\n | 'default.card'\n | 'danger.primary'\n | 'danger.outline'\n | 'danger.outline-2'\n | 'danger.clear'\n | 'danger.link'\n | 'danger.item'\n | 'danger.card'\n | 'success.primary'\n | 'success.outline'\n | 'success.outline-2'\n | 'success.clear'\n | 'success.link'\n | 'success.item'\n | 'success.card'\n | 'warning.primary'\n | 'warning.outline'\n | 'warning.outline-2'\n | 'warning.clear'\n | 'warning.link'\n | 'warning.item'\n | 'warning.card'\n | 'note.primary'\n | 'note.outline'\n | 'note.outline-2'\n | 'note.clear'\n | 'note.link'\n | 'note.item'\n | 'note.card'\n | 'special.primary'\n | 'special.outline'\n | 'special.clear'\n | 'special.link'\n | 'special.item';\n\n// The single `theme.type` → styles map. Exported so `Item` and the projections\n// below cannot drift apart: `ITEM_RESTING_COLOR_VARIANTS` is derived from this\n// object rather than restating the palette.\nexport const ITEM_VARIANTS: Record<ItemVariant, Styles> = {\n // Current theme — colors mixed from the inherited `currentcolor`\n 'current.item': CURRENT_ITEM_STYLES,\n 'current.primary': CURRENT_PRIMARY_STYLES,\n 'current.outline': CURRENT_OUTLINE_STYLES,\n 'current.outline-2': CURRENT_OUTLINE_2_STYLES,\n 'current.clear': CURRENT_CLEAR_STYLES,\n 'current.link': CURRENT_LINK_STYLES,\n 'current.card': CURRENT_CARD_STYLES,\n // Default theme\n 'default.primary': DEFAULT_PRIMARY_STYLES,\n 'default.outline': DEFAULT_OUTLINE_STYLES,\n 'default.outline-2': DEFAULT_OUTLINE_2_STYLES,\n 'default.clear': DEFAULT_CLEAR_STYLES,\n 'default.link': DEFAULT_LINK_STYLES,\n 'default.item': DEFAULT_ITEM_STYLES,\n 'default.card': DEFAULT_CARD_STYLES,\n // Danger theme\n 'danger.primary': DANGER_PRIMARY_STYLES,\n 'danger.outline': DANGER_OUTLINE_STYLES,\n 'danger.outline-2': DANGER_OUTLINE_2_STYLES,\n 'danger.clear': DANGER_CLEAR_STYLES,\n 'danger.link': DANGER_LINK_STYLES,\n 'danger.item': DANGER_ITEM_STYLES,\n 'danger.card': DANGER_CARD_STYLES,\n // Success theme\n 'success.primary': SUCCESS_PRIMARY_STYLES,\n 'success.outline': SUCCESS_OUTLINE_STYLES,\n 'success.outline-2': SUCCESS_OUTLINE_2_STYLES,\n 'success.clear': SUCCESS_CLEAR_STYLES,\n 'success.link': SUCCESS_LINK_STYLES,\n 'success.item': SUCCESS_ITEM_STYLES,\n 'success.card': SUCCESS_CARD_STYLES,\n // Warning theme\n 'warning.primary': WARNING_PRIMARY_STYLES,\n 'warning.outline': WARNING_OUTLINE_STYLES,\n 'warning.outline-2': WARNING_OUTLINE_2_STYLES,\n 'warning.clear': WARNING_CLEAR_STYLES,\n 'warning.link': WARNING_LINK_STYLES,\n 'warning.item': WARNING_ITEM_STYLES,\n 'warning.card': WARNING_CARD_STYLES,\n // Note theme\n 'note.primary': NOTE_PRIMARY_STYLES,\n 'note.outline': NOTE_OUTLINE_STYLES,\n 'note.outline-2': NOTE_OUTLINE_2_STYLES,\n 'note.clear': NOTE_CLEAR_STYLES,\n 'note.link': NOTE_LINK_STYLES,\n 'note.item': NOTE_ITEM_STYLES,\n 'note.card': NOTE_CARD_STYLES,\n // Special theme\n 'special.primary': SPECIAL_PRIMARY_STYLES,\n 'special.outline': SPECIAL_OUTLINE_STYLES,\n 'special.clear': SPECIAL_CLEAR_STYLES,\n 'special.link': SPECIAL_LINK_STYLES,\n 'special.item': SPECIAL_ITEM_STYLES,\n};\n\n// Resolve a `theme` + `type` pair to the variant key that actually exists in\n// `ITEM_VARIANTS`. Two of the combinations users can write have no entry of\n// their own and are folded onto one that does.\n//\n// Shared rather than inlined because more than one component has to arrive at\n// the same answer: `Item` renders the row, and `ItemButton` repeats the lookup on\n// the wrapper that carries the row color to actions rendered outside it. Those\n// two drifted the moment they were written separately — the `special` fallback\n// below was missed, which silently resolved to a nonexistent\n// `special.outline-2`, left the wrapper with no color, and handed sibling actions\n// the page's `currentcolor` on a dark surface.\nexport function resolveItemVariant(\n theme: string | undefined,\n type: string | undefined,\n): ItemVariant {\n // The `special` theme has no `outline-2` variant (it paints over\n // `#special-surface`, not `#surface-2`/`#surface-3`); fall back to `outline`\n // so the item still renders.\n const effectiveType =\n theme === 'special' && type === 'outline-2' ? 'outline' : type;\n\n // `header` reuses the `item` visuals and is theme-agnostic.\n const variantType = effectiveType === 'header' ? 'item' : effectiveType;\n const variantTheme = effectiveType === 'header' ? 'default' : theme;\n\n return `${variantTheme}.${variantType}` as ItemVariant;\n}\n\n// Each variant reduced to the label colors an actions wrapper has to reproduce.\n//\n// The `current` theme paints from `currentcolor`, which only reaches an action\n// that is a DOM *descendant* of the row. `Item` renders its actions inside the\n// row element, so they inherit the row color for free — but `ItemButton` renders\n// them as a sibling of the button (deliberately, so the actions stay reachable\n// and are not nested inside a `<button>`), where `currentcolor` would inherit\n// from the page instead. Painting these colors on that wrapper restores the link.\n//\n// Resting AND disabled, and the second one is not optional. `ItemAction`\n// suppresses its own `.4` fade when the disabled state was inherited from the\n// host, on the grounds that the host has already faded the color it paints from —\n// which is only true if the wrapper actually reproduces the host's *disabled*\n// color. With resting alone, a disabled `ItemButton` rendered full-strength\n// actions next to its own faded label.\n//\n// The other states are still skipped: the wrapper is not the interactive element,\n// so it never carries `hovered` / `pressed` / `selected` and those entries could\n// never match there. `disabled` is different only because `ItemButton` passes it\n// down explicitly.\nconst ACTIONS_COLOR_OVERRIDES: Partial<\n Record<ItemVariant, Record<string, string>>\n> = {\n 'current.primary': {\n '': '#current-fill',\n disabled: '#current-fill.5',\n },\n};\n\nexport const ITEM_RESTING_COLOR_VARIANTS: Record<ItemVariant, Styles> =\n Object.fromEntries(\n Object.entries(ITEM_VARIANTS).map(([variant, styles]) => {\n const color = styles.color;\n\n if (!color || typeof color !== 'object') {\n return [variant, { color }];\n }\n\n // `current.primary` is the one variant whose `color` is not its label. It\n // keeps `color` as the inherited fill so `#current` resolves in `fill`,\n // and paints the label with `-webkit-text-fill-color`. Reproducing its\n // `color` on the wrapper would hand sibling actions the CHIP color and\n // they would vanish into it, so the override names the label instead —\n // the same value the `Actions` slot gets inside a plain `Item`.\n const map = (ACTIONS_COLOR_OVERRIDES[variant as ItemVariant] ??\n color) as Record<string, string>;\n // The `current` flavours state their fade as\n // `disabled & !inherit-disabled & !inside-wrapper` rather than a bare\n // `disabled`, and the wrapper wants exactly that value under a plain\n // `disabled`. It is entitled to it: the two negated mods mark \"something\n // above already faded this\", and the wrapper is the top of the subtree —\n // `ItemButton` gives it only `disabled`, never either mod. Reading just\n // `map.disabled` left those variants with no disabled color to hand down,\n // which is the failure the comment above describes: the row faded itself\n // and its sibling actions, which suppress their own fade under\n // `inherit-disabled`, stayed at full strength beside it.\n const disabled =\n map.disabled ?? map['disabled & !inherit-disabled & !inside-wrapper'];\n\n return [\n variant,\n { color: disabled ? { '': map[''], disabled } : map[''] },\n ];\n }),\n ) as Record<ItemVariant, Styles>;\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.172.0 | Cube Dev Team */
2
2
  //#region src/data/themes.ts
3
3
  var themes_default = {
4
4
  special: {
@@ -1 +1 @@
1
- {"version":3,"file":"themes.js","names":[],"sources":["../../src/data/themes.ts"],"sourcesContent":["// Theme dispatch table consumed by `Alert` and `Badge`.\n//\n// Field semantics (kept compatible with the pre-glaze layout so consuming\n// components don't need a refactor):\n//\n// - `fill` — Alert background. For `special` it is also reused by Badge\n// as the badge fill (saturated brand). For the four colored\n// themes it is a light tinted banner surface\n// (`#<theme>-surface`), and Badge falls back to `color` for\n// the saturated chip.\n// - `color` — For non-`special`, non-`disabled` themes, this is the\n// **saturated brand fill** Badge renders with white text on\n// top. We use `#<theme>-accent-surface` (fixed mode) which is\n// anchored to the fixed-white `#<theme>-accent-surface-text`\n// with `contrast: [4.5, 7]`, so white-text-on-fill is\n// guaranteed WCAG AA (4.5) / AAA (7) in every schema — the\n// same brand-pill design `special` uses. (Pre-glaze this slot\n// resolved to `#<theme>-accent-text`, which is anchored to\n// surface with mode 'auto' for \"readable text on surface\" —\n// wrong contrast model for a badge with white text on top.\n// The glaze migration replaced it with `#<theme>-surface-text`\n// — the deep L≈2 banner-text color — which made every colored\n// badge render near-black; this restores the proper pairing.)\n// For `disabled`, this is the soft text color used by Alert\n// as the disabled label and by Badge as the disabled chip.\n// - `border` — Subtle brand-tinted border for both Alert and Badge.\nexport default {\n special: {\n fill: '#primary-accent-surface',\n color: '#primary-accent-surface-text',\n border: '#primary-border',\n },\n success: {\n fill: '#success-surface',\n color: '#success-accent-surface',\n border: '#success-border',\n },\n danger: {\n fill: '#danger-surface',\n color: '#danger-accent-surface',\n border: '#danger-border',\n },\n warning: {\n fill: '#warning-surface',\n color: '#warning-accent-surface',\n border: '#warning-border',\n },\n note: {\n fill: '#note-surface',\n color: '#note-accent-surface',\n border: '#note-border',\n },\n disabled: {\n fill: '#surface-2',\n color: '#surface-text-soft-2',\n border: '#surface-text.20',\n },\n} as const;\n"],"mappings":";;AA0BA,qBAAe;CACb,SAAS;EACP,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD,SAAS;EACP,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD,QAAQ;EACN,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD,SAAS;EACP,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD,MAAM;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD,UAAU;EACR,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACF"}
1
+ {"version":3,"file":"themes.js","names":[],"sources":["../../src/data/themes.ts"],"sourcesContent":["// Theme dispatch table consumed by `Alert` and `Badge`.\n//\n// Field semantics (kept compatible with the pre-glaze layout so consuming\n// components don't need a refactor):\n//\n// - `fill` — Alert background. For `special` it is also reused by Badge\n// as the badge fill (saturated brand). For the four colored\n// themes it is a light tinted banner surface\n// (`#<theme>-surface`), and Badge falls back to `color` for\n// the saturated chip.\n// - `color` — For non-`special`, non-`disabled` themes, this is the\n// **saturated brand fill** Badge renders with white text on\n// top. We use `#<theme>-accent-surface` (fixed mode) which is\n// anchored to the fixed-white `#<theme>-accent-surface-text`\n// with `contrast: [4.5, 7]`, so white-text-on-fill is\n// guaranteed WCAG AA (4.5) / AAA (7) in every scheme — the\n// same brand-pill design `special` uses. (Pre-glaze this slot\n// resolved to `#<theme>-accent-text`, which is anchored to\n// surface with mode 'auto' for \"readable text on surface\" —\n// wrong contrast model for a badge with white text on top.\n// The glaze migration replaced it with `#<theme>-surface-text`\n// — the deep L≈2 banner-text color — which made every colored\n// badge render near-black; this restores the proper pairing.)\n// For `disabled`, this is the soft text color used by Alert\n// as the disabled label and by Badge as the disabled chip.\n// - `border` — Subtle brand-tinted border for both Alert and Badge.\nexport default {\n special: {\n fill: '#primary-accent-surface',\n color: '#primary-accent-surface-text',\n border: '#primary-border',\n },\n success: {\n fill: '#success-surface',\n color: '#success-accent-surface',\n border: '#success-border',\n },\n danger: {\n fill: '#danger-surface',\n color: '#danger-accent-surface',\n border: '#danger-border',\n },\n warning: {\n fill: '#warning-surface',\n color: '#warning-accent-surface',\n border: '#warning-border',\n },\n note: {\n fill: '#note-surface',\n color: '#note-accent-surface',\n border: '#note-border',\n },\n disabled: {\n fill: '#surface-2',\n color: '#surface-text-soft-2',\n border: '#surface-text.20',\n },\n} as const;\n"],"mappings":";;AA0BA,qBAAe;CACb,SAAS;EACP,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD,SAAS;EACP,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD,QAAQ;EACN,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD,SAAS;EACP,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD,MAAM;EACJ,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACD,UAAU;EACR,MAAM;EACN,OAAO;EACP,QAAQ;EACT;CACF"}
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.172.0 | Cube Dev Team */
2
2
  //#region src/eslint-plugin/defaults.generated.ts
3
3
  const DEFAULTS = {
4
4
  components: {
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.172.0 | Cube Dev Team */
2
2
  import { DEFAULTS } from "./defaults.generated.js";
3
3
  import { createRule, noRedundantDefaultProp } from "./rules/no-redundant-default-prop.js";
4
4
 
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.172.0 | Cube Dev Team */
2
2
  import { DEFAULTS } from "../defaults.generated.js";
3
3
 
4
4
  //#region src/eslint-plugin/rules/no-redundant-default-prop.ts
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.172.0 | Cube Dev Team */
2
2
  import { UIKIT_I18N_NAMESPACE, getI18n } from "./instance.js";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  import { I18nProvider } from "react-aria";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.172.0 | Cube Dev Team */
2
2
  //#region src/i18n/createFormatter.ts
3
3
  const cache = /* @__PURE__ */ new Map();
4
4
  function getIntl(kind, Ctor, locale, options) {
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.172.0 | Cube Dev Team */
2
2
  import { LOCALE_LABELS, SUPPORTED_LOCALES, isSupportedLocale } from "./locales.js";
3
3
  import { UIKIT_I18N_NAMESPACE, createUIKitI18n, getI18n } from "./instance.js";
4
4
  import { useI18n } from "./useI18n.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.172.0 | Cube Dev Team */
2
2
  import { SUPPORTED_LOCALES } from "./locales.js";
3
3
  import uikit_default from "./locales/de-DE/uikit.js";
4
4
  import uikit_default$1 from "./locales/en-US/uikit.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.172.0 | Cube Dev Team */
2
2
  //#region src/i18n/locales/de-DE/uikit.json
3
3
  var uikit_default = {
4
4
  alertDialog: {
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.172.0 | Cube Dev Team */
2
2
  //#region src/i18n/locales/en-US/uikit.json
3
3
  var uikit_default = {
4
4
  alertDialog: {
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.172.0 | Cube Dev Team */
2
2
  //#region src/i18n/locales/es-ES/uikit.json
3
3
  var uikit_default = {
4
4
  alertDialog: {
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.172.0 | Cube Dev Team */
2
2
  //#region src/i18n/locales/es-MX/uikit.json
3
3
  var uikit_default = {
4
4
  alertDialog: {
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.172.0 | Cube Dev Team */
2
2
  //#region src/i18n/locales/fr-FR/uikit.json
3
3
  var uikit_default = {
4
4
  alertDialog: {
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.172.0 | Cube Dev Team */
2
2
  //#region src/i18n/locales/it-IT/uikit.json
3
3
  var uikit_default = {
4
4
  alertDialog: {
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.172.0 | Cube Dev Team */
2
2
  //#region src/i18n/locales/ja-JP/uikit.json
3
3
  var uikit_default = {
4
4
  alertDialog: {
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.172.0 | Cube Dev Team */
2
2
  //#region src/i18n/locales/nb-NO/uikit.json
3
3
  var uikit_default = {
4
4
  alertDialog: {
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.172.0 | Cube Dev Team */
2
2
  //#region src/i18n/locales/pt-BR/uikit.json
3
3
  var uikit_default = {
4
4
  alertDialog: {
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.172.0 | Cube Dev Team */
2
2
  //#region src/i18n/locales/pt-PT/uikit.json
3
3
  var uikit_default = {
4
4
  alertDialog: {
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.172.0 | Cube Dev Team */
2
2
  //#region src/i18n/locales/sv-SE/uikit.json
3
3
  var uikit_default = {
4
4
  alertDialog: {