@cube-dev/ui-kit 0.74.3 → 0.76.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (512) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/es/_internal/hooks/index.js +1 -1
  3. package/es/_internal/hooks/use-chained-callback.js +1 -1
  4. package/es/_internal/hooks/use-debounced-value.js +1 -1
  5. package/es/_internal/hooks/use-deprecation-warning.js +1 -1
  6. package/es/_internal/hooks/use-effect-once.js +1 -1
  7. package/es/_internal/hooks/use-event.js +1 -1
  8. package/es/_internal/hooks/use-is-first-render.js +1 -1
  9. package/es/_internal/hooks/use-sync-ref.js +1 -1
  10. package/es/_internal/hooks/use-timer/index.js +1 -1
  11. package/es/_internal/hooks/use-timer/timer.js +1 -1
  12. package/es/_internal/hooks/use-timer/use-timer.js +1 -1
  13. package/es/_internal/hooks/use-update-effect.js +1 -1
  14. package/es/_internal/hooks/use-warn.js +1 -1
  15. package/es/_internal/index.js +1 -1
  16. package/es/components/Block.js +1 -1
  17. package/es/components/GlobalStyles.js +10 -15
  18. package/es/components/GridProvider.js +1 -1
  19. package/es/components/HiddenInput.js +25 -24
  20. package/es/components/Item.js +1 -1
  21. package/es/components/OpenTrasition.js +1 -1
  22. package/es/components/Root.js +2 -2
  23. package/es/components/actions/Action/Action.js +15 -19
  24. package/es/components/actions/Button/Button.js +2 -1
  25. package/es/components/actions/Button/index.js +1 -1
  26. package/es/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  27. package/es/components/actions/CommandMenu/CommandMenu.js +1 -1
  28. package/es/components/actions/CommandMenu/index.js +1 -1
  29. package/es/components/actions/CommandMenu/styled.js +1 -1
  30. package/es/components/actions/ItemButton/ItemButton.js +1 -1
  31. package/es/components/actions/ItemButton/index.js +1 -1
  32. package/es/components/actions/Menu/Menu.js +1 -1
  33. package/es/components/actions/Menu/MenuItem.js +3 -8
  34. package/es/components/actions/Menu/MenuSection.js +1 -1
  35. package/es/components/actions/Menu/MenuTrigger.js +1 -1
  36. package/es/components/actions/Menu/SubMenuTrigger.js +1 -1
  37. package/es/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  38. package/es/components/actions/Menu/context.js +1 -1
  39. package/es/components/actions/Menu/index.js +1 -1
  40. package/es/components/actions/Menu/styled.js +1 -1
  41. package/es/components/actions/index.js +1 -1
  42. package/es/components/actions/use-action.js +1 -1
  43. package/es/components/actions/use-anchored-menu.js +1 -1
  44. package/es/components/actions/use-context-menu.js +1 -1
  45. package/es/components/content/ActiveZone/ActiveZone.js +1 -1
  46. package/es/components/content/Alert/Alert.js +1 -1
  47. package/es/components/content/Alert/index.js +1 -1
  48. package/es/components/content/Alert/types.js +1 -1
  49. package/es/components/content/Alert/use-alert.js +1 -1
  50. package/es/components/content/Avatar/Avatar.js +1 -1
  51. package/es/components/content/Badge/Badge.js +1 -1
  52. package/es/components/content/Card/Card.js +1 -1
  53. package/es/components/content/Content.js +1 -1
  54. package/es/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  55. package/es/components/content/CopyPasteBlock/index.js +1 -1
  56. package/es/components/content/CopySnippet/CopySnippet.js +1 -1
  57. package/es/components/content/CopySnippet/index.js +1 -1
  58. package/es/components/content/Divider.js +1 -1
  59. package/es/components/content/Footer.js +1 -1
  60. package/es/components/content/Header.js +1 -1
  61. package/es/components/content/HotKeys/HotKeys.js +1 -1
  62. package/es/components/content/HotKeys/index.js +1 -1
  63. package/es/components/content/ItemBase/ItemBase.js +9 -3
  64. package/es/components/content/ItemBase/index.js +1 -1
  65. package/es/components/content/List/SectionHeading.js +1 -1
  66. package/es/components/content/List/index.js +1 -1
  67. package/es/components/content/Paragraph.js +1 -1
  68. package/es/components/content/Placeholder/Placeholder.js +46 -41
  69. package/es/components/content/PrismCode/PrismCode.js +1 -1
  70. package/es/components/content/PrismCode/prismSetup.js +1 -1
  71. package/es/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  72. package/es/components/content/Result/Result.js +1 -1
  73. package/es/components/content/Skeleton/Skeleton.js +1 -1
  74. package/es/components/content/Tag/Tag.js +1 -1
  75. package/es/components/content/Text.js +3 -3
  76. package/es/components/content/Title.js +3 -3
  77. package/es/components/fields/Checkbox/Checkbox.js +1 -1
  78. package/es/components/fields/Checkbox/CheckboxGroup.js +1 -1
  79. package/es/components/fields/Checkbox/context.js +1 -1
  80. package/es/components/fields/Checkbox/index.js +1 -1
  81. package/es/components/fields/ComboBox/ComboBox.js +3 -7
  82. package/es/components/fields/ComboBox/index.js +1 -1
  83. package/es/components/fields/DatePicker/DateInput.js +1 -1
  84. package/es/components/fields/DatePicker/DateInputBase.js +1 -1
  85. package/es/components/fields/DatePicker/DatePicker.js +1 -1
  86. package/es/components/fields/DatePicker/DatePickerButton.js +1 -1
  87. package/es/components/fields/DatePicker/DatePickerElement.js +1 -1
  88. package/es/components/fields/DatePicker/DatePickerInput.js +1 -1
  89. package/es/components/fields/DatePicker/DatePickerSegment.js +1 -1
  90. package/es/components/fields/DatePicker/DateRangePicker.js +1 -1
  91. package/es/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  92. package/es/components/fields/DatePicker/TimeInput.js +1 -1
  93. package/es/components/fields/DatePicker/index.js +1 -1
  94. package/es/components/fields/DatePicker/intl.js +1 -1
  95. package/es/components/fields/DatePicker/parseDate.js +1 -1
  96. package/es/components/fields/DatePicker/props.js +1 -1
  97. package/es/components/fields/DatePicker/types.js +1 -1
  98. package/es/components/fields/DatePicker/utils.js +1 -1
  99. package/es/components/fields/FileInput/FileInput.js +1 -1
  100. package/es/components/fields/FilterListBox/FilterListBox.js +1 -1
  101. package/es/components/fields/FilterListBox/index.js +1 -1
  102. package/es/components/fields/FilterPicker/FilterPicker.js +3 -3
  103. package/es/components/fields/FilterPicker/index.js +1 -1
  104. package/es/components/fields/Input/Input.js +1 -1
  105. package/es/components/fields/Input/index.js +1 -1
  106. package/es/components/fields/ListBox/ListBox.js +1 -1
  107. package/es/components/fields/ListBox/index.js +1 -1
  108. package/es/components/fields/NumberInput/NumberInput.js +1 -1
  109. package/es/components/fields/NumberInput/StepButton.js +1 -1
  110. package/es/components/fields/PasswordInput/PasswordInput.js +1 -1
  111. package/es/components/fields/RadioGroup/Radio.js +2 -2
  112. package/es/components/fields/RadioGroup/RadioGroup.js +1 -1
  113. package/es/components/fields/RadioGroup/context.js +1 -1
  114. package/es/components/fields/RadioGroup/index.js +1 -1
  115. package/es/components/fields/SearchInput/SearchInput.js +1 -1
  116. package/es/components/fields/SearchInput/index.js +1 -1
  117. package/es/components/fields/Select/Select.js +1 -1
  118. package/es/components/fields/Select/index.js +1 -1
  119. package/es/components/fields/Slider/Gradation.js +1 -1
  120. package/es/components/fields/Slider/Header.js +1 -1
  121. package/es/components/fields/Slider/RangeSlider.js +1 -1
  122. package/es/components/fields/Slider/Slider.js +1 -1
  123. package/es/components/fields/Slider/SliderBase.js +1 -1
  124. package/es/components/fields/Slider/SliderInput.js +1 -1
  125. package/es/components/fields/Slider/SliderThumb.js +1 -1
  126. package/es/components/fields/Slider/SliderTrack.js +1 -1
  127. package/es/components/fields/Slider/elements.js +1 -1
  128. package/es/components/fields/Slider/index.js +1 -1
  129. package/es/components/fields/Slider/types.js +1 -1
  130. package/es/components/fields/Switch/Switch.js +1 -1
  131. package/es/components/fields/Switch/index.js +1 -1
  132. package/es/components/fields/TextArea/TextArea.js +1 -1
  133. package/es/components/fields/TextArea/index.js +1 -1
  134. package/es/components/fields/TextInput/TextInput.js +1 -1
  135. package/es/components/fields/TextInput/TextInputBase.js +3 -2
  136. package/es/components/fields/TextInput/index.js +1 -1
  137. package/es/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  138. package/es/components/fields/TextInputMapper/index.js +1 -1
  139. package/es/components/fields/index.js +1 -1
  140. package/es/components/form/FieldWrapper/FieldWrapper.js +1 -1
  141. package/es/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
  142. package/es/components/form/FieldWrapper/index.js +1 -1
  143. package/es/components/form/FieldWrapper/types.js +1 -1
  144. package/es/components/form/Form/Field.js +1 -1
  145. package/es/components/form/Form/Form.js +1 -1
  146. package/es/components/form/Form/ResetButton/ResetButton.js +1 -1
  147. package/es/components/form/Form/ResetButton/index.js +1 -1
  148. package/es/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  149. package/es/components/form/Form/SubmitButton/index.js +1 -1
  150. package/es/components/form/Form/SubmitError.js +1 -1
  151. package/es/components/form/Form/index.js +1 -1
  152. package/es/components/form/Form/types.js +1 -1
  153. package/es/components/form/Form/use-field/index.js +1 -1
  154. package/es/components/form/Form/use-field/types.js +1 -1
  155. package/es/components/form/Form/use-field/use-field-props.js +1 -1
  156. package/es/components/form/Form/use-field/use-field.js +1 -1
  157. package/es/components/form/Form/use-form.js +1 -1
  158. package/es/components/form/Form/validation.js +1 -1
  159. package/es/components/form/Label.js +1 -1
  160. package/es/components/form/index.js +1 -1
  161. package/es/components/form/wrapper.js +1 -1
  162. package/es/components/layout/Flex.js +1 -1
  163. package/es/components/layout/Flow.js +1 -1
  164. package/es/components/layout/Grid.js +1 -1
  165. package/es/components/layout/Panel.js +1 -1
  166. package/es/components/layout/Prefix.js +1 -1
  167. package/es/components/layout/ResizablePanel.js +1 -1
  168. package/es/components/layout/Space.js +1 -1
  169. package/es/components/layout/Suffix.js +1 -1
  170. package/es/components/navigation/LegacyTabs/LegacyTabs.js +1 -1
  171. package/es/components/navigation/Link/Link.js +1 -1
  172. package/es/components/organisms/FileTabs/FileTabs.js +1 -1
  173. package/es/components/organisms/Modal/Modal.js +59 -68
  174. package/es/components/organisms/StatsCard/StatsCard.js +1 -1
  175. package/es/components/other/Base64Upload/Base64Upload.js +1 -1
  176. package/es/components/other/Calendar/Calendar.js +1 -1
  177. package/es/components/other/Calendar/CalendarCell.js +1 -1
  178. package/es/components/other/Calendar/CalendarGrid.js +1 -1
  179. package/es/components/other/Calendar/RangeCalendar.js +1 -1
  180. package/es/components/other/CloudLogo/CloudLogo.js +1 -1
  181. package/es/components/overlays/AlertDialog/AlertDialog.js +1 -1
  182. package/es/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  183. package/es/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  184. package/es/components/overlays/AlertDialog/index.js +1 -1
  185. package/es/components/overlays/AlertDialog/types.js +1 -1
  186. package/es/components/overlays/Dialog/Dialog.js +1 -1
  187. package/es/components/overlays/Dialog/DialogContainer.js +1 -1
  188. package/es/components/overlays/Dialog/DialogForm.js +1 -1
  189. package/es/components/overlays/Dialog/DialogTrigger.js +1 -1
  190. package/es/components/overlays/Dialog/context.js +1 -1
  191. package/es/components/overlays/Dialog/index.js +1 -1
  192. package/es/components/overlays/Dialog/use-dialog-container.js +1 -1
  193. package/es/components/overlays/Modal/Modal.js +1 -1
  194. package/es/components/overlays/Modal/OpenTransition.js +1 -1
  195. package/es/components/overlays/Modal/Overlay.js +1 -1
  196. package/es/components/overlays/Modal/Popover.js +1 -1
  197. package/es/components/overlays/Modal/Tray.js +1 -1
  198. package/es/components/overlays/Modal/Underlay.js +1 -1
  199. package/es/components/overlays/Modal/index.js +1 -1
  200. package/es/components/overlays/Modal/types.js +1 -1
  201. package/es/components/overlays/NewNotifications/Bar/FloatingNotification.js +1 -1
  202. package/es/components/overlays/NewNotifications/Bar/NotificationsBar.js +1 -1
  203. package/es/components/overlays/NewNotifications/Bar/TransitionComponent.js +1 -1
  204. package/es/components/overlays/NewNotifications/Bar/index.js +1 -1
  205. package/es/components/overlays/NewNotifications/Dialog/NotificationsDialogTrigger.js +1 -1
  206. package/es/components/overlays/NewNotifications/Dialog/index.js +1 -1
  207. package/es/components/overlays/NewNotifications/Notification.js +1 -1
  208. package/es/components/overlays/NewNotifications/NotificationView/NotificationAction.js +1 -1
  209. package/es/components/overlays/NewNotifications/NotificationView/NotificationCloseButton.js +1 -1
  210. package/es/components/overlays/NewNotifications/NotificationView/NotificationDescription.js +1 -1
  211. package/es/components/overlays/NewNotifications/NotificationView/NotificationFooter.js +1 -1
  212. package/es/components/overlays/NewNotifications/NotificationView/NotificationHeader.js +1 -1
  213. package/es/components/overlays/NewNotifications/NotificationView/NotificationIcon.js +1 -1
  214. package/es/components/overlays/NewNotifications/NotificationView/NotificationProvider.js +1 -1
  215. package/es/components/overlays/NewNotifications/NotificationView/NotificationView.js +1 -1
  216. package/es/components/overlays/NewNotifications/NotificationView/index.js +1 -1
  217. package/es/components/overlays/NewNotifications/NotificationView/types.js +1 -1
  218. package/es/components/overlays/NewNotifications/NotificationsContext/NotificationsContext.js +1 -1
  219. package/es/components/overlays/NewNotifications/NotificationsContext/NotificationsProvider.js +1 -1
  220. package/es/components/overlays/NewNotifications/NotificationsContext/index.js +1 -1
  221. package/es/components/overlays/NewNotifications/NotificationsContext/use-notifications.js +1 -1
  222. package/es/components/overlays/NewNotifications/NotificationsList/NotificationsList.js +1 -1
  223. package/es/components/overlays/NewNotifications/NotificationsList/NotificationsListItem.js +1 -1
  224. package/es/components/overlays/NewNotifications/NotificationsList/index.js +1 -1
  225. package/es/components/overlays/NewNotifications/NotificationsList/types.js +1 -1
  226. package/es/components/overlays/NewNotifications/hooks/index.js +1 -1
  227. package/es/components/overlays/NewNotifications/hooks/types.js +1 -1
  228. package/es/components/overlays/NewNotifications/hooks/use-notification-list-item.js +1 -1
  229. package/es/components/overlays/NewNotifications/hooks/use-notifications-api.js +1 -1
  230. package/es/components/overlays/NewNotifications/hooks/use-notifications-list.js +1 -1
  231. package/es/components/overlays/NewNotifications/hooks/use-notifications-observer.js +1 -1
  232. package/es/components/overlays/NewNotifications/index.js +1 -1
  233. package/es/components/overlays/NewNotifications/types.js +1 -1
  234. package/es/components/overlays/Notification/Notification.js +1 -1
  235. package/es/components/overlays/OverlayWrapper.js +1 -1
  236. package/es/components/overlays/Toasts/Toast.js +1 -1
  237. package/es/components/overlays/Toasts/index.js +1 -1
  238. package/es/components/overlays/Toasts/types.js +1 -1
  239. package/es/components/overlays/Toasts/use-toasts-api.js +1 -1
  240. package/es/components/overlays/Tooltip/Tooltip.js +1 -1
  241. package/es/components/overlays/Tooltip/TooltipProvider.js +1 -1
  242. package/es/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  243. package/es/components/overlays/Tooltip/context.js +1 -1
  244. package/es/components/overlays/Tooltip/index.js +1 -1
  245. package/es/components/portal/Portal.js +1 -1
  246. package/es/components/portal/PortalProvider.js +1 -1
  247. package/es/components/portal/index.js +1 -1
  248. package/es/components/portal/types.js +1 -1
  249. package/es/components/portal/usePortal.js +1 -1
  250. package/es/components/shared/InvalidIcon.js +1 -1
  251. package/es/components/shared/ValidIcon.js +1 -1
  252. package/es/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  253. package/es/components/status/LoadingAnimation/index.js +1 -1
  254. package/es/components/status/Spin/Cube.js +1 -1
  255. package/es/components/status/Spin/InternalSpinner.js +1 -1
  256. package/es/components/status/Spin/Spin.js +1 -1
  257. package/es/components/status/Spin/SpinsContainer.js +1 -1
  258. package/es/components/status/Spin/index.js +1 -1
  259. package/es/components/status/Spin/types.js +1 -1
  260. package/es/components/status/index.js +1 -1
  261. package/es/data/item-themes.js +1 -1
  262. package/es/data/themes.js +1 -1
  263. package/es/icons/AdjustmentsHorizontalIcon.js +1 -1
  264. package/es/icons/AdjustmentsIcon.js +1 -1
  265. package/es/icons/AiIcon.js +1 -1
  266. package/es/icons/AreaChartIcon.js +1 -1
  267. package/es/icons/BackwardIcon.js +1 -1
  268. package/es/icons/BarChartIcon.js +1 -1
  269. package/es/icons/BellFilledIcon.js +1 -1
  270. package/es/icons/BellIcon.js +1 -1
  271. package/es/icons/BooleanIcon.js +1 -1
  272. package/es/icons/CalendarEditIcon.js +1 -1
  273. package/es/icons/CalendarIcon.js +1 -1
  274. package/es/icons/CaretDownIcon.js +1 -1
  275. package/es/icons/CaretUpIcon.js +1 -1
  276. package/es/icons/ChartAreaStackedIcon.js +1 -1
  277. package/es/icons/ChartAreaStackedPercentageIcon.js +1 -1
  278. package/es/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  279. package/es/icons/ChartBarGroupedIcon.js +1 -1
  280. package/es/icons/ChartBarHorizontalIcon.js +1 -1
  281. package/es/icons/ChartBarLineIcon.js +1 -1
  282. package/es/icons/ChartBarStackedHorizontalIcon.js +1 -1
  283. package/es/icons/ChartBarStackedIcon.js +1 -1
  284. package/es/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  285. package/es/icons/ChartBarStackedPercentageIcon.js +1 -1
  286. package/es/icons/ChartBoxPlot2Icon.js +1 -1
  287. package/es/icons/ChartBoxPlotIcon.js +1 -1
  288. package/es/icons/ChartBubbleIcon.js +1 -1
  289. package/es/icons/ChartDonut2Icon.js +1 -1
  290. package/es/icons/ChartFunnelIcon.js +1 -1
  291. package/es/icons/ChartKPIIcon.js +1 -1
  292. package/es/icons/ChartPie2Icon.js +1 -1
  293. package/es/icons/ChartScatterIcon.js +1 -1
  294. package/es/icons/CheckCircleFilledIcon.js +1 -1
  295. package/es/icons/CheckCircleIcon.js +1 -1
  296. package/es/icons/CheckIcon.js +1 -1
  297. package/es/icons/CircleFilledIcon.js +1 -1
  298. package/es/icons/ClearIcon.js +1 -1
  299. package/es/icons/CloseCircleFilledIcon.js +1 -1
  300. package/es/icons/CloseCircleIcon.js +1 -1
  301. package/es/icons/CloseIcon.js +1 -1
  302. package/es/icons/CodeIcon.js +1 -1
  303. package/es/icons/CopyIcon.js +1 -1
  304. package/es/icons/CountIcon.js +1 -1
  305. package/es/icons/CubeIcon.js +1 -1
  306. package/es/icons/DangerIcon.js +1 -1
  307. package/es/icons/DashboardIcon.js +1 -1
  308. package/es/icons/DatabaseIcon.js +1 -1
  309. package/es/icons/DirectionIcon.js +1 -1
  310. package/es/icons/DonutIcon.js +1 -1
  311. package/es/icons/DownIcon.js +1 -1
  312. package/es/icons/EditIcon.js +1 -1
  313. package/es/icons/ExclamationCircleFilledIcon.js +1 -1
  314. package/es/icons/ExclamationCircleIcon.js +1 -1
  315. package/es/icons/ExclamationIcon.js +1 -1
  316. package/es/icons/EyeIcon.js +1 -1
  317. package/es/icons/EyeInvisibleIcon.js +1 -1
  318. package/es/icons/FilterIcon.js +1 -1
  319. package/es/icons/FolderFilledIcon.js +1 -1
  320. package/es/icons/FolderIcon.js +1 -1
  321. package/es/icons/FolderOpenFilledIcon.js +1 -1
  322. package/es/icons/FolderOpenIcon.js +1 -1
  323. package/es/icons/ForwardIcon.js +1 -1
  324. package/es/icons/HierarchyIcon.js +1 -1
  325. package/es/icons/Icon.js +1 -1
  326. package/es/icons/InfoCircleIcon.js +1 -1
  327. package/es/icons/InfoIcon.js +1 -1
  328. package/es/icons/KeyIcon.js +1 -1
  329. package/es/icons/LeftIcon.js +1 -1
  330. package/es/icons/LineChartIcon.js +1 -1
  331. package/es/icons/LoadingIcon.js +1 -1
  332. package/es/icons/LockFilledIcon.js +1 -1
  333. package/es/icons/LockIcon.js +1 -1
  334. package/es/icons/MoreIcon.js +1 -1
  335. package/es/icons/NotAllowedIcon.js +1 -1
  336. package/es/icons/NumberIcon.js +1 -1
  337. package/es/icons/PauseCircleFilledIcon.js +1 -1
  338. package/es/icons/PauseCircleIcon.js +1 -1
  339. package/es/icons/PauseIcon.js +1 -1
  340. package/es/icons/PieChartIcon.js +1 -1
  341. package/es/icons/PlayCircleIcon.js +1 -1
  342. package/es/icons/PlayIcon.js +1 -1
  343. package/es/icons/PlusIcon.js +1 -1
  344. package/es/icons/ReloadIcon.js +1 -1
  345. package/es/icons/ReportIcon.js +1 -1
  346. package/es/icons/ReturnIcon.js +1 -1
  347. package/es/icons/RightIcon.js +1 -1
  348. package/es/icons/SchemeIcon.js +1 -1
  349. package/es/icons/SearchIcon.js +1 -1
  350. package/es/icons/SettingsIcon.js +1 -1
  351. package/es/icons/ShieldFilledIcon.js +1 -1
  352. package/es/icons/ShieldIcon.js +1 -1
  353. package/es/icons/SlashIcon.js +1 -1
  354. package/es/icons/SparklesIcon.js +1 -1
  355. package/es/icons/SqlIcon.js +1 -1
  356. package/es/icons/StatsIcon.js +1 -1
  357. package/es/icons/StopIcon.js +1 -1
  358. package/es/icons/StringIcon.js +1 -1
  359. package/es/icons/SwitchIcon.js +1 -1
  360. package/es/icons/TableIcon.js +1 -1
  361. package/es/icons/ThumbsDownIcon.js +1 -1
  362. package/es/icons/ThumbsUpIcon.js +1 -1
  363. package/es/icons/ThunderboltCrossedIcon.js +1 -1
  364. package/es/icons/ThunderboltFilledIcon.js +1 -1
  365. package/es/icons/ThunderboltIcon.js +1 -1
  366. package/es/icons/TimeIcon.js +1 -1
  367. package/es/icons/UnlockIcon.js +1 -1
  368. package/es/icons/UpIcon.js +1 -1
  369. package/es/icons/UserGroupIcon.js +1 -1
  370. package/es/icons/UserIcon.js +1 -1
  371. package/es/icons/UserLockIcon.js +1 -1
  372. package/es/icons/ViewIcon.js +1 -1
  373. package/es/icons/WarningFilledIcon.js +1 -1
  374. package/es/icons/WarningIcon.js +1 -1
  375. package/es/icons/add-new-icon.js +1 -1
  376. package/es/icons/index.js +1 -1
  377. package/es/icons/wrap-icon.js +1 -1
  378. package/es/index.js +1 -1
  379. package/es/provider.js +1 -1
  380. package/es/providers/TrackingProvider.js +1 -1
  381. package/es/services/notification.js +1 -1
  382. package/es/shared/form.js +1 -1
  383. package/es/shared/index.js +1 -1
  384. package/es/stories/Form.legacy-stories.js +1 -1
  385. package/es/stories/FormFieldArgs.js +1 -1
  386. package/es/stories/Layout.stories.js +1 -1
  387. package/es/stories/Tasty.stories.js +1 -1
  388. package/es/stories/components/ConfirmDeletionDialogForm.js +1 -1
  389. package/es/stories/components/DialogFormApp.js +1 -1
  390. package/es/stories/components/StyledButton.js +1 -1
  391. package/es/stories/lists/baseProps.js +1 -2
  392. package/es/tasty/debug.js +703 -0
  393. package/es/tasty/index.js +3 -1
  394. package/es/tasty/injector/index.js +187 -0
  395. package/es/tasty/injector/injector.js +678 -0
  396. package/es/tasty/injector/sheet-manager.js +912 -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 +19 -4
  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 +2 -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 +120 -35
  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 +26 -30
  451. package/es/tasty/utils/isDevEnv.js +36 -0
  452. package/es/tasty/utils/mergeStyles.js +1 -1
  453. package/es/tasty/utils/modAttrs.js +1 -1
  454. package/es/tasty/utils/renderStyles.js +710 -58
  455. package/es/tasty/utils/responsive.js +1 -7
  456. package/es/tasty/utils/string.js +1 -1
  457. package/es/tasty/utils/styles.js +100 -235
  458. package/es/tasty/utils/warnings.js +1 -1
  459. package/es/tokens.js +1 -12
  460. package/es/type-checks.js +1 -1
  461. package/es/utils/ResizeSensor.js +1 -1
  462. package/es/utils/modules.js +1 -1
  463. package/es/utils/promise.js +1 -1
  464. package/es/utils/random.js +1 -1
  465. package/es/utils/range.js +1 -1
  466. package/es/utils/react/Slots.js +1 -1
  467. package/es/utils/react/chain.js +1 -1
  468. package/es/utils/react/forwardRefWithGenerics.js +1 -1
  469. package/es/utils/react/index.js +1 -1
  470. package/es/utils/react/interactions.js +1 -1
  471. package/es/utils/react/isTextOnly.js +1 -1
  472. package/es/utils/react/mapProps.js +1 -1
  473. package/es/utils/react/mergeProps.js +1 -1
  474. package/es/utils/react/nullableValue.js +1 -1
  475. package/es/utils/react/sharedStore.js +1 -1
  476. package/es/utils/react/useCombinedRefs.js +1 -1
  477. package/es/utils/react/useControlledFocusVisible.js +1 -1
  478. package/es/utils/react/useEventBus.js +1 -1
  479. package/es/utils/react/useId.js +1 -1
  480. package/es/utils/react/useIsDarwin.js +1 -1
  481. package/es/utils/react/useKeySymbols.js +1 -1
  482. package/es/utils/react/useLayoutEffect.js +1 -1
  483. package/es/utils/react/useQaProps.js +1 -1
  484. package/es/utils/react/useViewportSize.js +1 -1
  485. package/es/utils/react/wrapNodeIfPlain.js +1 -1
  486. package/es/utils/transitions.js +1 -1
  487. package/es/utils/tree.js +1 -1
  488. package/es/utils/warnings.js +1 -1
  489. package/es/version.js +2 -2
  490. package/package.json +1 -1
  491. package/types/components/HiddenInput.d.ts +1 -3
  492. package/types/components/actions/Button/Button.d.ts +1 -0
  493. package/types/components/actions/Menu/styled.d.ts +762 -765
  494. package/types/components/actions/use-action.d.ts +1 -1
  495. package/types/components/content/List/SectionHeading.d.ts +254 -255
  496. package/types/components/fields/DatePicker/DatePickerElement.d.ts +254 -255
  497. package/types/tasty/debug.d.ts +163 -0
  498. package/types/tasty/index.d.ts +2 -0
  499. package/types/tasty/injector/index.d.ts +87 -0
  500. package/types/tasty/injector/injector.d.ts +111 -0
  501. package/types/tasty/injector/sheet-manager.d.ts +98 -0
  502. package/types/tasty/injector/types.d.ts +106 -0
  503. package/types/tasty/parser/lru.d.ts +5 -1
  504. package/types/tasty/styles/color.d.ts +3 -1
  505. package/types/tasty/styles/reset.d.ts +1 -2
  506. package/types/tasty/types.d.ts +0 -2
  507. package/types/tasty/utils/getModCombinations.d.ts +9 -1
  508. package/types/tasty/utils/isDevEnv.d.ts +6 -0
  509. package/types/tasty/utils/renderStyles.d.ts +30 -7
  510. package/types/tasty/utils/responsive.d.ts +0 -1
  511. package/types/tasty/utils/styles.d.ts +7 -90
  512. package/types/tokens.d.ts +0 -11
@@ -0,0 +1,912 @@
1
+ /**
2
+ * @license MIT
3
+ * author: Cube Dev Team
4
+ * @cube-dev/ui-kit v0.76.0
5
+ * Released under the MIT license.
6
+ */
7
+
8
+ import { createStyle, STYLE_HANDLER_MAP } from '../styles';
9
+ export class SheetManager {
10
+ rootRegistries = new WeakMap();
11
+ config;
12
+ constructor(config) {
13
+ this.config = config;
14
+ }
15
+ /**
16
+ * Get or create registry for a root (Document or ShadowRoot)
17
+ */
18
+ getRegistry(root) {
19
+ let registry = this.rootRegistries.get(root);
20
+ if (!registry) {
21
+ const metrics = this.config.devMode
22
+ ? {
23
+ hits: 0,
24
+ misses: 0,
25
+ bulkCleanups: 0,
26
+ totalInsertions: 0,
27
+ totalUnused: 0,
28
+ stylesCleanedUp: 0,
29
+ cleanupHistory: [],
30
+ startTime: Date.now(),
31
+ }
32
+ : undefined;
33
+ registry = {
34
+ sheets: [],
35
+ refCounts: new Map(),
36
+ rules: new Map(),
37
+ cacheKeyToClassName: new Map(),
38
+ ruleTextSet: new Set(),
39
+ bulkCleanupTimeout: null,
40
+ cleanupCheckTimeout: null,
41
+ metrics,
42
+ classCounter: 0,
43
+ keyframesCache: new Map(),
44
+ keyframesCounter: 0,
45
+ injectedProperties: new Set(),
46
+ globalRules: new Map(),
47
+ };
48
+ this.rootRegistries.set(root, registry);
49
+ }
50
+ return registry;
51
+ }
52
+ /**
53
+ * Create a new stylesheet for the registry
54
+ */
55
+ createSheet(registry, root) {
56
+ const sheet = this.createStyleElement(root);
57
+ const sheetInfo = {
58
+ sheet,
59
+ ruleCount: 0,
60
+ holes: [],
61
+ };
62
+ registry.sheets.push(sheetInfo);
63
+ return sheetInfo;
64
+ }
65
+ /**
66
+ * Create a style element and append to document
67
+ */
68
+ createStyleElement(root) {
69
+ const style = root.createElement?.('style') ||
70
+ document.createElement('style');
71
+ if (this.config.nonce) {
72
+ style.nonce = this.config.nonce;
73
+ }
74
+ style.setAttribute('data-tasty', '');
75
+ // Append to head or shadow root
76
+ if ('head' in root && root.head) {
77
+ root.head.appendChild(style);
78
+ }
79
+ else if ('appendChild' in root) {
80
+ root.appendChild(style);
81
+ }
82
+ else {
83
+ document.head.appendChild(style);
84
+ }
85
+ // Verify it was actually added - log only if there's a problem and we're not using forceTextInjection
86
+ if (!style.isConnected && !this.config.forceTextInjection) {
87
+ console.error('SheetManager: Style element failed to connect to DOM!', {
88
+ parentNode: style.parentNode?.nodeName,
89
+ isConnected: style.isConnected,
90
+ });
91
+ }
92
+ return style;
93
+ }
94
+ /**
95
+ * Insert CSS rules as a single block
96
+ */
97
+ insertRule(registry, flattenedRules, className, root) {
98
+ // Find or create a sheet with available space
99
+ let targetSheet = this.findAvailableSheet(registry, root);
100
+ if (!targetSheet) {
101
+ targetSheet = this.createSheet(registry, root);
102
+ }
103
+ const sheetIndex = registry.sheets.indexOf(targetSheet);
104
+ try {
105
+ // Group rules by selector and at-rules to combine declarations
106
+ const groupedRules = [];
107
+ const groupMap = new Map();
108
+ const atKey = (at) => (at && at.length ? at.join('|') : '');
109
+ flattenedRules.forEach((r) => {
110
+ const key = `${atKey(r.atRules)}||${r.selector}`;
111
+ const existing = groupMap.get(key);
112
+ if (existing) {
113
+ // Append declarations, preserving order
114
+ existing.declarations = existing.declarations
115
+ ? `${existing.declarations} ${r.declarations}`
116
+ : r.declarations;
117
+ }
118
+ else {
119
+ groupMap.set(key, {
120
+ idx: groupedRules.length,
121
+ selector: r.selector,
122
+ atRules: r.atRules,
123
+ declarations: r.declarations,
124
+ });
125
+ groupedRules.push({ ...r });
126
+ }
127
+ });
128
+ // Normalize groupedRules from map (with merged declarations)
129
+ groupMap.forEach((val) => {
130
+ groupedRules[val.idx] = {
131
+ selector: val.selector,
132
+ atRules: val.atRules,
133
+ declarations: val.declarations,
134
+ };
135
+ });
136
+ // Insert grouped rules
137
+ const insertedRuleTexts = [];
138
+ const insertedIndices = []; // Track exact indices
139
+ // Calculate rule index atomically right before insertion to prevent race conditions
140
+ let currentRuleIndex = this.findAvailableRuleIndex(targetSheet);
141
+ let firstInsertedIndex = null;
142
+ let lastInsertedIndex = null;
143
+ for (const rule of groupedRules) {
144
+ const declarations = rule.declarations;
145
+ const baseRule = `${rule.selector} { ${declarations} }`;
146
+ // Wrap with at-rules if present
147
+ let fullRule = baseRule;
148
+ if (rule.atRules && rule.atRules.length > 0) {
149
+ fullRule = rule.atRules.reduce((css, atRule) => `${atRule} { ${css} }`, baseRule);
150
+ }
151
+ // Insert individual rule into style element
152
+ const styleElement = targetSheet.sheet;
153
+ const styleSheet = styleElement.sheet;
154
+ if (styleSheet && !this.config.forceTextInjection) {
155
+ // Calculate index atomically for each rule to prevent concurrent insertion races
156
+ const maxIndex = styleSheet.cssRules.length;
157
+ const atomicRuleIndex = this.findAvailableRuleIndex(targetSheet);
158
+ const safeIndex = Math.min(Math.max(0, atomicRuleIndex), maxIndex);
159
+ // Helper: split comma-separated selectors safely (ignores commas inside [] () " ')
160
+ const splitSelectorsSafely = (selectorList) => {
161
+ const parts = [];
162
+ let buf = '';
163
+ let depthSq = 0; // [] depth
164
+ let depthPar = 0; // () depth
165
+ let inStr = '';
166
+ for (let i = 0; i < selectorList.length; i++) {
167
+ const ch = selectorList[i];
168
+ if (inStr) {
169
+ if (ch === inStr && selectorList[i - 1] !== '\\') {
170
+ inStr = '';
171
+ }
172
+ buf += ch;
173
+ continue;
174
+ }
175
+ if (ch === '"' || ch === "'") {
176
+ inStr = ch;
177
+ buf += ch;
178
+ continue;
179
+ }
180
+ if (ch === '[')
181
+ depthSq++;
182
+ else if (ch === ']')
183
+ depthSq = Math.max(0, depthSq - 1);
184
+ else if (ch === '(')
185
+ depthPar++;
186
+ else if (ch === ')')
187
+ depthPar = Math.max(0, depthPar - 1);
188
+ if (ch === ',' && depthSq === 0 && depthPar === 0) {
189
+ const part = buf.trim();
190
+ if (part)
191
+ parts.push(part);
192
+ buf = '';
193
+ }
194
+ else {
195
+ buf += ch;
196
+ }
197
+ }
198
+ const tail = buf.trim();
199
+ if (tail)
200
+ parts.push(tail);
201
+ return parts;
202
+ };
203
+ try {
204
+ styleSheet.insertRule(fullRule, safeIndex);
205
+ // Update sheet ruleCount immediately to prevent concurrent race conditions
206
+ targetSheet.ruleCount++;
207
+ insertedIndices.push(safeIndex); // Track this index
208
+ if (firstInsertedIndex == null)
209
+ firstInsertedIndex = safeIndex;
210
+ lastInsertedIndex = safeIndex;
211
+ currentRuleIndex = safeIndex + 1;
212
+ }
213
+ catch (e) {
214
+ // If the browser rejects the combined selector (e.g., vendor pseudo-elements),
215
+ // try to split and insert each selector independently. Skip unsupported ones.
216
+ const selectors = splitSelectorsSafely(rule.selector);
217
+ if (selectors.length > 1) {
218
+ let anyInserted = false;
219
+ for (const sel of selectors) {
220
+ const singleBase = `${sel} { ${declarations} }`;
221
+ let singleRule = singleBase;
222
+ if (rule.atRules && rule.atRules.length > 0) {
223
+ singleRule = rule.atRules.reduce((css, atRule) => `${atRule} { ${css} }`, singleBase);
224
+ }
225
+ try {
226
+ // Calculate index atomically for each individual selector insertion
227
+ const maxIdx = styleSheet.cssRules.length;
228
+ const atomicIdx = this.findAvailableRuleIndex(targetSheet);
229
+ const idx = Math.min(Math.max(0, atomicIdx), maxIdx);
230
+ styleSheet.insertRule(singleRule, idx);
231
+ // Update sheet ruleCount immediately
232
+ targetSheet.ruleCount++;
233
+ insertedIndices.push(idx); // Track this index
234
+ if (firstInsertedIndex == null)
235
+ firstInsertedIndex = idx;
236
+ lastInsertedIndex = idx;
237
+ currentRuleIndex = idx + 1;
238
+ anyInserted = true;
239
+ }
240
+ catch (_) {
241
+ // Skip unsupported selector in this engine (e.g., ::-moz-selection in Blink)
242
+ }
243
+ }
244
+ // If none inserted, continue without throwing to avoid aborting the whole batch
245
+ if (!anyInserted) {
246
+ // noop: all selectors invalid here; safe to skip
247
+ }
248
+ }
249
+ else {
250
+ // Single selector failed — skip it silently (likely unsupported in this engine)
251
+ }
252
+ }
253
+ }
254
+ else {
255
+ // Use textContent (either as fallback or when forceTextInjection is enabled)
256
+ // Calculate index atomically for textContent insertion too
257
+ const atomicRuleIndex = this.findAvailableRuleIndex(targetSheet);
258
+ styleElement.textContent =
259
+ (styleElement.textContent || '') + '\n' + fullRule;
260
+ // Update sheet ruleCount immediately
261
+ targetSheet.ruleCount++;
262
+ insertedIndices.push(atomicRuleIndex); // Track this index
263
+ if (firstInsertedIndex == null)
264
+ firstInsertedIndex = atomicRuleIndex;
265
+ lastInsertedIndex = atomicRuleIndex;
266
+ currentRuleIndex = atomicRuleIndex + 1;
267
+ }
268
+ // CRITICAL DEBUG: Verify the style element is in DOM only if there are issues and we're not using forceTextInjection
269
+ if (!styleElement.parentNode && !this.config.forceTextInjection) {
270
+ console.error('SheetManager: Style element is NOT in DOM! This is the problem!', {
271
+ className,
272
+ ruleIndex: currentRuleIndex,
273
+ });
274
+ }
275
+ // Dev-only: store cssText for debugging tools
276
+ if (this.config.devMode) {
277
+ insertedRuleTexts.push(fullRule);
278
+ try {
279
+ registry.ruleTextSet.add(fullRule);
280
+ }
281
+ catch (_) {
282
+ // noop: defensive in case ruleTextSet is unavailable
283
+ }
284
+ }
285
+ // currentRuleIndex already adjusted above
286
+ }
287
+ // Sheet ruleCount is now updated immediately after each insertion
288
+ // No need for deferred update logic
289
+ return {
290
+ className,
291
+ ruleIndex: firstInsertedIndex ?? 0,
292
+ sheetIndex,
293
+ cssText: this.config.devMode ? insertedRuleTexts : undefined,
294
+ endRuleIndex: lastInsertedIndex ?? firstInsertedIndex ?? 0,
295
+ indices: insertedIndices.length > 0 ? insertedIndices : undefined,
296
+ };
297
+ }
298
+ catch (error) {
299
+ console.warn('Failed to insert CSS rules:', error, {
300
+ flattenedRules,
301
+ className,
302
+ });
303
+ return null;
304
+ }
305
+ }
306
+ /**
307
+ * Insert global CSS rules
308
+ */
309
+ insertGlobalRule(registry, flattenedRules, globalKey, root) {
310
+ // Insert the rule using the same mechanism as regular rules
311
+ const ruleInfo = this.insertRule(registry, flattenedRules, globalKey, root);
312
+ // Track global rules for index adjustment
313
+ if (ruleInfo) {
314
+ registry.globalRules.set(globalKey, ruleInfo);
315
+ }
316
+ return ruleInfo;
317
+ }
318
+ /**
319
+ * Delete a global CSS rule by key
320
+ */
321
+ deleteGlobalRule(registry, globalKey) {
322
+ const ruleInfo = registry.globalRules.get(globalKey);
323
+ if (!ruleInfo) {
324
+ return;
325
+ }
326
+ // Delete the rule using the standard deletion mechanism
327
+ this.deleteRule(registry, ruleInfo);
328
+ // Remove from global rules tracking
329
+ registry.globalRules.delete(globalKey);
330
+ }
331
+ /**
332
+ * Adjust rule indices after deletion to account for shifting
333
+ */
334
+ adjustIndicesAfterDeletion(registry, sheetIndex, startIdx, endIdx, deleteCount, deletedRuleInfo, deletedIndices) {
335
+ try {
336
+ // Helper function to adjust a single RuleInfo
337
+ const adjustRuleInfo = (info) => {
338
+ if (info === deletedRuleInfo)
339
+ return; // Skip the deleted rule
340
+ if (info.sheetIndex !== sheetIndex)
341
+ return; // Different sheet
342
+ // If info has exact indices, adjust them
343
+ if (info.indices && info.indices.length > 0 && deletedIndices) {
344
+ // Sort deleted indices for efficient binary search
345
+ const sortedDeleted = [...deletedIndices].sort((a, b) => a - b);
346
+ // Adjust each index based on how many deleted indices are before it
347
+ info.indices = info.indices.map((idx) => {
348
+ // Count how many deleted indices are less than this index
349
+ let shift = 0;
350
+ for (const delIdx of sortedDeleted) {
351
+ if (delIdx < idx)
352
+ shift++;
353
+ else
354
+ break;
355
+ }
356
+ return idx - shift;
357
+ });
358
+ // Update ruleIndex and endRuleIndex to match adjusted indices
359
+ if (info.indices.length > 0) {
360
+ info.ruleIndex = Math.min(...info.indices);
361
+ info.endRuleIndex = Math.max(...info.indices);
362
+ }
363
+ }
364
+ else {
365
+ // Fallback: adjust using range logic
366
+ const infoEnd = info.endRuleIndex ?? info.ruleIndex;
367
+ if (info.ruleIndex > endIdx) {
368
+ // Rule is after deleted range - shift left
369
+ info.ruleIndex = Math.max(0, info.ruleIndex - deleteCount);
370
+ if (info.endRuleIndex != null) {
371
+ info.endRuleIndex = Math.max(info.ruleIndex, infoEnd - deleteCount);
372
+ }
373
+ }
374
+ else if (info.ruleIndex <= endIdx && infoEnd >= startIdx) {
375
+ // Rule overlaps with deleted range (should not normally happen)
376
+ // Clamp endRuleIndex to avoid pointing into deleted region
377
+ if (info.endRuleIndex != null) {
378
+ const newEnd = Math.max(info.ruleIndex, startIdx - 1);
379
+ info.endRuleIndex = Math.max(info.ruleIndex, newEnd);
380
+ }
381
+ }
382
+ }
383
+ };
384
+ // Adjust active rules
385
+ for (const info of registry.rules.values()) {
386
+ adjustRuleInfo(info);
387
+ }
388
+ // Adjust global rules
389
+ for (const info of registry.globalRules.values()) {
390
+ adjustRuleInfo(info);
391
+ }
392
+ // No need to separately adjust unused rules since they're part of the rules Map
393
+ // Adjust keyframes indices stored in cache
394
+ for (const entry of registry.keyframesCache.values()) {
395
+ const ki = entry.info;
396
+ if (ki.sheetIndex !== sheetIndex)
397
+ continue;
398
+ if (ki.ruleIndex > endIdx) {
399
+ ki.ruleIndex = Math.max(0, ki.ruleIndex - deleteCount);
400
+ }
401
+ }
402
+ }
403
+ catch (_) {
404
+ // Defensive: do not let index adjustments crash cleanup
405
+ }
406
+ }
407
+ /**
408
+ * Delete a CSS rule from the sheet
409
+ */
410
+ deleteRule(registry, ruleInfo) {
411
+ const sheet = registry.sheets[ruleInfo.sheetIndex];
412
+ if (!sheet) {
413
+ return;
414
+ }
415
+ try {
416
+ const texts = this.config.devMode && Array.isArray(ruleInfo.cssText)
417
+ ? ruleInfo.cssText.slice()
418
+ : [];
419
+ const styleElement = sheet.sheet;
420
+ const styleSheet = styleElement.sheet;
421
+ if (styleSheet) {
422
+ const rules = styleSheet.cssRules;
423
+ // Use exact indices if available, otherwise fall back to range
424
+ if (ruleInfo.indices && ruleInfo.indices.length > 0) {
425
+ // NEW: Delete using exact tracked indices
426
+ const sortedIndices = [...ruleInfo.indices].sort((a, b) => b - a); // Sort descending
427
+ const deletedIndices = [];
428
+ for (const idx of sortedIndices) {
429
+ if (idx >= 0 && idx < styleSheet.cssRules.length) {
430
+ try {
431
+ styleSheet.deleteRule(idx);
432
+ deletedIndices.push(idx);
433
+ }
434
+ catch (e) {
435
+ console.warn(`Failed to delete rule at index ${idx}:`, e);
436
+ }
437
+ }
438
+ }
439
+ sheet.ruleCount = Math.max(0, sheet.ruleCount - deletedIndices.length);
440
+ // Adjust indices for all other rules
441
+ if (deletedIndices.length > 0) {
442
+ this.adjustIndicesAfterDeletion(registry, ruleInfo.sheetIndex, Math.min(...deletedIndices), Math.max(...deletedIndices), deletedIndices.length, ruleInfo, deletedIndices);
443
+ }
444
+ }
445
+ else {
446
+ // FALLBACK: Use old range-based deletion for backwards compatibility
447
+ const startIdx = Math.max(0, ruleInfo.ruleIndex);
448
+ const endIdx = Math.min(rules.length - 1, Number.isFinite(ruleInfo.endRuleIndex)
449
+ ? ruleInfo.endRuleIndex
450
+ : startIdx);
451
+ if (Number.isFinite(startIdx) && endIdx >= startIdx) {
452
+ const deleteCount = endIdx - startIdx + 1;
453
+ for (let idx = endIdx; idx >= startIdx; idx--) {
454
+ if (idx < 0 || idx >= styleSheet.cssRules.length)
455
+ continue;
456
+ styleSheet.deleteRule(idx);
457
+ }
458
+ sheet.ruleCount = Math.max(0, sheet.ruleCount - deleteCount);
459
+ // After deletion, all subsequent rule indices shift left by deleteCount.
460
+ // We must adjust stored indices for all other RuleInfo within the same sheet.
461
+ this.adjustIndicesAfterDeletion(registry, ruleInfo.sheetIndex, startIdx, endIdx, deleteCount, ruleInfo);
462
+ }
463
+ }
464
+ }
465
+ // Dev-only: remove cssText entries from validation set
466
+ if (this.config.devMode && texts.length) {
467
+ try {
468
+ for (const text of texts) {
469
+ registry.ruleTextSet.delete(text);
470
+ }
471
+ }
472
+ catch (_) {
473
+ // noop
474
+ }
475
+ }
476
+ }
477
+ catch (error) {
478
+ console.warn('Failed to delete CSS rule:', error);
479
+ }
480
+ }
481
+ /**
482
+ * Find a sheet with available space or return null
483
+ */
484
+ findAvailableSheet(registry, root) {
485
+ const maxRules = this.config.maxRulesPerSheet;
486
+ if (!maxRules) {
487
+ // No limit, use the last sheet if it exists
488
+ const lastSheet = registry.sheets[registry.sheets.length - 1];
489
+ return lastSheet || null;
490
+ }
491
+ // Find sheet with space
492
+ for (const sheet of registry.sheets) {
493
+ if (sheet.ruleCount < maxRules) {
494
+ return sheet;
495
+ }
496
+ }
497
+ return null; // No available sheet found
498
+ }
499
+ /**
500
+ * Find an available rule index in the sheet
501
+ */
502
+ findAvailableRuleIndex(sheet) {
503
+ // Always append to the end - CSS doesn't have holes
504
+ return sheet.ruleCount;
505
+ }
506
+ /**
507
+ * Schedule bulk cleanup of all unused styles (non-stacking)
508
+ */
509
+ scheduleBulkCleanup(registry) {
510
+ // Clear any existing timeout to prevent stacking
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
+ const performCleanup = () => {
522
+ this.performBulkCleanup(registry);
523
+ registry.bulkCleanupTimeout = null;
524
+ };
525
+ if (this.config.idleCleanup && typeof requestIdleCallback !== 'undefined') {
526
+ registry.bulkCleanupTimeout = requestIdleCallback(performCleanup);
527
+ }
528
+ else {
529
+ const delay = this.config.bulkCleanupDelay || 5000;
530
+ registry.bulkCleanupTimeout = setTimeout(performCleanup, delay);
531
+ }
532
+ }
533
+ /**
534
+ * Force cleanup of unused styles
535
+ */
536
+ forceCleanup(registry) {
537
+ this.performBulkCleanup(registry, true);
538
+ }
539
+ /**
540
+ * Perform bulk cleanup of all unused styles
541
+ */
542
+ performBulkCleanup(registry, cleanupAll = false) {
543
+ const cleanupStartTime = Date.now();
544
+ // Calculate unused rules dynamically: rules that have refCount = 0
545
+ const unusedClassNames = Array.from(registry.refCounts.entries())
546
+ .filter(([, refCount]) => refCount === 0)
547
+ .map(([className]) => className);
548
+ if (unusedClassNames.length === 0)
549
+ return;
550
+ // Build candidates list - no age filtering needed
551
+ const candidates = unusedClassNames.map((className) => {
552
+ const ruleInfo = registry.rules.get(className); // We know it exists
553
+ return {
554
+ className,
555
+ ruleInfo,
556
+ };
557
+ });
558
+ if (candidates.length === 0)
559
+ return;
560
+ // Limit deletion scope per run (batch ratio) unless cleanupAll is true
561
+ let selected = candidates;
562
+ if (!cleanupAll) {
563
+ const ratio = this.config.bulkCleanupBatchRatio ?? 0.5;
564
+ const limit = Math.max(1, Math.floor(candidates.length * Math.min(1, Math.max(0, ratio))));
565
+ selected = candidates.slice(0, limit);
566
+ }
567
+ let cleanedUpCount = 0;
568
+ let totalCssSize = 0;
569
+ let totalRulesDeleted = 0;
570
+ // Group by sheet for efficient deletion
571
+ const rulesBySheet = new Map();
572
+ // Calculate CSS size before deletion and group rules
573
+ for (const { className, ruleInfo } of selected) {
574
+ const sheetIndex = ruleInfo.sheetIndex;
575
+ // Dev-only metrics: estimate CSS size and rule count if available
576
+ if (this.config.devMode && Array.isArray(ruleInfo.cssText)) {
577
+ const cssSize = ruleInfo.cssText.reduce((total, css) => total + css.length, 0);
578
+ totalCssSize += cssSize;
579
+ totalRulesDeleted += ruleInfo.cssText.length;
580
+ }
581
+ if (!rulesBySheet.has(sheetIndex)) {
582
+ rulesBySheet.set(sheetIndex, []);
583
+ }
584
+ rulesBySheet.get(sheetIndex).push({ className, ruleInfo });
585
+ }
586
+ // Delete rules from each sheet (in reverse order to preserve indices)
587
+ for (const [sheetIndex, rulesInSheet] of rulesBySheet) {
588
+ // Sort by rule index in descending order for safe deletion
589
+ rulesInSheet.sort((a, b) => b.ruleInfo.ruleIndex - a.ruleInfo.ruleIndex);
590
+ for (const { className, ruleInfo } of rulesInSheet) {
591
+ // SAFETY 1: Double-check refCount is still 0
592
+ const currentRefCount = registry.refCounts.get(className) || 0;
593
+ if (currentRefCount > 0) {
594
+ // Class became active again; do not delete
595
+ continue;
596
+ }
597
+ // SAFETY 2: Ensure rule wasn't replaced
598
+ // Between scheduling and execution a class may have been replaced with a new RuleInfo
599
+ const currentInfo = registry.rules.get(className);
600
+ if (currentInfo !== ruleInfo) {
601
+ // Rule was replaced; skip deletion of the old reference
602
+ continue;
603
+ }
604
+ // SAFETY 3: Verify the sheet element is still valid and accessible
605
+ const sheetInfo = registry.sheets[ruleInfo.sheetIndex];
606
+ if (!sheetInfo || !sheetInfo.sheet) {
607
+ // Sheet was removed or corrupted; skip this rule
608
+ continue;
609
+ }
610
+ // SAFETY 4: Verify the stylesheet itself is accessible
611
+ const styleSheet = sheetInfo.sheet.sheet;
612
+ if (!styleSheet) {
613
+ // Stylesheet not available; skip this rule
614
+ continue;
615
+ }
616
+ // SAFETY 5: Verify rule index is still within valid range
617
+ const maxRuleIndex = styleSheet.cssRules.length - 1;
618
+ const startIdx = ruleInfo.ruleIndex;
619
+ const endIdx = ruleInfo.endRuleIndex ?? ruleInfo.ruleIndex;
620
+ if (startIdx < 0 || endIdx > maxRuleIndex || startIdx > endIdx) {
621
+ // Rule indices are out of bounds; skip this rule
622
+ continue;
623
+ }
624
+ // All safety checks passed - proceed with deletion
625
+ this.deleteRule(registry, ruleInfo);
626
+ registry.rules.delete(className);
627
+ registry.refCounts.delete(className);
628
+ // Clean up cache key mappings that point to this className
629
+ const keysToDelete = [];
630
+ for (const [key, mappedClassName,] of registry.cacheKeyToClassName.entries()) {
631
+ if (mappedClassName === className) {
632
+ keysToDelete.push(key);
633
+ }
634
+ }
635
+ for (const key of keysToDelete) {
636
+ registry.cacheKeyToClassName.delete(key);
637
+ }
638
+ cleanedUpCount++;
639
+ }
640
+ }
641
+ // Update metrics
642
+ if (registry.metrics) {
643
+ registry.metrics.bulkCleanups++;
644
+ registry.metrics.stylesCleanedUp += cleanedUpCount;
645
+ // Add detailed cleanup stats to history
646
+ registry.metrics.cleanupHistory.push({
647
+ timestamp: cleanupStartTime,
648
+ classesDeleted: cleanedUpCount,
649
+ cssSize: totalCssSize,
650
+ rulesDeleted: totalRulesDeleted,
651
+ });
652
+ }
653
+ }
654
+ /**
655
+ * Get total number of rules across all sheets
656
+ */
657
+ getTotalRuleCount(registry) {
658
+ return registry.sheets.reduce((total, sheet) => total + sheet.ruleCount - sheet.holes.length, 0);
659
+ }
660
+ /**
661
+ * Get CSS text from all sheets (for SSR)
662
+ */
663
+ getCssText(registry) {
664
+ const cssChunks = [];
665
+ for (const sheet of registry.sheets) {
666
+ try {
667
+ const styleElement = sheet.sheet;
668
+ if (styleElement.textContent) {
669
+ cssChunks.push(styleElement.textContent);
670
+ }
671
+ else if (styleElement.sheet) {
672
+ const rules = Array.from(styleElement.sheet.cssRules);
673
+ cssChunks.push(rules.map((rule) => rule.cssText).join('\n'));
674
+ }
675
+ }
676
+ catch (error) {
677
+ console.warn('Failed to read CSS from sheet:', error);
678
+ }
679
+ }
680
+ return cssChunks.join('\n');
681
+ }
682
+ /**
683
+ * Get cache performance metrics
684
+ */
685
+ getMetrics(registry) {
686
+ if (!registry.metrics)
687
+ return null;
688
+ // Calculate unusedHits on demand - only count CSS rules since keyframes are disposed immediately
689
+ const unusedRulesCount = Array.from(registry.refCounts.values()).filter((count) => count === 0).length;
690
+ return {
691
+ ...registry.metrics,
692
+ unusedHits: unusedRulesCount,
693
+ };
694
+ }
695
+ /**
696
+ * Reset cache performance metrics
697
+ */
698
+ resetMetrics(registry) {
699
+ if (registry.metrics) {
700
+ registry.metrics = {
701
+ hits: 0,
702
+ misses: 0,
703
+ bulkCleanups: 0,
704
+ totalInsertions: 0,
705
+ totalUnused: 0,
706
+ stylesCleanedUp: 0,
707
+ cleanupHistory: [],
708
+ startTime: Date.now(),
709
+ };
710
+ }
711
+ }
712
+ /**
713
+ * Convert keyframes steps to CSS string
714
+ */
715
+ stepsToCSS(steps) {
716
+ const rules = [];
717
+ for (const [key, value] of Object.entries(steps)) {
718
+ // Support raw CSS strings for backwards compatibility
719
+ if (typeof value === 'string') {
720
+ rules.push(`${key} { ${value.trim()} }`);
721
+ continue;
722
+ }
723
+ // Treat value as a style map and process via tasty style handlers
724
+ const styleMap = (value || {});
725
+ // Build a deterministic handler queue based on present style keys
726
+ const styleNames = Object.keys(styleMap).sort();
727
+ const handlerQueue = [];
728
+ const seenHandlers = new Set();
729
+ styleNames.forEach((styleName) => {
730
+ let handlers = STYLE_HANDLER_MAP[styleName];
731
+ if (!handlers) {
732
+ // Create a default handler for unknown styles (maps to kebab-case CSS or custom props)
733
+ handlers = STYLE_HANDLER_MAP[styleName] = [createStyle(styleName)];
734
+ }
735
+ handlers.forEach((handler) => {
736
+ if (!seenHandlers.has(handler)) {
737
+ seenHandlers.add(handler);
738
+ handlerQueue.push(handler);
739
+ }
740
+ });
741
+ });
742
+ // Accumulate declarations (ordered). We intentionally ignore `$` selector fan-out
743
+ // and any responsive/state bindings for keyframes.
744
+ const declarationPairs = [];
745
+ handlerQueue.forEach((handler) => {
746
+ const lookup = handler.__lookupStyles;
747
+ const filteredMap = lookup.reduce((acc, name) => {
748
+ const v = styleMap[name];
749
+ if (v !== undefined)
750
+ acc[name] = v;
751
+ return acc;
752
+ }, {});
753
+ const result = handler(filteredMap);
754
+ if (!result)
755
+ return;
756
+ const results = Array.isArray(result) ? result : [result];
757
+ results.forEach((cssMap) => {
758
+ if (!cssMap || typeof cssMap !== 'object')
759
+ return;
760
+ const { $, ...props } = cssMap;
761
+ Object.entries(props).forEach(([prop, val]) => {
762
+ if (val == null || val === '')
763
+ return;
764
+ if (Array.isArray(val)) {
765
+ // Multiple values for the same property -> emit in order
766
+ val.forEach((v) => {
767
+ if (v != null && v !== '') {
768
+ declarationPairs.push({ prop, value: String(v) });
769
+ }
770
+ });
771
+ }
772
+ else {
773
+ declarationPairs.push({ prop, value: String(val) });
774
+ }
775
+ });
776
+ });
777
+ });
778
+ // Fallback: if nothing produced (e.g., empty object), generate empty block
779
+ const declarations = declarationPairs
780
+ .map((d) => `${d.prop}: ${d.value}`)
781
+ .join('; ');
782
+ rules.push(`${key} { ${declarations.trim()} }`);
783
+ }
784
+ return rules.join(' ');
785
+ }
786
+ /**
787
+ * Insert keyframes rule
788
+ */
789
+ insertKeyframes(registry, steps, name, root) {
790
+ let targetSheet = this.findAvailableSheet(registry, root);
791
+ if (!targetSheet) {
792
+ targetSheet = this.createSheet(registry, root);
793
+ }
794
+ const ruleIndex = this.findAvailableRuleIndex(targetSheet);
795
+ const sheetIndex = registry.sheets.indexOf(targetSheet);
796
+ try {
797
+ const cssSteps = this.stepsToCSS(steps);
798
+ const fullRule = `@keyframes ${name} { ${cssSteps} }`;
799
+ const styleElement = targetSheet.sheet;
800
+ const styleSheet = styleElement.sheet;
801
+ if (styleSheet && !this.config.forceTextInjection) {
802
+ const safeIndex = Math.min(Math.max(0, ruleIndex), styleSheet.cssRules.length);
803
+ styleSheet.insertRule(fullRule, safeIndex);
804
+ }
805
+ else {
806
+ styleElement.textContent =
807
+ (styleElement.textContent || '') + '\n' + fullRule;
808
+ }
809
+ targetSheet.ruleCount++;
810
+ return {
811
+ name,
812
+ ruleIndex,
813
+ sheetIndex,
814
+ cssText: this.config.devMode ? fullRule : undefined,
815
+ };
816
+ }
817
+ catch (error) {
818
+ console.warn('Failed to insert keyframes:', error);
819
+ return null;
820
+ }
821
+ }
822
+ /**
823
+ * Delete keyframes rule
824
+ */
825
+ deleteKeyframes(registry, info) {
826
+ const sheet = registry.sheets[info.sheetIndex];
827
+ if (!sheet)
828
+ return;
829
+ try {
830
+ const styleElement = sheet.sheet;
831
+ const styleSheet = styleElement.sheet;
832
+ if (styleSheet) {
833
+ if (info.ruleIndex >= 0 &&
834
+ info.ruleIndex < styleSheet.cssRules.length) {
835
+ styleSheet.deleteRule(info.ruleIndex);
836
+ sheet.ruleCount = Math.max(0, sheet.ruleCount - 1);
837
+ }
838
+ }
839
+ }
840
+ catch (error) {
841
+ console.warn('Failed to delete keyframes:', error);
842
+ }
843
+ }
844
+ /**
845
+ * Schedule async cleanup check (non-stacking)
846
+ */
847
+ checkCleanupNeeded(registry) {
848
+ // Clear any existing check timeout to prevent stacking
849
+ if (registry.cleanupCheckTimeout) {
850
+ clearTimeout(registry.cleanupCheckTimeout);
851
+ registry.cleanupCheckTimeout = null;
852
+ }
853
+ // Schedule the actual check with setTimeout(..., 0)
854
+ registry.cleanupCheckTimeout = setTimeout(() => {
855
+ this.performCleanupCheck(registry);
856
+ registry.cleanupCheckTimeout = null;
857
+ }, 0);
858
+ }
859
+ /**
860
+ * Perform the actual cleanup check (called asynchronously)
861
+ */
862
+ performCleanupCheck(registry) {
863
+ // Count unused rules (refCount = 0) - keyframes are disposed immediately
864
+ const unusedRulesCount = Array.from(registry.refCounts.values()).filter((count) => count === 0).length;
865
+ const threshold = this.config.unusedStylesThreshold || 500;
866
+ if (unusedRulesCount >= threshold) {
867
+ this.scheduleBulkCleanup(registry);
868
+ }
869
+ }
870
+ /**
871
+ * Clean up resources for a root
872
+ */
873
+ cleanup(root) {
874
+ const registry = this.rootRegistries.get(root);
875
+ if (!registry) {
876
+ return;
877
+ }
878
+ // Cancel any scheduled bulk cleanup
879
+ if (registry.bulkCleanupTimeout) {
880
+ if (this.config.idleCleanup &&
881
+ typeof cancelIdleCallback !== 'undefined') {
882
+ cancelIdleCallback(registry.bulkCleanupTimeout);
883
+ }
884
+ else {
885
+ clearTimeout(registry.bulkCleanupTimeout);
886
+ }
887
+ registry.bulkCleanupTimeout = null;
888
+ }
889
+ // Cancel any scheduled cleanup check
890
+ if (registry.cleanupCheckTimeout) {
891
+ clearTimeout(registry.cleanupCheckTimeout);
892
+ registry.cleanupCheckTimeout = null;
893
+ }
894
+ // Remove all sheets
895
+ for (const sheet of registry.sheets) {
896
+ try {
897
+ // Remove style element
898
+ const styleElement = sheet.sheet;
899
+ if (styleElement.parentNode) {
900
+ styleElement.parentNode.removeChild(styleElement);
901
+ }
902
+ }
903
+ catch (error) {
904
+ console.warn('Failed to cleanup sheet:', error);
905
+ }
906
+ }
907
+ // Clear registry
908
+ this.rootRegistries.delete(root);
909
+ }
910
+ }
911
+
912
+