@cube-dev/ui-kit 0.75.0 → 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 (501) hide show
  1. package/CHANGELOG.md +14 -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 +541 -744
  393. package/es/tasty/index.js +1 -1
  394. package/es/tasty/injector/index.js +31 -15
  395. package/es/tasty/injector/injector.js +138 -148
  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 +135 -222
  495. package/types/tasty/injector/index.d.ts +18 -2
  496. package/types/tasty/injector/injector.d.ts +20 -18
  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.0
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,574 +63,318 @@ 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';
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));
133
77
  }
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';
147
- }
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;
152
+ }
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--;
190
164
  }
191
165
  }
166
+ i++;
167
+ }
168
+ const content = cleanCSS.substring(contentStart, i - 1).trim();
169
+ if (content && selector) {
170
+ rules.push({ selector, declarations: content });
192
171
  }
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;
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
- },
429
- /**
430
- * Get CSS for cached classes only
431
- */
432
- getCachedCSS() {
433
- const usage = this.getClassUsage();
434
- return this.getCSSForClasses(usage.cachedClasses);
435
- },
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();
445
338
  },
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));
463
- },
464
- /**
465
- * Check if a specific @property is defined
466
- */
467
- isPropertyDefined(propertyName) {
468
- return injector.instance.isPropertyDefined(propertyName);
469
- },
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;
481
- }
482
- }
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
- };
498
- }
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);
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
+ : [];
503
351
  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
- })),
352
+ classes: {
353
+ active: activeClasses,
354
+ unused: unusedClasses,
355
+ all: [...activeClasses, ...unusedClasses],
356
+ },
357
+ metrics: injector.instance.getMetrics({ root }),
512
358
  };
513
359
  },
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
- };
530
- }
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(),
550
- }
551
- : undefined,
552
- };
360
+ // 4) Cleanup + metrics utilities
361
+ cleanup(opts) {
362
+ const { root } = opts || {};
363
+ injector.instance.cleanup(root);
553
364
  },
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;
562
- }
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();
365
+ metrics(opts) {
366
+ const { root } = opts || {};
367
+ return injector.instance.getMetrics({ root });
576
368
  },
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);
369
+ resetMetrics(opts) {
370
+ const { root } = opts || {};
371
+ injector.instance.resetMetrics({ root });
598
372
  },
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;
607
- }
608
- this.logCSS(globalCSS, 'Global CSS (createGlobalStyle)');
609
- },
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);
373
+ // 5) Tasty global CSS and selector analysis
374
+ global(opts) {
375
+ const { root = document, log = false } = opts || {};
376
+ const css = getGlobalCSS(root);
377
+ const rules = extractCSSRules(css);
633
378
  // Analyze selectors
634
379
  const selectors = {
635
380
  elements: [],
@@ -640,9 +385,8 @@ export const tastyDebug = {
640
385
  keyframes: [],
641
386
  other: [],
642
387
  };
643
- globalRules.forEach((rule) => {
388
+ rules.forEach((rule) => {
644
389
  const selector = rule.selector;
645
- // Categorize selectors
646
390
  if (selector.startsWith('@media')) {
647
391
  selectors.mediaQueries.push(selector);
648
392
  }
@@ -669,238 +413,291 @@ export const tastyDebug = {
669
413
  selectors.other.push(selector);
670
414
  }
671
415
  });
672
- return {
673
- globalRules: breakdown,
674
- totalRules: breakdown.length,
416
+ const result = {
417
+ css,
418
+ totalRules: rules.length,
675
419
  totalCSSSize: css.length,
676
- css: prettifiedCSS,
677
420
  selectors,
678
421
  };
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;
422
+ if (log) {
423
+ console.group(`🌍 Global CSS (${result.totalRules} rules)`);
424
+ console.log(`📊 Size: ${result.totalCSSSize} characters`);
425
+ console.log('🎯 Selector breakdown:', result.selectors);
426
+ console.log('🎨 CSS:\n' + result.css);
427
+ console.groupEnd();
688
428
  }
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));
429
+ return result;
430
+ },
431
+ // 6) Defined @property and keyframes
432
+ defs(opts) {
433
+ const { root = document } = opts || {};
434
+ // Get properties from injector if available, otherwise scan CSS
435
+ let properties = [];
436
+ try {
437
+ const registry = injector.instance['sheetManager']?.getRegistry(root);
438
+ if (registry?.injectedProperties) {
439
+ properties = Array.from(registry.injectedProperties).sort();
440
+ }
696
441
  }
697
- if (breakdown.selectors.classes.length > 0) {
698
- console.log(` • Class selectors: ${breakdown.selectors.classes.length}`, breakdown.selectors.classes.slice(0, 5));
442
+ catch {
443
+ // Fallback: scan CSS for @property rules
444
+ const allCSS = injector.instance.getCssText({ root });
445
+ const propRegex = /@property\s+(--[a-z0-9-]+)/gi;
446
+ const propSet = new Set();
447
+ let match;
448
+ while ((match = propRegex.exec(allCSS)) !== null) {
449
+ propSet.add(match[1]);
450
+ }
451
+ properties = Array.from(propSet).sort();
452
+ }
453
+ // Get keyframes
454
+ let keyframes = [];
455
+ try {
456
+ const registry = injector.instance['sheetManager']?.getRegistry(root);
457
+ if (registry) {
458
+ for (const entry of registry.keyframesCache.values()) {
459
+ keyframes.push({
460
+ name: entry.name,
461
+ refCount: entry.refCount,
462
+ });
463
+ }
464
+ keyframes.sort((a, b) => a.name.localeCompare(b.name));
465
+ }
699
466
  }
700
- if (breakdown.selectors.ids.length > 0) {
701
- console.log(` • ID selectors: ${breakdown.selectors.ids.length}`, breakdown.selectors.ids.slice(0, 5));
467
+ catch {
468
+ // Fallback: scan CSS for @keyframes rules
469
+ const allCSS = injector.instance.getCssText({ root });
470
+ const keyframesRegex = /@keyframes\s+([a-zA-Z0-9_-]+)/gi;
471
+ const keyframesSet = new Set();
472
+ let match;
473
+ while ((match = keyframesRegex.exec(allCSS)) !== null) {
474
+ keyframesSet.add(match[1]);
475
+ }
476
+ keyframes = Array.from(keyframesSet)
477
+ .sort()
478
+ .map((name) => ({ name, refCount: 1 }));
702
479
  }
703
- if (breakdown.selectors.pseudoClasses.length > 0) {
704
- console.log(` • Pseudo-class selectors: ${breakdown.selectors.pseudoClasses.length}`, breakdown.selectors.pseudoClasses.slice(0, 5));
480
+ return { properties, keyframes };
481
+ },
482
+ // 7) One-shot overview
483
+ summary(opts) {
484
+ const { root = document, log = false, includePageCSS = false } = opts || {};
485
+ const cacheStatus = this.cache({ root });
486
+ const globalBreakdown = this.global({ root });
487
+ const definitions = this.defs({ root });
488
+ const metrics = this.metrics({ root });
489
+ const activeCSS = this.css('active', { root, prettify: false });
490
+ const unusedCSS = this.css('unused', { root, prettify: false });
491
+ const allCSS = this.css('all', { root, prettify: false });
492
+ // Build cleanup summary from metrics
493
+ const cleanupSummary = {
494
+ enabled: !!metrics,
495
+ totalCleanups: metrics?.cleanupHistory?.length || 0,
496
+ totalClassesDeleted: metrics?.cleanupHistory?.reduce((sum, c) => sum + c.classesDeleted, 0) || 0,
497
+ totalCssDeleted: metrics?.cleanupHistory?.reduce((sum, c) => sum + c.cssSize, 0) || 0,
498
+ totalRulesDeleted: metrics?.cleanupHistory?.reduce((sum, c) => sum + c.rulesDeleted, 0) ||
499
+ 0,
500
+ averageClassesPerCleanup: 0,
501
+ averageCssPerCleanup: 0,
502
+ averageRulesPerCleanup: 0,
503
+ lastCleanup: undefined,
504
+ };
505
+ if (cleanupSummary.totalCleanups > 0) {
506
+ cleanupSummary.averageClassesPerCleanup =
507
+ cleanupSummary.totalClassesDeleted / cleanupSummary.totalCleanups;
508
+ cleanupSummary.averageCssPerCleanup =
509
+ cleanupSummary.totalCssDeleted / cleanupSummary.totalCleanups;
510
+ cleanupSummary.averageRulesPerCleanup =
511
+ cleanupSummary.totalRulesDeleted / cleanupSummary.totalCleanups;
512
+ const lastCleanup = metrics?.cleanupHistory?.[metrics.cleanupHistory.length - 1];
513
+ if (lastCleanup) {
514
+ cleanupSummary.lastCleanup = {
515
+ ...lastCleanup,
516
+ date: new Date(lastCleanup.timestamp).toISOString(),
517
+ };
518
+ }
705
519
  }
706
- if (breakdown.selectors.mediaQueries.length > 0) {
707
- console.log(` • Media queries: ${breakdown.selectors.mediaQueries.length}`, breakdown.selectors.mediaQueries.slice(0, 3));
520
+ let page;
521
+ if (includePageCSS) {
522
+ const pageStats = getPageStats({ root, includeCrossOrigin: true });
523
+ page = {
524
+ ...pageStats,
525
+ css: includePageCSS === 'all'
526
+ ? getPageCSS({ root, includeCrossOrigin: true })
527
+ : undefined,
528
+ };
708
529
  }
709
- if (breakdown.selectors.keyframes.length > 0) {
710
- console.log(` • Keyframe rules: ${breakdown.selectors.keyframes.length}`, breakdown.selectors.keyframes.slice(0, 3));
530
+ const summary = {
531
+ activeClasses: cacheStatus.classes.active,
532
+ unusedClasses: cacheStatus.classes.unused,
533
+ totalStyledClasses: cacheStatus.classes.all,
534
+ activeCSSSize: activeCSS.length,
535
+ unusedCSSSize: unusedCSS.length,
536
+ totalCSSSize: allCSS.length,
537
+ activeCSS: prettifyCSS(activeCSS),
538
+ unusedCSS: prettifyCSS(unusedCSS),
539
+ allCSS: prettifyCSS(allCSS),
540
+ globalCSS: globalBreakdown.css,
541
+ globalCSSSize: globalBreakdown.totalCSSSize,
542
+ globalRuleCount: globalBreakdown.totalRules,
543
+ page,
544
+ metrics,
545
+ definedProperties: definitions.properties,
546
+ definedKeyframes: definitions.keyframes,
547
+ propertyCount: definitions.properties.length,
548
+ keyframeCount: definitions.keyframes.length,
549
+ cleanupSummary,
550
+ };
551
+ if (log) {
552
+ console.group('🎨 Comprehensive Tasty Debug Summary');
553
+ console.log(`📊 Style Cache Status:`);
554
+ console.log(` • Active classes (in DOM): ${summary.activeClasses.length}`);
555
+ console.log(` • Unused classes (refCount = 0): ${summary.unusedClasses.length}`);
556
+ console.log(` • Total styled classes: ${summary.totalStyledClasses.length}`);
557
+ console.log(`💾 CSS Size:`);
558
+ console.log(` • Active CSS: ${summary.activeCSSSize} characters`);
559
+ console.log(` • Unused CSS: ${summary.unusedCSSSize} characters`);
560
+ console.log(` • Global CSS: ${summary.globalCSSSize} characters (${summary.globalRuleCount} rules)`);
561
+ console.log(` • Total CSS: ${summary.totalCSSSize} characters`);
562
+ if (page) {
563
+ console.log(`📄 Page CSS:`);
564
+ console.log(` • Total page CSS: ${page.cssSize} characters`);
565
+ console.log(` • Total page rules: ${page.ruleCount}`);
566
+ console.log(` • Stylesheets: ${page.stylesheetCount} (${page.skippedStylesheets} skipped)`);
567
+ }
568
+ console.log('🏷️ Properties & Keyframes:');
569
+ console.log(` • Defined @property: ${summary.propertyCount}`);
570
+ console.log(` • Defined @keyframes: ${summary.keyframeCount}`);
571
+ if (metrics) {
572
+ console.log(`⚡ Performance Metrics:`);
573
+ console.log(` • Cache hits: ${metrics.hits}`);
574
+ console.log(` • Cache misses: ${metrics.misses}`);
575
+ console.log(` • Cached style reuses: ${metrics.unusedHits}`);
576
+ const hitRate = metrics.hits + metrics.misses > 0
577
+ ? (((metrics.hits + (metrics.unusedHits || 0)) /
578
+ (metrics.hits + metrics.misses)) *
579
+ 100).toFixed(1)
580
+ : '0';
581
+ console.log(` • Overall cache hit rate: ${hitRate}%`);
582
+ }
583
+ console.log('🔍 Details:');
584
+ console.log(' • Active classes:', summary.activeClasses);
585
+ console.log(' • Unused classes:', summary.unusedClasses);
586
+ console.groupEnd();
711
587
  }
712
- if (breakdown.selectors.other.length > 0) {
713
- console.log(` • Other selectors: ${breakdown.selectors.other.length}`, breakdown.selectors.other.slice(0, 5));
588
+ return summary;
589
+ },
590
+ // 8) Page-level CSS helpers
591
+ pageCSS(opts) {
592
+ const { root = document, prettify = true, log = false, includeCrossOrigin = true, } = opts || {};
593
+ const css = getPageCSS({ root, includeCrossOrigin });
594
+ const result = prettify ? prettifyCSS(css) : css;
595
+ if (log) {
596
+ console.group('📄 Page CSS (All Stylesheets)');
597
+ console.log(result || '(empty)');
598
+ console.groupEnd();
714
599
  }
715
- console.log(`🎨 CSS Output:`);
716
- console.log(breakdown.css);
717
- console.groupEnd();
600
+ return result;
718
601
  },
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;
602
+ pageStats(opts) {
603
+ const { root = document, includeCrossOrigin = true } = opts || {};
604
+ return getPageStats({ root, includeCrossOrigin });
729
605
  },
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
- }
795
- }
796
- i++;
797
- }
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
- }
813
- }
814
- else if (content.trim()) {
815
- // Simple rule with just declarations
816
- rules.push({ selector, declarations: content });
817
- }
606
+ // 9) Install globally
607
+ install() {
608
+ if (typeof window !== 'undefined' &&
609
+ window.tastyDebug !== tastyDebug) {
610
+ window.tastyDebug = tastyDebug;
611
+ console.log('🎨 tastyDebug installed on window. Run tastyDebug.help() for quick start guide.');
818
612
  }
819
613
  },
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}`);
614
+ // 10) Beautiful console logging with collapsible CSS
615
+ log(target, opts) {
616
+ const { title, ...cssOpts } = opts || {};
617
+ const css = tastyDebug.css(target, cssOpts);
618
+ if (!css.trim()) {
619
+ console.warn(`🎨 No CSS found for target: ${String(target)}`);
620
+ return;
621
+ }
622
+ const targetStr = Array.isArray(target)
623
+ ? target.join(', ')
624
+ : String(target);
625
+ const displayTitle = title || `CSS for "${targetStr}"`;
626
+ // Get some stats about the CSS
627
+ const lines = css.split('\n').length;
628
+ const size = new Blob([css]).size;
629
+ const sizeStr = size > 1024 ? `${(size / 1024).toFixed(1)}KB` : `${size}B`;
630
+ // Count CSS rules (blocks with opening braces)
631
+ const ruleCount = (css.match(/\{/g) || []).length;
632
+ console.group(`🎨 ${displayTitle} (${ruleCount} rules, ${lines} lines, ${sizeStr})`);
633
+ // Detect sub-elements in CSS
634
+ const subElementMatches = css.match(/\[data-element="([^"]+)"\]/g) || [];
635
+ const subElements = [
636
+ ...new Set(subElementMatches
637
+ .map((match) => match.match(/\[data-element="([^"]+)"\]/)?.[1])
638
+ .filter(Boolean)),
639
+ ];
640
+ if (subElements.length > 0) {
641
+ console.log(`🧩 Sub-elements found: ${subElements.join(', ')}`);
642
+ // Show stats and CSS for each sub-element
643
+ subElements.forEach((element) => {
644
+ const elementSelector = `[data-element="${element}"]`;
645
+ const elementRegex = new RegExp(`[^}]*\\[data-element="${element.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}"\\][^{]*\\{[^}]*\\}`, 'gm');
646
+ const elementCSS = (css.match(elementRegex) || []).join('\n');
647
+ if (elementCSS) {
648
+ const elementRules = (elementCSS.match(/\{/g) || []).length;
649
+ const elementLines = elementCSS.split('\n').length;
650
+ const elementSize = new Blob([elementCSS]).size;
651
+ const elementSizeStr = elementSize > 1024
652
+ ? `${(elementSize / 1024).toFixed(1)}KB`
653
+ : `${elementSize}B`;
654
+ console.groupCollapsed(`🧩 ${element} (${elementRules} rules, ${elementLines} lines, ${elementSizeStr})`);
655
+ console.log(`%c${elementCSS}`, 'color: #666; font-family: monospace; font-size: 12px; white-space: pre;');
656
+ console.groupEnd();
657
+ }
858
658
  });
859
659
  }
660
+ // Full CSS in collapsible group (hidden by default)
661
+ console.groupCollapsed('📄 Full CSS (click to expand)');
662
+ console.log(`%c${css}`, 'color: #666; font-family: monospace; font-size: 12px; white-space: pre;');
663
+ console.groupEnd();
664
+ console.groupEnd();
665
+ },
666
+ // 11) Show help and usage examples
667
+ help() {
668
+ console.group('🎨 tastyDebug - Quick Start Guide');
669
+ console.log('💡 Essential commands:');
670
+ console.log(' • tastyDebug.summary({ log: true }) - comprehensive overview');
671
+ console.log(' • tastyDebug.log("active") - beautiful CSS display');
672
+ console.log(' • tastyDebug.css("active") - get active CSS');
673
+ console.log(' • tastyDebug.inspect(".my-element") - detailed element inspection');
674
+ console.log(' • tastyDebug.global({ log: true }) - global CSS analysis');
675
+ console.log(' • tastyDebug.cache() - cache status');
676
+ console.log(' • tastyDebug.defs() - defined properties & keyframes');
677
+ console.log(' • tastyDebug.pageCSS({ log: true }) - all page CSS');
678
+ console.log('');
679
+ console.log('📖 Common targets for css()/log():');
680
+ console.log(' • "all" - all tasty CSS + global CSS');
681
+ console.log(' • "active" - CSS for classes in DOM');
682
+ console.log(' • "unused" - CSS for classes with refCount = 0');
683
+ console.log(' • "global" - only global CSS (createGlobalStyle)');
684
+ console.log(' • "page" - ALL page CSS (including non-tasty)');
685
+ console.log(' • "t123" - specific tasty class');
686
+ console.log(' • [".my-selector"] - CSS selector');
687
+ console.log('');
688
+ console.log('🔧 Available options:');
689
+ console.log(' • { log: true } - auto-log results to console');
690
+ console.log(' • { title: "Custom" } - custom title for log()');
691
+ console.log(' • { root: shadowRoot } - target Shadow DOM');
692
+ console.log(' • { prettify: false } - skip CSS formatting');
860
693
  console.groupEnd();
861
694
  },
862
695
  };
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
696
  /**
900
697
  * Auto-install in development
901
698
  */
902
- if (typeof window !== 'undefined' && isDevelopmentEnvironment()) {
903
- installGlobalDebug();
699
+ if (typeof window !== 'undefined' && isDevEnv()) {
700
+ tastyDebug.install();
904
701
  }
905
702
 
906
703