@cube-dev/ui-kit 0.0.0-canary-da1f163 → 0.0.0-canary-7f29fb4
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/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 +2 -2
- package/es/components/actions/Action/Action.js +14 -18
- package/es/components/actions/Button/Button.js +2 -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 +3 -8
- 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 +6 -5
- 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 +3 -3
- package/es/components/content/Title.js +3 -3
- 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 +1 -1
- 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 +1 -1
- 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 +3 -2
- 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 -2
- package/es/tasty/debug.js +572 -0
- package/es/tasty/index.js +3 -1
- package/es/tasty/injector/flatten.js +350 -0
- package/es/tasty/injector/index.js +165 -0
- package/es/tasty/injector/injector.js +336 -0
- package/es/tasty/injector/sheet-manager.js +737 -0
- package/es/tasty/injector/types.js +10 -0
- package/es/tasty/parser/classify.js +1 -1
- package/es/tasty/parser/const.js +1 -1
- package/es/tasty/parser/lru.js +38 -2
- 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 +8 -12
- package/es/tasty/styles/createStyle.js +3 -3
- 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 +6 -8
- 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 -3
- package/es/tasty/styles/preset.js +1 -1
- package/es/tasty/styles/radius.js +1 -1
- package/es/tasty/styles/reset.js +40 -44
- 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 +92 -19
- 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/mergeStyles.js +1 -1
- package/es/tasty/utils/modAttrs.js +1 -1
- package/es/tasty/utils/renderStyles.js +789 -57
- package/es/tasty/utils/responsive.js +1 -1
- package/es/tasty/utils/string.js +1 -1
- package/es/tasty/utils/styles.js +3 -62
- 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/Button/Button.d.ts +1 -0
- package/types/components/actions/Menu/styled.d.ts +699 -702
- package/types/components/actions/use-action.d.ts +1 -1
- package/types/components/content/List/SectionHeading.d.ts +233 -234
- package/types/components/fields/DatePicker/DatePickerElement.d.ts +233 -234
- package/types/tasty/debug.d.ts +133 -0
- package/types/tasty/index.d.ts +2 -0
- package/types/tasty/injector/flatten.d.ts +16 -0
- package/types/tasty/injector/index.d.ts +64 -0
- package/types/tasty/injector/injector.d.ts +82 -0
- package/types/tasty/injector/sheet-manager.d.ts +105 -0
- package/types/tasty/injector/types.d.ts +105 -0
- package/types/tasty/parser/lru.d.ts +5 -1
- package/types/tasty/styles/color.d.ts +3 -1
- package/types/tasty/styles/reset.d.ts +1 -2
- package/types/tasty/types.d.ts +0 -2
- package/types/tasty/utils/renderStyles.d.ts +25 -7
- package/types/tasty/utils/styles.d.ts +1 -9
|
@@ -0,0 +1,737 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license MIT
|
|
3
|
+
* author: Cube Dev Team
|
|
4
|
+
* @cube-dev/ui-kit v0.0.0-canary-7f29fb4
|
|
5
|
+
* Released under the MIT license.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export class SheetManager {
|
|
9
|
+
rootRegistries = new WeakMap();
|
|
10
|
+
config;
|
|
11
|
+
constructor(config) {
|
|
12
|
+
this.config = config;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Get or create registry for a root (Document or ShadowRoot)
|
|
16
|
+
*/
|
|
17
|
+
getRegistry(root) {
|
|
18
|
+
let registry = this.rootRegistries.get(root);
|
|
19
|
+
if (!registry) {
|
|
20
|
+
const metrics = this.config.collectMetrics
|
|
21
|
+
? {
|
|
22
|
+
hits: 0,
|
|
23
|
+
misses: 0,
|
|
24
|
+
unusedHits: 0,
|
|
25
|
+
bulkCleanups: 0,
|
|
26
|
+
totalInsertions: 0,
|
|
27
|
+
totalUnused: 0,
|
|
28
|
+
stylesCleanedUp: 0,
|
|
29
|
+
startTime: Date.now(),
|
|
30
|
+
}
|
|
31
|
+
: undefined;
|
|
32
|
+
registry = {
|
|
33
|
+
sheets: [],
|
|
34
|
+
refCounts: new Map(),
|
|
35
|
+
rules: new Map(),
|
|
36
|
+
unusedRules: new Map(),
|
|
37
|
+
ruleTextSet: new Set(),
|
|
38
|
+
bulkCleanupTimeout: null,
|
|
39
|
+
metrics,
|
|
40
|
+
classCounter: 0,
|
|
41
|
+
batchedRules: new Map(),
|
|
42
|
+
batchedRuleMeta: new Map(),
|
|
43
|
+
classToBatchedKeys: new Map(),
|
|
44
|
+
unusedBatchedClasses: new Set(),
|
|
45
|
+
};
|
|
46
|
+
this.rootRegistries.set(root, registry);
|
|
47
|
+
}
|
|
48
|
+
return registry;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Create a new stylesheet for the registry
|
|
52
|
+
*/
|
|
53
|
+
createSheet(registry, root) {
|
|
54
|
+
const sheet = this.createStyleElement(root);
|
|
55
|
+
const sheetInfo = {
|
|
56
|
+
sheet,
|
|
57
|
+
ruleCount: 0,
|
|
58
|
+
holes: [],
|
|
59
|
+
};
|
|
60
|
+
registry.sheets.push(sheetInfo);
|
|
61
|
+
return sheetInfo;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Create a style element and append to document
|
|
65
|
+
*/
|
|
66
|
+
createStyleElement(root) {
|
|
67
|
+
const style = root.createElement?.('style') ||
|
|
68
|
+
document.createElement('style');
|
|
69
|
+
if (this.config.nonce) {
|
|
70
|
+
style.nonce = this.config.nonce;
|
|
71
|
+
}
|
|
72
|
+
style.setAttribute('data-tasty', '');
|
|
73
|
+
// Append to head or shadow root
|
|
74
|
+
if ('head' in root && root.head) {
|
|
75
|
+
root.head.appendChild(style);
|
|
76
|
+
}
|
|
77
|
+
else if ('appendChild' in root) {
|
|
78
|
+
root.appendChild(style);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
document.head.appendChild(style);
|
|
82
|
+
}
|
|
83
|
+
// Verify it was actually added - log only if there's a problem and we're not using forceTextInjection
|
|
84
|
+
if (!style.isConnected && !this.config.forceTextInjection) {
|
|
85
|
+
console.error('SheetManager: Style element failed to connect to DOM!', {
|
|
86
|
+
parentNode: style.parentNode?.nodeName,
|
|
87
|
+
isConnected: style.isConnected,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return style;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Insert CSS rules as a single block
|
|
94
|
+
*/
|
|
95
|
+
insertRule(registry, flattenedRules, className, root) {
|
|
96
|
+
try {
|
|
97
|
+
// Pre-merge identical selector+atRules declarations within the same class
|
|
98
|
+
const groupedRules = [];
|
|
99
|
+
const groupMap = new Map();
|
|
100
|
+
const atKey = (at) => (at && at.length ? at.join('|') : '');
|
|
101
|
+
for (const r of flattenedRules) {
|
|
102
|
+
const key = `${atKey(r.atRules)}||${r.selector}`;
|
|
103
|
+
const existing = groupMap.get(key);
|
|
104
|
+
if (existing) {
|
|
105
|
+
existing.rule.declarations = `${existing.rule.declarations} ${r.declarations}`;
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
const clone = { ...r };
|
|
109
|
+
groupMap.set(key, { idx: groupedRules.length, rule: clone });
|
|
110
|
+
groupedRules.push(clone);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Ensure registry maps exist for this class
|
|
114
|
+
if (!registry.classToBatchedKeys.has(className)) {
|
|
115
|
+
registry.classToBatchedKeys.set(className, new Set());
|
|
116
|
+
}
|
|
117
|
+
// Apply batching per grouped rule
|
|
118
|
+
for (const rule of groupedRules) {
|
|
119
|
+
const normalizedDecl = this.normalizeDeclarations(rule.declarations);
|
|
120
|
+
const { selectorTemplate } = this.makeSelectorTemplate(rule.selector, className);
|
|
121
|
+
const batchKey = this.getBatchKey(rule.atRules, selectorTemplate, normalizedDecl);
|
|
122
|
+
// Record meta
|
|
123
|
+
if (!registry.batchedRuleMeta.has(batchKey)) {
|
|
124
|
+
registry.batchedRuleMeta.set(batchKey, {
|
|
125
|
+
selectorTemplate,
|
|
126
|
+
declarations: normalizedDecl,
|
|
127
|
+
atRules: rule.atRules && rule.atRules.length
|
|
128
|
+
? [...rule.atRules]
|
|
129
|
+
: undefined,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
// Link class -> batch keys
|
|
133
|
+
registry.classToBatchedKeys.get(className).add(batchKey);
|
|
134
|
+
const existingEntry = registry.batchedRules.get(batchKey);
|
|
135
|
+
if (existingEntry) {
|
|
136
|
+
if (!existingEntry.classNames.has(className)) {
|
|
137
|
+
existingEntry.classNames.add(className);
|
|
138
|
+
this.updateBatchedRuleCss(registry, existingEntry, root);
|
|
139
|
+
}
|
|
140
|
+
// Unmark class as unused if it was marked
|
|
141
|
+
if (registry.unusedBatchedClasses.has(className)) {
|
|
142
|
+
registry.unusedBatchedClasses.delete(className);
|
|
143
|
+
}
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
// Check if this exact rule already exists as a non-batched rule in any sheet
|
|
147
|
+
// and convert it to a batched rule instead of duplicating
|
|
148
|
+
const existingClassWithSameRule = this.findClassWithIdenticalRule(registry, batchKey, className);
|
|
149
|
+
if (existingClassWithSameRule) {
|
|
150
|
+
// Convert existing rule to batched and add current class
|
|
151
|
+
this.convertToBatchedRule(registry, existingClassWithSameRule, className, batchKey, root);
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
// Need to create a new CSS rule for this batch key
|
|
155
|
+
const { sheet, sheetIndex, ruleIndex } = this.ensureTargetSheetAndIndex(registry, root);
|
|
156
|
+
const entry = {
|
|
157
|
+
key: batchKey,
|
|
158
|
+
selectorTemplate,
|
|
159
|
+
declarations: normalizedDecl,
|
|
160
|
+
atRules: rule.atRules && rule.atRules.length ? [...rule.atRules] : undefined,
|
|
161
|
+
classNames: new Set([className]),
|
|
162
|
+
sheetIndex,
|
|
163
|
+
ruleIndex,
|
|
164
|
+
};
|
|
165
|
+
const cssText = this.composeCssForEntry(entry);
|
|
166
|
+
const styleElement = sheet.sheet;
|
|
167
|
+
const styleSheet = styleElement.sheet;
|
|
168
|
+
if (styleSheet && !this.config.forceTextInjection) {
|
|
169
|
+
const maxIndex = styleSheet.cssRules.length;
|
|
170
|
+
const safeIndex = Math.min(Math.max(0, ruleIndex), maxIndex);
|
|
171
|
+
styleSheet.insertRule(cssText, safeIndex);
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
styleElement.textContent =
|
|
175
|
+
(styleElement.textContent || '') + '\n' + cssText;
|
|
176
|
+
entry.currentCssText = cssText;
|
|
177
|
+
}
|
|
178
|
+
// Update bookkeeping
|
|
179
|
+
sheet.ruleCount = Math.max(sheet.ruleCount, ruleIndex + 1);
|
|
180
|
+
registry.batchedRules.set(batchKey, entry);
|
|
181
|
+
if (registry.metrics) {
|
|
182
|
+
registry.metrics.totalInsertions++;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// For batched insertion, we don't create per-class RuleInfo ranges anymore
|
|
186
|
+
return {
|
|
187
|
+
className,
|
|
188
|
+
ruleIndex: -1,
|
|
189
|
+
sheetIndex: -1,
|
|
190
|
+
cssText: [],
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
console.warn('Failed to insert CSS rules (batched):', error, {
|
|
195
|
+
flattenedRules,
|
|
196
|
+
className,
|
|
197
|
+
});
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Insert global CSS rules
|
|
203
|
+
*/
|
|
204
|
+
insertGlobalRule(registry, flattenedRules, className, root) {
|
|
205
|
+
// For now, global rules are handled the same way as regular rules
|
|
206
|
+
return this.insertRule(registry, flattenedRules, className, root);
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Delete a CSS rule from the sheet
|
|
210
|
+
*/
|
|
211
|
+
deleteRule(registry, ruleInfo) {
|
|
212
|
+
const sheet = registry.sheets[ruleInfo.sheetIndex];
|
|
213
|
+
if (!sheet) {
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
try {
|
|
217
|
+
const texts = Array.isArray(ruleInfo.cssText)
|
|
218
|
+
? ruleInfo.cssText.slice()
|
|
219
|
+
: [];
|
|
220
|
+
const styleElement = sheet.sheet;
|
|
221
|
+
const styleSheet = styleElement.sheet;
|
|
222
|
+
if (styleSheet) {
|
|
223
|
+
const rules = styleSheet.cssRules;
|
|
224
|
+
// Prefer index-based deletion when possible
|
|
225
|
+
const startIdx = Math.max(0, ruleInfo.ruleIndex);
|
|
226
|
+
const endIdx = Math.min(rules.length - 1, Number.isFinite(ruleInfo.endRuleIndex)
|
|
227
|
+
? ruleInfo.endRuleIndex
|
|
228
|
+
: startIdx - 1);
|
|
229
|
+
if (Number.isFinite(startIdx) && endIdx >= startIdx) {
|
|
230
|
+
for (let idx = endIdx; idx >= startIdx; idx--) {
|
|
231
|
+
if (idx < 0 || idx >= styleSheet.cssRules.length)
|
|
232
|
+
continue;
|
|
233
|
+
styleSheet.deleteRule(idx);
|
|
234
|
+
}
|
|
235
|
+
sheet.ruleCount = Math.max(0, sheet.ruleCount - (endIdx - startIdx + 1));
|
|
236
|
+
}
|
|
237
|
+
else if (this.config.debugMode && texts.length) {
|
|
238
|
+
// Fallback: locate each rule by exact cssText and delete (debug mode only)
|
|
239
|
+
for (const text of texts) {
|
|
240
|
+
let idx = -1;
|
|
241
|
+
for (let i = styleSheet.cssRules.length - 1; i >= 0; i--) {
|
|
242
|
+
if (styleSheet.cssRules[i].cssText === text) {
|
|
243
|
+
idx = i;
|
|
244
|
+
break;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
if (idx >= 0) {
|
|
248
|
+
styleSheet.deleteRule(idx);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
sheet.ruleCount = Math.max(0, sheet.ruleCount - texts.length);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
// Remove texts from validation set
|
|
255
|
+
if (this.config.debugMode) {
|
|
256
|
+
try {
|
|
257
|
+
for (const text of texts) {
|
|
258
|
+
registry.ruleTextSet.delete(text);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
catch (_) {
|
|
262
|
+
// noop
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
catch (error) {
|
|
267
|
+
console.warn('Failed to delete CSS rule:', error);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Find a sheet with available space or return null
|
|
272
|
+
*/
|
|
273
|
+
findAvailableSheet(registry, root) {
|
|
274
|
+
const maxRules = this.config.maxRulesPerSheet;
|
|
275
|
+
if (!maxRules) {
|
|
276
|
+
// No limit, use the last sheet if it exists
|
|
277
|
+
const lastSheet = registry.sheets[registry.sheets.length - 1];
|
|
278
|
+
return lastSheet || null;
|
|
279
|
+
}
|
|
280
|
+
// Find sheet with space
|
|
281
|
+
for (const sheet of registry.sheets) {
|
|
282
|
+
if (sheet.ruleCount < maxRules) {
|
|
283
|
+
return sheet;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
return null; // No available sheet found
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Find an available rule index in the sheet
|
|
290
|
+
*/
|
|
291
|
+
findAvailableRuleIndex(sheet) {
|
|
292
|
+
// Always append to the end - CSS doesn't have holes
|
|
293
|
+
return sheet.ruleCount;
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Mark a ruleset as unused but keep it in the stylesheet
|
|
297
|
+
*/
|
|
298
|
+
markAsUnused(registry, className) {
|
|
299
|
+
// If this class participates in batched rules, just mark it as unused
|
|
300
|
+
const keys = registry.classToBatchedKeys.get(className);
|
|
301
|
+
if (keys && keys.size) {
|
|
302
|
+
registry.unusedBatchedClasses.add(className);
|
|
303
|
+
registry.refCounts.delete(className);
|
|
304
|
+
if (registry.metrics) {
|
|
305
|
+
registry.metrics.totalUnused++;
|
|
306
|
+
}
|
|
307
|
+
// Schedule cleanup when we have enough unused classes
|
|
308
|
+
const threshold = this.config.unusedStylesThreshold || 500;
|
|
309
|
+
if (registry.unusedBatchedClasses.size >= threshold) {
|
|
310
|
+
this.scheduleBulkCleanup(registry);
|
|
311
|
+
}
|
|
312
|
+
return; // handled via batched path
|
|
313
|
+
}
|
|
314
|
+
// Fallback to legacy unused path for non-batched rules
|
|
315
|
+
const ruleInfo = registry.rules.get(className);
|
|
316
|
+
if (!ruleInfo)
|
|
317
|
+
return;
|
|
318
|
+
const unusedInfo = {
|
|
319
|
+
ruleInfo,
|
|
320
|
+
markedUnusedAt: Date.now(),
|
|
321
|
+
};
|
|
322
|
+
registry.unusedRules.set(className, unusedInfo);
|
|
323
|
+
registry.refCounts.delete(className);
|
|
324
|
+
if (registry.metrics) {
|
|
325
|
+
registry.metrics.totalUnused++;
|
|
326
|
+
}
|
|
327
|
+
const threshold = this.config.unusedStylesThreshold || 500;
|
|
328
|
+
if (registry.unusedRules.size >= threshold) {
|
|
329
|
+
this.scheduleBulkCleanup(registry);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Restore a ruleset from unused styles
|
|
334
|
+
*/
|
|
335
|
+
restoreFromUnused(registry, className) {
|
|
336
|
+
const unusedInfo = registry.unusedRules.get(className);
|
|
337
|
+
if (!unusedInfo)
|
|
338
|
+
return null;
|
|
339
|
+
// Remove from unused rules (rules stays in registry.rules)
|
|
340
|
+
registry.unusedRules.delete(className);
|
|
341
|
+
registry.refCounts.set(className, 1);
|
|
342
|
+
// Update metrics
|
|
343
|
+
if (registry.metrics) {
|
|
344
|
+
registry.metrics.unusedHits++;
|
|
345
|
+
}
|
|
346
|
+
return unusedInfo.ruleInfo;
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Schedule bulk cleanup of all unused styles
|
|
350
|
+
*/
|
|
351
|
+
scheduleBulkCleanup(registry) {
|
|
352
|
+
// Don't schedule if already scheduled
|
|
353
|
+
if (registry.bulkCleanupTimeout)
|
|
354
|
+
return;
|
|
355
|
+
const performCleanup = () => {
|
|
356
|
+
this.performBulkCleanup(registry);
|
|
357
|
+
registry.bulkCleanupTimeout = null;
|
|
358
|
+
};
|
|
359
|
+
if (this.config.idleCleanup && typeof requestIdleCallback !== 'undefined') {
|
|
360
|
+
registry.bulkCleanupTimeout = requestIdleCallback(performCleanup);
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
const delay = this.config.bulkCleanupDelay || 5000;
|
|
364
|
+
registry.bulkCleanupTimeout = setTimeout(performCleanup, delay);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Perform bulk cleanup of all unused styles
|
|
369
|
+
*/
|
|
370
|
+
performBulkCleanup(registry) {
|
|
371
|
+
let cleanedUpCount = 0;
|
|
372
|
+
// Handle legacy unused rules
|
|
373
|
+
if (registry.unusedRules.size > 0) {
|
|
374
|
+
const classNamesToCleanup = Array.from(registry.unusedRules.keys());
|
|
375
|
+
// Group by sheet for efficient deletion
|
|
376
|
+
const rulesBySheet = new Map();
|
|
377
|
+
for (const className of classNamesToCleanup) {
|
|
378
|
+
const unusedInfo = registry.unusedRules.get(className);
|
|
379
|
+
if (!unusedInfo)
|
|
380
|
+
continue;
|
|
381
|
+
const sheetIndex = unusedInfo.ruleInfo.sheetIndex;
|
|
382
|
+
if (!rulesBySheet.has(sheetIndex)) {
|
|
383
|
+
rulesBySheet.set(sheetIndex, []);
|
|
384
|
+
}
|
|
385
|
+
rulesBySheet
|
|
386
|
+
.get(sheetIndex)
|
|
387
|
+
.push({ className, ruleInfo: unusedInfo.ruleInfo });
|
|
388
|
+
}
|
|
389
|
+
// Delete rules from each sheet (in reverse order to preserve indices)
|
|
390
|
+
for (const [sheetIndex, rulesInSheet] of rulesBySheet) {
|
|
391
|
+
// Sort by rule index in descending order for safe deletion
|
|
392
|
+
rulesInSheet.sort((a, b) => b.ruleInfo.ruleIndex - a.ruleInfo.ruleIndex);
|
|
393
|
+
for (const { className, ruleInfo } of rulesInSheet) {
|
|
394
|
+
this.deleteRule(registry, ruleInfo);
|
|
395
|
+
registry.rules.delete(className);
|
|
396
|
+
registry.unusedRules.delete(className);
|
|
397
|
+
cleanedUpCount++;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
// Handle batched unused classes
|
|
402
|
+
if (registry.unusedBatchedClasses.size > 0) {
|
|
403
|
+
cleanedUpCount += this.cleanupBatchedUnusedClasses(registry);
|
|
404
|
+
}
|
|
405
|
+
// Update metrics
|
|
406
|
+
if (registry.metrics) {
|
|
407
|
+
registry.metrics.bulkCleanups++;
|
|
408
|
+
registry.metrics.stylesCleanedUp += cleanedUpCount;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Clean up unused classes from batched rules
|
|
413
|
+
*/
|
|
414
|
+
cleanupBatchedUnusedClasses(registry) {
|
|
415
|
+
const unusedClasses = Array.from(registry.unusedBatchedClasses);
|
|
416
|
+
let cleanedUpCount = 0;
|
|
417
|
+
for (const className of unusedClasses) {
|
|
418
|
+
const keys = registry.classToBatchedKeys.get(className);
|
|
419
|
+
if (!keys)
|
|
420
|
+
continue;
|
|
421
|
+
for (const key of keys) {
|
|
422
|
+
const entry = registry.batchedRules.get(key);
|
|
423
|
+
if (!entry)
|
|
424
|
+
continue;
|
|
425
|
+
// Remove class from the batched rule
|
|
426
|
+
entry.classNames.delete(className);
|
|
427
|
+
if (entry.classNames.size === 0) {
|
|
428
|
+
// Remove the entire batched rule if no classes left
|
|
429
|
+
this.removeBatchedEntry(registry, entry);
|
|
430
|
+
registry.batchedRules.delete(key);
|
|
431
|
+
}
|
|
432
|
+
else {
|
|
433
|
+
// Update the CSS to remove this class from the selector
|
|
434
|
+
this.updateBatchedRuleCss(registry, entry, document);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
// Clean up the class mappings
|
|
438
|
+
registry.classToBatchedKeys.delete(className);
|
|
439
|
+
registry.unusedBatchedClasses.delete(className);
|
|
440
|
+
cleanedUpCount++;
|
|
441
|
+
}
|
|
442
|
+
return cleanedUpCount;
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Process the deletion queue for cleanup
|
|
446
|
+
*/
|
|
447
|
+
processCleanupQueue(registry) {
|
|
448
|
+
// This method is kept for compatibility but the logic has changed
|
|
449
|
+
// We no longer use a deletion queue, instead marking styles as unused immediately
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* Get total number of rules across all sheets
|
|
453
|
+
*/
|
|
454
|
+
getTotalRuleCount(registry) {
|
|
455
|
+
return registry.sheets.reduce((total, sheet) => total + sheet.ruleCount - sheet.holes.length, 0);
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* Get CSS text from all sheets (for SSR)
|
|
459
|
+
*/
|
|
460
|
+
getCssText(registry) {
|
|
461
|
+
const cssChunks = [];
|
|
462
|
+
for (const sheet of registry.sheets) {
|
|
463
|
+
try {
|
|
464
|
+
const styleElement = sheet.sheet;
|
|
465
|
+
if (styleElement.textContent) {
|
|
466
|
+
cssChunks.push(styleElement.textContent);
|
|
467
|
+
}
|
|
468
|
+
else if (styleElement.sheet) {
|
|
469
|
+
const rules = Array.from(styleElement.sheet.cssRules);
|
|
470
|
+
cssChunks.push(rules.map((rule) => rule.cssText).join('\n'));
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
catch (error) {
|
|
474
|
+
console.warn('Failed to read CSS from sheet:', error);
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
return cssChunks.join('\n');
|
|
478
|
+
}
|
|
479
|
+
/**
|
|
480
|
+
* Get cache performance metrics
|
|
481
|
+
*/
|
|
482
|
+
getMetrics(registry) {
|
|
483
|
+
return registry.metrics || null;
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* Reset cache performance metrics
|
|
487
|
+
*/
|
|
488
|
+
resetMetrics(registry) {
|
|
489
|
+
if (registry.metrics) {
|
|
490
|
+
registry.metrics = {
|
|
491
|
+
hits: 0,
|
|
492
|
+
misses: 0,
|
|
493
|
+
unusedHits: 0,
|
|
494
|
+
bulkCleanups: 0,
|
|
495
|
+
totalInsertions: 0,
|
|
496
|
+
totalUnused: 0,
|
|
497
|
+
stylesCleanedUp: 0,
|
|
498
|
+
startTime: Date.now(),
|
|
499
|
+
};
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
/**
|
|
503
|
+
* Clean up resources for a root
|
|
504
|
+
*/
|
|
505
|
+
cleanup(root) {
|
|
506
|
+
const registry = this.rootRegistries.get(root);
|
|
507
|
+
if (!registry) {
|
|
508
|
+
return;
|
|
509
|
+
}
|
|
510
|
+
// Cancel any scheduled bulk cleanup
|
|
511
|
+
if (registry.bulkCleanupTimeout) {
|
|
512
|
+
if (this.config.idleCleanup &&
|
|
513
|
+
typeof cancelIdleCallback !== 'undefined') {
|
|
514
|
+
cancelIdleCallback(registry.bulkCleanupTimeout);
|
|
515
|
+
}
|
|
516
|
+
else {
|
|
517
|
+
clearTimeout(registry.bulkCleanupTimeout);
|
|
518
|
+
}
|
|
519
|
+
registry.bulkCleanupTimeout = null;
|
|
520
|
+
}
|
|
521
|
+
// Remove all sheets
|
|
522
|
+
for (const sheet of registry.sheets) {
|
|
523
|
+
try {
|
|
524
|
+
// Remove style element
|
|
525
|
+
const styleElement = sheet.sheet;
|
|
526
|
+
if (styleElement.parentNode) {
|
|
527
|
+
styleElement.parentNode.removeChild(styleElement);
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
catch (error) {
|
|
531
|
+
console.warn('Failed to cleanup sheet:', error);
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
// Clear registry
|
|
535
|
+
this.rootRegistries.delete(root);
|
|
536
|
+
}
|
|
537
|
+
/** Normalize declaration list by sorting properties for stable keys */
|
|
538
|
+
normalizeDeclarations(declarations) {
|
|
539
|
+
return declarations
|
|
540
|
+
.split(';')
|
|
541
|
+
.map((d) => d.trim())
|
|
542
|
+
.filter(Boolean)
|
|
543
|
+
.sort((a, b) => a.localeCompare(b))
|
|
544
|
+
.join(';');
|
|
545
|
+
}
|
|
546
|
+
/** Build selector template normalizing class references to placeholders.
|
|
547
|
+
* Rules:
|
|
548
|
+
* - Replace any occurrence of :is(.class[, .class]*) with :is(__CLASS__)
|
|
549
|
+
* - If starts with .<name>.<name>, replace with __CLASS__.__CLASS__ (legacy specificity)
|
|
550
|
+
* - Else if starts with .<name>, replace with __CLASS__
|
|
551
|
+
*/
|
|
552
|
+
makeSelectorTemplate(selector, className) {
|
|
553
|
+
// Normalize any :is(.tX, .tY) occurrences first
|
|
554
|
+
const isClassList = /:is\(\s*\.[A-Za-z0-9_-]+(?:\s*,\s*\.[A-Za-z0-9_-]+)*\s*\)/g;
|
|
555
|
+
let normalized = selector.replace(isClassList, ':is(__CLASS__)');
|
|
556
|
+
// Legacy patterns that may still start with plain class
|
|
557
|
+
const doubleRe = /^\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/;
|
|
558
|
+
const singleRe = /^\.[A-Za-z0-9_-]+/;
|
|
559
|
+
if (doubleRe.test(normalized)) {
|
|
560
|
+
normalized = normalized.replace(doubleRe, '__CLASS__.__CLASS__');
|
|
561
|
+
}
|
|
562
|
+
else if (singleRe.test(normalized)) {
|
|
563
|
+
normalized = normalized.replace(singleRe, '__CLASS__');
|
|
564
|
+
}
|
|
565
|
+
return { selectorTemplate: normalized };
|
|
566
|
+
}
|
|
567
|
+
/** Compose a unique batch key */
|
|
568
|
+
getBatchKey(atRules, selectorTemplate, normalizedDecl) {
|
|
569
|
+
const at = atRules && atRules.length ? atRules.join('|') : '';
|
|
570
|
+
return `${at}||${selectorTemplate}||${normalizedDecl}`;
|
|
571
|
+
}
|
|
572
|
+
/** Ensure there is a target sheet and available rule index */
|
|
573
|
+
ensureTargetSheetAndIndex(registry, root) {
|
|
574
|
+
let sheet = this.findAvailableSheet(registry, root);
|
|
575
|
+
if (!sheet) {
|
|
576
|
+
sheet = this.createSheet(registry, root);
|
|
577
|
+
}
|
|
578
|
+
const ruleIndex = this.findAvailableRuleIndex(sheet);
|
|
579
|
+
const sheetIndex = registry.sheets.indexOf(sheet);
|
|
580
|
+
return { sheet, sheetIndex, ruleIndex };
|
|
581
|
+
}
|
|
582
|
+
/** Compose CSS text for a batched rule entry */
|
|
583
|
+
composeCssForEntry(entry) {
|
|
584
|
+
const classList = Array.from(entry.classNames)
|
|
585
|
+
.sort((a, b) => {
|
|
586
|
+
const aNum = parseInt(a.slice(1));
|
|
587
|
+
const bNum = parseInt(b.slice(1));
|
|
588
|
+
return aNum - bNum;
|
|
589
|
+
})
|
|
590
|
+
.map((c) => `.${c}`)
|
|
591
|
+
.join(', ');
|
|
592
|
+
// If template expects doubled specificity, replicate :is twice
|
|
593
|
+
let selector = entry.selectorTemplate
|
|
594
|
+
.replace(/:is\(__CLASS__\)/g, `:is(${classList})`)
|
|
595
|
+
.replace(/__CLASS__\.__CLASS__/g, `:is(${classList}):is(${classList})`)
|
|
596
|
+
.replace(/__CLASS__/g, `:is(${classList})`);
|
|
597
|
+
const baseRule = `${selector} { ${entry.declarations} }`;
|
|
598
|
+
if (entry.atRules && entry.atRules.length) {
|
|
599
|
+
return entry.atRules.reduce((acc, at) => `${at} { ${acc} }`, baseRule);
|
|
600
|
+
}
|
|
601
|
+
return baseRule;
|
|
602
|
+
}
|
|
603
|
+
/** Update CSSOM/textContent for an existing batched rule */
|
|
604
|
+
updateBatchedRuleCss(registry, entry, root) {
|
|
605
|
+
const sheet = registry.sheets[entry.sheetIndex];
|
|
606
|
+
if (!sheet)
|
|
607
|
+
return;
|
|
608
|
+
const styleElement = sheet.sheet;
|
|
609
|
+
const styleSheet = styleElement.sheet;
|
|
610
|
+
const newCssText = this.composeCssForEntry(entry);
|
|
611
|
+
if (styleSheet && !this.config.forceTextInjection) {
|
|
612
|
+
// Replace rule at the same index
|
|
613
|
+
const idx = Math.max(0, Math.min(entry.ruleIndex, styleSheet.cssRules.length - 1));
|
|
614
|
+
try {
|
|
615
|
+
styleSheet.deleteRule(idx);
|
|
616
|
+
}
|
|
617
|
+
catch {
|
|
618
|
+
// Ignore CSSOM errors when deleting rules
|
|
619
|
+
}
|
|
620
|
+
const insertIdx = Math.min(idx, styleSheet.cssRules.length);
|
|
621
|
+
styleSheet.insertRule(newCssText, insertIdx);
|
|
622
|
+
entry.ruleIndex = insertIdx;
|
|
623
|
+
}
|
|
624
|
+
else {
|
|
625
|
+
// Text content replacement
|
|
626
|
+
const old = entry.currentCssText || '';
|
|
627
|
+
const fullText = styleElement.textContent || '';
|
|
628
|
+
if (old) {
|
|
629
|
+
styleElement.textContent = fullText.replace(old, newCssText);
|
|
630
|
+
}
|
|
631
|
+
else {
|
|
632
|
+
styleElement.textContent =
|
|
633
|
+
(fullText ? fullText + '\n' : '') + newCssText;
|
|
634
|
+
}
|
|
635
|
+
entry.currentCssText = newCssText;
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
/** Remove a batched rule entirely from the stylesheet */
|
|
639
|
+
removeBatchedEntry(registry, entry) {
|
|
640
|
+
const sheet = registry.sheets[entry.sheetIndex];
|
|
641
|
+
if (!sheet)
|
|
642
|
+
return;
|
|
643
|
+
const styleElement = sheet.sheet;
|
|
644
|
+
const styleSheet = styleElement.sheet;
|
|
645
|
+
if (styleSheet && !this.config.forceTextInjection) {
|
|
646
|
+
const idx = entry.ruleIndex;
|
|
647
|
+
if (idx >= 0 && idx < styleSheet.cssRules.length) {
|
|
648
|
+
try {
|
|
649
|
+
styleSheet.deleteRule(idx);
|
|
650
|
+
sheet.ruleCount = Math.max(0, sheet.ruleCount - 1);
|
|
651
|
+
}
|
|
652
|
+
catch {
|
|
653
|
+
// Ignore CSSOM errors when deleting rules
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
else {
|
|
658
|
+
const old = entry.currentCssText || '';
|
|
659
|
+
if (old) {
|
|
660
|
+
const fullText = styleElement.textContent || '';
|
|
661
|
+
styleElement.textContent = fullText.replace(old, '');
|
|
662
|
+
}
|
|
663
|
+
sheet.ruleCount = Math.max(0, sheet.ruleCount - 1);
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
/** Find existing class that has an identical rule (same batch key) */
|
|
667
|
+
findClassWithIdenticalRule(registry, batchKey, excludeClassName) {
|
|
668
|
+
const meta = registry.batchedRuleMeta.get(batchKey);
|
|
669
|
+
if (!meta)
|
|
670
|
+
return null;
|
|
671
|
+
// Look through all classes to find one that has this batch key but isn't batched yet
|
|
672
|
+
for (const [className, keys] of registry.classToBatchedKeys.entries()) {
|
|
673
|
+
if (className === excludeClassName)
|
|
674
|
+
continue;
|
|
675
|
+
if (keys.has(batchKey) && !registry.batchedRules.has(batchKey)) {
|
|
676
|
+
return className;
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
return null;
|
|
680
|
+
}
|
|
681
|
+
/** Convert an existing single-class rule to a batched rule with additional class */
|
|
682
|
+
convertToBatchedRule(registry, existingClassName, newClassName, batchKey, root) {
|
|
683
|
+
const meta = registry.batchedRuleMeta.get(batchKey);
|
|
684
|
+
if (!meta)
|
|
685
|
+
return;
|
|
686
|
+
// Find the existing rule info for the existing class
|
|
687
|
+
const existingRuleInfo = registry.rules.get(existingClassName);
|
|
688
|
+
if (!existingRuleInfo || existingRuleInfo.sheetIndex < 0)
|
|
689
|
+
return;
|
|
690
|
+
// Create a new batched entry at the same location
|
|
691
|
+
const entry = {
|
|
692
|
+
key: batchKey,
|
|
693
|
+
selectorTemplate: meta.selectorTemplate,
|
|
694
|
+
declarations: meta.declarations,
|
|
695
|
+
atRules: meta.atRules,
|
|
696
|
+
classNames: new Set([existingClassName, newClassName]),
|
|
697
|
+
sheetIndex: existingRuleInfo.sheetIndex,
|
|
698
|
+
ruleIndex: existingRuleInfo.ruleIndex,
|
|
699
|
+
};
|
|
700
|
+
// Update the CSS rule to use batched selector
|
|
701
|
+
const newCssText = this.composeCssForEntry(entry);
|
|
702
|
+
const sheet = registry.sheets[entry.sheetIndex];
|
|
703
|
+
if (!sheet)
|
|
704
|
+
return;
|
|
705
|
+
const styleElement = sheet.sheet;
|
|
706
|
+
const styleSheet = styleElement.sheet;
|
|
707
|
+
if (styleSheet && !this.config.forceTextInjection) {
|
|
708
|
+
try {
|
|
709
|
+
// Replace the existing rule
|
|
710
|
+
const idx = Math.max(0, Math.min(entry.ruleIndex, styleSheet.cssRules.length - 1));
|
|
711
|
+
styleSheet.deleteRule(idx);
|
|
712
|
+
styleSheet.insertRule(newCssText, idx);
|
|
713
|
+
}
|
|
714
|
+
catch {
|
|
715
|
+
// Ignore CSSOM errors when updating rules
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
else {
|
|
719
|
+
// Replace in text content
|
|
720
|
+
const oldCssText = existingRuleInfo.cssText?.[0] || '';
|
|
721
|
+
if (oldCssText) {
|
|
722
|
+
const fullText = styleElement.textContent || '';
|
|
723
|
+
styleElement.textContent = fullText.replace(oldCssText, newCssText);
|
|
724
|
+
}
|
|
725
|
+
entry.currentCssText = newCssText;
|
|
726
|
+
}
|
|
727
|
+
// Update registry
|
|
728
|
+
registry.batchedRules.set(batchKey, entry);
|
|
729
|
+
// Update class mappings
|
|
730
|
+
if (!registry.classToBatchedKeys.has(newClassName)) {
|
|
731
|
+
registry.classToBatchedKeys.set(newClassName, new Set());
|
|
732
|
+
}
|
|
733
|
+
registry.classToBatchedKeys.get(newClassName).add(batchKey);
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
|