@cube-dev/ui-kit 0.74.2 → 0.75.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +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 +10 -15
- package/es/components/GridProvider.js +1 -1
- package/es/components/HiddenInput.js +25 -24
- 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 +15 -19
- 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 +19 -15
- 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 +46 -41
- 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 +2 -2
- 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 +59 -68
- 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 +906 -0
- package/es/tasty/index.js +3 -1
- package/es/tasty/injector/index.js +171 -0
- package/es/tasty/injector/injector.js +688 -0
- package/es/tasty/injector/sheet-manager.js +754 -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 +19 -4
- 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 +2 -1
- package/es/tasty/styles/types.js +1 -1
- package/es/tasty/styles/width.js +1 -1
- package/es/tasty/tasty.js +94 -20
- 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 +26 -30
- package/es/tasty/utils/mergeStyles.js +1 -1
- package/es/tasty/utils/modAttrs.js +1 -1
- package/es/tasty/utils/renderStyles.js +670 -58
- package/es/tasty/utils/responsive.js +1 -7
- package/es/tasty/utils/string.js +1 -1
- package/es/tasty/utils/styles.js +62 -235
- package/es/tasty/utils/warnings.js +1 -1
- package/es/tokens.js +1 -12
- 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/HiddenInput.d.ts +1 -3
- package/types/components/actions/Button/Button.d.ts +1 -0
- package/types/components/actions/Menu/styled.d.ts +702 -705
- package/types/components/actions/use-action.d.ts +1 -1
- package/types/components/content/List/SectionHeading.d.ts +234 -235
- package/types/components/fields/DatePicker/DatePickerElement.d.ts +234 -235
- package/types/tasty/debug.d.ts +250 -0
- package/types/tasty/index.d.ts +2 -0
- package/types/tasty/injector/index.d.ts +71 -0
- package/types/tasty/injector/injector.d.ts +109 -0
- package/types/tasty/injector/sheet-manager.d.ts +94 -0
- package/types/tasty/injector/types.d.ts +90 -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/getModCombinations.d.ts +9 -1
- package/types/tasty/utils/renderStyles.d.ts +25 -7
- package/types/tasty/utils/responsive.d.ts +0 -1
- package/types/tasty/utils/styles.d.ts +6 -90
- package/types/tokens.d.ts +0 -11
@@ -0,0 +1,688 @@
|
|
1
|
+
/**
|
2
|
+
* @license MIT
|
3
|
+
* author: Cube Dev Team
|
4
|
+
* @cube-dev/ui-kit v0.75.0
|
5
|
+
* Released under the MIT license.
|
6
|
+
*/
|
7
|
+
|
8
|
+
/**
|
9
|
+
* Style injector that works with structured style objects
|
10
|
+
* Eliminates CSS string parsing for better performance
|
11
|
+
*/
|
12
|
+
import { Component } from 'react';
|
13
|
+
import { parseStyle } from '../utils/styles';
|
14
|
+
// Simple CSS text to StyleResult converter for injectGlobal backward compatibility
|
15
|
+
import { SheetManager } from './sheet-manager';
|
16
|
+
/**
|
17
|
+
* Generate sequential class name with format t{number}
|
18
|
+
*/
|
19
|
+
function generateClassName(counter) {
|
20
|
+
return `t${counter}`;
|
21
|
+
}
|
22
|
+
export class StyleInjector {
|
23
|
+
sheetManager;
|
24
|
+
config;
|
25
|
+
cleanupScheduled = false;
|
26
|
+
constructor(config = {}) {
|
27
|
+
this.config = config;
|
28
|
+
this.sheetManager = new SheetManager(config);
|
29
|
+
}
|
30
|
+
/**
|
31
|
+
* Inject styles from StyleResult objects
|
32
|
+
*/
|
33
|
+
inject(rules, options) {
|
34
|
+
const root = options?.root || document;
|
35
|
+
const registry = this.sheetManager.getRegistry(root);
|
36
|
+
if (rules.length === 0) {
|
37
|
+
return {
|
38
|
+
className: '',
|
39
|
+
dispose: () => { },
|
40
|
+
};
|
41
|
+
}
|
42
|
+
// Rules are now in StyleRule format directly
|
43
|
+
// Try to dedupe by className first — if the same class was already inserted, reuse it
|
44
|
+
// Only extract className if it looks like a generated tasty className (t + digits)
|
45
|
+
const preExtractedClass = this.extractClassName(rules);
|
46
|
+
const generatedClass = preExtractedClass && /^t\d+$/.test(preExtractedClass)
|
47
|
+
? preExtractedClass
|
48
|
+
: null;
|
49
|
+
if (generatedClass && registry.rules.has(generatedClass)) {
|
50
|
+
const currentRefCount = registry.refCounts.get(generatedClass) || 0;
|
51
|
+
registry.refCounts.set(generatedClass, currentRefCount + 1);
|
52
|
+
// If this class was previously marked as unused, clear that state now
|
53
|
+
if (registry.unusedRules.has(generatedClass)) {
|
54
|
+
registry.unusedRules.delete(generatedClass);
|
55
|
+
if (registry.metrics) {
|
56
|
+
// Consider this a reuse rather than a cold miss
|
57
|
+
registry.metrics.unusedHits++;
|
58
|
+
}
|
59
|
+
}
|
60
|
+
// Update metrics
|
61
|
+
if (registry.metrics) {
|
62
|
+
registry.metrics.hits++;
|
63
|
+
}
|
64
|
+
return {
|
65
|
+
className: generatedClass,
|
66
|
+
dispose: () => this.dispose(generatedClass, registry),
|
67
|
+
};
|
68
|
+
}
|
69
|
+
// Try to restore from unused styles if className exists but is not active
|
70
|
+
if (generatedClass &&
|
71
|
+
registry.rules.has(generatedClass) &&
|
72
|
+
!registry.refCounts.has(generatedClass)) {
|
73
|
+
const restored = this.sheetManager.restoreFromUnused(registry, generatedClass);
|
74
|
+
if (restored) {
|
75
|
+
// Update metrics
|
76
|
+
if (registry.metrics) {
|
77
|
+
registry.metrics.hits++;
|
78
|
+
}
|
79
|
+
return {
|
80
|
+
className: generatedClass,
|
81
|
+
dispose: () => this.dispose(generatedClass, registry),
|
82
|
+
};
|
83
|
+
}
|
84
|
+
}
|
85
|
+
// No active cache dedupe — rely on provided className or disposed cache only
|
86
|
+
// Generate final className - only use extracted className if it's a generated tasty className
|
87
|
+
const className = generatedClass
|
88
|
+
? generatedClass
|
89
|
+
: generateClassName(registry.classCounter++);
|
90
|
+
// If a different pre-extracted class was used in rules, rewrite selectors to the final class
|
91
|
+
// Also increase specificity for class-based selectors by duplicating the class
|
92
|
+
const rulesToInsert = generatedClass && generatedClass !== className
|
93
|
+
? rules.map((r) => {
|
94
|
+
if (r.selector.startsWith('.' + generatedClass)) {
|
95
|
+
const newSelector = '.' + className + r.selector.slice(generatedClass.length + 1);
|
96
|
+
// Increase specificity by duplicating the class for class-based selectors
|
97
|
+
const specificSelector = newSelector.startsWith('.' + className) &&
|
98
|
+
/^\.t\d+/.test(newSelector)
|
99
|
+
? '.' + className + newSelector
|
100
|
+
: newSelector;
|
101
|
+
return {
|
102
|
+
...r,
|
103
|
+
selector: specificSelector,
|
104
|
+
};
|
105
|
+
}
|
106
|
+
return r;
|
107
|
+
})
|
108
|
+
: rules.map((r) => {
|
109
|
+
// Increase specificity for class-based selectors by duplicating the class
|
110
|
+
if (r.selector.startsWith('.') && /^\.t\d+/.test(r.selector)) {
|
111
|
+
const classMatch = r.selector.match(/^\.t\d+/);
|
112
|
+
if (classMatch) {
|
113
|
+
const baseClass = classMatch[0];
|
114
|
+
return {
|
115
|
+
...r,
|
116
|
+
selector: baseClass + r.selector,
|
117
|
+
};
|
118
|
+
}
|
119
|
+
}
|
120
|
+
return r;
|
121
|
+
});
|
122
|
+
// Before inserting, auto-register @property for any color custom properties being defined.
|
123
|
+
// Fast parse: split declarations by ';' and match "--*-color:"
|
124
|
+
// Do this only when we actually insert (i.e., no cache hit above)
|
125
|
+
const colorPropRegex = /^\s*(--[a-z0-9-]+-color)\s*:/i;
|
126
|
+
for (const rule of rulesToInsert) {
|
127
|
+
// Skip if no declarations
|
128
|
+
if (!rule.declarations)
|
129
|
+
continue;
|
130
|
+
const parts = rule.declarations.split(/;+\s*/);
|
131
|
+
for (const part of parts) {
|
132
|
+
if (!part)
|
133
|
+
continue;
|
134
|
+
const match = colorPropRegex.exec(part);
|
135
|
+
if (match) {
|
136
|
+
const propName = match[1];
|
137
|
+
// Register @property only if not already defined for this root
|
138
|
+
if (!this.isPropertyDefined(propName, { root })) {
|
139
|
+
this.property(propName, {
|
140
|
+
syntax: '<color>',
|
141
|
+
initialValue: 'transparent',
|
142
|
+
root,
|
143
|
+
});
|
144
|
+
}
|
145
|
+
}
|
146
|
+
}
|
147
|
+
}
|
148
|
+
// Insert rules using existing sheet manager
|
149
|
+
const ruleInfo = this.sheetManager.insertRule(registry, rulesToInsert, className, root);
|
150
|
+
if (!ruleInfo) {
|
151
|
+
// Update metrics
|
152
|
+
if (registry.metrics) {
|
153
|
+
registry.metrics.misses++;
|
154
|
+
}
|
155
|
+
return {
|
156
|
+
className,
|
157
|
+
dispose: () => { },
|
158
|
+
};
|
159
|
+
}
|
160
|
+
// Store in registry
|
161
|
+
registry.refCounts.set(className, 1);
|
162
|
+
registry.rules.set(className, ruleInfo);
|
163
|
+
// Update metrics
|
164
|
+
if (registry.metrics) {
|
165
|
+
registry.metrics.totalInsertions++;
|
166
|
+
registry.metrics.misses++;
|
167
|
+
}
|
168
|
+
return {
|
169
|
+
className,
|
170
|
+
dispose: () => this.dispose(className, registry),
|
171
|
+
};
|
172
|
+
}
|
173
|
+
/**
|
174
|
+
* Extract className from rules (assumes first rule contains the base className)
|
175
|
+
*/
|
176
|
+
extractClassName(rules) {
|
177
|
+
for (const rule of rules) {
|
178
|
+
const match = rule.selector.match(/^\.([a-zA-Z0-9_-]+)/);
|
179
|
+
if (match) {
|
180
|
+
return match[1];
|
181
|
+
}
|
182
|
+
}
|
183
|
+
return null;
|
184
|
+
}
|
185
|
+
/**
|
186
|
+
* Generate cache key from style rules with optimized deduplication
|
187
|
+
*/
|
188
|
+
generateCacheKey(rules) {
|
189
|
+
const normalizeSelector = (selector) => {
|
190
|
+
const match = selector.match(/^\.[a-zA-Z0-9_-]+(.*)$/);
|
191
|
+
return match ? match[1] : selector;
|
192
|
+
};
|
193
|
+
// Sort rules to ensure consistent cache keys for equivalent rule sets
|
194
|
+
const sortedRules = [...rules].sort((a, b) => {
|
195
|
+
const aKey = `${normalizeSelector(a.selector)}${a.atRules ? a.atRules.join('|') : ''}`;
|
196
|
+
const bKey = `${normalizeSelector(b.selector)}${b.atRules ? b.atRules.join('|') : ''}`;
|
197
|
+
return aKey.localeCompare(bKey);
|
198
|
+
});
|
199
|
+
return sortedRules
|
200
|
+
.map((rule) => {
|
201
|
+
const at = rule.atRules && rule.atRules.length
|
202
|
+
? `@${rule.atRules.join('|')}`
|
203
|
+
: '';
|
204
|
+
const sel = normalizeSelector(rule.selector);
|
205
|
+
// Normalize declarations by sorting properties for consistent caching
|
206
|
+
const normalizedDeclarations = rule.declarations
|
207
|
+
.split(';')
|
208
|
+
.filter(Boolean)
|
209
|
+
.map((decl) => decl.trim())
|
210
|
+
.sort()
|
211
|
+
.join(';');
|
212
|
+
return `${sel}{${normalizedDeclarations}}${at}`;
|
213
|
+
})
|
214
|
+
.join('');
|
215
|
+
}
|
216
|
+
/**
|
217
|
+
* Dispose of a className
|
218
|
+
*/
|
219
|
+
dispose(className, registry) {
|
220
|
+
const currentRefCount = registry.refCounts.get(className) || 0;
|
221
|
+
if (currentRefCount <= 1) {
|
222
|
+
// Mark as unused immediately
|
223
|
+
this.sheetManager.markAsUnused(registry, className);
|
224
|
+
}
|
225
|
+
else {
|
226
|
+
registry.refCounts.set(className, currentRefCount - 1);
|
227
|
+
}
|
228
|
+
}
|
229
|
+
/**
|
230
|
+
* Cleanup unused rules
|
231
|
+
*/
|
232
|
+
cleanup(root) {
|
233
|
+
const registry = this.sheetManager.getRegistry(root || document);
|
234
|
+
this.sheetManager.processCleanupQueue(registry);
|
235
|
+
}
|
236
|
+
/**
|
237
|
+
* Force bulk cleanup of unused styles
|
238
|
+
*/
|
239
|
+
forceBulkCleanup(root) {
|
240
|
+
const registry = this.sheetManager.getRegistry(root || document);
|
241
|
+
this.sheetManager['performBulkCleanup'](registry);
|
242
|
+
}
|
243
|
+
/**
|
244
|
+
* Get CSS text from all sheets (for SSR)
|
245
|
+
*/
|
246
|
+
getCssText(options) {
|
247
|
+
const root = options?.root || document;
|
248
|
+
const registry = this.sheetManager.getRegistry(root);
|
249
|
+
return this.sheetManager.getCssText(registry);
|
250
|
+
}
|
251
|
+
/**
|
252
|
+
* Get CSS only for the provided tasty classNames (e.g., ["t0","t3"])
|
253
|
+
*/
|
254
|
+
getCssTextForClasses(classNames, options) {
|
255
|
+
const root = options?.root || document;
|
256
|
+
const registry = this.sheetManager.getRegistry(root);
|
257
|
+
const cssChunks = [];
|
258
|
+
for (const cls of classNames) {
|
259
|
+
const info = registry.rules.get(cls);
|
260
|
+
if (info) {
|
261
|
+
if (info.cssText && info.cssText.length) {
|
262
|
+
cssChunks.push(...info.cssText);
|
263
|
+
}
|
264
|
+
else {
|
265
|
+
// Fallback: try to read from live sheet by index range
|
266
|
+
const sheet = registry.sheets[info.sheetIndex];
|
267
|
+
const styleSheet = sheet?.sheet?.sheet;
|
268
|
+
if (styleSheet) {
|
269
|
+
const start = Math.max(0, info.ruleIndex);
|
270
|
+
const end = Math.min(styleSheet.cssRules.length - 1, info.endRuleIndex ?? info.ruleIndex);
|
271
|
+
for (let i = start; i <= end; i++) {
|
272
|
+
const rule = styleSheet.cssRules[i];
|
273
|
+
if (rule)
|
274
|
+
cssChunks.push(rule.cssText);
|
275
|
+
}
|
276
|
+
}
|
277
|
+
}
|
278
|
+
}
|
279
|
+
}
|
280
|
+
return cssChunks.join('\n');
|
281
|
+
}
|
282
|
+
/**
|
283
|
+
* Get cache performance metrics
|
284
|
+
*/
|
285
|
+
getMetrics(options) {
|
286
|
+
const root = options?.root || document;
|
287
|
+
const registry = this.sheetManager.getRegistry(root);
|
288
|
+
return this.sheetManager.getMetrics(registry);
|
289
|
+
}
|
290
|
+
/**
|
291
|
+
* Reset cache performance metrics
|
292
|
+
*/
|
293
|
+
resetMetrics(options) {
|
294
|
+
const root = options?.root || document;
|
295
|
+
const registry = this.sheetManager.getRegistry(root);
|
296
|
+
this.sheetManager.resetMetrics(registry);
|
297
|
+
}
|
298
|
+
/**
|
299
|
+
* Force cleanup of unused styles (useful for memory pressure)
|
300
|
+
*/
|
301
|
+
forceCleanupUnused(options) {
|
302
|
+
const root = options?.root || document;
|
303
|
+
const registry = this.sheetManager.getRegistry(root);
|
304
|
+
this.sheetManager['performBulkCleanup'](registry);
|
305
|
+
}
|
306
|
+
/**
|
307
|
+
* Define a CSS @property custom property
|
308
|
+
* Example:
|
309
|
+
* @property --rotation { syntax: "<angle>"; inherits: false; initial-value: 45deg; }
|
310
|
+
* Note: No caching or dispose — this defines a global property.
|
311
|
+
*/
|
312
|
+
property(name, options) {
|
313
|
+
const root = options?.root || document;
|
314
|
+
const registry = this.sheetManager.getRegistry(root);
|
315
|
+
// Check if already defined to avoid duplicates
|
316
|
+
if (registry.injectedProperties.has(name)) {
|
317
|
+
return;
|
318
|
+
}
|
319
|
+
const parts = [];
|
320
|
+
if (options?.syntax != null) {
|
321
|
+
let syntax = String(options.syntax).trim();
|
322
|
+
if (!/^['"]/u.test(syntax))
|
323
|
+
syntax = `"${syntax}"`;
|
324
|
+
parts.push(`syntax: ${syntax};`);
|
325
|
+
}
|
326
|
+
if (options?.inherits != null) {
|
327
|
+
parts.push(`inherits: ${options.inherits ? 'true' : 'false'};`);
|
328
|
+
}
|
329
|
+
if (options?.initialValue != null) {
|
330
|
+
let initialValueStr;
|
331
|
+
if (typeof options.initialValue === 'number') {
|
332
|
+
initialValueStr = String(options.initialValue);
|
333
|
+
}
|
334
|
+
else {
|
335
|
+
// Process via tasty parser to resolve custom units/functions
|
336
|
+
initialValueStr = parseStyle(options.initialValue).output;
|
337
|
+
}
|
338
|
+
parts.push(`initial-value: ${initialValueStr};`);
|
339
|
+
}
|
340
|
+
const declarations = parts.join(' ').trim();
|
341
|
+
const rule = {
|
342
|
+
selector: `@property ${name}`,
|
343
|
+
declarations,
|
344
|
+
};
|
345
|
+
// Insert as a global rule; ignore returned info (no tracking/dispose)
|
346
|
+
this.sheetManager.insertGlobalRule(registry, [rule], `property:${name}`, root);
|
347
|
+
// Track that this property was injected
|
348
|
+
registry.injectedProperties.add(name);
|
349
|
+
}
|
350
|
+
/**
|
351
|
+
* Check whether a given @property name was already injected by this injector
|
352
|
+
*/
|
353
|
+
isPropertyDefined(name, options) {
|
354
|
+
const root = options?.root || document;
|
355
|
+
const registry = this.sheetManager.getRegistry(root);
|
356
|
+
return registry.injectedProperties.has(name);
|
357
|
+
}
|
358
|
+
/**
|
359
|
+
* Inject keyframes and return object with toString() and dispose()
|
360
|
+
*/
|
361
|
+
keyframes(steps, nameOrOptions) {
|
362
|
+
// Parse parameters
|
363
|
+
const isStringName = typeof nameOrOptions === 'string';
|
364
|
+
const providedName = isStringName ? nameOrOptions : nameOrOptions?.name;
|
365
|
+
const root = isStringName ? document : nameOrOptions?.root || document;
|
366
|
+
const registry = this.sheetManager.getRegistry(root);
|
367
|
+
if (Object.keys(steps).length === 0) {
|
368
|
+
return {
|
369
|
+
toString: () => '',
|
370
|
+
dispose: () => { },
|
371
|
+
};
|
372
|
+
}
|
373
|
+
// Generate cache key from steps and name
|
374
|
+
const cacheKey = providedName
|
375
|
+
? `${providedName}:${JSON.stringify(steps)}`
|
376
|
+
: JSON.stringify(steps);
|
377
|
+
// Check if already cached
|
378
|
+
const existing = registry.keyframesCache.get(cacheKey);
|
379
|
+
if (existing) {
|
380
|
+
existing.refCount++;
|
381
|
+
return {
|
382
|
+
toString: () => existing.name,
|
383
|
+
dispose: () => this.disposeKeyframes(cacheKey, registry),
|
384
|
+
};
|
385
|
+
}
|
386
|
+
// Use provided name or generate new one
|
387
|
+
const name = providedName || `k${registry.keyframesCounter++}`;
|
388
|
+
// Insert keyframes
|
389
|
+
const info = this.sheetManager.insertKeyframes(registry, steps, name, root);
|
390
|
+
if (!info) {
|
391
|
+
return {
|
392
|
+
toString: () => '',
|
393
|
+
dispose: () => { },
|
394
|
+
};
|
395
|
+
}
|
396
|
+
// Cache the result
|
397
|
+
registry.keyframesCache.set(cacheKey, {
|
398
|
+
name,
|
399
|
+
refCount: 1,
|
400
|
+
info,
|
401
|
+
});
|
402
|
+
// Update metrics
|
403
|
+
if (registry.metrics) {
|
404
|
+
registry.metrics.totalInsertions++;
|
405
|
+
registry.metrics.misses++;
|
406
|
+
}
|
407
|
+
return {
|
408
|
+
toString: () => name,
|
409
|
+
dispose: () => this.disposeKeyframes(cacheKey, registry),
|
410
|
+
};
|
411
|
+
}
|
412
|
+
/**
|
413
|
+
* Dispose keyframes
|
414
|
+
*/
|
415
|
+
disposeKeyframes(cacheKey, registry) {
|
416
|
+
const entry = registry.keyframesCache.get(cacheKey);
|
417
|
+
if (!entry)
|
418
|
+
return;
|
419
|
+
entry.refCount--;
|
420
|
+
if (entry.refCount <= 0) {
|
421
|
+
// Mark as unused
|
422
|
+
registry.keyframesCache.delete(cacheKey);
|
423
|
+
this.sheetManager.markKeyframesAsUnused(registry, entry.name);
|
424
|
+
}
|
425
|
+
}
|
426
|
+
/**
|
427
|
+
* Destroy all resources for a root
|
428
|
+
*/
|
429
|
+
destroy(root) {
|
430
|
+
const targetRoot = root || document;
|
431
|
+
this.sheetManager.cleanup(targetRoot);
|
432
|
+
}
|
433
|
+
/**
|
434
|
+
* Create a global style component like styled-components createGlobalStyle
|
435
|
+
* Returns a React component that injects global styles when mounted and cleans up when unmounted
|
436
|
+
*/
|
437
|
+
createGlobalStyle(strings, ...interpolations) {
|
438
|
+
const injector = this; // Capture the injector instance
|
439
|
+
class GlobalStyleComponent extends Component {
|
440
|
+
disposeFunction = null;
|
441
|
+
componentDidMount() {
|
442
|
+
this.injectStyles();
|
443
|
+
}
|
444
|
+
componentDidUpdate() {
|
445
|
+
this.disposeStyles();
|
446
|
+
this.injectStyles();
|
447
|
+
}
|
448
|
+
componentWillUnmount() {
|
449
|
+
this.disposeStyles();
|
450
|
+
}
|
451
|
+
injectStyles = () => {
|
452
|
+
const css = this.interpolateTemplate();
|
453
|
+
if (css.trim()) {
|
454
|
+
const styleResults = this.parseCSSToStyleResults(css);
|
455
|
+
// Bind the inject method to the outer injector instance
|
456
|
+
const result = injector.inject(styleResults, {
|
457
|
+
root: this.props.root,
|
458
|
+
});
|
459
|
+
this.disposeFunction = result.dispose;
|
460
|
+
}
|
461
|
+
};
|
462
|
+
disposeStyles = () => {
|
463
|
+
if (this.disposeFunction) {
|
464
|
+
this.disposeFunction();
|
465
|
+
this.disposeFunction = null;
|
466
|
+
}
|
467
|
+
};
|
468
|
+
interpolateTemplate = () => {
|
469
|
+
let result = strings[0];
|
470
|
+
for (let i = 0; i < interpolations.length; i++) {
|
471
|
+
const interpolation = interpolations[i];
|
472
|
+
const value = typeof interpolation === 'function'
|
473
|
+
? interpolation(this.props)
|
474
|
+
: interpolation;
|
475
|
+
result += String(value) + strings[i + 1];
|
476
|
+
}
|
477
|
+
return result;
|
478
|
+
};
|
479
|
+
parseCSSToStyleResults = (css) => {
|
480
|
+
const rules = [];
|
481
|
+
// Enhanced CSS parser for global styles that handles nested rules
|
482
|
+
this.parseCSS(css, rules, [], '');
|
483
|
+
return rules;
|
484
|
+
};
|
485
|
+
parseCSS = (css, rules, atRuleStack, parentSelector = '') => {
|
486
|
+
// Remove both CSS and JavaScript-style comments
|
487
|
+
let cleanCSS = css.replace(/\/\*[\s\S]*?\*\//g, ''); // CSS comments
|
488
|
+
cleanCSS = cleanCSS.replace(/\/\/.*$/gm, ''); // JavaScript-style comments
|
489
|
+
let i = 0;
|
490
|
+
while (i < cleanCSS.length) {
|
491
|
+
// Skip whitespace
|
492
|
+
while (i < cleanCSS.length && /\s/.test(cleanCSS[i])) {
|
493
|
+
i++;
|
494
|
+
}
|
495
|
+
if (i >= cleanCSS.length)
|
496
|
+
break;
|
497
|
+
// Find the next selector or at-rule
|
498
|
+
let selectorStart = i;
|
499
|
+
let braceDepth = 0;
|
500
|
+
let inString = false;
|
501
|
+
let stringChar = '';
|
502
|
+
// Find the opening brace
|
503
|
+
while (i < cleanCSS.length) {
|
504
|
+
const char = cleanCSS[i];
|
505
|
+
if (inString) {
|
506
|
+
if (char === stringChar && cleanCSS[i - 1] !== '\\') {
|
507
|
+
inString = false;
|
508
|
+
}
|
509
|
+
}
|
510
|
+
else {
|
511
|
+
if (char === '"' || char === "'") {
|
512
|
+
inString = true;
|
513
|
+
stringChar = char;
|
514
|
+
}
|
515
|
+
else if (char === '{') {
|
516
|
+
braceDepth++;
|
517
|
+
if (braceDepth === 1) {
|
518
|
+
break; // Found the opening brace
|
519
|
+
}
|
520
|
+
}
|
521
|
+
else if (char === '}') {
|
522
|
+
braceDepth--;
|
523
|
+
}
|
524
|
+
}
|
525
|
+
i++;
|
526
|
+
}
|
527
|
+
if (i >= cleanCSS.length)
|
528
|
+
break;
|
529
|
+
const selectorPart = cleanCSS.substring(selectorStart, i).trim();
|
530
|
+
i++; // Skip the opening brace
|
531
|
+
// Find the matching closing brace
|
532
|
+
const contentStart = i;
|
533
|
+
braceDepth = 1;
|
534
|
+
inString = false;
|
535
|
+
while (i < cleanCSS.length && braceDepth > 0) {
|
536
|
+
const char = cleanCSS[i];
|
537
|
+
if (inString) {
|
538
|
+
if (char === stringChar && cleanCSS[i - 1] !== '\\') {
|
539
|
+
inString = false;
|
540
|
+
}
|
541
|
+
}
|
542
|
+
else {
|
543
|
+
if (char === '"' || char === "'") {
|
544
|
+
inString = true;
|
545
|
+
stringChar = char;
|
546
|
+
}
|
547
|
+
else if (char === '{') {
|
548
|
+
braceDepth++;
|
549
|
+
}
|
550
|
+
else if (char === '}') {
|
551
|
+
braceDepth--;
|
552
|
+
}
|
553
|
+
}
|
554
|
+
i++;
|
555
|
+
}
|
556
|
+
const content = cleanCSS.substring(contentStart, i - 1).trim();
|
557
|
+
// Check if this is an at-rule
|
558
|
+
if (selectorPart.startsWith('@')) {
|
559
|
+
const atSelector = selectorPart.trim();
|
560
|
+
// Leaf at-rules that contain declarations directly and should be emitted as-is
|
561
|
+
const leafAtRules = [
|
562
|
+
'@font-face',
|
563
|
+
'@property',
|
564
|
+
'@page',
|
565
|
+
'@counter-style',
|
566
|
+
'@font-feature-values',
|
567
|
+
'@font-palette-values',
|
568
|
+
'@color-profile',
|
569
|
+
];
|
570
|
+
const isLeafAtRule = leafAtRules.some((prefix) => atSelector.startsWith(prefix));
|
571
|
+
if (isLeafAtRule) {
|
572
|
+
// Emit the at-rule with its declarations directly
|
573
|
+
if (content.trim()) {
|
574
|
+
rules.push({
|
575
|
+
selector: atSelector,
|
576
|
+
declarations: content,
|
577
|
+
atRules: atRuleStack.length > 0 ? [...atRuleStack] : undefined,
|
578
|
+
});
|
579
|
+
}
|
580
|
+
}
|
581
|
+
else {
|
582
|
+
// Wrapper at-rule (e.g., @media, @supports, @keyframes) — parse its content
|
583
|
+
const newAtRuleStack = [...atRuleStack, atSelector];
|
584
|
+
this.parseCSS(content, rules, newAtRuleStack, parentSelector);
|
585
|
+
}
|
586
|
+
}
|
587
|
+
else {
|
588
|
+
// Check if content contains nested rules (has { and })
|
589
|
+
if (content.includes('{') && content.includes('}')) {
|
590
|
+
// This selector has nested rules, parse them
|
591
|
+
const { declarations, nestedCSS } = this.separateDeclarationsAndNested(content);
|
592
|
+
// Process the selector (handle & syntax)
|
593
|
+
const processedSelector = this.processSelector(selectorPart, parentSelector);
|
594
|
+
// Add declarations if any
|
595
|
+
if (declarations.trim()) {
|
596
|
+
rules.push({
|
597
|
+
selector: processedSelector,
|
598
|
+
declarations: declarations.trim(),
|
599
|
+
atRules: atRuleStack.length > 0 ? [...atRuleStack] : undefined,
|
600
|
+
});
|
601
|
+
}
|
602
|
+
// Parse nested CSS with current selector as parent
|
603
|
+
if (nestedCSS.trim()) {
|
604
|
+
this.parseCSS(nestedCSS, rules, atRuleStack, processedSelector);
|
605
|
+
}
|
606
|
+
}
|
607
|
+
else {
|
608
|
+
// This is a regular selector with only declarations
|
609
|
+
const processedSelector = this.processSelector(selectorPart, parentSelector);
|
610
|
+
if (content && processedSelector) {
|
611
|
+
rules.push({
|
612
|
+
selector: processedSelector,
|
613
|
+
declarations: content,
|
614
|
+
atRules: atRuleStack.length > 0 ? [...atRuleStack] : undefined,
|
615
|
+
});
|
616
|
+
}
|
617
|
+
}
|
618
|
+
}
|
619
|
+
}
|
620
|
+
};
|
621
|
+
separateDeclarationsAndNested = (content) => {
|
622
|
+
const declarations = [];
|
623
|
+
const nestedRules = [];
|
624
|
+
let i = 0;
|
625
|
+
let currentDeclaration = '';
|
626
|
+
while (i < content.length) {
|
627
|
+
const char = content[i];
|
628
|
+
if (char === '{') {
|
629
|
+
// Found start of nested rule, find the selector before it
|
630
|
+
let selectorStart = currentDeclaration.lastIndexOf(';') + 1;
|
631
|
+
if (selectorStart === 0 && currentDeclaration.trim()) {
|
632
|
+
// No semicolon found, this might be the first rule
|
633
|
+
selectorStart = 0;
|
634
|
+
}
|
635
|
+
const beforeBrace = currentDeclaration.substring(0, selectorStart);
|
636
|
+
const selector = currentDeclaration.substring(selectorStart).trim();
|
637
|
+
if (beforeBrace.trim()) {
|
638
|
+
declarations.push(beforeBrace.trim());
|
639
|
+
}
|
640
|
+
// Find the matching closing brace
|
641
|
+
let braceDepth = 1;
|
642
|
+
let ruleStart = i + 1;
|
643
|
+
i++; // Skip opening brace
|
644
|
+
while (i < content.length && braceDepth > 0) {
|
645
|
+
if (content[i] === '{')
|
646
|
+
braceDepth++;
|
647
|
+
else if (content[i] === '}')
|
648
|
+
braceDepth--;
|
649
|
+
i++;
|
650
|
+
}
|
651
|
+
const ruleContent = content.substring(ruleStart, i - 1);
|
652
|
+
nestedRules.push(`${selector} { ${ruleContent} }`);
|
653
|
+
currentDeclaration = '';
|
654
|
+
}
|
655
|
+
else {
|
656
|
+
currentDeclaration += char;
|
657
|
+
i++;
|
658
|
+
}
|
659
|
+
}
|
660
|
+
// Add remaining declarations
|
661
|
+
if (currentDeclaration.trim()) {
|
662
|
+
declarations.push(currentDeclaration.trim());
|
663
|
+
}
|
664
|
+
return {
|
665
|
+
declarations: declarations.join(' '),
|
666
|
+
nestedCSS: nestedRules.join('\n'),
|
667
|
+
};
|
668
|
+
};
|
669
|
+
processSelector = (selector, parentSelector) => {
|
670
|
+
if (!parentSelector) {
|
671
|
+
return selector;
|
672
|
+
}
|
673
|
+
// Handle & syntax - replace & with parent selector
|
674
|
+
if (selector.includes('&')) {
|
675
|
+
return selector.replace(/&/g, parentSelector);
|
676
|
+
}
|
677
|
+
// If no &, treat as descendant selector
|
678
|
+
return `${parentSelector} ${selector}`;
|
679
|
+
};
|
680
|
+
render() {
|
681
|
+
return null;
|
682
|
+
}
|
683
|
+
}
|
684
|
+
return GlobalStyleComponent;
|
685
|
+
}
|
686
|
+
}
|
687
|
+
|
688
|
+
|