@cube-dev/ui-kit 0.0.0-canary-da1f163 → 0.0.0-canary-7f29fb4

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 (507) 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/GlobalStyles.js +1 -1
  17. package/es/components/GridProvider.js +1 -1
  18. package/es/components/HiddenInput.js +1 -1
  19. package/es/components/Item.js +1 -1
  20. package/es/components/OpenTrasition.js +1 -1
  21. package/es/components/Root.js +2 -2
  22. package/es/components/actions/Action/Action.js +14 -18
  23. package/es/components/actions/Button/Button.js +2 -1
  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/ItemButton/ItemButton.js +1 -1
  30. package/es/components/actions/ItemButton/index.js +1 -1
  31. package/es/components/actions/Menu/Menu.js +1 -1
  32. package/es/components/actions/Menu/MenuItem.js +3 -8
  33. package/es/components/actions/Menu/MenuSection.js +1 -1
  34. package/es/components/actions/Menu/MenuTrigger.js +1 -1
  35. package/es/components/actions/Menu/SubMenuTrigger.js +1 -1
  36. package/es/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  37. package/es/components/actions/Menu/context.js +1 -1
  38. package/es/components/actions/Menu/index.js +1 -1
  39. package/es/components/actions/Menu/styled.js +1 -1
  40. package/es/components/actions/index.js +1 -1
  41. package/es/components/actions/use-action.js +1 -1
  42. package/es/components/actions/use-anchored-menu.js +1 -1
  43. package/es/components/actions/use-context-menu.js +1 -1
  44. package/es/components/content/ActiveZone/ActiveZone.js +1 -1
  45. package/es/components/content/Alert/Alert.js +1 -1
  46. package/es/components/content/Alert/index.js +1 -1
  47. package/es/components/content/Alert/types.js +1 -1
  48. package/es/components/content/Alert/use-alert.js +1 -1
  49. package/es/components/content/Avatar/Avatar.js +1 -1
  50. package/es/components/content/Badge/Badge.js +1 -1
  51. package/es/components/content/Card/Card.js +1 -1
  52. package/es/components/content/Content.js +1 -1
  53. package/es/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  54. package/es/components/content/CopyPasteBlock/index.js +1 -1
  55. package/es/components/content/CopySnippet/CopySnippet.js +1 -1
  56. package/es/components/content/CopySnippet/index.js +1 -1
  57. package/es/components/content/Divider.js +1 -1
  58. package/es/components/content/Footer.js +1 -1
  59. package/es/components/content/Header.js +1 -1
  60. package/es/components/content/HotKeys/HotKeys.js +1 -1
  61. package/es/components/content/HotKeys/index.js +1 -1
  62. package/es/components/content/ItemBase/ItemBase.js +6 -5
  63. package/es/components/content/ItemBase/index.js +1 -1
  64. package/es/components/content/List/SectionHeading.js +1 -1
  65. package/es/components/content/List/index.js +1 -1
  66. package/es/components/content/Paragraph.js +1 -1
  67. package/es/components/content/Placeholder/Placeholder.js +1 -1
  68. package/es/components/content/PrismCode/PrismCode.js +1 -1
  69. package/es/components/content/PrismCode/prismSetup.js +1 -1
  70. package/es/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  71. package/es/components/content/Result/Result.js +1 -1
  72. package/es/components/content/Skeleton/Skeleton.js +1 -1
  73. package/es/components/content/Tag/Tag.js +1 -1
  74. package/es/components/content/Text.js +3 -3
  75. package/es/components/content/Title.js +3 -3
  76. package/es/components/fields/Checkbox/Checkbox.js +1 -1
  77. package/es/components/fields/Checkbox/CheckboxGroup.js +1 -1
  78. package/es/components/fields/Checkbox/context.js +1 -1
  79. package/es/components/fields/Checkbox/index.js +1 -1
  80. package/es/components/fields/ComboBox/ComboBox.js +1 -1
  81. package/es/components/fields/ComboBox/index.js +1 -1
  82. package/es/components/fields/DatePicker/DateInput.js +1 -1
  83. package/es/components/fields/DatePicker/DateInputBase.js +1 -1
  84. package/es/components/fields/DatePicker/DatePicker.js +1 -1
  85. package/es/components/fields/DatePicker/DatePickerButton.js +1 -1
  86. package/es/components/fields/DatePicker/DatePickerElement.js +1 -1
  87. package/es/components/fields/DatePicker/DatePickerInput.js +1 -1
  88. package/es/components/fields/DatePicker/DatePickerSegment.js +1 -1
  89. package/es/components/fields/DatePicker/DateRangePicker.js +1 -1
  90. package/es/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  91. package/es/components/fields/DatePicker/TimeInput.js +1 -1
  92. package/es/components/fields/DatePicker/index.js +1 -1
  93. package/es/components/fields/DatePicker/intl.js +1 -1
  94. package/es/components/fields/DatePicker/parseDate.js +1 -1
  95. package/es/components/fields/DatePicker/props.js +1 -1
  96. package/es/components/fields/DatePicker/types.js +1 -1
  97. package/es/components/fields/DatePicker/utils.js +1 -1
  98. package/es/components/fields/FileInput/FileInput.js +1 -1
  99. package/es/components/fields/FilterListBox/FilterListBox.js +1 -1
  100. package/es/components/fields/FilterListBox/index.js +1 -1
  101. package/es/components/fields/FilterPicker/FilterPicker.js +1 -1
  102. package/es/components/fields/FilterPicker/index.js +1 -1
  103. package/es/components/fields/Input/Input.js +1 -1
  104. package/es/components/fields/Input/index.js +1 -1
  105. package/es/components/fields/ListBox/ListBox.js +1 -1
  106. package/es/components/fields/ListBox/index.js +1 -1
  107. package/es/components/fields/NumberInput/NumberInput.js +1 -1
  108. package/es/components/fields/NumberInput/StepButton.js +1 -1
  109. package/es/components/fields/PasswordInput/PasswordInput.js +1 -1
  110. package/es/components/fields/RadioGroup/Radio.js +1 -1
  111. package/es/components/fields/RadioGroup/RadioGroup.js +1 -1
  112. package/es/components/fields/RadioGroup/context.js +1 -1
  113. package/es/components/fields/RadioGroup/index.js +1 -1
  114. package/es/components/fields/SearchInput/SearchInput.js +1 -1
  115. package/es/components/fields/SearchInput/index.js +1 -1
  116. package/es/components/fields/Select/Select.js +1 -1
  117. package/es/components/fields/Select/index.js +1 -1
  118. package/es/components/fields/Slider/Gradation.js +1 -1
  119. package/es/components/fields/Slider/Header.js +1 -1
  120. package/es/components/fields/Slider/RangeSlider.js +1 -1
  121. package/es/components/fields/Slider/Slider.js +1 -1
  122. package/es/components/fields/Slider/SliderBase.js +1 -1
  123. package/es/components/fields/Slider/SliderInput.js +1 -1
  124. package/es/components/fields/Slider/SliderThumb.js +1 -1
  125. package/es/components/fields/Slider/SliderTrack.js +1 -1
  126. package/es/components/fields/Slider/elements.js +1 -1
  127. package/es/components/fields/Slider/index.js +1 -1
  128. package/es/components/fields/Slider/types.js +1 -1
  129. package/es/components/fields/Switch/Switch.js +1 -1
  130. package/es/components/fields/Switch/index.js +1 -1
  131. package/es/components/fields/TextArea/TextArea.js +1 -1
  132. package/es/components/fields/TextArea/index.js +1 -1
  133. package/es/components/fields/TextInput/TextInput.js +1 -1
  134. package/es/components/fields/TextInput/TextInputBase.js +3 -2
  135. package/es/components/fields/TextInput/index.js +1 -1
  136. package/es/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  137. package/es/components/fields/TextInputMapper/index.js +1 -1
  138. package/es/components/fields/index.js +1 -1
  139. package/es/components/form/FieldWrapper/FieldWrapper.js +1 -1
  140. package/es/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
  141. package/es/components/form/FieldWrapper/index.js +1 -1
  142. package/es/components/form/FieldWrapper/types.js +1 -1
  143. package/es/components/form/Form/Field.js +1 -1
  144. package/es/components/form/Form/Form.js +1 -1
  145. package/es/components/form/Form/ResetButton/ResetButton.js +1 -1
  146. package/es/components/form/Form/ResetButton/index.js +1 -1
  147. package/es/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  148. package/es/components/form/Form/SubmitButton/index.js +1 -1
  149. package/es/components/form/Form/SubmitError.js +1 -1
  150. package/es/components/form/Form/index.js +1 -1
  151. package/es/components/form/Form/types.js +1 -1
  152. package/es/components/form/Form/use-field/index.js +1 -1
  153. package/es/components/form/Form/use-field/types.js +1 -1
  154. package/es/components/form/Form/use-field/use-field-props.js +1 -1
  155. package/es/components/form/Form/use-field/use-field.js +1 -1
  156. package/es/components/form/Form/use-form.js +1 -1
  157. package/es/components/form/Form/validation.js +1 -1
  158. package/es/components/form/Label.js +1 -1
  159. package/es/components/form/index.js +1 -1
  160. package/es/components/form/wrapper.js +1 -1
  161. package/es/components/layout/Flex.js +1 -1
  162. package/es/components/layout/Flow.js +1 -1
  163. package/es/components/layout/Grid.js +1 -1
  164. package/es/components/layout/Panel.js +1 -1
  165. package/es/components/layout/Prefix.js +1 -1
  166. package/es/components/layout/ResizablePanel.js +1 -1
  167. package/es/components/layout/Space.js +1 -1
  168. package/es/components/layout/Suffix.js +1 -1
  169. package/es/components/navigation/LegacyTabs/LegacyTabs.js +1 -1
  170. package/es/components/navigation/Link/Link.js +1 -1
  171. package/es/components/organisms/FileTabs/FileTabs.js +1 -1
  172. package/es/components/organisms/Modal/Modal.js +1 -1
  173. package/es/components/organisms/StatsCard/StatsCard.js +1 -1
  174. package/es/components/other/Base64Upload/Base64Upload.js +1 -1
  175. package/es/components/other/Calendar/Calendar.js +1 -1
  176. package/es/components/other/Calendar/CalendarCell.js +1 -1
  177. package/es/components/other/Calendar/CalendarGrid.js +1 -1
  178. package/es/components/other/Calendar/RangeCalendar.js +1 -1
  179. package/es/components/other/CloudLogo/CloudLogo.js +1 -1
  180. package/es/components/overlays/AlertDialog/AlertDialog.js +1 -1
  181. package/es/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  182. package/es/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  183. package/es/components/overlays/AlertDialog/index.js +1 -1
  184. package/es/components/overlays/AlertDialog/types.js +1 -1
  185. package/es/components/overlays/Dialog/Dialog.js +1 -1
  186. package/es/components/overlays/Dialog/DialogContainer.js +1 -1
  187. package/es/components/overlays/Dialog/DialogForm.js +1 -1
  188. package/es/components/overlays/Dialog/DialogTrigger.js +1 -1
  189. package/es/components/overlays/Dialog/context.js +1 -1
  190. package/es/components/overlays/Dialog/index.js +1 -1
  191. package/es/components/overlays/Dialog/use-dialog-container.js +1 -1
  192. package/es/components/overlays/Modal/Modal.js +1 -1
  193. package/es/components/overlays/Modal/OpenTransition.js +1 -1
  194. package/es/components/overlays/Modal/Overlay.js +1 -1
  195. package/es/components/overlays/Modal/Popover.js +1 -1
  196. package/es/components/overlays/Modal/Tray.js +1 -1
  197. package/es/components/overlays/Modal/Underlay.js +1 -1
  198. package/es/components/overlays/Modal/index.js +1 -1
  199. package/es/components/overlays/Modal/types.js +1 -1
  200. package/es/components/overlays/NewNotifications/Bar/FloatingNotification.js +1 -1
  201. package/es/components/overlays/NewNotifications/Bar/NotificationsBar.js +1 -1
  202. package/es/components/overlays/NewNotifications/Bar/TransitionComponent.js +1 -1
  203. package/es/components/overlays/NewNotifications/Bar/index.js +1 -1
  204. package/es/components/overlays/NewNotifications/Dialog/NotificationsDialogTrigger.js +1 -1
  205. package/es/components/overlays/NewNotifications/Dialog/index.js +1 -1
  206. package/es/components/overlays/NewNotifications/Notification.js +1 -1
  207. package/es/components/overlays/NewNotifications/NotificationView/NotificationAction.js +1 -1
  208. package/es/components/overlays/NewNotifications/NotificationView/NotificationCloseButton.js +1 -1
  209. package/es/components/overlays/NewNotifications/NotificationView/NotificationDescription.js +1 -1
  210. package/es/components/overlays/NewNotifications/NotificationView/NotificationFooter.js +1 -1
  211. package/es/components/overlays/NewNotifications/NotificationView/NotificationHeader.js +1 -1
  212. package/es/components/overlays/NewNotifications/NotificationView/NotificationIcon.js +1 -1
  213. package/es/components/overlays/NewNotifications/NotificationView/NotificationProvider.js +1 -1
  214. package/es/components/overlays/NewNotifications/NotificationView/NotificationView.js +1 -1
  215. package/es/components/overlays/NewNotifications/NotificationView/index.js +1 -1
  216. package/es/components/overlays/NewNotifications/NotificationView/types.js +1 -1
  217. package/es/components/overlays/NewNotifications/NotificationsContext/NotificationsContext.js +1 -1
  218. package/es/components/overlays/NewNotifications/NotificationsContext/NotificationsProvider.js +1 -1
  219. package/es/components/overlays/NewNotifications/NotificationsContext/index.js +1 -1
  220. package/es/components/overlays/NewNotifications/NotificationsContext/use-notifications.js +1 -1
  221. package/es/components/overlays/NewNotifications/NotificationsList/NotificationsList.js +1 -1
  222. package/es/components/overlays/NewNotifications/NotificationsList/NotificationsListItem.js +1 -1
  223. package/es/components/overlays/NewNotifications/NotificationsList/index.js +1 -1
  224. package/es/components/overlays/NewNotifications/NotificationsList/types.js +1 -1
  225. package/es/components/overlays/NewNotifications/hooks/index.js +1 -1
  226. package/es/components/overlays/NewNotifications/hooks/types.js +1 -1
  227. package/es/components/overlays/NewNotifications/hooks/use-notification-list-item.js +1 -1
  228. package/es/components/overlays/NewNotifications/hooks/use-notifications-api.js +1 -1
  229. package/es/components/overlays/NewNotifications/hooks/use-notifications-list.js +1 -1
  230. package/es/components/overlays/NewNotifications/hooks/use-notifications-observer.js +1 -1
  231. package/es/components/overlays/NewNotifications/index.js +1 -1
  232. package/es/components/overlays/NewNotifications/types.js +1 -1
  233. package/es/components/overlays/Notification/Notification.js +1 -1
  234. package/es/components/overlays/OverlayWrapper.js +1 -1
  235. package/es/components/overlays/Toasts/Toast.js +1 -1
  236. package/es/components/overlays/Toasts/index.js +1 -1
  237. package/es/components/overlays/Toasts/types.js +1 -1
  238. package/es/components/overlays/Toasts/use-toasts-api.js +1 -1
  239. package/es/components/overlays/Tooltip/Tooltip.js +1 -1
  240. package/es/components/overlays/Tooltip/TooltipProvider.js +1 -1
  241. package/es/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  242. package/es/components/overlays/Tooltip/context.js +1 -1
  243. package/es/components/overlays/Tooltip/index.js +1 -1
  244. package/es/components/portal/Portal.js +1 -1
  245. package/es/components/portal/PortalProvider.js +1 -1
  246. package/es/components/portal/index.js +1 -1
  247. package/es/components/portal/types.js +1 -1
  248. package/es/components/portal/usePortal.js +1 -1
  249. package/es/components/shared/InvalidIcon.js +1 -1
  250. package/es/components/shared/ValidIcon.js +1 -1
  251. package/es/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  252. package/es/components/status/LoadingAnimation/index.js +1 -1
  253. package/es/components/status/Spin/Cube.js +1 -1
  254. package/es/components/status/Spin/InternalSpinner.js +1 -1
  255. package/es/components/status/Spin/Spin.js +1 -1
  256. package/es/components/status/Spin/SpinsContainer.js +1 -1
  257. package/es/components/status/Spin/index.js +1 -1
  258. package/es/components/status/Spin/types.js +1 -1
  259. package/es/components/status/index.js +1 -1
  260. package/es/data/item-themes.js +1 -1
  261. package/es/data/themes.js +1 -1
  262. package/es/icons/AdjustmentsHorizontalIcon.js +1 -1
  263. package/es/icons/AdjustmentsIcon.js +1 -1
  264. package/es/icons/AiIcon.js +1 -1
  265. package/es/icons/AreaChartIcon.js +1 -1
  266. package/es/icons/BackwardIcon.js +1 -1
  267. package/es/icons/BarChartIcon.js +1 -1
  268. package/es/icons/BellFilledIcon.js +1 -1
  269. package/es/icons/BellIcon.js +1 -1
  270. package/es/icons/BooleanIcon.js +1 -1
  271. package/es/icons/CalendarEditIcon.js +1 -1
  272. package/es/icons/CalendarIcon.js +1 -1
  273. package/es/icons/CaretDownIcon.js +1 -1
  274. package/es/icons/CaretUpIcon.js +1 -1
  275. package/es/icons/ChartAreaStackedIcon.js +1 -1
  276. package/es/icons/ChartAreaStackedPercentageIcon.js +1 -1
  277. package/es/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  278. package/es/icons/ChartBarGroupedIcon.js +1 -1
  279. package/es/icons/ChartBarHorizontalIcon.js +1 -1
  280. package/es/icons/ChartBarLineIcon.js +1 -1
  281. package/es/icons/ChartBarStackedHorizontalIcon.js +1 -1
  282. package/es/icons/ChartBarStackedIcon.js +1 -1
  283. package/es/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  284. package/es/icons/ChartBarStackedPercentageIcon.js +1 -1
  285. package/es/icons/ChartBoxPlot2Icon.js +1 -1
  286. package/es/icons/ChartBoxPlotIcon.js +1 -1
  287. package/es/icons/ChartBubbleIcon.js +1 -1
  288. package/es/icons/ChartDonut2Icon.js +1 -1
  289. package/es/icons/ChartFunnelIcon.js +1 -1
  290. package/es/icons/ChartKPIIcon.js +1 -1
  291. package/es/icons/ChartPie2Icon.js +1 -1
  292. package/es/icons/ChartScatterIcon.js +1 -1
  293. package/es/icons/CheckCircleFilledIcon.js +1 -1
  294. package/es/icons/CheckCircleIcon.js +1 -1
  295. package/es/icons/CheckIcon.js +1 -1
  296. package/es/icons/CircleFilledIcon.js +1 -1
  297. package/es/icons/ClearIcon.js +1 -1
  298. package/es/icons/CloseCircleFilledIcon.js +1 -1
  299. package/es/icons/CloseCircleIcon.js +1 -1
  300. package/es/icons/CloseIcon.js +1 -1
  301. package/es/icons/CodeIcon.js +1 -1
  302. package/es/icons/CopyIcon.js +1 -1
  303. package/es/icons/CountIcon.js +1 -1
  304. package/es/icons/CubeIcon.js +1 -1
  305. package/es/icons/DangerIcon.js +1 -1
  306. package/es/icons/DashboardIcon.js +1 -1
  307. package/es/icons/DatabaseIcon.js +1 -1
  308. package/es/icons/DirectionIcon.js +1 -1
  309. package/es/icons/DonutIcon.js +1 -1
  310. package/es/icons/DownIcon.js +1 -1
  311. package/es/icons/EditIcon.js +1 -1
  312. package/es/icons/ExclamationCircleFilledIcon.js +1 -1
  313. package/es/icons/ExclamationCircleIcon.js +1 -1
  314. package/es/icons/ExclamationIcon.js +1 -1
  315. package/es/icons/EyeIcon.js +1 -1
  316. package/es/icons/EyeInvisibleIcon.js +1 -1
  317. package/es/icons/FilterIcon.js +1 -1
  318. package/es/icons/FolderFilledIcon.js +1 -1
  319. package/es/icons/FolderIcon.js +1 -1
  320. package/es/icons/FolderOpenFilledIcon.js +1 -1
  321. package/es/icons/FolderOpenIcon.js +1 -1
  322. package/es/icons/ForwardIcon.js +1 -1
  323. package/es/icons/HierarchyIcon.js +1 -1
  324. package/es/icons/Icon.js +1 -1
  325. package/es/icons/InfoCircleIcon.js +1 -1
  326. package/es/icons/InfoIcon.js +1 -1
  327. package/es/icons/KeyIcon.js +1 -1
  328. package/es/icons/LeftIcon.js +1 -1
  329. package/es/icons/LineChartIcon.js +1 -1
  330. package/es/icons/LoadingIcon.js +1 -1
  331. package/es/icons/LockFilledIcon.js +1 -1
  332. package/es/icons/LockIcon.js +1 -1
  333. package/es/icons/MoreIcon.js +1 -1
  334. package/es/icons/NotAllowedIcon.js +1 -1
  335. package/es/icons/NumberIcon.js +1 -1
  336. package/es/icons/PauseCircleFilledIcon.js +1 -1
  337. package/es/icons/PauseCircleIcon.js +1 -1
  338. package/es/icons/PauseIcon.js +1 -1
  339. package/es/icons/PieChartIcon.js +1 -1
  340. package/es/icons/PlayCircleIcon.js +1 -1
  341. package/es/icons/PlayIcon.js +1 -1
  342. package/es/icons/PlusIcon.js +1 -1
  343. package/es/icons/ReloadIcon.js +1 -1
  344. package/es/icons/ReportIcon.js +1 -1
  345. package/es/icons/ReturnIcon.js +1 -1
  346. package/es/icons/RightIcon.js +1 -1
  347. package/es/icons/SchemeIcon.js +1 -1
  348. package/es/icons/SearchIcon.js +1 -1
  349. package/es/icons/SettingsIcon.js +1 -1
  350. package/es/icons/ShieldFilledIcon.js +1 -1
  351. package/es/icons/ShieldIcon.js +1 -1
  352. package/es/icons/SlashIcon.js +1 -1
  353. package/es/icons/SparklesIcon.js +1 -1
  354. package/es/icons/SqlIcon.js +1 -1
  355. package/es/icons/StatsIcon.js +1 -1
  356. package/es/icons/StopIcon.js +1 -1
  357. package/es/icons/StringIcon.js +1 -1
  358. package/es/icons/SwitchIcon.js +1 -1
  359. package/es/icons/TableIcon.js +1 -1
  360. package/es/icons/ThumbsDownIcon.js +1 -1
  361. package/es/icons/ThumbsUpIcon.js +1 -1
  362. package/es/icons/ThunderboltCrossedIcon.js +1 -1
  363. package/es/icons/ThunderboltFilledIcon.js +1 -1
  364. package/es/icons/ThunderboltIcon.js +1 -1
  365. package/es/icons/TimeIcon.js +1 -1
  366. package/es/icons/UnlockIcon.js +1 -1
  367. package/es/icons/UpIcon.js +1 -1
  368. package/es/icons/UserGroupIcon.js +1 -1
  369. package/es/icons/UserIcon.js +1 -1
  370. package/es/icons/UserLockIcon.js +1 -1
  371. package/es/icons/ViewIcon.js +1 -1
  372. package/es/icons/WarningFilledIcon.js +1 -1
  373. package/es/icons/WarningIcon.js +1 -1
  374. package/es/icons/add-new-icon.js +1 -1
  375. package/es/icons/index.js +1 -1
  376. package/es/icons/wrap-icon.js +1 -1
  377. package/es/index.js +1 -1
  378. package/es/provider.js +1 -1
  379. package/es/providers/TrackingProvider.js +1 -1
  380. package/es/services/notification.js +1 -1
  381. package/es/shared/form.js +1 -1
  382. package/es/shared/index.js +1 -1
  383. package/es/stories/Form.legacy-stories.js +1 -1
  384. package/es/stories/FormFieldArgs.js +1 -1
  385. package/es/stories/Layout.stories.js +1 -1
  386. package/es/stories/Tasty.stories.js +1 -1
  387. package/es/stories/components/ConfirmDeletionDialogForm.js +1 -1
  388. package/es/stories/components/DialogFormApp.js +1 -1
  389. package/es/stories/components/StyledButton.js +1 -1
  390. package/es/stories/lists/baseProps.js +1 -2
  391. package/es/tasty/debug.js +572 -0
  392. package/es/tasty/index.js +3 -1
  393. package/es/tasty/injector/flatten.js +350 -0
  394. package/es/tasty/injector/index.js +165 -0
  395. package/es/tasty/injector/injector.js +336 -0
  396. package/es/tasty/injector/sheet-manager.js +737 -0
  397. package/es/tasty/injector/types.js +10 -0
  398. package/es/tasty/parser/classify.js +1 -1
  399. package/es/tasty/parser/const.js +1 -1
  400. package/es/tasty/parser/lru.js +38 -2
  401. package/es/tasty/parser/parser.js +1 -1
  402. package/es/tasty/parser/tokenizer.js +1 -1
  403. package/es/tasty/parser/types.js +1 -1
  404. package/es/tasty/providers/BreakpointsProvider.js +1 -1
  405. package/es/tasty/styles/align.js +1 -1
  406. package/es/tasty/styles/border.js +1 -1
  407. package/es/tasty/styles/boxShadow.combinator.js +1 -1
  408. package/es/tasty/styles/color.js +8 -12
  409. package/es/tasty/styles/createStyle.js +3 -3
  410. package/es/tasty/styles/dimension.js +1 -1
  411. package/es/tasty/styles/display.js +1 -1
  412. package/es/tasty/styles/fade.js +1 -1
  413. package/es/tasty/styles/fill.js +6 -8
  414. package/es/tasty/styles/flow.js +1 -1
  415. package/es/tasty/styles/font.js +1 -1
  416. package/es/tasty/styles/fontStyle.js +1 -1
  417. package/es/tasty/styles/gap.js +1 -1
  418. package/es/tasty/styles/groupRadius.js +1 -1
  419. package/es/tasty/styles/height.js +1 -1
  420. package/es/tasty/styles/index.js +1 -1
  421. package/es/tasty/styles/inset.js +1 -1
  422. package/es/tasty/styles/justify.js +1 -1
  423. package/es/tasty/styles/list.js +1 -1
  424. package/es/tasty/styles/margin.js +1 -1
  425. package/es/tasty/styles/marginBlock.js +1 -1
  426. package/es/tasty/styles/marginInline.js +1 -1
  427. package/es/tasty/styles/outline.js +1 -1
  428. package/es/tasty/styles/padding.js +1 -1
  429. package/es/tasty/styles/paddingBlock.js +1 -1
  430. package/es/tasty/styles/paddingInline.js +1 -1
  431. package/es/tasty/styles/place.js +1 -1
  432. package/es/tasty/styles/predefined.js +1 -3
  433. package/es/tasty/styles/preset.js +1 -1
  434. package/es/tasty/styles/radius.js +1 -1
  435. package/es/tasty/styles/reset.js +40 -44
  436. package/es/tasty/styles/scrollbar.js +1 -1
  437. package/es/tasty/styles/shadow.js +1 -1
  438. package/es/tasty/styles/styledScrollbar.js +1 -1
  439. package/es/tasty/styles/transition.js +1 -1
  440. package/es/tasty/styles/types.js +1 -1
  441. package/es/tasty/styles/width.js +1 -1
  442. package/es/tasty/tasty.js +92 -19
  443. package/es/tasty/types.js +1 -1
  444. package/es/tasty/utils/cache-wrapper.js +1 -1
  445. package/es/tasty/utils/case-converter.js +1 -1
  446. package/es/tasty/utils/colors.js +1 -1
  447. package/es/tasty/utils/dotize.js +1 -1
  448. package/es/tasty/utils/filterBaseProps.js +1 -1
  449. package/es/tasty/utils/getDisplayName.js +1 -1
  450. package/es/tasty/utils/getModCombinations.js +1 -1
  451. package/es/tasty/utils/mergeStyles.js +1 -1
  452. package/es/tasty/utils/modAttrs.js +1 -1
  453. package/es/tasty/utils/renderStyles.js +789 -57
  454. package/es/tasty/utils/responsive.js +1 -1
  455. package/es/tasty/utils/string.js +1 -1
  456. package/es/tasty/utils/styles.js +3 -62
  457. package/es/tasty/utils/warnings.js +1 -1
  458. package/es/tokens.js +1 -1
  459. package/es/type-checks.js +1 -1
  460. package/es/utils/ResizeSensor.js +1 -1
  461. package/es/utils/modules.js +1 -1
  462. package/es/utils/promise.js +1 -1
  463. package/es/utils/random.js +1 -1
  464. package/es/utils/range.js +1 -1
  465. package/es/utils/react/Slots.js +1 -1
  466. package/es/utils/react/chain.js +1 -1
  467. package/es/utils/react/forwardRefWithGenerics.js +1 -1
  468. package/es/utils/react/index.js +1 -1
  469. package/es/utils/react/interactions.js +1 -1
  470. package/es/utils/react/isTextOnly.js +1 -1
  471. package/es/utils/react/mapProps.js +1 -1
  472. package/es/utils/react/mergeProps.js +1 -1
  473. package/es/utils/react/nullableValue.js +1 -1
  474. package/es/utils/react/sharedStore.js +1 -1
  475. package/es/utils/react/useCombinedRefs.js +1 -1
  476. package/es/utils/react/useControlledFocusVisible.js +1 -1
  477. package/es/utils/react/useEventBus.js +1 -1
  478. package/es/utils/react/useId.js +1 -1
  479. package/es/utils/react/useIsDarwin.js +1 -1
  480. package/es/utils/react/useKeySymbols.js +1 -1
  481. package/es/utils/react/useLayoutEffect.js +1 -1
  482. package/es/utils/react/useQaProps.js +1 -1
  483. package/es/utils/react/useViewportSize.js +1 -1
  484. package/es/utils/react/wrapNodeIfPlain.js +1 -1
  485. package/es/utils/transitions.js +1 -1
  486. package/es/utils/tree.js +1 -1
  487. package/es/utils/warnings.js +1 -1
  488. package/es/version.js +2 -2
  489. package/package.json +1 -1
  490. package/types/components/actions/Button/Button.d.ts +1 -0
  491. package/types/components/actions/Menu/styled.d.ts +699 -702
  492. package/types/components/actions/use-action.d.ts +1 -1
  493. package/types/components/content/List/SectionHeading.d.ts +233 -234
  494. package/types/components/fields/DatePicker/DatePickerElement.d.ts +233 -234
  495. package/types/tasty/debug.d.ts +133 -0
  496. package/types/tasty/index.d.ts +2 -0
  497. package/types/tasty/injector/flatten.d.ts +16 -0
  498. package/types/tasty/injector/index.d.ts +64 -0
  499. package/types/tasty/injector/injector.d.ts +82 -0
  500. package/types/tasty/injector/sheet-manager.d.ts +105 -0
  501. package/types/tasty/injector/types.d.ts +105 -0
  502. package/types/tasty/parser/lru.d.ts +5 -1
  503. package/types/tasty/styles/color.d.ts +3 -1
  504. package/types/tasty/styles/reset.d.ts +1 -2
  505. package/types/tasty/types.d.ts +0 -2
  506. package/types/tasty/utils/renderStyles.d.ts +25 -7
  507. package/types/tasty/utils/styles.d.ts +1 -9
@@ -0,0 +1,737 @@
1
+ /**
2
+ * @license MIT
3
+ * author: Cube Dev Team
4
+ * @cube-dev/ui-kit v0.0.0-canary-7f29fb4
5
+ * Released under the MIT license.
6
+ */
7
+
8
+ export class SheetManager {
9
+ rootRegistries = new WeakMap();
10
+ config;
11
+ constructor(config) {
12
+ this.config = config;
13
+ }
14
+ /**
15
+ * Get or create registry for a root (Document or ShadowRoot)
16
+ */
17
+ getRegistry(root) {
18
+ let registry = this.rootRegistries.get(root);
19
+ if (!registry) {
20
+ const metrics = this.config.collectMetrics
21
+ ? {
22
+ hits: 0,
23
+ misses: 0,
24
+ unusedHits: 0,
25
+ bulkCleanups: 0,
26
+ totalInsertions: 0,
27
+ totalUnused: 0,
28
+ stylesCleanedUp: 0,
29
+ startTime: Date.now(),
30
+ }
31
+ : undefined;
32
+ registry = {
33
+ sheets: [],
34
+ refCounts: new Map(),
35
+ rules: new Map(),
36
+ unusedRules: new Map(),
37
+ ruleTextSet: new Set(),
38
+ bulkCleanupTimeout: null,
39
+ metrics,
40
+ classCounter: 0,
41
+ batchedRules: new Map(),
42
+ batchedRuleMeta: new Map(),
43
+ classToBatchedKeys: new Map(),
44
+ unusedBatchedClasses: new Set(),
45
+ };
46
+ this.rootRegistries.set(root, registry);
47
+ }
48
+ return registry;
49
+ }
50
+ /**
51
+ * Create a new stylesheet for the registry
52
+ */
53
+ createSheet(registry, root) {
54
+ const sheet = this.createStyleElement(root);
55
+ const sheetInfo = {
56
+ sheet,
57
+ ruleCount: 0,
58
+ holes: [],
59
+ };
60
+ registry.sheets.push(sheetInfo);
61
+ return sheetInfo;
62
+ }
63
+ /**
64
+ * Create a style element and append to document
65
+ */
66
+ createStyleElement(root) {
67
+ const style = root.createElement?.('style') ||
68
+ document.createElement('style');
69
+ if (this.config.nonce) {
70
+ style.nonce = this.config.nonce;
71
+ }
72
+ style.setAttribute('data-tasty', '');
73
+ // Append to head or shadow root
74
+ if ('head' in root && root.head) {
75
+ root.head.appendChild(style);
76
+ }
77
+ else if ('appendChild' in root) {
78
+ root.appendChild(style);
79
+ }
80
+ else {
81
+ document.head.appendChild(style);
82
+ }
83
+ // Verify it was actually added - log only if there's a problem and we're not using forceTextInjection
84
+ if (!style.isConnected && !this.config.forceTextInjection) {
85
+ console.error('SheetManager: Style element failed to connect to DOM!', {
86
+ parentNode: style.parentNode?.nodeName,
87
+ isConnected: style.isConnected,
88
+ });
89
+ }
90
+ return style;
91
+ }
92
+ /**
93
+ * Insert CSS rules as a single block
94
+ */
95
+ insertRule(registry, flattenedRules, className, root) {
96
+ try {
97
+ // Pre-merge identical selector+atRules declarations within the same class
98
+ const groupedRules = [];
99
+ const groupMap = new Map();
100
+ const atKey = (at) => (at && at.length ? at.join('|') : '');
101
+ for (const r of flattenedRules) {
102
+ const key = `${atKey(r.atRules)}||${r.selector}`;
103
+ const existing = groupMap.get(key);
104
+ if (existing) {
105
+ existing.rule.declarations = `${existing.rule.declarations} ${r.declarations}`;
106
+ }
107
+ else {
108
+ const clone = { ...r };
109
+ groupMap.set(key, { idx: groupedRules.length, rule: clone });
110
+ groupedRules.push(clone);
111
+ }
112
+ }
113
+ // Ensure registry maps exist for this class
114
+ if (!registry.classToBatchedKeys.has(className)) {
115
+ registry.classToBatchedKeys.set(className, new Set());
116
+ }
117
+ // Apply batching per grouped rule
118
+ for (const rule of groupedRules) {
119
+ const normalizedDecl = this.normalizeDeclarations(rule.declarations);
120
+ const { selectorTemplate } = this.makeSelectorTemplate(rule.selector, className);
121
+ const batchKey = this.getBatchKey(rule.atRules, selectorTemplate, normalizedDecl);
122
+ // Record meta
123
+ if (!registry.batchedRuleMeta.has(batchKey)) {
124
+ registry.batchedRuleMeta.set(batchKey, {
125
+ selectorTemplate,
126
+ declarations: normalizedDecl,
127
+ atRules: rule.atRules && rule.atRules.length
128
+ ? [...rule.atRules]
129
+ : undefined,
130
+ });
131
+ }
132
+ // Link class -> batch keys
133
+ registry.classToBatchedKeys.get(className).add(batchKey);
134
+ const existingEntry = registry.batchedRules.get(batchKey);
135
+ if (existingEntry) {
136
+ if (!existingEntry.classNames.has(className)) {
137
+ existingEntry.classNames.add(className);
138
+ this.updateBatchedRuleCss(registry, existingEntry, root);
139
+ }
140
+ // Unmark class as unused if it was marked
141
+ if (registry.unusedBatchedClasses.has(className)) {
142
+ registry.unusedBatchedClasses.delete(className);
143
+ }
144
+ continue;
145
+ }
146
+ // Check if this exact rule already exists as a non-batched rule in any sheet
147
+ // and convert it to a batched rule instead of duplicating
148
+ const existingClassWithSameRule = this.findClassWithIdenticalRule(registry, batchKey, className);
149
+ if (existingClassWithSameRule) {
150
+ // Convert existing rule to batched and add current class
151
+ this.convertToBatchedRule(registry, existingClassWithSameRule, className, batchKey, root);
152
+ continue;
153
+ }
154
+ // Need to create a new CSS rule for this batch key
155
+ const { sheet, sheetIndex, ruleIndex } = this.ensureTargetSheetAndIndex(registry, root);
156
+ const entry = {
157
+ key: batchKey,
158
+ selectorTemplate,
159
+ declarations: normalizedDecl,
160
+ atRules: rule.atRules && rule.atRules.length ? [...rule.atRules] : undefined,
161
+ classNames: new Set([className]),
162
+ sheetIndex,
163
+ ruleIndex,
164
+ };
165
+ const cssText = this.composeCssForEntry(entry);
166
+ const styleElement = sheet.sheet;
167
+ const styleSheet = styleElement.sheet;
168
+ if (styleSheet && !this.config.forceTextInjection) {
169
+ const maxIndex = styleSheet.cssRules.length;
170
+ const safeIndex = Math.min(Math.max(0, ruleIndex), maxIndex);
171
+ styleSheet.insertRule(cssText, safeIndex);
172
+ }
173
+ else {
174
+ styleElement.textContent =
175
+ (styleElement.textContent || '') + '\n' + cssText;
176
+ entry.currentCssText = cssText;
177
+ }
178
+ // Update bookkeeping
179
+ sheet.ruleCount = Math.max(sheet.ruleCount, ruleIndex + 1);
180
+ registry.batchedRules.set(batchKey, entry);
181
+ if (registry.metrics) {
182
+ registry.metrics.totalInsertions++;
183
+ }
184
+ }
185
+ // For batched insertion, we don't create per-class RuleInfo ranges anymore
186
+ return {
187
+ className,
188
+ ruleIndex: -1,
189
+ sheetIndex: -1,
190
+ cssText: [],
191
+ };
192
+ }
193
+ catch (error) {
194
+ console.warn('Failed to insert CSS rules (batched):', error, {
195
+ flattenedRules,
196
+ className,
197
+ });
198
+ return null;
199
+ }
200
+ }
201
+ /**
202
+ * Insert global CSS rules
203
+ */
204
+ insertGlobalRule(registry, flattenedRules, className, root) {
205
+ // For now, global rules are handled the same way as regular rules
206
+ return this.insertRule(registry, flattenedRules, className, root);
207
+ }
208
+ /**
209
+ * Delete a CSS rule from the sheet
210
+ */
211
+ deleteRule(registry, ruleInfo) {
212
+ const sheet = registry.sheets[ruleInfo.sheetIndex];
213
+ if (!sheet) {
214
+ return;
215
+ }
216
+ try {
217
+ const texts = Array.isArray(ruleInfo.cssText)
218
+ ? ruleInfo.cssText.slice()
219
+ : [];
220
+ const styleElement = sheet.sheet;
221
+ const styleSheet = styleElement.sheet;
222
+ if (styleSheet) {
223
+ const rules = styleSheet.cssRules;
224
+ // Prefer index-based deletion when possible
225
+ const startIdx = Math.max(0, ruleInfo.ruleIndex);
226
+ const endIdx = Math.min(rules.length - 1, Number.isFinite(ruleInfo.endRuleIndex)
227
+ ? ruleInfo.endRuleIndex
228
+ : startIdx - 1);
229
+ if (Number.isFinite(startIdx) && endIdx >= startIdx) {
230
+ for (let idx = endIdx; idx >= startIdx; idx--) {
231
+ if (idx < 0 || idx >= styleSheet.cssRules.length)
232
+ continue;
233
+ styleSheet.deleteRule(idx);
234
+ }
235
+ sheet.ruleCount = Math.max(0, sheet.ruleCount - (endIdx - startIdx + 1));
236
+ }
237
+ else if (this.config.debugMode && texts.length) {
238
+ // Fallback: locate each rule by exact cssText and delete (debug mode only)
239
+ for (const text of texts) {
240
+ let idx = -1;
241
+ for (let i = styleSheet.cssRules.length - 1; i >= 0; i--) {
242
+ if (styleSheet.cssRules[i].cssText === text) {
243
+ idx = i;
244
+ break;
245
+ }
246
+ }
247
+ if (idx >= 0) {
248
+ styleSheet.deleteRule(idx);
249
+ }
250
+ }
251
+ sheet.ruleCount = Math.max(0, sheet.ruleCount - texts.length);
252
+ }
253
+ }
254
+ // Remove texts from validation set
255
+ if (this.config.debugMode) {
256
+ try {
257
+ for (const text of texts) {
258
+ registry.ruleTextSet.delete(text);
259
+ }
260
+ }
261
+ catch (_) {
262
+ // noop
263
+ }
264
+ }
265
+ }
266
+ catch (error) {
267
+ console.warn('Failed to delete CSS rule:', error);
268
+ }
269
+ }
270
+ /**
271
+ * Find a sheet with available space or return null
272
+ */
273
+ findAvailableSheet(registry, root) {
274
+ const maxRules = this.config.maxRulesPerSheet;
275
+ if (!maxRules) {
276
+ // No limit, use the last sheet if it exists
277
+ const lastSheet = registry.sheets[registry.sheets.length - 1];
278
+ return lastSheet || null;
279
+ }
280
+ // Find sheet with space
281
+ for (const sheet of registry.sheets) {
282
+ if (sheet.ruleCount < maxRules) {
283
+ return sheet;
284
+ }
285
+ }
286
+ return null; // No available sheet found
287
+ }
288
+ /**
289
+ * Find an available rule index in the sheet
290
+ */
291
+ findAvailableRuleIndex(sheet) {
292
+ // Always append to the end - CSS doesn't have holes
293
+ return sheet.ruleCount;
294
+ }
295
+ /**
296
+ * Mark a ruleset as unused but keep it in the stylesheet
297
+ */
298
+ markAsUnused(registry, className) {
299
+ // If this class participates in batched rules, just mark it as unused
300
+ const keys = registry.classToBatchedKeys.get(className);
301
+ if (keys && keys.size) {
302
+ registry.unusedBatchedClasses.add(className);
303
+ registry.refCounts.delete(className);
304
+ if (registry.metrics) {
305
+ registry.metrics.totalUnused++;
306
+ }
307
+ // Schedule cleanup when we have enough unused classes
308
+ const threshold = this.config.unusedStylesThreshold || 500;
309
+ if (registry.unusedBatchedClasses.size >= threshold) {
310
+ this.scheduleBulkCleanup(registry);
311
+ }
312
+ return; // handled via batched path
313
+ }
314
+ // Fallback to legacy unused path for non-batched rules
315
+ const ruleInfo = registry.rules.get(className);
316
+ if (!ruleInfo)
317
+ return;
318
+ const unusedInfo = {
319
+ ruleInfo,
320
+ markedUnusedAt: Date.now(),
321
+ };
322
+ registry.unusedRules.set(className, unusedInfo);
323
+ registry.refCounts.delete(className);
324
+ if (registry.metrics) {
325
+ registry.metrics.totalUnused++;
326
+ }
327
+ const threshold = this.config.unusedStylesThreshold || 500;
328
+ if (registry.unusedRules.size >= threshold) {
329
+ this.scheduleBulkCleanup(registry);
330
+ }
331
+ }
332
+ /**
333
+ * Restore a ruleset from unused styles
334
+ */
335
+ restoreFromUnused(registry, className) {
336
+ const unusedInfo = registry.unusedRules.get(className);
337
+ if (!unusedInfo)
338
+ return null;
339
+ // Remove from unused rules (rules stays in registry.rules)
340
+ registry.unusedRules.delete(className);
341
+ registry.refCounts.set(className, 1);
342
+ // Update metrics
343
+ if (registry.metrics) {
344
+ registry.metrics.unusedHits++;
345
+ }
346
+ return unusedInfo.ruleInfo;
347
+ }
348
+ /**
349
+ * Schedule bulk cleanup of all unused styles
350
+ */
351
+ scheduleBulkCleanup(registry) {
352
+ // Don't schedule if already scheduled
353
+ if (registry.bulkCleanupTimeout)
354
+ return;
355
+ const performCleanup = () => {
356
+ this.performBulkCleanup(registry);
357
+ registry.bulkCleanupTimeout = null;
358
+ };
359
+ if (this.config.idleCleanup && typeof requestIdleCallback !== 'undefined') {
360
+ registry.bulkCleanupTimeout = requestIdleCallback(performCleanup);
361
+ }
362
+ else {
363
+ const delay = this.config.bulkCleanupDelay || 5000;
364
+ registry.bulkCleanupTimeout = setTimeout(performCleanup, delay);
365
+ }
366
+ }
367
+ /**
368
+ * Perform bulk cleanup of all unused styles
369
+ */
370
+ performBulkCleanup(registry) {
371
+ let cleanedUpCount = 0;
372
+ // Handle legacy unused rules
373
+ if (registry.unusedRules.size > 0) {
374
+ const classNamesToCleanup = Array.from(registry.unusedRules.keys());
375
+ // Group by sheet for efficient deletion
376
+ const rulesBySheet = new Map();
377
+ for (const className of classNamesToCleanup) {
378
+ const unusedInfo = registry.unusedRules.get(className);
379
+ if (!unusedInfo)
380
+ continue;
381
+ const sheetIndex = unusedInfo.ruleInfo.sheetIndex;
382
+ if (!rulesBySheet.has(sheetIndex)) {
383
+ rulesBySheet.set(sheetIndex, []);
384
+ }
385
+ rulesBySheet
386
+ .get(sheetIndex)
387
+ .push({ className, ruleInfo: unusedInfo.ruleInfo });
388
+ }
389
+ // Delete rules from each sheet (in reverse order to preserve indices)
390
+ for (const [sheetIndex, rulesInSheet] of rulesBySheet) {
391
+ // Sort by rule index in descending order for safe deletion
392
+ rulesInSheet.sort((a, b) => b.ruleInfo.ruleIndex - a.ruleInfo.ruleIndex);
393
+ for (const { className, ruleInfo } of rulesInSheet) {
394
+ this.deleteRule(registry, ruleInfo);
395
+ registry.rules.delete(className);
396
+ registry.unusedRules.delete(className);
397
+ cleanedUpCount++;
398
+ }
399
+ }
400
+ }
401
+ // Handle batched unused classes
402
+ if (registry.unusedBatchedClasses.size > 0) {
403
+ cleanedUpCount += this.cleanupBatchedUnusedClasses(registry);
404
+ }
405
+ // Update metrics
406
+ if (registry.metrics) {
407
+ registry.metrics.bulkCleanups++;
408
+ registry.metrics.stylesCleanedUp += cleanedUpCount;
409
+ }
410
+ }
411
+ /**
412
+ * Clean up unused classes from batched rules
413
+ */
414
+ cleanupBatchedUnusedClasses(registry) {
415
+ const unusedClasses = Array.from(registry.unusedBatchedClasses);
416
+ let cleanedUpCount = 0;
417
+ for (const className of unusedClasses) {
418
+ const keys = registry.classToBatchedKeys.get(className);
419
+ if (!keys)
420
+ continue;
421
+ for (const key of keys) {
422
+ const entry = registry.batchedRules.get(key);
423
+ if (!entry)
424
+ continue;
425
+ // Remove class from the batched rule
426
+ entry.classNames.delete(className);
427
+ if (entry.classNames.size === 0) {
428
+ // Remove the entire batched rule if no classes left
429
+ this.removeBatchedEntry(registry, entry);
430
+ registry.batchedRules.delete(key);
431
+ }
432
+ else {
433
+ // Update the CSS to remove this class from the selector
434
+ this.updateBatchedRuleCss(registry, entry, document);
435
+ }
436
+ }
437
+ // Clean up the class mappings
438
+ registry.classToBatchedKeys.delete(className);
439
+ registry.unusedBatchedClasses.delete(className);
440
+ cleanedUpCount++;
441
+ }
442
+ return cleanedUpCount;
443
+ }
444
+ /**
445
+ * Process the deletion queue for cleanup
446
+ */
447
+ processCleanupQueue(registry) {
448
+ // This method is kept for compatibility but the logic has changed
449
+ // We no longer use a deletion queue, instead marking styles as unused immediately
450
+ }
451
+ /**
452
+ * Get total number of rules across all sheets
453
+ */
454
+ getTotalRuleCount(registry) {
455
+ return registry.sheets.reduce((total, sheet) => total + sheet.ruleCount - sheet.holes.length, 0);
456
+ }
457
+ /**
458
+ * Get CSS text from all sheets (for SSR)
459
+ */
460
+ getCssText(registry) {
461
+ const cssChunks = [];
462
+ for (const sheet of registry.sheets) {
463
+ try {
464
+ const styleElement = sheet.sheet;
465
+ if (styleElement.textContent) {
466
+ cssChunks.push(styleElement.textContent);
467
+ }
468
+ else if (styleElement.sheet) {
469
+ const rules = Array.from(styleElement.sheet.cssRules);
470
+ cssChunks.push(rules.map((rule) => rule.cssText).join('\n'));
471
+ }
472
+ }
473
+ catch (error) {
474
+ console.warn('Failed to read CSS from sheet:', error);
475
+ }
476
+ }
477
+ return cssChunks.join('\n');
478
+ }
479
+ /**
480
+ * Get cache performance metrics
481
+ */
482
+ getMetrics(registry) {
483
+ return registry.metrics || null;
484
+ }
485
+ /**
486
+ * Reset cache performance metrics
487
+ */
488
+ resetMetrics(registry) {
489
+ if (registry.metrics) {
490
+ registry.metrics = {
491
+ hits: 0,
492
+ misses: 0,
493
+ unusedHits: 0,
494
+ bulkCleanups: 0,
495
+ totalInsertions: 0,
496
+ totalUnused: 0,
497
+ stylesCleanedUp: 0,
498
+ startTime: Date.now(),
499
+ };
500
+ }
501
+ }
502
+ /**
503
+ * Clean up resources for a root
504
+ */
505
+ cleanup(root) {
506
+ const registry = this.rootRegistries.get(root);
507
+ if (!registry) {
508
+ return;
509
+ }
510
+ // Cancel any scheduled bulk cleanup
511
+ if (registry.bulkCleanupTimeout) {
512
+ if (this.config.idleCleanup &&
513
+ typeof cancelIdleCallback !== 'undefined') {
514
+ cancelIdleCallback(registry.bulkCleanupTimeout);
515
+ }
516
+ else {
517
+ clearTimeout(registry.bulkCleanupTimeout);
518
+ }
519
+ registry.bulkCleanupTimeout = null;
520
+ }
521
+ // Remove all sheets
522
+ for (const sheet of registry.sheets) {
523
+ try {
524
+ // Remove style element
525
+ const styleElement = sheet.sheet;
526
+ if (styleElement.parentNode) {
527
+ styleElement.parentNode.removeChild(styleElement);
528
+ }
529
+ }
530
+ catch (error) {
531
+ console.warn('Failed to cleanup sheet:', error);
532
+ }
533
+ }
534
+ // Clear registry
535
+ this.rootRegistries.delete(root);
536
+ }
537
+ /** Normalize declaration list by sorting properties for stable keys */
538
+ normalizeDeclarations(declarations) {
539
+ return declarations
540
+ .split(';')
541
+ .map((d) => d.trim())
542
+ .filter(Boolean)
543
+ .sort((a, b) => a.localeCompare(b))
544
+ .join(';');
545
+ }
546
+ /** Build selector template normalizing class references to placeholders.
547
+ * Rules:
548
+ * - Replace any occurrence of :is(.class[, .class]*) with :is(__CLASS__)
549
+ * - If starts with .<name>.<name>, replace with __CLASS__.__CLASS__ (legacy specificity)
550
+ * - Else if starts with .<name>, replace with __CLASS__
551
+ */
552
+ makeSelectorTemplate(selector, className) {
553
+ // Normalize any :is(.tX, .tY) occurrences first
554
+ const isClassList = /:is\(\s*\.[A-Za-z0-9_-]+(?:\s*,\s*\.[A-Za-z0-9_-]+)*\s*\)/g;
555
+ let normalized = selector.replace(isClassList, ':is(__CLASS__)');
556
+ // Legacy patterns that may still start with plain class
557
+ const doubleRe = /^\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/;
558
+ const singleRe = /^\.[A-Za-z0-9_-]+/;
559
+ if (doubleRe.test(normalized)) {
560
+ normalized = normalized.replace(doubleRe, '__CLASS__.__CLASS__');
561
+ }
562
+ else if (singleRe.test(normalized)) {
563
+ normalized = normalized.replace(singleRe, '__CLASS__');
564
+ }
565
+ return { selectorTemplate: normalized };
566
+ }
567
+ /** Compose a unique batch key */
568
+ getBatchKey(atRules, selectorTemplate, normalizedDecl) {
569
+ const at = atRules && atRules.length ? atRules.join('|') : '';
570
+ return `${at}||${selectorTemplate}||${normalizedDecl}`;
571
+ }
572
+ /** Ensure there is a target sheet and available rule index */
573
+ ensureTargetSheetAndIndex(registry, root) {
574
+ let sheet = this.findAvailableSheet(registry, root);
575
+ if (!sheet) {
576
+ sheet = this.createSheet(registry, root);
577
+ }
578
+ const ruleIndex = this.findAvailableRuleIndex(sheet);
579
+ const sheetIndex = registry.sheets.indexOf(sheet);
580
+ return { sheet, sheetIndex, ruleIndex };
581
+ }
582
+ /** Compose CSS text for a batched rule entry */
583
+ composeCssForEntry(entry) {
584
+ const classList = Array.from(entry.classNames)
585
+ .sort((a, b) => {
586
+ const aNum = parseInt(a.slice(1));
587
+ const bNum = parseInt(b.slice(1));
588
+ return aNum - bNum;
589
+ })
590
+ .map((c) => `.${c}`)
591
+ .join(', ');
592
+ // If template expects doubled specificity, replicate :is twice
593
+ let selector = entry.selectorTemplate
594
+ .replace(/:is\(__CLASS__\)/g, `:is(${classList})`)
595
+ .replace(/__CLASS__\.__CLASS__/g, `:is(${classList}):is(${classList})`)
596
+ .replace(/__CLASS__/g, `:is(${classList})`);
597
+ const baseRule = `${selector} { ${entry.declarations} }`;
598
+ if (entry.atRules && entry.atRules.length) {
599
+ return entry.atRules.reduce((acc, at) => `${at} { ${acc} }`, baseRule);
600
+ }
601
+ return baseRule;
602
+ }
603
+ /** Update CSSOM/textContent for an existing batched rule */
604
+ updateBatchedRuleCss(registry, entry, root) {
605
+ const sheet = registry.sheets[entry.sheetIndex];
606
+ if (!sheet)
607
+ return;
608
+ const styleElement = sheet.sheet;
609
+ const styleSheet = styleElement.sheet;
610
+ const newCssText = this.composeCssForEntry(entry);
611
+ if (styleSheet && !this.config.forceTextInjection) {
612
+ // Replace rule at the same index
613
+ const idx = Math.max(0, Math.min(entry.ruleIndex, styleSheet.cssRules.length - 1));
614
+ try {
615
+ styleSheet.deleteRule(idx);
616
+ }
617
+ catch {
618
+ // Ignore CSSOM errors when deleting rules
619
+ }
620
+ const insertIdx = Math.min(idx, styleSheet.cssRules.length);
621
+ styleSheet.insertRule(newCssText, insertIdx);
622
+ entry.ruleIndex = insertIdx;
623
+ }
624
+ else {
625
+ // Text content replacement
626
+ const old = entry.currentCssText || '';
627
+ const fullText = styleElement.textContent || '';
628
+ if (old) {
629
+ styleElement.textContent = fullText.replace(old, newCssText);
630
+ }
631
+ else {
632
+ styleElement.textContent =
633
+ (fullText ? fullText + '\n' : '') + newCssText;
634
+ }
635
+ entry.currentCssText = newCssText;
636
+ }
637
+ }
638
+ /** Remove a batched rule entirely from the stylesheet */
639
+ removeBatchedEntry(registry, entry) {
640
+ const sheet = registry.sheets[entry.sheetIndex];
641
+ if (!sheet)
642
+ return;
643
+ const styleElement = sheet.sheet;
644
+ const styleSheet = styleElement.sheet;
645
+ if (styleSheet && !this.config.forceTextInjection) {
646
+ const idx = entry.ruleIndex;
647
+ if (idx >= 0 && idx < styleSheet.cssRules.length) {
648
+ try {
649
+ styleSheet.deleteRule(idx);
650
+ sheet.ruleCount = Math.max(0, sheet.ruleCount - 1);
651
+ }
652
+ catch {
653
+ // Ignore CSSOM errors when deleting rules
654
+ }
655
+ }
656
+ }
657
+ else {
658
+ const old = entry.currentCssText || '';
659
+ if (old) {
660
+ const fullText = styleElement.textContent || '';
661
+ styleElement.textContent = fullText.replace(old, '');
662
+ }
663
+ sheet.ruleCount = Math.max(0, sheet.ruleCount - 1);
664
+ }
665
+ }
666
+ /** Find existing class that has an identical rule (same batch key) */
667
+ findClassWithIdenticalRule(registry, batchKey, excludeClassName) {
668
+ const meta = registry.batchedRuleMeta.get(batchKey);
669
+ if (!meta)
670
+ return null;
671
+ // Look through all classes to find one that has this batch key but isn't batched yet
672
+ for (const [className, keys] of registry.classToBatchedKeys.entries()) {
673
+ if (className === excludeClassName)
674
+ continue;
675
+ if (keys.has(batchKey) && !registry.batchedRules.has(batchKey)) {
676
+ return className;
677
+ }
678
+ }
679
+ return null;
680
+ }
681
+ /** Convert an existing single-class rule to a batched rule with additional class */
682
+ convertToBatchedRule(registry, existingClassName, newClassName, batchKey, root) {
683
+ const meta = registry.batchedRuleMeta.get(batchKey);
684
+ if (!meta)
685
+ return;
686
+ // Find the existing rule info for the existing class
687
+ const existingRuleInfo = registry.rules.get(existingClassName);
688
+ if (!existingRuleInfo || existingRuleInfo.sheetIndex < 0)
689
+ return;
690
+ // Create a new batched entry at the same location
691
+ const entry = {
692
+ key: batchKey,
693
+ selectorTemplate: meta.selectorTemplate,
694
+ declarations: meta.declarations,
695
+ atRules: meta.atRules,
696
+ classNames: new Set([existingClassName, newClassName]),
697
+ sheetIndex: existingRuleInfo.sheetIndex,
698
+ ruleIndex: existingRuleInfo.ruleIndex,
699
+ };
700
+ // Update the CSS rule to use batched selector
701
+ const newCssText = this.composeCssForEntry(entry);
702
+ const sheet = registry.sheets[entry.sheetIndex];
703
+ if (!sheet)
704
+ return;
705
+ const styleElement = sheet.sheet;
706
+ const styleSheet = styleElement.sheet;
707
+ if (styleSheet && !this.config.forceTextInjection) {
708
+ try {
709
+ // Replace the existing rule
710
+ const idx = Math.max(0, Math.min(entry.ruleIndex, styleSheet.cssRules.length - 1));
711
+ styleSheet.deleteRule(idx);
712
+ styleSheet.insertRule(newCssText, idx);
713
+ }
714
+ catch {
715
+ // Ignore CSSOM errors when updating rules
716
+ }
717
+ }
718
+ else {
719
+ // Replace in text content
720
+ const oldCssText = existingRuleInfo.cssText?.[0] || '';
721
+ if (oldCssText) {
722
+ const fullText = styleElement.textContent || '';
723
+ styleElement.textContent = fullText.replace(oldCssText, newCssText);
724
+ }
725
+ entry.currentCssText = newCssText;
726
+ }
727
+ // Update registry
728
+ registry.batchedRules.set(batchKey, entry);
729
+ // Update class mappings
730
+ if (!registry.classToBatchedKeys.has(newClassName)) {
731
+ registry.classToBatchedKeys.set(newClassName, new Set());
732
+ }
733
+ registry.classToBatchedKeys.get(newClassName).add(batchKey);
734
+ }
735
+ }
736
+
737
+