@cube-dev/ui-kit 0.74.3 → 0.76.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +28 -0
- package/es/_internal/hooks/index.js +1 -1
- package/es/_internal/hooks/use-chained-callback.js +1 -1
- package/es/_internal/hooks/use-debounced-value.js +1 -1
- package/es/_internal/hooks/use-deprecation-warning.js +1 -1
- package/es/_internal/hooks/use-effect-once.js +1 -1
- package/es/_internal/hooks/use-event.js +1 -1
- package/es/_internal/hooks/use-is-first-render.js +1 -1
- package/es/_internal/hooks/use-sync-ref.js +1 -1
- package/es/_internal/hooks/use-timer/index.js +1 -1
- package/es/_internal/hooks/use-timer/timer.js +1 -1
- package/es/_internal/hooks/use-timer/use-timer.js +1 -1
- package/es/_internal/hooks/use-update-effect.js +1 -1
- package/es/_internal/hooks/use-warn.js +1 -1
- package/es/_internal/index.js +1 -1
- package/es/components/Block.js +1 -1
- package/es/components/GlobalStyles.js +10 -15
- package/es/components/GridProvider.js +1 -1
- package/es/components/HiddenInput.js +25 -24
- package/es/components/Item.js +1 -1
- package/es/components/OpenTrasition.js +1 -1
- package/es/components/Root.js +2 -2
- package/es/components/actions/Action/Action.js +15 -19
- package/es/components/actions/Button/Button.js +2 -1
- package/es/components/actions/Button/index.js +1 -1
- package/es/components/actions/ButtonGroup/ButtonGroup.js +1 -1
- package/es/components/actions/CommandMenu/CommandMenu.js +1 -1
- package/es/components/actions/CommandMenu/index.js +1 -1
- package/es/components/actions/CommandMenu/styled.js +1 -1
- package/es/components/actions/ItemButton/ItemButton.js +1 -1
- package/es/components/actions/ItemButton/index.js +1 -1
- package/es/components/actions/Menu/Menu.js +1 -1
- package/es/components/actions/Menu/MenuItem.js +3 -8
- package/es/components/actions/Menu/MenuSection.js +1 -1
- package/es/components/actions/Menu/MenuTrigger.js +1 -1
- package/es/components/actions/Menu/SubMenuTrigger.js +1 -1
- package/es/components/actions/Menu/SubmenuTriggerContext.js +1 -1
- package/es/components/actions/Menu/context.js +1 -1
- package/es/components/actions/Menu/index.js +1 -1
- package/es/components/actions/Menu/styled.js +1 -1
- package/es/components/actions/index.js +1 -1
- package/es/components/actions/use-action.js +1 -1
- package/es/components/actions/use-anchored-menu.js +1 -1
- package/es/components/actions/use-context-menu.js +1 -1
- package/es/components/content/ActiveZone/ActiveZone.js +1 -1
- package/es/components/content/Alert/Alert.js +1 -1
- package/es/components/content/Alert/index.js +1 -1
- package/es/components/content/Alert/types.js +1 -1
- package/es/components/content/Alert/use-alert.js +1 -1
- package/es/components/content/Avatar/Avatar.js +1 -1
- package/es/components/content/Badge/Badge.js +1 -1
- package/es/components/content/Card/Card.js +1 -1
- package/es/components/content/Content.js +1 -1
- package/es/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
- package/es/components/content/CopyPasteBlock/index.js +1 -1
- package/es/components/content/CopySnippet/CopySnippet.js +1 -1
- package/es/components/content/CopySnippet/index.js +1 -1
- package/es/components/content/Divider.js +1 -1
- package/es/components/content/Footer.js +1 -1
- package/es/components/content/Header.js +1 -1
- package/es/components/content/HotKeys/HotKeys.js +1 -1
- package/es/components/content/HotKeys/index.js +1 -1
- package/es/components/content/ItemBase/ItemBase.js +9 -3
- package/es/components/content/ItemBase/index.js +1 -1
- package/es/components/content/List/SectionHeading.js +1 -1
- package/es/components/content/List/index.js +1 -1
- package/es/components/content/Paragraph.js +1 -1
- package/es/components/content/Placeholder/Placeholder.js +46 -41
- package/es/components/content/PrismCode/PrismCode.js +1 -1
- package/es/components/content/PrismCode/prismSetup.js +1 -1
- package/es/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
- package/es/components/content/Result/Result.js +1 -1
- package/es/components/content/Skeleton/Skeleton.js +1 -1
- package/es/components/content/Tag/Tag.js +1 -1
- package/es/components/content/Text.js +3 -3
- package/es/components/content/Title.js +3 -3
- package/es/components/fields/Checkbox/Checkbox.js +1 -1
- package/es/components/fields/Checkbox/CheckboxGroup.js +1 -1
- package/es/components/fields/Checkbox/context.js +1 -1
- package/es/components/fields/Checkbox/index.js +1 -1
- package/es/components/fields/ComboBox/ComboBox.js +3 -7
- package/es/components/fields/ComboBox/index.js +1 -1
- package/es/components/fields/DatePicker/DateInput.js +1 -1
- package/es/components/fields/DatePicker/DateInputBase.js +1 -1
- package/es/components/fields/DatePicker/DatePicker.js +1 -1
- package/es/components/fields/DatePicker/DatePickerButton.js +1 -1
- package/es/components/fields/DatePicker/DatePickerElement.js +1 -1
- package/es/components/fields/DatePicker/DatePickerInput.js +1 -1
- package/es/components/fields/DatePicker/DatePickerSegment.js +1 -1
- package/es/components/fields/DatePicker/DateRangePicker.js +1 -1
- package/es/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
- package/es/components/fields/DatePicker/TimeInput.js +1 -1
- package/es/components/fields/DatePicker/index.js +1 -1
- package/es/components/fields/DatePicker/intl.js +1 -1
- package/es/components/fields/DatePicker/parseDate.js +1 -1
- package/es/components/fields/DatePicker/props.js +1 -1
- package/es/components/fields/DatePicker/types.js +1 -1
- package/es/components/fields/DatePicker/utils.js +1 -1
- package/es/components/fields/FileInput/FileInput.js +1 -1
- package/es/components/fields/FilterListBox/FilterListBox.js +1 -1
- package/es/components/fields/FilterListBox/index.js +1 -1
- package/es/components/fields/FilterPicker/FilterPicker.js +3 -3
- package/es/components/fields/FilterPicker/index.js +1 -1
- package/es/components/fields/Input/Input.js +1 -1
- package/es/components/fields/Input/index.js +1 -1
- package/es/components/fields/ListBox/ListBox.js +1 -1
- package/es/components/fields/ListBox/index.js +1 -1
- package/es/components/fields/NumberInput/NumberInput.js +1 -1
- package/es/components/fields/NumberInput/StepButton.js +1 -1
- package/es/components/fields/PasswordInput/PasswordInput.js +1 -1
- package/es/components/fields/RadioGroup/Radio.js +2 -2
- package/es/components/fields/RadioGroup/RadioGroup.js +1 -1
- package/es/components/fields/RadioGroup/context.js +1 -1
- package/es/components/fields/RadioGroup/index.js +1 -1
- package/es/components/fields/SearchInput/SearchInput.js +1 -1
- package/es/components/fields/SearchInput/index.js +1 -1
- package/es/components/fields/Select/Select.js +1 -1
- package/es/components/fields/Select/index.js +1 -1
- package/es/components/fields/Slider/Gradation.js +1 -1
- package/es/components/fields/Slider/Header.js +1 -1
- package/es/components/fields/Slider/RangeSlider.js +1 -1
- package/es/components/fields/Slider/Slider.js +1 -1
- package/es/components/fields/Slider/SliderBase.js +1 -1
- package/es/components/fields/Slider/SliderInput.js +1 -1
- package/es/components/fields/Slider/SliderThumb.js +1 -1
- package/es/components/fields/Slider/SliderTrack.js +1 -1
- package/es/components/fields/Slider/elements.js +1 -1
- package/es/components/fields/Slider/index.js +1 -1
- package/es/components/fields/Slider/types.js +1 -1
- package/es/components/fields/Switch/Switch.js +1 -1
- package/es/components/fields/Switch/index.js +1 -1
- package/es/components/fields/TextArea/TextArea.js +1 -1
- package/es/components/fields/TextArea/index.js +1 -1
- package/es/components/fields/TextInput/TextInput.js +1 -1
- package/es/components/fields/TextInput/TextInputBase.js +3 -2
- package/es/components/fields/TextInput/index.js +1 -1
- package/es/components/fields/TextInputMapper/TextInputMapper.js +1 -1
- package/es/components/fields/TextInputMapper/index.js +1 -1
- package/es/components/fields/index.js +1 -1
- package/es/components/form/FieldWrapper/FieldWrapper.js +1 -1
- package/es/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
- package/es/components/form/FieldWrapper/index.js +1 -1
- package/es/components/form/FieldWrapper/types.js +1 -1
- package/es/components/form/Form/Field.js +1 -1
- package/es/components/form/Form/Form.js +1 -1
- package/es/components/form/Form/ResetButton/ResetButton.js +1 -1
- package/es/components/form/Form/ResetButton/index.js +1 -1
- package/es/components/form/Form/SubmitButton/SubmitButton.js +1 -1
- package/es/components/form/Form/SubmitButton/index.js +1 -1
- package/es/components/form/Form/SubmitError.js +1 -1
- package/es/components/form/Form/index.js +1 -1
- package/es/components/form/Form/types.js +1 -1
- package/es/components/form/Form/use-field/index.js +1 -1
- package/es/components/form/Form/use-field/types.js +1 -1
- package/es/components/form/Form/use-field/use-field-props.js +1 -1
- package/es/components/form/Form/use-field/use-field.js +1 -1
- package/es/components/form/Form/use-form.js +1 -1
- package/es/components/form/Form/validation.js +1 -1
- package/es/components/form/Label.js +1 -1
- package/es/components/form/index.js +1 -1
- package/es/components/form/wrapper.js +1 -1
- package/es/components/layout/Flex.js +1 -1
- package/es/components/layout/Flow.js +1 -1
- package/es/components/layout/Grid.js +1 -1
- package/es/components/layout/Panel.js +1 -1
- package/es/components/layout/Prefix.js +1 -1
- package/es/components/layout/ResizablePanel.js +1 -1
- package/es/components/layout/Space.js +1 -1
- package/es/components/layout/Suffix.js +1 -1
- package/es/components/navigation/LegacyTabs/LegacyTabs.js +1 -1
- package/es/components/navigation/Link/Link.js +1 -1
- package/es/components/organisms/FileTabs/FileTabs.js +1 -1
- package/es/components/organisms/Modal/Modal.js +59 -68
- package/es/components/organisms/StatsCard/StatsCard.js +1 -1
- package/es/components/other/Base64Upload/Base64Upload.js +1 -1
- package/es/components/other/Calendar/Calendar.js +1 -1
- package/es/components/other/Calendar/CalendarCell.js +1 -1
- package/es/components/other/Calendar/CalendarGrid.js +1 -1
- package/es/components/other/Calendar/RangeCalendar.js +1 -1
- package/es/components/other/CloudLogo/CloudLogo.js +1 -1
- package/es/components/overlays/AlertDialog/AlertDialog.js +1 -1
- package/es/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
- package/es/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
- package/es/components/overlays/AlertDialog/index.js +1 -1
- package/es/components/overlays/AlertDialog/types.js +1 -1
- package/es/components/overlays/Dialog/Dialog.js +1 -1
- package/es/components/overlays/Dialog/DialogContainer.js +1 -1
- package/es/components/overlays/Dialog/DialogForm.js +1 -1
- package/es/components/overlays/Dialog/DialogTrigger.js +1 -1
- package/es/components/overlays/Dialog/context.js +1 -1
- package/es/components/overlays/Dialog/index.js +1 -1
- package/es/components/overlays/Dialog/use-dialog-container.js +1 -1
- package/es/components/overlays/Modal/Modal.js +1 -1
- package/es/components/overlays/Modal/OpenTransition.js +1 -1
- package/es/components/overlays/Modal/Overlay.js +1 -1
- package/es/components/overlays/Modal/Popover.js +1 -1
- package/es/components/overlays/Modal/Tray.js +1 -1
- package/es/components/overlays/Modal/Underlay.js +1 -1
- package/es/components/overlays/Modal/index.js +1 -1
- package/es/components/overlays/Modal/types.js +1 -1
- package/es/components/overlays/NewNotifications/Bar/FloatingNotification.js +1 -1
- package/es/components/overlays/NewNotifications/Bar/NotificationsBar.js +1 -1
- package/es/components/overlays/NewNotifications/Bar/TransitionComponent.js +1 -1
- package/es/components/overlays/NewNotifications/Bar/index.js +1 -1
- package/es/components/overlays/NewNotifications/Dialog/NotificationsDialogTrigger.js +1 -1
- package/es/components/overlays/NewNotifications/Dialog/index.js +1 -1
- package/es/components/overlays/NewNotifications/Notification.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationAction.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationCloseButton.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationDescription.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationFooter.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationHeader.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationIcon.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationProvider.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationView.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/index.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/types.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsContext/NotificationsContext.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsContext/NotificationsProvider.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsContext/index.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsContext/use-notifications.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsList/NotificationsList.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsList/NotificationsListItem.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsList/index.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsList/types.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/index.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/types.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/use-notification-list-item.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/use-notifications-api.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/use-notifications-list.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/use-notifications-observer.js +1 -1
- package/es/components/overlays/NewNotifications/index.js +1 -1
- package/es/components/overlays/NewNotifications/types.js +1 -1
- package/es/components/overlays/Notification/Notification.js +1 -1
- package/es/components/overlays/OverlayWrapper.js +1 -1
- package/es/components/overlays/Toasts/Toast.js +1 -1
- package/es/components/overlays/Toasts/index.js +1 -1
- package/es/components/overlays/Toasts/types.js +1 -1
- package/es/components/overlays/Toasts/use-toasts-api.js +1 -1
- package/es/components/overlays/Tooltip/Tooltip.js +1 -1
- package/es/components/overlays/Tooltip/TooltipProvider.js +1 -1
- package/es/components/overlays/Tooltip/TooltipTrigger.js +1 -1
- package/es/components/overlays/Tooltip/context.js +1 -1
- package/es/components/overlays/Tooltip/index.js +1 -1
- package/es/components/portal/Portal.js +1 -1
- package/es/components/portal/PortalProvider.js +1 -1
- package/es/components/portal/index.js +1 -1
- package/es/components/portal/types.js +1 -1
- package/es/components/portal/usePortal.js +1 -1
- package/es/components/shared/InvalidIcon.js +1 -1
- package/es/components/shared/ValidIcon.js +1 -1
- package/es/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
- package/es/components/status/LoadingAnimation/index.js +1 -1
- package/es/components/status/Spin/Cube.js +1 -1
- package/es/components/status/Spin/InternalSpinner.js +1 -1
- package/es/components/status/Spin/Spin.js +1 -1
- package/es/components/status/Spin/SpinsContainer.js +1 -1
- package/es/components/status/Spin/index.js +1 -1
- package/es/components/status/Spin/types.js +1 -1
- package/es/components/status/index.js +1 -1
- package/es/data/item-themes.js +1 -1
- package/es/data/themes.js +1 -1
- package/es/icons/AdjustmentsHorizontalIcon.js +1 -1
- package/es/icons/AdjustmentsIcon.js +1 -1
- package/es/icons/AiIcon.js +1 -1
- package/es/icons/AreaChartIcon.js +1 -1
- package/es/icons/BackwardIcon.js +1 -1
- package/es/icons/BarChartIcon.js +1 -1
- package/es/icons/BellFilledIcon.js +1 -1
- package/es/icons/BellIcon.js +1 -1
- package/es/icons/BooleanIcon.js +1 -1
- package/es/icons/CalendarEditIcon.js +1 -1
- package/es/icons/CalendarIcon.js +1 -1
- package/es/icons/CaretDownIcon.js +1 -1
- package/es/icons/CaretUpIcon.js +1 -1
- package/es/icons/ChartAreaStackedIcon.js +1 -1
- package/es/icons/ChartAreaStackedPercentageIcon.js +1 -1
- package/es/icons/ChartBarGroupedHorizontalIcon.js +1 -1
- package/es/icons/ChartBarGroupedIcon.js +1 -1
- package/es/icons/ChartBarHorizontalIcon.js +1 -1
- package/es/icons/ChartBarLineIcon.js +1 -1
- package/es/icons/ChartBarStackedHorizontalIcon.js +1 -1
- package/es/icons/ChartBarStackedIcon.js +1 -1
- package/es/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
- package/es/icons/ChartBarStackedPercentageIcon.js +1 -1
- package/es/icons/ChartBoxPlot2Icon.js +1 -1
- package/es/icons/ChartBoxPlotIcon.js +1 -1
- package/es/icons/ChartBubbleIcon.js +1 -1
- package/es/icons/ChartDonut2Icon.js +1 -1
- package/es/icons/ChartFunnelIcon.js +1 -1
- package/es/icons/ChartKPIIcon.js +1 -1
- package/es/icons/ChartPie2Icon.js +1 -1
- package/es/icons/ChartScatterIcon.js +1 -1
- package/es/icons/CheckCircleFilledIcon.js +1 -1
- package/es/icons/CheckCircleIcon.js +1 -1
- package/es/icons/CheckIcon.js +1 -1
- package/es/icons/CircleFilledIcon.js +1 -1
- package/es/icons/ClearIcon.js +1 -1
- package/es/icons/CloseCircleFilledIcon.js +1 -1
- package/es/icons/CloseCircleIcon.js +1 -1
- package/es/icons/CloseIcon.js +1 -1
- package/es/icons/CodeIcon.js +1 -1
- package/es/icons/CopyIcon.js +1 -1
- package/es/icons/CountIcon.js +1 -1
- package/es/icons/CubeIcon.js +1 -1
- package/es/icons/DangerIcon.js +1 -1
- package/es/icons/DashboardIcon.js +1 -1
- package/es/icons/DatabaseIcon.js +1 -1
- package/es/icons/DirectionIcon.js +1 -1
- package/es/icons/DonutIcon.js +1 -1
- package/es/icons/DownIcon.js +1 -1
- package/es/icons/EditIcon.js +1 -1
- package/es/icons/ExclamationCircleFilledIcon.js +1 -1
- package/es/icons/ExclamationCircleIcon.js +1 -1
- package/es/icons/ExclamationIcon.js +1 -1
- package/es/icons/EyeIcon.js +1 -1
- package/es/icons/EyeInvisibleIcon.js +1 -1
- package/es/icons/FilterIcon.js +1 -1
- package/es/icons/FolderFilledIcon.js +1 -1
- package/es/icons/FolderIcon.js +1 -1
- package/es/icons/FolderOpenFilledIcon.js +1 -1
- package/es/icons/FolderOpenIcon.js +1 -1
- package/es/icons/ForwardIcon.js +1 -1
- package/es/icons/HierarchyIcon.js +1 -1
- package/es/icons/Icon.js +1 -1
- package/es/icons/InfoCircleIcon.js +1 -1
- package/es/icons/InfoIcon.js +1 -1
- package/es/icons/KeyIcon.js +1 -1
- package/es/icons/LeftIcon.js +1 -1
- package/es/icons/LineChartIcon.js +1 -1
- package/es/icons/LoadingIcon.js +1 -1
- package/es/icons/LockFilledIcon.js +1 -1
- package/es/icons/LockIcon.js +1 -1
- package/es/icons/MoreIcon.js +1 -1
- package/es/icons/NotAllowedIcon.js +1 -1
- package/es/icons/NumberIcon.js +1 -1
- package/es/icons/PauseCircleFilledIcon.js +1 -1
- package/es/icons/PauseCircleIcon.js +1 -1
- package/es/icons/PauseIcon.js +1 -1
- package/es/icons/PieChartIcon.js +1 -1
- package/es/icons/PlayCircleIcon.js +1 -1
- package/es/icons/PlayIcon.js +1 -1
- package/es/icons/PlusIcon.js +1 -1
- package/es/icons/ReloadIcon.js +1 -1
- package/es/icons/ReportIcon.js +1 -1
- package/es/icons/ReturnIcon.js +1 -1
- package/es/icons/RightIcon.js +1 -1
- package/es/icons/SchemeIcon.js +1 -1
- package/es/icons/SearchIcon.js +1 -1
- package/es/icons/SettingsIcon.js +1 -1
- package/es/icons/ShieldFilledIcon.js +1 -1
- package/es/icons/ShieldIcon.js +1 -1
- package/es/icons/SlashIcon.js +1 -1
- package/es/icons/SparklesIcon.js +1 -1
- package/es/icons/SqlIcon.js +1 -1
- package/es/icons/StatsIcon.js +1 -1
- package/es/icons/StopIcon.js +1 -1
- package/es/icons/StringIcon.js +1 -1
- package/es/icons/SwitchIcon.js +1 -1
- package/es/icons/TableIcon.js +1 -1
- package/es/icons/ThumbsDownIcon.js +1 -1
- package/es/icons/ThumbsUpIcon.js +1 -1
- package/es/icons/ThunderboltCrossedIcon.js +1 -1
- package/es/icons/ThunderboltFilledIcon.js +1 -1
- package/es/icons/ThunderboltIcon.js +1 -1
- package/es/icons/TimeIcon.js +1 -1
- package/es/icons/UnlockIcon.js +1 -1
- package/es/icons/UpIcon.js +1 -1
- package/es/icons/UserGroupIcon.js +1 -1
- package/es/icons/UserIcon.js +1 -1
- package/es/icons/UserLockIcon.js +1 -1
- package/es/icons/ViewIcon.js +1 -1
- package/es/icons/WarningFilledIcon.js +1 -1
- package/es/icons/WarningIcon.js +1 -1
- package/es/icons/add-new-icon.js +1 -1
- package/es/icons/index.js +1 -1
- package/es/icons/wrap-icon.js +1 -1
- package/es/index.js +1 -1
- package/es/provider.js +1 -1
- package/es/providers/TrackingProvider.js +1 -1
- package/es/services/notification.js +1 -1
- package/es/shared/form.js +1 -1
- package/es/shared/index.js +1 -1
- package/es/stories/Form.legacy-stories.js +1 -1
- package/es/stories/FormFieldArgs.js +1 -1
- package/es/stories/Layout.stories.js +1 -1
- package/es/stories/Tasty.stories.js +1 -1
- package/es/stories/components/ConfirmDeletionDialogForm.js +1 -1
- package/es/stories/components/DialogFormApp.js +1 -1
- package/es/stories/components/StyledButton.js +1 -1
- package/es/stories/lists/baseProps.js +1 -2
- package/es/tasty/debug.js +703 -0
- package/es/tasty/index.js +3 -1
- package/es/tasty/injector/index.js +187 -0
- package/es/tasty/injector/injector.js +678 -0
- package/es/tasty/injector/sheet-manager.js +912 -0
- package/es/tasty/injector/types.js +10 -0
- package/es/tasty/parser/classify.js +1 -1
- package/es/tasty/parser/const.js +1 -1
- package/es/tasty/parser/lru.js +38 -2
- package/es/tasty/parser/parser.js +1 -1
- package/es/tasty/parser/tokenizer.js +1 -1
- package/es/tasty/parser/types.js +1 -1
- package/es/tasty/providers/BreakpointsProvider.js +1 -1
- package/es/tasty/styles/align.js +1 -1
- package/es/tasty/styles/border.js +1 -1
- package/es/tasty/styles/boxShadow.combinator.js +1 -1
- package/es/tasty/styles/color.js +8 -12
- package/es/tasty/styles/createStyle.js +19 -4
- package/es/tasty/styles/dimension.js +1 -1
- package/es/tasty/styles/display.js +1 -1
- package/es/tasty/styles/fade.js +1 -1
- package/es/tasty/styles/fill.js +6 -8
- package/es/tasty/styles/flow.js +1 -1
- package/es/tasty/styles/font.js +1 -1
- package/es/tasty/styles/fontStyle.js +1 -1
- package/es/tasty/styles/gap.js +1 -1
- package/es/tasty/styles/groupRadius.js +1 -1
- package/es/tasty/styles/height.js +1 -1
- package/es/tasty/styles/index.js +1 -1
- package/es/tasty/styles/inset.js +1 -1
- package/es/tasty/styles/justify.js +1 -1
- package/es/tasty/styles/list.js +1 -1
- package/es/tasty/styles/margin.js +1 -1
- package/es/tasty/styles/marginBlock.js +1 -1
- package/es/tasty/styles/marginInline.js +1 -1
- package/es/tasty/styles/outline.js +1 -1
- package/es/tasty/styles/padding.js +1 -1
- package/es/tasty/styles/paddingBlock.js +1 -1
- package/es/tasty/styles/paddingInline.js +1 -1
- package/es/tasty/styles/place.js +1 -1
- package/es/tasty/styles/predefined.js +1 -3
- package/es/tasty/styles/preset.js +1 -1
- package/es/tasty/styles/radius.js +1 -1
- package/es/tasty/styles/reset.js +40 -44
- package/es/tasty/styles/scrollbar.js +1 -1
- package/es/tasty/styles/shadow.js +1 -1
- package/es/tasty/styles/styledScrollbar.js +1 -1
- package/es/tasty/styles/transition.js +2 -1
- package/es/tasty/styles/types.js +1 -1
- package/es/tasty/styles/width.js +1 -1
- package/es/tasty/tasty.js +120 -35
- package/es/tasty/types.js +1 -1
- package/es/tasty/utils/cache-wrapper.js +1 -1
- package/es/tasty/utils/case-converter.js +1 -1
- package/es/tasty/utils/colors.js +1 -1
- package/es/tasty/utils/dotize.js +1 -1
- package/es/tasty/utils/filterBaseProps.js +1 -1
- package/es/tasty/utils/getDisplayName.js +1 -1
- package/es/tasty/utils/getModCombinations.js +26 -30
- package/es/tasty/utils/isDevEnv.js +36 -0
- package/es/tasty/utils/mergeStyles.js +1 -1
- package/es/tasty/utils/modAttrs.js +1 -1
- package/es/tasty/utils/renderStyles.js +710 -58
- package/es/tasty/utils/responsive.js +1 -7
- package/es/tasty/utils/string.js +1 -1
- package/es/tasty/utils/styles.js +100 -235
- package/es/tasty/utils/warnings.js +1 -1
- package/es/tokens.js +1 -12
- package/es/type-checks.js +1 -1
- package/es/utils/ResizeSensor.js +1 -1
- package/es/utils/modules.js +1 -1
- package/es/utils/promise.js +1 -1
- package/es/utils/random.js +1 -1
- package/es/utils/range.js +1 -1
- package/es/utils/react/Slots.js +1 -1
- package/es/utils/react/chain.js +1 -1
- package/es/utils/react/forwardRefWithGenerics.js +1 -1
- package/es/utils/react/index.js +1 -1
- package/es/utils/react/interactions.js +1 -1
- package/es/utils/react/isTextOnly.js +1 -1
- package/es/utils/react/mapProps.js +1 -1
- package/es/utils/react/mergeProps.js +1 -1
- package/es/utils/react/nullableValue.js +1 -1
- package/es/utils/react/sharedStore.js +1 -1
- package/es/utils/react/useCombinedRefs.js +1 -1
- package/es/utils/react/useControlledFocusVisible.js +1 -1
- package/es/utils/react/useEventBus.js +1 -1
- package/es/utils/react/useId.js +1 -1
- package/es/utils/react/useIsDarwin.js +1 -1
- package/es/utils/react/useKeySymbols.js +1 -1
- package/es/utils/react/useLayoutEffect.js +1 -1
- package/es/utils/react/useQaProps.js +1 -1
- package/es/utils/react/useViewportSize.js +1 -1
- package/es/utils/react/wrapNodeIfPlain.js +1 -1
- package/es/utils/transitions.js +1 -1
- package/es/utils/tree.js +1 -1
- package/es/utils/warnings.js +1 -1
- package/es/version.js +2 -2
- package/package.json +1 -1
- package/types/components/HiddenInput.d.ts +1 -3
- package/types/components/actions/Button/Button.d.ts +1 -0
- package/types/components/actions/Menu/styled.d.ts +762 -765
- package/types/components/actions/use-action.d.ts +1 -1
- package/types/components/content/List/SectionHeading.d.ts +254 -255
- package/types/components/fields/DatePicker/DatePickerElement.d.ts +254 -255
- package/types/tasty/debug.d.ts +163 -0
- package/types/tasty/index.d.ts +2 -0
- package/types/tasty/injector/index.d.ts +87 -0
- package/types/tasty/injector/injector.d.ts +111 -0
- package/types/tasty/injector/sheet-manager.d.ts +98 -0
- package/types/tasty/injector/types.d.ts +106 -0
- package/types/tasty/parser/lru.d.ts +5 -1
- package/types/tasty/styles/color.d.ts +3 -1
- package/types/tasty/styles/reset.d.ts +1 -2
- package/types/tasty/types.d.ts +0 -2
- package/types/tasty/utils/getModCombinations.d.ts +9 -1
- package/types/tasty/utils/isDevEnv.d.ts +6 -0
- package/types/tasty/utils/renderStyles.d.ts +30 -7
- package/types/tasty/utils/responsive.d.ts +0 -1
- package/types/tasty/utils/styles.d.ts +7 -90
- package/types/tokens.d.ts +0 -11
@@ -0,0 +1,703 @@
|
|
1
|
+
/**
|
2
|
+
* @license MIT
|
3
|
+
* author: Cube Dev Team
|
4
|
+
* @cube-dev/ui-kit v0.76.0
|
5
|
+
* Released under the MIT license.
|
6
|
+
*/
|
7
|
+
|
8
|
+
/**
|
9
|
+
* Debug utilities for inspecting tasty-generated CSS at runtime
|
10
|
+
*/
|
11
|
+
import { getCssTextForNode, injector } from './injector';
|
12
|
+
import { isDevEnv } from './utils/isDevEnv';
|
13
|
+
/**
|
14
|
+
* Pretty-print CSS with proper indentation and formatting
|
15
|
+
*/
|
16
|
+
function prettifyCSS(css) {
|
17
|
+
if (!css || css.trim() === '') {
|
18
|
+
return '';
|
19
|
+
}
|
20
|
+
// First, normalize whitespace but preserve structure
|
21
|
+
let formatted = css.replace(/\s+/g, ' ').trim();
|
22
|
+
// Add newlines after opening braces
|
23
|
+
formatted = formatted.replace(/\s*\{\s*/g, ' {\n');
|
24
|
+
// Add newlines after semicolons (but not inside strings or functions)
|
25
|
+
formatted = formatted.replace(/;(?![^"']*["'][^"']*$)(?![^()]*\))/g, ';\n');
|
26
|
+
// Add newlines before closing braces
|
27
|
+
formatted = formatted.replace(/\s*\}\s*/g, '\n}\n');
|
28
|
+
// Handle comma-separated selectors (only outside of property values)
|
29
|
+
// This regex looks for commas that are:
|
30
|
+
// 1. Not inside quotes
|
31
|
+
// 2. Not inside parentheses (CSS functions)
|
32
|
+
// 3. Not followed by a colon (not in a property value)
|
33
|
+
formatted = formatted.replace(/,(?![^"']*["'][^"']*$)(?![^()]*\))(?=.*:.*\{|.*\{)/g, ',\n');
|
34
|
+
// Process line by line for proper indentation
|
35
|
+
const lines = formatted.split('\n');
|
36
|
+
let indentLevel = 0;
|
37
|
+
const indentSize = 2;
|
38
|
+
const formattedLines = lines.map((line) => {
|
39
|
+
const trimmed = line.trim();
|
40
|
+
if (!trimmed)
|
41
|
+
return '';
|
42
|
+
// Handle closing braces - decrease indent first
|
43
|
+
if (trimmed === '}') {
|
44
|
+
indentLevel = Math.max(0, indentLevel - 1);
|
45
|
+
return ' '.repeat(indentLevel * indentSize) + trimmed;
|
46
|
+
}
|
47
|
+
// Current line with proper indentation
|
48
|
+
const indent = ' '.repeat(indentLevel * indentSize);
|
49
|
+
let result = indent + trimmed;
|
50
|
+
// Handle opening braces - increase indent for next line
|
51
|
+
if (trimmed.endsWith('{')) {
|
52
|
+
indentLevel++;
|
53
|
+
}
|
54
|
+
return result;
|
55
|
+
});
|
56
|
+
// Clean up the result and ensure proper spacing
|
57
|
+
let result = formattedLines
|
58
|
+
.filter((line) => line.trim()) // Remove empty lines
|
59
|
+
.join('\n')
|
60
|
+
.replace(/\n{3,}/g, '\n\n') // Max 2 consecutive newlines
|
61
|
+
.trim();
|
62
|
+
// Final cleanup: ensure single spaces in function calls
|
63
|
+
result = result.replace(/,\s+/g, ', ');
|
64
|
+
return result;
|
65
|
+
}
|
66
|
+
// Helper functions
|
67
|
+
function findAllTastyClasses(root = document) {
|
68
|
+
const classes = new Set();
|
69
|
+
const elements = root.querySelectorAll?.('[class]') || [];
|
70
|
+
elements.forEach((element) => {
|
71
|
+
const classList = element.getAttribute('class');
|
72
|
+
if (classList) {
|
73
|
+
const tastyClasses = classList
|
74
|
+
.split(/\s+/)
|
75
|
+
.filter((cls) => /^t\d+$/.test(cls));
|
76
|
+
tastyClasses.forEach((cls) => classes.add(cls));
|
77
|
+
}
|
78
|
+
});
|
79
|
+
return Array.from(classes).sort((a, b) => {
|
80
|
+
const aNum = parseInt(a.slice(1));
|
81
|
+
const bNum = parseInt(b.slice(1));
|
82
|
+
return aNum - bNum;
|
83
|
+
});
|
84
|
+
}
|
85
|
+
function findAllStyledClasses(root = document) {
|
86
|
+
// Extract tasty classes from all CSS text by parsing selectors
|
87
|
+
const allCSS = injector.instance.getCssText({ root });
|
88
|
+
const classes = new Set();
|
89
|
+
// Simple regex to find .t{number} class selectors
|
90
|
+
const classRegex = /\.t(\d+)/g;
|
91
|
+
let match;
|
92
|
+
while ((match = classRegex.exec(allCSS)) !== null) {
|
93
|
+
classes.add(`t${match[1]}`);
|
94
|
+
}
|
95
|
+
return Array.from(classes).sort((a, b) => {
|
96
|
+
const aNum = parseInt(a.slice(1));
|
97
|
+
const bNum = parseInt(b.slice(1));
|
98
|
+
return aNum - bNum;
|
99
|
+
});
|
100
|
+
}
|
101
|
+
function extractCSSRules(css) {
|
102
|
+
const rules = [];
|
103
|
+
// Remove comments
|
104
|
+
let cleanCSS = css.replace(/\/\*[\s\S]*?\*\//g, '');
|
105
|
+
let i = 0;
|
106
|
+
while (i < cleanCSS.length) {
|
107
|
+
// Skip whitespace
|
108
|
+
while (i < cleanCSS.length && /\s/.test(cleanCSS[i])) {
|
109
|
+
i++;
|
110
|
+
}
|
111
|
+
if (i >= cleanCSS.length)
|
112
|
+
break;
|
113
|
+
// Find selector start
|
114
|
+
const selectorStart = i;
|
115
|
+
let braceDepth = 0;
|
116
|
+
let inString = false;
|
117
|
+
let stringChar = '';
|
118
|
+
// Find opening brace
|
119
|
+
while (i < cleanCSS.length) {
|
120
|
+
const char = cleanCSS[i];
|
121
|
+
if (inString) {
|
122
|
+
if (char === stringChar && cleanCSS[i - 1] !== '\\') {
|
123
|
+
inString = false;
|
124
|
+
}
|
125
|
+
}
|
126
|
+
else {
|
127
|
+
if (char === '"' || char === "'") {
|
128
|
+
inString = true;
|
129
|
+
stringChar = char;
|
130
|
+
}
|
131
|
+
else if (char === '{') {
|
132
|
+
braceDepth++;
|
133
|
+
if (braceDepth === 1)
|
134
|
+
break;
|
135
|
+
}
|
136
|
+
}
|
137
|
+
i++;
|
138
|
+
}
|
139
|
+
if (i >= cleanCSS.length)
|
140
|
+
break;
|
141
|
+
const selector = cleanCSS.substring(selectorStart, i).trim();
|
142
|
+
i++; // Skip opening brace
|
143
|
+
// Find matching closing brace
|
144
|
+
const contentStart = i;
|
145
|
+
braceDepth = 1;
|
146
|
+
inString = false;
|
147
|
+
while (i < cleanCSS.length && braceDepth > 0) {
|
148
|
+
const char = cleanCSS[i];
|
149
|
+
if (inString) {
|
150
|
+
if (char === stringChar && cleanCSS[i - 1] !== '\\') {
|
151
|
+
inString = false;
|
152
|
+
}
|
153
|
+
}
|
154
|
+
else {
|
155
|
+
if (char === '"' || char === "'") {
|
156
|
+
inString = true;
|
157
|
+
stringChar = char;
|
158
|
+
}
|
159
|
+
else if (char === '{') {
|
160
|
+
braceDepth++;
|
161
|
+
}
|
162
|
+
else if (char === '}') {
|
163
|
+
braceDepth--;
|
164
|
+
}
|
165
|
+
}
|
166
|
+
i++;
|
167
|
+
}
|
168
|
+
const content = cleanCSS.substring(contentStart, i - 1).trim();
|
169
|
+
if (content && selector) {
|
170
|
+
rules.push({ selector, declarations: content });
|
171
|
+
}
|
172
|
+
}
|
173
|
+
return rules;
|
174
|
+
}
|
175
|
+
function getGlobalCSS(root = document) {
|
176
|
+
const allCSS = injector.instance.getCssText({ root });
|
177
|
+
const rules = extractCSSRules(allCSS);
|
178
|
+
const globalRules = rules.filter((rule) => {
|
179
|
+
const selectors = rule.selector.split(',').map((s) => s.trim());
|
180
|
+
return !selectors.every((selector) => {
|
181
|
+
const cleanSelector = selector.replace(/[.#:\s>+~[\]()]/g, ' ');
|
182
|
+
const parts = cleanSelector.split(/\s+/).filter(Boolean);
|
183
|
+
return parts.length > 0 && parts.every((part) => /^t\d+$/.test(part));
|
184
|
+
});
|
185
|
+
});
|
186
|
+
const globalCSS = globalRules
|
187
|
+
.map((rule) => `${rule.selector} { ${rule.declarations} }`)
|
188
|
+
.join('\n');
|
189
|
+
return prettifyCSS(globalCSS);
|
190
|
+
}
|
191
|
+
function getPageCSS(options) {
|
192
|
+
const root = options?.root || document;
|
193
|
+
const includeCrossOrigin = options?.includeCrossOrigin ?? false;
|
194
|
+
const cssChunks = [];
|
195
|
+
try {
|
196
|
+
if ('styleSheets' in root) {
|
197
|
+
const styleSheets = Array.from(root.styleSheets);
|
198
|
+
for (const sheet of styleSheets) {
|
199
|
+
try {
|
200
|
+
if (sheet.cssRules) {
|
201
|
+
const rules = Array.from(sheet.cssRules);
|
202
|
+
cssChunks.push(rules.map((rule) => rule.cssText).join('\n'));
|
203
|
+
}
|
204
|
+
}
|
205
|
+
catch (e) {
|
206
|
+
// Cross-origin sheet or other access error
|
207
|
+
if (includeCrossOrigin) {
|
208
|
+
cssChunks.push(`/* Cross-origin stylesheet: ${sheet.href || 'inline'} */`);
|
209
|
+
}
|
210
|
+
}
|
211
|
+
}
|
212
|
+
}
|
213
|
+
}
|
214
|
+
catch (e) {
|
215
|
+
// Fallback error handling
|
216
|
+
}
|
217
|
+
return cssChunks.join('\n');
|
218
|
+
}
|
219
|
+
function getPageStats(options) {
|
220
|
+
const root = options?.root || document;
|
221
|
+
const includeCrossOrigin = options?.includeCrossOrigin ?? false;
|
222
|
+
let cssSize = 0;
|
223
|
+
let ruleCount = 0;
|
224
|
+
let stylesheetCount = 0;
|
225
|
+
let skippedStylesheets = 0;
|
226
|
+
try {
|
227
|
+
if ('styleSheets' in root) {
|
228
|
+
const styleSheets = Array.from(root.styleSheets);
|
229
|
+
stylesheetCount = styleSheets.length;
|
230
|
+
for (const sheet of styleSheets) {
|
231
|
+
try {
|
232
|
+
if (sheet.cssRules) {
|
233
|
+
const rules = Array.from(sheet.cssRules);
|
234
|
+
ruleCount += rules.length;
|
235
|
+
cssSize += rules.reduce((sum, rule) => sum + rule.cssText.length, 0);
|
236
|
+
}
|
237
|
+
}
|
238
|
+
catch (e) {
|
239
|
+
skippedStylesheets++;
|
240
|
+
}
|
241
|
+
}
|
242
|
+
}
|
243
|
+
}
|
244
|
+
catch (e) {
|
245
|
+
// Fallback error handling
|
246
|
+
}
|
247
|
+
return { cssSize, ruleCount, stylesheetCount, skippedStylesheets };
|
248
|
+
}
|
249
|
+
/**
|
250
|
+
* Concise tastyDebug API for inspecting styles at runtime
|
251
|
+
*/
|
252
|
+
export const tastyDebug = {
|
253
|
+
// 1) One function to get CSS from anywhere
|
254
|
+
css(target, opts) {
|
255
|
+
const { root = document, prettify = true, log = false } = opts || {};
|
256
|
+
let css = '';
|
257
|
+
if (typeof target === 'string') {
|
258
|
+
if (target === 'all') {
|
259
|
+
css = injector.instance.getCssText({ root });
|
260
|
+
}
|
261
|
+
else if (target === 'global') {
|
262
|
+
css = getGlobalCSS(root);
|
263
|
+
}
|
264
|
+
else if (target === 'active') {
|
265
|
+
const activeClasses = findAllTastyClasses(root);
|
266
|
+
css = injector.instance.getCssTextForClasses(activeClasses, { root });
|
267
|
+
}
|
268
|
+
else if (target === 'unused') {
|
269
|
+
// Get unused classes (refCount = 0) from the registry
|
270
|
+
const registry = injector.instance['sheetManager']?.getRegistry(root);
|
271
|
+
const unusedClasses = registry
|
272
|
+
? Array.from(registry.refCounts.entries())
|
273
|
+
.filter(([, refCount]) => refCount === 0)
|
274
|
+
.map(([className]) => className)
|
275
|
+
: [];
|
276
|
+
css = injector.instance.getCssTextForClasses(unusedClasses, { root });
|
277
|
+
}
|
278
|
+
else if (target === 'page') {
|
279
|
+
css = getPageCSS({ root, includeCrossOrigin: true });
|
280
|
+
}
|
281
|
+
else if (/^t\d+$/.test(target)) {
|
282
|
+
// Single tasty class
|
283
|
+
css = injector.instance.getCssTextForClasses([target], { root });
|
284
|
+
}
|
285
|
+
else {
|
286
|
+
// CSS selector - find element and get its CSS
|
287
|
+
const element = root.querySelector?.(target);
|
288
|
+
if (element) {
|
289
|
+
css = getCssTextForNode(element, { root });
|
290
|
+
}
|
291
|
+
}
|
292
|
+
}
|
293
|
+
else if (Array.isArray(target)) {
|
294
|
+
// Array of tasty classes
|
295
|
+
css = injector.instance.getCssTextForClasses(target, { root });
|
296
|
+
}
|
297
|
+
else if (target instanceof Element) {
|
298
|
+
// DOM element
|
299
|
+
css = getCssTextForNode(target, { root });
|
300
|
+
}
|
301
|
+
const result = prettify ? prettifyCSS(css) : css;
|
302
|
+
if (log) {
|
303
|
+
console.group(`🎨 CSS for ${Array.isArray(target) ? `[${target.join(', ')}]` : target}`);
|
304
|
+
console.log(result || '(empty)');
|
305
|
+
console.groupEnd();
|
306
|
+
}
|
307
|
+
return result;
|
308
|
+
},
|
309
|
+
// 2) Element-level inspection
|
310
|
+
inspect(target, opts) {
|
311
|
+
const { root = document } = opts || {};
|
312
|
+
const element = typeof target === 'string'
|
313
|
+
? root.querySelector?.(target)
|
314
|
+
: target;
|
315
|
+
if (!element) {
|
316
|
+
return {
|
317
|
+
element: null,
|
318
|
+
classes: [],
|
319
|
+
css: '',
|
320
|
+
size: 0,
|
321
|
+
rules: 0,
|
322
|
+
};
|
323
|
+
}
|
324
|
+
const classList = element.getAttribute('class') || '';
|
325
|
+
const tastyClasses = classList
|
326
|
+
.split(/\s+/)
|
327
|
+
.filter((cls) => /^t\d+$/.test(cls));
|
328
|
+
const css = getCssTextForNode(element, { root });
|
329
|
+
const prettifiedCSS = prettifyCSS(css);
|
330
|
+
const ruleCount = (css.match(/\{[^}]*\}/g) || []).length;
|
331
|
+
return {
|
332
|
+
element,
|
333
|
+
classes: tastyClasses,
|
334
|
+
css: prettifiedCSS,
|
335
|
+
size: css.length,
|
336
|
+
rules: ruleCount,
|
337
|
+
};
|
338
|
+
},
|
339
|
+
// 3) Cache + metrics at a glance
|
340
|
+
cache(opts) {
|
341
|
+
const { root = document } = opts || {};
|
342
|
+
const activeClasses = findAllTastyClasses(root);
|
343
|
+
const allClasses = findAllStyledClasses(root);
|
344
|
+
// Get unused classes (refCount = 0) from the registry
|
345
|
+
const registry = injector.instance['sheetManager']?.getRegistry(root);
|
346
|
+
const unusedClasses = registry
|
347
|
+
? Array.from(registry.refCounts.entries())
|
348
|
+
.filter(([, refCount]) => refCount === 0)
|
349
|
+
.map(([className]) => className)
|
350
|
+
: [];
|
351
|
+
return {
|
352
|
+
classes: {
|
353
|
+
active: activeClasses,
|
354
|
+
unused: unusedClasses,
|
355
|
+
all: [...activeClasses, ...unusedClasses],
|
356
|
+
},
|
357
|
+
metrics: injector.instance.getMetrics({ root }),
|
358
|
+
};
|
359
|
+
},
|
360
|
+
// 4) Cleanup + metrics utilities
|
361
|
+
cleanup(opts) {
|
362
|
+
const { root } = opts || {};
|
363
|
+
injector.instance.cleanup(root);
|
364
|
+
},
|
365
|
+
metrics(opts) {
|
366
|
+
const { root } = opts || {};
|
367
|
+
return injector.instance.getMetrics({ root });
|
368
|
+
},
|
369
|
+
resetMetrics(opts) {
|
370
|
+
const { root } = opts || {};
|
371
|
+
injector.instance.resetMetrics({ root });
|
372
|
+
},
|
373
|
+
// 5) Tasty global CSS and selector analysis
|
374
|
+
global(opts) {
|
375
|
+
const { root = document, log = false } = opts || {};
|
376
|
+
const css = getGlobalCSS(root);
|
377
|
+
const rules = extractCSSRules(css);
|
378
|
+
// Analyze selectors
|
379
|
+
const selectors = {
|
380
|
+
elements: [],
|
381
|
+
classes: [],
|
382
|
+
ids: [],
|
383
|
+
pseudoClasses: [],
|
384
|
+
mediaQueries: [],
|
385
|
+
keyframes: [],
|
386
|
+
other: [],
|
387
|
+
};
|
388
|
+
rules.forEach((rule) => {
|
389
|
+
const selector = rule.selector;
|
390
|
+
if (selector.startsWith('@media')) {
|
391
|
+
selectors.mediaQueries.push(selector);
|
392
|
+
}
|
393
|
+
else if (selector.startsWith('@keyframes')) {
|
394
|
+
selectors.keyframes.push(selector);
|
395
|
+
}
|
396
|
+
else if (selector.includes('.') &&
|
397
|
+
!selector.includes('#') &&
|
398
|
+
!selector.includes(':')) {
|
399
|
+
selectors.classes.push(selector);
|
400
|
+
}
|
401
|
+
else if (selector.includes('#') &&
|
402
|
+
!selector.includes('.') &&
|
403
|
+
!selector.includes(':')) {
|
404
|
+
selectors.ids.push(selector);
|
405
|
+
}
|
406
|
+
else if (selector.includes(':')) {
|
407
|
+
selectors.pseudoClasses.push(selector);
|
408
|
+
}
|
409
|
+
else if (/^[a-zA-Z][a-zA-Z0-9]*$/.test(selector.trim())) {
|
410
|
+
selectors.elements.push(selector);
|
411
|
+
}
|
412
|
+
else {
|
413
|
+
selectors.other.push(selector);
|
414
|
+
}
|
415
|
+
});
|
416
|
+
const result = {
|
417
|
+
css,
|
418
|
+
totalRules: rules.length,
|
419
|
+
totalCSSSize: css.length,
|
420
|
+
selectors,
|
421
|
+
};
|
422
|
+
if (log) {
|
423
|
+
console.group(`🌍 Global CSS (${result.totalRules} rules)`);
|
424
|
+
console.log(`📊 Size: ${result.totalCSSSize} characters`);
|
425
|
+
console.log('🎯 Selector breakdown:', result.selectors);
|
426
|
+
console.log('🎨 CSS:\n' + result.css);
|
427
|
+
console.groupEnd();
|
428
|
+
}
|
429
|
+
return result;
|
430
|
+
},
|
431
|
+
// 6) Defined @property and keyframes
|
432
|
+
defs(opts) {
|
433
|
+
const { root = document } = opts || {};
|
434
|
+
// Get properties from injector if available, otherwise scan CSS
|
435
|
+
let properties = [];
|
436
|
+
try {
|
437
|
+
const registry = injector.instance['sheetManager']?.getRegistry(root);
|
438
|
+
if (registry?.injectedProperties) {
|
439
|
+
properties = Array.from(registry.injectedProperties).sort();
|
440
|
+
}
|
441
|
+
}
|
442
|
+
catch {
|
443
|
+
// Fallback: scan CSS for @property rules
|
444
|
+
const allCSS = injector.instance.getCssText({ root });
|
445
|
+
const propRegex = /@property\s+(--[a-z0-9-]+)/gi;
|
446
|
+
const propSet = new Set();
|
447
|
+
let match;
|
448
|
+
while ((match = propRegex.exec(allCSS)) !== null) {
|
449
|
+
propSet.add(match[1]);
|
450
|
+
}
|
451
|
+
properties = Array.from(propSet).sort();
|
452
|
+
}
|
453
|
+
// Get keyframes
|
454
|
+
let keyframes = [];
|
455
|
+
try {
|
456
|
+
const registry = injector.instance['sheetManager']?.getRegistry(root);
|
457
|
+
if (registry) {
|
458
|
+
for (const entry of registry.keyframesCache.values()) {
|
459
|
+
keyframes.push({
|
460
|
+
name: entry.name,
|
461
|
+
refCount: entry.refCount,
|
462
|
+
});
|
463
|
+
}
|
464
|
+
keyframes.sort((a, b) => a.name.localeCompare(b.name));
|
465
|
+
}
|
466
|
+
}
|
467
|
+
catch {
|
468
|
+
// Fallback: scan CSS for @keyframes rules
|
469
|
+
const allCSS = injector.instance.getCssText({ root });
|
470
|
+
const keyframesRegex = /@keyframes\s+([a-zA-Z0-9_-]+)/gi;
|
471
|
+
const keyframesSet = new Set();
|
472
|
+
let match;
|
473
|
+
while ((match = keyframesRegex.exec(allCSS)) !== null) {
|
474
|
+
keyframesSet.add(match[1]);
|
475
|
+
}
|
476
|
+
keyframes = Array.from(keyframesSet)
|
477
|
+
.sort()
|
478
|
+
.map((name) => ({ name, refCount: 1 }));
|
479
|
+
}
|
480
|
+
return { properties, keyframes };
|
481
|
+
},
|
482
|
+
// 7) One-shot overview
|
483
|
+
summary(opts) {
|
484
|
+
const { root = document, log = false, includePageCSS = false } = opts || {};
|
485
|
+
const cacheStatus = this.cache({ root });
|
486
|
+
const globalBreakdown = this.global({ root });
|
487
|
+
const definitions = this.defs({ root });
|
488
|
+
const metrics = this.metrics({ root });
|
489
|
+
const activeCSS = this.css('active', { root, prettify: false });
|
490
|
+
const unusedCSS = this.css('unused', { root, prettify: false });
|
491
|
+
const allCSS = this.css('all', { root, prettify: false });
|
492
|
+
// Build cleanup summary from metrics
|
493
|
+
const cleanupSummary = {
|
494
|
+
enabled: !!metrics,
|
495
|
+
totalCleanups: metrics?.cleanupHistory?.length || 0,
|
496
|
+
totalClassesDeleted: metrics?.cleanupHistory?.reduce((sum, c) => sum + c.classesDeleted, 0) || 0,
|
497
|
+
totalCssDeleted: metrics?.cleanupHistory?.reduce((sum, c) => sum + c.cssSize, 0) || 0,
|
498
|
+
totalRulesDeleted: metrics?.cleanupHistory?.reduce((sum, c) => sum + c.rulesDeleted, 0) ||
|
499
|
+
0,
|
500
|
+
averageClassesPerCleanup: 0,
|
501
|
+
averageCssPerCleanup: 0,
|
502
|
+
averageRulesPerCleanup: 0,
|
503
|
+
lastCleanup: undefined,
|
504
|
+
};
|
505
|
+
if (cleanupSummary.totalCleanups > 0) {
|
506
|
+
cleanupSummary.averageClassesPerCleanup =
|
507
|
+
cleanupSummary.totalClassesDeleted / cleanupSummary.totalCleanups;
|
508
|
+
cleanupSummary.averageCssPerCleanup =
|
509
|
+
cleanupSummary.totalCssDeleted / cleanupSummary.totalCleanups;
|
510
|
+
cleanupSummary.averageRulesPerCleanup =
|
511
|
+
cleanupSummary.totalRulesDeleted / cleanupSummary.totalCleanups;
|
512
|
+
const lastCleanup = metrics?.cleanupHistory?.[metrics.cleanupHistory.length - 1];
|
513
|
+
if (lastCleanup) {
|
514
|
+
cleanupSummary.lastCleanup = {
|
515
|
+
...lastCleanup,
|
516
|
+
date: new Date(lastCleanup.timestamp).toISOString(),
|
517
|
+
};
|
518
|
+
}
|
519
|
+
}
|
520
|
+
let page;
|
521
|
+
if (includePageCSS) {
|
522
|
+
const pageStats = getPageStats({ root, includeCrossOrigin: true });
|
523
|
+
page = {
|
524
|
+
...pageStats,
|
525
|
+
css: includePageCSS === 'all'
|
526
|
+
? getPageCSS({ root, includeCrossOrigin: true })
|
527
|
+
: undefined,
|
528
|
+
};
|
529
|
+
}
|
530
|
+
const summary = {
|
531
|
+
activeClasses: cacheStatus.classes.active,
|
532
|
+
unusedClasses: cacheStatus.classes.unused,
|
533
|
+
totalStyledClasses: cacheStatus.classes.all,
|
534
|
+
activeCSSSize: activeCSS.length,
|
535
|
+
unusedCSSSize: unusedCSS.length,
|
536
|
+
totalCSSSize: allCSS.length,
|
537
|
+
activeCSS: prettifyCSS(activeCSS),
|
538
|
+
unusedCSS: prettifyCSS(unusedCSS),
|
539
|
+
allCSS: prettifyCSS(allCSS),
|
540
|
+
globalCSS: globalBreakdown.css,
|
541
|
+
globalCSSSize: globalBreakdown.totalCSSSize,
|
542
|
+
globalRuleCount: globalBreakdown.totalRules,
|
543
|
+
page,
|
544
|
+
metrics,
|
545
|
+
definedProperties: definitions.properties,
|
546
|
+
definedKeyframes: definitions.keyframes,
|
547
|
+
propertyCount: definitions.properties.length,
|
548
|
+
keyframeCount: definitions.keyframes.length,
|
549
|
+
cleanupSummary,
|
550
|
+
};
|
551
|
+
if (log) {
|
552
|
+
console.group('🎨 Comprehensive Tasty Debug Summary');
|
553
|
+
console.log(`📊 Style Cache Status:`);
|
554
|
+
console.log(` • Active classes (in DOM): ${summary.activeClasses.length}`);
|
555
|
+
console.log(` • Unused classes (refCount = 0): ${summary.unusedClasses.length}`);
|
556
|
+
console.log(` • Total styled classes: ${summary.totalStyledClasses.length}`);
|
557
|
+
console.log(`💾 CSS Size:`);
|
558
|
+
console.log(` • Active CSS: ${summary.activeCSSSize} characters`);
|
559
|
+
console.log(` • Unused CSS: ${summary.unusedCSSSize} characters`);
|
560
|
+
console.log(` • Global CSS: ${summary.globalCSSSize} characters (${summary.globalRuleCount} rules)`);
|
561
|
+
console.log(` • Total CSS: ${summary.totalCSSSize} characters`);
|
562
|
+
if (page) {
|
563
|
+
console.log(`📄 Page CSS:`);
|
564
|
+
console.log(` • Total page CSS: ${page.cssSize} characters`);
|
565
|
+
console.log(` • Total page rules: ${page.ruleCount}`);
|
566
|
+
console.log(` • Stylesheets: ${page.stylesheetCount} (${page.skippedStylesheets} skipped)`);
|
567
|
+
}
|
568
|
+
console.log('🏷️ Properties & Keyframes:');
|
569
|
+
console.log(` • Defined @property: ${summary.propertyCount}`);
|
570
|
+
console.log(` • Defined @keyframes: ${summary.keyframeCount}`);
|
571
|
+
if (metrics) {
|
572
|
+
console.log(`⚡ Performance Metrics:`);
|
573
|
+
console.log(` • Cache hits: ${metrics.hits}`);
|
574
|
+
console.log(` • Cache misses: ${metrics.misses}`);
|
575
|
+
console.log(` • Cached style reuses: ${metrics.unusedHits}`);
|
576
|
+
const hitRate = metrics.hits + metrics.misses > 0
|
577
|
+
? (((metrics.hits + (metrics.unusedHits || 0)) /
|
578
|
+
(metrics.hits + metrics.misses)) *
|
579
|
+
100).toFixed(1)
|
580
|
+
: '0';
|
581
|
+
console.log(` • Overall cache hit rate: ${hitRate}%`);
|
582
|
+
}
|
583
|
+
console.log('🔍 Details:');
|
584
|
+
console.log(' • Active classes:', summary.activeClasses);
|
585
|
+
console.log(' • Unused classes:', summary.unusedClasses);
|
586
|
+
console.groupEnd();
|
587
|
+
}
|
588
|
+
return summary;
|
589
|
+
},
|
590
|
+
// 8) Page-level CSS helpers
|
591
|
+
pageCSS(opts) {
|
592
|
+
const { root = document, prettify = true, log = false, includeCrossOrigin = true, } = opts || {};
|
593
|
+
const css = getPageCSS({ root, includeCrossOrigin });
|
594
|
+
const result = prettify ? prettifyCSS(css) : css;
|
595
|
+
if (log) {
|
596
|
+
console.group('📄 Page CSS (All Stylesheets)');
|
597
|
+
console.log(result || '(empty)');
|
598
|
+
console.groupEnd();
|
599
|
+
}
|
600
|
+
return result;
|
601
|
+
},
|
602
|
+
pageStats(opts) {
|
603
|
+
const { root = document, includeCrossOrigin = true } = opts || {};
|
604
|
+
return getPageStats({ root, includeCrossOrigin });
|
605
|
+
},
|
606
|
+
// 9) Install globally
|
607
|
+
install() {
|
608
|
+
if (typeof window !== 'undefined' &&
|
609
|
+
window.tastyDebug !== tastyDebug) {
|
610
|
+
window.tastyDebug = tastyDebug;
|
611
|
+
console.log('🎨 tastyDebug installed on window. Run tastyDebug.help() for quick start guide.');
|
612
|
+
}
|
613
|
+
},
|
614
|
+
// 10) Beautiful console logging with collapsible CSS
|
615
|
+
log(target, opts) {
|
616
|
+
const { title, ...cssOpts } = opts || {};
|
617
|
+
const css = tastyDebug.css(target, cssOpts);
|
618
|
+
if (!css.trim()) {
|
619
|
+
console.warn(`🎨 No CSS found for target: ${String(target)}`);
|
620
|
+
return;
|
621
|
+
}
|
622
|
+
const targetStr = Array.isArray(target)
|
623
|
+
? target.join(', ')
|
624
|
+
: String(target);
|
625
|
+
const displayTitle = title || `CSS for "${targetStr}"`;
|
626
|
+
// Get some stats about the CSS
|
627
|
+
const lines = css.split('\n').length;
|
628
|
+
const size = new Blob([css]).size;
|
629
|
+
const sizeStr = size > 1024 ? `${(size / 1024).toFixed(1)}KB` : `${size}B`;
|
630
|
+
// Count CSS rules (blocks with opening braces)
|
631
|
+
const ruleCount = (css.match(/\{/g) || []).length;
|
632
|
+
console.group(`🎨 ${displayTitle} (${ruleCount} rules, ${lines} lines, ${sizeStr})`);
|
633
|
+
// Detect sub-elements in CSS
|
634
|
+
const subElementMatches = css.match(/\[data-element="([^"]+)"\]/g) || [];
|
635
|
+
const subElements = [
|
636
|
+
...new Set(subElementMatches
|
637
|
+
.map((match) => match.match(/\[data-element="([^"]+)"\]/)?.[1])
|
638
|
+
.filter(Boolean)),
|
639
|
+
];
|
640
|
+
if (subElements.length > 0) {
|
641
|
+
console.log(`🧩 Sub-elements found: ${subElements.join(', ')}`);
|
642
|
+
// Show stats and CSS for each sub-element
|
643
|
+
subElements.forEach((element) => {
|
644
|
+
const elementSelector = `[data-element="${element}"]`;
|
645
|
+
const elementRegex = new RegExp(`[^}]*\\[data-element="${element.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}"\\][^{]*\\{[^}]*\\}`, 'gm');
|
646
|
+
const elementCSS = (css.match(elementRegex) || []).join('\n');
|
647
|
+
if (elementCSS) {
|
648
|
+
const elementRules = (elementCSS.match(/\{/g) || []).length;
|
649
|
+
const elementLines = elementCSS.split('\n').length;
|
650
|
+
const elementSize = new Blob([elementCSS]).size;
|
651
|
+
const elementSizeStr = elementSize > 1024
|
652
|
+
? `${(elementSize / 1024).toFixed(1)}KB`
|
653
|
+
: `${elementSize}B`;
|
654
|
+
console.groupCollapsed(`🧩 ${element} (${elementRules} rules, ${elementLines} lines, ${elementSizeStr})`);
|
655
|
+
console.log(`%c${elementCSS}`, 'color: #666; font-family: monospace; font-size: 12px; white-space: pre;');
|
656
|
+
console.groupEnd();
|
657
|
+
}
|
658
|
+
});
|
659
|
+
}
|
660
|
+
// Full CSS in collapsible group (hidden by default)
|
661
|
+
console.groupCollapsed('📄 Full CSS (click to expand)');
|
662
|
+
console.log(`%c${css}`, 'color: #666; font-family: monospace; font-size: 12px; white-space: pre;');
|
663
|
+
console.groupEnd();
|
664
|
+
console.groupEnd();
|
665
|
+
},
|
666
|
+
// 11) Show help and usage examples
|
667
|
+
help() {
|
668
|
+
console.group('🎨 tastyDebug - Quick Start Guide');
|
669
|
+
console.log('💡 Essential commands:');
|
670
|
+
console.log(' • tastyDebug.summary({ log: true }) - comprehensive overview');
|
671
|
+
console.log(' • tastyDebug.log("active") - beautiful CSS display');
|
672
|
+
console.log(' • tastyDebug.css("active") - get active CSS');
|
673
|
+
console.log(' • tastyDebug.inspect(".my-element") - detailed element inspection');
|
674
|
+
console.log(' • tastyDebug.global({ log: true }) - global CSS analysis');
|
675
|
+
console.log(' • tastyDebug.cache() - cache status');
|
676
|
+
console.log(' • tastyDebug.defs() - defined properties & keyframes');
|
677
|
+
console.log(' • tastyDebug.pageCSS({ log: true }) - all page CSS');
|
678
|
+
console.log('');
|
679
|
+
console.log('📖 Common targets for css()/log():');
|
680
|
+
console.log(' • "all" - all tasty CSS + global CSS');
|
681
|
+
console.log(' • "active" - CSS for classes in DOM');
|
682
|
+
console.log(' • "unused" - CSS for classes with refCount = 0');
|
683
|
+
console.log(' • "global" - only global CSS (createGlobalStyle)');
|
684
|
+
console.log(' • "page" - ALL page CSS (including non-tasty)');
|
685
|
+
console.log(' • "t123" - specific tasty class');
|
686
|
+
console.log(' • [".my-selector"] - CSS selector');
|
687
|
+
console.log('');
|
688
|
+
console.log('🔧 Available options:');
|
689
|
+
console.log(' • { log: true } - auto-log results to console');
|
690
|
+
console.log(' • { title: "Custom" } - custom title for log()');
|
691
|
+
console.log(' • { root: shadowRoot } - target Shadow DOM');
|
692
|
+
console.log(' • { prettify: false } - skip CSS formatting');
|
693
|
+
console.groupEnd();
|
694
|
+
},
|
695
|
+
};
|
696
|
+
/**
|
697
|
+
* Auto-install in development
|
698
|
+
*/
|
699
|
+
if (typeof window !== 'undefined' && isDevEnv()) {
|
700
|
+
tastyDebug.install();
|
701
|
+
}
|
702
|
+
|
703
|
+
|