@cube-dev/ui-kit 0.74.2 → 0.75.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/es/_internal/hooks/index.js +1 -1
- package/es/_internal/hooks/use-chained-callback.js +1 -1
- package/es/_internal/hooks/use-debounced-value.js +1 -1
- package/es/_internal/hooks/use-deprecation-warning.js +1 -1
- package/es/_internal/hooks/use-effect-once.js +1 -1
- package/es/_internal/hooks/use-event.js +1 -1
- package/es/_internal/hooks/use-is-first-render.js +1 -1
- package/es/_internal/hooks/use-sync-ref.js +1 -1
- package/es/_internal/hooks/use-timer/index.js +1 -1
- package/es/_internal/hooks/use-timer/timer.js +1 -1
- package/es/_internal/hooks/use-timer/use-timer.js +1 -1
- package/es/_internal/hooks/use-update-effect.js +1 -1
- package/es/_internal/hooks/use-warn.js +1 -1
- package/es/_internal/index.js +1 -1
- package/es/components/Block.js +1 -1
- package/es/components/GlobalStyles.js +10 -15
- package/es/components/GridProvider.js +1 -1
- package/es/components/HiddenInput.js +25 -24
- package/es/components/Item.js +1 -1
- package/es/components/OpenTrasition.js +1 -1
- package/es/components/Root.js +2 -2
- package/es/components/actions/Action/Action.js +15 -19
- package/es/components/actions/Button/Button.js +2 -1
- package/es/components/actions/Button/index.js +1 -1
- package/es/components/actions/ButtonGroup/ButtonGroup.js +1 -1
- package/es/components/actions/CommandMenu/CommandMenu.js +1 -1
- package/es/components/actions/CommandMenu/index.js +1 -1
- package/es/components/actions/CommandMenu/styled.js +1 -1
- package/es/components/actions/ItemButton/ItemButton.js +1 -1
- package/es/components/actions/ItemButton/index.js +1 -1
- package/es/components/actions/Menu/Menu.js +1 -1
- package/es/components/actions/Menu/MenuItem.js +3 -8
- package/es/components/actions/Menu/MenuSection.js +1 -1
- package/es/components/actions/Menu/MenuTrigger.js +1 -1
- package/es/components/actions/Menu/SubMenuTrigger.js +1 -1
- package/es/components/actions/Menu/SubmenuTriggerContext.js +1 -1
- package/es/components/actions/Menu/context.js +1 -1
- package/es/components/actions/Menu/index.js +1 -1
- package/es/components/actions/Menu/styled.js +1 -1
- package/es/components/actions/index.js +1 -1
- package/es/components/actions/use-action.js +1 -1
- package/es/components/actions/use-anchored-menu.js +1 -1
- package/es/components/actions/use-context-menu.js +1 -1
- package/es/components/content/ActiveZone/ActiveZone.js +1 -1
- package/es/components/content/Alert/Alert.js +1 -1
- package/es/components/content/Alert/index.js +1 -1
- package/es/components/content/Alert/types.js +1 -1
- package/es/components/content/Alert/use-alert.js +1 -1
- package/es/components/content/Avatar/Avatar.js +1 -1
- package/es/components/content/Badge/Badge.js +1 -1
- package/es/components/content/Card/Card.js +1 -1
- package/es/components/content/Content.js +1 -1
- package/es/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
- package/es/components/content/CopyPasteBlock/index.js +1 -1
- package/es/components/content/CopySnippet/CopySnippet.js +1 -1
- package/es/components/content/CopySnippet/index.js +1 -1
- package/es/components/content/Divider.js +1 -1
- package/es/components/content/Footer.js +1 -1
- package/es/components/content/Header.js +1 -1
- package/es/components/content/HotKeys/HotKeys.js +1 -1
- package/es/components/content/HotKeys/index.js +1 -1
- package/es/components/content/ItemBase/ItemBase.js +19 -15
- package/es/components/content/ItemBase/index.js +1 -1
- package/es/components/content/List/SectionHeading.js +1 -1
- package/es/components/content/List/index.js +1 -1
- package/es/components/content/Paragraph.js +1 -1
- package/es/components/content/Placeholder/Placeholder.js +46 -41
- package/es/components/content/PrismCode/PrismCode.js +1 -1
- package/es/components/content/PrismCode/prismSetup.js +1 -1
- package/es/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
- package/es/components/content/Result/Result.js +1 -1
- package/es/components/content/Skeleton/Skeleton.js +1 -1
- package/es/components/content/Tag/Tag.js +1 -1
- package/es/components/content/Text.js +3 -3
- package/es/components/content/Title.js +3 -3
- package/es/components/fields/Checkbox/Checkbox.js +1 -1
- package/es/components/fields/Checkbox/CheckboxGroup.js +1 -1
- package/es/components/fields/Checkbox/context.js +1 -1
- package/es/components/fields/Checkbox/index.js +1 -1
- package/es/components/fields/ComboBox/ComboBox.js +1 -1
- package/es/components/fields/ComboBox/index.js +1 -1
- package/es/components/fields/DatePicker/DateInput.js +1 -1
- package/es/components/fields/DatePicker/DateInputBase.js +1 -1
- package/es/components/fields/DatePicker/DatePicker.js +1 -1
- package/es/components/fields/DatePicker/DatePickerButton.js +1 -1
- package/es/components/fields/DatePicker/DatePickerElement.js +1 -1
- package/es/components/fields/DatePicker/DatePickerInput.js +1 -1
- package/es/components/fields/DatePicker/DatePickerSegment.js +1 -1
- package/es/components/fields/DatePicker/DateRangePicker.js +1 -1
- package/es/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
- package/es/components/fields/DatePicker/TimeInput.js +1 -1
- package/es/components/fields/DatePicker/index.js +1 -1
- package/es/components/fields/DatePicker/intl.js +1 -1
- package/es/components/fields/DatePicker/parseDate.js +1 -1
- package/es/components/fields/DatePicker/props.js +1 -1
- package/es/components/fields/DatePicker/types.js +1 -1
- package/es/components/fields/DatePicker/utils.js +1 -1
- package/es/components/fields/FileInput/FileInput.js +1 -1
- package/es/components/fields/FilterListBox/FilterListBox.js +1 -1
- package/es/components/fields/FilterListBox/index.js +1 -1
- package/es/components/fields/FilterPicker/FilterPicker.js +1 -1
- package/es/components/fields/FilterPicker/index.js +1 -1
- package/es/components/fields/Input/Input.js +1 -1
- package/es/components/fields/Input/index.js +1 -1
- package/es/components/fields/ListBox/ListBox.js +1 -1
- package/es/components/fields/ListBox/index.js +1 -1
- package/es/components/fields/NumberInput/NumberInput.js +1 -1
- package/es/components/fields/NumberInput/StepButton.js +1 -1
- package/es/components/fields/PasswordInput/PasswordInput.js +1 -1
- package/es/components/fields/RadioGroup/Radio.js +2 -2
- package/es/components/fields/RadioGroup/RadioGroup.js +1 -1
- package/es/components/fields/RadioGroup/context.js +1 -1
- package/es/components/fields/RadioGroup/index.js +1 -1
- package/es/components/fields/SearchInput/SearchInput.js +1 -1
- package/es/components/fields/SearchInput/index.js +1 -1
- package/es/components/fields/Select/Select.js +1 -1
- package/es/components/fields/Select/index.js +1 -1
- package/es/components/fields/Slider/Gradation.js +1 -1
- package/es/components/fields/Slider/Header.js +1 -1
- package/es/components/fields/Slider/RangeSlider.js +1 -1
- package/es/components/fields/Slider/Slider.js +1 -1
- package/es/components/fields/Slider/SliderBase.js +1 -1
- package/es/components/fields/Slider/SliderInput.js +1 -1
- package/es/components/fields/Slider/SliderThumb.js +1 -1
- package/es/components/fields/Slider/SliderTrack.js +1 -1
- package/es/components/fields/Slider/elements.js +1 -1
- package/es/components/fields/Slider/index.js +1 -1
- package/es/components/fields/Slider/types.js +1 -1
- package/es/components/fields/Switch/Switch.js +1 -1
- package/es/components/fields/Switch/index.js +1 -1
- package/es/components/fields/TextArea/TextArea.js +1 -1
- package/es/components/fields/TextArea/index.js +1 -1
- package/es/components/fields/TextInput/TextInput.js +1 -1
- package/es/components/fields/TextInput/TextInputBase.js +3 -2
- package/es/components/fields/TextInput/index.js +1 -1
- package/es/components/fields/TextInputMapper/TextInputMapper.js +1 -1
- package/es/components/fields/TextInputMapper/index.js +1 -1
- package/es/components/fields/index.js +1 -1
- package/es/components/form/FieldWrapper/FieldWrapper.js +1 -1
- package/es/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
- package/es/components/form/FieldWrapper/index.js +1 -1
- package/es/components/form/FieldWrapper/types.js +1 -1
- package/es/components/form/Form/Field.js +1 -1
- package/es/components/form/Form/Form.js +1 -1
- package/es/components/form/Form/ResetButton/ResetButton.js +1 -1
- package/es/components/form/Form/ResetButton/index.js +1 -1
- package/es/components/form/Form/SubmitButton/SubmitButton.js +1 -1
- package/es/components/form/Form/SubmitButton/index.js +1 -1
- package/es/components/form/Form/SubmitError.js +1 -1
- package/es/components/form/Form/index.js +1 -1
- package/es/components/form/Form/types.js +1 -1
- package/es/components/form/Form/use-field/index.js +1 -1
- package/es/components/form/Form/use-field/types.js +1 -1
- package/es/components/form/Form/use-field/use-field-props.js +1 -1
- package/es/components/form/Form/use-field/use-field.js +1 -1
- package/es/components/form/Form/use-form.js +1 -1
- package/es/components/form/Form/validation.js +1 -1
- package/es/components/form/Label.js +1 -1
- package/es/components/form/index.js +1 -1
- package/es/components/form/wrapper.js +1 -1
- package/es/components/layout/Flex.js +1 -1
- package/es/components/layout/Flow.js +1 -1
- package/es/components/layout/Grid.js +1 -1
- package/es/components/layout/Panel.js +1 -1
- package/es/components/layout/Prefix.js +1 -1
- package/es/components/layout/ResizablePanel.js +1 -1
- package/es/components/layout/Space.js +1 -1
- package/es/components/layout/Suffix.js +1 -1
- package/es/components/navigation/LegacyTabs/LegacyTabs.js +1 -1
- package/es/components/navigation/Link/Link.js +1 -1
- package/es/components/organisms/FileTabs/FileTabs.js +1 -1
- package/es/components/organisms/Modal/Modal.js +59 -68
- package/es/components/organisms/StatsCard/StatsCard.js +1 -1
- package/es/components/other/Base64Upload/Base64Upload.js +1 -1
- package/es/components/other/Calendar/Calendar.js +1 -1
- package/es/components/other/Calendar/CalendarCell.js +1 -1
- package/es/components/other/Calendar/CalendarGrid.js +1 -1
- package/es/components/other/Calendar/RangeCalendar.js +1 -1
- package/es/components/other/CloudLogo/CloudLogo.js +1 -1
- package/es/components/overlays/AlertDialog/AlertDialog.js +1 -1
- package/es/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
- package/es/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
- package/es/components/overlays/AlertDialog/index.js +1 -1
- package/es/components/overlays/AlertDialog/types.js +1 -1
- package/es/components/overlays/Dialog/Dialog.js +1 -1
- package/es/components/overlays/Dialog/DialogContainer.js +1 -1
- package/es/components/overlays/Dialog/DialogForm.js +1 -1
- package/es/components/overlays/Dialog/DialogTrigger.js +1 -1
- package/es/components/overlays/Dialog/context.js +1 -1
- package/es/components/overlays/Dialog/index.js +1 -1
- package/es/components/overlays/Dialog/use-dialog-container.js +1 -1
- package/es/components/overlays/Modal/Modal.js +1 -1
- package/es/components/overlays/Modal/OpenTransition.js +1 -1
- package/es/components/overlays/Modal/Overlay.js +1 -1
- package/es/components/overlays/Modal/Popover.js +1 -1
- package/es/components/overlays/Modal/Tray.js +1 -1
- package/es/components/overlays/Modal/Underlay.js +1 -1
- package/es/components/overlays/Modal/index.js +1 -1
- package/es/components/overlays/Modal/types.js +1 -1
- package/es/components/overlays/NewNotifications/Bar/FloatingNotification.js +1 -1
- package/es/components/overlays/NewNotifications/Bar/NotificationsBar.js +1 -1
- package/es/components/overlays/NewNotifications/Bar/TransitionComponent.js +1 -1
- package/es/components/overlays/NewNotifications/Bar/index.js +1 -1
- package/es/components/overlays/NewNotifications/Dialog/NotificationsDialogTrigger.js +1 -1
- package/es/components/overlays/NewNotifications/Dialog/index.js +1 -1
- package/es/components/overlays/NewNotifications/Notification.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationAction.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationCloseButton.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationDescription.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationFooter.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationHeader.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationIcon.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationProvider.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationView.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/index.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/types.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsContext/NotificationsContext.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsContext/NotificationsProvider.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsContext/index.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsContext/use-notifications.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsList/NotificationsList.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsList/NotificationsListItem.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsList/index.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsList/types.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/index.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/types.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/use-notification-list-item.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/use-notifications-api.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/use-notifications-list.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/use-notifications-observer.js +1 -1
- package/es/components/overlays/NewNotifications/index.js +1 -1
- package/es/components/overlays/NewNotifications/types.js +1 -1
- package/es/components/overlays/Notification/Notification.js +1 -1
- package/es/components/overlays/OverlayWrapper.js +1 -1
- package/es/components/overlays/Toasts/Toast.js +1 -1
- package/es/components/overlays/Toasts/index.js +1 -1
- package/es/components/overlays/Toasts/types.js +1 -1
- package/es/components/overlays/Toasts/use-toasts-api.js +1 -1
- package/es/components/overlays/Tooltip/Tooltip.js +1 -1
- package/es/components/overlays/Tooltip/TooltipProvider.js +1 -1
- package/es/components/overlays/Tooltip/TooltipTrigger.js +1 -1
- package/es/components/overlays/Tooltip/context.js +1 -1
- package/es/components/overlays/Tooltip/index.js +1 -1
- package/es/components/portal/Portal.js +1 -1
- package/es/components/portal/PortalProvider.js +1 -1
- package/es/components/portal/index.js +1 -1
- package/es/components/portal/types.js +1 -1
- package/es/components/portal/usePortal.js +1 -1
- package/es/components/shared/InvalidIcon.js +1 -1
- package/es/components/shared/ValidIcon.js +1 -1
- package/es/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
- package/es/components/status/LoadingAnimation/index.js +1 -1
- package/es/components/status/Spin/Cube.js +1 -1
- package/es/components/status/Spin/InternalSpinner.js +1 -1
- package/es/components/status/Spin/Spin.js +1 -1
- package/es/components/status/Spin/SpinsContainer.js +1 -1
- package/es/components/status/Spin/index.js +1 -1
- package/es/components/status/Spin/types.js +1 -1
- package/es/components/status/index.js +1 -1
- package/es/data/item-themes.js +1 -1
- package/es/data/themes.js +1 -1
- package/es/icons/AdjustmentsHorizontalIcon.js +1 -1
- package/es/icons/AdjustmentsIcon.js +1 -1
- package/es/icons/AiIcon.js +1 -1
- package/es/icons/AreaChartIcon.js +1 -1
- package/es/icons/BackwardIcon.js +1 -1
- package/es/icons/BarChartIcon.js +1 -1
- package/es/icons/BellFilledIcon.js +1 -1
- package/es/icons/BellIcon.js +1 -1
- package/es/icons/BooleanIcon.js +1 -1
- package/es/icons/CalendarEditIcon.js +1 -1
- package/es/icons/CalendarIcon.js +1 -1
- package/es/icons/CaretDownIcon.js +1 -1
- package/es/icons/CaretUpIcon.js +1 -1
- package/es/icons/ChartAreaStackedIcon.js +1 -1
- package/es/icons/ChartAreaStackedPercentageIcon.js +1 -1
- package/es/icons/ChartBarGroupedHorizontalIcon.js +1 -1
- package/es/icons/ChartBarGroupedIcon.js +1 -1
- package/es/icons/ChartBarHorizontalIcon.js +1 -1
- package/es/icons/ChartBarLineIcon.js +1 -1
- package/es/icons/ChartBarStackedHorizontalIcon.js +1 -1
- package/es/icons/ChartBarStackedIcon.js +1 -1
- package/es/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
- package/es/icons/ChartBarStackedPercentageIcon.js +1 -1
- package/es/icons/ChartBoxPlot2Icon.js +1 -1
- package/es/icons/ChartBoxPlotIcon.js +1 -1
- package/es/icons/ChartBubbleIcon.js +1 -1
- package/es/icons/ChartDonut2Icon.js +1 -1
- package/es/icons/ChartFunnelIcon.js +1 -1
- package/es/icons/ChartKPIIcon.js +1 -1
- package/es/icons/ChartPie2Icon.js +1 -1
- package/es/icons/ChartScatterIcon.js +1 -1
- package/es/icons/CheckCircleFilledIcon.js +1 -1
- package/es/icons/CheckCircleIcon.js +1 -1
- package/es/icons/CheckIcon.js +1 -1
- package/es/icons/CircleFilledIcon.js +1 -1
- package/es/icons/ClearIcon.js +1 -1
- package/es/icons/CloseCircleFilledIcon.js +1 -1
- package/es/icons/CloseCircleIcon.js +1 -1
- package/es/icons/CloseIcon.js +1 -1
- package/es/icons/CodeIcon.js +1 -1
- package/es/icons/CopyIcon.js +1 -1
- package/es/icons/CountIcon.js +1 -1
- package/es/icons/CubeIcon.js +1 -1
- package/es/icons/DangerIcon.js +1 -1
- package/es/icons/DashboardIcon.js +1 -1
- package/es/icons/DatabaseIcon.js +1 -1
- package/es/icons/DirectionIcon.js +1 -1
- package/es/icons/DonutIcon.js +1 -1
- package/es/icons/DownIcon.js +1 -1
- package/es/icons/EditIcon.js +1 -1
- package/es/icons/ExclamationCircleFilledIcon.js +1 -1
- package/es/icons/ExclamationCircleIcon.js +1 -1
- package/es/icons/ExclamationIcon.js +1 -1
- package/es/icons/EyeIcon.js +1 -1
- package/es/icons/EyeInvisibleIcon.js +1 -1
- package/es/icons/FilterIcon.js +1 -1
- package/es/icons/FolderFilledIcon.js +1 -1
- package/es/icons/FolderIcon.js +1 -1
- package/es/icons/FolderOpenFilledIcon.js +1 -1
- package/es/icons/FolderOpenIcon.js +1 -1
- package/es/icons/ForwardIcon.js +1 -1
- package/es/icons/HierarchyIcon.js +1 -1
- package/es/icons/Icon.js +1 -1
- package/es/icons/InfoCircleIcon.js +1 -1
- package/es/icons/InfoIcon.js +1 -1
- package/es/icons/KeyIcon.js +1 -1
- package/es/icons/LeftIcon.js +1 -1
- package/es/icons/LineChartIcon.js +1 -1
- package/es/icons/LoadingIcon.js +1 -1
- package/es/icons/LockFilledIcon.js +1 -1
- package/es/icons/LockIcon.js +1 -1
- package/es/icons/MoreIcon.js +1 -1
- package/es/icons/NotAllowedIcon.js +1 -1
- package/es/icons/NumberIcon.js +1 -1
- package/es/icons/PauseCircleFilledIcon.js +1 -1
- package/es/icons/PauseCircleIcon.js +1 -1
- package/es/icons/PauseIcon.js +1 -1
- package/es/icons/PieChartIcon.js +1 -1
- package/es/icons/PlayCircleIcon.js +1 -1
- package/es/icons/PlayIcon.js +1 -1
- package/es/icons/PlusIcon.js +1 -1
- package/es/icons/ReloadIcon.js +1 -1
- package/es/icons/ReportIcon.js +1 -1
- package/es/icons/ReturnIcon.js +1 -1
- package/es/icons/RightIcon.js +1 -1
- package/es/icons/SchemeIcon.js +1 -1
- package/es/icons/SearchIcon.js +1 -1
- package/es/icons/SettingsIcon.js +1 -1
- package/es/icons/ShieldFilledIcon.js +1 -1
- package/es/icons/ShieldIcon.js +1 -1
- package/es/icons/SlashIcon.js +1 -1
- package/es/icons/SparklesIcon.js +1 -1
- package/es/icons/SqlIcon.js +1 -1
- package/es/icons/StatsIcon.js +1 -1
- package/es/icons/StopIcon.js +1 -1
- package/es/icons/StringIcon.js +1 -1
- package/es/icons/SwitchIcon.js +1 -1
- package/es/icons/TableIcon.js +1 -1
- package/es/icons/ThumbsDownIcon.js +1 -1
- package/es/icons/ThumbsUpIcon.js +1 -1
- package/es/icons/ThunderboltCrossedIcon.js +1 -1
- package/es/icons/ThunderboltFilledIcon.js +1 -1
- package/es/icons/ThunderboltIcon.js +1 -1
- package/es/icons/TimeIcon.js +1 -1
- package/es/icons/UnlockIcon.js +1 -1
- package/es/icons/UpIcon.js +1 -1
- package/es/icons/UserGroupIcon.js +1 -1
- package/es/icons/UserIcon.js +1 -1
- package/es/icons/UserLockIcon.js +1 -1
- package/es/icons/ViewIcon.js +1 -1
- package/es/icons/WarningFilledIcon.js +1 -1
- package/es/icons/WarningIcon.js +1 -1
- package/es/icons/add-new-icon.js +1 -1
- package/es/icons/index.js +1 -1
- package/es/icons/wrap-icon.js +1 -1
- package/es/index.js +1 -1
- package/es/provider.js +1 -1
- package/es/providers/TrackingProvider.js +1 -1
- package/es/services/notification.js +1 -1
- package/es/shared/form.js +1 -1
- package/es/shared/index.js +1 -1
- package/es/stories/Form.legacy-stories.js +1 -1
- package/es/stories/FormFieldArgs.js +1 -1
- package/es/stories/Layout.stories.js +1 -1
- package/es/stories/Tasty.stories.js +1 -1
- package/es/stories/components/ConfirmDeletionDialogForm.js +1 -1
- package/es/stories/components/DialogFormApp.js +1 -1
- package/es/stories/components/StyledButton.js +1 -1
- package/es/stories/lists/baseProps.js +1 -2
- package/es/tasty/debug.js +906 -0
- package/es/tasty/index.js +3 -1
- package/es/tasty/injector/index.js +171 -0
- package/es/tasty/injector/injector.js +688 -0
- package/es/tasty/injector/sheet-manager.js +754 -0
- package/es/tasty/injector/types.js +10 -0
- package/es/tasty/parser/classify.js +1 -1
- package/es/tasty/parser/const.js +1 -1
- package/es/tasty/parser/lru.js +38 -2
- package/es/tasty/parser/parser.js +1 -1
- package/es/tasty/parser/tokenizer.js +1 -1
- package/es/tasty/parser/types.js +1 -1
- package/es/tasty/providers/BreakpointsProvider.js +1 -1
- package/es/tasty/styles/align.js +1 -1
- package/es/tasty/styles/border.js +1 -1
- package/es/tasty/styles/boxShadow.combinator.js +1 -1
- package/es/tasty/styles/color.js +8 -12
- package/es/tasty/styles/createStyle.js +19 -4
- package/es/tasty/styles/dimension.js +1 -1
- package/es/tasty/styles/display.js +1 -1
- package/es/tasty/styles/fade.js +1 -1
- package/es/tasty/styles/fill.js +6 -8
- package/es/tasty/styles/flow.js +1 -1
- package/es/tasty/styles/font.js +1 -1
- package/es/tasty/styles/fontStyle.js +1 -1
- package/es/tasty/styles/gap.js +1 -1
- package/es/tasty/styles/groupRadius.js +1 -1
- package/es/tasty/styles/height.js +1 -1
- package/es/tasty/styles/index.js +1 -1
- package/es/tasty/styles/inset.js +1 -1
- package/es/tasty/styles/justify.js +1 -1
- package/es/tasty/styles/list.js +1 -1
- package/es/tasty/styles/margin.js +1 -1
- package/es/tasty/styles/marginBlock.js +1 -1
- package/es/tasty/styles/marginInline.js +1 -1
- package/es/tasty/styles/outline.js +1 -1
- package/es/tasty/styles/padding.js +1 -1
- package/es/tasty/styles/paddingBlock.js +1 -1
- package/es/tasty/styles/paddingInline.js +1 -1
- package/es/tasty/styles/place.js +1 -1
- package/es/tasty/styles/predefined.js +1 -3
- package/es/tasty/styles/preset.js +1 -1
- package/es/tasty/styles/radius.js +1 -1
- package/es/tasty/styles/reset.js +40 -44
- package/es/tasty/styles/scrollbar.js +1 -1
- package/es/tasty/styles/shadow.js +1 -1
- package/es/tasty/styles/styledScrollbar.js +1 -1
- package/es/tasty/styles/transition.js +2 -1
- package/es/tasty/styles/types.js +1 -1
- package/es/tasty/styles/width.js +1 -1
- package/es/tasty/tasty.js +94 -20
- package/es/tasty/types.js +1 -1
- package/es/tasty/utils/cache-wrapper.js +1 -1
- package/es/tasty/utils/case-converter.js +1 -1
- package/es/tasty/utils/colors.js +1 -1
- package/es/tasty/utils/dotize.js +1 -1
- package/es/tasty/utils/filterBaseProps.js +1 -1
- package/es/tasty/utils/getDisplayName.js +1 -1
- package/es/tasty/utils/getModCombinations.js +26 -30
- package/es/tasty/utils/mergeStyles.js +1 -1
- package/es/tasty/utils/modAttrs.js +1 -1
- package/es/tasty/utils/renderStyles.js +670 -58
- package/es/tasty/utils/responsive.js +1 -7
- package/es/tasty/utils/string.js +1 -1
- package/es/tasty/utils/styles.js +62 -235
- package/es/tasty/utils/warnings.js +1 -1
- package/es/tokens.js +1 -12
- package/es/type-checks.js +1 -1
- package/es/utils/ResizeSensor.js +1 -1
- package/es/utils/modules.js +1 -1
- package/es/utils/promise.js +1 -1
- package/es/utils/random.js +1 -1
- package/es/utils/range.js +1 -1
- package/es/utils/react/Slots.js +1 -1
- package/es/utils/react/chain.js +1 -1
- package/es/utils/react/forwardRefWithGenerics.js +1 -1
- package/es/utils/react/index.js +1 -1
- package/es/utils/react/interactions.js +1 -1
- package/es/utils/react/isTextOnly.js +1 -1
- package/es/utils/react/mapProps.js +1 -1
- package/es/utils/react/mergeProps.js +1 -1
- package/es/utils/react/nullableValue.js +1 -1
- package/es/utils/react/sharedStore.js +1 -1
- package/es/utils/react/useCombinedRefs.js +1 -1
- package/es/utils/react/useControlledFocusVisible.js +1 -1
- package/es/utils/react/useEventBus.js +1 -1
- package/es/utils/react/useId.js +1 -1
- package/es/utils/react/useIsDarwin.js +1 -1
- package/es/utils/react/useKeySymbols.js +1 -1
- package/es/utils/react/useLayoutEffect.js +1 -1
- package/es/utils/react/useQaProps.js +1 -1
- package/es/utils/react/useViewportSize.js +1 -1
- package/es/utils/react/wrapNodeIfPlain.js +1 -1
- package/es/utils/transitions.js +1 -1
- package/es/utils/tree.js +1 -1
- package/es/utils/warnings.js +1 -1
- package/es/version.js +2 -2
- package/package.json +1 -1
- package/types/components/HiddenInput.d.ts +1 -3
- package/types/components/actions/Button/Button.d.ts +1 -0
- package/types/components/actions/Menu/styled.d.ts +702 -705
- package/types/components/actions/use-action.d.ts +1 -1
- package/types/components/content/List/SectionHeading.d.ts +234 -235
- package/types/components/fields/DatePicker/DatePickerElement.d.ts +234 -235
- package/types/tasty/debug.d.ts +250 -0
- package/types/tasty/index.d.ts +2 -0
- package/types/tasty/injector/index.d.ts +71 -0
- package/types/tasty/injector/injector.d.ts +109 -0
- package/types/tasty/injector/sheet-manager.d.ts +94 -0
- package/types/tasty/injector/types.d.ts +90 -0
- package/types/tasty/parser/lru.d.ts +5 -1
- package/types/tasty/styles/color.d.ts +3 -1
- package/types/tasty/styles/reset.d.ts +1 -2
- package/types/tasty/types.d.ts +0 -2
- package/types/tasty/utils/getModCombinations.d.ts +9 -1
- package/types/tasty/utils/renderStyles.d.ts +25 -7
- package/types/tasty/utils/responsive.d.ts +0 -1
- package/types/tasty/utils/styles.d.ts +6 -90
- package/types/tokens.d.ts +0 -11
@@ -1,15 +1,43 @@
|
|
1
1
|
/**
|
2
2
|
* @license MIT
|
3
3
|
* author: Cube Dev Team
|
4
|
-
* @cube-dev/ui-kit v0.
|
4
|
+
* @cube-dev/ui-kit v0.75.0
|
5
5
|
* Released under the MIT license.
|
6
6
|
*/
|
7
7
|
|
8
|
+
/**
|
9
|
+
* Style rendering that works with structured style objects
|
10
|
+
* Eliminates CSS string parsing for better performance
|
11
|
+
*/
|
12
|
+
import { Lru } from '../parser/lru';
|
8
13
|
import { createStyle, STYLE_HANDLER_MAP } from '../styles';
|
9
|
-
import {
|
14
|
+
import { getModCombinationsIterative } from './getModCombinations';
|
15
|
+
import { normalizeStyleZones, pointsToZones, } from './responsive';
|
16
|
+
import { computeState, getModSelector, styleStateMapToStyleStateDataList, } from './styles';
|
17
|
+
// Detect if a value is a state map whose entries contain responsive arrays
|
18
|
+
function stateMapHasResponsiveArrays(value) {
|
19
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
20
|
+
return false;
|
21
|
+
return Object.values(value).some((v) => Array.isArray(v));
|
22
|
+
}
|
23
|
+
// Normalize selector suffixes coming from `$` in style handler results.
|
24
|
+
// Some legacy handlers return suffixes starting with `&` (e.g. '& > *').
|
25
|
+
// The renderer expects suffixes without the ampersand because it adds
|
26
|
+
// the parent selector during materialization.
|
27
|
+
function normalizeDollarSelectorSuffix(suffix) {
|
28
|
+
if (!suffix)
|
29
|
+
return '';
|
30
|
+
return suffix.startsWith('&') ? suffix.slice(1) : suffix;
|
31
|
+
}
|
32
|
+
/**
|
33
|
+
* Check if a key represents a CSS selector
|
34
|
+
*/
|
10
35
|
export function isSelector(key) {
|
11
|
-
return key.startsWith('&') || key.startsWith('.') || key.match(/^[A-Z]/);
|
36
|
+
return (key.startsWith('&') || key.startsWith('.') || key.match(/^[A-Z]/) !== null);
|
12
37
|
}
|
38
|
+
/**
|
39
|
+
* Get the selector suffix for a key
|
40
|
+
*/
|
13
41
|
function getSelector(key) {
|
14
42
|
if (key.startsWith('&')) {
|
15
43
|
return key.slice(1);
|
@@ -22,41 +50,394 @@ function getSelector(key) {
|
|
22
50
|
}
|
23
51
|
return null;
|
24
52
|
}
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
53
|
+
// Cache for parsed attribute selectors with bounded size to prevent memory leaks
|
54
|
+
const attributeSelectorCache = new Lru(5000);
|
55
|
+
function parseAttributeSelector(selector) {
|
56
|
+
// Check cache first
|
57
|
+
const cached = attributeSelectorCache.get(selector);
|
58
|
+
if (cached !== undefined) {
|
59
|
+
return cached;
|
60
|
+
}
|
61
|
+
// Match patterns like [data-size="medium"] or [data-is-selected]
|
62
|
+
const match = selector.match(/^\[([^=\]]+)(?:="([^"]+)")?\]$/);
|
63
|
+
const result = match
|
64
|
+
? {
|
65
|
+
attribute: match[1],
|
66
|
+
value: match[2] || 'true', // Handle boolean attributes
|
67
|
+
fullSelector: selector,
|
68
|
+
}
|
69
|
+
: null;
|
70
|
+
// Cache the result
|
71
|
+
attributeSelectorCache.set(selector, result);
|
72
|
+
return result;
|
73
|
+
}
|
74
|
+
function hasConflictingAttributeSelectors(mods, parsedMods) {
|
75
|
+
const attributeMap = new Map();
|
76
|
+
for (const mod of mods) {
|
77
|
+
const parsed = parsedMods?.get(mod) ?? parseAttributeSelector(mod);
|
78
|
+
if (parsed && parsed.value !== 'true') {
|
79
|
+
if (!attributeMap.has(parsed.attribute)) {
|
80
|
+
attributeMap.set(parsed.attribute, []);
|
81
|
+
}
|
82
|
+
attributeMap.get(parsed.attribute).push(parsed.value);
|
83
|
+
}
|
84
|
+
}
|
85
|
+
// Check if any attribute has multiple values
|
86
|
+
for (const values of attributeMap.values()) {
|
87
|
+
if (values.length > 1)
|
88
|
+
return true;
|
89
|
+
}
|
90
|
+
return false;
|
91
|
+
}
|
92
|
+
/**
|
93
|
+
* Create a conflict checker function that uses precomputed attribute maps
|
94
|
+
* for efficient conflict detection during combination generation
|
95
|
+
*/
|
96
|
+
function createAttributeConflictChecker(parsedMods) {
|
97
|
+
return (combination) => hasConflictingAttributeSelectors(combination, parsedMods);
|
98
|
+
}
|
99
|
+
// Build precomputed attribute maps for efficient not selector optimization
|
100
|
+
function buildAttributeMaps(currentMods, allMods) {
|
101
|
+
const allAttributes = new Map();
|
102
|
+
const currentAttributes = new Map();
|
103
|
+
const parsedMods = new Map();
|
104
|
+
// Parse all mods once and cache results
|
105
|
+
const allModsSet = new Set([...currentMods, ...allMods]);
|
106
|
+
for (const mod of allModsSet) {
|
107
|
+
if (!parsedMods.has(mod)) {
|
108
|
+
parsedMods.set(mod, parseAttributeSelector(mod));
|
109
|
+
}
|
110
|
+
}
|
111
|
+
// Build map of all possible values for each attribute
|
112
|
+
for (const mod of allMods) {
|
113
|
+
const parsed = parsedMods.get(mod);
|
114
|
+
if (parsed && parsed.value !== 'true') {
|
115
|
+
if (!allAttributes.has(parsed.attribute)) {
|
116
|
+
allAttributes.set(parsed.attribute, new Set());
|
117
|
+
}
|
118
|
+
allAttributes.get(parsed.attribute).add(parsed.value);
|
119
|
+
}
|
120
|
+
}
|
121
|
+
// Build map of current mod attribute values
|
122
|
+
for (const mod of currentMods) {
|
123
|
+
const parsed = parsedMods.get(mod);
|
124
|
+
if (parsed && parsed.value !== 'true') {
|
125
|
+
currentAttributes.set(parsed.attribute, parsed.value);
|
126
|
+
}
|
127
|
+
}
|
128
|
+
return { allAttributes, currentAttributes, parsedMods };
|
129
|
+
}
|
130
|
+
function optimizeNotSelectors(currentMods, allMods, precomputedMaps) {
|
131
|
+
const maps = precomputedMaps || buildAttributeMaps(currentMods, allMods);
|
132
|
+
const notMods = allMods.filter((mod) => !currentMods.includes(mod));
|
133
|
+
const optimizedNotMods = [];
|
134
|
+
for (const mod of notMods) {
|
135
|
+
const parsed = maps.parsedMods.get(mod);
|
136
|
+
if (parsed && parsed.value !== 'true') {
|
137
|
+
// If we already have a value for this attribute, skip this not selector
|
138
|
+
// because it's already mutually exclusive
|
139
|
+
if (maps.currentAttributes.has(parsed.attribute)) {
|
140
|
+
continue;
|
141
|
+
}
|
142
|
+
}
|
143
|
+
optimizedNotMods.push(mod);
|
144
|
+
}
|
145
|
+
return optimizedNotMods;
|
146
|
+
}
|
147
|
+
/**
|
148
|
+
* Explode a style handler result into logical rules with proper mapping
|
149
|
+
* Phase 1: Handler fan-out ($ selectors, arrays)
|
150
|
+
* Phase 2: Responsive fan-out (breakpoint arrays)
|
151
|
+
* Phase 3: Rule materialization
|
152
|
+
*/
|
153
|
+
function explodeHandlerResult(result, zones, selectorSuffix = '', forceBreakpointIdx, responsiveOrigin = false) {
|
154
|
+
if (!result)
|
155
|
+
return [];
|
156
|
+
// Phase 1: Handler fan-out - normalize to array
|
157
|
+
const resultArray = Array.isArray(result) ? result : [result];
|
158
|
+
const logicalRules = [];
|
159
|
+
for (const item of resultArray) {
|
160
|
+
if (!item || typeof item !== 'object')
|
161
|
+
continue;
|
162
|
+
const { $, ...styleProps } = item;
|
163
|
+
// Phase 2: Responsive fan-out - handle array values
|
164
|
+
const breakpointGroups = new Map();
|
165
|
+
if (forceBreakpointIdx !== undefined) {
|
166
|
+
// When breakpoint is forced (from responsive processing), use all props for that breakpoint
|
167
|
+
const group = {};
|
168
|
+
for (const [prop, value] of Object.entries(styleProps)) {
|
169
|
+
if (value != null && value !== '') {
|
170
|
+
group[prop] = String(value);
|
171
|
+
}
|
172
|
+
}
|
173
|
+
if (Object.keys(group).length > 0) {
|
174
|
+
breakpointGroups.set(forceBreakpointIdx, group);
|
175
|
+
}
|
176
|
+
}
|
177
|
+
else {
|
178
|
+
// Normal processing - handle responsive arrays
|
179
|
+
const responsiveProps = [];
|
180
|
+
for (const [prop, value] of Object.entries(styleProps)) {
|
181
|
+
if (Array.isArray(value)) {
|
182
|
+
// Responsive array - create entry for each breakpoint
|
183
|
+
value.forEach((val, idx) => {
|
184
|
+
if (val != null && val !== '' && idx < zones.length) {
|
185
|
+
responsiveProps.push({ prop, value: val, breakpointIdx: idx });
|
186
|
+
}
|
187
|
+
});
|
188
|
+
}
|
189
|
+
else if (value != null && value !== '') {
|
190
|
+
// Single value - goes to base breakpoint
|
191
|
+
responsiveProps.push({ prop, value, breakpointIdx: 0 });
|
192
|
+
}
|
193
|
+
}
|
194
|
+
// Group by breakpoint index
|
195
|
+
for (const { prop, value, breakpointIdx } of responsiveProps) {
|
196
|
+
const group = breakpointGroups.get(breakpointIdx) || {};
|
197
|
+
group[prop] = String(value);
|
198
|
+
breakpointGroups.set(breakpointIdx, group);
|
199
|
+
}
|
200
|
+
}
|
201
|
+
// Phase 3: Selector fan-out - handle $ suffixes
|
202
|
+
// IMPORTANT: If we are already in a pseudo-element context (contains '::'),
|
203
|
+
// CSS does not allow further descendant/child selectors (e.g., '>*') after
|
204
|
+
// a pseudo-element. In such cases we must ignore only the `$`-derived
|
205
|
+
// selectors while still preserving base declarations for the current
|
206
|
+
// selector. Previously this branch returned early and accidentally dropped
|
207
|
+
// all declarations computed before, including valid base ones.
|
208
|
+
const inPseudoElementContext = selectorSuffix.includes('::');
|
209
|
+
if (inPseudoElementContext && $) {
|
210
|
+
// Skip this item entirely to avoid producing invalid selectors like
|
211
|
+
// `.t0::before>*`. Other items (without $) in the same handler result
|
212
|
+
// will still be processed and preserved.
|
213
|
+
continue;
|
214
|
+
}
|
215
|
+
const suffixes = $
|
216
|
+
? (Array.isArray($) ? $ : [$]).map((s) => selectorSuffix + normalizeDollarSelectorSuffix(String(s)))
|
217
|
+
: [selectorSuffix];
|
218
|
+
// Early identical-breakpoint coalescing: skip duplicate declarations
|
219
|
+
const seenDeclarations = new Map();
|
220
|
+
// Process breakpoints in order to prefer lower breakpoint indices
|
221
|
+
const sortedBreakpoints = Array.from(breakpointGroups.entries()).sort(([a], [b]) => a - b);
|
222
|
+
for (const [breakpointIdx, declarations] of sortedBreakpoints) {
|
223
|
+
if (Object.keys(declarations).length === 0)
|
224
|
+
continue;
|
225
|
+
// Create a stable hash key for identical declarations
|
226
|
+
const declarationKeys = Object.keys(declarations).sort();
|
227
|
+
const declarationHash = declarationKeys
|
228
|
+
.map((key) => `${key}:${declarations[key]}`)
|
229
|
+
.join(';');
|
230
|
+
const existingBreakpointIdx = seenDeclarations.get(declarationHash);
|
231
|
+
if (existingBreakpointIdx !== undefined) {
|
232
|
+
// Skip this breakpoint as it has identical declarations to a previous one
|
233
|
+
// The CSS cascade will handle the responsive behavior correctly
|
234
|
+
continue;
|
235
|
+
}
|
236
|
+
// Mark this declaration set as seen
|
237
|
+
seenDeclarations.set(declarationHash, breakpointIdx);
|
238
|
+
// Create logical rules for this unique declaration set
|
239
|
+
for (const suffix of suffixes) {
|
240
|
+
logicalRules.push({
|
241
|
+
selectorSuffix: suffix,
|
242
|
+
breakpointIdx,
|
243
|
+
declarations,
|
244
|
+
responsiveSource: responsiveOrigin || forceBreakpointIdx !== undefined,
|
245
|
+
});
|
246
|
+
}
|
247
|
+
}
|
248
|
+
}
|
249
|
+
return logicalRules;
|
250
|
+
}
|
251
|
+
/**
|
252
|
+
* Convert handler result (CSSMap) to CSS string for global injection
|
253
|
+
*/
|
254
|
+
function convertHandlerResultToCSS(result, selectorSuffix = '') {
|
255
|
+
if (!result)
|
256
|
+
return '';
|
257
|
+
if (Array.isArray(result)) {
|
258
|
+
const fragments = [];
|
259
|
+
for (const item of result) {
|
260
|
+
const itemCSS = convertHandlerResultToCSS(item, selectorSuffix);
|
261
|
+
if (itemCSS) {
|
262
|
+
fragments.push(itemCSS);
|
263
|
+
}
|
264
|
+
}
|
265
|
+
return fragments.join('');
|
266
|
+
}
|
267
|
+
const { $, css, ...styleProps } = result;
|
268
|
+
const styleFragments = [];
|
269
|
+
// Process style properties using array accumulation
|
270
|
+
for (const [styleName, value] of Object.entries(styleProps)) {
|
271
|
+
if (Array.isArray(value)) {
|
272
|
+
// Handle array values
|
273
|
+
for (const val of value) {
|
274
|
+
if (val) {
|
275
|
+
styleFragments.push(`${styleName}: ${val};\n`);
|
276
|
+
}
|
277
|
+
}
|
278
|
+
}
|
279
|
+
else if (value) {
|
280
|
+
// Handle single values
|
281
|
+
styleFragments.push(`${styleName}: ${value};\n`);
|
282
|
+
}
|
283
|
+
}
|
284
|
+
let renderedStyles = styleFragments.join('');
|
285
|
+
if (css) {
|
286
|
+
renderedStyles = css + '\n' + renderedStyles;
|
287
|
+
}
|
288
|
+
if (!renderedStyles) {
|
289
|
+
return '';
|
290
|
+
}
|
291
|
+
const finalSelectorSuffix = selectorSuffix || '';
|
292
|
+
if (Array.isArray($)) {
|
293
|
+
const ruleFragments = [];
|
294
|
+
for (const suffix of $) {
|
295
|
+
const normalized = suffix
|
296
|
+
? normalizeDollarSelectorSuffix(String(suffix))
|
297
|
+
: '';
|
298
|
+
ruleFragments.push(`&${finalSelectorSuffix}${normalized}{\n${renderedStyles}}\n`);
|
299
|
+
}
|
300
|
+
return ruleFragments.join('');
|
301
|
+
}
|
302
|
+
const normalizedSingle = $ ? normalizeDollarSelectorSuffix(String($)) : '';
|
303
|
+
return `&${finalSelectorSuffix}${normalizedSingle}{\n${renderedStyles}}\n`;
|
304
|
+
}
|
31
305
|
/**
|
32
|
-
*
|
33
|
-
* @param styles - Complete style props.
|
34
|
-
* @param responsive - A list of responsive zones
|
35
|
-
* @param {string} [suffix]
|
36
|
-
* @return {string}
|
306
|
+
* Convert logical rules to final StyleResult format
|
37
307
|
*/
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
308
|
+
function materializeRules(logicalRules, className, zones) {
|
309
|
+
return logicalRules.map((rule) => {
|
310
|
+
const selector = `.${className}${rule.selectorSuffix}`;
|
311
|
+
const declarations = Object.entries(rule.declarations)
|
312
|
+
.map(([prop, value]) => `${prop}: ${value};`)
|
313
|
+
.join(' ');
|
314
|
+
const q = rule.breakpointIdx > 0
|
315
|
+
? zones[rule.breakpointIdx]?.mediaQuery
|
316
|
+
: rule.responsiveSource
|
317
|
+
? zones[0]?.mediaQuery
|
318
|
+
: undefined;
|
319
|
+
const atRules = q ? [`@media ${q}`] : undefined;
|
320
|
+
return {
|
321
|
+
selector,
|
322
|
+
declarations,
|
323
|
+
atRules,
|
324
|
+
};
|
325
|
+
});
|
326
|
+
}
|
327
|
+
/**
|
328
|
+
* Core style processing logic that generates logical rules
|
329
|
+
* Used by the unified renderStyles function
|
330
|
+
*/
|
331
|
+
function generateLogicalRules(styles, responsive = [], parentSuffix = '') {
|
332
|
+
const zones = pointsToZones(responsive || []);
|
333
|
+
const allLogicalRules = [];
|
334
|
+
// Cache for normalizeStyleZones results to avoid repeated computation
|
335
|
+
// WeakMap allows automatic cleanup when arrays are garbage collected
|
336
|
+
const normalizeCache = new WeakMap();
|
337
|
+
// Helper function to get cached normalizeStyleZones result
|
338
|
+
function cachedNormalizeStyleZones(value, zoneNumber) {
|
339
|
+
// Only cache for arrays - other types are fast to process
|
340
|
+
if (!Array.isArray(value)) {
|
341
|
+
return normalizeStyleZones(value, zoneNumber);
|
342
|
+
}
|
343
|
+
// Check if we have a cache for this array reference
|
344
|
+
let zoneCache = normalizeCache.get(value);
|
345
|
+
if (!zoneCache) {
|
346
|
+
zoneCache = new Map();
|
347
|
+
normalizeCache.set(value, zoneCache);
|
348
|
+
}
|
349
|
+
// Check if we have a cached result for this zone count
|
350
|
+
let result = zoneCache.get(zoneNumber);
|
351
|
+
if (result === undefined) {
|
352
|
+
result = normalizeStyleZones(value, zoneNumber);
|
353
|
+
zoneCache.set(zoneNumber, result);
|
354
|
+
}
|
355
|
+
return result;
|
356
|
+
}
|
357
|
+
// Local versions of helpers that leverage cachedNormalizeStyleZones
|
358
|
+
function stateMapToArrayOfStateMapsLocal(value, zoneNumber) {
|
359
|
+
// Short-circuit for single zone - avoid array allocation
|
360
|
+
if (zoneNumber === 1) {
|
361
|
+
const singleMap = {};
|
362
|
+
for (const [state, stateValue] of Object.entries(value)) {
|
363
|
+
if (Array.isArray(stateValue)) {
|
364
|
+
// Take the first value from the array or null if empty
|
365
|
+
singleMap[state] = stateValue.length > 0 ? stateValue[0] : null;
|
366
|
+
}
|
367
|
+
else {
|
368
|
+
singleMap[state] = stateValue;
|
369
|
+
}
|
370
|
+
}
|
371
|
+
return [singleMap];
|
372
|
+
}
|
373
|
+
const result = Array.from({ length: zoneNumber }, () => ({}));
|
374
|
+
for (const [state, stateValue] of Object.entries(value)) {
|
375
|
+
const perZone = Array.isArray(stateValue)
|
376
|
+
? cachedNormalizeStyleZones(stateValue, zoneNumber)
|
377
|
+
: Array(zoneNumber).fill(stateValue);
|
378
|
+
for (let i = 0; i < zoneNumber; i++) {
|
379
|
+
const v = perZone[i];
|
380
|
+
result[i][state] = v;
|
381
|
+
}
|
382
|
+
}
|
383
|
+
return result;
|
384
|
+
}
|
385
|
+
function normalizeArrayWithStateMapsLocal(valueArray, zoneNumber) {
|
386
|
+
// Short-circuit for single zone - avoid array propagation and mapping
|
387
|
+
if (zoneNumber === 1) {
|
388
|
+
const firstEntry = valueArray.length > 0 ? valueArray[0] : null;
|
389
|
+
if (firstEntry &&
|
390
|
+
typeof firstEntry === 'object' &&
|
391
|
+
!Array.isArray(firstEntry)) {
|
392
|
+
return [firstEntry];
|
393
|
+
}
|
394
|
+
return [{ '': firstEntry }];
|
395
|
+
}
|
396
|
+
const propagated = cachedNormalizeStyleZones(valueArray, zoneNumber);
|
397
|
+
// Trim trailing null/undefined entries to reduce processing
|
398
|
+
let lastNonNullIndex = propagated.length - 1;
|
399
|
+
while (lastNonNullIndex >= 0 && propagated[lastNonNullIndex] == null) {
|
400
|
+
lastNonNullIndex--;
|
401
|
+
}
|
402
|
+
// If all entries are null, return minimal array
|
403
|
+
if (lastNonNullIndex < 0) {
|
404
|
+
return Array.from({ length: zoneNumber }, () => ({ '': null }));
|
405
|
+
}
|
406
|
+
// Process only up to the last non-null entry, then fill the rest with the last value
|
407
|
+
const result = [];
|
408
|
+
let lastProcessedEntry = null;
|
409
|
+
for (let i = 0; i <= lastNonNullIndex; i++) {
|
410
|
+
const entry = propagated[i];
|
411
|
+
let processedEntry;
|
412
|
+
if (entry && typeof entry === 'object' && !Array.isArray(entry)) {
|
413
|
+
processedEntry = entry;
|
414
|
+
}
|
415
|
+
else {
|
416
|
+
processedEntry = { '': entry };
|
417
|
+
}
|
418
|
+
result.push(processedEntry);
|
419
|
+
lastProcessedEntry = processedEntry;
|
420
|
+
}
|
421
|
+
// Fill remaining slots with the last processed entry (CSS cascade behavior)
|
422
|
+
for (let i = lastNonNullIndex + 1; i < zoneNumber; i++) {
|
423
|
+
result.push(lastProcessedEntry || { '': null });
|
424
|
+
}
|
425
|
+
return result;
|
426
|
+
}
|
427
|
+
// Process styles recursively, preserving mod selectors and combining with nested selector suffixes
|
428
|
+
function processStyles(currentStyles, parentSuffix = '') {
|
429
|
+
const keys = Object.keys(currentStyles || {});
|
52
430
|
const selectorKeys = keys.filter((key) => isSelector(key));
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
}
|
431
|
+
// Recurse into nested selectors first to compute proper suffix chaining
|
432
|
+
for (const key of selectorKeys) {
|
433
|
+
const suffix = getSelector(key);
|
434
|
+
if (suffix && currentStyles[key]) {
|
435
|
+
processStyles(currentStyles[key], `${parentSuffix}${suffix}`);
|
436
|
+
}
|
59
437
|
}
|
438
|
+
// Build handler queue for style properties at this level
|
439
|
+
const handlerQueue = [];
|
440
|
+
const seenHandlers = new Set();
|
60
441
|
keys.forEach((styleName) => {
|
61
442
|
if (isSelector(styleName))
|
62
443
|
return;
|
@@ -64,40 +445,54 @@ export function renderStyles(styles, responsive = [], suffix) {
|
|
64
445
|
if (!handlers) {
|
65
446
|
handlers = STYLE_HANDLER_MAP[styleName] = [createStyle(styleName)];
|
66
447
|
}
|
67
|
-
handlers.forEach((
|
68
|
-
if (
|
448
|
+
handlers.forEach((handler) => {
|
449
|
+
if (seenHandlers.has(handler)) {
|
69
450
|
return;
|
451
|
+
}
|
452
|
+
seenHandlers.add(handler);
|
70
453
|
let isResponsive = false;
|
71
|
-
const lookupStyles =
|
454
|
+
const lookupStyles = handler.__lookupStyles;
|
72
455
|
const filteredStyleMap = lookupStyles.reduce((map, name) => {
|
73
|
-
|
74
|
-
if (
|
75
|
-
|
76
|
-
|
456
|
+
const value = currentStyles?.[name];
|
457
|
+
if (value !== undefined) {
|
458
|
+
// Case 1: state-map-of-arrays → array-of-state-maps
|
459
|
+
if (value &&
|
460
|
+
typeof value === 'object' &&
|
461
|
+
!Array.isArray(value) &&
|
462
|
+
stateMapHasResponsiveArrays(value)) {
|
463
|
+
map[name] = stateMapToArrayOfStateMapsLocal(value, zones.length);
|
464
|
+
isResponsive = true;
|
77
465
|
}
|
78
|
-
else {
|
79
|
-
|
80
|
-
|
466
|
+
else if (Array.isArray(value)) {
|
467
|
+
// Case 2: array that may contain state maps → normalize to array-of-state-maps
|
468
|
+
if (value.length > 0) {
|
469
|
+
map[name] = normalizeArrayWithStateMapsLocal(value, zones.length);
|
470
|
+
isResponsive = true;
|
81
471
|
}
|
82
|
-
|
472
|
+
}
|
473
|
+
else {
|
474
|
+
map[name] = value;
|
83
475
|
}
|
84
476
|
}
|
85
477
|
return map;
|
86
478
|
}, {});
|
87
479
|
handlerQueue.push({
|
88
|
-
handler
|
480
|
+
handler,
|
89
481
|
styleMap: filteredStyleMap,
|
90
482
|
isResponsive,
|
91
483
|
});
|
92
484
|
});
|
93
485
|
});
|
486
|
+
// Process handlers using the three-phase approach
|
94
487
|
handlerQueue.forEach(({ handler, styleMap, isResponsive }) => {
|
95
488
|
const lookupStyles = handler.__lookupStyles;
|
96
489
|
if (isResponsive) {
|
490
|
+
// For responsive styles, resolve arrays using normalizeStyleZones
|
97
491
|
const valueMap = lookupStyles.reduce((map, style) => {
|
98
|
-
map[style] =
|
492
|
+
map[style] = cachedNormalizeStyleZones(styleMap[style], zones.length);
|
99
493
|
return map;
|
100
494
|
}, {});
|
495
|
+
// Create props for each breakpoint
|
101
496
|
const propsByPoint = zones.map((zone, i) => {
|
102
497
|
const pointProps = {};
|
103
498
|
lookupStyles.forEach((style) => {
|
@@ -107,23 +502,240 @@ export function renderStyles(styles, responsive = [], suffix) {
|
|
107
502
|
});
|
108
503
|
return pointProps;
|
109
504
|
});
|
110
|
-
|
111
|
-
|
112
|
-
|
505
|
+
// Call handler for each breakpoint, with state map processing if needed
|
506
|
+
propsByPoint.forEach((pointProps, breakpointIdx) => {
|
507
|
+
const hasStateMapsAtPoint = lookupStyles.some((style) => {
|
508
|
+
const v = pointProps[style];
|
509
|
+
return v && typeof v === 'object' && !Array.isArray(v);
|
510
|
+
});
|
511
|
+
if (hasStateMapsAtPoint) {
|
512
|
+
const allMods = new Set();
|
513
|
+
const styleStates = {};
|
514
|
+
lookupStyles.forEach((style) => {
|
515
|
+
const v = pointProps[style];
|
516
|
+
if (v && typeof v === 'object' && !Array.isArray(v)) {
|
517
|
+
const { states, mods } = styleStateMapToStyleStateDataList(v);
|
518
|
+
styleStates[style] = states;
|
519
|
+
mods.forEach((m) => allMods.add(m));
|
520
|
+
}
|
521
|
+
else {
|
522
|
+
styleStates[style] = [{ mods: [], notMods: [], value: v }];
|
523
|
+
}
|
524
|
+
});
|
525
|
+
const allModsArray = Array.from(allMods);
|
526
|
+
// Precompute attribute maps once for all combinations
|
527
|
+
const attributeMaps = buildAttributeMaps([], allModsArray);
|
528
|
+
// Generate combinations with conflict-aware pruning
|
529
|
+
const conflictChecker = createAttributeConflictChecker(attributeMaps.parsedMods);
|
530
|
+
const combinations = getModCombinationsIterative(allModsArray, true, conflictChecker);
|
531
|
+
combinations.forEach((modCombination) => {
|
532
|
+
const stateProps = {};
|
533
|
+
lookupStyles.forEach((style) => {
|
534
|
+
const states = styleStates[style];
|
535
|
+
const matchingState = states.find((state) => computeState(state.model, (mod) => modCombination.includes(mod)));
|
536
|
+
if (matchingState) {
|
537
|
+
stateProps[style] = matchingState.value;
|
538
|
+
}
|
539
|
+
});
|
540
|
+
// Use precomputed maps for efficient not selector optimization
|
541
|
+
const currentMaps = buildAttributeMaps(modCombination, allModsArray);
|
542
|
+
const optimizedNotMods = optimizeNotSelectors(modCombination, allModsArray, currentMaps);
|
543
|
+
const modsSelectors = `${modCombination
|
544
|
+
.map(getModSelector)
|
545
|
+
.join('')}${optimizedNotMods
|
546
|
+
.map((mod) => {
|
547
|
+
const sel = getModSelector(mod);
|
548
|
+
return sel.startsWith(':not(')
|
549
|
+
? sel.slice(5, -1)
|
550
|
+
: `:not(${sel})`;
|
551
|
+
})
|
552
|
+
.join('')}`;
|
553
|
+
const result = handler(stateProps);
|
554
|
+
if (!result)
|
555
|
+
return;
|
556
|
+
const logicalRules = explodeHandlerResult(result, zones || [], `${modsSelectors}${parentSuffix}`, breakpointIdx, true);
|
557
|
+
allLogicalRules.push(...logicalRules);
|
558
|
+
});
|
559
|
+
}
|
560
|
+
else {
|
561
|
+
const result = handler(pointProps);
|
562
|
+
if (!result)
|
563
|
+
return;
|
564
|
+
const logicalRules = explodeHandlerResult(result, zones || [], parentSuffix, breakpointIdx, true);
|
565
|
+
allLogicalRules.push(...logicalRules);
|
566
|
+
}
|
113
567
|
});
|
114
568
|
}
|
115
569
|
else {
|
116
|
-
|
117
|
-
|
570
|
+
// For non-responsive styles, check if any values have state maps
|
571
|
+
const hasStateMaps = lookupStyles.some((style) => {
|
572
|
+
const value = styleMap[style];
|
573
|
+
return value && typeof value === 'object' && !Array.isArray(value);
|
574
|
+
});
|
575
|
+
if (hasStateMaps) {
|
576
|
+
// Process each style property individually for state resolution
|
577
|
+
const allMods = new Set();
|
578
|
+
const styleStates = {};
|
579
|
+
lookupStyles.forEach((style) => {
|
580
|
+
const value = styleMap[style];
|
581
|
+
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
582
|
+
const { states, mods } = styleStateMapToStyleStateDataList(value);
|
583
|
+
styleStates[style] = states;
|
584
|
+
mods.forEach((mod) => allMods.add(mod));
|
585
|
+
}
|
586
|
+
else {
|
587
|
+
// Simple value, create a single state
|
588
|
+
styleStates[style] = [{ mods: [], notMods: [], value }];
|
589
|
+
}
|
590
|
+
});
|
591
|
+
// Generate all possible mod combinations
|
592
|
+
const allModsArray = Array.from(allMods);
|
593
|
+
// Precompute attribute maps once for all combinations
|
594
|
+
const attributeMaps = buildAttributeMaps([], allModsArray);
|
595
|
+
// Generate combinations with conflict-aware pruning
|
596
|
+
const conflictChecker = createAttributeConflictChecker(attributeMaps.parsedMods);
|
597
|
+
const combinations = getModCombinationsIterative(allModsArray, true, conflictChecker);
|
598
|
+
combinations.forEach((modCombination) => {
|
599
|
+
const stateProps = {};
|
600
|
+
lookupStyles.forEach((style) => {
|
601
|
+
const states = styleStates[style];
|
602
|
+
// Find the matching state for this mod combination
|
603
|
+
const matchingState = states.find((state) => {
|
604
|
+
return computeState(state.model, (mod) => modCombination.includes(mod));
|
605
|
+
});
|
606
|
+
if (matchingState) {
|
607
|
+
stateProps[style] = matchingState.value;
|
608
|
+
}
|
609
|
+
});
|
610
|
+
// Use precomputed maps for efficient not selector optimization
|
611
|
+
const currentMaps = buildAttributeMaps(modCombination, allModsArray);
|
612
|
+
const optimizedNotMods = optimizeNotSelectors(modCombination, allModsArray, currentMaps);
|
613
|
+
const modsSelectors = `${modCombination
|
614
|
+
.map(getModSelector)
|
615
|
+
.join('')}${optimizedNotMods
|
616
|
+
.map((mod) => {
|
617
|
+
const sel = getModSelector(mod);
|
618
|
+
return sel.startsWith(':not(')
|
619
|
+
? sel.slice(5, -1)
|
620
|
+
: `:not(${sel})`;
|
621
|
+
})
|
622
|
+
.join('')}`;
|
623
|
+
// If any state value is responsive (array), fan-out by breakpoint
|
624
|
+
const hasResponsiveStateValues = lookupStyles.some((style) => Array.isArray(stateProps[style]));
|
625
|
+
if (hasResponsiveStateValues) {
|
626
|
+
const propsByPoint = zones.map((_, i) => {
|
627
|
+
const pointProps = {};
|
628
|
+
lookupStyles.forEach((style) => {
|
629
|
+
const v = stateProps[style];
|
630
|
+
if (Array.isArray(v)) {
|
631
|
+
const arr = cachedNormalizeStyleZones(v, zones.length);
|
632
|
+
pointProps[style] = arr?.[i];
|
633
|
+
}
|
634
|
+
else {
|
635
|
+
pointProps[style] = v;
|
636
|
+
}
|
637
|
+
});
|
638
|
+
return pointProps;
|
639
|
+
});
|
640
|
+
propsByPoint.forEach((props, breakpointIdx) => {
|
641
|
+
const res = handler(props);
|
642
|
+
if (!res)
|
643
|
+
return;
|
644
|
+
const logical = explodeHandlerResult(res, zones || [], `${modsSelectors}${parentSuffix}`, breakpointIdx, true);
|
645
|
+
allLogicalRules.push(...logical);
|
646
|
+
});
|
647
|
+
}
|
648
|
+
else {
|
649
|
+
// Simple non-responsive state values
|
650
|
+
const result = handler(stateProps);
|
651
|
+
if (!result)
|
652
|
+
return;
|
653
|
+
const logical = explodeHandlerResult(result, zones || [], `${modsSelectors}${parentSuffix}`);
|
654
|
+
allLogicalRules.push(...logical);
|
655
|
+
}
|
656
|
+
});
|
657
|
+
}
|
658
|
+
else {
|
659
|
+
// Simple case: no state maps, call handler directly
|
660
|
+
const result = handler(styleMap);
|
661
|
+
if (result) {
|
662
|
+
const logical = explodeHandlerResult(result, zones || [], parentSuffix);
|
663
|
+
allLogicalRules.push(...logical);
|
664
|
+
}
|
665
|
+
}
|
118
666
|
}
|
119
667
|
});
|
120
|
-
STYLE_CACHE[cacheKey] = `&${suffix || ''}{outline: none;\n&[hidden]{display: none !important;}}${rawStyles}${responsive &&
|
121
|
-
responsive.length &&
|
122
|
-
responsiveStyles.filter((s) => s).length
|
123
|
-
? mediaWrapper(responsiveStyles, zones)
|
124
|
-
: ''}${innerStyles}`;
|
125
668
|
}
|
126
|
-
|
669
|
+
// Kick off processing from the root styles with empty suffix
|
670
|
+
processStyles(styles, parentSuffix);
|
671
|
+
return allLogicalRules;
|
672
|
+
}
|
673
|
+
export function renderStyles(styles, responsive = [], classNameOrSelector = 'unknown', directSelector = false) {
|
674
|
+
if (!styles) {
|
675
|
+
return directSelector ? [] : { rules: [] };
|
676
|
+
}
|
677
|
+
// Generate logical rules using shared pipeline
|
678
|
+
const allLogicalRules = generateLogicalRules(styles, responsive);
|
679
|
+
const zones = pointsToZones(responsive || []);
|
680
|
+
if (directSelector) {
|
681
|
+
// Direct selector mode: convert logical rules directly to StyleResult format
|
682
|
+
return allLogicalRules.map((rule) => {
|
683
|
+
// Replace & with the actual selector or append suffix to selector
|
684
|
+
const finalSelector = rule.selectorSuffix
|
685
|
+
? `${classNameOrSelector}${rule.selectorSuffix}`
|
686
|
+
: classNameOrSelector;
|
687
|
+
const declarations = Object.entries(rule.declarations)
|
688
|
+
.map(([prop, value]) => `${prop}: ${value};`)
|
689
|
+
.join(' ');
|
690
|
+
const q = rule.breakpointIdx > 0
|
691
|
+
? zones[rule.breakpointIdx]?.mediaQuery
|
692
|
+
: rule.responsiveSource
|
693
|
+
? zones[0]?.mediaQuery
|
694
|
+
: undefined;
|
695
|
+
const atRules = q ? [`@media ${q}`] : undefined;
|
696
|
+
return {
|
697
|
+
selector: finalSelector,
|
698
|
+
declarations,
|
699
|
+
atRules,
|
700
|
+
};
|
701
|
+
});
|
702
|
+
}
|
703
|
+
// Standard mode: use accumulation and materialization with className
|
704
|
+
const accumulatedRules = new Map();
|
705
|
+
for (const rule of allLogicalRules) {
|
706
|
+
// Create a key based on breakpointIdx, selectorSuffix, and responsiveOrigin
|
707
|
+
const ruleKey = `${rule.breakpointIdx}|${rule.selectorSuffix}|${rule.responsiveSource}`;
|
708
|
+
const existing = accumulatedRules.get(ruleKey);
|
709
|
+
if (existing) {
|
710
|
+
// Merge declarations from this rule into the existing one
|
711
|
+
Object.assign(existing.declarations, rule.declarations);
|
712
|
+
}
|
713
|
+
else {
|
714
|
+
// Create a new accumulated rule
|
715
|
+
accumulatedRules.set(ruleKey, {
|
716
|
+
selectorSuffix: rule.selectorSuffix,
|
717
|
+
breakpointIdx: rule.breakpointIdx,
|
718
|
+
declarations: { ...rule.declarations },
|
719
|
+
responsiveSource: rule.responsiveSource,
|
720
|
+
});
|
721
|
+
}
|
722
|
+
}
|
723
|
+
// Materialize the accumulated logical rules into final format
|
724
|
+
const finalRulesRaw = materializeRules(Array.from(accumulatedRules.values()), classNameOrSelector, zones || []);
|
725
|
+
// Simplified deduplication (should be much less work now)
|
726
|
+
const seen = new Set();
|
727
|
+
const finalRules = finalRulesRaw.filter((rule) => {
|
728
|
+
const at = rule.atRules && rule.atRules.length ? `@${rule.atRules.join('|')}` : '';
|
729
|
+
const key = `${rule.selector}|${rule.declarations}|${at}`;
|
730
|
+
if (seen.has(key))
|
731
|
+
return false;
|
732
|
+
seen.add(key);
|
733
|
+
return true;
|
734
|
+
});
|
735
|
+
return {
|
736
|
+
rules: finalRules,
|
737
|
+
className: classNameOrSelector,
|
738
|
+
};
|
127
739
|
}
|
128
740
|
|
129
741
|
|