@cube-dev/ui-kit 0.126.0 → 0.127.1
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/dist/CHANGELOG.md +49 -0
- package/dist/_internal/hooks/use-chained-callback.js +1 -1
- package/dist/_internal/hooks/use-debounced-value.js +1 -1
- package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
- package/dist/_internal/hooks/use-event.js +1 -1
- package/dist/_internal/hooks/use-is-first-render.js +1 -1
- package/dist/_internal/hooks/use-sync-ref.js +1 -1
- package/dist/_internal/hooks/use-timer/timer.js +1 -1
- package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
- package/dist/_internal/hooks/use-warn.js +1 -1
- package/dist/components/Block.js +1 -1
- package/dist/components/CollectionItem.js +1 -1
- package/dist/components/GlobalStyles.js +1 -1
- package/dist/components/GridProvider.js +1 -1
- package/dist/components/HiddenInput.js +1 -1
- package/dist/components/Root.js +1 -1
- package/dist/components/actions/Action/Action.js +1 -1
- package/dist/components/actions/Banner/Banner.js +1 -1
- package/dist/components/actions/Button/Button.js +1 -1
- package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
- package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
- package/dist/components/actions/ButtonSplit/context.js +1 -1
- package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
- package/dist/components/actions/CommandMenu/CommandMenu.js.map +1 -1
- package/dist/components/actions/CommandMenu/styled.js +1 -1
- package/dist/components/actions/ItemAction/ItemAction.js +1 -1
- package/dist/components/actions/ItemActionContext.js +1 -1
- package/dist/components/actions/ItemButton/ItemButton.js +1 -1
- package/dist/components/actions/Link/Link.js +1 -1
- package/dist/components/actions/Menu/Menu.js +1 -1
- package/dist/components/actions/Menu/Menu.js.map +1 -1
- package/dist/components/actions/Menu/MenuItem.js +1 -1
- package/dist/components/actions/Menu/MenuSection.js +1 -1
- package/dist/components/actions/Menu/MenuTrigger.js +1 -1
- package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
- package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
- package/dist/components/actions/Menu/context.js +1 -1
- package/dist/components/actions/Menu/styled.js +1 -2
- package/dist/components/actions/Menu/styled.js.map +1 -1
- package/dist/components/actions/index.js +1 -1
- package/dist/components/actions/use-action.js +1 -1
- package/dist/components/actions/use-anchored-menu.js +1 -1
- package/dist/components/actions/use-context-menu.js +1 -1
- package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
- package/dist/components/content/Alert/Alert.js +1 -1
- package/dist/components/content/Alert/use-alert.js +1 -1
- package/dist/components/content/Avatar/Avatar.js +1 -1
- package/dist/components/content/Badge/Badge.js +1 -1
- package/dist/components/content/Card/Card.js +1 -1
- package/dist/components/content/Content.js +1 -1
- package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
- package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
- package/dist/components/content/Disclosure/Disclosure.js +1 -1
- package/dist/components/content/Divider.js +1 -1
- package/dist/components/content/Footer.js +1 -1
- package/dist/components/content/Header.js +1 -1
- package/dist/components/content/HotKeys/HotKeys.js +1 -1
- package/dist/components/content/Item/Item.js +1 -1
- package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
- package/dist/components/content/ItemCard/ItemCard.js +1 -1
- package/dist/components/content/Layout/GridLayout.js +1 -1
- package/dist/components/content/Layout/Layout.js +1 -1
- package/dist/components/content/Layout/LayoutBlock.js +1 -1
- package/dist/components/content/Layout/LayoutCenter.js +1 -1
- package/dist/components/content/Layout/LayoutContainer.js +1 -1
- package/dist/components/content/Layout/LayoutContent.js +1 -1
- package/dist/components/content/Layout/LayoutContext.js +1 -1
- package/dist/components/content/Layout/LayoutFlex.js +1 -1
- package/dist/components/content/Layout/LayoutFooter.js +1 -1
- package/dist/components/content/Layout/LayoutGrid.js +1 -1
- package/dist/components/content/Layout/LayoutHeader.js +1 -1
- package/dist/components/content/Layout/LayoutPane.js +1 -1
- package/dist/components/content/Layout/LayoutPanel.js +5 -1
- package/dist/components/content/Layout/LayoutPanel.js.map +1 -1
- package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
- package/dist/components/content/Layout/LayoutToolbar.js +1 -1
- package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
- package/dist/components/content/Layout/index.js +1 -1
- package/dist/components/content/Layout/utils.js +1 -1
- package/dist/components/content/Paragraph.js +1 -1
- package/dist/components/content/Placeholder/Placeholder.js +1 -1
- package/dist/components/content/PrismCode/PrismCode.js +1 -1
- package/dist/components/content/PrismCode/prismSetup.js +1 -1
- package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
- package/dist/components/content/Result/Result.js +1 -1
- package/dist/components/content/Skeleton/Skeleton.js +1 -1
- package/dist/components/content/Tag/Tag.js +1 -1
- package/dist/components/content/Text.js +1 -1
- package/dist/components/content/TextItem/TextItem.js +1 -1
- package/dist/components/content/Title.js +1 -1
- package/dist/components/content/highlightText.js +1 -1
- package/dist/components/content/use-auto-tooltip.js +1 -1
- package/dist/components/fields/Checkbox/Checkbox.js +2 -2
- package/dist/components/fields/Checkbox/Checkbox.js.map +1 -1
- package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
- package/dist/components/fields/Checkbox/context.js +1 -1
- package/dist/components/fields/ComboBox/ComboBox.js +1 -1
- package/dist/components/fields/DatePicker/DateInput.d.ts +4 -4
- package/dist/components/fields/DatePicker/DateInput.js +1 -1
- package/dist/components/fields/DatePicker/DateInput.js.map +1 -1
- package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
- package/dist/components/fields/DatePicker/DatePicker.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
- package/dist/components/fields/DatePicker/DateRangePicker.d.ts +4 -4
- package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
- package/dist/components/fields/DatePicker/DateRangePicker.js.map +1 -1
- package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
- package/dist/components/fields/DatePicker/TimeInput.js +1 -1
- package/dist/components/fields/DatePicker/intl.js +1 -1
- package/dist/components/fields/DatePicker/parseDate.js +1 -1
- package/dist/components/fields/DatePicker/props.js +1 -1
- package/dist/components/fields/DatePicker/utils.js +1 -1
- package/dist/components/fields/FileInput/FileInput.js +1 -1
- package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
- package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
- package/dist/components/fields/Input/Input.js +1 -1
- package/dist/components/fields/ListBox/ListBox.js +1 -1
- package/dist/components/fields/NumberInput/NumberInput.js +1 -1
- package/dist/components/fields/NumberInput/StepButton.js +1 -1
- package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
- package/dist/components/fields/Picker/Picker.js +1 -1
- package/dist/components/fields/Picker/Picker.js.map +1 -1
- package/dist/components/fields/RadioGroup/Radio.d.ts +1 -0
- package/dist/components/fields/RadioGroup/Radio.js +5 -8
- package/dist/components/fields/RadioGroup/Radio.js.map +1 -1
- package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
- package/dist/components/fields/RadioGroup/context.js +1 -1
- package/dist/components/fields/SearchInput/SearchInput.js +1 -1
- package/dist/components/fields/Select/Select.d.ts +1 -1
- package/dist/components/fields/Select/Select.js +1 -1
- package/dist/components/fields/Slider/Gradation.js +1 -1
- package/dist/components/fields/Slider/HueSlider.js +1 -1
- package/dist/components/fields/Slider/RangeSlider.js +1 -1
- package/dist/components/fields/Slider/Slider.js +1 -1
- package/dist/components/fields/Slider/SliderBase.js +1 -1
- package/dist/components/fields/Slider/SliderThumb.js +1 -1
- package/dist/components/fields/Slider/SliderTrack.js +1 -1
- package/dist/components/fields/Slider/elements.js +1 -1
- package/dist/components/fields/Slider/index.js +1 -1
- package/dist/components/fields/Switch/Switch.js +1 -1
- package/dist/components/fields/TextArea/TextArea.js +1 -1
- package/dist/components/fields/TextInput/TextInput.js +1 -1
- package/dist/components/fields/TextInput/TextInputBase.js +1 -1
- package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
- package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
- package/dist/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
- package/dist/components/form/Form/Field.js +1 -1
- package/dist/components/form/Form/Form.js +1 -1
- package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
- package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
- package/dist/components/form/Form/SubmitError.js +1 -1
- package/dist/components/form/Form/index.js +1 -1
- package/dist/components/form/Form/use-field/use-field-props.js +1 -1
- package/dist/components/form/Form/use-field/use-field.js +1 -1
- package/dist/components/form/Form/use-form.js +1 -1
- package/dist/components/form/Form/validation.js +1 -1
- package/dist/components/form/Label.js +1 -1
- package/dist/components/form/wrapper.js +1 -1
- package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
- package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
- package/dist/components/layout/Flex.js +1 -1
- package/dist/components/layout/Flow.js +1 -1
- package/dist/components/layout/Grid.js +1 -1
- package/dist/components/layout/Grid.js.map +1 -1
- package/dist/components/layout/Panel.js +1 -1
- package/dist/components/layout/Prefix.js +1 -1
- package/dist/components/layout/ResizablePanel.js +1 -1
- package/dist/components/layout/Space.js +1 -1
- package/dist/components/layout/Suffix.js +1 -1
- package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
- package/dist/components/navigation/Tabs/EditableTitle.js +1 -1
- package/dist/components/navigation/Tabs/TabButton.js +1 -1
- package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
- package/dist/components/navigation/Tabs/TabPanel.js +1 -1
- package/dist/components/navigation/Tabs/TabPicker.js +1 -1
- package/dist/components/navigation/Tabs/Tabs.js +1 -1
- package/dist/components/navigation/Tabs/TabsAction.js +1 -1
- package/dist/components/navigation/Tabs/TabsContext.js +1 -1
- package/dist/components/navigation/Tabs/styled.js +1 -1
- package/dist/components/navigation/Tabs/types.d.ts +4 -2
- package/dist/components/navigation/Tabs/types.js +3 -2
- package/dist/components/navigation/Tabs/types.js.map +1 -1
- package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
- package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
- package/dist/components/organisms/FileTabs/FileTabs.js +1 -1
- package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
- package/dist/components/other/Calendar/Calendar.js +1 -1
- package/dist/components/other/Calendar/CalendarCell.js +1 -1
- package/dist/components/other/Calendar/CalendarGrid.js +1 -1
- package/dist/components/other/Calendar/RangeCalendar.js +1 -1
- package/dist/components/other/CloudLogo/CloudLogo.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
- package/dist/components/overlays/Dialog/Dialog.js +1 -1
- package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
- package/dist/components/overlays/Dialog/DialogForm.js +1 -1
- package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
- package/dist/components/overlays/Dialog/context.js +1 -1
- package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
- package/dist/components/overlays/Modal/Modal.js +1 -1
- package/dist/components/overlays/Modal/OpenTransition.js +1 -1
- package/dist/components/overlays/Modal/Overlay.js +1 -1
- package/dist/components/overlays/Modal/Popover.js +1 -1
- package/dist/components/overlays/Modal/Tray.js +1 -1
- package/dist/components/overlays/Modal/Underlay.js +1 -1
- package/dist/components/overlays/Notifications/Notification.js +1 -1
- package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
- package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
- package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
- package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
- package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
- package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
- package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
- package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
- package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
- package/dist/components/overlays/Notifications/index.js +1 -1
- package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
- package/dist/components/overlays/Notifications/use-notifications.js +1 -1
- package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
- package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
- package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
- package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
- package/dist/components/overlays/Toast/ToastItem.js +1 -1
- package/dist/components/overlays/Toast/index.js +1 -1
- package/dist/components/overlays/Toast/useProgressToast.js +1 -1
- package/dist/components/overlays/Toast/useToast.js +1 -1
- package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
- package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
- package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
- package/dist/components/overlays/Tooltip/context.js +1 -1
- package/dist/components/portal/Portal.js +1 -1
- package/dist/components/portal/PortalProvider.js +1 -1
- package/dist/components/portal/usePortal.js +1 -1
- package/dist/components/shared/InvalidIcon.js +1 -1
- package/dist/components/shared/ValidIcon.js +1 -1
- package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
- package/dist/components/status/Spin/Cube.js +1 -1
- package/dist/components/status/Spin/InternalSpinner.js +1 -1
- package/dist/components/status/Spin/Spin.js +1 -1
- package/dist/components/status/Spin/SpinsContainer.js +1 -1
- package/dist/data/item-themes.js +1 -1
- package/dist/data/themes.js +1 -1
- package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
- package/dist/icons/AdjustmentsIcon.js +1 -1
- package/dist/icons/AiIcon.js +1 -1
- package/dist/icons/AreaChartIcon.js +1 -1
- package/dist/icons/BackwardIcon.js +1 -1
- package/dist/icons/BarChartIcon.js +1 -1
- package/dist/icons/BellFilledIcon.js +1 -1
- package/dist/icons/BellIcon.js +1 -1
- package/dist/icons/BooleanIcon.js +1 -1
- package/dist/icons/CalendarEditIcon.js +1 -1
- package/dist/icons/CalendarIcon.js +1 -1
- package/dist/icons/CaretDownIcon.js +1 -1
- package/dist/icons/CaretUpIcon.js +1 -1
- package/dist/icons/ChartAreaStackedIcon.js +1 -1
- package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
- package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarGroupedIcon.js +1 -1
- package/dist/icons/ChartBarHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarLineIcon.js +1 -1
- package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarStackedIcon.js +1 -1
- package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
- package/dist/icons/ChartBoxPlot2Icon.js +1 -1
- package/dist/icons/ChartBoxPlotIcon.js +1 -1
- package/dist/icons/ChartBubbleIcon.js +1 -1
- package/dist/icons/ChartDonut2Icon.js +1 -1
- package/dist/icons/ChartFunnelIcon.js +1 -1
- package/dist/icons/ChartHeatmapIcon.js +1 -1
- package/dist/icons/ChartKPIIcon.js +1 -1
- package/dist/icons/ChartPie2Icon.js +1 -1
- package/dist/icons/ChartScatterIcon.js +1 -1
- package/dist/icons/CheckCircleFilledIcon.js +1 -1
- package/dist/icons/CheckCircleIcon.js +1 -1
- package/dist/icons/CheckIcon.js +1 -1
- package/dist/icons/CircleFilledIcon.js +1 -1
- package/dist/icons/ClearIcon.js +1 -1
- package/dist/icons/CloseCircleFilledIcon.js +1 -1
- package/dist/icons/CloseCircleIcon.js +1 -1
- package/dist/icons/CloseIcon.js +1 -1
- package/dist/icons/CodeIcon.js +1 -1
- package/dist/icons/ColumnTotalIcon.js +1 -1
- package/dist/icons/CopyIcon.js +1 -1
- package/dist/icons/CountIcon.js +1 -1
- package/dist/icons/CubeIcon.js +1 -1
- package/dist/icons/CubePauseIcon.js +1 -1
- package/dist/icons/CubePlayIcon.js +1 -1
- package/dist/icons/CurrencyDollarIcon.js +1 -1
- package/dist/icons/DangerIcon.js +1 -1
- package/dist/icons/DashboardIcon.js +1 -1
- package/dist/icons/DatabaseIcon.js +1 -1
- package/dist/icons/DecimalDecreaseIcon.js +1 -1
- package/dist/icons/DecimalIncreaseIcon.js +1 -1
- package/dist/icons/DirectionIcon.js +1 -1
- package/dist/icons/DonutIcon.js +1 -1
- package/dist/icons/DownIcon.js +1 -1
- package/dist/icons/EditIcon.js +1 -1
- package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
- package/dist/icons/ExclamationCircleIcon.js +1 -1
- package/dist/icons/ExclamationIcon.js +1 -1
- package/dist/icons/EyeIcon.js +1 -1
- package/dist/icons/EyeInvisibleIcon.js +1 -1
- package/dist/icons/FilterIcon.js +1 -1
- package/dist/icons/FolderFilledIcon.js +1 -1
- package/dist/icons/FolderIcon.js +1 -1
- package/dist/icons/FolderOpenFilledIcon.js +1 -1
- package/dist/icons/FolderOpenIcon.js +1 -1
- package/dist/icons/ForwardIcon.js +1 -1
- package/dist/icons/HierarchyIcon.js +1 -1
- package/dist/icons/HierarchyOpenIcon.js +1 -1
- package/dist/icons/Icon.js +1 -1
- package/dist/icons/InfoCircleIcon.js +1 -1
- package/dist/icons/InfoIcon.js +1 -1
- package/dist/icons/KeyIcon.js +1 -1
- package/dist/icons/LeftIcon.js +1 -1
- package/dist/icons/LineChartIcon.js +1 -1
- package/dist/icons/LoadingIcon.js +1 -1
- package/dist/icons/LockFilledIcon.js +1 -1
- package/dist/icons/LockIcon.js +1 -1
- package/dist/icons/MoreIcon.js +1 -1
- package/dist/icons/NotAllowedIcon.js +1 -1
- package/dist/icons/Number123Icon.js +1 -1
- package/dist/icons/NumberIcon.js +1 -1
- package/dist/icons/PauseCircleFilledIcon.js +1 -1
- package/dist/icons/PauseCircleIcon.js +1 -1
- package/dist/icons/PauseIcon.js +1 -1
- package/dist/icons/PercentageIcon.js +1 -1
- package/dist/icons/PieChartIcon.js +1 -1
- package/dist/icons/PlayCircleIcon.js +1 -1
- package/dist/icons/PlayIcon.js +1 -1
- package/dist/icons/PlusIcon.js +1 -1
- package/dist/icons/ProgressBarIcon.js +1 -1
- package/dist/icons/ReloadIcon.js +1 -1
- package/dist/icons/ReportIcon.js +1 -1
- package/dist/icons/ReturnIcon.js +1 -1
- package/dist/icons/RightIcon.js +1 -1
- package/dist/icons/RowTotalsIcon.js +1 -1
- package/dist/icons/SchemeIcon.js +1 -1
- package/dist/icons/SearchIcon.js +1 -1
- package/dist/icons/SemanticQueryIcon.js +1 -1
- package/dist/icons/SettingsIcon.js +1 -1
- package/dist/icons/ShieldFilledIcon.js +1 -1
- package/dist/icons/ShieldIcon.js +1 -1
- package/dist/icons/SlashIcon.js +1 -1
- package/dist/icons/SparklesIcon.js +1 -1
- package/dist/icons/SqlIcon.js +1 -1
- package/dist/icons/StatsIcon.js +1 -1
- package/dist/icons/StopIcon.js +1 -1
- package/dist/icons/StringIcon.js +1 -1
- package/dist/icons/SubtotalsIcon.js +1 -1
- package/dist/icons/SwitchIcon.js +1 -1
- package/dist/icons/TableIcon.js +1 -1
- package/dist/icons/ThumbsDownIcon.js +1 -1
- package/dist/icons/ThumbsUpIcon.js +1 -1
- package/dist/icons/ThunderboltCrossedIcon.js +1 -1
- package/dist/icons/ThunderboltFilledIcon.js +1 -1
- package/dist/icons/ThunderboltIcon.js +1 -1
- package/dist/icons/TimeIcon.js +1 -1
- package/dist/icons/TrashIcon.js +1 -1
- package/dist/icons/UnlockIcon.js +1 -1
- package/dist/icons/UpIcon.js +1 -1
- package/dist/icons/UserGroupIcon.js +1 -1
- package/dist/icons/UserIcon.js +1 -1
- package/dist/icons/UserLockIcon.js +1 -1
- package/dist/icons/ViewIcon.js +1 -1
- package/dist/icons/WarningFilledIcon.js +1 -1
- package/dist/icons/WarningIcon.js +1 -1
- package/dist/icons/wrap-icon.js +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/provider.js +1 -1
- package/dist/providers/TrackingProvider.js +1 -1
- package/dist/providers/navigationAdapter.default.js +1 -1
- package/dist/tokens/base.js +1 -1
- package/dist/tokens/colors.js +1 -1
- package/dist/tokens/index.d.ts +1 -1
- package/dist/tokens/index.js +1 -1
- package/dist/tokens/index.js.map +1 -1
- package/dist/tokens/layout.js +1 -1
- package/dist/tokens/shadows.js +1 -1
- package/dist/tokens/sizes.js +1 -1
- package/dist/tokens/spacing.js +1 -1
- package/dist/tokens/typography.d.ts +1 -1
- package/dist/tokens/typography.js +1 -1
- package/dist/utils/ResizeSensor.js +1 -1
- package/dist/utils/is-dev-env.js +1 -1
- package/dist/utils/modules.js +1 -1
- package/dist/utils/promise.js +1 -1
- package/dist/utils/raf.js +1 -1
- package/dist/utils/random.js +1 -1
- package/dist/utils/range.js +1 -1
- package/dist/utils/react/RenderCache.js +1 -1
- package/dist/utils/react/Slots.js +1 -1
- package/dist/utils/react/chain.js +1 -1
- package/dist/utils/react/forwardRefWithGenerics.js +1 -1
- package/dist/utils/react/index.js +1 -1
- package/dist/utils/react/interactions.js +1 -1
- package/dist/utils/react/isTextOnly.js +1 -1
- package/dist/utils/react/mapProps.js +1 -1
- package/dist/utils/react/mergeProps.js +1 -1
- package/dist/utils/react/nullableValue.js +1 -1
- package/dist/utils/react/resolveIcon.js +1 -1
- package/dist/utils/react/sharedStore.js +1 -1
- package/dist/utils/react/useCombinedRefs.js +1 -1
- package/dist/utils/react/useControlledFocusVisible.js +1 -1
- package/dist/utils/react/useEventBus.js +1 -1
- package/dist/utils/react/useId.js +1 -1
- package/dist/utils/react/useIsDarwin.js +1 -1
- package/dist/utils/react/useKeySymbols.js +1 -1
- package/dist/utils/react/useLayoutEffect.js +1 -1
- package/dist/utils/react/useLocalStorage.js +1 -1
- package/dist/utils/react/useMergeStyles.js +1 -1
- package/dist/utils/react/useQaProps.js +1 -1
- package/dist/utils/react/useViewportSize.js +1 -1
- package/dist/utils/react/wrapNodeIfPlain.js +1 -1
- package/dist/utils/selection.js +1 -1
- package/dist/utils/styles.d.ts +1 -1
- package/dist/utils/styles.js +5 -4
- package/dist/utils/styles.js.map +1 -1
- package/dist/utils/tree.js +1 -1
- package/dist/utils/warnings.js +1 -1
- package/dist/version.js +2 -2
- package/docs/components/fields/ComboBox.md +27 -0
- package/docs/components/fields/FilterListBox.md +25 -0
- package/docs/components/fields/FilterPicker.md +34 -0
- package/docs/components/fields/ListBox.md +38 -8
- package/docs/components/fields/Picker.md +25 -0
- package/docs/components/fields/Select.md +2 -0
- package/docs/components/navigation/Tabs.md +2 -2
- package/docs/tasty/README.md +4 -4
- package/docs/tasty/adoption.md +5 -3
- package/docs/tasty/comparison.md +24 -25
- package/docs/tasty/configuration.md +69 -1
- package/docs/tasty/debug.md +11 -9
- package/docs/tasty/design-system.md +22 -10
- package/docs/tasty/dsl.md +23 -8
- package/docs/tasty/getting-started.md +10 -10
- package/docs/tasty/injector.md +41 -25
- package/docs/tasty/methodology.md +52 -3
- package/docs/tasty/{PIPELINE.md → pipeline.md} +204 -50
- package/docs/tasty/{runtime.md → react-api.md} +104 -32
- package/docs/tasty/ssr.md +139 -81
- package/docs/tasty/styles.md +17 -0
- package/docs/tasty/tasty-static.md +101 -2
- package/package.json +2 -2
package/docs/tasty/comparison.md
CHANGED
|
@@ -29,14 +29,14 @@ That is why syntax-level comparisons are often shallow. The more meaningful comp
|
|
|
29
29
|
|
|
30
30
|
## High-level positioning
|
|
31
31
|
|
|
32
|
-
| System | Best described as | Main authoring model | Conflict model | Best fit |
|
|
33
|
-
|
|
34
|
-
| **Tasty** | Design-system styling engine | Custom DSL with tokens, state maps, recipes, style props, sub-elements, custom units | **Mutually exclusive selector resolution** for stateful styles | Teams building shared component APIs or a house styling language |
|
|
35
|
-
| **Tailwind CSS** | Utility-first styling framework | Utility classes in markup | Utility composition, variants, and framework-controlled ordering | Product teams optimizing for speed and direct authoring |
|
|
36
|
-
| **Panda CSS** | Typed styling engine with atomic output | Typed style objects, recipes, generated primitives, style props | Atomic CSS with static analysis | Teams wanting a DS-friendly engine with typed primitives |
|
|
37
|
-
| **vanilla-extract** | Zero-runtime TS-native stylesheet system | `.css.ts` files, theme contracts, style composition | Standard CSS semantics | Teams wanting static CSS and low-level control |
|
|
38
|
-
| **StyleX** | Compiler-based atomic styling system | JS authoring with compiler-generated atomic CSS | Compiler-controlled atomic composition | Large app teams wanting optimized, predictable atomic styling |
|
|
39
|
-
| **Stitches** (deprecated) **/ Emotion** | Component-first CSS-in-JS | Styled components, `css()` APIs, object/string styles | Composition within CSS-in-JS rules | Teams optimizing for component DX and flexible styling |
|
|
32
|
+
| System | Best described as | Main authoring model | Conflict model | RSC / zero-JS SSG | Best fit |
|
|
33
|
+
|---|---|---|---|---|---|
|
|
34
|
+
| **Tasty** | Design-system styling engine | Custom DSL with tokens, state maps, recipes, style props, sub-elements, custom units | **Mutually exclusive selector resolution** for stateful styles | Yes — hook-free, server components by default | Teams building shared component APIs or a house styling language |
|
|
35
|
+
| **Tailwind CSS** | Utility-first styling framework | Utility classes in markup | Utility composition, variants, and framework-controlled ordering | Yes — no JS runtime | Product teams optimizing for speed and direct authoring |
|
|
36
|
+
| **Panda CSS** | Typed styling engine with atomic output | Typed style objects, recipes, generated primitives, style props | Atomic CSS with static analysis | Yes — build-time extraction | Teams wanting a DS-friendly engine with typed primitives |
|
|
37
|
+
| **vanilla-extract** | Zero-runtime TS-native stylesheet system | `.css.ts` files, theme contracts, style composition | Standard CSS semantics | Yes — build-time extraction | Teams wanting static CSS and low-level control |
|
|
38
|
+
| **StyleX** | Compiler-based atomic styling system | JS authoring with compiler-generated atomic CSS | Compiler-controlled atomic composition | Yes — compiler-extracted | Large app teams wanting optimized, predictable atomic styling |
|
|
39
|
+
| **Stitches** (deprecated) **/ Emotion** | Component-first CSS-in-JS | Styled components, `css()` APIs, object/string styles | Composition within CSS-in-JS rules | No — requires `'use client'` | Teams optimizing for component DX and flexible styling |
|
|
40
40
|
|
|
41
41
|
---
|
|
42
42
|
|
|
@@ -92,7 +92,7 @@ That makes Tasty less of a "better way to write CSS objects" and more of a **sta
|
|
|
92
92
|
Beyond state resolution, Tasty also provides several structural capabilities that reinforce the design-system layer:
|
|
93
93
|
|
|
94
94
|
- **CSS properties as typed React props** — `styleProps` lets a component expose selected style properties as normal props (`<Button placeSelf="end">`), including state maps for responsive values. This keeps layout and composition controls inside a governed component API instead of pushing teams back to ad hoc styling escapes.
|
|
95
|
-
- **Sub-element styling** — Compound components declare inner parts via capitalized keys in `styles` and `data-element` attributes. States, tokens, and recipes apply across the entire element tree from a single definition. See [
|
|
95
|
+
- **Sub-element styling** — Compound components declare inner parts via capitalized keys in `styles` and `data-element` attributes. States, tokens, and recipes apply across the entire element tree from a single definition. See [React API — Sub-element Styling](react-api.md#sub-element-styling).
|
|
96
96
|
- **Auto-inferred `@property`** — When a custom property is assigned a concrete value, Tasty infers the CSS `@property` syntax and registers it automatically, enabling smooth transitions on custom properties without manual declarations.
|
|
97
97
|
- **AI-friendly style definitions** — Style definitions are declarative, self-contained, and structurally consistent. AI tools can read, refactor, and generate Tasty styles as confidently as a human — no hidden cascade logic or implicit ordering to second-guess.
|
|
98
98
|
- **Companion ecosystem** — An [ESLint plugin](https://github.com/tenphi/eslint-plugin-tasty) with 27 lint rules, a [VS Code extension](https://github.com/tenphi/tasty-vscode-extension) for syntax highlighting, and [Glaze](https://github.com/tenphi/glaze) for OKHSL color theme generation with automatic WCAG contrast solving.
|
|
@@ -235,13 +235,12 @@ Tasty is more opinionated.
|
|
|
235
235
|
|
|
236
236
|
It behaves less like "TypeScript that outputs CSS" and more like a **state-aware style compiler**. It is designed to encode higher-level styling semantics rather than only expose CSS primitives in typed form.
|
|
237
237
|
|
|
238
|
-
This also makes Tasty's
|
|
238
|
+
This also makes Tasty's rendering model notable:
|
|
239
239
|
|
|
240
|
-
-
|
|
241
|
-
- `tastyStatic()` with the Babel plugin produces static class name strings with
|
|
242
|
-
- In static mode, the output is plain CSS + class names, so it can be used with any JavaScript framework — not only React
|
|
240
|
+
- `tasty()` components are hook-free and work as React Server Components. In server-only contexts (Next.js RSC, Astro without islands), they produce static HTML + CSS with zero client JavaScript — the full feature set is available without sacrificing server rendering
|
|
241
|
+
- `tastyStatic()` with the Babel plugin produces static class name strings via build-time extraction, with no React dependency at runtime — the output works with any JavaScript framework
|
|
243
242
|
|
|
244
|
-
Runtime features like `styleProps`, sub-element components, and dynamic variants are
|
|
243
|
+
Runtime features like `styleProps`, sub-element components, and dynamic variants are available in the `tasty()` path. The `tastyStatic()` path is framework-agnostic but limited to the DSL, tokens, and state logic.
|
|
245
244
|
|
|
246
245
|
So the tradeoff is roughly:
|
|
247
246
|
|
|
@@ -303,6 +302,8 @@ So while Stitches and Emotion are strong tools for building components, Tasty is
|
|
|
303
302
|
|
|
304
303
|
That makes it narrower in audience, but deeper in architectural ambition.
|
|
305
304
|
|
|
305
|
+
There is also a fundamental architectural difference: Emotion and styled-components rely on React context and hooks internally, which means they require `'use client'` in modern React and cannot run as React Server Components. Tasty's style functions and `tasty()` components are hook-free, so they work as server components by default and produce zero client JavaScript in server-only contexts. This is not a minor compatibility detail — it means Tasty-based components stay as server components until *your* code needs interactivity, while Emotion and styled-components force the client boundary at the styling layer.
|
|
306
|
+
|
|
306
307
|
For teams evaluating runtime styling at scale, Tasty also documents its runtime benchmarks and caching model in the main [README](../README.md#performance). That matters, but it is still secondary to the core question of whether you want Tasty's deterministic selector model.
|
|
307
308
|
|
|
308
309
|
---
|
|
@@ -311,20 +312,18 @@ For teams evaluating runtime styling at scale, Tasty also documents its runtime
|
|
|
311
312
|
|
|
312
313
|
Tasty is not limited to one execution model.
|
|
313
314
|
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
That distinction matters.
|
|
315
|
+
The term "runtime" in `tasty()` refers to *when* style computation happens — during React rendering — not to where that rendering occurs. In server-only contexts (Next.js RSC without `'use client'`, Astro without `client:*` directives, SSG), `tasty()` components render on the server, produce static HTML + CSS, and ship **zero client JavaScript**. The full feature set — `styleProps`, sub-elements, variants, state maps — is available. The result is the same as what `tastyStatic()` produces, but without giving up any runtime capabilities.
|
|
317
316
|
|
|
318
|
-
|
|
317
|
+
Client JavaScript only enters the picture when a component needs React interactivity (state, effects, event handlers) — and that is the consuming component's decision, never Tasty's. Tasty never forces the `'use client'` boundary.
|
|
319
318
|
|
|
320
|
-
|
|
319
|
+
`tastyStatic()` with the Babel plugin is for a different scenario: when you want build-time CSS extraction **without React at runtime**. The output is framework-agnostic — any JavaScript framework can consume the resulting class names and CSS. This makes Tasty usable as the compiler layer underneath a design-system implementation, even outside the React ecosystem.
|
|
321
320
|
|
|
322
|
-
The tradeoff is that some capabilities — `styleProps`, sub-element components (`<Card.Title>`), dynamic variants — are tied to the
|
|
321
|
+
The tradeoff is that some capabilities — `styleProps`, sub-element components (`<Card.Title>`), dynamic variants — are tied to the `tasty()` path. The `tastyStatic()` path is best understood as extraction and compilation of the DSL, tokens, and state logic without a React dependency.
|
|
323
322
|
|
|
324
323
|
This flexibility is one of Tasty's more unusual strengths:
|
|
325
324
|
|
|
326
|
-
-
|
|
327
|
-
-
|
|
325
|
+
- `tasty()` as the default for all React setups — zero client JS in server-only contexts, full feature set, SSR integration available when client hydration is needed
|
|
326
|
+
- `tastyStatic()` as a static compiler whose output works with any framework, including non-React ones
|
|
328
327
|
|
|
329
328
|
---
|
|
330
329
|
|
|
@@ -337,8 +336,8 @@ These are optimized for styling product code directly.
|
|
|
337
336
|
|
|
338
337
|
Examples:
|
|
339
338
|
- Tailwind CSS
|
|
340
|
-
- Emotion
|
|
341
|
-
- Stitches (deprecated)
|
|
339
|
+
- Emotion (requires `'use client'` — not RSC-compatible)
|
|
340
|
+
- Stitches (deprecated, requires `'use client'`)
|
|
342
341
|
|
|
343
342
|
### Typed styling engines
|
|
344
343
|
These are optimized for generating CSS with stronger structure and tooling.
|
|
@@ -412,7 +411,7 @@ Tasty is most compelling when the problem is not just "how do we write styles,"
|
|
|
412
411
|
|
|
413
412
|
- [README](../README.md) — overview, quick start, and feature highlights
|
|
414
413
|
- [Style DSL](dsl.md) — state maps, tokens, units, extending semantics, keyframes, @property
|
|
415
|
-
- [
|
|
414
|
+
- [React API](react-api.md) — `tasty()` factory, component props, variants, sub-elements, style functions
|
|
416
415
|
- [Style Properties](styles.md) — complete reference for all enhanced style properties
|
|
417
416
|
- [Configuration](configuration.md) — tokens, recipes, custom units, style handlers, and TypeScript extensions
|
|
418
417
|
- [Zero Runtime (tastyStatic)](tasty-static.md) — build-time static styling with Babel plugin
|
|
@@ -58,6 +58,8 @@ These docs use `data-schema="dark"` in examples. If your app already standardize
|
|
|
58
58
|
| `counterStyle` | `Record<string, CounterStyleDescriptors>` | - | Global @counter-style definitions |
|
|
59
59
|
| `autoPropertyTypes` | `boolean` | `true` | Auto-infer and register `@property` types from values |
|
|
60
60
|
| `recipes` | `Record<string, RecipeStyles>` | - | Predefined style recipes (named style bundles) |
|
|
61
|
+
| `presets` | `Record<string, TypographyPreset>` | - | Typography presets — shorthand for `generateTypographyTokens()` |
|
|
62
|
+
| `globalStyles` | `Record<string, Styles>` | - | Global Tasty styles keyed by CSS selector |
|
|
61
63
|
| `colorSpace` | `'rgb' \| 'hsl' \| 'oklch'` | `'oklch'` | Color space for decomposed color token companion variables |
|
|
62
64
|
|
|
63
65
|
---
|
|
@@ -220,6 +222,72 @@ For how to apply, compose, and override recipes in components, see [Recipes](dsl
|
|
|
220
222
|
|
|
221
223
|
---
|
|
222
224
|
|
|
225
|
+
## Typography Presets
|
|
226
|
+
|
|
227
|
+
Typography presets are a shorthand for `generateTypographyTokens()`. Instead of calling the function manually and spreading the result into `tokens`, pass the presets directly:
|
|
228
|
+
|
|
229
|
+
```jsx
|
|
230
|
+
configure({
|
|
231
|
+
presets: {
|
|
232
|
+
h1: { fontSize: '32px', lineHeight: '1.2', fontWeight: '700' },
|
|
233
|
+
t2: { fontSize: '16px', lineHeight: '1.5', fontWeight: '400' },
|
|
234
|
+
tag: {
|
|
235
|
+
fontSize: '10px',
|
|
236
|
+
lineHeight: '1.4',
|
|
237
|
+
letterSpacing: '0.04em',
|
|
238
|
+
fontWeight: '600',
|
|
239
|
+
},
|
|
240
|
+
},
|
|
241
|
+
});
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
Each preset generates `$name-font-size`, `$name-line-height`, `$name-letter-spacing`, `$name-font-weight`, and optional `$name-bold-font-weight`, `$name-icon-size`, `$name-text-transform`, `$name-font-family`, `$name-font-style` tokens.
|
|
245
|
+
|
|
246
|
+
Preset values support state maps for responsive or theme-aware typography:
|
|
247
|
+
|
|
248
|
+
```jsx
|
|
249
|
+
configure({
|
|
250
|
+
presets: {
|
|
251
|
+
t2: {
|
|
252
|
+
fontSize: '16px',
|
|
253
|
+
lineHeight: '1.5',
|
|
254
|
+
fontWeight: { '': '400', '@dark': '300' },
|
|
255
|
+
},
|
|
256
|
+
},
|
|
257
|
+
});
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
The generated tokens are merged **under** explicit `tokens` — if both `presets` and `tokens` define `$t2-font-weight`, the `tokens` value wins. Plugins can also provide `presets`; plugin presets are merged first, then config presets, then explicit tokens on top.
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
## Global Styles
|
|
265
|
+
|
|
266
|
+
Apply Tasty styles to any selector via configuration, without needing `useGlobalStyles(selector, ...)` at runtime:
|
|
267
|
+
|
|
268
|
+
```jsx
|
|
269
|
+
configure({
|
|
270
|
+
globalStyles: {
|
|
271
|
+
body: {
|
|
272
|
+
fill: '#surface',
|
|
273
|
+
color: '#text',
|
|
274
|
+
preset: 't2',
|
|
275
|
+
margin: 0,
|
|
276
|
+
fontFamily: 'system-ui, sans-serif',
|
|
277
|
+
},
|
|
278
|
+
html: {
|
|
279
|
+
overflow: 'hidden',
|
|
280
|
+
},
|
|
281
|
+
},
|
|
282
|
+
});
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
Each key is a CSS selector, and each value is a Tasty `Styles` object supporting the full style syntax including style properties, tokens, state maps, and selector-based sub-styling (e.g. `$: '> .app'` for elements outside React scope). Global styles are injected alongside `:root` tokens when the first style is rendered.
|
|
286
|
+
|
|
287
|
+
Global styles are automatically emitted in all rendering modes: runtime (client), SSR, and zero-runtime (Babel plugin). Plugins can also provide `globalStyles`; they are merged per selector with config global styles (config wins on conflict).
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
223
291
|
## Auto Property Types
|
|
224
292
|
|
|
225
293
|
CSS cannot transition or animate custom properties unless their type is declared via [`@property`](https://developer.mozilla.org/en-US/docs/Web/CSS/@property). Tasty handles this automatically — when a custom property is assigned a concrete value (e.g. `'$scale': 1`, `'$gap': '10px'`, `'#accent': 'purple'`), the type is inferred and a `@property` rule is registered.
|
|
@@ -323,4 +391,4 @@ declare module '@tenphi/tasty' {
|
|
|
323
391
|
}
|
|
324
392
|
```
|
|
325
393
|
|
|
326
|
-
See [Style DSL](dsl.md) for state maps, tokens, units, and extending semantics, and [
|
|
394
|
+
See [Style DSL](dsl.md) for state maps, tokens, units, and extending semantics, and [React API](react-api.md) for `tasty()`, style functions, and component props.
|
package/docs/tasty/debug.md
CHANGED
|
@@ -12,6 +12,8 @@ In development mode (`isDevEnv()` returns `true`), `tastyDebug` is automatically
|
|
|
12
12
|
|
|
13
13
|
All methods **log to the console by default**. Pass `{ raw: true }` to suppress logging and only return data.
|
|
14
14
|
|
|
15
|
+
> **Note (2.0.0+):** Class names use a content-addressed base36 hash format (e.g. `t3a5f`) instead of the previous sequential `t{number}` format. Cross-environment hydration reads the rendered class list from `window.__TASTY__` (the legacy `window.__TASTY_SSR_CACHE__` global was removed in 2.0.0).
|
|
16
|
+
|
|
15
17
|
---
|
|
16
18
|
|
|
17
19
|
## Quick Start
|
|
@@ -69,8 +71,8 @@ Retrieves CSS text for a given target. Logs the result with rule count and size.
|
|
|
69
71
|
| `'unused'` | CSS with refCount = 0 (cached but not used) |
|
|
70
72
|
| `'global'` | Only global CSS (from `injectGlobal`) |
|
|
71
73
|
| `'page'` | All CSS on the page (including non-tasty) |
|
|
72
|
-
| `'
|
|
73
|
-
| `['
|
|
74
|
+
| `'t3a5f'` | CSS for a specific tasty class (class names are `t` + base36 hash) |
|
|
75
|
+
| `['t3a5f', 't9k2']` | CSS for multiple tasty classes |
|
|
74
76
|
| `'.my-button'` | CSS affecting a DOM element (by selector) |
|
|
75
77
|
| `element` | CSS affecting a DOM element (by reference) |
|
|
76
78
|
|
|
@@ -88,11 +90,11 @@ interface CssOptions extends DebugOptions {
|
|
|
88
90
|
tastyDebug.css('active');
|
|
89
91
|
|
|
90
92
|
// Specific class, silent
|
|
91
|
-
const css = tastyDebug.css('
|
|
93
|
+
const css = tastyDebug.css('t3a5f', { raw: true });
|
|
92
94
|
|
|
93
95
|
// Compare original vs browser-parsed CSS (dev mode only)
|
|
94
|
-
tastyDebug.css('
|
|
95
|
-
tastyDebug.css('
|
|
96
|
+
tastyDebug.css('t3a5f'); // live CSSOM
|
|
97
|
+
tastyDebug.css('t3a5f', { source: true }); // original output
|
|
96
98
|
|
|
97
99
|
// Shadow DOM
|
|
98
100
|
tastyDebug.css('all', { root: shadowRoot });
|
|
@@ -125,11 +127,11 @@ interface ChunkInfo {
|
|
|
125
127
|
```typescript
|
|
126
128
|
tastyDebug.inspect('.my-card');
|
|
127
129
|
// Logs: inspect div — 3 classes, 5 rules, 1.2KB
|
|
128
|
-
// Chunks:
|
|
130
|
+
// Chunks: t3a5f→appearance, t9k2→font, tb71→dimension
|
|
129
131
|
|
|
130
132
|
// Silent
|
|
131
133
|
const result = tastyDebug.inspect('.my-card', { raw: true });
|
|
132
|
-
console.log(result.classes); // ['
|
|
134
|
+
console.log(result.classes); // ['t3a5f', 't9k2', 'tb71']
|
|
133
135
|
console.log(result.rules); // 5
|
|
134
136
|
```
|
|
135
137
|
|
|
@@ -291,10 +293,10 @@ tastyDebug.summary({ root: shadowRoot });
|
|
|
291
293
|
tastyDebug.inspect('.my-button');
|
|
292
294
|
|
|
293
295
|
// 2. See CSS for a specific class
|
|
294
|
-
tastyDebug.css('
|
|
296
|
+
tastyDebug.css('t3a5f');
|
|
295
297
|
|
|
296
298
|
// 3. Compare original vs browser-parsed (dev mode)
|
|
297
|
-
tastyDebug.css('
|
|
299
|
+
tastyDebug.css('t3a5f', { source: true });
|
|
298
300
|
```
|
|
299
301
|
|
|
300
302
|
### Checking cache efficiency
|
|
@@ -84,25 +84,37 @@ configure({
|
|
|
84
84
|
|
|
85
85
|
### Typography presets
|
|
86
86
|
|
|
87
|
-
|
|
87
|
+
Pass typography presets directly to `configure()` — they are converted to tokens automatically:
|
|
88
88
|
|
|
89
89
|
```tsx
|
|
90
|
-
import { configure
|
|
90
|
+
import { configure } from '@tenphi/tasty';
|
|
91
91
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
92
|
+
configure({
|
|
93
|
+
presets: {
|
|
94
|
+
h1: { fontSize: '2rem', lineHeight: '1.2', letterSpacing: '-0.02em', fontWeight: 700 },
|
|
95
|
+
t2: { fontSize: '0.875rem', lineHeight: '1.5', letterSpacing: 'normal', fontWeight: 400 },
|
|
96
|
+
},
|
|
95
97
|
});
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Preset values support state maps for responsive or theme-aware typography:
|
|
96
101
|
|
|
102
|
+
```tsx
|
|
97
103
|
configure({
|
|
98
|
-
|
|
99
|
-
|
|
104
|
+
presets: {
|
|
105
|
+
t2: {
|
|
106
|
+
fontSize: '0.875rem',
|
|
107
|
+
lineHeight: '1.5',
|
|
108
|
+
fontWeight: { '': 400, '@dark': 300 },
|
|
109
|
+
},
|
|
100
110
|
},
|
|
101
111
|
});
|
|
102
112
|
```
|
|
103
113
|
|
|
104
114
|
Then use `preset: 'h1'` or `preset: 't2'` in any component's styles.
|
|
105
115
|
|
|
116
|
+
> You can also call `generateTypographyTokens()` manually and spread the result into `tokens` for more control — `presets` is just a shorthand.
|
|
117
|
+
|
|
106
118
|
### Registering brand fonts
|
|
107
119
|
|
|
108
120
|
Register your design system's custom fonts via `configure({ fontFace })` so every component can reference them:
|
|
@@ -334,7 +346,7 @@ Usage:
|
|
|
334
346
|
|
|
335
347
|
Sub-elements share the root component's state context by default. A `disabled` modifier on `<Card>` affects `Title`, `Content`, and `Footer` styles automatically — no prop drilling. For the full mental model, see [Methodology — Component architecture](methodology.md#component-architecture-root--sub-elements).
|
|
336
348
|
|
|
337
|
-
For sub-element syntax details (selector affix `$`, `@own()`, `elements` config), see [
|
|
349
|
+
For sub-element syntax details (selector affix `$`, `@own()`, `elements` config), see [React API — Sub-element Styling](react-api.md#sub-element-styling).
|
|
338
350
|
|
|
339
351
|
---
|
|
340
352
|
|
|
@@ -404,7 +416,7 @@ ds/
|
|
|
404
416
|
index.ts # Recipe definitions (imported by config.ts)
|
|
405
417
|
tokens/
|
|
406
418
|
colors.ts # Color token definitions
|
|
407
|
-
typography.ts # Typography presets
|
|
419
|
+
typography.ts # Typography presets for configure({ presets })
|
|
408
420
|
spacing.ts # Spacing token definitions
|
|
409
421
|
index.ts # Public API: re-exports components + configure
|
|
410
422
|
```
|
|
@@ -418,7 +430,7 @@ The key principle: `config.ts` imports tokens and recipes, calls `configure()`,
|
|
|
418
430
|
- **[Methodology](methodology.md)** — The recommended patterns for structuring Tasty components
|
|
419
431
|
- **[Getting Started](getting-started.md)** — Installation, first component, tooling setup
|
|
420
432
|
- **[Style DSL](dsl.md)** — State maps, tokens, units, extending semantics, keyframes, @property
|
|
421
|
-
- **[
|
|
433
|
+
- **[React API](react-api.md)** — `tasty()` factory, component props, variants, sub-elements, style functions
|
|
422
434
|
- **[Configuration](configuration.md)** — Full `configure()` API: tokens, recipes, custom units, style handlers
|
|
423
435
|
- **[Adoption Guide](adoption.md)** — Who should adopt Tasty, incremental phases, what changes for product engineers
|
|
424
436
|
- **[Style Properties](styles.md)** — Complete reference for all enhanced style properties
|
package/docs/tasty/dsl.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
This is the Tasty style language reference — the value syntax, state mappings, tokens, units, extending semantics, and special declarations that apply to both runtime `tasty()` and build-time `tastyStatic()`.
|
|
4
4
|
|
|
5
|
-
For the runtime React API (`tasty()`, hooks, component props), see [
|
|
5
|
+
For the runtime React API (`tasty()`, hooks, component props), see [React API](react-api.md). For all enhanced style properties, see [Style Properties](styles.md). For global configuration, see [Configuration](configuration.md).
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -25,7 +25,21 @@ fill: { '': '#white', hovered: '#gray.05', 'theme=danger': '#red' }
|
|
|
25
25
|
| Pseudo-class | `:hover` | `:hover` |
|
|
26
26
|
| Class selector | `.active` | `.active` |
|
|
27
27
|
| Attribute selector | `[aria-expanded="true"]` | `[aria-expanded="true"]` |
|
|
28
|
-
| Combined | `hovered & .active` | `[data-hovered].active` |
|
|
28
|
+
| Combined (AND) | `hovered & .active` | `[data-hovered].active` |
|
|
29
|
+
| Combined (OR) | `hovered \| focused` | `[data-hovered], [data-focused]` |
|
|
30
|
+
| Negated (NOT) | `!disabled` | `:not([data-disabled])` |
|
|
31
|
+
| Exclusive (XOR) | `hovered ^ focused` | `[data-hovered]:not([data-focused]), :not([data-hovered])[data-focused]` |
|
|
32
|
+
|
|
33
|
+
Operator precedence (highest to lowest): `!` (NOT) > `^` (XOR) > `|` (OR) > `&` (AND). Use parentheses to override: `hovered & (pressed ^ focused)`.
|
|
34
|
+
|
|
35
|
+
`^` (XOR) means "exactly one of" — `A ^ B` expands to `(A & !B) | (!A & B)`. This is useful for mutually exclusive states where exactly one should be active:
|
|
36
|
+
|
|
37
|
+
```jsx
|
|
38
|
+
fill: {
|
|
39
|
+
'': '#surface',
|
|
40
|
+
'hovered ^ focused': '#accent', // active when hovered OR focused, but not both
|
|
41
|
+
}
|
|
42
|
+
```
|
|
29
43
|
|
|
30
44
|
### Sub-element
|
|
31
45
|
|
|
@@ -93,7 +107,7 @@ mods={{ hovered: true, theme: 'danger' }}
|
|
|
93
107
|
// → data-hovered="" data-theme="danger"
|
|
94
108
|
```
|
|
95
109
|
|
|
96
|
-
Modifiers can also be exposed as top-level component props via `modProps` — see [Runtime — Mod Props](
|
|
110
|
+
Modifiers can also be exposed as top-level component props via `modProps` — see [Runtime — Mod Props](react-api.md#mod-props).
|
|
97
111
|
|
|
98
112
|
---
|
|
99
113
|
|
|
@@ -430,7 +444,7 @@ const FadeIn = tasty({
|
|
|
430
444
|
|
|
431
445
|
### `@parent(...)` — Parent Element States
|
|
432
446
|
|
|
433
|
-
Style based on ancestor element attributes. Uses `:is([selector] *)` / `:not([selector] *)` for symmetric, composable parent checks. Boolean logic (`&`, `|`,
|
|
447
|
+
Style based on ancestor element attributes. Uses `:is([selector] *)` / `:not([selector] *)` for symmetric, composable parent checks. Boolean logic (`&`, `|`, `!`, `^`) is supported inside `@parent()`.
|
|
434
448
|
|
|
435
449
|
```jsx
|
|
436
450
|
const Highlight = tasty({
|
|
@@ -508,12 +522,13 @@ const Card = tasty({
|
|
|
508
522
|
| `!:has(> Icon)` | `:not(:has(> [data-element="Icon"]))` | Negation (use `!`) |
|
|
509
523
|
| `!:is(Panel)` | `:not([data-element="Panel"])` | Negation (use `!:is`) |
|
|
510
524
|
|
|
511
|
-
Combine with other states using boolean logic:
|
|
525
|
+
Combine with other states using boolean logic (`&`, `|`, `!`, `^`):
|
|
512
526
|
|
|
513
527
|
```jsx
|
|
514
|
-
':has(> Icon) & hovered' // structural + data attribute
|
|
515
|
-
'@parent(hovered) & :has(> Icon)' // parent check + structural
|
|
528
|
+
':has(> Icon) & hovered' // AND: structural + data attribute
|
|
529
|
+
'@parent(hovered) & :has(> Icon)' // AND: parent check + structural
|
|
516
530
|
':has(> Icon) | :has(> Button)' // OR: either sub-element present
|
|
531
|
+
':has(> Icon) ^ :has(> Button)' // XOR: exactly one present
|
|
517
532
|
```
|
|
518
533
|
|
|
519
534
|
> **Nesting limit:** The state key parser supports up to 2 levels of nested parentheses inside `:is()`, `:has()`, `:not()`, and `:where()` — e.g. `:has(Input:not(:disabled))` works, but 3+ levels like `:has(:is(:not(:hover)))` will not be tokenized correctly. This covers virtually all practical use cases.
|
|
@@ -666,7 +681,7 @@ For a complete reference of all enhanced style properties — syntax, values, mo
|
|
|
666
681
|
|
|
667
682
|
## Learn more
|
|
668
683
|
|
|
669
|
-
- **[
|
|
684
|
+
- **[React API](react-api.md)** — `tasty()` factory, component props, variants, sub-elements, style functions
|
|
670
685
|
- **[Methodology](methodology.md)** — Recommended patterns: root + sub-elements, styleProps, tokens, wrapping
|
|
671
686
|
- **[Configuration](configuration.md)** — Tokens, recipes, custom units, style handlers, TypeScript extensions
|
|
672
687
|
- **[Style Properties](styles.md)** — Complete reference for all enhanced style properties
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Getting Started
|
|
2
2
|
|
|
3
|
-
This guide walks you from zero to a working Tasty component, then through the optional shared configuration and tooling layers. It is the right starting point when you already want to try Tasty in code. If you are still deciding whether Tasty fits your team, start with [Comparison](comparison.md) and [Adoption Guide](adoption.md) first. For a feature overview, see the [README](../README.md). For the full style language reference, see the [Style DSL](dsl.md). For the React API, see the [
|
|
3
|
+
This guide walks you from zero to a working Tasty component, then through the optional shared configuration and tooling layers. It is the right starting point when you already want to try Tasty in code. If you are still deciding whether Tasty fits your team, start with [Comparison](comparison.md) and [Adoption Guide](adoption.md) first. For a feature overview, see the [README](../README.md). For the full style language reference, see the [Style DSL](dsl.md). For the React API, see the [React API](react-api.md). For the rest of the docs by role or task, see the [Docs Hub](README.md).
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -179,19 +179,19 @@ export default [
|
|
|
179
179
|
|
|
180
180
|
## Choosing a rendering mode
|
|
181
181
|
|
|
182
|
-
|
|
182
|
+
`tasty()` is the default for all React apps. All `tasty()` components and style functions are hook-free and work as React Server Components without `'use client'`. In server-only contexts, they produce zero client JavaScript with the full feature set.
|
|
183
183
|
|
|
184
184
|
| Approach | Entry point | Best for | Trade-off |
|
|
185
185
|
|------|-------------|----------|-----------|
|
|
186
|
-
| **Runtime** | `tasty()` from `@tenphi/tasty` |
|
|
187
|
-
| **
|
|
186
|
+
| **Runtime (default)** | `tasty()` from `@tenphi/tasty` | All React apps — server-rendered by default, zero client JS until you need interactivity | Full feature set (styleProps, sub-elements, variants); CSS computed during rendering |
|
|
187
|
+
| **Runtime + SSR integration** | Add `@tenphi/tasty/ssr/*` | Apps with client-side hydration (Next.js client components, Astro islands) | Adds CSS batching, deduplication, FOUC prevention, and client cache hydration |
|
|
188
|
+
| **Zero-runtime** | `tastyStatic()` from `@tenphi/tasty/static` | Non-React frameworks or build-time extraction without React | Requires Babel plugin; no `styleProps` or runtime-only APIs |
|
|
188
189
|
|
|
189
|
-
Both share the same DSL, tokens, units, and state mappings.
|
|
190
|
+
Both `tasty()` and `tastyStatic()` share the same DSL, tokens, units, and state mappings.
|
|
190
191
|
|
|
191
|
-
- Runtime is the default and requires no extra setup beyond `@tenphi/tasty`.
|
|
192
|
-
-
|
|
193
|
-
- Zero-runtime requires the Babel plugin and additional peer dependencies. See [Zero Runtime (tastyStatic)](tasty-static.md).
|
|
194
|
-
- SSR works with existing `tasty()` components — wrap your app with a registry, middleware, or collector. See [Server-Side Rendering](ssr.md).
|
|
192
|
+
- **Runtime** is the default and requires no extra setup beyond `@tenphi/tasty`. In server-only contexts (Next.js RSC, Astro without `client:*` directives, SSG), `tasty()` produces static HTML + CSS with zero client JavaScript — the same end result as `tastyStatic()` but with the full feature set. For example, `tasty()` + `tastyIntegration()` in Astro without islands gives you the complete API with zero JS shipped.
|
|
193
|
+
- **SSR integration** is only needed when your app also has client-side rendering. Add `@tenphi/tasty/ssr/next`, `@tenphi/tasty/ssr/astro`, or the core SSR API to get CSS deduplication and cache hydration. See [Server-Side Rendering](ssr.md).
|
|
194
|
+
- **Zero-runtime** requires the Babel plugin and additional peer dependencies. Use it when you need build-time extraction without a React runtime. See [Zero Runtime (tastyStatic)](tasty-static.md).
|
|
195
195
|
|
|
196
196
|
---
|
|
197
197
|
|
|
@@ -200,7 +200,7 @@ Both share the same DSL, tokens, units, and state mappings.
|
|
|
200
200
|
- **[Docs Hub](README.md)** — Pick the next guide by role, styling approach, or task
|
|
201
201
|
- **[Methodology](methodology.md)** — The recommended patterns for structuring Tasty components: sub-elements, styleProps, tokens, extension
|
|
202
202
|
- **[Style DSL](dsl.md)** — State maps, tokens, units, extending semantics, keyframes, @property
|
|
203
|
-
- **[
|
|
203
|
+
- **[React API](react-api.md)** — `tasty()` factory, component props, variants, sub-elements, style functions
|
|
204
204
|
- **[Building a Design System](design-system.md)** — Practical guide to building a DS layer with Tasty: tokens, recipes, primitives, compound components
|
|
205
205
|
- **[Adoption Guide](adoption.md)** — Roll out Tasty inside an existing design system or platform team
|
|
206
206
|
- **[Comparison](comparison.md)** — Evaluate Tasty against other styling systems
|
package/docs/tasty/injector.md
CHANGED
|
@@ -115,11 +115,13 @@ dispose();
|
|
|
115
115
|
|
|
116
116
|
### `useRawCSS(css, options?)` or `useRawCSS(factory, deps, options?)`
|
|
117
117
|
|
|
118
|
-
|
|
118
|
+
Inject raw CSS without parsing. Hook-free — works in client components, SSR, and React Server Components.
|
|
119
119
|
|
|
120
120
|
Supports two overloads:
|
|
121
|
-
- **Static CSS**: `useRawCSS(cssString, options?)`
|
|
122
|
-
- **Factory function**: `useRawCSS(() => cssString, deps, options?)`
|
|
121
|
+
- **Static CSS**: `useRawCSS(cssString, options?)` — content-based deduplication
|
|
122
|
+
- **Factory function**: `useRawCSS(() => cssString, deps, options?)` — factory called on every invocation, dedup handled internally
|
|
123
|
+
|
|
124
|
+
Use the `id` option for update tracking — when the CSS changes for the same id, the previous injection is replaced:
|
|
123
125
|
|
|
124
126
|
```tsx
|
|
125
127
|
import { useRawCSS } from '@tenphi/tasty';
|
|
@@ -132,7 +134,7 @@ function GlobalReset() {
|
|
|
132
134
|
return null;
|
|
133
135
|
}
|
|
134
136
|
|
|
135
|
-
// Dynamic CSS with factory function
|
|
137
|
+
// Dynamic CSS with factory function and update tracking
|
|
136
138
|
function ThemeStyles({ theme }: { theme: 'dark' | 'light' }) {
|
|
137
139
|
useRawCSS(() => `
|
|
138
140
|
body {
|
|
@@ -140,7 +142,7 @@ function ThemeStyles({ theme }: { theme: 'dark' | 'light' }) {
|
|
|
140
142
|
background: ${theme === 'dark' ? '#000' : '#fff'};
|
|
141
143
|
color: ${theme === 'dark' ? '#fff' : '#000'};
|
|
142
144
|
}
|
|
143
|
-
`, [theme]);
|
|
145
|
+
`, [theme], { id: 'theme-body' });
|
|
144
146
|
|
|
145
147
|
return null;
|
|
146
148
|
}
|
|
@@ -207,13 +209,12 @@ import { configure } from '@tenphi/tasty';
|
|
|
207
209
|
configure({
|
|
208
210
|
devMode: true, // Enable development features (auto-detected)
|
|
209
211
|
maxRulesPerSheet: 8192, // Cap rules per stylesheet (default: 8192)
|
|
210
|
-
unusedStylesThreshold: 500, // Trigger cleanup threshold (CSS rules only)
|
|
211
|
-
bulkCleanupDelay: 5000, // Cleanup delay (ms) - ignored if idleCleanup is true
|
|
212
|
-
idleCleanup: true, // Use requestIdleCallback for cleanup
|
|
213
|
-
bulkCleanupBatchRatio: 0.5, // Clean up oldest 50% per batch
|
|
214
|
-
unusedStylesMinAgeMs: 10000, // Minimum age before cleanup (ms)
|
|
215
212
|
forceTextInjection: false, // Force textContent insertion (auto-detected for tests)
|
|
216
213
|
nonce: 'csp-nonce', // CSP nonce for security
|
|
214
|
+
gc: { // Garbage collection for unused styles
|
|
215
|
+
touchInterval: 1000, // Touch events between GC cycles (default: 1000)
|
|
216
|
+
capacity: 1000, // Max unused styles to retain (default: 1000)
|
|
217
|
+
},
|
|
217
218
|
states: { // Global predefined states for advanced state mapping
|
|
218
219
|
'@mobile': '@media(w < 768px)',
|
|
219
220
|
'@dark': '@root(schema=dark)',
|
|
@@ -229,7 +230,8 @@ configure({
|
|
|
229
230
|
- Most options have sensible defaults and auto-detection
|
|
230
231
|
- `configure()` is optional - the injector works with defaults
|
|
231
232
|
- **Configuration is locked after styles are generated** - calling `configure()` after first render will emit a warning and be ignored
|
|
232
|
-
- `
|
|
233
|
+
- `gc.touchInterval`: Number of touch events between GC cycles. Each style render counts as a touch. When the counter reaches this value, GC is scheduled via `requestIdleCallback`.
|
|
234
|
+
- `gc.capacity`: Maximum number of unused styles (refCount = 0, not in DOM) to retain. When exceeded, the oldest are evicted first. Actively referenced styles don't count against this limit.
|
|
233
235
|
|
|
234
236
|
---
|
|
235
237
|
|
|
@@ -291,21 +293,34 @@ comp3.dispose(); // refCount: 1 → 0, eligible for bulk cleanup
|
|
|
291
293
|
// Next inject() with same styles will increment refCount and reuse immediately
|
|
292
294
|
```
|
|
293
295
|
|
|
294
|
-
###
|
|
296
|
+
### Garbage Collection
|
|
295
297
|
|
|
296
298
|
```typescript
|
|
297
|
-
import { configure } from '@tenphi/tasty';
|
|
299
|
+
import { configure, gc } from '@tenphi/tasty';
|
|
298
300
|
|
|
299
|
-
// CSS rules: Not immediately deleted, marked for bulk cleanup (refCount = 0)
|
|
300
301
|
// Keyframes: Disposed immediately when refCount = 0 (safer for global scope)
|
|
302
|
+
// CSS rules: Tracked by touch count and cleaned up via gc()
|
|
301
303
|
|
|
302
304
|
configure({
|
|
303
|
-
|
|
304
|
-
|
|
305
|
+
gc: {
|
|
306
|
+
touchInterval: 1000, // Schedule GC every 1000 touches
|
|
307
|
+
capacity: 1000, // Max unused styles to retain
|
|
308
|
+
},
|
|
305
309
|
});
|
|
306
310
|
|
|
311
|
+
// Manual GC (synchronous, returns number of swept styles):
|
|
312
|
+
gc();
|
|
313
|
+
|
|
314
|
+
// Force-remove ALL unused styles (e.g. on route change or test teardown):
|
|
315
|
+
gc({ force: true });
|
|
316
|
+
|
|
317
|
+
// GC is also triggered automatically by touch count during rendering.
|
|
318
|
+
// Every `touchInterval` touches, GC is scheduled via requestIdleCallback.
|
|
319
|
+
|
|
307
320
|
// Benefits:
|
|
308
|
-
// -
|
|
321
|
+
// - Activity-proportional: busy apps trigger GC more often
|
|
322
|
+
// - DOM-safe: styles currently in the DOM are never evicted
|
|
323
|
+
// - Oldest-first: least recently used styles are evicted first
|
|
309
324
|
// - Keyframes: Immediate cleanup prevents global namespace pollution
|
|
310
325
|
// - Unused styles can be instantly reactivated (just increment refCount)
|
|
311
326
|
```
|
|
@@ -462,13 +477,14 @@ injectGlobal([
|
|
|
462
477
|
{ selector: '.container', declarations: 'max-width: 1200px;' }
|
|
463
478
|
]);
|
|
464
479
|
|
|
465
|
-
// ✅ Configure
|
|
480
|
+
// ✅ Configure GC for your app (BEFORE first render!)
|
|
466
481
|
import { configure } from '@tenphi/tasty';
|
|
467
482
|
|
|
468
483
|
configure({
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
484
|
+
gc: {
|
|
485
|
+
touchInterval: 1000, // Schedule GC every 1000 style touches
|
|
486
|
+
capacity: 1000, // Max unused styles to retain
|
|
487
|
+
},
|
|
472
488
|
});
|
|
473
489
|
```
|
|
474
490
|
|
|
@@ -480,8 +496,8 @@ configure({
|
|
|
480
496
|
// 1. Hash-based deduplication - same CSS = same className
|
|
481
497
|
// 2. Reference counting - styles stay alive while in use (refCount > 0)
|
|
482
498
|
// 3. Immediate keyframes cleanup - disposed instantly when refCount = 0
|
|
483
|
-
// 4.
|
|
484
|
-
// 5.
|
|
499
|
+
// 4. Touch-count GC - unused CSS rules are evicted oldest-first when over capacity
|
|
500
|
+
// 5. DOM safety guard - styles visible in the DOM are never evicted
|
|
485
501
|
|
|
486
502
|
// Manual cleanup is rarely needed but available:
|
|
487
503
|
cleanup(); // Force immediate cleanup of all unused CSS rules (refCount = 0)
|
|
@@ -511,7 +527,7 @@ const StyledButton = tasty({
|
|
|
511
527
|
// 4. dispose() is called when component unmounts
|
|
512
528
|
```
|
|
513
529
|
|
|
514
|
-
For most development, you'll use the [
|
|
530
|
+
For most development, you'll use the [React API](./react-api.md) rather than the injector directly. The injector provides the high-performance foundation that makes Tasty's declarative styling possible.
|
|
515
531
|
|
|
516
532
|
---
|
|
517
533
|
|
|
@@ -525,4 +541,4 @@ Direct injector usage is recommended for:
|
|
|
525
541
|
- **Performance-critical scenarios** where you need direct control
|
|
526
542
|
- **Testing utilities** that need to inject or extract CSS
|
|
527
543
|
|
|
528
|
-
For regular component styling, prefer the [`tasty()` API](./
|
|
544
|
+
For regular component styling, prefer the [`tasty()` API](./react-api.md) which provides a more developer-friendly interface.
|