@cube-dev/ui-kit 0.121.4 → 0.121.6

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 (517) hide show
  1. package/dist/CHANGELOG.md +21 -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/styled.js +1 -1
  25. package/dist/components/actions/ItemAction/ItemAction.js +1 -1
  26. package/dist/components/actions/ItemActionContext.js +1 -1
  27. package/dist/components/actions/ItemButton/ItemButton.js +1 -1
  28. package/dist/components/actions/Link/Link.js +1 -1
  29. package/dist/components/actions/Menu/Menu.js +1 -1
  30. package/dist/components/actions/Menu/MenuItem.js +1 -1
  31. package/dist/components/actions/Menu/MenuSection.js +1 -1
  32. package/dist/components/actions/Menu/MenuTrigger.js +1 -1
  33. package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
  34. package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  35. package/dist/components/actions/Menu/context.js +1 -1
  36. package/dist/components/actions/Menu/styled.js +1 -1
  37. package/dist/components/actions/index.js +1 -1
  38. package/dist/components/actions/use-action.js +1 -1
  39. package/dist/components/actions/use-anchored-menu.js +1 -1
  40. package/dist/components/actions/use-context-menu.js +1 -1
  41. package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
  42. package/dist/components/content/Alert/Alert.js +1 -1
  43. package/dist/components/content/Alert/use-alert.js +1 -1
  44. package/dist/components/content/Avatar/Avatar.js +1 -1
  45. package/dist/components/content/Badge/Badge.js +1 -1
  46. package/dist/components/content/Card/Card.js +1 -1
  47. package/dist/components/content/Content.js +1 -1
  48. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  49. package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
  50. package/dist/components/content/Disclosure/Disclosure.js +1 -1
  51. package/dist/components/content/Divider.js +1 -1
  52. package/dist/components/content/Footer.js +1 -1
  53. package/dist/components/content/Header.js +1 -1
  54. package/dist/components/content/HotKeys/HotKeys.js +1 -1
  55. package/dist/components/content/Item/Item.js +2 -2
  56. package/dist/components/content/Item/Item.js.map +1 -1
  57. package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
  58. package/dist/components/content/ItemCard/ItemCard.js +1 -1
  59. package/dist/components/content/Layout/GridLayout.js +1 -1
  60. package/dist/components/content/Layout/Layout.js +1 -1
  61. package/dist/components/content/Layout/LayoutBlock.js +1 -1
  62. package/dist/components/content/Layout/LayoutCenter.js +1 -1
  63. package/dist/components/content/Layout/LayoutContainer.js +1 -1
  64. package/dist/components/content/Layout/LayoutContent.js +1 -1
  65. package/dist/components/content/Layout/LayoutContext.js +1 -1
  66. package/dist/components/content/Layout/LayoutFlex.js +1 -1
  67. package/dist/components/content/Layout/LayoutFooter.js +1 -1
  68. package/dist/components/content/Layout/LayoutGrid.js +1 -1
  69. package/dist/components/content/Layout/LayoutHeader.js +1 -1
  70. package/dist/components/content/Layout/LayoutPane.js +1 -1
  71. package/dist/components/content/Layout/LayoutPanel.js +1 -1
  72. package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
  73. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  74. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  75. package/dist/components/content/Layout/index.js +1 -1
  76. package/dist/components/content/Layout/utils.js +1 -1
  77. package/dist/components/content/Paragraph.js +1 -1
  78. package/dist/components/content/Placeholder/Placeholder.js +1 -1
  79. package/dist/components/content/PrismCode/PrismCode.js +1 -1
  80. package/dist/components/content/PrismCode/prismSetup.js +1 -1
  81. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  82. package/dist/components/content/Result/Result.js +2 -2
  83. package/dist/components/content/Result/Result.js.map +1 -1
  84. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  85. package/dist/components/content/Tag/Tag.js +1 -1
  86. package/dist/components/content/Text.js +1 -1
  87. package/dist/components/content/TextItem/TextItem.js +1 -1
  88. package/dist/components/content/Title.js +1 -1
  89. package/dist/components/content/highlightText.js +1 -1
  90. package/dist/components/content/use-auto-tooltip.js +1 -1
  91. package/dist/components/fields/Checkbox/Checkbox.js +1 -1
  92. package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
  93. package/dist/components/fields/Checkbox/context.js +1 -1
  94. package/dist/components/fields/ComboBox/ComboBox.js +1 -1
  95. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  96. package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
  97. package/dist/components/fields/DatePicker/DatePicker.js +1 -1
  98. package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
  99. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  100. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  101. package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
  102. package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
  103. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  104. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  105. package/dist/components/fields/DatePicker/intl.js +1 -1
  106. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  107. package/dist/components/fields/DatePicker/props.js +1 -1
  108. package/dist/components/fields/DatePicker/utils.js +1 -1
  109. package/dist/components/fields/FileInput/FileInput.js +1 -1
  110. package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
  111. package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
  112. package/dist/components/fields/Input/Input.js +1 -1
  113. package/dist/components/fields/ListBox/ListBox.js +1 -1
  114. package/dist/components/fields/NumberInput/NumberInput.js +1 -1
  115. package/dist/components/fields/NumberInput/StepButton.js +1 -1
  116. package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
  117. package/dist/components/fields/Picker/Picker.js +1 -1
  118. package/dist/components/fields/RadioGroup/Radio.js +1 -1
  119. package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
  120. package/dist/components/fields/RadioGroup/context.js +1 -1
  121. package/dist/components/fields/SearchInput/SearchInput.js +1 -1
  122. package/dist/components/fields/Select/Select.js +1 -1
  123. package/dist/components/fields/Slider/Gradation.js +1 -1
  124. package/dist/components/fields/Slider/HueSlider.js +1 -1
  125. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  126. package/dist/components/fields/Slider/Slider.js +1 -1
  127. package/dist/components/fields/Slider/SliderBase.js +1 -1
  128. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  129. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  130. package/dist/components/fields/Slider/elements.js +1 -1
  131. package/dist/components/fields/Slider/index.js +1 -1
  132. package/dist/components/fields/Switch/Switch.js +4 -4
  133. package/dist/components/fields/Switch/Switch.js.map +1 -1
  134. package/dist/components/fields/TextArea/TextArea.js +1 -1
  135. package/dist/components/fields/TextInput/TextInput.js +1 -1
  136. package/dist/components/fields/TextInput/TextInputBase.d.ts +2 -2
  137. package/dist/components/fields/TextInput/TextInputBase.js +14 -6
  138. package/dist/components/fields/TextInput/TextInputBase.js.map +1 -1
  139. package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  140. package/dist/components/form/FieldWrapper/FieldWrapper.js +3 -3
  141. package/dist/components/form/FieldWrapper/FieldWrapper.js.map +1 -1
  142. package/dist/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
  143. package/dist/components/form/Form/Field.js +1 -1
  144. package/dist/components/form/Form/Form.js +1 -1
  145. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  146. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  147. package/dist/components/form/Form/SubmitError.js +1 -1
  148. package/dist/components/form/Form/index.js +1 -1
  149. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  150. package/dist/components/form/Form/use-field/use-field.js +1 -1
  151. package/dist/components/form/Form/use-form.js +1 -1
  152. package/dist/components/form/Form/validation.js +1 -1
  153. package/dist/components/form/Label.js +1 -1
  154. package/dist/components/form/wrapper.js +1 -1
  155. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  156. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  157. package/dist/components/layout/Flex.js +1 -1
  158. package/dist/components/layout/Flow.js +1 -1
  159. package/dist/components/layout/Grid.js +1 -1
  160. package/dist/components/layout/Panel.js +1 -1
  161. package/dist/components/layout/Prefix.js +1 -1
  162. package/dist/components/layout/ResizablePanel.js +1 -1
  163. package/dist/components/layout/Space.js +1 -1
  164. package/dist/components/layout/Suffix.js +1 -1
  165. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  166. package/dist/components/navigation/Tabs/EditableTitle.js +1 -1
  167. package/dist/components/navigation/Tabs/TabButton.js +1 -1
  168. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  169. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  170. package/dist/components/navigation/Tabs/TabPicker.js +1 -1
  171. package/dist/components/navigation/Tabs/Tabs.js +1 -1
  172. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  173. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  174. package/dist/components/navigation/Tabs/styled.js +1 -1
  175. package/dist/components/navigation/Tabs/types.js +1 -1
  176. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  177. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  178. package/dist/components/organisms/FileTabs/FileTabs.js +1 -1
  179. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  180. package/dist/components/other/Calendar/Calendar.js +1 -1
  181. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  182. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  183. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  184. package/dist/components/other/CloudLogo/CloudLogo.js +1 -1
  185. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  186. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  187. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  188. package/dist/components/overlays/Dialog/Dialog.js +1 -1
  189. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  190. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  191. package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
  192. package/dist/components/overlays/Dialog/context.js +1 -1
  193. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  194. package/dist/components/overlays/Modal/Modal.js +1 -1
  195. package/dist/components/overlays/Modal/OpenTransition.js +1 -1
  196. package/dist/components/overlays/Modal/Overlay.js +1 -1
  197. package/dist/components/overlays/Modal/Popover.js +1 -1
  198. package/dist/components/overlays/Modal/Tray.js +1 -1
  199. package/dist/components/overlays/Modal/Underlay.js +1 -1
  200. package/dist/components/overlays/Notifications/Notification.js +1 -1
  201. package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
  202. package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
  203. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  204. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  205. package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
  206. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  207. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
  208. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  209. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  210. package/dist/components/overlays/Notifications/index.js +1 -1
  211. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  212. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  213. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  214. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  215. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  216. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  217. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  218. package/dist/components/overlays/Toast/index.js +1 -1
  219. package/dist/components/overlays/Toast/useProgressToast.js +1 -1
  220. package/dist/components/overlays/Toast/useToast.js +1 -1
  221. package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
  222. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  223. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  224. package/dist/components/overlays/Tooltip/context.js +1 -1
  225. package/dist/components/portal/Portal.js +1 -1
  226. package/dist/components/portal/PortalProvider.js +1 -1
  227. package/dist/components/portal/usePortal.js +1 -1
  228. package/dist/components/shared/InvalidIcon.js +1 -1
  229. package/dist/components/shared/ValidIcon.js +1 -1
  230. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  231. package/dist/components/status/Spin/Cube.js +1 -1
  232. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  233. package/dist/components/status/Spin/Spin.js +1 -1
  234. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  235. package/dist/data/item-themes.js +1 -1
  236. package/dist/data/themes.js +1 -1
  237. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  238. package/dist/icons/AdjustmentsIcon.js +1 -1
  239. package/dist/icons/AiIcon.js +1 -1
  240. package/dist/icons/AreaChartIcon.js +1 -1
  241. package/dist/icons/BackwardIcon.js +1 -1
  242. package/dist/icons/BarChartIcon.js +1 -1
  243. package/dist/icons/BellFilledIcon.js +1 -1
  244. package/dist/icons/BellIcon.js +1 -1
  245. package/dist/icons/BooleanIcon.js +1 -1
  246. package/dist/icons/CalendarEditIcon.js +1 -1
  247. package/dist/icons/CalendarIcon.js +1 -1
  248. package/dist/icons/CaretDownIcon.js +1 -1
  249. package/dist/icons/CaretUpIcon.js +1 -1
  250. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  251. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  252. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  253. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  254. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  255. package/dist/icons/ChartBarLineIcon.js +1 -1
  256. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  257. package/dist/icons/ChartBarStackedIcon.js +1 -1
  258. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  259. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  260. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  261. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  262. package/dist/icons/ChartBubbleIcon.js +1 -1
  263. package/dist/icons/ChartDonut2Icon.js +1 -1
  264. package/dist/icons/ChartFunnelIcon.js +1 -1
  265. package/dist/icons/ChartHeatmapIcon.js +1 -1
  266. package/dist/icons/ChartKPIIcon.js +1 -1
  267. package/dist/icons/ChartPie2Icon.js +1 -1
  268. package/dist/icons/ChartScatterIcon.js +1 -1
  269. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  270. package/dist/icons/CheckCircleIcon.js +1 -1
  271. package/dist/icons/CheckIcon.js +1 -1
  272. package/dist/icons/CircleFilledIcon.js +1 -1
  273. package/dist/icons/ClearIcon.js +1 -1
  274. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  275. package/dist/icons/CloseCircleIcon.js +1 -1
  276. package/dist/icons/CloseIcon.js +1 -1
  277. package/dist/icons/CodeIcon.js +1 -1
  278. package/dist/icons/ColumnTotalIcon.js +1 -1
  279. package/dist/icons/CopyIcon.js +1 -1
  280. package/dist/icons/CountIcon.js +1 -1
  281. package/dist/icons/CubeIcon.js +1 -1
  282. package/dist/icons/CubePauseIcon.js +1 -1
  283. package/dist/icons/CubePlayIcon.js +1 -1
  284. package/dist/icons/CurrencyDollarIcon.js +1 -1
  285. package/dist/icons/DangerIcon.js +1 -1
  286. package/dist/icons/DashboardIcon.js +1 -1
  287. package/dist/icons/DatabaseIcon.js +1 -1
  288. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  289. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  290. package/dist/icons/DirectionIcon.js +1 -1
  291. package/dist/icons/DonutIcon.js +1 -1
  292. package/dist/icons/DownIcon.js +1 -1
  293. package/dist/icons/EditIcon.js +1 -1
  294. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  295. package/dist/icons/ExclamationCircleIcon.js +1 -1
  296. package/dist/icons/ExclamationIcon.js +1 -1
  297. package/dist/icons/EyeIcon.js +1 -1
  298. package/dist/icons/EyeInvisibleIcon.js +1 -1
  299. package/dist/icons/FilterIcon.js +1 -1
  300. package/dist/icons/FolderFilledIcon.js +1 -1
  301. package/dist/icons/FolderIcon.js +1 -1
  302. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  303. package/dist/icons/FolderOpenIcon.js +1 -1
  304. package/dist/icons/ForwardIcon.js +1 -1
  305. package/dist/icons/HierarchyIcon.js +1 -1
  306. package/dist/icons/HierarchyOpenIcon.js +1 -1
  307. package/dist/icons/Icon.js +1 -1
  308. package/dist/icons/InfoCircleIcon.js +1 -1
  309. package/dist/icons/InfoIcon.js +1 -1
  310. package/dist/icons/KeyIcon.js +1 -1
  311. package/dist/icons/LeftIcon.js +1 -1
  312. package/dist/icons/LineChartIcon.js +1 -1
  313. package/dist/icons/LoadingIcon.js +1 -1
  314. package/dist/icons/LockFilledIcon.js +1 -1
  315. package/dist/icons/LockIcon.js +1 -1
  316. package/dist/icons/MoreIcon.js +1 -1
  317. package/dist/icons/NotAllowedIcon.js +1 -1
  318. package/dist/icons/Number123Icon.js +1 -1
  319. package/dist/icons/NumberIcon.js +1 -1
  320. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  321. package/dist/icons/PauseCircleIcon.js +1 -1
  322. package/dist/icons/PauseIcon.js +1 -1
  323. package/dist/icons/PercentageIcon.js +1 -1
  324. package/dist/icons/PieChartIcon.js +1 -1
  325. package/dist/icons/PlayCircleIcon.js +1 -1
  326. package/dist/icons/PlayIcon.js +1 -1
  327. package/dist/icons/PlusIcon.js +1 -1
  328. package/dist/icons/ProgressBarIcon.js +1 -1
  329. package/dist/icons/ReloadIcon.js +1 -1
  330. package/dist/icons/ReportIcon.js +1 -1
  331. package/dist/icons/ReturnIcon.js +1 -1
  332. package/dist/icons/RightIcon.js +1 -1
  333. package/dist/icons/RowTotalsIcon.js +1 -1
  334. package/dist/icons/SchemeIcon.js +1 -1
  335. package/dist/icons/SearchIcon.js +1 -1
  336. package/dist/icons/SemanticQueryIcon.js +1 -1
  337. package/dist/icons/SettingsIcon.js +1 -1
  338. package/dist/icons/ShieldFilledIcon.js +1 -1
  339. package/dist/icons/ShieldIcon.js +1 -1
  340. package/dist/icons/SlashIcon.js +1 -1
  341. package/dist/icons/SparklesIcon.js +1 -1
  342. package/dist/icons/SqlIcon.js +1 -1
  343. package/dist/icons/StatsIcon.js +1 -1
  344. package/dist/icons/StopIcon.js +1 -1
  345. package/dist/icons/StringIcon.js +1 -1
  346. package/dist/icons/SubtotalsIcon.js +1 -1
  347. package/dist/icons/SwitchIcon.js +1 -1
  348. package/dist/icons/TableIcon.js +1 -1
  349. package/dist/icons/ThumbsDownIcon.js +1 -1
  350. package/dist/icons/ThumbsUpIcon.js +1 -1
  351. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  352. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  353. package/dist/icons/ThunderboltIcon.js +1 -1
  354. package/dist/icons/TimeIcon.js +1 -1
  355. package/dist/icons/TrashIcon.js +1 -1
  356. package/dist/icons/UnlockIcon.js +1 -1
  357. package/dist/icons/UpIcon.js +1 -1
  358. package/dist/icons/UserGroupIcon.js +1 -1
  359. package/dist/icons/UserIcon.js +1 -1
  360. package/dist/icons/UserLockIcon.js +1 -1
  361. package/dist/icons/ViewIcon.js +1 -1
  362. package/dist/icons/WarningFilledIcon.js +1 -1
  363. package/dist/icons/WarningIcon.js +1 -1
  364. package/dist/icons/wrap-icon.js +1 -1
  365. package/dist/index.d.ts +2 -1
  366. package/dist/index.js +3 -2
  367. package/dist/index.js.map +1 -1
  368. package/dist/provider.js +1 -1
  369. package/dist/providers/TrackingProvider.js +1 -1
  370. package/dist/providers/navigationAdapter.default.js +1 -1
  371. package/dist/tokens/base.js +1 -1
  372. package/dist/tokens/colors.js +1 -1
  373. package/dist/tokens/index.d.ts +1 -0
  374. package/dist/tokens/index.js +3 -2
  375. package/dist/tokens/index.js.map +1 -1
  376. package/dist/tokens/layout.js +1 -1
  377. package/dist/tokens/shadows.js +1 -1
  378. package/dist/tokens/sizes.js +1 -1
  379. package/dist/tokens/spacing.js +1 -1
  380. package/dist/tokens/typography.d.ts +35 -0
  381. package/dist/tokens/typography.js +238 -0
  382. package/dist/tokens/typography.js.map +1 -0
  383. package/dist/utils/ResizeSensor.js +1 -1
  384. package/dist/utils/is-dev-env.js +1 -1
  385. package/dist/utils/modules.js +1 -1
  386. package/dist/utils/promise.js +1 -1
  387. package/dist/utils/raf.js +1 -1
  388. package/dist/utils/random.js +1 -1
  389. package/dist/utils/range.js +1 -1
  390. package/dist/utils/react/RenderCache.js +1 -1
  391. package/dist/utils/react/Slots.js +1 -1
  392. package/dist/utils/react/chain.js +1 -1
  393. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  394. package/dist/utils/react/index.js +1 -1
  395. package/dist/utils/react/interactions.js +1 -1
  396. package/dist/utils/react/isTextOnly.js +1 -1
  397. package/dist/utils/react/mapProps.js +1 -1
  398. package/dist/utils/react/mergeProps.js +1 -1
  399. package/dist/utils/react/nullableValue.js +1 -1
  400. package/dist/utils/react/resolveIcon.js +1 -1
  401. package/dist/utils/react/sharedStore.js +1 -1
  402. package/dist/utils/react/useCombinedRefs.js +1 -1
  403. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  404. package/dist/utils/react/useEventBus.js +1 -1
  405. package/dist/utils/react/useId.js +1 -1
  406. package/dist/utils/react/useIsDarwin.js +1 -1
  407. package/dist/utils/react/useKeySymbols.js +1 -1
  408. package/dist/utils/react/useLayoutEffect.js +1 -1
  409. package/dist/utils/react/useLocalStorage.js +1 -1
  410. package/dist/utils/react/useMergeStyles.js +1 -1
  411. package/dist/utils/react/useQaProps.js +1 -1
  412. package/dist/utils/react/useViewportSize.js +1 -1
  413. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  414. package/dist/utils/tree.js +1 -1
  415. package/dist/utils/warnings.js +1 -1
  416. package/dist/version.js +2 -2
  417. package/docs/BaseProperties.md +1 -1
  418. package/docs/Utilities.md +183 -0
  419. package/docs/components/Block.md +11 -0
  420. package/docs/components/CollectionItem.md +37 -8
  421. package/docs/components/GridProvider.md +15 -0
  422. package/docs/components/Root.md +8 -0
  423. package/docs/components/actions/Action.md +12 -0
  424. package/docs/components/actions/Banner.md +28 -2
  425. package/docs/components/actions/Button.md +10 -1
  426. package/docs/components/actions/ButtonGroup.md +11 -0
  427. package/docs/components/actions/ButtonSplit.md +11 -1
  428. package/docs/components/actions/CommandMenu.md +44 -17
  429. package/docs/components/actions/ItemButton.md +14 -37
  430. package/docs/components/actions/Link.md +9 -5
  431. package/docs/components/actions/Menu.md +11 -13
  432. package/docs/components/actions/MenuTrigger.md +17 -0
  433. package/docs/components/actions/SubMenuTrigger.md +17 -0
  434. package/docs/components/actions/use-anchored-menu.md +11 -0
  435. package/docs/components/actions/use-context-menu.md +11 -0
  436. package/docs/components/content/ActiveZone.md +18 -0
  437. package/docs/components/content/Alert.md +12 -0
  438. package/docs/components/content/Avatar.md +11 -0
  439. package/docs/components/content/Badge.md +20 -9
  440. package/docs/components/content/Card.md +11 -0
  441. package/docs/components/content/Content.md +12 -0
  442. package/docs/components/content/CopyPasteBlock.md +8 -0
  443. package/docs/components/content/CopySnippet.md +19 -5
  444. package/docs/components/content/Disclosure.md +5 -1
  445. package/docs/components/content/Divider.md +12 -0
  446. package/docs/components/content/Footer.md +12 -0
  447. package/docs/components/content/Header.md +12 -0
  448. package/docs/components/content/HotKeys.md +7 -14
  449. package/docs/components/content/ItemBadge.md +1 -0
  450. package/docs/components/content/ItemCard.md +20 -5
  451. package/docs/components/content/Layout.md +8 -1
  452. package/docs/components/content/Paragraph.md +20 -1
  453. package/docs/components/content/Placeholder.md +11 -0
  454. package/docs/components/content/Result.md +12 -0
  455. package/docs/components/content/Skeleton.md +15 -0
  456. package/docs/components/content/Tag.md +20 -9
  457. package/docs/components/content/Text.md +8 -0
  458. package/docs/components/content/TextItem.md +15 -9
  459. package/docs/components/content/Title.md +16 -0
  460. package/docs/components/fields/Checkbox.md +8 -3
  461. package/docs/components/fields/ComboBox.md +11 -5
  462. package/docs/components/fields/DatePicker.md +16 -15
  463. package/docs/components/fields/FileInput.md +13 -31
  464. package/docs/components/fields/FilterListBox.md +16 -1
  465. package/docs/components/fields/FilterPicker.md +34 -7
  466. package/docs/components/fields/HueSlider.md +16 -2
  467. package/docs/components/fields/ListBox.md +9 -1
  468. package/docs/components/fields/NumberInput.md +14 -6
  469. package/docs/components/fields/PasswordInput.md +10 -2
  470. package/docs/components/fields/Picker.md +29 -12
  471. package/docs/components/fields/RadioGroup.md +8 -1
  472. package/docs/components/fields/SearchInput.md +12 -2
  473. package/docs/components/fields/Select.md +14 -2
  474. package/docs/components/fields/Slider.md +34 -0
  475. package/docs/components/fields/Switch.md +3 -1
  476. package/docs/components/fields/TextArea.md +43 -0
  477. package/docs/components/fields/TextInput.md +10 -2
  478. package/docs/components/fields/TextInputMapper.md +30 -0
  479. package/docs/components/form/Field.md +9 -1
  480. package/docs/components/form/Form.md +9 -1
  481. package/docs/components/layout/Flex.md +11 -0
  482. package/docs/components/layout/Flow.md +11 -0
  483. package/docs/components/layout/Grid.md +11 -0
  484. package/docs/components/layout/Panel.md +11 -0
  485. package/docs/components/layout/Prefix.md +11 -0
  486. package/docs/components/layout/ResizablePanel.md +17 -0
  487. package/docs/components/layout/Space.md +11 -0
  488. package/docs/components/layout/Suffix.md +11 -0
  489. package/docs/components/navigation/Tabs.md +6 -1
  490. package/docs/components/organisms/FileTabs.md +12 -0
  491. package/docs/components/organisms/StatsCard.md +11 -0
  492. package/docs/components/other/CloudLogo.md +12 -0
  493. package/docs/components/overlays/AlertDialog.md +16 -0
  494. package/docs/components/overlays/Dialog.md +6 -3
  495. package/docs/components/overlays/DialogContainer.md +9 -0
  496. package/docs/components/overlays/DialogForm.md +29 -16
  497. package/docs/components/overlays/DialogTrigger.md +11 -0
  498. package/docs/components/overlays/Tooltip.md +27 -84
  499. package/docs/components/overlays/TooltipProvider.md +24 -4
  500. package/docs/components/overlays/TooltipTrigger.md +14 -0
  501. package/docs/components/portal/Portal.md +4 -0
  502. package/docs/components/status/LoadingAnimation.md +11 -0
  503. package/docs/components/status/Spin.md +11 -0
  504. package/docs/tasty/adoption.md +286 -0
  505. package/docs/tasty/comparison.md +413 -0
  506. package/docs/tasty/configuration.md +41 -10
  507. package/docs/tasty/debug.md +1 -1
  508. package/docs/tasty/design-system.md +401 -0
  509. package/docs/tasty/{usage.md → dsl.md} +254 -409
  510. package/docs/tasty/getting-started.md +201 -0
  511. package/docs/tasty/injector.md +2 -2
  512. package/docs/tasty/methodology.md +501 -0
  513. package/docs/tasty/runtime.md +291 -0
  514. package/docs/tasty/ssr.md +382 -0
  515. package/docs/tasty/styles.md +2 -2
  516. package/docs/tasty/tasty-static.md +58 -13
  517. package/package.json +8 -9
@@ -0,0 +1,291 @@
1
+ # Runtime API
2
+
3
+ The React-specific `tasty()` component factory, component props, and hooks. For the shared style language (state maps, tokens, units, extending semantics), see [Style DSL](dsl.md). For global configuration, see [Configuration](configuration.md).
4
+
5
+ ---
6
+
7
+ ## Component Creation
8
+
9
+ ### Create a new component
10
+
11
+ ```jsx
12
+ import { tasty } from '@tenphi/tasty';
13
+
14
+ const Card = tasty({
15
+ as: 'div',
16
+ styles: {
17
+ padding: '4x',
18
+ fill: '#white',
19
+ border: true,
20
+ radius: true,
21
+ },
22
+ styleProps: ['padding', 'fill'],
23
+ });
24
+
25
+ <Card>Hello World</Card>
26
+ <Card padding="6x" fill="#gray.05">Custom Card</Card>
27
+ ```
28
+
29
+ ### Extend an existing component
30
+
31
+ ```jsx
32
+ const PrimaryButton = tasty(Button, {
33
+ styles: {
34
+ fill: '#purple',
35
+ color: '#white',
36
+ padding: '2x 4x',
37
+ },
38
+ });
39
+ ```
40
+
41
+ Style maps merge intelligently — see [Style DSL — Extending vs. Replacing State Maps](dsl.md#extending-vs-replacing-state-maps) for extend mode, replace mode, `@inherit`, `null`, and `false` tombstones.
42
+
43
+ ---
44
+
45
+ ## Style Props
46
+
47
+ Use `styleProps` to expose style properties as direct component props:
48
+
49
+ ```jsx
50
+ const FlexibleBox = tasty({
51
+ as: 'div',
52
+ styles: {
53
+ display: 'flex',
54
+ padding: '2x',
55
+ },
56
+ styleProps: ['gap', 'align', 'placeContent', 'fill'],
57
+ });
58
+
59
+ <FlexibleBox gap="2x" align="center" fill="#surface">
60
+ Content
61
+ </FlexibleBox>
62
+ ```
63
+
64
+ Style props accept state maps, so responsive values work through the same API:
65
+
66
+ ```jsx
67
+ <FlexibleBox
68
+ gap={{ '': '2x', '@tablet': '4x' }}
69
+ fill={{ '': '#surface', '@dark': '#surface-dark' }}
70
+ >
71
+ ```
72
+
73
+ For predefined style prop lists (`FLOW_STYLES`, `POSITION_STYLES`, `DIMENSION_STYLES`, etc.) and guidance on which props to expose per component category, see [Methodology — styleProps as the public API](methodology.md#styleprops-as-the-public-api).
74
+
75
+ ---
76
+
77
+ ## Variants
78
+
79
+ Define named style variations. Only CSS for variants actually used at runtime is injected:
80
+
81
+ ```jsx
82
+ const Button = tasty({
83
+ styles: {
84
+ padding: '2x 4x',
85
+ border: true,
86
+ },
87
+ variants: {
88
+ default: { fill: '#blue', color: '#white' },
89
+ danger: { fill: '#red', color: '#white' },
90
+ outline: { fill: 'transparent', color: '#blue', border: '1bw solid #blue' },
91
+ },
92
+ });
93
+
94
+ <Button variant="danger">Delete</Button>
95
+ ```
96
+
97
+ ### Extending Variants with Base State Maps
98
+
99
+ When base `styles` contain an extend-mode state map (an object **without** a `''` key), it is applied **after** the variant merge. This lets you add or override states across all variants without repeating yourself:
100
+
101
+ ```jsx
102
+ const Badge = tasty({
103
+ styles: {
104
+ padding: '1x 2x',
105
+ border: {
106
+ 'type=primary': '#clear',
107
+ },
108
+ },
109
+ variants: {
110
+ primary: {
111
+ border: { '': '#white.2', pressed: '#primary-text', disabled: '#clear' },
112
+ fill: { '': '#white #primary', hovered: '#white #primary-text' },
113
+ },
114
+ secondary: {
115
+ border: { '': '#primary.15', pressed: '#primary.3' },
116
+ fill: '#primary.10',
117
+ },
118
+ },
119
+ });
120
+
121
+ // Both variants get 'type=primary': '#clear' appended to their border map
122
+ ```
123
+
124
+ Properties that are **not** extend-mode (simple values, state maps with `''`, `null`, `false`, selectors, sub-elements) merge with variants as before — the variant can fully replace them.
125
+
126
+ ---
127
+
128
+ ## Sub-element Styling
129
+
130
+ Sub-elements are inner parts of a compound component, styled via capitalized keys in `styles` and identified by `data-element` attributes in the DOM.
131
+
132
+ > Use the `elements` prop to declare sub-element components. This gives you typed, reusable sub-components (`Card.Title`, `Card.Content`) instead of manually writing `data-element` attributes.
133
+
134
+ ```jsx
135
+ const Card = tasty({
136
+ styles: {
137
+ padding: '4x',
138
+ Title: { preset: 'h3', color: '#primary' },
139
+ Content: { color: '#text' },
140
+ },
141
+ elements: {
142
+ Title: 'h3',
143
+ Content: 'div',
144
+ },
145
+ });
146
+
147
+ <Card>
148
+ <Card.Title>Card Title</Card.Title>
149
+ <Card.Content>Card content</Card.Content>
150
+ </Card>
151
+ ```
152
+
153
+ Each entry in `elements` can be a tag name string or a config object:
154
+
155
+ ```jsx
156
+ elements: {
157
+ Title: 'h3', // shorthand: tag name only
158
+ Icon: { as: 'span', qa: 'card-icon' }, // full form: tag + QA attribute
159
+ }
160
+ ```
161
+
162
+ The sub-components produced by `elements` support `mods`, `tokens`, `isDisabled`, `isHidden`, and `isChecked` props — the same modifier interface as the root component.
163
+
164
+ If you don't need sub-components (e.g., the inner elements are already rendered by a third-party library), you can still style them by key alone — just omit `elements` and apply `data-element` manually:
165
+
166
+ ```jsx
167
+ const Card = tasty({
168
+ styles: {
169
+ padding: '4x',
170
+ Title: { preset: 'h3', color: '#primary' },
171
+ },
172
+ });
173
+
174
+ <Card>
175
+ <div data-element="Title">Card Title</div>
176
+ </Card>
177
+ ```
178
+
179
+ ### Selector Affix (`$`)
180
+
181
+ Control how a sub-element selector attaches to the root selector using the `$` property inside the sub-element's styles:
182
+
183
+ | Pattern | Result | Description |
184
+ |---------|--------|-------------|
185
+ | *(none)* | ` [el]` | Descendant (default) |
186
+ | `>` | `> [el]` | Direct child |
187
+ | `>Body>Row>` | `> [Body] > [Row] > [el]` | Chained elements |
188
+ | `::before` | `::before` | Root pseudo (no key) |
189
+ | `@::before` | `[el]::before` | Pseudo on the sub-element |
190
+ | `>@:hover` | `> [el]:hover` | Pseudo-class on the sub-element |
191
+ | `>@.active` | `> [el].active` | Class on the sub-element |
192
+
193
+ The `@` placeholder marks exactly where the `[data-element="..."]` selector is injected, allowing you to attach pseudo-classes, pseudo-elements, or class selectors directly to the sub-element instead of the root:
194
+
195
+ ```jsx
196
+ const List = tasty({
197
+ styles: {
198
+ Item: {
199
+ $: '>@:last-child',
200
+ border: 'none',
201
+ },
202
+ },
203
+ });
204
+ // → .t0 > [data-element="Item"]:last-child { border: none }
205
+ ```
206
+
207
+ For the mental model behind sub-elements — how they share root state context and how this differs from BEM — see [Methodology — Component architecture](methodology.md#component-architecture-root--sub-elements).
208
+
209
+ ---
210
+
211
+ ## Hooks
212
+
213
+ ### useStyles
214
+
215
+ Generate a className from a style object:
216
+
217
+ ```tsx
218
+ import { useStyles } from '@tenphi/tasty';
219
+
220
+ function MyComponent() {
221
+ const { className } = useStyles({
222
+ padding: '2x',
223
+ fill: '#surface',
224
+ radius: '1r',
225
+ });
226
+
227
+ return <div className={className}>Styled content</div>;
228
+ }
229
+ ```
230
+
231
+ ### useGlobalStyles
232
+
233
+ Inject global styles for a CSS selector:
234
+
235
+ ```tsx
236
+ import { useGlobalStyles } from '@tenphi/tasty';
237
+
238
+ function ThemeStyles() {
239
+ useGlobalStyles('.card', {
240
+ padding: '4x',
241
+ fill: '#surface',
242
+ radius: '1r',
243
+ });
244
+
245
+ return null;
246
+ }
247
+ ```
248
+
249
+ ### useRawCSS
250
+
251
+ Inject raw CSS strings:
252
+
253
+ ```tsx
254
+ import { useRawCSS } from '@tenphi/tasty';
255
+
256
+ function GlobalReset() {
257
+ useRawCSS(`
258
+ body { margin: 0; padding: 0; }
259
+ `);
260
+
261
+ return null;
262
+ }
263
+ ```
264
+
265
+ ### useMergeStyles
266
+
267
+ Merge multiple style objects for compound component prop forwarding:
268
+
269
+ ```tsx
270
+ import { useMergeStyles } from '@tenphi/tasty';
271
+
272
+ function MyTabs({ styles, tabListStyles, prefixStyles }) {
273
+ const mergedStyles = useMergeStyles(styles, {
274
+ TabList: tabListStyles,
275
+ Prefix: prefixStyles,
276
+ });
277
+
278
+ return <TabsElement styles={mergedStyles} />;
279
+ }
280
+ ```
281
+
282
+ ---
283
+
284
+ ## Learn more
285
+
286
+ - **[Style DSL](dsl.md)** — State maps, tokens, units, extending semantics, keyframes, @property
287
+ - **[Methodology](methodology.md)** — Recommended patterns: root + sub-elements, styleProps, tokens, wrapping
288
+ - **[Configuration](configuration.md)** — Tokens, recipes, custom units, style handlers, TypeScript extensions
289
+ - **[Style Properties](styles.md)** — Complete reference for all enhanced style properties
290
+ - **[Zero Runtime (tastyStatic)](tasty-static.md)** — Build-time static styling with Babel plugin
291
+ - **[Server-Side Rendering](ssr.md)** — SSR setup for Next.js, Astro, and generic frameworks
@@ -0,0 +1,382 @@
1
+ # Server-Side Rendering (SSR)
2
+
3
+ Tasty supports server-side rendering with zero-cost client hydration. Your existing `tasty()` components work unchanged -- SSR is opt-in and requires no per-component modifications.
4
+
5
+ ---
6
+
7
+ ## Requirements
8
+
9
+ | Dependency | Version | Required for |
10
+ |---|---|---|
11
+ | `react` | >= 18 | All SSR entry points (peer dependency of `@tenphi/tasty`) |
12
+ | `next` | >= 13 | Next.js integration (`@tenphi/tasty/ssr/next`) — App Router with `useServerInsertedHTML` |
13
+ | Node.js | >= 20 | Generic / streaming SSR (`@tenphi/tasty/ssr`) — uses `node:async_hooks` for `AsyncLocalStorage` |
14
+
15
+ The Astro integration (`@tenphi/tasty/ssr/astro`) has no additional dependencies beyond `react`.
16
+
17
+ ---
18
+
19
+ ## How It Works
20
+
21
+ During server rendering, `useStyles()` detects a `ServerStyleCollector` and collects CSS into it instead of trying to access the DOM. The collector accumulates all styles, serializes them as `<style>` tags and a cache state script in the HTML. On the client, `hydrateTastyCache()` pre-populates the injector cache so that `useStyles()` skips the rendering pipeline entirely during hydration.
22
+
23
+ ```
24
+ Server Client
25
+ ────── ──────
26
+ tasty() renders hydrateTastyCache() pre-populates cache
27
+ └─ useStyles() └─ cacheKey → className map ready
28
+ └─ collector.collect()
29
+ tasty() renders
30
+ After render: └─ useStyles()
31
+ <style data-tasty-ssr> └─ cache hit → skip pipeline
32
+ <script data-tasty-cache> └─ no CSS re-injection
33
+ ```
34
+
35
+ ---
36
+
37
+ ## Next.js (App Router)
38
+
39
+ ### 1. Create the registry
40
+
41
+ Create a client component that wraps your tree with `TastyRegistry`:
42
+
43
+ ```tsx
44
+ // app/tasty-registry.tsx
45
+ 'use client';
46
+
47
+ import { TastyRegistry } from '@tenphi/tasty/ssr/next';
48
+
49
+ export default function TastyStyleRegistry({
50
+ children,
51
+ }: {
52
+ children: React.ReactNode;
53
+ }) {
54
+ return <TastyRegistry>{children}</TastyRegistry>;
55
+ }
56
+ ```
57
+
58
+ ### 2. Add to root layout
59
+
60
+ Wrap your application in the registry:
61
+
62
+ ```tsx
63
+ // app/layout.tsx
64
+ import TastyStyleRegistry from './tasty-registry';
65
+
66
+ export default function RootLayout({
67
+ children,
68
+ }: {
69
+ children: React.ReactNode;
70
+ }) {
71
+ return (
72
+ <html>
73
+ <body>
74
+ <TastyStyleRegistry>{children}</TastyStyleRegistry>
75
+ </body>
76
+ </html>
77
+ );
78
+ }
79
+ ```
80
+
81
+ That's it. All `tasty()` components inside the tree automatically get SSR support. No per-component changes needed.
82
+
83
+ ### How it works
84
+
85
+ - `TastyRegistry` is a `'use client'` component, but Next.js still server-renders it on initial page load.
86
+ - During SSR, `useStyles()` finds the collector via React context and pushes CSS rules to it.
87
+ - `TastyRegistry` uses `useServerInsertedHTML` to flush collected CSS into the HTML stream as `<style data-tasty-ssr>` tags. This is fully streaming-compatible -- styles are injected alongside each Suspense boundary as it resolves.
88
+ - A companion `<script>` tag transfers the `cacheKey → className` mapping to the client.
89
+ - When the module loads on the client, `hydrateTastyCache()` runs automatically and pre-populates the injector cache. During hydration, `useStyles()` hits the cache and skips the entire pipeline.
90
+
91
+ ### Using tasty() in Server Components
92
+
93
+ `tasty()` components use React hooks internally, so they require `'use client'`. However, this does **not** prevent them from being used in Server Component pages. In Next.js, `'use client'` components are still server-rendered on initial load. Dynamic `styleProps` like `<Grid flow="column">` work normally when a `tasty()` component is imported into a Server Component page.
94
+
95
+ ### Options
96
+
97
+ ```tsx
98
+ // Skip cache state transfer (saves payload size at the cost of hydration perf)
99
+ <TastyRegistry transferCache={false}>{children}</TastyRegistry>
100
+ ```
101
+
102
+ ### CSP nonce
103
+
104
+ If your app uses Content Security Policy with nonces, configure it before rendering:
105
+
106
+ ```tsx
107
+ // app/layout.tsx or a server-side init file
108
+ import { configure } from '@tenphi/tasty';
109
+
110
+ configure({ nonce: 'your-nonce-value' });
111
+ ```
112
+
113
+ The nonce is automatically applied to all `<style>` and `<script>` tags injected by `TastyRegistry`.
114
+
115
+ ---
116
+
117
+ ## Astro
118
+
119
+ ### 1. Add the middleware
120
+
121
+ Create or update your Astro middleware:
122
+
123
+ ```ts
124
+ // src/middleware.ts
125
+ import { tastyMiddleware } from '@tenphi/tasty/ssr/astro';
126
+
127
+ export const onRequest = tastyMiddleware();
128
+ ```
129
+
130
+ ### 2. Use tasty() components as normal
131
+
132
+ ```tsx
133
+ // src/components/Card.tsx
134
+ import { tasty } from '@tenphi/tasty';
135
+
136
+ const Card = tasty({
137
+ styles: {
138
+ padding: '4x',
139
+ fill: '#surface',
140
+ radius: '1r',
141
+ border: true,
142
+ },
143
+ });
144
+
145
+ export default Card;
146
+ ```
147
+
148
+ ```astro
149
+ ---
150
+ // src/pages/index.astro
151
+ import Card from '../components/Card.tsx';
152
+ ---
153
+
154
+ <html>
155
+ <body>
156
+ <Card>Static card — styles collected by middleware</Card>
157
+ <Card client:load>Island card — styles hydrated on client</Card>
158
+ </body>
159
+ </html>
160
+ ```
161
+
162
+ ### How it works
163
+
164
+ Astro's `@astrojs/react` renderer calls `renderToString()` for each React component without wrapping the tree in a provider. The middleware uses `AsyncLocalStorage` to make the collector available to all `useStyles()` calls within the request.
165
+
166
+ - **Static components** (no `client:*`): Styles are collected during `renderToString` and injected into `</head>`. No JavaScript is shipped for these components.
167
+ - **Islands** (`client:load`, `client:visible`, etc.): Styles are collected during SSR the same way. On the client, importing `@tenphi/tasty/ssr/astro` auto-hydrates the cache from `<script data-tasty-cache>`. The island's `useStyles()` calls hit the cache during hydration.
168
+
169
+ ### Client-side hydration for islands
170
+
171
+ The `@tenphi/tasty/ssr/astro` module auto-hydrates when imported on the client. To ensure the cache is warm before any island renders, import it in a shared entry point or in each island component:
172
+
173
+ ```tsx
174
+ // src/components/MyIsland.tsx
175
+ import '@tenphi/tasty/ssr/astro'; // auto-hydrates cache on import
176
+ import { tasty } from '@tenphi/tasty';
177
+
178
+ const MyIsland = tasty({
179
+ styles: { padding: '2x', fill: '#blue' },
180
+ });
181
+
182
+ export default MyIsland;
183
+ ```
184
+
185
+ ### Options
186
+
187
+ ```ts
188
+ // Skip cache state transfer
189
+ export const onRequest = tastyMiddleware({ transferCache: false });
190
+ ```
191
+
192
+ ### CSP nonce
193
+
194
+ Same as Next.js -- call `configure({ nonce: '...' })` before any rendering happens. The middleware reads the nonce and applies it to injected tags.
195
+
196
+ ---
197
+
198
+ ## Generic Framework Integration
199
+
200
+ Any React-based framework can integrate using the core SSR API:
201
+
202
+ ```tsx
203
+ import {
204
+ ServerStyleCollector,
205
+ TastySSRContext,
206
+ hydrateTastyCache,
207
+ } from '@tenphi/tasty/ssr';
208
+ import { renderToString } from 'react-dom/server';
209
+ import { hydrateRoot } from 'react-dom/client';
210
+
211
+ // ── Server ──────────────────────────────────────────────
212
+
213
+ const collector = new ServerStyleCollector();
214
+
215
+ const html = renderToString(
216
+ <TastySSRContext.Provider value={collector}>
217
+ <App />
218
+ </TastySSRContext.Provider>
219
+ );
220
+
221
+ const css = collector.getCSS();
222
+ const cacheState = collector.getCacheState();
223
+
224
+ // Embed in your HTML template:
225
+ const fullHtml = `
226
+ <html>
227
+ <head>
228
+ <style data-tasty-ssr>${css}</style>
229
+ <script data-tasty-cache type="application/json">
230
+ ${JSON.stringify(cacheState)}
231
+ </script>
232
+ </head>
233
+ <body>
234
+ <div id="root">${html}</div>
235
+ </body>
236
+ </html>
237
+ `;
238
+
239
+ // ── Client ──────────────────────────────────────────────
240
+
241
+ // Before hydration:
242
+ hydrateTastyCache(); // reads from <script data-tasty-cache>
243
+
244
+ hydrateRoot(document.getElementById('root'), <App />);
245
+ ```
246
+
247
+ ### Streaming SSR
248
+
249
+ For streaming with `renderToPipeableStream`, use `flushCSS()` instead of `getCSS()`:
250
+
251
+ ```tsx
252
+ const collector = new ServerStyleCollector();
253
+
254
+ const stream = renderToPipeableStream(
255
+ <TastySSRContext.Provider value={collector}>
256
+ <App />
257
+ </TastySSRContext.Provider>,
258
+ {
259
+ onShellReady() {
260
+ // Flush styles collected so far
261
+ const css = collector.flushCSS();
262
+ res.write(`<style data-tasty-ssr>${css}</style>`);
263
+ stream.pipe(res);
264
+ },
265
+ onAllReady() {
266
+ // Flush any remaining styles + cache state
267
+ const css = collector.flushCSS();
268
+ if (css) res.write(`<style data-tasty-ssr>${css}</style>`);
269
+
270
+ const state = collector.getCacheState();
271
+ res.write(`<script data-tasty-cache type="application/json">${JSON.stringify(state)}</script>`);
272
+ },
273
+ }
274
+ );
275
+ ```
276
+
277
+ ### AsyncLocalStorage (no React context)
278
+
279
+ If your framework doesn't support wrapping the React tree with a provider, use `runWithCollector`:
280
+
281
+ ```tsx
282
+ import {
283
+ ServerStyleCollector,
284
+ runWithCollector,
285
+ hydrateTastyCache,
286
+ } from '@tenphi/tasty/ssr';
287
+
288
+ const collector = new ServerStyleCollector();
289
+
290
+ const html = await runWithCollector(collector, () =>
291
+ renderToString(<App />)
292
+ );
293
+
294
+ const css = collector.getCSS();
295
+ // ... inject into HTML as above
296
+ ```
297
+
298
+ ---
299
+
300
+ ## API Reference
301
+
302
+ ### Entry points
303
+
304
+ | Import path | Description |
305
+ |---|---|
306
+ | `@tenphi/tasty/ssr` | Core SSR API: `ServerStyleCollector`, `TastySSRContext`, `runWithCollector`, `hydrateTastyCache` |
307
+ | `@tenphi/tasty/ssr/next` | Next.js App Router: `TastyRegistry` component |
308
+ | `@tenphi/tasty/ssr/astro` | Astro: `tastyMiddleware`, auto-hydration on import |
309
+
310
+ ### `ServerStyleCollector`
311
+
312
+ Server-safe style collector. One instance per request.
313
+
314
+ | Method | Description |
315
+ |---|---|
316
+ | `allocateClassName(cacheKey)` | Allocate a sequential class name (`t0`, `t1`, ...) for a cache key. Returns `{ className, isNewAllocation }`. |
317
+ | `collectChunk(cacheKey, className, rules)` | Record CSS rules for a chunk. Deduplicated by `cacheKey`. |
318
+ | `collectKeyframes(name, css)` | Record a `@keyframes` rule. Deduplicated by name. |
319
+ | `collectProperty(name, css)` | Record a `@property` rule. Deduplicated by name. |
320
+ | `getCSS()` | Get all collected CSS as a single string. For non-streaming SSR. |
321
+ | `flushCSS()` | Get only CSS collected since the last flush. For streaming SSR. |
322
+ | `getCacheState()` | Serialize `{ entries: Record<cacheKey, className>, classCounter }` for client hydration. |
323
+
324
+ ### `TastySSRContext`
325
+
326
+ React context (`createContext<ServerStyleCollector | null>(null)`). Used by `useStyles()` to find the collector during SSR.
327
+
328
+ ### `TastyRegistry`
329
+
330
+ Next.js App Router component. Props:
331
+
332
+ | Prop | Type | Default | Description |
333
+ |---|---|---|---|
334
+ | `children` | `ReactNode` | required | Application tree |
335
+ | `transferCache` | `boolean` | `true` | Embed cache state script for zero-cost hydration |
336
+
337
+ ### `tastyMiddleware(options?)`
338
+
339
+ Astro middleware factory. Options:
340
+
341
+ | Option | Type | Default | Description |
342
+ |---|---|---|---|
343
+ | `transferCache` | `boolean` | `true` | Embed cache state script for island hydration |
344
+
345
+ ### `hydrateTastyCache(state?)`
346
+
347
+ Pre-populate the client injector cache. When called without arguments, reads from `window.__TASTY_SSR_CACHE__` (streaming) or `<script data-tasty-cache>` (non-streaming).
348
+
349
+ ### `runWithCollector(collector, fn)`
350
+
351
+ Run a function with a `ServerStyleCollector` bound to the current async context via `AsyncLocalStorage`. All `useStyles()` calls within `fn` (and async continuations) will find this collector.
352
+
353
+ ---
354
+
355
+ ## Troubleshooting
356
+
357
+ ### Styles flash on page load (FOUC)
358
+
359
+ The `TastyRegistry` or `tastyMiddleware` is missing. Ensure your layout wraps the app with `TastyRegistry` (Next.js) or the middleware is registered (Astro).
360
+
361
+ ### Hydration mismatch warnings
362
+
363
+ Class names are deterministic for the same render order. If you see mismatches, ensure `hydrateTastyCache()` runs before React hydration. For Next.js, this is automatic. For Astro, import `@tenphi/tasty/ssr/astro` in your island components. For custom setups, call `hydrateTastyCache()` before `hydrateRoot()`.
364
+
365
+ ### Styles duplicated after hydration
366
+
367
+ This is expected and harmless. SSR `<style data-tasty-ssr>` tags remain in the DOM. The client injector creates separate `<style>` elements for any new styles. SSR styles are never modified or removed by the client. If this is a concern for very large apps, call `cleanupSSRStyles()` after hydration:
368
+
369
+ ```tsx
370
+ import { hydrateTastyCache } from '@tenphi/tasty/ssr';
371
+
372
+ hydrateTastyCache();
373
+ hydrateRoot(root, <App />);
374
+
375
+ // Optional: remove SSR style tags after hydration
376
+ document.querySelectorAll('style[data-tasty-ssr]').forEach(el => el.remove());
377
+ document.querySelectorAll('script[data-tasty-cache]').forEach(el => el.remove());
378
+ ```
379
+
380
+ ### `AsyncLocalStorage` not available
381
+
382
+ The `@tenphi/tasty/ssr` entry point imports from `node:async_hooks`. This is excluded from client bundles by the build configuration. If you see import errors on the client, ensure your bundler treats `node:async_hooks` as external or use the `@tenphi/tasty/ssr/next` entry point (which does not use ALS).
@@ -344,7 +344,7 @@ Box shadow. Supports multiple shadows comma-separated.
344
344
 
345
345
  | Value | Effect |
346
346
  |-------|--------|
347
- | `true` | Default shadow (from `$shadow` token) |
347
+ | `true` | Default shadow (uses `var(--shadow)` — define a `$shadow` token in your design system) |
348
348
  | `"1x .5x .5x #dark.50"` | Custom shadow with Tasty units/colors |
349
349
  | `"0 1x 2x #dark.20"` | Standard shadow |
350
350
  | `"inset 0 1x 2x #dark.10"` | Inset shadow |
@@ -511,7 +511,7 @@ Scrollbar styling using CSS standard properties (`scrollbar-width`, `scrollbar-c
511
511
 
512
512
  **Colors:** Up to 2 color values for thumb and track (optional), applied via `scrollbar-color`.
513
513
 
514
- **Defaults:** When no colors are specified, the thumb color comes from the `#scrollbar-thumb` token (`#text.5`) and the track color from the `#scrollbar-track` token (`#dark-bg`). These tokens are provided by the base token set. If the base tokens are not loaded, the track falls back to `transparent` via a CSS fallback, while the thumb has no CSS-level fallback — the browser treats the entire `scrollbar-color` declaration as invalid and reverts to the platform-default scrollbar appearance.
514
+ **Defaults:** When no colors are specified, the thumb color comes from `var(--scrollbar-thumb-color)` and the track color from `var(--scrollbar-track-color, transparent)`. These are not built-in — your design system should define `#scrollbar-thumb` and `#scrollbar-track` tokens (e.g. `'#text.5'` and `'#dark-bg'`). If neither token is defined, the track falls back to `transparent` via a CSS fallback, while the thumb has no CSS-level fallback — the browser treats the entire `scrollbar-color` declaration as invalid and reverts to the platform-default scrollbar appearance.
515
515
 
516
516
  **Note:** `none` takes precedence over all other modifiers and colors. Combining `none` with other tokens (e.g., `"none always #red"`) produces a warning, and only `scrollbar-width: none` is applied.
517
517