@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":"Portal.mjs","names":["_Fragment","React","PortalDepthContext","Portal","isClient","useIsClient","useWaveTheme","dir","useDirection","depth","parentLayerId","DismissLayerContext","registerWithParent","el","registerLayerElement","wrapperRef","useMergedRefs","ref","content","layerId","children","DismissLayerProvider","disabled","Fragment","target","container","portalContainer","createPortal","cn","themeClassName","className","layer","Z_INDEX"],"sources":["../../../src/components/portal/Portal.tsx"],"sourcesContent":["import * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../lib/cn';\nimport { Z_INDEX, registerLayerElement } from '../../lib/layers';\nimport { useIsClient } from '../../hooks/useIsClient';\nimport { useDirection } from '../../hooks/useDirection';\nimport { useMergedRefs } from '../../hooks/useMergedRefs';\nimport { DismissLayerContext, DismissLayerProvider } from '../../hooks/useDismiss';\nimport { useWaveTheme } from '../provider/WaveProvider';\n\n/** Props accepted by {@link Portal}. */\nexport interface PortalProps {\n /** Content rendered into the portal. */\n children: React.ReactNode;\n /** Element to render into. @default WaveProvider `portalContainer`, else `document.body` */\n container?: HTMLElement | null;\n /**\n * Stacking layer: `--wave-z-overlay` (dialogs, popovers, menus, listboxes), `--wave-z-toast`\n * (above overlays) or `--wave-z-tooltip`. The portal's nesting depth is added.\n * @default 'overlay'\n */\n layer?: 'overlay' | 'toast' | 'tooltip';\n /**\n * The dismiss layer of the content (from `useDismiss`). Provided to the children through\n * `DismissLayerProvider`, so layers opened inside become its descendants.\n */\n layerId?: string;\n /** Render the children inline instead (no portal, no wrapper). @default false */\n disabled?: boolean;\n /** Extra classes for the portal wrapper. */\n className?: string;\n /** Ref to the portal wrapper `<div>`. */\n ref?: React.Ref<HTMLDivElement>;\n}\n\n/**\n * Nesting depth of portals: `0` outside any portal; each `Portal` provides `depth + 1` to its\n * children. Portals add it to their z-index so a surface opened from inside another overlay always\n * stacks above it — also when both mount in the same commit.\n */\nexport const PortalDepthContext = React.createContext(0);\nPortalDepthContext.displayName = 'PortalDepthContext';\n\n/**\n * Renders its children into `document.body` (or the WaveProvider `portalContainer`), wrapped in a\n * `<div class=\"wave-portal …\">` that carries the provider's theme classes, direction and font, so\n * portaled overlays look like the rest of the themed tree. The wrapper paints no background.\n *\n * - **Client only, first commit**: nothing is rendered on the server or during hydration (no\n * mismatch); in every other client render the portal exists in the first commit, so layout\n * effects and ref callbacks of the content see connected elements.\n * - **Stacking**: `z-index: calc(<layer variable> + depth)`, where depth is the number of portals\n * it is rendered in, so a surface opened from inside another overlay always stacks above it,\n * also when both mount in the same commit.\n * - **Layers**: the wrapper is registered with the enclosing dismiss layer (the parent), so presses\n * and focus inside the portal count as inside that layer; `layerId` is provided only to the\n * children.\n *\n * Content that must exist on the server or before an overlay opens (tooltip descriptions, closed\n * listboxes) is rendered inline instead.\n */\nexport const Portal = ({\n children,\n container,\n layer = 'overlay',\n layerId,\n disabled = false,\n className,\n ref,\n}: PortalProps) => {\n const isClient = useIsClient();\n const { themeClassName, portalContainer } = useWaveTheme();\n const dir = useDirection();\n const depth = React.useContext(PortalDepthContext);\n const parentLayerId = React.useContext(DismissLayerContext);\n\n const registerWithParent = React.useCallback(\n (el: HTMLDivElement | null) => {\n if (!el || parentLayerId === null) return;\n return registerLayerElement(parentLayerId, el);\n },\n [parentLayerId],\n );\n const wrapperRef = useMergedRefs<HTMLDivElement>(ref, registerWithParent);\n\n const content =\n layerId === undefined ? (\n children\n ) : (\n <DismissLayerProvider layerId={layerId}>{children}</DismissLayerProvider>\n );\n\n if (disabled) return <>{content}</>;\n if (!isClient) return null;\n\n const target = container ?? portalContainer ?? document.body;\n\n return createPortal(\n <div\n ref={wrapperRef}\n className={cn('wave-portal', themeClassName, className)}\n dir={dir}\n data-wave-portal=\"\"\n data-layer={layer}\n style={{ position: 'relative', zIndex: `calc(${Z_INDEX[layer]} + ${depth})` }}\n >\n <PortalDepthContext.Provider value={depth + 1}>{content}</PortalDepthContext.Provider>\n </div>,\n target,\n );\n};\n\nPortal.displayName = 'Portal';\n"],"mappings":";;;;;;;;;;;;AAwCA,IAAaE,IAAqBD,EAAM,cAAc,CAAC;AACvD,EAAmB,cAAc;AAoBjC,IAAaE,KAAU,EACrB,aACA,cACA,WAAQ,WACR,YACA,cAAW,IACX,cACA,aACiB;CACjB,IAAMC,IAAWC,EAAY,GACvB,EAAE,mBAAgB,uBAAoBC,EAAa,GACnDC,IAAMC,EAAa,GACnBC,IAAQR,EAAM,WAAWC,CAAkB,GAC3CQ,IAAgBT,EAAM,WAAWU,CAAmB,GAEpDC,IAAqBX,EAAM,aAC9B,MAA8B;EAC7B,IAAKY,KAAMH,MAAkB,MAC7B,OAAOI,EAAqBJ,GAAeG,CAAE;CAC/C,GACA,CAACH,CAAa,CAChB,GACMK,IAAaC,EAA8BC,GAAKL,CAAkB,GAElEM,IACJC,MAAY,KAAA,IACVC,IAEA,kBAACC,GAAD;EAA+B;EAAU;CAA+B,CAAA;CAG5E,IAAIC,GAAU,OAAO,kBAAAtB,GAAA,EAAA,UAAGkB,EAAU,CAAA;CAClC,IAAI,CAACd,GAAU,OAAO;CAEtB,IAAMoB,IAASC,KAAaC,KAAmB,SAAS;CAExD,OAAOC,EACL,kBAAC,OAAD;EACE,KAAKZ;EACL,WAAWa,EAAG,eAAeC,GAAgBC,CAAS;EACjD;EACL,oBAAiB;EACjB,cAAYC;EACZ,OAAO;GAAE,UAAU;GAAY,QAAQ,QAAQC,EAAQD,GAAO,KAAKtB,EAAM;EAAG;EAE5E,UAAA,kBAACP,EAAmB,UAApB;GAA6B,OAAOO,IAAQ;GAAI,UAAAS;EAAqC,CAAA;CAClF,CAAA,GACLM,CACF;AACF;AAEA,EAAO,cAAc"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("../../lib/cn.cjs"),n=require("../../lib/dev.cjs"),r=require("../../lib/theme.cjs");let i=require("react");i=e.__toESM(i,1);let a=require("react/jsx-runtime");var o=i.createContext({theme:`light`,dir:`ltr`,themeClassName:``,portalContainer:null,hasProvider:!1});function s(){return i.useContext(o)}var c=({theme:e,dir:s,portalContainer:c,children:l,className:u,ref:d,...f})=>{let p=i.useContext(o),m=e??p.theme,h=s??p.dir,g=c===void 0?p.portalContainer:c,_=r.isWaveTheme(m)?m:`light`,v=r.getThemeClassName(_);i.useEffect(()=>{r.isWaveTheme(m)||n.warnOnce(`WaveProvider:theme:${String(m)}`,`WaveProvider: unknown theme "${String(m)}". Valid themes: ${r.WAVE_THEMES.join(`, `)}. Using "light".`)},[m]);let y=i.useMemo(()=>({theme:_,dir:h,themeClassName:v,portalContainer:g,hasProvider:!0}),[_,h,v,g]);return(0,a.jsx)(o.Provider,{value:y,children:(0,a.jsx)(`div`,{...f,ref:d,dir:h,"data-wave-theme":_,className:t.cn(`wave-root`,v,`bg-background text-foreground font-wave text-body-1`,u),children:l})})};c.displayName=`WaveProvider`,exports.WaveProvider=c,exports.getThemeClassName=r.getThemeClassName,exports.useWaveTheme=s;
|
|
2
|
+
//# sourceMappingURL=WaveProvider.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WaveProvider.cjs","names":["React","isWaveTheme","getThemeClassName","WAVE_THEMES","cn","require_runtime","require_cn","require_dev","require_theme","react","react_jsx_runtime","WaveContext","useWaveTheme","WaveProvider","themeProp","dirProp","portalContainerProp","rest","parent","theme","dir","portalContainer","resolvedTheme","themeClassName","value","className"],"sources":["../../../src/components/provider/WaveProvider.tsx"],"sourcesContent":["import * as React from 'react';\nimport { cn } from '../../lib/cn';\nimport { warnOnce } from '../../lib/dev';\nimport { getThemeClassName, isWaveTheme, WAVE_THEMES, type WaveTheme } from '../../lib/theme';\n\n// The theme helper lives in server-safe src/lib (no \"use client\"), so React Server Components can\n// call it; it stays exported from here too.\nexport { getThemeClassName } from '../../lib/theme';\nexport type { WaveTheme } from '../../lib/theme';\n\n/** Text direction for bidirectional layout support. */\nexport type WaveDir = 'ltr' | 'rtl';\n\n/** Props accepted by {@link WaveProvider}. */\nexport interface WaveProviderProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Visual theme applied to the subtree. Providers can be nested in any order: each root declares\n * its theme's tokens, so a light panel inside a dark app (and the reverse) renders correctly.\n * @default the enclosing WaveProvider's theme, else 'light'\n */\n theme?: WaveTheme;\n /**\n * Text direction for the subtree (also read by portaled overlays and keyboard navigation).\n * @default the enclosing WaveProvider's direction, else 'ltr'\n */\n dir?: WaveDir;\n /**\n * Element that portaled overlays (dialogs, popovers, menus, toasts) render into. `null` renders\n * them into `document.body`, also inside a provider that sets a container.\n * @default the enclosing WaveProvider's container, else document.body\n */\n portalContainer?: HTMLElement | null;\n /** Content rendered inside the themed container. */\n children: React.ReactNode;\n /** Ref to the themed root `<div>`. */\n ref?: React.Ref<HTMLDivElement>;\n}\n\n/** Value provided by {@link WaveProvider} and returned by {@link useWaveTheme}. */\nexport interface WaveContextValue {\n /** The active theme. */\n theme: WaveTheme;\n /** The active text direction. */\n dir: WaveDir;\n /**\n * Theme classes of the nearest provider (see {@link getThemeClassName}); portals put them on\n * their wrapper so overlays inherit the theme. `''` outside a provider (the page's own theme).\n */\n themeClassName: string;\n /** Element portaled overlays render into; `null` means `document.body`. */\n portalContainer: HTMLElement | null;\n /** `false` when no {@link WaveProvider} is above the caller (the defaults are returned). */\n hasProvider: boolean;\n}\n\nconst DEFAULT_CONTEXT: WaveContextValue = {\n theme: 'light',\n dir: 'ltr',\n themeClassName: '',\n portalContainer: null,\n hasProvider: false,\n};\n\nconst WaveContext = React.createContext<WaveContextValue>(DEFAULT_CONTEXT);\n\n/**\n * Reads the theme, direction, theme classes and portal container of the nearest\n * {@link WaveProvider}. Outside a provider it returns light/ltr defaults with `hasProvider: false`.\n *\n * @returns The {@link WaveContextValue} of the nearest provider.\n */\nexport function useWaveTheme(): WaveContextValue {\n return React.useContext(WaveContext);\n}\n\n/**\n * Applies Wave theming to an application or subtree.\n *\n * - Renders a `<div class=\"wave-root wave-<theme>\">` that declares the theme's tokens and paints\n * the themed background, text colour and font (`bg-background text-foreground font-wave\n * text-body-1`; a `className` passed by you wins). The precompiled `./styles` entry scopes its base\n * styles and native-element reset to this root, so it is required there.\n * - Sets `dir` and `data-wave-theme` on the root. An unknown `theme` value (from untyped code)\n * falls back to `'light'` — classes, `data-wave-theme` and the context value — and warns once in\n * development.\n * - Provides theme, direction, theme classes and the portal container through context, so\n * portaled overlays render with the same theme and direction.\n * - Nests: a provider inherits every prop it omits (`theme`, `dir`, `portalContainer`) from the\n * enclosing provider, so `<WaveProvider theme=\"light\">` inside an RTL app is a light panel that\n * stays right-to-left and keeps the app's portal container. At the top level the defaults are\n * `'light'`, `'ltr'` and `document.body`.\n */\nexport const WaveProvider = ({\n theme: themeProp,\n dir: dirProp,\n portalContainer: portalContainerProp,\n children,\n className,\n ref,\n ...rest\n}: WaveProviderProps) => {\n // Omitted props come from the enclosing provider; outside one, DEFAULT_CONTEXT supplies the\n // top-level defaults. An explicit `portalContainer={null}` means document.body, so only\n // `undefined` inherits.\n const parent = React.useContext(WaveContext);\n const theme = themeProp ?? parent.theme;\n const dir = dirProp ?? parent.dir;\n const portalContainer =\n portalContainerProp === undefined ? parent.portalContainer : portalContainerProp;\n\n // An unknown value (untyped callers) renders, and is reported, as the light theme.\n const resolvedTheme: WaveTheme = isWaveTheme(theme) ? theme : 'light';\n const themeClassName = getThemeClassName(resolvedTheme);\n\n React.useEffect(() => {\n if (!isWaveTheme(theme)) {\n warnOnce(\n `WaveProvider:theme:${String(theme)}`,\n `WaveProvider: unknown theme \"${String(theme)}\". Valid themes: ${WAVE_THEMES.join(', ')}. Using \"light\".`,\n );\n }\n }, [theme]);\n\n const value = React.useMemo<WaveContextValue>(\n () => ({ theme: resolvedTheme, dir, themeClassName, portalContainer, hasProvider: true }),\n [resolvedTheme, dir, themeClassName, portalContainer],\n );\n\n return (\n <WaveContext.Provider value={value}>\n <div\n {...rest}\n ref={ref}\n dir={dir}\n data-wave-theme={resolvedTheme}\n className={cn(\n 'wave-root',\n themeClassName,\n 'bg-background text-foreground font-wave text-body-1',\n className,\n )}\n >\n {children}\n </div>\n </WaveContext.Provider>\n );\n};\n\nWaveProvider.displayName = 'WaveProvider';\n"],"mappings":"8OA+DA,IAAMW,EAAcX,EAAM,cAAgC,CAPxD,MAAO,QACP,IAAK,MACL,eAAgB,GAChB,gBAAiB,KACjB,YAAa,EAG2C,CAAe,EAQzE,SAAgBY,GAAiC,CAC/C,OAAOZ,EAAM,WAAWW,CAAW,CACrC,CAmBA,IAAaE,GAAgB,CAC3B,MAAOC,EACP,IAAKC,EACL,gBAAiBC,EACjB,WACA,YACA,MACA,GAAGC,KACoB,CAIvB,IAAMC,EAASlB,EAAM,WAAWW,CAAW,EACrCQ,EAAQL,GAAaI,EAAO,MAC5BE,EAAML,GAAWG,EAAO,IACxBG,EACJL,IAAwB,IAAA,GAAYE,EAAO,gBAAkBF,EAGzDM,EAA2BrB,EAAAA,YAAYkB,CAAK,EAAIA,EAAQ,QACxDI,EAAiBrB,EAAAA,kBAAkBoB,CAAa,EAEtDb,EAAM,cAAgB,CACfR,EAAAA,YAAYkB,CAAK,GACpBZ,EAAA,SACE,sBAAsB,OAAOY,CAAK,IAClC,gCAAgC,OAAOA,CAAK,EAAE,mBAAmBhB,EAAAA,YAAY,KAAK,IAAI,EAAE,iBAC1F,CAEJ,EAAG,CAACgB,CAAK,CAAC,EAEV,IAAMK,EAAQxB,EAAM,aACX,CAAE,MAAOsB,EAAe,MAAK,iBAAgB,kBAAiB,YAAa,EAAK,GACvF,CAACA,EAAeF,EAAKG,EAAgBF,CAAe,CACtD,EAEA,OACE,EAAAX,EAAA,IAAA,CAACC,EAAY,SAAb,CAA6B,QAC3B,UAAA,EAAAD,EAAA,IAAA,CAAC,MAAD,CACE,GAAIO,EACC,MACA,MACL,kBAAiBK,EACjB,UAAWlB,EAAAA,GACT,YACAmB,EACA,sDACAE,CACF,EAEC,UACE,CAAA,CACe,CAAA,CAE1B,EAEA,EAAa,YAAc"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn as e } from "../../lib/cn.mjs";
|
|
3
|
+
import { warnOnce as t } from "../../lib/dev.mjs";
|
|
4
|
+
import { WAVE_THEMES as n, getThemeClassName as r, isWaveTheme as i } from "../../lib/theme.mjs";
|
|
5
|
+
import * as a from "react";
|
|
6
|
+
import { jsx as o } from "react/jsx-runtime";
|
|
7
|
+
//#region src/components/provider/WaveProvider.tsx
|
|
8
|
+
var s = a.createContext({
|
|
9
|
+
theme: "light",
|
|
10
|
+
dir: "ltr",
|
|
11
|
+
themeClassName: "",
|
|
12
|
+
portalContainer: null,
|
|
13
|
+
hasProvider: !1
|
|
14
|
+
});
|
|
15
|
+
function c() {
|
|
16
|
+
return a.useContext(s);
|
|
17
|
+
}
|
|
18
|
+
var l = ({ theme: c, dir: l, portalContainer: u, children: d, className: f, ref: p, ...m }) => {
|
|
19
|
+
let h = a.useContext(s), g = c ?? h.theme, _ = l ?? h.dir, v = u === void 0 ? h.portalContainer : u, y = i(g) ? g : "light", b = r(y);
|
|
20
|
+
a.useEffect(() => {
|
|
21
|
+
i(g) || t(`WaveProvider:theme:${String(g)}`, `WaveProvider: unknown theme "${String(g)}". Valid themes: ${n.join(", ")}. Using "light".`);
|
|
22
|
+
}, [g]);
|
|
23
|
+
let x = a.useMemo(() => ({
|
|
24
|
+
theme: y,
|
|
25
|
+
dir: _,
|
|
26
|
+
themeClassName: b,
|
|
27
|
+
portalContainer: v,
|
|
28
|
+
hasProvider: !0
|
|
29
|
+
}), [
|
|
30
|
+
y,
|
|
31
|
+
_,
|
|
32
|
+
b,
|
|
33
|
+
v
|
|
34
|
+
]);
|
|
35
|
+
return /* @__PURE__ */ o(s.Provider, {
|
|
36
|
+
value: x,
|
|
37
|
+
children: /* @__PURE__ */ o("div", {
|
|
38
|
+
...m,
|
|
39
|
+
ref: p,
|
|
40
|
+
dir: _,
|
|
41
|
+
"data-wave-theme": y,
|
|
42
|
+
className: e("wave-root", b, "bg-background text-foreground font-wave text-body-1", f),
|
|
43
|
+
children: d
|
|
44
|
+
})
|
|
45
|
+
});
|
|
46
|
+
};
|
|
47
|
+
l.displayName = "WaveProvider";
|
|
48
|
+
//#endregion
|
|
49
|
+
export { l as WaveProvider, r as getThemeClassName, c as useWaveTheme };
|
|
50
|
+
|
|
51
|
+
//# sourceMappingURL=WaveProvider.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WaveProvider.mjs","names":["React","WaveContext","useWaveTheme","WaveProvider","themeProp","dirProp","portalContainerProp","rest","parent","theme","dir","portalContainer","resolvedTheme","isWaveTheme","themeClassName","getThemeClassName","warnOnce","WAVE_THEMES","value","cn","className"],"sources":["../../../src/components/provider/WaveProvider.tsx"],"sourcesContent":["import * as React from 'react';\nimport { cn } from '../../lib/cn';\nimport { warnOnce } from '../../lib/dev';\nimport { getThemeClassName, isWaveTheme, WAVE_THEMES, type WaveTheme } from '../../lib/theme';\n\n// The theme helper lives in server-safe src/lib (no \"use client\"), so React Server Components can\n// call it; it stays exported from here too.\nexport { getThemeClassName } from '../../lib/theme';\nexport type { WaveTheme } from '../../lib/theme';\n\n/** Text direction for bidirectional layout support. */\nexport type WaveDir = 'ltr' | 'rtl';\n\n/** Props accepted by {@link WaveProvider}. */\nexport interface WaveProviderProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Visual theme applied to the subtree. Providers can be nested in any order: each root declares\n * its theme's tokens, so a light panel inside a dark app (and the reverse) renders correctly.\n * @default the enclosing WaveProvider's theme, else 'light'\n */\n theme?: WaveTheme;\n /**\n * Text direction for the subtree (also read by portaled overlays and keyboard navigation).\n * @default the enclosing WaveProvider's direction, else 'ltr'\n */\n dir?: WaveDir;\n /**\n * Element that portaled overlays (dialogs, popovers, menus, toasts) render into. `null` renders\n * them into `document.body`, also inside a provider that sets a container.\n * @default the enclosing WaveProvider's container, else document.body\n */\n portalContainer?: HTMLElement | null;\n /** Content rendered inside the themed container. */\n children: React.ReactNode;\n /** Ref to the themed root `<div>`. */\n ref?: React.Ref<HTMLDivElement>;\n}\n\n/** Value provided by {@link WaveProvider} and returned by {@link useWaveTheme}. */\nexport interface WaveContextValue {\n /** The active theme. */\n theme: WaveTheme;\n /** The active text direction. */\n dir: WaveDir;\n /**\n * Theme classes of the nearest provider (see {@link getThemeClassName}); portals put them on\n * their wrapper so overlays inherit the theme. `''` outside a provider (the page's own theme).\n */\n themeClassName: string;\n /** Element portaled overlays render into; `null` means `document.body`. */\n portalContainer: HTMLElement | null;\n /** `false` when no {@link WaveProvider} is above the caller (the defaults are returned). */\n hasProvider: boolean;\n}\n\nconst DEFAULT_CONTEXT: WaveContextValue = {\n theme: 'light',\n dir: 'ltr',\n themeClassName: '',\n portalContainer: null,\n hasProvider: false,\n};\n\nconst WaveContext = React.createContext<WaveContextValue>(DEFAULT_CONTEXT);\n\n/**\n * Reads the theme, direction, theme classes and portal container of the nearest\n * {@link WaveProvider}. Outside a provider it returns light/ltr defaults with `hasProvider: false`.\n *\n * @returns The {@link WaveContextValue} of the nearest provider.\n */\nexport function useWaveTheme(): WaveContextValue {\n return React.useContext(WaveContext);\n}\n\n/**\n * Applies Wave theming to an application or subtree.\n *\n * - Renders a `<div class=\"wave-root wave-<theme>\">` that declares the theme's tokens and paints\n * the themed background, text colour and font (`bg-background text-foreground font-wave\n * text-body-1`; a `className` passed by you wins). The precompiled `./styles` entry scopes its base\n * styles and native-element reset to this root, so it is required there.\n * - Sets `dir` and `data-wave-theme` on the root. An unknown `theme` value (from untyped code)\n * falls back to `'light'` — classes, `data-wave-theme` and the context value — and warns once in\n * development.\n * - Provides theme, direction, theme classes and the portal container through context, so\n * portaled overlays render with the same theme and direction.\n * - Nests: a provider inherits every prop it omits (`theme`, `dir`, `portalContainer`) from the\n * enclosing provider, so `<WaveProvider theme=\"light\">` inside an RTL app is a light panel that\n * stays right-to-left and keeps the app's portal container. At the top level the defaults are\n * `'light'`, `'ltr'` and `document.body`.\n */\nexport const WaveProvider = ({\n theme: themeProp,\n dir: dirProp,\n portalContainer: portalContainerProp,\n children,\n className,\n ref,\n ...rest\n}: WaveProviderProps) => {\n // Omitted props come from the enclosing provider; outside one, DEFAULT_CONTEXT supplies the\n // top-level defaults. An explicit `portalContainer={null}` means document.body, so only\n // `undefined` inherits.\n const parent = React.useContext(WaveContext);\n const theme = themeProp ?? parent.theme;\n const dir = dirProp ?? parent.dir;\n const portalContainer =\n portalContainerProp === undefined ? parent.portalContainer : portalContainerProp;\n\n // An unknown value (untyped callers) renders, and is reported, as the light theme.\n const resolvedTheme: WaveTheme = isWaveTheme(theme) ? theme : 'light';\n const themeClassName = getThemeClassName(resolvedTheme);\n\n React.useEffect(() => {\n if (!isWaveTheme(theme)) {\n warnOnce(\n `WaveProvider:theme:${String(theme)}`,\n `WaveProvider: unknown theme \"${String(theme)}\". Valid themes: ${WAVE_THEMES.join(', ')}. Using \"light\".`,\n );\n }\n }, [theme]);\n\n const value = React.useMemo<WaveContextValue>(\n () => ({ theme: resolvedTheme, dir, themeClassName, portalContainer, hasProvider: true }),\n [resolvedTheme, dir, themeClassName, portalContainer],\n );\n\n return (\n <WaveContext.Provider value={value}>\n <div\n {...rest}\n ref={ref}\n dir={dir}\n data-wave-theme={resolvedTheme}\n className={cn(\n 'wave-root',\n themeClassName,\n 'bg-background text-foreground font-wave text-body-1',\n className,\n )}\n >\n {children}\n </div>\n </WaveContext.Provider>\n );\n};\n\nWaveProvider.displayName = 'WaveProvider';\n"],"mappings":";;;;;;;AA+DA,IAAMC,IAAcD,EAAM,cAAgC;CAPxD,OAAO;CACP,KAAK;CACL,gBAAgB;CAChB,iBAAiB;CACjB,aAAa;AAG2C,CAAe;AAQzE,SAAgBE,IAAiC;CAC/C,OAAOF,EAAM,WAAWC,CAAW;AACrC;AAmBA,IAAaE,KAAgB,EAC3B,OAAOC,GACP,KAAKC,GACL,iBAAiBC,GACjB,aACA,cACA,QACA,GAAGC,QACoB;CAIvB,IAAMC,IAASR,EAAM,WAAWC,CAAW,GACrCQ,IAAQL,KAAaI,EAAO,OAC5BE,IAAML,KAAWG,EAAO,KACxBG,IACJL,MAAwB,KAAA,IAAYE,EAAO,kBAAkBF,GAGzDM,IAA2BC,EAAYJ,CAAK,IAAIA,IAAQ,SACxDK,IAAiBC,EAAkBH,CAAa;CAEtD,EAAM,gBAAgB;EACpB,AAAKC,EAAYJ,CAAK,KACpBO,EACE,sBAAsB,OAAOP,CAAK,KAClC,gCAAgC,OAAOA,CAAK,EAAE,mBAAmBQ,EAAY,KAAK,IAAI,EAAE,iBAC1F;CAEJ,GAAG,CAACR,CAAK,CAAC;CAEV,IAAMS,IAAQlB,EAAM,eACX;EAAE,OAAOY;EAAe;EAAK;EAAgB;EAAiB,aAAa;CAAK,IACvF;EAACA;EAAeF;EAAKI;EAAgBH;CAAe,CACtD;CAEA,OACE,kBAACV,EAAY,UAAb;EAA6B;EAC3B,UAAA,kBAAC,OAAD;GACE,GAAIM;GACC;GACA;GACL,mBAAiBK;GACjB,WAAWO,EACT,aACAL,GACA,uDACAM,CACF;GAEC;EACE,CAAA;CACe,CAAA;AAE1B;AAEA,EAAa,cAAc"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("../../lib/cn.cjs"),n=require("../../lib/children.cjs"),r=require("../../lib/dev.cjs"),i=require("../../lib/composeEventHandlers.cjs"),a=require("../../hooks/useControllable.cjs"),o=require("../../hooks/useId.cjs"),s=require("../../hooks/useMergedRefs.cjs"),c=require("../../lib/styles.cjs"),l=require("./useGridNavigation.cjs");let u=require("react");u=e.__toESM(u,1);let d=require("react/jsx-runtime");var f=`Select all rows`,p=`Selection`;function m(e,t=!1){let n=new Set(e),r=new Map,i=0,a=`none`,o=t,s,c=new Set,l=new Set,u=e=>{for(let t of Array.from(e))t()},d=()=>{if(s!==void 0)return s;let e=null;for(let t of n){if(r.has(t)){e=t;break}e??=t}return s=e,e},f=e=>{if(n.size<2||!n.has(e))return;let t=s;s=void 0,o&&d()!==t&&u(c)},p=()=>{let e=i===0?`none`:i===r.size?`all`:`some`;e!==a&&(a=e,u(l))},m=e=>t=>(e.add(t),()=>{e.delete(t)});return{subscribe:m(c),subscribeSelectAll:m(l),register(e){let t=r.get(e)??0;r.set(e,t+1),t===0&&n.has(e)&&(i+=1),p(),t===0&&f(e);let a=!1;return()=>{if(a)return;a=!0;let t=(r.get(e)??0)-1;if(t>0){r.set(e,t);return}r.delete(e),n.has(e)&&--i,p(),f(e)}},setSelected(e){let t=new Set(e);if(!(t.size===n.size&&e.every(e=>n.has(e)))){n=t,s=void 0,i=0;for(let e of t)r.has(e)&&(i+=1);u(c),p()}},setSingleMode(e){o=e},isSelected(e,t=!1){return t?d()===e:n.has(e)},countRegistrations(e){return r.get(e)??0},getSelectAllState(){return a},getRegistered(){return Array.from(r.keys())},prune(e){return e.filter(e=>r.has(e))}}}function h(){let e=new Map,t=new Set,n=null,r=()=>{let r=null,i=null;for(let[t,a]of e){let o=a();if(!o){if(n!==null&&e.has(n))return;continue}(!i||o.compareDocumentPosition(i)&Node.DOCUMENT_POSITION_FOLLOWING)&&(r=t,i=o)}if(r===null&&(r=e.keys().next().value??null),r!==n){n=r;for(let e of Array.from(t))e()}};return{subscribe(e){return t.add(e),()=>{t.delete(e)}},register(t,n){return e.set(t,n),r(),()=>{e.delete(t),r()}},getFirst:()=>n,refresh:r}}var g=u.createContext(null),_=u.createContext(null),v=u.createContext(`body`),y=u.createContext(null),b=u.createContext(!0),x={selectionMode:`none`,store:m([]),toggleRow:()=>{},toggleAll:()=>{},radioName:``,selectAllLabel:f,selectionHeaderLabel:p},S={sort:null,requestSort:()=>{}};function C(e){return u.useContext(g)||(r.reportMissingContext(e,`DataGrid`),x)}function w(e){return u.useContext(_)||(r.reportMissingContext(e,`DataGrid`),S)}var T=[];function E(e){return e===void 0?void 0:Array.from(e)}function D(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}function O({key:e,node:t}){return(0,d.jsx)(u.Fragment,{children:t},e)}function ee(e){r.warnOnce(`DataGrid:duplicate-rowId:${e}`,`DataGrid: several rows share the rowId "${e}". Row ids must be unique within a DataGrid; rows with the same rowId are selected and deselected together.`)}var k=`px-4 py-3 border-b border-border`,A=`w-10 px-3 py-3 border-b border-border`,j=`accent-primary cursor-pointer`,M=e=>{let{sort:c,defaultSort:h,sortColumn:v,defaultSortColumn:y,sortDirection:b,defaultSortDirection:x,onSortChange:S,selectionMode:C=`none`,selectedItems:w,defaultSelectedItems:ee,onSelectedItemsChange:k,selectedKeys:A,defaultSelectedKeys:j,onSelectionChange:M,labels:N,columns:P,containerProps:F,children:I,className:R,onKeyDown:B,onFocus:V,onBlur:H,ref:te,...ne}=e,U=c!==void 0||h!==void 0,[re,ie]=u.useState(U);U&&!re&&ie(!0);let ae=re||U,oe=v!==void 0||b!==void 0;v!==void 0&&r.warnDeprecated(`DataGrid`,`sortColumn`,`sort`),b!==void 0&&r.warnDeprecated(`DataGrid`,`sortDirection`,`sort`),y!==void 0&&r.warnDeprecated(`DataGrid`,`defaultSortColumn`,`defaultSort`),x!==void 0&&r.warnDeprecated(`DataGrid`,`defaultSortDirection`,`defaultSort`);let se=U&&(oe||y!==void 0||x!==void 0);u.useEffect(()=>{se&&r.warnOnce(`DataGrid:mixed-sort`,"DataGrid: do not mix `sort`/`defaultSort` with the deprecated `sortColumn`/`sortDirection`/`defaultSortColumn`/`defaultSortDirection`. `sort`/`defaultSort` win.")},[se]),u.useEffect(()=>{U||(v!==void 0&&b===void 0?r.warnOnce(`DataGrid:sortColumn-without-sortDirection`,"DataGrid: `sortColumn` is controlled but `sortDirection` is not (mixed control). The direction is kept internally and toggles on repeated clicks, as in 0.4. Pass `sort` (`{ columnId, direction }`) to control both."):b!==void 0&&v===void 0&&r.warnOnce(`DataGrid:sortDirection-without-sortColumn`,"DataGrid: `sortDirection` is controlled but `sortColumn` is not (mixed control). The column is kept internally and follows the clicked header, as in 0.4. Pass `sort` (`{ columnId, direction }`) to control both."))},[U,v,b]);let[W,ce]=u.useState(()=>({column:y??``,direction:x??`ascending`})),le=u.useMemo(()=>{if(v===void 0&&b===void 0)return;let e=v??W.column;return e===``?null:{columnId:e,direction:b??W.direction}},[v,b,W]),ue=u.useMemo(()=>y?{columnId:y,direction:x??`ascending`}:null,[y,x]),de=U?c:le,fe=h===void 0?ue:h,[pe,me]=a.useControllable(de,fe,e=>{e&&(U||ce(t=>t.column===e.columnId&&t.direction===e.direction?t:{column:e.columnId,direction:e.direction}),S&&(ae?S(e):S(e.columnId,e.direction)))}),he=u.useCallback(e=>{me(t=>({columnId:e,direction:t?.columnId===e&&t.direction===`ascending`?`descending`:`ascending`}))},[me]),ge=u.useMemo(()=>({sort:pe,requestSort:he}),[pe,he]);M!==void 0&&r.warnDeprecated(`DataGrid`,`onSelectionChange`,`onSelectedItemsChange`);let _e=u.useMemo(()=>E(A),[A]),ve=u.useMemo(()=>E(j),[j]),ye=r.resolveDeprecatedProp(`DataGrid`,w,_e,`selectedKeys`,`selectedItems`),be=r.resolveDeprecatedProp(`DataGrid`,ee,ve,`defaultSelectedKeys`,`defaultSelectedItems`)??T,[G,K]=a.useControllable(ye,be,e=>{k?.([...e]),M?.(new Set(e))}),q=C===`single`,[J]=u.useState(()=>m(G,q));u.useLayoutEffect(()=>{J.setSelected(G)},[J,G]),u.useLayoutEffect(()=>{J.setSingleMode(q)},[J,q]);let xe=u.useCallback(e=>{K(t=>{let n=J.prune(t),r;return r=q?n[0]===e?[]:[e]:n.includes(e)?n.filter(t=>t!==e):[...n,e],D(r,t)?t:r})},[q,K,J]),Y=G.length;u.useEffect(()=>{q&&Y>1&&r.warnOnce(`DataGrid:single-several-selected`,`DataGrid: a single-selection grid (selectionMode "single") has ${Y} selected row ids; only the first one that is rendered is selected. Pass at most one id in \`selectedItems\`/\`defaultSelectedItems\`, or use selectionMode="multiple".`)},[q,Y]);let Se=u.useCallback(()=>{K(e=>{let t=J.prune(e),n=J.getRegistered(),r=n.length>0&&n.every(e=>t.includes(e))?[]:n;return D(r,e)?e:r})},[K,J]),Ce=o.useId(`wave-datagrid-selection`),we=N?.selectAll??f,Te=N?.selectionHeader??p,Ee=u.useMemo(()=>({selectionMode:C,store:J,toggleRow:xe,toggleAll:Se,radioName:Ce,selectAllLabel:we,selectionHeaderLabel:Te}),[C,J,xe,Se,Ce,we,Te]),{gridRef:De,gridProps:X}=l.useGridNavigation(),Oe=s.useMergedRefs(te,De),ke=I,Z=P?n.flattenChildren(I):[];if(P&&!Z.some(({node:e})=>n.isElementOfType(e,L))){let e=({node:e})=>n.isElementOfType(e,`caption`);ke=(0,d.jsxs)(d.Fragment,{children:[Z.filter(e).map(O),(0,d.jsx)(L,{children:(0,d.jsx)(`tr`,{children:P.map(e=>(0,d.jsx)(z,{columnId:e.id,sortable:e.sortable,children:e.label},e.id))})}),Z.filter(t=>!e(t)).map(O)]})}let{className:Ae,"aria-label":je,"aria-labelledby":Q,...Me}=F??{},$=Me.role!==void 0,Ne=!$&&(je!==void 0||Q!==void 0);return u.useEffect(()=>{Ne&&r.warnOnce(`DataGrid:container-name-without-role`,'DataGrid: `containerProps["aria-label"]`/`["aria-labelledby"]` is ignored because the wrapper has no role. Name the grid itself (`aria-label` on DataGrid), or pass a `role` (e.g. "region") in `containerProps` too.')},[Ne]),(0,d.jsx)(g.Provider,{value:Ee,children:(0,d.jsx)(_.Provider,{value:ge,children:(0,d.jsx)(`div`,{...Me,"aria-label":$?je:void 0,"aria-labelledby":$?Q:void 0,className:t.cn(`overflow-x-auto rounded-md border border-border`,Ae),children:(0,d.jsx)(`table`,{ref:Oe,role:`grid`,"aria-multiselectable":C===`multiple`||void 0,className:t.cn(`w-full border-separate border-spacing-0`,R),...ne,onKeyDown:i.composeEventHandlers(B,X.onKeyDown),onFocus:i.composeEventHandlers(V,X.onFocus,{checkDefaultPrevented:!1}),onBlur:i.composeEventHandlers(H,X.onBlur,{checkDefaultPrevented:!1}),children:ke})})})})};M.displayName=`DataGrid`;function N({selectionMode:e,ref:n}){let{store:r,toggleAll:i,selectAllLabel:a,selectionHeaderLabel:o}=C(`DataGrid.Header`),s=u.useSyncExternalStore(r.subscribeSelectAll,r.getSelectAllState,r.getSelectAllState),l=u.useRef(null),[f,p]=u.useState(0);return u.useLayoutEffect(()=>{l.current&&(l.current.indeterminate=s===`some`)},[s,f]),(0,d.jsx)(`th`,{ref:n,scope:`col`,"data-selection-cell":``,className:t.cn(A,`text-start`,c.focusRingInset),children:e===`multiple`?(0,d.jsx)(`input`,{ref:l,type:`checkbox`,"aria-label":a,checked:s===`all`,onChange:()=>{p(e=>e+1),i()},className:t.cn(j,c.focusRingInset)}):(0,d.jsx)(`span`,{className:`sr-only`,children:o})})}var P={subscribe:()=>()=>{},register:()=>()=>{},getFirst:()=>null,refresh:()=>{}};function F({selectionMode:e,initialFirst:n}){let r=u.useContext(y)??P,[i]=u.useState(()=>({})),a=u.useRef(null),o=u.useCallback(()=>{let e=r.getFirst();return e===null?n:e===i},[r,i,n]),s=u.useCallback(()=>n,[n]),l=u.useSyncExternalStore(r.subscribe,o,s);return u.useLayoutEffect(()=>r.register(i,()=>a.current),[r,i]),l?(0,d.jsx)(N,{ref:a,selectionMode:e}):(0,d.jsx)(`td`,{ref:a,"data-selection-cell":``,className:t.cn(A,c.focusRingInset)})}function I(e,t){let r=!0,i=e=>u.Children.map(e,e=>{if(n.isElementOfType(e,u.Fragment))return u.cloneElement(e,void 0,i(e.props.children));if(!u.isValidElement(e))return e;let a=r;if(r=!1,n.isElementOfType(e,`tr`)){let n=t===`none`?null:(0,d.jsx)(F,{selectionMode:t,initialFirst:a});return u.cloneElement(e,void 0,n,e.props.children)}return(0,d.jsx)(b.Provider,{value:a,children:e})});return i(e)}var L=({children:e,className:n,ref:i,...a})=>{let{selectionMode:o}=C(`DataGrid.Header`),[c,l]=u.useState(null),f=s.useMergedRefs(i,l),[p]=u.useState(h),m=I(e,o);return u.useLayoutEffect(()=>{p.refresh()}),u.useEffect(()=>{r.isDev&&c&&o!==`none`&&Array.from(c.rows).some(e=>e.cells.length>0&&!e.cells[0].hasAttribute(`data-selection-cell`))&&r.warnOnce(`DataGrid.Header:missing-selection-cell`,"DataGrid.Header: a header row has no selection column header cell, so the header has one column fewer than the selectable rows. Render header rows as `<tr>` children of DataGrid.Header (a Fragment is fine), or use `DataGrid.Row` for a header row that another component renders.")}),(0,d.jsx)(v.Provider,{value:`header`,children:(0,d.jsx)(y.Provider,{value:p,children:(0,d.jsx)(`thead`,{ref:f,className:t.cn(`bg-card`,n),...a,children:m})})})};L.displayName=`DataGridHeader`;var R=e=>(0,d.jsx)(`svg`,{className:`h-3 w-3 shrink-0`,viewBox:`0 0 12 12`,fill:`currentColor`,"aria-hidden":`true`,focusable:`false`,children:e===`ascending`?(0,d.jsx)(`path`,{d:`M6 2L10 8H2L6 2Z`}):(0,d.jsx)(`path`,{d:`M6 10L2 4H10L6 10Z`})}),z=({columnId:e,sortable:n=!1,children:a,className:o,onClick:s,ref:l,...f})=>{let{sort:p,requestSort:m}=w(`DataGrid.HeaderCell`),h=n&&e?e:void 0,g=h!==void 0&&p?.columnId===h?p.direction:null,_=e=>{let t=e.currentTarget.firstElementChild;h!==void 0&&t?.localName===`button`&&t.contains(e.target)&&m(h)};return u.useEffect(()=>{n&&!e&&r.warnOnce(`DataGrid.HeaderCell:sortable-without-columnId`,"DataGrid.HeaderCell: `sortable` needs a `columnId`; the header is rendered as not sortable.")},[n,e]),(0,d.jsx)(`th`,{ref:l,scope:`col`,"aria-sort":h===void 0?void 0:g??`none`,className:t.cn(k,`text-start align-middle font-semibold text-caption-1 uppercase tracking-wider`,c.focusRingInset,h!==void 0&&`p-0 hover:bg-subtle-hover`,o),...f,onClick:h===void 0?s:i.composeEventHandlers(s,_),children:h===void 0?(0,d.jsx)(`span`,{className:`inline-flex items-center gap-1`,children:a}):(0,d.jsxs)(`button`,{type:`button`,className:t.cn(`inline-flex w-full cursor-pointer select-none items-center gap-1 border-0 bg-transparent px-4 py-3 text-start text-inherit [font:inherit] uppercase tracking-wider`,c.focusRingInset),children:[a,g&&R(g)]})})};z.displayName=`DataGridHeaderCell`;var B=({children:e,className:t,ref:n,...r})=>(0,d.jsx)(v.Provider,{value:`body`,children:(0,d.jsx)(`tbody`,{ref:n,className:t,...r,children:e})});B.displayName=`DataGridBody`;var V=({rowId:e,selectionLabel:a,children:s,className:l,onKeyDown:f,ref:p,...m})=>{let{selectionMode:h,store:g,toggleRow:_,radioName:y}=C(`DataGrid.Row`),x=u.useContext(v),S=u.useContext(b),w=x===`header`,T=h!==`none`&&!w,E=o.useId(`wave-datagrid-row-label`),D=h===`single`,k=u.useCallback(()=>e!==void 0&&g.isSelected(e,D),[e,g,D]),M=u.useSyncExternalStore(g.subscribe,k,k);u.useLayoutEffect(()=>{if(e===void 0||w)return;let t=g.register(e);return r.isDev&&g.countRegistrations(e)>1&&ee(e),t},[g,e,w]),u.useEffect(()=>{T&&e===void 0&&r.warnOnce(`DataGrid.Row:missing-rowId`,"DataGrid.Row: a selectable grid needs a `rowId` on every row; this row has no selection control.")},[T,e]);let N=T&&e!==void 0&&a===void 0,P=t=>{if(!T||e===void 0||t.key!==` `)return;let n=t.target;(n===t.currentTarget||n.parentElement===t.currentTarget)&&(t.preventDefault(),_(e))},I=n.flattenChildren(s),L,R=-1;if(N){let e=I.findIndex(({node:e})=>n.isElementOfType(e,H,`td`,`th`));if(e>=0){let t=I[e].node;L=t.props.id??E,t.props.id===void 0&&(R=e)}}let z=I.map(({key:e,node:t},n)=>O({key:e,node:n===R?u.cloneElement(t,{id:E}):t})),B=N&&L===void 0;u.useEffect(()=>{B&&r.warnOnce(`DataGrid.Row:selection-label`,'DataGrid.Row: no child is a `DataGrid.Cell`, `<td>` or `<th>` element, so the row selection control is named "Select row". Pass `selectionLabel` (a cell rendered by another component is not seen).')},[B]);let V=null;return w&&h!==`none`?V=(0,d.jsx)(F,{selectionMode:h,initialFirst:S}):T&&(V=(0,d.jsx)(`td`,{role:`gridcell`,"data-selection-cell":``,className:t.cn(A,c.focusRingInset),children:e!==void 0&&(0,d.jsx)(`input`,{type:h===`multiple`?`checkbox`:`radio`,name:h===`single`?y:void 0,form:h===`single`?``:void 0,checked:M,onChange:()=>_(e),"aria-label":a??(L?void 0:`Select row`),"aria-labelledby":a===void 0?L:void 0,className:t.cn(j,`focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-ring`)})})),(0,d.jsxs)(`tr`,{ref:p,className:t.cn(!w&&`hover:bg-subtle-hover data-[selected]:bg-selected transition-colors motion-reduce:transition-none`,T&&M&&c.forcedColors.selectedContainer,l),"aria-selected":T?M:void 0,"data-selected":T&&M?``:void 0,...m,onKeyDown:i.composeEventHandlers(f,P),children:[V,z]})};V.displayName=`DataGridRow`;var H=({children:e,className:n,ref:r,...i})=>(0,d.jsx)(`td`,{ref:r,role:`gridcell`,className:t.cn(k,`text-body-1`,c.focusRingInset,n),...i,children:e});H.displayName=`DataGridCell`;var te=Object.assign(M,{Header:L,HeaderCell:z,Body:B,Row:V,Cell:H});exports.DataGrid=te,exports.DataGridBody=B,exports.DataGridCell=H,exports.DataGridHeader=L,exports.DataGridHeaderCell=z,exports.DataGridRow=V,exports.createSelectionStore=m;
|
|
2
|
+
//# sourceMappingURL=DataGrid.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataGrid.cjs","names":["React","useControllable","resolveDeprecatedProp","useId","useGridNavigation","useMergedRefs","flattenChildren","isElementOfType","_Fragment","cn","composeEventHandlers","focusRingInset","isDev","forcedColors","require_runtime","require_cn","require_children","require_dev","require_composeEventHandlers","require_useControllable","require_useId","require_useMergedRefs","require_styles","require_useGridNavigation","react","react_jsx_runtime","DEFAULT_SELECT_ALL_LABEL","DEFAULT_SELECTION_HEADER_LABEL","createSelectionStore","selected","initial","registered","selectedRegistered","selectAll","singleMode","initialSingleMode","singleId","rowListeners","selectAllListeners","notify","listener","listeners","getSingleId","first","rowId","onRegistrationChange","previous","updateSelectAll","next","subscribeTo","count","done","remaining","items","item","single","createHeaderSlotRegistry","slots","update","nextCell","slot","getCell","cell","DataGridContext","DataGridSortContext","DataGridSectionContext","DataGridHeaderSlotsContext","DataGridHeaderRowHintContext","INERT_CONTEXT","INERT_SORT_CONTEXT","useDataGridContext","component","useDataGridSortContext","EMPTY_ITEMS","toItems","keys","sameItems","a","b","index","renderFlatChild","node","key","warnDuplicateRowId","cellBase","selectionCell","nativeControl","DataGridRoot","sortProp","sortColumnProp","sortDirectionProp","selectedItemsProp","rest","props","usesSortApi","defaultSort","sortApiMode","setSortApiMode","objectCallbacks","legacySortControlled","defaultSortColumn","defaultSortDirection","mixedSortApi","legacyHalves","setLegacyHalves","legacyControlledSort","column","legacyDefaultSort","controlledSort","initialSort","sort","setSort","onSortChange","requestSort","columnId","sortContext","onSelectionChange","legacySelected","selectedKeys","legacyDefaultSelected","defaultSelectedKeys","controlledSelected","defaultSelected","defaultSelectedItems","setSelected","onSelectedItemsChange","selectionMode","store","toggleRow","effective","selectedCount","toggleAll","all","radioName","selectAllLabel","labels","selectionHeaderLabel","context","mergedRef","ref","gridRef","content","children","flatChildren","columns","DataGridHeader","isCaption","DataGridHeaderCell","child","containerClassName","containerLabel","containerLabelledBy","containerRest","containerProps","containerHasRole","droppedContainerName","className","onKeyDown","gridProps","onFocus","onBlur","DataGridSelectionHeaderCell","state","inputRef","clicks","setClicks","INERT_HEADER_SLOTS","DataGridSelectionHeaderSlot","cellRef","getIsFirst","initialFirst","getServerIsFirst","isFirst","withSelectionHeaderSlots","visit","nodes","thead","setThead","row","sortIcon","direction","sortColumnId","sortable","sortedDirection","sortOnButtonClick","button","event","onClick","DataGridBody","DataGridRow","section","firstHeaderRowHint","inHeader","selectable","labelId","getSelected","isSelected","unregister","unlabelled","selectionLabel","handleKeyDown","target","labelledBy","idCellIndex","firstCellIndex","DataGridCell","firstCell","needsLabel","selectionCellElement","DataGrid"],"sources":["../../../src/components/table/DataGrid.tsx"],"sourcesContent":["import * as React from 'react';\nimport { cn } from '../../lib/cn';\nimport { flattenChildren, isElementOfType } from '../../lib/children';\nimport { composeEventHandlers } from '../../lib/composeEventHandlers';\nimport {\n isDev,\n reportMissingContext,\n resolveDeprecatedProp,\n warnDeprecated,\n warnOnce,\n} from '../../lib/dev';\nimport { focusRingInset, forcedColors } from '../../lib/styles';\nimport type { SelectionMode } from '../../lib/types';\nimport { useControllable } from '../../hooks/useControllable';\nimport { useId } from '../../hooks/useId';\nimport { useMergedRefs } from '../../hooks/useMergedRefs';\nimport { useGridNavigation } from './useGridNavigation';\n\nexport type SortDirection = 'ascending' | 'descending';\n\n/** The sort state of a DataGrid: the sorted column and its direction. */\nexport interface DataGridSort {\n /** The `columnId` of the sorted column. */\n columnId: string;\n /** The sort direction. */\n direction: SortDirection;\n}\n\n/** Defines a column in the DataGrid. */\nexport interface DataGridColumn {\n /** Unique identifier for the column (the header cell's `columnId`). */\n id: string;\n /** Display label for the column header. */\n label: string;\n /** Whether the column supports sorting. */\n sortable?: boolean;\n}\n\n/** The built-in text of a DataGrid, for localization (see `DataGridBaseProps.labels`). */\nexport interface DataGridLabels {\n /** Accessible name of the select-all checkbox in the header (`selectionMode=\"multiple\"`).\n * @default 'Select all rows'\n */\n selectAll?: string;\n /**\n * Visually hidden text of the selection column's header cell (`selectionMode=\"single\"`), which\n * names that column.\n * @default 'Selection'\n */\n selectionHeader?: string;\n}\n\nconst DEFAULT_SELECT_ALL_LABEL = 'Select all rows';\nconst DEFAULT_SELECTION_HEADER_LABEL = 'Selection';\n\n/** Props of every DataGrid, whatever sort API it uses. */\nexport interface DataGridBaseProps extends React.HTMLAttributes<HTMLTableElement> {\n /**\n * Column definitions. When given and no `DataGrid.Header` child is present, the header row\n * (including the selection column) is rendered from them: `id` becomes the header cell's\n * `columnId`, `label` its content, `sortable` makes it a sort button.\n */\n columns?: readonly DataGridColumn[];\n /**\n * Row selection mode. `'multiple'` adds a checkbox column with a \"Select all rows\" header\n * checkbox; `'single'` adds a radio column (its header reads \"Selection\" to assistive\n * technology). `labels` localizes both texts.\n * @default 'none'\n */\n selectionMode?: 'none' | SelectionMode;\n /**\n * The name of the select-all checkbox and the header text of the selection column, for\n * localization. Unset members keep their English defaults. Rows are named with their own\n * `selectionLabel`.\n */\n labels?: DataGridLabels;\n /**\n * Controlled selected row ids (`DataGrid.Row` `rowId`). In single mode pass at most one id: with\n * several, only the first one whose row is rendered is selected (a development warning says so).\n */\n selectedItems?: readonly string[];\n /** Initially selected row ids (uncontrolled). In single mode, at most one (see `selectedItems`). */\n defaultSelectedItems?: readonly string[];\n /**\n * Called with the new selected row ids when the selection changes. Ids of rows that are not\n * rendered are left out of the reported selection and of the select-all state, so the next\n * change drops them. Until that change an uncontrolled grid still holds such an id: a row\n * re-added with the same `rowId` before then is shown selected again.\n */\n onSelectedItemsChange?: (selectedItems: string[]) => void;\n /** @deprecated Use `selectedItems` (an array). A `Set` or an array is accepted. */\n selectedKeys?: ReadonlySet<string> | readonly string[];\n /** @deprecated Use `defaultSelectedItems` (an array). A `Set` or an array is accepted. */\n defaultSelectedKeys?: ReadonlySet<string> | readonly string[];\n /** @deprecated Use `onSelectedItemsChange`, which receives an array. Both are called. */\n onSelectionChange?: (keys: Set<string>) => void;\n /**\n * Props for the wrapper `<div>` around the `<table>`: a horizontally scrollable container\n * (`overflow-x-auto`). Use it for its className, style (e.g. a max height) or ref. The wrapper\n * is not a tab stop (the grid's own cell tab stop scrolls it) and has no role, so its\n * `aria-label`/`aria-labelledby` are applied only together with a `role` (e.g. `'region'`);\n * without one they are dropped with a development warning. Name the grid with `aria-label`.\n */\n containerProps?: Omit<React.ComponentPropsWithRef<'div'>, 'children'>;\n /** DataGrid header, body, and row elements. */\n children: React.ReactNode;\n /** Ref to the `<table role=\"grid\">` element. */\n ref?: React.Ref<HTMLTableElement>;\n}\n\ninterface NoDeprecatedSortProps {\n sortColumn?: never;\n defaultSortColumn?: never;\n sortDirection?: never;\n defaultSortDirection?: never;\n}\n\n/** The 0.5 sort API, controlled: `sort` + `onSortChange(sort)`. */\nexport interface DataGridControlledSortProps extends NoDeprecatedSortProps {\n /** The controlled sort, or `null` for an unsorted grid. */\n sort: DataGridSort | null;\n /** Initial sort while `sort` is not given yet. */\n defaultSort?: DataGridSort | null;\n /**\n * Called with the new sort when a sortable header is activated. Sorting is controlled: the\n * consumer reorders the rows.\n */\n onSortChange?: (sort: DataGridSort) => void;\n}\n\n/** The 0.5 sort API, uncontrolled: `defaultSort` (`null` for none) + `onSortChange(sort)`. */\nexport interface DataGridUncontrolledSortProps extends NoDeprecatedSortProps {\n sort?: undefined;\n /** The initial sort, or `null` for an initially unsorted grid. */\n defaultSort: DataGridSort | null;\n /**\n * Called with the new sort when a sortable header is activated. Sorting is controlled: the\n * consumer reorders the rows.\n */\n onSortChange?: (sort: DataGridSort) => void;\n}\n\n/**\n * The 0.4 sort API: `onSortChange(columnId, direction)` and the deprecated `sortColumn`/\n * `sortDirection` props. It applies whenever neither `sort` nor `defaultSort` is given. As in 0.4,\n * the column and the direction can be controlled independently: the half that is not controlled is\n * kept internally and follows every sort request (mixed control, warned in development).\n */\nexport interface DataGridLegacySortProps {\n sort?: undefined;\n defaultSort?: undefined;\n /**\n * @deprecated Use `sort` (`{ columnId, direction }` or `null`). Without `sortDirection`, the\n * direction is kept internally (it toggles on repeated clicks).\n */\n sortColumn?: string;\n /** @deprecated Use `defaultSort`. */\n defaultSortColumn?: string;\n /**\n * @deprecated Use `sort`. Without `sortColumn`, the column is kept internally (it follows the\n * clicked header, starting from `defaultSortColumn`).\n */\n sortDirection?: SortDirection;\n /** @deprecated Use `defaultSort`. */\n defaultSortDirection?: SortDirection;\n /**\n * Called when a sortable header is activated, with the 0.4 arguments. Pass `sort` or\n * `defaultSort` to receive a `DataGridSort` object instead: `defaultSort={null}` turns the\n * object form on for an initially unsorted grid. A `sort` that is still `undefined` (e.g. while\n * data loads) does not: pass `sort={sort ?? null}`.\n *\n * @example\n * <DataGrid defaultSort={null} onSortChange={(sort) => setSort(sort)}>…</DataGrid>\n */\n onSortChange?: (columnId: string, direction: SortDirection) => void;\n}\n\n/**\n * Properties for the DataGrid component. The sort props form a union: `sort`/`defaultSort` with\n * `onSortChange(sort)` (0.5), or the 0.4 form `onSortChange(columnId, direction)` with the\n * deprecated `sortColumn`/`sortDirection`/`defaultSortColumn`/`defaultSortDirection`. The two\n * cannot be mixed.\n */\nexport type DataGridProps = DataGridBaseProps &\n (DataGridControlledSortProps | DataGridUncontrolledSortProps | DataGridLegacySortProps);\n\n/** Properties for the DataGridHeader sub-component. */\nexport interface DataGridHeaderProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n /**\n * Header row elements. Each `<tr>` child (also inside a Fragment) gets the selection column's\n * header cell prepended when the grid is selectable; a header row rendered by another component\n * should be a `DataGrid.Row`, which adds the cell itself. With several header rows (a grouped\n * header), only the first one gets the \"Select all rows\" control; later rows get an empty cell.\n */\n children: React.ReactNode;\n /** Ref to the `<thead>` element. */\n ref?: React.Ref<HTMLTableSectionElement>;\n}\n\n/** Properties for the DataGridHeaderCell sub-component. */\nexport interface DataGridHeaderCellProps extends React.ThHTMLAttributes<HTMLTableCellElement> {\n /** Column ID used for sort tracking. Required for `sortable`. */\n columnId?: string;\n /**\n * Whether this column can be sorted. The content is rendered inside a `<button>`; the header\n * cell carries `aria-sort`. Ignored (with a development warning) without `columnId`.\n * @default false\n */\n sortable?: boolean;\n /** Header cell content. */\n children: React.ReactNode;\n /** Ref to the `<th>` element. */\n ref?: React.Ref<HTMLTableCellElement>;\n}\n\n/** Properties for the DataGridBody sub-component. */\nexport interface DataGridBodyProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n /** DataGrid row elements. */\n children: React.ReactNode;\n /** Ref to the `<tbody>` element. */\n ref?: React.Ref<HTMLTableSectionElement>;\n}\n\n/** Properties for the DataGridRow sub-component. */\nexport interface DataGridRowProps extends React.HTMLAttributes<HTMLTableRowElement> {\n /**\n * Unique identifier for this row, used for selection (rows that share one are selected together;\n * a duplicate warns in development). A selectable grid renders no selection control (and warns\n * in development) for a row without it.\n */\n rowId?: string;\n /**\n * Accessible name of the row's selection control. Defaults to the row's first child that is a\n * `DataGrid.Cell`, `<td>` or `<th>` element (`aria-labelledby`); a cell that another component\n * renders is not seen, so pass `selectionLabel` when the row's first cell is one. Without such a\n * child the control is named \"Select row\" (with a development warning).\n */\n selectionLabel?: string;\n /** DataGrid cell elements. */\n children: React.ReactNode;\n /** Ref to the `<tr>` element. */\n ref?: React.Ref<HTMLTableRowElement>;\n}\n\n/** Properties for the DataGridCell sub-component. */\nexport interface DataGridCellProps extends React.TdHTMLAttributes<HTMLTableCellElement> {\n /** Cell content. */\n children: React.ReactNode;\n /** Ref to the `<td>` element. */\n ref?: React.Ref<HTMLTableCellElement>;\n}\n\n// ---------------------------------------------------------------------------\n// Selection store\n// ---------------------------------------------------------------------------\n\ntype SelectAllState = 'all' | 'some' | 'none';\n\n/**\n * Selection state shared with the rows through `useSyncExternalStore`, so toggling one row\n * re-renders only that row (and the select-all header cell). The root pushes the committed\n * selection in a layout effect; rows register their ids. The effective selection is always\n * `selected ∩ registered`, derived on read (no pruning effect).\n *\n * @internal Not exported from the package (exported for its unit tests).\n */\nexport interface SelectionStore {\n /**\n * Row subscription: notified only when the selection changes. Rows registering or unregistering\n * notify no row, so adding or removing k of n rows costs O(k), not O(k·n); the one exception is\n * single mode with several selected ids, where a row registering can move the selected row.\n */\n subscribe(listener: () => void): () => void;\n /**\n * Select-all subscription: notified only when {@link getSelectAllState} changes (through the\n * selection or through rows registering and unregistering).\n */\n subscribeSelectAll(listener: () => void): () => void;\n /** Registers a rendered row id; returns the unregister function. */\n register(rowId: string): () => void;\n /** How many rendered rows are registered with `rowId` (more than one: a duplicate). */\n countRegistrations(rowId: string): number;\n /** Sets the committed selection (layout effect of the root). */\n setSelected(items: readonly string[]): void;\n /**\n * Sets whether the grid is in single mode (layout effect of the root). Only then do rows\n * registering or unregistering re-check the one selected row of single mode and notify the rows.\n */\n setSingleMode(single: boolean): void;\n /**\n * Whether the row is selected. With `single`, only one row is: the first selected id (in\n * selection order) whose row is registered, else the first selected id (before any row\n * registered: the server render and the first client render).\n */\n isSelected(rowId: string, single?: boolean): boolean;\n /** Whether all, some or none of the registered rows are selected. O(1). */\n getSelectAllState(): SelectAllState;\n /** Registered row ids in registration order. */\n getRegistered(): string[];\n /** `items` restricted to registered rows (order of `items`). */\n prune(items: readonly string[]): string[];\n}\n\n/**\n * Creates the {@link SelectionStore} of one DataGrid.\n *\n * @internal Not exported from the package (exported for its unit tests).\n */\nexport function createSelectionStore(\n initial: readonly string[],\n initialSingleMode = false,\n): SelectionStore {\n let selected: ReadonlySet<string> = new Set(initial);\n /** Registered row id -> number of rows registered with it. */\n const registered = new Map<string, number>();\n /** How many registered row ids are selected (kept up to date, so select-all is O(1)). */\n let selectedRegistered = 0;\n let selectAll: SelectAllState = 'none';\n let singleMode = initialSingleMode;\n /** The one selected row of single mode (see `isSelected`); `undefined`: not computed yet. */\n let singleId: string | null | undefined;\n const rowListeners = new Set<() => void>();\n const selectAllListeners = new Set<() => void>();\n\n const notify = (listeners: Set<() => void>) => {\n for (const listener of Array.from(listeners)) listener();\n };\n\n /** Computed on read: O(selected ids) once per change, and only in single mode. */\n const getSingleId = (): string | null => {\n if (singleId !== undefined) return singleId;\n let first: string | null = null;\n for (const rowId of selected) {\n if (registered.has(rowId)) {\n first = rowId;\n break;\n }\n first ??= rowId;\n }\n singleId = first;\n return first;\n };\n\n /**\n * A row id registered or unregistered. With several selected ids, the one selected row of\n * single mode can move: in single mode it is re-checked and the rows are notified if it moved.\n */\n const onRegistrationChange = (rowId: string) => {\n if (selected.size < 2 || !selected.has(rowId)) return;\n const previous = singleId;\n singleId = undefined;\n if (singleMode && getSingleId() !== previous) notify(rowListeners);\n };\n\n const updateSelectAll = () => {\n const next: SelectAllState =\n selectedRegistered === 0 ? 'none' : selectedRegistered === registered.size ? 'all' : 'some';\n if (next === selectAll) return;\n selectAll = next;\n notify(selectAllListeners);\n };\n\n const subscribeTo = (listeners: Set<() => void>) => (listener: () => void) => {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n };\n\n return {\n subscribe: subscribeTo(rowListeners),\n subscribeSelectAll: subscribeTo(selectAllListeners),\n register(rowId) {\n const count = registered.get(rowId) ?? 0;\n registered.set(rowId, count + 1);\n if (count === 0 && selected.has(rowId)) selectedRegistered += 1;\n updateSelectAll();\n if (count === 0) onRegistrationChange(rowId);\n let done = false;\n return () => {\n if (done) return;\n done = true;\n const remaining = (registered.get(rowId) ?? 0) - 1;\n if (remaining > 0) {\n registered.set(rowId, remaining);\n return;\n }\n registered.delete(rowId);\n if (selected.has(rowId)) selectedRegistered -= 1;\n updateSelectAll();\n onRegistrationChange(rowId);\n };\n },\n setSelected(items) {\n const next = new Set(items);\n if (next.size === selected.size && items.every((item) => selected.has(item))) return;\n selected = next;\n singleId = undefined;\n selectedRegistered = 0;\n for (const rowId of next) if (registered.has(rowId)) selectedRegistered += 1;\n notify(rowListeners);\n updateSelectAll();\n },\n setSingleMode(single) {\n singleMode = single;\n },\n isSelected(rowId, single = false) {\n return single ? getSingleId() === rowId : selected.has(rowId);\n },\n countRegistrations(rowId) {\n return registered.get(rowId) ?? 0;\n },\n getSelectAllState() {\n return selectAll;\n },\n getRegistered() {\n return Array.from(registered.keys());\n },\n prune(items) {\n return items.filter((item) => registered.has(item));\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Header selection slots\n// ---------------------------------------------------------------------------\n\n/**\n * The selection column's header slots of one `DataGrid.Header`, one per header row. Only the first\n * slot in document order renders the \"Select all rows\" control (the \"Selection\" text in single\n * mode); the others render an empty cell, so a grouped header (several header rows) has one control\n * and every header row keeps the selection column.\n */\ninterface HeaderSlotRegistry {\n subscribe(listener: () => void): () => void;\n /** Registers a slot and a getter for its current cell; returns the unregister function. */\n register(slot: object, getCell: () => Element | null): () => void;\n /** The first slot in document order, or `null` while no slot is registered. */\n getFirst(): object | null;\n /** Re-checks the order: header rows can move without a slot mounting or unmounting. */\n refresh(): void;\n}\n\nfunction createHeaderSlotRegistry(): HeaderSlotRegistry {\n const slots = new Map<object, () => Element | null>();\n const listeners = new Set<() => void>();\n let first: object | null = null;\n\n const update = () => {\n let next: object | null = null;\n let nextCell: Element | null = null;\n for (const [slot, getCell] of slots) {\n const cell = getCell();\n if (!cell) {\n // A slot whose cell is being replaced (control <-> empty cell): keep the current order\n // until the next registration or header commit sees every cell again.\n if (first !== null && slots.has(first)) return;\n continue;\n }\n if (!nextCell || cell.compareDocumentPosition(nextCell) & Node.DOCUMENT_POSITION_FOLLOWING) {\n next = slot;\n nextCell = cell;\n }\n }\n if (next === null) next = slots.keys().next().value ?? null;\n if (next === first) return;\n first = next;\n for (const listener of Array.from(listeners)) listener();\n };\n\n return {\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n register(slot, getCell) {\n slots.set(slot, getCell);\n update();\n return () => {\n slots.delete(slot);\n update();\n };\n },\n getFirst: () => first,\n refresh: update,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Contexts\n// ---------------------------------------------------------------------------\n\ninterface DataGridContextValue {\n selectionMode: 'none' | SelectionMode;\n store: SelectionStore;\n /** Toggles one row (single mode: selects it alone, or clears it). */\n toggleRow: (rowId: string) => void;\n /** Selects every rendered row, or clears the selection when all are selected. */\n toggleAll: () => void;\n /** Shared `name` of the single-mode radios (they are kept out of any form with `form=\"\"`). */\n radioName: string;\n /** Name of the select-all checkbox (multiple mode). */\n selectAllLabel: string;\n /** Hidden header text of the selection column (single mode). */\n selectionHeaderLabel: string;\n}\n\ninterface DataGridSortContextValue {\n sort: DataGridSort | null;\n requestSort: (columnId: string) => void;\n}\n\ntype DataGridSection = 'header' | 'body';\n\nconst DataGridContext = React.createContext<DataGridContextValue | null>(null);\nconst DataGridSortContext = React.createContext<DataGridSortContextValue | null>(null);\n/** Whether a row is rendered in the header or the body (rows in a header get a header cell). */\nconst DataGridSectionContext = React.createContext<DataGridSection>('body');\n/** The header's selection slots (see {@link HeaderSlotRegistry}). */\nconst DataGridHeaderSlotsContext = React.createContext<HeaderSlotRegistry | null>(null);\n/**\n * Whether the header row below is the header's first row, as far as the header can tell from its\n * children. Only the initial (and server) render uses it; the slots then follow the DOM order.\n */\nconst DataGridHeaderRowHintContext = React.createContext(true);\n\nconst INERT_STORE = createSelectionStore([]);\nconst INERT_CONTEXT: DataGridContextValue = {\n selectionMode: 'none',\n store: INERT_STORE,\n toggleRow: () => {},\n toggleAll: () => {},\n radioName: '',\n selectAllLabel: DEFAULT_SELECT_ALL_LABEL,\n selectionHeaderLabel: DEFAULT_SELECTION_HEADER_LABEL,\n};\nconst INERT_SORT_CONTEXT: DataGridSortContextValue = { sort: null, requestSort: () => {} };\n\nfunction useDataGridContext(component: string): DataGridContextValue {\n const ctx = React.useContext(DataGridContext);\n if (ctx) return ctx;\n reportMissingContext(component, 'DataGrid');\n return INERT_CONTEXT;\n}\n\nfunction useDataGridSortContext(component: string): DataGridSortContextValue {\n const ctx = React.useContext(DataGridSortContext);\n if (ctx) return ctx;\n reportMissingContext(component, 'DataGrid');\n return INERT_SORT_CONTEXT;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst EMPTY_ITEMS: readonly string[] = [];\n\nfunction toItems(\n keys: ReadonlySet<string> | readonly string[] | undefined,\n): readonly string[] | undefined {\n return keys === undefined ? undefined : Array.from(keys);\n}\n\nfunction sameItems(a: readonly string[], b: readonly string[]): boolean {\n return a.length === b.length && a.every((item, index) => item === b[index]);\n}\n\n/** A child of {@link flattenChildren} under its flattened key (unique across the flattened list). */\nfunction renderFlatChild({ key, node }: { key: string; node: React.ReactNode }): React.ReactNode {\n return <React.Fragment key={key}>{node}</React.Fragment>;\n}\n\nfunction warnDuplicateRowId(rowId: string): void {\n warnOnce(\n `DataGrid:duplicate-rowId:${rowId}`,\n `DataGrid: several rows share the rowId \"${rowId}\". Row ids must be unique within a ` +\n 'DataGrid; rows with the same rowId are selected and deselected together.',\n );\n}\n\nconst cellBase = 'px-4 py-3 border-b border-border';\nconst selectionCell = 'w-10 px-3 py-3 border-b border-border';\nconst nativeControl = 'accent-primary cursor-pointer';\n\n// ---------------------------------------------------------------------------\n// DataGrid\n// ---------------------------------------------------------------------------\n\n// The component-level JSDoc sits on the exported `DataGrid` below.\nconst DataGridRoot = (props: DataGridProps) => {\n const {\n sort: sortProp,\n defaultSort,\n sortColumn: sortColumnProp,\n defaultSortColumn,\n sortDirection: sortDirectionProp,\n defaultSortDirection,\n onSortChange,\n selectionMode = 'none',\n selectedItems: selectedItemsProp,\n defaultSelectedItems,\n onSelectedItemsChange,\n selectedKeys,\n defaultSelectedKeys,\n onSelectionChange,\n labels,\n columns,\n containerProps,\n children,\n className,\n onKeyDown,\n onFocus,\n onBlur,\n ref,\n ...rest\n } = props;\n\n // --- sort -----------------------------------------------------------------\n /** 0.5 API: `onSortChange(sort)`. Sticky once `sort`/`defaultSort` was given. */\n const usesSortApi = sortProp !== undefined || defaultSort !== undefined;\n const [sortApiMode, setSortApiMode] = React.useState(usesSortApi);\n if (usesSortApi && !sortApiMode) setSortApiMode(true);\n const objectCallbacks = sortApiMode || usesSortApi;\n\n const legacySortControlled = sortColumnProp !== undefined || sortDirectionProp !== undefined;\n if (sortColumnProp !== undefined) warnDeprecated('DataGrid', 'sortColumn', 'sort');\n if (sortDirectionProp !== undefined) warnDeprecated('DataGrid', 'sortDirection', 'sort');\n if (defaultSortColumn !== undefined) {\n warnDeprecated('DataGrid', 'defaultSortColumn', 'defaultSort');\n }\n if (defaultSortDirection !== undefined) {\n warnDeprecated('DataGrid', 'defaultSortDirection', 'defaultSort');\n }\n const mixedSortApi =\n usesSortApi &&\n (legacySortControlled || defaultSortColumn !== undefined || defaultSortDirection !== undefined);\n\n React.useEffect(() => {\n if (mixedSortApi) {\n warnOnce(\n 'DataGrid:mixed-sort',\n 'DataGrid: do not mix `sort`/`defaultSort` with the deprecated `sortColumn`/`sortDirection`/' +\n '`defaultSortColumn`/`defaultSortDirection`. `sort`/`defaultSort` win.',\n );\n }\n }, [mixedSortApi]);\n // 0.4 mixed control: `sortColumn` and `sortDirection` are controlled independently. The half the\n // parent does not control is kept here (seeded from its default) and follows every sort request,\n // as 0.4 did, so repeated clicks still alternate and aria-sort shows what was reported.\n React.useEffect(() => {\n if (usesSortApi) return;\n if (sortColumnProp !== undefined && sortDirectionProp === undefined) {\n warnOnce(\n 'DataGrid:sortColumn-without-sortDirection',\n 'DataGrid: `sortColumn` is controlled but `sortDirection` is not (mixed control). The ' +\n 'direction is kept internally and toggles on repeated clicks, as in 0.4. Pass `sort` ' +\n '(`{ columnId, direction }`) to control both.',\n );\n } else if (sortDirectionProp !== undefined && sortColumnProp === undefined) {\n warnOnce(\n 'DataGrid:sortDirection-without-sortColumn',\n 'DataGrid: `sortDirection` is controlled but `sortColumn` is not (mixed control). The ' +\n 'column is kept internally and follows the clicked header, as in 0.4. Pass `sort` ' +\n '(`{ columnId, direction }`) to control both.',\n );\n }\n }, [usesSortApi, sortColumnProp, sortDirectionProp]);\n\n /** The uncontrolled halves of the 0.4 sort props (used while the other half is controlled). */\n const [legacyHalves, setLegacyHalves] = React.useState<{\n column: string;\n direction: SortDirection;\n }>(() => ({\n column: defaultSortColumn ?? '',\n direction: defaultSortDirection ?? 'ascending',\n }));\n\n const legacyControlledSort = React.useMemo<DataGridSort | null | undefined>(() => {\n if (sortColumnProp === undefined && sortDirectionProp === undefined) return undefined;\n const column = sortColumnProp ?? legacyHalves.column;\n return column === ''\n ? null\n : { columnId: column, direction: sortDirectionProp ?? legacyHalves.direction };\n }, [sortColumnProp, sortDirectionProp, legacyHalves]);\n\n const legacyDefaultSort = React.useMemo<DataGridSort | null>(\n () =>\n defaultSortColumn\n ? { columnId: defaultSortColumn, direction: defaultSortDirection ?? 'ascending' }\n : null,\n [defaultSortColumn, defaultSortDirection],\n );\n\n const controlledSort = usesSortApi ? sortProp : legacyControlledSort;\n const initialSort = defaultSort !== undefined ? defaultSort : legacyDefaultSort;\n\n const emitSortChange = (next: DataGridSort | null) => {\n if (!next) return;\n if (!usesSortApi) {\n setLegacyHalves((previous) =>\n previous.column === next.columnId && previous.direction === next.direction\n ? previous\n : { column: next.columnId, direction: next.direction },\n );\n }\n if (!onSortChange) return;\n if (objectCallbacks) {\n (onSortChange as (sort: DataGridSort) => void)(next);\n } else {\n const legacy = onSortChange as (columnId: string, direction: SortDirection) => void;\n legacy(next.columnId, next.direction);\n }\n };\n\n const [sort, setSort] = useControllable<DataGridSort | null>(\n controlledSort,\n initialSort,\n emitSortChange,\n );\n\n const requestSort = React.useCallback(\n (columnId: string) => {\n setSort((previous) => ({\n columnId,\n direction:\n previous?.columnId === columnId && previous.direction === 'ascending'\n ? 'descending'\n : 'ascending',\n }));\n },\n [setSort],\n );\n\n const sortContext = React.useMemo<DataGridSortContextValue>(\n () => ({ sort, requestSort }),\n [sort, requestSort],\n );\n\n // --- selection ------------------------------------------------------------\n if (onSelectionChange !== undefined) {\n warnDeprecated('DataGrid', 'onSelectionChange', 'onSelectedItemsChange');\n }\n const legacySelected = React.useMemo(() => toItems(selectedKeys), [selectedKeys]);\n const legacyDefaultSelected = React.useMemo(\n () => toItems(defaultSelectedKeys),\n [defaultSelectedKeys],\n );\n const controlledSelected = resolveDeprecatedProp(\n 'DataGrid',\n selectedItemsProp,\n legacySelected,\n 'selectedKeys',\n 'selectedItems',\n );\n const defaultSelected =\n resolveDeprecatedProp(\n 'DataGrid',\n defaultSelectedItems,\n legacyDefaultSelected,\n 'defaultSelectedKeys',\n 'defaultSelectedItems',\n ) ?? EMPTY_ITEMS;\n\n const emitSelectionChange = (next: readonly string[]) => {\n onSelectedItemsChange?.([...next]);\n onSelectionChange?.(new Set(next));\n };\n\n const [selected, setSelected] = useControllable<readonly string[]>(\n controlledSelected,\n defaultSelected,\n emitSelectionChange,\n );\n\n const single = selectionMode === 'single';\n const [store] = React.useState(() => createSelectionStore(selected, single));\n React.useLayoutEffect(() => {\n store.setSelected(selected);\n }, [store, selected]);\n React.useLayoutEffect(() => {\n store.setSingleMode(single);\n }, [store, single]);\n\n const toggleRow = React.useCallback(\n (rowId: string) => {\n setSelected((previous) => {\n const effective = store.prune(previous);\n let next: string[];\n if (single) {\n // Single mode shows the first selected row that is rendered (see the store).\n next = effective[0] === rowId ? [] : [rowId];\n } else {\n next = effective.includes(rowId)\n ? effective.filter((item) => item !== rowId)\n : [...effective, rowId];\n }\n return sameItems(next, previous) ? previous : next;\n });\n },\n [single, setSelected, store],\n );\n\n const selectedCount = selected.length;\n React.useEffect(() => {\n if (single && selectedCount > 1) {\n warnOnce(\n 'DataGrid:single-several-selected',\n `DataGrid: a single-selection grid (selectionMode \"single\") has ${selectedCount} selected row ids; only the first one that is rendered is selected. Pass at most one id in \\`selectedItems\\`/\\`defaultSelectedItems\\`, or use selectionMode=\"multiple\".`,\n );\n }\n }, [single, selectedCount]);\n\n const toggleAll = React.useCallback(() => {\n setSelected((previous) => {\n const effective = store.prune(previous);\n const all = store.getRegistered();\n const allSelected = all.length > 0 && all.every((rowId) => effective.includes(rowId));\n const next = allSelected ? [] : all;\n return sameItems(next, previous) ? previous : next;\n });\n }, [setSelected, store]);\n\n const radioName = useId('wave-datagrid-selection');\n const selectAllLabel = labels?.selectAll ?? DEFAULT_SELECT_ALL_LABEL;\n const selectionHeaderLabel = labels?.selectionHeader ?? DEFAULT_SELECTION_HEADER_LABEL;\n\n const context = React.useMemo<DataGridContextValue>(\n () => ({\n selectionMode,\n store,\n toggleRow,\n toggleAll,\n radioName,\n selectAllLabel,\n selectionHeaderLabel,\n }),\n [selectionMode, store, toggleRow, toggleAll, radioName, selectAllLabel, selectionHeaderLabel],\n );\n\n // --- keyboard -------------------------------------------------------------\n const { gridRef, gridProps } = useGridNavigation();\n const mergedRef = useMergedRefs<HTMLTableElement>(ref, gridRef);\n\n // --- header from columns ----------------------------------------------------\n let content: React.ReactNode = children;\n const flatChildren = columns ? flattenChildren(children) : [];\n if (columns && !flatChildren.some(({ node }) => isElementOfType(node, DataGridHeader))) {\n // A `<caption>` stays the table's first child, before the generated header.\n const isCaption = ({ node }: { node: React.ReactNode }) => isElementOfType(node, 'caption');\n content = (\n <>\n {flatChildren.filter(isCaption).map(renderFlatChild)}\n <DataGridHeader>\n <tr>\n {columns.map((column) => (\n <DataGridHeaderCell key={column.id} columnId={column.id} sortable={column.sortable}>\n {column.label}\n </DataGridHeaderCell>\n ))}\n </tr>\n </DataGridHeader>\n {flatChildren.filter((child) => !isCaption(child)).map(renderFlatChild)}\n </>\n );\n }\n\n const {\n className: containerClassName,\n 'aria-label': containerLabel,\n 'aria-labelledby': containerLabelledBy,\n ...containerRest\n } = containerProps ?? {};\n // The wrapper has no role of its own, and a name is prohibited on a role-less `<div>`: the\n // consumer's name is kept only together with a role.\n const containerHasRole = containerRest.role !== undefined;\n const droppedContainerName =\n !containerHasRole && (containerLabel !== undefined || containerLabelledBy !== undefined);\n\n React.useEffect(() => {\n if (droppedContainerName) {\n warnOnce(\n 'DataGrid:container-name-without-role',\n 'DataGrid: `containerProps[\"aria-label\"]`/`[\"aria-labelledby\"]` is ignored because the ' +\n 'wrapper has no role. Name the grid itself (`aria-label` on DataGrid), or pass a ' +\n '`role` (e.g. \"region\") in `containerProps` too.',\n );\n }\n }, [droppedContainerName]);\n\n return (\n <DataGridContext.Provider value={context}>\n <DataGridSortContext.Provider value={sortContext}>\n <div\n {...containerRest}\n aria-label={containerHasRole ? containerLabel : undefined}\n aria-labelledby={containerHasRole ? containerLabelledBy : undefined}\n className={cn('overflow-x-auto rounded-md border border-border', containerClassName)}\n >\n <table\n ref={mergedRef}\n role=\"grid\"\n aria-multiselectable={selectionMode === 'multiple' || undefined}\n className={cn('w-full border-separate border-spacing-0', className)}\n {...rest}\n onKeyDown={composeEventHandlers(onKeyDown, gridProps.onKeyDown)}\n onFocus={composeEventHandlers(onFocus, gridProps.onFocus, {\n checkDefaultPrevented: false,\n })}\n onBlur={composeEventHandlers(onBlur, gridProps.onBlur, {\n checkDefaultPrevented: false,\n })}\n >\n {content}\n </table>\n </div>\n </DataGridSortContext.Provider>\n </DataGridContext.Provider>\n );\n};\nDataGridRoot.displayName = 'DataGrid';\n\n// ---------------------------------------------------------------------------\n// Selection header cell (internal)\n// ---------------------------------------------------------------------------\n\nfunction DataGridSelectionHeaderCell({\n selectionMode,\n ref,\n}: {\n selectionMode: SelectionMode;\n ref?: React.Ref<HTMLTableCellElement>;\n}) {\n const { store, toggleAll, selectAllLabel, selectionHeaderLabel } =\n useDataGridContext('DataGrid.Header');\n const state = React.useSyncExternalStore(\n store.subscribeSelectAll,\n store.getSelectAllState,\n store.getSelectAllState,\n );\n const inputRef = React.useRef<HTMLInputElement>(null);\n // A click clears the checkbox's `indeterminate` flag (checkbox activation does) and React restores\n // only `checked`, so the flag is re-applied after every click, also when the select-all state\n // stays the same (a controlled parent that keeps the selection partial, or ignores the change).\n const [clicks, setClicks] = React.useState(0);\n\n React.useLayoutEffect(() => {\n if (inputRef.current) inputRef.current.indeterminate = state === 'some';\n }, [state, clicks]);\n\n return (\n <th\n ref={ref}\n scope=\"col\"\n data-selection-cell=\"\"\n className={cn(selectionCell, 'text-start', focusRingInset)}\n >\n {selectionMode === 'multiple' ? (\n <input\n ref={inputRef}\n type=\"checkbox\"\n aria-label={selectAllLabel}\n checked={state === 'all'}\n onChange={() => {\n setClicks((count) => count + 1);\n toggleAll();\n }}\n className={cn(nativeControl, focusRingInset)}\n />\n ) : (\n <span className=\"sr-only\">{selectionHeaderLabel}</span>\n )}\n </th>\n );\n}\n\nconst INERT_HEADER_SLOTS: HeaderSlotRegistry = {\n subscribe: () => () => {},\n register: () => () => {},\n getFirst: () => null,\n refresh: () => {},\n};\n\n/**\n * The selection column's cell of one header row: the select-all header cell in the header's first\n * row (document order), an empty cell in every later row. `initialFirst` is the header's guess from\n * its children, used until the slots are registered (the initial and the server render).\n */\nfunction DataGridSelectionHeaderSlot({\n selectionMode,\n initialFirst,\n}: {\n selectionMode: SelectionMode;\n initialFirst: boolean;\n}) {\n const slots = React.useContext(DataGridHeaderSlotsContext) ?? INERT_HEADER_SLOTS;\n const [slot] = React.useState(() => ({}));\n const cellRef = React.useRef<HTMLTableCellElement | null>(null);\n\n const getIsFirst = React.useCallback(() => {\n const first = slots.getFirst();\n return first === null ? initialFirst : first === slot;\n }, [slots, slot, initialFirst]);\n const getServerIsFirst = React.useCallback(() => initialFirst, [initialFirst]);\n const isFirst = React.useSyncExternalStore(slots.subscribe, getIsFirst, getServerIsFirst);\n\n React.useLayoutEffect(() => slots.register(slot, () => cellRef.current), [slots, slot]);\n\n return isFirst ? (\n <DataGridSelectionHeaderCell ref={cellRef} selectionMode={selectionMode} />\n ) : (\n <td ref={cellRef} data-selection-cell=\"\" className={cn(selectionCell, focusRingInset)} />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Sub-components\n// ---------------------------------------------------------------------------\n\n/**\n * Prepends the selection column's header slot (or `null`) to every `<tr>` in `children`, looking\n * inside Fragments, and tells every other element child (a `DataGrid.Row`, or a component that\n * renders one) whether it is the header's first row. Every row gets the same child shape in every\n * selection mode, so switching `selectionMode` does not remount the header cells.\n */\nfunction withSelectionHeaderSlots(\n children: React.ReactNode,\n selectionMode: 'none' | SelectionMode,\n): React.ReactNode {\n let first = true;\n const visit = (nodes: React.ReactNode): React.ReactNode =>\n React.Children.map(nodes, (child) => {\n if (isElementOfType<{ children?: React.ReactNode }>(child, React.Fragment)) {\n return React.cloneElement(child, undefined, visit(child.props.children));\n }\n if (!React.isValidElement(child)) return child;\n const isFirst = first;\n first = false;\n if (isElementOfType<{ children?: React.ReactNode }>(child, 'tr')) {\n const slot =\n selectionMode === 'none' ? null : (\n <DataGridSelectionHeaderSlot selectionMode={selectionMode} initialFirst={isFirst} />\n );\n return React.cloneElement(child, undefined, slot, child.props.children);\n }\n return (\n <DataGridHeaderRowHintContext.Provider value={isFirst}>\n {child}\n </DataGridHeaderRowHintContext.Provider>\n );\n });\n return visit(children);\n}\n\n/**\n * The grid's `<thead>`. When the grid is selectable, it prepends the selection column's header\n * cell to each `<tr>` child, also inside a Fragment: the first header row gets the \"Select all\n * rows\" checkbox (multiple mode) or the \"Selection\" header (single mode; DataGrid's `labels`\n * localizes both), later rows of a grouped header an empty cell. A header row rendered by another\n * component cannot get it (a development warning says so): use `DataGrid.Row` for such a row,\n * which adds the cell itself.\n */\nconst DataGridHeader = ({ children, className, ref, ...rest }: DataGridHeaderProps) => {\n const { selectionMode } = useDataGridContext('DataGrid.Header');\n const [thead, setThead] = React.useState<HTMLTableSectionElement | null>(null);\n const mergedRef = useMergedRefs<HTMLTableSectionElement>(ref, setThead);\n const [slots] = React.useState(createHeaderSlotRegistry);\n const content = withSelectionHeaderSlots(children, selectionMode);\n\n // Every commit, after the rows' slots registered: header rows can move without a slot mounting.\n React.useLayoutEffect(() => {\n slots.refresh();\n });\n\n // Every commit: header rows can come from components the header cannot see into.\n React.useEffect(() => {\n if (!isDev || !thead || selectionMode === 'none') return;\n const missing = Array.from(thead.rows).some(\n (row) => row.cells.length > 0 && !row.cells[0].hasAttribute('data-selection-cell'),\n );\n if (missing) {\n warnOnce(\n 'DataGrid.Header:missing-selection-cell',\n 'DataGrid.Header: a header row has no selection column header cell, so the header has one ' +\n 'column fewer than the selectable rows. Render header rows as `<tr>` children of ' +\n 'DataGrid.Header (a Fragment is fine), or use `DataGrid.Row` for a header row that ' +\n 'another component renders.',\n );\n }\n });\n\n return (\n <DataGridSectionContext.Provider value=\"header\">\n <DataGridHeaderSlotsContext.Provider value={slots}>\n <thead ref={mergedRef} className={cn('bg-card', className)} {...rest}>\n {content}\n </thead>\n </DataGridHeaderSlotsContext.Provider>\n </DataGridSectionContext.Provider>\n );\n};\nDataGridHeader.displayName = 'DataGridHeader';\n\nconst sortIcon = (direction: SortDirection) => (\n <svg\n className=\"h-3 w-3 shrink-0\"\n viewBox=\"0 0 12 12\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n {direction === 'ascending' ? <path d=\"M6 2L10 8H2L6 2Z\" /> : <path d=\"M6 10L2 4H10L6 10Z\" />}\n </svg>\n);\n\n/**\n * A column header cell. A `sortable` header (with a `columnId`) renders its content inside a\n * `<button type=\"button\">` that toggles the sort; the `<th>` carries `aria-sort`. A consumer\n * `onClick` (on the `<th>`) runs before the sort, and calling `preventDefault()` in it cancels the\n * sort (also for Enter/Space on the button, which click it).\n */\nconst DataGridHeaderCell = ({\n columnId,\n sortable = false,\n children,\n className,\n onClick,\n ref,\n ...rest\n}: DataGridHeaderCellProps) => {\n const { sort, requestSort } = useDataGridSortContext('DataGrid.HeaderCell');\n /** The column this header sorts, or `undefined` when it is not sortable. */\n const sortColumnId = sortable && columnId ? columnId : undefined;\n const sortedDirection =\n sortColumnId !== undefined && sort?.columnId === sortColumnId ? sort.direction : null;\n\n // The sort runs from the `<th>` once the button's click bubbled up to it, composed after the\n // consumer's `onClick` (C-COMPOSE): the consumer runs first and can cancel with preventDefault().\n // The sort button is the `<th>`'s only child; clicks elsewhere in the cell do not sort.\n const sortOnButtonClick = (event: React.MouseEvent<HTMLTableCellElement>) => {\n const button = event.currentTarget.firstElementChild;\n if (\n sortColumnId !== undefined &&\n button?.localName === 'button' &&\n button.contains(event.target as Node)\n ) {\n requestSort(sortColumnId);\n }\n };\n\n React.useEffect(() => {\n if (sortable && !columnId) {\n warnOnce(\n 'DataGrid.HeaderCell:sortable-without-columnId',\n 'DataGrid.HeaderCell: `sortable` needs a `columnId`; the header is rendered as not sortable.',\n );\n }\n }, [sortable, columnId]);\n\n return (\n <th\n ref={ref}\n scope=\"col\"\n aria-sort={sortColumnId !== undefined ? (sortedDirection ?? 'none') : undefined}\n className={cn(\n cellBase,\n 'text-start align-middle font-semibold text-caption-1 uppercase tracking-wider',\n focusRingInset,\n sortColumnId !== undefined && 'p-0 hover:bg-subtle-hover',\n className,\n )}\n {...rest}\n onClick={\n sortColumnId !== undefined ? composeEventHandlers(onClick, sortOnButtonClick) : onClick\n }\n >\n {sortColumnId !== undefined ? (\n <button\n type=\"button\"\n className={cn(\n 'inline-flex w-full cursor-pointer select-none items-center gap-1 border-0 bg-transparent px-4 py-3 text-start text-inherit [font:inherit] uppercase tracking-wider',\n focusRingInset,\n )}\n >\n {children}\n {sortedDirection && sortIcon(sortedDirection)}\n </button>\n ) : (\n <span className=\"inline-flex items-center gap-1\">{children}</span>\n )}\n </th>\n );\n};\nDataGridHeaderCell.displayName = 'DataGridHeaderCell';\n\n/** The grid's `<tbody>`. */\nconst DataGridBody = ({ children, className, ref, ...rest }: DataGridBodyProps) => (\n <DataGridSectionContext.Provider value=\"body\">\n <tbody ref={ref} className={className} {...rest}>\n {children}\n </tbody>\n </DataGridSectionContext.Provider>\n);\nDataGridBody.displayName = 'DataGridBody';\n\n/**\n * A grid row. In a selectable grid it starts with a selection cell (checkbox or radio) named\n * after the row's first cell (or `selectionLabel`); Space on one of its cells toggles the row.\n */\nconst DataGridRow = ({\n rowId,\n selectionLabel,\n children,\n className,\n onKeyDown,\n ref,\n ...rest\n}: DataGridRowProps) => {\n const { selectionMode, store, toggleRow, radioName } = useDataGridContext('DataGrid.Row');\n const section = React.useContext(DataGridSectionContext);\n const firstHeaderRowHint = React.useContext(DataGridHeaderRowHintContext);\n const inHeader = section === 'header';\n const selectable = selectionMode !== 'none' && !inHeader;\n const labelId = useId('wave-datagrid-row-label');\n\n const single = selectionMode === 'single';\n const getSelected = React.useCallback(\n () => rowId !== undefined && store.isSelected(rowId, single),\n [rowId, store, single],\n );\n // Notified only when the selection changes (in multiple mode, rows registering notify no row).\n const isSelected = React.useSyncExternalStore(store.subscribe, getSelected, getSelected);\n\n React.useLayoutEffect(() => {\n if (rowId === undefined || inHeader) return;\n const unregister = store.register(rowId);\n if (isDev && store.countRegistrations(rowId) > 1) warnDuplicateRowId(rowId);\n return unregister;\n }, [store, rowId, inHeader]);\n\n React.useEffect(() => {\n if (selectable && rowId === undefined) {\n warnOnce(\n 'DataGrid.Row:missing-rowId',\n 'DataGrid.Row: a selectable grid needs a `rowId` on every row; this row has no selection control.',\n );\n }\n }, [selectable, rowId]);\n\n const unlabelled = selectable && rowId !== undefined && selectionLabel === undefined;\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLTableRowElement>) => {\n if (!selectable || rowId === undefined || event.key !== ' ') return;\n const target = event.target as Element;\n // Only keys pressed on the row itself or on one of its own cells, never on a nested widget.\n if (target !== event.currentTarget && target.parentElement !== event.currentTarget) return;\n event.preventDefault();\n toggleRow(rowId);\n };\n\n // Name the selection control after the first cell (its own id, or a generated one). The children\n // are always flattened (Fragments too) and rendered under their flattened keys, whatever the\n // mode, so the keys stay the same when `selectionMode`, `selectionLabel` or `rowId` change and\n // the cells are not remounted.\n const flatChildren = flattenChildren(children);\n let labelledBy: string | undefined;\n let idCellIndex = -1;\n if (unlabelled) {\n const firstCellIndex = flatChildren.findIndex(({ node }) =>\n isElementOfType(node, DataGridCell, 'td', 'th'),\n );\n if (firstCellIndex >= 0) {\n const firstCell = flatChildren[firstCellIndex].node as React.ReactElement<{ id?: string }>;\n labelledBy = firstCell.props.id ?? labelId;\n if (firstCell.props.id === undefined) idCellIndex = firstCellIndex;\n }\n }\n const content = flatChildren.map(({ key, node }, index) =>\n renderFlatChild({\n key,\n node:\n index === idCellIndex\n ? React.cloneElement(node as React.ReactElement<{ id?: string }>, { id: labelId })\n : node,\n }),\n );\n\n const needsLabel = unlabelled && labelledBy === undefined;\n React.useEffect(() => {\n if (needsLabel) {\n warnOnce(\n 'DataGrid.Row:selection-label',\n 'DataGrid.Row: no child is a `DataGrid.Cell`, `<td>` or `<th>` element, so the row selection control is named \"Select row\". Pass `selectionLabel` (a cell rendered by another component is not seen).',\n );\n }\n }, [needsLabel]);\n\n let selectionCellElement: React.ReactNode = null;\n if (inHeader && selectionMode !== 'none') {\n selectionCellElement = (\n <DataGridSelectionHeaderSlot\n selectionMode={selectionMode}\n initialFirst={firstHeaderRowHint}\n />\n );\n } else if (selectable) {\n selectionCellElement = (\n <td role=\"gridcell\" data-selection-cell=\"\" className={cn(selectionCell, focusRingInset)}>\n {rowId !== undefined && (\n <input\n type={selectionMode === 'multiple' ? 'checkbox' : 'radio'}\n name={selectionMode === 'single' ? radioName : undefined}\n // The shared name groups the radios. `form=\"\"` matches no form, so they have no form\n // owner (still one group: same name, both ownerless) and never add a generated field\n // to an enclosing form's submission.\n form={selectionMode === 'single' ? '' : undefined}\n checked={isSelected}\n onChange={() => toggleRow(rowId)}\n aria-label={selectionLabel ?? (labelledBy ? undefined : 'Select row')}\n aria-labelledby={selectionLabel === undefined ? labelledBy : undefined}\n className={cn(nativeControl, focusRingInset)}\n />\n )}\n </td>\n );\n }\n\n return (\n <tr\n ref={ref}\n className={cn(\n !inHeader &&\n 'hover:bg-subtle-hover data-[selected]:bg-selected transition-colors motion-reduce:transition-none',\n selectable && isSelected && forcedColors.selectedContainer,\n className,\n )}\n aria-selected={selectable ? isSelected : undefined}\n data-selected={selectable && isSelected ? '' : undefined}\n {...rest}\n onKeyDown={composeEventHandlers(onKeyDown, handleKeyDown)}\n >\n {selectionCellElement}\n {content}\n </tr>\n );\n};\nDataGridRow.displayName = 'DataGridRow';\n\n/** A grid cell (`<td>`), focusable through the grid's keyboard navigation. */\nconst DataGridCell = ({ children, className, ref, ...rest }: DataGridCellProps) => (\n <td\n ref={ref}\n role=\"gridcell\"\n className={cn(cellBase, 'text-body-1', focusRingInset, className)}\n {...rest}\n >\n {children}\n </td>\n);\nDataGridCell.displayName = 'DataGridCell';\n\nexport { DataGridHeader, DataGridHeaderCell, DataGridBody, DataGridRow, DataGridCell };\n\n/**\n * An interactive data table (`role=\"grid\"`) following the APG Grid pattern: one tab stop,\n * arrow-key navigation between cells (Home/End, Ctrl+Home/Ctrl+End, PageUp/PageDown; Up/Down keep\n * the visual column, so a grouped header with spanning cells works), Enter/F2 to interact with a\n * cell's widgets and Escape to return to the cell. A composite widget in a cell (a Toolbar,\n * RadioGroup, TabList, …) is entered with Enter/F2 like a text field; it manages its own tab\n * indexes, so it keeps its own Tab stop. Supports sortable columns (controlled sorting:\n * `onSortChange` reports the new sort and the consumer reorders the rows) and single or multiple\n * row selection with a select-all header checkbox.\n *\n * Sub-components are available as `DataGrid.Header`, `DataGrid.HeaderCell`, `DataGrid.Body`,\n * `DataGrid.Row` and `DataGrid.Cell` in client components, and as the flat exports\n * `DataGridHeader`, `DataGridHeaderCell`, `DataGridBody`, `DataGridRow` and `DataGridCell` (the\n * form React Server Components can import).\n */\nexport const DataGrid = /* @__PURE__ */ Object.assign(DataGridRoot, {\n Header: DataGridHeader,\n HeaderCell: DataGridHeaderCell,\n Body: DataGridBody,\n Row: DataGridRow,\n Cell: DataGridCell,\n});\n"],"mappings":"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"}
|