@cube-dev/ui-kit 0.0.0-canary-76be278 → 0.0.0-canary-7e4ec9d

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 (646) hide show
  1. package/es/_internal/hooks/index.js +1 -1
  2. package/es/_internal/hooks/use-chained-callback.js +1 -1
  3. package/es/_internal/hooks/use-debounced-value.js +1 -1
  4. package/es/_internal/hooks/use-deprecation-warning.js +1 -1
  5. package/es/_internal/hooks/use-effect-once.js +1 -1
  6. package/es/_internal/hooks/use-event.js +1 -1
  7. package/es/_internal/hooks/use-is-first-render.js +1 -1
  8. package/es/_internal/hooks/use-sync-ref.js +1 -1
  9. package/es/_internal/hooks/use-timer/index.js +1 -1
  10. package/es/_internal/hooks/use-timer/timer.js +1 -1
  11. package/es/_internal/hooks/use-timer/use-timer.js +1 -1
  12. package/es/_internal/hooks/use-update-effect.js +1 -1
  13. package/es/_internal/hooks/use-warn.js +1 -1
  14. package/es/_internal/index.js +1 -1
  15. package/es/components/Block.js +1 -1
  16. package/es/components/CollectionItem.js +1 -1
  17. package/es/components/GlobalStyles.js +67 -61
  18. package/es/components/GridProvider.js +1 -1
  19. package/es/components/HiddenInput.js +1 -1
  20. package/es/components/OpenTrasition.js +1 -1
  21. package/es/components/Root.js +52 -12
  22. package/es/components/actions/Action/Action.js +1 -1
  23. package/es/components/actions/Button/Button.js +2 -2
  24. package/es/components/actions/Button/index.js +1 -1
  25. package/es/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  26. package/es/components/actions/CommandMenu/CommandMenu.js +1 -1
  27. package/es/components/actions/CommandMenu/index.js +1 -1
  28. package/es/components/actions/CommandMenu/styled.js +1 -1
  29. package/es/components/actions/ItemAction/ItemAction.js +1 -1
  30. package/es/components/actions/ItemAction/index.js +1 -1
  31. package/es/components/actions/ItemActionContext.js +1 -1
  32. package/es/components/actions/ItemButton/ItemButton.js +1 -1
  33. package/es/components/actions/ItemButton/index.js +1 -1
  34. package/es/components/actions/Link/Link.js +1 -1
  35. package/es/components/actions/Menu/Menu.js +1 -1
  36. package/es/components/actions/Menu/MenuItem.js +1 -1
  37. package/es/components/actions/Menu/MenuSection.js +1 -1
  38. package/es/components/actions/Menu/MenuTrigger.js +1 -1
  39. package/es/components/actions/Menu/SubMenuTrigger.js +1 -1
  40. package/es/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  41. package/es/components/actions/Menu/context.js +1 -1
  42. package/es/components/actions/Menu/index.js +1 -1
  43. package/es/components/actions/Menu/styled.js +1 -1
  44. package/es/components/actions/index.js +1 -1
  45. package/es/components/actions/use-action.js +1 -1
  46. package/es/components/actions/use-anchored-menu.js +1 -1
  47. package/es/components/actions/use-context-menu.js +1 -1
  48. package/es/components/content/ActiveZone/ActiveZone.js +1 -1
  49. package/es/components/content/Alert/Alert.js +1 -1
  50. package/es/components/content/Alert/index.js +1 -1
  51. package/es/components/content/Alert/types.js +1 -1
  52. package/es/components/content/Alert/use-alert.js +1 -1
  53. package/es/components/content/Avatar/Avatar.js +1 -1
  54. package/es/components/content/Badge/Badge.js +1 -1
  55. package/es/components/content/Card/Card.js +1 -1
  56. package/es/components/content/Content.js +1 -1
  57. package/es/components/content/CopyPasteBlock/CopyPasteBlock.js +2 -2
  58. package/es/components/content/CopyPasteBlock/index.js +1 -1
  59. package/es/components/content/CopySnippet/CopySnippet.js +1 -1
  60. package/es/components/content/CopySnippet/index.js +1 -1
  61. package/es/components/content/Disclosure/Disclosure.js +1 -1
  62. package/es/components/content/Disclosure/index.js +1 -1
  63. package/es/components/content/Divider.js +1 -1
  64. package/es/components/content/Footer.js +1 -1
  65. package/es/components/content/Header.js +1 -1
  66. package/es/components/content/HotKeys/HotKeys.js +1 -1
  67. package/es/components/content/HotKeys/index.js +1 -1
  68. package/es/components/content/Item/Item.js +2 -2
  69. package/es/components/content/Item/index.js +1 -1
  70. package/es/components/content/ItemBadge/ItemBadge.js +1 -1
  71. package/es/components/content/ItemBadge/index.js +1 -1
  72. package/es/components/content/Layout/GridLayout.js +1 -1
  73. package/es/components/content/Layout/Layout.js +1 -2
  74. package/es/components/content/Layout/LayoutBlock.js +1 -1
  75. package/es/components/content/Layout/LayoutCenter.js +1 -1
  76. package/es/components/content/Layout/LayoutContainer.js +1 -1
  77. package/es/components/content/Layout/LayoutContent.js +1 -2
  78. package/es/components/content/Layout/LayoutContext.js +1 -1
  79. package/es/components/content/Layout/LayoutFlex.js +1 -1
  80. package/es/components/content/Layout/LayoutFooter.js +1 -1
  81. package/es/components/content/Layout/LayoutGrid.js +1 -1
  82. package/es/components/content/Layout/LayoutHeader.js +1 -1
  83. package/es/components/content/Layout/LayoutPane.js +1 -2
  84. package/es/components/content/Layout/LayoutPanel.js +1 -2
  85. package/es/components/content/Layout/LayoutPanelHeader.js +1 -1
  86. package/es/components/content/Layout/LayoutToolbar.js +1 -1
  87. package/es/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  88. package/es/components/content/Layout/index.js +1 -1
  89. package/es/components/content/Layout/utils.js +1 -1
  90. package/es/components/content/List/SectionHeading.js +1 -1
  91. package/es/components/content/List/index.js +1 -1
  92. package/es/components/content/Paragraph.js +1 -1
  93. package/es/components/content/Placeholder/Placeholder.js +1 -1
  94. package/es/components/content/PrismCode/PrismCode.js +1 -1
  95. package/es/components/content/PrismCode/prismSetup.js +1 -1
  96. package/es/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  97. package/es/components/content/Result/Result.js +1 -1
  98. package/es/components/content/Skeleton/Skeleton.js +1 -1
  99. package/es/components/content/Tag/Tag.js +1 -1
  100. package/es/components/content/Text.js +1 -1
  101. package/es/components/content/TextItem/TextItem.js +1 -1
  102. package/es/components/content/TextItem/index.js +1 -1
  103. package/es/components/content/Title.js +1 -1
  104. package/es/components/content/highlightText.js +1 -1
  105. package/es/components/content/use-auto-tooltip.js +1 -1
  106. package/es/components/fields/Checkbox/Checkbox.js +1 -1
  107. package/es/components/fields/Checkbox/CheckboxGroup.js +1 -1
  108. package/es/components/fields/Checkbox/context.js +1 -1
  109. package/es/components/fields/Checkbox/index.js +1 -1
  110. package/es/components/fields/ComboBox/ComboBox.js +1 -1
  111. package/es/components/fields/ComboBox/index.js +1 -1
  112. package/es/components/fields/DatePicker/DateInput.js +1 -1
  113. package/es/components/fields/DatePicker/DateInputBase.js +1 -1
  114. package/es/components/fields/DatePicker/DatePicker.js +1 -1
  115. package/es/components/fields/DatePicker/DatePickerButton.js +1 -1
  116. package/es/components/fields/DatePicker/DatePickerElement.js +1 -1
  117. package/es/components/fields/DatePicker/DatePickerInput.js +1 -1
  118. package/es/components/fields/DatePicker/DatePickerSegment.js +1 -1
  119. package/es/components/fields/DatePicker/DateRangePicker.js +1 -1
  120. package/es/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  121. package/es/components/fields/DatePicker/TimeInput.js +1 -1
  122. package/es/components/fields/DatePicker/index.js +1 -1
  123. package/es/components/fields/DatePicker/intl.js +1 -1
  124. package/es/components/fields/DatePicker/parseDate.js +1 -1
  125. package/es/components/fields/DatePicker/props.js +1 -1
  126. package/es/components/fields/DatePicker/types.js +1 -1
  127. package/es/components/fields/DatePicker/utils.js +1 -1
  128. package/es/components/fields/FileInput/FileInput.js +1 -1
  129. package/es/components/fields/FilterListBox/FilterListBox.js +1 -1
  130. package/es/components/fields/FilterListBox/index.js +1 -1
  131. package/es/components/fields/FilterPicker/FilterPicker.js +1 -1
  132. package/es/components/fields/FilterPicker/index.js +1 -1
  133. package/es/components/fields/Input/Input.js +1 -1
  134. package/es/components/fields/Input/index.js +1 -1
  135. package/es/components/fields/ListBox/ListBox.js +1 -1
  136. package/es/components/fields/ListBox/index.js +1 -1
  137. package/es/components/fields/NumberInput/NumberInput.js +1 -1
  138. package/es/components/fields/NumberInput/StepButton.js +1 -1
  139. package/es/components/fields/PasswordInput/PasswordInput.js +1 -1
  140. package/es/components/fields/Picker/Picker.js +1 -1
  141. package/es/components/fields/Picker/index.js +1 -1
  142. package/es/components/fields/RadioGroup/Radio.js +1 -1
  143. package/es/components/fields/RadioGroup/RadioGroup.js +1 -1
  144. package/es/components/fields/RadioGroup/context.js +1 -1
  145. package/es/components/fields/RadioGroup/index.js +1 -1
  146. package/es/components/fields/SearchInput/SearchInput.js +1 -1
  147. package/es/components/fields/SearchInput/index.js +1 -1
  148. package/es/components/fields/Select/Select.js +1 -1
  149. package/es/components/fields/Select/index.js +1 -1
  150. package/es/components/fields/Slider/Gradation.js +1 -1
  151. package/es/components/fields/Slider/Header.js +1 -1
  152. package/es/components/fields/Slider/RangeSlider.js +1 -1
  153. package/es/components/fields/Slider/Slider.js +1 -1
  154. package/es/components/fields/Slider/SliderBase.js +1 -1
  155. package/es/components/fields/Slider/SliderInput.js +1 -1
  156. package/es/components/fields/Slider/SliderThumb.js +1 -1
  157. package/es/components/fields/Slider/SliderTrack.js +1 -1
  158. package/es/components/fields/Slider/elements.js +1 -1
  159. package/es/components/fields/Slider/index.js +1 -1
  160. package/es/components/fields/Slider/types.js +1 -1
  161. package/es/components/fields/Switch/Switch.js +1 -1
  162. package/es/components/fields/Switch/index.js +1 -1
  163. package/es/components/fields/TextArea/TextArea.js +1 -1
  164. package/es/components/fields/TextArea/index.js +1 -1
  165. package/es/components/fields/TextInput/TextInput.js +1 -1
  166. package/es/components/fields/TextInput/TextInputBase.js +1 -1
  167. package/es/components/fields/TextInput/index.js +1 -1
  168. package/es/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  169. package/es/components/fields/TextInputMapper/index.js +1 -1
  170. package/es/components/fields/index.js +1 -1
  171. package/es/components/form/FieldWrapper/FieldWrapper.js +2 -2
  172. package/es/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
  173. package/es/components/form/FieldWrapper/index.js +1 -1
  174. package/es/components/form/FieldWrapper/types.js +1 -1
  175. package/es/components/form/Form/Field.js +1 -1
  176. package/es/components/form/Form/Form.js +1 -1
  177. package/es/components/form/Form/ResetButton/ResetButton.js +1 -1
  178. package/es/components/form/Form/ResetButton/index.js +1 -1
  179. package/es/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  180. package/es/components/form/Form/SubmitButton/index.js +1 -1
  181. package/es/components/form/Form/SubmitError.js +1 -1
  182. package/es/components/form/Form/index.js +1 -1
  183. package/es/components/form/Form/types.js +1 -1
  184. package/es/components/form/Form/use-field/index.js +1 -1
  185. package/es/components/form/Form/use-field/types.js +1 -1
  186. package/es/components/form/Form/use-field/use-field-props.js +1 -1
  187. package/es/components/form/Form/use-field/use-field.js +1 -1
  188. package/es/components/form/Form/use-form.js +1 -1
  189. package/es/components/form/Form/validation.js +1 -1
  190. package/es/components/form/Label.js +1 -1
  191. package/es/components/form/index.js +1 -1
  192. package/es/components/form/wrapper.js +1 -1
  193. package/es/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  194. package/es/components/helpers/DisplayTransition/index.js +1 -1
  195. package/es/components/helpers/IconSwitch/IconSwitch.js +1 -1
  196. package/es/components/helpers/index.js +1 -1
  197. package/es/components/layout/Flex.js +1 -1
  198. package/es/components/layout/Flow.js +1 -1
  199. package/es/components/layout/Grid.js +1 -1
  200. package/es/components/layout/Panel.js +1 -1
  201. package/es/components/layout/Prefix.js +1 -1
  202. package/es/components/layout/ResizablePanel.js +1 -1
  203. package/es/components/layout/Space.js +1 -1
  204. package/es/components/layout/Suffix.js +1 -1
  205. package/es/components/navigation/LegacyTabs/LegacyTabs.js +1 -1
  206. package/es/components/organisms/FileTabs/FileTabs.js +1 -1
  207. package/es/components/organisms/StatsCard/StatsCard.js +1 -1
  208. package/es/components/other/Base64Upload/Base64Upload.js +1 -1
  209. package/es/components/other/Calendar/Calendar.js +1 -1
  210. package/es/components/other/Calendar/CalendarCell.js +1 -1
  211. package/es/components/other/Calendar/CalendarGrid.js +1 -1
  212. package/es/components/other/Calendar/RangeCalendar.js +1 -1
  213. package/es/components/other/CloudLogo/CloudLogo.js +1 -1
  214. package/es/components/overlays/AlertDialog/AlertDialog.js +1 -1
  215. package/es/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  216. package/es/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  217. package/es/components/overlays/AlertDialog/index.js +1 -1
  218. package/es/components/overlays/AlertDialog/types.js +1 -1
  219. package/es/components/overlays/Dialog/Dialog.js +1 -1
  220. package/es/components/overlays/Dialog/DialogContainer.js +1 -1
  221. package/es/components/overlays/Dialog/DialogForm.js +1 -1
  222. package/es/components/overlays/Dialog/DialogTrigger.js +1 -1
  223. package/es/components/overlays/Dialog/context.js +1 -1
  224. package/es/components/overlays/Dialog/index.js +1 -1
  225. package/es/components/overlays/Dialog/use-dialog-container.js +1 -1
  226. package/es/components/overlays/Modal/Modal.js +1 -1
  227. package/es/components/overlays/Modal/OpenTransition.js +1 -1
  228. package/es/components/overlays/Modal/Overlay.js +1 -1
  229. package/es/components/overlays/Modal/Popover.js +1 -1
  230. package/es/components/overlays/Modal/Tray.js +1 -1
  231. package/es/components/overlays/Modal/Underlay.js +1 -1
  232. package/es/components/overlays/Modal/index.js +1 -1
  233. package/es/components/overlays/Modal/types.js +1 -1
  234. package/es/components/overlays/NewNotifications/Bar/FloatingNotification.js +1 -1
  235. package/es/components/overlays/NewNotifications/Bar/NotificationsBar.js +1 -1
  236. package/es/components/overlays/NewNotifications/Bar/TransitionComponent.js +1 -1
  237. package/es/components/overlays/NewNotifications/Bar/index.js +1 -1
  238. package/es/components/overlays/NewNotifications/Dialog/NotificationsDialogContext.js +1 -1
  239. package/es/components/overlays/NewNotifications/Dialog/NotificationsDialogTrigger.js +1 -1
  240. package/es/components/overlays/NewNotifications/Dialog/index.js +1 -1
  241. package/es/components/overlays/NewNotifications/Notification.js +1 -1
  242. package/es/components/overlays/NewNotifications/NotificationView/NotificationAction.js +1 -1
  243. package/es/components/overlays/NewNotifications/NotificationView/NotificationCloseButton.js +1 -1
  244. package/es/components/overlays/NewNotifications/NotificationView/NotificationDescription.js +1 -1
  245. package/es/components/overlays/NewNotifications/NotificationView/NotificationFooter.js +1 -1
  246. package/es/components/overlays/NewNotifications/NotificationView/NotificationHeader.js +1 -1
  247. package/es/components/overlays/NewNotifications/NotificationView/NotificationIcon.js +1 -1
  248. package/es/components/overlays/NewNotifications/NotificationView/NotificationProvider.js +1 -1
  249. package/es/components/overlays/NewNotifications/NotificationView/NotificationView.js +1 -1
  250. package/es/components/overlays/NewNotifications/NotificationView/index.js +1 -1
  251. package/es/components/overlays/NewNotifications/NotificationView/types.js +1 -1
  252. package/es/components/overlays/NewNotifications/NotificationsContext/NotificationsContext.js +1 -1
  253. package/es/components/overlays/NewNotifications/NotificationsContext/NotificationsProvider.js +1 -1
  254. package/es/components/overlays/NewNotifications/NotificationsContext/index.js +1 -1
  255. package/es/components/overlays/NewNotifications/NotificationsContext/use-notifications.js +1 -1
  256. package/es/components/overlays/NewNotifications/NotificationsList/NotificationsList.js +1 -1
  257. package/es/components/overlays/NewNotifications/NotificationsList/NotificationsListItem.js +1 -1
  258. package/es/components/overlays/NewNotifications/NotificationsList/index.js +1 -1
  259. package/es/components/overlays/NewNotifications/NotificationsList/types.js +1 -1
  260. package/es/components/overlays/NewNotifications/hooks/index.js +1 -1
  261. package/es/components/overlays/NewNotifications/hooks/types.js +1 -1
  262. package/es/components/overlays/NewNotifications/hooks/use-notification-list-item.js +1 -1
  263. package/es/components/overlays/NewNotifications/hooks/use-notifications-api.js +1 -1
  264. package/es/components/overlays/NewNotifications/hooks/use-notifications-list.js +1 -1
  265. package/es/components/overlays/NewNotifications/hooks/use-notifications-observer.js +1 -1
  266. package/es/components/overlays/NewNotifications/index.js +1 -1
  267. package/es/components/overlays/NewNotifications/types.js +1 -1
  268. package/es/components/overlays/Notification/Notification.js +1 -1
  269. package/es/components/overlays/OverlayWrapper.js +1 -1
  270. package/es/components/overlays/Toasts/Toast.js +1 -1
  271. package/es/components/overlays/Toasts/index.js +1 -1
  272. package/es/components/overlays/Toasts/types.js +1 -1
  273. package/es/components/overlays/Toasts/use-toasts-api.js +1 -1
  274. package/es/components/overlays/Tooltip/Tooltip.js +1 -1
  275. package/es/components/overlays/Tooltip/TooltipProvider.js +1 -1
  276. package/es/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  277. package/es/components/overlays/Tooltip/context.js +1 -1
  278. package/es/components/overlays/Tooltip/index.js +1 -1
  279. package/es/components/portal/Portal.js +1 -1
  280. package/es/components/portal/PortalProvider.js +1 -1
  281. package/es/components/portal/index.js +1 -1
  282. package/es/components/portal/types.js +1 -1
  283. package/es/components/portal/usePortal.js +1 -1
  284. package/es/components/shared/InvalidIcon.js +1 -1
  285. package/es/components/shared/ValidIcon.js +1 -1
  286. package/es/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  287. package/es/components/status/LoadingAnimation/index.js +1 -1
  288. package/es/components/status/Spin/Cube.js +1 -1
  289. package/es/components/status/Spin/InternalSpinner.js +1 -1
  290. package/es/components/status/Spin/Spin.js +1 -1
  291. package/es/components/status/Spin/SpinsContainer.js +1 -1
  292. package/es/components/status/Spin/index.js +1 -1
  293. package/es/components/status/Spin/types.js +1 -1
  294. package/es/components/status/index.js +1 -1
  295. package/es/data/item-themes.js +1 -1
  296. package/es/data/themes.js +1 -1
  297. package/es/icons/AdjustmentsHorizontalIcon.js +1 -1
  298. package/es/icons/AdjustmentsIcon.js +1 -1
  299. package/es/icons/AiIcon.js +1 -1
  300. package/es/icons/AreaChartIcon.js +1 -1
  301. package/es/icons/BackwardIcon.js +1 -1
  302. package/es/icons/BarChartIcon.js +1 -1
  303. package/es/icons/BellFilledIcon.js +1 -1
  304. package/es/icons/BellIcon.js +1 -1
  305. package/es/icons/BooleanIcon.js +1 -1
  306. package/es/icons/CalendarEditIcon.js +1 -1
  307. package/es/icons/CalendarIcon.js +1 -1
  308. package/es/icons/CaretDownIcon.js +1 -1
  309. package/es/icons/CaretUpIcon.js +1 -1
  310. package/es/icons/ChartAreaStackedIcon.js +1 -1
  311. package/es/icons/ChartAreaStackedPercentageIcon.js +1 -1
  312. package/es/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  313. package/es/icons/ChartBarGroupedIcon.js +1 -1
  314. package/es/icons/ChartBarHorizontalIcon.js +1 -1
  315. package/es/icons/ChartBarLineIcon.js +1 -1
  316. package/es/icons/ChartBarStackedHorizontalIcon.js +1 -1
  317. package/es/icons/ChartBarStackedIcon.js +1 -1
  318. package/es/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  319. package/es/icons/ChartBarStackedPercentageIcon.js +1 -1
  320. package/es/icons/ChartBoxPlot2Icon.js +1 -1
  321. package/es/icons/ChartBoxPlotIcon.js +1 -1
  322. package/es/icons/ChartBubbleIcon.js +1 -1
  323. package/es/icons/ChartDonut2Icon.js +1 -1
  324. package/es/icons/ChartFunnelIcon.js +1 -1
  325. package/es/icons/ChartHeatmapIcon.js +1 -1
  326. package/es/icons/ChartKPIIcon.js +1 -1
  327. package/es/icons/ChartPie2Icon.js +1 -1
  328. package/es/icons/ChartScatterIcon.js +1 -1
  329. package/es/icons/CheckCircleFilledIcon.js +1 -1
  330. package/es/icons/CheckCircleIcon.js +1 -1
  331. package/es/icons/CheckIcon.js +1 -1
  332. package/es/icons/CircleFilledIcon.js +1 -1
  333. package/es/icons/ClearIcon.js +1 -1
  334. package/es/icons/CloseCircleFilledIcon.js +1 -1
  335. package/es/icons/CloseCircleIcon.js +1 -1
  336. package/es/icons/CloseIcon.js +1 -1
  337. package/es/icons/CodeIcon.js +1 -1
  338. package/es/icons/ColumnTotalIcon.js +1 -1
  339. package/es/icons/CopyIcon.js +1 -1
  340. package/es/icons/CountIcon.js +1 -1
  341. package/es/icons/CubeIcon.js +1 -1
  342. package/es/icons/CubePauseIcon.js +1 -1
  343. package/es/icons/CubePlayIcon.js +1 -1
  344. package/es/icons/CurrencyDollarIcon.js +1 -1
  345. package/es/icons/DangerIcon.js +1 -1
  346. package/es/icons/DashboardIcon.js +1 -1
  347. package/es/icons/DatabaseIcon.js +1 -1
  348. package/es/icons/DecimalDecreaseIcon.js +1 -1
  349. package/es/icons/DecimalIncreaseIcon.js +1 -1
  350. package/es/icons/DirectionIcon.js +1 -1
  351. package/es/icons/DonutIcon.js +1 -1
  352. package/es/icons/DownIcon.js +1 -1
  353. package/es/icons/EditIcon.js +1 -1
  354. package/es/icons/ExclamationCircleFilledIcon.js +1 -1
  355. package/es/icons/ExclamationCircleIcon.js +1 -1
  356. package/es/icons/ExclamationIcon.js +1 -1
  357. package/es/icons/EyeIcon.js +1 -1
  358. package/es/icons/EyeInvisibleIcon.js +1 -1
  359. package/es/icons/FilterIcon.js +1 -1
  360. package/es/icons/FolderFilledIcon.js +1 -1
  361. package/es/icons/FolderIcon.js +1 -1
  362. package/es/icons/FolderOpenFilledIcon.js +1 -1
  363. package/es/icons/FolderOpenIcon.js +1 -1
  364. package/es/icons/ForwardIcon.js +1 -1
  365. package/es/icons/HierarchyIcon.js +1 -1
  366. package/es/icons/HierarchyOpenIcon.js +1 -1
  367. package/es/icons/Icon.js +1 -1
  368. package/es/icons/InfoCircleIcon.js +1 -1
  369. package/es/icons/InfoIcon.js +1 -1
  370. package/es/icons/KeyIcon.js +1 -1
  371. package/es/icons/LeftIcon.js +1 -1
  372. package/es/icons/LineChartIcon.js +1 -1
  373. package/es/icons/LoadingIcon.js +1 -1
  374. package/es/icons/LockFilledIcon.js +1 -1
  375. package/es/icons/LockIcon.js +1 -1
  376. package/es/icons/MoreIcon.js +1 -1
  377. package/es/icons/NotAllowedIcon.js +1 -1
  378. package/es/icons/Number123Icon.js +1 -1
  379. package/es/icons/NumberIcon.js +1 -1
  380. package/es/icons/PauseCircleFilledIcon.js +1 -1
  381. package/es/icons/PauseCircleIcon.js +1 -1
  382. package/es/icons/PauseIcon.js +1 -1
  383. package/es/icons/PercentageIcon.js +1 -1
  384. package/es/icons/PieChartIcon.js +1 -1
  385. package/es/icons/PlayCircleIcon.js +1 -1
  386. package/es/icons/PlayIcon.js +1 -1
  387. package/es/icons/PlusIcon.js +1 -1
  388. package/es/icons/ProgressBarIcon.js +1 -1
  389. package/es/icons/ReloadIcon.js +1 -1
  390. package/es/icons/ReportIcon.js +1 -1
  391. package/es/icons/ReturnIcon.js +1 -1
  392. package/es/icons/RightIcon.js +1 -1
  393. package/es/icons/RowTotalsIcon.js +1 -1
  394. package/es/icons/SchemeIcon.js +1 -1
  395. package/es/icons/SearchIcon.js +1 -1
  396. package/es/icons/SettingsIcon.js +1 -1
  397. package/es/icons/ShieldFilledIcon.js +1 -1
  398. package/es/icons/ShieldIcon.js +1 -1
  399. package/es/icons/SlashIcon.js +1 -1
  400. package/es/icons/SparklesIcon.js +1 -1
  401. package/es/icons/SqlIcon.js +1 -1
  402. package/es/icons/StatsIcon.js +1 -1
  403. package/es/icons/StopIcon.js +1 -1
  404. package/es/icons/StringIcon.js +1 -1
  405. package/es/icons/SubtotalsIcon.js +1 -1
  406. package/es/icons/SwitchIcon.js +1 -1
  407. package/es/icons/TableIcon.js +1 -1
  408. package/es/icons/ThumbsDownIcon.js +1 -1
  409. package/es/icons/ThumbsUpIcon.js +1 -1
  410. package/es/icons/ThunderboltCrossedIcon.js +1 -1
  411. package/es/icons/ThunderboltFilledIcon.js +1 -1
  412. package/es/icons/ThunderboltIcon.js +1 -1
  413. package/es/icons/TimeIcon.js +1 -1
  414. package/es/icons/TrashIcon.js +1 -1
  415. package/es/icons/UnlockIcon.js +1 -1
  416. package/es/icons/UpIcon.js +1 -1
  417. package/es/icons/UserGroupIcon.js +1 -1
  418. package/es/icons/UserIcon.js +1 -1
  419. package/es/icons/UserLockIcon.js +1 -1
  420. package/es/icons/ViewIcon.js +1 -1
  421. package/es/icons/WarningFilledIcon.js +1 -1
  422. package/es/icons/WarningIcon.js +1 -1
  423. package/es/icons/add-new-icon.js +1 -1
  424. package/es/icons/index.js +1 -1
  425. package/es/icons/wrap-icon.js +1 -1
  426. package/es/index.js +1 -2
  427. package/es/provider.js +8 -2
  428. package/es/providers/TrackingProvider.js +1 -1
  429. package/es/providers/navigation.types.js +1 -1
  430. package/es/providers/navigationAdapter.default.js +1 -1
  431. package/es/services/notification.js +1 -1
  432. package/es/shared/form.js +1 -1
  433. package/es/shared/index.js +1 -1
  434. package/es/stories/Form.legacy-stories.js +1 -1
  435. package/es/stories/FormFieldArgs.js +1 -1
  436. package/es/stories/SimpleLayout.stories.js +1 -1
  437. package/es/stories/Tasty.stories.js +1 -1
  438. package/es/stories/components/ConfirmDeletionDialogForm.js +1 -1
  439. package/es/stories/components/DialogFormApp.js +1 -1
  440. package/es/stories/components/StyledButton.js +14 -18
  441. package/es/stories/lists/baseProps.js +1 -1
  442. package/es/tasty/debug.js +7 -193
  443. package/es/tasty/index.js +4 -18
  444. package/es/tasty/injector/index.js +87 -31
  445. package/es/tasty/injector/injector.js +279 -30
  446. package/es/tasty/injector/sheet-manager.js +2 -126
  447. package/es/tasty/injector/types.js +1 -1
  448. package/es/tasty/parser/classify.js +3 -5
  449. package/es/tasty/parser/const.js +1 -1
  450. package/es/tasty/parser/lru.js +1 -1
  451. package/es/tasty/parser/parser.js +1 -14
  452. package/es/tasty/parser/tokenizer.js +1 -1
  453. package/es/tasty/parser/types.js +1 -2
  454. package/es/tasty/providers/BreakpointsProvider.js +16 -0
  455. package/es/tasty/styles/align.js +1 -1
  456. package/es/tasty/styles/border.js +1 -1
  457. package/es/tasty/styles/boxShadow.combinator.js +1 -1
  458. package/es/tasty/styles/color.js +1 -1
  459. package/es/tasty/styles/createStyle.js +1 -1
  460. package/es/tasty/styles/dimension.js +1 -1
  461. package/es/tasty/styles/display.js +1 -1
  462. package/es/tasty/styles/fade.js +1 -1
  463. package/es/tasty/styles/fill.js +20 -10
  464. package/es/tasty/styles/flow.js +1 -1
  465. package/es/tasty/styles/font.js +1 -1
  466. package/es/tasty/styles/fontStyle.js +1 -1
  467. package/es/tasty/styles/gap.js +1 -1
  468. package/es/tasty/styles/groupRadius.js +1 -1
  469. package/es/tasty/styles/height.js +1 -1
  470. package/es/tasty/styles/index.js +1 -1
  471. package/es/tasty/styles/inset.js +1 -1
  472. package/es/tasty/styles/justify.js +1 -1
  473. package/es/tasty/styles/list.js +1 -1
  474. package/es/tasty/styles/margin.js +55 -75
  475. package/es/tasty/styles/outline.js +1 -1
  476. package/es/tasty/styles/padding.js +55 -75
  477. package/es/tasty/styles/place.js +1 -1
  478. package/es/tasty/styles/predefined.js +2 -3
  479. package/es/tasty/styles/preset.js +1 -1
  480. package/es/tasty/styles/radius.js +1 -1
  481. package/es/tasty/styles/reset.js +1 -1
  482. package/es/tasty/styles/scrollbar.js +1 -1
  483. package/es/tasty/styles/shadow.js +1 -1
  484. package/es/tasty/styles/styledScrollbar.js +1 -1
  485. package/es/tasty/styles/transition.js +1 -1
  486. package/es/tasty/styles/types.js +1 -1
  487. package/es/tasty/styles/width.js +1 -1
  488. package/es/tasty/tasty.js +117 -76
  489. package/es/tasty/types.js +1 -1
  490. package/es/tasty/utils/cache-wrapper.js +1 -1
  491. package/es/tasty/utils/case-converter.js +1 -1
  492. package/es/tasty/utils/colors.js +1 -1
  493. package/es/tasty/utils/dotize.js +1 -1
  494. package/es/tasty/utils/filterBaseProps.js +1 -1
  495. package/es/tasty/utils/getDisplayName.js +1 -1
  496. package/es/tasty/utils/getModCombinations.js +38 -0
  497. package/es/tasty/utils/isDevEnv.js +1 -1
  498. package/es/tasty/utils/mergeStyles.js +2 -2
  499. package/es/tasty/utils/modAttrs.js +1 -1
  500. package/es/tasty/utils/processTokens.js +1 -1
  501. package/es/tasty/utils/renderStyles.js +1050 -0
  502. package/es/tasty/utils/responsive.js +60 -0
  503. package/es/tasty/utils/string.js +1 -1
  504. package/es/tasty/utils/styles.js +19 -252
  505. package/es/tasty/utils/warnings.js +1 -1
  506. package/es/tokens.js +309 -0
  507. package/es/utils/ResizeSensor.js +1 -1
  508. package/es/utils/index.js +1 -1
  509. package/es/utils/modules.js +1 -1
  510. package/es/utils/promise.js +1 -1
  511. package/es/utils/raf.js +1 -1
  512. package/es/utils/random.js +1 -1
  513. package/es/utils/range.js +1 -1
  514. package/es/utils/react/RenderCache.js +1 -1
  515. package/es/utils/react/Slots.js +1 -1
  516. package/es/utils/react/chain.js +1 -1
  517. package/es/utils/react/forwardRefWithGenerics.js +1 -1
  518. package/es/utils/react/index.js +1 -1
  519. package/es/utils/react/interactions.js +1 -1
  520. package/es/utils/react/isTextOnly.js +1 -1
  521. package/es/utils/react/mapProps.js +1 -1
  522. package/es/utils/react/mergeProps.js +1 -1
  523. package/es/utils/react/nullableValue.js +1 -1
  524. package/es/utils/react/resolveIcon.js +1 -1
  525. package/es/utils/react/sharedStore.js +1 -1
  526. package/es/utils/react/useCombinedRefs.js +1 -1
  527. package/es/utils/react/useControlledFocusVisible.js +1 -1
  528. package/es/utils/react/useEventBus.js +1 -1
  529. package/es/utils/react/useId.js +1 -1
  530. package/es/utils/react/useIsDarwin.js +1 -1
  531. package/es/utils/react/useKeySymbols.js +1 -1
  532. package/es/utils/react/useLayoutEffect.js +1 -1
  533. package/es/utils/react/useLocalStorage.js +1 -1
  534. package/es/utils/react/useQaProps.js +1 -1
  535. package/es/utils/react/useViewportSize.js +1 -1
  536. package/es/utils/react/wrapNodeIfPlain.js +1 -1
  537. package/es/utils/tree.js +1 -1
  538. package/es/utils/warnings.js +1 -1
  539. package/es/version.js +2 -2
  540. package/package.json +1 -3
  541. package/types/components/GlobalStyles.d.ts +1 -2
  542. package/types/components/HiddenInput.d.ts +826 -827
  543. package/types/components/Root.d.ts +0 -1
  544. package/types/components/actions/Button/Button.d.ts +1645 -1647
  545. package/types/components/actions/CommandMenu/styled.d.ts +4130 -4135
  546. package/types/components/actions/Menu/styled.d.ts +4379 -4384
  547. package/types/components/actions/use-action.d.ts +1 -1
  548. package/types/components/content/List/SectionHeading.d.ts +83 -83
  549. package/types/components/content/Text.d.ts +311 -311
  550. package/types/components/fields/DatePicker/DatePickerElement.d.ts +83 -83
  551. package/types/components/fields/Select/Select.d.ts +826 -827
  552. package/types/components/fields/Slider/elements.d.ts +4956 -4962
  553. package/types/index.d.ts +0 -1
  554. package/types/provider.d.ts +2 -1
  555. package/types/stories/components/StyledButton.d.ts +1 -1
  556. package/types/tasty/debug.d.ts +0 -35
  557. package/types/tasty/index.d.ts +4 -14
  558. package/types/tasty/injector/index.d.ts +19 -30
  559. package/types/tasty/injector/injector.d.ts +13 -13
  560. package/types/tasty/injector/sheet-manager.d.ts +1 -25
  561. package/types/tasty/injector/types.d.ts +1 -20
  562. package/types/tasty/parser/parser.d.ts +0 -4
  563. package/types/tasty/parser/types.d.ts +0 -1
  564. package/types/tasty/providers/BreakpointsProvider.d.ts +8 -0
  565. package/types/tasty/styles/fill.d.ts +1 -11
  566. package/types/tasty/styles/margin.d.ts +1 -3
  567. package/types/tasty/styles/padding.d.ts +1 -3
  568. package/types/tasty/styles/types.d.ts +3 -13
  569. package/types/tasty/tasty.d.ts +840 -891
  570. package/types/tasty/utils/getModCombinations.d.ts +9 -0
  571. package/types/tasty/utils/renderStyles.d.ts +41 -0
  572. package/types/tasty/utils/responsive.d.ts +8 -0
  573. package/types/tasty/utils/styles.d.ts +6 -50
  574. package/types/tokens.d.ts +221 -0
  575. package/es/tasty/chunks/cacheKey.js +0 -98
  576. package/es/tasty/chunks/definitions.js +0 -280
  577. package/es/tasty/chunks/index.js +0 -12
  578. package/es/tasty/chunks/renderChunk.js +0 -97
  579. package/es/tasty/config.js +0 -244
  580. package/es/tasty/hooks/index.js +0 -12
  581. package/es/tasty/hooks/useGlobalStyles.js +0 -67
  582. package/es/tasty/hooks/useRawCSS.js +0 -40
  583. package/es/tasty/hooks/useStyles.js +0 -146
  584. package/es/tasty/pipeline/conditions.js +0 -469
  585. package/es/tasty/pipeline/exclusive.js +0 -193
  586. package/es/tasty/pipeline/index.js +0 -515
  587. package/es/tasty/pipeline/materialize.js +0 -1001
  588. package/es/tasty/pipeline/parseStateKey.js +0 -565
  589. package/es/tasty/pipeline/simplify.js +0 -786
  590. package/es/tasty/plugins/index.js +0 -26
  591. package/es/tasty/plugins/okhsl-plugin.js +0 -400
  592. package/es/tasty/plugins/types.js +0 -10
  593. package/es/tasty/states/index.js +0 -515
  594. package/es/tasty/static/index.js +0 -47
  595. package/es/tasty/static/tastyStatic.js +0 -55
  596. package/es/tasty/static/types.js +0 -34
  597. package/es/tasty/utils/typography.js +0 -67
  598. package/es/tasty/zero/babel.js +0 -401
  599. package/es/tasty/zero/css-writer.js +0 -94
  600. package/es/tasty/zero/extractor.js +0 -75
  601. package/es/tasty/zero/index.js +0 -28
  602. package/es/tasty/zero/next.js +0 -102
  603. package/es/tokens/base.js +0 -64
  604. package/es/tokens/colors.js +0 -68
  605. package/es/tokens/index.js +0 -63
  606. package/es/tokens/layout.js +0 -26
  607. package/es/tokens/shadows.js +0 -27
  608. package/es/tokens/sizes.js +0 -44
  609. package/es/tokens/spacing.js +0 -22
  610. package/es/tokens/typography.js +0 -237
  611. package/types/tasty/chunks/cacheKey.d.ts +0 -26
  612. package/types/tasty/chunks/definitions.d.ts +0 -75
  613. package/types/tasty/chunks/index.d.ts +0 -4
  614. package/types/tasty/chunks/renderChunk.d.ts +0 -25
  615. package/types/tasty/config.d.ts +0 -145
  616. package/types/tasty/hooks/index.d.ts +0 -4
  617. package/types/tasty/hooks/useGlobalStyles.d.ts +0 -22
  618. package/types/tasty/hooks/useRawCSS.d.ts +0 -50
  619. package/types/tasty/hooks/useStyles.d.ts +0 -38
  620. package/types/tasty/pipeline/conditions.d.ts +0 -248
  621. package/types/tasty/pipeline/exclusive.d.ts +0 -78
  622. package/types/tasty/pipeline/index.d.ts +0 -67
  623. package/types/tasty/pipeline/materialize.d.ts +0 -115
  624. package/types/tasty/pipeline/parseStateKey.d.ts +0 -20
  625. package/types/tasty/pipeline/simplify.d.ts +0 -28
  626. package/types/tasty/plugins/index.d.ts +0 -17
  627. package/types/tasty/plugins/okhsl-plugin.d.ts +0 -45
  628. package/types/tasty/plugins/types.d.ts +0 -34
  629. package/types/tasty/states/index.d.ts +0 -101
  630. package/types/tasty/static/index.d.ts +0 -39
  631. package/types/tasty/static/tastyStatic.d.ts +0 -41
  632. package/types/tasty/static/types.d.ts +0 -44
  633. package/types/tasty/utils/typography.d.ts +0 -32
  634. package/types/tasty/zero/babel.d.ts +0 -56
  635. package/types/tasty/zero/css-writer.d.ts +0 -41
  636. package/types/tasty/zero/extractor.d.ts +0 -19
  637. package/types/tasty/zero/index.d.ts +0 -18
  638. package/types/tasty/zero/next.d.ts +0 -57
  639. package/types/tokens/base.d.ts +0 -8
  640. package/types/tokens/colors.d.ts +0 -6
  641. package/types/tokens/index.d.ts +0 -41
  642. package/types/tokens/layout.d.ts +0 -7
  643. package/types/tokens/shadows.d.ts +0 -12
  644. package/types/tokens/sizes.d.ts +0 -27
  645. package/types/tokens/spacing.d.ts +0 -8
  646. package/types/tokens/typography.d.ts +0 -30
@@ -1,1001 +0,0 @@
1
- /**
2
- * @license MIT
3
- * author: Cube Dev Team
4
- * @cube-dev/ui-kit v0.0.0-canary-76be278
5
- * Released under the MIT license.
6
- */
7
-
8
- /**
9
- * CSS Materialization
10
- *
11
- * Converts condition trees into CSS selectors and at-rules.
12
- * This is the final stage that produces actual CSS output.
13
- */
14
- import { Lru } from '../parser/lru';
15
- // ============================================================================
16
- // Caching
17
- // ============================================================================
18
- const conditionCache = new Lru(3000);
19
- // ============================================================================
20
- // Main Functions
21
- // ============================================================================
22
- /**
23
- * Convert a condition tree to CSS components
24
- */
25
- export function conditionToCSS(node) {
26
- // Check cache
27
- const key = getConditionKey(node);
28
- const cached = conditionCache.get(key);
29
- if (cached) {
30
- return cached;
31
- }
32
- const result = conditionToCSSInner(node);
33
- // Cache result
34
- conditionCache.set(key, result);
35
- return result;
36
- }
37
- /**
38
- * Clear the condition cache (for testing)
39
- */
40
- export function clearConditionCache() {
41
- conditionCache.clear();
42
- }
43
- // ============================================================================
44
- // Inner Implementation
45
- // ============================================================================
46
- /**
47
- * Create an empty selector variant
48
- */
49
- function emptyVariant() {
50
- return {
51
- modifierSelectors: [],
52
- ownSelectors: [],
53
- mediaConditions: [],
54
- containerConditions: [],
55
- startingStyle: false,
56
- };
57
- }
58
- function conditionToCSSInner(node) {
59
- // Base case: TRUE condition - single empty variant (matches everything)
60
- if (node.kind === 'true') {
61
- return {
62
- variants: [emptyVariant()],
63
- isImpossible: false,
64
- };
65
- }
66
- // Base case: FALSE condition - no variants (matches nothing)
67
- if (node.kind === 'false') {
68
- return {
69
- variants: [],
70
- isImpossible: true,
71
- };
72
- }
73
- // State condition
74
- if (node.kind === 'state') {
75
- return stateToCSS(node);
76
- }
77
- // Compound condition
78
- if (node.kind === 'compound') {
79
- if (node.operator === 'AND') {
80
- return andToCSS(node.children);
81
- }
82
- else {
83
- return orToCSS(node.children);
84
- }
85
- }
86
- // Fallback - single empty variant
87
- return {
88
- variants: [emptyVariant()],
89
- isImpossible: false,
90
- };
91
- }
92
- /**
93
- * Convert a state condition to CSS
94
- */
95
- function stateToCSS(state) {
96
- switch (state.type) {
97
- case 'media': {
98
- // Media conditions can return multiple variants for negated ranges (OR branches)
99
- const mediaResults = mediaToParsed(state);
100
- const variants = mediaResults.map((mediaCond) => {
101
- const v = emptyVariant();
102
- v.mediaConditions.push(mediaCond);
103
- return v;
104
- });
105
- return { variants, isImpossible: false };
106
- }
107
- default: {
108
- const variant = emptyVariant();
109
- switch (state.type) {
110
- case 'modifier':
111
- variant.modifierSelectors.push(modifierToCSS(state));
112
- break;
113
- case 'pseudo':
114
- variant.modifierSelectors.push(pseudoToCSS(state));
115
- break;
116
- case 'container':
117
- variant.containerConditions.push(containerToParsed(state));
118
- break;
119
- case 'root':
120
- variant.rootPrefix = rootToCSS(state);
121
- break;
122
- case 'own':
123
- variant.ownSelectors.push(...ownToCSS(state));
124
- break;
125
- case 'starting':
126
- variant.startingStyle = !state.negated;
127
- break;
128
- }
129
- return {
130
- variants: [variant],
131
- isImpossible: false,
132
- };
133
- }
134
- }
135
- }
136
- /**
137
- * Convert modifier condition to CSS selector
138
- */
139
- function modifierToCSS(state) {
140
- let selector;
141
- if (state.value !== undefined) {
142
- // Value attribute: [data-attr="value"]
143
- const op = state.operator || '=';
144
- selector = `[${state.attribute}${op}"${state.value}"]`;
145
- }
146
- else {
147
- // Boolean attribute: [data-attr]
148
- selector = `[${state.attribute}]`;
149
- }
150
- if (state.negated) {
151
- return `:not(${selector})`;
152
- }
153
- return selector;
154
- }
155
- /**
156
- * Convert pseudo condition to CSS selector
157
- */
158
- function pseudoToCSS(state) {
159
- if (state.negated) {
160
- // Wrap in :not() if not already
161
- if (state.pseudo.startsWith(':not(')) {
162
- // Double negation - remove :not()
163
- return state.pseudo.slice(5, -1);
164
- }
165
- return `:not(${state.pseudo})`;
166
- }
167
- return state.pseudo;
168
- }
169
- /**
170
- * Convert media condition to parsed structure(s)
171
- * Returns an array because negated ranges produce OR branches (two separate conditions)
172
- */
173
- function mediaToParsed(state) {
174
- if (state.subtype === 'type') {
175
- // @media:print → @media print (or @media not print)
176
- const mediaType = state.mediaType || 'all';
177
- return [
178
- {
179
- subtype: 'type',
180
- negated: state.negated ?? false,
181
- condition: mediaType,
182
- mediaType: state.mediaType,
183
- },
184
- ];
185
- }
186
- else if (state.subtype === 'feature') {
187
- // @media(prefers-contrast: high) → @media (prefers-contrast: high)
188
- let condition;
189
- if (state.featureValue) {
190
- condition = `(${state.feature}: ${state.featureValue})`;
191
- }
192
- else {
193
- condition = `(${state.feature})`;
194
- }
195
- return [
196
- {
197
- subtype: 'feature',
198
- negated: state.negated ?? false,
199
- condition,
200
- feature: state.feature,
201
- featureValue: state.featureValue,
202
- },
203
- ];
204
- }
205
- else {
206
- // Dimension query - negation is handled by inverting the condition
207
- // because "not (width < x)" doesn't work reliably in browsers
208
- return dimensionToMediaParsed(state.dimension || 'width', state.lowerBound, state.upperBound, state.negated ?? false);
209
- }
210
- }
211
- /**
212
- * Convert dimension bounds to parsed media condition(s)
213
- * Returns an array because negated ranges produce OR branches (two separate conditions)
214
- */
215
- function dimensionToMediaParsed(dimension, lowerBound, upperBound, negated) {
216
- if (negated) {
217
- // Invert the condition manually since "not (width < x)" doesn't work in browsers
218
- // Single bounds: flip the operator → returns single condition
219
- // Range: NOT (a <= x < b) = (x < a) OR (x >= b) → returns two conditions (OR branches)
220
- if (lowerBound && upperBound) {
221
- // Range query: (lower <= dim < upper) negated is (dim < lower) OR (dim >= upper)
222
- // Return two separate conditions - these become separate variants
223
- const lowerOp = lowerBound.inclusive ? '<' : '<=';
224
- const upperOp = upperBound.inclusive ? '>' : '>=';
225
- return [
226
- {
227
- subtype: 'dimension',
228
- negated: false,
229
- condition: `(${dimension} ${lowerOp} ${lowerBound.value})`,
230
- dimension,
231
- upperBound: {
232
- value: lowerBound.value,
233
- valueNumeric: lowerBound.valueNumeric,
234
- inclusive: !lowerBound.inclusive,
235
- },
236
- },
237
- {
238
- subtype: 'dimension',
239
- negated: false,
240
- condition: `(${dimension} ${upperOp} ${upperBound.value})`,
241
- dimension,
242
- lowerBound: {
243
- value: upperBound.value,
244
- valueNumeric: upperBound.valueNumeric,
245
- inclusive: !upperBound.inclusive,
246
- },
247
- },
248
- ];
249
- }
250
- else if (upperBound) {
251
- // (dim < upper) negated is (dim >= upper)
252
- // (dim <= upper) negated is (dim > upper)
253
- const op = upperBound.inclusive ? '>' : '>=';
254
- return [
255
- {
256
- subtype: 'dimension',
257
- negated: false,
258
- condition: `(${dimension} ${op} ${upperBound.value})`,
259
- dimension,
260
- lowerBound: {
261
- value: upperBound.value,
262
- valueNumeric: upperBound.valueNumeric,
263
- inclusive: !upperBound.inclusive,
264
- },
265
- },
266
- ];
267
- }
268
- else if (lowerBound) {
269
- // (dim >= lower) negated is (dim < lower)
270
- // (dim > lower) negated is (dim <= lower)
271
- const op = lowerBound.inclusive ? '<' : '<=';
272
- return [
273
- {
274
- subtype: 'dimension',
275
- negated: false,
276
- condition: `(${dimension} ${op} ${lowerBound.value})`,
277
- dimension,
278
- upperBound: {
279
- value: lowerBound.value,
280
- valueNumeric: lowerBound.valueNumeric,
281
- inclusive: !lowerBound.inclusive,
282
- },
283
- },
284
- ];
285
- }
286
- }
287
- // Non-negated conditions
288
- let condition;
289
- if (lowerBound && upperBound) {
290
- const lowerOp = lowerBound.inclusive ? '<=' : '<';
291
- const upperOp = upperBound.inclusive ? '<=' : '<';
292
- condition = `(${lowerBound.value} ${lowerOp} ${dimension} ${upperOp} ${upperBound.value})`;
293
- }
294
- else if (upperBound) {
295
- const op = upperBound.inclusive ? '<=' : '<';
296
- condition = `(${dimension} ${op} ${upperBound.value})`;
297
- }
298
- else if (lowerBound) {
299
- const op = lowerBound.inclusive ? '>=' : '>';
300
- condition = `(${dimension} ${op} ${lowerBound.value})`;
301
- }
302
- else {
303
- condition = `(${dimension})`;
304
- }
305
- return [
306
- {
307
- subtype: 'dimension',
308
- negated: false,
309
- condition,
310
- dimension,
311
- lowerBound,
312
- upperBound,
313
- },
314
- ];
315
- }
316
- /**
317
- * Convert container condition to parsed structure
318
- * This enables structured analysis for contradiction detection and condition combining
319
- */
320
- function containerToParsed(state) {
321
- let condition;
322
- if (state.subtype === 'style') {
323
- // Style query: style(--prop: value)
324
- if (state.propertyValue) {
325
- condition = `style(--${state.property}: ${state.propertyValue})`;
326
- }
327
- else {
328
- condition = `style(--${state.property})`;
329
- }
330
- }
331
- else {
332
- // Dimension query
333
- condition = dimensionToContainerCondition(state.dimension || 'width', state.lowerBound, state.upperBound);
334
- }
335
- return {
336
- name: state.containerName,
337
- condition,
338
- negated: state.negated ?? false,
339
- subtype: state.subtype,
340
- property: state.property,
341
- propertyValue: state.propertyValue,
342
- };
343
- }
344
- /**
345
- * Convert dimension bounds to container query condition (single string)
346
- * Container queries support "not (condition)", so no need to invert manually
347
- */
348
- function dimensionToContainerCondition(dimension, lowerBound, upperBound) {
349
- if (lowerBound && upperBound) {
350
- const lowerOp = lowerBound.inclusive ? '<=' : '<';
351
- const upperOp = upperBound.inclusive ? '<=' : '<';
352
- return `(${lowerBound.value} ${lowerOp} ${dimension} ${upperOp} ${upperBound.value})`;
353
- }
354
- else if (upperBound) {
355
- const op = upperBound.inclusive ? '<=' : '<';
356
- return `(${dimension} ${op} ${upperBound.value})`;
357
- }
358
- else if (lowerBound) {
359
- const op = lowerBound.inclusive ? '>=' : '>';
360
- return `(${dimension} ${op} ${lowerBound.value})`;
361
- }
362
- return '(width)'; // Fallback
363
- }
364
- /**
365
- * Convert root condition to CSS selector prefix
366
- */
367
- function rootToCSS(state) {
368
- if (state.negated) {
369
- return `:root:not(${state.selector})`;
370
- }
371
- return `:root${state.selector}`;
372
- }
373
- /**
374
- * Convert own condition to CSS selectors for sub-element
375
- */
376
- function ownToCSS(state) {
377
- const innerCSS = conditionToCSS(state.innerCondition);
378
- if (innerCSS.isImpossible || innerCSS.variants.length === 0) {
379
- return [];
380
- }
381
- // Collect all modifier selectors from all variants
382
- // (For @own, we typically expect simple conditions, so usually just one variant)
383
- const allSelectors = [];
384
- for (const variant of innerCSS.variants) {
385
- allSelectors.push(...variant.modifierSelectors);
386
- }
387
- if (state.negated) {
388
- // Negate all selectors
389
- return allSelectors.map((s) => {
390
- if (s.startsWith(':not(')) {
391
- // Double negation - remove :not()
392
- return s.slice(5, -1);
393
- }
394
- return `:not(${s})`;
395
- });
396
- }
397
- return allSelectors;
398
- }
399
- /**
400
- * Deduplicate an array while preserving order
401
- */
402
- function dedupeArray(arr) {
403
- return [...new Set(arr)];
404
- }
405
- /**
406
- * Merge two selector variants (AND operation)
407
- * Deduplicates selectors to avoid `.foo:not([x]):not([x])` repetition
408
- */
409
- function mergeVariants(a, b) {
410
- // Merge media conditions and check for contradictions
411
- const mergedMedia = dedupeMediaConditions([
412
- ...a.mediaConditions,
413
- ...b.mediaConditions,
414
- ]);
415
- if (hasMediaContradiction(mergedMedia)) {
416
- return null; // Impossible variant
417
- }
418
- // Combine root prefixes and check for contradictions
419
- const combinedRoot = combineRootPrefixes(a.rootPrefix, b.rootPrefix);
420
- if (combinedRoot && hasRootPrefixContradiction(combinedRoot)) {
421
- return null; // Impossible variant
422
- }
423
- // Merge modifier selectors and check for contradictions
424
- const mergedModifiers = dedupeArray([
425
- ...a.modifierSelectors,
426
- ...b.modifierSelectors,
427
- ]);
428
- if (hasModifierContradiction(mergedModifiers)) {
429
- return null; // Impossible variant
430
- }
431
- // Merge container conditions and check for contradictions
432
- const mergedContainers = dedupeContainerConditions([
433
- ...a.containerConditions,
434
- ...b.containerConditions,
435
- ]);
436
- if (hasContainerStyleContradiction(mergedContainers)) {
437
- return null; // Impossible variant
438
- }
439
- return {
440
- modifierSelectors: mergedModifiers,
441
- ownSelectors: dedupeArray([...a.ownSelectors, ...b.ownSelectors]),
442
- mediaConditions: mergedMedia,
443
- containerConditions: mergedContainers,
444
- rootPrefix: combinedRoot,
445
- startingStyle: a.startingStyle || b.startingStyle,
446
- };
447
- }
448
- /**
449
- * Deduplicate media conditions by their key (subtype + condition + negated)
450
- */
451
- function dedupeMediaConditions(conditions) {
452
- const seen = new Set();
453
- const result = [];
454
- for (const c of conditions) {
455
- const key = `${c.subtype}|${c.condition}|${c.negated}`;
456
- if (!seen.has(key)) {
457
- seen.add(key);
458
- result.push(c);
459
- }
460
- }
461
- return result;
462
- }
463
- /**
464
- * Deduplicate container conditions by their key (name + condition + negated)
465
- */
466
- function dedupeContainerConditions(conditions) {
467
- const seen = new Set();
468
- const result = [];
469
- for (const c of conditions) {
470
- const key = `${c.name ?? ''}|${c.condition}|${c.negated}`;
471
- if (!seen.has(key)) {
472
- seen.add(key);
473
- result.push(c);
474
- }
475
- }
476
- return result;
477
- }
478
- /**
479
- * Check if a set of media conditions contains contradictions
480
- * e.g., (prefers-color-scheme: light) AND NOT (prefers-color-scheme: light)
481
- * or (width >= 900px) AND (width < 600px)
482
- *
483
- * Uses parsed media conditions for efficient analysis without regex parsing.
484
- */
485
- function hasMediaContradiction(conditions) {
486
- // Track conditions by their key (condition string) to detect A and NOT A
487
- const featureConditions = new Map(); // key -> isPositive
488
- const typeConditions = new Map(); // mediaType -> isPositive
489
- // Track dimension conditions for range contradiction detection
490
- const dimensionsByDim = new Map();
491
- for (const cond of conditions) {
492
- if (cond.subtype === 'type') {
493
- // Type query: check for direct contradiction (print AND NOT print)
494
- const key = cond.mediaType || 'all';
495
- const existing = typeConditions.get(key);
496
- if (existing !== undefined && existing !== !cond.negated) {
497
- return true; // Contradiction: positive AND negated
498
- }
499
- typeConditions.set(key, !cond.negated);
500
- }
501
- else if (cond.subtype === 'feature') {
502
- // Feature query: check for direct contradiction
503
- const key = cond.condition;
504
- const existing = featureConditions.get(key);
505
- if (existing !== undefined && existing !== !cond.negated) {
506
- return true; // Contradiction: positive AND negated
507
- }
508
- featureConditions.set(key, !cond.negated);
509
- }
510
- else if (cond.subtype === 'dimension') {
511
- // Dimension query: check for range contradictions
512
- // Note: negated conditions are already inverted in dimensionToMediaParsed
513
- const dim = cond.dimension || 'width';
514
- let bounds = dimensionsByDim.get(dim);
515
- if (!bounds) {
516
- bounds = { lowerBound: null, upperBound: null };
517
- dimensionsByDim.set(dim, bounds);
518
- }
519
- // Track the effective bounds
520
- if (cond.lowerBound?.valueNumeric != null) {
521
- const value = cond.lowerBound.valueNumeric;
522
- if (bounds.lowerBound === null || value > bounds.lowerBound) {
523
- bounds.lowerBound = value;
524
- }
525
- }
526
- if (cond.upperBound?.valueNumeric != null) {
527
- const value = cond.upperBound.valueNumeric;
528
- if (bounds.upperBound === null || value < bounds.upperBound) {
529
- bounds.upperBound = value;
530
- }
531
- }
532
- // Check for impossible range
533
- if (bounds.lowerBound !== null &&
534
- bounds.upperBound !== null &&
535
- bounds.lowerBound >= bounds.upperBound) {
536
- return true;
537
- }
538
- }
539
- }
540
- return false;
541
- }
542
- /**
543
- * Check if a root prefix contains contradictions
544
- * e.g., ":root:not([data-x="y"])[data-x="y"]" is a contradiction
545
- */
546
- function hasRootPrefixContradiction(rootPrefix) {
547
- return hasSelectorStringContradiction(rootPrefix);
548
- }
549
- /**
550
- * Check if modifier selectors contain contradictions
551
- * e.g., "[data-selected]" and ":not([data-selected])" together
552
- */
553
- function hasModifierContradiction(modifiers) {
554
- const combined = modifiers.join('');
555
- return hasSelectorStringContradiction(combined);
556
- }
557
- /**
558
- * Check if a selector string contains contradictions
559
- * e.g., "[data-x]:not([data-x])" or "[data-x="y"]:not([data-x="y"])"
560
- */
561
- function hasSelectorStringContradiction(selector) {
562
- const positiveAttrs = [];
563
- const negativeAttrs = [];
564
- // Match :not([attr]) or :not([attr="value"])
565
- const notPattern = /:not\(\[([^\]]+)\]\)/g;
566
- let match;
567
- while ((match = notPattern.exec(selector)) !== null) {
568
- negativeAttrs.push(match[1]);
569
- }
570
- // Match [attr] or [attr="value"] (not inside :not())
571
- // The lookbehind (?<!...) ensures we don't match attributes inside :not()
572
- const attrPattern = /(?<!:not\()\[([^\]]+)\]/g;
573
- while ((match = attrPattern.exec(selector)) !== null) {
574
- positiveAttrs.push(match[1]);
575
- }
576
- // Check for contradictions
577
- for (const neg of negativeAttrs) {
578
- if (positiveAttrs.includes(neg)) {
579
- return true;
580
- }
581
- }
582
- return false;
583
- }
584
- /**
585
- * Check if container conditions contain contradictions in style queries
586
- * e.g., style(--variant: danger) and style(--variant: success) together
587
- * Same property with different values = always false
588
- *
589
- * Uses parsed container conditions for efficient analysis without regex parsing.
590
- */
591
- function hasContainerStyleContradiction(conditions) {
592
- // Track style queries by property name
593
- // key: property name, value: { hasExistence: boolean, values: Set<string>, hasNegatedExistence: boolean }
594
- const styleQueries = new Map();
595
- for (const cond of conditions) {
596
- // Only analyze style queries
597
- if (cond.subtype !== 'style' || !cond.property) {
598
- continue;
599
- }
600
- const property = cond.property;
601
- const value = cond.propertyValue;
602
- if (!styleQueries.has(property)) {
603
- styleQueries.set(property, {
604
- hasExistence: false,
605
- values: new Set(),
606
- hasNegatedExistence: false,
607
- });
608
- }
609
- const entry = styleQueries.get(property);
610
- if (cond.negated) {
611
- if (value === undefined) {
612
- // not style(--prop) - negated existence check
613
- entry.hasNegatedExistence = true;
614
- }
615
- // Negated value checks don't contradict positive value checks directly
616
- // They just mean "not this value"
617
- }
618
- else {
619
- if (value === undefined) {
620
- // style(--prop) - existence check
621
- entry.hasExistence = true;
622
- }
623
- else {
624
- // style(--prop: value) - value check
625
- entry.values.add(value);
626
- }
627
- }
628
- }
629
- // Check for contradictions
630
- for (const [, entry] of styleQueries) {
631
- // Contradiction: existence check + negated existence check
632
- if (entry.hasExistence && entry.hasNegatedExistence) {
633
- return true;
634
- }
635
- // Contradiction: multiple different values for same property
636
- // style(--variant: danger) AND style(--variant: success) is impossible
637
- if (entry.values.size > 1) {
638
- return true;
639
- }
640
- // Contradiction: negated existence + value check
641
- // not style(--variant) AND style(--variant: danger) is impossible
642
- if (entry.hasNegatedExistence && entry.values.size > 0) {
643
- return true;
644
- }
645
- }
646
- return false;
647
- }
648
- /**
649
- * Combine two root prefixes
650
- */
651
- function combineRootPrefixes(a, b) {
652
- if (!a)
653
- return b;
654
- if (!b)
655
- return a;
656
- // Combine: :root[x] + :root[y] → :root[x][y]
657
- return `${a}${b.replace(':root', '')}`;
658
- }
659
- /**
660
- * Get a unique key for a variant (for deduplication)
661
- */
662
- function getVariantKey(v) {
663
- const containerKey = v.containerConditions
664
- .map((c) => `${c.name ?? ''}:${c.negated ? '!' : ''}${c.condition}`)
665
- .sort()
666
- .join('|');
667
- const mediaKey = v.mediaConditions
668
- .map((c) => `${c.subtype}:${c.negated ? '!' : ''}${c.condition}`)
669
- .sort()
670
- .join('|');
671
- return [
672
- v.modifierSelectors.slice().sort().join('|'),
673
- v.ownSelectors.slice().sort().join('|'),
674
- mediaKey,
675
- containerKey,
676
- v.rootPrefix || '',
677
- v.startingStyle ? '1' : '0',
678
- ].join('###');
679
- }
680
- /**
681
- * Check if variant A is a superset of variant B (A is more restrictive)
682
- *
683
- * If A has all of B's conditions plus more, then A is redundant
684
- * because B already covers the same cases (and more).
685
- *
686
- * Example:
687
- * A: :not([size=large]):not([size=medium]):not([size=small])
688
- * B: :not([size=large])
689
- * A is a superset of B, so A is redundant when B exists.
690
- */
691
- function isVariantSuperset(a, b) {
692
- // Must have same context (root prefix, at-rules, etc.)
693
- if (a.rootPrefix !== b.rootPrefix)
694
- return false;
695
- if (a.startingStyle !== b.startingStyle)
696
- return false;
697
- // Check if a.mediaConditions is superset of b.mediaConditions
698
- if (!isMediaConditionsSuperset(a.mediaConditions, b.mediaConditions))
699
- return false;
700
- // Check if a.containerConditions is superset of b.containerConditions
701
- if (!isContainerConditionsSuperset(a.containerConditions, b.containerConditions))
702
- return false;
703
- // Check if a.modifierSelectors is superset of b.modifierSelectors
704
- if (!isArraySuperset(a.modifierSelectors, b.modifierSelectors))
705
- return false;
706
- // Check if a.ownSelectors is superset of b.ownSelectors
707
- if (!isArraySuperset(a.ownSelectors, b.ownSelectors))
708
- return false;
709
- // A is a superset if it has all of B's items (possibly more)
710
- // and at least one category has strictly more items
711
- const aTotal = a.mediaConditions.length +
712
- a.containerConditions.length +
713
- a.modifierSelectors.length +
714
- a.ownSelectors.length;
715
- const bTotal = b.mediaConditions.length +
716
- b.containerConditions.length +
717
- b.modifierSelectors.length +
718
- b.ownSelectors.length;
719
- return aTotal > bTotal;
720
- }
721
- /**
722
- * Check if media conditions A is a superset of B
723
- */
724
- function isMediaConditionsSuperset(a, b) {
725
- const aKeys = new Set(a.map((c) => `${c.subtype}|${c.condition}|${c.negated}`));
726
- for (const c of b) {
727
- const key = `${c.subtype}|${c.condition}|${c.negated}`;
728
- if (!aKeys.has(key))
729
- return false;
730
- }
731
- return true;
732
- }
733
- /**
734
- * Check if container conditions A is a superset of B
735
- */
736
- function isContainerConditionsSuperset(a, b) {
737
- const aKeys = new Set(a.map((c) => `${c.name ?? ''}|${c.condition}|${c.negated}`));
738
- for (const c of b) {
739
- const key = `${c.name ?? ''}|${c.condition}|${c.negated}`;
740
- if (!aKeys.has(key))
741
- return false;
742
- }
743
- return true;
744
- }
745
- /**
746
- * Check if array A contains all elements of array B (superset)
747
- */
748
- function isArraySuperset(a, b) {
749
- const setA = new Set(a);
750
- for (const item of b) {
751
- if (!setA.has(item))
752
- return false;
753
- }
754
- return true;
755
- }
756
- /**
757
- * Deduplicate variants
758
- *
759
- * Removes:
760
- * 1. Exact duplicates (same key)
761
- * 2. Superset variants (more restrictive selectors that are redundant)
762
- */
763
- function dedupeVariants(variants) {
764
- // First pass: exact deduplication
765
- const seen = new Set();
766
- let result = [];
767
- for (const v of variants) {
768
- const key = getVariantKey(v);
769
- if (!seen.has(key)) {
770
- seen.add(key);
771
- result.push(v);
772
- }
773
- }
774
- // Second pass: remove supersets (more restrictive variants)
775
- // Sort by total selector count (fewer selectors = less restrictive = keep)
776
- result.sort((a, b) => {
777
- const aCount = a.modifierSelectors.length +
778
- a.ownSelectors.length +
779
- a.mediaConditions.length +
780
- a.containerConditions.length;
781
- const bCount = b.modifierSelectors.length +
782
- b.ownSelectors.length +
783
- b.mediaConditions.length +
784
- b.containerConditions.length;
785
- return aCount - bCount;
786
- });
787
- // Remove variants that are supersets of earlier (less restrictive) variants
788
- const filtered = [];
789
- for (const candidate of result) {
790
- let isRedundant = false;
791
- for (const kept of filtered) {
792
- if (isVariantSuperset(candidate, kept)) {
793
- isRedundant = true;
794
- break;
795
- }
796
- }
797
- if (!isRedundant) {
798
- filtered.push(candidate);
799
- }
800
- }
801
- return filtered;
802
- }
803
- /**
804
- * Combine AND conditions into CSS
805
- *
806
- * AND of conditions means cartesian product of variants:
807
- * (A1 | A2) & (B1 | B2) = A1&B1 | A1&B2 | A2&B1 | A2&B2
808
- *
809
- * Variants that result in contradictions (e.g., conflicting media rules)
810
- * are filtered out.
811
- */
812
- function andToCSS(children) {
813
- // Start with a single empty variant
814
- let currentVariants = [emptyVariant()];
815
- for (const child of children) {
816
- const childCSS = conditionToCSSInner(child);
817
- if (childCSS.isImpossible || childCSS.variants.length === 0) {
818
- return { variants: [], isImpossible: true };
819
- }
820
- // Cartesian product: each current variant × each child variant
821
- const newVariants = [];
822
- for (const current of currentVariants) {
823
- for (const childVariant of childCSS.variants) {
824
- const merged = mergeVariants(current, childVariant);
825
- // Skip impossible variants (contradictions detected during merge)
826
- if (merged !== null) {
827
- newVariants.push(merged);
828
- }
829
- }
830
- }
831
- if (newVariants.length === 0) {
832
- return { variants: [], isImpossible: true };
833
- }
834
- // Deduplicate after each step to prevent exponential blowup
835
- currentVariants = dedupeVariants(newVariants);
836
- }
837
- return {
838
- variants: currentVariants,
839
- isImpossible: false,
840
- };
841
- }
842
- /**
843
- * Combine OR conditions into CSS
844
- *
845
- * OR in CSS means multiple selector variants (DNF).
846
- * Each variant becomes a separate selector in the comma-separated list,
847
- * or multiple CSS rules if they have different at-rules.
848
- *
849
- * Note: OR exclusivity is handled at the pipeline level (expandOrConditions),
850
- * so here we just collect all variants. Any remaining ORs in the condition
851
- * tree (e.g., from De Morgan expansion) are handled as simple alternatives.
852
- */
853
- function orToCSS(children) {
854
- const allVariants = [];
855
- for (const child of children) {
856
- const childCSS = conditionToCSSInner(child);
857
- if (childCSS.isImpossible)
858
- continue;
859
- allVariants.push(...childCSS.variants);
860
- }
861
- if (allVariants.length === 0) {
862
- return { variants: [], isImpossible: true };
863
- }
864
- // Deduplicate variants
865
- return {
866
- variants: dedupeVariants(allVariants),
867
- isImpossible: false,
868
- };
869
- }
870
- // ============================================================================
871
- // Utility Functions
872
- // ============================================================================
873
- /**
874
- * Get a cache key for a condition
875
- */
876
- function getConditionKey(node) {
877
- if (node.kind === 'true')
878
- return 'TRUE';
879
- if (node.kind === 'false')
880
- return 'FALSE';
881
- if (node.kind === 'state')
882
- return node.uniqueId;
883
- if (node.kind === 'compound') {
884
- const childKeys = node.children.map(getConditionKey).sort();
885
- return `${node.operator}(${childKeys.join(',')})`;
886
- }
887
- return 'UNKNOWN';
888
- }
889
- /**
890
- * Build a complete CSS selector from a single variant
891
- */
892
- export function buildCSSSelectorFromVariant(className, variant, selectorSuffix = '') {
893
- // Start with base class (doubled for specificity)
894
- let selector = `.${className}.${className}`;
895
- // Add modifier selectors
896
- selector += variant.modifierSelectors.join('');
897
- // Add selector suffix (e.g., ' [data-element="Label"]')
898
- selector += selectorSuffix;
899
- // Add own selectors (after sub-element)
900
- selector += variant.ownSelectors.join('');
901
- // Add root prefix if present
902
- if (variant.rootPrefix) {
903
- selector = `${variant.rootPrefix} ${selector}`;
904
- }
905
- return selector;
906
- }
907
- /**
908
- * Build at-rules array from a variant
909
- */
910
- export function buildAtRulesFromVariant(variant) {
911
- const atRules = [];
912
- // Add media rules - combine all conditions with "and"
913
- if (variant.mediaConditions.length > 0) {
914
- const conditionParts = variant.mediaConditions.map((c) => {
915
- if (c.subtype === 'type') {
916
- // Media type: print, screen, etc.
917
- return c.negated ? `not ${c.condition}` : c.condition;
918
- }
919
- else {
920
- // Feature or dimension: (condition) or not (condition)
921
- return c.negated ? `not ${c.condition}` : c.condition;
922
- }
923
- });
924
- atRules.push(`@media ${conditionParts.join(' and ')}`);
925
- }
926
- // Add container rules - group by container name and combine with "and"
927
- if (variant.containerConditions.length > 0) {
928
- // Group conditions by container name (undefined = unnamed/nearest)
929
- const byName = new Map();
930
- for (const cond of variant.containerConditions) {
931
- const group = byName.get(cond.name) || [];
932
- group.push(cond);
933
- byName.set(cond.name, group);
934
- }
935
- // Build one @container rule per container name
936
- for (const [name, conditions] of byName) {
937
- // CSS Container Query syntax requires parentheses around negated conditions:
938
- // @container (not style(--x)) and style(--y) - NOT @container not style(--x) and style(--y)
939
- const conditionParts = conditions.map((c) => c.negated ? `(not ${c.condition})` : c.condition);
940
- const namePrefix = name ? `${name} ` : '';
941
- atRules.push(`@container ${namePrefix}${conditionParts.join(' and ')}`);
942
- }
943
- }
944
- // Add starting-style
945
- if (variant.startingStyle) {
946
- atRules.push('@starting-style');
947
- }
948
- return atRules;
949
- }
950
- /**
951
- * Get a string key for a variant's at-rules (for grouping)
952
- */
953
- function getAtRulesKey(variant) {
954
- const atRules = buildAtRulesFromVariant(variant);
955
- return atRules.sort().join('|||');
956
- }
957
- /**
958
- * Materialize a computed rule into final CSS format
959
- *
960
- * Returns an array of CSSRules because OR conditions may require multiple rules
961
- * (when different branches have different at-rules)
962
- */
963
- export function materializeRule(condition, declarations, selectorSuffix, className) {
964
- const components = conditionToCSS(condition);
965
- if (components.isImpossible || components.variants.length === 0) {
966
- return [];
967
- }
968
- const declarationsStr = Object.entries(declarations)
969
- .map(([prop, value]) => `${prop}: ${value};`)
970
- .join(' ');
971
- // Group variants by their at-rules (variants with same at-rules can be combined with commas)
972
- const byAtRules = new Map();
973
- for (const variant of components.variants) {
974
- const key = getAtRulesKey(variant);
975
- const group = byAtRules.get(key) || [];
976
- group.push(variant);
977
- byAtRules.set(key, group);
978
- }
979
- // Generate one CSSRule per at-rules group
980
- const rules = [];
981
- for (const [, variants] of byAtRules) {
982
- // All variants in this group have the same at-rules, so combine selectors with commas
983
- const selectors = variants.map((v) => buildCSSSelectorFromVariant(className, v, selectorSuffix));
984
- const selector = selectors.join(', ');
985
- const atRules = buildAtRulesFromVariant(variants[0]);
986
- const rule = {
987
- selector,
988
- declarations: declarationsStr,
989
- };
990
- if (atRules.length > 0) {
991
- rule.atRules = atRules;
992
- }
993
- if (variants[0].rootPrefix) {
994
- rule.rootPrefix = variants[0].rootPrefix;
995
- }
996
- rules.push(rule);
997
- }
998
- return rules;
999
- }
1000
-
1001
-