@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
@@ -1,7 +1,7 @@
|
|
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
|
|
@@ -18,11 +18,10 @@ export class SheetManager {
|
|
18
18
|
getRegistry(root) {
|
19
19
|
let registry = this.rootRegistries.get(root);
|
20
20
|
if (!registry) {
|
21
|
-
const metrics = this.config.
|
21
|
+
const metrics = this.config.devMode
|
22
22
|
? {
|
23
23
|
hits: 0,
|
24
24
|
misses: 0,
|
25
|
-
unusedHits: 0,
|
26
25
|
bulkCleanups: 0,
|
27
26
|
totalInsertions: 0,
|
28
27
|
totalUnused: 0,
|
@@ -35,15 +34,16 @@ export class SheetManager {
|
|
35
34
|
sheets: [],
|
36
35
|
refCounts: new Map(),
|
37
36
|
rules: new Map(),
|
38
|
-
|
37
|
+
cacheKeyToClassName: new Map(),
|
39
38
|
ruleTextSet: new Set(),
|
40
39
|
bulkCleanupTimeout: null,
|
40
|
+
cleanupCheckTimeout: null,
|
41
41
|
metrics,
|
42
42
|
classCounter: 0,
|
43
43
|
keyframesCache: new Map(),
|
44
|
-
unusedKeyframes: new Map(),
|
45
44
|
keyframesCounter: 0,
|
46
45
|
injectedProperties: new Set(),
|
46
|
+
globalRules: new Map(),
|
47
47
|
};
|
48
48
|
this.rootRegistries.set(root, registry);
|
49
49
|
}
|
@@ -100,7 +100,6 @@ export class SheetManager {
|
|
100
100
|
if (!targetSheet) {
|
101
101
|
targetSheet = this.createSheet(registry, root);
|
102
102
|
}
|
103
|
-
const ruleIndex = this.findAvailableRuleIndex(targetSheet);
|
104
103
|
const sheetIndex = registry.sheets.indexOf(targetSheet);
|
105
104
|
try {
|
106
105
|
// Group rules by selector and at-rules to combine declarations
|
@@ -136,7 +135,9 @@ export class SheetManager {
|
|
136
135
|
});
|
137
136
|
// Insert grouped rules
|
138
137
|
const insertedRuleTexts = [];
|
139
|
-
|
138
|
+
const insertedIndices = []; // Track exact indices
|
139
|
+
// Calculate rule index atomically right before insertion to prevent race conditions
|
140
|
+
let currentRuleIndex = this.findAvailableRuleIndex(targetSheet);
|
140
141
|
let firstInsertedIndex = null;
|
141
142
|
let lastInsertedIndex = null;
|
142
143
|
for (const rule of groupedRules) {
|
@@ -151,8 +152,10 @@ export class SheetManager {
|
|
151
152
|
const styleElement = targetSheet.sheet;
|
152
153
|
const styleSheet = styleElement.sheet;
|
153
154
|
if (styleSheet && !this.config.forceTextInjection) {
|
155
|
+
// Calculate index atomically for each rule to prevent concurrent insertion races
|
154
156
|
const maxIndex = styleSheet.cssRules.length;
|
155
|
-
const
|
157
|
+
const atomicRuleIndex = this.findAvailableRuleIndex(targetSheet);
|
158
|
+
const safeIndex = Math.min(Math.max(0, atomicRuleIndex), maxIndex);
|
156
159
|
// Helper: split comma-separated selectors safely (ignores commas inside [] () " ')
|
157
160
|
const splitSelectorsSafely = (selectorList) => {
|
158
161
|
const parts = [];
|
@@ -199,6 +202,9 @@ export class SheetManager {
|
|
199
202
|
};
|
200
203
|
try {
|
201
204
|
styleSheet.insertRule(fullRule, safeIndex);
|
205
|
+
// Update sheet ruleCount immediately to prevent concurrent race conditions
|
206
|
+
targetSheet.ruleCount++;
|
207
|
+
insertedIndices.push(safeIndex); // Track this index
|
202
208
|
if (firstInsertedIndex == null)
|
203
209
|
firstInsertedIndex = safeIndex;
|
204
210
|
lastInsertedIndex = safeIndex;
|
@@ -217,9 +223,14 @@ export class SheetManager {
|
|
217
223
|
singleRule = rule.atRules.reduce((css, atRule) => `${atRule} { ${css} }`, singleBase);
|
218
224
|
}
|
219
225
|
try {
|
226
|
+
// Calculate index atomically for each individual selector insertion
|
220
227
|
const maxIdx = styleSheet.cssRules.length;
|
221
|
-
const
|
228
|
+
const atomicIdx = this.findAvailableRuleIndex(targetSheet);
|
229
|
+
const idx = Math.min(Math.max(0, atomicIdx), maxIdx);
|
222
230
|
styleSheet.insertRule(singleRule, idx);
|
231
|
+
// Update sheet ruleCount immediately
|
232
|
+
targetSheet.ruleCount++;
|
233
|
+
insertedIndices.push(idx); // Track this index
|
223
234
|
if (firstInsertedIndex == null)
|
224
235
|
firstInsertedIndex = idx;
|
225
236
|
lastInsertedIndex = idx;
|
@@ -242,12 +253,17 @@ export class SheetManager {
|
|
242
253
|
}
|
243
254
|
else {
|
244
255
|
// Use textContent (either as fallback or when forceTextInjection is enabled)
|
256
|
+
// Calculate index atomically for textContent insertion too
|
257
|
+
const atomicRuleIndex = this.findAvailableRuleIndex(targetSheet);
|
245
258
|
styleElement.textContent =
|
246
259
|
(styleElement.textContent || '') + '\n' + fullRule;
|
260
|
+
// Update sheet ruleCount immediately
|
261
|
+
targetSheet.ruleCount++;
|
262
|
+
insertedIndices.push(atomicRuleIndex); // Track this index
|
247
263
|
if (firstInsertedIndex == null)
|
248
|
-
firstInsertedIndex =
|
249
|
-
lastInsertedIndex =
|
250
|
-
currentRuleIndex
|
264
|
+
firstInsertedIndex = atomicRuleIndex;
|
265
|
+
lastInsertedIndex = atomicRuleIndex;
|
266
|
+
currentRuleIndex = atomicRuleIndex + 1;
|
251
267
|
}
|
252
268
|
// CRITICAL DEBUG: Verify the style element is in DOM only if there are issues and we're not using forceTextInjection
|
253
269
|
if (!styleElement.parentNode && !this.config.forceTextInjection) {
|
@@ -256,8 +272,8 @@ export class SheetManager {
|
|
256
272
|
ruleIndex: currentRuleIndex,
|
257
273
|
});
|
258
274
|
}
|
259
|
-
//
|
260
|
-
if (this.config.
|
275
|
+
// Dev-only: store cssText for debugging tools
|
276
|
+
if (this.config.devMode) {
|
261
277
|
insertedRuleTexts.push(fullRule);
|
262
278
|
try {
|
263
279
|
registry.ruleTextSet.add(fullRule);
|
@@ -268,17 +284,15 @@ export class SheetManager {
|
|
268
284
|
}
|
269
285
|
// currentRuleIndex already adjusted above
|
270
286
|
}
|
271
|
-
//
|
272
|
-
|
273
|
-
if (finalRuleIndex >= targetSheet.ruleCount) {
|
274
|
-
targetSheet.ruleCount = finalRuleIndex + 1;
|
275
|
-
}
|
287
|
+
// Sheet ruleCount is now updated immediately after each insertion
|
288
|
+
// No need for deferred update logic
|
276
289
|
return {
|
277
290
|
className,
|
278
|
-
ruleIndex: firstInsertedIndex ??
|
291
|
+
ruleIndex: firstInsertedIndex ?? 0,
|
279
292
|
sheetIndex,
|
280
|
-
cssText: this.config.
|
281
|
-
endRuleIndex: lastInsertedIndex ??
|
293
|
+
cssText: this.config.devMode ? insertedRuleTexts : undefined,
|
294
|
+
endRuleIndex: lastInsertedIndex ?? firstInsertedIndex ?? 0,
|
295
|
+
indices: insertedIndices.length > 0 ? insertedIndices : undefined,
|
282
296
|
};
|
283
297
|
}
|
284
298
|
catch (error) {
|
@@ -292,9 +306,103 @@ export class SheetManager {
|
|
292
306
|
/**
|
293
307
|
* Insert global CSS rules
|
294
308
|
*/
|
295
|
-
insertGlobalRule(registry, flattenedRules,
|
296
|
-
//
|
297
|
-
|
309
|
+
insertGlobalRule(registry, flattenedRules, globalKey, root) {
|
310
|
+
// Insert the rule using the same mechanism as regular rules
|
311
|
+
const ruleInfo = this.insertRule(registry, flattenedRules, globalKey, root);
|
312
|
+
// Track global rules for index adjustment
|
313
|
+
if (ruleInfo) {
|
314
|
+
registry.globalRules.set(globalKey, ruleInfo);
|
315
|
+
}
|
316
|
+
return ruleInfo;
|
317
|
+
}
|
318
|
+
/**
|
319
|
+
* Delete a global CSS rule by key
|
320
|
+
*/
|
321
|
+
deleteGlobalRule(registry, globalKey) {
|
322
|
+
const ruleInfo = registry.globalRules.get(globalKey);
|
323
|
+
if (!ruleInfo) {
|
324
|
+
return;
|
325
|
+
}
|
326
|
+
// Delete the rule using the standard deletion mechanism
|
327
|
+
this.deleteRule(registry, ruleInfo);
|
328
|
+
// Remove from global rules tracking
|
329
|
+
registry.globalRules.delete(globalKey);
|
330
|
+
}
|
331
|
+
/**
|
332
|
+
* Adjust rule indices after deletion to account for shifting
|
333
|
+
*/
|
334
|
+
adjustIndicesAfterDeletion(registry, sheetIndex, startIdx, endIdx, deleteCount, deletedRuleInfo, deletedIndices) {
|
335
|
+
try {
|
336
|
+
// Helper function to adjust a single RuleInfo
|
337
|
+
const adjustRuleInfo = (info) => {
|
338
|
+
if (info === deletedRuleInfo)
|
339
|
+
return; // Skip the deleted rule
|
340
|
+
if (info.sheetIndex !== sheetIndex)
|
341
|
+
return; // Different sheet
|
342
|
+
// If info has exact indices, adjust them
|
343
|
+
if (info.indices && info.indices.length > 0 && deletedIndices) {
|
344
|
+
// Sort deleted indices for efficient binary search
|
345
|
+
const sortedDeleted = [...deletedIndices].sort((a, b) => a - b);
|
346
|
+
// Adjust each index based on how many deleted indices are before it
|
347
|
+
info.indices = info.indices.map((idx) => {
|
348
|
+
// Count how many deleted indices are less than this index
|
349
|
+
let shift = 0;
|
350
|
+
for (const delIdx of sortedDeleted) {
|
351
|
+
if (delIdx < idx)
|
352
|
+
shift++;
|
353
|
+
else
|
354
|
+
break;
|
355
|
+
}
|
356
|
+
return idx - shift;
|
357
|
+
});
|
358
|
+
// Update ruleIndex and endRuleIndex to match adjusted indices
|
359
|
+
if (info.indices.length > 0) {
|
360
|
+
info.ruleIndex = Math.min(...info.indices);
|
361
|
+
info.endRuleIndex = Math.max(...info.indices);
|
362
|
+
}
|
363
|
+
}
|
364
|
+
else {
|
365
|
+
// Fallback: adjust using range logic
|
366
|
+
const infoEnd = info.endRuleIndex ?? info.ruleIndex;
|
367
|
+
if (info.ruleIndex > endIdx) {
|
368
|
+
// Rule is after deleted range - shift left
|
369
|
+
info.ruleIndex = Math.max(0, info.ruleIndex - deleteCount);
|
370
|
+
if (info.endRuleIndex != null) {
|
371
|
+
info.endRuleIndex = Math.max(info.ruleIndex, infoEnd - deleteCount);
|
372
|
+
}
|
373
|
+
}
|
374
|
+
else if (info.ruleIndex <= endIdx && infoEnd >= startIdx) {
|
375
|
+
// Rule overlaps with deleted range (should not normally happen)
|
376
|
+
// Clamp endRuleIndex to avoid pointing into deleted region
|
377
|
+
if (info.endRuleIndex != null) {
|
378
|
+
const newEnd = Math.max(info.ruleIndex, startIdx - 1);
|
379
|
+
info.endRuleIndex = Math.max(info.ruleIndex, newEnd);
|
380
|
+
}
|
381
|
+
}
|
382
|
+
}
|
383
|
+
};
|
384
|
+
// Adjust active rules
|
385
|
+
for (const info of registry.rules.values()) {
|
386
|
+
adjustRuleInfo(info);
|
387
|
+
}
|
388
|
+
// Adjust global rules
|
389
|
+
for (const info of registry.globalRules.values()) {
|
390
|
+
adjustRuleInfo(info);
|
391
|
+
}
|
392
|
+
// No need to separately adjust unused rules since they're part of the rules Map
|
393
|
+
// Adjust keyframes indices stored in cache
|
394
|
+
for (const entry of registry.keyframesCache.values()) {
|
395
|
+
const ki = entry.info;
|
396
|
+
if (ki.sheetIndex !== sheetIndex)
|
397
|
+
continue;
|
398
|
+
if (ki.ruleIndex > endIdx) {
|
399
|
+
ki.ruleIndex = Math.max(0, ki.ruleIndex - deleteCount);
|
400
|
+
}
|
401
|
+
}
|
402
|
+
}
|
403
|
+
catch (_) {
|
404
|
+
// Defensive: do not let index adjustments crash cleanup
|
405
|
+
}
|
298
406
|
}
|
299
407
|
/**
|
300
408
|
* Delete a CSS rule from the sheet
|
@@ -305,45 +413,57 @@ export class SheetManager {
|
|
305
413
|
return;
|
306
414
|
}
|
307
415
|
try {
|
308
|
-
const texts = Array.isArray(ruleInfo.cssText)
|
416
|
+
const texts = this.config.devMode && Array.isArray(ruleInfo.cssText)
|
309
417
|
? ruleInfo.cssText.slice()
|
310
418
|
: [];
|
311
419
|
const styleElement = sheet.sheet;
|
312
420
|
const styleSheet = styleElement.sheet;
|
313
421
|
if (styleSheet) {
|
314
422
|
const rules = styleSheet.cssRules;
|
315
|
-
//
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
else if (this.config.debugMode && texts.length) {
|
329
|
-
// Fallback: locate each rule by exact cssText and delete (debug mode only)
|
330
|
-
for (const text of texts) {
|
331
|
-
let idx = -1;
|
332
|
-
for (let i = styleSheet.cssRules.length - 1; i >= 0; i--) {
|
333
|
-
if (styleSheet.cssRules[i].cssText === text) {
|
334
|
-
idx = i;
|
335
|
-
break;
|
423
|
+
// Use exact indices if available, otherwise fall back to range
|
424
|
+
if (ruleInfo.indices && ruleInfo.indices.length > 0) {
|
425
|
+
// NEW: Delete using exact tracked indices
|
426
|
+
const sortedIndices = [...ruleInfo.indices].sort((a, b) => b - a); // Sort descending
|
427
|
+
const deletedIndices = [];
|
428
|
+
for (const idx of sortedIndices) {
|
429
|
+
if (idx >= 0 && idx < styleSheet.cssRules.length) {
|
430
|
+
try {
|
431
|
+
styleSheet.deleteRule(idx);
|
432
|
+
deletedIndices.push(idx);
|
433
|
+
}
|
434
|
+
catch (e) {
|
435
|
+
console.warn(`Failed to delete rule at index ${idx}:`, e);
|
336
436
|
}
|
337
437
|
}
|
338
|
-
|
438
|
+
}
|
439
|
+
sheet.ruleCount = Math.max(0, sheet.ruleCount - deletedIndices.length);
|
440
|
+
// Adjust indices for all other rules
|
441
|
+
if (deletedIndices.length > 0) {
|
442
|
+
this.adjustIndicesAfterDeletion(registry, ruleInfo.sheetIndex, Math.min(...deletedIndices), Math.max(...deletedIndices), deletedIndices.length, ruleInfo, deletedIndices);
|
443
|
+
}
|
444
|
+
}
|
445
|
+
else {
|
446
|
+
// FALLBACK: Use old range-based deletion for backwards compatibility
|
447
|
+
const startIdx = Math.max(0, ruleInfo.ruleIndex);
|
448
|
+
const endIdx = Math.min(rules.length - 1, Number.isFinite(ruleInfo.endRuleIndex)
|
449
|
+
? ruleInfo.endRuleIndex
|
450
|
+
: startIdx);
|
451
|
+
if (Number.isFinite(startIdx) && endIdx >= startIdx) {
|
452
|
+
const deleteCount = endIdx - startIdx + 1;
|
453
|
+
for (let idx = endIdx; idx >= startIdx; idx--) {
|
454
|
+
if (idx < 0 || idx >= styleSheet.cssRules.length)
|
455
|
+
continue;
|
339
456
|
styleSheet.deleteRule(idx);
|
340
457
|
}
|
458
|
+
sheet.ruleCount = Math.max(0, sheet.ruleCount - deleteCount);
|
459
|
+
// After deletion, all subsequent rule indices shift left by deleteCount.
|
460
|
+
// We must adjust stored indices for all other RuleInfo within the same sheet.
|
461
|
+
this.adjustIndicesAfterDeletion(registry, ruleInfo.sheetIndex, startIdx, endIdx, deleteCount, ruleInfo);
|
341
462
|
}
|
342
|
-
sheet.ruleCount = Math.max(0, sheet.ruleCount - texts.length);
|
343
463
|
}
|
344
464
|
}
|
345
|
-
//
|
346
|
-
if (this.config.
|
465
|
+
// Dev-only: remove cssText entries from validation set
|
466
|
+
if (this.config.devMode && texts.length) {
|
347
467
|
try {
|
348
468
|
for (const text of texts) {
|
349
469
|
registry.ruleTextSet.delete(text);
|
@@ -384,52 +504,20 @@ export class SheetManager {
|
|
384
504
|
return sheet.ruleCount;
|
385
505
|
}
|
386
506
|
/**
|
387
|
-
*
|
388
|
-
*/
|
389
|
-
markAsUnused(registry, className) {
|
390
|
-
const ruleInfo = registry.rules.get(className);
|
391
|
-
if (!ruleInfo)
|
392
|
-
return;
|
393
|
-
// Mark as unused (but keep in registry.rules)
|
394
|
-
const unusedInfo = {
|
395
|
-
ruleInfo,
|
396
|
-
markedUnusedAt: Date.now(),
|
397
|
-
};
|
398
|
-
registry.unusedRules.set(className, unusedInfo);
|
399
|
-
registry.refCounts.delete(className);
|
400
|
-
// Update metrics
|
401
|
-
if (registry.metrics) {
|
402
|
-
registry.metrics.totalUnused++;
|
403
|
-
}
|
404
|
-
// Schedule bulk cleanup if threshold exceeded
|
405
|
-
const threshold = this.config.unusedStylesThreshold || 500;
|
406
|
-
if (registry.unusedRules.size >= threshold) {
|
407
|
-
this.scheduleBulkCleanup(registry);
|
408
|
-
}
|
409
|
-
}
|
410
|
-
/**
|
411
|
-
* Restore a ruleset from unused styles
|
412
|
-
*/
|
413
|
-
restoreFromUnused(registry, className) {
|
414
|
-
const unusedInfo = registry.unusedRules.get(className);
|
415
|
-
if (!unusedInfo)
|
416
|
-
return null;
|
417
|
-
// Remove from unused rules (rules stays in registry.rules)
|
418
|
-
registry.unusedRules.delete(className);
|
419
|
-
registry.refCounts.set(className, 1);
|
420
|
-
// Update metrics
|
421
|
-
if (registry.metrics) {
|
422
|
-
registry.metrics.unusedHits++;
|
423
|
-
}
|
424
|
-
return unusedInfo.ruleInfo;
|
425
|
-
}
|
426
|
-
/**
|
427
|
-
* Schedule bulk cleanup of all unused styles
|
507
|
+
* Schedule bulk cleanup of all unused styles (non-stacking)
|
428
508
|
*/
|
429
509
|
scheduleBulkCleanup(registry) {
|
430
|
-
//
|
431
|
-
if (registry.bulkCleanupTimeout)
|
432
|
-
|
510
|
+
// Clear any existing timeout to prevent stacking
|
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
|
+
}
|
433
521
|
const performCleanup = () => {
|
434
522
|
this.performBulkCleanup(registry);
|
435
523
|
registry.bulkCleanupTimeout = null;
|
@@ -442,31 +530,54 @@ export class SheetManager {
|
|
442
530
|
registry.bulkCleanupTimeout = setTimeout(performCleanup, delay);
|
443
531
|
}
|
444
532
|
}
|
533
|
+
/**
|
534
|
+
* Force cleanup of unused styles
|
535
|
+
*/
|
536
|
+
forceCleanup(registry) {
|
537
|
+
this.performBulkCleanup(registry, true);
|
538
|
+
}
|
445
539
|
/**
|
446
540
|
* Perform bulk cleanup of all unused styles
|
447
541
|
*/
|
448
|
-
performBulkCleanup(registry) {
|
449
|
-
if (registry.unusedRules.size === 0)
|
450
|
-
return;
|
542
|
+
performBulkCleanup(registry, cleanupAll = false) {
|
451
543
|
const cleanupStartTime = Date.now();
|
452
|
-
|
544
|
+
// Calculate unused rules dynamically: rules that have refCount = 0
|
545
|
+
const unusedClassNames = Array.from(registry.refCounts.entries())
|
546
|
+
.filter(([, refCount]) => refCount === 0)
|
547
|
+
.map(([className]) => className);
|
548
|
+
if (unusedClassNames.length === 0)
|
549
|
+
return;
|
550
|
+
// Build candidates list - no age filtering needed
|
551
|
+
const candidates = unusedClassNames.map((className) => {
|
552
|
+
const ruleInfo = registry.rules.get(className); // We know it exists
|
553
|
+
return {
|
554
|
+
className,
|
555
|
+
ruleInfo,
|
556
|
+
};
|
557
|
+
});
|
558
|
+
if (candidates.length === 0)
|
559
|
+
return;
|
560
|
+
// Limit deletion scope per run (batch ratio) unless cleanupAll is true
|
561
|
+
let selected = candidates;
|
562
|
+
if (!cleanupAll) {
|
563
|
+
const ratio = this.config.bulkCleanupBatchRatio ?? 0.5;
|
564
|
+
const limit = Math.max(1, Math.floor(candidates.length * Math.min(1, Math.max(0, ratio))));
|
565
|
+
selected = candidates.slice(0, limit);
|
566
|
+
}
|
453
567
|
let cleanedUpCount = 0;
|
454
568
|
let totalCssSize = 0;
|
455
569
|
let totalRulesDeleted = 0;
|
456
570
|
// Group by sheet for efficient deletion
|
457
571
|
const rulesBySheet = new Map();
|
458
572
|
// Calculate CSS size before deletion and group rules
|
459
|
-
for (const className of
|
460
|
-
const unusedInfo = registry.unusedRules.get(className);
|
461
|
-
if (!unusedInfo)
|
462
|
-
continue;
|
463
|
-
const ruleInfo = unusedInfo.ruleInfo;
|
573
|
+
for (const { className, ruleInfo } of selected) {
|
464
574
|
const sheetIndex = ruleInfo.sheetIndex;
|
465
|
-
//
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
575
|
+
// Dev-only metrics: estimate CSS size and rule count if available
|
576
|
+
if (this.config.devMode && Array.isArray(ruleInfo.cssText)) {
|
577
|
+
const cssSize = ruleInfo.cssText.reduce((total, css) => total + css.length, 0);
|
578
|
+
totalCssSize += cssSize;
|
579
|
+
totalRulesDeleted += ruleInfo.cssText.length;
|
580
|
+
}
|
470
581
|
if (!rulesBySheet.has(sheetIndex)) {
|
471
582
|
rulesBySheet.set(sheetIndex, []);
|
472
583
|
}
|
@@ -477,26 +588,53 @@ export class SheetManager {
|
|
477
588
|
// Sort by rule index in descending order for safe deletion
|
478
589
|
rulesInSheet.sort((a, b) => b.ruleInfo.ruleIndex - a.ruleInfo.ruleIndex);
|
479
590
|
for (const { className, ruleInfo } of rulesInSheet) {
|
480
|
-
// SAFETY:
|
481
|
-
|
482
|
-
|
483
|
-
if (!registry.unusedRules.has(className)) {
|
484
|
-
continue;
|
485
|
-
}
|
486
|
-
if (registry.refCounts.has(className)) {
|
591
|
+
// SAFETY 1: Double-check refCount is still 0
|
592
|
+
const currentRefCount = registry.refCounts.get(className) || 0;
|
593
|
+
if (currentRefCount > 0) {
|
487
594
|
// Class became active again; do not delete
|
488
595
|
continue;
|
489
596
|
}
|
490
|
-
//
|
491
|
-
//
|
597
|
+
// SAFETY 2: Ensure rule wasn't replaced
|
598
|
+
// Between scheduling and execution a class may have been replaced with a new RuleInfo
|
492
599
|
const currentInfo = registry.rules.get(className);
|
493
|
-
if (currentInfo
|
600
|
+
if (currentInfo !== ruleInfo) {
|
494
601
|
// Rule was replaced; skip deletion of the old reference
|
495
602
|
continue;
|
496
603
|
}
|
604
|
+
// SAFETY 3: Verify the sheet element is still valid and accessible
|
605
|
+
const sheetInfo = registry.sheets[ruleInfo.sheetIndex];
|
606
|
+
if (!sheetInfo || !sheetInfo.sheet) {
|
607
|
+
// Sheet was removed or corrupted; skip this rule
|
608
|
+
continue;
|
609
|
+
}
|
610
|
+
// SAFETY 4: Verify the stylesheet itself is accessible
|
611
|
+
const styleSheet = sheetInfo.sheet.sheet;
|
612
|
+
if (!styleSheet) {
|
613
|
+
// Stylesheet not available; skip this rule
|
614
|
+
continue;
|
615
|
+
}
|
616
|
+
// SAFETY 5: Verify rule index is still within valid range
|
617
|
+
const maxRuleIndex = styleSheet.cssRules.length - 1;
|
618
|
+
const startIdx = ruleInfo.ruleIndex;
|
619
|
+
const endIdx = ruleInfo.endRuleIndex ?? ruleInfo.ruleIndex;
|
620
|
+
if (startIdx < 0 || endIdx > maxRuleIndex || startIdx > endIdx) {
|
621
|
+
// Rule indices are out of bounds; skip this rule
|
622
|
+
continue;
|
623
|
+
}
|
624
|
+
// All safety checks passed - proceed with deletion
|
497
625
|
this.deleteRule(registry, ruleInfo);
|
498
626
|
registry.rules.delete(className);
|
499
|
-
registry.
|
627
|
+
registry.refCounts.delete(className);
|
628
|
+
// Clean up cache key mappings that point to this className
|
629
|
+
const keysToDelete = [];
|
630
|
+
for (const [key, mappedClassName,] of registry.cacheKeyToClassName.entries()) {
|
631
|
+
if (mappedClassName === className) {
|
632
|
+
keysToDelete.push(key);
|
633
|
+
}
|
634
|
+
}
|
635
|
+
for (const key of keysToDelete) {
|
636
|
+
registry.cacheKeyToClassName.delete(key);
|
637
|
+
}
|
500
638
|
cleanedUpCount++;
|
501
639
|
}
|
502
640
|
}
|
@@ -513,13 +651,6 @@ export class SheetManager {
|
|
513
651
|
});
|
514
652
|
}
|
515
653
|
}
|
516
|
-
/**
|
517
|
-
* Process the deletion queue for cleanup
|
518
|
-
*/
|
519
|
-
processCleanupQueue(registry) {
|
520
|
-
// This method is kept for compatibility but the logic has changed
|
521
|
-
// We no longer use a deletion queue, instead marking styles as unused immediately
|
522
|
-
}
|
523
654
|
/**
|
524
655
|
* Get total number of rules across all sheets
|
525
656
|
*/
|
@@ -552,7 +683,14 @@ export class SheetManager {
|
|
552
683
|
* Get cache performance metrics
|
553
684
|
*/
|
554
685
|
getMetrics(registry) {
|
555
|
-
|
686
|
+
if (!registry.metrics)
|
687
|
+
return null;
|
688
|
+
// Calculate unusedHits on demand - only count CSS rules since keyframes are disposed immediately
|
689
|
+
const unusedRulesCount = Array.from(registry.refCounts.values()).filter((count) => count === 0).length;
|
690
|
+
return {
|
691
|
+
...registry.metrics,
|
692
|
+
unusedHits: unusedRulesCount,
|
693
|
+
};
|
556
694
|
}
|
557
695
|
/**
|
558
696
|
* Reset cache performance metrics
|
@@ -562,7 +700,6 @@ export class SheetManager {
|
|
562
700
|
registry.metrics = {
|
563
701
|
hits: 0,
|
564
702
|
misses: 0,
|
565
|
-
unusedHits: 0,
|
566
703
|
bulkCleanups: 0,
|
567
704
|
totalInsertions: 0,
|
568
705
|
totalUnused: 0,
|
@@ -674,7 +811,7 @@ export class SheetManager {
|
|
674
811
|
name,
|
675
812
|
ruleIndex,
|
676
813
|
sheetIndex,
|
677
|
-
cssText: fullRule,
|
814
|
+
cssText: this.config.devMode ? fullRule : undefined,
|
678
815
|
};
|
679
816
|
}
|
680
817
|
catch (error) {
|
@@ -705,12 +842,28 @@ export class SheetManager {
|
|
705
842
|
}
|
706
843
|
}
|
707
844
|
/**
|
708
|
-
*
|
845
|
+
* Schedule async cleanup check (non-stacking)
|
846
|
+
*/
|
847
|
+
checkCleanupNeeded(registry) {
|
848
|
+
// Clear any existing check timeout to prevent stacking
|
849
|
+
if (registry.cleanupCheckTimeout) {
|
850
|
+
clearTimeout(registry.cleanupCheckTimeout);
|
851
|
+
registry.cleanupCheckTimeout = null;
|
852
|
+
}
|
853
|
+
// Schedule the actual check with setTimeout(..., 0)
|
854
|
+
registry.cleanupCheckTimeout = setTimeout(() => {
|
855
|
+
this.performCleanupCheck(registry);
|
856
|
+
registry.cleanupCheckTimeout = null;
|
857
|
+
}, 0);
|
858
|
+
}
|
859
|
+
/**
|
860
|
+
* Perform the actual cleanup check (called asynchronously)
|
709
861
|
*/
|
710
|
-
|
711
|
-
//
|
862
|
+
performCleanupCheck(registry) {
|
863
|
+
// Count unused rules (refCount = 0) - keyframes are disposed immediately
|
864
|
+
const unusedRulesCount = Array.from(registry.refCounts.values()).filter((count) => count === 0).length;
|
712
865
|
const threshold = this.config.unusedStylesThreshold || 500;
|
713
|
-
if (
|
866
|
+
if (unusedRulesCount >= threshold) {
|
714
867
|
this.scheduleBulkCleanup(registry);
|
715
868
|
}
|
716
869
|
}
|
@@ -733,6 +886,11 @@ export class SheetManager {
|
|
733
886
|
}
|
734
887
|
registry.bulkCleanupTimeout = null;
|
735
888
|
}
|
889
|
+
// Cancel any scheduled cleanup check
|
890
|
+
if (registry.cleanupCheckTimeout) {
|
891
|
+
clearTimeout(registry.cleanupCheckTimeout);
|
892
|
+
registry.cleanupCheckTimeout = null;
|
893
|
+
}
|
736
894
|
// Remove all sheets
|
737
895
|
for (const sheet of registry.sheets) {
|
738
896
|
try {
|
package/es/tasty/parser/const.js
CHANGED