@cube-dev/ui-kit 0.125.1 → 0.127.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 (463) hide show
  1. package/dist/CHANGELOG.md +56 -0
  2. package/dist/_internal/hooks/use-chained-callback.js +1 -1
  3. package/dist/_internal/hooks/use-debounced-value.js +1 -1
  4. package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
  5. package/dist/_internal/hooks/use-event.js +1 -1
  6. package/dist/_internal/hooks/use-is-first-render.js +1 -1
  7. package/dist/_internal/hooks/use-sync-ref.js +1 -1
  8. package/dist/_internal/hooks/use-timer/timer.js +1 -1
  9. package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
  10. package/dist/_internal/hooks/use-warn.js +1 -1
  11. package/dist/components/Block.js +1 -1
  12. package/dist/components/CollectionItem.js +1 -1
  13. package/dist/components/GlobalStyles.js +6 -6
  14. package/dist/components/GlobalStyles.js.map +1 -1
  15. package/dist/components/GridProvider.js +1 -1
  16. package/dist/components/HiddenInput.js +1 -1
  17. package/dist/components/Root.js +1 -1
  18. package/dist/components/actions/Action/Action.js +1 -1
  19. package/dist/components/actions/Banner/Banner.js +1 -1
  20. package/dist/components/actions/Button/Button.js +1 -1
  21. package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  22. package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
  23. package/dist/components/actions/ButtonSplit/context.js +1 -1
  24. package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
  25. package/dist/components/actions/CommandMenu/CommandMenu.js.map +1 -1
  26. package/dist/components/actions/CommandMenu/styled.js +1 -1
  27. package/dist/components/actions/ItemAction/ItemAction.js +1 -1
  28. package/dist/components/actions/ItemActionContext.js +1 -1
  29. package/dist/components/actions/ItemButton/ItemButton.js +1 -1
  30. package/dist/components/actions/Link/Link.js +1 -1
  31. package/dist/components/actions/Menu/Menu.js +1 -1
  32. package/dist/components/actions/Menu/Menu.js.map +1 -1
  33. package/dist/components/actions/Menu/MenuItem.js +1 -1
  34. package/dist/components/actions/Menu/MenuSection.js +1 -1
  35. package/dist/components/actions/Menu/MenuTrigger.js +1 -1
  36. package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
  37. package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  38. package/dist/components/actions/Menu/context.js +1 -1
  39. package/dist/components/actions/Menu/styled.js +1 -2
  40. package/dist/components/actions/Menu/styled.js.map +1 -1
  41. package/dist/components/actions/index.js +1 -1
  42. package/dist/components/actions/use-action.js +1 -1
  43. package/dist/components/actions/use-anchored-menu.js +1 -1
  44. package/dist/components/actions/use-context-menu.js +1 -1
  45. package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
  46. package/dist/components/content/Alert/Alert.js +1 -1
  47. package/dist/components/content/Alert/use-alert.js +1 -1
  48. package/dist/components/content/Avatar/Avatar.js +1 -1
  49. package/dist/components/content/Badge/Badge.js +1 -1
  50. package/dist/components/content/Card/Card.js +1 -1
  51. package/dist/components/content/Content.js +1 -1
  52. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  53. package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
  54. package/dist/components/content/Disclosure/Disclosure.js +1 -1
  55. package/dist/components/content/Divider.js +1 -1
  56. package/dist/components/content/Footer.js +1 -1
  57. package/dist/components/content/Header.js +1 -1
  58. package/dist/components/content/HotKeys/HotKeys.js +1 -1
  59. package/dist/components/content/Item/Item.js +1 -1
  60. package/dist/components/content/ItemBadge/ItemBadge.js +4 -5
  61. package/dist/components/content/ItemBadge/ItemBadge.js.map +1 -1
  62. package/dist/components/content/ItemCard/ItemCard.js +1 -1
  63. package/dist/components/content/Layout/GridLayout.js +1 -1
  64. package/dist/components/content/Layout/Layout.js +1 -1
  65. package/dist/components/content/Layout/LayoutBlock.js +1 -1
  66. package/dist/components/content/Layout/LayoutCenter.js +1 -1
  67. package/dist/components/content/Layout/LayoutContainer.js +1 -1
  68. package/dist/components/content/Layout/LayoutContent.js +1 -1
  69. package/dist/components/content/Layout/LayoutContext.js +1 -1
  70. package/dist/components/content/Layout/LayoutFlex.js +1 -1
  71. package/dist/components/content/Layout/LayoutFooter.js +1 -1
  72. package/dist/components/content/Layout/LayoutGrid.js +1 -1
  73. package/dist/components/content/Layout/LayoutHeader.js +2 -2
  74. package/dist/components/content/Layout/LayoutHeader.js.map +1 -1
  75. package/dist/components/content/Layout/LayoutPane.js +1 -1
  76. package/dist/components/content/Layout/LayoutPanel.js +7 -1
  77. package/dist/components/content/Layout/LayoutPanel.js.map +1 -1
  78. package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
  79. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  80. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  81. package/dist/components/content/Layout/index.js +1 -1
  82. package/dist/components/content/Layout/utils.js +1 -1
  83. package/dist/components/content/Paragraph.js +1 -1
  84. package/dist/components/content/Placeholder/Placeholder.js +1 -1
  85. package/dist/components/content/PrismCode/PrismCode.js +1 -1
  86. package/dist/components/content/PrismCode/prismSetup.js +1 -1
  87. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  88. package/dist/components/content/Result/Result.js +1 -1
  89. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  90. package/dist/components/content/Tag/Tag.js +1 -1
  91. package/dist/components/content/Text.js +2 -2
  92. package/dist/components/content/Text.js.map +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/highlightText.js +1 -1
  96. package/dist/components/content/use-auto-tooltip.js +1 -1
  97. package/dist/components/fields/Checkbox/Checkbox.js +2 -2
  98. package/dist/components/fields/Checkbox/Checkbox.js.map +1 -1
  99. package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
  100. package/dist/components/fields/Checkbox/context.js +1 -1
  101. package/dist/components/fields/ComboBox/ComboBox.js +1 -1
  102. package/dist/components/fields/DatePicker/DateInput.d.ts +4 -4
  103. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  104. package/dist/components/fields/DatePicker/DateInput.js.map +1 -1
  105. package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
  106. package/dist/components/fields/DatePicker/DatePicker.js +1 -1
  107. package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
  108. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  109. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  110. package/dist/components/fields/DatePicker/DatePickerSegment.js +2 -2
  111. package/dist/components/fields/DatePicker/DatePickerSegment.js.map +1 -1
  112. package/dist/components/fields/DatePicker/DateRangePicker.d.ts +4 -4
  113. package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
  114. package/dist/components/fields/DatePicker/DateRangePicker.js.map +1 -1
  115. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  116. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  117. package/dist/components/fields/DatePicker/intl.js +1 -1
  118. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  119. package/dist/components/fields/DatePicker/props.js +1 -1
  120. package/dist/components/fields/DatePicker/utils.js +1 -1
  121. package/dist/components/fields/FileInput/FileInput.js +1 -1
  122. package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
  123. package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
  124. package/dist/components/fields/Input/Input.js +1 -1
  125. package/dist/components/fields/ListBox/ListBox.js +1 -1
  126. package/dist/components/fields/NumberInput/NumberInput.js +1 -1
  127. package/dist/components/fields/NumberInput/StepButton.js +2 -2
  128. package/dist/components/fields/NumberInput/StepButton.js.map +1 -1
  129. package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
  130. package/dist/components/fields/Picker/Picker.js +1 -1
  131. package/dist/components/fields/Picker/Picker.js.map +1 -1
  132. package/dist/components/fields/RadioGroup/Radio.d.ts +1 -0
  133. package/dist/components/fields/RadioGroup/Radio.js +7 -9
  134. package/dist/components/fields/RadioGroup/Radio.js.map +1 -1
  135. package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
  136. package/dist/components/fields/RadioGroup/context.js +1 -1
  137. package/dist/components/fields/SearchInput/SearchInput.js +1 -1
  138. package/dist/components/fields/Select/Select.d.ts +1 -1
  139. package/dist/components/fields/Select/Select.js +1 -1
  140. package/dist/components/fields/Slider/Gradation.js +1 -1
  141. package/dist/components/fields/Slider/HueSlider.js +1 -1
  142. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  143. package/dist/components/fields/Slider/Slider.js +1 -1
  144. package/dist/components/fields/Slider/SliderBase.js +1 -1
  145. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  146. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  147. package/dist/components/fields/Slider/elements.js +1 -1
  148. package/dist/components/fields/Slider/index.js +1 -1
  149. package/dist/components/fields/Switch/Switch.js +1 -1
  150. package/dist/components/fields/TextArea/TextArea.js +1 -1
  151. package/dist/components/fields/TextInput/TextInput.js +1 -1
  152. package/dist/components/fields/TextInput/TextInputBase.js +1 -1
  153. package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  154. package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
  155. package/dist/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
  156. package/dist/components/form/Form/Field.js +1 -1
  157. package/dist/components/form/Form/Form.js +1 -1
  158. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  159. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  160. package/dist/components/form/Form/SubmitError.js +1 -1
  161. package/dist/components/form/Form/index.js +1 -1
  162. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  163. package/dist/components/form/Form/use-field/use-field.js +1 -1
  164. package/dist/components/form/Form/use-form.js +1 -1
  165. package/dist/components/form/Form/validation.js +1 -1
  166. package/dist/components/form/Label.js +1 -1
  167. package/dist/components/form/wrapper.js +1 -1
  168. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  169. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  170. package/dist/components/layout/Flex.js +1 -1
  171. package/dist/components/layout/Flow.js +1 -1
  172. package/dist/components/layout/Grid.js +1 -1
  173. package/dist/components/layout/Grid.js.map +1 -1
  174. package/dist/components/layout/Panel.js +1 -1
  175. package/dist/components/layout/Prefix.js +1 -1
  176. package/dist/components/layout/ResizablePanel.js +2 -1
  177. package/dist/components/layout/ResizablePanel.js.map +1 -1
  178. package/dist/components/layout/Space.js +1 -1
  179. package/dist/components/layout/Suffix.js +1 -1
  180. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  181. package/dist/components/navigation/Tabs/EditableTitle.js +1 -1
  182. package/dist/components/navigation/Tabs/TabButton.js +1 -1
  183. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  184. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  185. package/dist/components/navigation/Tabs/TabPicker.js +1 -1
  186. package/dist/components/navigation/Tabs/Tabs.js +1 -1
  187. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  188. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  189. package/dist/components/navigation/Tabs/styled.js +1 -1
  190. package/dist/components/navigation/Tabs/types.d.ts +4 -2
  191. package/dist/components/navigation/Tabs/types.js +3 -2
  192. package/dist/components/navigation/Tabs/types.js.map +1 -1
  193. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  194. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  195. package/dist/components/organisms/FileTabs/FileTabs.js +1 -1
  196. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  197. package/dist/components/other/Calendar/Calendar.js +1 -1
  198. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  199. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  200. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  201. package/dist/components/other/CloudLogo/CloudLogo.js +1 -1
  202. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  203. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  204. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  205. package/dist/components/overlays/Dialog/Dialog.js +1 -1
  206. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  207. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  208. package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
  209. package/dist/components/overlays/Dialog/context.js +1 -1
  210. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  211. package/dist/components/overlays/Modal/Modal.js +1 -1
  212. package/dist/components/overlays/Modal/OpenTransition.js +1 -1
  213. package/dist/components/overlays/Modal/Overlay.js +1 -1
  214. package/dist/components/overlays/Modal/Popover.js +1 -1
  215. package/dist/components/overlays/Modal/Tray.js +1 -1
  216. package/dist/components/overlays/Modal/Underlay.js +1 -1
  217. package/dist/components/overlays/Notifications/Notification.js +1 -1
  218. package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
  219. package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
  220. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  221. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  222. package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
  223. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  224. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
  225. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  226. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  227. package/dist/components/overlays/Notifications/index.js +1 -1
  228. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  229. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  230. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  231. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  232. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  233. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  234. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  235. package/dist/components/overlays/Toast/index.js +1 -1
  236. package/dist/components/overlays/Toast/useProgressToast.js +1 -1
  237. package/dist/components/overlays/Toast/useToast.js +1 -1
  238. package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
  239. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  240. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  241. package/dist/components/overlays/Tooltip/context.js +1 -1
  242. package/dist/components/portal/Portal.js +1 -1
  243. package/dist/components/portal/PortalProvider.js +1 -1
  244. package/dist/components/portal/usePortal.js +1 -1
  245. package/dist/components/shared/InvalidIcon.js +1 -1
  246. package/dist/components/shared/ValidIcon.js +1 -1
  247. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +18 -5
  248. package/dist/components/status/LoadingAnimation/LoadingAnimation.js.map +1 -1
  249. package/dist/components/status/Spin/Cube.js +2 -1
  250. package/dist/components/status/Spin/Cube.js.map +1 -1
  251. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  252. package/dist/components/status/Spin/Spin.js +1 -1
  253. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  254. package/dist/data/item-themes.js +1 -1
  255. package/dist/data/themes.js +1 -1
  256. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  257. package/dist/icons/AdjustmentsIcon.js +1 -1
  258. package/dist/icons/AiIcon.js +1 -1
  259. package/dist/icons/AreaChartIcon.js +1 -1
  260. package/dist/icons/BackwardIcon.js +1 -1
  261. package/dist/icons/BarChartIcon.js +1 -1
  262. package/dist/icons/BellFilledIcon.js +1 -1
  263. package/dist/icons/BellIcon.js +1 -1
  264. package/dist/icons/BooleanIcon.js +1 -1
  265. package/dist/icons/CalendarEditIcon.js +1 -1
  266. package/dist/icons/CalendarIcon.js +1 -1
  267. package/dist/icons/CaretDownIcon.js +1 -1
  268. package/dist/icons/CaretUpIcon.js +1 -1
  269. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  270. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  271. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  272. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  273. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  274. package/dist/icons/ChartBarLineIcon.js +1 -1
  275. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  276. package/dist/icons/ChartBarStackedIcon.js +1 -1
  277. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  278. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  279. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  280. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  281. package/dist/icons/ChartBubbleIcon.js +1 -1
  282. package/dist/icons/ChartDonut2Icon.js +1 -1
  283. package/dist/icons/ChartFunnelIcon.js +1 -1
  284. package/dist/icons/ChartHeatmapIcon.js +1 -1
  285. package/dist/icons/ChartKPIIcon.js +1 -1
  286. package/dist/icons/ChartPie2Icon.js +1 -1
  287. package/dist/icons/ChartScatterIcon.js +1 -1
  288. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  289. package/dist/icons/CheckCircleIcon.js +1 -1
  290. package/dist/icons/CheckIcon.js +1 -1
  291. package/dist/icons/CircleFilledIcon.js +1 -1
  292. package/dist/icons/ClearIcon.js +1 -1
  293. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  294. package/dist/icons/CloseCircleIcon.js +1 -1
  295. package/dist/icons/CloseIcon.js +1 -1
  296. package/dist/icons/CodeIcon.js +1 -1
  297. package/dist/icons/ColumnTotalIcon.js +1 -1
  298. package/dist/icons/CopyIcon.js +1 -1
  299. package/dist/icons/CountIcon.js +1 -1
  300. package/dist/icons/CubeIcon.js +1 -1
  301. package/dist/icons/CubePauseIcon.js +1 -1
  302. package/dist/icons/CubePlayIcon.js +1 -1
  303. package/dist/icons/CurrencyDollarIcon.js +1 -1
  304. package/dist/icons/DangerIcon.js +1 -1
  305. package/dist/icons/DashboardIcon.js +1 -1
  306. package/dist/icons/DatabaseIcon.js +1 -1
  307. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  308. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  309. package/dist/icons/DirectionIcon.js +1 -1
  310. package/dist/icons/DonutIcon.js +1 -1
  311. package/dist/icons/DownIcon.js +1 -1
  312. package/dist/icons/EditIcon.js +1 -1
  313. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  314. package/dist/icons/ExclamationCircleIcon.js +1 -1
  315. package/dist/icons/ExclamationIcon.js +1 -1
  316. package/dist/icons/EyeIcon.js +1 -1
  317. package/dist/icons/EyeInvisibleIcon.js +1 -1
  318. package/dist/icons/FilterIcon.js +1 -1
  319. package/dist/icons/FolderFilledIcon.js +1 -1
  320. package/dist/icons/FolderIcon.js +1 -1
  321. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  322. package/dist/icons/FolderOpenIcon.js +1 -1
  323. package/dist/icons/ForwardIcon.js +1 -1
  324. package/dist/icons/HierarchyIcon.js +1 -1
  325. package/dist/icons/HierarchyOpenIcon.js +1 -1
  326. package/dist/icons/Icon.js +1 -1
  327. package/dist/icons/InfoCircleIcon.js +1 -1
  328. package/dist/icons/InfoIcon.js +1 -1
  329. package/dist/icons/KeyIcon.js +1 -1
  330. package/dist/icons/LeftIcon.js +1 -1
  331. package/dist/icons/LineChartIcon.js +1 -1
  332. package/dist/icons/LoadingIcon.js +1 -1
  333. package/dist/icons/LockFilledIcon.js +1 -1
  334. package/dist/icons/LockIcon.js +1 -1
  335. package/dist/icons/MoreIcon.js +1 -1
  336. package/dist/icons/NotAllowedIcon.js +1 -1
  337. package/dist/icons/Number123Icon.js +1 -1
  338. package/dist/icons/NumberIcon.js +1 -1
  339. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  340. package/dist/icons/PauseCircleIcon.js +1 -1
  341. package/dist/icons/PauseIcon.js +1 -1
  342. package/dist/icons/PercentageIcon.js +1 -1
  343. package/dist/icons/PieChartIcon.js +1 -1
  344. package/dist/icons/PlayCircleIcon.js +1 -1
  345. package/dist/icons/PlayIcon.js +1 -1
  346. package/dist/icons/PlusIcon.js +1 -1
  347. package/dist/icons/ProgressBarIcon.js +1 -1
  348. package/dist/icons/ReloadIcon.js +1 -1
  349. package/dist/icons/ReportIcon.js +1 -1
  350. package/dist/icons/ReturnIcon.js +1 -1
  351. package/dist/icons/RightIcon.js +1 -1
  352. package/dist/icons/RowTotalsIcon.js +1 -1
  353. package/dist/icons/SchemeIcon.js +1 -1
  354. package/dist/icons/SearchIcon.js +1 -1
  355. package/dist/icons/SemanticQueryIcon.js +1 -1
  356. package/dist/icons/SettingsIcon.js +1 -1
  357. package/dist/icons/ShieldFilledIcon.js +1 -1
  358. package/dist/icons/ShieldIcon.js +1 -1
  359. package/dist/icons/SlashIcon.js +1 -1
  360. package/dist/icons/SparklesIcon.js +1 -1
  361. package/dist/icons/SqlIcon.js +1 -1
  362. package/dist/icons/StatsIcon.js +1 -1
  363. package/dist/icons/StopIcon.js +1 -1
  364. package/dist/icons/StringIcon.js +1 -1
  365. package/dist/icons/SubtotalsIcon.js +1 -1
  366. package/dist/icons/SwitchIcon.js +1 -1
  367. package/dist/icons/TableIcon.js +1 -1
  368. package/dist/icons/ThumbsDownIcon.js +1 -1
  369. package/dist/icons/ThumbsUpIcon.js +1 -1
  370. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  371. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  372. package/dist/icons/ThunderboltIcon.js +1 -1
  373. package/dist/icons/TimeIcon.js +1 -1
  374. package/dist/icons/TrashIcon.js +1 -1
  375. package/dist/icons/UnlockIcon.js +1 -1
  376. package/dist/icons/UpIcon.js +1 -1
  377. package/dist/icons/UserGroupIcon.js +1 -1
  378. package/dist/icons/UserIcon.js +1 -1
  379. package/dist/icons/UserLockIcon.js +1 -1
  380. package/dist/icons/ViewIcon.js +1 -1
  381. package/dist/icons/WarningFilledIcon.js +1 -1
  382. package/dist/icons/WarningIcon.js +1 -1
  383. package/dist/icons/wrap-icon.js +1 -1
  384. package/dist/index.d.ts +2 -2
  385. package/dist/index.js +1 -1
  386. package/dist/provider.js +1 -1
  387. package/dist/providers/TrackingProvider.js +1 -1
  388. package/dist/providers/navigationAdapter.default.js +1 -1
  389. package/dist/tokens/base.js +1 -1
  390. package/dist/tokens/colors.js +1 -1
  391. package/dist/tokens/index.d.ts +1 -1
  392. package/dist/tokens/index.js +1 -1
  393. package/dist/tokens/index.js.map +1 -1
  394. package/dist/tokens/layout.js +1 -1
  395. package/dist/tokens/shadows.js +1 -1
  396. package/dist/tokens/sizes.js +1 -1
  397. package/dist/tokens/spacing.js +1 -1
  398. package/dist/tokens/typography.d.ts +1 -2
  399. package/dist/tokens/typography.js +1 -18
  400. package/dist/tokens/typography.js.map +1 -1
  401. package/dist/utils/ResizeSensor.js +1 -1
  402. package/dist/utils/is-dev-env.js +1 -1
  403. package/dist/utils/modules.js +1 -1
  404. package/dist/utils/promise.js +1 -1
  405. package/dist/utils/raf.js +1 -1
  406. package/dist/utils/random.js +1 -1
  407. package/dist/utils/range.js +1 -1
  408. package/dist/utils/react/RenderCache.js +1 -1
  409. package/dist/utils/react/Slots.js +1 -1
  410. package/dist/utils/react/chain.js +1 -1
  411. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  412. package/dist/utils/react/index.js +1 -1
  413. package/dist/utils/react/interactions.js +1 -1
  414. package/dist/utils/react/isTextOnly.js +1 -1
  415. package/dist/utils/react/mapProps.js +1 -1
  416. package/dist/utils/react/mergeProps.js +1 -1
  417. package/dist/utils/react/nullableValue.js +1 -1
  418. package/dist/utils/react/resolveIcon.js +1 -1
  419. package/dist/utils/react/sharedStore.js +1 -1
  420. package/dist/utils/react/useCombinedRefs.js +1 -1
  421. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  422. package/dist/utils/react/useEventBus.js +1 -1
  423. package/dist/utils/react/useId.js +1 -1
  424. package/dist/utils/react/useIsDarwin.js +1 -1
  425. package/dist/utils/react/useKeySymbols.js +1 -1
  426. package/dist/utils/react/useLayoutEffect.js +1 -1
  427. package/dist/utils/react/useLocalStorage.js +1 -1
  428. package/dist/utils/react/useMergeStyles.js +1 -1
  429. package/dist/utils/react/useQaProps.js +1 -1
  430. package/dist/utils/react/useViewportSize.js +1 -1
  431. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  432. package/dist/utils/selection.js +1 -1
  433. package/dist/utils/styles.d.ts +1 -1
  434. package/dist/utils/styles.js +5 -4
  435. package/dist/utils/styles.js.map +1 -1
  436. package/dist/utils/tree.js +1 -1
  437. package/dist/utils/warnings.js +1 -1
  438. package/dist/version.js +2 -2
  439. package/docs/CreateComponent.md +1 -1
  440. package/docs/Usage.md +1 -1
  441. package/docs/components/fields/ComboBox.md +27 -0
  442. package/docs/components/fields/FilterListBox.md +25 -0
  443. package/docs/components/fields/FilterPicker.md +34 -0
  444. package/docs/components/fields/ListBox.md +38 -8
  445. package/docs/components/fields/Picker.md +25 -0
  446. package/docs/components/fields/Select.md +2 -0
  447. package/docs/components/navigation/Tabs.md +2 -2
  448. package/docs/tasty/README.md +4 -4
  449. package/docs/tasty/adoption.md +5 -3
  450. package/docs/tasty/comparison.md +24 -25
  451. package/docs/tasty/configuration.md +130 -1
  452. package/docs/tasty/debug.md +11 -9
  453. package/docs/tasty/design-system.md +39 -10
  454. package/docs/tasty/dsl.md +114 -10
  455. package/docs/tasty/getting-started.md +10 -10
  456. package/docs/tasty/injector.md +41 -25
  457. package/docs/tasty/methodology.md +52 -3
  458. package/docs/tasty/{PIPELINE.md → pipeline.md} +1 -1
  459. package/docs/tasty/{runtime.md → react-api.md} +168 -8
  460. package/docs/tasty/ssr.md +141 -81
  461. package/docs/tasty/styles.md +26 -6
  462. package/docs/tasty/tasty-static.md +103 -2
  463. package/package.json +3 -3
package/docs/tasty/dsl.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  This is the Tasty style language reference — the value syntax, state mappings, tokens, units, extending semantics, and special declarations that apply to both runtime `tasty()` and build-time `tastyStatic()`.
4
4
 
5
- For the runtime React API (`tasty()`, hooks, component props), see [Runtime API](runtime.md). For all enhanced style properties, see [Style Properties](styles.md). For global configuration, see [Configuration](configuration.md).
5
+ For the runtime React API (`tasty()`, hooks, component props), see [React API](react-api.md). For all enhanced style properties, see [Style Properties](styles.md). For global configuration, see [Configuration](configuration.md).
6
6
 
7
7
  ---
8
8
 
@@ -25,7 +25,21 @@ fill: { '': '#white', hovered: '#gray.05', 'theme=danger': '#red' }
25
25
  | Pseudo-class | `:hover` | `:hover` |
26
26
  | Class selector | `.active` | `.active` |
27
27
  | Attribute selector | `[aria-expanded="true"]` | `[aria-expanded="true"]` |
28
- | Combined | `hovered & .active` | `[data-hovered].active` |
28
+ | Combined (AND) | `hovered & .active` | `[data-hovered].active` |
29
+ | Combined (OR) | `hovered \| focused` | `[data-hovered], [data-focused]` |
30
+ | Negated (NOT) | `!disabled` | `:not([data-disabled])` |
31
+ | Exclusive (XOR) | `hovered ^ focused` | `[data-hovered]:not([data-focused]), :not([data-hovered])[data-focused]` |
32
+
33
+ Operator precedence (highest to lowest): `!` (NOT) > `^` (XOR) > `|` (OR) > `&` (AND). Use parentheses to override: `hovered & (pressed ^ focused)`.
34
+
35
+ `^` (XOR) means "exactly one of" — `A ^ B` expands to `(A & !B) | (!A & B)`. This is useful for mutually exclusive states where exactly one should be active:
36
+
37
+ ```jsx
38
+ fill: {
39
+ '': '#surface',
40
+ 'hovered ^ focused': '#accent', // active when hovered OR focused, but not both
41
+ }
42
+ ```
29
43
 
30
44
  ### Sub-element
31
45
 
@@ -93,7 +107,7 @@ mods={{ hovered: true, theme: 'danger' }}
93
107
  // → data-hovered="" data-theme="danger"
94
108
  ```
95
109
 
96
- Modifiers can also be exposed as top-level component props via `modProps` — see [Runtime — Mod Props](runtime.md#mod-props).
110
+ Modifiers can also be exposed as top-level component props via `modProps` — see [Runtime — Mod Props](react-api.md#mod-props).
97
111
 
98
112
  ---
99
113
 
@@ -119,8 +133,6 @@ color: '(#primary, #secondary)', // Fallback syntax
119
133
  | `cr` | Card border radius | `1cr` | `var(--card-radius)` |
120
134
  | `bw` | Border width | `2bw` | `calc(var(--border-width) * 2)` |
121
135
  | `ow` | Outline width | `1ow` | `var(--outline-width)` |
122
- | `fs` | Font size | `1fs` | `var(--font-size)` |
123
- | `lh` | Line height | `1lh` | `var(--line-height)` |
124
136
  | `sf` | Stable fraction | `1sf` | `minmax(0, 1fr)` |
125
137
 
126
138
  You can register additional custom units via [`configure()`](configuration.md#options).
@@ -432,7 +444,7 @@ const FadeIn = tasty({
432
444
 
433
445
  ### `@parent(...)` — Parent Element States
434
446
 
435
- Style based on ancestor element attributes. Uses `:is([selector] *)` / `:not([selector] *)` for symmetric, composable parent checks. Boolean logic (`&`, `|`, `!`) is supported inside `@parent()`.
447
+ Style based on ancestor element attributes. Uses `:is([selector] *)` / `:not([selector] *)` for symmetric, composable parent checks. Boolean logic (`&`, `|`, `!`, `^`) is supported inside `@parent()`.
436
448
 
437
449
  ```jsx
438
450
  const Highlight = tasty({
@@ -510,12 +522,13 @@ const Card = tasty({
510
522
  | `!:has(> Icon)` | `:not(:has(> [data-element="Icon"]))` | Negation (use `!`) |
511
523
  | `!:is(Panel)` | `:not([data-element="Panel"])` | Negation (use `!:is`) |
512
524
 
513
- Combine with other states using boolean logic:
525
+ Combine with other states using boolean logic (`&`, `|`, `!`, `^`):
514
526
 
515
527
  ```jsx
516
- ':has(> Icon) & hovered' // structural + data attribute
517
- '@parent(hovered) & :has(> Icon)' // parent check + structural
528
+ ':has(> Icon) & hovered' // AND: structural + data attribute
529
+ '@parent(hovered) & :has(> Icon)' // AND: parent check + structural
518
530
  ':has(> Icon) | :has(> Button)' // OR: either sub-element present
531
+ ':has(> Icon) ^ :has(> Button)' // XOR: exactly one present
519
532
  ```
520
533
 
521
534
  > **Nesting limit:** The state key parser supports up to 2 levels of nested parentheses inside `:is()`, `:has()`, `:not()`, and `:where()` — e.g. `:has(Input:not(:disabled))` works, but 3+ levels like `:has(:is(:not(:hover)))` will not be tokenized correctly. This covers virtually all practical use cases.
@@ -569,6 +582,97 @@ Use explicit `@properties` when you need non-default settings like `inherits: fa
569
582
 
570
583
  ---
571
584
 
585
+ ## Font Face (`@fontFace`)
586
+
587
+ Register custom fonts directly inside a `styles` object. Keys are font-family names, values are descriptor objects (or arrays of them for multiple weights/styles).
588
+
589
+ ```ts
590
+ const Heading = tasty({
591
+ styles: {
592
+ '@fontFace': {
593
+ 'Brand Sans': {
594
+ src: 'url("/fonts/brand-sans.woff2") format("woff2")',
595
+ fontDisplay: 'swap',
596
+ },
597
+ },
598
+ fontFamily: '"Brand Sans", sans-serif',
599
+ },
600
+ });
601
+ ```
602
+
603
+ ### Multiple weights
604
+
605
+ Supply an array to register several variants of the same family:
606
+
607
+ ```ts
608
+ '@fontFace': {
609
+ 'Brand Sans': [
610
+ { src: 'url("/fonts/brand-regular.woff2") format("woff2")', fontWeight: 400, fontDisplay: 'swap' },
611
+ { src: 'url("/fonts/brand-bold.woff2") format("woff2")', fontWeight: 700, fontDisplay: 'swap' },
612
+ ],
613
+ }
614
+ ```
615
+
616
+ ### Supported descriptors
617
+
618
+ | Descriptor | CSS property | Type |
619
+ |---|---|---|
620
+ | `src` (required) | `src` | `string` |
621
+ | `fontWeight` | `font-weight` | `string \| number` |
622
+ | `fontStyle` | `font-style` | `string` |
623
+ | `fontStretch` | `font-stretch` | `string` |
624
+ | `fontDisplay` | `font-display` | `'auto' \| 'block' \| 'swap' \| 'fallback' \| 'optional'` |
625
+ | `unicodeRange` | `unicode-range` | `string` |
626
+ | `ascentOverride` | `ascent-override` | `string` |
627
+ | `descentOverride` | `descent-override` | `string` |
628
+ | `lineGapOverride` | `line-gap-override` | `string` |
629
+ | `sizeAdjust` | `size-adjust` | `string` |
630
+ | `fontFeatureSettings` | `font-feature-settings` | `string` |
631
+ | `fontVariationSettings` | `font-variation-settings` | `string` |
632
+
633
+ > Font-face rules are permanent — they are injected once and never cleaned up, matching how browsers handle `@font-face`.
634
+
635
+ ---
636
+
637
+ ## Counter Style (`@counterStyle`)
638
+
639
+ Define custom list markers via the CSS `@counter-style` at-rule. Keys are counter-style names, values are descriptor objects.
640
+
641
+ ```ts
642
+ const EmojiList = tasty({
643
+ tag: 'ol',
644
+ styles: {
645
+ '@counterStyle': {
646
+ thumbs: {
647
+ system: 'cyclic',
648
+ symbols: '"👍"',
649
+ suffix: '" "',
650
+ },
651
+ },
652
+ listStyleType: 'thumbs',
653
+ },
654
+ });
655
+ ```
656
+
657
+ ### Supported descriptors
658
+
659
+ | Descriptor | CSS property | Type |
660
+ |---|---|---|
661
+ | `system` (required) | `system` | `'cyclic' \| 'numeric' \| 'alphabetic' \| 'symbolic' \| 'additive' \| 'fixed' \| string` |
662
+ | `symbols` | `symbols` | `string` |
663
+ | `additiveSymbols` | `additive-symbols` | `string` |
664
+ | `prefix` | `prefix` | `string` |
665
+ | `suffix` | `suffix` | `string` |
666
+ | `negative` | `negative` | `string` |
667
+ | `range` | `range` | `string` |
668
+ | `pad` | `pad` | `string` |
669
+ | `fallback` | `fallback` | `string` |
670
+ | `speakAs` | `speak-as` | `string` |
671
+
672
+ > Counter-style rules are permanent — they are injected once and never cleaned up, matching how browsers handle `@counter-style`.
673
+
674
+ ---
675
+
572
676
  ## Style Properties
573
677
 
574
678
  For a complete reference of all enhanced style properties — syntax, values, modifiers, and recommendations — see **[Style Properties Reference](styles.md)**.
@@ -577,7 +681,7 @@ For a complete reference of all enhanced style properties — syntax, values, mo
577
681
 
578
682
  ## Learn more
579
683
 
580
- - **[Runtime API](runtime.md)** — `tasty()` factory, component props, variants, sub-elements, hooks
684
+ - **[React API](react-api.md)** — `tasty()` factory, component props, variants, sub-elements, style functions
581
685
  - **[Methodology](methodology.md)** — Recommended patterns: root + sub-elements, styleProps, tokens, wrapping
582
686
  - **[Configuration](configuration.md)** — Tokens, recipes, custom units, style handlers, TypeScript extensions
583
687
  - **[Style Properties](styles.md)** — Complete reference for all enhanced style properties
@@ -1,6 +1,6 @@
1
1
  # Getting Started
2
2
 
3
- This guide walks you from zero to a working Tasty component, then through the optional shared configuration and tooling layers. It is the right starting point when you already want to try Tasty in code. If you are still deciding whether Tasty fits your team, start with [Comparison](comparison.md) and [Adoption Guide](adoption.md) first. For a feature overview, see the [README](../README.md). For the full style language reference, see the [Style DSL](dsl.md). For the React API, see the [Runtime API](runtime.md). For the rest of the docs by role or task, see the [Docs Hub](README.md).
3
+ This guide walks you from zero to a working Tasty component, then through the optional shared configuration and tooling layers. It is the right starting point when you already want to try Tasty in code. If you are still deciding whether Tasty fits your team, start with [Comparison](comparison.md) and [Adoption Guide](adoption.md) first. For a feature overview, see the [README](../README.md). For the full style language reference, see the [Style DSL](dsl.md). For the React API, see the [React API](react-api.md). For the rest of the docs by role or task, see the [Docs Hub](README.md).
4
4
 
5
5
  ---
6
6
 
@@ -179,19 +179,19 @@ export default [
179
179
 
180
180
  ## Choosing a rendering mode
181
181
 
182
- Tasty has two styling approaches. Pick the one that fits your use case, then decide whether your runtime setup also needs server rendering support:
182
+ `tasty()` is the default for all React apps. All `tasty()` components and style functions are hook-free and work as React Server Components without `'use client'`. In server-only contexts, they produce zero client JavaScript with the full feature set.
183
183
 
184
184
  | Approach | Entry point | Best for | Trade-off |
185
185
  |------|-------------|----------|-----------|
186
- | **Runtime** | `tasty()` from `@tenphi/tasty` | Interactive apps with reusable stateful components, design systems | CSS generated at runtime; full feature set (styleProps, sub-elements, variants) |
187
- | **Zero-runtime** | `tastyStatic()` from `@tenphi/tasty/static` | Static sites, landing pages, SSG | Zero JS overhead; requires Babel plugin; no dynamic props |
186
+ | **Runtime (default)** | `tasty()` from `@tenphi/tasty` | All React apps server-rendered by default, zero client JS until you need interactivity | Full feature set (styleProps, sub-elements, variants); CSS computed during rendering |
187
+ | **Runtime + SSR integration** | Add `@tenphi/tasty/ssr/*` | Apps with client-side hydration (Next.js client components, Astro islands) | Adds CSS batching, deduplication, FOUC prevention, and client cache hydration |
188
+ | **Zero-runtime** | `tastyStatic()` from `@tenphi/tasty/static` | Non-React frameworks or build-time extraction without React | Requires Babel plugin; no `styleProps` or runtime-only APIs |
188
189
 
189
- Both share the same DSL, tokens, units, and state mappings.
190
+ Both `tasty()` and `tastyStatic()` share the same DSL, tokens, units, and state mappings.
190
191
 
191
- - Runtime is the default and requires no extra setup beyond `@tenphi/tasty`.
192
- - If your framework can execute runtime code during server rendering, add SSR support on top of runtime with `@tenphi/tasty/ssr/next`, `@tenphi/tasty/ssr/astro`, or the core SSR API. This still uses `tasty()`; it just collects CSS on the server and hydrates the cache on the client.
193
- - Zero-runtime requires the Babel plugin and additional peer dependencies. See [Zero Runtime (tastyStatic)](tasty-static.md).
194
- - SSR works with existing `tasty()` components — wrap your app with a registry, middleware, or collector. See [Server-Side Rendering](ssr.md).
192
+ - **Runtime** is the default and requires no extra setup beyond `@tenphi/tasty`. In server-only contexts (Next.js RSC, Astro without `client:*` directives, SSG), `tasty()` produces static HTML + CSS with zero client JavaScript — the same end result as `tastyStatic()` but with the full feature set. For example, `tasty()` + `tastyIntegration()` in Astro without islands gives you the complete API with zero JS shipped.
193
+ - **SSR integration** is only needed when your app also has client-side rendering. Add `@tenphi/tasty/ssr/next`, `@tenphi/tasty/ssr/astro`, or the core SSR API to get CSS deduplication and cache hydration. See [Server-Side Rendering](ssr.md).
194
+ - **Zero-runtime** requires the Babel plugin and additional peer dependencies. Use it when you need build-time extraction without a React runtime. See [Zero Runtime (tastyStatic)](tasty-static.md).
195
195
 
196
196
  ---
197
197
 
@@ -200,7 +200,7 @@ Both share the same DSL, tokens, units, and state mappings.
200
200
  - **[Docs Hub](README.md)** — Pick the next guide by role, styling approach, or task
201
201
  - **[Methodology](methodology.md)** — The recommended patterns for structuring Tasty components: sub-elements, styleProps, tokens, extension
202
202
  - **[Style DSL](dsl.md)** — State maps, tokens, units, extending semantics, keyframes, @property
203
- - **[Runtime API](runtime.md)** — `tasty()` factory, component props, variants, sub-elements, hooks
203
+ - **[React API](react-api.md)** — `tasty()` factory, component props, variants, sub-elements, style functions
204
204
  - **[Building a Design System](design-system.md)** — Practical guide to building a DS layer with Tasty: tokens, recipes, primitives, compound components
205
205
  - **[Adoption Guide](adoption.md)** — Roll out Tasty inside an existing design system or platform team
206
206
  - **[Comparison](comparison.md)** — Evaluate Tasty against other styling systems
@@ -115,11 +115,13 @@ dispose();
115
115
 
116
116
  ### `useRawCSS(css, options?)` or `useRawCSS(factory, deps, options?)`
117
117
 
118
- React hook for injecting raw CSS. Uses `useInsertionEffect` for proper timing and cleanup.
118
+ Inject raw CSS without parsing. Hook-free works in client components, SSR, and React Server Components.
119
119
 
120
120
  Supports two overloads:
121
- - **Static CSS**: `useRawCSS(cssString, options?)`
122
- - **Factory function**: `useRawCSS(() => cssString, deps, options?)` - re-evaluates when deps change (like `useMemo`)
121
+ - **Static CSS**: `useRawCSS(cssString, options?)` — content-based deduplication
122
+ - **Factory function**: `useRawCSS(() => cssString, deps, options?)` factory called on every invocation, dedup handled internally
123
+
124
+ Use the `id` option for update tracking — when the CSS changes for the same id, the previous injection is replaced:
123
125
 
124
126
  ```tsx
125
127
  import { useRawCSS } from '@tenphi/tasty';
@@ -132,7 +134,7 @@ function GlobalReset() {
132
134
  return null;
133
135
  }
134
136
 
135
- // Dynamic CSS with factory function (like useMemo)
137
+ // Dynamic CSS with factory function and update tracking
136
138
  function ThemeStyles({ theme }: { theme: 'dark' | 'light' }) {
137
139
  useRawCSS(() => `
138
140
  body {
@@ -140,7 +142,7 @@ function ThemeStyles({ theme }: { theme: 'dark' | 'light' }) {
140
142
  background: ${theme === 'dark' ? '#000' : '#fff'};
141
143
  color: ${theme === 'dark' ? '#fff' : '#000'};
142
144
  }
143
- `, [theme]);
145
+ `, [theme], { id: 'theme-body' });
144
146
 
145
147
  return null;
146
148
  }
@@ -207,13 +209,12 @@ import { configure } from '@tenphi/tasty';
207
209
  configure({
208
210
  devMode: true, // Enable development features (auto-detected)
209
211
  maxRulesPerSheet: 8192, // Cap rules per stylesheet (default: 8192)
210
- unusedStylesThreshold: 500, // Trigger cleanup threshold (CSS rules only)
211
- bulkCleanupDelay: 5000, // Cleanup delay (ms) - ignored if idleCleanup is true
212
- idleCleanup: true, // Use requestIdleCallback for cleanup
213
- bulkCleanupBatchRatio: 0.5, // Clean up oldest 50% per batch
214
- unusedStylesMinAgeMs: 10000, // Minimum age before cleanup (ms)
215
212
  forceTextInjection: false, // Force textContent insertion (auto-detected for tests)
216
213
  nonce: 'csp-nonce', // CSP nonce for security
214
+ gc: { // Garbage collection for unused styles
215
+ touchInterval: 1000, // Touch events between GC cycles (default: 1000)
216
+ capacity: 1000, // Max unused styles to retain (default: 1000)
217
+ },
217
218
  states: { // Global predefined states for advanced state mapping
218
219
  '@mobile': '@media(w < 768px)',
219
220
  '@dark': '@root(schema=dark)',
@@ -229,7 +230,8 @@ configure({
229
230
  - Most options have sensible defaults and auto-detection
230
231
  - `configure()` is optional - the injector works with defaults
231
232
  - **Configuration is locked after styles are generated** - calling `configure()` after first render will emit a warning and be ignored
232
- - `unusedStylesMinAgeMs`: Minimum time (ms) a style must remain unused before being eligible for cleanup. Helps prevent removal of styles that might be quickly reactivated.
233
+ - `gc.touchInterval`: Number of touch events between GC cycles. Each style render counts as a touch. When the counter reaches this value, GC is scheduled via `requestIdleCallback`.
234
+ - `gc.capacity`: Maximum number of unused styles (refCount = 0, not in DOM) to retain. When exceeded, the oldest are evicted first. Actively referenced styles don't count against this limit.
233
235
 
234
236
  ---
235
237
 
@@ -291,21 +293,34 @@ comp3.dispose(); // refCount: 1 → 0, eligible for bulk cleanup
291
293
  // Next inject() with same styles will increment refCount and reuse immediately
292
294
  ```
293
295
 
294
- ### Smart Cleanup System
296
+ ### Garbage Collection
295
297
 
296
298
  ```typescript
297
- import { configure } from '@tenphi/tasty';
299
+ import { configure, gc } from '@tenphi/tasty';
298
300
 
299
- // CSS rules: Not immediately deleted, marked for bulk cleanup (refCount = 0)
300
301
  // Keyframes: Disposed immediately when refCount = 0 (safer for global scope)
302
+ // CSS rules: Tracked by touch count and cleaned up via gc()
301
303
 
302
304
  configure({
303
- unusedStylesThreshold: 100, // Cleanup when 100+ unused CSS rules
304
- bulkCleanupBatchRatio: 0.3, // Remove oldest 30% each time
305
+ gc: {
306
+ touchInterval: 1000, // Schedule GC every 1000 touches
307
+ capacity: 1000, // Max unused styles to retain
308
+ },
305
309
  });
306
310
 
311
+ // Manual GC (synchronous, returns number of swept styles):
312
+ gc();
313
+
314
+ // Force-remove ALL unused styles (e.g. on route change or test teardown):
315
+ gc({ force: true });
316
+
317
+ // GC is also triggered automatically by touch count during rendering.
318
+ // Every `touchInterval` touches, GC is scheduled via requestIdleCallback.
319
+
307
320
  // Benefits:
308
- // - CSS rules: Batch cleanup prevents DOM manipulation overhead
321
+ // - Activity-proportional: busy apps trigger GC more often
322
+ // - DOM-safe: styles currently in the DOM are never evicted
323
+ // - Oldest-first: least recently used styles are evicted first
309
324
  // - Keyframes: Immediate cleanup prevents global namespace pollution
310
325
  // - Unused styles can be instantly reactivated (just increment refCount)
311
326
  ```
@@ -462,13 +477,14 @@ injectGlobal([
462
477
  { selector: '.container', declarations: 'max-width: 1200px;' }
463
478
  ]);
464
479
 
465
- // ✅ Configure appropriate thresholds for your app (BEFORE first render!)
480
+ // ✅ Configure GC for your app (BEFORE first render!)
466
481
  import { configure } from '@tenphi/tasty';
467
482
 
468
483
  configure({
469
- unusedStylesThreshold: 500, // Default threshold (adjust based on app size)
470
- bulkCleanupBatchRatio: 0.5, // Default: clean oldest 50% per batch
471
- unusedStylesMinAgeMs: 10000, // Wait 10s before cleanup eligibility
484
+ gc: {
485
+ touchInterval: 1000, // Schedule GC every 1000 style touches
486
+ capacity: 1000, // Max unused styles to retain
487
+ },
472
488
  });
473
489
  ```
474
490
 
@@ -480,8 +496,8 @@ configure({
480
496
  // 1. Hash-based deduplication - same CSS = same className
481
497
  // 2. Reference counting - styles stay alive while in use (refCount > 0)
482
498
  // 3. Immediate keyframes cleanup - disposed instantly when refCount = 0
483
- // 4. Batch CSS cleanup - unused CSS rules (refCount = 0) cleaned in batches
484
- // 5. Non-stacking cleanups - prevents timeout accumulation
499
+ // 4. Touch-count GC - unused CSS rules are evicted oldest-first when over capacity
500
+ // 5. DOM safety guard - styles visible in the DOM are never evicted
485
501
 
486
502
  // Manual cleanup is rarely needed but available:
487
503
  cleanup(); // Force immediate cleanup of all unused CSS rules (refCount = 0)
@@ -511,7 +527,7 @@ const StyledButton = tasty({
511
527
  // 4. dispose() is called when component unmounts
512
528
  ```
513
529
 
514
- For most development, you'll use the [Runtime API](./runtime.md) rather than the injector directly. The injector provides the high-performance foundation that makes Tasty's declarative styling possible.
530
+ For most development, you'll use the [React API](./react-api.md) rather than the injector directly. The injector provides the high-performance foundation that makes Tasty's declarative styling possible.
515
531
 
516
532
  ---
517
533
 
@@ -525,4 +541,4 @@ Direct injector usage is recommended for:
525
541
  - **Performance-critical scenarios** where you need direct control
526
542
  - **Testing utilities** that need to inject or extract CSS
527
543
 
528
- For regular component styling, prefer the [`tasty()` API](./runtime.md) which provides a more developer-friendly interface.
544
+ For regular component styling, prefer the [`tasty()` API](./react-api.md) which provides a more developer-friendly interface.
@@ -214,7 +214,7 @@ The array form is simpler but types all values as `ModValue`:
214
214
  modProps: ['isLoading', 'isSelected'] as const,
215
215
  ```
216
216
 
217
- For the full API reference, see [Runtime — Mod Props](runtime.md#mod-props).
217
+ For the full API reference, see [Runtime — Mod Props](react-api.md#mod-props).
218
218
 
219
219
  ---
220
220
 
@@ -256,6 +256,54 @@ The `tokens` prop sets `style="--progress: 75%"` on the DOM element. The `$progr
256
256
 
257
257
  Design tokens (via `configure({ tokens })`) are injected as CSS custom properties on `:root`. Replace tokens (via `configure({ replaceTokens })`) are resolved at parse time and baked into the generated CSS. The `tokens` prop on components is resolved at render time via inline CSS custom properties. Use design tokens for design-system constants, replace tokens for value aliases, and the `tokens` prop for truly dynamic per-instance values.
258
258
 
259
+ ### tokenProps
260
+
261
+ `tokenProps` expose token keys as top-level component props — the token equivalent of `styleProps` and `modProps`. Use them when a component has a fixed set of known dynamic token values.
262
+
263
+ #### Array form
264
+
265
+ Prop names are plain camelCase identifiers. Names ending in `Color` map to `#` color tokens; everything else maps to `$` custom property tokens:
266
+
267
+ ```tsx
268
+ const ProgressBar = tasty({
269
+ tokenProps: ['progress', 'accentColor'] as const,
270
+ styles: { width: '$progress', fill: '#accent' },
271
+ });
272
+
273
+ // Clean prop API — no tokens object needed
274
+ <ProgressBar progress="75%" accentColor="#purple" />
275
+
276
+ // Conversion:
277
+ // 'progress' → $progress → --progress
278
+ // 'accentColor' → #accent → --accent-color + --accent-color-oklch
279
+ ```
280
+
281
+ #### Object form
282
+
283
+ Keys are prop names; values are `$`/`#`-prefixed token keys. No suffix convention needed — the prefix in the value is explicit:
284
+
285
+ ```tsx
286
+ const Card = tasty({
287
+ tokenProps: {
288
+ size: '$card-size',
289
+ color: '#card-accent',
290
+ },
291
+ styles: { padding: '$card-size', fill: '#card-accent' },
292
+ });
293
+
294
+ <Card size="4x" color="#purple" />
295
+ ```
296
+
297
+ #### Merge order
298
+
299
+ When all three token sources are present, values merge with increasing priority:
300
+
301
+ 1. `tokens` option in `tasty({...})` — default tokens (lowest)
302
+ 2. `tokens` prop on the component instance — runtime overrides
303
+ 3. `tokenProps`-derived values — highest priority (explicit named props win)
304
+
305
+ The `tokens` prop remains available for ad-hoc or dynamic tokens alongside `tokenProps`.
306
+
259
307
  ---
260
308
 
261
309
  ## styles prop vs style prop
@@ -458,7 +506,8 @@ See [Configuration](configuration.md) for the full `configure()` API.
458
506
  - **Use `elements` prop** to declare typed sub-components for compound components
459
507
  - **Use `styleProps`** to define what product engineers can customize
460
508
  - **Use `modProps`** to expose known modifier states as clean component props
461
- - **Use `tokens` prop** for per-instance dynamic values (progress, user color)
509
+ - **Use `tokenProps`** to expose known token keys as clean component props
510
+ - **Use `tokens` prop** for ad-hoc or dynamic per-instance token values (progress, user color)
462
511
  - **Use modifiers** (`mods` or `modProps`) for state-driven style changes instead of runtime `styles` prop changes
463
512
 
464
513
  ### Avoid
@@ -561,7 +610,7 @@ The `elements` prop gives you typed sub-components with automatic `data-element`
561
610
  - **[Getting Started](getting-started.md)** — Installation, first component, tooling setup
562
611
  - **[Building a Design System](design-system.md)** — Practical guide to building a DS layer with Tasty
563
612
  - **[Style DSL](dsl.md)** — State maps, tokens, units, extending semantics, keyframes, @property
564
- - **[Runtime API](runtime.md)** — `tasty()` factory, component props, variants, sub-elements, hooks
613
+ - **[React API](react-api.md)** — `tasty()` factory, component props, variants, sub-elements, style functions
565
614
  - **[Configuration](configuration.md)** — Full `configure()` API: tokens, recipes, custom units, style handlers
566
615
  - **[Style Properties](styles.md)** — Complete reference for all enhanced style properties
567
616
  - **[Adoption Guide](adoption.md)** — Who should adopt Tasty, incremental phases, what changes for product engineers
@@ -55,7 +55,7 @@ Output: CSSRule[]
55
55
 
56
56
  **Simplification** (`simplifyCondition` in `simplify.ts`) is not a separate numbered stage. It runs inside exclusive building, `expandExclusiveOrs` branch cleanup, combination ANDs, merge-by-value ORs, and materialization as needed.
57
57
 
58
- **Post-pass:** After `processStyles` collects rules from every handler, `runPipeline` filters duplicates using a key of `selector|declarations|atRules|rootPrefix` so identical emitted rules appear once.
58
+ **Post-pass:** After `processStyles` collects rules from every handler, `runPipeline` filters duplicates using a key of `selector|declarations|atRules|rootPrefix|startingStyle` so identical emitted rules appear once.
59
59
 
60
60
  ---
61
61