@cube-dev/ui-kit 0.126.0 → 0.127.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/dist/CHANGELOG.md +43 -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} +1 -1
- 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
|
@@ -214,7 +214,7 @@ The array form is simpler but types all values as `ModValue`:
|
|
|
214
214
|
modProps: ['isLoading', 'isSelected'] as const,
|
|
215
215
|
```
|
|
216
216
|
|
|
217
|
-
For the full API reference, see [Runtime — Mod Props](
|
|
217
|
+
For the full API reference, see [Runtime — Mod Props](react-api.md#mod-props).
|
|
218
218
|
|
|
219
219
|
---
|
|
220
220
|
|
|
@@ -256,6 +256,54 @@ The `tokens` prop sets `style="--progress: 75%"` on the DOM element. The `$progr
|
|
|
256
256
|
|
|
257
257
|
Design tokens (via `configure({ tokens })`) are injected as CSS custom properties on `:root`. Replace tokens (via `configure({ replaceTokens })`) are resolved at parse time and baked into the generated CSS. The `tokens` prop on components is resolved at render time via inline CSS custom properties. Use design tokens for design-system constants, replace tokens for value aliases, and the `tokens` prop for truly dynamic per-instance values.
|
|
258
258
|
|
|
259
|
+
### tokenProps
|
|
260
|
+
|
|
261
|
+
`tokenProps` expose token keys as top-level component props — the token equivalent of `styleProps` and `modProps`. Use them when a component has a fixed set of known dynamic token values.
|
|
262
|
+
|
|
263
|
+
#### Array form
|
|
264
|
+
|
|
265
|
+
Prop names are plain camelCase identifiers. Names ending in `Color` map to `#` color tokens; everything else maps to `$` custom property tokens:
|
|
266
|
+
|
|
267
|
+
```tsx
|
|
268
|
+
const ProgressBar = tasty({
|
|
269
|
+
tokenProps: ['progress', 'accentColor'] as const,
|
|
270
|
+
styles: { width: '$progress', fill: '#accent' },
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
// Clean prop API — no tokens object needed
|
|
274
|
+
<ProgressBar progress="75%" accentColor="#purple" />
|
|
275
|
+
|
|
276
|
+
// Conversion:
|
|
277
|
+
// 'progress' → $progress → --progress
|
|
278
|
+
// 'accentColor' → #accent → --accent-color + --accent-color-oklch
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
#### Object form
|
|
282
|
+
|
|
283
|
+
Keys are prop names; values are `$`/`#`-prefixed token keys. No suffix convention needed — the prefix in the value is explicit:
|
|
284
|
+
|
|
285
|
+
```tsx
|
|
286
|
+
const Card = tasty({
|
|
287
|
+
tokenProps: {
|
|
288
|
+
size: '$card-size',
|
|
289
|
+
color: '#card-accent',
|
|
290
|
+
},
|
|
291
|
+
styles: { padding: '$card-size', fill: '#card-accent' },
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
<Card size="4x" color="#purple" />
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
#### Merge order
|
|
298
|
+
|
|
299
|
+
When all three token sources are present, values merge with increasing priority:
|
|
300
|
+
|
|
301
|
+
1. `tokens` option in `tasty({...})` — default tokens (lowest)
|
|
302
|
+
2. `tokens` prop on the component instance — runtime overrides
|
|
303
|
+
3. `tokenProps`-derived values — highest priority (explicit named props win)
|
|
304
|
+
|
|
305
|
+
The `tokens` prop remains available for ad-hoc or dynamic tokens alongside `tokenProps`.
|
|
306
|
+
|
|
259
307
|
---
|
|
260
308
|
|
|
261
309
|
## styles prop vs style prop
|
|
@@ -458,7 +506,8 @@ See [Configuration](configuration.md) for the full `configure()` API.
|
|
|
458
506
|
- **Use `elements` prop** to declare typed sub-components for compound components
|
|
459
507
|
- **Use `styleProps`** to define what product engineers can customize
|
|
460
508
|
- **Use `modProps`** to expose known modifier states as clean component props
|
|
461
|
-
- **Use `
|
|
509
|
+
- **Use `tokenProps`** to expose known token keys as clean component props
|
|
510
|
+
- **Use `tokens` prop** for ad-hoc or dynamic per-instance token values (progress, user color)
|
|
462
511
|
- **Use modifiers** (`mods` or `modProps`) for state-driven style changes instead of runtime `styles` prop changes
|
|
463
512
|
|
|
464
513
|
### Avoid
|
|
@@ -561,7 +610,7 @@ The `elements` prop gives you typed sub-components with automatic `data-element`
|
|
|
561
610
|
- **[Getting Started](getting-started.md)** — Installation, first component, tooling setup
|
|
562
611
|
- **[Building a Design System](design-system.md)** — Practical guide to building a DS layer with Tasty
|
|
563
612
|
- **[Style DSL](dsl.md)** — State maps, tokens, units, extending semantics, keyframes, @property
|
|
564
|
-
- **[
|
|
613
|
+
- **[React API](react-api.md)** — `tasty()` factory, component props, variants, sub-elements, style functions
|
|
565
614
|
- **[Configuration](configuration.md)** — Full `configure()` API: tokens, recipes, custom units, style handlers
|
|
566
615
|
- **[Style Properties](styles.md)** — Complete reference for all enhanced style properties
|
|
567
616
|
- **[Adoption Guide](adoption.md)** — Who should adopt Tasty, incremental phases, what changes for product engineers
|
|
@@ -55,7 +55,7 @@ Output: CSSRule[]
|
|
|
55
55
|
|
|
56
56
|
**Simplification** (`simplifyCondition` in `simplify.ts`) is not a separate numbered stage. It runs inside exclusive building, `expandExclusiveOrs` branch cleanup, combination ANDs, merge-by-value ORs, and materialization as needed.
|
|
57
57
|
|
|
58
|
-
**Post-pass:** After `processStyles` collects rules from every handler, `runPipeline` filters duplicates using a key of `selector|declarations|atRules|rootPrefix` so identical emitted rules appear once.
|
|
58
|
+
**Post-pass:** After `processStyles` collects rules from every handler, `runPipeline` filters duplicates using a key of `selector|declarations|atRules|rootPrefix|startingStyle` so identical emitted rules appear once.
|
|
59
59
|
|
|
60
60
|
---
|
|
61
61
|
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
#
|
|
1
|
+
# React API
|
|
2
2
|
|
|
3
|
-
The React-specific `tasty()` component factory, component props, and
|
|
3
|
+
The React-specific `tasty()` component factory, component props, and style functions. All Tasty style functions — `tasty()` components, `useStyles()`, `useGlobalStyles()`, `useRawCSS()`, `useKeyframes()`, `useProperty()`, `useFontFace()`, and `useCounterStyle()` — are hook-free and compatible with React Server Components. No `'use client'` directive needed. For the shared style language (state maps, tokens, units, extending semantics), see [Style DSL](dsl.md). For global configuration, see [Configuration](configuration.md). For the broader docs map, see the [Docs Hub](README.md).
|
|
4
|
+
|
|
5
|
+
> **Note:** This file was previously named `runtime.md`. All functionality documented here works in both server and client contexts — "runtime" referred to style computation during React rendering, not to client-side JavaScript.
|
|
4
6
|
|
|
5
7
|
---
|
|
6
8
|
|
|
@@ -154,6 +156,75 @@ For architecture guidance on when to use modifiers vs `styleProps`, see [Methodo
|
|
|
154
156
|
|
|
155
157
|
---
|
|
156
158
|
|
|
159
|
+
## Token Props
|
|
160
|
+
|
|
161
|
+
Use `tokenProps` to expose token keys as direct component props instead of requiring the `tokens` object:
|
|
162
|
+
|
|
163
|
+
```jsx
|
|
164
|
+
// Before: tokens object
|
|
165
|
+
<ProgressBar tokens={{ $progress: '75%', '#accent': '#purple' }} />
|
|
166
|
+
|
|
167
|
+
// After: token props
|
|
168
|
+
<ProgressBar progress="75%" accentColor="#purple" />
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### Array form
|
|
172
|
+
|
|
173
|
+
List prop names. Names ending in `Color` map to `#` color tokens; everything else maps to `$` custom property tokens:
|
|
174
|
+
|
|
175
|
+
```jsx
|
|
176
|
+
const ProgressBar = tasty({
|
|
177
|
+
tokenProps: ['progress', 'accentColor'] as const,
|
|
178
|
+
styles: { width: '$progress', fill: '#accent' },
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
<ProgressBar progress="75%" accentColor="#purple" />
|
|
182
|
+
// 'progress' → $progress → --progress
|
|
183
|
+
// 'accentColor' → #accent → --accent-color + --accent-color-oklch
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Object form
|
|
187
|
+
|
|
188
|
+
Map prop names to explicit `$`/`#`-prefixed token keys:
|
|
189
|
+
|
|
190
|
+
```tsx
|
|
191
|
+
const Card = tasty({
|
|
192
|
+
tokenProps: {
|
|
193
|
+
size: '$card-size',
|
|
194
|
+
color: '#card-accent',
|
|
195
|
+
},
|
|
196
|
+
styles: { padding: '$card-size', fill: '#card-accent' },
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
<Card size="4x" color="#purple" />
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### Merge with `tokens`
|
|
203
|
+
|
|
204
|
+
Token props and the `tokens` prop can be used together. Token props take precedence over `tokens`, which takes precedence over default `tokens` in `tasty({...})`:
|
|
205
|
+
|
|
206
|
+
```jsx
|
|
207
|
+
const Bar = tasty({
|
|
208
|
+
tokenProps: ['progress'] as const,
|
|
209
|
+
tokens: { $progress: '0%' }, // default
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
<Bar tokens={{ $progress: '50%' }} progress="90%" />
|
|
213
|
+
// progress="90%" wins (from token prop)
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### When to use `tokenProps` vs `tokens`
|
|
217
|
+
|
|
218
|
+
| Use case | Recommendation |
|
|
219
|
+
|---|---|
|
|
220
|
+
| Component has a fixed set of known token keys | `tokenProps` — cleaner API, better TypeScript autocomplete |
|
|
221
|
+
| Component needs arbitrary/dynamic token values | `tokens` — open-ended `Record<string, TokenValue>` |
|
|
222
|
+
| Both fixed and dynamic | Combine: `tokenProps` for known keys, `tokens` for ad-hoc |
|
|
223
|
+
|
|
224
|
+
For architecture guidance, see [Methodology — tokenProps](methodology.md#tokenprops).
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
157
228
|
## Variants
|
|
158
229
|
|
|
159
230
|
Define named style variations. Only CSS for variants actually used at runtime is injected:
|
|
@@ -264,11 +335,33 @@ For the mental model behind sub-elements — how they share root state context a
|
|
|
264
335
|
|
|
265
336
|
---
|
|
266
337
|
|
|
267
|
-
##
|
|
338
|
+
## computeStyles
|
|
339
|
+
|
|
340
|
+
Hook-free, synchronous style computation. Can be used anywhere — including React Server Components, plain functions, and non-React code:
|
|
341
|
+
|
|
342
|
+
```tsx
|
|
343
|
+
import { computeStyles } from '@tenphi/tasty';
|
|
344
|
+
|
|
345
|
+
const { className } = computeStyles({
|
|
346
|
+
padding: '2x',
|
|
347
|
+
fill: '#surface',
|
|
348
|
+
radius: '1r',
|
|
349
|
+
});
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
On the client, CSS is injected synchronously into the DOM (idempotent via the injector cache). On the server, CSS is collected via the SSR collector if one is available. This is the same function that `tasty()` components use internally.
|
|
353
|
+
|
|
354
|
+
---
|
|
355
|
+
|
|
356
|
+
## Style Functions
|
|
357
|
+
|
|
358
|
+
All style functions below are plain functions (not React hooks) and can be used in any environment: client components, SSR with a `ServerStyleCollector`, and React Server Components. They retain their `use` prefix for backward compatibility, but do not use any React hooks internally.
|
|
359
|
+
|
|
360
|
+
In server-only contexts (Next.js RSC without `'use client'`, Astro without `client:*` directives, SSG), components that use only Tasty style functions produce zero client JavaScript. Tasty never forces the `'use client'` boundary — that decision belongs to your component when it needs React interactivity (state, effects, event handlers).
|
|
268
361
|
|
|
269
362
|
### useStyles
|
|
270
363
|
|
|
271
|
-
Generate a className from a style object
|
|
364
|
+
Generate a className from a style object. Thin wrapper around `computeStyles()`:
|
|
272
365
|
|
|
273
366
|
```tsx
|
|
274
367
|
import { useStyles } from '@tenphi/tasty';
|
|
@@ -286,7 +379,7 @@ function MyComponent() {
|
|
|
286
379
|
|
|
287
380
|
### useGlobalStyles
|
|
288
381
|
|
|
289
|
-
Inject global styles for a CSS selector:
|
|
382
|
+
Inject global styles for a CSS selector. Accepts an optional third argument with an `id` for update tracking — when the styles change, the previous injection is disposed and the new one is injected:
|
|
290
383
|
|
|
291
384
|
```tsx
|
|
292
385
|
import { useGlobalStyles } from '@tenphi/tasty';
|
|
@@ -304,7 +397,7 @@ function ThemeStyles() {
|
|
|
304
397
|
|
|
305
398
|
### useRawCSS
|
|
306
399
|
|
|
307
|
-
Inject raw CSS strings:
|
|
400
|
+
Inject raw CSS strings. Accepts an optional `id` in the options for update tracking — when the CSS changes for the same id, the previous injection is replaced:
|
|
308
401
|
|
|
309
402
|
```tsx
|
|
310
403
|
import { useRawCSS } from '@tenphi/tasty';
|
|
@@ -338,7 +431,7 @@ function Spinner() {
|
|
|
338
431
|
}
|
|
339
432
|
```
|
|
340
433
|
|
|
341
|
-
`useKeyframes()` also supports a factory function
|
|
434
|
+
`useKeyframes()` also supports a factory function. The deps array is accepted for backward compatibility but the factory is called on every invocation — deduplication is handled internally by content hash:
|
|
342
435
|
|
|
343
436
|
```tsx
|
|
344
437
|
function Pulse({ scale }: { scale: number }) {
|
|
@@ -434,43 +527,22 @@ function EmojiList() {
|
|
|
434
527
|
}
|
|
435
528
|
```
|
|
436
529
|
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
```tsx
|
|
440
|
-
function DynamicList({ marker }: { marker: string }) {
|
|
441
|
-
const styleName = useCounterStyle(
|
|
442
|
-
() => ({
|
|
443
|
-
system: 'cyclic',
|
|
444
|
-
symbols: `"${marker}"`,
|
|
445
|
-
suffix: '" "',
|
|
446
|
-
}),
|
|
447
|
-
[marker],
|
|
448
|
-
);
|
|
449
|
-
|
|
450
|
-
return <ol style={{ listStyleType: styleName }}>...</ol>;
|
|
451
|
-
}
|
|
452
|
-
```
|
|
453
|
-
|
|
454
|
-
Signatures:
|
|
530
|
+
Signature:
|
|
455
531
|
|
|
456
532
|
```ts
|
|
457
533
|
function useCounterStyle(
|
|
458
534
|
descriptors: CounterStyleDescriptors,
|
|
459
535
|
options?: { name?: string; root?: Document | ShadowRoot },
|
|
460
536
|
): string;
|
|
461
|
-
|
|
462
|
-
function useCounterStyle(
|
|
463
|
-
factory: () => CounterStyleDescriptors,
|
|
464
|
-
deps: readonly unknown[],
|
|
465
|
-
options?: { name?: string; root?: Document | ShadowRoot },
|
|
466
|
-
): string;
|
|
467
537
|
```
|
|
468
538
|
|
|
469
539
|
### Troubleshooting
|
|
470
540
|
|
|
471
541
|
- Styles are not updating: make sure `configure()` runs before first render, and verify the generated class name or global rule with [Debug Utilities](debug.md).
|
|
472
|
-
- SSR output looks wrong: check the [SSR guide](ssr.md)
|
|
542
|
+
- SSR output looks wrong: check the [SSR guide](ssr.md) for collector setup. All style functions discover the SSR collector via `AsyncLocalStorage` or the global getter registered by `TastyRegistry`.
|
|
473
543
|
- Animation/custom property issues: prefer `useKeyframes()` and `useProperty()` over raw CSS when you want Tasty to manage injection and SSR collection for you.
|
|
544
|
+
- For dynamic styles that change over the component lifecycle, use the `id` option in `useGlobalStyles()` and `useRawCSS()` to enable update tracking.
|
|
545
|
+
- RSC inline mode: CSS accumulated by standalone style functions (`useGlobalStyles`, `useRawCSS`, etc.) is flushed into inline `<style>` tags by the next `tasty()` component in the render tree. If your page uses only standalone style functions without any `tasty()` component, the CSS will not be emitted. Ensure at least one `tasty()` component is present in each RSC render tree.
|
|
474
546
|
|
|
475
547
|
---
|
|
476
548
|
|
package/docs/tasty/ssr.md
CHANGED
|
@@ -18,16 +18,16 @@ The Astro integration (`@tenphi/tasty/ssr/astro`) has no additional dependencies
|
|
|
18
18
|
|
|
19
19
|
## How It Works
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
`tasty()` components are hook-free and use `computeStyles()` internally — a synchronous, framework-agnostic function. On the server, `computeStyles()` discovers a `ServerStyleCollector` via a registered getter (module-level for Next.js, `globalThis` for Astro/generic frameworks using `AsyncLocalStorage`) and collects CSS into it instead of trying to access the DOM. On the client, CSS is injected synchronously into the DOM during render; the injector's content-based cache makes this idempotent. The collector accumulates all styles, serializes them as `<style>` tags and a cache state script in the HTML. On the client, `hydrateTastyCache()` pre-populates the injector cache so that `computeStyles()` skips the rendering pipeline entirely during hydration.
|
|
22
22
|
|
|
23
23
|
```
|
|
24
24
|
Server Client
|
|
25
25
|
────── ──────
|
|
26
26
|
tasty() renders hydrateTastyCache() pre-populates cache
|
|
27
|
-
└─
|
|
27
|
+
└─ computeStyles() └─ cacheKey → className map ready
|
|
28
28
|
└─ collector.collect()
|
|
29
29
|
tasty() renders
|
|
30
|
-
After render: └─
|
|
30
|
+
After render: └─ computeStyles()
|
|
31
31
|
<style data-tasty-ssr> └─ cache hit → skip pipeline
|
|
32
32
|
<script data-tasty-cache> └─ no CSS re-injection
|
|
33
33
|
```
|
|
@@ -82,15 +82,21 @@ That's it. All `tasty()` components inside the tree automatically get SSR suppor
|
|
|
82
82
|
|
|
83
83
|
### How it works
|
|
84
84
|
|
|
85
|
-
- `TastyRegistry` is a `'use client'` component, but Next.js still server-renders it on initial page load.
|
|
86
|
-
- During SSR, `
|
|
87
|
-
- `TastyRegistry` uses `useServerInsertedHTML` to flush collected CSS into the HTML stream as `<style data-tasty-ssr>` tags. This is fully streaming-compatible
|
|
88
|
-
- A companion `<script>` tag
|
|
89
|
-
- When the module loads on the client, `hydrateTastyCache()` runs automatically and pre-populates the injector cache. During hydration, `
|
|
85
|
+
- `TastyRegistry` is a `'use client'` component, but Next.js still server-renders it on initial page load. The `'use client'` boundary is required solely to access `useServerInsertedHTML` — **not** because `tasty()` components need the client.
|
|
86
|
+
- During SSR, `TastyRegistry` creates a `ServerStyleCollector` and registers it via a module-level getter (not `globalThis` — this avoids leaking between Next.js's separate RSC and SSR module graphs). It also wraps children in a React context provider so that hooks inside the SSR tree can discover the collector. All style functions — `tasty()` components, `computeStyles()`, `useStyles()`, `useGlobalStyles()`, `useRawCSS()`, `useKeyframes()`, `useProperty()`, `useFontFace()`, and `useCounterStyle()` — discover the collector through the module-level getter or context provider.
|
|
87
|
+
- `TastyRegistry` uses `useServerInsertedHTML` to flush collected CSS into the HTML stream as `<style data-tasty-ssr>` tags. This is fully streaming-compatible — styles are injected alongside each Suspense boundary as it resolves.
|
|
88
|
+
- A companion inline `<script>` tag merges the `cacheKey → className` mapping into `window.__TASTY_SSR_CACHE__` for each flush. This streaming-friendly approach accumulates cache entries incrementally as Suspense boundaries resolve.
|
|
89
|
+
- When the `@tenphi/tasty/ssr/next` module loads on the client, `hydrateTastyCache()` runs automatically from `window.__TASTY_SSR_CACHE__` and pre-populates the injector cache. During hydration, `computeStyles()` hits the cache and skips the entire pipeline.
|
|
90
90
|
|
|
91
|
-
### Using
|
|
91
|
+
### Using Tasty in Server Components
|
|
92
92
|
|
|
93
|
-
|
|
93
|
+
All Tasty style functions are hook-free and do not require `'use client'`. They can be used directly in React Server Components:
|
|
94
|
+
|
|
95
|
+
- `tasty()` components — dynamic `styleProps` like `<Grid flow="column">` work normally
|
|
96
|
+
- `useStyles()`, `useGlobalStyles()`, `useRawCSS()` — inject styles by class or selector
|
|
97
|
+
- `useKeyframes()`, `useProperty()`, `useFontFace()`, `useCounterStyle()` — inject ancillary CSS rules
|
|
98
|
+
|
|
99
|
+
During SSR, all functions discover the collector via the same global getter registered by `TastyRegistry` — no React context or client boundary needed. In RSC mode without a collector (e.g., Astro zero-setup), CSS is accumulated in a per-request cache and flushed into an inline `<style>` tag by the next `tasty()` component in the tree. Ensure at least one `tasty()` component is present in every RSC render tree — standalone style functions alone cannot emit their CSS without a `tasty()` component to trigger the flush.
|
|
94
100
|
|
|
95
101
|
### Options
|
|
96
102
|
|
|
@@ -116,18 +122,17 @@ The nonce is automatically applied to all `<style>` and `<script>` tags injected
|
|
|
116
122
|
|
|
117
123
|
## Astro
|
|
118
124
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
Create or update your Astro middleware:
|
|
125
|
+
Tasty offers three levels of Astro integration. Choose the one that matches your needs:
|
|
122
126
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
127
|
+
| Setup | Config needed | Deduplication | Hooks work | Client JS |
|
|
128
|
+
|---|---|---|---|---|
|
|
129
|
+
| Zero setup | None | Per render tree | Yes (within each tree) | None |
|
|
130
|
+
| `tastyIntegration({ islands: false })` | One line | Cross-tree | Yes | None |
|
|
131
|
+
| `tastyIntegration()` | One line | Cross-tree | Yes | Auto-hydration |
|
|
126
132
|
|
|
127
|
-
|
|
128
|
-
```
|
|
133
|
+
### Zero setup (static pages)
|
|
129
134
|
|
|
130
|
-
|
|
135
|
+
`tasty()` components work in Astro with **no configuration**. Each component emits its own inline `<style>` tag during server rendering via the RSC inline path. Just import and use:
|
|
131
136
|
|
|
132
137
|
```tsx
|
|
133
138
|
// src/components/Card.tsx
|
|
@@ -153,56 +158,123 @@ import Card from '../components/Card.tsx';
|
|
|
153
158
|
|
|
154
159
|
<html>
|
|
155
160
|
<body>
|
|
156
|
-
<Card>
|
|
157
|
-
<Card client:load>Island card — styles hydrated on client</Card>
|
|
161
|
+
<Card>Styled with zero setup</Card>
|
|
158
162
|
</body>
|
|
159
163
|
</html>
|
|
160
164
|
```
|
|
161
165
|
|
|
162
|
-
|
|
166
|
+
**Trade-offs**: Styles are deduplicated within each React render tree, but Astro renders separate component trees independently, so shared CSS (tokens, `@property` rules) may appear more than once. All style functions (`useGlobalStyles`, `useRawCSS`, `useKeyframes`, `useProperty`, `useFontFace`, `useCounterStyle`) work in zero-setup mode — their CSS is accumulated in the RSC cache and flushed by the next `tasty()` component in the tree.
|
|
163
167
|
|
|
164
|
-
|
|
168
|
+
Best for quick prototyping, small static sites, or trying Tasty out in Astro.
|
|
165
169
|
|
|
166
|
-
|
|
167
|
-
- **Islands** (`client:load`, `client:visible`, etc.): Styles are collected during SSR the same way. On the client, importing `@tenphi/tasty/ssr/astro` auto-hydrates the cache from `<script data-tasty-cache>`. The island's `useStyles()` calls hit the cache during hydration.
|
|
170
|
+
### Astro Integration (recommended)
|
|
168
171
|
|
|
169
|
-
|
|
172
|
+
For production use, add `tastyIntegration()` to your Astro config. This registers middleware automatically and, by default, injects client-side hydration for islands.
|
|
170
173
|
|
|
171
|
-
|
|
174
|
+
#### With islands (default)
|
|
172
175
|
|
|
173
|
-
```
|
|
174
|
-
//
|
|
175
|
-
import '
|
|
176
|
-
import
|
|
176
|
+
```ts
|
|
177
|
+
// astro.config.mjs
|
|
178
|
+
import { defineConfig } from 'astro/config';
|
|
179
|
+
import react from '@astrojs/react';
|
|
180
|
+
import { tastyIntegration } from '@tenphi/tasty/ssr/astro';
|
|
177
181
|
|
|
178
|
-
|
|
179
|
-
|
|
182
|
+
export default defineConfig({
|
|
183
|
+
integrations: [react(), tastyIntegration()],
|
|
180
184
|
});
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
This gives you:
|
|
188
|
+
|
|
189
|
+
- A `ServerStyleCollector` per request via `AsyncLocalStorage`, deduplicating CSS across all React trees on the page
|
|
190
|
+
- A single consolidated `<style data-tasty-ssr>` injected into `</head>`
|
|
191
|
+
- A `<script data-tasty-cache>` tag with the `cacheKey -> className` map for client hydration
|
|
192
|
+
- Auto-injected client hydration script (via `injectScript('before-hydration')`) so islands skip the style pipeline during hydration -- no need to import anything manually in each island component
|
|
193
|
+
|
|
194
|
+
All style functions (`useGlobalStyles`, `useRawCSS`, `useKeyframes`, `useProperty`, `useFontFace`, `useCounterStyle`) work on the server.
|
|
195
|
+
|
|
196
|
+
```astro
|
|
197
|
+
---
|
|
198
|
+
// src/pages/index.astro
|
|
199
|
+
import Card from '../components/Card.tsx';
|
|
200
|
+
import Interactive from '../components/Interactive.tsx';
|
|
201
|
+
---
|
|
181
202
|
|
|
182
|
-
|
|
203
|
+
<html>
|
|
204
|
+
<body>
|
|
205
|
+
<Card>Static -- styles in <style data-tasty-ssr></Card>
|
|
206
|
+
<Interactive client:load>Island -- cache hydrated automatically</Interactive>
|
|
207
|
+
</body>
|
|
208
|
+
</html>
|
|
183
209
|
```
|
|
184
210
|
|
|
185
|
-
|
|
211
|
+
#### Static only (no client JS)
|
|
212
|
+
|
|
213
|
+
If your site has no `client:*` islands, skip the hydration script and cache transfer:
|
|
214
|
+
|
|
215
|
+
```ts
|
|
216
|
+
// astro.config.mjs
|
|
217
|
+
import { defineConfig } from 'astro/config';
|
|
218
|
+
import react from '@astrojs/react';
|
|
219
|
+
import { tastyIntegration } from '@tenphi/tasty/ssr/astro';
|
|
220
|
+
|
|
221
|
+
export default defineConfig({
|
|
222
|
+
integrations: [react(), tastyIntegration({ islands: false })],
|
|
223
|
+
});
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
This gives the same middleware deduplication and hook support, but ships zero client-side JavaScript. No `<script data-tasty-cache>` is emitted.
|
|
227
|
+
|
|
228
|
+
### Manual middleware (advanced)
|
|
229
|
+
|
|
230
|
+
If you need to compose Tasty's middleware with other middleware (e.g., via `sequence()`), use `tastyMiddleware()` directly:
|
|
231
|
+
|
|
232
|
+
```ts
|
|
233
|
+
// src/middleware.ts
|
|
234
|
+
import { sequence } from 'astro:middleware';
|
|
235
|
+
import { tastyMiddleware } from '@tenphi/tasty/ssr/astro';
|
|
236
|
+
|
|
237
|
+
export const onRequest = sequence(
|
|
238
|
+
tastyMiddleware(),
|
|
239
|
+
myOtherMiddleware,
|
|
240
|
+
);
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
For island hydration with manual middleware, import the client module in a shared entry point or in each island:
|
|
244
|
+
|
|
245
|
+
```tsx
|
|
246
|
+
import '@tenphi/tasty/ssr/astro-client';
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
#### Options
|
|
186
250
|
|
|
187
251
|
```ts
|
|
188
|
-
// Skip cache state transfer
|
|
252
|
+
// Skip cache state transfer (static-only, no islands)
|
|
189
253
|
export const onRequest = tastyMiddleware({ transferCache: false });
|
|
190
254
|
```
|
|
191
255
|
|
|
256
|
+
### How it works
|
|
257
|
+
|
|
258
|
+
Astro's `@astrojs/react` renderer calls `renderToString()` for each React component without wrapping the tree in a provider. The middleware creates a `ServerStyleCollector` and binds it via `AsyncLocalStorage`. All `computeStyles()` calls within the request discover this collector automatically.
|
|
259
|
+
|
|
260
|
+
- **Static components** (no `client:*`): Styles are collected during `renderToString` and injected into `</head>` as a single `<style>` tag. No JavaScript is shipped.
|
|
261
|
+
- **Islands** (`client:load`, `client:visible`, etc.): Styles are collected during SSR the same way. On the client, the hydration script (auto-injected by `tastyIntegration()` or manually via `@tenphi/tasty/ssr/astro-client`) reads the cache state from `<script data-tasty-cache>` and pre-populates the injector. The island's `computeStyles()` calls hit the cache during hydration.
|
|
262
|
+
- The middleware reads the full response body, then injects the collected CSS into `</head>` before sending the final HTML.
|
|
263
|
+
|
|
192
264
|
### CSP nonce
|
|
193
265
|
|
|
194
|
-
|
|
266
|
+
Call `configure({ nonce: '...' })` before any rendering happens. The middleware reads the nonce and applies it to injected `<style>` and `<script>` tags.
|
|
195
267
|
|
|
196
268
|
---
|
|
197
269
|
|
|
198
270
|
## Generic Framework Integration
|
|
199
271
|
|
|
200
|
-
Any React-based framework can integrate using the
|
|
272
|
+
Any React-based framework can integrate using `runWithCollector`, which binds a `ServerStyleCollector` to the current async context via `AsyncLocalStorage`. All style function calls within the render automatically discover the collector.
|
|
201
273
|
|
|
202
274
|
```tsx
|
|
203
275
|
import {
|
|
204
276
|
ServerStyleCollector,
|
|
205
|
-
|
|
277
|
+
runWithCollector,
|
|
206
278
|
hydrateTastyCache,
|
|
207
279
|
} from '@tenphi/tasty/ssr';
|
|
208
280
|
import { renderToString } from 'react-dom/server';
|
|
@@ -212,10 +284,8 @@ import { hydrateRoot } from 'react-dom/client';
|
|
|
212
284
|
|
|
213
285
|
const collector = new ServerStyleCollector();
|
|
214
286
|
|
|
215
|
-
const html =
|
|
216
|
-
<
|
|
217
|
-
<App />
|
|
218
|
-
</TastySSRContext.Provider>
|
|
287
|
+
const html = await runWithCollector(collector, () =>
|
|
288
|
+
renderToString(<App />)
|
|
219
289
|
);
|
|
220
290
|
|
|
221
291
|
const css = collector.getCSS();
|
|
@@ -251,11 +321,8 @@ For streaming with `renderToPipeableStream`, use `flushCSS()` instead of `getCSS
|
|
|
251
321
|
```tsx
|
|
252
322
|
const collector = new ServerStyleCollector();
|
|
253
323
|
|
|
254
|
-
const stream =
|
|
255
|
-
<
|
|
256
|
-
<App />
|
|
257
|
-
</TastySSRContext.Provider>,
|
|
258
|
-
{
|
|
324
|
+
const stream = await runWithCollector(collector, () =>
|
|
325
|
+
renderToPipeableStream(<App />, {
|
|
259
326
|
onShellReady() {
|
|
260
327
|
// Flush styles collected so far
|
|
261
328
|
const css = collector.flushCSS();
|
|
@@ -270,29 +337,8 @@ const stream = renderToPipeableStream(
|
|
|
270
337
|
const state = collector.getCacheState();
|
|
271
338
|
res.write(`<script data-tasty-cache type="application/json">${JSON.stringify(state)}</script>`);
|
|
272
339
|
},
|
|
273
|
-
}
|
|
274
|
-
);
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
### AsyncLocalStorage (no React context)
|
|
278
|
-
|
|
279
|
-
If your framework doesn't support wrapping the React tree with a provider, use `runWithCollector`:
|
|
280
|
-
|
|
281
|
-
```tsx
|
|
282
|
-
import {
|
|
283
|
-
ServerStyleCollector,
|
|
284
|
-
runWithCollector,
|
|
285
|
-
hydrateTastyCache,
|
|
286
|
-
} from '@tenphi/tasty/ssr';
|
|
287
|
-
|
|
288
|
-
const collector = new ServerStyleCollector();
|
|
289
|
-
|
|
290
|
-
const html = await runWithCollector(collector, () =>
|
|
291
|
-
renderToString(<App />)
|
|
340
|
+
})
|
|
292
341
|
);
|
|
293
|
-
|
|
294
|
-
const css = collector.getCSS();
|
|
295
|
-
// ... inject into HTML as above
|
|
296
342
|
```
|
|
297
343
|
|
|
298
344
|
---
|
|
@@ -303,9 +349,10 @@ const css = collector.getCSS();
|
|
|
303
349
|
|
|
304
350
|
| Import path | Description |
|
|
305
351
|
|---|---|
|
|
306
|
-
| `@tenphi/tasty/ssr` | Core SSR API: `ServerStyleCollector`, `
|
|
352
|
+
| `@tenphi/tasty/ssr` | Core SSR API: `ServerStyleCollector`, `runWithCollector`, `hydrateTastyCache` |
|
|
307
353
|
| `@tenphi/tasty/ssr/next` | Next.js App Router: `TastyRegistry` component |
|
|
308
|
-
| `@tenphi/tasty/ssr/astro` | Astro: `
|
|
354
|
+
| `@tenphi/tasty/ssr/astro` | Astro: `tastyIntegration`, `tastyMiddleware` |
|
|
355
|
+
| `@tenphi/tasty/ssr/astro-client` | Astro: client-side cache hydration (auto-injected by integration, or import manually) |
|
|
309
356
|
|
|
310
357
|
### `ServerStyleCollector`
|
|
311
358
|
|
|
@@ -316,17 +363,18 @@ Server-safe style collector. One instance per request.
|
|
|
316
363
|
| `allocateClassName(cacheKey)` | Allocate a sequential class name (`t0`, `t1`, ...) for a cache key. Returns `{ className, isNewAllocation }`. |
|
|
317
364
|
| `collectChunk(cacheKey, className, rules)` | Record CSS rules for a chunk. Deduplicated by `cacheKey`. |
|
|
318
365
|
| `collectKeyframes(name, css)` | Record a `@keyframes` rule. Deduplicated by name. |
|
|
366
|
+
| `allocateKeyframeName(providedName?)` | Allocate a keyframe name. Returns `providedName` if given, otherwise generates one (`k0`, `k1`, ...). |
|
|
319
367
|
| `collectProperty(name, css)` | Record a `@property` rule. Deduplicated by name. |
|
|
320
368
|
| `collectFontFace(key, css)` | Record a `@font-face` rule. Deduplicated by content hash. |
|
|
321
369
|
| `collectCounterStyle(name, css)` | Record a `@counter-style` rule. Deduplicated by name. |
|
|
370
|
+
| `allocateCounterStyleName(providedName?)` | Allocate a counter-style name. Returns `providedName` if given, otherwise generates one (`cs0`, `cs1`, ...). |
|
|
371
|
+
| `collectGlobalStyles(key, css)` | Record global styles (from `useGlobalStyles`). Deduplicated by key. |
|
|
372
|
+
| `collectRawCSS(key, css)` | Record raw CSS text (from `useRawCSS`). Deduplicated by key. |
|
|
373
|
+
| `collectInternals()` | Collect internal `@property` rules, `:root` token defaults, `@font-face`, and `@counter-style` rules from the global config. Called automatically on first chunk collection; idempotent. |
|
|
322
374
|
| `getCSS()` | Get all collected CSS as a single string. For non-streaming SSR. |
|
|
323
375
|
| `flushCSS()` | Get only CSS collected since the last flush. For streaming SSR. |
|
|
324
376
|
| `getCacheState()` | Serialize `{ entries: Record<cacheKey, className>, classCounter }` for client hydration. |
|
|
325
377
|
|
|
326
|
-
### `TastySSRContext`
|
|
327
|
-
|
|
328
|
-
React context (`createContext<ServerStyleCollector | null>(null)`). Used by `useStyles()` to find the collector during SSR.
|
|
329
|
-
|
|
330
378
|
### `TastyRegistry`
|
|
331
379
|
|
|
332
380
|
Next.js App Router component. Props:
|
|
@@ -336,9 +384,17 @@ Next.js App Router component. Props:
|
|
|
336
384
|
| `children` | `ReactNode` | required | Application tree |
|
|
337
385
|
| `transferCache` | `boolean` | `true` | Embed cache state script for zero-cost hydration |
|
|
338
386
|
|
|
387
|
+
### `tastyIntegration(options?)`
|
|
388
|
+
|
|
389
|
+
Astro integration factory. Registers middleware and optionally injects client hydration.
|
|
390
|
+
|
|
391
|
+
| Option | Type | Default | Description |
|
|
392
|
+
|---|---|---|---|
|
|
393
|
+
| `islands` | `boolean` | `true` | When `true`, injects client hydration script and enables `transferCache`. When `false`, no client JS is shipped. |
|
|
394
|
+
|
|
339
395
|
### `tastyMiddleware(options?)`
|
|
340
396
|
|
|
341
|
-
Astro middleware factory.
|
|
397
|
+
Astro middleware factory. Use for manual middleware composition.
|
|
342
398
|
|
|
343
399
|
| Option | Type | Default | Description |
|
|
344
400
|
|---|---|---|---|
|
|
@@ -350,7 +406,7 @@ Pre-populate the client injector cache. When called without arguments, reads fro
|
|
|
350
406
|
|
|
351
407
|
### `runWithCollector(collector, fn)`
|
|
352
408
|
|
|
353
|
-
Run a function with a `ServerStyleCollector` bound to the current async context via `AsyncLocalStorage`. All
|
|
409
|
+
Run a function with a `ServerStyleCollector` bound to the current async context via `AsyncLocalStorage`. All style function calls within `fn` (and async continuations) — including `computeStyles()`, `useStyles()`, `useGlobalStyles()`, `useRawCSS()`, `useKeyframes()`, `useProperty()`, `useFontFace()`, and `useCounterStyle()` — will find this collector.
|
|
354
410
|
|
|
355
411
|
---
|
|
356
412
|
|
|
@@ -358,15 +414,17 @@ Run a function with a `ServerStyleCollector` bound to the current async context
|
|
|
358
414
|
|
|
359
415
|
### Styles flash on page load (FOUC)
|
|
360
416
|
|
|
361
|
-
The `TastyRegistry` or `
|
|
417
|
+
The `TastyRegistry` or `tastyIntegration` is missing. Ensure your layout wraps the app with `TastyRegistry` (Next.js) or that `tastyIntegration()` is in your Astro config (or `tastyMiddleware()` is registered manually).
|
|
362
418
|
|
|
363
419
|
### Hydration mismatch warnings
|
|
364
420
|
|
|
365
|
-
Class names are deterministic for the same render order. If you see mismatches, ensure `hydrateTastyCache()` runs before React hydration. For Next.js, this is automatic. For Astro, import `@tenphi/tasty/ssr/astro` in your island components. For custom setups, call `hydrateTastyCache()` before `hydrateRoot()`.
|
|
421
|
+
Class names are deterministic for the same render order. If you see mismatches, ensure `hydrateTastyCache()` runs before React hydration. For Next.js, this is automatic. For Astro with `tastyIntegration()`, this is also automatic. For manual Astro middleware setups, import `@tenphi/tasty/ssr/astro-client` in your island components. For custom setups, call `hydrateTastyCache()` before `hydrateRoot()`.
|
|
366
422
|
|
|
367
423
|
### Styles duplicated after hydration
|
|
368
424
|
|
|
369
|
-
|
|
425
|
+
**Global CSS** (`:root` tokens, `@property`, `globalStyles`, `@font-face`, `@counter-style`) configured via `configure()` is automatically deduplicated. When Tasty detects `<style data-tasty-ssr>` in the document, it skips client-side injection of globals that were already rendered by the SSR collector. This means `configure()` can be called with the full config on both server and client — no `typeof window === 'undefined'` guard is needed.
|
|
426
|
+
|
|
427
|
+
**Component CSS**: SSR `<style data-tasty-ssr>` tags remain in the DOM. The client injector creates separate `<style>` elements for any new styles. SSR styles are never modified or removed by the client. If this is a concern for very large apps, call `cleanupSSRStyles()` after hydration:
|
|
370
428
|
|
|
371
429
|
```tsx
|
|
372
430
|
import { hydrateTastyCache } from '@tenphi/tasty/ssr';
|