@cube-dev/ui-kit 0.75.0 → 0.76.1

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 (501) hide show
  1. package/CHANGELOG.md +20 -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 +1 -1
  18. package/es/components/GridProvider.js +1 -1
  19. package/es/components/HiddenInput.js +1 -1
  20. package/es/components/Item.js +1 -1
  21. package/es/components/OpenTrasition.js +1 -1
  22. package/es/components/Root.js +1 -1
  23. package/es/components/actions/Action/Action.js +1 -1
  24. package/es/components/actions/Button/Button.js +1 -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 +1 -1
  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 +1 -1
  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 +1 -1
  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 +1 -1
  76. package/es/components/content/Title.js +1 -1
  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 +1 -1
  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 +1 -1
  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 +1 -1
  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 -1
  392. package/es/tasty/debug.js +644 -775
  393. package/es/tasty/index.js +1 -1
  394. package/es/tasty/injector/index.js +37 -15
  395. package/es/tasty/injector/injector.js +157 -145
  396. package/es/tasty/injector/sheet-manager.js +292 -134
  397. package/es/tasty/injector/types.js +1 -1
  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 +1 -1
  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 +1 -1
  409. package/es/tasty/styles/createStyle.js +1 -1
  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 +1 -1
  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 -1
  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 +1 -1
  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 +61 -50
  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/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 +44 -4
  455. package/es/tasty/utils/responsive.js +1 -1
  456. package/es/tasty/utils/string.js +1 -1
  457. package/es/tasty/utils/styles.js +39 -1
  458. package/es/tasty/utils/warnings.js +1 -1
  459. package/es/tokens.js +1 -1
  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/actions/Menu/styled.d.ts +60 -60
  492. package/types/components/content/List/SectionHeading.d.ts +20 -20
  493. package/types/components/fields/DatePicker/DatePickerElement.d.ts +20 -20
  494. package/types/tasty/debug.d.ts +133 -222
  495. package/types/tasty/injector/index.d.ts +18 -2
  496. package/types/tasty/injector/injector.d.ts +24 -16
  497. package/types/tasty/injector/sheet-manager.d.ts +19 -15
  498. package/types/tasty/injector/types.d.ts +29 -13
  499. package/types/tasty/utils/isDevEnv.d.ts +6 -0
  500. package/types/tasty/utils/renderStyles.d.ts +6 -1
  501. package/types/tasty/utils/styles.d.ts +1 -0
package/es/tasty/debug.js CHANGED
@@ -1,14 +1,15 @@
1
1
  /**
2
2
  * @license MIT
3
3
  * author: Cube Dev Team
4
- * @cube-dev/ui-kit v0.75.0
4
+ * @cube-dev/ui-kit v0.76.1
5
5
  * Released under the MIT license.
6
6
  */
7
7
 
8
8
  /**
9
9
  * Debug utilities for inspecting tasty-generated CSS at runtime
10
10
  */
11
- import { getCssText, getCssTextForNode, injector } from './injector';
11
+ import { getCssTextForNode, injector } from './injector';
12
+ import { isDevEnv } from './utils/isDevEnv';
12
13
  /**
13
14
  * Pretty-print CSS with proper indentation and formatting
14
15
  */
@@ -62,845 +63,713 @@ function prettifyCSS(css) {
62
63
  result = result.replace(/,\s+/g, ', ');
63
64
  return result;
64
65
  }
65
- /**
66
- * Debug utilities for inspecting tasty styles in runtime applications
67
- */
68
- export const tastyDebug = {
69
- /**
70
- * Get CSS for a specific tasty class (e.g., 't24')
71
- */
72
- getCSSForClass(className) {
73
- if (!className.match(/^t\d+$/)) {
74
- console.warn(`"${className}" doesn't look like a tasty class. Expected format: t{number}`);
75
- }
76
- const css = injector.instance.getCssTextForClasses([className]);
77
- return prettifyCSS(css);
78
- },
79
- /**
80
- * Get CSS for multiple tasty classes
81
- */
82
- getCSSForClasses(classNames) {
83
- const css = injector.instance.getCssTextForClasses(classNames);
84
- return prettifyCSS(css);
85
- },
86
- /**
87
- * Log CSS for a specific tasty class (e.g., 't24') to console
88
- */
89
- logCSSForClass(className) {
90
- if (!className.match(/^t\d+$/)) {
91
- console.warn(`"${className}" doesn't look like a tasty class. Expected format: t{number}`);
92
- }
93
- const css = this.getCSSForClass(className);
94
- this.logCSS(css, `CSS for class "${className}"`);
95
- },
96
- /**
97
- * Log CSS for multiple tasty classes to console
98
- */
99
- logCSSForClasses(classNames) {
100
- const css = this.getCSSForClasses(classNames);
101
- const title = `CSS for classes [${classNames.join(', ')}]`;
102
- this.logCSS(css, title);
103
- },
104
- /**
105
- * Inspect an element by CSS selector and get its tasty CSS
106
- */
107
- inspectElement(selector) {
108
- const element = document.querySelector(selector);
109
- if (!element) {
110
- return `Element not found: ${selector}`;
111
- }
112
- console.group(`🎨 Tasty CSS for "${selector}"`);
113
- console.log('Element:', element);
114
- const css = getCssTextForNode(element);
115
- if (css) {
116
- const prettified = prettifyCSS(css);
117
- console.log('Generated CSS:\n' + prettified);
118
- console.groupEnd();
119
- return prettified;
120
- }
121
- else {
122
- console.log('No tasty CSS found for this element');
123
- console.groupEnd();
124
- return 'No tasty CSS found';
125
- }
126
- },
127
- /**
128
- * Inspect a DOM element directly and get its tasty CSS
129
- */
130
- inspectDOMElement(element) {
131
- if (!element) {
132
- return 'Element is null or undefined';
133
- }
134
- console.group('🎨 Tasty CSS for element');
135
- console.log('Element:', element);
136
- const css = getCssTextForNode(element);
137
- if (css) {
138
- const prettified = prettifyCSS(css);
139
- console.log('Generated CSS:\n' + prettified);
140
- console.groupEnd();
141
- return prettified;
142
- }
143
- else {
144
- console.log('No tasty CSS found for this element');
145
- console.groupEnd();
146
- return 'No tasty CSS found';
66
+ // Helper functions
67
+ function findAllTastyClasses(root = document) {
68
+ const classes = new Set();
69
+ const elements = root.querySelectorAll?.('[class]') || [];
70
+ elements.forEach((element) => {
71
+ const classList = element.getAttribute('class');
72
+ if (classList) {
73
+ const tastyClasses = classList
74
+ .split(/\s+/)
75
+ .filter((cls) => /^t\d+$/.test(cls));
76
+ tastyClasses.forEach((cls) => classes.add(cls));
147
77
  }
148
- },
149
- /**
150
- * Get all tasty CSS currently injected into the page
151
- */
152
- getAllCSS() {
153
- return getCssText();
154
- },
155
- /**
156
- * Find all tasty classes used in the page (in DOM)
157
- */
158
- findAllTastyClasses() {
159
- const classes = new Set();
160
- // Find all elements with class attributes
161
- const elements = document.querySelectorAll('[class]');
162
- elements.forEach((element) => {
163
- const classList = element.getAttribute('class');
164
- if (classList) {
165
- // Extract tasty classes (t + digits)
166
- const tastyClasses = classList
167
- .split(/\s+/)
168
- .filter((cls) => /^t\d+$/.test(cls));
169
- tastyClasses.forEach((cls) => classes.add(cls));
78
+ });
79
+ return Array.from(classes).sort((a, b) => {
80
+ const aNum = parseInt(a.slice(1));
81
+ const bNum = parseInt(b.slice(1));
82
+ return aNum - bNum;
83
+ });
84
+ }
85
+ function findAllStyledClasses(root = document) {
86
+ // Extract tasty classes from all CSS text by parsing selectors
87
+ const allCSS = injector.instance.getCssText({ root });
88
+ const classes = new Set();
89
+ // Simple regex to find .t{number} class selectors
90
+ const classRegex = /\.t(\d+)/g;
91
+ let match;
92
+ while ((match = classRegex.exec(allCSS)) !== null) {
93
+ classes.add(`t${match[1]}`);
94
+ }
95
+ return Array.from(classes).sort((a, b) => {
96
+ const aNum = parseInt(a.slice(1));
97
+ const bNum = parseInt(b.slice(1));
98
+ return aNum - bNum;
99
+ });
100
+ }
101
+ function extractCSSRules(css) {
102
+ const rules = [];
103
+ // Remove comments
104
+ let cleanCSS = css.replace(/\/\*[\s\S]*?\*\//g, '');
105
+ let i = 0;
106
+ while (i < cleanCSS.length) {
107
+ // Skip whitespace
108
+ while (i < cleanCSS.length && /\s/.test(cleanCSS[i])) {
109
+ i++;
110
+ }
111
+ if (i >= cleanCSS.length)
112
+ break;
113
+ // Find selector start
114
+ const selectorStart = i;
115
+ let braceDepth = 0;
116
+ let inString = false;
117
+ let stringChar = '';
118
+ // Find opening brace
119
+ while (i < cleanCSS.length) {
120
+ const char = cleanCSS[i];
121
+ if (inString) {
122
+ if (char === stringChar && cleanCSS[i - 1] !== '\\') {
123
+ inString = false;
124
+ }
170
125
  }
171
- });
172
- return Array.from(classes).sort((a, b) => {
173
- // Sort numerically by the number part
174
- const aNum = parseInt(a.slice(1));
175
- const bNum = parseInt(b.slice(1));
176
- return aNum - bNum;
177
- });
178
- },
179
- /**
180
- * Find all tasty classes that have styles in the stylesheet (used + unused)
181
- */
182
- findAllStyledClasses() {
183
- const registry = injector.instance['sheetManager'].getRegistry(document);
184
- const classes = new Set();
185
- // Add all classes from rules map (active + unused)
186
- if (registry?.rules) {
187
- for (const className of registry.rules.keys()) {
188
- if (/^t\d+$/.test(className)) {
189
- classes.add(className);
126
+ else {
127
+ if (char === '"' || char === "'") {
128
+ inString = true;
129
+ stringChar = char;
130
+ }
131
+ else if (char === '{') {
132
+ braceDepth++;
133
+ if (braceDepth === 1)
134
+ break;
135
+ }
136
+ }
137
+ i++;
138
+ }
139
+ if (i >= cleanCSS.length)
140
+ break;
141
+ const selector = cleanCSS.substring(selectorStart, i).trim();
142
+ i++; // Skip opening brace
143
+ // Find matching closing brace
144
+ const contentStart = i;
145
+ braceDepth = 1;
146
+ inString = false;
147
+ while (i < cleanCSS.length && braceDepth > 0) {
148
+ const char = cleanCSS[i];
149
+ if (inString) {
150
+ if (char === stringChar && cleanCSS[i - 1] !== '\\') {
151
+ inString = false;
190
152
  }
191
153
  }
154
+ else {
155
+ if (char === '"' || char === "'") {
156
+ inString = true;
157
+ stringChar = char;
158
+ }
159
+ else if (char === '{') {
160
+ braceDepth++;
161
+ }
162
+ else if (char === '}') {
163
+ braceDepth--;
164
+ }
165
+ }
166
+ i++;
192
167
  }
193
- return Array.from(classes).sort((a, b) => {
194
- // Sort numerically by the number part
195
- const aNum = parseInt(a.slice(1));
196
- const bNum = parseInt(b.slice(1));
197
- return aNum - bNum;
168
+ const content = cleanCSS.substring(contentStart, i - 1).trim();
169
+ if (content && selector) {
170
+ rules.push({ selector, declarations: content });
171
+ }
172
+ }
173
+ return rules;
174
+ }
175
+ function getGlobalCSS(root = document) {
176
+ const allCSS = injector.instance.getCssText({ root });
177
+ const rules = extractCSSRules(allCSS);
178
+ const globalRules = rules.filter((rule) => {
179
+ const selectors = rule.selector.split(',').map((s) => s.trim());
180
+ return !selectors.every((selector) => {
181
+ const cleanSelector = selector.replace(/[.#:\s>+~[\]()]/g, ' ');
182
+ const parts = cleanSelector.split(/\s+/).filter(Boolean);
183
+ return parts.length > 0 && parts.every((part) => /^t\d+$/.test(part));
198
184
  });
199
- },
200
- /**
201
- * Get active vs cached class breakdown
202
- */
203
- getClassUsage() {
204
- const domClasses = this.findAllTastyClasses();
205
- const styledClasses = this.findAllStyledClasses();
206
- const registry = injector.instance['sheetManager'].getRegistry(document);
207
- const activeClasses = domClasses;
208
- const cachedClasses = styledClasses.filter((cls) => !domClasses.includes(cls));
209
- // Also check unusedRules registry for classes that are marked as cached (unused but kept for performance)
210
- if (registry?.unusedRules) {
211
- for (const className of registry.unusedRules.keys()) {
212
- if (/^t\d+$/.test(className) && !cachedClasses.includes(className)) {
213
- cachedClasses.push(className);
185
+ });
186
+ const globalCSS = globalRules
187
+ .map((rule) => `${rule.selector} { ${rule.declarations} }`)
188
+ .join('\n');
189
+ return prettifyCSS(globalCSS);
190
+ }
191
+ function getPageCSS(options) {
192
+ const root = options?.root || document;
193
+ const includeCrossOrigin = options?.includeCrossOrigin ?? false;
194
+ const cssChunks = [];
195
+ try {
196
+ if ('styleSheets' in root) {
197
+ const styleSheets = Array.from(root.styleSheets);
198
+ for (const sheet of styleSheets) {
199
+ try {
200
+ if (sheet.cssRules) {
201
+ const rules = Array.from(sheet.cssRules);
202
+ cssChunks.push(rules.map((rule) => rule.cssText).join('\n'));
203
+ }
204
+ }
205
+ catch (e) {
206
+ // Cross-origin sheet or other access error
207
+ if (includeCrossOrigin) {
208
+ cssChunks.push(`/* Cross-origin stylesheet: ${sheet.href || 'inline'} */`);
209
+ }
214
210
  }
215
211
  }
216
212
  }
217
- return {
218
- activeClasses: activeClasses.sort((a, b) => {
219
- const aNum = parseInt(a.slice(1));
220
- const bNum = parseInt(b.slice(1));
221
- return aNum - bNum;
222
- }),
223
- cachedClasses: cachedClasses.sort((a, b) => {
224
- const aNum = parseInt(a.slice(1));
225
- const bNum = parseInt(b.slice(1));
226
- return aNum - bNum;
227
- }),
228
- totalStyledClasses: styledClasses,
229
- };
230
- },
231
- /**
232
- * Get a comprehensive summary of all tasty styles
233
- */
234
- getSummary() {
235
- const usage = this.getClassUsage();
236
- const allCSS = this.getAllCSS();
237
- const activeCSS = this.getCSSForClasses(usage.activeClasses);
238
- const cachedCSS = this.getCSSForClasses(usage.cachedClasses);
239
- const globalCSS = this.getGlobalCSS();
240
- const globalBreakdown = this.getGlobalCSSBreakdown();
241
- const metrics = injector.instance.getMetrics();
242
- const definedProperties = this.getDefinedProperties();
243
- const definedKeyframes = this.getDefinedKeyframes();
244
- const cleanupSummary = this.getCleanupSummary();
245
- const summary = {
246
- activeClasses: usage.activeClasses,
247
- cachedClasses: usage.cachedClasses,
248
- totalStyledClasses: usage.totalStyledClasses,
249
- activeCSSSize: activeCSS.length,
250
- cachedCSSSize: cachedCSS.length,
251
- totalCSSSize: allCSS.length,
252
- activeCSS,
253
- cachedCSS,
254
- allCSS,
255
- globalCSS,
256
- globalCSSSize: globalCSS.length,
257
- globalRuleCount: globalBreakdown.totalRules,
258
- metrics,
259
- definedProperties,
260
- definedKeyframes,
261
- propertyCount: definedProperties.length,
262
- keyframeCount: definedKeyframes.length,
263
- cleanupSummary,
264
- };
265
- console.group('🎨 Comprehensive Tasty Debug Summary');
266
- console.log(`📊 Style Cache Status:`);
267
- console.log(` • Active classes (in DOM): ${summary.activeClasses.length}`);
268
- console.log(` • Cached classes (performance cache): ${summary.cachedClasses.length}`);
269
- console.log(` • Total styled classes: ${summary.totalStyledClasses.length}`);
270
- console.log(`💾 CSS Size:`);
271
- console.log(` • Active CSS: ${summary.activeCSSSize} characters`);
272
- console.log(` • Cached CSS: ${summary.cachedCSSSize} characters`);
273
- console.log(` • Global CSS: ${summary.globalCSSSize} characters (${summary.globalRuleCount} rules)`);
274
- console.log(` • Total CSS: ${summary.totalCSSSize} characters`);
275
- console.log('🏷️ Properties & Keyframes:');
276
- console.log(` • Defined @property: ${definedProperties.length}`);
277
- console.log(` • Defined keyframes: ${definedKeyframes.length}`);
278
- if (definedProperties.length > 0) {
279
- console.log(' • Properties:', definedProperties);
280
- }
281
- if (definedKeyframes.length > 0) {
282
- console.log(' • Keyframes:', definedKeyframes.map((k) => `${k.name} (refs: ${k.refCount})`));
213
+ }
214
+ catch (e) {
215
+ // Fallback error handling
216
+ }
217
+ return cssChunks.join('\n');
218
+ }
219
+ function getPageStats(options) {
220
+ const root = options?.root || document;
221
+ const includeCrossOrigin = options?.includeCrossOrigin ?? false;
222
+ let cssSize = 0;
223
+ let ruleCount = 0;
224
+ let stylesheetCount = 0;
225
+ let skippedStylesheets = 0;
226
+ try {
227
+ if ('styleSheets' in root) {
228
+ const styleSheets = Array.from(root.styleSheets);
229
+ stylesheetCount = styleSheets.length;
230
+ for (const sheet of styleSheets) {
231
+ try {
232
+ if (sheet.cssRules) {
233
+ const rules = Array.from(sheet.cssRules);
234
+ ruleCount += rules.length;
235
+ cssSize += rules.reduce((sum, rule) => sum + rule.cssText.length, 0);
236
+ }
237
+ }
238
+ catch (e) {
239
+ skippedStylesheets++;
240
+ }
241
+ }
283
242
  }
284
- console.log('🧹 Cleanup Statistics:');
285
- if (cleanupSummary.enabled) {
286
- console.log(` • Total cleanups performed: ${cleanupSummary.totalCleanups}`);
287
- console.log(` • Total classes deleted: ${cleanupSummary.totalClassesDeleted}`);
288
- console.log(` • Total CSS deleted: ${cleanupSummary.totalCssDeleted} chars`);
289
- console.log(` • Total rules deleted: ${cleanupSummary.totalRulesDeleted}`);
290
- if (cleanupSummary.totalCleanups > 0) {
291
- console.log(` • Avg classes per cleanup: ${cleanupSummary.averageClassesPerCleanup.toFixed(1)}`);
292
- console.log(` • Avg CSS per cleanup: ${cleanupSummary.averageCssPerCleanup.toFixed(0)} chars`);
293
- console.log(` • Avg rules per cleanup: ${cleanupSummary.averageRulesPerCleanup.toFixed(1)}`);
243
+ }
244
+ catch (e) {
245
+ // Fallback error handling
246
+ }
247
+ return { cssSize, ruleCount, stylesheetCount, skippedStylesheets };
248
+ }
249
+ /**
250
+ * Concise tastyDebug API for inspecting styles at runtime
251
+ */
252
+ export const tastyDebug = {
253
+ // 1) One function to get CSS from anywhere
254
+ css(target, opts) {
255
+ const { root = document, prettify = true, log = false } = opts || {};
256
+ let css = '';
257
+ if (typeof target === 'string') {
258
+ if (target === 'all') {
259
+ css = injector.instance.getCssText({ root });
294
260
  }
295
- if (cleanupSummary.lastCleanup) {
296
- console.log(` • Last cleanup: ${cleanupSummary.lastCleanup.date}`);
261
+ else if (target === 'global') {
262
+ css = getGlobalCSS(root);
263
+ }
264
+ else if (target === 'active') {
265
+ const activeClasses = findAllTastyClasses(root);
266
+ css = injector.instance.getCssTextForClasses(activeClasses, { root });
267
+ }
268
+ else if (target === 'unused') {
269
+ // Get unused classes (refCount = 0) from the registry
270
+ const registry = injector.instance['sheetManager']?.getRegistry(root);
271
+ const unusedClasses = registry
272
+ ? Array.from(registry.refCounts.entries())
273
+ .filter(([, refCount]) => refCount === 0)
274
+ .map(([className]) => className)
275
+ : [];
276
+ css = injector.instance.getCssTextForClasses(unusedClasses, { root });
277
+ }
278
+ else if (target === 'page') {
279
+ css = getPageCSS({ root, includeCrossOrigin: true });
280
+ }
281
+ else if (/^t\d+$/.test(target)) {
282
+ // Single tasty class
283
+ css = injector.instance.getCssTextForClasses([target], { root });
284
+ }
285
+ else {
286
+ // CSS selector - find element and get its CSS
287
+ const element = root.querySelector?.(target);
288
+ if (element) {
289
+ css = getCssTextForNode(element, { root });
290
+ }
297
291
  }
298
292
  }
299
- else {
300
- console.log(' • Metrics collection disabled (enable with collectMetrics: true)');
301
- }
302
- console.log(`⚡ Performance Metrics:`);
303
- if (metrics) {
304
- console.log(` • Cache hits: ${metrics.hits}`);
305
- console.log(` • Cache misses: ${metrics.misses}`);
306
- console.log(` • Cached style reuses: ${metrics.unusedHits}`);
307
- console.log(` • Total insertions: ${metrics.totalInsertions}`);
308
- console.log(` • Styles cleaned up: ${metrics.stylesCleanedUp}`);
309
- const hitRate = metrics.hits + metrics.misses > 0
310
- ? (((metrics.hits + metrics.unusedHits) /
311
- (metrics.hits + metrics.misses)) *
312
- 100).toFixed(1)
313
- : 0;
314
- console.log(` • Overall cache hit rate: ${hitRate}%`);
293
+ else if (Array.isArray(target)) {
294
+ // Array of tasty classes
295
+ css = injector.instance.getCssTextForClasses(target, { root });
315
296
  }
316
- else {
317
- console.log(` • Metrics not available (enable with collectMetrics: true)`);
297
+ else if (target instanceof Element) {
298
+ // DOM element
299
+ css = getCssTextForNode(target, { root });
318
300
  }
319
- console.log('🔍 Details:');
320
- console.log(' • Active classes:', summary.activeClasses);
321
- console.log(' • Cached classes:', summary.cachedClasses);
322
- console.log('ℹ️ Note: Cached styles are kept for performance - avoiding expensive DOM operations');
323
- console.groupEnd();
324
- return summary;
325
- },
326
- /**
327
- * Helper to log CSS in a readable format
328
- */
329
- logCSS(css, title = 'CSS') {
330
- if (!css || css.trim() === '') {
331
- console.log(`${title}: (empty)`);
332
- return;
301
+ const result = prettify ? prettifyCSS(css) : css;
302
+ if (log) {
303
+ console.group(`🎨 CSS for ${Array.isArray(target) ? `[${target.join(', ')}]` : target}`);
304
+ console.log(result || '(empty)');
305
+ console.groupEnd();
333
306
  }
334
- console.group(`🎨 ${title}`);
335
- const prettified = prettifyCSS(css);
336
- console.log(prettified);
337
- console.groupEnd();
307
+ return result;
338
308
  },
339
- /**
340
- * Advanced inspection with detailed breakdown and statistics
341
- */
342
- inspect(target) {
343
- const element = typeof target === 'string' ? document.querySelector(target) : target;
309
+ // 2) Element-level inspection
310
+ inspect(target, opts) {
311
+ const { root = document } = opts || {};
312
+ const element = typeof target === 'string'
313
+ ? root.querySelector?.(target)
314
+ : target;
344
315
  if (!element) {
345
- console.error(`Element not found: ${target}`);
346
316
  return {
347
317
  element: null,
348
- tastyClasses: [],
318
+ classes: [],
349
319
  css: '',
350
- cssSize: 0,
351
- ruleCount: 0,
352
- breakdown: {},
353
- stats: {
354
- totalClasses: 0,
355
- totalRules: 0,
356
- totalCSSSize: 0,
357
- averageRulesPerClass: 0,
358
- averageCSSPerClass: 0,
359
- },
320
+ size: 0,
321
+ rules: 0,
360
322
  };
361
323
  }
362
- // Find tasty classes on this element
363
324
  const classList = element.getAttribute('class') || '';
364
325
  const tastyClasses = classList
365
326
  .split(/\s+/)
366
327
  .filter((cls) => /^t\d+$/.test(cls));
367
- // Get CSS for the entire subtree
368
- const fullCSS = getCssTextForNode(element);
369
- const prettifiedCSS = prettifyCSS(fullCSS);
370
- // Count CSS rules in the full CSS
371
- const ruleCount = (fullCSS.match(/\{[^}]*\}/g) || []).length;
372
- // Get CSS breakdown per class with detailed stats
373
- const breakdown = {};
374
- let totalClassRules = 0;
375
- let totalClassCSSSize = 0;
376
- tastyClasses.forEach((className) => {
377
- const classCSS = this.getCSSForClass(className);
378
- const classRuleCount = (classCSS.match(/\{[^}]*\}/g) || []).length;
379
- breakdown[className] = {
380
- css: classCSS,
381
- cssSize: classCSS.length,
382
- ruleCount: classRuleCount,
383
- };
384
- totalClassRules += classRuleCount;
385
- totalClassCSSSize += classCSS.length;
386
- });
387
- // Calculate statistics
388
- const stats = {
389
- totalClasses: tastyClasses.length,
390
- totalRules: totalClassRules,
391
- totalCSSSize: totalClassCSSSize,
392
- averageRulesPerClass: tastyClasses.length > 0 ? totalClassRules / tastyClasses.length : 0,
393
- averageCSSPerClass: tastyClasses.length > 0 ? totalClassCSSSize / tastyClasses.length : 0,
394
- };
395
- const result = {
328
+ const css = getCssTextForNode(element, { root });
329
+ const prettifiedCSS = prettifyCSS(css);
330
+ const ruleCount = (css.match(/\{[^}]*\}/g) || []).length;
331
+ return {
396
332
  element,
397
- tastyClasses,
333
+ classes: tastyClasses,
398
334
  css: prettifiedCSS,
399
- cssSize: fullCSS.length,
400
- ruleCount,
401
- breakdown,
402
- stats,
335
+ size: css.length,
336
+ rules: ruleCount,
403
337
  };
404
- console.group(`🔍 Detailed Tasty Inspection`);
405
- console.log('Element:', element);
406
- console.log('📊 Overview:');
407
- console.log(` • Tasty classes: ${stats.totalClasses}`);
408
- console.log(` • Total rules applied: ${ruleCount}`);
409
- console.log(` • Total CSS size: ${fullCSS.length} characters`);
410
- console.log('🏷️ Classes:', tastyClasses);
411
- console.log('📈 Statistics:');
412
- console.log(` • Rules per class (avg): ${stats.averageRulesPerClass.toFixed(1)}`);
413
- console.log(` • CSS per class (avg): ${stats.averageCSSPerClass.toFixed(0)} chars`);
414
- console.log('🎨 Element CSS:\n' + prettifiedCSS);
415
- console.log('🔨 CSS breakdown by class:');
416
- Object.entries(breakdown).forEach(([className, data]) => {
417
- console.log(` ${className}: ${data.ruleCount} rules, ${data.cssSize} chars`);
418
- });
419
- console.groupEnd();
420
- return result;
421
- },
422
- /**
423
- * Get CSS for active classes only
424
- */
425
- getActiveCSS() {
426
- const usage = this.getClassUsage();
427
- return this.getCSSForClasses(usage.activeClasses);
428
338
  },
429
- /**
430
- * Get CSS for cached classes only
431
- */
432
- getCachedCSS() {
433
- const usage = this.getClassUsage();
434
- return this.getCSSForClasses(usage.cachedClasses);
339
+ // 3) Cache + metrics at a glance
340
+ cache(opts) {
341
+ const { root = document } = opts || {};
342
+ const activeClasses = findAllTastyClasses(root);
343
+ const allClasses = findAllStyledClasses(root);
344
+ // Get unused classes (refCount = 0) from the registry
345
+ const registry = injector.instance['sheetManager']?.getRegistry(root);
346
+ const unusedClasses = registry
347
+ ? Array.from(registry.refCounts.entries())
348
+ .filter(([, refCount]) => refCount === 0)
349
+ .map(([className]) => className)
350
+ : [];
351
+ return {
352
+ classes: {
353
+ active: activeClasses,
354
+ unused: unusedClasses,
355
+ all: [...activeClasses, ...unusedClasses],
356
+ },
357
+ metrics: injector.instance.getMetrics({ root }),
358
+ };
435
359
  },
436
- /**
437
- * Get all defined @property custom properties
438
- */
439
- getDefinedProperties() {
440
- const registry = injector.instance['sheetManager'].getRegistry(document);
441
- if (!registry?.injectedProperties) {
442
- return [];
443
- }
444
- return Array.from(registry.injectedProperties).sort();
360
+ // 4) Cleanup + metrics utilities
361
+ cleanup(opts) {
362
+ const { root } = opts || {};
363
+ injector.instance.cleanup(root);
445
364
  },
446
- /**
447
- * Get all defined keyframes
448
- */
449
- getDefinedKeyframes() {
450
- const registry = injector.instance['sheetManager'].getRegistry(document);
451
- if (!registry?.keyframesCache) {
452
- return [];
453
- }
454
- const keyframes = [];
455
- for (const [cacheKey, entry] of registry.keyframesCache.entries()) {
456
- keyframes.push({
457
- name: entry.name,
458
- refCount: entry.refCount,
459
- cssText: entry.info?.cssText,
460
- });
461
- }
462
- return keyframes.sort((a, b) => a.name.localeCompare(b.name));
365
+ metrics(opts) {
366
+ const { root } = opts || {};
367
+ return injector.instance.getMetrics({ root });
463
368
  },
464
- /**
465
- * Check if a specific @property is defined
466
- */
467
- isPropertyDefined(propertyName) {
468
- return injector.instance.isPropertyDefined(propertyName);
369
+ resetMetrics(opts) {
370
+ const { root } = opts || {};
371
+ injector.instance.resetMetrics({ root });
469
372
  },
470
- /**
471
- * Check if a specific keyframe is defined
472
- */
473
- isKeyframeDefined(keyframeName) {
474
- const registry = injector.instance['sheetManager'].getRegistry(document);
475
- if (!registry?.keyframesCache) {
476
- return false;
477
- }
478
- for (const entry of registry.keyframesCache.values()) {
479
- if (entry.name === keyframeName) {
480
- return true;
373
+ // 5) Get CSS for specific global types
374
+ getGlobalTypeCSS(type, opts) {
375
+ const { root = document } = opts || {};
376
+ const registry = injector.instance['sheetManager']?.getRegistry(root);
377
+ if (!registry) {
378
+ return { css: '', ruleCount: 0, size: 0 };
379
+ }
380
+ const cssChunks = [];
381
+ let ruleCount = 0;
382
+ if (type === 'keyframes') {
383
+ // Handle keyframes separately - they're stored in keyframesCache
384
+ for (const [, entry] of registry.keyframesCache) {
385
+ const info = entry.info;
386
+ const sheet = registry.sheets[info.sheetIndex];
387
+ const styleSheet = sheet?.sheet?.sheet;
388
+ if (styleSheet && info.ruleIndex < styleSheet.cssRules.length) {
389
+ const rule = styleSheet.cssRules[info.ruleIndex];
390
+ if (rule) {
391
+ cssChunks.push(rule.cssText);
392
+ ruleCount++;
393
+ }
394
+ }
395
+ else if (info.cssText) {
396
+ cssChunks.push(info.cssText);
397
+ ruleCount++;
398
+ }
481
399
  }
482
400
  }
483
- return false;
484
- },
485
- /**
486
- * Get detailed cleanup statistics history
487
- */
488
- getCleanupHistory() {
489
- const registry = injector.instance['sheetManager'].getRegistry(document);
490
- if (!registry?.metrics?.cleanupHistory) {
491
- return {
492
- totalCleanups: 0,
493
- totalClassesDeleted: 0,
494
- totalCssDeleted: 0,
495
- totalRulesDeleted: 0,
496
- cleanupHistory: [],
497
- };
401
+ else {
402
+ // Handle other global types stored in globalRules
403
+ const prefix = type === 'global' ? 'global:' : type === 'raw' ? 'raw:' : 'property:';
404
+ for (const [key, ruleInfo] of registry.globalRules) {
405
+ if (key.startsWith(prefix)) {
406
+ const sheet = registry.sheets[ruleInfo.sheetIndex];
407
+ const styleSheet = sheet?.sheet?.sheet;
408
+ if (styleSheet) {
409
+ const start = Math.max(0, ruleInfo.ruleIndex);
410
+ const end = Math.min(styleSheet.cssRules.length - 1, ruleInfo.endRuleIndex ?? ruleInfo.ruleIndex);
411
+ if (start >= 0 &&
412
+ end >= start &&
413
+ start < styleSheet.cssRules.length) {
414
+ for (let i = start; i <= end; i++) {
415
+ const rule = styleSheet.cssRules[i];
416
+ if (rule) {
417
+ cssChunks.push(rule.cssText);
418
+ ruleCount++;
419
+ }
420
+ }
421
+ }
422
+ }
423
+ else if (ruleInfo.cssText && ruleInfo.cssText.length) {
424
+ // Fallback in environments without CSSOM access
425
+ cssChunks.push(...ruleInfo.cssText);
426
+ ruleCount += ruleInfo.cssText.length;
427
+ }
428
+ }
429
+ }
498
430
  }
499
- const history = registry.metrics.cleanupHistory;
500
- const totalClassesDeleted = history.reduce((sum, cleanup) => sum + cleanup.classesDeleted, 0);
501
- const totalCssDeleted = history.reduce((sum, cleanup) => sum + cleanup.cssSize, 0);
502
- const totalRulesDeleted = history.reduce((sum, cleanup) => sum + cleanup.rulesDeleted, 0);
431
+ const rawCSS = cssChunks.join('\n');
503
432
  return {
504
- totalCleanups: history.length,
505
- totalClassesDeleted,
506
- totalCssDeleted,
507
- totalRulesDeleted,
508
- cleanupHistory: history.map((cleanup) => ({
509
- ...cleanup,
510
- date: new Date(cleanup.timestamp).toISOString(),
511
- })),
433
+ css: prettifyCSS(rawCSS),
434
+ ruleCount,
435
+ size: rawCSS.length, // Use raw CSS size for consistent calculations
512
436
  };
513
437
  },
514
- /**
515
- * Get cleanup statistics summary
516
- */
517
- getCleanupSummary() {
518
- const registry = injector.instance['sheetManager'].getRegistry(document);
519
- if (!registry?.metrics) {
520
- return {
521
- enabled: false,
522
- totalCleanups: 0,
523
- totalClassesDeleted: 0,
524
- totalCssDeleted: 0,
525
- totalRulesDeleted: 0,
526
- averageClassesPerCleanup: 0,
527
- averageCssPerCleanup: 0,
528
- averageRulesPerCleanup: 0,
529
- };
438
+ // 6) Defined @property and keyframes
439
+ defs(opts) {
440
+ const { root = document } = opts || {};
441
+ // Get properties from injector if available, otherwise scan CSS
442
+ let properties = [];
443
+ try {
444
+ const registry = injector.instance['sheetManager']?.getRegistry(root);
445
+ if (registry?.injectedProperties) {
446
+ properties = Array.from(registry.injectedProperties).sort();
447
+ }
530
448
  }
531
- const history = registry.metrics.cleanupHistory || [];
532
- const totalClassesDeleted = history.reduce((sum, cleanup) => sum + cleanup.classesDeleted, 0);
533
- const totalCssDeleted = history.reduce((sum, cleanup) => sum + cleanup.cssSize, 0);
534
- const totalRulesDeleted = history.reduce((sum, cleanup) => sum + cleanup.rulesDeleted, 0);
535
- const totalCleanups = history.length;
536
- const lastCleanup = history.length > 0 ? history[history.length - 1] : undefined;
537
- return {
538
- enabled: true,
539
- totalCleanups,
540
- totalClassesDeleted,
541
- totalCssDeleted,
542
- totalRulesDeleted,
543
- averageClassesPerCleanup: totalCleanups > 0 ? totalClassesDeleted / totalCleanups : 0,
544
- averageCssPerCleanup: totalCleanups > 0 ? totalCssDeleted / totalCleanups : 0,
545
- averageRulesPerCleanup: totalCleanups > 0 ? totalRulesDeleted / totalCleanups : 0,
546
- lastCleanup: lastCleanup
547
- ? {
548
- ...lastCleanup,
549
- date: new Date(lastCleanup.timestamp).toISOString(),
449
+ catch {
450
+ // Fallback: scan CSS for @property rules
451
+ const allCSS = injector.instance.getCssText({ root });
452
+ const propRegex = /@property\s+(--[a-z0-9-]+)/gi;
453
+ const propSet = new Set();
454
+ let match;
455
+ while ((match = propRegex.exec(allCSS)) !== null) {
456
+ propSet.add(match[1]);
457
+ }
458
+ properties = Array.from(propSet).sort();
459
+ }
460
+ // Get keyframes
461
+ let keyframes = [];
462
+ try {
463
+ const registry = injector.instance['sheetManager']?.getRegistry(root);
464
+ if (registry) {
465
+ for (const entry of registry.keyframesCache.values()) {
466
+ keyframes.push({
467
+ name: entry.name,
468
+ refCount: entry.refCount,
469
+ });
550
470
  }
551
- : undefined,
552
- };
553
- },
554
- /**
555
- * Log cleanup history to console in a readable format
556
- */
557
- logCleanupHistory() {
558
- const cleanupData = this.getCleanupHistory();
559
- if (cleanupData.totalCleanups === 0) {
560
- console.log('🧹 No cleanup history available');
561
- return;
471
+ keyframes.sort((a, b) => a.name.localeCompare(b.name));
472
+ }
562
473
  }
563
- console.group(`🧹 Cleanup History (${cleanupData.totalCleanups} cleanups)`);
564
- console.log('📊 Total Statistics:');
565
- console.log(` • Total classes deleted: ${cleanupData.totalClassesDeleted}`);
566
- console.log(` • Total CSS deleted: ${cleanupData.totalCssDeleted} characters`);
567
- console.log(` • Total rules deleted: ${cleanupData.totalRulesDeleted}`);
568
- console.log('\n📅 Cleanup Sessions:');
569
- cleanupData.cleanupHistory.forEach((cleanup, index) => {
570
- console.log(` ${index + 1}. ${cleanup.date}`);
571
- console.log(` • Classes: ${cleanup.classesDeleted}`);
572
- console.log(` • CSS: ${cleanup.cssSize} chars`);
573
- console.log(` • Rules: ${cleanup.rulesDeleted}`);
574
- });
575
- console.groupEnd();
576
- },
577
- /**
578
- * Get all global CSS rules (non-tasty class selectors)
579
- */
580
- getGlobalCSS() {
581
- const allCSS = this.getAllCSS();
582
- // Split CSS into rules and filter out tasty class rules
583
- const rules = this.extractCSSRules(allCSS);
584
- const globalRules = rules.filter((rule) => {
585
- // Filter out rules that only contain tasty classes (t + digits)
586
- const selectors = rule.selector.split(',').map((s) => s.trim());
587
- return !selectors.every((selector) => {
588
- // Check if selector is purely a tasty class or contains only tasty classes
589
- const cleanSelector = selector.replace(/[.#:\s>+~[\]()]/g, ' ');
590
- const parts = cleanSelector.split(/\s+/).filter(Boolean);
591
- return parts.length > 0 && parts.every((part) => /^t\d+$/.test(part));
592
- });
593
- });
594
- const globalCSS = globalRules
595
- .map((rule) => `${rule.selector} { ${rule.declarations} }`)
596
- .join('\n');
597
- return prettifyCSS(globalCSS);
598
- },
599
- /**
600
- * Log global CSS to console
601
- */
602
- logGlobalCSS() {
603
- const globalCSS = this.getGlobalCSS();
604
- if (!globalCSS.trim()) {
605
- console.log('🌍 No global CSS found');
606
- return;
474
+ catch {
475
+ // Fallback: scan CSS for @keyframes rules
476
+ const allCSS = injector.instance.getCssText({ root });
477
+ const keyframesRegex = /@keyframes\s+([a-zA-Z0-9_-]+)/gi;
478
+ const keyframesSet = new Set();
479
+ let match;
480
+ while ((match = keyframesRegex.exec(allCSS)) !== null) {
481
+ keyframesSet.add(match[1]);
482
+ }
483
+ keyframes = Array.from(keyframesSet)
484
+ .sort()
485
+ .map((name) => ({ name, refCount: 1 }));
607
486
  }
608
- this.logCSS(globalCSS, 'Global CSS (createGlobalStyle)');
487
+ return { properties, keyframes };
609
488
  },
610
- /**
611
- * Get global CSS rules breakdown with detailed analysis
612
- */
613
- getGlobalCSSBreakdown() {
614
- const allCSS = this.getAllCSS();
615
- const rules = this.extractCSSRules(allCSS);
616
- const globalRules = rules.filter((rule) => {
617
- const selectors = rule.selector.split(',').map((s) => s.trim());
618
- return !selectors.every((selector) => {
619
- const cleanSelector = selector.replace(/[.#:\s>+~[\]()]/g, ' ');
620
- const parts = cleanSelector.split(/\s+/).filter(Boolean);
621
- return parts.length > 0 && parts.every((part) => /^t\d+$/.test(part));
622
- });
623
- });
624
- const breakdown = globalRules.map((rule) => ({
625
- selector: rule.selector,
626
- declarations: rule.declarations,
627
- ruleCount: 1,
628
- }));
629
- const css = globalRules
630
- .map((rule) => `${rule.selector} { ${rule.declarations} }`)
631
- .join('\n');
632
- const prettifiedCSS = prettifyCSS(css);
633
- // Analyze selectors
634
- const selectors = {
635
- elements: [],
636
- classes: [],
637
- ids: [],
638
- pseudoClasses: [],
639
- mediaQueries: [],
640
- keyframes: [],
641
- other: [],
489
+ // 7) One-shot overview
490
+ summary(opts) {
491
+ const { root = document, log = false, includePageCSS = false } = opts || {};
492
+ const cacheStatus = this.cache({ root });
493
+ const definitions = this.defs({ root });
494
+ const metrics = this.metrics({ root });
495
+ const activeCSS = this.css('active', { root, prettify: false });
496
+ const unusedCSS = this.css('unused', { root, prettify: false });
497
+ const allCSS = this.css('all', { root, prettify: false });
498
+ // Calculate global CSS by subtracting class-based CSS from total
499
+ const classCSSSize = activeCSS.length + unusedCSS.length;
500
+ const totalGlobalCSSSize = allCSS.length - classCSSSize;
501
+ // Get CSS for each global type separately for display purposes
502
+ const globalData = this.getGlobalTypeCSS('global', { root });
503
+ const rawData = this.getGlobalTypeCSS('raw', { root });
504
+ const keyframesData = this.getGlobalTypeCSS('keyframes', { root });
505
+ const propertyData = this.getGlobalTypeCSS('property', { root });
506
+ // Use the calculated sizes to avoid double-counting
507
+ const globalTypesTotalSize = globalData.size + rawData.size + keyframesData.size + propertyData.size;
508
+ // Build cleanup summary from metrics
509
+ const cleanupSummary = {
510
+ enabled: !!metrics,
511
+ totalCleanups: metrics?.cleanupHistory?.length || 0,
512
+ totalClassesDeleted: metrics?.cleanupHistory?.reduce((sum, c) => sum + c.classesDeleted, 0) || 0,
513
+ totalCssDeleted: metrics?.cleanupHistory?.reduce((sum, c) => sum + c.cssSize, 0) || 0,
514
+ totalRulesDeleted: metrics?.cleanupHistory?.reduce((sum, c) => sum + c.rulesDeleted, 0) ||
515
+ 0,
516
+ averageClassesPerCleanup: 0,
517
+ averageCssPerCleanup: 0,
518
+ averageRulesPerCleanup: 0,
519
+ lastCleanup: undefined,
642
520
  };
643
- globalRules.forEach((rule) => {
644
- const selector = rule.selector;
645
- // Categorize selectors
646
- if (selector.startsWith('@media')) {
647
- selectors.mediaQueries.push(selector);
648
- }
649
- else if (selector.startsWith('@keyframes')) {
650
- selectors.keyframes.push(selector);
651
- }
652
- else if (selector.includes('.') &&
653
- !selector.includes('#') &&
654
- !selector.includes(':')) {
655
- selectors.classes.push(selector);
656
- }
657
- else if (selector.includes('#') &&
658
- !selector.includes('.') &&
659
- !selector.includes(':')) {
660
- selectors.ids.push(selector);
661
- }
662
- else if (selector.includes(':')) {
663
- selectors.pseudoClasses.push(selector);
664
- }
665
- else if (/^[a-zA-Z][a-zA-Z0-9]*$/.test(selector.trim())) {
666
- selectors.elements.push(selector);
667
- }
668
- else {
669
- selectors.other.push(selector);
521
+ if (cleanupSummary.totalCleanups > 0) {
522
+ cleanupSummary.averageClassesPerCleanup =
523
+ cleanupSummary.totalClassesDeleted / cleanupSummary.totalCleanups;
524
+ cleanupSummary.averageCssPerCleanup =
525
+ cleanupSummary.totalCssDeleted / cleanupSummary.totalCleanups;
526
+ cleanupSummary.averageRulesPerCleanup =
527
+ cleanupSummary.totalRulesDeleted / cleanupSummary.totalCleanups;
528
+ const lastCleanup = metrics?.cleanupHistory?.[metrics.cleanupHistory.length - 1];
529
+ if (lastCleanup) {
530
+ cleanupSummary.lastCleanup = {
531
+ ...lastCleanup,
532
+ date: new Date(lastCleanup.timestamp).toISOString(),
533
+ };
670
534
  }
671
- });
672
- return {
673
- globalRules: breakdown,
674
- totalRules: breakdown.length,
675
- totalCSSSize: css.length,
676
- css: prettifiedCSS,
677
- selectors,
678
- };
679
- },
680
- /**
681
- * Log detailed global CSS breakdown
682
- */
683
- logGlobalCSSBreakdown() {
684
- const breakdown = this.getGlobalCSSBreakdown();
685
- if (breakdown.totalRules === 0) {
686
- console.log('🌍 No global CSS rules found');
687
- return;
688
- }
689
- console.group(`🌍 Global CSS Breakdown (${breakdown.totalRules} rules)`);
690
- console.log(`📊 Statistics:`);
691
- console.log(` • Total global rules: ${breakdown.totalRules}`);
692
- console.log(` • Total CSS size: ${breakdown.totalCSSSize} characters`);
693
- console.log(`🎯 Selector Analysis:`);
694
- if (breakdown.selectors.elements.length > 0) {
695
- console.log(` • Element selectors: ${breakdown.selectors.elements.length}`, breakdown.selectors.elements.slice(0, 5));
696
- }
697
- if (breakdown.selectors.classes.length > 0) {
698
- console.log(` • Class selectors: ${breakdown.selectors.classes.length}`, breakdown.selectors.classes.slice(0, 5));
699
535
  }
700
- if (breakdown.selectors.ids.length > 0) {
701
- console.log(` • ID selectors: ${breakdown.selectors.ids.length}`, breakdown.selectors.ids.slice(0, 5));
702
- }
703
- if (breakdown.selectors.pseudoClasses.length > 0) {
704
- console.log(` • Pseudo-class selectors: ${breakdown.selectors.pseudoClasses.length}`, breakdown.selectors.pseudoClasses.slice(0, 5));
705
- }
706
- if (breakdown.selectors.mediaQueries.length > 0) {
707
- console.log(` • Media queries: ${breakdown.selectors.mediaQueries.length}`, breakdown.selectors.mediaQueries.slice(0, 3));
536
+ let page;
537
+ if (includePageCSS) {
538
+ const pageStats = getPageStats({ root, includeCrossOrigin: true });
539
+ page = {
540
+ ...pageStats,
541
+ css: includePageCSS === 'all'
542
+ ? getPageCSS({ root, includeCrossOrigin: true })
543
+ : undefined,
544
+ };
708
545
  }
709
- if (breakdown.selectors.keyframes.length > 0) {
710
- console.log(` • Keyframe rules: ${breakdown.selectors.keyframes.length}`, breakdown.selectors.keyframes.slice(0, 3));
546
+ // If individual extraction matches total, use individual sizes
547
+ // Otherwise, proportionally scale the individual sizes to match the total
548
+ const useIndividualSizes = Math.abs(globalTypesTotalSize - totalGlobalCSSSize) < 100;
549
+ let adjustedGlobalSizes;
550
+ if (useIndividualSizes) {
551
+ adjustedGlobalSizes = {
552
+ globalCSSSize: globalData.size,
553
+ rawCSSSize: rawData.size,
554
+ keyframesCSSSize: keyframesData.size,
555
+ propertyCSSSize: propertyData.size,
556
+ };
711
557
  }
712
- if (breakdown.selectors.other.length > 0) {
713
- console.log(` • Other selectors: ${breakdown.selectors.other.length}`, breakdown.selectors.other.slice(0, 5));
558
+ else {
559
+ // Scale proportionally to match the actual total
560
+ const scaleFactor = totalGlobalCSSSize / globalTypesTotalSize;
561
+ adjustedGlobalSizes = {
562
+ globalCSSSize: Math.round(globalData.size * scaleFactor),
563
+ rawCSSSize: Math.round(rawData.size * scaleFactor),
564
+ keyframesCSSSize: Math.round(keyframesData.size * scaleFactor),
565
+ propertyCSSSize: Math.round(propertyData.size * scaleFactor),
566
+ };
714
567
  }
715
- console.log(`🎨 CSS Output:`);
716
- console.log(breakdown.css);
717
- console.groupEnd();
718
- },
719
- /**
720
- * Helper to extract CSS rules from raw CSS text
721
- */
722
- extractCSSRules(css) {
723
- const rules = [];
724
- // Remove comments
725
- let cleanCSS = css.replace(/\/\*[\s\S]*?\*\//g, '');
726
- // Enhanced parser that handles nested CSS properly
727
- this.parseCSSSafe(cleanCSS, rules);
728
- return rules;
729
- },
730
- /**
731
- * Safe CSS parser that handles nested rules properly
732
- */
733
- parseCSSSafe(css, rules) {
734
- let i = 0;
735
- while (i < css.length) {
736
- // Skip whitespace
737
- while (i < css.length && /\s/.test(css[i])) {
738
- i++;
739
- }
740
- if (i >= css.length)
741
- break;
742
- // Find selector start
743
- const selectorStart = i;
744
- let braceDepth = 0;
745
- let inString = false;
746
- let stringChar = '';
747
- // Find opening brace for this rule
748
- while (i < css.length) {
749
- const char = css[i];
750
- if (inString) {
751
- if (char === stringChar && css[i - 1] !== '\\') {
752
- inString = false;
753
- }
754
- }
755
- else {
756
- if (char === '"' || char === "'") {
757
- inString = true;
758
- stringChar = char;
759
- }
760
- else if (char === '{') {
761
- braceDepth++;
762
- if (braceDepth === 1) {
763
- break; // Found opening brace
764
- }
765
- }
766
- }
767
- i++;
768
- }
769
- if (i >= css.length)
770
- break;
771
- const selector = css.substring(selectorStart, i).trim();
772
- i++; // Skip opening brace
773
- // Find matching closing brace and extract content
774
- const contentStart = i;
775
- braceDepth = 1;
776
- inString = false;
777
- while (i < css.length && braceDepth > 0) {
778
- const char = css[i];
779
- if (inString) {
780
- if (char === stringChar && css[i - 1] !== '\\') {
781
- inString = false;
782
- }
783
- }
784
- else {
785
- if (char === '"' || char === "'") {
786
- inString = true;
787
- stringChar = char;
788
- }
789
- else if (char === '{') {
790
- braceDepth++;
791
- }
792
- else if (char === '}') {
793
- braceDepth--;
794
- }
568
+ const summary = {
569
+ activeClasses: cacheStatus.classes.active,
570
+ unusedClasses: cacheStatus.classes.unused,
571
+ totalStyledClasses: cacheStatus.classes.all,
572
+ activeCSSSize: activeCSS.length,
573
+ unusedCSSSize: unusedCSS.length,
574
+ ...adjustedGlobalSizes,
575
+ totalCSSSize: allCSS.length,
576
+ activeCSS: prettifyCSS(activeCSS),
577
+ unusedCSS: prettifyCSS(unusedCSS),
578
+ globalCSS: globalData.css,
579
+ rawCSS: rawData.css,
580
+ keyframesCSS: keyframesData.css,
581
+ propertyCSS: propertyData.css,
582
+ allCSS: prettifyCSS(allCSS),
583
+ globalRuleCount: globalData.ruleCount,
584
+ rawRuleCount: rawData.ruleCount,
585
+ keyframesRuleCount: keyframesData.ruleCount,
586
+ propertyRuleCount: propertyData.ruleCount,
587
+ page,
588
+ metrics,
589
+ definedProperties: definitions.properties,
590
+ definedKeyframes: definitions.keyframes,
591
+ propertyCount: definitions.properties.length,
592
+ keyframeCount: definitions.keyframes.length,
593
+ cleanupSummary,
594
+ };
595
+ if (log) {
596
+ console.group('🎨 Comprehensive Tasty Debug Summary');
597
+ console.log(`📊 Style Cache Status:`);
598
+ console.log(` • Active classes (in DOM): ${summary.activeClasses.length}`);
599
+ console.log(` • Unused classes (refCount = 0): ${summary.unusedClasses.length}`);
600
+ console.log(` • Total styled classes: ${summary.totalStyledClasses.length}`);
601
+ console.log(`💾 CSS Size:`);
602
+ console.log(` • Active CSS: ${summary.activeCSSSize} characters`);
603
+ console.log(` • Unused CSS: ${summary.unusedCSSSize} characters`);
604
+ console.log(` • Global CSS (injectGlobal): ${summary.globalCSSSize} characters (${summary.globalRuleCount} rules)`);
605
+ console.log(` • Raw CSS (createGlobalStyle): ${summary.rawCSSSize} characters (${summary.rawRuleCount} rules)`);
606
+ console.log(` • Keyframes CSS: ${summary.keyframesCSSSize} characters (${summary.keyframesRuleCount} rules)`);
607
+ console.log(` • Property CSS: ${summary.propertyCSSSize} characters (${summary.propertyRuleCount} rules)`);
608
+ // Show breakdown calculation
609
+ const calculatedTotal = summary.activeCSSSize +
610
+ summary.unusedCSSSize +
611
+ summary.globalCSSSize +
612
+ summary.rawCSSSize +
613
+ summary.keyframesCSSSize +
614
+ summary.propertyCSSSize;
615
+ console.log(` • Calculated Total: ${calculatedTotal} characters`);
616
+ console.log(` • Actual Total: ${summary.totalCSSSize} characters`);
617
+ const difference = Math.abs(calculatedTotal - summary.totalCSSSize);
618
+ if (difference > 100) {
619
+ console.warn(` ⚠️ Size mismatch: ${difference} characters difference`);
620
+ // Debug: show what might be missing
621
+ console.group('🔍 Debugging size mismatch:');
622
+ console.log(`Active + Unused = ${summary.activeCSSSize + summary.unusedCSSSize}`);
623
+ console.log(`All Global Types = ${summary.globalCSSSize + summary.rawCSSSize + summary.keyframesCSSSize + summary.propertyCSSSize}`);
624
+ console.log(`Class-based vs Total difference = ${summary.totalCSSSize - (summary.activeCSSSize + summary.unusedCSSSize)}`);
625
+ // Show scaling information
626
+ console.log(`Raw global extraction total: ${globalTypesTotalSize}`);
627
+ console.log(`Calculated global size: ${totalGlobalCSSSize}`);
628
+ console.log(`Used individual sizes: ${useIndividualSizes}`);
629
+ if (!useIndividualSizes) {
630
+ console.log(`Scale factor applied: ${(totalGlobalCSSSize / globalTypesTotalSize).toFixed(3)}`);
795
631
  }
796
- i++;
632
+ console.groupEnd();
797
633
  }
798
- const content = css.substring(contentStart, i - 1).trim();
799
- // Check if content has nested rules
800
- if (content.includes('{') && content.includes('}')) {
801
- // Extract declarations (before any nested rules)
802
- const declarationMatch = content.match(/^([^{]*)/);
803
- const declarations = declarationMatch ? declarationMatch[1].trim() : '';
804
- if (declarations) {
805
- rules.push({ selector, declarations });
806
- }
807
- // Extract and parse nested rules recursively
808
- const nestedStart = content.indexOf('{');
809
- if (nestedStart !== -1) {
810
- const nestedCSS = content.substring(nestedStart);
811
- this.parseCSSSafe(nestedCSS, rules);
812
- }
634
+ if (page) {
635
+ console.log(`📄 Page CSS:`);
636
+ console.log(` • Total page CSS: ${page.cssSize} characters`);
637
+ console.log(` • Total page rules: ${page.ruleCount}`);
638
+ console.log(` • Stylesheets: ${page.stylesheetCount} (${page.skippedStylesheets} skipped)`);
813
639
  }
814
- else if (content.trim()) {
815
- // Simple rule with just declarations
816
- rules.push({ selector, declarations: content });
640
+ console.log('🏷️ Properties & Keyframes:');
641
+ console.log(` • Defined @property: ${summary.propertyCount}`);
642
+ console.log(` • Defined @keyframes: ${summary.keyframeCount}`);
643
+ if (metrics) {
644
+ console.log(`⚡ Performance Metrics:`);
645
+ console.log(` • Cache hits: ${metrics.hits}`);
646
+ console.log(` • Cache misses: ${metrics.misses}`);
647
+ console.log(` • Cached style reuses: ${metrics.unusedHits}`);
648
+ const hitRate = metrics.hits + metrics.misses > 0
649
+ ? (((metrics.hits + (metrics.unusedHits || 0)) /
650
+ (metrics.hits + metrics.misses)) *
651
+ 100).toFixed(1)
652
+ : '0';
653
+ console.log(` • Overall cache hit rate: ${hitRate}%`);
817
654
  }
655
+ console.log('🔍 Details:');
656
+ console.log(' • Active classes:', summary.activeClasses);
657
+ console.log(' • Unused classes:', summary.unusedClasses);
658
+ console.groupEnd();
818
659
  }
660
+ return summary;
819
661
  },
820
- /**
821
- * Debug method to see raw CSS content and rule parsing
822
- */
823
- debugRawCSS() {
824
- const allCSS = this.getAllCSS();
825
- console.group('🔍 Raw CSS Debug');
826
- console.log('📝 Raw CSS length:', allCSS.length);
827
- console.log('📝 Raw CSS preview (first 2000 chars):');
828
- console.log(allCSS.substring(0, 2000));
829
- const rules = this.extractCSSRules(allCSS);
830
- console.log('📊 Total extracted rules:', rules.length);
831
- console.log('📋 First 10 rules:');
832
- rules.slice(0, 10).forEach((rule, i) => {
833
- console.log(` ${i + 1}. ${rule.selector}`);
834
- });
835
- // Show some examples of what gets filtered as tasty vs global
836
- const tastyRules = rules.filter((rule) => {
837
- const selectors = rule.selector.split(',').map((s) => s.trim());
838
- return selectors.every((selector) => {
839
- const cleanSelector = selector.replace(/[.#:\s>+~[\]()]/g, ' ');
840
- const parts = cleanSelector.split(/\s+/).filter(Boolean);
841
- return parts.length > 0 && parts.every((part) => /^t\d+$/.test(part));
842
- });
843
- });
844
- const globalRules = rules.filter((rule) => {
845
- const selectors = rule.selector.split(',').map((s) => s.trim());
846
- return !selectors.every((selector) => {
847
- const cleanSelector = selector.replace(/[.#:\s>+~[\]()]/g, ' ');
848
- const parts = cleanSelector.split(/\s+/).filter(Boolean);
849
- return parts.length > 0 && parts.every((part) => /^t\d+$/.test(part));
850
- });
851
- });
852
- console.log('🏷️ Tasty class rules found:', tastyRules.length);
853
- console.log('🌍 Global rules found:', globalRules.length);
854
- if (globalRules.length > 0) {
855
- console.log('📋 First 5 global rules:');
856
- globalRules.slice(0, 5).forEach((rule, i) => {
857
- console.log(` ${i + 1}. ${rule.selector}`);
662
+ // 8) Page-level CSS helpers
663
+ pageCSS(opts) {
664
+ const { root = document, prettify = true, log = false, includeCrossOrigin = true, } = opts || {};
665
+ const css = getPageCSS({ root, includeCrossOrigin });
666
+ const result = prettify ? prettifyCSS(css) : css;
667
+ if (log) {
668
+ console.group('📄 Page CSS (All Stylesheets)');
669
+ console.log(result || '(empty)');
670
+ console.groupEnd();
671
+ }
672
+ return result;
673
+ },
674
+ pageStats(opts) {
675
+ const { root = document, includeCrossOrigin = true } = opts || {};
676
+ return getPageStats({ root, includeCrossOrigin });
677
+ },
678
+ // 9) Install globally
679
+ install() {
680
+ if (typeof window !== 'undefined' &&
681
+ window.tastyDebug !== tastyDebug) {
682
+ window.tastyDebug = tastyDebug;
683
+ console.log('🎨 tastyDebug installed on window. Run tastyDebug.help() for quick start guide.');
684
+ }
685
+ },
686
+ // 10) Beautiful console logging with collapsible CSS
687
+ log(target, opts) {
688
+ const { title, ...cssOpts } = opts || {};
689
+ const css = tastyDebug.css(target, cssOpts);
690
+ if (!css.trim()) {
691
+ console.warn(`🎨 No CSS found for target: ${String(target)}`);
692
+ return;
693
+ }
694
+ const targetStr = Array.isArray(target)
695
+ ? target.join(', ')
696
+ : String(target);
697
+ const displayTitle = title || `CSS for "${targetStr}"`;
698
+ // Get some stats about the CSS
699
+ const lines = css.split('\n').length;
700
+ const size = new Blob([css]).size;
701
+ const sizeStr = size > 1024 ? `${(size / 1024).toFixed(1)}KB` : `${size}B`;
702
+ // Count CSS rules (blocks with opening braces)
703
+ const ruleCount = (css.match(/\{/g) || []).length;
704
+ console.group(`🎨 ${displayTitle} (${ruleCount} rules, ${lines} lines, ${sizeStr})`);
705
+ // Detect sub-elements in CSS
706
+ const subElementMatches = css.match(/\[data-element="([^"]+)"\]/g) || [];
707
+ const subElements = [
708
+ ...new Set(subElementMatches
709
+ .map((match) => match.match(/\[data-element="([^"]+)"\]/)?.[1])
710
+ .filter(Boolean)),
711
+ ];
712
+ if (subElements.length > 0) {
713
+ console.log(`🧩 Sub-elements found: ${subElements.join(', ')}`);
714
+ // Show stats and CSS for each sub-element
715
+ subElements.forEach((element) => {
716
+ const elementSelector = `[data-element="${element}"]`;
717
+ const elementRegex = new RegExp(`[^}]*\\[data-element="${element.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}"\\][^{]*\\{[^}]*\\}`, 'gm');
718
+ const elementCSS = (css.match(elementRegex) || []).join('\n');
719
+ if (elementCSS) {
720
+ const elementRules = (elementCSS.match(/\{/g) || []).length;
721
+ const elementLines = elementCSS.split('\n').length;
722
+ const elementSize = new Blob([elementCSS]).size;
723
+ const elementSizeStr = elementSize > 1024
724
+ ? `${(elementSize / 1024).toFixed(1)}KB`
725
+ : `${elementSize}B`;
726
+ console.groupCollapsed(`🧩 ${element} (${elementRules} rules, ${elementLines} lines, ${elementSizeStr})`);
727
+ console.log(`%c${elementCSS}`, 'color: #666; font-family: monospace; font-size: 12px; white-space: pre;');
728
+ console.groupEnd();
729
+ }
858
730
  });
859
731
  }
732
+ // Full CSS in collapsible group (hidden by default)
733
+ console.groupCollapsed('📄 Full CSS (click to expand)');
734
+ console.log(`%c${css}`, 'color: #666; font-family: monospace; font-size: 12px; white-space: pre;');
735
+ console.groupEnd();
736
+ console.groupEnd();
737
+ },
738
+ // 11) Show help and usage examples
739
+ help() {
740
+ console.group('🎨 tastyDebug - Quick Start Guide');
741
+ console.log('💡 Essential commands:');
742
+ console.log(' • tastyDebug.summary({ log: true }) - comprehensive overview');
743
+ console.log(' • tastyDebug.log("active") - beautiful CSS display');
744
+ console.log(' • tastyDebug.css("active") - get active CSS');
745
+ console.log(' • tastyDebug.inspect(".my-element") - detailed element inspection');
746
+ console.log(' • tastyDebug.global({ log: true }) - global CSS analysis');
747
+ console.log(' • tastyDebug.cache() - cache status');
748
+ console.log(' • tastyDebug.defs() - defined properties & keyframes');
749
+ console.log(' • tastyDebug.pageCSS({ log: true }) - all page CSS');
750
+ console.log('');
751
+ console.log('📖 Common targets for css()/log():');
752
+ console.log(' • "all" - all tasty CSS + global CSS');
753
+ console.log(' • "active" - CSS for classes in DOM');
754
+ console.log(' • "unused" - CSS for classes with refCount = 0');
755
+ console.log(' • "global" - only global CSS (createGlobalStyle)');
756
+ console.log(' • "page" - ALL page CSS (including non-tasty)');
757
+ console.log(' • "t123" - specific tasty class');
758
+ console.log(' • [".my-selector"] - CSS selector');
759
+ console.log('');
760
+ console.log('🔧 Available options:');
761
+ console.log(' • { log: true } - auto-log results to console');
762
+ console.log(' • { title: "Custom" } - custom title for log()');
763
+ console.log(' • { root: shadowRoot } - target Shadow DOM');
764
+ console.log(' • { prettify: false } - skip CSS formatting');
860
765
  console.groupEnd();
861
766
  },
862
767
  };
863
- /**
864
- * Check if we're in a development environment at runtime
865
- * Uses bracket notation to avoid bundler compilation
866
- */
867
- function isDevelopmentEnvironment() {
868
- if (typeof process === 'undefined')
869
- return false;
870
- // Use bracket notation to avoid bundler replacement
871
- const nodeEnv = process.env?.['NODE_ENV'];
872
- return nodeEnv === 'development' || nodeEnv !== 'production';
873
- }
874
- /**
875
- * Install tastyDebug on window object for easy access in browser console
876
- * Only in non-production environments
877
- */
878
- export function installGlobalDebug(options) {
879
- const shouldInstall = options?.force || isDevelopmentEnvironment();
880
- if (typeof window !== 'undefined' &&
881
- shouldInstall &&
882
- window.tastyDebug !== tastyDebug) {
883
- window.tastyDebug = tastyDebug;
884
- console.log('🎨 tastyDebug installed on window.\n' +
885
- '💡 Quick start:\n' +
886
- ' • tastyDebug.getSummary() - comprehensive overview with properties, keyframes & global CSS\n' +
887
- ' • tastyDebug.inspect(".my-element") - detailed element inspection\n' +
888
- ' • tastyDebug.getGlobalCSS() - get all global CSS from createGlobalStyle()\n' +
889
- ' • tastyDebug.logGlobalCSS() - log global CSS to console\n' +
890
- ' • tastyDebug.logGlobalCSSBreakdown() - detailed global CSS analysis\n' +
891
- ' • tastyDebug.debugRawCSS() - debug raw CSS parsing and filtering\n' +
892
- ' • tastyDebug.getDefinedProperties() - list all @property definitions\n' +
893
- ' • tastyDebug.getDefinedKeyframes() - list all keyframe definitions\n' +
894
- ' • tastyDebug.getActiveCSS() / getCachedCSS() - get specific CSS\n' +
895
- ' • tastyDebug.getCleanupSummary() - cleanup statistics overview\n' +
896
- ' • tastyDebug.logCleanupHistory() - detailed cleanup history');
897
- }
898
- }
899
768
  /**
900
769
  * Auto-install in development
901
770
  */
902
- if (typeof window !== 'undefined' && isDevelopmentEnvironment()) {
903
- installGlobalDebug();
771
+ if (typeof window !== 'undefined' && isDevEnv()) {
772
+ tastyDebug.install();
904
773
  }
905
774
 
906
775