@mortenbrudvik/waveui 0.4.0 → 0.7.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/README.md +1221 -173
- package/dist/_virtual/_rolldown/runtime.cjs +1 -0
- package/dist/components/button/Button.cjs +2 -0
- package/dist/components/button/Button.cjs.map +1 -0
- package/dist/components/button/Button.mjs +50 -0
- package/dist/components/button/Button.mjs.map +1 -0
- package/dist/components/button/Button.semantics.cjs +2 -0
- package/dist/components/button/Button.semantics.cjs.map +1 -0
- package/dist/components/button/Button.semantics.mjs +61 -0
- package/dist/components/button/Button.semantics.mjs.map +1 -0
- package/dist/components/button/Button.slots.cjs +2 -0
- package/dist/components/button/Button.slots.cjs.map +1 -0
- package/dist/components/button/Button.slots.mjs +47 -0
- package/dist/components/button/Button.slots.mjs.map +1 -0
- package/dist/components/button/CompoundButton.cjs +2 -0
- package/dist/components/button/CompoundButton.cjs.map +1 -0
- package/dist/components/button/CompoundButton.mjs +53 -0
- package/dist/components/button/CompoundButton.mjs.map +1 -0
- package/dist/components/button/Link.cjs +2 -0
- package/dist/components/button/Link.cjs.map +1 -0
- package/dist/components/button/Link.mjs +37 -0
- package/dist/components/button/Link.mjs.map +1 -0
- package/dist/components/button/MenuButton.cjs +2 -0
- package/dist/components/button/MenuButton.cjs.map +1 -0
- package/dist/components/button/MenuButton.mjs +45 -0
- package/dist/components/button/MenuButton.mjs.map +1 -0
- package/dist/components/button/SplitButton.cjs +2 -0
- package/dist/components/button/SplitButton.cjs.map +1 -0
- package/dist/components/button/SplitButton.mjs +66 -0
- package/dist/components/button/SplitButton.mjs.map +1 -0
- package/dist/components/button/ToggleButton.cjs +2 -0
- package/dist/components/button/ToggleButton.cjs.map +1 -0
- package/dist/components/button/ToggleButton.mjs +65 -0
- package/dist/components/button/ToggleButton.mjs.map +1 -0
- package/dist/components/button/Toolbar.cjs +2 -0
- package/dist/components/button/Toolbar.cjs.map +1 -0
- package/dist/components/button/Toolbar.context.cjs +2 -0
- package/dist/components/button/Toolbar.context.cjs.map +1 -0
- package/dist/components/button/Toolbar.context.mjs +31 -0
- package/dist/components/button/Toolbar.context.mjs.map +1 -0
- package/dist/components/button/Toolbar.mjs +63 -0
- package/dist/components/button/Toolbar.mjs.map +1 -0
- package/dist/components/button/Toolbar.parts.cjs +2 -0
- package/dist/components/button/Toolbar.parts.cjs.map +1 -0
- package/dist/components/button/Toolbar.parts.mjs +131 -0
- package/dist/components/button/Toolbar.parts.mjs.map +1 -0
- package/dist/components/button/buttonStyles.cjs +2 -0
- package/dist/components/button/buttonStyles.cjs.map +1 -0
- package/dist/components/button/buttonStyles.mjs +39 -0
- package/dist/components/button/buttonStyles.mjs.map +1 -0
- package/dist/components/data-display/Avatar.cjs +2 -0
- package/dist/components/data-display/Avatar.cjs.map +1 -0
- package/dist/components/data-display/Avatar.mjs +157 -0
- package/dist/components/data-display/Avatar.mjs.map +1 -0
- package/dist/components/data-display/AvatarGroup.cjs +2 -0
- package/dist/components/data-display/AvatarGroup.cjs.map +1 -0
- package/dist/components/data-display/AvatarGroup.mjs +134 -0
- package/dist/components/data-display/AvatarGroup.mjs.map +1 -0
- package/dist/components/data-display/Badge.cjs +2 -0
- package/dist/components/data-display/Badge.cjs.map +1 -0
- package/dist/components/data-display/Badge.colors.cjs +2 -0
- package/dist/components/data-display/Badge.colors.cjs.map +1 -0
- package/dist/components/data-display/Badge.colors.mjs +58 -0
- package/dist/components/data-display/Badge.colors.mjs.map +1 -0
- package/dist/components/data-display/Badge.mjs +32 -0
- package/dist/components/data-display/Badge.mjs.map +1 -0
- package/dist/components/data-display/CounterBadge.cjs +2 -0
- package/dist/components/data-display/CounterBadge.cjs.map +1 -0
- package/dist/components/data-display/CounterBadge.mjs +28 -0
- package/dist/components/data-display/CounterBadge.mjs.map +1 -0
- package/dist/components/data-display/Divider.cjs +2 -0
- package/dist/components/data-display/Divider.cjs.map +1 -0
- package/dist/components/data-display/Divider.mjs +52 -0
- package/dist/components/data-display/Divider.mjs.map +1 -0
- package/dist/components/data-display/Image.cjs +2 -0
- package/dist/components/data-display/Image.cjs.map +1 -0
- package/dist/components/data-display/Image.mjs +32 -0
- package/dist/components/data-display/Image.mjs.map +1 -0
- package/dist/components/data-display/InfoLabel.cjs +2 -0
- package/dist/components/data-display/InfoLabel.cjs.map +1 -0
- package/dist/components/data-display/InfoLabel.mjs +104 -0
- package/dist/components/data-display/InfoLabel.mjs.map +1 -0
- package/dist/components/data-display/List.cjs +2 -0
- package/dist/components/data-display/List.cjs.map +1 -0
- package/dist/components/data-display/List.mjs +381 -0
- package/dist/components/data-display/List.mjs.map +1 -0
- package/dist/components/data-display/List.registry.cjs +2 -0
- package/dist/components/data-display/List.registry.cjs.map +1 -0
- package/dist/components/data-display/List.registry.mjs +101 -0
- package/dist/components/data-display/List.registry.mjs.map +1 -0
- package/dist/components/data-display/Persona.cjs +2 -0
- package/dist/components/data-display/Persona.cjs.map +1 -0
- package/dist/components/data-display/Persona.mjs +48 -0
- package/dist/components/data-display/Persona.mjs.map +1 -0
- package/dist/components/data-display/PresenceBadge.cjs +2 -0
- package/dist/components/data-display/PresenceBadge.cjs.map +1 -0
- package/dist/components/data-display/PresenceBadge.mjs +71 -0
- package/dist/components/data-display/PresenceBadge.mjs.map +1 -0
- package/dist/components/data-display/Tag.cjs +2 -0
- package/dist/components/data-display/Tag.cjs.map +1 -0
- package/dist/components/data-display/Tag.mjs +147 -0
- package/dist/components/data-display/Tag.mjs.map +1 -0
- package/dist/components/feedback/MessageBar.cjs +2 -0
- package/dist/components/feedback/MessageBar.cjs.map +1 -0
- package/dist/components/feedback/MessageBar.mjs +144 -0
- package/dist/components/feedback/MessageBar.mjs.map +1 -0
- package/dist/components/feedback/MessageBar.status.cjs +2 -0
- package/dist/components/feedback/MessageBar.status.cjs.map +1 -0
- package/dist/components/feedback/MessageBar.status.mjs +45 -0
- package/dist/components/feedback/MessageBar.status.mjs.map +1 -0
- package/dist/components/feedback/ProgressBar.cjs +2 -0
- package/dist/components/feedback/ProgressBar.cjs.map +1 -0
- package/dist/components/feedback/ProgressBar.mjs +72 -0
- package/dist/components/feedback/ProgressBar.mjs.map +1 -0
- package/dist/components/feedback/Skeleton.cjs +2 -0
- package/dist/components/feedback/Skeleton.cjs.map +1 -0
- package/dist/components/feedback/Skeleton.mjs +47 -0
- package/dist/components/feedback/Skeleton.mjs.map +1 -0
- package/dist/components/feedback/Spinner.cjs +2 -0
- package/dist/components/feedback/Spinner.cjs.map +1 -0
- package/dist/components/feedback/Spinner.mjs +60 -0
- package/dist/components/feedback/Spinner.mjs.map +1 -0
- package/dist/components/feedback/Toast.cjs +2 -0
- package/dist/components/feedback/Toast.cjs.map +1 -0
- package/dist/components/feedback/Toast.mjs +347 -0
- package/dist/components/feedback/Toast.mjs.map +1 -0
- package/dist/components/input/Checkbox.cjs +2 -0
- package/dist/components/input/Checkbox.cjs.map +1 -0
- package/dist/components/input/Checkbox.mjs +96 -0
- package/dist/components/input/Checkbox.mjs.map +1 -0
- package/dist/components/input/ColorPicker.cjs +6 -0
- package/dist/components/input/ColorPicker.cjs.map +1 -0
- package/dist/components/input/ColorPicker.mjs +236 -0
- package/dist/components/input/ColorPicker.mjs.map +1 -0
- package/dist/components/input/Combobox.cjs +2 -0
- package/dist/components/input/Combobox.cjs.map +1 -0
- package/dist/components/input/Combobox.expand.cjs +2 -0
- package/dist/components/input/Combobox.expand.cjs.map +1 -0
- package/dist/components/input/Combobox.expand.mjs +38 -0
- package/dist/components/input/Combobox.expand.mjs.map +1 -0
- package/dist/components/input/Combobox.mjs +187 -0
- package/dist/components/input/Combobox.mjs.map +1 -0
- package/dist/components/input/DatePicker.cjs +2 -0
- package/dist/components/input/DatePicker.cjs.map +1 -0
- package/dist/components/input/DatePicker.mjs +340 -0
- package/dist/components/input/DatePicker.mjs.map +1 -0
- package/dist/components/input/Dropdown.cjs +2 -0
- package/dist/components/input/Dropdown.cjs.map +1 -0
- package/dist/components/input/Dropdown.mjs +128 -0
- package/dist/components/input/Dropdown.mjs.map +1 -0
- package/dist/components/input/Field.cjs +2 -0
- package/dist/components/input/Field.cjs.map +1 -0
- package/dist/components/input/Field.mjs +200 -0
- package/dist/components/input/Field.mjs.map +1 -0
- package/dist/components/input/Input.cjs +2 -0
- package/dist/components/input/Input.cjs.map +1 -0
- package/dist/components/input/Input.mjs +81 -0
- package/dist/components/input/Input.mjs.map +1 -0
- package/dist/components/input/Label.cjs +2 -0
- package/dist/components/input/Label.cjs.map +1 -0
- package/dist/components/input/Label.mjs +28 -0
- package/dist/components/input/Label.mjs.map +1 -0
- package/dist/components/input/Option.cjs +2 -0
- package/dist/components/input/Option.cjs.map +1 -0
- package/dist/components/input/Option.mjs +169 -0
- package/dist/components/input/Option.mjs.map +1 -0
- package/dist/components/input/RadioGroup.cjs +2 -0
- package/dist/components/input/RadioGroup.cjs.map +1 -0
- package/dist/components/input/RadioGroup.mjs +139 -0
- package/dist/components/input/RadioGroup.mjs.map +1 -0
- package/dist/components/input/Rating.cjs +2 -0
- package/dist/components/input/Rating.cjs.map +1 -0
- package/dist/components/input/Rating.mjs +196 -0
- package/dist/components/input/Rating.mjs.map +1 -0
- package/dist/components/input/SearchBox.cjs +2 -0
- package/dist/components/input/SearchBox.cjs.map +1 -0
- package/dist/components/input/SearchBox.mjs +205 -0
- package/dist/components/input/SearchBox.mjs.map +1 -0
- package/dist/components/input/Select.cjs +2 -0
- package/dist/components/input/Select.cjs.map +1 -0
- package/dist/components/input/Select.mjs +33 -0
- package/dist/components/input/Select.mjs.map +1 -0
- package/dist/components/input/Slider.cjs +2 -0
- package/dist/components/input/Slider.cjs.map +1 -0
- package/dist/components/input/Slider.mjs +79 -0
- package/dist/components/input/Slider.mjs.map +1 -0
- package/dist/components/input/SpinButton.cjs +2 -0
- package/dist/components/input/SpinButton.cjs.map +1 -0
- package/dist/components/input/SpinButton.mjs +157 -0
- package/dist/components/input/SpinButton.mjs.map +1 -0
- package/dist/components/input/SwatchPicker.cjs +2 -0
- package/dist/components/input/SwatchPicker.cjs.map +1 -0
- package/dist/components/input/SwatchPicker.mjs +113 -0
- package/dist/components/input/SwatchPicker.mjs.map +1 -0
- package/dist/components/input/Switch.cjs +2 -0
- package/dist/components/input/Switch.cjs.map +1 -0
- package/dist/components/input/Switch.mjs +92 -0
- package/dist/components/input/Switch.mjs.map +1 -0
- package/dist/components/input/TagPicker.cjs +2 -0
- package/dist/components/input/TagPicker.cjs.map +1 -0
- package/dist/components/input/TagPicker.mjs +249 -0
- package/dist/components/input/TagPicker.mjs.map +1 -0
- package/dist/components/input/Textarea.cjs +2 -0
- package/dist/components/input/Textarea.cjs.map +1 -0
- package/dist/components/input/Textarea.mjs +32 -0
- package/dist/components/input/Textarea.mjs.map +1 -0
- package/dist/components/input/TimePicker.cjs +2 -0
- package/dist/components/input/TimePicker.cjs.map +1 -0
- package/dist/components/input/TimePicker.mjs +292 -0
- package/dist/components/input/TimePicker.mjs.map +1 -0
- package/dist/components/input/colorUtils.cjs +2 -0
- package/dist/components/input/colorUtils.cjs.map +1 -0
- package/dist/components/input/colorUtils.mjs +96 -0
- package/dist/components/input/colorUtils.mjs.map +1 -0
- package/dist/components/input/dateUtils.cjs +2 -0
- package/dist/components/input/dateUtils.cjs.map +1 -0
- package/dist/components/input/dateUtils.mjs +250 -0
- package/dist/components/input/dateUtils.mjs.map +1 -0
- package/dist/components/input/pickerStyles.cjs +2 -0
- package/dist/components/input/pickerStyles.cjs.map +1 -0
- package/dist/components/input/pickerStyles.mjs +10 -0
- package/dist/components/input/pickerStyles.mjs.map +1 -0
- package/dist/components/internal/HiddenInput.cjs +2 -0
- package/dist/components/internal/HiddenInput.cjs.map +1 -0
- package/dist/components/internal/HiddenInput.mjs +88 -0
- package/dist/components/internal/HiddenInput.mjs.map +1 -0
- package/dist/components/layout/Accordion.cjs +2 -0
- package/dist/components/layout/Accordion.cjs.map +1 -0
- package/dist/components/layout/Accordion.mjs +236 -0
- package/dist/components/layout/Accordion.mjs.map +1 -0
- package/dist/components/layout/Card.cjs +2 -0
- package/dist/components/layout/Card.cjs.map +1 -0
- package/dist/components/layout/Card.mjs +121 -0
- package/dist/components/layout/Card.mjs.map +1 -0
- package/dist/components/layout/Carousel.cjs +2 -0
- package/dist/components/layout/Carousel.cjs.map +1 -0
- package/dist/components/layout/Carousel.mjs +205 -0
- package/dist/components/layout/Carousel.mjs.map +1 -0
- package/dist/components/layout/Flex.cjs +2 -0
- package/dist/components/layout/Flex.cjs.map +1 -0
- package/dist/components/layout/Flex.mjs +54 -0
- package/dist/components/layout/Flex.mjs.map +1 -0
- package/dist/components/layout/Grid.cjs +2 -0
- package/dist/components/layout/Grid.cjs.map +1 -0
- package/dist/components/layout/Grid.mjs +62 -0
- package/dist/components/layout/Grid.mjs.map +1 -0
- package/dist/components/layout/Overflow.cjs +2 -0
- package/dist/components/layout/Overflow.cjs.map +1 -0
- package/dist/components/layout/Overflow.mjs +269 -0
- package/dist/components/layout/Overflow.mjs.map +1 -0
- package/dist/components/layout/Stack.cjs +2 -0
- package/dist/components/layout/Stack.cjs.map +1 -0
- package/dist/components/layout/Stack.mjs +39 -0
- package/dist/components/layout/Stack.mjs.map +1 -0
- package/dist/components/layout/TabList.cjs +2 -0
- package/dist/components/layout/TabList.cjs.map +1 -0
- package/dist/components/layout/TabList.mjs +238 -0
- package/dist/components/layout/TabList.mjs.map +1 -0
- package/dist/components/layout/Tree.cjs +2 -0
- package/dist/components/layout/Tree.cjs.map +1 -0
- package/dist/components/layout/Tree.mjs +220 -0
- package/dist/components/layout/Tree.mjs.map +1 -0
- package/dist/components/layout/disclosureIds.cjs +2 -0
- package/dist/components/layout/disclosureIds.cjs.map +1 -0
- package/dist/components/layout/disclosureIds.mjs +12 -0
- package/dist/components/layout/disclosureIds.mjs.map +1 -0
- package/dist/components/motion/Presence.cjs +2 -0
- package/dist/components/motion/Presence.cjs.map +1 -0
- package/dist/components/motion/Presence.mjs +35 -0
- package/dist/components/motion/Presence.mjs.map +1 -0
- package/dist/components/navigation/Breadcrumb.cjs +2 -0
- package/dist/components/navigation/Breadcrumb.cjs.map +1 -0
- package/dist/components/navigation/Breadcrumb.mjs +144 -0
- package/dist/components/navigation/Breadcrumb.mjs.map +1 -0
- package/dist/components/navigation/Menu.cjs +2 -0
- package/dist/components/navigation/Menu.cjs.map +1 -0
- package/dist/components/navigation/Menu.context.cjs +2 -0
- package/dist/components/navigation/Menu.context.cjs.map +1 -0
- package/dist/components/navigation/Menu.context.mjs +82 -0
- package/dist/components/navigation/Menu.context.mjs.map +1 -0
- package/dist/components/navigation/Menu.group.cjs +2 -0
- package/dist/components/navigation/Menu.group.cjs.map +1 -0
- package/dist/components/navigation/Menu.group.mjs +58 -0
- package/dist/components/navigation/Menu.group.mjs.map +1 -0
- package/dist/components/navigation/Menu.items.cjs +2 -0
- package/dist/components/navigation/Menu.items.cjs.map +1 -0
- package/dist/components/navigation/Menu.items.mjs +127 -0
- package/dist/components/navigation/Menu.items.mjs.map +1 -0
- package/dist/components/navigation/Menu.link.cjs +2 -0
- package/dist/components/navigation/Menu.link.cjs.map +1 -0
- package/dist/components/navigation/Menu.link.mjs +41 -0
- package/dist/components/navigation/Menu.link.mjs.map +1 -0
- package/dist/components/navigation/Menu.mjs +27 -0
- package/dist/components/navigation/Menu.mjs.map +1 -0
- package/dist/components/navigation/Menu.popover.cjs +2 -0
- package/dist/components/navigation/Menu.popover.cjs.map +1 -0
- package/dist/components/navigation/Menu.popover.mjs +231 -0
- package/dist/components/navigation/Menu.popover.mjs.map +1 -0
- package/dist/components/navigation/Menu.root.cjs +2 -0
- package/dist/components/navigation/Menu.root.cjs.map +1 -0
- package/dist/components/navigation/Menu.root.mjs +308 -0
- package/dist/components/navigation/Menu.root.mjs.map +1 -0
- package/dist/components/navigation/Menu.selectable.cjs +2 -0
- package/dist/components/navigation/Menu.selectable.cjs.map +1 -0
- package/dist/components/navigation/Menu.selectable.mjs +89 -0
- package/dist/components/navigation/Menu.selectable.mjs.map +1 -0
- package/dist/components/navigation/Menu.shared.cjs +2 -0
- package/dist/components/navigation/Menu.shared.cjs.map +1 -0
- package/dist/components/navigation/Menu.shared.mjs +23 -0
- package/dist/components/navigation/Menu.shared.mjs.map +1 -0
- package/dist/components/navigation/Menu.splitGroup.cjs +2 -0
- package/dist/components/navigation/Menu.splitGroup.cjs.map +1 -0
- package/dist/components/navigation/Menu.splitGroup.mjs +51 -0
- package/dist/components/navigation/Menu.splitGroup.mjs.map +1 -0
- package/dist/components/navigation/Menu.trigger.cjs +2 -0
- package/dist/components/navigation/Menu.trigger.cjs.map +1 -0
- package/dist/components/navigation/Menu.trigger.mjs +79 -0
- package/dist/components/navigation/Menu.trigger.mjs.map +1 -0
- package/dist/components/navigation/Nav.cjs +2 -0
- package/dist/components/navigation/Nav.cjs.map +1 -0
- package/dist/components/navigation/Nav.mjs +276 -0
- package/dist/components/navigation/Nav.mjs.map +1 -0
- package/dist/components/navigation/Pagination.cjs +2 -0
- package/dist/components/navigation/Pagination.cjs.map +1 -0
- package/dist/components/navigation/Pagination.mjs +110 -0
- package/dist/components/navigation/Pagination.mjs.map +1 -0
- package/dist/components/navigation/Stepper.cjs +2 -0
- package/dist/components/navigation/Stepper.cjs.map +1 -0
- package/dist/components/navigation/Stepper.mjs +204 -0
- package/dist/components/navigation/Stepper.mjs.map +1 -0
- package/dist/components/overlays/Dialog.cjs +2 -0
- package/dist/components/overlays/Dialog.cjs.map +1 -0
- package/dist/components/overlays/Dialog.mjs +180 -0
- package/dist/components/overlays/Dialog.mjs.map +1 -0
- package/dist/components/overlays/Dialog.shared.cjs +2 -0
- package/dist/components/overlays/Dialog.shared.cjs.map +1 -0
- package/dist/components/overlays/Dialog.shared.mjs +227 -0
- package/dist/components/overlays/Dialog.shared.mjs.map +1 -0
- package/dist/components/overlays/Drawer.cjs +2 -0
- package/dist/components/overlays/Drawer.cjs.map +1 -0
- package/dist/components/overlays/Drawer.mjs +192 -0
- package/dist/components/overlays/Drawer.mjs.map +1 -0
- package/dist/components/overlays/Popover.cjs +2 -0
- package/dist/components/overlays/Popover.cjs.map +1 -0
- package/dist/components/overlays/Popover.mjs +365 -0
- package/dist/components/overlays/Popover.mjs.map +1 -0
- package/dist/components/overlays/Popover.shared.cjs +2 -0
- package/dist/components/overlays/Popover.shared.cjs.map +1 -0
- package/dist/components/overlays/Popover.shared.mjs +182 -0
- package/dist/components/overlays/Popover.shared.mjs.map +1 -0
- package/dist/components/overlays/TeachingPopover.cjs +2 -0
- package/dist/components/overlays/TeachingPopover.cjs.map +1 -0
- package/dist/components/overlays/TeachingPopover.mjs +181 -0
- package/dist/components/overlays/TeachingPopover.mjs.map +1 -0
- package/dist/components/overlays/Tooltip.cjs +2 -0
- package/dist/components/overlays/Tooltip.cjs.map +1 -0
- package/dist/components/overlays/Tooltip.mjs +160 -0
- package/dist/components/overlays/Tooltip.mjs.map +1 -0
- package/dist/components/portal/Portal.cjs +2 -0
- package/dist/components/portal/Portal.cjs.map +1 -0
- package/dist/components/portal/Portal.mjs +45 -0
- package/dist/components/portal/Portal.mjs.map +1 -0
- package/dist/components/provider/WaveProvider.cjs +2 -0
- package/dist/components/provider/WaveProvider.cjs.map +1 -0
- package/dist/components/provider/WaveProvider.mjs +51 -0
- package/dist/components/provider/WaveProvider.mjs.map +1 -0
- package/dist/components/table/DataGrid.cjs +2 -0
- package/dist/components/table/DataGrid.cjs.map +1 -0
- package/dist/components/table/DataGrid.mjs +489 -0
- package/dist/components/table/DataGrid.mjs.map +1 -0
- package/dist/components/table/Table.cjs +2 -0
- package/dist/components/table/Table.cjs.map +1 -0
- package/dist/components/table/Table.mjs +99 -0
- package/dist/components/table/Table.mjs.map +1 -0
- package/dist/components/table/useGridNavigation.cjs +2 -0
- package/dist/components/table/useGridNavigation.cjs.map +1 -0
- package/dist/components/table/useGridNavigation.mjs +336 -0
- package/dist/components/table/useGridNavigation.mjs.map +1 -0
- package/dist/components/typography/Text.cjs +2 -0
- package/dist/components/typography/Text.cjs.map +1 -0
- package/dist/components/typography/Text.mjs +38 -0
- package/dist/components/typography/Text.mjs.map +1 -0
- package/dist/hooks/useAnnounce.cjs +2 -0
- package/dist/hooks/useAnnounce.cjs.map +1 -0
- package/dist/hooks/useAnnounce.mjs +88 -0
- package/dist/hooks/useAnnounce.mjs.map +1 -0
- package/dist/hooks/useCheckedValues.cjs +2 -0
- package/dist/hooks/useCheckedValues.cjs.map +1 -0
- package/dist/hooks/useCheckedValues.mjs +102 -0
- package/dist/hooks/useCheckedValues.mjs.map +1 -0
- package/dist/hooks/useContextMenuAnchor.cjs +2 -0
- package/dist/hooks/useContextMenuAnchor.cjs.map +1 -0
- package/dist/hooks/useContextMenuAnchor.mjs +132 -0
- package/dist/hooks/useContextMenuAnchor.mjs.map +1 -0
- package/dist/hooks/useControllable.cjs +2 -0
- package/dist/hooks/useControllable.cjs.map +1 -0
- package/dist/hooks/useControllable.mjs +37 -0
- package/dist/hooks/useControllable.mjs.map +1 -0
- package/dist/hooks/useDirection.cjs +2 -0
- package/dist/hooks/useDirection.cjs.map +1 -0
- package/dist/hooks/useDirection.mjs +57 -0
- package/dist/hooks/useDirection.mjs.map +1 -0
- package/dist/hooks/useDismiss.cjs +2 -0
- package/dist/hooks/useDismiss.cjs.map +1 -0
- package/dist/hooks/useDismiss.mjs +57 -0
- package/dist/hooks/useDismiss.mjs.map +1 -0
- package/dist/hooks/useEventCallback.cjs +2 -0
- package/dist/hooks/useEventCallback.cjs.map +1 -0
- package/dist/hooks/useEventCallback.mjs +16 -0
- package/dist/hooks/useEventCallback.mjs.map +1 -0
- package/dist/hooks/useFieldControl.cjs +2 -0
- package/dist/hooks/useFieldControl.cjs.map +1 -0
- package/dist/hooks/useFieldControl.mjs +62 -0
- package/dist/hooks/useFieldControl.mjs.map +1 -0
- package/dist/hooks/useFocusTrap.cjs +2 -0
- package/dist/hooks/useFocusTrap.cjs.map +1 -0
- package/dist/hooks/useFocusTrap.mjs +266 -0
- package/dist/hooks/useFocusTrap.mjs.map +1 -0
- package/dist/hooks/useFormReset.cjs +2 -0
- package/dist/hooks/useFormReset.cjs.map +1 -0
- package/dist/hooks/useFormReset.mjs +33 -0
- package/dist/hooks/useFormReset.mjs.map +1 -0
- package/dist/hooks/useHoverIntent.cjs +2 -0
- package/dist/hooks/useHoverIntent.cjs.map +1 -0
- package/dist/hooks/useHoverIntent.mjs +201 -0
- package/dist/hooks/useHoverIntent.mjs.map +1 -0
- package/dist/hooks/useId.cjs +2 -0
- package/dist/hooks/useId.cjs.map +1 -0
- package/dist/hooks/useId.mjs +11 -0
- package/dist/hooks/useId.mjs.map +1 -0
- package/dist/hooks/useIsClient.cjs +2 -0
- package/dist/hooks/useIsClient.cjs.map +1 -0
- package/dist/hooks/useIsClient.mjs +19 -0
- package/dist/hooks/useIsClient.mjs.map +1 -0
- package/dist/hooks/useListbox.cjs +2 -0
- package/dist/hooks/useListbox.cjs.map +1 -0
- package/dist/hooks/useListbox.mjs +492 -0
- package/dist/hooks/useListbox.mjs.map +1 -0
- package/dist/hooks/useMergedRefs.cjs +2 -0
- package/dist/hooks/useMergedRefs.cjs.map +1 -0
- package/dist/hooks/useMergedRefs.mjs +57 -0
- package/dist/hooks/useMergedRefs.mjs.map +1 -0
- package/dist/hooks/useModalIsolation.cjs +2 -0
- package/dist/hooks/useModalIsolation.cjs.map +1 -0
- package/dist/hooks/useModalIsolation.mjs +87 -0
- package/dist/hooks/useModalIsolation.mjs.map +1 -0
- package/dist/hooks/useModalLayer.cjs +2 -0
- package/dist/hooks/useModalLayer.cjs.map +1 -0
- package/dist/hooks/useModalLayer.mjs +30 -0
- package/dist/hooks/useModalLayer.mjs.map +1 -0
- package/dist/hooks/usePopupPosition.cjs +2 -0
- package/dist/hooks/usePopupPosition.cjs.map +1 -0
- package/dist/hooks/usePopupPosition.mjs +117 -0
- package/dist/hooks/usePopupPosition.mjs.map +1 -0
- package/dist/hooks/usePrefersReducedMotion.cjs +2 -0
- package/dist/hooks/usePrefersReducedMotion.cjs.map +1 -0
- package/dist/hooks/usePrefersReducedMotion.mjs +24 -0
- package/dist/hooks/usePrefersReducedMotion.mjs.map +1 -0
- package/dist/hooks/usePresence.cjs +2 -0
- package/dist/hooks/usePresence.cjs.map +1 -0
- package/dist/hooks/usePresence.mjs +136 -0
- package/dist/hooks/usePresence.mjs.map +1 -0
- package/dist/hooks/usePreserveFocus.cjs +2 -0
- package/dist/hooks/usePreserveFocus.cjs.map +1 -0
- package/dist/hooks/usePreserveFocus.mjs +50 -0
- package/dist/hooks/usePreserveFocus.mjs.map +1 -0
- package/dist/hooks/useRestoreFocus.cjs +2 -0
- package/dist/hooks/useRestoreFocus.cjs.map +1 -0
- package/dist/hooks/useRestoreFocus.mjs +271 -0
- package/dist/hooks/useRestoreFocus.mjs.map +1 -0
- package/dist/hooks/useRovingTabIndex.cjs +2 -0
- package/dist/hooks/useRovingTabIndex.cjs.map +1 -0
- package/dist/hooks/useRovingTabIndex.mjs +389 -0
- package/dist/hooks/useRovingTabIndex.mjs.map +1 -0
- package/dist/hooks/useScrollLock.cjs +2 -0
- package/dist/hooks/useScrollLock.cjs.map +1 -0
- package/dist/hooks/useScrollLock.mjs +71 -0
- package/dist/hooks/useScrollLock.mjs.map +1 -0
- package/dist/hooks/useTriggerElement.cjs +2 -0
- package/dist/hooks/useTriggerElement.cjs.map +1 -0
- package/dist/hooks/useTriggerElement.mjs +126 -0
- package/dist/hooks/useTriggerElement.mjs.map +1 -0
- package/dist/hooks/useTypeahead.cjs +2 -0
- package/dist/hooks/useTypeahead.cjs.map +1 -0
- package/dist/hooks/useTypeahead.mjs +38 -0
- package/dist/hooks/useTypeahead.mjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +9099 -0
- package/dist/index.d.ts +7688 -1027
- package/dist/index.mjs +91 -5695
- package/dist/lib/aria.cjs +2 -0
- package/dist/lib/aria.cjs.map +1 -0
- package/dist/lib/aria.mjs +29 -0
- package/dist/lib/aria.mjs.map +1 -0
- package/dist/lib/children.cjs +2 -0
- package/dist/lib/children.cjs.map +1 -0
- package/dist/lib/children.mjs +37 -0
- package/dist/lib/children.mjs.map +1 -0
- package/dist/lib/cn.cjs +2 -0
- package/dist/lib/cn.cjs.map +1 -0
- package/dist/lib/cn.mjs +64 -0
- package/dist/lib/cn.mjs.map +1 -0
- package/dist/lib/composeEventHandlers.cjs +2 -0
- package/dist/lib/composeEventHandlers.cjs.map +1 -0
- package/dist/lib/composeEventHandlers.mjs +11 -0
- package/dist/lib/composeEventHandlers.mjs.map +1 -0
- package/dist/lib/dev.cjs +2 -0
- package/dist/lib/dev.cjs.map +1 -0
- package/dist/lib/dev.mjs +42 -0
- package/dist/lib/dev.mjs.map +1 -0
- package/dist/lib/direction.cjs +2 -0
- package/dist/lib/direction.cjs.map +1 -0
- package/dist/lib/direction.mjs +35 -0
- package/dist/lib/direction.mjs.map +1 -0
- package/dist/lib/events.cjs +2 -0
- package/dist/lib/events.cjs.map +1 -0
- package/dist/lib/events.mjs +31 -0
- package/dist/lib/events.mjs.map +1 -0
- package/dist/lib/focus.cjs +2 -0
- package/dist/lib/focus.cjs.map +1 -0
- package/dist/lib/focus.mjs +119 -0
- package/dist/lib/focus.mjs.map +1 -0
- package/dist/lib/globalRegistry.cjs +2 -0
- package/dist/lib/globalRegistry.cjs.map +1 -0
- package/dist/lib/globalRegistry.mjs +13 -0
- package/dist/lib/globalRegistry.mjs.map +1 -0
- package/dist/lib/icons.cjs +2 -0
- package/dist/lib/icons.cjs.map +1 -0
- package/dist/lib/icons.mjs +254 -0
- package/dist/lib/icons.mjs.map +1 -0
- package/dist/lib/labelInName.cjs +2 -0
- package/dist/lib/labelInName.cjs.map +1 -0
- package/dist/lib/labelInName.mjs +54 -0
- package/dist/lib/labelInName.mjs.map +1 -0
- package/dist/lib/layers.cjs +2 -0
- package/dist/lib/layers.cjs.map +1 -0
- package/dist/lib/layers.mjs +224 -0
- package/dist/lib/layers.mjs.map +1 -0
- package/dist/lib/mergeProps.cjs +2 -0
- package/dist/lib/mergeProps.cjs.map +1 -0
- package/dist/lib/mergeProps.mjs +21 -0
- package/dist/lib/mergeProps.mjs.map +1 -0
- package/dist/lib/mergeRefs.cjs +2 -0
- package/dist/lib/mergeRefs.cjs.map +1 -0
- package/dist/lib/mergeRefs.mjs +29 -0
- package/dist/lib/mergeRefs.mjs.map +1 -0
- package/dist/lib/renderTrigger.cjs +2 -0
- package/dist/lib/renderTrigger.cjs.map +1 -0
- package/dist/lib/renderTrigger.mjs +29 -0
- package/dist/lib/renderTrigger.mjs.map +1 -0
- package/dist/lib/slot.cjs +2 -0
- package/dist/lib/slot.cjs.map +1 -0
- package/dist/lib/slot.mjs +122 -0
- package/dist/lib/slot.mjs.map +1 -0
- package/dist/lib/styles.cjs +2 -0
- package/dist/lib/styles.cjs.map +1 -0
- package/dist/lib/styles.mjs +16 -0
- package/dist/lib/styles.mjs.map +1 -0
- package/dist/lib/theme.cjs +2 -0
- package/dist/lib/theme.cjs.map +1 -0
- package/dist/lib/theme.mjs +16 -0
- package/dist/lib/theme.mjs.map +1 -0
- package/dist/preflight.css +2 -0
- package/dist/styles.css +2 -0
- package/package.json +149 -100
- package/src/styles/animations.css +7 -39
- package/src/styles/base.css +103 -0
- package/src/styles/globals.css +10 -22
- package/src/styles/legacy-tokens.css +184 -0
- package/src/styles/preflight.css +7 -0
- package/src/styles/styles.css +32 -0
- package/src/styles/tailwind.css +17 -0
- package/src/styles/tokens.css +561 -221
- package/src/styles/variants.css +29 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slot.cjs","names":["React","isElementOfType","cn","require_runtime","require_cn","require_children","require_dev","react","VOID_ELEMENTS","isPlainObject","proto","value","isSlotObject","isVoidTag","tag","materialisedIterators","isOneShotIterator","iterable","rendersContent","node","visiting","nested","item","normaliseContent","slotRendersContent","slot","materialiseSlotContent","content","slotWrapsDefaultContent","type","props","cached","describeTag","mergeClassName","baseClassName","className","resolveSlot","defaultAs","defaults","defaultProps","slotAs","rest","Component","children","elementProps","renderSlot","resolved"],"sources":["../../src/lib/slot.ts"],"sourcesContent":["import * as React from 'react';\nimport { isElementOfType } from './children';\nimport { cn } from './cn';\nimport { warnOnce } from './dev';\n\n/**\n * Object form of a Slot: full control over the rendered element.\n *\n * - `as` renders a different element or component than the slot's default (any element type).\n * - Every attribute of the default element `T` is accepted and forwarded (`{ src, alt }` for an\n * `'img'` slot, `aria-label`/`title`/handlers for a `'span'` slot), plus `data-*` attributes.\n * - `className` is merged after the component's base classes, so it wins conflicts.\n *\n * @typeParam T - The slot's default element type.\n */\nexport type SlotObject<T extends React.ElementType = 'span'> = {\n /** Render a different element or component instead of the slot's default. */\n as?: React.ElementType;\n /** Content to render inside the slot element (ignored for void elements such as `img`). */\n children?: React.ReactNode;\n /** Class name(s) merged after the component's base classes (yours win). */\n className?: string;\n /** Inline styles for the slot element. */\n style?: React.CSSProperties;\n /** Ref to the rendered slot element. */\n ref?: React.Ref<unknown>;\n /** Any `data-*` attribute. */\n [dataAttribute: `data-${string}`]: unknown;\n} & Omit<React.ComponentPropsWithoutRef<T>, 'children' | 'className' | 'style'>;\n\n/**\n * Slot definition — a customisable sub-element of a component. Accepts:\n *\n * - any `React.ReactNode` as shorthand content (string, number, bigint, element, promise, or any\n * iterable of nodes such as an array, a `Set` or a generator), rendered **inside** the slot's\n * default element; `null`, `undefined`, `false` and `true` render nothing;\n * - a {@link SlotObject} (`{ as, className, children, ...attributes }`) for full control.\n *\n * An attributes object typed by an interface (`React.ImgHTMLAttributes<…>`) has no implicit\n * `data-*` index signature, so it is not assignable as is: spread it into a literal,\n * `image={{ ...imgProps }}`.\n *\n * @typeParam T - The slot's default element type.\n */\nexport type Slot<T extends React.ElementType = 'span'> = SlotObject<T> | React.ReactNode;\n\n/** The normalized output of {@link resolveSlot}, ready for rendering. */\nexport interface ResolvedSlot {\n /** The element type to render (e.g., 'span', 'div', or a component). */\n Component: React.ElementType;\n /** Merged props including className and any extra HTML attributes. */\n props: Record<string, unknown>;\n /** The content to render inside the element. */\n children: React.ReactNode;\n}\n\n/**\n * HTML void elements: they can never have children. A slot whose default tag is one of these\n * renders a ReactElement slot as-is (instead of wrapping it) and never receives shorthand children.\n */\nexport const VOID_ELEMENTS: ReadonlySet<string> = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n]);\n\ntype UnknownProps = Record<string, unknown>;\n\nfunction isPlainObject(value: object): boolean {\n const proto: unknown = Object.getPrototypeOf(value);\n return proto === null || proto === Object.prototype || Object.getPrototypeOf(proto) === null;\n}\n\n/**\n * A slot object is a plain object that is not a React element, not a React internal object\n * (`$$typeof`: portals, lazy nodes), not an iterable (arrays, Sets, generators) and not a thenable.\n * Everything else is content and renders as children of the default element.\n */\nfunction isSlotObject(value: unknown): value is UnknownProps {\n if (typeof value !== 'object' || value === null) return false;\n if (React.isValidElement(value)) return false;\n if ('$$typeof' in value) return false;\n if (Symbol.iterator in value) return false;\n if (typeof (value as { then?: unknown }).then === 'function') return false;\n return isPlainObject(value);\n}\n\nfunction isVoidTag(tag: React.ElementType): boolean {\n return typeof tag === 'string' && VOID_ELEMENTS.has(tag);\n}\n\n/**\n * One-shot iterators (generators) are materialised into an array once and cached, so React never\n * enumerates a generator (it warns about that) and a second render of the same props (StrictMode)\n * sees the same items. Re-iterable collections (Set, custom iterables) are passed through.\n */\nconst materialisedIterators = new WeakMap<object, React.ReactNode[]>();\n\n/** Whether `value` is a one-shot iterator (a generator): iterating it returns itself. */\nfunction isOneShotIterator(value: object): boolean {\n if (Array.isArray(value) || !(Symbol.iterator in value)) return false;\n const iterable = value as Iterable<unknown>;\n return (iterable[Symbol.iterator]() as unknown) === iterable;\n}\n\n/**\n * Whether React would render anything for `node`: `null`, `undefined`, booleans and `''` render\n * nothing, and so does a Fragment, array or other iterable (Set, generator) whose content, at any\n * depth, is all of those. Dropping such content from a void element is silent (a conditional\n * `children: cond && x`, or a list mapped to nothing). A top-level generator is read through\n * {@link normaliseContent} (materialised once, so checking it does not consume it); a generator\n * nested in a collection or a Fragment is rendered by React as it is, so it is not read and counts\n * as content.\n */\nfunction rendersContent(node: unknown, visiting: Set<object>, nested: boolean): boolean {\n if (node === undefined || node === null || typeof node === 'boolean' || node === '') {\n return false;\n }\n if (typeof node !== 'object') return true;\n if (React.isValidElement(node)) {\n if (!isElementOfType<{ children?: React.ReactNode }>(node, React.Fragment)) return true;\n return rendersContent(node.props.children, visiting, true);\n }\n if (!(Symbol.iterator in node)) return true;\n if (nested && isOneShotIterator(node)) return true;\n // A collection that contains itself adds nothing beyond what is already being checked.\n if (visiting.has(node)) return false;\n visiting.add(node);\n try {\n for (const item of normaliseContent(node) as Iterable<unknown>) {\n if (rendersContent(item, visiting, true)) return true;\n }\n return false;\n } finally {\n visiting.delete(node);\n }\n}\n\n/**\n * Whether a slot value renders any content — the one \"renders nothing\" rule of the library, for\n * slots and any other content a component shows or leaves out (labels, titles, dismiss content).\n *\n * `false` for `null`, `undefined`, booleans and `''`, and for a Fragment, array, `Set`, generator\n * or other iterable whose content, at any depth, is only those (`<></>`, `[null, '']`,\n * `<>{false}</>`); a Fragment is recognised by its unwrapped type, also when it is a client\n * reference written in a Server Component. `true` for everything else: text, numbers (including\n * `0`), other React elements (the helper cannot know what a component renders), slot objects\n * (they always render their element), promises, and a generator nested in a collection or a\n * Fragment (not read, so React still renders its items).\n *\n * A top-level generator is materialised once and cached, so checking it does not consume it:\n * render the checked value through `renderSlot`/`resolveSlot`, or, when you render it yourself,\n * through {@link materialiseSlotContent}. Never warns. Call it during render: a client reference\n * whose code is still loading suspends the caller, as rendering it would.\n *\n * Components use it to fall back when a slot is effectively empty, e.g. Avatar shows the initials\n * unless `icon && slotRendersContent(icon)`.\n *\n * @param slot A slot value or any React node.\n */\nexport function slotRendersContent(slot: unknown): boolean {\n return rendersContent(slot, new Set(), false);\n}\n\n/**\n * The content to render for a value that {@link slotRendersContent} checked, for a component that\n * renders it itself rather than through `renderSlot`/`resolveSlot`: a top-level generator is\n * replaced by its materialised items (the same array on every call, so a second render sees the\n * same items and React never enumerates the generator); every other value is returned as given.\n *\n * @example\n * const hasAction = slotRendersContent(action);\n * return hasAction ? <span className=\"ms-auto\">{materialiseSlotContent(action)}</span> : null;\n *\n * @param content A slot value or any React node.\n */\nexport function materialiseSlotContent(content: unknown): React.ReactNode {\n return normaliseContent(content);\n}\n\n/**\n * Whether a slot object's element wraps the component's default content, the rule of the dismiss\n * and clear slots (Tag `dismissIcon`, MessageBar `dismiss`, SearchBox `dismiss`): a slot object\n * without content of its own (`{ className: 'text-error' }`) styles the default icon.\n *\n * `true` when the element is an intrinsic tag that can hold children (not a void tag such as\n * `img`), it sets no `dangerouslySetInnerHTML` and its `children` render nothing\n * ({@link slotRendersContent}). A component (an icon that draws its own glyph), a void tag and\n * markup of its own are the content themselves: `false`.\n *\n * @param type The element type the slot object renders (its `as`, else the slot's default tag).\n * @param props The slot object's props; `children` and `dangerouslySetInnerHTML` are read.\n */\nexport function slotWrapsDefaultContent(\n type: unknown,\n props: { children?: unknown; dangerouslySetInnerHTML?: unknown },\n): boolean {\n if (typeof type !== 'string' || VOID_ELEMENTS.has(type)) return false;\n return props.dangerouslySetInnerHTML == null && !slotRendersContent(props.children);\n}\n\nfunction normaliseContent(slot: unknown): React.ReactNode {\n if (typeof slot === 'object' && slot !== null && isOneShotIterator(slot)) {\n const iterable = slot as Iterable<React.ReactNode>;\n let cached = materialisedIterators.get(iterable);\n if (!cached) {\n cached = Array.from(iterable);\n materialisedIterators.set(iterable, cached);\n }\n return cached;\n }\n return slot as React.ReactNode;\n}\n\nfunction describeTag(tag: React.ElementType): string {\n return typeof tag === 'string' ? `<${tag}>` : 'a void element';\n}\n\n/** `cn(base, own)`, or `undefined` when there are no classes, so no empty `class=\"\"` renders. */\nfunction mergeClassName(baseClassName: string | undefined, className: unknown): string | undefined {\n return cn(baseClassName, className as string | undefined) || undefined;\n}\n\n/**\n * Resolves a Slot value into a `{ Component, props, children }` triple.\n *\n * - `null`, `undefined`, `false` and `true` resolve to `null` (render nothing).\n * - A slot object resolves to `Component = as ?? defaultAs`,\n * `props = { ...defaultProps, ...attributes, className: cn(baseClassName, className) }` and its\n * `children` (a generator materialised into an array once, as for shorthand content). When the\n * element is void its `children` are always dropped, with a development warning only if they\n * would have rendered (not for `null`, `undefined`, booleans or `''`, nor for a Fragment,\n * array, Set or generator made only of those, at any depth).\n * - With a **void** default tag (`area`, `base`, `br`, `col`, `embed`, `hr`, `img`, `input`,\n * `link`, `meta`, `param`, `source`, `track`, `wbr`) a ReactElement slot resolves to the\n * element itself (its type and props, `defaultProps` underneath, className merged). A Fragment\n * and shorthand content resolve to `null` with a development warning (none for content that\n * renders nothing) — the component decides what a string means (Avatar treats it as `src`).\n * - Any other value (string, number, element, array, Set, generator, promise) becomes the children\n * of `defaultAs` with `{ ...defaultProps, className: baseClassName }`.\n * - `props.className` is `undefined` (never `''`) when there are no classes, so no empty `class`\n * attribute renders; it always replaces a `className` in `defaultProps`.\n *\n * @param slot The slot value from component props.\n * @param defaultAs The default element type (e.g., 'span', 'div'). Defaults to 'span'.\n * @param baseClassName Base classes; the slot's own className is merged after them and wins.\n * @param defaultProps Default attributes (e.g. `{ 'aria-hidden': true }` for icon slots) that\n * the slot's own props override.\n */\nexport function resolveSlot<T extends React.ElementType = 'span'>(\n slot: Slot<T> | undefined | null,\n defaultAs?: T,\n baseClassName?: string,\n defaultProps?: Record<string, unknown>,\n): ResolvedSlot | null {\n if (slot === null || slot === undefined || typeof slot === 'boolean') {\n return null;\n }\n\n const tag: React.ElementType = defaultAs ?? 'span';\n const defaults: UnknownProps = defaultProps ?? {};\n\n if (isSlotObject(slot)) {\n const { as: slotAs, children, className, ...rest } = slot;\n const Component = (slotAs as React.ElementType | undefined) ?? tag;\n let content = normaliseContent(children);\n if (isVoidTag(Component)) {\n // A void element never receives children (React throws for any non-null value, even\n // `false` or `[]`); warn only when the dropped children would have rendered something.\n if (slotRendersContent(content)) {\n warnOnce(\n `slot:void-children:${String(Component)}`,\n `A slot rendered as ${describeTag(Component)} cannot have children; its \\`children\\` were ignored.`,\n );\n }\n content = undefined;\n }\n return {\n Component,\n props: {\n ...defaults,\n ...rest,\n className: mergeClassName(baseClassName, className),\n },\n children: content,\n };\n }\n\n if (isVoidTag(tag)) {\n if (React.isValidElement(slot) && slot.type !== React.Fragment) {\n const { children, className, ...elementProps } = slot.props as UnknownProps;\n return {\n Component: slot.type as React.ElementType,\n props: {\n ...defaults,\n ...elementProps,\n className: mergeClassName(baseClassName, className),\n },\n children: children as React.ReactNode,\n };\n }\n if (React.isValidElement(slot)) {\n // An empty Fragment (`<></>`) renders nothing: an empty slot, no warning.\n if (slotRendersContent(slot)) {\n warnOnce(\n `slot:void-fragment:${String(tag)}`,\n `A Fragment cannot stand in for ${describeTag(tag)} (a void element): it cannot take the slot's className or attributes. Pass the element itself or an object slot instead; the slot was not rendered.`,\n );\n }\n return null;\n }\n if (slotRendersContent(slot)) {\n warnOnce(\n `slot:void-content:${String(tag)}`,\n `Slot content cannot be rendered inside ${describeTag(tag)} (a void element). Pass an element or an object slot instead; the slot was not rendered.`,\n );\n }\n return null;\n }\n\n return {\n Component: tag,\n props: {\n ...defaults,\n className: baseClassName || undefined,\n },\n children: normaliseContent(slot),\n };\n}\n\n/**\n * Renders a slot (see {@link resolveSlot} for the rules). Returns `null` when the slot is empty.\n *\n * @param slot The slot value from component props.\n * @param defaultAs The default element type (e.g., 'span', 'div'). Defaults to 'span'.\n * @param baseClassName Base classes; the slot's own className is merged after them and wins.\n * @param defaultProps Default attributes that the slot's own props override, e.g.\n * `renderSlot(icon, 'span', 'shrink-0', { 'aria-hidden': true })`.\n * @returns A React element, or `null` if the slot is empty.\n */\nexport function renderSlot<T extends React.ElementType = 'span'>(\n slot: Slot<T> | undefined | null,\n defaultAs?: React.ElementType,\n baseClassName?: string,\n defaultProps?: Record<string, unknown>,\n): React.ReactElement | null {\n const resolved = resolveSlot<React.ElementType>(\n slot as Slot<React.ElementType>,\n defaultAs,\n baseClassName,\n defaultProps,\n );\n if (!resolved) return null;\n\n const { Component, props, children } = resolved;\n return children === undefined\n ? React.createElement(Component, props)\n : React.createElement(Component, props, children);\n}\n"],"mappings":"sKA4DA,IAAaQ,EAAqC,IAAI,IAAI,CACxD,OACA,OACA,KACA,MACA,QACA,KACA,MACA,QACA,OACA,OACA,QACA,SACA,QACA,KACF,CAAC,EAID,SAASC,EAAc,EAAwB,CAC7C,IAAMC,EAAiB,OAAO,eAAeC,CAAK,EAClD,OAAOD,IAAU,MAAQA,IAAU,OAAO,WAAa,OAAO,eAAeA,CAAK,IAAM,IAC1F,CAOA,SAASE,EAAa,EAAuC,CAM3D,OALI,OAAOD,GAAU,WAAYA,GAC7BX,EAAM,eAAeW,CAAK,GAC1B,aAAcA,GACd,OAAO,YAAYA,GACnB,OAAQA,EAA6B,MAAS,WAAmB,GAC9DF,EAAcE,CAAK,CAC5B,CAEA,SAASE,EAAU,EAAiC,CAClD,OAAO,OAAOC,GAAQ,UAAYN,EAAc,IAAIM,CAAG,CACzD,CAOA,IAAMC,EAAwB,IAAI,QAGlC,SAASC,EAAkB,EAAwB,CACjD,GAAI,MAAM,QAAQL,CAAK,GAAK,EAAE,OAAO,YAAYA,GAAQ,MAAO,GAChE,IAAMM,EAAWN,EACjB,OAAQM,EAAS,OAAO,SAAS,CAAC,IAAkBA,CACtD,CAWA,SAASC,EAAe,EAAe,EAAuB,EAA0B,CACtF,GAAIC,GAA+B,MAAQ,OAAOA,GAAS,WAAaA,IAAS,GAC/E,MAAO,GAET,GAAI,OAAOA,GAAS,SAAU,MAAO,GACrC,GAAInB,EAAM,eAAemB,CAAI,EAE3B,MADA,CAAKlB,EAAAA,gBAAgDkB,EAAMnB,EAAM,QAAQ,GAClEkB,EAAeC,EAAK,MAAM,SAAUC,EAAU,EAAI,EAG3D,GADI,EAAE,OAAO,YAAYD,IACrBE,GAAUL,EAAkBG,CAAI,EAAG,MAAO,GAE9C,GAAIC,EAAS,IAAID,CAAI,EAAG,MAAO,GAC/BC,EAAS,IAAID,CAAI,EACjB,GAAI,CACF,IAAK,IAAMG,KAAQC,EAAiBJ,CAAI,EACtC,GAAID,EAAeI,EAAMF,EAAU,EAAI,EAAG,MAAO,GAEnD,MAAO,EACT,QAAU,CACRA,EAAS,OAAOD,CAAI,CACtB,CACF,CAwBA,SAAgBK,EAAmB,EAAwB,CACzD,OAAON,EAAeO,EAAM,IAAI,IAAO,EAAK,CAC9C,CAcA,SAAgBC,EAAuB,EAAmC,CACxE,OAAOH,EAAiBI,CAAO,CACjC,CAeA,SAAgBC,EACd,EACA,EACS,CAET,OADI,OAAOC,GAAS,UAAYrB,EAAc,IAAIqB,CAAI,EAAU,GACzDC,EAAM,yBAA2B,MAAQ,CAACN,EAAmBM,EAAM,QAAQ,CACpF,CAEA,SAASP,EAAiB,EAAgC,CACxD,GAAI,OAAOE,GAAS,UAAYA,GAAiBT,EAAkBS,CAAI,EAAG,CACxE,IAAMR,EAAWQ,EACbM,EAAShB,EAAsB,IAAIE,CAAQ,EAK/C,OAJKc,IACH,EAAS,MAAM,KAAKd,CAAQ,EAC5BF,EAAsB,IAAIE,EAAUc,CAAM,GAErCA,CACT,CACA,OAAON,CACT,CAEA,SAASO,EAAY,EAAgC,CACnD,OAAO,OAAOlB,GAAQ,SAAW,IAAIA,EAAI,GAAK,gBAChD,CAGA,SAASmB,EAAe,EAAmC,EAAwC,CACjG,OAAO/B,EAAAA,GAAGgC,EAAeC,CAA+B,GAAK,IAAA,EAC/D,CA4BA,SAAgBC,EACd,EACA,EACA,EACA,EACqB,CACrB,GAAIX,GAAS,MAA8B,OAAOA,GAAS,UACzD,OAAO,KAGT,IAAMX,EAAyBuB,GAAa,OACtCC,EAAyBC,GAAgB,CAAC,EAEhD,GAAI3B,EAAaa,CAAI,EAAG,CACtB,GAAM,CAAE,GAAIe,EAAQ,WAAU,YAAW,GAAGC,GAAShB,EAC/CiB,EAAaF,GAA4C1B,EAC3Da,EAAUJ,EAAiBoB,CAAQ,EAYvC,OAXI9B,EAAU6B,CAAS,IAGjBlB,EAAmBG,CAAO,GAC5BrB,EAAA,SACE,sBAAsB,OAAOoC,CAAS,IACtC,sBAAsBV,EAAYU,CAAS,EAAE,sDAC/C,EAEF,EAAU,IAAA,IAEL,CACL,YACA,MAAO,CACL,GAAGJ,EACH,GAAGG,EACH,UAAWR,EAAeC,EAAeC,CAAS,CACpD,EACA,SAAUR,CACZ,CACF,CAEA,GAAId,EAAUC,CAAG,EAAG,CAClB,GAAId,EAAM,eAAeyB,CAAI,GAAKA,EAAK,OAASzB,EAAM,SAAU,CAC9D,GAAM,CAAE,WAAU,YAAW,GAAG4C,GAAiBnB,EAAK,MACtD,MAAO,CACL,UAAWA,EAAK,KAChB,MAAO,CACL,GAAGa,EACH,GAAGM,EACH,UAAWX,EAAeC,EAAeC,CAAS,CACpD,EACU,UACZ,CACF,CAiBA,OAhBInC,EAAM,eAAeyB,CAAI,GAEvBD,EAAmBC,CAAI,GACzBnB,EAAA,SACE,sBAAsB,OAAOQ,CAAG,IAChC,kCAAkCkB,EAAYlB,CAAG,EAAE,oJACrD,EAEK,OAELU,EAAmBC,CAAI,GACzBnB,EAAA,SACE,qBAAqB,OAAOQ,CAAG,IAC/B,0CAA0CkB,EAAYlB,CAAG,EAAE,yFAC7D,EAEK,KACT,CAEA,MAAO,CACL,UAAWA,EACX,MAAO,CACL,GAAGwB,EACH,UAAWJ,GAAiB,IAAA,EAC9B,EACA,SAAUX,EAAiBE,CAAI,CACjC,CACF,CAYA,SAAgBoB,EACd,EACA,EACA,EACA,EAC2B,CAC3B,IAAMC,EAAWV,EACfX,EACAY,EACAH,EACAK,CACF,EACA,GAAI,CAACO,EAAU,OAAO,KAEtB,GAAM,CAAE,YAAW,QAAO,YAAaA,EACvC,OAAOH,IAAa,IAAA,GAChB3C,EAAM,cAAc0C,EAAWZ,CAAK,EACpC9B,EAAM,cAAc0C,EAAWZ,EAAOa,CAAQ,CACpD"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { cn as e } from "./cn.mjs";
|
|
2
|
+
import { isElementOfType as t } from "./children.mjs";
|
|
3
|
+
import { warnOnce as n } from "./dev.mjs";
|
|
4
|
+
import * as r from "react";
|
|
5
|
+
//#region src/lib/slot.ts
|
|
6
|
+
var i = /* @__PURE__ */ new Set([
|
|
7
|
+
"area",
|
|
8
|
+
"base",
|
|
9
|
+
"br",
|
|
10
|
+
"col",
|
|
11
|
+
"embed",
|
|
12
|
+
"hr",
|
|
13
|
+
"img",
|
|
14
|
+
"input",
|
|
15
|
+
"link",
|
|
16
|
+
"meta",
|
|
17
|
+
"param",
|
|
18
|
+
"source",
|
|
19
|
+
"track",
|
|
20
|
+
"wbr"
|
|
21
|
+
]);
|
|
22
|
+
function a(e) {
|
|
23
|
+
let t = Object.getPrototypeOf(e);
|
|
24
|
+
return t === null || t === Object.prototype || Object.getPrototypeOf(t) === null;
|
|
25
|
+
}
|
|
26
|
+
function o(e) {
|
|
27
|
+
return typeof e != "object" || !e || r.isValidElement(e) || "$$typeof" in e || Symbol.iterator in e || typeof e.then == "function" ? !1 : a(e);
|
|
28
|
+
}
|
|
29
|
+
function s(e) {
|
|
30
|
+
return typeof e == "string" && i.has(e);
|
|
31
|
+
}
|
|
32
|
+
var c = /* @__PURE__ */ new WeakMap();
|
|
33
|
+
function l(e) {
|
|
34
|
+
if (Array.isArray(e) || !(Symbol.iterator in e)) return !1;
|
|
35
|
+
let t = e;
|
|
36
|
+
return t[Symbol.iterator]() === t;
|
|
37
|
+
}
|
|
38
|
+
function u(e, n, i) {
|
|
39
|
+
if (e == null || typeof e == "boolean" || e === "") return !1;
|
|
40
|
+
if (typeof e != "object") return !0;
|
|
41
|
+
if (r.isValidElement(e)) return !t(e, r.Fragment) || u(e.props.children, n, !0);
|
|
42
|
+
if (!(Symbol.iterator in e) || i && l(e)) return !0;
|
|
43
|
+
if (n.has(e)) return !1;
|
|
44
|
+
n.add(e);
|
|
45
|
+
try {
|
|
46
|
+
for (let t of m(e)) if (u(t, n, !0)) return !0;
|
|
47
|
+
return !1;
|
|
48
|
+
} finally {
|
|
49
|
+
n.delete(e);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function d(e) {
|
|
53
|
+
return u(e, /* @__PURE__ */ new Set(), !1);
|
|
54
|
+
}
|
|
55
|
+
function f(e) {
|
|
56
|
+
return m(e);
|
|
57
|
+
}
|
|
58
|
+
function p(e, t) {
|
|
59
|
+
return typeof e != "string" || i.has(e) ? !1 : t.dangerouslySetInnerHTML == null && !d(t.children);
|
|
60
|
+
}
|
|
61
|
+
function m(e) {
|
|
62
|
+
if (typeof e == "object" && e && l(e)) {
|
|
63
|
+
let t = e, n = c.get(t);
|
|
64
|
+
return n || (n = Array.from(t), c.set(t, n)), n;
|
|
65
|
+
}
|
|
66
|
+
return e;
|
|
67
|
+
}
|
|
68
|
+
function h(e) {
|
|
69
|
+
return typeof e == "string" ? `<${e}>` : "a void element";
|
|
70
|
+
}
|
|
71
|
+
function g(t, n) {
|
|
72
|
+
return e(t, n) || void 0;
|
|
73
|
+
}
|
|
74
|
+
function _(e, t, i, a) {
|
|
75
|
+
if (e == null || typeof e == "boolean") return null;
|
|
76
|
+
let c = t ?? "span", l = a ?? {};
|
|
77
|
+
if (o(e)) {
|
|
78
|
+
let { as: t, children: r, className: a, ...o } = e, u = t ?? c, f = m(r);
|
|
79
|
+
return s(u) && (d(f) && n(`slot:void-children:${String(u)}`, `A slot rendered as ${h(u)} cannot have children; its \`children\` were ignored.`), f = void 0), {
|
|
80
|
+
Component: u,
|
|
81
|
+
props: {
|
|
82
|
+
...l,
|
|
83
|
+
...o,
|
|
84
|
+
className: g(i, a)
|
|
85
|
+
},
|
|
86
|
+
children: f
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
if (s(c)) {
|
|
90
|
+
if (r.isValidElement(e) && e.type !== r.Fragment) {
|
|
91
|
+
let { children: t, className: n, ...r } = e.props;
|
|
92
|
+
return {
|
|
93
|
+
Component: e.type,
|
|
94
|
+
props: {
|
|
95
|
+
...l,
|
|
96
|
+
...r,
|
|
97
|
+
className: g(i, n)
|
|
98
|
+
},
|
|
99
|
+
children: t
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
return r.isValidElement(e) ? (d(e) && n(`slot:void-fragment:${String(c)}`, `A Fragment cannot stand in for ${h(c)} (a void element): it cannot take the slot's className or attributes. Pass the element itself or an object slot instead; the slot was not rendered.`), null) : (d(e) && n(`slot:void-content:${String(c)}`, `Slot content cannot be rendered inside ${h(c)} (a void element). Pass an element or an object slot instead; the slot was not rendered.`), null);
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
Component: c,
|
|
106
|
+
props: {
|
|
107
|
+
...l,
|
|
108
|
+
className: i || void 0
|
|
109
|
+
},
|
|
110
|
+
children: m(e)
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
function v(e, t, n, i) {
|
|
114
|
+
let a = _(e, t, n, i);
|
|
115
|
+
if (!a) return null;
|
|
116
|
+
let { Component: o, props: s, children: c } = a;
|
|
117
|
+
return c === void 0 ? r.createElement(o, s) : r.createElement(o, s, c);
|
|
118
|
+
}
|
|
119
|
+
//#endregion
|
|
120
|
+
export { i as VOID_ELEMENTS, f as materialiseSlotContent, v as renderSlot, _ as resolveSlot, d as slotRendersContent, p as slotWrapsDefaultContent };
|
|
121
|
+
|
|
122
|
+
//# sourceMappingURL=slot.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slot.mjs","names":["React","VOID_ELEMENTS","isPlainObject","proto","value","isSlotObject","isVoidTag","tag","materialisedIterators","isOneShotIterator","iterable","rendersContent","node","isElementOfType","visiting","nested","item","normaliseContent","slotRendersContent","slot","materialiseSlotContent","content","slotWrapsDefaultContent","type","props","cached","describeTag","mergeClassName","cn","baseClassName","className","resolveSlot","defaultAs","defaults","defaultProps","slotAs","rest","Component","children","warnOnce","elementProps","renderSlot","resolved"],"sources":["../../src/lib/slot.ts"],"sourcesContent":["import * as React from 'react';\nimport { isElementOfType } from './children';\nimport { cn } from './cn';\nimport { warnOnce } from './dev';\n\n/**\n * Object form of a Slot: full control over the rendered element.\n *\n * - `as` renders a different element or component than the slot's default (any element type).\n * - Every attribute of the default element `T` is accepted and forwarded (`{ src, alt }` for an\n * `'img'` slot, `aria-label`/`title`/handlers for a `'span'` slot), plus `data-*` attributes.\n * - `className` is merged after the component's base classes, so it wins conflicts.\n *\n * @typeParam T - The slot's default element type.\n */\nexport type SlotObject<T extends React.ElementType = 'span'> = {\n /** Render a different element or component instead of the slot's default. */\n as?: React.ElementType;\n /** Content to render inside the slot element (ignored for void elements such as `img`). */\n children?: React.ReactNode;\n /** Class name(s) merged after the component's base classes (yours win). */\n className?: string;\n /** Inline styles for the slot element. */\n style?: React.CSSProperties;\n /** Ref to the rendered slot element. */\n ref?: React.Ref<unknown>;\n /** Any `data-*` attribute. */\n [dataAttribute: `data-${string}`]: unknown;\n} & Omit<React.ComponentPropsWithoutRef<T>, 'children' | 'className' | 'style'>;\n\n/**\n * Slot definition — a customisable sub-element of a component. Accepts:\n *\n * - any `React.ReactNode` as shorthand content (string, number, bigint, element, promise, or any\n * iterable of nodes such as an array, a `Set` or a generator), rendered **inside** the slot's\n * default element; `null`, `undefined`, `false` and `true` render nothing;\n * - a {@link SlotObject} (`{ as, className, children, ...attributes }`) for full control.\n *\n * An attributes object typed by an interface (`React.ImgHTMLAttributes<…>`) has no implicit\n * `data-*` index signature, so it is not assignable as is: spread it into a literal,\n * `image={{ ...imgProps }}`.\n *\n * @typeParam T - The slot's default element type.\n */\nexport type Slot<T extends React.ElementType = 'span'> = SlotObject<T> | React.ReactNode;\n\n/** The normalized output of {@link resolveSlot}, ready for rendering. */\nexport interface ResolvedSlot {\n /** The element type to render (e.g., 'span', 'div', or a component). */\n Component: React.ElementType;\n /** Merged props including className and any extra HTML attributes. */\n props: Record<string, unknown>;\n /** The content to render inside the element. */\n children: React.ReactNode;\n}\n\n/**\n * HTML void elements: they can never have children. A slot whose default tag is one of these\n * renders a ReactElement slot as-is (instead of wrapping it) and never receives shorthand children.\n */\nexport const VOID_ELEMENTS: ReadonlySet<string> = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n]);\n\ntype UnknownProps = Record<string, unknown>;\n\nfunction isPlainObject(value: object): boolean {\n const proto: unknown = Object.getPrototypeOf(value);\n return proto === null || proto === Object.prototype || Object.getPrototypeOf(proto) === null;\n}\n\n/**\n * A slot object is a plain object that is not a React element, not a React internal object\n * (`$$typeof`: portals, lazy nodes), not an iterable (arrays, Sets, generators) and not a thenable.\n * Everything else is content and renders as children of the default element.\n */\nfunction isSlotObject(value: unknown): value is UnknownProps {\n if (typeof value !== 'object' || value === null) return false;\n if (React.isValidElement(value)) return false;\n if ('$$typeof' in value) return false;\n if (Symbol.iterator in value) return false;\n if (typeof (value as { then?: unknown }).then === 'function') return false;\n return isPlainObject(value);\n}\n\nfunction isVoidTag(tag: React.ElementType): boolean {\n return typeof tag === 'string' && VOID_ELEMENTS.has(tag);\n}\n\n/**\n * One-shot iterators (generators) are materialised into an array once and cached, so React never\n * enumerates a generator (it warns about that) and a second render of the same props (StrictMode)\n * sees the same items. Re-iterable collections (Set, custom iterables) are passed through.\n */\nconst materialisedIterators = new WeakMap<object, React.ReactNode[]>();\n\n/** Whether `value` is a one-shot iterator (a generator): iterating it returns itself. */\nfunction isOneShotIterator(value: object): boolean {\n if (Array.isArray(value) || !(Symbol.iterator in value)) return false;\n const iterable = value as Iterable<unknown>;\n return (iterable[Symbol.iterator]() as unknown) === iterable;\n}\n\n/**\n * Whether React would render anything for `node`: `null`, `undefined`, booleans and `''` render\n * nothing, and so does a Fragment, array or other iterable (Set, generator) whose content, at any\n * depth, is all of those. Dropping such content from a void element is silent (a conditional\n * `children: cond && x`, or a list mapped to nothing). A top-level generator is read through\n * {@link normaliseContent} (materialised once, so checking it does not consume it); a generator\n * nested in a collection or a Fragment is rendered by React as it is, so it is not read and counts\n * as content.\n */\nfunction rendersContent(node: unknown, visiting: Set<object>, nested: boolean): boolean {\n if (node === undefined || node === null || typeof node === 'boolean' || node === '') {\n return false;\n }\n if (typeof node !== 'object') return true;\n if (React.isValidElement(node)) {\n if (!isElementOfType<{ children?: React.ReactNode }>(node, React.Fragment)) return true;\n return rendersContent(node.props.children, visiting, true);\n }\n if (!(Symbol.iterator in node)) return true;\n if (nested && isOneShotIterator(node)) return true;\n // A collection that contains itself adds nothing beyond what is already being checked.\n if (visiting.has(node)) return false;\n visiting.add(node);\n try {\n for (const item of normaliseContent(node) as Iterable<unknown>) {\n if (rendersContent(item, visiting, true)) return true;\n }\n return false;\n } finally {\n visiting.delete(node);\n }\n}\n\n/**\n * Whether a slot value renders any content — the one \"renders nothing\" rule of the library, for\n * slots and any other content a component shows or leaves out (labels, titles, dismiss content).\n *\n * `false` for `null`, `undefined`, booleans and `''`, and for a Fragment, array, `Set`, generator\n * or other iterable whose content, at any depth, is only those (`<></>`, `[null, '']`,\n * `<>{false}</>`); a Fragment is recognised by its unwrapped type, also when it is a client\n * reference written in a Server Component. `true` for everything else: text, numbers (including\n * `0`), other React elements (the helper cannot know what a component renders), slot objects\n * (they always render their element), promises, and a generator nested in a collection or a\n * Fragment (not read, so React still renders its items).\n *\n * A top-level generator is materialised once and cached, so checking it does not consume it:\n * render the checked value through `renderSlot`/`resolveSlot`, or, when you render it yourself,\n * through {@link materialiseSlotContent}. Never warns. Call it during render: a client reference\n * whose code is still loading suspends the caller, as rendering it would.\n *\n * Components use it to fall back when a slot is effectively empty, e.g. Avatar shows the initials\n * unless `icon && slotRendersContent(icon)`.\n *\n * @param slot A slot value or any React node.\n */\nexport function slotRendersContent(slot: unknown): boolean {\n return rendersContent(slot, new Set(), false);\n}\n\n/**\n * The content to render for a value that {@link slotRendersContent} checked, for a component that\n * renders it itself rather than through `renderSlot`/`resolveSlot`: a top-level generator is\n * replaced by its materialised items (the same array on every call, so a second render sees the\n * same items and React never enumerates the generator); every other value is returned as given.\n *\n * @example\n * const hasAction = slotRendersContent(action);\n * return hasAction ? <span className=\"ms-auto\">{materialiseSlotContent(action)}</span> : null;\n *\n * @param content A slot value or any React node.\n */\nexport function materialiseSlotContent(content: unknown): React.ReactNode {\n return normaliseContent(content);\n}\n\n/**\n * Whether a slot object's element wraps the component's default content, the rule of the dismiss\n * and clear slots (Tag `dismissIcon`, MessageBar `dismiss`, SearchBox `dismiss`): a slot object\n * without content of its own (`{ className: 'text-error' }`) styles the default icon.\n *\n * `true` when the element is an intrinsic tag that can hold children (not a void tag such as\n * `img`), it sets no `dangerouslySetInnerHTML` and its `children` render nothing\n * ({@link slotRendersContent}). A component (an icon that draws its own glyph), a void tag and\n * markup of its own are the content themselves: `false`.\n *\n * @param type The element type the slot object renders (its `as`, else the slot's default tag).\n * @param props The slot object's props; `children` and `dangerouslySetInnerHTML` are read.\n */\nexport function slotWrapsDefaultContent(\n type: unknown,\n props: { children?: unknown; dangerouslySetInnerHTML?: unknown },\n): boolean {\n if (typeof type !== 'string' || VOID_ELEMENTS.has(type)) return false;\n return props.dangerouslySetInnerHTML == null && !slotRendersContent(props.children);\n}\n\nfunction normaliseContent(slot: unknown): React.ReactNode {\n if (typeof slot === 'object' && slot !== null && isOneShotIterator(slot)) {\n const iterable = slot as Iterable<React.ReactNode>;\n let cached = materialisedIterators.get(iterable);\n if (!cached) {\n cached = Array.from(iterable);\n materialisedIterators.set(iterable, cached);\n }\n return cached;\n }\n return slot as React.ReactNode;\n}\n\nfunction describeTag(tag: React.ElementType): string {\n return typeof tag === 'string' ? `<${tag}>` : 'a void element';\n}\n\n/** `cn(base, own)`, or `undefined` when there are no classes, so no empty `class=\"\"` renders. */\nfunction mergeClassName(baseClassName: string | undefined, className: unknown): string | undefined {\n return cn(baseClassName, className as string | undefined) || undefined;\n}\n\n/**\n * Resolves a Slot value into a `{ Component, props, children }` triple.\n *\n * - `null`, `undefined`, `false` and `true` resolve to `null` (render nothing).\n * - A slot object resolves to `Component = as ?? defaultAs`,\n * `props = { ...defaultProps, ...attributes, className: cn(baseClassName, className) }` and its\n * `children` (a generator materialised into an array once, as for shorthand content). When the\n * element is void its `children` are always dropped, with a development warning only if they\n * would have rendered (not for `null`, `undefined`, booleans or `''`, nor for a Fragment,\n * array, Set or generator made only of those, at any depth).\n * - With a **void** default tag (`area`, `base`, `br`, `col`, `embed`, `hr`, `img`, `input`,\n * `link`, `meta`, `param`, `source`, `track`, `wbr`) a ReactElement slot resolves to the\n * element itself (its type and props, `defaultProps` underneath, className merged). A Fragment\n * and shorthand content resolve to `null` with a development warning (none for content that\n * renders nothing) — the component decides what a string means (Avatar treats it as `src`).\n * - Any other value (string, number, element, array, Set, generator, promise) becomes the children\n * of `defaultAs` with `{ ...defaultProps, className: baseClassName }`.\n * - `props.className` is `undefined` (never `''`) when there are no classes, so no empty `class`\n * attribute renders; it always replaces a `className` in `defaultProps`.\n *\n * @param slot The slot value from component props.\n * @param defaultAs The default element type (e.g., 'span', 'div'). Defaults to 'span'.\n * @param baseClassName Base classes; the slot's own className is merged after them and wins.\n * @param defaultProps Default attributes (e.g. `{ 'aria-hidden': true }` for icon slots) that\n * the slot's own props override.\n */\nexport function resolveSlot<T extends React.ElementType = 'span'>(\n slot: Slot<T> | undefined | null,\n defaultAs?: T,\n baseClassName?: string,\n defaultProps?: Record<string, unknown>,\n): ResolvedSlot | null {\n if (slot === null || slot === undefined || typeof slot === 'boolean') {\n return null;\n }\n\n const tag: React.ElementType = defaultAs ?? 'span';\n const defaults: UnknownProps = defaultProps ?? {};\n\n if (isSlotObject(slot)) {\n const { as: slotAs, children, className, ...rest } = slot;\n const Component = (slotAs as React.ElementType | undefined) ?? tag;\n let content = normaliseContent(children);\n if (isVoidTag(Component)) {\n // A void element never receives children (React throws for any non-null value, even\n // `false` or `[]`); warn only when the dropped children would have rendered something.\n if (slotRendersContent(content)) {\n warnOnce(\n `slot:void-children:${String(Component)}`,\n `A slot rendered as ${describeTag(Component)} cannot have children; its \\`children\\` were ignored.`,\n );\n }\n content = undefined;\n }\n return {\n Component,\n props: {\n ...defaults,\n ...rest,\n className: mergeClassName(baseClassName, className),\n },\n children: content,\n };\n }\n\n if (isVoidTag(tag)) {\n if (React.isValidElement(slot) && slot.type !== React.Fragment) {\n const { children, className, ...elementProps } = slot.props as UnknownProps;\n return {\n Component: slot.type as React.ElementType,\n props: {\n ...defaults,\n ...elementProps,\n className: mergeClassName(baseClassName, className),\n },\n children: children as React.ReactNode,\n };\n }\n if (React.isValidElement(slot)) {\n // An empty Fragment (`<></>`) renders nothing: an empty slot, no warning.\n if (slotRendersContent(slot)) {\n warnOnce(\n `slot:void-fragment:${String(tag)}`,\n `A Fragment cannot stand in for ${describeTag(tag)} (a void element): it cannot take the slot's className or attributes. Pass the element itself or an object slot instead; the slot was not rendered.`,\n );\n }\n return null;\n }\n if (slotRendersContent(slot)) {\n warnOnce(\n `slot:void-content:${String(tag)}`,\n `Slot content cannot be rendered inside ${describeTag(tag)} (a void element). Pass an element or an object slot instead; the slot was not rendered.`,\n );\n }\n return null;\n }\n\n return {\n Component: tag,\n props: {\n ...defaults,\n className: baseClassName || undefined,\n },\n children: normaliseContent(slot),\n };\n}\n\n/**\n * Renders a slot (see {@link resolveSlot} for the rules). Returns `null` when the slot is empty.\n *\n * @param slot The slot value from component props.\n * @param defaultAs The default element type (e.g., 'span', 'div'). Defaults to 'span'.\n * @param baseClassName Base classes; the slot's own className is merged after them and wins.\n * @param defaultProps Default attributes that the slot's own props override, e.g.\n * `renderSlot(icon, 'span', 'shrink-0', { 'aria-hidden': true })`.\n * @returns A React element, or `null` if the slot is empty.\n */\nexport function renderSlot<T extends React.ElementType = 'span'>(\n slot: Slot<T> | undefined | null,\n defaultAs?: React.ElementType,\n baseClassName?: string,\n defaultProps?: Record<string, unknown>,\n): React.ReactElement | null {\n const resolved = resolveSlot<React.ElementType>(\n slot as Slot<React.ElementType>,\n defaultAs,\n baseClassName,\n defaultProps,\n );\n if (!resolved) return null;\n\n const { Component, props, children } = resolved;\n return children === undefined\n ? React.createElement(Component, props)\n : React.createElement(Component, props, children);\n}\n"],"mappings":";;;;;AA4DA,IAAaC,oBAAqC,IAAI,IAAI;CACxD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAID,SAASC,EAAc,GAAwB;CAC7C,IAAMC,IAAiB,OAAO,eAAeC,CAAK;CAClD,OAAOD,MAAU,QAAQA,MAAU,OAAO,aAAa,OAAO,eAAeA,CAAK,MAAM;AAC1F;AAOA,SAASE,EAAa,GAAuC;CAM3D,OALI,OAAOD,KAAU,aAAYA,KAC7BJ,EAAM,eAAeI,CAAK,KAC1B,cAAcA,KACd,OAAO,YAAYA,KACnB,OAAQA,EAA6B,QAAS,aAAmB,KAC9DF,EAAcE,CAAK;AAC5B;AAEA,SAASE,EAAU,GAAiC;CAClD,OAAO,OAAOC,KAAQ,YAAYN,EAAc,IAAIM,CAAG;AACzD;AAOA,IAAMC,oBAAwB,IAAI,QAAmC;AAGrE,SAASC,EAAkB,GAAwB;CACjD,IAAI,MAAM,QAAQL,CAAK,KAAK,EAAE,OAAO,YAAYA,IAAQ,OAAO;CAChE,IAAMM,IAAWN;CACjB,OAAQM,EAAS,OAAO,SAAS,CAAC,MAAkBA;AACtD;AAWA,SAASC,EAAe,GAAe,GAAuB,GAA0B;CACtF,IAAIC,KAA+B,QAAQ,OAAOA,KAAS,aAAaA,MAAS,IAC/E,OAAO;CAET,IAAI,OAAOA,KAAS,UAAU,OAAO;CACrC,IAAIZ,EAAM,eAAeY,CAAI,GAE3B,OADA,CAAKC,EAAgDD,GAAMZ,EAAM,QAAQ,KAClEW,EAAeC,EAAK,MAAM,UAAUE,GAAU,EAAI;CAG3D,IADI,EAAE,OAAO,YAAYF,MACrBG,KAAUN,EAAkBG,CAAI,GAAG,OAAO;CAE9C,IAAIE,EAAS,IAAIF,CAAI,GAAG,OAAO;CAC/B,EAAS,IAAIA,CAAI;CACjB,IAAI;EACF,KAAK,IAAMI,KAAQC,EAAiBL,CAAI,GACtC,IAAID,EAAeK,GAAMF,GAAU,EAAI,GAAG,OAAO;EAEnD,OAAO;CACT,UAAU;EACR,EAAS,OAAOF,CAAI;CACtB;AACF;AAwBA,SAAgBM,EAAmB,GAAwB;CACzD,OAAOP,EAAeQ,mBAAM,IAAI,IAAI,GAAG,EAAK;AAC9C;AAcA,SAAgBC,EAAuB,GAAmC;CACxE,OAAOH,EAAiBI,CAAO;AACjC;AAeA,SAAgBC,EACd,GACA,GACS;CAET,OADI,OAAOC,KAAS,YAAYtB,EAAc,IAAIsB,CAAI,IAAU,KACzDC,EAAM,2BAA2B,QAAQ,CAACN,EAAmBM,EAAM,QAAQ;AACpF;AAEA,SAASP,EAAiB,GAAgC;CACxD,IAAI,OAAOE,KAAS,YAAYA,KAAiBV,EAAkBU,CAAI,GAAG;EACxE,IAAMT,IAAWS,GACbM,IAASjB,EAAsB,IAAIE,CAAQ;EAK/C,OAJKe,MACH,IAAS,MAAM,KAAKf,CAAQ,GAC5BF,EAAsB,IAAIE,GAAUe,CAAM,IAErCA;CACT;CACA,OAAON;AACT;AAEA,SAASO,EAAY,GAAgC;CACnD,OAAO,OAAOnB,KAAQ,WAAW,IAAIA,EAAI,KAAK;AAChD;AAGA,SAASoB,EAAe,GAAmC,GAAwC;CACjG,OAAOC,EAAGC,GAAeC,CAA+B,KAAK,KAAA;AAC/D;AA4BA,SAAgBC,EACd,GACA,GACA,GACA,GACqB;CACrB,IAAIZ,KAAS,QAA8B,OAAOA,KAAS,WACzD,OAAO;CAGT,IAAMZ,IAAyByB,KAAa,QACtCC,IAAyBC,KAAgB,CAAC;CAEhD,IAAI7B,EAAac,CAAI,GAAG;EACtB,IAAM,EAAE,IAAIgB,GAAQ,aAAU,cAAW,GAAGC,MAASjB,GAC/CkB,IAAaF,KAA4C5B,GAC3Dc,IAAUJ,EAAiBqB,CAAQ;EAYvC,OAXIhC,EAAU+B,CAAS,MAGjBnB,EAAmBG,CAAO,KAC5BkB,EACE,sBAAsB,OAAOF,CAAS,KACtC,sBAAsBX,EAAYW,CAAS,EAAE,sDAC/C,GAEF,IAAU,KAAA,IAEL;GACL;GACA,OAAO;IACL,GAAGJ;IACH,GAAGG;IACH,WAAWT,EAAeE,GAAeC,CAAS;GACpD;GACA,UAAUT;EACZ;CACF;CAEA,IAAIf,EAAUC,CAAG,GAAG;EAClB,IAAIP,EAAM,eAAemB,CAAI,KAAKA,EAAK,SAASnB,EAAM,UAAU;GAC9D,IAAM,EAAE,aAAU,cAAW,GAAGwC,MAAiBrB,EAAK;GACtD,OAAO;IACL,WAAWA,EAAK;IAChB,OAAO;KACL,GAAGc;KACH,GAAGO;KACH,WAAWb,EAAeE,GAAeC,CAAS;IACpD;IACU;GACZ;EACF;EAiBA,OAhBI9B,EAAM,eAAemB,CAAI,KAEvBD,EAAmBC,CAAI,KACzBoB,EACE,sBAAsB,OAAOhC,CAAG,KAChC,kCAAkCmB,EAAYnB,CAAG,EAAE,oJACrD,GAEK,SAELW,EAAmBC,CAAI,KACzBoB,EACE,qBAAqB,OAAOhC,CAAG,KAC/B,0CAA0CmB,EAAYnB,CAAG,EAAE,yFAC7D,GAEK;CACT;CAEA,OAAO;EACL,WAAWA;EACX,OAAO;GACL,GAAG0B;GACH,WAAWJ,KAAiB,KAAA;EAC9B;EACA,UAAUZ,EAAiBE,CAAI;CACjC;AACF;AAYA,SAAgBsB,EACd,GACA,GACA,GACA,GAC2B;CAC3B,IAAMC,IAAWX,EACfZ,GACAa,GACAH,GACAK,CACF;CACA,IAAI,CAACQ,GAAU,OAAO;CAEtB,IAAM,EAAE,cAAW,UAAO,gBAAaA;CACvC,OAAOJ,MAAa,KAAA,IAChBtC,EAAM,cAAcqC,GAAWb,CAAK,IACpCxB,EAAM,cAAcqC,GAAWb,GAAOc,CAAQ;AACpD"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e=`focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring`,t=`focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-ring`,n=`h-8 w-full rounded border border-input bg-background px-3 text-body-1 text-foreground placeholder:text-muted-foreground`,r=`focus:outline-hidden focus:border-b-2 focus:border-b-primary`,i=`focus-within:border-b-2 focus-within:border-b-primary`,a=`border-destructive focus:border-b-destructive`,o=`border-destructive focus-within:border-b-destructive`,s=`disabled:cursor-not-allowed disabled:opacity-50 aria-disabled:cursor-not-allowed aria-disabled:opacity-50 aria-disabled:focus-visible:opacity-100`,c=`transition motion-reduce:transition-none`,l=`forced-colors:bg-[Highlight] forced-colors:text-[HighlightText] forced-colors:forced-color-adjust-none`,u={selectedLeaf:l,selectedContainer:`forced-colors:outline-2 forced-colors:outline-[Highlight] forced-colors:-outline-offset-2`,control:`forced-colors:border-[ButtonText]`,border:`forced-colors:border-[CanvasText]`,fill:`forced-colors:bg-[Highlight] forced-colors:forced-color-adjust-none`,rangeInput:`forced-colors:forced-color-adjust-none forced-colors:[&::-webkit-slider-runnable-track]:bg-[CanvasText] forced-colors:[&::-moz-range-track]:bg-[CanvasText] forced-colors:[&::-webkit-slider-thumb]:bg-[Highlight] forced-colors:[&::-webkit-slider-thumb]:border-[Canvas] forced-colors:[&::-moz-range-thumb]:bg-[Highlight] forced-colors:[&::-moz-range-thumb]:border-[Canvas] forced-colors:disabled:[&::-webkit-slider-runnable-track]:bg-[GrayText] forced-colors:disabled:[&::-moz-range-track]:bg-[GrayText] forced-colors:disabled:[&::-webkit-slider-thumb]:bg-[GrayText] forced-colors:disabled:[&::-moz-range-thumb]:bg-[GrayText] forced-colors:focus-visible:outline-[Highlight]`,ringArc:`forced-colors:forced-color-adjust-none forced-colors:border-[Canvas] forced-colors:border-t-[Highlight]`,disabled:`forced-colors:text-[GrayText] forced-colors:border-[GrayText]`,selected:l};exports.disabledStyles=s,exports.focusRing=e,exports.focusRingInset=t,exports.forcedColors=u,exports.inputBase=n,exports.inputFocus=r,exports.inputFocusWithin=i,exports.inputInvalid=a,exports.inputInvalidWithin=o,exports.motionSafeTransition=c;
|
|
2
|
+
//# sourceMappingURL=styles.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.cjs","names":["focusRing","focusRingInset","inputBase","inputFocus","inputFocusWithin","inputInvalid","inputInvalidWithin","disabledStyles","motionSafeTransition","selectedLeaf","forcedColors"],"sources":["../../src/lib/styles.ts"],"sourcesContent":["/**\n * Shared class-string recipes. They are plain literals so Tailwind's scanner (`@source ../lib`)\n * generates every utility; compose them with `cn()` before the consumer's `className`.\n */\n\n/** Focus-visible ring for focusable controls (C-FOCUS). */\nexport const focusRing =\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring';\n\n/** Focus-visible ring drawn inside the element: cells, rows, list and menu items. */\nexport const focusRingInset =\n 'focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-ring';\n\n/** Ring on a container while any descendant has focus. */\nexport const focusWithinRing =\n 'focus-within:outline-2 focus-within:outline-offset-2 focus-within:outline-ring';\n\n/** Base look of text-entry controls (Input, Textarea, Select, picker inputs). */\nexport const inputBase =\n 'h-8 w-full rounded border border-input bg-background px-3 text-body-1 text-foreground placeholder:text-muted-foreground';\n\n/**\n * Focus indicator of text-entry controls: a 2px primary bottom border. `focus:outline-hidden`\n * removes the outline while focused but — unlike `outline-none` — keeps a visible outline in\n * forced-colors mode, where the border colour change is not perceivable. (Scoped to `:focus` so\n * unfocused inputs do not show that outline in forced colors.)\n */\nexport const inputFocus = 'focus:outline-hidden focus:border-b-2 focus:border-b-primary';\n\n/**\n * Wrapper form of {@link inputFocus} for inputs rendered inside a styled wrapper (slots,\n * SearchBox, TagPicker). Put `focus:outline-hidden` on the inner control.\n */\nexport const inputFocusWithin = 'focus-within:border-b-2 focus-within:border-b-primary';\n\n/**\n * Invalid look of a text-entry control (Input, Select, Textarea, SearchBox, SpinButton, Combobox,\n * Dropdown, the picker inputs): the destructive border, kept on the bottom stroke while focused.\n * Apply it when the control's resolved `aria-invalid` is `true` (its own error state, the\n * consumer's `aria-invalid` or the surrounding Field's), after {@link inputBase} and\n * {@link inputFocus} in `cn()` so it replaces their border colours.\n */\nexport const inputInvalid = 'border-destructive focus:border-b-destructive';\n\n/**\n * Wrapper form of {@link inputInvalid} for a control drawn by a styled wrapper around the\n * focusable input (Input with slots, SpinButton), placed after {@link inputFocusWithin}.\n */\nexport const inputInvalidWithin = 'border-destructive focus-within:border-b-destructive';\n\n/**\n * Disabled look for native `disabled` and `aria-disabled` (C-DISABLED) controls. An\n * `aria-disabled` control that keeps keyboard focus (a self-disabling Pagination or Carousel\n * button) goes back to full opacity while it shows its focus ring, which `opacity` would dim below\n * 3:1, as a `disabledFocusable` button does.\n */\nexport const disabledStyles =\n 'disabled:cursor-not-allowed disabled:opacity-50 aria-disabled:cursor-not-allowed aria-disabled:opacity-50 aria-disabled:focus-visible:opacity-100';\n\n/** Colour-transition recipe that is switched off for reduced motion (C-MOTION). */\nexport const motionSafeTransition = 'transition motion-reduce:transition-none';\n\nconst selectedLeaf =\n 'forced-colors:bg-[Highlight] forced-colors:text-[HighlightText] forced-colors:forced-color-adjust-none';\n\n/**\n * Forced-colors (Windows High Contrast) recipes, built from system colours.\n */\nexport const forcedColors = {\n /**\n * Selected/checked state of a **leaf indicator** — Switch thumb, check glyph, radio dot,\n * progress fill, selected day cell. Opts the element out of forced colours so the Highlight\n * fill shows. Never use it on containers: `forced-color-adjust` is inherited and would opt\n * every descendant (text, icons) of a row/option/card out of forced colours too.\n */\n selectedLeaf,\n /**\n * Selected state of a **container** — options, rows, cards, tabs. A Highlight outline as the\n * non-colour indicator; the browser keeps system colours for the content.\n */\n selectedContainer:\n 'forced-colors:outline-2 forced-colors:outline-[Highlight] forced-colors:-outline-offset-2',\n /** Border of a control (Switch track, Checkbox box, Radio circle). */\n control: 'forced-colors:border-[ButtonText]',\n /** Border of a non-interactive surface (tracks, separators). */\n border: 'forced-colors:border-[CanvasText]',\n /**\n * Fill of a **leaf indicator drawn with its own background** that must stay visible in forced\n * colors, where author backgrounds become Canvas: a step dot or connector, a pager dot, a\n * progress segment. Paints `Highlight` and opts the element out of forced colors\n * (`forced-color-adjust` is inherited: leaf elements only, as with `selectedLeaf`).\n *\n * It only colors the element's own background, so it cannot reach an indicator drawn by a\n * pseudo-element or a border: use `rangeInput` for a native range input (Slider) and `ringArc`\n * for a border-drawn ring (Spinner).\n */\n fill: 'forced-colors:bg-[Highlight] forced-colors:forced-color-adjust-none',\n /**\n * A native `<input type=\"range\">` drawn through its track and thumb pseudo-elements (Slider):\n * put it on the input, after the normal-mode classes. It opts the input out of forced colors\n * and, because the pseudo-elements inherit that opt-out, gives every part the input paints a\n * system color: the rail `CanvasText`, the thumb `Highlight` with a `Canvas` edge, rail and\n * thumb `GrayText` while disabled, and the focus-visible outline `Highlight` (the opt-out would\n * otherwise keep the author ring color). Covers the Blink/WebKit (`::-webkit-slider-*`) and\n * Firefox (`::-moz-range-*`) parts.\n */\n rangeInput:\n 'forced-colors:forced-color-adjust-none forced-colors:[&::-webkit-slider-runnable-track]:bg-[CanvasText] forced-colors:[&::-moz-range-track]:bg-[CanvasText] forced-colors:[&::-webkit-slider-thumb]:bg-[Highlight] forced-colors:[&::-webkit-slider-thumb]:border-[Canvas] forced-colors:[&::-moz-range-thumb]:bg-[Highlight] forced-colors:[&::-moz-range-thumb]:border-[Canvas] forced-colors:disabled:[&::-webkit-slider-runnable-track]:bg-[GrayText] forced-colors:disabled:[&::-moz-range-track]:bg-[GrayText] forced-colors:disabled:[&::-webkit-slider-thumb]:bg-[GrayText] forced-colors:disabled:[&::-moz-range-thumb]:bg-[GrayText] forced-colors:focus-visible:outline-[Highlight]',\n /**\n * Arc of a **ring drawn with borders** whose top side is the arc (Spinner): put it on the ring,\n * after its border classes. Forced colors would give all four sides the same system color, so\n * the arc would disappear into the track. It opts the ring out of forced colors, hides the\n * track in `Canvas` and draws the arc in `Highlight`. Leaf elements only, as with `fill`.\n */\n ringArc:\n 'forced-colors:forced-color-adjust-none forced-colors:border-[Canvas] forced-colors:border-t-[Highlight]',\n /** Disabled text and borders. */\n disabled: 'forced-colors:text-[GrayText] forced-colors:border-[GrayText]',\n /**\n * @deprecated Ambiguous: use `selectedLeaf` for leaf indicators or `selectedContainer` for\n * containers. Kept as an alias of `selectedLeaf`.\n */\n selected: selectedLeaf,\n} as const;\n"],"mappings":"AAMA,IAAaA,EACX,oFAGWC,EACX,qFAOWC,EACX,0HAQWC,EAAa,+DAMbC,EAAmB,wDASnBC,EAAe,gDAMfC,EAAqB,uDAQrBC,EACX,oJAGWC,EAAuB,2CAE9BC,EACJ,yGAKWC,EAAe,CAO1B,eAKA,kBACE,4FAEF,QAAS,oCAET,OAAQ,oCAWR,KAAM,sEAUN,WACE,iqBAOF,QACE,0GAEF,SAAU,gEAKV,SAAUD,CACZ"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
//#region src/lib/styles.ts
|
|
2
|
+
var e = "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring", t = "focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-ring", n = "h-8 w-full rounded border border-input bg-background px-3 text-body-1 text-foreground placeholder:text-muted-foreground", r = "focus:outline-hidden focus:border-b-2 focus:border-b-primary", i = "focus-within:border-b-2 focus-within:border-b-primary", a = "border-destructive focus:border-b-destructive", o = "border-destructive focus-within:border-b-destructive", s = "disabled:cursor-not-allowed disabled:opacity-50 aria-disabled:cursor-not-allowed aria-disabled:opacity-50 aria-disabled:focus-visible:opacity-100", c = "transition motion-reduce:transition-none", l = "forced-colors:bg-[Highlight] forced-colors:text-[HighlightText] forced-colors:forced-color-adjust-none", u = {
|
|
3
|
+
selectedLeaf: l,
|
|
4
|
+
selectedContainer: "forced-colors:outline-2 forced-colors:outline-[Highlight] forced-colors:-outline-offset-2",
|
|
5
|
+
control: "forced-colors:border-[ButtonText]",
|
|
6
|
+
border: "forced-colors:border-[CanvasText]",
|
|
7
|
+
fill: "forced-colors:bg-[Highlight] forced-colors:forced-color-adjust-none",
|
|
8
|
+
rangeInput: "forced-colors:forced-color-adjust-none forced-colors:[&::-webkit-slider-runnable-track]:bg-[CanvasText] forced-colors:[&::-moz-range-track]:bg-[CanvasText] forced-colors:[&::-webkit-slider-thumb]:bg-[Highlight] forced-colors:[&::-webkit-slider-thumb]:border-[Canvas] forced-colors:[&::-moz-range-thumb]:bg-[Highlight] forced-colors:[&::-moz-range-thumb]:border-[Canvas] forced-colors:disabled:[&::-webkit-slider-runnable-track]:bg-[GrayText] forced-colors:disabled:[&::-moz-range-track]:bg-[GrayText] forced-colors:disabled:[&::-webkit-slider-thumb]:bg-[GrayText] forced-colors:disabled:[&::-moz-range-thumb]:bg-[GrayText] forced-colors:focus-visible:outline-[Highlight]",
|
|
9
|
+
ringArc: "forced-colors:forced-color-adjust-none forced-colors:border-[Canvas] forced-colors:border-t-[Highlight]",
|
|
10
|
+
disabled: "forced-colors:text-[GrayText] forced-colors:border-[GrayText]",
|
|
11
|
+
selected: l
|
|
12
|
+
};
|
|
13
|
+
//#endregion
|
|
14
|
+
export { s as disabledStyles, e as focusRing, t as focusRingInset, u as forcedColors, n as inputBase, r as inputFocus, i as inputFocusWithin, a as inputInvalid, o as inputInvalidWithin, c as motionSafeTransition };
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=styles.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.mjs","names":["focusRing","focusRingInset","inputBase","inputFocus","inputFocusWithin","inputInvalid","inputInvalidWithin","disabledStyles","motionSafeTransition","selectedLeaf","forcedColors"],"sources":["../../src/lib/styles.ts"],"sourcesContent":["/**\n * Shared class-string recipes. They are plain literals so Tailwind's scanner (`@source ../lib`)\n * generates every utility; compose them with `cn()` before the consumer's `className`.\n */\n\n/** Focus-visible ring for focusable controls (C-FOCUS). */\nexport const focusRing =\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring';\n\n/** Focus-visible ring drawn inside the element: cells, rows, list and menu items. */\nexport const focusRingInset =\n 'focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-ring';\n\n/** Ring on a container while any descendant has focus. */\nexport const focusWithinRing =\n 'focus-within:outline-2 focus-within:outline-offset-2 focus-within:outline-ring';\n\n/** Base look of text-entry controls (Input, Textarea, Select, picker inputs). */\nexport const inputBase =\n 'h-8 w-full rounded border border-input bg-background px-3 text-body-1 text-foreground placeholder:text-muted-foreground';\n\n/**\n * Focus indicator of text-entry controls: a 2px primary bottom border. `focus:outline-hidden`\n * removes the outline while focused but — unlike `outline-none` — keeps a visible outline in\n * forced-colors mode, where the border colour change is not perceivable. (Scoped to `:focus` so\n * unfocused inputs do not show that outline in forced colors.)\n */\nexport const inputFocus = 'focus:outline-hidden focus:border-b-2 focus:border-b-primary';\n\n/**\n * Wrapper form of {@link inputFocus} for inputs rendered inside a styled wrapper (slots,\n * SearchBox, TagPicker). Put `focus:outline-hidden` on the inner control.\n */\nexport const inputFocusWithin = 'focus-within:border-b-2 focus-within:border-b-primary';\n\n/**\n * Invalid look of a text-entry control (Input, Select, Textarea, SearchBox, SpinButton, Combobox,\n * Dropdown, the picker inputs): the destructive border, kept on the bottom stroke while focused.\n * Apply it when the control's resolved `aria-invalid` is `true` (its own error state, the\n * consumer's `aria-invalid` or the surrounding Field's), after {@link inputBase} and\n * {@link inputFocus} in `cn()` so it replaces their border colours.\n */\nexport const inputInvalid = 'border-destructive focus:border-b-destructive';\n\n/**\n * Wrapper form of {@link inputInvalid} for a control drawn by a styled wrapper around the\n * focusable input (Input with slots, SpinButton), placed after {@link inputFocusWithin}.\n */\nexport const inputInvalidWithin = 'border-destructive focus-within:border-b-destructive';\n\n/**\n * Disabled look for native `disabled` and `aria-disabled` (C-DISABLED) controls. An\n * `aria-disabled` control that keeps keyboard focus (a self-disabling Pagination or Carousel\n * button) goes back to full opacity while it shows its focus ring, which `opacity` would dim below\n * 3:1, as a `disabledFocusable` button does.\n */\nexport const disabledStyles =\n 'disabled:cursor-not-allowed disabled:opacity-50 aria-disabled:cursor-not-allowed aria-disabled:opacity-50 aria-disabled:focus-visible:opacity-100';\n\n/** Colour-transition recipe that is switched off for reduced motion (C-MOTION). */\nexport const motionSafeTransition = 'transition motion-reduce:transition-none';\n\nconst selectedLeaf =\n 'forced-colors:bg-[Highlight] forced-colors:text-[HighlightText] forced-colors:forced-color-adjust-none';\n\n/**\n * Forced-colors (Windows High Contrast) recipes, built from system colours.\n */\nexport const forcedColors = {\n /**\n * Selected/checked state of a **leaf indicator** — Switch thumb, check glyph, radio dot,\n * progress fill, selected day cell. Opts the element out of forced colours so the Highlight\n * fill shows. Never use it on containers: `forced-color-adjust` is inherited and would opt\n * every descendant (text, icons) of a row/option/card out of forced colours too.\n */\n selectedLeaf,\n /**\n * Selected state of a **container** — options, rows, cards, tabs. A Highlight outline as the\n * non-colour indicator; the browser keeps system colours for the content.\n */\n selectedContainer:\n 'forced-colors:outline-2 forced-colors:outline-[Highlight] forced-colors:-outline-offset-2',\n /** Border of a control (Switch track, Checkbox box, Radio circle). */\n control: 'forced-colors:border-[ButtonText]',\n /** Border of a non-interactive surface (tracks, separators). */\n border: 'forced-colors:border-[CanvasText]',\n /**\n * Fill of a **leaf indicator drawn with its own background** that must stay visible in forced\n * colors, where author backgrounds become Canvas: a step dot or connector, a pager dot, a\n * progress segment. Paints `Highlight` and opts the element out of forced colors\n * (`forced-color-adjust` is inherited: leaf elements only, as with `selectedLeaf`).\n *\n * It only colors the element's own background, so it cannot reach an indicator drawn by a\n * pseudo-element or a border: use `rangeInput` for a native range input (Slider) and `ringArc`\n * for a border-drawn ring (Spinner).\n */\n fill: 'forced-colors:bg-[Highlight] forced-colors:forced-color-adjust-none',\n /**\n * A native `<input type=\"range\">` drawn through its track and thumb pseudo-elements (Slider):\n * put it on the input, after the normal-mode classes. It opts the input out of forced colors\n * and, because the pseudo-elements inherit that opt-out, gives every part the input paints a\n * system color: the rail `CanvasText`, the thumb `Highlight` with a `Canvas` edge, rail and\n * thumb `GrayText` while disabled, and the focus-visible outline `Highlight` (the opt-out would\n * otherwise keep the author ring color). Covers the Blink/WebKit (`::-webkit-slider-*`) and\n * Firefox (`::-moz-range-*`) parts.\n */\n rangeInput:\n 'forced-colors:forced-color-adjust-none forced-colors:[&::-webkit-slider-runnable-track]:bg-[CanvasText] forced-colors:[&::-moz-range-track]:bg-[CanvasText] forced-colors:[&::-webkit-slider-thumb]:bg-[Highlight] forced-colors:[&::-webkit-slider-thumb]:border-[Canvas] forced-colors:[&::-moz-range-thumb]:bg-[Highlight] forced-colors:[&::-moz-range-thumb]:border-[Canvas] forced-colors:disabled:[&::-webkit-slider-runnable-track]:bg-[GrayText] forced-colors:disabled:[&::-moz-range-track]:bg-[GrayText] forced-colors:disabled:[&::-webkit-slider-thumb]:bg-[GrayText] forced-colors:disabled:[&::-moz-range-thumb]:bg-[GrayText] forced-colors:focus-visible:outline-[Highlight]',\n /**\n * Arc of a **ring drawn with borders** whose top side is the arc (Spinner): put it on the ring,\n * after its border classes. Forced colors would give all four sides the same system color, so\n * the arc would disappear into the track. It opts the ring out of forced colors, hides the\n * track in `Canvas` and draws the arc in `Highlight`. Leaf elements only, as with `fill`.\n */\n ringArc:\n 'forced-colors:forced-color-adjust-none forced-colors:border-[Canvas] forced-colors:border-t-[Highlight]',\n /** Disabled text and borders. */\n disabled: 'forced-colors:text-[GrayText] forced-colors:border-[GrayText]',\n /**\n * @deprecated Ambiguous: use `selectedLeaf` for leaf indicators or `selectedContainer` for\n * containers. Kept as an alias of `selectedLeaf`.\n */\n selected: selectedLeaf,\n} as const;\n"],"mappings":";AAMA,IAAaA,IACX,qFAGWC,IACX,sFAOWC,IACX,2HAQWC,IAAa,gEAMbC,IAAmB,yDASnBC,IAAe,iDAMfC,IAAqB,wDAQrBC,IACX,qJAGWC,IAAuB,4CAE9BC,IACJ,0GAKWC,IAAe;CAO1B;CAKA,mBACE;CAEF,SAAS;CAET,QAAQ;CAWR,MAAM;CAUN,YACE;CAOF,SACE;CAEF,UAAU;CAKV,UAAUD;AACZ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e={light:`wave-light`,dark:`wave-dark dark`,"high-contrast":`wave-high-contrast high-contrast`},t=Object.keys(e);function n(t){return typeof t==`string`&&Object.hasOwn(e,t)}function r(t){return n(t)?e[t]:e.light}exports.WAVE_THEMES=t,exports.getThemeClassName=r,exports.isWaveTheme=n;
|
|
2
|
+
//# sourceMappingURL=theme.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.cjs","names":["themeClassMap","WAVE_THEMES","isWaveTheme","theme","getThemeClassName"],"sources":["../../src/lib/theme.ts"],"sourcesContent":["/**\n * Theme names and theme classes. A server-safe module (the build puts `\"use client\"` only on\n * component and hook modules), so a React Server Component can call {@link getThemeClassName},\n * e.g. `<html className={getThemeClassName('dark')}>` in a Next.js `app/layout.tsx`.\n * `WaveProvider` re-exports both.\n */\n\n/** Supported visual themes for the Wave design system. */\nexport type WaveTheme = 'light' | 'dark' | 'high-contrast';\n\nconst themeClassMap: Record<WaveTheme, string> = {\n light: 'wave-light',\n // The legacy `dark` / `high-contrast` classes stay emitted (deprecated) for consumers' `dark:`\n // variants and 0.4 selectors.\n dark: 'wave-dark dark',\n 'high-contrast': 'wave-high-contrast high-contrast',\n};\n\n/** Every {@link WaveTheme}, in declaration order. */\nexport const WAVE_THEMES = Object.keys(themeClassMap) as readonly WaveTheme[];\n\n/** Whether `theme` is a {@link WaveTheme} (untyped callers can pass anything). */\nexport function isWaveTheme(theme: unknown): theme is WaveTheme {\n return typeof theme === 'string' && Object.hasOwn(themeClassMap, theme);\n}\n\n/**\n * The classes that select a theme's tokens: `'wave-light'`, `'wave-dark dark'` or\n * `'wave-high-contrast high-contrast'`. Unknown values fall back to the light classes. Safe to call\n * from a React Server Component.\n *\n * @param theme - A {@link WaveTheme}.\n */\nexport function getThemeClassName(theme: WaveTheme): string {\n return isWaveTheme(theme) ? themeClassMap[theme] : themeClassMap.light;\n}\n"],"mappings":"AAUA,IAAMA,EAA2C,CAC/C,MAAO,aAGP,KAAM,iBACN,gBAAiB,kCACnB,EAGaC,EAAc,OAAO,KAAKD,CAAa,EAGpD,SAAgBE,EAAY,EAAoC,CAC9D,OAAO,OAAOC,GAAU,UAAY,OAAO,OAAOH,EAAeG,CAAK,CACxE,CASA,SAAgBC,EAAkB,EAA0B,CAC1D,OAAOF,EAAYC,CAAK,EAAIH,EAAcG,GAASH,EAAc,KACnE"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
//#region src/lib/theme.ts
|
|
2
|
+
var e = {
|
|
3
|
+
light: "wave-light",
|
|
4
|
+
dark: "wave-dark dark",
|
|
5
|
+
"high-contrast": "wave-high-contrast high-contrast"
|
|
6
|
+
}, t = Object.keys(e);
|
|
7
|
+
function n(t) {
|
|
8
|
+
return typeof t == "string" && Object.hasOwn(e, t);
|
|
9
|
+
}
|
|
10
|
+
function r(t) {
|
|
11
|
+
return n(t) ? e[t] : e.light;
|
|
12
|
+
}
|
|
13
|
+
//#endregion
|
|
14
|
+
export { t as WAVE_THEMES, r as getThemeClassName, n as isWaveTheme };
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=theme.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.mjs","names":["themeClassMap","WAVE_THEMES","isWaveTheme","theme","getThemeClassName"],"sources":["../../src/lib/theme.ts"],"sourcesContent":["/**\n * Theme names and theme classes. A server-safe module (the build puts `\"use client\"` only on\n * component and hook modules), so a React Server Component can call {@link getThemeClassName},\n * e.g. `<html className={getThemeClassName('dark')}>` in a Next.js `app/layout.tsx`.\n * `WaveProvider` re-exports both.\n */\n\n/** Supported visual themes for the Wave design system. */\nexport type WaveTheme = 'light' | 'dark' | 'high-contrast';\n\nconst themeClassMap: Record<WaveTheme, string> = {\n light: 'wave-light',\n // The legacy `dark` / `high-contrast` classes stay emitted (deprecated) for consumers' `dark:`\n // variants and 0.4 selectors.\n dark: 'wave-dark dark',\n 'high-contrast': 'wave-high-contrast high-contrast',\n};\n\n/** Every {@link WaveTheme}, in declaration order. */\nexport const WAVE_THEMES = Object.keys(themeClassMap) as readonly WaveTheme[];\n\n/** Whether `theme` is a {@link WaveTheme} (untyped callers can pass anything). */\nexport function isWaveTheme(theme: unknown): theme is WaveTheme {\n return typeof theme === 'string' && Object.hasOwn(themeClassMap, theme);\n}\n\n/**\n * The classes that select a theme's tokens: `'wave-light'`, `'wave-dark dark'` or\n * `'wave-high-contrast high-contrast'`. Unknown values fall back to the light classes. Safe to call\n * from a React Server Component.\n *\n * @param theme - A {@link WaveTheme}.\n */\nexport function getThemeClassName(theme: WaveTheme): string {\n return isWaveTheme(theme) ? themeClassMap[theme] : themeClassMap.light;\n}\n"],"mappings":";AAUA,IAAMA,IAA2C;CAC/C,OAAO;CAGP,MAAM;CACN,iBAAiB;AACnB,GAGaC,IAAc,OAAO,KAAKD,CAAa;AAGpD,SAAgBE,EAAY,GAAoC;CAC9D,OAAO,OAAOC,KAAU,YAAY,OAAO,OAAOH,GAAeG,CAAK;AACxE;AASA,SAAgBC,EAAkB,GAA0B;CAC1D,OAAOF,EAAYC,CAAK,IAAIH,EAAcG,KAASH,EAAc;AACnE"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
|
|
2
|
+
*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Noto Sans,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-feature-settings:normal;font-variation-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}
|
package/dist/styles.css
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
|
|
2
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-duration:initial;--tw-ease:initial;--tw-content:"";--tw-outline-style:solid}}}:root{--wave-font-family:"Segoe UI", "Segoe UI Web (West European)", -apple-system, BlinkMacSystemFont, Roboto, "Helvetica Neue", sans-serif;--wave-z-overlay:1000;--wave-z-toast:1100;--wave-z-tooltip:1200;--wave-duration-ultra-fast:50ms;--wave-duration-faster:.1s;--wave-duration-fast:.15s;--wave-duration-normal:.2s;--wave-duration-gentle:.25s;--wave-duration-slow:.3s;--wave-duration-slower:.4s;--wave-duration-ultra-slow:.5s;--wave-curve-accelerate-max:cubic-bezier(.9, .1, 1, .2);--wave-curve-accelerate-mid:cubic-bezier(1, 0, 1, 1);--wave-curve-accelerate-min:cubic-bezier(.8, 0, .78, 1);--wave-curve-decelerate-max:cubic-bezier(.1, .9, .2, 1);--wave-curve-decelerate-mid:cubic-bezier(0, 0, 0, 1);--wave-curve-decelerate-min:cubic-bezier(.33, 0, .1, 1);--wave-curve-easy-ease-max:cubic-bezier(.8, 0, .2, 1);--wave-curve-easy-ease:cubic-bezier(.33, 0, .67, 1);--wave-curve-linear:cubic-bezier(0, 0, 1, 1);--wave-brand-10:var(--brand-10,#061724);--wave-brand-20:var(--brand-20,#082338);--wave-brand-30:var(--brand-30,#0a2e4a);--wave-brand-40:var(--brand-40,#0c3b5e);--wave-brand-50:var(--brand-50,#0e4775);--wave-brand-60:var(--brand-60,#0f548c);--wave-brand-70:var(--brand-70,#115ea3);--wave-brand-80:var(--brand-80,#0f6cbd);--wave-brand-90:var(--brand-90,#2886de);--wave-brand-100:var(--brand-100,#479ef5);--wave-brand-110:var(--brand-110,#62abf5);--wave-brand-120:var(--brand-120,#77b7f7);--wave-brand-130:var(--brand-130,#96c6fa);--wave-brand-140:var(--brand-140,#b4d6fa);--wave-brand-150:var(--brand-150,#cfe4fa);--wave-brand-160:var(--brand-160,#ebf3fc);--wave-grey-2:var(--grey-2,#050505);--wave-grey-4:var(--grey-4,#0a0a0a);--wave-grey-6:var(--grey-6,#0f0f0f);--wave-grey-8:var(--grey-8,#141414);--wave-grey-10:var(--grey-10,#1a1a1a);--wave-grey-12:var(--grey-12,#1f1f1f);--wave-grey-14:var(--grey-14,#242424);--wave-grey-16:var(--grey-16,#292929);--wave-grey-20:var(--grey-20,#333);--wave-grey-24:var(--grey-24,#3d3d3d);--wave-grey-26:var(--grey-26,#424242);--wave-grey-30:var(--grey-30,#4d4d4d);--wave-grey-34:var(--grey-34,#575757);--wave-grey-38:var(--grey-38,#616161);--wave-grey-40:var(--grey-40,#666);--wave-grey-44:var(--grey-44,#707070);--wave-grey-50:var(--grey-50,gray);--wave-grey-60:var(--grey-60,#999);--wave-grey-68:var(--grey-68,#adadad);--wave-grey-74:var(--grey-74,#bdbdbd);--wave-grey-78:var(--grey-78,#c7c7c7);--wave-grey-82:var(--grey-82,#d1d1d1);--wave-grey-86:var(--grey-86,#dbdbdb);--wave-grey-88:var(--grey-88,#e0e0e0);--wave-grey-90:var(--grey-90,#e6e6e6);--wave-grey-92:var(--grey-92,#ebebeb);--wave-grey-94:var(--grey-94,#f0f0f0);--wave-grey-96:var(--grey-96,#f5f5f5);--wave-grey-98:var(--grey-98,#fafafa)}:root,.wave-light{--wave-background:#fff;--wave-foreground:#242424;--wave-card:#fafafa;--wave-secondary:#f5f5f5;--wave-muted:#f0f0f0;--wave-muted-foreground:#616161;--wave-primary:var(--wave-brand-80);--wave-primary-foreground:#fff;--wave-primary-hover:var(--wave-brand-70);--wave-primary-pressed:var(--wave-brand-40);--wave-destructive:#c50f1f;--wave-destructive-foreground:#fff;--wave-error:#c50f1f;--wave-error-foreground:#fff;--wave-subtle:transparent;--wave-subtle-hover:#f5f5f5;--wave-subtle-pressed:#ebebeb;--wave-subtle-selected:#ebebeb;--wave-selected:var(--wave-brand-160);--wave-selected-foreground:var(--wave-brand-60);--wave-border:#e0e0e0;--wave-stroke:#d1d1d1;--wave-stroke-hover:#c7c7c7;--wave-stroke-accessible:#616161;--wave-input:#d1d1d1;--wave-ring:var(--wave-brand-80);--wave-success:#107c10;--wave-success-foreground:#fff;--wave-success-tint:#f1faf1;--wave-success-tint-foreground:#0e700e;--wave-warning:#fde300;--wave-warning-foreground:#242424;--wave-warning-tint:#fffbe6;--wave-warning-tint-foreground:#6d5b00;--wave-error-tint:#fdf3f4;--wave-error-tint-foreground:#b10e1c;--wave-severe:#da3b01;--wave-severe-foreground:#fff;--wave-severe-tint:#fdf6f3;--wave-severe-tint-foreground:#a52c00;--wave-info:#0f6cbd;--wave-info-foreground:#fff;--wave-info-tint:#ebf3fc;--wave-info-tint-foreground:#0f548c;--wave-inverted:#292929;--wave-inverted-foreground:#fff;--wave-inverted-border:transparent;--wave-track:#e0e0e0;--wave-skeleton:#e0e0e0;--wave-rating:#b86e00;--wave-presence-available:#107c10;--wave-presence-busy:#c50f1f;--wave-presence-away:#a67c00;--wave-presence-offline:#616161;--wave-presence-oof:#b4009e;--wave-presence-glyph:#fff;--wave-backdrop:#0006;--wave-card-foreground:var(--wave-foreground);--wave-secondary-foreground:var(--wave-foreground);--wave-accent:var(--wave-primary);--wave-accent-foreground:var(--wave-primary-foreground)}.wave-dark,.dark{--wave-background:#292929;--wave-foreground:#fff;--wave-card:#333;--wave-secondary:#333;--wave-muted:#383838;--wave-muted-foreground:#adadad;--wave-primary:var(--wave-brand-110);--wave-primary-foreground:#000;--wave-primary-hover:var(--wave-brand-120);--wave-primary-pressed:var(--wave-brand-90);--wave-destructive:#f48a94;--wave-destructive-foreground:#000;--wave-error:#f48a94;--wave-error-foreground:#000;--wave-subtle:transparent;--wave-subtle-hover:#333;--wave-subtle-pressed:#2e2e2e;--wave-subtle-selected:#383838;--wave-selected:var(--wave-brand-20);--wave-selected-foreground:var(--wave-brand-110);--wave-border:#666;--wave-stroke:#666;--wave-stroke-hover:#757575;--wave-stroke-accessible:#adadad;--wave-input:#666;--wave-ring:var(--wave-brand-100);--wave-success:#5db55d;--wave-success-foreground:#000;--wave-success-tint:#052505;--wave-success-tint-foreground:#54b054;--wave-warning:#fde300;--wave-warning-foreground:#000;--wave-warning-tint:#463100;--wave-warning-tint-foreground:#fde300;--wave-error-tint:#3b0509;--wave-error-tint-foreground:#f48a94;--wave-severe:#e97548;--wave-severe-foreground:#000;--wave-severe-tint:#411200;--wave-severe-tint-foreground:#e97548;--wave-info:#479ef5;--wave-info-foreground:#000;--wave-info-tint:#082338;--wave-info-tint-foreground:#62abf5;--wave-inverted:#fff;--wave-inverted-foreground:#242424;--wave-inverted-border:transparent;--wave-track:#3d3d3d;--wave-skeleton:#3d3d3d;--wave-rating:#f7b538;--wave-presence-available:#54b054;--wave-presence-busy:#f48a94;--wave-presence-away:#f7b538;--wave-presence-offline:#adadad;--wave-presence-oof:#d696c8;--wave-presence-glyph:#000;--wave-backdrop:#00000080;--wave-card-foreground:var(--wave-foreground);--wave-secondary-foreground:var(--wave-foreground);--wave-accent:var(--wave-primary);--wave-accent-foreground:var(--wave-primary-foreground)}.wave-high-contrast,.high-contrast{--wave-background:#000;--wave-foreground:#fff;--wave-card:#000;--wave-secondary:#000;--wave-muted:#1a1a1a;--wave-muted-foreground:#fff;--wave-primary:#1aebff;--wave-primary-foreground:#000;--wave-primary-hover:#6ef3ff;--wave-primary-pressed:#00c4d6;--wave-destructive:#ff6e6e;--wave-destructive-foreground:#000;--wave-error:#ff6e6e;--wave-error-foreground:#000;--wave-subtle:transparent;--wave-subtle-hover:#1f1f1f;--wave-subtle-pressed:#333;--wave-subtle-selected:#333;--wave-selected:#003a40;--wave-selected-foreground:#fff;--wave-border:#fff;--wave-stroke:#fff;--wave-stroke-hover:#fff;--wave-stroke-accessible:#fff;--wave-input:#fff;--wave-ring:#ff0;--wave-success:#3ff23f;--wave-success-foreground:#000;--wave-success-tint:#000;--wave-success-tint-foreground:#3ff23f;--wave-warning:#ff0;--wave-warning-foreground:#000;--wave-warning-tint:#000;--wave-warning-tint-foreground:#ff0;--wave-error-tint:#000;--wave-error-tint-foreground:#ff6060;--wave-severe:#ff8c00;--wave-severe-foreground:#000;--wave-severe-tint:#000;--wave-severe-tint-foreground:#ff8c00;--wave-info:#1aebff;--wave-info-foreground:#000;--wave-info-tint:#000;--wave-info-tint-foreground:#1aebff;--wave-inverted:#000;--wave-inverted-foreground:#fff;--wave-inverted-border:#fff;--wave-track:#4d4d4d;--wave-skeleton:#333;--wave-rating:#ff0;--wave-presence-available:#3ff23f;--wave-presence-busy:#ff6060;--wave-presence-away:#ff0;--wave-presence-offline:#fff;--wave-presence-oof:#ff80ff;--wave-presence-glyph:#000;--wave-backdrop:#000c;--wave-card-foreground:var(--wave-foreground);--wave-secondary-foreground:var(--wave-foreground);--wave-accent:var(--wave-primary);--wave-accent-foreground:var(--wave-primary-foreground)}.wave-light{color-scheme:light}.wave-dark,.wave-high-contrast{color-scheme:dark}.wave-root,.wave-portal{font-family:var(--wave-font-family);color:var(--wave-foreground);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:14px;line-height:20px}.wave-root{background-color:var(--wave-background)}:where(.wave-root,.wave-portal) :where(*),:where(.wave-root,.wave-portal) :where(*):before,:where(.wave-root,.wave-portal) :where(*):after{box-sizing:border-box;border-color:var(--wave-border)}:where(.wave-root,.wave-portal) :where(button,input,select,textarea){font:inherit;color:inherit;letter-spacing:inherit;background-color:#0000;border:0 solid;margin:0;padding:0}:where(.wave-root,.wave-portal) :where(button,[role=button]){cursor:pointer}:where(.wave-root,.wave-portal) :where(ul,ol){margin:0;padding:0;list-style:none}:where(.wave-root,.wave-portal) :where(h1,h2,h3,h4,h5,h6,p,figure,blockquote,dl,dd){margin:0}:where(.wave-root,.wave-portal) :where(h1,h2,h3,h4,h5,h6){font-size:inherit;font-weight:inherit}:where(.wave-root,.wave-portal) :where(fieldset){border:0;min-width:0;margin:0;padding:0}:where(.wave-root,.wave-portal) :where(legend){padding:0}:where(.wave-root,.wave-portal) :where(table){border-collapse:collapse;text-indent:0}:where(.wave-root,.wave-portal) :where(hr){height:0;color:inherit;border:0 solid;border-top-width:1px;margin:0}:where(.wave-root,.wave-portal) :where(img,svg,video){vertical-align:middle}:where(.wave-root,.wave-portal) :where([hidden]:not([hidden=until-found])){display:none!important}.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{inset-inline:0}.inset-y-0{inset-block:0}.start-0{inset-inline-start:0}.start-2{inset-inline-start:.5rem}.start-4{inset-inline-start:1rem}.-end-1{inset-inline-end:-.25rem}.end-0{inset-inline-end:0}.end-1{inset-inline-end:.25rem}.end-2{inset-inline-end:.5rem}.end-3{inset-inline-end:.75rem}.end-4{inset-inline-end:1rem}.end-7{inset-inline-end:1.75rem}.top-0{top:0}.top-1\/2{top:50%}.top-2{top:.5rem}.top-3{top:.75rem}.top-4{top:1rem}.right-0{right:0}.right-4{right:1rem}.-bottom-1{bottom:-.25rem}.bottom-0{bottom:0}.bottom-1{bottom:.25rem}.bottom-4{bottom:1rem}.left-0{left:0}.left-4{left:1rem}.isolate{isolation:isolate}.z-10{z-index:10}.col-start-1{grid-column-start:1}.row-start-1{grid-row-start:1}.m-0{margin:0}.-mx-1{margin-inline:-.25rem}.mx-1{margin-inline:.25rem}.mx-2{margin-inline:.5rem}.mx-auto{margin-inline:auto}.my-1{margin-block:.25rem}.-ms-2{margin-inline-start:-.5rem}.ms-\(--wave-toaster-offset\){margin-inline-start:var(--wave-toaster-offset)}.ms-0\.5{margin-inline-start:.125rem}.ms-1{margin-inline-start:.25rem}.ms-2{margin-inline-start:.5rem}.ms-3\.75{margin-inline-start:.9375rem}.ms-4{margin-inline-start:1rem}.ms-auto{margin-inline-start:auto}.me-\(--wave-toaster-offset\){margin-inline-end:var(--wave-toaster-offset)}.me-1{margin-inline-end:.25rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-6{margin-top:1.5rem}.mt-px{margin-top:1px}.mr-\(--wave-toaster-offset\){margin-right:var(--wave-toaster-offset)}.-mb-1{margin-bottom:-.25rem}.mb-0{margin-bottom:0}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.ml-\(--wave-toaster-offset\){margin-left:var(--wave-toaster-offset)}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.size-2{width:.5rem;height:.5rem}.size-2\.5{width:.625rem;height:.625rem}.size-3{width:.75rem;height:.75rem}.size-4{width:1rem;height:1rem}.size-5{width:1.25rem;height:1.25rem}.size-6{width:1.5rem;height:1.5rem}.size-8{width:2rem;height:2rem}.size-10{width:2.5rem;height:2.5rem}.size-full{width:100%;height:100%}.h-0{height:0}.h-0\.5{height:.125rem}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-\[10px\]{height:10px}.h-\[14px\]{height:14px}.h-\[16px\]{height:16px}.h-\[18px\]{height:18px}.h-\[20px\]{height:20px}.h-auto{height:auto}.h-full{height:100%}.max-h-\(--wave-popup-available-height\){max-height:var(--wave-popup-available-height)}.max-h-60{max-height:15rem}.max-h-\[calc\(100dvh-2rem\)\]{max-height:calc(100dvh - 2rem)}.min-h-0{min-height:0}.min-h-2{min-height:.5rem}.min-h-6{min-height:1.5rem}.min-h-12{min-height:3rem}.min-h-20{min-height:5rem}.w-0{width:0}.w-0\.5{width:.125rem}.w-1\.5{width:.375rem}.w-2{width:.5rem}.w-2\/5{width:40%}.w-3{width:.75rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-24{width:6rem}.w-40{width:10rem}.w-60{width:15rem}.w-64{width:16rem}.w-80{width:20rem}.w-\[10px\]{width:10px}.w-\[14px\]{width:14px}.w-\[18px\]{width:18px}.w-\[32px\]{width:32px}.w-\[40px\]{width:40px}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-max{width:max-content}.max-w-\(--wave-popup-available-width\){max-width:var(--wave-popup-available-width)}.max-w-60{max-width:15rem}.max-w-\[400px\]{max-width:400px}.max-w-\[600px\]{max-width:600px}.max-w-\[calc\(100vw-2rem\)\]{max-width:calc(100vw - 2rem)}.max-w-full{max-width:100%}.max-w-xs{max-width:20rem}.min-w-0{min-width:0}.min-w-2{min-width:.5rem}.min-w-5{min-width:1.25rem}.min-w-6{min-width:1.5rem}.min-w-15{min-width:3.75rem}.min-w-24{min-width:6rem}.min-w-32{min-width:8rem}.min-w-\[180px\]{min-width:180px}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.basis-1\/3{flex-basis:33.3333%}.border-collapse{border-collapse:collapse}.border-separate{border-collapse:separate}.border-spacing-0{--tw-border-spacing-x:0px;--tw-border-spacing-y:0px;border-spacing:var(--tw-border-spacing-x) var(--tw-border-spacing-y)}.translate-x-\[2px\]{--tw-translate-x:2px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\[18px\]{--tw-translate-x:18px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\[22px\]{--tw-translate-x:22px;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-scale-x-100{--tw-scale-x:calc(100% * -1);scale:var(--tw-scale-x) var(--tw-scale-y)}.rotate-45{rotate:45deg}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.animate-wave-indeterminate{animation:1.5s ease-in-out infinite wave-indeterminate}.animate-wave-indeterminate-rtl{animation:1.5s ease-in-out infinite wave-indeterminate-rtl}.animate-wave-pulse{animation:1.5s ease-in-out infinite wave-pulse}.animate-wave-spin{animation:.8s linear infinite wave-spin}.animate-wave-spin-slow{animation:2.4s linear infinite wave-spin}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize-y{resize:vertical}.scroll-pb-\(--wave-dialog-footer-height\){scroll-padding-bottom:var(--wave-dialog-footer-height)}.list-none{list-style-type:none}.\[appearance\:textfield\]{appearance:textfield}.appearance-none{appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-row-reverse{flex-direction:row-reverse}.flex-nowrap{flex-wrap:nowrap}.flex-wrap{flex-wrap:wrap}.flex-wrap-reverse{flex-wrap:wrap-reverse}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-around{justify-content:space-around}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-evenly{justify-content:space-evenly}.justify-start{justify-content:flex-start}.justify-items-center{justify-items:center}.justify-items-end{justify-items:end}.justify-items-start{justify-items:start}.justify-items-stretch{justify-items:stretch}.gap-0{gap:0}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-\[inherit\]{gap:inherit}.gap-x-0{column-gap:0}.gap-x-1{column-gap:.25rem}.gap-x-2{column-gap:.5rem}.gap-x-3{column-gap:.75rem}.gap-x-4{column-gap:1rem}.gap-x-6{column-gap:1.5rem}.gap-y-0{row-gap:0}.gap-y-1{row-gap:.25rem}.gap-y-2{row-gap:.5rem}.gap-y-3{row-gap:.75rem}.gap-y-4{row-gap:1rem}.gap-y-6{row-gap:1.5rem}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border>:not(:last-child)){border-color:var(--wave-border)}.self-stretch{align-self:stretch}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-none{border-radius:0}.rounded-sm{border-radius:.25rem}.rounded-xs{border-radius:.125rem}.rounded-s-none{border-start-start-radius:0;border-end-start-radius:0}.rounded-e-none{border-start-end-radius:0;border-end-end-radius:0}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.border-s-2{border-inline-start-style:var(--tw-border-style);border-inline-start-width:2px}.border-s-4{border-inline-start-style:var(--tw-border-style);border-inline-start-width:4px}.border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.border-e-0{border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-none{--tw-border-style:none;border-style:none}.border-solid{--tw-border-style:solid;border-style:solid}.border-border{border-color:var(--wave-border)}.border-current\/30{border-color:currentColor}@supports (color:color-mix(in lab, red, red)){.border-current\/30{border-color:color-mix(in oklab, currentcolor 30%, transparent)}}.border-destructive{border-color:var(--wave-destructive)}.border-error{border-color:var(--wave-error)}.border-inherit{border-color:inherit}.border-input{border-color:var(--wave-input)}.border-inverted-border{border-color:var(--wave-inverted-border)}.border-muted-foreground{border-color:var(--wave-muted-foreground)}.border-primary{border-color:var(--wave-primary)}.border-severe{border-color:var(--wave-severe)}.border-stroke{border-color:var(--wave-stroke)}.border-stroke-accessible{border-color:var(--wave-stroke-accessible)}.border-success{border-color:var(--wave-success)}.border-track{border-color:var(--wave-track)}.border-transparent{border-color:#0000}.border-warning{border-color:var(--wave-warning)}.border-warning-tint-foreground{border-color:var(--wave-warning-tint-foreground)}.border-s-error{border-inline-start-color:var(--wave-error)}.border-s-info{border-inline-start-color:var(--wave-info)}.border-s-primary{border-inline-start-color:var(--wave-primary)}.border-s-primary-foreground\/30{border-inline-start-color:var(--wave-primary-foreground)}@supports (color:color-mix(in lab, red, red)){.border-s-primary-foreground\/30{border-inline-start-color:color-mix(in oklab, var(--wave-primary-foreground) 30%, transparent)}}.border-s-stroke{border-inline-start-color:var(--wave-stroke)}.border-s-success{border-inline-start-color:var(--wave-success)}.border-s-warning{border-inline-start-color:var(--wave-warning)}.border-t-current{border-top-color:currentColor}.border-t-primary{border-top-color:var(--wave-primary)}.border-b-primary{border-bottom-color:var(--wave-primary)}.border-b-stroke-accessible{border-bottom-color:var(--wave-stroke-accessible)}.bg-\(--option-bg\){background-color:var(--option-bg)}.bg-backdrop{background-color:var(--wave-backdrop)}.bg-background{background-color:var(--wave-background)}.bg-border{background-color:var(--wave-border)}.bg-card{background-color:var(--wave-card)}.bg-destructive{background-color:var(--wave-destructive)}.bg-error{background-color:var(--wave-error)}.bg-error-tint{background-color:var(--wave-error-tint)}.bg-info-tint{background-color:var(--wave-info-tint)}.bg-inherit{background-color:inherit}.bg-inverted{background-color:var(--wave-inverted)}.bg-muted{background-color:var(--wave-muted)}.bg-muted-foreground{background-color:var(--wave-muted-foreground)}.bg-presence-available{background-color:var(--wave-presence-available)}.bg-presence-away{background-color:var(--wave-presence-away)}.bg-presence-busy{background-color:var(--wave-presence-busy)}.bg-presence-oof{background-color:var(--wave-presence-oof)}.bg-primary{background-color:var(--wave-primary)}.bg-primary-foreground{background-color:var(--wave-primary-foreground)}.bg-primary-pressed{background-color:var(--wave-primary-pressed)}.bg-selected{background-color:var(--wave-selected)}.bg-severe{background-color:var(--wave-severe)}.bg-severe-tint{background-color:var(--wave-severe-tint)}.bg-skeleton{background-color:var(--wave-skeleton)}.bg-stroke-accessible{background-color:var(--wave-stroke-accessible)}.bg-subtle-selected{background-color:var(--wave-subtle-selected)}.bg-success{background-color:var(--wave-success)}.bg-success-tint{background-color:var(--wave-success-tint)}.bg-track{background-color:var(--wave-track)}.bg-transparent{background-color:#0000}.bg-warning{background-color:var(--wave-warning)}.bg-warning-tint{background-color:var(--wave-warning-tint)}.bg-warning-tint-foreground{background-color:var(--wave-warning-tint-foreground)}.bg-\[image\:linear-gradient\(45deg\,transparent_50\%\,var\(--wave-muted-foreground\)_50\%\)\,linear-gradient\(135deg\,var\(--wave-muted-foreground\)_50\%\,transparent_50\%\)\]{background-image:linear-gradient(45deg,transparent 50%,var(--wave-muted-foreground) 50%),linear-gradient(135deg,var(--wave-muted-foreground) 50%,transparent 50%)}.bg-\[size\:5px_5px\,5px_5px\]{background-size:5px 5px,5px 5px}.bg-\[position\:right_16px_center\,right_11px_center\]{background-position:right 16px center,right 11px center}.bg-no-repeat{background-repeat:no-repeat}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.object-none{object-fit:none}.object-center{object-position:center}.object-left-top{object-position:left top}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.px-0{padding-inline:0}.px-1{padding-inline:.25rem}.px-1\.5{padding-inline:.375rem}.px-2{padding-inline:.5rem}.px-2\.5{padding-inline:.625rem}.px-3{padding-inline:.75rem}.px-4{padding-inline:1rem}.px-5{padding-inline:1.25rem}.py-0{padding-block:0}.py-0\.5{padding-block:.125rem}.py-1{padding-block:.25rem}.py-1\.5{padding-block:.375rem}.py-2{padding-block:.5rem}.py-3{padding-block:.75rem}.py-4{padding-block:1rem}.ps-1{padding-inline-start:.25rem}.ps-2{padding-inline-start:.5rem}.ps-3{padding-inline-start:.75rem}.ps-4{padding-inline-start:1rem}.ps-11{padding-inline-start:2.75rem}.pe-1\.5{padding-inline-end:.375rem}.pe-2{padding-inline-end:.5rem}.pe-3{padding-inline-end:.75rem}.pe-4{padding-inline-end:1rem}.pe-8{padding-inline-end:2rem}.pe-10{padding-inline-end:2.5rem}.pe-14{padding-inline-end:3.5rem}.pt-0{padding-top:0}.pt-1\.5{padding-top:.375rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pb-1{padding-bottom:.25rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.text-center{text-align:center}.text-end{text-align:end}.text-start{text-align:start}.align-middle{vertical-align:middle}.font-wave{font-family:var(--wave-font-family)}.text-display{font-size:68px;line-height:var(--tw-leading,92px);font-weight:var(--tw-font-weight,600)}.text-large-title{font-size:40px;line-height:var(--tw-leading,52px);font-weight:var(--tw-font-weight,600)}.text-subtitle-1{font-size:20px;line-height:var(--tw-leading,28px);font-weight:var(--tw-font-weight,600)}.text-subtitle-2{font-size:16px;line-height:var(--tw-leading,22px);font-weight:var(--tw-font-weight,600)}.text-title-1{font-size:32px;line-height:var(--tw-leading,40px);font-weight:var(--tw-font-weight,600)}.text-title-2{font-size:28px;line-height:var(--tw-leading,36px);font-weight:var(--tw-font-weight,600)}.text-title-3{font-size:24px;line-height:var(--tw-leading,32px);font-weight:var(--tw-font-weight,600)}.text-\[18px\]\/\[24px\]{font-size:18px;line-height:24px}.text-base{font-size:1rem;line-height:var(--tw-leading,calc(1.5 / 1))}.text-body-1{font-size:14px;line-height:var(--tw-leading,20px)}.text-body-2{font-size:16px;line-height:var(--tw-leading,22px)}.text-caption-1{font-size:12px;line-height:var(--tw-leading,16px)}.text-caption-2{font-size:10px;line-height:var(--tw-leading,14px)}.text-lg{font-size:1.125rem;line-height:var(--tw-leading,calc(1.75 / 1.125))}.text-sm{font-size:.875rem;line-height:var(--tw-leading,calc(1.25 / .875))}.text-xs{font-size:.75rem;line-height:var(--tw-leading,calc(1 / .75))}.text-\[10px\]{font-size:10px}.leading-\[14px\]{--tw-leading:14px;line-height:14px}.font-bold{--tw-font-weight:700;font-weight:700}.font-normal{--tw-font-weight:400;font-weight:400}.font-semibold{--tw-font-weight:600;font-weight:600}.tracking-normal{--tw-tracking:0em;letter-spacing:0}.tracking-wider{--tw-tracking:.05em;letter-spacing:.05em}.break-words{overflow-wrap:break-word}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.text-current{color:currentColor}.text-destructive-foreground{color:var(--wave-destructive-foreground)}.text-error{color:var(--wave-error)}.text-error-tint-foreground{color:var(--wave-error-tint-foreground)}.text-foreground{color:var(--wave-foreground)}.text-info-tint-foreground{color:var(--wave-info-tint-foreground)}.text-inherit{color:inherit}.text-inverted-foreground{color:var(--wave-inverted-foreground)}.text-muted-foreground{color:var(--wave-muted-foreground)}.text-presence-busy{color:var(--wave-presence-busy)}.text-presence-glyph{color:var(--wave-presence-glyph)}.text-presence-offline{color:var(--wave-presence-offline)}.text-primary{color:var(--wave-primary)}.text-primary-foreground{color:var(--wave-primary-foreground)}.text-rating{color:var(--wave-rating)}.text-selected-foreground{color:var(--wave-selected-foreground)}.text-severe-foreground{color:var(--wave-severe-foreground)}.text-severe-tint-foreground{color:var(--wave-severe-tint-foreground)}.text-stroke-accessible{color:var(--wave-stroke-accessible)}.text-success{color:var(--wave-success)}.text-success-foreground{color:var(--wave-success-foreground)}.text-success-tint-foreground{color:var(--wave-success-tint-foreground)}.text-warning-foreground{color:var(--wave-warning-foreground)}.text-warning-tint-foreground{color:var(--wave-warning-tint-foreground)}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.accent-primary{accent-color:var(--wave-primary)}.opacity-50{opacity:.5}.shadow-2{--tw-shadow:0 0 2px var(--tw-shadow-color,#0000001f), 0 1px 2px var(--tw-shadow-color,#00000024);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-4{--tw-shadow:0 0 2px var(--tw-shadow-color,#0000001f), 0 2px 4px var(--tw-shadow-color,#00000024);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-8{--tw-shadow:0 0 2px var(--tw-shadow-color,#0000001f), 0 4px 8px var(--tw-shadow-color,#00000024);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-16{--tw-shadow:0 0 2px var(--tw-shadow-color,#0000001f), 0 8px 16px var(--tw-shadow-color,#00000024);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-64{--tw-shadow:0 0 8px var(--tw-shadow-color,#0000001f), 0 32px 64px var(--tw-shadow-color,#00000024);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.inset-ring-2{--tw-inset-ring-shadow:inset 0 0 0 2px var(--tw-inset-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-background{--tw-ring-color:var(--wave-background)}.ring-foreground{--tw-ring-color:var(--wave-foreground)}.ring-primary{--tw-ring-color:var(--wave-primary)}.inset-ring-primary-foreground{--tw-inset-ring-color:var(--wave-primary-foreground)}.ring-offset-2{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.ring-offset-background{--tw-ring-offset-color:var(--wave-background)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,cubic-bezier(.4, 0, .2, 1));transition-duration:var(--tw-duration,.15s)}.transition-\[width\,background-color\]{transition-property:width,background-color;transition-timing-function:var(--tw-ease,cubic-bezier(.4, 0, .2, 1));transition-duration:var(--tw-duration,.15s)}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,cubic-bezier(.4, 0, .2, 1));transition-duration:var(--tw-duration,.15s)}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,cubic-bezier(.4, 0, .2, 1));transition-duration:var(--tw-duration,.15s)}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-in-out{--tw-ease:cubic-bezier(.4, 0, .2, 1);transition-timing-function:cubic-bezier(.4,0,.2,1)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\[--option-bg\:transparent\]{--option-bg:transparent}.\[font\:inherit\]{font:inherit}.ring-inset{--tw-ring-inset:inset}@media (hover:hover){.group-hover\:bg-foreground:is(:where(.group):hover *){background-color:var(--wave-foreground)}}.group-has-\[\[data-menu-checkmark\]\]\/menu\:inline-flex:is(:where(.group\/menu):has([data-menu-checkmark]) *),.group-has-\[\[data-menu-icon\]\]\/menu\:inline-flex:is(:where(.group\/menu):has([data-menu-icon]) *){display:inline-flex}.placeholder\:text-muted-foreground::placeholder{color:var(--wave-muted-foreground)}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:inset-y-2:before{content:var(--tw-content);inset-block:.5rem}.before\:start-0:before{content:var(--tw-content);inset-inline-start:0}.before\:w-0\.5:before{content:var(--tw-content);width:.125rem}.before\:rounded-full:before{content:var(--tw-content);border-radius:3.40282e38px}.before\:bg-primary:before{content:var(--tw-content);background-color:var(--wave-primary)}.focus-within\:border-b-2:focus-within{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.focus-within\:border-b-destructive:focus-within{border-bottom-color:var(--wave-destructive)}.focus-within\:border-b-primary:focus-within{border-bottom-color:var(--wave-primary)}.focus-within\:outline-2:focus-within{outline-style:var(--tw-outline-style);outline-width:2px}.focus-within\:outline-offset-2:focus-within{outline-offset:2px}.focus-within\:outline-ring:focus-within{outline-color:var(--wave-ring)}@media (hover:hover){.hover\:border-stroke-hover:hover{border-color:var(--wave-stroke-hover)}.hover\:bg-subtle-hover:hover{background-color:var(--wave-subtle-hover)}.not-disabled\:not-aria-disabled\:hover\:border-primary:not(:disabled):not([aria-disabled=true]):hover{border-color:var(--wave-primary)}.not-disabled\:not-aria-disabled\:hover\:border-primary-hover:not(:disabled):not([aria-disabled=true]):hover{border-color:var(--wave-primary-hover)}.not-disabled\:not-aria-disabled\:hover\:border-stroke-hover:not(:disabled):not([aria-disabled=true]):hover{border-color:var(--wave-stroke-hover)}.not-disabled\:not-aria-disabled\:hover\:bg-primary-hover:not(:disabled):not([aria-disabled=true]):hover{background-color:var(--wave-primary-hover)}.not-disabled\:not-aria-disabled\:hover\:bg-primary-pressed:not(:disabled):not([aria-disabled=true]):hover{background-color:var(--wave-primary-pressed)}.not-disabled\:not-aria-disabled\:hover\:bg-selected:not(:disabled):not([aria-disabled=true]):hover{background-color:var(--wave-selected)}.not-disabled\:not-aria-disabled\:hover\:bg-subtle-hover:not(:disabled):not([aria-disabled=true]):hover{background-color:var(--wave-subtle-hover)}.not-disabled\:not-aria-disabled\:hover\:bg-subtle-pressed:not(:disabled):not([aria-disabled=true]):hover{background-color:var(--wave-subtle-pressed)}.not-disabled\:not-aria-disabled\:hover\:text-foreground:not(:disabled):not([aria-disabled=true]):hover{color:var(--wave-foreground)}.not-disabled\:not-aria-disabled\:hover\:underline:not(:disabled):not([aria-disabled=true]):hover{text-decoration-line:underline}.not-disabled\:not-aria-disabled\:hover\:decoration-2:not(:disabled):not([aria-disabled=true]):hover{text-decoration-thickness:2px}.not-disabled\:not-aria-disabled\:hover\:\[--option-bg\:var\(--wave-subtle-hover\)\]:not(:disabled):not([aria-disabled=true]):hover{--option-bg:var(--wave-subtle-hover)}}.focus\:border-b-2:focus{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.focus\:border-b-destructive:focus{border-bottom-color:var(--wave-destructive)}.focus\:border-b-primary:focus{border-bottom-color:var(--wave-primary)}.focus\:outline-hidden:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.focus\:outline-hidden:focus{outline-offset:2px;outline:2px solid #0000}}.not-disabled\:not-aria-disabled\:focus\:bg-subtle-hover:not(:disabled):not([aria-disabled=true]):focus{background-color:var(--wave-subtle-hover)}.focus-visible\:z-10:focus-visible{z-index:10}.focus-visible\:underline:focus-visible{text-decoration-line:underline}.focus-visible\:decoration-2:focus-visible{text-decoration-thickness:2px}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:-outline-offset-2:focus-visible{outline-offset:calc(2px * -1)}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-offset-4:focus-visible{outline-offset:4px}.focus-visible\:outline-ring:focus-visible{outline-color:var(--wave-ring)}.not-disabled\:not-aria-disabled\:active\:bg-primary-pressed:not(:disabled):not([aria-disabled=true]):active{background-color:var(--wave-primary-pressed)}.not-disabled\:not-aria-disabled\:active\:bg-subtle-pressed:not(:disabled):not([aria-disabled=true]):active{background-color:var(--wave-subtle-pressed)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.has-focus-visible\:opacity-100:has(:focus-visible){opacity:1}.aria-disabled\:cursor-not-allowed[aria-disabled=true]{cursor:not-allowed}.aria-disabled\:text-muted-foreground[aria-disabled=true]{color:var(--wave-muted-foreground)}.aria-disabled\:line-through[aria-disabled=true]{text-decoration-line:line-through}.aria-disabled\:opacity-50[aria-disabled=true]{opacity:.5}.aria-disabled\:focus-visible\:opacity-100[aria-disabled=true]:focus-visible{opacity:1}.aria-expanded\:bg-subtle-hover[aria-expanded=true],.data-\[active\]\:bg-subtle-hover[data-active]{background-color:var(--wave-subtle-hover)}.data-\[active\]\:outline-2[data-active]{outline-style:var(--tw-outline-style);outline-width:2px}.data-\[active\]\:-outline-offset-2[data-active]{outline-offset:calc(2px * -1)}.data-\[active\]\:outline-ring[data-active]{outline-color:var(--wave-ring)}.data-\[active\]\:\[--option-bg\:var\(--wave-subtle-hover\)\][data-active]{--option-bg:var(--wave-subtle-hover)}.data-\[contains-current\]\:border-s-2[data-contains-current]{border-inline-start-style:var(--tw-border-style);border-inline-start-width:2px}.data-\[contains-current\]\:border-s-primary[data-contains-current]{border-inline-start-color:var(--wave-primary)}.data-\[contains-current\]\:bg-subtle-selected[data-contains-current]{background-color:var(--wave-subtle-selected)}.data-\[contains-current\]\:text-primary[data-contains-current]{color:var(--wave-primary)}.data-\[outside\]\:text-muted-foreground[data-outside]{color:var(--wave-muted-foreground)}.data-\[overflow-pinned\]\:bg-background[data-overflow-pinned]{background-color:var(--wave-background)}.data-\[overflow-pinned\]\:pe-1[data-overflow-pinned]{padding-inline-end:.25rem}.data-\[selected\]\:bg-primary[data-selected]{background-color:var(--wave-primary)}.data-\[selected\]\:bg-selected[data-selected]{background-color:var(--wave-selected)}.data-\[selected\]\:bg-subtle-selected[data-selected]{background-color:var(--wave-subtle-selected)}.data-\[selected\]\:font-semibold[data-selected]{--tw-font-weight:600;font-weight:600}.data-\[selected\]\:text-primary-foreground[data-selected]{color:var(--wave-primary-foreground)}.data-\[selected\]\:\[--option-bg\:var\(--wave-subtle-selected\)\][data-selected]{--option-bg:var(--wave-subtle-selected)}@media (hover:hover){.not-disabled\:not-aria-disabled\:data-\[selected\]\:hover\:bg-primary-hover:not(:disabled):not([aria-disabled=true])[data-selected]:hover{background-color:var(--wave-primary-hover)}}.data-\[side\=bottom\]\:before\:inset-x-0[data-side=bottom]:before{content:var(--tw-content);inset-inline:0}.data-\[side\=bottom\]\:before\:bottom-full[data-side=bottom]:before{content:var(--tw-content);bottom:100%}.data-\[side\=bottom\]\:before\:h-2[data-side=bottom]:before{content:var(--tw-content);height:.5rem}.data-\[side\=left\]\:before\:inset-y-0[data-side=left]:before{content:var(--tw-content);inset-block:0}.data-\[side\=left\]\:before\:left-full[data-side=left]:before{content:var(--tw-content);left:100%}.data-\[side\=left\]\:before\:w-2[data-side=left]:before{content:var(--tw-content);width:.5rem}.data-\[side\=right\]\:before\:inset-y-0[data-side=right]:before{content:var(--tw-content);inset-block:0}.data-\[side\=right\]\:before\:right-full[data-side=right]:before{content:var(--tw-content);right:100%}.data-\[side\=right\]\:before\:w-2[data-side=right]:before{content:var(--tw-content);width:.5rem}.data-\[side\=top\]\:before\:inset-x-0[data-side=top]:before{content:var(--tw-content);inset-inline:0}.data-\[side\=top\]\:before\:top-full[data-side=top]:before{content:var(--tw-content);top:100%}.data-\[side\=top\]\:before\:h-2[data-side=top]:before{content:var(--tw-content);height:.5rem}.data-\[today\]\:border[data-today]{border-style:var(--tw-border-style);border-width:1px}.data-\[today\]\:border-primary[data-today]{border-color:var(--wave-primary)}.data-\[today\]\:font-semibold[data-today]{--tw-font-weight:600;font-weight:600}@media (prefers-reduced-motion:reduce){.motion-reduce\:w-full{width:100%}.motion-reduce\:translate-x-0{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.motion-reduce\:animate-none{animation:none}.motion-reduce\:animate-wave-pulse{animation:1.5s ease-in-out infinite wave-pulse}.motion-reduce\:animate-wave-spin-slow{animation:2.4s linear infinite wave-spin}.motion-reduce\:transition-none{transition-property:none}}@media (forced-colors:active){.forced-colors\:appearance-auto{appearance:auto}.forced-colors\:border{border-style:var(--tw-border-style);border-width:1px}.forced-colors\:border-\[ButtonText\]{border-color:buttontext}.forced-colors\:border-\[CanvasText\]{border-color:canvastext}.forced-colors\:border-\[Canvas\]{border-color:canvas}.forced-colors\:border-\[GrayText\]{border-color:graytext}.forced-colors\:border-\[Highlight\]{border-color:highlight}.forced-colors\:border-t-\[Highlight\]{border-top-color:highlight}.forced-colors\:bg-\[ButtonText\]{background-color:buttontext}.forced-colors\:bg-\[CanvasText\]{background-color:canvastext}.forced-colors\:bg-\[Canvas\]{background-color:canvas}.forced-colors\:bg-\[GrayText\]{background-color:graytext}.forced-colors\:bg-\[HighlightText\]{background-color:highlighttext}.forced-colors\:bg-\[Highlight\]{background-color:highlight}.forced-colors\:bg-none{background-image:none}.forced-colors\:text-\[GrayText\]{color:graytext}.forced-colors\:text-\[HighlightText\]{color:highlighttext}.forced-colors\:outline-2{outline-style:var(--tw-outline-style);outline-width:2px}.forced-colors\:-outline-offset-2{outline-offset:calc(2px * -1)}.forced-colors\:outline-\[GrayText\]{outline-color:graytext}.forced-colors\:outline-\[Highlight\]{outline-color:highlight}.forced-colors\:forced-color-adjust-none{forced-color-adjust:none}.forced-colors\:focus-visible\:outline-\[Highlight\]:focus-visible{outline-color:highlight}.forced-colors\:aria-expanded\:border-s-4[aria-expanded=true]{border-inline-start-style:var(--tw-border-style);border-inline-start-width:4px}.forced-colors\:aria-expanded\:border-\[Highlight\][aria-expanded=true]{border-color:highlight}.forced-colors\:aria-expanded\:ps-2[aria-expanded=true]{padding-inline-start:.5rem}}@supports selector(:nth-child(n of :dir(rtl))){.wave-rtl\:-translate-x-\[2px\]:where(:nth-child(n of :dir(rtl))){--tw-translate-x:calc(2px * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}}@supports not selector(:nth-child(n of :dir(rtl))){.wave-rtl\:-translate-x-\[2px\]:where([dir=rtl],[dir=rtl] *){--tw-translate-x:calc(2px * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}}@supports selector(:nth-child(n of :dir(rtl))){.wave-rtl\:-translate-x-\[18px\]:where(:nth-child(n of :dir(rtl))){--tw-translate-x:calc(18px * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}}@supports not selector(:nth-child(n of :dir(rtl))){.wave-rtl\:-translate-x-\[18px\]:where([dir=rtl],[dir=rtl] *){--tw-translate-x:calc(18px * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}}@supports selector(:nth-child(n of :dir(rtl))){.wave-rtl\:-translate-x-\[22px\]:where(:nth-child(n of :dir(rtl))){--tw-translate-x:calc(22px * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}}@supports not selector(:nth-child(n of :dir(rtl))){.wave-rtl\:-translate-x-\[22px\]:where([dir=rtl],[dir=rtl] *){--tw-translate-x:calc(22px * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}}@supports selector(:nth-child(n of :dir(rtl))){.wave-rtl\:-scale-x-100:where(:nth-child(n of :dir(rtl))){--tw-scale-x:calc(100% * -1);scale:var(--tw-scale-x) var(--tw-scale-y)}}@supports not selector(:nth-child(n of :dir(rtl))){.wave-rtl\:-scale-x-100:where([dir=rtl],[dir=rtl] *){--tw-scale-x:calc(100% * -1);scale:var(--tw-scale-x) var(--tw-scale-y)}}@supports selector(:nth-child(n of :dir(rtl))){.wave-rtl\:animate-wave-indeterminate-rtl:where(:nth-child(n of :dir(rtl))){animation:1.5s ease-in-out infinite wave-indeterminate-rtl}}@supports not selector(:nth-child(n of :dir(rtl))){.wave-rtl\:animate-wave-indeterminate-rtl:where([dir=rtl],[dir=rtl] *){animation:1.5s ease-in-out infinite wave-indeterminate-rtl}}@supports selector(:nth-child(n of :dir(rtl))){.wave-rtl\:bg-\[position\:left_11px_center\,left_16px_center\]:where(:nth-child(n of :dir(rtl))){background-position:11px,16px}}@supports not selector(:nth-child(n of :dir(rtl))){.wave-rtl\:bg-\[position\:left_11px_center\,left_16px_center\]:where([dir=rtl],[dir=rtl] *){background-position:11px,16px}}@supports selector(:nth-child(n of :dir(rtl))){@media (prefers-reduced-motion:reduce){.wave-rtl\:motion-reduce\:animate-wave-pulse:where(:nth-child(n of :dir(rtl))){animation:1.5s ease-in-out infinite wave-pulse}}}@supports not selector(:nth-child(n of :dir(rtl))){@media (prefers-reduced-motion:reduce){.wave-rtl\:motion-reduce\:animate-wave-pulse:where([dir=rtl],[dir=rtl] *){animation:1.5s ease-in-out infinite wave-pulse}}}.\[\&\:\:-moz-range-progress\]\:h-1::-moz-range-progress{height:.25rem}.\[\&\:\:-moz-range-progress\]\:rounded-full::-moz-range-progress{border-radius:3.40282e38px}.\[\&\:\:-moz-range-progress\]\:bg-primary::-moz-range-progress{background-color:var(--wave-primary)}@media (forced-colors:active){.forced-colors\:\[\&\:\:-moz-range-progress\]\:bg-\[Highlight\]::-moz-range-progress{background-color:highlight}.forced-colors\:disabled\:\[\&\:\:-moz-range-progress\]\:bg-\[GrayText\]:disabled::-moz-range-progress{background-color:graytext}}.\[\&\:\:-moz-range-thumb\]\:h-5::-moz-range-thumb{height:1.25rem}.\[\&\:\:-moz-range-thumb\]\:w-5::-moz-range-thumb{width:1.25rem}.\[\&\:\:-moz-range-thumb\]\:rounded-full::-moz-range-thumb{border-radius:3.40282e38px}.\[\&\:\:-moz-range-thumb\]\:border-2::-moz-range-thumb{border-style:var(--tw-border-style);border-width:2px}.\[\&\:\:-moz-range-thumb\]\:border-background::-moz-range-thumb{border-color:var(--wave-background)}.\[\&\:\:-moz-range-thumb\]\:bg-primary::-moz-range-thumb{background-color:var(--wave-primary)}.\[\&\:\:-moz-range-thumb\]\:shadow::-moz-range-thumb{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}@media (forced-colors:active){.forced-colors\:\[\&\:\:-moz-range-thumb\]\:border-\[Canvas\]::-moz-range-thumb{border-color:canvas}.forced-colors\:\[\&\:\:-moz-range-thumb\]\:bg-\[Highlight\]::-moz-range-thumb{background-color:highlight}.forced-colors\:disabled\:\[\&\:\:-moz-range-thumb\]\:bg-\[GrayText\]:disabled::-moz-range-thumb{background-color:graytext}}.\[\&\:\:-moz-range-track\]\:h-1::-moz-range-track{height:.25rem}.\[\&\:\:-moz-range-track\]\:rounded-full::-moz-range-track{border-radius:3.40282e38px}.\[\&\:\:-moz-range-track\]\:bg-stroke-accessible::-moz-range-track{background-color:var(--wave-stroke-accessible)}@media (forced-colors:active){.forced-colors\:\[\&\:\:-moz-range-track\]\:bg-\[CanvasText\]::-moz-range-track{background-color:canvastext}.forced-colors\:disabled\:\[\&\:\:-moz-range-track\]\:bg-\[GrayText\]:disabled::-moz-range-track{background-color:graytext}}.\[\&\:\:-webkit-search-cancel-button\]\:hidden::-webkit-search-cancel-button{display:none}.\[\&\:\:-webkit-slider-runnable-track\]\:h-1::-webkit-slider-runnable-track{height:.25rem}.\[\&\:\:-webkit-slider-runnable-track\]\:rounded-full::-webkit-slider-runnable-track{border-radius:3.40282e38px}.\[\&\:\:-webkit-slider-runnable-track\]\:bg-stroke-accessible::-webkit-slider-runnable-track{background-color:var(--wave-stroke-accessible)}.\[\&\:\:-webkit-slider-runnable-track\]\:bg-\[linear-gradient\(to_right\,var\(--wave-primary\)_var\(--wave-slider-progress\)\,var\(--wave-stroke-accessible\)_var\(--wave-slider-progress\)\)\]::-webkit-slider-runnable-track{background-image:linear-gradient(to right,var(--wave-primary) var(--wave-slider-progress),var(--wave-stroke-accessible) var(--wave-slider-progress))}@media (forced-colors:active){.forced-colors\:\[\&\:\:-webkit-slider-runnable-track\]\:bg-\[CanvasText\]::-webkit-slider-runnable-track{background-color:canvastext}.forced-colors\:\[\&\:\:-webkit-slider-runnable-track\]\:bg-\[linear-gradient\(to_right\,Highlight_var\(--wave-slider-progress\)\,CanvasText_var\(--wave-slider-progress\)\)\]::-webkit-slider-runnable-track{background-image:linear-gradient(to right,Highlight var(--wave-slider-progress),CanvasText var(--wave-slider-progress))}.forced-colors\:disabled\:\[\&\:\:-webkit-slider-runnable-track\]\:bg-\[GrayText\]:disabled::-webkit-slider-runnable-track{background-color:graytext}.forced-colors\:disabled\:\[\&\:\:-webkit-slider-runnable-track\]\:bg-none:disabled::-webkit-slider-runnable-track{background-image:none}}@supports selector(:nth-child(n of :dir(rtl))){.wave-rtl\:\[\&\:\:-webkit-slider-runnable-track\]\:bg-\[linear-gradient\(to_left\,var\(--wave-primary\)_var\(--wave-slider-progress\)\,var\(--wave-stroke-accessible\)_var\(--wave-slider-progress\)\)\]:where(:nth-child(n of :dir(rtl)))::-webkit-slider-runnable-track{background-image:linear-gradient(to left,var(--wave-primary) var(--wave-slider-progress),var(--wave-stroke-accessible) var(--wave-slider-progress))}}@supports not selector(:nth-child(n of :dir(rtl))){.wave-rtl\:\[\&\:\:-webkit-slider-runnable-track\]\:bg-\[linear-gradient\(to_left\,var\(--wave-primary\)_var\(--wave-slider-progress\)\,var\(--wave-stroke-accessible\)_var\(--wave-slider-progress\)\)\]:where([dir=rtl],[dir=rtl] *)::-webkit-slider-runnable-track{background-image:linear-gradient(to left,var(--wave-primary) var(--wave-slider-progress),var(--wave-stroke-accessible) var(--wave-slider-progress))}}@media (forced-colors:active){@supports selector(:nth-child(n of :dir(rtl))){.forced-colors\:wave-rtl\:\[\&\:\:-webkit-slider-runnable-track\]\:bg-\[linear-gradient\(to_left\,Highlight_var\(--wave-slider-progress\)\,CanvasText_var\(--wave-slider-progress\)\)\]:where(:nth-child(n of :dir(rtl)))::-webkit-slider-runnable-track{background-image:linear-gradient(to left,Highlight var(--wave-slider-progress),CanvasText var(--wave-slider-progress))}}@supports not selector(:nth-child(n of :dir(rtl))){.forced-colors\:wave-rtl\:\[\&\:\:-webkit-slider-runnable-track\]\:bg-\[linear-gradient\(to_left\,Highlight_var\(--wave-slider-progress\)\,CanvasText_var\(--wave-slider-progress\)\)\]:where([dir=rtl],[dir=rtl] *)::-webkit-slider-runnable-track{background-image:linear-gradient(to left,Highlight var(--wave-slider-progress),CanvasText var(--wave-slider-progress))}}}.\[\&\:\:-webkit-slider-thumb\]\:-mt-2::-webkit-slider-thumb{margin-top:-.5rem}.\[\&\:\:-webkit-slider-thumb\]\:h-5::-webkit-slider-thumb{height:1.25rem}.\[\&\:\:-webkit-slider-thumb\]\:w-5::-webkit-slider-thumb{width:1.25rem}.\[\&\:\:-webkit-slider-thumb\]\:appearance-none::-webkit-slider-thumb{appearance:none}.\[\&\:\:-webkit-slider-thumb\]\:rounded-full::-webkit-slider-thumb{border-radius:3.40282e38px}.\[\&\:\:-webkit-slider-thumb\]\:border-2::-webkit-slider-thumb{border-style:var(--tw-border-style);border-width:2px}.\[\&\:\:-webkit-slider-thumb\]\:border-background::-webkit-slider-thumb{border-color:var(--wave-background)}.\[\&\:\:-webkit-slider-thumb\]\:bg-primary::-webkit-slider-thumb{background-color:var(--wave-primary)}.\[\&\:\:-webkit-slider-thumb\]\:shadow::-webkit-slider-thumb{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}@media (forced-colors:active){.forced-colors\:\[\&\:\:-webkit-slider-thumb\]\:border-\[Canvas\]::-webkit-slider-thumb{border-color:canvas}.forced-colors\:\[\&\:\:-webkit-slider-thumb\]\:bg-\[Highlight\]::-webkit-slider-thumb{background-color:highlight}.forced-colors\:disabled\:\[\&\:\:-webkit-slider-thumb\]\:bg-\[GrayText\]:disabled::-webkit-slider-thumb{background-color:graytext}}.\[\&\:focus-visible\>\[data-tree-row\]\]\:outline-2:focus-visible>[data-tree-row]{outline-style:var(--tw-outline-style);outline-width:2px}.\[\&\:focus-visible\>\[data-tree-row\]\]\:-outline-offset-2:focus-visible>[data-tree-row]{outline-offset:calc(2px * -1)}.\[\&\:focus-visible\>\[data-tree-row\]\]\:outline-ring:focus-visible>[data-tree-row]{outline-color:var(--wave-ring)}.\[\&\>\:first-child\]\:flex-1>:first-child{flex:1}.\[\&\>\:first-child\:has\(\[role\=checkbox\]\,\[role\=switch\]\,label\>\[role\=radio\]\)\]\:py-1\.5>:first-child:has([role=checkbox],[role=switch],label>[role=radio]){padding-block:.375rem}.\[\&\>\:last-child\]\:border-s>:last-child{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.\[\&\>\:last-child\]\:border-border>:last-child{border-color:var(--wave-border)}.\[\&\>svg\]\:size-full>svg{width:100%;height:100%}:where(.\[\:where\(\&\>tbody\>tr\:nth-child\(odd\)\)\]\:bg-card>tbody>tr:nth-child(odd)){background-color:var(--wave-card)}@property --tw-border-spacing-x{syntax:"<length>";inherits:false;initial-value:0}@property --tw-border-spacing-y{syntax:"<length>";inherits:false;initial-value:0}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@keyframes wave-spin{to{transform:rotate(360deg)}}@keyframes wave-pulse{0%,to{opacity:1}50%{opacity:.4}}@keyframes wave-indeterminate{0%{transform:translate(-100%)}to{transform:translate(350%)}}@keyframes wave-indeterminate-rtl{0%{transform:translate(100%)}to{transform:translate(-350%)}}
|