@cube-dev/ui-kit 0.88.0 → 0.89.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 +12 -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/CollectionItem.js +1 -1
- package/es/components/GlobalStyles.js +1 -1
- package/es/components/GridProvider.js +1 -1
- package/es/components/HiddenInput.js +2 -2
- package/es/components/OpenTrasition.js +1 -1
- package/es/components/Root.js +3 -3
- package/es/components/actions/Action/Action.js +2 -2
- package/es/components/actions/Button/Button.js +27 -25
- 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 +4 -4
- package/es/components/actions/ItemAction/ItemAction.js +7 -7
- package/es/components/actions/ItemAction/index.js +1 -1
- package/es/components/actions/ItemActionContext.js +1 -1
- package/es/components/actions/ItemButton/ItemButton.js +8 -8
- package/es/components/actions/ItemButton/index.js +1 -1
- package/es/components/actions/Link/Link.js +1 -1
- package/es/components/actions/Menu/Menu.js +1 -1
- package/es/components/actions/Menu/MenuItem.js +1 -1
- package/es/components/actions/Menu/MenuSection.js +1 -1
- package/es/components/actions/Menu/MenuTrigger.js +1 -1
- package/es/components/actions/Menu/SubMenuTrigger.js +1 -1
- package/es/components/actions/Menu/SubmenuTriggerContext.js +1 -1
- package/es/components/actions/Menu/context.js +1 -1
- package/es/components/actions/Menu/index.js +1 -1
- package/es/components/actions/Menu/styled.js +9 -9
- 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 +2 -2
- package/es/components/content/Alert/Alert.js +3 -3
- 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 +3 -3
- package/es/components/content/Card/Card.js +1 -1
- package/es/components/content/Content.js +1 -1
- package/es/components/content/CopyPasteBlock/CopyPasteBlock.js +6 -6
- 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 +4 -4
- package/es/components/content/HotKeys/index.js +1 -1
- package/es/components/content/Item/Item.js +88 -87
- package/es/components/content/Item/index.js +1 -1
- package/es/components/content/ItemBadge/ItemBadge.js +2 -2
- package/es/components/content/ItemBadge/index.js +1 -1
- package/es/components/content/List/SectionHeading.js +1 -1
- package/es/components/content/List/index.js +1 -1
- package/es/components/content/Paragraph.js +1 -1
- package/es/components/content/Placeholder/Placeholder.js +1 -1
- package/es/components/content/PrismCode/PrismCode.js +1 -1
- package/es/components/content/PrismCode/prismSetup.js +1 -1
- package/es/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
- package/es/components/content/Result/Result.js +1 -1
- package/es/components/content/Skeleton/Skeleton.js +1 -1
- package/es/components/content/Tag/Tag.js +4 -4
- package/es/components/content/Text.js +1 -1
- package/es/components/content/Title.js +7 -7
- package/es/components/fields/Checkbox/Checkbox.js +2 -2
- package/es/components/fields/Checkbox/CheckboxGroup.js +1 -1
- package/es/components/fields/Checkbox/context.js +1 -1
- package/es/components/fields/Checkbox/index.js +1 -1
- package/es/components/fields/ComboBox/ComboBox.js +3 -2
- 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 +3 -3
- 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 +3 -3
- package/es/components/fields/FilterListBox/FilterListBox.js +5 -5
- 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 +2 -2
- 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/Picker/Picker.js +1 -1
- package/es/components/fields/Picker/index.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 +2 -2
- 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 +2 -2
- 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 +17 -17
- 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 +12 -12
- 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 +2 -2
- package/es/components/form/index.js +1 -1
- package/es/components/form/wrapper.js +1 -1
- package/es/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
- package/es/components/helpers/index.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 +6 -6
- package/es/components/organisms/FileTabs/FileTabs.js +6 -6
- package/es/components/organisms/StatsCard/StatsCard.js +1 -1
- package/es/components/other/Base64Upload/Base64Upload.js +5 -5
- package/es/components/other/Calendar/Calendar.js +1 -1
- package/es/components/other/Calendar/CalendarCell.js +2 -2
- 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 +19 -20
- 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 +9 -10
- 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/NotificationsDialogContext.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 +4 -4
- 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 +3 -3
- 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 +2 -2
- 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/ChartHeatmapIcon.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/CubePauseIcon.js +1 -1
- package/es/icons/CubePlayIcon.js +1 -1
- package/es/icons/CurrencyDollarIcon.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/DecimalDecreaseIcon.js +1 -1
- package/es/icons/DecimalIncreaseIcon.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/HierarchyOpenIcon.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/Number123Icon.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/PercentageIcon.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/ProgressBarIcon.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/TrashIcon.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/providers/navigation.types.js +1 -1
- package/es/providers/navigationAdapter.default.js +1 -1
- package/es/services/notification.js +1 -1
- package/es/shared/form.js +1 -1
- package/es/shared/index.js +1 -1
- package/es/stories/Form.legacy-stories.js +1 -1
- package/es/stories/FormFieldArgs.js +1 -1
- package/es/stories/Layout.stories.js +1 -1
- package/es/stories/Tasty.stories.js +1 -1
- package/es/stories/components/ConfirmDeletionDialogForm.js +1 -1
- package/es/stories/components/DialogFormApp.js +1 -1
- package/es/stories/components/StyledButton.js +1 -1
- package/es/stories/lists/baseProps.js +1 -1
- package/es/tasty/debug.js +1 -1
- package/es/tasty/index.js +1 -1
- package/es/tasty/injector/index.js +1 -1
- package/es/tasty/injector/injector.js +1 -1
- package/es/tasty/injector/sheet-manager.js +1 -1
- package/es/tasty/injector/types.js +1 -1
- package/es/tasty/parser/classify.js +1 -1
- package/es/tasty/parser/const.js +1 -1
- package/es/tasty/parser/lru.js +1 -1
- package/es/tasty/parser/parser.js +1 -1
- package/es/tasty/parser/tokenizer.js +1 -1
- package/es/tasty/parser/types.js +1 -1
- package/es/tasty/providers/BreakpointsProvider.js +1 -1
- package/es/tasty/styles/align.js +1 -1
- package/es/tasty/styles/border.js +1 -1
- package/es/tasty/styles/boxShadow.combinator.js +1 -1
- package/es/tasty/styles/color.js +1 -1
- package/es/tasty/styles/createStyle.js +1 -1
- package/es/tasty/styles/dimension.js +1 -1
- package/es/tasty/styles/display.js +1 -1
- package/es/tasty/styles/fade.js +1 -1
- package/es/tasty/styles/fill.js +1 -1
- package/es/tasty/styles/flow.js +1 -1
- package/es/tasty/styles/font.js +1 -1
- package/es/tasty/styles/fontStyle.js +1 -1
- package/es/tasty/styles/gap.js +1 -1
- package/es/tasty/styles/groupRadius.js +1 -1
- package/es/tasty/styles/height.js +1 -1
- package/es/tasty/styles/index.js +1 -1
- package/es/tasty/styles/inset.js +1 -1
- package/es/tasty/styles/justify.js +1 -1
- package/es/tasty/styles/list.js +1 -1
- package/es/tasty/styles/margin.js +1 -1
- package/es/tasty/styles/outline.js +1 -1
- package/es/tasty/styles/padding.js +1 -1
- package/es/tasty/styles/place.js +1 -1
- package/es/tasty/styles/predefined.js +1 -1
- package/es/tasty/styles/preset.js +1 -1
- package/es/tasty/styles/radius.js +1 -1
- package/es/tasty/styles/reset.js +1 -1
- package/es/tasty/styles/scrollbar.js +1 -1
- package/es/tasty/styles/shadow.js +1 -1
- package/es/tasty/styles/styledScrollbar.js +1 -1
- package/es/tasty/styles/transition.js +1 -1
- package/es/tasty/styles/types.js +1 -1
- package/es/tasty/styles/width.js +1 -1
- package/es/tasty/tasty.js +10 -9
- package/es/tasty/types.js +1 -1
- package/es/tasty/utils/cache-wrapper.js +1 -1
- package/es/tasty/utils/case-converter.js +1 -1
- package/es/tasty/utils/colors.js +1 -1
- package/es/tasty/utils/dotize.js +1 -1
- package/es/tasty/utils/filterBaseProps.js +1 -1
- package/es/tasty/utils/getDisplayName.js +1 -1
- package/es/tasty/utils/getModCombinations.js +1 -1
- package/es/tasty/utils/isDevEnv.js +1 -1
- package/es/tasty/utils/mergeStyles.js +1 -1
- package/es/tasty/utils/modAttrs.js +24 -3
- package/es/tasty/utils/renderStyles.js +385 -140
- package/es/tasty/utils/responsive.js +1 -1
- package/es/tasty/utils/string.js +1 -1
- package/es/tasty/utils/styles.js +47 -3
- package/es/tasty/utils/warnings.js +1 -1
- package/es/tokens.js +1 -1
- package/es/utils/ResizeSensor.js +1 -1
- package/es/utils/index.js +1 -1
- 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 +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/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/Root.d.ts +1 -0
- package/types/components/actions/Button/Button.d.ts +25 -23
- package/types/components/actions/Menu/styled.d.ts +3 -3
- package/types/components/content/Item/Item.d.ts +1 -1
- package/types/components/content/List/SectionHeading.d.ts +1 -1
- package/types/components/fields/DatePicker/DatePickerElement.d.ts +1 -1
- package/types/components/fields/Select/Select.d.ts +1 -1
- package/types/tasty/styles/types.d.ts +6 -1
- package/types/tasty/types.d.ts +1 -1
- package/types/tasty/utils/renderStyles.d.ts +10 -2
|
@@ -1,25 +1,35 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @license MIT
|
|
3
3
|
* author: Cube Dev Team
|
|
4
|
-
* @cube-dev/ui-kit v0.
|
|
4
|
+
* @cube-dev/ui-kit v0.89.0
|
|
5
5
|
* Released under the MIT license.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
|
-
* Style rendering that works with structured style objects
|
|
10
|
-
* Eliminates CSS string parsing for better performance
|
|
9
|
+
* Style rendering that works with structured style objects.
|
|
10
|
+
* Eliminates CSS string parsing for better performance.
|
|
11
|
+
*
|
|
12
|
+
* Key optimizations:
|
|
13
|
+
* - Early exit checks (hasSameAttributeConflicts) handle common cases without overhead
|
|
14
|
+
* - Logical rule caching (logicalRulesCache) memoizes expensive style processing
|
|
15
|
+
* - Conflict detection prevents invalid CSS selector combinations
|
|
16
|
+
* - Not-selector optimization reduces CSS size
|
|
17
|
+
* - Priority-based filtering handles mod precedence correctly
|
|
18
|
+
* - Consolidated mod processing eliminates code duplication
|
|
11
19
|
*/
|
|
12
20
|
import { Lru } from '../parser/lru';
|
|
13
21
|
import { createStyle, STYLE_HANDLER_MAP } from '../styles';
|
|
14
22
|
import { getModCombinationsIterative } from './getModCombinations';
|
|
15
23
|
import { normalizeStyleZones, pointsToZones, } from './responsive';
|
|
16
|
-
import { computeState, getModSelector, styleStateMapToStyleStateDataList, } from './styles';
|
|
24
|
+
import { computeState, getModSelector, stringifyStyles, styleStateMapToStyleStateDataList, } from './styles';
|
|
17
25
|
// Detect if a value is a state map whose entries contain responsive arrays
|
|
18
26
|
function stateMapHasResponsiveArrays(value) {
|
|
19
27
|
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
20
28
|
return false;
|
|
21
29
|
return Object.values(value).some((v) => Array.isArray(v));
|
|
22
30
|
}
|
|
31
|
+
// Cache logical rules per styles+breakpoints to avoid recomputation across identical calls
|
|
32
|
+
const logicalRulesCache = new Lru(5000);
|
|
23
33
|
// Normalize selector suffixes coming from `$` in style handler results.
|
|
24
34
|
// Some legacy handlers return suffixes starting with `&` (e.g. '& > *').
|
|
25
35
|
// The renderer expects suffixes without the ampersand because it adds
|
|
@@ -48,6 +58,15 @@ function transformSelectorAffix(affix) {
|
|
|
48
58
|
const trimmed = affix.trim();
|
|
49
59
|
if (!trimmed)
|
|
50
60
|
return ' ';
|
|
61
|
+
// Validate that combinators have spaces around them
|
|
62
|
+
// Check for capitalized words adjacent to combinators without spaces
|
|
63
|
+
const invalidPattern = /[A-Z][a-z]*[>+~]|[>+~][A-Z][a-z]*/;
|
|
64
|
+
if (invalidPattern.test(trimmed)) {
|
|
65
|
+
console.error(`[Tasty] Invalid selector affix ($) syntax: "${affix}"\n` +
|
|
66
|
+
`Combinators (>, +, ~) must have spaces around them when used with element names.\n` +
|
|
67
|
+
`Example: Use "$: '> Body > Row'" instead of "$: '>Body>Row'"\n` +
|
|
68
|
+
`This is a design choice: the parser uses simple whitespace splitting for performance.`);
|
|
69
|
+
}
|
|
51
70
|
const tokens = trimmed.split(/\s+/);
|
|
52
71
|
const transformed = tokens.map((token) => /^[A-Z]/.test(token) ? `[data-element="${token}"]` : token);
|
|
53
72
|
return ` ${transformed.join(' ')} `;
|
|
@@ -72,40 +91,42 @@ function getSelector(key, styles) {
|
|
|
72
91
|
}
|
|
73
92
|
return null;
|
|
74
93
|
}
|
|
75
|
-
|
|
76
|
-
|
|
94
|
+
/**
|
|
95
|
+
* Parse attribute selector into its components.
|
|
96
|
+
* Simple regex parsing - JS engines optimize repeated patterns internally.
|
|
97
|
+
*/
|
|
77
98
|
function parseAttributeSelector(selector) {
|
|
78
|
-
//
|
|
79
|
-
const cached = attributeSelectorCache.get(selector);
|
|
80
|
-
if (cached !== undefined) {
|
|
81
|
-
return cached;
|
|
82
|
-
}
|
|
83
|
-
// Match patterns like [data-size="medium"] or [data-is-selected]
|
|
99
|
+
// Match patterns like [data-size="medium"] or [data-selected]
|
|
84
100
|
const match = selector.match(/^\[([^=\]]+)(?:="([^"]+)")?\]$/);
|
|
85
|
-
|
|
101
|
+
return match
|
|
86
102
|
? {
|
|
87
103
|
attribute: match[1],
|
|
88
104
|
value: match[2] || 'true', // Handle boolean attributes
|
|
89
105
|
fullSelector: selector,
|
|
90
106
|
}
|
|
91
107
|
: null;
|
|
92
|
-
// Cache the result
|
|
93
|
-
attributeSelectorCache.set(selector, result);
|
|
94
|
-
return result;
|
|
95
108
|
}
|
|
96
109
|
function hasConflictingAttributeSelectors(mods, parsedMods) {
|
|
97
|
-
const
|
|
110
|
+
const attributeValues = new Map();
|
|
111
|
+
const attributeBooleans = new Set();
|
|
98
112
|
for (const mod of mods) {
|
|
99
113
|
const parsed = parsedMods?.get(mod) ?? parseAttributeSelector(mod);
|
|
100
|
-
if (parsed
|
|
101
|
-
|
|
102
|
-
|
|
114
|
+
if (!parsed)
|
|
115
|
+
continue;
|
|
116
|
+
if (parsed.value === 'true') {
|
|
117
|
+
// Boolean attribute
|
|
118
|
+
attributeBooleans.add(parsed.attribute);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
// Value attribute
|
|
122
|
+
if (!attributeValues.has(parsed.attribute)) {
|
|
123
|
+
attributeValues.set(parsed.attribute, []);
|
|
103
124
|
}
|
|
104
|
-
|
|
125
|
+
attributeValues.get(parsed.attribute).push(parsed.value);
|
|
105
126
|
}
|
|
106
127
|
}
|
|
107
|
-
// Check
|
|
108
|
-
for (const values of
|
|
128
|
+
// Check for multiple different values for the same attribute
|
|
129
|
+
for (const values of attributeValues.values()) {
|
|
109
130
|
if (values.length > 1)
|
|
110
131
|
return true;
|
|
111
132
|
}
|
|
@@ -119,15 +140,17 @@ function createAttributeConflictChecker(parsedMods) {
|
|
|
119
140
|
return (combination) => hasConflictingAttributeSelectors(combination, parsedMods);
|
|
120
141
|
}
|
|
121
142
|
// Build precomputed attribute maps for efficient not selector optimization
|
|
122
|
-
function buildAttributeMaps(currentMods, allMods) {
|
|
143
|
+
function buildAttributeMaps(currentMods, allMods, parsedModsCache) {
|
|
123
144
|
const allAttributes = new Map();
|
|
124
145
|
const currentAttributes = new Map();
|
|
125
|
-
const parsedMods = new Map();
|
|
126
|
-
// Parse all mods once and cache results
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
parsedMods.
|
|
146
|
+
const parsedMods = parsedModsCache || new Map();
|
|
147
|
+
// Parse all mods once and cache results (only if cache not provided)
|
|
148
|
+
if (!parsedModsCache) {
|
|
149
|
+
const allModsSet = new Set([...currentMods, ...allMods]);
|
|
150
|
+
for (const mod of allModsSet) {
|
|
151
|
+
if (!parsedMods.has(mod)) {
|
|
152
|
+
parsedMods.set(mod, parseAttributeSelector(mod));
|
|
153
|
+
}
|
|
131
154
|
}
|
|
132
155
|
}
|
|
133
156
|
// Build map of all possible values for each attribute
|
|
@@ -149,23 +172,219 @@ function buildAttributeMaps(currentMods, allMods) {
|
|
|
149
172
|
}
|
|
150
173
|
return { allAttributes, currentAttributes, parsedMods };
|
|
151
174
|
}
|
|
175
|
+
/**
|
|
176
|
+
* Check if a combination of positive and negative selectors creates a contradiction
|
|
177
|
+
* Returns true if the combination is INVALID and should be pruned
|
|
178
|
+
*/
|
|
179
|
+
function hasContradiction(currentMods, notMods, parsedMods) {
|
|
180
|
+
// Build maps of positive selector states
|
|
181
|
+
const positiveAttributes = new Map();
|
|
182
|
+
const positiveBooleans = new Set();
|
|
183
|
+
for (const mod of currentMods) {
|
|
184
|
+
const parsed = parsedMods.get(mod);
|
|
185
|
+
if (parsed) {
|
|
186
|
+
if (parsed.value === 'true') {
|
|
187
|
+
// Boolean attribute (e.g., [data-theme])
|
|
188
|
+
positiveBooleans.add(parsed.attribute);
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
// Value attribute (e.g., [data-theme="danger"])
|
|
192
|
+
if (!positiveAttributes.has(parsed.attribute)) {
|
|
193
|
+
positiveAttributes.set(parsed.attribute, []);
|
|
194
|
+
}
|
|
195
|
+
positiveAttributes.get(parsed.attribute).push(parsed.value);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
// Check negative selectors for contradictions
|
|
200
|
+
for (const mod of notMods) {
|
|
201
|
+
const parsed = parsedMods.get(mod);
|
|
202
|
+
if (parsed) {
|
|
203
|
+
if (parsed.value === 'true') {
|
|
204
|
+
// Negative boolean: !([data-theme])
|
|
205
|
+
// Case 6: Value positive + attribute negative = CONTRADICTION
|
|
206
|
+
if (positiveAttributes.has(parsed.attribute) ||
|
|
207
|
+
positiveBooleans.has(parsed.attribute)) {
|
|
208
|
+
return true; // INVALID: can't have value without attribute
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
// Negative value: !([data-theme="danger"])
|
|
213
|
+
// No contradiction - this is valid
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
152
219
|
function optimizeNotSelectors(currentMods, allMods, precomputedMaps) {
|
|
153
220
|
const maps = precomputedMaps || buildAttributeMaps(currentMods, allMods);
|
|
154
221
|
const notMods = allMods.filter((mod) => !currentMods.includes(mod));
|
|
155
222
|
const optimizedNotMods = [];
|
|
223
|
+
// Precompute presence of negative boolean attributes to avoid repeated scans
|
|
224
|
+
const negativeBooleanByAttr = new Set();
|
|
225
|
+
for (const mod of notMods) {
|
|
226
|
+
const p = maps.parsedMods.get(mod);
|
|
227
|
+
if (p && p.value === 'true') {
|
|
228
|
+
negativeBooleanByAttr.add(p.attribute);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
// Build maps of positive selector states for subsumption optimization
|
|
232
|
+
const positiveAttributes = new Map();
|
|
233
|
+
const positiveBooleans = new Set();
|
|
234
|
+
for (const mod of currentMods) {
|
|
235
|
+
const parsed = maps.parsedMods.get(mod);
|
|
236
|
+
if (parsed) {
|
|
237
|
+
if (parsed.value === 'true') {
|
|
238
|
+
positiveBooleans.add(parsed.attribute);
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
if (!positiveAttributes.has(parsed.attribute)) {
|
|
242
|
+
positiveAttributes.set(parsed.attribute, []);
|
|
243
|
+
}
|
|
244
|
+
positiveAttributes.get(parsed.attribute).push(parsed.value);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
156
248
|
for (const mod of notMods) {
|
|
157
249
|
const parsed = maps.parsedMods.get(mod);
|
|
158
250
|
if (parsed && parsed.value !== 'true') {
|
|
251
|
+
// Negative value selector
|
|
159
252
|
// If we already have a value for this attribute, skip this not selector
|
|
160
|
-
// because it's already mutually exclusive
|
|
253
|
+
// because it's already mutually exclusive (optimization)
|
|
254
|
+
if (maps.currentAttributes.has(parsed.attribute)) {
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
// If we have a positive value for this attribute, skip the negative boolean
|
|
259
|
+
// This avoids producing selectors like [data-attr="x"]:not([data-attr])
|
|
260
|
+
if (parsed && parsed.value === 'true') {
|
|
161
261
|
if (maps.currentAttributes.has(parsed.attribute)) {
|
|
162
262
|
continue;
|
|
163
263
|
}
|
|
164
264
|
}
|
|
265
|
+
// Case 4 subsumption: If we have a value positive and boolean positive for same attribute
|
|
266
|
+
// The value implies the boolean, so we can skip the boolean from positive mods
|
|
267
|
+
// (This is handled elsewhere - the value selector is more specific)
|
|
268
|
+
// Case 7 subsumption: If we have a value negative and boolean negative for same attribute
|
|
269
|
+
// The boolean negative implies value negative, so skip the value negative
|
|
270
|
+
if (parsed && parsed.value !== 'true') {
|
|
271
|
+
// If we also have the boolean attribute in negative mods, skip the value negative
|
|
272
|
+
if (negativeBooleanByAttr.has(parsed.attribute)) {
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
165
276
|
optimizedNotMods.push(mod);
|
|
166
277
|
}
|
|
167
278
|
return optimizedNotMods;
|
|
168
279
|
}
|
|
280
|
+
/**
|
|
281
|
+
* Quick check if there are any same-attribute conflicts (boolean vs value for same attribute).
|
|
282
|
+
* Returns true if conflicts exist, false if filtering can be skipped.
|
|
283
|
+
* This early exit optimization handles the common case efficiently.
|
|
284
|
+
*/
|
|
285
|
+
function hasSameAttributeConflicts(allMods, parsedModsCache) {
|
|
286
|
+
const attributeCounts = new Map();
|
|
287
|
+
for (const mod of allMods) {
|
|
288
|
+
const parsed = parsedModsCache.get(mod);
|
|
289
|
+
if (!parsed)
|
|
290
|
+
continue;
|
|
291
|
+
const isBool = parsed.value === 'true';
|
|
292
|
+
const existing = attributeCounts.get(parsed.attribute);
|
|
293
|
+
if (existing) {
|
|
294
|
+
// Already have both types for this attribute - conflict exists!
|
|
295
|
+
if ((isBool && existing.hasValue) || (!isBool && existing.hasBool)) {
|
|
296
|
+
return true;
|
|
297
|
+
}
|
|
298
|
+
// Update the types we've seen
|
|
299
|
+
if (isBool)
|
|
300
|
+
existing.hasBool = true;
|
|
301
|
+
else
|
|
302
|
+
existing.hasValue = true;
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
attributeCounts.set(parsed.attribute, {
|
|
306
|
+
hasBool: isBool,
|
|
307
|
+
hasValue: !isBool,
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
return false;
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Filter mods based on priority order for same-attribute conflicts.
|
|
315
|
+
* If a boolean selector has higher priority than value selectors for the same attribute,
|
|
316
|
+
* remove the value selectors (they would be shadowed by the boolean).
|
|
317
|
+
*
|
|
318
|
+
* Priority is determined by order in the styleStates (after reversal - earlier = higher priority)
|
|
319
|
+
*/
|
|
320
|
+
function filterModsByPriority(allMods, styleStates, lookupStyles, parsedModsCache) {
|
|
321
|
+
// Early exit: if no same-attribute conflicts exist, skip all the expensive work
|
|
322
|
+
// This handles the common case efficiently without any cache overhead
|
|
323
|
+
if (!hasSameAttributeConflicts(allMods, parsedModsCache)) {
|
|
324
|
+
return allMods;
|
|
325
|
+
}
|
|
326
|
+
// Build priority map: for each mod, find its earliest appearance in any state list
|
|
327
|
+
const modPriorities = new Map();
|
|
328
|
+
for (const style of lookupStyles) {
|
|
329
|
+
const states = styleStates[style];
|
|
330
|
+
if (!states || states.length === 0)
|
|
331
|
+
continue; // Skip empty states
|
|
332
|
+
// states are already reversed (higher priority = lower index)
|
|
333
|
+
for (let index = 0; index < states.length; index++) {
|
|
334
|
+
const state = states[index];
|
|
335
|
+
if (!state.mods || state.mods.length === 0)
|
|
336
|
+
continue; // Skip empty mods
|
|
337
|
+
for (const mod of state.mods) {
|
|
338
|
+
const currentPriority = modPriorities.get(mod);
|
|
339
|
+
if (currentPriority === undefined || index < currentPriority) {
|
|
340
|
+
modPriorities.set(mod, index);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
// Group mods by attribute
|
|
346
|
+
const attributeGroups = new Map();
|
|
347
|
+
for (const mod of allMods) {
|
|
348
|
+
const parsed = parsedModsCache.get(mod);
|
|
349
|
+
if (!parsed)
|
|
350
|
+
continue;
|
|
351
|
+
const priority = modPriorities.get(mod);
|
|
352
|
+
if (priority === undefined)
|
|
353
|
+
continue;
|
|
354
|
+
const isBool = parsed.value === 'true';
|
|
355
|
+
let group = attributeGroups.get(parsed.attribute);
|
|
356
|
+
if (!group) {
|
|
357
|
+
group = [];
|
|
358
|
+
attributeGroups.set(parsed.attribute, group);
|
|
359
|
+
}
|
|
360
|
+
group.push({
|
|
361
|
+
mod,
|
|
362
|
+
isBool,
|
|
363
|
+
priority,
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
// Filter: for each attribute, if boolean has higher priority than any value, remove values
|
|
367
|
+
const modsToRemove = new Set();
|
|
368
|
+
for (const [attribute, group] of attributeGroups.entries()) {
|
|
369
|
+
// Only process attributes with more than one mod
|
|
370
|
+
if (group.length <= 1)
|
|
371
|
+
continue;
|
|
372
|
+
const boolMods = group.filter((m) => m.isBool);
|
|
373
|
+
const valueMods = group.filter((m) => !m.isBool);
|
|
374
|
+
// Only check if we have both types
|
|
375
|
+
if (boolMods.length === 0 || valueMods.length === 0)
|
|
376
|
+
continue;
|
|
377
|
+
// Check if any boolean has higher priority (lower index) than all values
|
|
378
|
+
for (const boolMod of boolMods) {
|
|
379
|
+
const hasHigherPriorityThanAllValues = valueMods.every((valueMod) => boolMod.priority < valueMod.priority);
|
|
380
|
+
if (hasHigherPriorityThanAllValues) {
|
|
381
|
+
// This boolean shadows all value mods for this attribute
|
|
382
|
+
valueMods.forEach((valueMod) => modsToRemove.add(valueMod.mod));
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
return allMods.filter((mod) => !modsToRemove.has(mod));
|
|
387
|
+
}
|
|
169
388
|
/**
|
|
170
389
|
* Explode a style handler result into logical rules with proper mapping
|
|
171
390
|
* Phase 1: Handler fan-out ($ selectors, arrays)
|
|
@@ -324,6 +543,124 @@ function convertHandlerResultToCSS(result, selectorSuffix = '') {
|
|
|
324
543
|
const normalizedSingle = $ ? normalizeDollarSelectorSuffix(String($)) : '';
|
|
325
544
|
return `&${finalSelectorSuffix}${normalizedSingle}{\n${renderedStyles}}\n`;
|
|
326
545
|
}
|
|
546
|
+
/**
|
|
547
|
+
* Process state maps with mod combinations and generate logical rules.
|
|
548
|
+
* This consolidates the common logic for handling mod combinations, priority filtering,
|
|
549
|
+
* contradiction checking, and selector optimization.
|
|
550
|
+
*/
|
|
551
|
+
function processStateMapsWithModCombinations(styleStates, lookupStyles, zones, handler, parentSuffix, allLogicalRules, cachedNormalizeStyleZones, breakpointIdx, responsiveOrigin = false) {
|
|
552
|
+
// Collect all mods from style states
|
|
553
|
+
const allMods = [];
|
|
554
|
+
const seenMods = new Set();
|
|
555
|
+
for (const style of lookupStyles) {
|
|
556
|
+
const states = styleStates[style];
|
|
557
|
+
if (!states)
|
|
558
|
+
continue;
|
|
559
|
+
for (const state of states) {
|
|
560
|
+
if (state.mods) {
|
|
561
|
+
for (const mod of state.mods) {
|
|
562
|
+
if (!seenMods.has(mod)) {
|
|
563
|
+
seenMods.add(mod);
|
|
564
|
+
allMods.push(mod);
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
if (allMods.length === 0) {
|
|
571
|
+
// No mods - just call handler with default state values
|
|
572
|
+
const stateProps = {};
|
|
573
|
+
lookupStyles.forEach((style) => {
|
|
574
|
+
const states = styleStates[style];
|
|
575
|
+
if (states && states.length > 0) {
|
|
576
|
+
stateProps[style] = states[0].value;
|
|
577
|
+
}
|
|
578
|
+
});
|
|
579
|
+
const result = handler(stateProps);
|
|
580
|
+
if (!result)
|
|
581
|
+
return;
|
|
582
|
+
const logicalRules = explodeHandlerResult(result, zones, parentSuffix, breakpointIdx, responsiveOrigin);
|
|
583
|
+
allLogicalRules.push(...logicalRules);
|
|
584
|
+
return;
|
|
585
|
+
}
|
|
586
|
+
// Parse all mods once and share the cache across all operations
|
|
587
|
+
const parsedModsCache = new Map();
|
|
588
|
+
for (const mod of allMods) {
|
|
589
|
+
parsedModsCache.set(mod, parseAttributeSelector(getModSelector(mod)));
|
|
590
|
+
}
|
|
591
|
+
// Apply priority-based filtering for same-attribute boolean vs value conflicts
|
|
592
|
+
const filteredMods = filterModsByPriority(allMods, styleStates, lookupStyles, parsedModsCache);
|
|
593
|
+
// Precompute attribute maps once for all combinations
|
|
594
|
+
const attributeMaps = buildAttributeMaps([], filteredMods, parsedModsCache);
|
|
595
|
+
// Generate combinations with conflict-aware pruning
|
|
596
|
+
const conflictChecker = createAttributeConflictChecker(attributeMaps.parsedMods);
|
|
597
|
+
const combinations = getModCombinationsIterative(filteredMods, true, conflictChecker);
|
|
598
|
+
// Process each mod combination
|
|
599
|
+
combinations.forEach((modCombination) => {
|
|
600
|
+
const stateProps = {};
|
|
601
|
+
// Find matching state for each style
|
|
602
|
+
lookupStyles.forEach((style) => {
|
|
603
|
+
const states = styleStates[style];
|
|
604
|
+
const matchingState = states.find((state) => computeState(state.model, (mod) => modCombination.includes(mod)));
|
|
605
|
+
if (matchingState) {
|
|
606
|
+
stateProps[style] = matchingState.value;
|
|
607
|
+
}
|
|
608
|
+
});
|
|
609
|
+
// Use precomputed maps for efficient not selector optimization
|
|
610
|
+
const currentMaps = buildAttributeMaps(modCombination, filteredMods, parsedModsCache);
|
|
611
|
+
// Compute raw NOTs for contradiction check (before optimization)
|
|
612
|
+
const rawNotMods = filteredMods.filter((mod) => !modCombination.includes(mod));
|
|
613
|
+
// Check for contradictions between positive and negative selectors
|
|
614
|
+
if (hasContradiction(modCombination, rawNotMods, currentMaps.parsedMods)) {
|
|
615
|
+
return; // Skip this invalid combination
|
|
616
|
+
}
|
|
617
|
+
// Optimize NOT selectors afterwards (pure simplification)
|
|
618
|
+
const optimizedNotMods = optimizeNotSelectors(modCombination, filteredMods, currentMaps);
|
|
619
|
+
// Build the mod selector string
|
|
620
|
+
const modsSelectors = `${modCombination
|
|
621
|
+
.map(getModSelector)
|
|
622
|
+
.join('')}${optimizedNotMods
|
|
623
|
+
.map((mod) => {
|
|
624
|
+
const sel = getModSelector(mod);
|
|
625
|
+
return sel.startsWith(':not(') ? sel.slice(5, -1) : `:not(${sel})`;
|
|
626
|
+
})
|
|
627
|
+
.join('')}`;
|
|
628
|
+
// Check if any state value is responsive (array)
|
|
629
|
+
const hasResponsiveStateValues = lookupStyles.some((style) => Array.isArray(stateProps[style]));
|
|
630
|
+
if (hasResponsiveStateValues) {
|
|
631
|
+
// Fan out by breakpoint for responsive state values
|
|
632
|
+
const propsByPoint = zones.map((_, i) => {
|
|
633
|
+
const pointProps = {};
|
|
634
|
+
lookupStyles.forEach((style) => {
|
|
635
|
+
const v = stateProps[style];
|
|
636
|
+
if (Array.isArray(v)) {
|
|
637
|
+
const arr = cachedNormalizeStyleZones(v, zones.length);
|
|
638
|
+
pointProps[style] = arr?.[i];
|
|
639
|
+
}
|
|
640
|
+
else {
|
|
641
|
+
pointProps[style] = v;
|
|
642
|
+
}
|
|
643
|
+
});
|
|
644
|
+
return pointProps;
|
|
645
|
+
});
|
|
646
|
+
propsByPoint.forEach((props, bpIdx) => {
|
|
647
|
+
const res = handler(props);
|
|
648
|
+
if (!res)
|
|
649
|
+
return;
|
|
650
|
+
const logical = explodeHandlerResult(res, zones, `${modsSelectors}${parentSuffix}`, bpIdx, true);
|
|
651
|
+
allLogicalRules.push(...logical);
|
|
652
|
+
});
|
|
653
|
+
}
|
|
654
|
+
else {
|
|
655
|
+
// Simple non-responsive state values
|
|
656
|
+
const result = handler(stateProps);
|
|
657
|
+
if (!result)
|
|
658
|
+
return;
|
|
659
|
+
const logical = explodeHandlerResult(result, zones, `${modsSelectors}${parentSuffix}`, breakpointIdx, responsiveOrigin);
|
|
660
|
+
allLogicalRules.push(...logical);
|
|
661
|
+
}
|
|
662
|
+
});
|
|
663
|
+
}
|
|
327
664
|
/**
|
|
328
665
|
* Convert logical rules to final StyleResult format
|
|
329
666
|
*/
|
|
@@ -538,53 +875,20 @@ function generateLogicalRules(styles, responsive = [], parentSuffix = '') {
|
|
|
538
875
|
return v && typeof v === 'object' && !Array.isArray(v);
|
|
539
876
|
});
|
|
540
877
|
if (hasStateMapsAtPoint) {
|
|
541
|
-
|
|
878
|
+
// Build styleStates from point props
|
|
542
879
|
const styleStates = {};
|
|
543
880
|
lookupStyles.forEach((style) => {
|
|
544
881
|
const v = pointProps[style];
|
|
545
882
|
if (v && typeof v === 'object' && !Array.isArray(v)) {
|
|
546
|
-
const { states
|
|
883
|
+
const { states } = styleStateMapToStyleStateDataList(v);
|
|
547
884
|
styleStates[style] = states;
|
|
548
|
-
mods.forEach((m) => allMods.add(m));
|
|
549
885
|
}
|
|
550
886
|
else {
|
|
551
887
|
styleStates[style] = [{ mods: [], notMods: [], value: v }];
|
|
552
888
|
}
|
|
553
889
|
});
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
const attributeMaps = buildAttributeMaps([], allModsArray);
|
|
557
|
-
// Generate combinations with conflict-aware pruning
|
|
558
|
-
const conflictChecker = createAttributeConflictChecker(attributeMaps.parsedMods);
|
|
559
|
-
const combinations = getModCombinationsIterative(allModsArray, true, conflictChecker);
|
|
560
|
-
combinations.forEach((modCombination) => {
|
|
561
|
-
const stateProps = {};
|
|
562
|
-
lookupStyles.forEach((style) => {
|
|
563
|
-
const states = styleStates[style];
|
|
564
|
-
const matchingState = states.find((state) => computeState(state.model, (mod) => modCombination.includes(mod)));
|
|
565
|
-
if (matchingState) {
|
|
566
|
-
stateProps[style] = matchingState.value;
|
|
567
|
-
}
|
|
568
|
-
});
|
|
569
|
-
// Use precomputed maps for efficient not selector optimization
|
|
570
|
-
const currentMaps = buildAttributeMaps(modCombination, allModsArray);
|
|
571
|
-
const optimizedNotMods = optimizeNotSelectors(modCombination, allModsArray, currentMaps);
|
|
572
|
-
const modsSelectors = `${modCombination
|
|
573
|
-
.map(getModSelector)
|
|
574
|
-
.join('')}${optimizedNotMods
|
|
575
|
-
.map((mod) => {
|
|
576
|
-
const sel = getModSelector(mod);
|
|
577
|
-
return sel.startsWith(':not(')
|
|
578
|
-
? sel.slice(5, -1)
|
|
579
|
-
: `:not(${sel})`;
|
|
580
|
-
})
|
|
581
|
-
.join('')}`;
|
|
582
|
-
const result = handler(stateProps);
|
|
583
|
-
if (!result)
|
|
584
|
-
return;
|
|
585
|
-
const logicalRules = explodeHandlerResult(result, zones || [], `${modsSelectors}${parentSuffix}`, breakpointIdx, true);
|
|
586
|
-
allLogicalRules.push(...logicalRules);
|
|
587
|
-
});
|
|
890
|
+
// Use the consolidated helper for mod combination processing
|
|
891
|
+
processStateMapsWithModCombinations(styleStates, lookupStyles, zones || [], handler, parentSuffix, allLogicalRules, cachedNormalizeStyleZones, breakpointIdx, true);
|
|
588
892
|
}
|
|
589
893
|
else {
|
|
590
894
|
const result = handler(pointProps);
|
|
@@ -602,87 +906,21 @@ function generateLogicalRules(styles, responsive = [], parentSuffix = '') {
|
|
|
602
906
|
return value && typeof value === 'object' && !Array.isArray(value);
|
|
603
907
|
});
|
|
604
908
|
if (hasStateMaps) {
|
|
605
|
-
//
|
|
606
|
-
const allMods = new Set();
|
|
909
|
+
// Build styleStates from styleMap
|
|
607
910
|
const styleStates = {};
|
|
608
911
|
lookupStyles.forEach((style) => {
|
|
609
912
|
const value = styleMap[style];
|
|
610
913
|
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
611
|
-
const { states
|
|
914
|
+
const { states } = styleStateMapToStyleStateDataList(value);
|
|
612
915
|
styleStates[style] = states;
|
|
613
|
-
mods.forEach((mod) => allMods.add(mod));
|
|
614
916
|
}
|
|
615
917
|
else {
|
|
616
918
|
// Simple value, create a single state
|
|
617
919
|
styleStates[style] = [{ mods: [], notMods: [], value }];
|
|
618
920
|
}
|
|
619
921
|
});
|
|
620
|
-
//
|
|
621
|
-
|
|
622
|
-
// Precompute attribute maps once for all combinations
|
|
623
|
-
const attributeMaps = buildAttributeMaps([], allModsArray);
|
|
624
|
-
// Generate combinations with conflict-aware pruning
|
|
625
|
-
const conflictChecker = createAttributeConflictChecker(attributeMaps.parsedMods);
|
|
626
|
-
const combinations = getModCombinationsIterative(allModsArray, true, conflictChecker);
|
|
627
|
-
combinations.forEach((modCombination) => {
|
|
628
|
-
const stateProps = {};
|
|
629
|
-
lookupStyles.forEach((style) => {
|
|
630
|
-
const states = styleStates[style];
|
|
631
|
-
// Find the matching state for this mod combination
|
|
632
|
-
const matchingState = states.find((state) => {
|
|
633
|
-
return computeState(state.model, (mod) => modCombination.includes(mod));
|
|
634
|
-
});
|
|
635
|
-
if (matchingState) {
|
|
636
|
-
stateProps[style] = matchingState.value;
|
|
637
|
-
}
|
|
638
|
-
});
|
|
639
|
-
// Use precomputed maps for efficient not selector optimization
|
|
640
|
-
const currentMaps = buildAttributeMaps(modCombination, allModsArray);
|
|
641
|
-
const optimizedNotMods = optimizeNotSelectors(modCombination, allModsArray, currentMaps);
|
|
642
|
-
const modsSelectors = `${modCombination
|
|
643
|
-
.map(getModSelector)
|
|
644
|
-
.join('')}${optimizedNotMods
|
|
645
|
-
.map((mod) => {
|
|
646
|
-
const sel = getModSelector(mod);
|
|
647
|
-
return sel.startsWith(':not(')
|
|
648
|
-
? sel.slice(5, -1)
|
|
649
|
-
: `:not(${sel})`;
|
|
650
|
-
})
|
|
651
|
-
.join('')}`;
|
|
652
|
-
// If any state value is responsive (array), fan-out by breakpoint
|
|
653
|
-
const hasResponsiveStateValues = lookupStyles.some((style) => Array.isArray(stateProps[style]));
|
|
654
|
-
if (hasResponsiveStateValues) {
|
|
655
|
-
const propsByPoint = zones.map((_, i) => {
|
|
656
|
-
const pointProps = {};
|
|
657
|
-
lookupStyles.forEach((style) => {
|
|
658
|
-
const v = stateProps[style];
|
|
659
|
-
if (Array.isArray(v)) {
|
|
660
|
-
const arr = cachedNormalizeStyleZones(v, zones.length);
|
|
661
|
-
pointProps[style] = arr?.[i];
|
|
662
|
-
}
|
|
663
|
-
else {
|
|
664
|
-
pointProps[style] = v;
|
|
665
|
-
}
|
|
666
|
-
});
|
|
667
|
-
return pointProps;
|
|
668
|
-
});
|
|
669
|
-
propsByPoint.forEach((props, breakpointIdx) => {
|
|
670
|
-
const res = handler(props);
|
|
671
|
-
if (!res)
|
|
672
|
-
return;
|
|
673
|
-
const logical = explodeHandlerResult(res, zones || [], `${modsSelectors}${parentSuffix}`, breakpointIdx, true);
|
|
674
|
-
allLogicalRules.push(...logical);
|
|
675
|
-
});
|
|
676
|
-
}
|
|
677
|
-
else {
|
|
678
|
-
// Simple non-responsive state values
|
|
679
|
-
const result = handler(stateProps);
|
|
680
|
-
if (!result)
|
|
681
|
-
return;
|
|
682
|
-
const logical = explodeHandlerResult(result, zones || [], `${modsSelectors}${parentSuffix}`);
|
|
683
|
-
allLogicalRules.push(...logical);
|
|
684
|
-
}
|
|
685
|
-
});
|
|
922
|
+
// Use the consolidated helper for mod combination processing
|
|
923
|
+
processStateMapsWithModCombinations(styleStates, lookupStyles, zones || [], handler, parentSuffix, allLogicalRules, cachedNormalizeStyleZones);
|
|
686
924
|
}
|
|
687
925
|
else {
|
|
688
926
|
// Simple case: no state maps, call handler directly
|
|
@@ -704,8 +942,15 @@ export function renderStyles(styles, responsive = [], classNameOrSelector) {
|
|
|
704
942
|
if (!styles) {
|
|
705
943
|
return directSelector ? [] : { rules: [] };
|
|
706
944
|
}
|
|
707
|
-
// Generate logical rules using shared pipeline
|
|
708
|
-
const
|
|
945
|
+
// Generate logical rules using shared pipeline (memoized per styles+breakpoints)
|
|
946
|
+
const stylesKey = stringifyStyles(styles);
|
|
947
|
+
const bpKey = (responsive || []).join(',');
|
|
948
|
+
const lrKey = `${stylesKey}#${bpKey}`;
|
|
949
|
+
let allLogicalRules = logicalRulesCache.get(lrKey);
|
|
950
|
+
if (!allLogicalRules) {
|
|
951
|
+
allLogicalRules = generateLogicalRules(styles, responsive);
|
|
952
|
+
logicalRulesCache.set(lrKey, allLogicalRules);
|
|
953
|
+
}
|
|
709
954
|
const zones = pointsToZones(responsive || []);
|
|
710
955
|
if (directSelector) {
|
|
711
956
|
// Direct selector mode: convert logical rules directly to StyleResult format
|