@cube-dev/ui-kit 0.0.0-canary-76be278 → 0.0.0-canary-7e4ec9d
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/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 +67 -61
- package/es/components/GridProvider.js +1 -1
- package/es/components/HiddenInput.js +1 -1
- package/es/components/OpenTrasition.js +1 -1
- package/es/components/Root.js +52 -12
- package/es/components/actions/Action/Action.js +1 -1
- package/es/components/actions/Button/Button.js +2 -2
- 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/ItemAction/ItemAction.js +1 -1
- package/es/components/actions/ItemAction/index.js +1 -1
- package/es/components/actions/ItemActionContext.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/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 +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 +2 -2
- 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/Disclosure/Disclosure.js +1 -1
- package/es/components/content/Disclosure/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/Item/Item.js +2 -2
- package/es/components/content/Item/index.js +1 -1
- package/es/components/content/ItemBadge/ItemBadge.js +1 -1
- package/es/components/content/ItemBadge/index.js +1 -1
- package/es/components/content/Layout/GridLayout.js +1 -1
- package/es/components/content/Layout/Layout.js +1 -2
- package/es/components/content/Layout/LayoutBlock.js +1 -1
- package/es/components/content/Layout/LayoutCenter.js +1 -1
- package/es/components/content/Layout/LayoutContainer.js +1 -1
- package/es/components/content/Layout/LayoutContent.js +1 -2
- package/es/components/content/Layout/LayoutContext.js +1 -1
- package/es/components/content/Layout/LayoutFlex.js +1 -1
- package/es/components/content/Layout/LayoutFooter.js +1 -1
- package/es/components/content/Layout/LayoutGrid.js +1 -1
- package/es/components/content/Layout/LayoutHeader.js +1 -1
- package/es/components/content/Layout/LayoutPane.js +1 -2
- package/es/components/content/Layout/LayoutPanel.js +1 -2
- package/es/components/content/Layout/LayoutPanelHeader.js +1 -1
- package/es/components/content/Layout/LayoutToolbar.js +1 -1
- package/es/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
- package/es/components/content/Layout/index.js +1 -1
- package/es/components/content/Layout/utils.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 +1 -1
- package/es/components/content/Text.js +1 -1
- package/es/components/content/TextItem/TextItem.js +1 -1
- package/es/components/content/TextItem/index.js +1 -1
- package/es/components/content/Title.js +1 -1
- package/es/components/content/highlightText.js +1 -1
- package/es/components/content/use-auto-tooltip.js +1 -1
- 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/Picker/Picker.js +1 -1
- package/es/components/fields/Picker/index.js +1 -1
- package/es/components/fields/RadioGroup/Radio.js +1 -1
- 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 +1 -1
- 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 +2 -2
- 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/helpers/DisplayTransition/DisplayTransition.js +1 -1
- package/es/components/helpers/DisplayTransition/index.js +1 -1
- package/es/components/helpers/IconSwitch/IconSwitch.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 +1 -1
- package/es/components/organisms/FileTabs/FileTabs.js +1 -1
- 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/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 +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/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/ColumnTotalIcon.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/RowTotalsIcon.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/SubtotalsIcon.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 -2
- package/es/provider.js +8 -2
- 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/SimpleLayout.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 +14 -18
- package/es/stories/lists/baseProps.js +1 -1
- package/es/tasty/debug.js +7 -193
- package/es/tasty/index.js +4 -18
- package/es/tasty/injector/index.js +87 -31
- package/es/tasty/injector/injector.js +279 -30
- package/es/tasty/injector/sheet-manager.js +2 -126
- package/es/tasty/injector/types.js +1 -1
- package/es/tasty/parser/classify.js +3 -5
- package/es/tasty/parser/const.js +1 -1
- package/es/tasty/parser/lru.js +1 -1
- package/es/tasty/parser/parser.js +1 -14
- package/es/tasty/parser/tokenizer.js +1 -1
- package/es/tasty/parser/types.js +1 -2
- package/es/tasty/providers/BreakpointsProvider.js +16 -0
- 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 +20 -10
- 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 +55 -75
- package/es/tasty/styles/outline.js +1 -1
- package/es/tasty/styles/padding.js +55 -75
- package/es/tasty/styles/place.js +1 -1
- package/es/tasty/styles/predefined.js +2 -3
- 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 +117 -76
- 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 +38 -0
- package/es/tasty/utils/isDevEnv.js +1 -1
- package/es/tasty/utils/mergeStyles.js +2 -2
- package/es/tasty/utils/modAttrs.js +1 -1
- package/es/tasty/utils/processTokens.js +1 -1
- package/es/tasty/utils/renderStyles.js +1050 -0
- package/es/tasty/utils/responsive.js +60 -0
- package/es/tasty/utils/string.js +1 -1
- package/es/tasty/utils/styles.js +19 -252
- package/es/tasty/utils/warnings.js +1 -1
- package/es/tokens.js +309 -0
- 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/resolveIcon.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/useLocalStorage.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 -3
- package/types/components/GlobalStyles.d.ts +1 -2
- package/types/components/HiddenInput.d.ts +826 -827
- package/types/components/Root.d.ts +0 -1
- package/types/components/actions/Button/Button.d.ts +1645 -1647
- package/types/components/actions/CommandMenu/styled.d.ts +4130 -4135
- package/types/components/actions/Menu/styled.d.ts +4379 -4384
- package/types/components/actions/use-action.d.ts +1 -1
- package/types/components/content/List/SectionHeading.d.ts +83 -83
- package/types/components/content/Text.d.ts +311 -311
- package/types/components/fields/DatePicker/DatePickerElement.d.ts +83 -83
- package/types/components/fields/Select/Select.d.ts +826 -827
- package/types/components/fields/Slider/elements.d.ts +4956 -4962
- package/types/index.d.ts +0 -1
- package/types/provider.d.ts +2 -1
- package/types/stories/components/StyledButton.d.ts +1 -1
- package/types/tasty/debug.d.ts +0 -35
- package/types/tasty/index.d.ts +4 -14
- package/types/tasty/injector/index.d.ts +19 -30
- package/types/tasty/injector/injector.d.ts +13 -13
- package/types/tasty/injector/sheet-manager.d.ts +1 -25
- package/types/tasty/injector/types.d.ts +1 -20
- package/types/tasty/parser/parser.d.ts +0 -4
- package/types/tasty/parser/types.d.ts +0 -1
- package/types/tasty/providers/BreakpointsProvider.d.ts +8 -0
- package/types/tasty/styles/fill.d.ts +1 -11
- package/types/tasty/styles/margin.d.ts +1 -3
- package/types/tasty/styles/padding.d.ts +1 -3
- package/types/tasty/styles/types.d.ts +3 -13
- package/types/tasty/tasty.d.ts +840 -891
- package/types/tasty/utils/getModCombinations.d.ts +9 -0
- package/types/tasty/utils/renderStyles.d.ts +41 -0
- package/types/tasty/utils/responsive.d.ts +8 -0
- package/types/tasty/utils/styles.d.ts +6 -50
- package/types/tokens.d.ts +221 -0
- package/es/tasty/chunks/cacheKey.js +0 -98
- package/es/tasty/chunks/definitions.js +0 -280
- package/es/tasty/chunks/index.js +0 -12
- package/es/tasty/chunks/renderChunk.js +0 -97
- package/es/tasty/config.js +0 -244
- package/es/tasty/hooks/index.js +0 -12
- package/es/tasty/hooks/useGlobalStyles.js +0 -67
- package/es/tasty/hooks/useRawCSS.js +0 -40
- package/es/tasty/hooks/useStyles.js +0 -146
- package/es/tasty/pipeline/conditions.js +0 -469
- package/es/tasty/pipeline/exclusive.js +0 -193
- package/es/tasty/pipeline/index.js +0 -515
- package/es/tasty/pipeline/materialize.js +0 -1001
- package/es/tasty/pipeline/parseStateKey.js +0 -565
- package/es/tasty/pipeline/simplify.js +0 -786
- package/es/tasty/plugins/index.js +0 -26
- package/es/tasty/plugins/okhsl-plugin.js +0 -400
- package/es/tasty/plugins/types.js +0 -10
- package/es/tasty/states/index.js +0 -515
- package/es/tasty/static/index.js +0 -47
- package/es/tasty/static/tastyStatic.js +0 -55
- package/es/tasty/static/types.js +0 -34
- package/es/tasty/utils/typography.js +0 -67
- package/es/tasty/zero/babel.js +0 -401
- package/es/tasty/zero/css-writer.js +0 -94
- package/es/tasty/zero/extractor.js +0 -75
- package/es/tasty/zero/index.js +0 -28
- package/es/tasty/zero/next.js +0 -102
- package/es/tokens/base.js +0 -64
- package/es/tokens/colors.js +0 -68
- package/es/tokens/index.js +0 -63
- package/es/tokens/layout.js +0 -26
- package/es/tokens/shadows.js +0 -27
- package/es/tokens/sizes.js +0 -44
- package/es/tokens/spacing.js +0 -22
- package/es/tokens/typography.js +0 -237
- package/types/tasty/chunks/cacheKey.d.ts +0 -26
- package/types/tasty/chunks/definitions.d.ts +0 -75
- package/types/tasty/chunks/index.d.ts +0 -4
- package/types/tasty/chunks/renderChunk.d.ts +0 -25
- package/types/tasty/config.d.ts +0 -145
- package/types/tasty/hooks/index.d.ts +0 -4
- package/types/tasty/hooks/useGlobalStyles.d.ts +0 -22
- package/types/tasty/hooks/useRawCSS.d.ts +0 -50
- package/types/tasty/hooks/useStyles.d.ts +0 -38
- package/types/tasty/pipeline/conditions.d.ts +0 -248
- package/types/tasty/pipeline/exclusive.d.ts +0 -78
- package/types/tasty/pipeline/index.d.ts +0 -67
- package/types/tasty/pipeline/materialize.d.ts +0 -115
- package/types/tasty/pipeline/parseStateKey.d.ts +0 -20
- package/types/tasty/pipeline/simplify.d.ts +0 -28
- package/types/tasty/plugins/index.d.ts +0 -17
- package/types/tasty/plugins/okhsl-plugin.d.ts +0 -45
- package/types/tasty/plugins/types.d.ts +0 -34
- package/types/tasty/states/index.d.ts +0 -101
- package/types/tasty/static/index.d.ts +0 -39
- package/types/tasty/static/tastyStatic.d.ts +0 -41
- package/types/tasty/static/types.d.ts +0 -44
- package/types/tasty/utils/typography.d.ts +0 -32
- package/types/tasty/zero/babel.d.ts +0 -56
- package/types/tasty/zero/css-writer.d.ts +0 -41
- package/types/tasty/zero/extractor.d.ts +0 -19
- package/types/tasty/zero/index.d.ts +0 -18
- package/types/tasty/zero/next.d.ts +0 -57
- package/types/tokens/base.d.ts +0 -8
- package/types/tokens/colors.d.ts +0 -6
- package/types/tokens/index.d.ts +0 -41
- package/types/tokens/layout.d.ts +0 -7
- package/types/tokens/shadows.d.ts +0 -12
- package/types/tokens/sizes.d.ts +0 -27
- package/types/tokens/spacing.d.ts +0 -8
- package/types/tokens/typography.d.ts +0 -30
|
@@ -1,1001 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license MIT
|
|
3
|
-
* author: Cube Dev Team
|
|
4
|
-
* @cube-dev/ui-kit v0.0.0-canary-76be278
|
|
5
|
-
* Released under the MIT license.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* CSS Materialization
|
|
10
|
-
*
|
|
11
|
-
* Converts condition trees into CSS selectors and at-rules.
|
|
12
|
-
* This is the final stage that produces actual CSS output.
|
|
13
|
-
*/
|
|
14
|
-
import { Lru } from '../parser/lru';
|
|
15
|
-
// ============================================================================
|
|
16
|
-
// Caching
|
|
17
|
-
// ============================================================================
|
|
18
|
-
const conditionCache = new Lru(3000);
|
|
19
|
-
// ============================================================================
|
|
20
|
-
// Main Functions
|
|
21
|
-
// ============================================================================
|
|
22
|
-
/**
|
|
23
|
-
* Convert a condition tree to CSS components
|
|
24
|
-
*/
|
|
25
|
-
export function conditionToCSS(node) {
|
|
26
|
-
// Check cache
|
|
27
|
-
const key = getConditionKey(node);
|
|
28
|
-
const cached = conditionCache.get(key);
|
|
29
|
-
if (cached) {
|
|
30
|
-
return cached;
|
|
31
|
-
}
|
|
32
|
-
const result = conditionToCSSInner(node);
|
|
33
|
-
// Cache result
|
|
34
|
-
conditionCache.set(key, result);
|
|
35
|
-
return result;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Clear the condition cache (for testing)
|
|
39
|
-
*/
|
|
40
|
-
export function clearConditionCache() {
|
|
41
|
-
conditionCache.clear();
|
|
42
|
-
}
|
|
43
|
-
// ============================================================================
|
|
44
|
-
// Inner Implementation
|
|
45
|
-
// ============================================================================
|
|
46
|
-
/**
|
|
47
|
-
* Create an empty selector variant
|
|
48
|
-
*/
|
|
49
|
-
function emptyVariant() {
|
|
50
|
-
return {
|
|
51
|
-
modifierSelectors: [],
|
|
52
|
-
ownSelectors: [],
|
|
53
|
-
mediaConditions: [],
|
|
54
|
-
containerConditions: [],
|
|
55
|
-
startingStyle: false,
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
function conditionToCSSInner(node) {
|
|
59
|
-
// Base case: TRUE condition - single empty variant (matches everything)
|
|
60
|
-
if (node.kind === 'true') {
|
|
61
|
-
return {
|
|
62
|
-
variants: [emptyVariant()],
|
|
63
|
-
isImpossible: false,
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
// Base case: FALSE condition - no variants (matches nothing)
|
|
67
|
-
if (node.kind === 'false') {
|
|
68
|
-
return {
|
|
69
|
-
variants: [],
|
|
70
|
-
isImpossible: true,
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
// State condition
|
|
74
|
-
if (node.kind === 'state') {
|
|
75
|
-
return stateToCSS(node);
|
|
76
|
-
}
|
|
77
|
-
// Compound condition
|
|
78
|
-
if (node.kind === 'compound') {
|
|
79
|
-
if (node.operator === 'AND') {
|
|
80
|
-
return andToCSS(node.children);
|
|
81
|
-
}
|
|
82
|
-
else {
|
|
83
|
-
return orToCSS(node.children);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
// Fallback - single empty variant
|
|
87
|
-
return {
|
|
88
|
-
variants: [emptyVariant()],
|
|
89
|
-
isImpossible: false,
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Convert a state condition to CSS
|
|
94
|
-
*/
|
|
95
|
-
function stateToCSS(state) {
|
|
96
|
-
switch (state.type) {
|
|
97
|
-
case 'media': {
|
|
98
|
-
// Media conditions can return multiple variants for negated ranges (OR branches)
|
|
99
|
-
const mediaResults = mediaToParsed(state);
|
|
100
|
-
const variants = mediaResults.map((mediaCond) => {
|
|
101
|
-
const v = emptyVariant();
|
|
102
|
-
v.mediaConditions.push(mediaCond);
|
|
103
|
-
return v;
|
|
104
|
-
});
|
|
105
|
-
return { variants, isImpossible: false };
|
|
106
|
-
}
|
|
107
|
-
default: {
|
|
108
|
-
const variant = emptyVariant();
|
|
109
|
-
switch (state.type) {
|
|
110
|
-
case 'modifier':
|
|
111
|
-
variant.modifierSelectors.push(modifierToCSS(state));
|
|
112
|
-
break;
|
|
113
|
-
case 'pseudo':
|
|
114
|
-
variant.modifierSelectors.push(pseudoToCSS(state));
|
|
115
|
-
break;
|
|
116
|
-
case 'container':
|
|
117
|
-
variant.containerConditions.push(containerToParsed(state));
|
|
118
|
-
break;
|
|
119
|
-
case 'root':
|
|
120
|
-
variant.rootPrefix = rootToCSS(state);
|
|
121
|
-
break;
|
|
122
|
-
case 'own':
|
|
123
|
-
variant.ownSelectors.push(...ownToCSS(state));
|
|
124
|
-
break;
|
|
125
|
-
case 'starting':
|
|
126
|
-
variant.startingStyle = !state.negated;
|
|
127
|
-
break;
|
|
128
|
-
}
|
|
129
|
-
return {
|
|
130
|
-
variants: [variant],
|
|
131
|
-
isImpossible: false,
|
|
132
|
-
};
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* Convert modifier condition to CSS selector
|
|
138
|
-
*/
|
|
139
|
-
function modifierToCSS(state) {
|
|
140
|
-
let selector;
|
|
141
|
-
if (state.value !== undefined) {
|
|
142
|
-
// Value attribute: [data-attr="value"]
|
|
143
|
-
const op = state.operator || '=';
|
|
144
|
-
selector = `[${state.attribute}${op}"${state.value}"]`;
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
// Boolean attribute: [data-attr]
|
|
148
|
-
selector = `[${state.attribute}]`;
|
|
149
|
-
}
|
|
150
|
-
if (state.negated) {
|
|
151
|
-
return `:not(${selector})`;
|
|
152
|
-
}
|
|
153
|
-
return selector;
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* Convert pseudo condition to CSS selector
|
|
157
|
-
*/
|
|
158
|
-
function pseudoToCSS(state) {
|
|
159
|
-
if (state.negated) {
|
|
160
|
-
// Wrap in :not() if not already
|
|
161
|
-
if (state.pseudo.startsWith(':not(')) {
|
|
162
|
-
// Double negation - remove :not()
|
|
163
|
-
return state.pseudo.slice(5, -1);
|
|
164
|
-
}
|
|
165
|
-
return `:not(${state.pseudo})`;
|
|
166
|
-
}
|
|
167
|
-
return state.pseudo;
|
|
168
|
-
}
|
|
169
|
-
/**
|
|
170
|
-
* Convert media condition to parsed structure(s)
|
|
171
|
-
* Returns an array because negated ranges produce OR branches (two separate conditions)
|
|
172
|
-
*/
|
|
173
|
-
function mediaToParsed(state) {
|
|
174
|
-
if (state.subtype === 'type') {
|
|
175
|
-
// @media:print → @media print (or @media not print)
|
|
176
|
-
const mediaType = state.mediaType || 'all';
|
|
177
|
-
return [
|
|
178
|
-
{
|
|
179
|
-
subtype: 'type',
|
|
180
|
-
negated: state.negated ?? false,
|
|
181
|
-
condition: mediaType,
|
|
182
|
-
mediaType: state.mediaType,
|
|
183
|
-
},
|
|
184
|
-
];
|
|
185
|
-
}
|
|
186
|
-
else if (state.subtype === 'feature') {
|
|
187
|
-
// @media(prefers-contrast: high) → @media (prefers-contrast: high)
|
|
188
|
-
let condition;
|
|
189
|
-
if (state.featureValue) {
|
|
190
|
-
condition = `(${state.feature}: ${state.featureValue})`;
|
|
191
|
-
}
|
|
192
|
-
else {
|
|
193
|
-
condition = `(${state.feature})`;
|
|
194
|
-
}
|
|
195
|
-
return [
|
|
196
|
-
{
|
|
197
|
-
subtype: 'feature',
|
|
198
|
-
negated: state.negated ?? false,
|
|
199
|
-
condition,
|
|
200
|
-
feature: state.feature,
|
|
201
|
-
featureValue: state.featureValue,
|
|
202
|
-
},
|
|
203
|
-
];
|
|
204
|
-
}
|
|
205
|
-
else {
|
|
206
|
-
// Dimension query - negation is handled by inverting the condition
|
|
207
|
-
// because "not (width < x)" doesn't work reliably in browsers
|
|
208
|
-
return dimensionToMediaParsed(state.dimension || 'width', state.lowerBound, state.upperBound, state.negated ?? false);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
/**
|
|
212
|
-
* Convert dimension bounds to parsed media condition(s)
|
|
213
|
-
* Returns an array because negated ranges produce OR branches (two separate conditions)
|
|
214
|
-
*/
|
|
215
|
-
function dimensionToMediaParsed(dimension, lowerBound, upperBound, negated) {
|
|
216
|
-
if (negated) {
|
|
217
|
-
// Invert the condition manually since "not (width < x)" doesn't work in browsers
|
|
218
|
-
// Single bounds: flip the operator → returns single condition
|
|
219
|
-
// Range: NOT (a <= x < b) = (x < a) OR (x >= b) → returns two conditions (OR branches)
|
|
220
|
-
if (lowerBound && upperBound) {
|
|
221
|
-
// Range query: (lower <= dim < upper) negated is (dim < lower) OR (dim >= upper)
|
|
222
|
-
// Return two separate conditions - these become separate variants
|
|
223
|
-
const lowerOp = lowerBound.inclusive ? '<' : '<=';
|
|
224
|
-
const upperOp = upperBound.inclusive ? '>' : '>=';
|
|
225
|
-
return [
|
|
226
|
-
{
|
|
227
|
-
subtype: 'dimension',
|
|
228
|
-
negated: false,
|
|
229
|
-
condition: `(${dimension} ${lowerOp} ${lowerBound.value})`,
|
|
230
|
-
dimension,
|
|
231
|
-
upperBound: {
|
|
232
|
-
value: lowerBound.value,
|
|
233
|
-
valueNumeric: lowerBound.valueNumeric,
|
|
234
|
-
inclusive: !lowerBound.inclusive,
|
|
235
|
-
},
|
|
236
|
-
},
|
|
237
|
-
{
|
|
238
|
-
subtype: 'dimension',
|
|
239
|
-
negated: false,
|
|
240
|
-
condition: `(${dimension} ${upperOp} ${upperBound.value})`,
|
|
241
|
-
dimension,
|
|
242
|
-
lowerBound: {
|
|
243
|
-
value: upperBound.value,
|
|
244
|
-
valueNumeric: upperBound.valueNumeric,
|
|
245
|
-
inclusive: !upperBound.inclusive,
|
|
246
|
-
},
|
|
247
|
-
},
|
|
248
|
-
];
|
|
249
|
-
}
|
|
250
|
-
else if (upperBound) {
|
|
251
|
-
// (dim < upper) negated is (dim >= upper)
|
|
252
|
-
// (dim <= upper) negated is (dim > upper)
|
|
253
|
-
const op = upperBound.inclusive ? '>' : '>=';
|
|
254
|
-
return [
|
|
255
|
-
{
|
|
256
|
-
subtype: 'dimension',
|
|
257
|
-
negated: false,
|
|
258
|
-
condition: `(${dimension} ${op} ${upperBound.value})`,
|
|
259
|
-
dimension,
|
|
260
|
-
lowerBound: {
|
|
261
|
-
value: upperBound.value,
|
|
262
|
-
valueNumeric: upperBound.valueNumeric,
|
|
263
|
-
inclusive: !upperBound.inclusive,
|
|
264
|
-
},
|
|
265
|
-
},
|
|
266
|
-
];
|
|
267
|
-
}
|
|
268
|
-
else if (lowerBound) {
|
|
269
|
-
// (dim >= lower) negated is (dim < lower)
|
|
270
|
-
// (dim > lower) negated is (dim <= lower)
|
|
271
|
-
const op = lowerBound.inclusive ? '<' : '<=';
|
|
272
|
-
return [
|
|
273
|
-
{
|
|
274
|
-
subtype: 'dimension',
|
|
275
|
-
negated: false,
|
|
276
|
-
condition: `(${dimension} ${op} ${lowerBound.value})`,
|
|
277
|
-
dimension,
|
|
278
|
-
upperBound: {
|
|
279
|
-
value: lowerBound.value,
|
|
280
|
-
valueNumeric: lowerBound.valueNumeric,
|
|
281
|
-
inclusive: !lowerBound.inclusive,
|
|
282
|
-
},
|
|
283
|
-
},
|
|
284
|
-
];
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
// Non-negated conditions
|
|
288
|
-
let condition;
|
|
289
|
-
if (lowerBound && upperBound) {
|
|
290
|
-
const lowerOp = lowerBound.inclusive ? '<=' : '<';
|
|
291
|
-
const upperOp = upperBound.inclusive ? '<=' : '<';
|
|
292
|
-
condition = `(${lowerBound.value} ${lowerOp} ${dimension} ${upperOp} ${upperBound.value})`;
|
|
293
|
-
}
|
|
294
|
-
else if (upperBound) {
|
|
295
|
-
const op = upperBound.inclusive ? '<=' : '<';
|
|
296
|
-
condition = `(${dimension} ${op} ${upperBound.value})`;
|
|
297
|
-
}
|
|
298
|
-
else if (lowerBound) {
|
|
299
|
-
const op = lowerBound.inclusive ? '>=' : '>';
|
|
300
|
-
condition = `(${dimension} ${op} ${lowerBound.value})`;
|
|
301
|
-
}
|
|
302
|
-
else {
|
|
303
|
-
condition = `(${dimension})`;
|
|
304
|
-
}
|
|
305
|
-
return [
|
|
306
|
-
{
|
|
307
|
-
subtype: 'dimension',
|
|
308
|
-
negated: false,
|
|
309
|
-
condition,
|
|
310
|
-
dimension,
|
|
311
|
-
lowerBound,
|
|
312
|
-
upperBound,
|
|
313
|
-
},
|
|
314
|
-
];
|
|
315
|
-
}
|
|
316
|
-
/**
|
|
317
|
-
* Convert container condition to parsed structure
|
|
318
|
-
* This enables structured analysis for contradiction detection and condition combining
|
|
319
|
-
*/
|
|
320
|
-
function containerToParsed(state) {
|
|
321
|
-
let condition;
|
|
322
|
-
if (state.subtype === 'style') {
|
|
323
|
-
// Style query: style(--prop: value)
|
|
324
|
-
if (state.propertyValue) {
|
|
325
|
-
condition = `style(--${state.property}: ${state.propertyValue})`;
|
|
326
|
-
}
|
|
327
|
-
else {
|
|
328
|
-
condition = `style(--${state.property})`;
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
else {
|
|
332
|
-
// Dimension query
|
|
333
|
-
condition = dimensionToContainerCondition(state.dimension || 'width', state.lowerBound, state.upperBound);
|
|
334
|
-
}
|
|
335
|
-
return {
|
|
336
|
-
name: state.containerName,
|
|
337
|
-
condition,
|
|
338
|
-
negated: state.negated ?? false,
|
|
339
|
-
subtype: state.subtype,
|
|
340
|
-
property: state.property,
|
|
341
|
-
propertyValue: state.propertyValue,
|
|
342
|
-
};
|
|
343
|
-
}
|
|
344
|
-
/**
|
|
345
|
-
* Convert dimension bounds to container query condition (single string)
|
|
346
|
-
* Container queries support "not (condition)", so no need to invert manually
|
|
347
|
-
*/
|
|
348
|
-
function dimensionToContainerCondition(dimension, lowerBound, upperBound) {
|
|
349
|
-
if (lowerBound && upperBound) {
|
|
350
|
-
const lowerOp = lowerBound.inclusive ? '<=' : '<';
|
|
351
|
-
const upperOp = upperBound.inclusive ? '<=' : '<';
|
|
352
|
-
return `(${lowerBound.value} ${lowerOp} ${dimension} ${upperOp} ${upperBound.value})`;
|
|
353
|
-
}
|
|
354
|
-
else if (upperBound) {
|
|
355
|
-
const op = upperBound.inclusive ? '<=' : '<';
|
|
356
|
-
return `(${dimension} ${op} ${upperBound.value})`;
|
|
357
|
-
}
|
|
358
|
-
else if (lowerBound) {
|
|
359
|
-
const op = lowerBound.inclusive ? '>=' : '>';
|
|
360
|
-
return `(${dimension} ${op} ${lowerBound.value})`;
|
|
361
|
-
}
|
|
362
|
-
return '(width)'; // Fallback
|
|
363
|
-
}
|
|
364
|
-
/**
|
|
365
|
-
* Convert root condition to CSS selector prefix
|
|
366
|
-
*/
|
|
367
|
-
function rootToCSS(state) {
|
|
368
|
-
if (state.negated) {
|
|
369
|
-
return `:root:not(${state.selector})`;
|
|
370
|
-
}
|
|
371
|
-
return `:root${state.selector}`;
|
|
372
|
-
}
|
|
373
|
-
/**
|
|
374
|
-
* Convert own condition to CSS selectors for sub-element
|
|
375
|
-
*/
|
|
376
|
-
function ownToCSS(state) {
|
|
377
|
-
const innerCSS = conditionToCSS(state.innerCondition);
|
|
378
|
-
if (innerCSS.isImpossible || innerCSS.variants.length === 0) {
|
|
379
|
-
return [];
|
|
380
|
-
}
|
|
381
|
-
// Collect all modifier selectors from all variants
|
|
382
|
-
// (For @own, we typically expect simple conditions, so usually just one variant)
|
|
383
|
-
const allSelectors = [];
|
|
384
|
-
for (const variant of innerCSS.variants) {
|
|
385
|
-
allSelectors.push(...variant.modifierSelectors);
|
|
386
|
-
}
|
|
387
|
-
if (state.negated) {
|
|
388
|
-
// Negate all selectors
|
|
389
|
-
return allSelectors.map((s) => {
|
|
390
|
-
if (s.startsWith(':not(')) {
|
|
391
|
-
// Double negation - remove :not()
|
|
392
|
-
return s.slice(5, -1);
|
|
393
|
-
}
|
|
394
|
-
return `:not(${s})`;
|
|
395
|
-
});
|
|
396
|
-
}
|
|
397
|
-
return allSelectors;
|
|
398
|
-
}
|
|
399
|
-
/**
|
|
400
|
-
* Deduplicate an array while preserving order
|
|
401
|
-
*/
|
|
402
|
-
function dedupeArray(arr) {
|
|
403
|
-
return [...new Set(arr)];
|
|
404
|
-
}
|
|
405
|
-
/**
|
|
406
|
-
* Merge two selector variants (AND operation)
|
|
407
|
-
* Deduplicates selectors to avoid `.foo:not([x]):not([x])` repetition
|
|
408
|
-
*/
|
|
409
|
-
function mergeVariants(a, b) {
|
|
410
|
-
// Merge media conditions and check for contradictions
|
|
411
|
-
const mergedMedia = dedupeMediaConditions([
|
|
412
|
-
...a.mediaConditions,
|
|
413
|
-
...b.mediaConditions,
|
|
414
|
-
]);
|
|
415
|
-
if (hasMediaContradiction(mergedMedia)) {
|
|
416
|
-
return null; // Impossible variant
|
|
417
|
-
}
|
|
418
|
-
// Combine root prefixes and check for contradictions
|
|
419
|
-
const combinedRoot = combineRootPrefixes(a.rootPrefix, b.rootPrefix);
|
|
420
|
-
if (combinedRoot && hasRootPrefixContradiction(combinedRoot)) {
|
|
421
|
-
return null; // Impossible variant
|
|
422
|
-
}
|
|
423
|
-
// Merge modifier selectors and check for contradictions
|
|
424
|
-
const mergedModifiers = dedupeArray([
|
|
425
|
-
...a.modifierSelectors,
|
|
426
|
-
...b.modifierSelectors,
|
|
427
|
-
]);
|
|
428
|
-
if (hasModifierContradiction(mergedModifiers)) {
|
|
429
|
-
return null; // Impossible variant
|
|
430
|
-
}
|
|
431
|
-
// Merge container conditions and check for contradictions
|
|
432
|
-
const mergedContainers = dedupeContainerConditions([
|
|
433
|
-
...a.containerConditions,
|
|
434
|
-
...b.containerConditions,
|
|
435
|
-
]);
|
|
436
|
-
if (hasContainerStyleContradiction(mergedContainers)) {
|
|
437
|
-
return null; // Impossible variant
|
|
438
|
-
}
|
|
439
|
-
return {
|
|
440
|
-
modifierSelectors: mergedModifiers,
|
|
441
|
-
ownSelectors: dedupeArray([...a.ownSelectors, ...b.ownSelectors]),
|
|
442
|
-
mediaConditions: mergedMedia,
|
|
443
|
-
containerConditions: mergedContainers,
|
|
444
|
-
rootPrefix: combinedRoot,
|
|
445
|
-
startingStyle: a.startingStyle || b.startingStyle,
|
|
446
|
-
};
|
|
447
|
-
}
|
|
448
|
-
/**
|
|
449
|
-
* Deduplicate media conditions by their key (subtype + condition + negated)
|
|
450
|
-
*/
|
|
451
|
-
function dedupeMediaConditions(conditions) {
|
|
452
|
-
const seen = new Set();
|
|
453
|
-
const result = [];
|
|
454
|
-
for (const c of conditions) {
|
|
455
|
-
const key = `${c.subtype}|${c.condition}|${c.negated}`;
|
|
456
|
-
if (!seen.has(key)) {
|
|
457
|
-
seen.add(key);
|
|
458
|
-
result.push(c);
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
return result;
|
|
462
|
-
}
|
|
463
|
-
/**
|
|
464
|
-
* Deduplicate container conditions by their key (name + condition + negated)
|
|
465
|
-
*/
|
|
466
|
-
function dedupeContainerConditions(conditions) {
|
|
467
|
-
const seen = new Set();
|
|
468
|
-
const result = [];
|
|
469
|
-
for (const c of conditions) {
|
|
470
|
-
const key = `${c.name ?? ''}|${c.condition}|${c.negated}`;
|
|
471
|
-
if (!seen.has(key)) {
|
|
472
|
-
seen.add(key);
|
|
473
|
-
result.push(c);
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
return result;
|
|
477
|
-
}
|
|
478
|
-
/**
|
|
479
|
-
* Check if a set of media conditions contains contradictions
|
|
480
|
-
* e.g., (prefers-color-scheme: light) AND NOT (prefers-color-scheme: light)
|
|
481
|
-
* or (width >= 900px) AND (width < 600px)
|
|
482
|
-
*
|
|
483
|
-
* Uses parsed media conditions for efficient analysis without regex parsing.
|
|
484
|
-
*/
|
|
485
|
-
function hasMediaContradiction(conditions) {
|
|
486
|
-
// Track conditions by their key (condition string) to detect A and NOT A
|
|
487
|
-
const featureConditions = new Map(); // key -> isPositive
|
|
488
|
-
const typeConditions = new Map(); // mediaType -> isPositive
|
|
489
|
-
// Track dimension conditions for range contradiction detection
|
|
490
|
-
const dimensionsByDim = new Map();
|
|
491
|
-
for (const cond of conditions) {
|
|
492
|
-
if (cond.subtype === 'type') {
|
|
493
|
-
// Type query: check for direct contradiction (print AND NOT print)
|
|
494
|
-
const key = cond.mediaType || 'all';
|
|
495
|
-
const existing = typeConditions.get(key);
|
|
496
|
-
if (existing !== undefined && existing !== !cond.negated) {
|
|
497
|
-
return true; // Contradiction: positive AND negated
|
|
498
|
-
}
|
|
499
|
-
typeConditions.set(key, !cond.negated);
|
|
500
|
-
}
|
|
501
|
-
else if (cond.subtype === 'feature') {
|
|
502
|
-
// Feature query: check for direct contradiction
|
|
503
|
-
const key = cond.condition;
|
|
504
|
-
const existing = featureConditions.get(key);
|
|
505
|
-
if (existing !== undefined && existing !== !cond.negated) {
|
|
506
|
-
return true; // Contradiction: positive AND negated
|
|
507
|
-
}
|
|
508
|
-
featureConditions.set(key, !cond.negated);
|
|
509
|
-
}
|
|
510
|
-
else if (cond.subtype === 'dimension') {
|
|
511
|
-
// Dimension query: check for range contradictions
|
|
512
|
-
// Note: negated conditions are already inverted in dimensionToMediaParsed
|
|
513
|
-
const dim = cond.dimension || 'width';
|
|
514
|
-
let bounds = dimensionsByDim.get(dim);
|
|
515
|
-
if (!bounds) {
|
|
516
|
-
bounds = { lowerBound: null, upperBound: null };
|
|
517
|
-
dimensionsByDim.set(dim, bounds);
|
|
518
|
-
}
|
|
519
|
-
// Track the effective bounds
|
|
520
|
-
if (cond.lowerBound?.valueNumeric != null) {
|
|
521
|
-
const value = cond.lowerBound.valueNumeric;
|
|
522
|
-
if (bounds.lowerBound === null || value > bounds.lowerBound) {
|
|
523
|
-
bounds.lowerBound = value;
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
|
-
if (cond.upperBound?.valueNumeric != null) {
|
|
527
|
-
const value = cond.upperBound.valueNumeric;
|
|
528
|
-
if (bounds.upperBound === null || value < bounds.upperBound) {
|
|
529
|
-
bounds.upperBound = value;
|
|
530
|
-
}
|
|
531
|
-
}
|
|
532
|
-
// Check for impossible range
|
|
533
|
-
if (bounds.lowerBound !== null &&
|
|
534
|
-
bounds.upperBound !== null &&
|
|
535
|
-
bounds.lowerBound >= bounds.upperBound) {
|
|
536
|
-
return true;
|
|
537
|
-
}
|
|
538
|
-
}
|
|
539
|
-
}
|
|
540
|
-
return false;
|
|
541
|
-
}
|
|
542
|
-
/**
|
|
543
|
-
* Check if a root prefix contains contradictions
|
|
544
|
-
* e.g., ":root:not([data-x="y"])[data-x="y"]" is a contradiction
|
|
545
|
-
*/
|
|
546
|
-
function hasRootPrefixContradiction(rootPrefix) {
|
|
547
|
-
return hasSelectorStringContradiction(rootPrefix);
|
|
548
|
-
}
|
|
549
|
-
/**
|
|
550
|
-
* Check if modifier selectors contain contradictions
|
|
551
|
-
* e.g., "[data-selected]" and ":not([data-selected])" together
|
|
552
|
-
*/
|
|
553
|
-
function hasModifierContradiction(modifiers) {
|
|
554
|
-
const combined = modifiers.join('');
|
|
555
|
-
return hasSelectorStringContradiction(combined);
|
|
556
|
-
}
|
|
557
|
-
/**
|
|
558
|
-
* Check if a selector string contains contradictions
|
|
559
|
-
* e.g., "[data-x]:not([data-x])" or "[data-x="y"]:not([data-x="y"])"
|
|
560
|
-
*/
|
|
561
|
-
function hasSelectorStringContradiction(selector) {
|
|
562
|
-
const positiveAttrs = [];
|
|
563
|
-
const negativeAttrs = [];
|
|
564
|
-
// Match :not([attr]) or :not([attr="value"])
|
|
565
|
-
const notPattern = /:not\(\[([^\]]+)\]\)/g;
|
|
566
|
-
let match;
|
|
567
|
-
while ((match = notPattern.exec(selector)) !== null) {
|
|
568
|
-
negativeAttrs.push(match[1]);
|
|
569
|
-
}
|
|
570
|
-
// Match [attr] or [attr="value"] (not inside :not())
|
|
571
|
-
// The lookbehind (?<!...) ensures we don't match attributes inside :not()
|
|
572
|
-
const attrPattern = /(?<!:not\()\[([^\]]+)\]/g;
|
|
573
|
-
while ((match = attrPattern.exec(selector)) !== null) {
|
|
574
|
-
positiveAttrs.push(match[1]);
|
|
575
|
-
}
|
|
576
|
-
// Check for contradictions
|
|
577
|
-
for (const neg of negativeAttrs) {
|
|
578
|
-
if (positiveAttrs.includes(neg)) {
|
|
579
|
-
return true;
|
|
580
|
-
}
|
|
581
|
-
}
|
|
582
|
-
return false;
|
|
583
|
-
}
|
|
584
|
-
/**
|
|
585
|
-
* Check if container conditions contain contradictions in style queries
|
|
586
|
-
* e.g., style(--variant: danger) and style(--variant: success) together
|
|
587
|
-
* Same property with different values = always false
|
|
588
|
-
*
|
|
589
|
-
* Uses parsed container conditions for efficient analysis without regex parsing.
|
|
590
|
-
*/
|
|
591
|
-
function hasContainerStyleContradiction(conditions) {
|
|
592
|
-
// Track style queries by property name
|
|
593
|
-
// key: property name, value: { hasExistence: boolean, values: Set<string>, hasNegatedExistence: boolean }
|
|
594
|
-
const styleQueries = new Map();
|
|
595
|
-
for (const cond of conditions) {
|
|
596
|
-
// Only analyze style queries
|
|
597
|
-
if (cond.subtype !== 'style' || !cond.property) {
|
|
598
|
-
continue;
|
|
599
|
-
}
|
|
600
|
-
const property = cond.property;
|
|
601
|
-
const value = cond.propertyValue;
|
|
602
|
-
if (!styleQueries.has(property)) {
|
|
603
|
-
styleQueries.set(property, {
|
|
604
|
-
hasExistence: false,
|
|
605
|
-
values: new Set(),
|
|
606
|
-
hasNegatedExistence: false,
|
|
607
|
-
});
|
|
608
|
-
}
|
|
609
|
-
const entry = styleQueries.get(property);
|
|
610
|
-
if (cond.negated) {
|
|
611
|
-
if (value === undefined) {
|
|
612
|
-
// not style(--prop) - negated existence check
|
|
613
|
-
entry.hasNegatedExistence = true;
|
|
614
|
-
}
|
|
615
|
-
// Negated value checks don't contradict positive value checks directly
|
|
616
|
-
// They just mean "not this value"
|
|
617
|
-
}
|
|
618
|
-
else {
|
|
619
|
-
if (value === undefined) {
|
|
620
|
-
// style(--prop) - existence check
|
|
621
|
-
entry.hasExistence = true;
|
|
622
|
-
}
|
|
623
|
-
else {
|
|
624
|
-
// style(--prop: value) - value check
|
|
625
|
-
entry.values.add(value);
|
|
626
|
-
}
|
|
627
|
-
}
|
|
628
|
-
}
|
|
629
|
-
// Check for contradictions
|
|
630
|
-
for (const [, entry] of styleQueries) {
|
|
631
|
-
// Contradiction: existence check + negated existence check
|
|
632
|
-
if (entry.hasExistence && entry.hasNegatedExistence) {
|
|
633
|
-
return true;
|
|
634
|
-
}
|
|
635
|
-
// Contradiction: multiple different values for same property
|
|
636
|
-
// style(--variant: danger) AND style(--variant: success) is impossible
|
|
637
|
-
if (entry.values.size > 1) {
|
|
638
|
-
return true;
|
|
639
|
-
}
|
|
640
|
-
// Contradiction: negated existence + value check
|
|
641
|
-
// not style(--variant) AND style(--variant: danger) is impossible
|
|
642
|
-
if (entry.hasNegatedExistence && entry.values.size > 0) {
|
|
643
|
-
return true;
|
|
644
|
-
}
|
|
645
|
-
}
|
|
646
|
-
return false;
|
|
647
|
-
}
|
|
648
|
-
/**
|
|
649
|
-
* Combine two root prefixes
|
|
650
|
-
*/
|
|
651
|
-
function combineRootPrefixes(a, b) {
|
|
652
|
-
if (!a)
|
|
653
|
-
return b;
|
|
654
|
-
if (!b)
|
|
655
|
-
return a;
|
|
656
|
-
// Combine: :root[x] + :root[y] → :root[x][y]
|
|
657
|
-
return `${a}${b.replace(':root', '')}`;
|
|
658
|
-
}
|
|
659
|
-
/**
|
|
660
|
-
* Get a unique key for a variant (for deduplication)
|
|
661
|
-
*/
|
|
662
|
-
function getVariantKey(v) {
|
|
663
|
-
const containerKey = v.containerConditions
|
|
664
|
-
.map((c) => `${c.name ?? ''}:${c.negated ? '!' : ''}${c.condition}`)
|
|
665
|
-
.sort()
|
|
666
|
-
.join('|');
|
|
667
|
-
const mediaKey = v.mediaConditions
|
|
668
|
-
.map((c) => `${c.subtype}:${c.negated ? '!' : ''}${c.condition}`)
|
|
669
|
-
.sort()
|
|
670
|
-
.join('|');
|
|
671
|
-
return [
|
|
672
|
-
v.modifierSelectors.slice().sort().join('|'),
|
|
673
|
-
v.ownSelectors.slice().sort().join('|'),
|
|
674
|
-
mediaKey,
|
|
675
|
-
containerKey,
|
|
676
|
-
v.rootPrefix || '',
|
|
677
|
-
v.startingStyle ? '1' : '0',
|
|
678
|
-
].join('###');
|
|
679
|
-
}
|
|
680
|
-
/**
|
|
681
|
-
* Check if variant A is a superset of variant B (A is more restrictive)
|
|
682
|
-
*
|
|
683
|
-
* If A has all of B's conditions plus more, then A is redundant
|
|
684
|
-
* because B already covers the same cases (and more).
|
|
685
|
-
*
|
|
686
|
-
* Example:
|
|
687
|
-
* A: :not([size=large]):not([size=medium]):not([size=small])
|
|
688
|
-
* B: :not([size=large])
|
|
689
|
-
* A is a superset of B, so A is redundant when B exists.
|
|
690
|
-
*/
|
|
691
|
-
function isVariantSuperset(a, b) {
|
|
692
|
-
// Must have same context (root prefix, at-rules, etc.)
|
|
693
|
-
if (a.rootPrefix !== b.rootPrefix)
|
|
694
|
-
return false;
|
|
695
|
-
if (a.startingStyle !== b.startingStyle)
|
|
696
|
-
return false;
|
|
697
|
-
// Check if a.mediaConditions is superset of b.mediaConditions
|
|
698
|
-
if (!isMediaConditionsSuperset(a.mediaConditions, b.mediaConditions))
|
|
699
|
-
return false;
|
|
700
|
-
// Check if a.containerConditions is superset of b.containerConditions
|
|
701
|
-
if (!isContainerConditionsSuperset(a.containerConditions, b.containerConditions))
|
|
702
|
-
return false;
|
|
703
|
-
// Check if a.modifierSelectors is superset of b.modifierSelectors
|
|
704
|
-
if (!isArraySuperset(a.modifierSelectors, b.modifierSelectors))
|
|
705
|
-
return false;
|
|
706
|
-
// Check if a.ownSelectors is superset of b.ownSelectors
|
|
707
|
-
if (!isArraySuperset(a.ownSelectors, b.ownSelectors))
|
|
708
|
-
return false;
|
|
709
|
-
// A is a superset if it has all of B's items (possibly more)
|
|
710
|
-
// and at least one category has strictly more items
|
|
711
|
-
const aTotal = a.mediaConditions.length +
|
|
712
|
-
a.containerConditions.length +
|
|
713
|
-
a.modifierSelectors.length +
|
|
714
|
-
a.ownSelectors.length;
|
|
715
|
-
const bTotal = b.mediaConditions.length +
|
|
716
|
-
b.containerConditions.length +
|
|
717
|
-
b.modifierSelectors.length +
|
|
718
|
-
b.ownSelectors.length;
|
|
719
|
-
return aTotal > bTotal;
|
|
720
|
-
}
|
|
721
|
-
/**
|
|
722
|
-
* Check if media conditions A is a superset of B
|
|
723
|
-
*/
|
|
724
|
-
function isMediaConditionsSuperset(a, b) {
|
|
725
|
-
const aKeys = new Set(a.map((c) => `${c.subtype}|${c.condition}|${c.negated}`));
|
|
726
|
-
for (const c of b) {
|
|
727
|
-
const key = `${c.subtype}|${c.condition}|${c.negated}`;
|
|
728
|
-
if (!aKeys.has(key))
|
|
729
|
-
return false;
|
|
730
|
-
}
|
|
731
|
-
return true;
|
|
732
|
-
}
|
|
733
|
-
/**
|
|
734
|
-
* Check if container conditions A is a superset of B
|
|
735
|
-
*/
|
|
736
|
-
function isContainerConditionsSuperset(a, b) {
|
|
737
|
-
const aKeys = new Set(a.map((c) => `${c.name ?? ''}|${c.condition}|${c.negated}`));
|
|
738
|
-
for (const c of b) {
|
|
739
|
-
const key = `${c.name ?? ''}|${c.condition}|${c.negated}`;
|
|
740
|
-
if (!aKeys.has(key))
|
|
741
|
-
return false;
|
|
742
|
-
}
|
|
743
|
-
return true;
|
|
744
|
-
}
|
|
745
|
-
/**
|
|
746
|
-
* Check if array A contains all elements of array B (superset)
|
|
747
|
-
*/
|
|
748
|
-
function isArraySuperset(a, b) {
|
|
749
|
-
const setA = new Set(a);
|
|
750
|
-
for (const item of b) {
|
|
751
|
-
if (!setA.has(item))
|
|
752
|
-
return false;
|
|
753
|
-
}
|
|
754
|
-
return true;
|
|
755
|
-
}
|
|
756
|
-
/**
|
|
757
|
-
* Deduplicate variants
|
|
758
|
-
*
|
|
759
|
-
* Removes:
|
|
760
|
-
* 1. Exact duplicates (same key)
|
|
761
|
-
* 2. Superset variants (more restrictive selectors that are redundant)
|
|
762
|
-
*/
|
|
763
|
-
function dedupeVariants(variants) {
|
|
764
|
-
// First pass: exact deduplication
|
|
765
|
-
const seen = new Set();
|
|
766
|
-
let result = [];
|
|
767
|
-
for (const v of variants) {
|
|
768
|
-
const key = getVariantKey(v);
|
|
769
|
-
if (!seen.has(key)) {
|
|
770
|
-
seen.add(key);
|
|
771
|
-
result.push(v);
|
|
772
|
-
}
|
|
773
|
-
}
|
|
774
|
-
// Second pass: remove supersets (more restrictive variants)
|
|
775
|
-
// Sort by total selector count (fewer selectors = less restrictive = keep)
|
|
776
|
-
result.sort((a, b) => {
|
|
777
|
-
const aCount = a.modifierSelectors.length +
|
|
778
|
-
a.ownSelectors.length +
|
|
779
|
-
a.mediaConditions.length +
|
|
780
|
-
a.containerConditions.length;
|
|
781
|
-
const bCount = b.modifierSelectors.length +
|
|
782
|
-
b.ownSelectors.length +
|
|
783
|
-
b.mediaConditions.length +
|
|
784
|
-
b.containerConditions.length;
|
|
785
|
-
return aCount - bCount;
|
|
786
|
-
});
|
|
787
|
-
// Remove variants that are supersets of earlier (less restrictive) variants
|
|
788
|
-
const filtered = [];
|
|
789
|
-
for (const candidate of result) {
|
|
790
|
-
let isRedundant = false;
|
|
791
|
-
for (const kept of filtered) {
|
|
792
|
-
if (isVariantSuperset(candidate, kept)) {
|
|
793
|
-
isRedundant = true;
|
|
794
|
-
break;
|
|
795
|
-
}
|
|
796
|
-
}
|
|
797
|
-
if (!isRedundant) {
|
|
798
|
-
filtered.push(candidate);
|
|
799
|
-
}
|
|
800
|
-
}
|
|
801
|
-
return filtered;
|
|
802
|
-
}
|
|
803
|
-
/**
|
|
804
|
-
* Combine AND conditions into CSS
|
|
805
|
-
*
|
|
806
|
-
* AND of conditions means cartesian product of variants:
|
|
807
|
-
* (A1 | A2) & (B1 | B2) = A1&B1 | A1&B2 | A2&B1 | A2&B2
|
|
808
|
-
*
|
|
809
|
-
* Variants that result in contradictions (e.g., conflicting media rules)
|
|
810
|
-
* are filtered out.
|
|
811
|
-
*/
|
|
812
|
-
function andToCSS(children) {
|
|
813
|
-
// Start with a single empty variant
|
|
814
|
-
let currentVariants = [emptyVariant()];
|
|
815
|
-
for (const child of children) {
|
|
816
|
-
const childCSS = conditionToCSSInner(child);
|
|
817
|
-
if (childCSS.isImpossible || childCSS.variants.length === 0) {
|
|
818
|
-
return { variants: [], isImpossible: true };
|
|
819
|
-
}
|
|
820
|
-
// Cartesian product: each current variant × each child variant
|
|
821
|
-
const newVariants = [];
|
|
822
|
-
for (const current of currentVariants) {
|
|
823
|
-
for (const childVariant of childCSS.variants) {
|
|
824
|
-
const merged = mergeVariants(current, childVariant);
|
|
825
|
-
// Skip impossible variants (contradictions detected during merge)
|
|
826
|
-
if (merged !== null) {
|
|
827
|
-
newVariants.push(merged);
|
|
828
|
-
}
|
|
829
|
-
}
|
|
830
|
-
}
|
|
831
|
-
if (newVariants.length === 0) {
|
|
832
|
-
return { variants: [], isImpossible: true };
|
|
833
|
-
}
|
|
834
|
-
// Deduplicate after each step to prevent exponential blowup
|
|
835
|
-
currentVariants = dedupeVariants(newVariants);
|
|
836
|
-
}
|
|
837
|
-
return {
|
|
838
|
-
variants: currentVariants,
|
|
839
|
-
isImpossible: false,
|
|
840
|
-
};
|
|
841
|
-
}
|
|
842
|
-
/**
|
|
843
|
-
* Combine OR conditions into CSS
|
|
844
|
-
*
|
|
845
|
-
* OR in CSS means multiple selector variants (DNF).
|
|
846
|
-
* Each variant becomes a separate selector in the comma-separated list,
|
|
847
|
-
* or multiple CSS rules if they have different at-rules.
|
|
848
|
-
*
|
|
849
|
-
* Note: OR exclusivity is handled at the pipeline level (expandOrConditions),
|
|
850
|
-
* so here we just collect all variants. Any remaining ORs in the condition
|
|
851
|
-
* tree (e.g., from De Morgan expansion) are handled as simple alternatives.
|
|
852
|
-
*/
|
|
853
|
-
function orToCSS(children) {
|
|
854
|
-
const allVariants = [];
|
|
855
|
-
for (const child of children) {
|
|
856
|
-
const childCSS = conditionToCSSInner(child);
|
|
857
|
-
if (childCSS.isImpossible)
|
|
858
|
-
continue;
|
|
859
|
-
allVariants.push(...childCSS.variants);
|
|
860
|
-
}
|
|
861
|
-
if (allVariants.length === 0) {
|
|
862
|
-
return { variants: [], isImpossible: true };
|
|
863
|
-
}
|
|
864
|
-
// Deduplicate variants
|
|
865
|
-
return {
|
|
866
|
-
variants: dedupeVariants(allVariants),
|
|
867
|
-
isImpossible: false,
|
|
868
|
-
};
|
|
869
|
-
}
|
|
870
|
-
// ============================================================================
|
|
871
|
-
// Utility Functions
|
|
872
|
-
// ============================================================================
|
|
873
|
-
/**
|
|
874
|
-
* Get a cache key for a condition
|
|
875
|
-
*/
|
|
876
|
-
function getConditionKey(node) {
|
|
877
|
-
if (node.kind === 'true')
|
|
878
|
-
return 'TRUE';
|
|
879
|
-
if (node.kind === 'false')
|
|
880
|
-
return 'FALSE';
|
|
881
|
-
if (node.kind === 'state')
|
|
882
|
-
return node.uniqueId;
|
|
883
|
-
if (node.kind === 'compound') {
|
|
884
|
-
const childKeys = node.children.map(getConditionKey).sort();
|
|
885
|
-
return `${node.operator}(${childKeys.join(',')})`;
|
|
886
|
-
}
|
|
887
|
-
return 'UNKNOWN';
|
|
888
|
-
}
|
|
889
|
-
/**
|
|
890
|
-
* Build a complete CSS selector from a single variant
|
|
891
|
-
*/
|
|
892
|
-
export function buildCSSSelectorFromVariant(className, variant, selectorSuffix = '') {
|
|
893
|
-
// Start with base class (doubled for specificity)
|
|
894
|
-
let selector = `.${className}.${className}`;
|
|
895
|
-
// Add modifier selectors
|
|
896
|
-
selector += variant.modifierSelectors.join('');
|
|
897
|
-
// Add selector suffix (e.g., ' [data-element="Label"]')
|
|
898
|
-
selector += selectorSuffix;
|
|
899
|
-
// Add own selectors (after sub-element)
|
|
900
|
-
selector += variant.ownSelectors.join('');
|
|
901
|
-
// Add root prefix if present
|
|
902
|
-
if (variant.rootPrefix) {
|
|
903
|
-
selector = `${variant.rootPrefix} ${selector}`;
|
|
904
|
-
}
|
|
905
|
-
return selector;
|
|
906
|
-
}
|
|
907
|
-
/**
|
|
908
|
-
* Build at-rules array from a variant
|
|
909
|
-
*/
|
|
910
|
-
export function buildAtRulesFromVariant(variant) {
|
|
911
|
-
const atRules = [];
|
|
912
|
-
// Add media rules - combine all conditions with "and"
|
|
913
|
-
if (variant.mediaConditions.length > 0) {
|
|
914
|
-
const conditionParts = variant.mediaConditions.map((c) => {
|
|
915
|
-
if (c.subtype === 'type') {
|
|
916
|
-
// Media type: print, screen, etc.
|
|
917
|
-
return c.negated ? `not ${c.condition}` : c.condition;
|
|
918
|
-
}
|
|
919
|
-
else {
|
|
920
|
-
// Feature or dimension: (condition) or not (condition)
|
|
921
|
-
return c.negated ? `not ${c.condition}` : c.condition;
|
|
922
|
-
}
|
|
923
|
-
});
|
|
924
|
-
atRules.push(`@media ${conditionParts.join(' and ')}`);
|
|
925
|
-
}
|
|
926
|
-
// Add container rules - group by container name and combine with "and"
|
|
927
|
-
if (variant.containerConditions.length > 0) {
|
|
928
|
-
// Group conditions by container name (undefined = unnamed/nearest)
|
|
929
|
-
const byName = new Map();
|
|
930
|
-
for (const cond of variant.containerConditions) {
|
|
931
|
-
const group = byName.get(cond.name) || [];
|
|
932
|
-
group.push(cond);
|
|
933
|
-
byName.set(cond.name, group);
|
|
934
|
-
}
|
|
935
|
-
// Build one @container rule per container name
|
|
936
|
-
for (const [name, conditions] of byName) {
|
|
937
|
-
// CSS Container Query syntax requires parentheses around negated conditions:
|
|
938
|
-
// @container (not style(--x)) and style(--y) - NOT @container not style(--x) and style(--y)
|
|
939
|
-
const conditionParts = conditions.map((c) => c.negated ? `(not ${c.condition})` : c.condition);
|
|
940
|
-
const namePrefix = name ? `${name} ` : '';
|
|
941
|
-
atRules.push(`@container ${namePrefix}${conditionParts.join(' and ')}`);
|
|
942
|
-
}
|
|
943
|
-
}
|
|
944
|
-
// Add starting-style
|
|
945
|
-
if (variant.startingStyle) {
|
|
946
|
-
atRules.push('@starting-style');
|
|
947
|
-
}
|
|
948
|
-
return atRules;
|
|
949
|
-
}
|
|
950
|
-
/**
|
|
951
|
-
* Get a string key for a variant's at-rules (for grouping)
|
|
952
|
-
*/
|
|
953
|
-
function getAtRulesKey(variant) {
|
|
954
|
-
const atRules = buildAtRulesFromVariant(variant);
|
|
955
|
-
return atRules.sort().join('|||');
|
|
956
|
-
}
|
|
957
|
-
/**
|
|
958
|
-
* Materialize a computed rule into final CSS format
|
|
959
|
-
*
|
|
960
|
-
* Returns an array of CSSRules because OR conditions may require multiple rules
|
|
961
|
-
* (when different branches have different at-rules)
|
|
962
|
-
*/
|
|
963
|
-
export function materializeRule(condition, declarations, selectorSuffix, className) {
|
|
964
|
-
const components = conditionToCSS(condition);
|
|
965
|
-
if (components.isImpossible || components.variants.length === 0) {
|
|
966
|
-
return [];
|
|
967
|
-
}
|
|
968
|
-
const declarationsStr = Object.entries(declarations)
|
|
969
|
-
.map(([prop, value]) => `${prop}: ${value};`)
|
|
970
|
-
.join(' ');
|
|
971
|
-
// Group variants by their at-rules (variants with same at-rules can be combined with commas)
|
|
972
|
-
const byAtRules = new Map();
|
|
973
|
-
for (const variant of components.variants) {
|
|
974
|
-
const key = getAtRulesKey(variant);
|
|
975
|
-
const group = byAtRules.get(key) || [];
|
|
976
|
-
group.push(variant);
|
|
977
|
-
byAtRules.set(key, group);
|
|
978
|
-
}
|
|
979
|
-
// Generate one CSSRule per at-rules group
|
|
980
|
-
const rules = [];
|
|
981
|
-
for (const [, variants] of byAtRules) {
|
|
982
|
-
// All variants in this group have the same at-rules, so combine selectors with commas
|
|
983
|
-
const selectors = variants.map((v) => buildCSSSelectorFromVariant(className, v, selectorSuffix));
|
|
984
|
-
const selector = selectors.join(', ');
|
|
985
|
-
const atRules = buildAtRulesFromVariant(variants[0]);
|
|
986
|
-
const rule = {
|
|
987
|
-
selector,
|
|
988
|
-
declarations: declarationsStr,
|
|
989
|
-
};
|
|
990
|
-
if (atRules.length > 0) {
|
|
991
|
-
rule.atRules = atRules;
|
|
992
|
-
}
|
|
993
|
-
if (variants[0].rootPrefix) {
|
|
994
|
-
rule.rootPrefix = variants[0].rootPrefix;
|
|
995
|
-
}
|
|
996
|
-
rules.push(rule);
|
|
997
|
-
}
|
|
998
|
-
return rules;
|
|
999
|
-
}
|
|
1000
|
-
|
|
1001
|
-
|