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