@cube-dev/ui-kit 0.126.0 → 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 (451) hide show
  1. package/dist/CHANGELOG.md +43 -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 +1 -1
  14. package/dist/components/GridProvider.js +1 -1
  15. package/dist/components/HiddenInput.js +1 -1
  16. package/dist/components/Root.js +1 -1
  17. package/dist/components/actions/Action/Action.js +1 -1
  18. package/dist/components/actions/Banner/Banner.js +1 -1
  19. package/dist/components/actions/Button/Button.js +1 -1
  20. package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  21. package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
  22. package/dist/components/actions/ButtonSplit/context.js +1 -1
  23. package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
  24. package/dist/components/actions/CommandMenu/CommandMenu.js.map +1 -1
  25. package/dist/components/actions/CommandMenu/styled.js +1 -1
  26. package/dist/components/actions/ItemAction/ItemAction.js +1 -1
  27. package/dist/components/actions/ItemActionContext.js +1 -1
  28. package/dist/components/actions/ItemButton/ItemButton.js +1 -1
  29. package/dist/components/actions/Link/Link.js +1 -1
  30. package/dist/components/actions/Menu/Menu.js +1 -1
  31. package/dist/components/actions/Menu/Menu.js.map +1 -1
  32. package/dist/components/actions/Menu/MenuItem.js +1 -1
  33. package/dist/components/actions/Menu/MenuSection.js +1 -1
  34. package/dist/components/actions/Menu/MenuTrigger.js +1 -1
  35. package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
  36. package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  37. package/dist/components/actions/Menu/context.js +1 -1
  38. package/dist/components/actions/Menu/styled.js +1 -2
  39. package/dist/components/actions/Menu/styled.js.map +1 -1
  40. package/dist/components/actions/index.js +1 -1
  41. package/dist/components/actions/use-action.js +1 -1
  42. package/dist/components/actions/use-anchored-menu.js +1 -1
  43. package/dist/components/actions/use-context-menu.js +1 -1
  44. package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
  45. package/dist/components/content/Alert/Alert.js +1 -1
  46. package/dist/components/content/Alert/use-alert.js +1 -1
  47. package/dist/components/content/Avatar/Avatar.js +1 -1
  48. package/dist/components/content/Badge/Badge.js +1 -1
  49. package/dist/components/content/Card/Card.js +1 -1
  50. package/dist/components/content/Content.js +1 -1
  51. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  52. package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
  53. package/dist/components/content/Disclosure/Disclosure.js +1 -1
  54. package/dist/components/content/Divider.js +1 -1
  55. package/dist/components/content/Footer.js +1 -1
  56. package/dist/components/content/Header.js +1 -1
  57. package/dist/components/content/HotKeys/HotKeys.js +1 -1
  58. package/dist/components/content/Item/Item.js +1 -1
  59. package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
  60. package/dist/components/content/ItemCard/ItemCard.js +1 -1
  61. package/dist/components/content/Layout/GridLayout.js +1 -1
  62. package/dist/components/content/Layout/Layout.js +1 -1
  63. package/dist/components/content/Layout/LayoutBlock.js +1 -1
  64. package/dist/components/content/Layout/LayoutCenter.js +1 -1
  65. package/dist/components/content/Layout/LayoutContainer.js +1 -1
  66. package/dist/components/content/Layout/LayoutContent.js +1 -1
  67. package/dist/components/content/Layout/LayoutContext.js +1 -1
  68. package/dist/components/content/Layout/LayoutFlex.js +1 -1
  69. package/dist/components/content/Layout/LayoutFooter.js +1 -1
  70. package/dist/components/content/Layout/LayoutGrid.js +1 -1
  71. package/dist/components/content/Layout/LayoutHeader.js +1 -1
  72. package/dist/components/content/Layout/LayoutPane.js +1 -1
  73. package/dist/components/content/Layout/LayoutPanel.js +5 -1
  74. package/dist/components/content/Layout/LayoutPanel.js.map +1 -1
  75. package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
  76. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  77. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  78. package/dist/components/content/Layout/index.js +1 -1
  79. package/dist/components/content/Layout/utils.js +1 -1
  80. package/dist/components/content/Paragraph.js +1 -1
  81. package/dist/components/content/Placeholder/Placeholder.js +1 -1
  82. package/dist/components/content/PrismCode/PrismCode.js +1 -1
  83. package/dist/components/content/PrismCode/prismSetup.js +1 -1
  84. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  85. package/dist/components/content/Result/Result.js +1 -1
  86. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  87. package/dist/components/content/Tag/Tag.js +1 -1
  88. package/dist/components/content/Text.js +1 -1
  89. package/dist/components/content/TextItem/TextItem.js +1 -1
  90. package/dist/components/content/Title.js +1 -1
  91. package/dist/components/content/highlightText.js +1 -1
  92. package/dist/components/content/use-auto-tooltip.js +1 -1
  93. package/dist/components/fields/Checkbox/Checkbox.js +2 -2
  94. package/dist/components/fields/Checkbox/Checkbox.js.map +1 -1
  95. package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
  96. package/dist/components/fields/Checkbox/context.js +1 -1
  97. package/dist/components/fields/ComboBox/ComboBox.js +1 -1
  98. package/dist/components/fields/DatePicker/DateInput.d.ts +4 -4
  99. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  100. package/dist/components/fields/DatePicker/DateInput.js.map +1 -1
  101. package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
  102. package/dist/components/fields/DatePicker/DatePicker.js +1 -1
  103. package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
  104. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  105. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  106. package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
  107. package/dist/components/fields/DatePicker/DateRangePicker.d.ts +4 -4
  108. package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
  109. package/dist/components/fields/DatePicker/DateRangePicker.js.map +1 -1
  110. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  111. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  112. package/dist/components/fields/DatePicker/intl.js +1 -1
  113. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  114. package/dist/components/fields/DatePicker/props.js +1 -1
  115. package/dist/components/fields/DatePicker/utils.js +1 -1
  116. package/dist/components/fields/FileInput/FileInput.js +1 -1
  117. package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
  118. package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
  119. package/dist/components/fields/Input/Input.js +1 -1
  120. package/dist/components/fields/ListBox/ListBox.js +1 -1
  121. package/dist/components/fields/NumberInput/NumberInput.js +1 -1
  122. package/dist/components/fields/NumberInput/StepButton.js +1 -1
  123. package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
  124. package/dist/components/fields/Picker/Picker.js +1 -1
  125. package/dist/components/fields/Picker/Picker.js.map +1 -1
  126. package/dist/components/fields/RadioGroup/Radio.d.ts +1 -0
  127. package/dist/components/fields/RadioGroup/Radio.js +5 -8
  128. package/dist/components/fields/RadioGroup/Radio.js.map +1 -1
  129. package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
  130. package/dist/components/fields/RadioGroup/context.js +1 -1
  131. package/dist/components/fields/SearchInput/SearchInput.js +1 -1
  132. package/dist/components/fields/Select/Select.d.ts +1 -1
  133. package/dist/components/fields/Select/Select.js +1 -1
  134. package/dist/components/fields/Slider/Gradation.js +1 -1
  135. package/dist/components/fields/Slider/HueSlider.js +1 -1
  136. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  137. package/dist/components/fields/Slider/Slider.js +1 -1
  138. package/dist/components/fields/Slider/SliderBase.js +1 -1
  139. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  140. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  141. package/dist/components/fields/Slider/elements.js +1 -1
  142. package/dist/components/fields/Slider/index.js +1 -1
  143. package/dist/components/fields/Switch/Switch.js +1 -1
  144. package/dist/components/fields/TextArea/TextArea.js +1 -1
  145. package/dist/components/fields/TextInput/TextInput.js +1 -1
  146. package/dist/components/fields/TextInput/TextInputBase.js +1 -1
  147. package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  148. package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
  149. package/dist/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
  150. package/dist/components/form/Form/Field.js +1 -1
  151. package/dist/components/form/Form/Form.js +1 -1
  152. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  153. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  154. package/dist/components/form/Form/SubmitError.js +1 -1
  155. package/dist/components/form/Form/index.js +1 -1
  156. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  157. package/dist/components/form/Form/use-field/use-field.js +1 -1
  158. package/dist/components/form/Form/use-form.js +1 -1
  159. package/dist/components/form/Form/validation.js +1 -1
  160. package/dist/components/form/Label.js +1 -1
  161. package/dist/components/form/wrapper.js +1 -1
  162. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  163. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  164. package/dist/components/layout/Flex.js +1 -1
  165. package/dist/components/layout/Flow.js +1 -1
  166. package/dist/components/layout/Grid.js +1 -1
  167. package/dist/components/layout/Grid.js.map +1 -1
  168. package/dist/components/layout/Panel.js +1 -1
  169. package/dist/components/layout/Prefix.js +1 -1
  170. package/dist/components/layout/ResizablePanel.js +1 -1
  171. package/dist/components/layout/Space.js +1 -1
  172. package/dist/components/layout/Suffix.js +1 -1
  173. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  174. package/dist/components/navigation/Tabs/EditableTitle.js +1 -1
  175. package/dist/components/navigation/Tabs/TabButton.js +1 -1
  176. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  177. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  178. package/dist/components/navigation/Tabs/TabPicker.js +1 -1
  179. package/dist/components/navigation/Tabs/Tabs.js +1 -1
  180. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  181. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  182. package/dist/components/navigation/Tabs/styled.js +1 -1
  183. package/dist/components/navigation/Tabs/types.d.ts +4 -2
  184. package/dist/components/navigation/Tabs/types.js +3 -2
  185. package/dist/components/navigation/Tabs/types.js.map +1 -1
  186. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  187. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  188. package/dist/components/organisms/FileTabs/FileTabs.js +1 -1
  189. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  190. package/dist/components/other/Calendar/Calendar.js +1 -1
  191. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  192. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  193. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  194. package/dist/components/other/CloudLogo/CloudLogo.js +1 -1
  195. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  196. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  197. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  198. package/dist/components/overlays/Dialog/Dialog.js +1 -1
  199. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  200. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  201. package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
  202. package/dist/components/overlays/Dialog/context.js +1 -1
  203. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  204. package/dist/components/overlays/Modal/Modal.js +1 -1
  205. package/dist/components/overlays/Modal/OpenTransition.js +1 -1
  206. package/dist/components/overlays/Modal/Overlay.js +1 -1
  207. package/dist/components/overlays/Modal/Popover.js +1 -1
  208. package/dist/components/overlays/Modal/Tray.js +1 -1
  209. package/dist/components/overlays/Modal/Underlay.js +1 -1
  210. package/dist/components/overlays/Notifications/Notification.js +1 -1
  211. package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
  212. package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
  213. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  214. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  215. package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
  216. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  217. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
  218. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  219. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  220. package/dist/components/overlays/Notifications/index.js +1 -1
  221. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  222. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  223. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  224. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  225. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  226. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  227. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  228. package/dist/components/overlays/Toast/index.js +1 -1
  229. package/dist/components/overlays/Toast/useProgressToast.js +1 -1
  230. package/dist/components/overlays/Toast/useToast.js +1 -1
  231. package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
  232. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  233. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  234. package/dist/components/overlays/Tooltip/context.js +1 -1
  235. package/dist/components/portal/Portal.js +1 -1
  236. package/dist/components/portal/PortalProvider.js +1 -1
  237. package/dist/components/portal/usePortal.js +1 -1
  238. package/dist/components/shared/InvalidIcon.js +1 -1
  239. package/dist/components/shared/ValidIcon.js +1 -1
  240. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  241. package/dist/components/status/Spin/Cube.js +1 -1
  242. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  243. package/dist/components/status/Spin/Spin.js +1 -1
  244. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  245. package/dist/data/item-themes.js +1 -1
  246. package/dist/data/themes.js +1 -1
  247. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  248. package/dist/icons/AdjustmentsIcon.js +1 -1
  249. package/dist/icons/AiIcon.js +1 -1
  250. package/dist/icons/AreaChartIcon.js +1 -1
  251. package/dist/icons/BackwardIcon.js +1 -1
  252. package/dist/icons/BarChartIcon.js +1 -1
  253. package/dist/icons/BellFilledIcon.js +1 -1
  254. package/dist/icons/BellIcon.js +1 -1
  255. package/dist/icons/BooleanIcon.js +1 -1
  256. package/dist/icons/CalendarEditIcon.js +1 -1
  257. package/dist/icons/CalendarIcon.js +1 -1
  258. package/dist/icons/CaretDownIcon.js +1 -1
  259. package/dist/icons/CaretUpIcon.js +1 -1
  260. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  261. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  262. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  263. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  264. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  265. package/dist/icons/ChartBarLineIcon.js +1 -1
  266. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  267. package/dist/icons/ChartBarStackedIcon.js +1 -1
  268. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  269. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  270. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  271. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  272. package/dist/icons/ChartBubbleIcon.js +1 -1
  273. package/dist/icons/ChartDonut2Icon.js +1 -1
  274. package/dist/icons/ChartFunnelIcon.js +1 -1
  275. package/dist/icons/ChartHeatmapIcon.js +1 -1
  276. package/dist/icons/ChartKPIIcon.js +1 -1
  277. package/dist/icons/ChartPie2Icon.js +1 -1
  278. package/dist/icons/ChartScatterIcon.js +1 -1
  279. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  280. package/dist/icons/CheckCircleIcon.js +1 -1
  281. package/dist/icons/CheckIcon.js +1 -1
  282. package/dist/icons/CircleFilledIcon.js +1 -1
  283. package/dist/icons/ClearIcon.js +1 -1
  284. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  285. package/dist/icons/CloseCircleIcon.js +1 -1
  286. package/dist/icons/CloseIcon.js +1 -1
  287. package/dist/icons/CodeIcon.js +1 -1
  288. package/dist/icons/ColumnTotalIcon.js +1 -1
  289. package/dist/icons/CopyIcon.js +1 -1
  290. package/dist/icons/CountIcon.js +1 -1
  291. package/dist/icons/CubeIcon.js +1 -1
  292. package/dist/icons/CubePauseIcon.js +1 -1
  293. package/dist/icons/CubePlayIcon.js +1 -1
  294. package/dist/icons/CurrencyDollarIcon.js +1 -1
  295. package/dist/icons/DangerIcon.js +1 -1
  296. package/dist/icons/DashboardIcon.js +1 -1
  297. package/dist/icons/DatabaseIcon.js +1 -1
  298. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  299. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  300. package/dist/icons/DirectionIcon.js +1 -1
  301. package/dist/icons/DonutIcon.js +1 -1
  302. package/dist/icons/DownIcon.js +1 -1
  303. package/dist/icons/EditIcon.js +1 -1
  304. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  305. package/dist/icons/ExclamationCircleIcon.js +1 -1
  306. package/dist/icons/ExclamationIcon.js +1 -1
  307. package/dist/icons/EyeIcon.js +1 -1
  308. package/dist/icons/EyeInvisibleIcon.js +1 -1
  309. package/dist/icons/FilterIcon.js +1 -1
  310. package/dist/icons/FolderFilledIcon.js +1 -1
  311. package/dist/icons/FolderIcon.js +1 -1
  312. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  313. package/dist/icons/FolderOpenIcon.js +1 -1
  314. package/dist/icons/ForwardIcon.js +1 -1
  315. package/dist/icons/HierarchyIcon.js +1 -1
  316. package/dist/icons/HierarchyOpenIcon.js +1 -1
  317. package/dist/icons/Icon.js +1 -1
  318. package/dist/icons/InfoCircleIcon.js +1 -1
  319. package/dist/icons/InfoIcon.js +1 -1
  320. package/dist/icons/KeyIcon.js +1 -1
  321. package/dist/icons/LeftIcon.js +1 -1
  322. package/dist/icons/LineChartIcon.js +1 -1
  323. package/dist/icons/LoadingIcon.js +1 -1
  324. package/dist/icons/LockFilledIcon.js +1 -1
  325. package/dist/icons/LockIcon.js +1 -1
  326. package/dist/icons/MoreIcon.js +1 -1
  327. package/dist/icons/NotAllowedIcon.js +1 -1
  328. package/dist/icons/Number123Icon.js +1 -1
  329. package/dist/icons/NumberIcon.js +1 -1
  330. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  331. package/dist/icons/PauseCircleIcon.js +1 -1
  332. package/dist/icons/PauseIcon.js +1 -1
  333. package/dist/icons/PercentageIcon.js +1 -1
  334. package/dist/icons/PieChartIcon.js +1 -1
  335. package/dist/icons/PlayCircleIcon.js +1 -1
  336. package/dist/icons/PlayIcon.js +1 -1
  337. package/dist/icons/PlusIcon.js +1 -1
  338. package/dist/icons/ProgressBarIcon.js +1 -1
  339. package/dist/icons/ReloadIcon.js +1 -1
  340. package/dist/icons/ReportIcon.js +1 -1
  341. package/dist/icons/ReturnIcon.js +1 -1
  342. package/dist/icons/RightIcon.js +1 -1
  343. package/dist/icons/RowTotalsIcon.js +1 -1
  344. package/dist/icons/SchemeIcon.js +1 -1
  345. package/dist/icons/SearchIcon.js +1 -1
  346. package/dist/icons/SemanticQueryIcon.js +1 -1
  347. package/dist/icons/SettingsIcon.js +1 -1
  348. package/dist/icons/ShieldFilledIcon.js +1 -1
  349. package/dist/icons/ShieldIcon.js +1 -1
  350. package/dist/icons/SlashIcon.js +1 -1
  351. package/dist/icons/SparklesIcon.js +1 -1
  352. package/dist/icons/SqlIcon.js +1 -1
  353. package/dist/icons/StatsIcon.js +1 -1
  354. package/dist/icons/StopIcon.js +1 -1
  355. package/dist/icons/StringIcon.js +1 -1
  356. package/dist/icons/SubtotalsIcon.js +1 -1
  357. package/dist/icons/SwitchIcon.js +1 -1
  358. package/dist/icons/TableIcon.js +1 -1
  359. package/dist/icons/ThumbsDownIcon.js +1 -1
  360. package/dist/icons/ThumbsUpIcon.js +1 -1
  361. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  362. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  363. package/dist/icons/ThunderboltIcon.js +1 -1
  364. package/dist/icons/TimeIcon.js +1 -1
  365. package/dist/icons/TrashIcon.js +1 -1
  366. package/dist/icons/UnlockIcon.js +1 -1
  367. package/dist/icons/UpIcon.js +1 -1
  368. package/dist/icons/UserGroupIcon.js +1 -1
  369. package/dist/icons/UserIcon.js +1 -1
  370. package/dist/icons/UserLockIcon.js +1 -1
  371. package/dist/icons/ViewIcon.js +1 -1
  372. package/dist/icons/WarningFilledIcon.js +1 -1
  373. package/dist/icons/WarningIcon.js +1 -1
  374. package/dist/icons/wrap-icon.js +1 -1
  375. package/dist/index.d.ts +2 -2
  376. package/dist/index.js +1 -1
  377. package/dist/provider.js +1 -1
  378. package/dist/providers/TrackingProvider.js +1 -1
  379. package/dist/providers/navigationAdapter.default.js +1 -1
  380. package/dist/tokens/base.js +1 -1
  381. package/dist/tokens/colors.js +1 -1
  382. package/dist/tokens/index.d.ts +1 -1
  383. package/dist/tokens/index.js +1 -1
  384. package/dist/tokens/index.js.map +1 -1
  385. package/dist/tokens/layout.js +1 -1
  386. package/dist/tokens/shadows.js +1 -1
  387. package/dist/tokens/sizes.js +1 -1
  388. package/dist/tokens/spacing.js +1 -1
  389. package/dist/tokens/typography.d.ts +1 -1
  390. package/dist/tokens/typography.js +1 -1
  391. package/dist/utils/ResizeSensor.js +1 -1
  392. package/dist/utils/is-dev-env.js +1 -1
  393. package/dist/utils/modules.js +1 -1
  394. package/dist/utils/promise.js +1 -1
  395. package/dist/utils/raf.js +1 -1
  396. package/dist/utils/random.js +1 -1
  397. package/dist/utils/range.js +1 -1
  398. package/dist/utils/react/RenderCache.js +1 -1
  399. package/dist/utils/react/Slots.js +1 -1
  400. package/dist/utils/react/chain.js +1 -1
  401. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  402. package/dist/utils/react/index.js +1 -1
  403. package/dist/utils/react/interactions.js +1 -1
  404. package/dist/utils/react/isTextOnly.js +1 -1
  405. package/dist/utils/react/mapProps.js +1 -1
  406. package/dist/utils/react/mergeProps.js +1 -1
  407. package/dist/utils/react/nullableValue.js +1 -1
  408. package/dist/utils/react/resolveIcon.js +1 -1
  409. package/dist/utils/react/sharedStore.js +1 -1
  410. package/dist/utils/react/useCombinedRefs.js +1 -1
  411. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  412. package/dist/utils/react/useEventBus.js +1 -1
  413. package/dist/utils/react/useId.js +1 -1
  414. package/dist/utils/react/useIsDarwin.js +1 -1
  415. package/dist/utils/react/useKeySymbols.js +1 -1
  416. package/dist/utils/react/useLayoutEffect.js +1 -1
  417. package/dist/utils/react/useLocalStorage.js +1 -1
  418. package/dist/utils/react/useMergeStyles.js +1 -1
  419. package/dist/utils/react/useQaProps.js +1 -1
  420. package/dist/utils/react/useViewportSize.js +1 -1
  421. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  422. package/dist/utils/selection.js +1 -1
  423. package/dist/utils/styles.d.ts +1 -1
  424. package/dist/utils/styles.js +5 -4
  425. package/dist/utils/styles.js.map +1 -1
  426. package/dist/utils/tree.js +1 -1
  427. package/dist/utils/warnings.js +1 -1
  428. package/dist/version.js +2 -2
  429. package/docs/components/fields/ComboBox.md +27 -0
  430. package/docs/components/fields/FilterListBox.md +25 -0
  431. package/docs/components/fields/FilterPicker.md +34 -0
  432. package/docs/components/fields/ListBox.md +38 -8
  433. package/docs/components/fields/Picker.md +25 -0
  434. package/docs/components/fields/Select.md +2 -0
  435. package/docs/components/navigation/Tabs.md +2 -2
  436. package/docs/tasty/README.md +4 -4
  437. package/docs/tasty/adoption.md +5 -3
  438. package/docs/tasty/comparison.md +24 -25
  439. package/docs/tasty/configuration.md +69 -1
  440. package/docs/tasty/debug.md +11 -9
  441. package/docs/tasty/design-system.md +22 -10
  442. package/docs/tasty/dsl.md +23 -8
  443. package/docs/tasty/getting-started.md +10 -10
  444. package/docs/tasty/injector.md +41 -25
  445. package/docs/tasty/methodology.md +52 -3
  446. package/docs/tasty/{PIPELINE.md → pipeline.md} +1 -1
  447. package/docs/tasty/{runtime.md → react-api.md} +104 -32
  448. package/docs/tasty/ssr.md +139 -81
  449. package/docs/tasty/styles.md +17 -0
  450. package/docs/tasty/tasty-static.md +101 -2
  451. package/package.json +2 -2
@@ -29,14 +29,14 @@ That is why syntax-level comparisons are often shallow. The more meaningful comp
29
29
 
30
30
  ## High-level positioning
31
31
 
32
- | System | Best described as | Main authoring model | Conflict model | Best fit |
33
- |---|---|---|---|---|
34
- | **Tasty** | Design-system styling engine | Custom DSL with tokens, state maps, recipes, style props, sub-elements, custom units | **Mutually exclusive selector resolution** for stateful styles | Teams building shared component APIs or a house styling language |
35
- | **Tailwind CSS** | Utility-first styling framework | Utility classes in markup | Utility composition, variants, and framework-controlled ordering | Product teams optimizing for speed and direct authoring |
36
- | **Panda CSS** | Typed styling engine with atomic output | Typed style objects, recipes, generated primitives, style props | Atomic CSS with static analysis | Teams wanting a DS-friendly engine with typed primitives |
37
- | **vanilla-extract** | Zero-runtime TS-native stylesheet system | `.css.ts` files, theme contracts, style composition | Standard CSS semantics | Teams wanting static CSS and low-level control |
38
- | **StyleX** | Compiler-based atomic styling system | JS authoring with compiler-generated atomic CSS | Compiler-controlled atomic composition | Large app teams wanting optimized, predictable atomic styling |
39
- | **Stitches** (deprecated) **/ Emotion** | Component-first CSS-in-JS | Styled components, `css()` APIs, object/string styles | Composition within CSS-in-JS rules | Teams optimizing for component DX and flexible styling |
32
+ | System | Best described as | Main authoring model | Conflict model | RSC / zero-JS SSG | Best fit |
33
+ |---|---|---|---|---|---|
34
+ | **Tasty** | Design-system styling engine | Custom DSL with tokens, state maps, recipes, style props, sub-elements, custom units | **Mutually exclusive selector resolution** for stateful styles | Yes — hook-free, server components by default | Teams building shared component APIs or a house styling language |
35
+ | **Tailwind CSS** | Utility-first styling framework | Utility classes in markup | Utility composition, variants, and framework-controlled ordering | Yes — no JS runtime | Product teams optimizing for speed and direct authoring |
36
+ | **Panda CSS** | Typed styling engine with atomic output | Typed style objects, recipes, generated primitives, style props | Atomic CSS with static analysis | Yes — build-time extraction | Teams wanting a DS-friendly engine with typed primitives |
37
+ | **vanilla-extract** | Zero-runtime TS-native stylesheet system | `.css.ts` files, theme contracts, style composition | Standard CSS semantics | Yes — build-time extraction | Teams wanting static CSS and low-level control |
38
+ | **StyleX** | Compiler-based atomic styling system | JS authoring with compiler-generated atomic CSS | Compiler-controlled atomic composition | Yes — compiler-extracted | Large app teams wanting optimized, predictable atomic styling |
39
+ | **Stitches** (deprecated) **/ Emotion** | Component-first CSS-in-JS | Styled components, `css()` APIs, object/string styles | Composition within CSS-in-JS rules | No — requires `'use client'` | Teams optimizing for component DX and flexible styling |
40
40
 
41
41
  ---
42
42
 
@@ -92,7 +92,7 @@ That makes Tasty less of a "better way to write CSS objects" and more of a **sta
92
92
  Beyond state resolution, Tasty also provides several structural capabilities that reinforce the design-system layer:
93
93
 
94
94
  - **CSS properties as typed React props** — `styleProps` lets a component expose selected style properties as normal props (`<Button placeSelf="end">`), including state maps for responsive values. This keeps layout and composition controls inside a governed component API instead of pushing teams back to ad hoc styling escapes.
95
- - **Sub-element styling** — Compound components declare inner parts via capitalized keys in `styles` and `data-element` attributes. States, tokens, and recipes apply across the entire element tree from a single definition. See [Runtime API — Sub-element Styling](runtime.md#sub-element-styling).
95
+ - **Sub-element styling** — Compound components declare inner parts via capitalized keys in `styles` and `data-element` attributes. States, tokens, and recipes apply across the entire element tree from a single definition. See [React API — Sub-element Styling](react-api.md#sub-element-styling).
96
96
  - **Auto-inferred `@property`** — When a custom property is assigned a concrete value, Tasty infers the CSS `@property` syntax and registers it automatically, enabling smooth transitions on custom properties without manual declarations.
97
97
  - **AI-friendly style definitions** — Style definitions are declarative, self-contained, and structurally consistent. AI tools can read, refactor, and generate Tasty styles as confidently as a human — no hidden cascade logic or implicit ordering to second-guess.
98
98
  - **Companion ecosystem** — An [ESLint plugin](https://github.com/tenphi/eslint-plugin-tasty) with 27 lint rules, a [VS Code extension](https://github.com/tenphi/tasty-vscode-extension) for syntax highlighting, and [Glaze](https://github.com/tenphi/glaze) for OKHSL color theme generation with automatic WCAG contrast solving.
@@ -235,13 +235,12 @@ Tasty is more opinionated.
235
235
 
236
236
  It behaves less like "TypeScript that outputs CSS" and more like a **state-aware style compiler**. It is designed to encode higher-level styling semantics rather than only expose CSS primitives in typed form.
237
237
 
238
- This also makes Tasty's static mode notable:
238
+ This also makes Tasty's rendering model notable:
239
239
 
240
- - Runtime `tasty()` creates React components with dynamic injection
241
- - `tastyStatic()` with the Babel plugin produces static class name strings with zero runtime overhead
242
- - In static mode, the output is plain CSS + class names, so it can be used with any JavaScript framework — not only React
240
+ - `tasty()` components are hook-free and work as React Server Components. In server-only contexts (Next.js RSC, Astro without islands), they produce static HTML + CSS with zero client JavaScript — the full feature set is available without sacrificing server rendering
241
+ - `tastyStatic()` with the Babel plugin produces static class name strings via build-time extraction, with no React dependency at runtime — the output works with any JavaScript framework
243
242
 
244
- Runtime features like `styleProps`, sub-element components, and dynamic variants are React-specific. The static path is framework-agnostic.
243
+ Runtime features like `styleProps`, sub-element components, and dynamic variants are available in the `tasty()` path. The `tastyStatic()` path is framework-agnostic but limited to the DSL, tokens, and state logic.
245
244
 
246
245
  So the tradeoff is roughly:
247
246
 
@@ -303,6 +302,8 @@ So while Stitches and Emotion are strong tools for building components, Tasty is
303
302
 
304
303
  That makes it narrower in audience, but deeper in architectural ambition.
305
304
 
305
+ There is also a fundamental architectural difference: Emotion and styled-components rely on React context and hooks internally, which means they require `'use client'` in modern React and cannot run as React Server Components. Tasty's style functions and `tasty()` components are hook-free, so they work as server components by default and produce zero client JavaScript in server-only contexts. This is not a minor compatibility detail — it means Tasty-based components stay as server components until *your* code needs interactivity, while Emotion and styled-components force the client boundary at the styling layer.
306
+
306
307
  For teams evaluating runtime styling at scale, Tasty also documents its runtime benchmarks and caching model in the main [README](../README.md#performance). That matters, but it is still secondary to the core question of whether you want Tasty's deterministic selector model.
307
308
 
308
309
  ---
@@ -311,20 +312,18 @@ For teams evaluating runtime styling at scale, Tasty also documents its runtime
311
312
 
312
313
  Tasty is not limited to one execution model.
313
314
 
314
- It can be used as a styling system with runtime behavior, but it can also be used as a **fully build-time style compiler** when that is the right fit.
315
-
316
- That distinction matters.
315
+ The term "runtime" in `tasty()` refers to *when* style computation happens — during React rendering — not to where that rendering occurs. In server-only contexts (Next.js RSC without `'use client'`, Astro without `client:*` directives, SSG), `tasty()` components render on the server, produce static HTML + CSS, and ship **zero client JavaScript**. The full feature set — `styleProps`, sub-elements, variants, state maps is available. The result is the same as what `tastyStatic()` produces, but without giving up any runtime capabilities.
317
316
 
318
- In runtime mode, `tasty()` creates React components with dynamic style injection, `styleProps`, sub-element components, and variants. This path is React-specific.
317
+ Client JavaScript only enters the picture when a component needs React interactivity (state, effects, event handlers) — and that is the consuming component's decision, never Tasty's. Tasty never forces the `'use client'` boundary.
319
318
 
320
- In build-time mode, `tastyStatic()` with the Babel plugin generates plain static class names and CSS files. The output is framework-agnostic — any JavaScript framework can consume the resulting class names and CSS. This makes Tasty usable as the compiler layer underneath a design-system implementation, even outside the React ecosystem.
319
+ `tastyStatic()` with the Babel plugin is for a different scenario: when you want build-time CSS extraction **without React at runtime**. The output is framework-agnostic — any JavaScript framework can consume the resulting class names and CSS. This makes Tasty usable as the compiler layer underneath a design-system implementation, even outside the React ecosystem.
321
320
 
322
- The tradeoff is that some capabilities — `styleProps`, sub-element components (`<Card.Title>`), dynamic variants — are tied to the runtime path. The static path is best understood as extraction and compilation of the DSL, tokens, and state logic.
321
+ The tradeoff is that some capabilities — `styleProps`, sub-element components (`<Card.Title>`), dynamic variants — are tied to the `tasty()` path. The `tastyStatic()` path is best understood as extraction and compilation of the DSL, tokens, and state logic without a React dependency.
323
322
 
324
323
  This flexibility is one of Tasty's more unusual strengths:
325
324
 
326
- - it can be used as a full authoring/runtime system for React
327
- - or as a static compiler whose output works with any framework
325
+ - `tasty()` as the default for all React setups — zero client JS in server-only contexts, full feature set, SSR integration available when client hydration is needed
326
+ - `tastyStatic()` as a static compiler whose output works with any framework, including non-React ones
328
327
 
329
328
  ---
330
329
 
@@ -337,8 +336,8 @@ These are optimized for styling product code directly.
337
336
 
338
337
  Examples:
339
338
  - Tailwind CSS
340
- - Emotion
341
- - Stitches (deprecated)
339
+ - Emotion (requires `'use client'` — not RSC-compatible)
340
+ - Stitches (deprecated, requires `'use client'`)
342
341
 
343
342
  ### Typed styling engines
344
343
  These are optimized for generating CSS with stronger structure and tooling.
@@ -412,7 +411,7 @@ Tasty is most compelling when the problem is not just "how do we write styles,"
412
411
 
413
412
  - [README](../README.md) — overview, quick start, and feature highlights
414
413
  - [Style DSL](dsl.md) — state maps, tokens, units, extending semantics, keyframes, @property
415
- - [Runtime API](runtime.md) — `tasty()` factory, component props, variants, sub-elements, hooks
414
+ - [React API](react-api.md) — `tasty()` factory, component props, variants, sub-elements, style functions
416
415
  - [Style Properties](styles.md) — complete reference for all enhanced style properties
417
416
  - [Configuration](configuration.md) — tokens, recipes, custom units, style handlers, and TypeScript extensions
418
417
  - [Zero Runtime (tastyStatic)](tasty-static.md) — build-time static styling with Babel plugin
@@ -58,6 +58,8 @@ These docs use `data-schema="dark"` in examples. If your app already standardize
58
58
  | `counterStyle` | `Record<string, CounterStyleDescriptors>` | - | Global @counter-style definitions |
59
59
  | `autoPropertyTypes` | `boolean` | `true` | Auto-infer and register `@property` types from values |
60
60
  | `recipes` | `Record<string, RecipeStyles>` | - | Predefined style recipes (named style bundles) |
61
+ | `presets` | `Record<string, TypographyPreset>` | - | Typography presets — shorthand for `generateTypographyTokens()` |
62
+ | `globalStyles` | `Record<string, Styles>` | - | Global Tasty styles keyed by CSS selector |
61
63
  | `colorSpace` | `'rgb' \| 'hsl' \| 'oklch'` | `'oklch'` | Color space for decomposed color token companion variables |
62
64
 
63
65
  ---
@@ -220,6 +222,72 @@ For how to apply, compose, and override recipes in components, see [Recipes](dsl
220
222
 
221
223
  ---
222
224
 
225
+ ## Typography Presets
226
+
227
+ Typography presets are a shorthand for `generateTypographyTokens()`. Instead of calling the function manually and spreading the result into `tokens`, pass the presets directly:
228
+
229
+ ```jsx
230
+ configure({
231
+ presets: {
232
+ h1: { fontSize: '32px', lineHeight: '1.2', fontWeight: '700' },
233
+ t2: { fontSize: '16px', lineHeight: '1.5', fontWeight: '400' },
234
+ tag: {
235
+ fontSize: '10px',
236
+ lineHeight: '1.4',
237
+ letterSpacing: '0.04em',
238
+ fontWeight: '600',
239
+ },
240
+ },
241
+ });
242
+ ```
243
+
244
+ Each preset generates `$name-font-size`, `$name-line-height`, `$name-letter-spacing`, `$name-font-weight`, and optional `$name-bold-font-weight`, `$name-icon-size`, `$name-text-transform`, `$name-font-family`, `$name-font-style` tokens.
245
+
246
+ Preset values support state maps for responsive or theme-aware typography:
247
+
248
+ ```jsx
249
+ configure({
250
+ presets: {
251
+ t2: {
252
+ fontSize: '16px',
253
+ lineHeight: '1.5',
254
+ fontWeight: { '': '400', '@dark': '300' },
255
+ },
256
+ },
257
+ });
258
+ ```
259
+
260
+ The generated tokens are merged **under** explicit `tokens` — if both `presets` and `tokens` define `$t2-font-weight`, the `tokens` value wins. Plugins can also provide `presets`; plugin presets are merged first, then config presets, then explicit tokens on top.
261
+
262
+ ---
263
+
264
+ ## Global Styles
265
+
266
+ Apply Tasty styles to any selector via configuration, without needing `useGlobalStyles(selector, ...)` at runtime:
267
+
268
+ ```jsx
269
+ configure({
270
+ globalStyles: {
271
+ body: {
272
+ fill: '#surface',
273
+ color: '#text',
274
+ preset: 't2',
275
+ margin: 0,
276
+ fontFamily: 'system-ui, sans-serif',
277
+ },
278
+ html: {
279
+ overflow: 'hidden',
280
+ },
281
+ },
282
+ });
283
+ ```
284
+
285
+ Each key is a CSS selector, and each value is a Tasty `Styles` object supporting the full style syntax including style properties, tokens, state maps, and selector-based sub-styling (e.g. `$: '> .app'` for elements outside React scope). Global styles are injected alongside `:root` tokens when the first style is rendered.
286
+
287
+ Global styles are automatically emitted in all rendering modes: runtime (client), SSR, and zero-runtime (Babel plugin). Plugins can also provide `globalStyles`; they are merged per selector with config global styles (config wins on conflict).
288
+
289
+ ---
290
+
223
291
  ## Auto Property Types
224
292
 
225
293
  CSS cannot transition or animate custom properties unless their type is declared via [`@property`](https://developer.mozilla.org/en-US/docs/Web/CSS/@property). Tasty handles this automatically — when a custom property is assigned a concrete value (e.g. `'$scale': 1`, `'$gap': '10px'`, `'#accent': 'purple'`), the type is inferred and a `@property` rule is registered.
@@ -323,4 +391,4 @@ declare module '@tenphi/tasty' {
323
391
  }
324
392
  ```
325
393
 
326
- See [Style DSL](dsl.md) for state maps, tokens, units, and extending semantics, and [Runtime API](runtime.md) for `tasty()`, hooks, and component props.
394
+ See [Style DSL](dsl.md) for state maps, tokens, units, and extending semantics, and [React API](react-api.md) for `tasty()`, style functions, and component props.
@@ -12,6 +12,8 @@ In development mode (`isDevEnv()` returns `true`), `tastyDebug` is automatically
12
12
 
13
13
  All methods **log to the console by default**. Pass `{ raw: true }` to suppress logging and only return data.
14
14
 
15
+ > **Note (2.0.0+):** Class names use a content-addressed base36 hash format (e.g. `t3a5f`) instead of the previous sequential `t{number}` format. Cross-environment hydration reads the rendered class list from `window.__TASTY__` (the legacy `window.__TASTY_SSR_CACHE__` global was removed in 2.0.0).
16
+
15
17
  ---
16
18
 
17
19
  ## Quick Start
@@ -69,8 +71,8 @@ Retrieves CSS text for a given target. Logs the result with rule count and size.
69
71
  | `'unused'` | CSS with refCount = 0 (cached but not used) |
70
72
  | `'global'` | Only global CSS (from `injectGlobal`) |
71
73
  | `'page'` | All CSS on the page (including non-tasty) |
72
- | `'t42'` | CSS for a specific tasty class |
73
- | `['t0', 't5']` | CSS for multiple tasty classes |
74
+ | `'t3a5f'` | CSS for a specific tasty class (class names are `t` + base36 hash) |
75
+ | `['t3a5f', 't9k2']` | CSS for multiple tasty classes |
74
76
  | `'.my-button'` | CSS affecting a DOM element (by selector) |
75
77
  | `element` | CSS affecting a DOM element (by reference) |
76
78
 
@@ -88,11 +90,11 @@ interface CssOptions extends DebugOptions {
88
90
  tastyDebug.css('active');
89
91
 
90
92
  // Specific class, silent
91
- const css = tastyDebug.css('t42', { raw: true });
93
+ const css = tastyDebug.css('t3a5f', { raw: true });
92
94
 
93
95
  // Compare original vs browser-parsed CSS (dev mode only)
94
- tastyDebug.css('t42'); // live CSSOM
95
- tastyDebug.css('t42', { source: true }); // original output
96
+ tastyDebug.css('t3a5f'); // live CSSOM
97
+ tastyDebug.css('t3a5f', { source: true }); // original output
96
98
 
97
99
  // Shadow DOM
98
100
  tastyDebug.css('all', { root: shadowRoot });
@@ -125,11 +127,11 @@ interface ChunkInfo {
125
127
  ```typescript
126
128
  tastyDebug.inspect('.my-card');
127
129
  // Logs: inspect div — 3 classes, 5 rules, 1.2KB
128
- // Chunks: t3→appearance, t7→font, t12→dimension
130
+ // Chunks: t3a5f→appearance, t9k2→font, tb71→dimension
129
131
 
130
132
  // Silent
131
133
  const result = tastyDebug.inspect('.my-card', { raw: true });
132
- console.log(result.classes); // ['t3', 't7', 't12']
134
+ console.log(result.classes); // ['t3a5f', 't9k2', 'tb71']
133
135
  console.log(result.rules); // 5
134
136
  ```
135
137
 
@@ -291,10 +293,10 @@ tastyDebug.summary({ root: shadowRoot });
291
293
  tastyDebug.inspect('.my-button');
292
294
 
293
295
  // 2. See CSS for a specific class
294
- tastyDebug.css('t3');
296
+ tastyDebug.css('t3a5f');
295
297
 
296
298
  // 3. Compare original vs browser-parsed (dev mode)
297
- tastyDebug.css('t3', { source: true });
299
+ tastyDebug.css('t3a5f', { source: true });
298
300
  ```
299
301
 
300
302
  ### Checking cache efficiency
@@ -84,25 +84,37 @@ configure({
84
84
 
85
85
  ### Typography presets
86
86
 
87
- Use `generateTypographyTokens()` to create typography tokens from your own presets, then pass them to `configure({ tokens })`:
87
+ Pass typography presets directly to `configure()` they are converted to tokens automatically:
88
88
 
89
89
  ```tsx
90
- import { configure, generateTypographyTokens } from '@tenphi/tasty';
90
+ import { configure } from '@tenphi/tasty';
91
91
 
92
- const typographyTokens = generateTypographyTokens({
93
- h1: { fontSize: '2rem', lineHeight: '1.2', letterSpacing: '-0.02em', fontWeight: 700 },
94
- t2: { fontSize: '0.875rem', lineHeight: '1.5', letterSpacing: 'normal', fontWeight: 400 },
92
+ configure({
93
+ presets: {
94
+ h1: { fontSize: '2rem', lineHeight: '1.2', letterSpacing: '-0.02em', fontWeight: 700 },
95
+ t2: { fontSize: '0.875rem', lineHeight: '1.5', letterSpacing: 'normal', fontWeight: 400 },
96
+ },
95
97
  });
98
+ ```
99
+
100
+ Preset values support state maps for responsive or theme-aware typography:
96
101
 
102
+ ```tsx
97
103
  configure({
98
- tokens: {
99
- ...typographyTokens,
104
+ presets: {
105
+ t2: {
106
+ fontSize: '0.875rem',
107
+ lineHeight: '1.5',
108
+ fontWeight: { '': 400, '@dark': 300 },
109
+ },
100
110
  },
101
111
  });
102
112
  ```
103
113
 
104
114
  Then use `preset: 'h1'` or `preset: 't2'` in any component's styles.
105
115
 
116
+ > You can also call `generateTypographyTokens()` manually and spread the result into `tokens` for more control — `presets` is just a shorthand.
117
+
106
118
  ### Registering brand fonts
107
119
 
108
120
  Register your design system's custom fonts via `configure({ fontFace })` so every component can reference them:
@@ -334,7 +346,7 @@ Usage:
334
346
 
335
347
  Sub-elements share the root component's state context by default. A `disabled` modifier on `<Card>` affects `Title`, `Content`, and `Footer` styles automatically — no prop drilling. For the full mental model, see [Methodology — Component architecture](methodology.md#component-architecture-root--sub-elements).
336
348
 
337
- For sub-element syntax details (selector affix `$`, `@own()`, `elements` config), see [Runtime API — Sub-element Styling](runtime.md#sub-element-styling).
349
+ For sub-element syntax details (selector affix `$`, `@own()`, `elements` config), see [React API — Sub-element Styling](react-api.md#sub-element-styling).
338
350
 
339
351
  ---
340
352
 
@@ -404,7 +416,7 @@ ds/
404
416
  index.ts # Recipe definitions (imported by config.ts)
405
417
  tokens/
406
418
  colors.ts # Color token definitions
407
- typography.ts # Typography presets via generateTypographyTokens()
419
+ typography.ts # Typography presets for configure({ presets })
408
420
  spacing.ts # Spacing token definitions
409
421
  index.ts # Public API: re-exports components + configure
410
422
  ```
@@ -418,7 +430,7 @@ The key principle: `config.ts` imports tokens and recipes, calls `configure()`,
418
430
  - **[Methodology](methodology.md)** — The recommended patterns for structuring Tasty components
419
431
  - **[Getting Started](getting-started.md)** — Installation, first component, tooling setup
420
432
  - **[Style DSL](dsl.md)** — State maps, tokens, units, extending semantics, keyframes, @property
421
- - **[Runtime API](runtime.md)** — `tasty()` factory, component props, variants, sub-elements, hooks
433
+ - **[React API](react-api.md)** — `tasty()` factory, component props, variants, sub-elements, style functions
422
434
  - **[Configuration](configuration.md)** — Full `configure()` API: tokens, recipes, custom units, style handlers
423
435
  - **[Adoption Guide](adoption.md)** — Who should adopt Tasty, incremental phases, what changes for product engineers
424
436
  - **[Style Properties](styles.md)** — Complete reference for all enhanced style properties
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
 
@@ -430,7 +444,7 @@ const FadeIn = tasty({
430
444
 
431
445
  ### `@parent(...)` — Parent Element States
432
446
 
433
- 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()`.
434
448
 
435
449
  ```jsx
436
450
  const Highlight = tasty({
@@ -508,12 +522,13 @@ const Card = tasty({
508
522
  | `!:has(> Icon)` | `:not(:has(> [data-element="Icon"]))` | Negation (use `!`) |
509
523
  | `!:is(Panel)` | `:not([data-element="Panel"])` | Negation (use `!:is`) |
510
524
 
511
- Combine with other states using boolean logic:
525
+ Combine with other states using boolean logic (`&`, `|`, `!`, `^`):
512
526
 
513
527
  ```jsx
514
- ':has(> Icon) & hovered' // structural + data attribute
515
- '@parent(hovered) & :has(> Icon)' // parent check + structural
528
+ ':has(> Icon) & hovered' // AND: structural + data attribute
529
+ '@parent(hovered) & :has(> Icon)' // AND: parent check + structural
516
530
  ':has(> Icon) | :has(> Button)' // OR: either sub-element present
531
+ ':has(> Icon) ^ :has(> Button)' // XOR: exactly one present
517
532
  ```
518
533
 
519
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.
@@ -666,7 +681,7 @@ For a complete reference of all enhanced style properties — syntax, values, mo
666
681
 
667
682
  ## Learn more
668
683
 
669
- - **[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
670
685
  - **[Methodology](methodology.md)** — Recommended patterns: root + sub-elements, styleProps, tokens, wrapping
671
686
  - **[Configuration](configuration.md)** — Tokens, recipes, custom units, style handlers, TypeScript extensions
672
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.