@cube-dev/ui-kit 0.98.9 → 0.99.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 +36 -0
- package/es/_internal/hooks/index.js +10 -10
- package/es/_internal/hooks/use-chained-callback.js +2 -2
- package/es/_internal/hooks/use-debounced-value.js +1 -1
- package/es/_internal/hooks/use-deprecation-warning.js +2 -2
- package/es/_internal/hooks/use-effect-once.js +1 -1
- package/es/_internal/hooks/use-event.js +2 -2
- package/es/_internal/hooks/use-is-first-render.js +1 -1
- package/es/_internal/hooks/use-sync-ref.js +2 -2
- package/es/_internal/hooks/use-timer/index.js +3 -3
- package/es/_internal/hooks/use-timer/timer.js +1 -1
- package/es/_internal/hooks/use-timer/use-timer.js +3 -3
- package/es/_internal/hooks/use-update-effect.js +2 -2
- package/es/_internal/hooks/use-warn.js +3 -3
- package/es/_internal/index.js +2 -2
- package/es/components/Block.js +2 -2
- package/es/components/CollectionItem.js +3 -3
- package/es/components/GlobalStyles.js +56 -65
- package/es/components/GridProvider.js +4 -4
- package/es/components/HiddenInput.js +2 -2
- package/es/components/OpenTrasition.js +1 -1
- package/es/components/Root.js +22 -64
- package/es/components/actions/Action/Action.js +3 -3
- package/es/components/actions/Button/Button.js +12 -12
- package/es/components/actions/Button/index.js +2 -2
- package/es/components/actions/ButtonGroup/ButtonGroup.js +4 -4
- package/es/components/actions/CommandMenu/CommandMenu.js +11 -11
- package/es/components/actions/CommandMenu/index.js +2 -2
- package/es/components/actions/CommandMenu/styled.js +2 -2
- package/es/components/actions/ItemAction/ItemAction.js +9 -9
- package/es/components/actions/ItemAction/index.js +2 -2
- package/es/components/actions/ItemActionContext.js +1 -1
- package/es/components/actions/ItemButton/ItemButton.js +9 -9
- package/es/components/actions/ItemButton/index.js +2 -2
- package/es/components/actions/Link/Link.js +2 -2
- package/es/components/actions/Menu/Menu.js +10 -10
- package/es/components/actions/Menu/MenuItem.js +7 -7
- package/es/components/actions/Menu/MenuSection.js +4 -4
- package/es/components/actions/Menu/MenuTrigger.js +6 -6
- package/es/components/actions/Menu/SubMenuTrigger.js +6 -6
- 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 +10 -10
- package/es/components/actions/Menu/styled.js +5 -5
- package/es/components/actions/index.js +13 -13
- package/es/components/actions/use-action.js +7 -7
- package/es/components/actions/use-anchored-menu.js +6 -6
- package/es/components/actions/use-context-menu.js +6 -6
- package/es/components/content/ActiveZone/ActiveZone.js +4 -4
- package/es/components/content/Alert/Alert.js +4 -4
- package/es/components/content/Alert/index.js +2 -2
- package/es/components/content/Alert/types.js +1 -1
- package/es/components/content/Alert/use-alert.js +3 -3
- package/es/components/content/Avatar/Avatar.js +2 -2
- package/es/components/content/Badge/Badge.js +4 -4
- package/es/components/content/Card/Card.js +2 -2
- package/es/components/content/Content.js +3 -3
- package/es/components/content/CopyPasteBlock/CopyPasteBlock.js +8 -8
- package/es/components/content/CopyPasteBlock/index.js +2 -2
- package/es/components/content/CopySnippet/CopySnippet.js +9 -9
- package/es/components/content/CopySnippet/index.js +2 -2
- package/es/components/content/Disclosure/Disclosure.js +6 -6
- package/es/components/content/Disclosure/index.js +2 -2
- package/es/components/content/Divider.js +3 -3
- package/es/components/content/Footer.js +3 -3
- package/es/components/content/Header.js +3 -3
- package/es/components/content/HotKeys/HotKeys.js +5 -5
- package/es/components/content/HotKeys/index.js +2 -2
- package/es/components/content/Item/Item.js +15 -15
- package/es/components/content/Item/index.js +3 -3
- package/es/components/content/ItemBadge/ItemBadge.js +8 -8
- package/es/components/content/ItemBadge/index.js +2 -2
- package/es/components/content/Layout/GridLayout.js +13 -13
- package/es/components/content/Layout/Layout.js +7 -6
- package/es/components/content/Layout/LayoutBlock.js +4 -3
- package/es/components/content/Layout/LayoutCenter.js +3 -3
- package/es/components/content/Layout/LayoutContainer.js +4 -4
- package/es/components/content/Layout/LayoutContent.js +6 -5
- package/es/components/content/Layout/LayoutContext.js +1 -1
- package/es/components/content/Layout/LayoutFlex.js +4 -3
- package/es/components/content/Layout/LayoutFooter.js +4 -3
- package/es/components/content/Layout/LayoutGrid.js +4 -3
- package/es/components/content/Layout/LayoutHeader.js +8 -7
- package/es/components/content/Layout/LayoutPane.js +8 -7
- package/es/components/content/Layout/LayoutPanel.js +10 -9
- package/es/components/content/Layout/LayoutPanelHeader.js +7 -7
- package/es/components/content/Layout/LayoutToolbar.js +4 -3
- package/es/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
- package/es/components/content/Layout/index.js +16 -16
- package/es/components/content/Layout/utils.js +1 -1
- package/es/components/content/List/SectionHeading.js +3 -3
- package/es/components/content/List/index.js +2 -2
- package/es/components/content/Paragraph.js +3 -3
- package/es/components/content/Placeholder/Placeholder.js +2 -2
- package/es/components/content/PrismCode/PrismCode.js +7 -7
- package/es/components/content/PrismCode/prismSetup.js +1 -1
- package/es/components/content/PrismDiffCode/PrismDiffCode.js +2 -2
- package/es/components/content/Result/Result.js +4 -4
- package/es/components/content/Skeleton/Skeleton.js +5 -5
- package/es/components/content/Tag/Tag.js +4 -4
- package/es/components/content/Text.js +3 -3
- package/es/components/content/TextItem/TextItem.js +5 -5
- package/es/components/content/TextItem/index.js +2 -2
- package/es/components/content/Title.js +4 -4
- package/es/components/content/highlightText.js +2 -2
- package/es/components/content/use-auto-tooltip.js +2 -2
- package/es/components/fields/Checkbox/Checkbox.js +12 -12
- package/es/components/fields/Checkbox/CheckboxGroup.js +7 -7
- package/es/components/fields/Checkbox/context.js +1 -1
- package/es/components/fields/Checkbox/index.js +3 -3
- package/es/components/fields/ComboBox/ComboBox.js +18 -18
- package/es/components/fields/ComboBox/index.js +2 -2
- package/es/components/fields/DatePicker/DateInput.js +10 -10
- package/es/components/fields/DatePicker/DateInputBase.js +6 -6
- package/es/components/fields/DatePicker/DatePicker.js +14 -14
- package/es/components/fields/DatePicker/DatePickerButton.js +4 -4
- package/es/components/fields/DatePicker/DatePickerElement.js +3 -3
- package/es/components/fields/DatePicker/DatePickerInput.js +5 -5
- package/es/components/fields/DatePicker/DatePickerSegment.js +2 -2
- package/es/components/fields/DatePicker/DateRangePicker.js +15 -15
- package/es/components/fields/DatePicker/DateRangeSeparatedPicker.js +15 -15
- package/es/components/fields/DatePicker/TimeInput.js +9 -9
- package/es/components/fields/DatePicker/index.js +8 -8
- 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 +6 -6
- package/es/components/fields/FilterListBox/FilterListBox.js +10 -10
- package/es/components/fields/FilterListBox/index.js +2 -2
- package/es/components/fields/FilterPicker/FilterPicker.js +14 -14
- package/es/components/fields/FilterPicker/index.js +2 -2
- package/es/components/fields/Input/Input.js +6 -6
- package/es/components/fields/Input/index.js +2 -2
- package/es/components/fields/ListBox/ListBox.js +14 -14
- package/es/components/fields/ListBox/index.js +2 -2
- package/es/components/fields/NumberInput/NumberInput.js +8 -8
- package/es/components/fields/NumberInput/StepButton.js +4 -4
- package/es/components/fields/PasswordInput/PasswordInput.js +8 -8
- package/es/components/fields/Picker/Picker.js +13 -13
- package/es/components/fields/Picker/index.js +2 -2
- package/es/components/fields/RadioGroup/Radio.js +10 -10
- package/es/components/fields/RadioGroup/RadioGroup.js +7 -7
- package/es/components/fields/RadioGroup/context.js +1 -1
- package/es/components/fields/RadioGroup/index.js +3 -3
- package/es/components/fields/SearchInput/SearchInput.js +8 -8
- package/es/components/fields/SearchInput/index.js +2 -2
- package/es/components/fields/Select/Select.js +20 -20
- package/es/components/fields/Select/index.js +2 -2
- package/es/components/fields/Slider/Gradation.js +2 -2
- package/es/components/fields/Slider/Header.js +1 -1
- package/es/components/fields/Slider/RangeSlider.js +5 -5
- package/es/components/fields/Slider/Slider.js +7 -7
- package/es/components/fields/Slider/SliderBase.js +6 -6
- package/es/components/fields/Slider/SliderInput.js +2 -2
- package/es/components/fields/Slider/SliderThumb.js +3 -3
- package/es/components/fields/Slider/SliderTrack.js +2 -2
- package/es/components/fields/Slider/elements.js +2 -2
- package/es/components/fields/Slider/index.js +4 -4
- package/es/components/fields/Slider/types.js +1 -1
- package/es/components/fields/Switch/Switch.js +11 -11
- package/es/components/fields/Switch/index.js +2 -2
- package/es/components/fields/TextArea/TextArea.js +7 -7
- package/es/components/fields/TextArea/index.js +2 -2
- package/es/components/fields/TextInput/TextInput.js +6 -6
- package/es/components/fields/TextInput/TextInputBase.js +9 -9
- package/es/components/fields/TextInput/index.js +3 -3
- package/es/components/fields/TextInputMapper/TextInputMapper.js +14 -14
- package/es/components/fields/TextInputMapper/index.js +2 -2
- package/es/components/fields/index.js +20 -20
- package/es/components/form/FieldWrapper/FieldWrapper.js +9 -9
- package/es/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
- package/es/components/form/FieldWrapper/index.js +4 -4
- package/es/components/form/FieldWrapper/types.js +1 -1
- package/es/components/form/Form/Field.js +6 -6
- package/es/components/form/Form/Form.js +6 -6
- package/es/components/form/Form/ResetButton/ResetButton.js +6 -6
- package/es/components/form/Form/ResetButton/index.js +2 -2
- package/es/components/form/Form/SubmitButton/SubmitButton.js +4 -4
- package/es/components/form/Form/SubmitButton/index.js +2 -2
- package/es/components/form/Form/SubmitError.js +3 -3
- package/es/components/form/Form/index.js +11 -11
- package/es/components/form/Form/types.js +1 -1
- package/es/components/form/Form/use-field/index.js +4 -4
- package/es/components/form/Form/use-field/types.js +1 -1
- package/es/components/form/Form/use-field/use-field-props.js +6 -6
- package/es/components/form/Form/use-field/use-field.js +4 -4
- package/es/components/form/Form/use-form.js +3 -3
- package/es/components/form/Form/validation.js +1 -1
- package/es/components/form/Label.js +3 -3
- package/es/components/form/index.js +5 -5
- package/es/components/form/wrapper.js +3 -3
- package/es/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
- package/es/components/helpers/DisplayTransition/index.js +2 -2
- package/es/components/helpers/IconSwitch/IconSwitch.js +3 -3
- package/es/components/helpers/index.js +3 -3
- package/es/components/layout/Flex.js +2 -2
- package/es/components/layout/Flow.js +2 -2
- package/es/components/layout/Grid.js +2 -2
- package/es/components/layout/Panel.js +2 -2
- package/es/components/layout/Prefix.js +3 -3
- package/es/components/layout/ResizablePanel.js +5 -5
- package/es/components/layout/Space.js +2 -2
- package/es/components/layout/Suffix.js +3 -3
- package/es/components/organisms/FileTabs/FileTabs.js +8 -8
- package/es/components/organisms/StatsCard/StatsCard.js +4 -4
- package/es/components/other/Calendar/Calendar.js +8 -8
- package/es/components/other/Calendar/CalendarCell.js +2 -2
- package/es/components/other/Calendar/CalendarGrid.js +3 -3
- package/es/components/other/Calendar/RangeCalendar.js +8 -8
- package/es/components/other/CloudLogo/CloudLogo.js +3 -3
- package/es/components/overlays/AlertDialog/AlertDialog.js +11 -11
- package/es/components/overlays/AlertDialog/AlertDialogApiProvider.js +2 -2
- package/es/components/overlays/AlertDialog/AlertDialogZone.js +4 -4
- package/es/components/overlays/AlertDialog/index.js +4 -4
- package/es/components/overlays/AlertDialog/types.js +1 -1
- package/es/components/overlays/Dialog/Dialog.js +7 -7
- package/es/components/overlays/Dialog/DialogContainer.js +3 -3
- package/es/components/overlays/Dialog/DialogForm.js +8 -8
- package/es/components/overlays/Dialog/DialogTrigger.js +4 -4
- package/es/components/overlays/Dialog/context.js +1 -1
- package/es/components/overlays/Dialog/index.js +6 -6
- package/es/components/overlays/Dialog/use-dialog-container.js +4 -4
- package/es/components/overlays/Modal/Modal.js +5 -5
- package/es/components/overlays/Modal/OpenTransition.js +1 -1
- package/es/components/overlays/Modal/Overlay.js +3 -3
- package/es/components/overlays/Modal/Popover.js +4 -4
- package/es/components/overlays/Modal/Tray.js +6 -6
- package/es/components/overlays/Modal/Underlay.js +2 -2
- package/es/components/overlays/Modal/index.js +7 -7
- package/es/components/overlays/Modal/types.js +1 -1
- package/es/components/overlays/NewNotifications/Bar/FloatingNotification.js +5 -5
- package/es/components/overlays/NewNotifications/Bar/NotificationsBar.js +7 -7
- package/es/components/overlays/NewNotifications/Bar/TransitionComponent.js +36 -34
- package/es/components/overlays/NewNotifications/Bar/index.js +2 -2
- package/es/components/overlays/NewNotifications/Dialog/NotificationsDialogContext.js +1 -1
- package/es/components/overlays/NewNotifications/Dialog/NotificationsDialogTrigger.js +8 -8
- package/es/components/overlays/NewNotifications/Dialog/index.js +2 -2
- package/es/components/overlays/NewNotifications/Notification.js +4 -4
- package/es/components/overlays/NewNotifications/NotificationView/NotificationAction.js +5 -5
- package/es/components/overlays/NewNotifications/NotificationView/NotificationCloseButton.js +4 -4
- package/es/components/overlays/NewNotifications/NotificationView/NotificationDescription.js +4 -4
- package/es/components/overlays/NewNotifications/NotificationView/NotificationFooter.js +3 -3
- package/es/components/overlays/NewNotifications/NotificationView/NotificationHeader.js +3 -3
- package/es/components/overlays/NewNotifications/NotificationView/NotificationIcon.js +4 -4
- package/es/components/overlays/NewNotifications/NotificationView/NotificationProvider.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationView.js +12 -12
- package/es/components/overlays/NewNotifications/NotificationView/index.js +3 -3
- 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 +5 -5
- package/es/components/overlays/NewNotifications/NotificationsContext/index.js +3 -3
- package/es/components/overlays/NewNotifications/NotificationsContext/use-notifications.js +2 -2
- package/es/components/overlays/NewNotifications/NotificationsList/NotificationsList.js +4 -4
- package/es/components/overlays/NewNotifications/NotificationsList/NotificationsListItem.js +5 -5
- package/es/components/overlays/NewNotifications/NotificationsList/index.js +2 -2
- package/es/components/overlays/NewNotifications/NotificationsList/types.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/index.js +6 -6
- 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 +2 -2
- package/es/components/overlays/NewNotifications/hooks/use-notifications-list.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/use-notifications-observer.js +3 -3
- package/es/components/overlays/NewNotifications/index.js +7 -7
- package/es/components/overlays/NewNotifications/types.js +1 -1
- package/es/components/overlays/Notification/Notification.js +7 -7
- package/es/components/overlays/OverlayWrapper.js +2 -2
- package/es/components/overlays/Toasts/Toast.js +4 -4
- package/es/components/overlays/Toasts/index.js +3 -3
- package/es/components/overlays/Toasts/types.js +1 -1
- package/es/components/overlays/Toasts/use-toasts-api.js +2 -2
- package/es/components/overlays/Tooltip/Tooltip.js +4 -4
- package/es/components/overlays/Tooltip/TooltipProvider.js +3 -3
- package/es/components/overlays/Tooltip/TooltipTrigger.js +6 -6
- package/es/components/overlays/Tooltip/context.js +1 -1
- package/es/components/overlays/Tooltip/index.js +4 -4
- package/es/components/portal/Portal.js +2 -2
- package/es/components/portal/PortalProvider.js +1 -1
- package/es/components/portal/index.js +3 -3
- package/es/components/portal/types.js +1 -1
- package/es/components/portal/usePortal.js +2 -2
- package/es/components/shared/InvalidIcon.js +2 -2
- package/es/components/shared/ValidIcon.js +2 -2
- package/es/components/status/LoadingAnimation/LoadingAnimation.js +58 -114
- package/es/components/status/LoadingAnimation/index.js +2 -2
- package/es/components/status/Spin/Cube.js +95 -179
- package/es/components/status/Spin/InternalSpinner.js +5 -5
- package/es/components/status/Spin/Spin.js +4 -4
- package/es/components/status/Spin/SpinsContainer.js +28 -30
- package/es/components/status/Spin/index.js +2 -2
- package/es/components/status/Spin/types.js +1 -1
- package/es/components/status/index.js +3 -3
- package/es/data/item-themes.js +1 -1
- package/es/data/themes.js +1 -1
- package/es/icons/AdjustmentsHorizontalIcon.js +2 -2
- package/es/icons/AdjustmentsIcon.js +2 -2
- package/es/icons/AiIcon.js +2 -2
- package/es/icons/AreaChartIcon.js +2 -2
- package/es/icons/BackwardIcon.js +2 -2
- package/es/icons/BarChartIcon.js +2 -2
- package/es/icons/BellFilledIcon.js +2 -2
- package/es/icons/BellIcon.js +2 -2
- package/es/icons/BooleanIcon.js +2 -2
- package/es/icons/CalendarEditIcon.js +2 -2
- package/es/icons/CalendarIcon.js +2 -2
- package/es/icons/CaretDownIcon.js +2 -2
- package/es/icons/CaretUpIcon.js +2 -2
- package/es/icons/ChartAreaStackedIcon.js +2 -2
- package/es/icons/ChartAreaStackedPercentageIcon.js +2 -2
- package/es/icons/ChartBarGroupedHorizontalIcon.js +2 -2
- package/es/icons/ChartBarGroupedIcon.js +2 -2
- package/es/icons/ChartBarHorizontalIcon.js +2 -2
- package/es/icons/ChartBarLineIcon.js +2 -2
- package/es/icons/ChartBarStackedHorizontalIcon.js +2 -2
- package/es/icons/ChartBarStackedIcon.js +2 -2
- package/es/icons/ChartBarStackedPercentageHorizontalIcon.js +2 -2
- package/es/icons/ChartBarStackedPercentageIcon.js +2 -2
- package/es/icons/ChartBoxPlot2Icon.js +2 -2
- package/es/icons/ChartBoxPlotIcon.js +2 -2
- package/es/icons/ChartBubbleIcon.js +2 -2
- package/es/icons/ChartDonut2Icon.js +2 -2
- package/es/icons/ChartFunnelIcon.js +2 -2
- package/es/icons/ChartHeatmapIcon.js +2 -2
- package/es/icons/ChartKPIIcon.js +2 -2
- package/es/icons/ChartPie2Icon.js +2 -2
- package/es/icons/ChartScatterIcon.js +2 -2
- package/es/icons/CheckCircleFilledIcon.js +2 -2
- package/es/icons/CheckCircleIcon.js +2 -2
- package/es/icons/CheckIcon.js +2 -2
- package/es/icons/CircleFilledIcon.js +2 -2
- package/es/icons/ClearIcon.js +2 -2
- package/es/icons/CloseCircleFilledIcon.js +2 -2
- package/es/icons/CloseCircleIcon.js +2 -2
- package/es/icons/CloseIcon.js +2 -2
- package/es/icons/CodeIcon.js +2 -2
- package/es/icons/ColumnTotalIcon.js +2 -2
- package/es/icons/CopyIcon.js +2 -2
- package/es/icons/CountIcon.js +2 -2
- package/es/icons/CubeIcon.js +2 -2
- package/es/icons/CubePauseIcon.js +2 -2
- package/es/icons/CubePlayIcon.js +2 -2
- package/es/icons/CurrencyDollarIcon.js +2 -2
- package/es/icons/DangerIcon.js +2 -2
- package/es/icons/DashboardIcon.js +2 -2
- package/es/icons/DatabaseIcon.js +2 -2
- package/es/icons/DecimalDecreaseIcon.js +2 -2
- package/es/icons/DecimalIncreaseIcon.js +2 -2
- package/es/icons/DirectionIcon.js +3 -3
- package/es/icons/DonutIcon.js +2 -2
- package/es/icons/DownIcon.js +2 -2
- package/es/icons/EditIcon.js +2 -2
- package/es/icons/ExclamationCircleFilledIcon.js +2 -2
- package/es/icons/ExclamationCircleIcon.js +2 -2
- package/es/icons/ExclamationIcon.js +2 -2
- package/es/icons/EyeIcon.js +2 -2
- package/es/icons/EyeInvisibleIcon.js +2 -2
- package/es/icons/FilterIcon.js +2 -2
- package/es/icons/FolderFilledIcon.js +2 -2
- package/es/icons/FolderIcon.js +2 -2
- package/es/icons/FolderOpenFilledIcon.js +2 -2
- package/es/icons/FolderOpenIcon.js +2 -2
- package/es/icons/ForwardIcon.js +2 -2
- package/es/icons/HierarchyIcon.js +2 -2
- package/es/icons/HierarchyOpenIcon.js +2 -2
- package/es/icons/Icon.js +2 -2
- package/es/icons/InfoCircleIcon.js +2 -2
- package/es/icons/InfoIcon.js +2 -2
- package/es/icons/KeyIcon.js +2 -2
- package/es/icons/LeftIcon.js +2 -2
- package/es/icons/LineChartIcon.js +2 -2
- package/es/icons/LoadingIcon.js +2 -2
- package/es/icons/LockFilledIcon.js +2 -2
- package/es/icons/LockIcon.js +2 -2
- package/es/icons/MoreIcon.js +2 -2
- package/es/icons/NotAllowedIcon.js +2 -2
- package/es/icons/Number123Icon.js +2 -2
- package/es/icons/NumberIcon.js +2 -2
- package/es/icons/PauseCircleFilledIcon.js +2 -2
- package/es/icons/PauseCircleIcon.js +2 -2
- package/es/icons/PauseIcon.js +2 -2
- package/es/icons/PercentageIcon.js +2 -2
- package/es/icons/PieChartIcon.js +2 -2
- package/es/icons/PlayCircleIcon.js +2 -2
- package/es/icons/PlayIcon.js +2 -2
- package/es/icons/PlusIcon.js +2 -2
- package/es/icons/ProgressBarIcon.js +2 -2
- package/es/icons/ReloadIcon.js +2 -2
- package/es/icons/ReportIcon.js +2 -2
- package/es/icons/ReturnIcon.js +2 -2
- package/es/icons/RightIcon.js +2 -2
- package/es/icons/RowTotalsIcon.js +2 -2
- package/es/icons/SchemeIcon.js +2 -2
- package/es/icons/SearchIcon.js +2 -2
- package/es/icons/SemanticQueryIcon.js +2 -2
- package/es/icons/SettingsIcon.js +2 -2
- package/es/icons/ShieldFilledIcon.js +2 -2
- package/es/icons/ShieldIcon.js +2 -2
- package/es/icons/SlashIcon.js +2 -2
- package/es/icons/SparklesIcon.js +2 -2
- package/es/icons/SqlIcon.js +2 -2
- package/es/icons/StatsIcon.js +2 -2
- package/es/icons/StopIcon.js +2 -2
- package/es/icons/StringIcon.js +2 -2
- package/es/icons/SubtotalsIcon.js +2 -2
- package/es/icons/SwitchIcon.js +2 -2
- package/es/icons/TableIcon.js +2 -2
- package/es/icons/ThumbsDownIcon.js +2 -2
- package/es/icons/ThumbsUpIcon.js +2 -2
- package/es/icons/ThunderboltCrossedIcon.js +2 -2
- package/es/icons/ThunderboltFilledIcon.js +2 -2
- package/es/icons/ThunderboltIcon.js +2 -2
- package/es/icons/TimeIcon.js +2 -2
- package/es/icons/TrashIcon.js +2 -2
- package/es/icons/UnlockIcon.js +2 -2
- package/es/icons/UpIcon.js +2 -2
- package/es/icons/UserGroupIcon.js +2 -2
- package/es/icons/UserIcon.js +2 -2
- package/es/icons/UserLockIcon.js +2 -2
- package/es/icons/ViewIcon.js +2 -2
- package/es/icons/WarningFilledIcon.js +2 -2
- package/es/icons/WarningIcon.js +2 -2
- package/es/icons/index.js +129 -129
- package/es/icons/wrap-icon.js +2 -2
- package/es/index.js +73 -74
- package/es/provider.js +4 -10
- package/es/providers/TrackingProvider.js +1 -1
- package/es/providers/navigation.types.js +1 -1
- package/es/providers/navigationAdapter.default.js +1 -1
- package/es/services/notification.js +2 -2
- package/es/shared/form.js +1 -1
- package/es/shared/index.js +2 -2
- package/es/stories/Form.legacy-stories.js +4 -4
- package/es/stories/FormFieldArgs.js +2 -2
- package/es/stories/SimpleLayout.stories.js +2 -2
- package/es/stories/Tasty.stories.js +2 -2
- package/es/stories/components/ConfirmDeletionDialogForm.js +2 -2
- package/es/stories/components/DialogFormApp.js +3 -3
- package/es/stories/components/StyledButton.js +19 -15
- package/es/stories/lists/baseProps.js +2 -2
- package/es/stories/playground/PlaygroundEditor.js +89 -0
- package/es/stories/playground/PlaygroundLayout.js +16 -0
- package/es/stories/playground/PlaygroundOutput.js +92 -0
- package/es/stories/playground/PlaygroundPreview.js +91 -0
- package/es/stories/playground/components/Button.js +45 -0
- package/es/stories/playground/components/Card.js +20 -0
- package/es/stories/playground/components/ScrollProgress.js +17 -0
- package/es/stories/playground/examples.js +158 -0
- package/es/tasty/chunks/cacheKey.js +98 -0
- package/es/tasty/chunks/definitions.js +281 -0
- package/es/tasty/chunks/index.js +12 -0
- package/es/tasty/chunks/renderChunk.js +97 -0
- package/es/tasty/config.js +280 -0
- package/es/tasty/debug.js +195 -9
- package/es/tasty/hooks/index.js +12 -0
- package/es/tasty/hooks/useGlobalStyles.js +67 -0
- package/es/tasty/hooks/useRawCSS.js +40 -0
- package/es/tasty/hooks/useStyles.js +206 -0
- package/es/tasty/index.js +31 -17
- package/es/tasty/injector/index.js +34 -90
- package/es/tasty/injector/injector.js +81 -299
- package/es/tasty/injector/sheet-manager.js +138 -3
- package/es/tasty/injector/types.js +1 -1
- package/es/tasty/keyframes/index.js +301 -0
- package/es/tasty/parser/classify.js +8 -6
- package/es/tasty/parser/const.js +1 -1
- package/es/tasty/parser/lru.js +1 -1
- package/es/tasty/parser/parser.js +18 -5
- package/es/tasty/parser/tokenizer.js +1 -1
- package/es/tasty/parser/types.js +2 -1
- package/es/tasty/pipeline/conditions.js +426 -0
- package/es/tasty/pipeline/exclusive.js +311 -0
- package/es/tasty/pipeline/index.js +543 -0
- package/es/tasty/pipeline/materialize.js +1260 -0
- package/es/tasty/pipeline/parseStateKey.js +592 -0
- package/es/tasty/pipeline/simplify.js +898 -0
- package/es/tasty/plugins/index.js +26 -0
- package/es/tasty/plugins/okhsl-plugin.js +400 -0
- package/es/tasty/plugins/types.js +10 -0
- package/es/tasty/states/index.js +523 -0
- package/es/tasty/static/index.js +47 -0
- package/es/tasty/static/tastyStatic.js +55 -0
- package/es/tasty/static/types.js +34 -0
- package/es/tasty/styles/align.js +1 -1
- package/es/tasty/styles/border.js +2 -2
- package/es/tasty/styles/boxShadow.combinator.js +1 -1
- package/es/tasty/styles/color.js +3 -3
- package/es/tasty/styles/createStyle.js +3 -3
- package/es/tasty/styles/dimension.js +2 -2
- package/es/tasty/styles/display.js +1 -1
- package/es/tasty/styles/fade.js +2 -2
- package/es/tasty/styles/fill.js +11 -21
- 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 +2 -2
- package/es/tasty/styles/groupRadius.js +2 -2
- package/es/tasty/styles/height.js +2 -2
- package/es/tasty/styles/index.js +3 -3
- package/es/tasty/styles/inset.js +2 -2
- package/es/tasty/styles/justify.js +1 -1
- package/es/tasty/styles/list.js +1 -1
- package/es/tasty/styles/margin.js +76 -56
- package/es/tasty/styles/outline.js +2 -2
- package/es/tasty/styles/padding.js +76 -56
- package/es/tasty/styles/place.js +1 -1
- package/es/tasty/styles/predefined.js +28 -27
- package/es/tasty/styles/preset.js +2 -2
- package/es/tasty/styles/radius.js +5 -12
- package/es/tasty/styles/reset.js +3 -7
- package/es/tasty/styles/scrollbar.js +2 -2
- package/es/tasty/styles/shadow.js +2 -2
- package/es/tasty/styles/styledScrollbar.js +1 -1
- package/es/tasty/styles/transition.js +10 -3
- package/es/tasty/styles/types.js +1 -1
- package/es/tasty/styles/width.js +2 -2
- package/es/tasty/tasty.js +81 -122
- 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/isDevEnv.js +1 -1
- package/es/tasty/utils/mergeStyles.js +2 -2
- package/es/tasty/utils/modAttrs.js +3 -3
- package/es/tasty/utils/processTokens.js +88 -2
- package/es/tasty/utils/string.js +1 -1
- package/es/tasty/utils/styles.js +255 -22
- package/es/tasty/utils/typography.js +67 -0
- package/es/tasty/utils/warnings.js +1 -1
- package/es/tasty/zero/babel.js +453 -0
- package/es/tasty/zero/css-writer.js +94 -0
- package/es/tasty/zero/extractor.js +222 -0
- package/es/tasty/zero/index.js +28 -0
- package/es/tasty/zero/next.js +102 -0
- package/es/tokens/base.js +64 -0
- package/es/tokens/colors.js +68 -0
- package/es/tokens/index.js +63 -0
- package/es/tokens/layout.js +26 -0
- package/es/tokens/shadows.js +27 -0
- package/es/tokens/sizes.js +42 -0
- package/es/tokens/spacing.js +22 -0
- package/es/tokens/typography.js +237 -0
- package/es/utils/ResizeSensor.js +1 -1
- package/es/utils/index.js +10 -10
- package/es/utils/modules.js +1 -1
- package/es/utils/promise.js +1 -1
- package/es/utils/raf.js +1 -1
- package/es/utils/random.js +1 -1
- package/es/utils/range.js +1 -1
- package/es/utils/react/RenderCache.js +1 -1
- package/es/utils/react/Slots.js +2 -2
- package/es/utils/react/chain.js +1 -1
- package/es/utils/react/forwardRefWithGenerics.js +1 -1
- package/es/utils/react/index.js +17 -17
- 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 +4 -4
- package/es/utils/react/nullableValue.js +1 -1
- package/es/utils/react/resolveIcon.js +1 -1
- package/es/utils/react/sharedStore.js +2 -2
- package/es/utils/react/useCombinedRefs.js +1 -1
- package/es/utils/react/useControlledFocusVisible.js +2 -2
- package/es/utils/react/useEventBus.js +1 -1
- package/es/utils/react/useId.js +2 -2
- package/es/utils/react/useIsDarwin.js +1 -1
- package/es/utils/react/useKeySymbols.js +2 -2
- package/es/utils/react/useLayoutEffect.js +1 -1
- package/es/utils/react/useLocalStorage.js +2 -2
- 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/tree.js +1 -1
- package/es/utils/warnings.js +1 -1
- package/es/version.js +2 -2
- package/package.json +14 -4
- package/types/components/GlobalStyles.d.ts +2 -1
- package/types/components/HiddenInput.d.ts +828 -826
- package/types/components/Root.d.ts +1 -0
- package/types/components/actions/Button/Button.d.ts +1649 -1645
- package/types/components/actions/CommandMenu/styled.d.ts +4140 -4130
- package/types/components/actions/Menu/styled.d.ts +4893 -4883
- package/types/components/actions/use-action.d.ts +1 -1
- package/types/components/content/List/SectionHeading.d.ts +251 -251
- package/types/components/content/Text.d.ts +1487 -1487
- package/types/components/fields/DatePicker/DatePickerElement.d.ts +251 -251
- package/types/components/fields/Select/Select.d.ts +828 -826
- package/types/components/fields/Slider/elements.d.ts +4968 -4956
- package/types/components/status/Spin/Cube.d.ts +1 -1
- package/types/components/status/Spin/SpinsContainer.d.ts +6 -3
- package/types/index.d.ts +1 -4
- package/types/provider.d.ts +1 -2
- package/types/stories/components/StyledButton.d.ts +1 -1
- package/types/stories/playground/PlaygroundEditor.d.ts +6 -0
- package/types/stories/playground/PlaygroundLayout.d.ts +8 -0
- package/types/stories/playground/PlaygroundOutput.d.ts +5 -0
- package/types/stories/playground/PlaygroundPreview.d.ts +6 -0
- package/types/stories/playground/components/Button.d.ts +11 -0
- package/types/stories/playground/components/Card.d.ts +7 -0
- package/types/stories/playground/components/ScrollProgress.d.ts +5 -0
- package/types/stories/playground/examples.d.ts +7 -0
- package/types/tasty/chunks/cacheKey.d.ts +26 -0
- package/types/tasty/chunks/definitions.d.ts +75 -0
- package/types/tasty/chunks/index.d.ts +4 -0
- package/types/tasty/chunks/renderChunk.d.ts +25 -0
- package/types/tasty/config.d.ts +171 -0
- package/types/tasty/debug.d.ts +35 -0
- package/types/tasty/hooks/index.d.ts +4 -0
- package/types/tasty/hooks/useGlobalStyles.d.ts +22 -0
- package/types/tasty/hooks/useRawCSS.d.ts +50 -0
- package/types/tasty/hooks/useStyles.d.ts +35 -0
- package/types/tasty/index.d.ts +14 -4
- package/types/tasty/injector/index.d.ts +30 -19
- package/types/tasty/injector/injector.d.ts +19 -13
- package/types/tasty/injector/sheet-manager.d.ts +25 -1
- package/types/tasty/injector/types.d.ts +23 -2
- package/types/tasty/keyframes/index.d.ts +49 -0
- package/types/tasty/parser/parser.d.ts +4 -0
- package/types/tasty/parser/types.d.ts +1 -0
- package/types/tasty/pipeline/conditions.d.ts +243 -0
- package/types/tasty/pipeline/exclusive.d.ts +103 -0
- package/types/tasty/pipeline/index.d.ts +67 -0
- package/types/tasty/pipeline/materialize.d.ts +162 -0
- package/types/tasty/pipeline/parseStateKey.d.ts +20 -0
- package/types/tasty/pipeline/simplify.d.ts +28 -0
- package/types/tasty/plugins/index.d.ts +17 -0
- package/types/tasty/plugins/okhsl-plugin.d.ts +45 -0
- package/types/tasty/plugins/types.d.ts +34 -0
- package/types/tasty/states/index.d.ts +101 -0
- package/types/tasty/static/index.d.ts +39 -0
- package/types/tasty/static/tastyStatic.d.ts +41 -0
- package/types/tasty/static/types.d.ts +44 -0
- package/types/tasty/styles/fill.d.ts +11 -1
- package/types/tasty/styles/margin.d.ts +3 -1
- package/types/tasty/styles/padding.d.ts +3 -1
- package/types/tasty/styles/radius.d.ts +2 -10
- package/types/tasty/styles/types.d.ts +24 -3
- package/types/tasty/tasty.d.ts +892 -840
- package/types/tasty/utils/styles.d.ts +50 -6
- package/types/tasty/utils/typography.d.ts +32 -0
- package/types/tasty/zero/babel.d.ts +63 -0
- package/types/tasty/zero/css-writer.d.ts +41 -0
- package/types/tasty/zero/extractor.d.ts +40 -0
- package/types/tasty/zero/index.d.ts +18 -0
- package/types/tasty/zero/next.d.ts +57 -0
- package/types/tokens/base.d.ts +8 -0
- package/types/tokens/colors.d.ts +6 -0
- package/types/tokens/index.d.ts +41 -0
- package/types/tokens/layout.d.ts +7 -0
- package/types/tokens/shadows.d.ts +12 -0
- package/types/tokens/sizes.d.ts +25 -0
- package/types/tokens/spacing.d.ts +8 -0
- package/types/tokens/typography.d.ts +30 -0
- package/es/components/navigation/LegacyTabs/LegacyTabs.js +0 -275
- package/es/components/other/Base64Upload/Base64Upload.js +0 -103
- package/es/icons/add-new-icon.js +0 -129
- package/es/tasty/providers/BreakpointsProvider.js +0 -16
- package/es/tasty/utils/getModCombinations.js +0 -38
- package/es/tasty/utils/renderStyles.js +0 -1050
- package/es/tasty/utils/responsive.js +0 -60
- package/es/tokens.js +0 -309
- package/types/components/navigation/LegacyTabs/LegacyTabs.d.ts +0 -43
- package/types/components/other/Base64Upload/Base64Upload.d.ts +0 -5
- package/types/icons/add-new-icon.d.ts +0 -2
- package/types/tasty/providers/BreakpointsProvider.d.ts +0 -8
- package/types/tasty/utils/getModCombinations.d.ts +0 -9
- package/types/tasty/utils/renderStyles.d.ts +0 -41
- package/types/tasty/utils/responsive.d.ts +0 -8
- package/types/tokens.d.ts +0 -221
package/es/tasty/debug.js
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @license MIT
|
|
3
3
|
* author: Cube Dev Team
|
|
4
|
-
* @cube-dev/ui-kit v0.
|
|
4
|
+
* @cube-dev/ui-kit v0.99.0
|
|
5
5
|
* Released under the MIT license.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Debug utilities for inspecting tasty-generated CSS at runtime
|
|
10
10
|
*/
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
11
|
+
import { CHUNK_NAMES } from './chunks/definitions.js';
|
|
12
|
+
import { getCssTextForNode, injector } from './injector/index.js';
|
|
13
|
+
import { isDevEnv } from './utils/isDevEnv.js';
|
|
13
14
|
/**
|
|
14
15
|
* Pretty-print CSS with proper indentation and formatting
|
|
15
16
|
*/
|
|
@@ -246,6 +247,95 @@ function getPageStats(options) {
|
|
|
246
247
|
}
|
|
247
248
|
return { cssSize, ruleCount, stylesheetCount, skippedStylesheets };
|
|
248
249
|
}
|
|
250
|
+
// ============================================================================
|
|
251
|
+
// Chunk-aware helpers (for style chunking optimization)
|
|
252
|
+
// ============================================================================
|
|
253
|
+
/**
|
|
254
|
+
* Extract chunk name from a cache key.
|
|
255
|
+
*
|
|
256
|
+
* Cache keys have the format: "chunkName\0key:value\0key:value..."
|
|
257
|
+
* or "[states:...]\0chunkName\0..." for predefined states.
|
|
258
|
+
*
|
|
259
|
+
* @param cacheKey - The cache key to parse
|
|
260
|
+
* @returns The chunk name, or null if not found
|
|
261
|
+
*/
|
|
262
|
+
function extractChunkNameFromCacheKey(cacheKey) {
|
|
263
|
+
// Cache keys are separated by \0 (null character)
|
|
264
|
+
const parts = cacheKey.split('\0');
|
|
265
|
+
for (const part of parts) {
|
|
266
|
+
// Skip predefined states prefix
|
|
267
|
+
if (part.startsWith('[states:'))
|
|
268
|
+
continue;
|
|
269
|
+
// First non-states part that doesn't contain : is the chunk name
|
|
270
|
+
if (!part.includes(':') && part.length > 0) {
|
|
271
|
+
return part;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
return null;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Get chunk info for a className by reverse-looking up its cache key.
|
|
278
|
+
*
|
|
279
|
+
* @param className - The tasty class name (e.g., "t0", "t123")
|
|
280
|
+
* @param root - The document or shadow root to search in
|
|
281
|
+
* @returns Object with chunk name and cache key, or nulls if not found
|
|
282
|
+
*/
|
|
283
|
+
function getChunkForClassName(className, root = document) {
|
|
284
|
+
const registry = injector.instance['sheetManager']?.getRegistry(root);
|
|
285
|
+
if (!registry) {
|
|
286
|
+
return { chunkName: null, cacheKey: null };
|
|
287
|
+
}
|
|
288
|
+
// Reverse lookup: find the cache key for this className
|
|
289
|
+
for (const [cacheKey, cn] of registry.cacheKeyToClassName) {
|
|
290
|
+
if (cn === className) {
|
|
291
|
+
return {
|
|
292
|
+
chunkName: extractChunkNameFromCacheKey(cacheKey),
|
|
293
|
+
cacheKey,
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
return { chunkName: null, cacheKey: null };
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Get chunk breakdown statistics for all styles.
|
|
301
|
+
*
|
|
302
|
+
* @param root - The document or shadow root to search in
|
|
303
|
+
* @returns Object with breakdown by chunk type and totals
|
|
304
|
+
*/
|
|
305
|
+
function getChunkBreakdown(root = document) {
|
|
306
|
+
const registry = injector.instance['sheetManager']?.getRegistry(root);
|
|
307
|
+
if (!registry) {
|
|
308
|
+
return {
|
|
309
|
+
byChunk: {},
|
|
310
|
+
totalChunkTypes: 0,
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
const byChunk = {};
|
|
314
|
+
// Group classes by chunk
|
|
315
|
+
for (const [cacheKey, className] of registry.cacheKeyToClassName) {
|
|
316
|
+
const chunkName = extractChunkNameFromCacheKey(cacheKey) || 'unknown';
|
|
317
|
+
if (!byChunk[chunkName]) {
|
|
318
|
+
byChunk[chunkName] = { classes: [], cssSize: 0, ruleCount: 0 };
|
|
319
|
+
}
|
|
320
|
+
byChunk[chunkName].classes.push(className);
|
|
321
|
+
// Get CSS for this class
|
|
322
|
+
const css = injector.instance.getCssTextForClasses([className], { root });
|
|
323
|
+
byChunk[chunkName].cssSize += css.length;
|
|
324
|
+
byChunk[chunkName].ruleCount += (css.match(/\{[^}]*\}/g) || []).length;
|
|
325
|
+
}
|
|
326
|
+
// Sort classes within each chunk for consistency
|
|
327
|
+
for (const entry of Object.values(byChunk)) {
|
|
328
|
+
entry.classes.sort((a, b) => {
|
|
329
|
+
const aNum = parseInt(a.slice(1));
|
|
330
|
+
const bNum = parseInt(b.slice(1));
|
|
331
|
+
return aNum - bNum;
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
return {
|
|
335
|
+
byChunk,
|
|
336
|
+
totalChunkTypes: Object.keys(byChunk).length,
|
|
337
|
+
};
|
|
338
|
+
}
|
|
249
339
|
/**
|
|
250
340
|
* Concise tastyDebug API for inspecting styles at runtime
|
|
251
341
|
*/
|
|
@@ -316,6 +406,7 @@ export const tastyDebug = {
|
|
|
316
406
|
return {
|
|
317
407
|
element: null,
|
|
318
408
|
classes: [],
|
|
409
|
+
chunks: [],
|
|
319
410
|
css: '',
|
|
320
411
|
size: 0,
|
|
321
412
|
rules: 0,
|
|
@@ -325,12 +416,18 @@ export const tastyDebug = {
|
|
|
325
416
|
const tastyClasses = classList
|
|
326
417
|
.split(/\s+/)
|
|
327
418
|
.filter((cls) => /^t\d+$/.test(cls));
|
|
419
|
+
// Get chunk info for each tasty class
|
|
420
|
+
const chunks = tastyClasses.map((className) => ({
|
|
421
|
+
className,
|
|
422
|
+
chunkName: getChunkForClassName(className, root).chunkName,
|
|
423
|
+
}));
|
|
328
424
|
const css = getCssTextForNode(element, { root });
|
|
329
425
|
const prettifiedCSS = prettifyCSS(css);
|
|
330
426
|
const ruleCount = (css.match(/\{[^}]*\}/g) || []).length;
|
|
331
427
|
return {
|
|
332
428
|
element,
|
|
333
429
|
classes: tastyClasses,
|
|
430
|
+
chunks,
|
|
334
431
|
css: prettifiedCSS,
|
|
335
432
|
size: css.length,
|
|
336
433
|
rules: ruleCount,
|
|
@@ -370,7 +467,63 @@ export const tastyDebug = {
|
|
|
370
467
|
const { root } = opts || {};
|
|
371
468
|
injector.instance.resetMetrics({ root });
|
|
372
469
|
},
|
|
373
|
-
// 5)
|
|
470
|
+
// 5) Chunk breakdown (style chunking optimization)
|
|
471
|
+
/**
|
|
472
|
+
* Get breakdown of styles by chunk type.
|
|
473
|
+
*
|
|
474
|
+
* With style chunking enabled, styles are split into logical chunks
|
|
475
|
+
* (appearance, font, dimension, container, etc.) for better caching
|
|
476
|
+
* and CSS reuse.
|
|
477
|
+
*
|
|
478
|
+
* @param opts - Options including root document/shadow root
|
|
479
|
+
* @returns Breakdown by chunk type with class counts and CSS sizes
|
|
480
|
+
*/
|
|
481
|
+
chunks(opts) {
|
|
482
|
+
const { root = document, log = false } = opts || {};
|
|
483
|
+
const breakdown = getChunkBreakdown(root);
|
|
484
|
+
const totalClasses = Object.values(breakdown.byChunk).reduce((sum, entry) => sum + entry.classes.length, 0);
|
|
485
|
+
if (log) {
|
|
486
|
+
console.group('🧩 Style Chunk Breakdown');
|
|
487
|
+
// Define display order matching CHUNK_NAMES
|
|
488
|
+
const displayOrder = [
|
|
489
|
+
CHUNK_NAMES.COMBINED, // non-chunked styles (e.g., @starting-style)
|
|
490
|
+
CHUNK_NAMES.APPEARANCE,
|
|
491
|
+
CHUNK_NAMES.FONT,
|
|
492
|
+
CHUNK_NAMES.DIMENSION,
|
|
493
|
+
CHUNK_NAMES.CONTAINER,
|
|
494
|
+
CHUNK_NAMES.SCROLLBAR,
|
|
495
|
+
CHUNK_NAMES.POSITION,
|
|
496
|
+
CHUNK_NAMES.MISC,
|
|
497
|
+
CHUNK_NAMES.SUBCOMPONENTS,
|
|
498
|
+
];
|
|
499
|
+
// Show chunks in order
|
|
500
|
+
for (const chunkName of displayOrder) {
|
|
501
|
+
const data = breakdown.byChunk[chunkName];
|
|
502
|
+
if (data) {
|
|
503
|
+
const sizeStr = data.cssSize > 1024
|
|
504
|
+
? `${(data.cssSize / 1024).toFixed(1)}KB`
|
|
505
|
+
: `${data.cssSize}B`;
|
|
506
|
+
console.log(` • ${chunkName}: ${data.classes.length} classes, ${sizeStr}, ${data.ruleCount} rules`);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
// Show any unknown chunks
|
|
510
|
+
for (const [chunkName, data] of Object.entries(breakdown.byChunk)) {
|
|
511
|
+
if (!displayOrder.includes(chunkName)) {
|
|
512
|
+
const sizeStr = data.cssSize > 1024
|
|
513
|
+
? `${(data.cssSize / 1024).toFixed(1)}KB`
|
|
514
|
+
: `${data.cssSize}B`;
|
|
515
|
+
console.log(` • ${chunkName}: ${data.classes.length} classes, ${sizeStr}, ${data.ruleCount} rules`);
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
console.log(`📊 Total: ${totalClasses} classes across ${breakdown.totalChunkTypes} chunk types`);
|
|
519
|
+
console.groupEnd();
|
|
520
|
+
}
|
|
521
|
+
return {
|
|
522
|
+
...breakdown,
|
|
523
|
+
totalClasses,
|
|
524
|
+
};
|
|
525
|
+
},
|
|
526
|
+
// 6) Get CSS for specific global types
|
|
374
527
|
getGlobalTypeCSS(type, opts) {
|
|
375
528
|
const { root = document } = opts || {};
|
|
376
529
|
const registry = injector.instance['sheetManager']?.getRegistry(root);
|
|
@@ -565,6 +718,8 @@ export const tastyDebug = {
|
|
|
565
718
|
propertyCSSSize: Math.round(propertyData.size * scaleFactor),
|
|
566
719
|
};
|
|
567
720
|
}
|
|
721
|
+
// Get chunk breakdown
|
|
722
|
+
const chunkBreakdown = getChunkBreakdown(root);
|
|
568
723
|
const summary = {
|
|
569
724
|
activeClasses: cacheStatus.classes.active,
|
|
570
725
|
unusedClasses: cacheStatus.classes.unused,
|
|
@@ -591,6 +746,7 @@ export const tastyDebug = {
|
|
|
591
746
|
propertyCount: definitions.properties.length,
|
|
592
747
|
keyframeCount: definitions.keyframes.length,
|
|
593
748
|
cleanupSummary,
|
|
749
|
+
chunkBreakdown,
|
|
594
750
|
};
|
|
595
751
|
if (log) {
|
|
596
752
|
console.group('🎨 Comprehensive Tasty Debug Summary');
|
|
@@ -602,7 +758,7 @@ export const tastyDebug = {
|
|
|
602
758
|
console.log(` • Active CSS: ${summary.activeCSSSize} characters`);
|
|
603
759
|
console.log(` • Unused CSS: ${summary.unusedCSSSize} characters`);
|
|
604
760
|
console.log(` • Global CSS (injectGlobal): ${summary.globalCSSSize} characters (${summary.globalRuleCount} rules)`);
|
|
605
|
-
console.log(` • Raw CSS (
|
|
761
|
+
console.log(` • Raw CSS (injectRawCSS/useRawCSS): ${summary.rawCSSSize} characters (${summary.rawRuleCount} rules)`);
|
|
606
762
|
console.log(` • Keyframes CSS: ${summary.keyframesCSSSize} characters (${summary.keyframesRuleCount} rules)`);
|
|
607
763
|
console.log(` • Property CSS: ${summary.propertyCSSSize} characters (${summary.propertyRuleCount} rules)`);
|
|
608
764
|
// Show breakdown calculation
|
|
@@ -652,6 +808,30 @@ export const tastyDebug = {
|
|
|
652
808
|
: '0';
|
|
653
809
|
console.log(` • Overall cache hit rate: ${hitRate}%`);
|
|
654
810
|
}
|
|
811
|
+
// Show chunk breakdown
|
|
812
|
+
if (summary.chunkBreakdown.totalChunkTypes > 0) {
|
|
813
|
+
console.log('🧩 Style Chunk Breakdown:');
|
|
814
|
+
const displayOrder = [
|
|
815
|
+
CHUNK_NAMES.COMBINED, // non-chunked styles (e.g., @starting-style)
|
|
816
|
+
CHUNK_NAMES.APPEARANCE,
|
|
817
|
+
CHUNK_NAMES.FONT,
|
|
818
|
+
CHUNK_NAMES.DIMENSION,
|
|
819
|
+
CHUNK_NAMES.CONTAINER,
|
|
820
|
+
CHUNK_NAMES.SCROLLBAR,
|
|
821
|
+
CHUNK_NAMES.POSITION,
|
|
822
|
+
CHUNK_NAMES.MISC,
|
|
823
|
+
CHUNK_NAMES.SUBCOMPONENTS,
|
|
824
|
+
];
|
|
825
|
+
for (const chunkName of displayOrder) {
|
|
826
|
+
const data = summary.chunkBreakdown.byChunk[chunkName];
|
|
827
|
+
if (data) {
|
|
828
|
+
const sizeStr = data.cssSize > 1024
|
|
829
|
+
? `${(data.cssSize / 1024).toFixed(1)}KB`
|
|
830
|
+
: `${data.cssSize}B`;
|
|
831
|
+
console.log(` • ${chunkName}: ${data.classes.length} classes, ${sizeStr}, ${data.ruleCount} rules`);
|
|
832
|
+
}
|
|
833
|
+
}
|
|
834
|
+
}
|
|
655
835
|
console.log('🔍 Details:');
|
|
656
836
|
console.log(' • Active classes:', summary.activeClasses);
|
|
657
837
|
console.log(' • Unused classes:', summary.unusedClasses);
|
|
@@ -735,15 +915,15 @@ export const tastyDebug = {
|
|
|
735
915
|
console.groupEnd();
|
|
736
916
|
console.groupEnd();
|
|
737
917
|
},
|
|
738
|
-
//
|
|
918
|
+
// 12) Show help and usage examples
|
|
739
919
|
help() {
|
|
740
920
|
console.group('🎨 tastyDebug - Quick Start Guide');
|
|
741
921
|
console.log('💡 Essential commands:');
|
|
742
922
|
console.log(' • tastyDebug.summary({ log: true }) - comprehensive overview');
|
|
923
|
+
console.log(' • tastyDebug.chunks({ log: true }) - style chunk breakdown');
|
|
743
924
|
console.log(' • tastyDebug.log("active") - beautiful CSS display');
|
|
744
925
|
console.log(' • tastyDebug.css("active") - get active CSS');
|
|
745
|
-
console.log(' • tastyDebug.inspect(".my-element") -
|
|
746
|
-
console.log(' • tastyDebug.global({ log: true }) - global CSS analysis');
|
|
926
|
+
console.log(' • tastyDebug.inspect(".my-element") - element inspection with chunk info');
|
|
747
927
|
console.log(' • tastyDebug.cache() - cache status');
|
|
748
928
|
console.log(' • tastyDebug.defs() - defined properties & keyframes');
|
|
749
929
|
console.log(' • tastyDebug.pageCSS({ log: true }) - all page CSS');
|
|
@@ -752,7 +932,7 @@ export const tastyDebug = {
|
|
|
752
932
|
console.log(' • "all" - all tasty CSS + global CSS');
|
|
753
933
|
console.log(' • "active" - CSS for classes in DOM');
|
|
754
934
|
console.log(' • "unused" - CSS for classes with refCount = 0');
|
|
755
|
-
console.log(' • "global" - only global CSS (
|
|
935
|
+
console.log(' • "global" - only global CSS (injectGlobal)');
|
|
756
936
|
console.log(' • "page" - ALL page CSS (including non-tasty)');
|
|
757
937
|
console.log(' • "t123" - specific tasty class');
|
|
758
938
|
console.log(' • [".my-selector"] - CSS selector');
|
|
@@ -762,6 +942,12 @@ export const tastyDebug = {
|
|
|
762
942
|
console.log(' • { title: "Custom" } - custom title for log()');
|
|
763
943
|
console.log(' • { root: shadowRoot } - target Shadow DOM');
|
|
764
944
|
console.log(' • { prettify: false } - skip CSS formatting');
|
|
945
|
+
console.log('');
|
|
946
|
+
console.log('🧩 Style Chunking:');
|
|
947
|
+
console.log(' Elements have multiple classes (one per chunk: appearance, font, dimension, etc.)');
|
|
948
|
+
console.log(' • tastyDebug.chunks({ log: true }) - breakdown by chunk type');
|
|
949
|
+
console.log(' • tastyDebug.inspect() - shows which chunk each class belongs to');
|
|
950
|
+
console.log(' Chunk types: combined (non-chunked), appearance, font, dimension, container, scrollbar, position, misc, subcomponents');
|
|
765
951
|
console.groupEnd();
|
|
766
952
|
},
|
|
767
953
|
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license MIT
|
|
3
|
+
* author: Cube Dev Team
|
|
4
|
+
* @cube-dev/ui-kit v0.99.0
|
|
5
|
+
* Released under the MIT license.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export { useStyles } from './useStyles.js';
|
|
9
|
+
export { useGlobalStyles } from './useGlobalStyles.js';
|
|
10
|
+
export { useRawCSS } from './useRawCSS.js';
|
|
11
|
+
|
|
12
|
+
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license MIT
|
|
3
|
+
* author: Cube Dev Team
|
|
4
|
+
* @cube-dev/ui-kit v0.99.0
|
|
5
|
+
* Released under the MIT license.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { useInsertionEffect, useMemo, useRef } from 'react';
|
|
9
|
+
import { injectGlobal } from '../injector/index.js';
|
|
10
|
+
import { renderStyles } from '../pipeline/index.js';
|
|
11
|
+
/**
|
|
12
|
+
* Hook to inject global styles for a given selector.
|
|
13
|
+
* Useful for styling elements by selector without generating classNames.
|
|
14
|
+
*
|
|
15
|
+
* @param selector - CSS selector to apply styles to (e.g., '.my-class', ':root', 'body')
|
|
16
|
+
* @param styles - Tasty styles object
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```tsx
|
|
20
|
+
* function MyComponent() {
|
|
21
|
+
* useGlobalStyles('.card', {
|
|
22
|
+
* padding: '2x',
|
|
23
|
+
* radius: '1r',
|
|
24
|
+
* fill: '#white',
|
|
25
|
+
* });
|
|
26
|
+
*
|
|
27
|
+
* return <div className="card">Content</div>;
|
|
28
|
+
* }
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export function useGlobalStyles(selector, styles) {
|
|
32
|
+
const disposeRef = useRef(null);
|
|
33
|
+
// Render styles with the provided selector
|
|
34
|
+
// Note: renderStyles overload with selector string returns StyleResult[] directly
|
|
35
|
+
const styleResults = useMemo(() => {
|
|
36
|
+
if (!styles)
|
|
37
|
+
return [];
|
|
38
|
+
// Validate selector - empty string would cause renderStyles to return RenderResult instead of StyleResult[]
|
|
39
|
+
if (!selector) {
|
|
40
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
41
|
+
console.warn('[Tasty] useGlobalStyles: selector is required and cannot be empty. ' +
|
|
42
|
+
'Styles will not be injected.');
|
|
43
|
+
}
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
46
|
+
const result = renderStyles(styles, selector);
|
|
47
|
+
// When a non-empty selector is provided, renderStyles returns StyleResult[]
|
|
48
|
+
return result;
|
|
49
|
+
}, [styles, selector]);
|
|
50
|
+
// Inject as global styles
|
|
51
|
+
useInsertionEffect(() => {
|
|
52
|
+
disposeRef.current?.();
|
|
53
|
+
if (styleResults.length > 0) {
|
|
54
|
+
const { dispose } = injectGlobal(styleResults);
|
|
55
|
+
disposeRef.current = dispose;
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
disposeRef.current = null;
|
|
59
|
+
}
|
|
60
|
+
return () => {
|
|
61
|
+
disposeRef.current?.();
|
|
62
|
+
disposeRef.current = null;
|
|
63
|
+
};
|
|
64
|
+
}, [styleResults]);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license MIT
|
|
3
|
+
* author: Cube Dev Team
|
|
4
|
+
* @cube-dev/ui-kit v0.99.0
|
|
5
|
+
* Released under the MIT license.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { useInsertionEffect, useMemo, useRef } from 'react';
|
|
9
|
+
import { injectRawCSS } from '../injector/index.js';
|
|
10
|
+
// Implementation
|
|
11
|
+
export function useRawCSS(cssOrFactory, depsOrOptions, options) {
|
|
12
|
+
// Detect which overload is being used
|
|
13
|
+
const isFactory = typeof cssOrFactory === 'function';
|
|
14
|
+
// Parse arguments based on overload
|
|
15
|
+
const deps = isFactory && Array.isArray(depsOrOptions) ? depsOrOptions : undefined;
|
|
16
|
+
const opts = isFactory
|
|
17
|
+
? options
|
|
18
|
+
: depsOrOptions;
|
|
19
|
+
// Memoize CSS - for factory functions, use provided deps; for strings, use the string itself
|
|
20
|
+
const css = useMemo(() => isFactory ? cssOrFactory() : cssOrFactory, isFactory ? deps ?? [] : [cssOrFactory]);
|
|
21
|
+
const disposeRef = useRef(null);
|
|
22
|
+
useInsertionEffect(() => {
|
|
23
|
+
// Dispose previous injection if any
|
|
24
|
+
disposeRef.current?.();
|
|
25
|
+
if (!css.trim()) {
|
|
26
|
+
disposeRef.current = null;
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
// Inject new CSS
|
|
30
|
+
const { dispose } = injectRawCSS(css, opts);
|
|
31
|
+
disposeRef.current = dispose;
|
|
32
|
+
// Cleanup on unmount or when css changes
|
|
33
|
+
return () => {
|
|
34
|
+
disposeRef.current?.();
|
|
35
|
+
disposeRef.current = null;
|
|
36
|
+
};
|
|
37
|
+
}, [css, opts?.root]);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license MIT
|
|
3
|
+
* author: Cube Dev Team
|
|
4
|
+
* @cube-dev/ui-kit v0.99.0
|
|
5
|
+
* Released under the MIT license.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { useInsertionEffect, useMemo, useRef } from 'react';
|
|
9
|
+
import { categorizeStyleKeys, CHUNK_NAMES, generateChunkCacheKey, renderStylesForChunk, } from '../chunks/index.js';
|
|
10
|
+
import { getGlobalKeyframes, hasGlobalKeyframes } from '../config.js';
|
|
11
|
+
import { allocateClassName, inject, keyframes } from '../injector/index.js';
|
|
12
|
+
import { extractAnimationNamesFromStyles, extractLocalKeyframes, filterUsedKeyframes, hasLocalKeyframes, mergeKeyframes, replaceAnimationNames, } from '../keyframes/index.js';
|
|
13
|
+
import { renderStyles } from '../pipeline/index.js';
|
|
14
|
+
import { stringifyStyles } from '../utils/styles.js';
|
|
15
|
+
/**
|
|
16
|
+
* Check if styles contain @starting-style rules.
|
|
17
|
+
*
|
|
18
|
+
* @starting-style CSS cannot be applied via multiple class names because
|
|
19
|
+
* of cascade - later rules override earlier ones. When @starting is detected,
|
|
20
|
+
* we disable chunking and use a single class name for all styles.
|
|
21
|
+
*/
|
|
22
|
+
function containsStartingStyle(styleKey) {
|
|
23
|
+
return styleKey.includes('@starting');
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Get keyframes that are actually used in styles.
|
|
27
|
+
* Returns null if no keyframes are used (fast path for zero overhead).
|
|
28
|
+
*
|
|
29
|
+
* Optimization order:
|
|
30
|
+
* 1. Check if any keyframes are defined (local or global) - if not, return null
|
|
31
|
+
* 2. Extract animation names from styles - if none, return null
|
|
32
|
+
* 3. Merge and filter keyframes to only used ones
|
|
33
|
+
*/
|
|
34
|
+
function getUsedKeyframes(styles) {
|
|
35
|
+
// Fast path: no keyframes defined anywhere
|
|
36
|
+
const hasLocal = hasLocalKeyframes(styles);
|
|
37
|
+
const hasGlobal = hasGlobalKeyframes();
|
|
38
|
+
if (!hasLocal && !hasGlobal)
|
|
39
|
+
return null;
|
|
40
|
+
// Extract animation names from styles (not from rendered CSS - faster)
|
|
41
|
+
const usedNames = extractAnimationNamesFromStyles(styles);
|
|
42
|
+
if (usedNames.size === 0)
|
|
43
|
+
return null;
|
|
44
|
+
// Merge local and global keyframes
|
|
45
|
+
const local = hasLocal ? extractLocalKeyframes(styles) : null;
|
|
46
|
+
const global = hasGlobal ? getGlobalKeyframes() : null;
|
|
47
|
+
const allKeyframes = mergeKeyframes(local, global);
|
|
48
|
+
// Filter to only used keyframes
|
|
49
|
+
return filterUsedKeyframes(allKeyframes, usedNames);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Hook to generate CSS classes from Tasty styles.
|
|
53
|
+
* Handles style rendering, className allocation, and CSS injection.
|
|
54
|
+
*
|
|
55
|
+
* Uses chunking to split styles into logical groups for better caching
|
|
56
|
+
* and CSS reuse across components.
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* ```tsx
|
|
60
|
+
* function MyComponent() {
|
|
61
|
+
* const { className } = useStyles({
|
|
62
|
+
* padding: '2x',
|
|
63
|
+
* fill: '#purple',
|
|
64
|
+
* radius: '1r',
|
|
65
|
+
* });
|
|
66
|
+
*
|
|
67
|
+
* return <div className={className}>Styled content</div>;
|
|
68
|
+
* }
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
export function useStyles(styles) {
|
|
72
|
+
// Array of dispose functions for each chunk
|
|
73
|
+
const disposeRef = useRef([]);
|
|
74
|
+
// Store styles by their stringified key to avoid recomputing when only reference changes
|
|
75
|
+
const stylesRef = useRef({
|
|
76
|
+
key: '',
|
|
77
|
+
styles: undefined,
|
|
78
|
+
});
|
|
79
|
+
// Compute style key - this is a primitive string that captures style content
|
|
80
|
+
const styleKey = useMemo(() => {
|
|
81
|
+
if (!styles || Object.keys(styles).length === 0) {
|
|
82
|
+
return '';
|
|
83
|
+
}
|
|
84
|
+
return stringifyStyles(styles);
|
|
85
|
+
}, [styles]);
|
|
86
|
+
// Update ref when styleKey changes (content actually changed)
|
|
87
|
+
if (stylesRef.current.key !== styleKey) {
|
|
88
|
+
stylesRef.current = { key: styleKey, styles };
|
|
89
|
+
}
|
|
90
|
+
// Process chunks: categorize, generate cache keys, render, and allocate classNames
|
|
91
|
+
// Only depends on styleKey (primitive), not styles object reference
|
|
92
|
+
const processedChunks = useMemo(() => {
|
|
93
|
+
const currentStyles = stylesRef.current.styles;
|
|
94
|
+
if (!styleKey || !currentStyles) {
|
|
95
|
+
return [];
|
|
96
|
+
}
|
|
97
|
+
// Disable chunking for styles containing @starting-style rules.
|
|
98
|
+
// @starting-style CSS cannot work with multiple class names due to cascade -
|
|
99
|
+
// the rules would override each other instead of combining properly.
|
|
100
|
+
if (containsStartingStyle(styleKey)) {
|
|
101
|
+
const renderResult = renderStyles(currentStyles);
|
|
102
|
+
if (renderResult.rules.length === 0) {
|
|
103
|
+
return [];
|
|
104
|
+
}
|
|
105
|
+
const { className } = allocateClassName(styleKey);
|
|
106
|
+
return [
|
|
107
|
+
{
|
|
108
|
+
name: CHUNK_NAMES.COMBINED,
|
|
109
|
+
styleKeys: Object.keys(currentStyles),
|
|
110
|
+
cacheKey: styleKey,
|
|
111
|
+
renderResult,
|
|
112
|
+
className,
|
|
113
|
+
},
|
|
114
|
+
];
|
|
115
|
+
}
|
|
116
|
+
// Categorize style keys into chunks
|
|
117
|
+
const chunkMap = categorizeStyleKeys(currentStyles);
|
|
118
|
+
const chunks = [];
|
|
119
|
+
for (const [chunkName, chunkStyleKeys] of chunkMap) {
|
|
120
|
+
// Skip empty chunks
|
|
121
|
+
if (chunkStyleKeys.length === 0) {
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
// Generate cache key for this chunk
|
|
125
|
+
const cacheKey = generateChunkCacheKey(currentStyles, chunkName, chunkStyleKeys);
|
|
126
|
+
// Render styles for this chunk
|
|
127
|
+
const renderResult = renderStylesForChunk(currentStyles, chunkName, chunkStyleKeys);
|
|
128
|
+
// Skip chunks with no rules
|
|
129
|
+
if (renderResult.rules.length === 0) {
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
// Allocate className for this chunk (safe in render phase)
|
|
133
|
+
const { className } = allocateClassName(cacheKey);
|
|
134
|
+
chunks.push({
|
|
135
|
+
name: chunkName,
|
|
136
|
+
styleKeys: chunkStyleKeys,
|
|
137
|
+
cacheKey,
|
|
138
|
+
renderResult,
|
|
139
|
+
className,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
return chunks;
|
|
143
|
+
}, [styleKey]);
|
|
144
|
+
// Inject styles in insertion effect (avoids render phase side effects)
|
|
145
|
+
useInsertionEffect(() => {
|
|
146
|
+
// Cleanup all previous disposals
|
|
147
|
+
disposeRef.current.forEach((dispose) => dispose?.());
|
|
148
|
+
disposeRef.current = [];
|
|
149
|
+
// Fast path: no chunks to inject
|
|
150
|
+
if (processedChunks.length === 0) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
const currentStyles = stylesRef.current.styles;
|
|
154
|
+
// Get keyframes that are actually used (returns null if none - zero overhead)
|
|
155
|
+
const usedKeyframes = currentStyles
|
|
156
|
+
? getUsedKeyframes(currentStyles)
|
|
157
|
+
: null;
|
|
158
|
+
// Inject keyframes and build name map (only if we have keyframes)
|
|
159
|
+
let nameMap = null;
|
|
160
|
+
if (usedKeyframes) {
|
|
161
|
+
nameMap = new Map();
|
|
162
|
+
for (const [name, steps] of Object.entries(usedKeyframes)) {
|
|
163
|
+
const result = keyframes(steps, { name });
|
|
164
|
+
const injectedName = result.toString();
|
|
165
|
+
// Only add to map if name differs (optimization for replacement check)
|
|
166
|
+
if (injectedName !== name) {
|
|
167
|
+
nameMap.set(name, injectedName);
|
|
168
|
+
}
|
|
169
|
+
disposeRef.current.push(result.dispose);
|
|
170
|
+
}
|
|
171
|
+
// Clear map if no replacements needed
|
|
172
|
+
if (nameMap.size === 0) {
|
|
173
|
+
nameMap = null;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// Inject each chunk
|
|
177
|
+
for (const chunk of processedChunks) {
|
|
178
|
+
if (chunk.renderResult.rules.length > 0) {
|
|
179
|
+
// Replace animation names only if needed
|
|
180
|
+
const rulesToInject = nameMap
|
|
181
|
+
? chunk.renderResult.rules.map((rule) => ({
|
|
182
|
+
...rule,
|
|
183
|
+
declarations: replaceAnimationNames(rule.declarations, nameMap),
|
|
184
|
+
}))
|
|
185
|
+
: chunk.renderResult.rules;
|
|
186
|
+
const { dispose } = inject(rulesToInject, {
|
|
187
|
+
cacheKey: chunk.cacheKey,
|
|
188
|
+
});
|
|
189
|
+
disposeRef.current.push(dispose);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return () => {
|
|
193
|
+
disposeRef.current.forEach((dispose) => dispose?.());
|
|
194
|
+
disposeRef.current = [];
|
|
195
|
+
};
|
|
196
|
+
}, [processedChunks]);
|
|
197
|
+
// Combine all chunk classNames
|
|
198
|
+
const className = useMemo(() => {
|
|
199
|
+
return processedChunks.map((chunk) => chunk.className).join(' ');
|
|
200
|
+
}, [processedChunks]);
|
|
201
|
+
return {
|
|
202
|
+
className,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
|