@cube-dev/ui-kit 0.75.0 → 0.76.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -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 +644 -775
- package/es/tasty/index.js +1 -1
- package/es/tasty/injector/index.js +37 -15
- package/es/tasty/injector/injector.js +157 -145
- 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 +133 -222
- package/types/tasty/injector/index.d.ts +18 -2
- package/types/tasty/injector/injector.d.ts +24 -16
- 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.1
|
5
5
|
* Released under the MIT license.
|
6
6
|
*/
|
7
7
|
|
8
8
|
/**
|
9
9
|
* Debug utilities for inspecting tasty-generated CSS at runtime
|
10
10
|
*/
|
11
|
-
import {
|
11
|
+
import { getCssTextForNode, injector } from './injector';
|
12
|
+
import { isDevEnv } from './utils/isDevEnv';
|
12
13
|
/**
|
13
14
|
* Pretty-print CSS with proper indentation and formatting
|
14
15
|
*/
|
@@ -62,845 +63,713 @@ function prettifyCSS(css) {
|
|
62
63
|
result = result.replace(/,\s+/g, ', ');
|
63
64
|
return result;
|
64
65
|
}
|
65
|
-
|
66
|
-
|
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';
|
133
|
-
}
|
134
|
-
console.group('🎨 Tasty CSS for element');
|
135
|
-
console.log('Element:', element);
|
136
|
-
const css = getCssTextForNode(element);
|
137
|
-
if (css) {
|
138
|
-
const prettified = prettifyCSS(css);
|
139
|
-
console.log('Generated CSS:\n' + prettified);
|
140
|
-
console.groupEnd();
|
141
|
-
return prettified;
|
142
|
-
}
|
143
|
-
else {
|
144
|
-
console.log('No tasty CSS found for this element');
|
145
|
-
console.groupEnd();
|
146
|
-
return 'No tasty CSS found';
|
66
|
+
// Helper functions
|
67
|
+
function findAllTastyClasses(root = document) {
|
68
|
+
const classes = new Set();
|
69
|
+
const elements = root.querySelectorAll?.('[class]') || [];
|
70
|
+
elements.forEach((element) => {
|
71
|
+
const classList = element.getAttribute('class');
|
72
|
+
if (classList) {
|
73
|
+
const tastyClasses = classList
|
74
|
+
.split(/\s+/)
|
75
|
+
.filter((cls) => /^t\d+$/.test(cls));
|
76
|
+
tastyClasses.forEach((cls) => classes.add(cls));
|
147
77
|
}
|
148
|
-
}
|
149
|
-
|
150
|
-
|
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;
|
190
152
|
}
|
191
153
|
}
|
154
|
+
else {
|
155
|
+
if (char === '"' || char === "'") {
|
156
|
+
inString = true;
|
157
|
+
stringChar = char;
|
158
|
+
}
|
159
|
+
else if (char === '{') {
|
160
|
+
braceDepth++;
|
161
|
+
}
|
162
|
+
else if (char === '}') {
|
163
|
+
braceDepth--;
|
164
|
+
}
|
165
|
+
}
|
166
|
+
i++;
|
192
167
|
}
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
168
|
+
const content = cleanCSS.substring(contentStart, i - 1).trim();
|
169
|
+
if (content && selector) {
|
170
|
+
rules.push({ selector, declarations: content });
|
171
|
+
}
|
172
|
+
}
|
173
|
+
return rules;
|
174
|
+
}
|
175
|
+
function getGlobalCSS(root = document) {
|
176
|
+
const allCSS = injector.instance.getCssText({ root });
|
177
|
+
const rules = extractCSSRules(allCSS);
|
178
|
+
const globalRules = rules.filter((rule) => {
|
179
|
+
const selectors = rule.selector.split(',').map((s) => s.trim());
|
180
|
+
return !selectors.every((selector) => {
|
181
|
+
const cleanSelector = selector.replace(/[.#:\s>+~[\]()]/g, ' ');
|
182
|
+
const parts = cleanSelector.split(/\s+/).filter(Boolean);
|
183
|
+
return parts.length > 0 && parts.every((part) => /^t\d+$/.test(part));
|
198
184
|
});
|
199
|
-
}
|
200
|
-
|
201
|
-
|
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
338
|
},
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
const
|
434
|
-
|
339
|
+
// 3) Cache + metrics at a glance
|
340
|
+
cache(opts) {
|
341
|
+
const { root = document } = opts || {};
|
342
|
+
const activeClasses = findAllTastyClasses(root);
|
343
|
+
const allClasses = findAllStyledClasses(root);
|
344
|
+
// Get unused classes (refCount = 0) from the registry
|
345
|
+
const registry = injector.instance['sheetManager']?.getRegistry(root);
|
346
|
+
const unusedClasses = registry
|
347
|
+
? Array.from(registry.refCounts.entries())
|
348
|
+
.filter(([, refCount]) => refCount === 0)
|
349
|
+
.map(([className]) => className)
|
350
|
+
: [];
|
351
|
+
return {
|
352
|
+
classes: {
|
353
|
+
active: activeClasses,
|
354
|
+
unused: unusedClasses,
|
355
|
+
all: [...activeClasses, ...unusedClasses],
|
356
|
+
},
|
357
|
+
metrics: injector.instance.getMetrics({ root }),
|
358
|
+
};
|
435
359
|
},
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
const registry = injector.instance['sheetManager'].getRegistry(document);
|
441
|
-
if (!registry?.injectedProperties) {
|
442
|
-
return [];
|
443
|
-
}
|
444
|
-
return Array.from(registry.injectedProperties).sort();
|
360
|
+
// 4) Cleanup + metrics utilities
|
361
|
+
cleanup(opts) {
|
362
|
+
const { root } = opts || {};
|
363
|
+
injector.instance.cleanup(root);
|
445
364
|
},
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
getDefinedKeyframes() {
|
450
|
-
const registry = injector.instance['sheetManager'].getRegistry(document);
|
451
|
-
if (!registry?.keyframesCache) {
|
452
|
-
return [];
|
453
|
-
}
|
454
|
-
const keyframes = [];
|
455
|
-
for (const [cacheKey, entry] of registry.keyframesCache.entries()) {
|
456
|
-
keyframes.push({
|
457
|
-
name: entry.name,
|
458
|
-
refCount: entry.refCount,
|
459
|
-
cssText: entry.info?.cssText,
|
460
|
-
});
|
461
|
-
}
|
462
|
-
return keyframes.sort((a, b) => a.name.localeCompare(b.name));
|
365
|
+
metrics(opts) {
|
366
|
+
const { root } = opts || {};
|
367
|
+
return injector.instance.getMetrics({ root });
|
463
368
|
},
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
isPropertyDefined(propertyName) {
|
468
|
-
return injector.instance.isPropertyDefined(propertyName);
|
369
|
+
resetMetrics(opts) {
|
370
|
+
const { root } = opts || {};
|
371
|
+
injector.instance.resetMetrics({ root });
|
469
372
|
},
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
373
|
+
// 5) Get CSS for specific global types
|
374
|
+
getGlobalTypeCSS(type, opts) {
|
375
|
+
const { root = document } = opts || {};
|
376
|
+
const registry = injector.instance['sheetManager']?.getRegistry(root);
|
377
|
+
if (!registry) {
|
378
|
+
return { css: '', ruleCount: 0, size: 0 };
|
379
|
+
}
|
380
|
+
const cssChunks = [];
|
381
|
+
let ruleCount = 0;
|
382
|
+
if (type === 'keyframes') {
|
383
|
+
// Handle keyframes separately - they're stored in keyframesCache
|
384
|
+
for (const [, entry] of registry.keyframesCache) {
|
385
|
+
const info = entry.info;
|
386
|
+
const sheet = registry.sheets[info.sheetIndex];
|
387
|
+
const styleSheet = sheet?.sheet?.sheet;
|
388
|
+
if (styleSheet && info.ruleIndex < styleSheet.cssRules.length) {
|
389
|
+
const rule = styleSheet.cssRules[info.ruleIndex];
|
390
|
+
if (rule) {
|
391
|
+
cssChunks.push(rule.cssText);
|
392
|
+
ruleCount++;
|
393
|
+
}
|
394
|
+
}
|
395
|
+
else if (info.cssText) {
|
396
|
+
cssChunks.push(info.cssText);
|
397
|
+
ruleCount++;
|
398
|
+
}
|
481
399
|
}
|
482
400
|
}
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
401
|
+
else {
|
402
|
+
// Handle other global types stored in globalRules
|
403
|
+
const prefix = type === 'global' ? 'global:' : type === 'raw' ? 'raw:' : 'property:';
|
404
|
+
for (const [key, ruleInfo] of registry.globalRules) {
|
405
|
+
if (key.startsWith(prefix)) {
|
406
|
+
const sheet = registry.sheets[ruleInfo.sheetIndex];
|
407
|
+
const styleSheet = sheet?.sheet?.sheet;
|
408
|
+
if (styleSheet) {
|
409
|
+
const start = Math.max(0, ruleInfo.ruleIndex);
|
410
|
+
const end = Math.min(styleSheet.cssRules.length - 1, ruleInfo.endRuleIndex ?? ruleInfo.ruleIndex);
|
411
|
+
if (start >= 0 &&
|
412
|
+
end >= start &&
|
413
|
+
start < styleSheet.cssRules.length) {
|
414
|
+
for (let i = start; i <= end; i++) {
|
415
|
+
const rule = styleSheet.cssRules[i];
|
416
|
+
if (rule) {
|
417
|
+
cssChunks.push(rule.cssText);
|
418
|
+
ruleCount++;
|
419
|
+
}
|
420
|
+
}
|
421
|
+
}
|
422
|
+
}
|
423
|
+
else if (ruleInfo.cssText && ruleInfo.cssText.length) {
|
424
|
+
// Fallback in environments without CSSOM access
|
425
|
+
cssChunks.push(...ruleInfo.cssText);
|
426
|
+
ruleCount += ruleInfo.cssText.length;
|
427
|
+
}
|
428
|
+
}
|
429
|
+
}
|
498
430
|
}
|
499
|
-
const
|
500
|
-
const totalClassesDeleted = history.reduce((sum, cleanup) => sum + cleanup.classesDeleted, 0);
|
501
|
-
const totalCssDeleted = history.reduce((sum, cleanup) => sum + cleanup.cssSize, 0);
|
502
|
-
const totalRulesDeleted = history.reduce((sum, cleanup) => sum + cleanup.rulesDeleted, 0);
|
431
|
+
const rawCSS = cssChunks.join('\n');
|
503
432
|
return {
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
totalRulesDeleted,
|
508
|
-
cleanupHistory: history.map((cleanup) => ({
|
509
|
-
...cleanup,
|
510
|
-
date: new Date(cleanup.timestamp).toISOString(),
|
511
|
-
})),
|
433
|
+
css: prettifyCSS(rawCSS),
|
434
|
+
ruleCount,
|
435
|
+
size: rawCSS.length, // Use raw CSS size for consistent calculations
|
512
436
|
};
|
513
437
|
},
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
totalCssDeleted: 0,
|
525
|
-
totalRulesDeleted: 0,
|
526
|
-
averageClassesPerCleanup: 0,
|
527
|
-
averageCssPerCleanup: 0,
|
528
|
-
averageRulesPerCleanup: 0,
|
529
|
-
};
|
438
|
+
// 6) Defined @property and keyframes
|
439
|
+
defs(opts) {
|
440
|
+
const { root = document } = opts || {};
|
441
|
+
// Get properties from injector if available, otherwise scan CSS
|
442
|
+
let properties = [];
|
443
|
+
try {
|
444
|
+
const registry = injector.instance['sheetManager']?.getRegistry(root);
|
445
|
+
if (registry?.injectedProperties) {
|
446
|
+
properties = Array.from(registry.injectedProperties).sort();
|
447
|
+
}
|
530
448
|
}
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
|
549
|
-
|
449
|
+
catch {
|
450
|
+
// Fallback: scan CSS for @property rules
|
451
|
+
const allCSS = injector.instance.getCssText({ root });
|
452
|
+
const propRegex = /@property\s+(--[a-z0-9-]+)/gi;
|
453
|
+
const propSet = new Set();
|
454
|
+
let match;
|
455
|
+
while ((match = propRegex.exec(allCSS)) !== null) {
|
456
|
+
propSet.add(match[1]);
|
457
|
+
}
|
458
|
+
properties = Array.from(propSet).sort();
|
459
|
+
}
|
460
|
+
// Get keyframes
|
461
|
+
let keyframes = [];
|
462
|
+
try {
|
463
|
+
const registry = injector.instance['sheetManager']?.getRegistry(root);
|
464
|
+
if (registry) {
|
465
|
+
for (const entry of registry.keyframesCache.values()) {
|
466
|
+
keyframes.push({
|
467
|
+
name: entry.name,
|
468
|
+
refCount: entry.refCount,
|
469
|
+
});
|
550
470
|
}
|
551
|
-
|
552
|
-
|
553
|
-
},
|
554
|
-
/**
|
555
|
-
* Log cleanup history to console in a readable format
|
556
|
-
*/
|
557
|
-
logCleanupHistory() {
|
558
|
-
const cleanupData = this.getCleanupHistory();
|
559
|
-
if (cleanupData.totalCleanups === 0) {
|
560
|
-
console.log('🧹 No cleanup history available');
|
561
|
-
return;
|
471
|
+
keyframes.sort((a, b) => a.name.localeCompare(b.name));
|
472
|
+
}
|
562
473
|
}
|
563
|
-
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
|
575
|
-
console.groupEnd();
|
576
|
-
},
|
577
|
-
/**
|
578
|
-
* Get all global CSS rules (non-tasty class selectors)
|
579
|
-
*/
|
580
|
-
getGlobalCSS() {
|
581
|
-
const allCSS = this.getAllCSS();
|
582
|
-
// Split CSS into rules and filter out tasty class rules
|
583
|
-
const rules = this.extractCSSRules(allCSS);
|
584
|
-
const globalRules = rules.filter((rule) => {
|
585
|
-
// Filter out rules that only contain tasty classes (t + digits)
|
586
|
-
const selectors = rule.selector.split(',').map((s) => s.trim());
|
587
|
-
return !selectors.every((selector) => {
|
588
|
-
// Check if selector is purely a tasty class or contains only tasty classes
|
589
|
-
const cleanSelector = selector.replace(/[.#:\s>+~[\]()]/g, ' ');
|
590
|
-
const parts = cleanSelector.split(/\s+/).filter(Boolean);
|
591
|
-
return parts.length > 0 && parts.every((part) => /^t\d+$/.test(part));
|
592
|
-
});
|
593
|
-
});
|
594
|
-
const globalCSS = globalRules
|
595
|
-
.map((rule) => `${rule.selector} { ${rule.declarations} }`)
|
596
|
-
.join('\n');
|
597
|
-
return prettifyCSS(globalCSS);
|
598
|
-
},
|
599
|
-
/**
|
600
|
-
* Log global CSS to console
|
601
|
-
*/
|
602
|
-
logGlobalCSS() {
|
603
|
-
const globalCSS = this.getGlobalCSS();
|
604
|
-
if (!globalCSS.trim()) {
|
605
|
-
console.log('🌍 No global CSS found');
|
606
|
-
return;
|
474
|
+
catch {
|
475
|
+
// Fallback: scan CSS for @keyframes rules
|
476
|
+
const allCSS = injector.instance.getCssText({ root });
|
477
|
+
const keyframesRegex = /@keyframes\s+([a-zA-Z0-9_-]+)/gi;
|
478
|
+
const keyframesSet = new Set();
|
479
|
+
let match;
|
480
|
+
while ((match = keyframesRegex.exec(allCSS)) !== null) {
|
481
|
+
keyframesSet.add(match[1]);
|
482
|
+
}
|
483
|
+
keyframes = Array.from(keyframesSet)
|
484
|
+
.sort()
|
485
|
+
.map((name) => ({ name, refCount: 1 }));
|
607
486
|
}
|
608
|
-
|
487
|
+
return { properties, keyframes };
|
609
488
|
},
|
610
|
-
|
611
|
-
|
612
|
-
|
613
|
-
|
614
|
-
const
|
615
|
-
const
|
616
|
-
const
|
617
|
-
|
618
|
-
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
|
623
|
-
});
|
624
|
-
const
|
625
|
-
|
626
|
-
|
627
|
-
|
628
|
-
|
629
|
-
|
630
|
-
|
631
|
-
|
632
|
-
|
633
|
-
|
634
|
-
|
635
|
-
|
636
|
-
|
637
|
-
|
638
|
-
|
639
|
-
|
640
|
-
|
641
|
-
other: [],
|
489
|
+
// 7) One-shot overview
|
490
|
+
summary(opts) {
|
491
|
+
const { root = document, log = false, includePageCSS = false } = opts || {};
|
492
|
+
const cacheStatus = this.cache({ root });
|
493
|
+
const definitions = this.defs({ root });
|
494
|
+
const metrics = this.metrics({ root });
|
495
|
+
const activeCSS = this.css('active', { root, prettify: false });
|
496
|
+
const unusedCSS = this.css('unused', { root, prettify: false });
|
497
|
+
const allCSS = this.css('all', { root, prettify: false });
|
498
|
+
// Calculate global CSS by subtracting class-based CSS from total
|
499
|
+
const classCSSSize = activeCSS.length + unusedCSS.length;
|
500
|
+
const totalGlobalCSSSize = allCSS.length - classCSSSize;
|
501
|
+
// Get CSS for each global type separately for display purposes
|
502
|
+
const globalData = this.getGlobalTypeCSS('global', { root });
|
503
|
+
const rawData = this.getGlobalTypeCSS('raw', { root });
|
504
|
+
const keyframesData = this.getGlobalTypeCSS('keyframes', { root });
|
505
|
+
const propertyData = this.getGlobalTypeCSS('property', { root });
|
506
|
+
// Use the calculated sizes to avoid double-counting
|
507
|
+
const globalTypesTotalSize = globalData.size + rawData.size + keyframesData.size + propertyData.size;
|
508
|
+
// Build cleanup summary from metrics
|
509
|
+
const cleanupSummary = {
|
510
|
+
enabled: !!metrics,
|
511
|
+
totalCleanups: metrics?.cleanupHistory?.length || 0,
|
512
|
+
totalClassesDeleted: metrics?.cleanupHistory?.reduce((sum, c) => sum + c.classesDeleted, 0) || 0,
|
513
|
+
totalCssDeleted: metrics?.cleanupHistory?.reduce((sum, c) => sum + c.cssSize, 0) || 0,
|
514
|
+
totalRulesDeleted: metrics?.cleanupHistory?.reduce((sum, c) => sum + c.rulesDeleted, 0) ||
|
515
|
+
0,
|
516
|
+
averageClassesPerCleanup: 0,
|
517
|
+
averageCssPerCleanup: 0,
|
518
|
+
averageRulesPerCleanup: 0,
|
519
|
+
lastCleanup: undefined,
|
642
520
|
};
|
643
|
-
|
644
|
-
|
645
|
-
|
646
|
-
|
647
|
-
|
648
|
-
|
649
|
-
|
650
|
-
|
651
|
-
|
652
|
-
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
}
|
657
|
-
else if (selector.includes('#') &&
|
658
|
-
!selector.includes('.') &&
|
659
|
-
!selector.includes(':')) {
|
660
|
-
selectors.ids.push(selector);
|
661
|
-
}
|
662
|
-
else if (selector.includes(':')) {
|
663
|
-
selectors.pseudoClasses.push(selector);
|
664
|
-
}
|
665
|
-
else if (/^[a-zA-Z][a-zA-Z0-9]*$/.test(selector.trim())) {
|
666
|
-
selectors.elements.push(selector);
|
667
|
-
}
|
668
|
-
else {
|
669
|
-
selectors.other.push(selector);
|
521
|
+
if (cleanupSummary.totalCleanups > 0) {
|
522
|
+
cleanupSummary.averageClassesPerCleanup =
|
523
|
+
cleanupSummary.totalClassesDeleted / cleanupSummary.totalCleanups;
|
524
|
+
cleanupSummary.averageCssPerCleanup =
|
525
|
+
cleanupSummary.totalCssDeleted / cleanupSummary.totalCleanups;
|
526
|
+
cleanupSummary.averageRulesPerCleanup =
|
527
|
+
cleanupSummary.totalRulesDeleted / cleanupSummary.totalCleanups;
|
528
|
+
const lastCleanup = metrics?.cleanupHistory?.[metrics.cleanupHistory.length - 1];
|
529
|
+
if (lastCleanup) {
|
530
|
+
cleanupSummary.lastCleanup = {
|
531
|
+
...lastCleanup,
|
532
|
+
date: new Date(lastCleanup.timestamp).toISOString(),
|
533
|
+
};
|
670
534
|
}
|
671
|
-
});
|
672
|
-
return {
|
673
|
-
globalRules: breakdown,
|
674
|
-
totalRules: breakdown.length,
|
675
|
-
totalCSSSize: css.length,
|
676
|
-
css: prettifiedCSS,
|
677
|
-
selectors,
|
678
|
-
};
|
679
|
-
},
|
680
|
-
/**
|
681
|
-
* Log detailed global CSS breakdown
|
682
|
-
*/
|
683
|
-
logGlobalCSSBreakdown() {
|
684
|
-
const breakdown = this.getGlobalCSSBreakdown();
|
685
|
-
if (breakdown.totalRules === 0) {
|
686
|
-
console.log('🌍 No global CSS rules found');
|
687
|
-
return;
|
688
|
-
}
|
689
|
-
console.group(`🌍 Global CSS Breakdown (${breakdown.totalRules} rules)`);
|
690
|
-
console.log(`📊 Statistics:`);
|
691
|
-
console.log(` • Total global rules: ${breakdown.totalRules}`);
|
692
|
-
console.log(` • Total CSS size: ${breakdown.totalCSSSize} characters`);
|
693
|
-
console.log(`🎯 Selector Analysis:`);
|
694
|
-
if (breakdown.selectors.elements.length > 0) {
|
695
|
-
console.log(` • Element selectors: ${breakdown.selectors.elements.length}`, breakdown.selectors.elements.slice(0, 5));
|
696
|
-
}
|
697
|
-
if (breakdown.selectors.classes.length > 0) {
|
698
|
-
console.log(` • Class selectors: ${breakdown.selectors.classes.length}`, breakdown.selectors.classes.slice(0, 5));
|
699
535
|
}
|
700
|
-
|
701
|
-
|
702
|
-
|
703
|
-
|
704
|
-
|
705
|
-
|
706
|
-
|
707
|
-
|
536
|
+
let page;
|
537
|
+
if (includePageCSS) {
|
538
|
+
const pageStats = getPageStats({ root, includeCrossOrigin: true });
|
539
|
+
page = {
|
540
|
+
...pageStats,
|
541
|
+
css: includePageCSS === 'all'
|
542
|
+
? getPageCSS({ root, includeCrossOrigin: true })
|
543
|
+
: undefined,
|
544
|
+
};
|
708
545
|
}
|
709
|
-
|
710
|
-
|
546
|
+
// If individual extraction matches total, use individual sizes
|
547
|
+
// Otherwise, proportionally scale the individual sizes to match the total
|
548
|
+
const useIndividualSizes = Math.abs(globalTypesTotalSize - totalGlobalCSSSize) < 100;
|
549
|
+
let adjustedGlobalSizes;
|
550
|
+
if (useIndividualSizes) {
|
551
|
+
adjustedGlobalSizes = {
|
552
|
+
globalCSSSize: globalData.size,
|
553
|
+
rawCSSSize: rawData.size,
|
554
|
+
keyframesCSSSize: keyframesData.size,
|
555
|
+
propertyCSSSize: propertyData.size,
|
556
|
+
};
|
711
557
|
}
|
712
|
-
|
713
|
-
|
558
|
+
else {
|
559
|
+
// Scale proportionally to match the actual total
|
560
|
+
const scaleFactor = totalGlobalCSSSize / globalTypesTotalSize;
|
561
|
+
adjustedGlobalSizes = {
|
562
|
+
globalCSSSize: Math.round(globalData.size * scaleFactor),
|
563
|
+
rawCSSSize: Math.round(rawData.size * scaleFactor),
|
564
|
+
keyframesCSSSize: Math.round(keyframesData.size * scaleFactor),
|
565
|
+
propertyCSSSize: Math.round(propertyData.size * scaleFactor),
|
566
|
+
};
|
714
567
|
}
|
715
|
-
|
716
|
-
|
717
|
-
|
718
|
-
|
719
|
-
|
720
|
-
|
721
|
-
|
722
|
-
|
723
|
-
|
724
|
-
|
725
|
-
|
726
|
-
|
727
|
-
|
728
|
-
|
729
|
-
|
730
|
-
|
731
|
-
|
732
|
-
|
733
|
-
|
734
|
-
|
735
|
-
|
736
|
-
|
737
|
-
|
738
|
-
|
739
|
-
|
740
|
-
|
741
|
-
|
742
|
-
|
743
|
-
|
744
|
-
|
745
|
-
|
746
|
-
|
747
|
-
|
748
|
-
|
749
|
-
|
750
|
-
|
751
|
-
|
752
|
-
|
753
|
-
|
754
|
-
|
755
|
-
|
756
|
-
|
757
|
-
|
758
|
-
|
759
|
-
|
760
|
-
|
761
|
-
|
762
|
-
|
763
|
-
|
764
|
-
|
765
|
-
|
766
|
-
}
|
767
|
-
|
768
|
-
|
769
|
-
|
770
|
-
|
771
|
-
|
772
|
-
|
773
|
-
|
774
|
-
|
775
|
-
|
776
|
-
|
777
|
-
|
778
|
-
const char = css[i];
|
779
|
-
if (inString) {
|
780
|
-
if (char === stringChar && css[i - 1] !== '\\') {
|
781
|
-
inString = false;
|
782
|
-
}
|
783
|
-
}
|
784
|
-
else {
|
785
|
-
if (char === '"' || char === "'") {
|
786
|
-
inString = true;
|
787
|
-
stringChar = char;
|
788
|
-
}
|
789
|
-
else if (char === '{') {
|
790
|
-
braceDepth++;
|
791
|
-
}
|
792
|
-
else if (char === '}') {
|
793
|
-
braceDepth--;
|
794
|
-
}
|
568
|
+
const summary = {
|
569
|
+
activeClasses: cacheStatus.classes.active,
|
570
|
+
unusedClasses: cacheStatus.classes.unused,
|
571
|
+
totalStyledClasses: cacheStatus.classes.all,
|
572
|
+
activeCSSSize: activeCSS.length,
|
573
|
+
unusedCSSSize: unusedCSS.length,
|
574
|
+
...adjustedGlobalSizes,
|
575
|
+
totalCSSSize: allCSS.length,
|
576
|
+
activeCSS: prettifyCSS(activeCSS),
|
577
|
+
unusedCSS: prettifyCSS(unusedCSS),
|
578
|
+
globalCSS: globalData.css,
|
579
|
+
rawCSS: rawData.css,
|
580
|
+
keyframesCSS: keyframesData.css,
|
581
|
+
propertyCSS: propertyData.css,
|
582
|
+
allCSS: prettifyCSS(allCSS),
|
583
|
+
globalRuleCount: globalData.ruleCount,
|
584
|
+
rawRuleCount: rawData.ruleCount,
|
585
|
+
keyframesRuleCount: keyframesData.ruleCount,
|
586
|
+
propertyRuleCount: propertyData.ruleCount,
|
587
|
+
page,
|
588
|
+
metrics,
|
589
|
+
definedProperties: definitions.properties,
|
590
|
+
definedKeyframes: definitions.keyframes,
|
591
|
+
propertyCount: definitions.properties.length,
|
592
|
+
keyframeCount: definitions.keyframes.length,
|
593
|
+
cleanupSummary,
|
594
|
+
};
|
595
|
+
if (log) {
|
596
|
+
console.group('🎨 Comprehensive Tasty Debug Summary');
|
597
|
+
console.log(`📊 Style Cache Status:`);
|
598
|
+
console.log(` • Active classes (in DOM): ${summary.activeClasses.length}`);
|
599
|
+
console.log(` • Unused classes (refCount = 0): ${summary.unusedClasses.length}`);
|
600
|
+
console.log(` • Total styled classes: ${summary.totalStyledClasses.length}`);
|
601
|
+
console.log(`💾 CSS Size:`);
|
602
|
+
console.log(` • Active CSS: ${summary.activeCSSSize} characters`);
|
603
|
+
console.log(` • Unused CSS: ${summary.unusedCSSSize} characters`);
|
604
|
+
console.log(` • Global CSS (injectGlobal): ${summary.globalCSSSize} characters (${summary.globalRuleCount} rules)`);
|
605
|
+
console.log(` • Raw CSS (createGlobalStyle): ${summary.rawCSSSize} characters (${summary.rawRuleCount} rules)`);
|
606
|
+
console.log(` • Keyframes CSS: ${summary.keyframesCSSSize} characters (${summary.keyframesRuleCount} rules)`);
|
607
|
+
console.log(` • Property CSS: ${summary.propertyCSSSize} characters (${summary.propertyRuleCount} rules)`);
|
608
|
+
// Show breakdown calculation
|
609
|
+
const calculatedTotal = summary.activeCSSSize +
|
610
|
+
summary.unusedCSSSize +
|
611
|
+
summary.globalCSSSize +
|
612
|
+
summary.rawCSSSize +
|
613
|
+
summary.keyframesCSSSize +
|
614
|
+
summary.propertyCSSSize;
|
615
|
+
console.log(` • Calculated Total: ${calculatedTotal} characters`);
|
616
|
+
console.log(` • Actual Total: ${summary.totalCSSSize} characters`);
|
617
|
+
const difference = Math.abs(calculatedTotal - summary.totalCSSSize);
|
618
|
+
if (difference > 100) {
|
619
|
+
console.warn(` ⚠️ Size mismatch: ${difference} characters difference`);
|
620
|
+
// Debug: show what might be missing
|
621
|
+
console.group('🔍 Debugging size mismatch:');
|
622
|
+
console.log(`Active + Unused = ${summary.activeCSSSize + summary.unusedCSSSize}`);
|
623
|
+
console.log(`All Global Types = ${summary.globalCSSSize + summary.rawCSSSize + summary.keyframesCSSSize + summary.propertyCSSSize}`);
|
624
|
+
console.log(`Class-based vs Total difference = ${summary.totalCSSSize - (summary.activeCSSSize + summary.unusedCSSSize)}`);
|
625
|
+
// Show scaling information
|
626
|
+
console.log(`Raw global extraction total: ${globalTypesTotalSize}`);
|
627
|
+
console.log(`Calculated global size: ${totalGlobalCSSSize}`);
|
628
|
+
console.log(`Used individual sizes: ${useIndividualSizes}`);
|
629
|
+
if (!useIndividualSizes) {
|
630
|
+
console.log(`Scale factor applied: ${(totalGlobalCSSSize / globalTypesTotalSize).toFixed(3)}`);
|
795
631
|
}
|
796
|
-
|
632
|
+
console.groupEnd();
|
797
633
|
}
|
798
|
-
|
799
|
-
|
800
|
-
|
801
|
-
|
802
|
-
|
803
|
-
const declarations = declarationMatch ? declarationMatch[1].trim() : '';
|
804
|
-
if (declarations) {
|
805
|
-
rules.push({ selector, declarations });
|
806
|
-
}
|
807
|
-
// Extract and parse nested rules recursively
|
808
|
-
const nestedStart = content.indexOf('{');
|
809
|
-
if (nestedStart !== -1) {
|
810
|
-
const nestedCSS = content.substring(nestedStart);
|
811
|
-
this.parseCSSSafe(nestedCSS, rules);
|
812
|
-
}
|
634
|
+
if (page) {
|
635
|
+
console.log(`📄 Page CSS:`);
|
636
|
+
console.log(` • Total page CSS: ${page.cssSize} characters`);
|
637
|
+
console.log(` • Total page rules: ${page.ruleCount}`);
|
638
|
+
console.log(` • Stylesheets: ${page.stylesheetCount} (${page.skippedStylesheets} skipped)`);
|
813
639
|
}
|
814
|
-
|
815
|
-
|
816
|
-
|
640
|
+
console.log('🏷️ Properties & Keyframes:');
|
641
|
+
console.log(` • Defined @property: ${summary.propertyCount}`);
|
642
|
+
console.log(` • Defined @keyframes: ${summary.keyframeCount}`);
|
643
|
+
if (metrics) {
|
644
|
+
console.log(`⚡ Performance Metrics:`);
|
645
|
+
console.log(` • Cache hits: ${metrics.hits}`);
|
646
|
+
console.log(` • Cache misses: ${metrics.misses}`);
|
647
|
+
console.log(` • Cached style reuses: ${metrics.unusedHits}`);
|
648
|
+
const hitRate = metrics.hits + metrics.misses > 0
|
649
|
+
? (((metrics.hits + (metrics.unusedHits || 0)) /
|
650
|
+
(metrics.hits + metrics.misses)) *
|
651
|
+
100).toFixed(1)
|
652
|
+
: '0';
|
653
|
+
console.log(` • Overall cache hit rate: ${hitRate}%`);
|
817
654
|
}
|
655
|
+
console.log('🔍 Details:');
|
656
|
+
console.log(' • Active classes:', summary.activeClasses);
|
657
|
+
console.log(' • Unused classes:', summary.unusedClasses);
|
658
|
+
console.groupEnd();
|
818
659
|
}
|
660
|
+
return summary;
|
819
661
|
},
|
820
|
-
|
821
|
-
|
822
|
-
|
823
|
-
|
824
|
-
const
|
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
|
-
|
662
|
+
// 8) Page-level CSS helpers
|
663
|
+
pageCSS(opts) {
|
664
|
+
const { root = document, prettify = true, log = false, includeCrossOrigin = true, } = opts || {};
|
665
|
+
const css = getPageCSS({ root, includeCrossOrigin });
|
666
|
+
const result = prettify ? prettifyCSS(css) : css;
|
667
|
+
if (log) {
|
668
|
+
console.group('📄 Page CSS (All Stylesheets)');
|
669
|
+
console.log(result || '(empty)');
|
670
|
+
console.groupEnd();
|
671
|
+
}
|
672
|
+
return result;
|
673
|
+
},
|
674
|
+
pageStats(opts) {
|
675
|
+
const { root = document, includeCrossOrigin = true } = opts || {};
|
676
|
+
return getPageStats({ root, includeCrossOrigin });
|
677
|
+
},
|
678
|
+
// 9) Install globally
|
679
|
+
install() {
|
680
|
+
if (typeof window !== 'undefined' &&
|
681
|
+
window.tastyDebug !== tastyDebug) {
|
682
|
+
window.tastyDebug = tastyDebug;
|
683
|
+
console.log('🎨 tastyDebug installed on window. Run tastyDebug.help() for quick start guide.');
|
684
|
+
}
|
685
|
+
},
|
686
|
+
// 10) Beautiful console logging with collapsible CSS
|
687
|
+
log(target, opts) {
|
688
|
+
const { title, ...cssOpts } = opts || {};
|
689
|
+
const css = tastyDebug.css(target, cssOpts);
|
690
|
+
if (!css.trim()) {
|
691
|
+
console.warn(`🎨 No CSS found for target: ${String(target)}`);
|
692
|
+
return;
|
693
|
+
}
|
694
|
+
const targetStr = Array.isArray(target)
|
695
|
+
? target.join(', ')
|
696
|
+
: String(target);
|
697
|
+
const displayTitle = title || `CSS for "${targetStr}"`;
|
698
|
+
// Get some stats about the CSS
|
699
|
+
const lines = css.split('\n').length;
|
700
|
+
const size = new Blob([css]).size;
|
701
|
+
const sizeStr = size > 1024 ? `${(size / 1024).toFixed(1)}KB` : `${size}B`;
|
702
|
+
// Count CSS rules (blocks with opening braces)
|
703
|
+
const ruleCount = (css.match(/\{/g) || []).length;
|
704
|
+
console.group(`🎨 ${displayTitle} (${ruleCount} rules, ${lines} lines, ${sizeStr})`);
|
705
|
+
// Detect sub-elements in CSS
|
706
|
+
const subElementMatches = css.match(/\[data-element="([^"]+)"\]/g) || [];
|
707
|
+
const subElements = [
|
708
|
+
...new Set(subElementMatches
|
709
|
+
.map((match) => match.match(/\[data-element="([^"]+)"\]/)?.[1])
|
710
|
+
.filter(Boolean)),
|
711
|
+
];
|
712
|
+
if (subElements.length > 0) {
|
713
|
+
console.log(`🧩 Sub-elements found: ${subElements.join(', ')}`);
|
714
|
+
// Show stats and CSS for each sub-element
|
715
|
+
subElements.forEach((element) => {
|
716
|
+
const elementSelector = `[data-element="${element}"]`;
|
717
|
+
const elementRegex = new RegExp(`[^}]*\\[data-element="${element.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}"\\][^{]*\\{[^}]*\\}`, 'gm');
|
718
|
+
const elementCSS = (css.match(elementRegex) || []).join('\n');
|
719
|
+
if (elementCSS) {
|
720
|
+
const elementRules = (elementCSS.match(/\{/g) || []).length;
|
721
|
+
const elementLines = elementCSS.split('\n').length;
|
722
|
+
const elementSize = new Blob([elementCSS]).size;
|
723
|
+
const elementSizeStr = elementSize > 1024
|
724
|
+
? `${(elementSize / 1024).toFixed(1)}KB`
|
725
|
+
: `${elementSize}B`;
|
726
|
+
console.groupCollapsed(`🧩 ${element} (${elementRules} rules, ${elementLines} lines, ${elementSizeStr})`);
|
727
|
+
console.log(`%c${elementCSS}`, 'color: #666; font-family: monospace; font-size: 12px; white-space: pre;');
|
728
|
+
console.groupEnd();
|
729
|
+
}
|
858
730
|
});
|
859
731
|
}
|
732
|
+
// Full CSS in collapsible group (hidden by default)
|
733
|
+
console.groupCollapsed('📄 Full CSS (click to expand)');
|
734
|
+
console.log(`%c${css}`, 'color: #666; font-family: monospace; font-size: 12px; white-space: pre;');
|
735
|
+
console.groupEnd();
|
736
|
+
console.groupEnd();
|
737
|
+
},
|
738
|
+
// 11) Show help and usage examples
|
739
|
+
help() {
|
740
|
+
console.group('🎨 tastyDebug - Quick Start Guide');
|
741
|
+
console.log('💡 Essential commands:');
|
742
|
+
console.log(' • tastyDebug.summary({ log: true }) - comprehensive overview');
|
743
|
+
console.log(' • tastyDebug.log("active") - beautiful CSS display');
|
744
|
+
console.log(' • tastyDebug.css("active") - get active CSS');
|
745
|
+
console.log(' • tastyDebug.inspect(".my-element") - detailed element inspection');
|
746
|
+
console.log(' • tastyDebug.global({ log: true }) - global CSS analysis');
|
747
|
+
console.log(' • tastyDebug.cache() - cache status');
|
748
|
+
console.log(' • tastyDebug.defs() - defined properties & keyframes');
|
749
|
+
console.log(' • tastyDebug.pageCSS({ log: true }) - all page CSS');
|
750
|
+
console.log('');
|
751
|
+
console.log('📖 Common targets for css()/log():');
|
752
|
+
console.log(' • "all" - all tasty CSS + global CSS');
|
753
|
+
console.log(' • "active" - CSS for classes in DOM');
|
754
|
+
console.log(' • "unused" - CSS for classes with refCount = 0');
|
755
|
+
console.log(' • "global" - only global CSS (createGlobalStyle)');
|
756
|
+
console.log(' • "page" - ALL page CSS (including non-tasty)');
|
757
|
+
console.log(' • "t123" - specific tasty class');
|
758
|
+
console.log(' • [".my-selector"] - CSS selector');
|
759
|
+
console.log('');
|
760
|
+
console.log('🔧 Available options:');
|
761
|
+
console.log(' • { log: true } - auto-log results to console');
|
762
|
+
console.log(' • { title: "Custom" } - custom title for log()');
|
763
|
+
console.log(' • { root: shadowRoot } - target Shadow DOM');
|
764
|
+
console.log(' • { prettify: false } - skip CSS formatting');
|
860
765
|
console.groupEnd();
|
861
766
|
},
|
862
767
|
};
|
863
|
-
/**
|
864
|
-
* Check if we're in a development environment at runtime
|
865
|
-
* Uses bracket notation to avoid bundler compilation
|
866
|
-
*/
|
867
|
-
function isDevelopmentEnvironment() {
|
868
|
-
if (typeof process === 'undefined')
|
869
|
-
return false;
|
870
|
-
// Use bracket notation to avoid bundler replacement
|
871
|
-
const nodeEnv = process.env?.['NODE_ENV'];
|
872
|
-
return nodeEnv === 'development' || nodeEnv !== 'production';
|
873
|
-
}
|
874
|
-
/**
|
875
|
-
* Install tastyDebug on window object for easy access in browser console
|
876
|
-
* Only in non-production environments
|
877
|
-
*/
|
878
|
-
export function installGlobalDebug(options) {
|
879
|
-
const shouldInstall = options?.force || isDevelopmentEnvironment();
|
880
|
-
if (typeof window !== 'undefined' &&
|
881
|
-
shouldInstall &&
|
882
|
-
window.tastyDebug !== tastyDebug) {
|
883
|
-
window.tastyDebug = tastyDebug;
|
884
|
-
console.log('🎨 tastyDebug installed on window.\n' +
|
885
|
-
'💡 Quick start:\n' +
|
886
|
-
' • tastyDebug.getSummary() - comprehensive overview with properties, keyframes & global CSS\n' +
|
887
|
-
' • tastyDebug.inspect(".my-element") - detailed element inspection\n' +
|
888
|
-
' • tastyDebug.getGlobalCSS() - get all global CSS from createGlobalStyle()\n' +
|
889
|
-
' • tastyDebug.logGlobalCSS() - log global CSS to console\n' +
|
890
|
-
' • tastyDebug.logGlobalCSSBreakdown() - detailed global CSS analysis\n' +
|
891
|
-
' • tastyDebug.debugRawCSS() - debug raw CSS parsing and filtering\n' +
|
892
|
-
' • tastyDebug.getDefinedProperties() - list all @property definitions\n' +
|
893
|
-
' • tastyDebug.getDefinedKeyframes() - list all keyframe definitions\n' +
|
894
|
-
' • tastyDebug.getActiveCSS() / getCachedCSS() - get specific CSS\n' +
|
895
|
-
' • tastyDebug.getCleanupSummary() - cleanup statistics overview\n' +
|
896
|
-
' • tastyDebug.logCleanupHistory() - detailed cleanup history');
|
897
|
-
}
|
898
|
-
}
|
899
768
|
/**
|
900
769
|
* Auto-install in development
|
901
770
|
*/
|
902
|
-
if (typeof window !== 'undefined' &&
|
903
|
-
|
771
|
+
if (typeof window !== 'undefined' && isDevEnv()) {
|
772
|
+
tastyDebug.install();
|
904
773
|
}
|
905
774
|
|
906
775
|
|