@cube-dev/ui-kit 0.98.9 → 0.99.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 (672) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/es/_internal/hooks/index.js +10 -10
  3. package/es/_internal/hooks/use-chained-callback.js +2 -2
  4. package/es/_internal/hooks/use-debounced-value.js +1 -1
  5. package/es/_internal/hooks/use-deprecation-warning.js +2 -2
  6. package/es/_internal/hooks/use-effect-once.js +1 -1
  7. package/es/_internal/hooks/use-event.js +2 -2
  8. package/es/_internal/hooks/use-is-first-render.js +1 -1
  9. package/es/_internal/hooks/use-sync-ref.js +2 -2
  10. package/es/_internal/hooks/use-timer/index.js +3 -3
  11. package/es/_internal/hooks/use-timer/timer.js +1 -1
  12. package/es/_internal/hooks/use-timer/use-timer.js +3 -3
  13. package/es/_internal/hooks/use-update-effect.js +2 -2
  14. package/es/_internal/hooks/use-warn.js +3 -3
  15. package/es/_internal/index.js +2 -2
  16. package/es/components/Block.js +2 -2
  17. package/es/components/CollectionItem.js +3 -3
  18. package/es/components/GlobalStyles.js +56 -65
  19. package/es/components/GridProvider.js +4 -4
  20. package/es/components/HiddenInput.js +2 -2
  21. package/es/components/OpenTrasition.js +1 -1
  22. package/es/components/Root.js +22 -64
  23. package/es/components/actions/Action/Action.js +3 -3
  24. package/es/components/actions/Button/Button.js +12 -12
  25. package/es/components/actions/Button/index.js +2 -2
  26. package/es/components/actions/ButtonGroup/ButtonGroup.js +4 -4
  27. package/es/components/actions/CommandMenu/CommandMenu.js +11 -11
  28. package/es/components/actions/CommandMenu/index.js +2 -2
  29. package/es/components/actions/CommandMenu/styled.js +2 -2
  30. package/es/components/actions/ItemAction/ItemAction.js +9 -9
  31. package/es/components/actions/ItemAction/index.js +2 -2
  32. package/es/components/actions/ItemActionContext.js +1 -1
  33. package/es/components/actions/ItemButton/ItemButton.js +9 -9
  34. package/es/components/actions/ItemButton/index.js +2 -2
  35. package/es/components/actions/Link/Link.js +2 -2
  36. package/es/components/actions/Menu/Menu.js +10 -10
  37. package/es/components/actions/Menu/MenuItem.js +7 -7
  38. package/es/components/actions/Menu/MenuSection.js +4 -4
  39. package/es/components/actions/Menu/MenuTrigger.js +6 -6
  40. package/es/components/actions/Menu/SubMenuTrigger.js +6 -6
  41. package/es/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  42. package/es/components/actions/Menu/context.js +1 -1
  43. package/es/components/actions/Menu/index.js +10 -10
  44. package/es/components/actions/Menu/styled.js +5 -5
  45. package/es/components/actions/index.js +13 -13
  46. package/es/components/actions/use-action.js +7 -7
  47. package/es/components/actions/use-anchored-menu.js +6 -6
  48. package/es/components/actions/use-context-menu.js +6 -6
  49. package/es/components/content/ActiveZone/ActiveZone.js +4 -4
  50. package/es/components/content/Alert/Alert.js +4 -4
  51. package/es/components/content/Alert/index.js +2 -2
  52. package/es/components/content/Alert/types.js +1 -1
  53. package/es/components/content/Alert/use-alert.js +3 -3
  54. package/es/components/content/Avatar/Avatar.js +2 -2
  55. package/es/components/content/Badge/Badge.js +4 -4
  56. package/es/components/content/Card/Card.js +2 -2
  57. package/es/components/content/Content.js +3 -3
  58. package/es/components/content/CopyPasteBlock/CopyPasteBlock.js +8 -8
  59. package/es/components/content/CopyPasteBlock/index.js +2 -2
  60. package/es/components/content/CopySnippet/CopySnippet.js +9 -9
  61. package/es/components/content/CopySnippet/index.js +2 -2
  62. package/es/components/content/Disclosure/Disclosure.js +6 -6
  63. package/es/components/content/Disclosure/index.js +2 -2
  64. package/es/components/content/Divider.js +3 -3
  65. package/es/components/content/Footer.js +3 -3
  66. package/es/components/content/Header.js +3 -3
  67. package/es/components/content/HotKeys/HotKeys.js +5 -5
  68. package/es/components/content/HotKeys/index.js +2 -2
  69. package/es/components/content/Item/Item.js +15 -15
  70. package/es/components/content/Item/index.js +3 -3
  71. package/es/components/content/ItemBadge/ItemBadge.js +8 -8
  72. package/es/components/content/ItemBadge/index.js +2 -2
  73. package/es/components/content/Layout/GridLayout.js +13 -13
  74. package/es/components/content/Layout/Layout.js +7 -6
  75. package/es/components/content/Layout/LayoutBlock.js +4 -3
  76. package/es/components/content/Layout/LayoutCenter.js +3 -3
  77. package/es/components/content/Layout/LayoutContainer.js +4 -4
  78. package/es/components/content/Layout/LayoutContent.js +6 -5
  79. package/es/components/content/Layout/LayoutContext.js +1 -1
  80. package/es/components/content/Layout/LayoutFlex.js +4 -3
  81. package/es/components/content/Layout/LayoutFooter.js +4 -3
  82. package/es/components/content/Layout/LayoutGrid.js +4 -3
  83. package/es/components/content/Layout/LayoutHeader.js +8 -7
  84. package/es/components/content/Layout/LayoutPane.js +8 -7
  85. package/es/components/content/Layout/LayoutPanel.js +10 -9
  86. package/es/components/content/Layout/LayoutPanelHeader.js +7 -7
  87. package/es/components/content/Layout/LayoutToolbar.js +4 -3
  88. package/es/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  89. package/es/components/content/Layout/index.js +16 -16
  90. package/es/components/content/Layout/utils.js +1 -1
  91. package/es/components/content/List/SectionHeading.js +3 -3
  92. package/es/components/content/List/index.js +2 -2
  93. package/es/components/content/Paragraph.js +3 -3
  94. package/es/components/content/Placeholder/Placeholder.js +2 -2
  95. package/es/components/content/PrismCode/PrismCode.js +7 -7
  96. package/es/components/content/PrismCode/prismSetup.js +1 -1
  97. package/es/components/content/PrismDiffCode/PrismDiffCode.js +2 -2
  98. package/es/components/content/Result/Result.js +4 -4
  99. package/es/components/content/Skeleton/Skeleton.js +5 -5
  100. package/es/components/content/Tag/Tag.js +4 -4
  101. package/es/components/content/Text.js +3 -3
  102. package/es/components/content/TextItem/TextItem.js +5 -5
  103. package/es/components/content/TextItem/index.js +2 -2
  104. package/es/components/content/Title.js +4 -4
  105. package/es/components/content/highlightText.js +2 -2
  106. package/es/components/content/use-auto-tooltip.js +2 -2
  107. package/es/components/fields/Checkbox/Checkbox.js +12 -12
  108. package/es/components/fields/Checkbox/CheckboxGroup.js +7 -7
  109. package/es/components/fields/Checkbox/context.js +1 -1
  110. package/es/components/fields/Checkbox/index.js +3 -3
  111. package/es/components/fields/ComboBox/ComboBox.js +18 -18
  112. package/es/components/fields/ComboBox/index.js +2 -2
  113. package/es/components/fields/DatePicker/DateInput.js +10 -10
  114. package/es/components/fields/DatePicker/DateInputBase.js +6 -6
  115. package/es/components/fields/DatePicker/DatePicker.js +14 -14
  116. package/es/components/fields/DatePicker/DatePickerButton.js +4 -4
  117. package/es/components/fields/DatePicker/DatePickerElement.js +3 -3
  118. package/es/components/fields/DatePicker/DatePickerInput.js +5 -5
  119. package/es/components/fields/DatePicker/DatePickerSegment.js +2 -2
  120. package/es/components/fields/DatePicker/DateRangePicker.js +15 -15
  121. package/es/components/fields/DatePicker/DateRangeSeparatedPicker.js +15 -15
  122. package/es/components/fields/DatePicker/TimeInput.js +9 -9
  123. package/es/components/fields/DatePicker/index.js +8 -8
  124. package/es/components/fields/DatePicker/intl.js +1 -1
  125. package/es/components/fields/DatePicker/parseDate.js +1 -1
  126. package/es/components/fields/DatePicker/props.js +1 -1
  127. package/es/components/fields/DatePicker/types.js +1 -1
  128. package/es/components/fields/DatePicker/utils.js +1 -1
  129. package/es/components/fields/FileInput/FileInput.js +6 -6
  130. package/es/components/fields/FilterListBox/FilterListBox.js +10 -10
  131. package/es/components/fields/FilterListBox/index.js +2 -2
  132. package/es/components/fields/FilterPicker/FilterPicker.js +14 -14
  133. package/es/components/fields/FilterPicker/index.js +2 -2
  134. package/es/components/fields/Input/Input.js +6 -6
  135. package/es/components/fields/Input/index.js +2 -2
  136. package/es/components/fields/ListBox/ListBox.js +14 -14
  137. package/es/components/fields/ListBox/index.js +2 -2
  138. package/es/components/fields/NumberInput/NumberInput.js +8 -8
  139. package/es/components/fields/NumberInput/StepButton.js +4 -4
  140. package/es/components/fields/PasswordInput/PasswordInput.js +8 -8
  141. package/es/components/fields/Picker/Picker.js +13 -13
  142. package/es/components/fields/Picker/index.js +2 -2
  143. package/es/components/fields/RadioGroup/Radio.js +10 -10
  144. package/es/components/fields/RadioGroup/RadioGroup.js +7 -7
  145. package/es/components/fields/RadioGroup/context.js +1 -1
  146. package/es/components/fields/RadioGroup/index.js +3 -3
  147. package/es/components/fields/SearchInput/SearchInput.js +8 -8
  148. package/es/components/fields/SearchInput/index.js +2 -2
  149. package/es/components/fields/Select/Select.js +20 -20
  150. package/es/components/fields/Select/index.js +2 -2
  151. package/es/components/fields/Slider/Gradation.js +2 -2
  152. package/es/components/fields/Slider/Header.js +1 -1
  153. package/es/components/fields/Slider/RangeSlider.js +5 -5
  154. package/es/components/fields/Slider/Slider.js +7 -7
  155. package/es/components/fields/Slider/SliderBase.js +6 -6
  156. package/es/components/fields/Slider/SliderInput.js +2 -2
  157. package/es/components/fields/Slider/SliderThumb.js +3 -3
  158. package/es/components/fields/Slider/SliderTrack.js +2 -2
  159. package/es/components/fields/Slider/elements.js +2 -2
  160. package/es/components/fields/Slider/index.js +4 -4
  161. package/es/components/fields/Slider/types.js +1 -1
  162. package/es/components/fields/Switch/Switch.js +11 -11
  163. package/es/components/fields/Switch/index.js +2 -2
  164. package/es/components/fields/TextArea/TextArea.js +7 -7
  165. package/es/components/fields/TextArea/index.js +2 -2
  166. package/es/components/fields/TextInput/TextInput.js +6 -6
  167. package/es/components/fields/TextInput/TextInputBase.js +9 -9
  168. package/es/components/fields/TextInput/index.js +3 -3
  169. package/es/components/fields/TextInputMapper/TextInputMapper.js +14 -14
  170. package/es/components/fields/TextInputMapper/index.js +2 -2
  171. package/es/components/fields/index.js +20 -20
  172. package/es/components/form/FieldWrapper/FieldWrapper.js +9 -9
  173. package/es/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
  174. package/es/components/form/FieldWrapper/index.js +4 -4
  175. package/es/components/form/FieldWrapper/types.js +1 -1
  176. package/es/components/form/Form/Field.js +6 -6
  177. package/es/components/form/Form/Form.js +6 -6
  178. package/es/components/form/Form/ResetButton/ResetButton.js +6 -6
  179. package/es/components/form/Form/ResetButton/index.js +2 -2
  180. package/es/components/form/Form/SubmitButton/SubmitButton.js +4 -4
  181. package/es/components/form/Form/SubmitButton/index.js +2 -2
  182. package/es/components/form/Form/SubmitError.js +3 -3
  183. package/es/components/form/Form/index.js +11 -11
  184. package/es/components/form/Form/types.js +1 -1
  185. package/es/components/form/Form/use-field/index.js +4 -4
  186. package/es/components/form/Form/use-field/types.js +1 -1
  187. package/es/components/form/Form/use-field/use-field-props.js +6 -6
  188. package/es/components/form/Form/use-field/use-field.js +4 -4
  189. package/es/components/form/Form/use-form.js +3 -3
  190. package/es/components/form/Form/validation.js +1 -1
  191. package/es/components/form/Label.js +3 -3
  192. package/es/components/form/index.js +5 -5
  193. package/es/components/form/wrapper.js +3 -3
  194. package/es/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  195. package/es/components/helpers/DisplayTransition/index.js +2 -2
  196. package/es/components/helpers/IconSwitch/IconSwitch.js +3 -3
  197. package/es/components/helpers/index.js +3 -3
  198. package/es/components/layout/Flex.js +2 -2
  199. package/es/components/layout/Flow.js +2 -2
  200. package/es/components/layout/Grid.js +2 -2
  201. package/es/components/layout/Panel.js +2 -2
  202. package/es/components/layout/Prefix.js +3 -3
  203. package/es/components/layout/ResizablePanel.js +5 -5
  204. package/es/components/layout/Space.js +2 -2
  205. package/es/components/layout/Suffix.js +3 -3
  206. package/es/components/organisms/FileTabs/FileTabs.js +8 -8
  207. package/es/components/organisms/StatsCard/StatsCard.js +4 -4
  208. package/es/components/other/Calendar/Calendar.js +8 -8
  209. package/es/components/other/Calendar/CalendarCell.js +2 -2
  210. package/es/components/other/Calendar/CalendarGrid.js +3 -3
  211. package/es/components/other/Calendar/RangeCalendar.js +8 -8
  212. package/es/components/other/CloudLogo/CloudLogo.js +3 -3
  213. package/es/components/overlays/AlertDialog/AlertDialog.js +11 -11
  214. package/es/components/overlays/AlertDialog/AlertDialogApiProvider.js +2 -2
  215. package/es/components/overlays/AlertDialog/AlertDialogZone.js +4 -4
  216. package/es/components/overlays/AlertDialog/index.js +4 -4
  217. package/es/components/overlays/AlertDialog/types.js +1 -1
  218. package/es/components/overlays/Dialog/Dialog.js +7 -7
  219. package/es/components/overlays/Dialog/DialogContainer.js +3 -3
  220. package/es/components/overlays/Dialog/DialogForm.js +8 -8
  221. package/es/components/overlays/Dialog/DialogTrigger.js +4 -4
  222. package/es/components/overlays/Dialog/context.js +1 -1
  223. package/es/components/overlays/Dialog/index.js +6 -6
  224. package/es/components/overlays/Dialog/use-dialog-container.js +4 -4
  225. package/es/components/overlays/Modal/Modal.js +5 -5
  226. package/es/components/overlays/Modal/OpenTransition.js +1 -1
  227. package/es/components/overlays/Modal/Overlay.js +3 -3
  228. package/es/components/overlays/Modal/Popover.js +4 -4
  229. package/es/components/overlays/Modal/Tray.js +6 -6
  230. package/es/components/overlays/Modal/Underlay.js +2 -2
  231. package/es/components/overlays/Modal/index.js +7 -7
  232. package/es/components/overlays/Modal/types.js +1 -1
  233. package/es/components/overlays/NewNotifications/Bar/FloatingNotification.js +5 -5
  234. package/es/components/overlays/NewNotifications/Bar/NotificationsBar.js +7 -7
  235. package/es/components/overlays/NewNotifications/Bar/TransitionComponent.js +36 -34
  236. package/es/components/overlays/NewNotifications/Bar/index.js +2 -2
  237. package/es/components/overlays/NewNotifications/Dialog/NotificationsDialogContext.js +1 -1
  238. package/es/components/overlays/NewNotifications/Dialog/NotificationsDialogTrigger.js +8 -8
  239. package/es/components/overlays/NewNotifications/Dialog/index.js +2 -2
  240. package/es/components/overlays/NewNotifications/Notification.js +4 -4
  241. package/es/components/overlays/NewNotifications/NotificationView/NotificationAction.js +5 -5
  242. package/es/components/overlays/NewNotifications/NotificationView/NotificationCloseButton.js +4 -4
  243. package/es/components/overlays/NewNotifications/NotificationView/NotificationDescription.js +4 -4
  244. package/es/components/overlays/NewNotifications/NotificationView/NotificationFooter.js +3 -3
  245. package/es/components/overlays/NewNotifications/NotificationView/NotificationHeader.js +3 -3
  246. package/es/components/overlays/NewNotifications/NotificationView/NotificationIcon.js +4 -4
  247. package/es/components/overlays/NewNotifications/NotificationView/NotificationProvider.js +1 -1
  248. package/es/components/overlays/NewNotifications/NotificationView/NotificationView.js +12 -12
  249. package/es/components/overlays/NewNotifications/NotificationView/index.js +3 -3
  250. package/es/components/overlays/NewNotifications/NotificationView/types.js +1 -1
  251. package/es/components/overlays/NewNotifications/NotificationsContext/NotificationsContext.js +1 -1
  252. package/es/components/overlays/NewNotifications/NotificationsContext/NotificationsProvider.js +5 -5
  253. package/es/components/overlays/NewNotifications/NotificationsContext/index.js +3 -3
  254. package/es/components/overlays/NewNotifications/NotificationsContext/use-notifications.js +2 -2
  255. package/es/components/overlays/NewNotifications/NotificationsList/NotificationsList.js +4 -4
  256. package/es/components/overlays/NewNotifications/NotificationsList/NotificationsListItem.js +5 -5
  257. package/es/components/overlays/NewNotifications/NotificationsList/index.js +2 -2
  258. package/es/components/overlays/NewNotifications/NotificationsList/types.js +1 -1
  259. package/es/components/overlays/NewNotifications/hooks/index.js +6 -6
  260. package/es/components/overlays/NewNotifications/hooks/types.js +1 -1
  261. package/es/components/overlays/NewNotifications/hooks/use-notification-list-item.js +1 -1
  262. package/es/components/overlays/NewNotifications/hooks/use-notifications-api.js +2 -2
  263. package/es/components/overlays/NewNotifications/hooks/use-notifications-list.js +1 -1
  264. package/es/components/overlays/NewNotifications/hooks/use-notifications-observer.js +3 -3
  265. package/es/components/overlays/NewNotifications/index.js +7 -7
  266. package/es/components/overlays/NewNotifications/types.js +1 -1
  267. package/es/components/overlays/Notification/Notification.js +7 -7
  268. package/es/components/overlays/OverlayWrapper.js +2 -2
  269. package/es/components/overlays/Toasts/Toast.js +4 -4
  270. package/es/components/overlays/Toasts/index.js +3 -3
  271. package/es/components/overlays/Toasts/types.js +1 -1
  272. package/es/components/overlays/Toasts/use-toasts-api.js +2 -2
  273. package/es/components/overlays/Tooltip/Tooltip.js +4 -4
  274. package/es/components/overlays/Tooltip/TooltipProvider.js +3 -3
  275. package/es/components/overlays/Tooltip/TooltipTrigger.js +6 -6
  276. package/es/components/overlays/Tooltip/context.js +1 -1
  277. package/es/components/overlays/Tooltip/index.js +4 -4
  278. package/es/components/portal/Portal.js +2 -2
  279. package/es/components/portal/PortalProvider.js +1 -1
  280. package/es/components/portal/index.js +3 -3
  281. package/es/components/portal/types.js +1 -1
  282. package/es/components/portal/usePortal.js +2 -2
  283. package/es/components/shared/InvalidIcon.js +2 -2
  284. package/es/components/shared/ValidIcon.js +2 -2
  285. package/es/components/status/LoadingAnimation/LoadingAnimation.js +58 -114
  286. package/es/components/status/LoadingAnimation/index.js +2 -2
  287. package/es/components/status/Spin/Cube.js +95 -179
  288. package/es/components/status/Spin/InternalSpinner.js +5 -5
  289. package/es/components/status/Spin/Spin.js +4 -4
  290. package/es/components/status/Spin/SpinsContainer.js +28 -30
  291. package/es/components/status/Spin/index.js +2 -2
  292. package/es/components/status/Spin/types.js +1 -1
  293. package/es/components/status/index.js +3 -3
  294. package/es/data/item-themes.js +1 -1
  295. package/es/data/themes.js +1 -1
  296. package/es/icons/AdjustmentsHorizontalIcon.js +2 -2
  297. package/es/icons/AdjustmentsIcon.js +2 -2
  298. package/es/icons/AiIcon.js +2 -2
  299. package/es/icons/AreaChartIcon.js +2 -2
  300. package/es/icons/BackwardIcon.js +2 -2
  301. package/es/icons/BarChartIcon.js +2 -2
  302. package/es/icons/BellFilledIcon.js +2 -2
  303. package/es/icons/BellIcon.js +2 -2
  304. package/es/icons/BooleanIcon.js +2 -2
  305. package/es/icons/CalendarEditIcon.js +2 -2
  306. package/es/icons/CalendarIcon.js +2 -2
  307. package/es/icons/CaretDownIcon.js +2 -2
  308. package/es/icons/CaretUpIcon.js +2 -2
  309. package/es/icons/ChartAreaStackedIcon.js +2 -2
  310. package/es/icons/ChartAreaStackedPercentageIcon.js +2 -2
  311. package/es/icons/ChartBarGroupedHorizontalIcon.js +2 -2
  312. package/es/icons/ChartBarGroupedIcon.js +2 -2
  313. package/es/icons/ChartBarHorizontalIcon.js +2 -2
  314. package/es/icons/ChartBarLineIcon.js +2 -2
  315. package/es/icons/ChartBarStackedHorizontalIcon.js +2 -2
  316. package/es/icons/ChartBarStackedIcon.js +2 -2
  317. package/es/icons/ChartBarStackedPercentageHorizontalIcon.js +2 -2
  318. package/es/icons/ChartBarStackedPercentageIcon.js +2 -2
  319. package/es/icons/ChartBoxPlot2Icon.js +2 -2
  320. package/es/icons/ChartBoxPlotIcon.js +2 -2
  321. package/es/icons/ChartBubbleIcon.js +2 -2
  322. package/es/icons/ChartDonut2Icon.js +2 -2
  323. package/es/icons/ChartFunnelIcon.js +2 -2
  324. package/es/icons/ChartHeatmapIcon.js +2 -2
  325. package/es/icons/ChartKPIIcon.js +2 -2
  326. package/es/icons/ChartPie2Icon.js +2 -2
  327. package/es/icons/ChartScatterIcon.js +2 -2
  328. package/es/icons/CheckCircleFilledIcon.js +2 -2
  329. package/es/icons/CheckCircleIcon.js +2 -2
  330. package/es/icons/CheckIcon.js +2 -2
  331. package/es/icons/CircleFilledIcon.js +2 -2
  332. package/es/icons/ClearIcon.js +2 -2
  333. package/es/icons/CloseCircleFilledIcon.js +2 -2
  334. package/es/icons/CloseCircleIcon.js +2 -2
  335. package/es/icons/CloseIcon.js +2 -2
  336. package/es/icons/CodeIcon.js +2 -2
  337. package/es/icons/ColumnTotalIcon.js +2 -2
  338. package/es/icons/CopyIcon.js +2 -2
  339. package/es/icons/CountIcon.js +2 -2
  340. package/es/icons/CubeIcon.js +2 -2
  341. package/es/icons/CubePauseIcon.js +2 -2
  342. package/es/icons/CubePlayIcon.js +2 -2
  343. package/es/icons/CurrencyDollarIcon.js +2 -2
  344. package/es/icons/DangerIcon.js +2 -2
  345. package/es/icons/DashboardIcon.js +2 -2
  346. package/es/icons/DatabaseIcon.js +2 -2
  347. package/es/icons/DecimalDecreaseIcon.js +2 -2
  348. package/es/icons/DecimalIncreaseIcon.js +2 -2
  349. package/es/icons/DirectionIcon.js +3 -3
  350. package/es/icons/DonutIcon.js +2 -2
  351. package/es/icons/DownIcon.js +2 -2
  352. package/es/icons/EditIcon.js +2 -2
  353. package/es/icons/ExclamationCircleFilledIcon.js +2 -2
  354. package/es/icons/ExclamationCircleIcon.js +2 -2
  355. package/es/icons/ExclamationIcon.js +2 -2
  356. package/es/icons/EyeIcon.js +2 -2
  357. package/es/icons/EyeInvisibleIcon.js +2 -2
  358. package/es/icons/FilterIcon.js +2 -2
  359. package/es/icons/FolderFilledIcon.js +2 -2
  360. package/es/icons/FolderIcon.js +2 -2
  361. package/es/icons/FolderOpenFilledIcon.js +2 -2
  362. package/es/icons/FolderOpenIcon.js +2 -2
  363. package/es/icons/ForwardIcon.js +2 -2
  364. package/es/icons/HierarchyIcon.js +2 -2
  365. package/es/icons/HierarchyOpenIcon.js +2 -2
  366. package/es/icons/Icon.js +2 -2
  367. package/es/icons/InfoCircleIcon.js +2 -2
  368. package/es/icons/InfoIcon.js +2 -2
  369. package/es/icons/KeyIcon.js +2 -2
  370. package/es/icons/LeftIcon.js +2 -2
  371. package/es/icons/LineChartIcon.js +2 -2
  372. package/es/icons/LoadingIcon.js +2 -2
  373. package/es/icons/LockFilledIcon.js +2 -2
  374. package/es/icons/LockIcon.js +2 -2
  375. package/es/icons/MoreIcon.js +2 -2
  376. package/es/icons/NotAllowedIcon.js +2 -2
  377. package/es/icons/Number123Icon.js +2 -2
  378. package/es/icons/NumberIcon.js +2 -2
  379. package/es/icons/PauseCircleFilledIcon.js +2 -2
  380. package/es/icons/PauseCircleIcon.js +2 -2
  381. package/es/icons/PauseIcon.js +2 -2
  382. package/es/icons/PercentageIcon.js +2 -2
  383. package/es/icons/PieChartIcon.js +2 -2
  384. package/es/icons/PlayCircleIcon.js +2 -2
  385. package/es/icons/PlayIcon.js +2 -2
  386. package/es/icons/PlusIcon.js +2 -2
  387. package/es/icons/ProgressBarIcon.js +2 -2
  388. package/es/icons/ReloadIcon.js +2 -2
  389. package/es/icons/ReportIcon.js +2 -2
  390. package/es/icons/ReturnIcon.js +2 -2
  391. package/es/icons/RightIcon.js +2 -2
  392. package/es/icons/RowTotalsIcon.js +2 -2
  393. package/es/icons/SchemeIcon.js +2 -2
  394. package/es/icons/SearchIcon.js +2 -2
  395. package/es/icons/SemanticQueryIcon.js +2 -2
  396. package/es/icons/SettingsIcon.js +2 -2
  397. package/es/icons/ShieldFilledIcon.js +2 -2
  398. package/es/icons/ShieldIcon.js +2 -2
  399. package/es/icons/SlashIcon.js +2 -2
  400. package/es/icons/SparklesIcon.js +2 -2
  401. package/es/icons/SqlIcon.js +2 -2
  402. package/es/icons/StatsIcon.js +2 -2
  403. package/es/icons/StopIcon.js +2 -2
  404. package/es/icons/StringIcon.js +2 -2
  405. package/es/icons/SubtotalsIcon.js +2 -2
  406. package/es/icons/SwitchIcon.js +2 -2
  407. package/es/icons/TableIcon.js +2 -2
  408. package/es/icons/ThumbsDownIcon.js +2 -2
  409. package/es/icons/ThumbsUpIcon.js +2 -2
  410. package/es/icons/ThunderboltCrossedIcon.js +2 -2
  411. package/es/icons/ThunderboltFilledIcon.js +2 -2
  412. package/es/icons/ThunderboltIcon.js +2 -2
  413. package/es/icons/TimeIcon.js +2 -2
  414. package/es/icons/TrashIcon.js +2 -2
  415. package/es/icons/UnlockIcon.js +2 -2
  416. package/es/icons/UpIcon.js +2 -2
  417. package/es/icons/UserGroupIcon.js +2 -2
  418. package/es/icons/UserIcon.js +2 -2
  419. package/es/icons/UserLockIcon.js +2 -2
  420. package/es/icons/ViewIcon.js +2 -2
  421. package/es/icons/WarningFilledIcon.js +2 -2
  422. package/es/icons/WarningIcon.js +2 -2
  423. package/es/icons/index.js +129 -129
  424. package/es/icons/wrap-icon.js +2 -2
  425. package/es/index.js +73 -74
  426. package/es/provider.js +4 -10
  427. package/es/providers/TrackingProvider.js +1 -1
  428. package/es/providers/navigation.types.js +1 -1
  429. package/es/providers/navigationAdapter.default.js +1 -1
  430. package/es/services/notification.js +2 -2
  431. package/es/shared/form.js +1 -1
  432. package/es/shared/index.js +2 -2
  433. package/es/stories/Form.legacy-stories.js +4 -4
  434. package/es/stories/FormFieldArgs.js +2 -2
  435. package/es/stories/SimpleLayout.stories.js +2 -2
  436. package/es/stories/Tasty.stories.js +2 -2
  437. package/es/stories/components/ConfirmDeletionDialogForm.js +2 -2
  438. package/es/stories/components/DialogFormApp.js +3 -3
  439. package/es/stories/components/StyledButton.js +19 -15
  440. package/es/stories/lists/baseProps.js +2 -2
  441. package/es/stories/playground/PlaygroundEditor.js +89 -0
  442. package/es/stories/playground/PlaygroundLayout.js +16 -0
  443. package/es/stories/playground/PlaygroundOutput.js +92 -0
  444. package/es/stories/playground/PlaygroundPreview.js +91 -0
  445. package/es/stories/playground/components/Button.js +45 -0
  446. package/es/stories/playground/components/Card.js +20 -0
  447. package/es/stories/playground/components/ScrollProgress.js +17 -0
  448. package/es/stories/playground/examples.js +158 -0
  449. package/es/tasty/chunks/cacheKey.js +98 -0
  450. package/es/tasty/chunks/definitions.js +281 -0
  451. package/es/tasty/chunks/index.js +12 -0
  452. package/es/tasty/chunks/renderChunk.js +97 -0
  453. package/es/tasty/config.js +280 -0
  454. package/es/tasty/debug.js +195 -9
  455. package/es/tasty/hooks/index.js +12 -0
  456. package/es/tasty/hooks/useGlobalStyles.js +67 -0
  457. package/es/tasty/hooks/useRawCSS.js +40 -0
  458. package/es/tasty/hooks/useStyles.js +206 -0
  459. package/es/tasty/index.js +31 -17
  460. package/es/tasty/injector/index.js +34 -90
  461. package/es/tasty/injector/injector.js +81 -299
  462. package/es/tasty/injector/sheet-manager.js +138 -3
  463. package/es/tasty/injector/types.js +1 -1
  464. package/es/tasty/keyframes/index.js +301 -0
  465. package/es/tasty/parser/classify.js +8 -6
  466. package/es/tasty/parser/const.js +1 -1
  467. package/es/tasty/parser/lru.js +1 -1
  468. package/es/tasty/parser/parser.js +18 -5
  469. package/es/tasty/parser/tokenizer.js +1 -1
  470. package/es/tasty/parser/types.js +2 -1
  471. package/es/tasty/pipeline/conditions.js +426 -0
  472. package/es/tasty/pipeline/exclusive.js +311 -0
  473. package/es/tasty/pipeline/index.js +543 -0
  474. package/es/tasty/pipeline/materialize.js +1260 -0
  475. package/es/tasty/pipeline/parseStateKey.js +592 -0
  476. package/es/tasty/pipeline/simplify.js +898 -0
  477. package/es/tasty/plugins/index.js +26 -0
  478. package/es/tasty/plugins/okhsl-plugin.js +400 -0
  479. package/es/tasty/plugins/types.js +10 -0
  480. package/es/tasty/states/index.js +523 -0
  481. package/es/tasty/static/index.js +47 -0
  482. package/es/tasty/static/tastyStatic.js +55 -0
  483. package/es/tasty/static/types.js +34 -0
  484. package/es/tasty/styles/align.js +1 -1
  485. package/es/tasty/styles/border.js +2 -2
  486. package/es/tasty/styles/boxShadow.combinator.js +1 -1
  487. package/es/tasty/styles/color.js +3 -3
  488. package/es/tasty/styles/createStyle.js +3 -3
  489. package/es/tasty/styles/dimension.js +2 -2
  490. package/es/tasty/styles/display.js +1 -1
  491. package/es/tasty/styles/fade.js +2 -2
  492. package/es/tasty/styles/fill.js +11 -21
  493. package/es/tasty/styles/flow.js +1 -1
  494. package/es/tasty/styles/font.js +1 -1
  495. package/es/tasty/styles/fontStyle.js +1 -1
  496. package/es/tasty/styles/gap.js +2 -2
  497. package/es/tasty/styles/groupRadius.js +2 -2
  498. package/es/tasty/styles/height.js +2 -2
  499. package/es/tasty/styles/index.js +3 -3
  500. package/es/tasty/styles/inset.js +2 -2
  501. package/es/tasty/styles/justify.js +1 -1
  502. package/es/tasty/styles/list.js +1 -1
  503. package/es/tasty/styles/margin.js +76 -56
  504. package/es/tasty/styles/outline.js +2 -2
  505. package/es/tasty/styles/padding.js +76 -56
  506. package/es/tasty/styles/place.js +1 -1
  507. package/es/tasty/styles/predefined.js +28 -27
  508. package/es/tasty/styles/preset.js +2 -2
  509. package/es/tasty/styles/radius.js +5 -12
  510. package/es/tasty/styles/reset.js +3 -7
  511. package/es/tasty/styles/scrollbar.js +2 -2
  512. package/es/tasty/styles/shadow.js +2 -2
  513. package/es/tasty/styles/styledScrollbar.js +1 -1
  514. package/es/tasty/styles/transition.js +10 -3
  515. package/es/tasty/styles/types.js +1 -1
  516. package/es/tasty/styles/width.js +2 -2
  517. package/es/tasty/tasty.js +81 -122
  518. package/es/tasty/types.js +1 -1
  519. package/es/tasty/utils/cache-wrapper.js +1 -1
  520. package/es/tasty/utils/case-converter.js +1 -1
  521. package/es/tasty/utils/colors.js +1 -1
  522. package/es/tasty/utils/dotize.js +1 -1
  523. package/es/tasty/utils/filterBaseProps.js +1 -1
  524. package/es/tasty/utils/getDisplayName.js +1 -1
  525. package/es/tasty/utils/isDevEnv.js +1 -1
  526. package/es/tasty/utils/mergeStyles.js +2 -2
  527. package/es/tasty/utils/modAttrs.js +3 -3
  528. package/es/tasty/utils/processTokens.js +88 -2
  529. package/es/tasty/utils/string.js +1 -1
  530. package/es/tasty/utils/styles.js +255 -22
  531. package/es/tasty/utils/typography.js +67 -0
  532. package/es/tasty/utils/warnings.js +1 -1
  533. package/es/tasty/zero/babel.js +453 -0
  534. package/es/tasty/zero/css-writer.js +94 -0
  535. package/es/tasty/zero/extractor.js +222 -0
  536. package/es/tasty/zero/index.js +28 -0
  537. package/es/tasty/zero/next.js +102 -0
  538. package/es/tokens/base.js +64 -0
  539. package/es/tokens/colors.js +68 -0
  540. package/es/tokens/index.js +63 -0
  541. package/es/tokens/layout.js +26 -0
  542. package/es/tokens/shadows.js +27 -0
  543. package/es/tokens/sizes.js +42 -0
  544. package/es/tokens/spacing.js +22 -0
  545. package/es/tokens/typography.js +237 -0
  546. package/es/utils/ResizeSensor.js +1 -1
  547. package/es/utils/index.js +10 -10
  548. package/es/utils/modules.js +1 -1
  549. package/es/utils/promise.js +1 -1
  550. package/es/utils/raf.js +1 -1
  551. package/es/utils/random.js +1 -1
  552. package/es/utils/range.js +1 -1
  553. package/es/utils/react/RenderCache.js +1 -1
  554. package/es/utils/react/Slots.js +2 -2
  555. package/es/utils/react/chain.js +1 -1
  556. package/es/utils/react/forwardRefWithGenerics.js +1 -1
  557. package/es/utils/react/index.js +17 -17
  558. package/es/utils/react/interactions.js +1 -1
  559. package/es/utils/react/isTextOnly.js +1 -1
  560. package/es/utils/react/mapProps.js +1 -1
  561. package/es/utils/react/mergeProps.js +4 -4
  562. package/es/utils/react/nullableValue.js +1 -1
  563. package/es/utils/react/resolveIcon.js +1 -1
  564. package/es/utils/react/sharedStore.js +2 -2
  565. package/es/utils/react/useCombinedRefs.js +1 -1
  566. package/es/utils/react/useControlledFocusVisible.js +2 -2
  567. package/es/utils/react/useEventBus.js +1 -1
  568. package/es/utils/react/useId.js +2 -2
  569. package/es/utils/react/useIsDarwin.js +1 -1
  570. package/es/utils/react/useKeySymbols.js +2 -2
  571. package/es/utils/react/useLayoutEffect.js +1 -1
  572. package/es/utils/react/useLocalStorage.js +2 -2
  573. package/es/utils/react/useQaProps.js +1 -1
  574. package/es/utils/react/useViewportSize.js +1 -1
  575. package/es/utils/react/wrapNodeIfPlain.js +1 -1
  576. package/es/utils/tree.js +1 -1
  577. package/es/utils/warnings.js +1 -1
  578. package/es/version.js +2 -2
  579. package/package.json +14 -4
  580. package/types/components/GlobalStyles.d.ts +2 -1
  581. package/types/components/HiddenInput.d.ts +828 -826
  582. package/types/components/Root.d.ts +1 -0
  583. package/types/components/actions/Button/Button.d.ts +1649 -1645
  584. package/types/components/actions/CommandMenu/styled.d.ts +4140 -4130
  585. package/types/components/actions/Menu/styled.d.ts +4893 -4883
  586. package/types/components/actions/use-action.d.ts +1 -1
  587. package/types/components/content/List/SectionHeading.d.ts +251 -251
  588. package/types/components/content/Text.d.ts +1487 -1487
  589. package/types/components/fields/DatePicker/DatePickerElement.d.ts +251 -251
  590. package/types/components/fields/Select/Select.d.ts +828 -826
  591. package/types/components/fields/Slider/elements.d.ts +4968 -4956
  592. package/types/components/status/Spin/Cube.d.ts +1 -1
  593. package/types/components/status/Spin/SpinsContainer.d.ts +6 -3
  594. package/types/index.d.ts +1 -4
  595. package/types/provider.d.ts +1 -2
  596. package/types/stories/components/StyledButton.d.ts +1 -1
  597. package/types/stories/playground/PlaygroundEditor.d.ts +6 -0
  598. package/types/stories/playground/PlaygroundLayout.d.ts +8 -0
  599. package/types/stories/playground/PlaygroundOutput.d.ts +5 -0
  600. package/types/stories/playground/PlaygroundPreview.d.ts +6 -0
  601. package/types/stories/playground/components/Button.d.ts +11 -0
  602. package/types/stories/playground/components/Card.d.ts +7 -0
  603. package/types/stories/playground/components/ScrollProgress.d.ts +5 -0
  604. package/types/stories/playground/examples.d.ts +7 -0
  605. package/types/tasty/chunks/cacheKey.d.ts +26 -0
  606. package/types/tasty/chunks/definitions.d.ts +75 -0
  607. package/types/tasty/chunks/index.d.ts +4 -0
  608. package/types/tasty/chunks/renderChunk.d.ts +25 -0
  609. package/types/tasty/config.d.ts +171 -0
  610. package/types/tasty/debug.d.ts +35 -0
  611. package/types/tasty/hooks/index.d.ts +4 -0
  612. package/types/tasty/hooks/useGlobalStyles.d.ts +22 -0
  613. package/types/tasty/hooks/useRawCSS.d.ts +50 -0
  614. package/types/tasty/hooks/useStyles.d.ts +35 -0
  615. package/types/tasty/index.d.ts +14 -4
  616. package/types/tasty/injector/index.d.ts +30 -19
  617. package/types/tasty/injector/injector.d.ts +19 -13
  618. package/types/tasty/injector/sheet-manager.d.ts +25 -1
  619. package/types/tasty/injector/types.d.ts +23 -2
  620. package/types/tasty/keyframes/index.d.ts +49 -0
  621. package/types/tasty/parser/parser.d.ts +4 -0
  622. package/types/tasty/parser/types.d.ts +1 -0
  623. package/types/tasty/pipeline/conditions.d.ts +243 -0
  624. package/types/tasty/pipeline/exclusive.d.ts +103 -0
  625. package/types/tasty/pipeline/index.d.ts +67 -0
  626. package/types/tasty/pipeline/materialize.d.ts +162 -0
  627. package/types/tasty/pipeline/parseStateKey.d.ts +20 -0
  628. package/types/tasty/pipeline/simplify.d.ts +28 -0
  629. package/types/tasty/plugins/index.d.ts +17 -0
  630. package/types/tasty/plugins/okhsl-plugin.d.ts +45 -0
  631. package/types/tasty/plugins/types.d.ts +34 -0
  632. package/types/tasty/states/index.d.ts +101 -0
  633. package/types/tasty/static/index.d.ts +39 -0
  634. package/types/tasty/static/tastyStatic.d.ts +41 -0
  635. package/types/tasty/static/types.d.ts +44 -0
  636. package/types/tasty/styles/fill.d.ts +11 -1
  637. package/types/tasty/styles/margin.d.ts +3 -1
  638. package/types/tasty/styles/padding.d.ts +3 -1
  639. package/types/tasty/styles/radius.d.ts +2 -10
  640. package/types/tasty/styles/types.d.ts +24 -3
  641. package/types/tasty/tasty.d.ts +892 -840
  642. package/types/tasty/utils/styles.d.ts +50 -6
  643. package/types/tasty/utils/typography.d.ts +32 -0
  644. package/types/tasty/zero/babel.d.ts +63 -0
  645. package/types/tasty/zero/css-writer.d.ts +41 -0
  646. package/types/tasty/zero/extractor.d.ts +40 -0
  647. package/types/tasty/zero/index.d.ts +18 -0
  648. package/types/tasty/zero/next.d.ts +57 -0
  649. package/types/tokens/base.d.ts +8 -0
  650. package/types/tokens/colors.d.ts +6 -0
  651. package/types/tokens/index.d.ts +41 -0
  652. package/types/tokens/layout.d.ts +7 -0
  653. package/types/tokens/shadows.d.ts +12 -0
  654. package/types/tokens/sizes.d.ts +25 -0
  655. package/types/tokens/spacing.d.ts +8 -0
  656. package/types/tokens/typography.d.ts +30 -0
  657. package/es/components/navigation/LegacyTabs/LegacyTabs.js +0 -275
  658. package/es/components/other/Base64Upload/Base64Upload.js +0 -103
  659. package/es/icons/add-new-icon.js +0 -129
  660. package/es/tasty/providers/BreakpointsProvider.js +0 -16
  661. package/es/tasty/utils/getModCombinations.js +0 -38
  662. package/es/tasty/utils/renderStyles.js +0 -1050
  663. package/es/tasty/utils/responsive.js +0 -60
  664. package/es/tokens.js +0 -309
  665. package/types/components/navigation/LegacyTabs/LegacyTabs.d.ts +0 -43
  666. package/types/components/other/Base64Upload/Base64Upload.d.ts +0 -5
  667. package/types/icons/add-new-icon.d.ts +0 -2
  668. package/types/tasty/providers/BreakpointsProvider.d.ts +0 -8
  669. package/types/tasty/utils/getModCombinations.d.ts +0 -9
  670. package/types/tasty/utils/renderStyles.d.ts +0 -41
  671. package/types/tasty/utils/responsive.d.ts +0 -8
  672. package/types/tokens.d.ts +0 -221
@@ -1,1050 +0,0 @@
1
- /**
2
- * @license MIT
3
- * author: Cube Dev Team
4
- * @cube-dev/ui-kit v0.98.9
5
- * Released under the MIT license.
6
- */
7
-
8
- /**
9
- * Style rendering that works with structured style objects.
10
- * Eliminates CSS string parsing for better performance.
11
- *
12
- * Key optimizations:
13
- * - Early exit checks (hasSameAttributeConflicts) handle common cases without overhead
14
- * - Logical rule caching (logicalRulesCache) memoizes expensive style processing
15
- * - Conflict detection prevents invalid CSS selector combinations
16
- * - Not-selector optimization reduces CSS size
17
- * - Priority-based filtering handles mod precedence correctly
18
- * - Consolidated mod processing eliminates code duplication
19
- */
20
- import { Lru } from '../parser/lru';
21
- import { createStyle, STYLE_HANDLER_MAP } from '../styles';
22
- import { getModCombinationsIterative } from './getModCombinations';
23
- import { normalizeStyleZones, pointsToZones, } from './responsive';
24
- import { computeState, getModSelector, stringifyStyles, styleStateMapToStyleStateDataList, } from './styles';
25
- // Detect if a value is a state map whose entries contain responsive arrays
26
- function stateMapHasResponsiveArrays(value) {
27
- if (!value || typeof value !== 'object' || Array.isArray(value))
28
- return false;
29
- return Object.values(value).some((v) => Array.isArray(v));
30
- }
31
- // Cache logical rules per styles+breakpoints to avoid recomputation across identical calls
32
- const logicalRulesCache = new Lru(5000);
33
- // Normalize selector suffixes coming from `$` in style handler results.
34
- // Some legacy handlers return suffixes starting with `&` (e.g. '& > *').
35
- // The renderer expects suffixes without the ampersand because it adds
36
- // the parent selector during materialization.
37
- function normalizeDollarSelectorSuffix(suffix) {
38
- if (!suffix)
39
- return '';
40
- return suffix.startsWith('&') ? suffix.slice(1) : suffix;
41
- }
42
- /**
43
- * Check if a key represents a CSS selector
44
- */
45
- export function isSelector(key) {
46
- return (key.startsWith('&') || key.startsWith('.') || key.match(/^[A-Z]/) !== null);
47
- }
48
- /**
49
- * Transform selector affix by converting capitalized words to sub-element selectors.
50
- * Returns a selector prefix with leading and trailing spaces.
51
- *
52
- * Examples:
53
- * '> Body > Row' -> ' > [data-element="Body"] > [data-element="Row"] '
54
- * '> Body > Row >' -> ' > [data-element="Body"] > [data-element="Row"] > '
55
- * '>' -> ' > '
56
- */
57
- function transformSelectorAffix(affix) {
58
- const trimmed = affix.trim();
59
- if (!trimmed)
60
- return ' ';
61
- // Validate that combinators have spaces around them
62
- // Check for capitalized words adjacent to combinators without spaces
63
- const invalidPattern = /[A-Z][a-z]*[>+~]|[>+~][A-Z][a-z]*/;
64
- if (invalidPattern.test(trimmed)) {
65
- console.error(`[Tasty] Invalid selector affix ($) syntax: "${affix}"\n` +
66
- `Combinators (>, +, ~) must have spaces around them when used with element names.\n` +
67
- `Example: Use "$: '> Body > Row'" instead of "$: '>Body>Row'"\n` +
68
- `This is a design choice: the parser uses simple whitespace splitting for performance.`);
69
- }
70
- const tokens = trimmed.split(/\s+/);
71
- const transformed = tokens.map((token) => /^[A-Z]/.test(token) ? `[data-element="${token}"]` : token);
72
- return ` ${transformed.join(' ')} `;
73
- }
74
- /**
75
- * Get the selector suffix for a key
76
- */
77
- function getSelector(key, styles) {
78
- if (key.startsWith('&')) {
79
- return key.slice(1);
80
- }
81
- if (key.startsWith('.')) {
82
- return ` ${key}`;
83
- }
84
- if (key.match(/^[A-Z]/)) {
85
- const affix = styles?.$;
86
- if (affix !== undefined) {
87
- const prefix = transformSelectorAffix(String(affix));
88
- return `${prefix}[data-element="${key}"]`;
89
- }
90
- return ` [data-element="${key}"]`;
91
- }
92
- return null;
93
- }
94
- /**
95
- * Parse attribute selector into its components.
96
- * Simple regex parsing - JS engines optimize repeated patterns internally.
97
- */
98
- function parseAttributeSelector(selector) {
99
- // Match patterns like [data-size="medium"] or [data-selected]
100
- const match = selector.match(/^\[([^=\]]+)(?:="([^"]+)")?\]$/);
101
- return match
102
- ? {
103
- attribute: match[1],
104
- value: match[2] || 'true', // Handle boolean attributes
105
- fullSelector: selector,
106
- }
107
- : null;
108
- }
109
- function hasConflictingAttributeSelectors(mods, parsedMods) {
110
- const attributeValues = new Map();
111
- const attributeBooleans = new Set();
112
- for (const mod of mods) {
113
- const parsed = parsedMods?.get(mod) ?? parseAttributeSelector(mod);
114
- if (!parsed)
115
- continue;
116
- if (parsed.value === 'true') {
117
- // Boolean attribute
118
- attributeBooleans.add(parsed.attribute);
119
- }
120
- else {
121
- // Value attribute
122
- if (!attributeValues.has(parsed.attribute)) {
123
- attributeValues.set(parsed.attribute, []);
124
- }
125
- attributeValues.get(parsed.attribute).push(parsed.value);
126
- }
127
- }
128
- // Check for multiple different values for the same attribute
129
- for (const values of attributeValues.values()) {
130
- if (values.length > 1)
131
- return true;
132
- }
133
- return false;
134
- }
135
- /**
136
- * Create a conflict checker function that uses precomputed attribute maps
137
- * for efficient conflict detection during combination generation
138
- */
139
- function createAttributeConflictChecker(parsedMods) {
140
- return (combination) => hasConflictingAttributeSelectors(combination, parsedMods);
141
- }
142
- // Build precomputed attribute maps for efficient not selector optimization
143
- function buildAttributeMaps(currentMods, allMods, parsedModsCache) {
144
- const allAttributes = new Map();
145
- const currentAttributes = new Map();
146
- const parsedMods = parsedModsCache || new Map();
147
- // Parse all mods once and cache results (only if cache not provided)
148
- if (!parsedModsCache) {
149
- const allModsSet = new Set([...currentMods, ...allMods]);
150
- for (const mod of allModsSet) {
151
- if (!parsedMods.has(mod)) {
152
- parsedMods.set(mod, parseAttributeSelector(mod));
153
- }
154
- }
155
- }
156
- // Build map of all possible values for each attribute
157
- for (const mod of allMods) {
158
- const parsed = parsedMods.get(mod);
159
- if (parsed && parsed.value !== 'true') {
160
- if (!allAttributes.has(parsed.attribute)) {
161
- allAttributes.set(parsed.attribute, new Set());
162
- }
163
- allAttributes.get(parsed.attribute).add(parsed.value);
164
- }
165
- }
166
- // Build map of current mod attribute values
167
- for (const mod of currentMods) {
168
- const parsed = parsedMods.get(mod);
169
- if (parsed && parsed.value !== 'true') {
170
- currentAttributes.set(parsed.attribute, parsed.value);
171
- }
172
- }
173
- return { allAttributes, currentAttributes, parsedMods };
174
- }
175
- /**
176
- * Check if a combination of positive and negative selectors creates a contradiction
177
- * Returns true if the combination is INVALID and should be pruned
178
- */
179
- function hasContradiction(currentMods, notMods, parsedMods) {
180
- // Build maps of positive selector states
181
- const positiveAttributes = new Map();
182
- const positiveBooleans = new Set();
183
- for (const mod of currentMods) {
184
- const parsed = parsedMods.get(mod);
185
- if (parsed) {
186
- if (parsed.value === 'true') {
187
- // Boolean attribute (e.g., [data-theme])
188
- positiveBooleans.add(parsed.attribute);
189
- }
190
- else {
191
- // Value attribute (e.g., [data-theme="danger"])
192
- if (!positiveAttributes.has(parsed.attribute)) {
193
- positiveAttributes.set(parsed.attribute, []);
194
- }
195
- positiveAttributes.get(parsed.attribute).push(parsed.value);
196
- }
197
- }
198
- }
199
- // Check negative selectors for contradictions
200
- for (const mod of notMods) {
201
- const parsed = parsedMods.get(mod);
202
- if (parsed) {
203
- if (parsed.value === 'true') {
204
- // Negative boolean: !([data-theme])
205
- // Case 6: Value positive + attribute negative = CONTRADICTION
206
- if (positiveAttributes.has(parsed.attribute) ||
207
- positiveBooleans.has(parsed.attribute)) {
208
- return true; // INVALID: can't have value without attribute
209
- }
210
- }
211
- else {
212
- // Negative value: !([data-theme="danger"])
213
- // No contradiction - this is valid
214
- }
215
- }
216
- }
217
- return false;
218
- }
219
- function optimizeNotSelectors(currentMods, allMods, precomputedMaps) {
220
- const maps = precomputedMaps || buildAttributeMaps(currentMods, allMods);
221
- const notMods = allMods.filter((mod) => !currentMods.includes(mod));
222
- const optimizedNotMods = [];
223
- // Precompute presence of negative boolean attributes to avoid repeated scans
224
- const negativeBooleanByAttr = new Set();
225
- for (const mod of notMods) {
226
- const p = maps.parsedMods.get(mod);
227
- if (p && p.value === 'true') {
228
- negativeBooleanByAttr.add(p.attribute);
229
- }
230
- }
231
- // Build maps of positive selector states for subsumption optimization
232
- const positiveAttributes = new Map();
233
- const positiveBooleans = new Set();
234
- for (const mod of currentMods) {
235
- const parsed = maps.parsedMods.get(mod);
236
- if (parsed) {
237
- if (parsed.value === 'true') {
238
- positiveBooleans.add(parsed.attribute);
239
- }
240
- else {
241
- if (!positiveAttributes.has(parsed.attribute)) {
242
- positiveAttributes.set(parsed.attribute, []);
243
- }
244
- positiveAttributes.get(parsed.attribute).push(parsed.value);
245
- }
246
- }
247
- }
248
- for (const mod of notMods) {
249
- const parsed = maps.parsedMods.get(mod);
250
- if (parsed && parsed.value !== 'true') {
251
- // Negative value selector
252
- // If we already have a value for this attribute, skip this not selector
253
- // because it's already mutually exclusive (optimization)
254
- if (maps.currentAttributes.has(parsed.attribute)) {
255
- continue;
256
- }
257
- }
258
- // If we have a positive value for this attribute, skip the negative boolean
259
- // This avoids producing selectors like [data-attr="x"]:not([data-attr])
260
- if (parsed && parsed.value === 'true') {
261
- if (maps.currentAttributes.has(parsed.attribute)) {
262
- continue;
263
- }
264
- }
265
- // Case 4 subsumption: If we have a value positive and boolean positive for same attribute
266
- // The value implies the boolean, so we can skip the boolean from positive mods
267
- // (This is handled elsewhere - the value selector is more specific)
268
- // Case 7 subsumption: If we have a value negative and boolean negative for same attribute
269
- // The boolean negative implies value negative, so skip the value negative
270
- if (parsed && parsed.value !== 'true') {
271
- // If we also have the boolean attribute in negative mods, skip the value negative
272
- if (negativeBooleanByAttr.has(parsed.attribute)) {
273
- continue;
274
- }
275
- }
276
- optimizedNotMods.push(mod);
277
- }
278
- return optimizedNotMods;
279
- }
280
- /**
281
- * Quick check if there are any same-attribute conflicts (boolean vs value for same attribute).
282
- * Returns true if conflicts exist, false if filtering can be skipped.
283
- * This early exit optimization handles the common case efficiently.
284
- */
285
- function hasSameAttributeConflicts(allMods, parsedModsCache) {
286
- const attributeCounts = new Map();
287
- for (const mod of allMods) {
288
- const parsed = parsedModsCache.get(mod);
289
- if (!parsed)
290
- continue;
291
- const isBool = parsed.value === 'true';
292
- const existing = attributeCounts.get(parsed.attribute);
293
- if (existing) {
294
- // Already have both types for this attribute - conflict exists!
295
- if ((isBool && existing.hasValue) || (!isBool && existing.hasBool)) {
296
- return true;
297
- }
298
- // Update the types we've seen
299
- if (isBool)
300
- existing.hasBool = true;
301
- else
302
- existing.hasValue = true;
303
- }
304
- else {
305
- attributeCounts.set(parsed.attribute, {
306
- hasBool: isBool,
307
- hasValue: !isBool,
308
- });
309
- }
310
- }
311
- return false;
312
- }
313
- /**
314
- * Filter mods based on priority order for same-attribute conflicts.
315
- * If a boolean selector has higher priority than value selectors for the same attribute,
316
- * remove the value selectors (they would be shadowed by the boolean).
317
- *
318
- * Priority is determined by order in the styleStates (after reversal - earlier = higher priority)
319
- */
320
- function filterModsByPriority(allMods, styleStates, lookupStyles, parsedModsCache) {
321
- // Early exit: if no same-attribute conflicts exist, skip all the expensive work
322
- // This handles the common case efficiently without any cache overhead
323
- if (!hasSameAttributeConflicts(allMods, parsedModsCache)) {
324
- return allMods;
325
- }
326
- // Build priority map: for each mod, find its earliest appearance in any state list
327
- const modPriorities = new Map();
328
- for (const style of lookupStyles) {
329
- const states = styleStates[style];
330
- if (!states || states.length === 0)
331
- continue; // Skip empty states
332
- // states are already reversed (higher priority = lower index)
333
- for (let index = 0; index < states.length; index++) {
334
- const state = states[index];
335
- if (!state.mods || state.mods.length === 0)
336
- continue; // Skip empty mods
337
- for (const mod of state.mods) {
338
- const currentPriority = modPriorities.get(mod);
339
- if (currentPriority === undefined || index < currentPriority) {
340
- modPriorities.set(mod, index);
341
- }
342
- }
343
- }
344
- }
345
- // Group mods by attribute
346
- const attributeGroups = new Map();
347
- for (const mod of allMods) {
348
- const parsed = parsedModsCache.get(mod);
349
- if (!parsed)
350
- continue;
351
- const priority = modPriorities.get(mod);
352
- if (priority === undefined)
353
- continue;
354
- const isBool = parsed.value === 'true';
355
- let group = attributeGroups.get(parsed.attribute);
356
- if (!group) {
357
- group = [];
358
- attributeGroups.set(parsed.attribute, group);
359
- }
360
- group.push({
361
- mod,
362
- isBool,
363
- priority,
364
- });
365
- }
366
- // Filter: for each attribute, if boolean has higher priority than any value, remove values
367
- const modsToRemove = new Set();
368
- for (const [attribute, group] of attributeGroups.entries()) {
369
- // Only process attributes with more than one mod
370
- if (group.length <= 1)
371
- continue;
372
- const boolMods = group.filter((m) => m.isBool);
373
- const valueMods = group.filter((m) => !m.isBool);
374
- // Only check if we have both types
375
- if (boolMods.length === 0 || valueMods.length === 0)
376
- continue;
377
- // Check if any boolean has higher priority (lower index) than all values
378
- for (const boolMod of boolMods) {
379
- const hasHigherPriorityThanAllValues = valueMods.every((valueMod) => boolMod.priority < valueMod.priority);
380
- if (hasHigherPriorityThanAllValues) {
381
- // This boolean shadows all value mods for this attribute
382
- valueMods.forEach((valueMod) => modsToRemove.add(valueMod.mod));
383
- }
384
- }
385
- }
386
- return allMods.filter((mod) => !modsToRemove.has(mod));
387
- }
388
- /**
389
- * Explode a style handler result into logical rules with proper mapping
390
- * Phase 1: Handler fan-out ($ selectors, arrays)
391
- * Phase 2: Responsive fan-out (breakpoint arrays)
392
- * Phase 3: Rule materialization
393
- */
394
- function explodeHandlerResult(result, zones, selectorSuffix = '', forceBreakpointIdx, responsiveOrigin = false) {
395
- if (!result)
396
- return [];
397
- // Phase 1: Handler fan-out - normalize to array
398
- const resultArray = Array.isArray(result) ? result : [result];
399
- const logicalRules = [];
400
- for (const item of resultArray) {
401
- if (!item || typeof item !== 'object')
402
- continue;
403
- const { $, ...styleProps } = item;
404
- // Phase 2: Responsive fan-out - handle array values
405
- const breakpointGroups = new Map();
406
- if (forceBreakpointIdx !== undefined) {
407
- // When breakpoint is forced (from responsive processing), use all props for that breakpoint
408
- const group = {};
409
- for (const [prop, value] of Object.entries(styleProps)) {
410
- if (value != null && value !== '') {
411
- group[prop] = String(value);
412
- }
413
- }
414
- if (Object.keys(group).length > 0) {
415
- breakpointGroups.set(forceBreakpointIdx, group);
416
- }
417
- }
418
- else {
419
- // Normal processing - handle responsive arrays
420
- const responsiveProps = [];
421
- for (const [prop, value] of Object.entries(styleProps)) {
422
- if (Array.isArray(value)) {
423
- // Responsive array - create entry for each breakpoint
424
- value.forEach((val, idx) => {
425
- if (val != null && val !== '' && idx < zones.length) {
426
- responsiveProps.push({ prop, value: val, breakpointIdx: idx });
427
- }
428
- });
429
- }
430
- else if (value != null && value !== '') {
431
- // Single value - goes to base breakpoint
432
- responsiveProps.push({ prop, value, breakpointIdx: 0 });
433
- }
434
- }
435
- // Group by breakpoint index
436
- for (const { prop, value, breakpointIdx } of responsiveProps) {
437
- const group = breakpointGroups.get(breakpointIdx) || {};
438
- group[prop] = String(value);
439
- breakpointGroups.set(breakpointIdx, group);
440
- }
441
- }
442
- // Phase 3: Selector fan-out - handle $ suffixes
443
- // IMPORTANT: If we are already in a pseudo-element context (contains '::'),
444
- // CSS does not allow further descendant/child selectors (e.g., '>*') after
445
- // a pseudo-element. In such cases we must ignore only the `$`-derived
446
- // selectors while still preserving base declarations for the current
447
- // selector. Previously this branch returned early and accidentally dropped
448
- // all declarations computed before, including valid base ones.
449
- const inPseudoElementContext = selectorSuffix.includes('::');
450
- if (inPseudoElementContext && $) {
451
- // Skip this item entirely to avoid producing invalid selectors like
452
- // `.t0::before>*`. Other items (without $) in the same handler result
453
- // will still be processed and preserved.
454
- continue;
455
- }
456
- const suffixes = $
457
- ? (Array.isArray($) ? $ : [$]).map((s) => selectorSuffix + normalizeDollarSelectorSuffix(String(s)))
458
- : [selectorSuffix];
459
- // Early identical-breakpoint coalescing: skip duplicate declarations
460
- const seenDeclarations = new Map();
461
- // Process breakpoints in order to prefer lower breakpoint indices
462
- const sortedBreakpoints = Array.from(breakpointGroups.entries()).sort(([a], [b]) => a - b);
463
- for (const [breakpointIdx, declarations] of sortedBreakpoints) {
464
- if (Object.keys(declarations).length === 0)
465
- continue;
466
- // Create a stable hash key for identical declarations
467
- const declarationKeys = Object.keys(declarations).sort();
468
- const declarationHash = declarationKeys
469
- .map((key) => `${key}:${declarations[key]}`)
470
- .join(';');
471
- const existingBreakpointIdx = seenDeclarations.get(declarationHash);
472
- if (existingBreakpointIdx !== undefined) {
473
- // Skip this breakpoint as it has identical declarations to a previous one
474
- // The CSS cascade will handle the responsive behavior correctly
475
- continue;
476
- }
477
- // Mark this declaration set as seen
478
- seenDeclarations.set(declarationHash, breakpointIdx);
479
- // Create logical rules for this unique declaration set
480
- for (const suffix of suffixes) {
481
- logicalRules.push({
482
- selectorSuffix: suffix,
483
- breakpointIdx,
484
- declarations,
485
- responsiveSource: responsiveOrigin || forceBreakpointIdx !== undefined,
486
- });
487
- }
488
- }
489
- }
490
- return logicalRules;
491
- }
492
- /**
493
- * Convert handler result (CSSMap) to CSS string for global injection
494
- */
495
- function convertHandlerResultToCSS(result, selectorSuffix = '') {
496
- if (!result)
497
- return '';
498
- if (Array.isArray(result)) {
499
- const fragments = [];
500
- for (const item of result) {
501
- const itemCSS = convertHandlerResultToCSS(item, selectorSuffix);
502
- if (itemCSS) {
503
- fragments.push(itemCSS);
504
- }
505
- }
506
- return fragments.join('');
507
- }
508
- const { $, css, ...styleProps } = result;
509
- const styleFragments = [];
510
- // Process style properties using array accumulation
511
- for (const [styleName, value] of Object.entries(styleProps)) {
512
- if (Array.isArray(value)) {
513
- // Handle array values
514
- for (const val of value) {
515
- if (val) {
516
- styleFragments.push(`${styleName}: ${val};\n`);
517
- }
518
- }
519
- }
520
- else if (value) {
521
- // Handle single values
522
- styleFragments.push(`${styleName}: ${value};\n`);
523
- }
524
- }
525
- let renderedStyles = styleFragments.join('');
526
- if (css) {
527
- renderedStyles = css + '\n' + renderedStyles;
528
- }
529
- if (!renderedStyles) {
530
- return '';
531
- }
532
- const finalSelectorSuffix = selectorSuffix || '';
533
- if (Array.isArray($)) {
534
- const ruleFragments = [];
535
- for (const suffix of $) {
536
- const normalized = suffix
537
- ? normalizeDollarSelectorSuffix(String(suffix))
538
- : '';
539
- ruleFragments.push(`&${finalSelectorSuffix}${normalized}{\n${renderedStyles}}\n`);
540
- }
541
- return ruleFragments.join('');
542
- }
543
- const normalizedSingle = $ ? normalizeDollarSelectorSuffix(String($)) : '';
544
- return `&${finalSelectorSuffix}${normalizedSingle}{\n${renderedStyles}}\n`;
545
- }
546
- /**
547
- * Process state maps with mod combinations and generate logical rules.
548
- * This consolidates the common logic for handling mod combinations, priority filtering,
549
- * contradiction checking, and selector optimization.
550
- */
551
- function processStateMapsWithModCombinations(styleStates, lookupStyles, zones, handler, parentSuffix, allLogicalRules, cachedNormalizeStyleZones, breakpointIdx, responsiveOrigin = false) {
552
- // Collect all mods from style states
553
- const allMods = [];
554
- const seenMods = new Set();
555
- for (const style of lookupStyles) {
556
- const states = styleStates[style];
557
- if (!states)
558
- continue;
559
- for (const state of states) {
560
- if (state.mods) {
561
- for (const mod of state.mods) {
562
- if (!seenMods.has(mod)) {
563
- seenMods.add(mod);
564
- allMods.push(mod);
565
- }
566
- }
567
- }
568
- }
569
- }
570
- if (allMods.length === 0) {
571
- // No mods - just call handler with default state values
572
- const stateProps = {};
573
- lookupStyles.forEach((style) => {
574
- const states = styleStates[style];
575
- if (states && states.length > 0) {
576
- stateProps[style] = states[0].value;
577
- }
578
- });
579
- const result = handler(stateProps);
580
- if (!result)
581
- return;
582
- const logicalRules = explodeHandlerResult(result, zones, parentSuffix, breakpointIdx, responsiveOrigin);
583
- allLogicalRules.push(...logicalRules);
584
- return;
585
- }
586
- // Parse all mods once and share the cache across all operations
587
- const parsedModsCache = new Map();
588
- for (const mod of allMods) {
589
- parsedModsCache.set(mod, parseAttributeSelector(getModSelector(mod)));
590
- }
591
- // Apply priority-based filtering for same-attribute boolean vs value conflicts
592
- const filteredMods = filterModsByPriority(allMods, styleStates, lookupStyles, parsedModsCache);
593
- // Precompute attribute maps once for all combinations
594
- const attributeMaps = buildAttributeMaps([], filteredMods, parsedModsCache);
595
- // Generate combinations with conflict-aware pruning
596
- const conflictChecker = createAttributeConflictChecker(attributeMaps.parsedMods);
597
- const combinations = getModCombinationsIterative(filteredMods, true, conflictChecker);
598
- // Process each mod combination
599
- combinations.forEach((modCombination) => {
600
- const stateProps = {};
601
- // Find matching state for each style
602
- lookupStyles.forEach((style) => {
603
- const states = styleStates[style];
604
- const matchingState = states.find((state) => computeState(state.model, (mod) => modCombination.includes(mod)));
605
- if (matchingState) {
606
- stateProps[style] = matchingState.value;
607
- }
608
- });
609
- // Use precomputed maps for efficient not selector optimization
610
- const currentMaps = buildAttributeMaps(modCombination, filteredMods, parsedModsCache);
611
- // Compute raw NOTs for contradiction check (before optimization)
612
- const rawNotMods = filteredMods.filter((mod) => !modCombination.includes(mod));
613
- // Check for contradictions between positive and negative selectors
614
- if (hasContradiction(modCombination, rawNotMods, currentMaps.parsedMods)) {
615
- return; // Skip this invalid combination
616
- }
617
- // Optimize NOT selectors afterwards (pure simplification)
618
- const optimizedNotMods = optimizeNotSelectors(modCombination, filteredMods, currentMaps);
619
- // Build the mod selector string
620
- const modsSelectors = `${modCombination
621
- .map(getModSelector)
622
- .join('')}${optimizedNotMods
623
- .map((mod) => {
624
- const sel = getModSelector(mod);
625
- return sel.startsWith(':not(') ? sel.slice(5, -1) : `:not(${sel})`;
626
- })
627
- .join('')}`;
628
- // Check if any state value is responsive (array)
629
- const hasResponsiveStateValues = lookupStyles.some((style) => Array.isArray(stateProps[style]));
630
- if (hasResponsiveStateValues) {
631
- // Fan out by breakpoint for responsive state values
632
- const propsByPoint = zones.map((_, i) => {
633
- const pointProps = {};
634
- lookupStyles.forEach((style) => {
635
- const v = stateProps[style];
636
- if (Array.isArray(v)) {
637
- const arr = cachedNormalizeStyleZones(v, zones.length);
638
- pointProps[style] = arr?.[i];
639
- }
640
- else {
641
- pointProps[style] = v;
642
- }
643
- });
644
- return pointProps;
645
- });
646
- propsByPoint.forEach((props, bpIdx) => {
647
- const res = handler(props);
648
- if (!res)
649
- return;
650
- const logical = explodeHandlerResult(res, zones, `${modsSelectors}${parentSuffix}`, bpIdx, true);
651
- allLogicalRules.push(...logical);
652
- });
653
- }
654
- else {
655
- // Simple non-responsive state values
656
- const result = handler(stateProps);
657
- if (!result)
658
- return;
659
- const logical = explodeHandlerResult(result, zones, `${modsSelectors}${parentSuffix}`, breakpointIdx, responsiveOrigin);
660
- allLogicalRules.push(...logical);
661
- }
662
- });
663
- }
664
- /**
665
- * Convert logical rules to final StyleResult format
666
- */
667
- function materializeRules(logicalRules, className, zones) {
668
- return logicalRules.map((rule) => {
669
- // Generate base selector
670
- let selector = `.${className}${rule.selectorSuffix}`;
671
- // Increase specificity for tasty class selectors by duplicating the class
672
- if (/^t\d+$/.test(className)) {
673
- selector = `.${className}${selector}`;
674
- }
675
- const declarations = Object.entries(rule.declarations)
676
- .map(([prop, value]) => `${prop}: ${value};`)
677
- .join(' ');
678
- const q = rule.breakpointIdx > 0
679
- ? zones[rule.breakpointIdx]?.mediaQuery
680
- : rule.responsiveSource
681
- ? zones[0]?.mediaQuery
682
- : undefined;
683
- const atRules = q ? [`@media ${q}`] : undefined;
684
- return {
685
- selector,
686
- declarations,
687
- atRules,
688
- };
689
- });
690
- }
691
- /**
692
- * Core style processing logic that generates logical rules
693
- * Used by the unified renderStyles function
694
- */
695
- function generateLogicalRules(styles, responsive = [], parentSuffix = '') {
696
- const zones = pointsToZones(responsive || []);
697
- const allLogicalRules = [];
698
- // Cache for normalizeStyleZones results to avoid repeated computation
699
- // WeakMap allows automatic cleanup when arrays are garbage collected
700
- const normalizeCache = new WeakMap();
701
- // Helper function to get cached normalizeStyleZones result
702
- function cachedNormalizeStyleZones(value, zoneNumber) {
703
- // Only cache for arrays - other types are fast to process
704
- if (!Array.isArray(value)) {
705
- return normalizeStyleZones(value, zoneNumber);
706
- }
707
- // Check if we have a cache for this array reference
708
- let zoneCache = normalizeCache.get(value);
709
- if (!zoneCache) {
710
- zoneCache = new Map();
711
- normalizeCache.set(value, zoneCache);
712
- }
713
- // Check if we have a cached result for this zone count
714
- let result = zoneCache.get(zoneNumber);
715
- if (result === undefined) {
716
- result = normalizeStyleZones(value, zoneNumber);
717
- zoneCache.set(zoneNumber, result);
718
- }
719
- return result;
720
- }
721
- // Local versions of helpers that leverage cachedNormalizeStyleZones
722
- function stateMapToArrayOfStateMapsLocal(value, zoneNumber) {
723
- // Short-circuit for single zone - avoid array allocation
724
- if (zoneNumber === 1) {
725
- const singleMap = {};
726
- for (const [state, stateValue] of Object.entries(value)) {
727
- if (Array.isArray(stateValue)) {
728
- // Take the first value from the array or null if empty
729
- singleMap[state] = stateValue.length > 0 ? stateValue[0] : null;
730
- }
731
- else {
732
- singleMap[state] = stateValue;
733
- }
734
- }
735
- return [singleMap];
736
- }
737
- const result = Array.from({ length: zoneNumber }, () => ({}));
738
- for (const [state, stateValue] of Object.entries(value)) {
739
- const perZone = Array.isArray(stateValue)
740
- ? cachedNormalizeStyleZones(stateValue, zoneNumber)
741
- : Array(zoneNumber).fill(stateValue);
742
- for (let i = 0; i < zoneNumber; i++) {
743
- const v = perZone[i];
744
- result[i][state] = v;
745
- }
746
- }
747
- return result;
748
- }
749
- function normalizeArrayWithStateMapsLocal(valueArray, zoneNumber) {
750
- // Short-circuit for single zone - avoid array propagation and mapping
751
- if (zoneNumber === 1) {
752
- const firstEntry = valueArray.length > 0 ? valueArray[0] : null;
753
- if (firstEntry &&
754
- typeof firstEntry === 'object' &&
755
- !Array.isArray(firstEntry)) {
756
- return [firstEntry];
757
- }
758
- return [{ '': firstEntry }];
759
- }
760
- const propagated = cachedNormalizeStyleZones(valueArray, zoneNumber);
761
- // Trim trailing null/undefined entries to reduce processing
762
- let lastNonNullIndex = propagated.length - 1;
763
- while (lastNonNullIndex >= 0 && propagated[lastNonNullIndex] == null) {
764
- lastNonNullIndex--;
765
- }
766
- // If all entries are null, return minimal array
767
- if (lastNonNullIndex < 0) {
768
- return Array.from({ length: zoneNumber }, () => ({ '': null }));
769
- }
770
- // Process only up to the last non-null entry, then fill the rest with the last value
771
- const result = [];
772
- let lastProcessedEntry = null;
773
- for (let i = 0; i <= lastNonNullIndex; i++) {
774
- const entry = propagated[i];
775
- let processedEntry;
776
- if (entry && typeof entry === 'object' && !Array.isArray(entry)) {
777
- processedEntry = entry;
778
- }
779
- else {
780
- processedEntry = { '': entry };
781
- }
782
- result.push(processedEntry);
783
- lastProcessedEntry = processedEntry;
784
- }
785
- // Fill remaining slots with the last processed entry (CSS cascade behavior)
786
- for (let i = lastNonNullIndex + 1; i < zoneNumber; i++) {
787
- result.push(lastProcessedEntry || { '': null });
788
- }
789
- return result;
790
- }
791
- // Process styles recursively, preserving mod selectors and combining with nested selector suffixes
792
- function processStyles(currentStyles, parentSuffix = '') {
793
- const keys = Object.keys(currentStyles || {});
794
- const selectorKeys = keys.filter((key) => isSelector(key));
795
- // Recurse into nested selectors first to compute proper suffix chaining
796
- for (const key of selectorKeys) {
797
- const suffix = getSelector(key, currentStyles[key]);
798
- if (suffix && currentStyles[key]) {
799
- // Remove $ key to prevent it from being processed as a style property
800
- const { $: _omit, ...cleanedStyles } = currentStyles[key];
801
- processStyles(cleanedStyles, `${parentSuffix}${suffix}`);
802
- }
803
- }
804
- // Build handler queue for style properties at this level
805
- const handlerQueue = [];
806
- const seenHandlers = new Set();
807
- keys.forEach((styleName) => {
808
- if (isSelector(styleName))
809
- return;
810
- let handlers = STYLE_HANDLER_MAP[styleName];
811
- if (!handlers) {
812
- handlers = STYLE_HANDLER_MAP[styleName] = [createStyle(styleName)];
813
- }
814
- handlers.forEach((handler) => {
815
- if (seenHandlers.has(handler)) {
816
- return;
817
- }
818
- seenHandlers.add(handler);
819
- let isResponsive = false;
820
- const lookupStyles = handler.__lookupStyles;
821
- const filteredStyleMap = lookupStyles.reduce((map, name) => {
822
- const value = currentStyles?.[name];
823
- if (value !== undefined) {
824
- // Case 1: state-map-of-arrays → array-of-state-maps
825
- if (value &&
826
- typeof value === 'object' &&
827
- !Array.isArray(value) &&
828
- stateMapHasResponsiveArrays(value)) {
829
- map[name] = stateMapToArrayOfStateMapsLocal(value, zones.length);
830
- isResponsive = true;
831
- }
832
- else if (Array.isArray(value)) {
833
- // Case 2: array that may contain state maps → normalize to array-of-state-maps
834
- if (value.length > 0) {
835
- map[name] = normalizeArrayWithStateMapsLocal(value, zones.length);
836
- isResponsive = true;
837
- }
838
- }
839
- else {
840
- map[name] = value;
841
- }
842
- }
843
- return map;
844
- }, {});
845
- handlerQueue.push({
846
- handler,
847
- styleMap: filteredStyleMap,
848
- isResponsive,
849
- });
850
- });
851
- });
852
- // Process handlers using the three-phase approach
853
- handlerQueue.forEach(({ handler, styleMap, isResponsive }) => {
854
- const lookupStyles = handler.__lookupStyles;
855
- if (isResponsive) {
856
- // For responsive styles, resolve arrays using normalizeStyleZones
857
- const valueMap = lookupStyles.reduce((map, style) => {
858
- map[style] = cachedNormalizeStyleZones(styleMap[style], zones.length);
859
- return map;
860
- }, {});
861
- // Create props for each breakpoint
862
- const propsByPoint = zones.map((zone, i) => {
863
- const pointProps = {};
864
- lookupStyles.forEach((style) => {
865
- if (valueMap != null && valueMap[style] != null) {
866
- pointProps[style] = valueMap[style][i];
867
- }
868
- });
869
- return pointProps;
870
- });
871
- // Call handler for each breakpoint, with state map processing if needed
872
- propsByPoint.forEach((pointProps, breakpointIdx) => {
873
- const hasStateMapsAtPoint = lookupStyles.some((style) => {
874
- const v = pointProps[style];
875
- return v && typeof v === 'object' && !Array.isArray(v);
876
- });
877
- if (hasStateMapsAtPoint) {
878
- // Build styleStates from point props
879
- const styleStates = {};
880
- lookupStyles.forEach((style) => {
881
- const v = pointProps[style];
882
- if (v && typeof v === 'object' && !Array.isArray(v)) {
883
- const { states } = styleStateMapToStyleStateDataList(v);
884
- styleStates[style] = states;
885
- }
886
- else {
887
- styleStates[style] = [{ mods: [], notMods: [], value: v }];
888
- }
889
- });
890
- // Use the consolidated helper for mod combination processing
891
- processStateMapsWithModCombinations(styleStates, lookupStyles, zones || [], handler, parentSuffix, allLogicalRules, cachedNormalizeStyleZones, breakpointIdx, true);
892
- }
893
- else {
894
- const result = handler(pointProps);
895
- if (!result)
896
- return;
897
- const logicalRules = explodeHandlerResult(result, zones || [], parentSuffix, breakpointIdx, true);
898
- allLogicalRules.push(...logicalRules);
899
- }
900
- });
901
- }
902
- else {
903
- // For non-responsive styles, check if any values have state maps
904
- const hasStateMaps = lookupStyles.some((style) => {
905
- const value = styleMap[style];
906
- return value && typeof value === 'object' && !Array.isArray(value);
907
- });
908
- if (hasStateMaps) {
909
- // Build styleStates from styleMap
910
- const styleStates = {};
911
- lookupStyles.forEach((style) => {
912
- const value = styleMap[style];
913
- if (value && typeof value === 'object' && !Array.isArray(value)) {
914
- const { states } = styleStateMapToStyleStateDataList(value);
915
- styleStates[style] = states;
916
- }
917
- else {
918
- // Simple value, create a single state
919
- styleStates[style] = [{ mods: [], notMods: [], value }];
920
- }
921
- });
922
- // Use the consolidated helper for mod combination processing
923
- processStateMapsWithModCombinations(styleStates, lookupStyles, zones || [], handler, parentSuffix, allLogicalRules, cachedNormalizeStyleZones);
924
- }
925
- else {
926
- // Simple case: no state maps, call handler directly
927
- const result = handler(styleMap);
928
- if (result) {
929
- const logical = explodeHandlerResult(result, zones || [], parentSuffix);
930
- allLogicalRules.push(...logical);
931
- }
932
- }
933
- }
934
- });
935
- }
936
- // Kick off processing from the root styles with empty suffix
937
- processStyles(styles, parentSuffix);
938
- return allLogicalRules;
939
- }
940
- export function renderStyles(styles, responsive = [], classNameOrSelector) {
941
- const directSelector = !!classNameOrSelector;
942
- if (!styles) {
943
- return directSelector ? [] : { rules: [] };
944
- }
945
- // Generate logical rules using shared pipeline (memoized per styles+breakpoints)
946
- const stylesKey = stringifyStyles(styles);
947
- const bpKey = (responsive || []).join(',');
948
- const lrKey = `${stylesKey}#${bpKey}`;
949
- let allLogicalRules = logicalRulesCache.get(lrKey);
950
- if (!allLogicalRules) {
951
- allLogicalRules = generateLogicalRules(styles, responsive);
952
- logicalRulesCache.set(lrKey, allLogicalRules);
953
- }
954
- const zones = pointsToZones(responsive || []);
955
- if (directSelector) {
956
- // Direct selector mode: convert logical rules directly to StyleResult format
957
- if (!classNameOrSelector) {
958
- throw new Error('directSelector mode requires classNameOrSelector');
959
- }
960
- return allLogicalRules.map((rule) => {
961
- // Replace & with the actual selector or append suffix to selector
962
- let finalSelector = rule.selectorSuffix
963
- ? `${classNameOrSelector}${rule.selectorSuffix}`
964
- : classNameOrSelector;
965
- // Increase specificity for tasty class selectors by duplicating the class
966
- if (finalSelector.startsWith('.') && /^\.t\d+/.test(finalSelector)) {
967
- const classMatch = finalSelector.match(/^\.t\d+/);
968
- if (classMatch) {
969
- const baseClass = classMatch[0];
970
- finalSelector = baseClass + finalSelector;
971
- }
972
- }
973
- const declarations = Object.entries(rule.declarations)
974
- .map(([prop, value]) => `${prop}: ${value};`)
975
- .join(' ');
976
- const q = rule.breakpointIdx > 0
977
- ? zones[rule.breakpointIdx]?.mediaQuery
978
- : rule.responsiveSource
979
- ? zones[0]?.mediaQuery
980
- : undefined;
981
- const atRules = q ? [`@media ${q}`] : undefined;
982
- return {
983
- selector: finalSelector,
984
- declarations,
985
- atRules,
986
- };
987
- });
988
- }
989
- // Standard mode: use accumulation and materialization with className
990
- const accumulatedRules = new Map();
991
- for (const rule of allLogicalRules) {
992
- // Create a key based on breakpointIdx, selectorSuffix, and responsiveOrigin
993
- const ruleKey = `${rule.breakpointIdx}|${rule.selectorSuffix}|${rule.responsiveSource}`;
994
- const existing = accumulatedRules.get(ruleKey);
995
- if (existing) {
996
- // Merge declarations from this rule into the existing one
997
- Object.assign(existing.declarations, rule.declarations);
998
- }
999
- else {
1000
- // Create a new accumulated rule
1001
- accumulatedRules.set(ruleKey, {
1002
- selectorSuffix: rule.selectorSuffix,
1003
- breakpointIdx: rule.breakpointIdx,
1004
- declarations: { ...rule.declarations },
1005
- responsiveSource: rule.responsiveSource,
1006
- });
1007
- }
1008
- }
1009
- // If no className provided, return rules with needsClassName flag
1010
- if (!classNameOrSelector) {
1011
- const materializedRules = Array.from(accumulatedRules.values()).map((rule) => {
1012
- const declarations = Object.entries(rule.declarations)
1013
- .map(([prop, value]) => `${prop}: ${value};`)
1014
- .join(' ');
1015
- const q = rule.breakpointIdx > 0
1016
- ? zones[rule.breakpointIdx]?.mediaQuery
1017
- : rule.responsiveSource
1018
- ? zones[0]?.mediaQuery
1019
- : undefined;
1020
- const atRules = q ? [`@media ${q}`] : undefined;
1021
- return {
1022
- selector: rule.selectorSuffix || '',
1023
- declarations,
1024
- atRules,
1025
- needsClassName: true, // Flag for injector to prepend className
1026
- };
1027
- });
1028
- return {
1029
- rules: materializedRules,
1030
- };
1031
- }
1032
- // Materialize the accumulated logical rules into final format
1033
- const finalRulesRaw = materializeRules(Array.from(accumulatedRules.values()), classNameOrSelector, zones || []);
1034
- // Simplified deduplication (should be much less work now)
1035
- const seen = new Set();
1036
- const finalRules = finalRulesRaw.filter((rule) => {
1037
- const at = rule.atRules && rule.atRules.length ? `@${rule.atRules.join('|')}` : '';
1038
- const key = `${rule.selector}|${rule.declarations}|${at}`;
1039
- if (seen.has(key))
1040
- return false;
1041
- seen.add(key);
1042
- return true;
1043
- });
1044
- return {
1045
- rules: finalRules,
1046
- className: classNameOrSelector,
1047
- };
1048
- }
1049
-
1050
-