@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.
- package/CHANGELOG.md +14 -0
- package/es/_internal/hooks/index.js +1 -1
- package/es/_internal/hooks/use-chained-callback.js +1 -1
- package/es/_internal/hooks/use-debounced-value.js +1 -1
- package/es/_internal/hooks/use-deprecation-warning.js +1 -1
- package/es/_internal/hooks/use-effect-once.js +1 -1
- package/es/_internal/hooks/use-event.js +1 -1
- package/es/_internal/hooks/use-is-first-render.js +1 -1
- package/es/_internal/hooks/use-sync-ref.js +1 -1
- package/es/_internal/hooks/use-timer/index.js +1 -1
- package/es/_internal/hooks/use-timer/timer.js +1 -1
- package/es/_internal/hooks/use-timer/use-timer.js +1 -1
- package/es/_internal/hooks/use-update-effect.js +1 -1
- package/es/_internal/hooks/use-warn.js +1 -1
- package/es/_internal/index.js +1 -1
- package/es/components/Block.js +1 -1
- package/es/components/GlobalStyles.js +1 -1
- package/es/components/GridProvider.js +1 -1
- package/es/components/HiddenInput.js +1 -1
- package/es/components/Item.js +1 -1
- package/es/components/OpenTrasition.js +1 -1
- package/es/components/Root.js +1 -1
- package/es/components/actions/Action/Action.js +1 -1
- package/es/components/actions/Button/Button.js +1 -1
- package/es/components/actions/Button/index.js +1 -1
- package/es/components/actions/ButtonGroup/ButtonGroup.js +1 -1
- package/es/components/actions/CommandMenu/CommandMenu.js +1 -1
- package/es/components/actions/CommandMenu/index.js +1 -1
- package/es/components/actions/CommandMenu/styled.js +1 -1
- package/es/components/actions/ItemButton/ItemButton.js +1 -1
- package/es/components/actions/ItemButton/index.js +1 -1
- package/es/components/actions/Menu/Menu.js +1 -1
- package/es/components/actions/Menu/MenuItem.js +1 -1
- package/es/components/actions/Menu/MenuSection.js +1 -1
- package/es/components/actions/Menu/MenuTrigger.js +1 -1
- package/es/components/actions/Menu/SubMenuTrigger.js +1 -1
- package/es/components/actions/Menu/SubmenuTriggerContext.js +1 -1
- package/es/components/actions/Menu/context.js +1 -1
- package/es/components/actions/Menu/index.js +1 -1
- package/es/components/actions/Menu/styled.js +1 -1
- package/es/components/actions/index.js +1 -1
- package/es/components/actions/use-action.js +1 -1
- package/es/components/actions/use-anchored-menu.js +1 -1
- package/es/components/actions/use-context-menu.js +1 -1
- package/es/components/content/ActiveZone/ActiveZone.js +1 -1
- package/es/components/content/Alert/Alert.js +1 -1
- package/es/components/content/Alert/index.js +1 -1
- package/es/components/content/Alert/types.js +1 -1
- package/es/components/content/Alert/use-alert.js +1 -1
- package/es/components/content/Avatar/Avatar.js +1 -1
- package/es/components/content/Badge/Badge.js +1 -1
- package/es/components/content/Card/Card.js +1 -1
- package/es/components/content/Content.js +1 -1
- package/es/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
- package/es/components/content/CopyPasteBlock/index.js +1 -1
- package/es/components/content/CopySnippet/CopySnippet.js +1 -1
- package/es/components/content/CopySnippet/index.js +1 -1
- package/es/components/content/Divider.js +1 -1
- package/es/components/content/Footer.js +1 -1
- package/es/components/content/Header.js +1 -1
- package/es/components/content/HotKeys/HotKeys.js +1 -1
- package/es/components/content/HotKeys/index.js +1 -1
- package/es/components/content/ItemBase/ItemBase.js +1 -1
- package/es/components/content/ItemBase/index.js +1 -1
- package/es/components/content/List/SectionHeading.js +1 -1
- package/es/components/content/List/index.js +1 -1
- package/es/components/content/Paragraph.js +1 -1
- package/es/components/content/Placeholder/Placeholder.js +1 -1
- package/es/components/content/PrismCode/PrismCode.js +1 -1
- package/es/components/content/PrismCode/prismSetup.js +1 -1
- package/es/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
- package/es/components/content/Result/Result.js +1 -1
- package/es/components/content/Skeleton/Skeleton.js +1 -1
- package/es/components/content/Tag/Tag.js +1 -1
- package/es/components/content/Text.js +1 -1
- package/es/components/content/Title.js +1 -1
- package/es/components/fields/Checkbox/Checkbox.js +1 -1
- package/es/components/fields/Checkbox/CheckboxGroup.js +1 -1
- package/es/components/fields/Checkbox/context.js +1 -1
- package/es/components/fields/Checkbox/index.js +1 -1
- package/es/components/fields/ComboBox/ComboBox.js +3 -7
- package/es/components/fields/ComboBox/index.js +1 -1
- package/es/components/fields/DatePicker/DateInput.js +1 -1
- package/es/components/fields/DatePicker/DateInputBase.js +1 -1
- package/es/components/fields/DatePicker/DatePicker.js +1 -1
- package/es/components/fields/DatePicker/DatePickerButton.js +1 -1
- package/es/components/fields/DatePicker/DatePickerElement.js +1 -1
- package/es/components/fields/DatePicker/DatePickerInput.js +1 -1
- package/es/components/fields/DatePicker/DatePickerSegment.js +1 -1
- package/es/components/fields/DatePicker/DateRangePicker.js +1 -1
- package/es/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
- package/es/components/fields/DatePicker/TimeInput.js +1 -1
- package/es/components/fields/DatePicker/index.js +1 -1
- package/es/components/fields/DatePicker/intl.js +1 -1
- package/es/components/fields/DatePicker/parseDate.js +1 -1
- package/es/components/fields/DatePicker/props.js +1 -1
- package/es/components/fields/DatePicker/types.js +1 -1
- package/es/components/fields/DatePicker/utils.js +1 -1
- package/es/components/fields/FileInput/FileInput.js +1 -1
- package/es/components/fields/FilterListBox/FilterListBox.js +1 -1
- package/es/components/fields/FilterListBox/index.js +1 -1
- package/es/components/fields/FilterPicker/FilterPicker.js +3 -3
- package/es/components/fields/FilterPicker/index.js +1 -1
- package/es/components/fields/Input/Input.js +1 -1
- package/es/components/fields/Input/index.js +1 -1
- package/es/components/fields/ListBox/ListBox.js +1 -1
- package/es/components/fields/ListBox/index.js +1 -1
- package/es/components/fields/NumberInput/NumberInput.js +1 -1
- package/es/components/fields/NumberInput/StepButton.js +1 -1
- package/es/components/fields/PasswordInput/PasswordInput.js +1 -1
- package/es/components/fields/RadioGroup/Radio.js +1 -1
- package/es/components/fields/RadioGroup/RadioGroup.js +1 -1
- package/es/components/fields/RadioGroup/context.js +1 -1
- package/es/components/fields/RadioGroup/index.js +1 -1
- package/es/components/fields/SearchInput/SearchInput.js +1 -1
- package/es/components/fields/SearchInput/index.js +1 -1
- package/es/components/fields/Select/Select.js +1 -1
- package/es/components/fields/Select/index.js +1 -1
- package/es/components/fields/Slider/Gradation.js +1 -1
- package/es/components/fields/Slider/Header.js +1 -1
- package/es/components/fields/Slider/RangeSlider.js +1 -1
- package/es/components/fields/Slider/Slider.js +1 -1
- package/es/components/fields/Slider/SliderBase.js +1 -1
- package/es/components/fields/Slider/SliderInput.js +1 -1
- package/es/components/fields/Slider/SliderThumb.js +1 -1
- package/es/components/fields/Slider/SliderTrack.js +1 -1
- package/es/components/fields/Slider/elements.js +1 -1
- package/es/components/fields/Slider/index.js +1 -1
- package/es/components/fields/Slider/types.js +1 -1
- package/es/components/fields/Switch/Switch.js +1 -1
- package/es/components/fields/Switch/index.js +1 -1
- package/es/components/fields/TextArea/TextArea.js +1 -1
- package/es/components/fields/TextArea/index.js +1 -1
- package/es/components/fields/TextInput/TextInput.js +1 -1
- package/es/components/fields/TextInput/TextInputBase.js +1 -1
- package/es/components/fields/TextInput/index.js +1 -1
- package/es/components/fields/TextInputMapper/TextInputMapper.js +1 -1
- package/es/components/fields/TextInputMapper/index.js +1 -1
- package/es/components/fields/index.js +1 -1
- package/es/components/form/FieldWrapper/FieldWrapper.js +1 -1
- package/es/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
- package/es/components/form/FieldWrapper/index.js +1 -1
- package/es/components/form/FieldWrapper/types.js +1 -1
- package/es/components/form/Form/Field.js +1 -1
- package/es/components/form/Form/Form.js +1 -1
- package/es/components/form/Form/ResetButton/ResetButton.js +1 -1
- package/es/components/form/Form/ResetButton/index.js +1 -1
- package/es/components/form/Form/SubmitButton/SubmitButton.js +1 -1
- package/es/components/form/Form/SubmitButton/index.js +1 -1
- package/es/components/form/Form/SubmitError.js +1 -1
- package/es/components/form/Form/index.js +1 -1
- package/es/components/form/Form/types.js +1 -1
- package/es/components/form/Form/use-field/index.js +1 -1
- package/es/components/form/Form/use-field/types.js +1 -1
- package/es/components/form/Form/use-field/use-field-props.js +1 -1
- package/es/components/form/Form/use-field/use-field.js +1 -1
- package/es/components/form/Form/use-form.js +1 -1
- package/es/components/form/Form/validation.js +1 -1
- package/es/components/form/Label.js +1 -1
- package/es/components/form/index.js +1 -1
- package/es/components/form/wrapper.js +1 -1
- package/es/components/layout/Flex.js +1 -1
- package/es/components/layout/Flow.js +1 -1
- package/es/components/layout/Grid.js +1 -1
- package/es/components/layout/Panel.js +1 -1
- package/es/components/layout/Prefix.js +1 -1
- package/es/components/layout/ResizablePanel.js +1 -1
- package/es/components/layout/Space.js +1 -1
- package/es/components/layout/Suffix.js +1 -1
- package/es/components/navigation/LegacyTabs/LegacyTabs.js +1 -1
- package/es/components/navigation/Link/Link.js +1 -1
- package/es/components/organisms/FileTabs/FileTabs.js +1 -1
- package/es/components/organisms/Modal/Modal.js +1 -1
- package/es/components/organisms/StatsCard/StatsCard.js +1 -1
- package/es/components/other/Base64Upload/Base64Upload.js +1 -1
- package/es/components/other/Calendar/Calendar.js +1 -1
- package/es/components/other/Calendar/CalendarCell.js +1 -1
- package/es/components/other/Calendar/CalendarGrid.js +1 -1
- package/es/components/other/Calendar/RangeCalendar.js +1 -1
- package/es/components/other/CloudLogo/CloudLogo.js +1 -1
- package/es/components/overlays/AlertDialog/AlertDialog.js +1 -1
- package/es/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
- package/es/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
- package/es/components/overlays/AlertDialog/index.js +1 -1
- package/es/components/overlays/AlertDialog/types.js +1 -1
- package/es/components/overlays/Dialog/Dialog.js +1 -1
- package/es/components/overlays/Dialog/DialogContainer.js +1 -1
- package/es/components/overlays/Dialog/DialogForm.js +1 -1
- package/es/components/overlays/Dialog/DialogTrigger.js +1 -1
- package/es/components/overlays/Dialog/context.js +1 -1
- package/es/components/overlays/Dialog/index.js +1 -1
- package/es/components/overlays/Dialog/use-dialog-container.js +1 -1
- package/es/components/overlays/Modal/Modal.js +1 -1
- package/es/components/overlays/Modal/OpenTransition.js +1 -1
- package/es/components/overlays/Modal/Overlay.js +1 -1
- package/es/components/overlays/Modal/Popover.js +1 -1
- package/es/components/overlays/Modal/Tray.js +1 -1
- package/es/components/overlays/Modal/Underlay.js +1 -1
- package/es/components/overlays/Modal/index.js +1 -1
- package/es/components/overlays/Modal/types.js +1 -1
- package/es/components/overlays/NewNotifications/Bar/FloatingNotification.js +1 -1
- package/es/components/overlays/NewNotifications/Bar/NotificationsBar.js +1 -1
- package/es/components/overlays/NewNotifications/Bar/TransitionComponent.js +1 -1
- package/es/components/overlays/NewNotifications/Bar/index.js +1 -1
- package/es/components/overlays/NewNotifications/Dialog/NotificationsDialogTrigger.js +1 -1
- package/es/components/overlays/NewNotifications/Dialog/index.js +1 -1
- package/es/components/overlays/NewNotifications/Notification.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationAction.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationCloseButton.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationDescription.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationFooter.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationHeader.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationIcon.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationProvider.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationView.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/index.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/types.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsContext/NotificationsContext.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsContext/NotificationsProvider.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsContext/index.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsContext/use-notifications.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsList/NotificationsList.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsList/NotificationsListItem.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsList/index.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsList/types.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/index.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/types.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/use-notification-list-item.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/use-notifications-api.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/use-notifications-list.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/use-notifications-observer.js +1 -1
- package/es/components/overlays/NewNotifications/index.js +1 -1
- package/es/components/overlays/NewNotifications/types.js +1 -1
- package/es/components/overlays/Notification/Notification.js +1 -1
- package/es/components/overlays/OverlayWrapper.js +1 -1
- package/es/components/overlays/Toasts/Toast.js +1 -1
- package/es/components/overlays/Toasts/index.js +1 -1
- package/es/components/overlays/Toasts/types.js +1 -1
- package/es/components/overlays/Toasts/use-toasts-api.js +1 -1
- package/es/components/overlays/Tooltip/Tooltip.js +1 -1
- package/es/components/overlays/Tooltip/TooltipProvider.js +1 -1
- package/es/components/overlays/Tooltip/TooltipTrigger.js +1 -1
- package/es/components/overlays/Tooltip/context.js +1 -1
- package/es/components/overlays/Tooltip/index.js +1 -1
- package/es/components/portal/Portal.js +1 -1
- package/es/components/portal/PortalProvider.js +1 -1
- package/es/components/portal/index.js +1 -1
- package/es/components/portal/types.js +1 -1
- package/es/components/portal/usePortal.js +1 -1
- package/es/components/shared/InvalidIcon.js +1 -1
- package/es/components/shared/ValidIcon.js +1 -1
- package/es/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
- package/es/components/status/LoadingAnimation/index.js +1 -1
- package/es/components/status/Spin/Cube.js +1 -1
- package/es/components/status/Spin/InternalSpinner.js +1 -1
- package/es/components/status/Spin/Spin.js +1 -1
- package/es/components/status/Spin/SpinsContainer.js +1 -1
- package/es/components/status/Spin/index.js +1 -1
- package/es/components/status/Spin/types.js +1 -1
- package/es/components/status/index.js +1 -1
- package/es/data/item-themes.js +1 -1
- package/es/data/themes.js +1 -1
- package/es/icons/AdjustmentsHorizontalIcon.js +1 -1
- package/es/icons/AdjustmentsIcon.js +1 -1
- package/es/icons/AiIcon.js +1 -1
- package/es/icons/AreaChartIcon.js +1 -1
- package/es/icons/BackwardIcon.js +1 -1
- package/es/icons/BarChartIcon.js +1 -1
- package/es/icons/BellFilledIcon.js +1 -1
- package/es/icons/BellIcon.js +1 -1
- package/es/icons/BooleanIcon.js +1 -1
- package/es/icons/CalendarEditIcon.js +1 -1
- package/es/icons/CalendarIcon.js +1 -1
- package/es/icons/CaretDownIcon.js +1 -1
- package/es/icons/CaretUpIcon.js +1 -1
- package/es/icons/ChartAreaStackedIcon.js +1 -1
- package/es/icons/ChartAreaStackedPercentageIcon.js +1 -1
- package/es/icons/ChartBarGroupedHorizontalIcon.js +1 -1
- package/es/icons/ChartBarGroupedIcon.js +1 -1
- package/es/icons/ChartBarHorizontalIcon.js +1 -1
- package/es/icons/ChartBarLineIcon.js +1 -1
- package/es/icons/ChartBarStackedHorizontalIcon.js +1 -1
- package/es/icons/ChartBarStackedIcon.js +1 -1
- package/es/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
- package/es/icons/ChartBarStackedPercentageIcon.js +1 -1
- package/es/icons/ChartBoxPlot2Icon.js +1 -1
- package/es/icons/ChartBoxPlotIcon.js +1 -1
- package/es/icons/ChartBubbleIcon.js +1 -1
- package/es/icons/ChartDonut2Icon.js +1 -1
- package/es/icons/ChartFunnelIcon.js +1 -1
- package/es/icons/ChartKPIIcon.js +1 -1
- package/es/icons/ChartPie2Icon.js +1 -1
- package/es/icons/ChartScatterIcon.js +1 -1
- package/es/icons/CheckCircleFilledIcon.js +1 -1
- package/es/icons/CheckCircleIcon.js +1 -1
- package/es/icons/CheckIcon.js +1 -1
- package/es/icons/CircleFilledIcon.js +1 -1
- package/es/icons/ClearIcon.js +1 -1
- package/es/icons/CloseCircleFilledIcon.js +1 -1
- package/es/icons/CloseCircleIcon.js +1 -1
- package/es/icons/CloseIcon.js +1 -1
- package/es/icons/CodeIcon.js +1 -1
- package/es/icons/CopyIcon.js +1 -1
- package/es/icons/CountIcon.js +1 -1
- package/es/icons/CubeIcon.js +1 -1
- package/es/icons/DangerIcon.js +1 -1
- package/es/icons/DashboardIcon.js +1 -1
- package/es/icons/DatabaseIcon.js +1 -1
- package/es/icons/DirectionIcon.js +1 -1
- package/es/icons/DonutIcon.js +1 -1
- package/es/icons/DownIcon.js +1 -1
- package/es/icons/EditIcon.js +1 -1
- package/es/icons/ExclamationCircleFilledIcon.js +1 -1
- package/es/icons/ExclamationCircleIcon.js +1 -1
- package/es/icons/ExclamationIcon.js +1 -1
- package/es/icons/EyeIcon.js +1 -1
- package/es/icons/EyeInvisibleIcon.js +1 -1
- package/es/icons/FilterIcon.js +1 -1
- package/es/icons/FolderFilledIcon.js +1 -1
- package/es/icons/FolderIcon.js +1 -1
- package/es/icons/FolderOpenFilledIcon.js +1 -1
- package/es/icons/FolderOpenIcon.js +1 -1
- package/es/icons/ForwardIcon.js +1 -1
- package/es/icons/HierarchyIcon.js +1 -1
- package/es/icons/Icon.js +1 -1
- package/es/icons/InfoCircleIcon.js +1 -1
- package/es/icons/InfoIcon.js +1 -1
- package/es/icons/KeyIcon.js +1 -1
- package/es/icons/LeftIcon.js +1 -1
- package/es/icons/LineChartIcon.js +1 -1
- package/es/icons/LoadingIcon.js +1 -1
- package/es/icons/LockFilledIcon.js +1 -1
- package/es/icons/LockIcon.js +1 -1
- package/es/icons/MoreIcon.js +1 -1
- package/es/icons/NotAllowedIcon.js +1 -1
- package/es/icons/NumberIcon.js +1 -1
- package/es/icons/PauseCircleFilledIcon.js +1 -1
- package/es/icons/PauseCircleIcon.js +1 -1
- package/es/icons/PauseIcon.js +1 -1
- package/es/icons/PieChartIcon.js +1 -1
- package/es/icons/PlayCircleIcon.js +1 -1
- package/es/icons/PlayIcon.js +1 -1
- package/es/icons/PlusIcon.js +1 -1
- package/es/icons/ReloadIcon.js +1 -1
- package/es/icons/ReportIcon.js +1 -1
- package/es/icons/ReturnIcon.js +1 -1
- package/es/icons/RightIcon.js +1 -1
- package/es/icons/SchemeIcon.js +1 -1
- package/es/icons/SearchIcon.js +1 -1
- package/es/icons/SettingsIcon.js +1 -1
- package/es/icons/ShieldFilledIcon.js +1 -1
- package/es/icons/ShieldIcon.js +1 -1
- package/es/icons/SlashIcon.js +1 -1
- package/es/icons/SparklesIcon.js +1 -1
- package/es/icons/SqlIcon.js +1 -1
- package/es/icons/StatsIcon.js +1 -1
- package/es/icons/StopIcon.js +1 -1
- package/es/icons/StringIcon.js +1 -1
- package/es/icons/SwitchIcon.js +1 -1
- package/es/icons/TableIcon.js +1 -1
- package/es/icons/ThumbsDownIcon.js +1 -1
- package/es/icons/ThumbsUpIcon.js +1 -1
- package/es/icons/ThunderboltCrossedIcon.js +1 -1
- package/es/icons/ThunderboltFilledIcon.js +1 -1
- package/es/icons/ThunderboltIcon.js +1 -1
- package/es/icons/TimeIcon.js +1 -1
- package/es/icons/UnlockIcon.js +1 -1
- package/es/icons/UpIcon.js +1 -1
- package/es/icons/UserGroupIcon.js +1 -1
- package/es/icons/UserIcon.js +1 -1
- package/es/icons/UserLockIcon.js +1 -1
- package/es/icons/ViewIcon.js +1 -1
- package/es/icons/WarningFilledIcon.js +1 -1
- package/es/icons/WarningIcon.js +1 -1
- package/es/icons/add-new-icon.js +1 -1
- package/es/icons/index.js +1 -1
- package/es/icons/wrap-icon.js +1 -1
- package/es/index.js +1 -1
- package/es/provider.js +1 -1
- package/es/providers/TrackingProvider.js +1 -1
- package/es/services/notification.js +1 -1
- package/es/shared/form.js +1 -1
- package/es/shared/index.js +1 -1
- package/es/stories/Form.legacy-stories.js +1 -1
- package/es/stories/FormFieldArgs.js +1 -1
- package/es/stories/Layout.stories.js +1 -1
- package/es/stories/Tasty.stories.js +1 -1
- package/es/stories/components/ConfirmDeletionDialogForm.js +1 -1
- package/es/stories/components/DialogFormApp.js +1 -1
- package/es/stories/components/StyledButton.js +1 -1
- package/es/stories/lists/baseProps.js +1 -1
- package/es/tasty/debug.js +541 -744
- package/es/tasty/index.js +1 -1
- package/es/tasty/injector/index.js +31 -15
- package/es/tasty/injector/injector.js +138 -148
- package/es/tasty/injector/sheet-manager.js +292 -134
- package/es/tasty/injector/types.js +1 -1
- package/es/tasty/parser/classify.js +1 -1
- package/es/tasty/parser/const.js +1 -1
- package/es/tasty/parser/lru.js +1 -1
- package/es/tasty/parser/parser.js +1 -1
- package/es/tasty/parser/tokenizer.js +1 -1
- package/es/tasty/parser/types.js +1 -1
- package/es/tasty/providers/BreakpointsProvider.js +1 -1
- package/es/tasty/styles/align.js +1 -1
- package/es/tasty/styles/border.js +1 -1
- package/es/tasty/styles/boxShadow.combinator.js +1 -1
- package/es/tasty/styles/color.js +1 -1
- package/es/tasty/styles/createStyle.js +1 -1
- package/es/tasty/styles/dimension.js +1 -1
- package/es/tasty/styles/display.js +1 -1
- package/es/tasty/styles/fade.js +1 -1
- package/es/tasty/styles/fill.js +1 -1
- package/es/tasty/styles/flow.js +1 -1
- package/es/tasty/styles/font.js +1 -1
- package/es/tasty/styles/fontStyle.js +1 -1
- package/es/tasty/styles/gap.js +1 -1
- package/es/tasty/styles/groupRadius.js +1 -1
- package/es/tasty/styles/height.js +1 -1
- package/es/tasty/styles/index.js +1 -1
- package/es/tasty/styles/inset.js +1 -1
- package/es/tasty/styles/justify.js +1 -1
- package/es/tasty/styles/list.js +1 -1
- package/es/tasty/styles/margin.js +1 -1
- package/es/tasty/styles/marginBlock.js +1 -1
- package/es/tasty/styles/marginInline.js +1 -1
- package/es/tasty/styles/outline.js +1 -1
- package/es/tasty/styles/padding.js +1 -1
- package/es/tasty/styles/paddingBlock.js +1 -1
- package/es/tasty/styles/paddingInline.js +1 -1
- package/es/tasty/styles/place.js +1 -1
- package/es/tasty/styles/predefined.js +1 -1
- package/es/tasty/styles/preset.js +1 -1
- package/es/tasty/styles/radius.js +1 -1
- package/es/tasty/styles/reset.js +1 -1
- package/es/tasty/styles/scrollbar.js +1 -1
- package/es/tasty/styles/shadow.js +1 -1
- package/es/tasty/styles/styledScrollbar.js +1 -1
- package/es/tasty/styles/transition.js +1 -1
- package/es/tasty/styles/types.js +1 -1
- package/es/tasty/styles/width.js +1 -1
- package/es/tasty/tasty.js +61 -50
- package/es/tasty/types.js +1 -1
- package/es/tasty/utils/cache-wrapper.js +1 -1
- package/es/tasty/utils/case-converter.js +1 -1
- package/es/tasty/utils/colors.js +1 -1
- package/es/tasty/utils/dotize.js +1 -1
- package/es/tasty/utils/filterBaseProps.js +1 -1
- package/es/tasty/utils/getDisplayName.js +1 -1
- package/es/tasty/utils/getModCombinations.js +1 -1
- package/es/tasty/utils/isDevEnv.js +36 -0
- package/es/tasty/utils/mergeStyles.js +1 -1
- package/es/tasty/utils/modAttrs.js +1 -1
- package/es/tasty/utils/renderStyles.js +44 -4
- package/es/tasty/utils/responsive.js +1 -1
- package/es/tasty/utils/string.js +1 -1
- package/es/tasty/utils/styles.js +39 -1
- package/es/tasty/utils/warnings.js +1 -1
- package/es/tokens.js +1 -1
- package/es/type-checks.js +1 -1
- package/es/utils/ResizeSensor.js +1 -1
- package/es/utils/modules.js +1 -1
- package/es/utils/promise.js +1 -1
- package/es/utils/random.js +1 -1
- package/es/utils/range.js +1 -1
- package/es/utils/react/Slots.js +1 -1
- package/es/utils/react/chain.js +1 -1
- package/es/utils/react/forwardRefWithGenerics.js +1 -1
- package/es/utils/react/index.js +1 -1
- package/es/utils/react/interactions.js +1 -1
- package/es/utils/react/isTextOnly.js +1 -1
- package/es/utils/react/mapProps.js +1 -1
- package/es/utils/react/mergeProps.js +1 -1
- package/es/utils/react/nullableValue.js +1 -1
- package/es/utils/react/sharedStore.js +1 -1
- package/es/utils/react/useCombinedRefs.js +1 -1
- package/es/utils/react/useControlledFocusVisible.js +1 -1
- package/es/utils/react/useEventBus.js +1 -1
- package/es/utils/react/useId.js +1 -1
- package/es/utils/react/useIsDarwin.js +1 -1
- package/es/utils/react/useKeySymbols.js +1 -1
- package/es/utils/react/useLayoutEffect.js +1 -1
- package/es/utils/react/useQaProps.js +1 -1
- package/es/utils/react/useViewportSize.js +1 -1
- package/es/utils/react/wrapNodeIfPlain.js +1 -1
- package/es/utils/transitions.js +1 -1
- package/es/utils/tree.js +1 -1
- package/es/utils/warnings.js +1 -1
- package/es/version.js +2 -2
- package/package.json +1 -1
- package/types/components/actions/Menu/styled.d.ts +60 -60
- package/types/components/content/List/SectionHeading.d.ts +20 -20
- package/types/components/fields/DatePicker/DatePickerElement.d.ts +20 -20
- package/types/tasty/debug.d.ts +135 -222
- package/types/tasty/injector/index.d.ts +18 -2
- package/types/tasty/injector/injector.d.ts +20 -18
- package/types/tasty/injector/sheet-manager.d.ts +19 -15
- package/types/tasty/injector/types.d.ts +29 -13
- package/types/tasty/utils/isDevEnv.d.ts +6 -0
- package/types/tasty/utils/renderStyles.d.ts +6 -1
- 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.
|
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 {
|
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
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
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
|
-
|
135
|
-
|
136
|
-
const
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
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
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
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
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
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
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
if (
|
211
|
-
|
212
|
-
|
213
|
-
|
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
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
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
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
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 (
|
296
|
-
|
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
|
-
|
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
|
-
|
297
|
+
else if (target instanceof Element) {
|
298
|
+
// DOM element
|
299
|
+
css = getCssTextForNode(target, { root });
|
318
300
|
}
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
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
|
-
|
335
|
-
const prettified = prettifyCSS(css);
|
336
|
-
console.log(prettified);
|
337
|
-
console.groupEnd();
|
307
|
+
return result;
|
338
308
|
},
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
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
|
-
|
318
|
+
classes: [],
|
349
319
|
css: '',
|
350
|
-
|
351
|
-
|
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
|
-
|
368
|
-
const
|
369
|
-
const
|
370
|
-
|
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
|
-
|
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
|
-
|
448
|
-
|
449
|
-
|
450
|
-
const
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
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
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
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
|
-
|
516
|
-
|
517
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
601
|
-
|
602
|
-
|
603
|
-
const
|
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
|
-
|
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
|
-
|
673
|
-
|
674
|
-
totalRules:
|
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
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
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
|
-
|
690
|
-
|
691
|
-
|
692
|
-
|
693
|
-
|
694
|
-
if
|
695
|
-
|
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
|
-
|
698
|
-
|
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
|
-
|
701
|
-
|
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
|
-
|
704
|
-
|
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
|
-
|
707
|
-
|
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
|
-
|
710
|
-
|
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
|
-
|
713
|
-
|
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
|
-
|
716
|
-
console.log(breakdown.css);
|
717
|
-
console.groupEnd();
|
600
|
+
return result;
|
718
601
|
},
|
719
|
-
|
720
|
-
|
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
|
-
|
732
|
-
|
733
|
-
|
734
|
-
|
735
|
-
|
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
|
-
|
822
|
-
|
823
|
-
|
824
|
-
|
825
|
-
|
826
|
-
|
827
|
-
|
828
|
-
|
829
|
-
|
830
|
-
|
831
|
-
|
832
|
-
|
833
|
-
|
834
|
-
|
835
|
-
|
836
|
-
|
837
|
-
|
838
|
-
|
839
|
-
|
840
|
-
|
841
|
-
|
842
|
-
|
843
|
-
|
844
|
-
|
845
|
-
|
846
|
-
|
847
|
-
|
848
|
-
|
849
|
-
|
850
|
-
|
851
|
-
|
852
|
-
|
853
|
-
|
854
|
-
|
855
|
-
|
856
|
-
|
857
|
-
|
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' &&
|
903
|
-
|
699
|
+
if (typeof window !== 'undefined' && isDevEnv()) {
|
700
|
+
tastyDebug.install();
|
904
701
|
}
|
905
702
|
|
906
703
|
|