@hina-ui/vue 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +18436 -0
- package/dist/index.js.map +1 -0
- package/dist/types/components/accordion/Accordion.vue.d.ts +28 -0
- package/dist/types/components/accordion/Accordion.vue.d.ts.map +1 -0
- package/dist/types/components/accordion/AccordionContent.vue.d.ts +17 -0
- package/dist/types/components/accordion/AccordionContent.vue.d.ts.map +1 -0
- package/dist/types/components/accordion/AccordionItem.vue.d.ts +19 -0
- package/dist/types/components/accordion/AccordionItem.vue.d.ts.map +1 -0
- package/dist/types/components/accordion/AccordionTrigger.vue.d.ts +22 -0
- package/dist/types/components/accordion/AccordionTrigger.vue.d.ts.map +1 -0
- package/dist/types/components/accordion/accordion.variants.d.ts +6 -0
- package/dist/types/components/accordion/accordion.variants.d.ts.map +1 -0
- package/dist/types/components/alert/Alert.vue.d.ts +39 -0
- package/dist/types/components/alert/Alert.vue.d.ts.map +1 -0
- package/dist/types/components/alert-dialog/AlertDialog.vue.d.ts +40 -0
- package/dist/types/components/alert-dialog/AlertDialog.vue.d.ts.map +1 -0
- package/dist/types/components/anchor/Anchor.vue.d.ts +14 -0
- package/dist/types/components/anchor/Anchor.vue.d.ts.map +1 -0
- package/dist/types/components/anchor/composables/useScrollSpy.d.ts +13 -0
- package/dist/types/components/anchor/composables/useScrollSpy.d.ts.map +1 -0
- package/dist/types/components/app-shell/AppShell.vue.d.ts +220 -0
- package/dist/types/components/app-shell/AppShell.vue.d.ts.map +1 -0
- package/dist/types/components/app-shell/composables/useDesktopQuery.d.ts +2 -0
- package/dist/types/components/app-shell/composables/useDesktopQuery.d.ts.map +1 -0
- package/dist/types/components/aspect-ratio/AspectRatio.vue.d.ts +20 -0
- package/dist/types/components/aspect-ratio/AspectRatio.vue.d.ts.map +1 -0
- package/dist/types/components/avatar/Avatar.vue.d.ts +24 -0
- package/dist/types/components/avatar/Avatar.vue.d.ts.map +1 -0
- package/dist/types/components/avatar/AvatarGroup.vue.d.ts +10 -0
- package/dist/types/components/avatar/AvatarGroup.vue.d.ts.map +1 -0
- package/dist/types/components/avatar/avatar-group.variants.d.ts +22 -0
- package/dist/types/components/avatar/avatar-group.variants.d.ts.map +1 -0
- package/dist/types/components/avatar/avatar.variants.d.ts +22 -0
- package/dist/types/components/avatar/avatar.variants.d.ts.map +1 -0
- package/dist/types/components/avatar/context.d.ts +8 -0
- package/dist/types/components/avatar/context.d.ts.map +1 -0
- package/dist/types/components/badge/Badge.vue.d.ts +32 -0
- package/dist/types/components/badge/Badge.vue.d.ts.map +1 -0
- package/dist/types/components/badge/badge.variants.d.ts +94 -0
- package/dist/types/components/badge/badge.variants.d.ts.map +1 -0
- package/dist/types/components/banner/Banner.vue.d.ts +42 -0
- package/dist/types/components/banner/Banner.vue.d.ts.map +1 -0
- package/dist/types/components/banner/banner.variants.d.ts +47 -0
- package/dist/types/components/banner/banner.variants.d.ts.map +1 -0
- package/dist/types/components/banner/composables/useAutoplay.d.ts +7 -0
- package/dist/types/components/banner/composables/useAutoplay.d.ts.map +1 -0
- package/dist/types/components/banner/icons.d.ts +9 -0
- package/dist/types/components/banner/icons.d.ts.map +1 -0
- package/dist/types/components/banner/types.d.ts +8 -0
- package/dist/types/components/banner/types.d.ts.map +1 -0
- package/dist/types/components/banner/utils/direction.d.ts +3 -0
- package/dist/types/components/banner/utils/direction.d.ts.map +1 -0
- package/dist/types/components/blockquote/Blockquote.vue.d.ts +18 -0
- package/dist/types/components/blockquote/Blockquote.vue.d.ts.map +1 -0
- package/dist/types/components/breadcrumb/Breadcrumb.vue.d.ts +18 -0
- package/dist/types/components/breadcrumb/Breadcrumb.vue.d.ts.map +1 -0
- package/dist/types/components/breadcrumb/BreadcrumbItem.vue.d.ts +24 -0
- package/dist/types/components/breadcrumb/BreadcrumbItem.vue.d.ts.map +1 -0
- package/dist/types/components/breadcrumb/BreadcrumbSeparator.vue.d.ts +17 -0
- package/dist/types/components/breadcrumb/BreadcrumbSeparator.vue.d.ts.map +1 -0
- package/dist/types/components/button/Button.vue.d.ts +39 -0
- package/dist/types/components/button/Button.vue.d.ts.map +1 -0
- package/dist/types/components/button/IconSlot.vue.d.ts +19 -0
- package/dist/types/components/button/IconSlot.vue.d.ts.map +1 -0
- package/dist/types/components/button/button.variants.d.ts +104 -0
- package/dist/types/components/button/button.variants.d.ts.map +1 -0
- package/dist/types/components/button-group/ButtonGroup.vue.d.ts +26 -0
- package/dist/types/components/button-group/ButtonGroup.vue.d.ts.map +1 -0
- package/dist/types/components/button-group/button-group.variants.d.ts +40 -0
- package/dist/types/components/button-group/button-group.variants.d.ts.map +1 -0
- package/dist/types/components/calendar/Calendar.vue.d.ts +33 -0
- package/dist/types/components/calendar/Calendar.vue.d.ts.map +1 -0
- package/dist/types/components/calendar/CalendarHeader.vue.d.ts +20 -0
- package/dist/types/components/calendar/CalendarHeader.vue.d.ts.map +1 -0
- package/dist/types/components/calendar/CalendarLevels.vue.d.ts +43 -0
- package/dist/types/components/calendar/CalendarLevels.vue.d.ts.map +1 -0
- package/dist/types/components/calendar/calendar.variants.d.ts +74 -0
- package/dist/types/components/calendar/calendar.variants.d.ts.map +1 -0
- package/dist/types/components/calendar/composables/useCalendarLevels.d.ts +15 -0
- package/dist/types/components/calendar/composables/useCalendarLevels.d.ts.map +1 -0
- package/dist/types/components/calendar/utils/format.d.ts +7 -0
- package/dist/types/components/calendar/utils/format.d.ts.map +1 -0
- package/dist/types/components/callout/Callout.vue.d.ts +26 -0
- package/dist/types/components/callout/Callout.vue.d.ts.map +1 -0
- package/dist/types/components/callout/callout.variants.d.ts +59 -0
- package/dist/types/components/callout/callout.variants.d.ts.map +1 -0
- package/dist/types/components/callout/icons.d.ts +9 -0
- package/dist/types/components/callout/icons.d.ts.map +1 -0
- package/dist/types/components/card/Card.vue.d.ts +22 -0
- package/dist/types/components/card/Card.vue.d.ts.map +1 -0
- package/dist/types/components/card/card.variants.d.ts +19 -0
- package/dist/types/components/card/card.variants.d.ts.map +1 -0
- package/dist/types/components/center/Center.vue.d.ts +22 -0
- package/dist/types/components/center/Center.vue.d.ts.map +1 -0
- package/dist/types/components/checkbox/Checkbox.vue.d.ts +30 -0
- package/dist/types/components/checkbox/Checkbox.vue.d.ts.map +1 -0
- package/dist/types/components/checkbox/checkbox.variants.d.ts +74 -0
- package/dist/types/components/checkbox/checkbox.variants.d.ts.map +1 -0
- package/dist/types/components/checkbox-group/CheckboxGroup.vue.d.ts +34 -0
- package/dist/types/components/checkbox-group/CheckboxGroup.vue.d.ts.map +1 -0
- package/dist/types/components/checkbox-group/checkbox-group.variants.d.ts +19 -0
- package/dist/types/components/checkbox-group/checkbox-group.variants.d.ts.map +1 -0
- package/dist/types/components/chip/Chip.vue.d.ts +40 -0
- package/dist/types/components/chip/Chip.vue.d.ts.map +1 -0
- package/dist/types/components/chip/IconSlot.vue.d.ts +20 -0
- package/dist/types/components/chip/IconSlot.vue.d.ts.map +1 -0
- package/dist/types/components/chip/chip.variants.d.ts +102 -0
- package/dist/types/components/chip/chip.variants.d.ts.map +1 -0
- package/dist/types/components/chip/composables/useChipRoot.d.ts +28 -0
- package/dist/types/components/chip/composables/useChipRoot.d.ts.map +1 -0
- package/dist/types/components/close-button/CloseButton.vue.d.ts +15 -0
- package/dist/types/components/close-button/CloseButton.vue.d.ts.map +1 -0
- package/dist/types/components/code/Code.vue.d.ts +17 -0
- package/dist/types/components/code/Code.vue.d.ts.map +1 -0
- package/dist/types/components/code-block/CodeBlock.vue.d.ts +14 -0
- package/dist/types/components/code-block/CodeBlock.vue.d.ts.map +1 -0
- package/dist/types/components/code-block/highlighter.d.ts +4 -0
- package/dist/types/components/code-block/highlighter.d.ts.map +1 -0
- package/dist/types/components/collapsible/Collapsible.vue.d.ts +24 -0
- package/dist/types/components/collapsible/Collapsible.vue.d.ts.map +1 -0
- package/dist/types/components/collapsible/CollapsibleContent.vue.d.ts +17 -0
- package/dist/types/components/collapsible/CollapsibleContent.vue.d.ts.map +1 -0
- package/dist/types/components/collapsible/CollapsibleTrigger.vue.d.ts +21 -0
- package/dist/types/components/collapsible/CollapsibleTrigger.vue.d.ts.map +1 -0
- package/dist/types/components/combobox/Combobox.vue.d.ts +44 -0
- package/dist/types/components/combobox/Combobox.vue.d.ts.map +1 -0
- package/dist/types/components/combobox/ComboboxList.vue.d.ts +20 -0
- package/dist/types/components/combobox/ComboboxList.vue.d.ts.map +1 -0
- package/dist/types/components/combobox/combobox.variants.d.ts +3 -0
- package/dist/types/components/combobox/combobox.variants.d.ts.map +1 -0
- package/dist/types/components/command-palette/CommandPalette.vue.d.ts +37 -0
- package/dist/types/components/command-palette/CommandPalette.vue.d.ts.map +1 -0
- package/dist/types/components/command-palette/CommandPaletteItem.vue.d.ts +12 -0
- package/dist/types/components/command-palette/CommandPaletteItem.vue.d.ts.map +1 -0
- package/dist/types/components/command-palette/CommandPalettePanel.vue.d.ts +34 -0
- package/dist/types/components/command-palette/CommandPalettePanel.vue.d.ts.map +1 -0
- package/dist/types/components/command-palette/command-palette.variants.d.ts +22 -0
- package/dist/types/components/command-palette/command-palette.variants.d.ts.map +1 -0
- package/dist/types/components/command-palette/composables/useHotkey.d.ts +3 -0
- package/dist/types/components/command-palette/composables/useHotkey.d.ts.map +1 -0
- package/dist/types/components/command-palette/types.d.ts +18 -0
- package/dist/types/components/command-palette/types.d.ts.map +1 -0
- package/dist/types/components/command-palette/utils/hotkey.d.ts +9 -0
- package/dist/types/components/command-palette/utils/hotkey.d.ts.map +1 -0
- package/dist/types/components/command-palette/utils/match.d.ts +13 -0
- package/dist/types/components/command-palette/utils/match.d.ts.map +1 -0
- package/dist/types/components/container/Container.vue.d.ts +22 -0
- package/dist/types/components/container/Container.vue.d.ts.map +1 -0
- package/dist/types/components/container/container.variants.d.ts +25 -0
- package/dist/types/components/container/container.variants.d.ts.map +1 -0
- package/dist/types/components/context-menu/ContextMenu.vue.d.ts +29 -0
- package/dist/types/components/context-menu/ContextMenu.vue.d.ts.map +1 -0
- package/dist/types/components/context-menu/ContextMenuCheckboxItem.vue.d.ts +29 -0
- package/dist/types/components/context-menu/ContextMenuCheckboxItem.vue.d.ts.map +1 -0
- package/dist/types/components/context-menu/ContextMenuGroup.vue.d.ts +17 -0
- package/dist/types/components/context-menu/ContextMenuGroup.vue.d.ts.map +1 -0
- package/dist/types/components/context-menu/ContextMenuItem.vue.d.ts +29 -0
- package/dist/types/components/context-menu/ContextMenuItem.vue.d.ts.map +1 -0
- package/dist/types/components/context-menu/ContextMenuLabel.vue.d.ts +17 -0
- package/dist/types/components/context-menu/ContextMenuLabel.vue.d.ts.map +1 -0
- package/dist/types/components/context-menu/ContextMenuRadioGroup.vue.d.ts +21 -0
- package/dist/types/components/context-menu/ContextMenuRadioGroup.vue.d.ts.map +1 -0
- package/dist/types/components/context-menu/ContextMenuRadioItem.vue.d.ts +20 -0
- package/dist/types/components/context-menu/ContextMenuRadioItem.vue.d.ts.map +1 -0
- package/dist/types/components/context-menu/ContextMenuSeparator.vue.d.ts +7 -0
- package/dist/types/components/context-menu/ContextMenuSeparator.vue.d.ts.map +1 -0
- package/dist/types/components/context-menu/ContextMenuSub.vue.d.ts +32 -0
- package/dist/types/components/context-menu/ContextMenuSub.vue.d.ts.map +1 -0
- package/dist/types/components/copy-button/CopyButton.vue.d.ts +21 -0
- package/dist/types/components/copy-button/CopyButton.vue.d.ts.map +1 -0
- package/dist/types/components/copy-button/composables/useCopy.d.ts +6 -0
- package/dist/types/components/copy-button/composables/useCopy.d.ts.map +1 -0
- package/dist/types/components/date-field/DateField.vue.d.ts +50 -0
- package/dist/types/components/date-field/DateField.vue.d.ts.map +1 -0
- package/dist/types/components/date-field/composables/useSegmentFocus.d.ts +6 -0
- package/dist/types/components/date-field/composables/useSegmentFocus.d.ts.map +1 -0
- package/dist/types/components/date-field/date-field.variants.d.ts +42 -0
- package/dist/types/components/date-field/date-field.variants.d.ts.map +1 -0
- package/dist/types/components/date-picker/DatePicker.vue.d.ts +48 -0
- package/dist/types/components/date-picker/DatePicker.vue.d.ts.map +1 -0
- package/dist/types/components/date-picker/date-picker.variants.d.ts +2 -0
- package/dist/types/components/date-picker/date-picker.variants.d.ts.map +1 -0
- package/dist/types/components/date-range-field/DateRangeField.vue.d.ts +50 -0
- package/dist/types/components/date-range-field/DateRangeField.vue.d.ts.map +1 -0
- package/dist/types/components/date-range-field/date-range-field.variants.d.ts +2 -0
- package/dist/types/components/date-range-field/date-range-field.variants.d.ts.map +1 -0
- package/dist/types/components/date-range-field/utils/validity.d.ts +12 -0
- package/dist/types/components/date-range-field/utils/validity.d.ts.map +1 -0
- package/dist/types/components/date-range-picker/DateRangePicker.vue.d.ts +50 -0
- package/dist/types/components/date-range-picker/DateRangePicker.vue.d.ts.map +1 -0
- package/dist/types/components/date-time-picker/DateTimePicker.vue.d.ts +53 -0
- package/dist/types/components/date-time-picker/DateTimePicker.vue.d.ts.map +1 -0
- package/dist/types/components/date-time-picker/date-time-picker.variants.d.ts +2 -0
- package/dist/types/components/date-time-picker/date-time-picker.variants.d.ts.map +1 -0
- package/dist/types/components/description-list/DescriptionDetails.vue.d.ts +17 -0
- package/dist/types/components/description-list/DescriptionDetails.vue.d.ts.map +1 -0
- package/dist/types/components/description-list/DescriptionList.vue.d.ts +17 -0
- package/dist/types/components/description-list/DescriptionList.vue.d.ts.map +1 -0
- package/dist/types/components/description-list/DescriptionTerm.vue.d.ts +17 -0
- package/dist/types/components/description-list/DescriptionTerm.vue.d.ts.map +1 -0
- package/dist/types/components/dialog/Dialog.vue.d.ts +42 -0
- package/dist/types/components/dialog/Dialog.vue.d.ts.map +1 -0
- package/dist/types/components/dialog/dialog.variants.d.ts +56 -0
- package/dist/types/components/dialog/dialog.variants.d.ts.map +1 -0
- package/dist/types/components/disclosure-icon/DisclosureIcon.vue.d.ts +23 -0
- package/dist/types/components/disclosure-icon/DisclosureIcon.vue.d.ts.map +1 -0
- package/dist/types/components/disclosure-icon/disclosure-icon.variants.d.ts +34 -0
- package/dist/types/components/disclosure-icon/disclosure-icon.variants.d.ts.map +1 -0
- package/dist/types/components/divider/Divider.vue.d.ts +22 -0
- package/dist/types/components/divider/Divider.vue.d.ts.map +1 -0
- package/dist/types/components/drawer/Drawer.vue.d.ts +43 -0
- package/dist/types/components/drawer/Drawer.vue.d.ts.map +1 -0
- package/dist/types/components/drawer/drawer.variants.d.ts +34 -0
- package/dist/types/components/drawer/drawer.variants.d.ts.map +1 -0
- package/dist/types/components/dropdown-menu/DropdownMenu.vue.d.ts +35 -0
- package/dist/types/components/dropdown-menu/DropdownMenu.vue.d.ts.map +1 -0
- package/dist/types/components/dropdown-menu/DropdownMenuCheckboxItem.vue.d.ts +29 -0
- package/dist/types/components/dropdown-menu/DropdownMenuCheckboxItem.vue.d.ts.map +1 -0
- package/dist/types/components/dropdown-menu/DropdownMenuGroup.vue.d.ts +17 -0
- package/dist/types/components/dropdown-menu/DropdownMenuGroup.vue.d.ts.map +1 -0
- package/dist/types/components/dropdown-menu/DropdownMenuItem.vue.d.ts +29 -0
- package/dist/types/components/dropdown-menu/DropdownMenuItem.vue.d.ts.map +1 -0
- package/dist/types/components/dropdown-menu/DropdownMenuLabel.vue.d.ts +17 -0
- package/dist/types/components/dropdown-menu/DropdownMenuLabel.vue.d.ts.map +1 -0
- package/dist/types/components/dropdown-menu/DropdownMenuRadioGroup.vue.d.ts +21 -0
- package/dist/types/components/dropdown-menu/DropdownMenuRadioGroup.vue.d.ts.map +1 -0
- package/dist/types/components/dropdown-menu/DropdownMenuRadioItem.vue.d.ts +20 -0
- package/dist/types/components/dropdown-menu/DropdownMenuRadioItem.vue.d.ts.map +1 -0
- package/dist/types/components/dropdown-menu/DropdownMenuSeparator.vue.d.ts +7 -0
- package/dist/types/components/dropdown-menu/DropdownMenuSeparator.vue.d.ts.map +1 -0
- package/dist/types/components/dropdown-menu/DropdownMenuSub.vue.d.ts +32 -0
- package/dist/types/components/dropdown-menu/DropdownMenuSub.vue.d.ts.map +1 -0
- package/dist/types/components/dropdown-menu/dropdown-menu.variants.d.ts +19 -0
- package/dist/types/components/dropdown-menu/dropdown-menu.variants.d.ts.map +1 -0
- package/dist/types/components/empty/Empty.vue.d.ts +29 -0
- package/dist/types/components/empty/Empty.vue.d.ts.map +1 -0
- package/dist/types/components/empty/empty.variants.d.ts +81 -0
- package/dist/types/components/empty/empty.variants.d.ts.map +1 -0
- package/dist/types/components/file-upload/FileUpload.vue.d.ts +49 -0
- package/dist/types/components/file-upload/FileUpload.vue.d.ts.map +1 -0
- package/dist/types/components/file-upload/composables/useFileDrop.d.ts +10 -0
- package/dist/types/components/file-upload/composables/useFileDrop.d.ts.map +1 -0
- package/dist/types/components/file-upload/composables/useObjectUrls.d.ts +5 -0
- package/dist/types/components/file-upload/composables/useObjectUrls.d.ts.map +1 -0
- package/dist/types/components/file-upload/file-upload.variants.d.ts +9 -0
- package/dist/types/components/file-upload/file-upload.variants.d.ts.map +1 -0
- package/dist/types/components/file-upload/utils/select.d.ts +17 -0
- package/dist/types/components/file-upload/utils/select.d.ts.map +1 -0
- package/dist/types/components/file-upload/utils/size.d.ts +2 -0
- package/dist/types/components/file-upload/utils/size.d.ts.map +1 -0
- package/dist/types/components/flex/Flex.vue.d.ts +26 -0
- package/dist/types/components/flex/Flex.vue.d.ts.map +1 -0
- package/dist/types/components/flex/flex.variants.d.ts +106 -0
- package/dist/types/components/flex/flex.variants.d.ts.map +1 -0
- package/dist/types/components/form/Form.vue.d.ts +39 -0
- package/dist/types/components/form/Form.vue.d.ts.map +1 -0
- package/dist/types/components/form/composables/useForm.d.ts +22 -0
- package/dist/types/components/form/composables/useForm.d.ts.map +1 -0
- package/dist/types/components/form/context.d.ts +10 -0
- package/dist/types/components/form/context.d.ts.map +1 -0
- package/dist/types/components/form/form.variants.d.ts +2 -0
- package/dist/types/components/form/form.variants.d.ts.map +1 -0
- package/dist/types/components/form/standard-schema.d.ts +23 -0
- package/dist/types/components/form/standard-schema.d.ts.map +1 -0
- package/dist/types/components/form/utils/errors.d.ts +7 -0
- package/dist/types/components/form/utils/errors.d.ts.map +1 -0
- package/dist/types/components/form/utils/focus.d.ts +2 -0
- package/dist/types/components/form/utils/focus.d.ts.map +1 -0
- package/dist/types/components/form/utils/values.d.ts +3 -0
- package/dist/types/components/form/utils/values.d.ts.map +1 -0
- package/dist/types/components/form-field/FormField.vue.d.ts +27 -0
- package/dist/types/components/form-field/FormField.vue.d.ts.map +1 -0
- package/dist/types/components/form-field/context.d.ts +27 -0
- package/dist/types/components/form-field/context.d.ts.map +1 -0
- package/dist/types/components/form-field/form-field.variants.d.ts +18 -0
- package/dist/types/components/form-field/form-field.variants.d.ts.map +1 -0
- package/dist/types/components/form-layout/FormLayout.vue.d.ts +28 -0
- package/dist/types/components/form-layout/FormLayout.vue.d.ts.map +1 -0
- package/dist/types/components/form-layout/form-layout.variants.d.ts +37 -0
- package/dist/types/components/form-layout/form-layout.variants.d.ts.map +1 -0
- package/dist/types/components/grid/Grid.vue.d.ts +23 -0
- package/dist/types/components/grid/Grid.vue.d.ts.map +1 -0
- package/dist/types/components/grid/grid.variants.d.ts +73 -0
- package/dist/types/components/grid/grid.variants.d.ts.map +1 -0
- package/dist/types/components/heading/Heading.vue.d.ts +24 -0
- package/dist/types/components/heading/Heading.vue.d.ts.map +1 -0
- package/dist/types/components/heading/heading.variants.d.ts +58 -0
- package/dist/types/components/heading/heading.variants.d.ts.map +1 -0
- package/dist/types/components/highlight/Highlight.vue.d.ts +12 -0
- package/dist/types/components/highlight/Highlight.vue.d.ts.map +1 -0
- package/dist/types/components/hover-card/HoverCard.vue.d.ts +40 -0
- package/dist/types/components/hover-card/HoverCard.vue.d.ts.map +1 -0
- package/dist/types/components/icon-button/IconButton.vue.d.ts +36 -0
- package/dist/types/components/icon-button/IconButton.vue.d.ts.map +1 -0
- package/dist/types/components/image/Image.vue.d.ts +54 -0
- package/dist/types/components/image/Image.vue.d.ts.map +1 -0
- package/dist/types/components/image/ImageGroup.vue.d.ts +17 -0
- package/dist/types/components/image/ImageGroup.vue.d.ts.map +1 -0
- package/dist/types/components/image/composables/useImage.d.ts +24 -0
- package/dist/types/components/image/composables/useImage.d.ts.map +1 -0
- package/dist/types/components/image/context.d.ts +9 -0
- package/dist/types/components/image/context.d.ts.map +1 -0
- package/dist/types/components/image/image.variants.d.ts +28 -0
- package/dist/types/components/image/image.variants.d.ts.map +1 -0
- package/dist/types/components/image/resolver.d.ts +5 -0
- package/dist/types/components/image/resolver.d.ts.map +1 -0
- package/dist/types/components/indicator/Indicator.vue.d.ts +15 -0
- package/dist/types/components/indicator/Indicator.vue.d.ts.map +1 -0
- package/dist/types/components/indicator/indicator.variants.d.ts +46 -0
- package/dist/types/components/indicator/indicator.variants.d.ts.map +1 -0
- package/dist/types/components/inline/Inline.vue.d.ts +26 -0
- package/dist/types/components/inline/Inline.vue.d.ts.map +1 -0
- package/dist/types/components/inline/inline.variants.d.ts +88 -0
- package/dist/types/components/inline/inline.variants.d.ts.map +1 -0
- package/dist/types/components/input/Input.vue.d.ts +39 -0
- package/dist/types/components/input/Input.vue.d.ts.map +1 -0
- package/dist/types/components/input/InputAction.vue.d.ts +19 -0
- package/dist/types/components/input/InputAction.vue.d.ts.map +1 -0
- package/dist/types/components/input/InputBase.vue.d.ts +42 -0
- package/dist/types/components/input/InputBase.vue.d.ts.map +1 -0
- package/dist/types/components/input/input.variants.d.ts +61 -0
- package/dist/types/components/input/input.variants.d.ts.map +1 -0
- package/dist/types/components/input-group/InputGroup.vue.d.ts +22 -0
- package/dist/types/components/input-group/InputGroup.vue.d.ts.map +1 -0
- package/dist/types/components/input-group/InputGroupAddon.vue.d.ts +17 -0
- package/dist/types/components/input-group/InputGroupAddon.vue.d.ts.map +1 -0
- package/dist/types/components/input-group/InputGroupScope.vue.d.ts +20 -0
- package/dist/types/components/input-group/InputGroupScope.vue.d.ts.map +1 -0
- package/dist/types/components/input-group/context.d.ts +10 -0
- package/dist/types/components/input-group/context.d.ts.map +1 -0
- package/dist/types/components/input-group/input-group.variants.d.ts +3 -0
- package/dist/types/components/input-group/input-group.variants.d.ts.map +1 -0
- package/dist/types/components/kbd/Kbd.vue.d.ts +17 -0
- package/dist/types/components/kbd/Kbd.vue.d.ts.map +1 -0
- package/dist/types/components/lightbox/Lightbox.vue.d.ts +21 -0
- package/dist/types/components/lightbox/Lightbox.vue.d.ts.map +1 -0
- package/dist/types/components/lightbox/LightboxChrome.vue.d.ts +36 -0
- package/dist/types/components/lightbox/LightboxChrome.vue.d.ts.map +1 -0
- package/dist/types/components/lightbox/LightboxStrip.vue.d.ts +29 -0
- package/dist/types/components/lightbox/LightboxStrip.vue.d.ts.map +1 -0
- package/dist/types/components/lightbox/LightboxThumbs.vue.d.ts +13 -0
- package/dist/types/components/lightbox/LightboxThumbs.vue.d.ts.map +1 -0
- package/dist/types/components/lightbox/LightboxToolbar.vue.d.ts +24 -0
- package/dist/types/components/lightbox/LightboxToolbar.vue.d.ts.map +1 -0
- package/dist/types/components/lightbox/composables/useLightboxFrames.d.ts +12 -0
- package/dist/types/components/lightbox/composables/useLightboxFrames.d.ts.map +1 -0
- package/dist/types/components/lightbox/composables/useLightboxGesture.d.ts +27 -0
- package/dist/types/components/lightbox/composables/useLightboxGesture.d.ts.map +1 -0
- package/dist/types/components/lightbox/composables/useLightboxHint.d.ts +14 -0
- package/dist/types/components/lightbox/composables/useLightboxHint.d.ts.map +1 -0
- package/dist/types/components/lightbox/composables/useLightboxLarge.d.ts +8 -0
- package/dist/types/components/lightbox/composables/useLightboxLarge.d.ts.map +1 -0
- package/dist/types/components/lightbox/composables/useLightboxMotion.d.ts +25 -0
- package/dist/types/components/lightbox/composables/useLightboxMotion.d.ts.map +1 -0
- package/dist/types/components/lightbox/composables/useLightboxPaging.d.ts +18 -0
- package/dist/types/components/lightbox/composables/useLightboxPaging.d.ts.map +1 -0
- package/dist/types/components/lightbox/composables/useLightboxPhase.d.ts +20 -0
- package/dist/types/components/lightbox/composables/useLightboxPhase.d.ts.map +1 -0
- package/dist/types/components/lightbox/composables/useLightboxPose.d.ts +7 -0
- package/dist/types/components/lightbox/composables/useLightboxPose.d.ts.map +1 -0
- package/dist/types/components/lightbox/composables/useLightboxRotation.d.ts +18 -0
- package/dist/types/components/lightbox/composables/useLightboxRotation.d.ts.map +1 -0
- package/dist/types/components/lightbox/composables/useLightboxSlides.d.ts +9 -0
- package/dist/types/components/lightbox/composables/useLightboxSlides.d.ts.map +1 -0
- package/dist/types/components/lightbox/composables/useLightboxZoom.d.ts +28 -0
- package/dist/types/components/lightbox/composables/useLightboxZoom.d.ts.map +1 -0
- package/dist/types/components/lightbox/types.d.ts +10 -0
- package/dist/types/components/lightbox/types.d.ts.map +1 -0
- package/dist/types/components/lightbox/utils/download.d.ts +3 -0
- package/dist/types/components/lightbox/utils/download.d.ts.map +1 -0
- package/dist/types/components/lightbox/utils/gesture.d.ts +26 -0
- package/dist/types/components/lightbox/utils/gesture.d.ts.map +1 -0
- package/dist/types/components/lightbox/utils/paging.d.ts +9 -0
- package/dist/types/components/lightbox/utils/paging.d.ts.map +1 -0
- package/dist/types/components/lightbox/utils/pose.d.ts +38 -0
- package/dist/types/components/lightbox/utils/pose.d.ts.map +1 -0
- package/dist/types/components/lightbox/utils/zoom.d.ts +36 -0
- package/dist/types/components/lightbox/utils/zoom.d.ts.map +1 -0
- package/dist/types/components/link/Link.vue.d.ts +24 -0
- package/dist/types/components/link/Link.vue.d.ts.map +1 -0
- package/dist/types/components/link/link.variants.d.ts +19 -0
- package/dist/types/components/link/link.variants.d.ts.map +1 -0
- package/dist/types/components/list/List.vue.d.ts +18 -0
- package/dist/types/components/list/List.vue.d.ts.map +1 -0
- package/dist/types/components/list/ListItem.vue.d.ts +17 -0
- package/dist/types/components/list/ListItem.vue.d.ts.map +1 -0
- package/dist/types/components/listbox/Listbox.vue.d.ts +35 -0
- package/dist/types/components/listbox/Listbox.vue.d.ts.map +1 -0
- package/dist/types/components/listbox/listbox.variants.d.ts +20 -0
- package/dist/types/components/listbox/listbox.variants.d.ts.map +1 -0
- package/dist/types/components/loading-overlay/LoadingOverlay.vue.d.ts +30 -0
- package/dist/types/components/loading-overlay/LoadingOverlay.vue.d.ts.map +1 -0
- package/dist/types/components/loading-overlay/composables/useDelayedVisible.d.ts +7 -0
- package/dist/types/components/loading-overlay/composables/useDelayedVisible.d.ts.map +1 -0
- package/dist/types/components/loading-overlay/loading-overlay.variants.d.ts +35 -0
- package/dist/types/components/loading-overlay/loading-overlay.variants.d.ts.map +1 -0
- package/dist/types/components/mark/Mark.vue.d.ts +17 -0
- package/dist/types/components/mark/Mark.vue.d.ts.map +1 -0
- package/dist/types/components/menubar/Menubar.vue.d.ts +29 -0
- package/dist/types/components/menubar/Menubar.vue.d.ts.map +1 -0
- package/dist/types/components/menubar/MenubarCheckboxItem.vue.d.ts +29 -0
- package/dist/types/components/menubar/MenubarCheckboxItem.vue.d.ts.map +1 -0
- package/dist/types/components/menubar/MenubarGroup.vue.d.ts +17 -0
- package/dist/types/components/menubar/MenubarGroup.vue.d.ts.map +1 -0
- package/dist/types/components/menubar/MenubarItem.vue.d.ts +29 -0
- package/dist/types/components/menubar/MenubarItem.vue.d.ts.map +1 -0
- package/dist/types/components/menubar/MenubarLabel.vue.d.ts +17 -0
- package/dist/types/components/menubar/MenubarLabel.vue.d.ts.map +1 -0
- package/dist/types/components/menubar/MenubarMenu.vue.d.ts +22 -0
- package/dist/types/components/menubar/MenubarMenu.vue.d.ts.map +1 -0
- package/dist/types/components/menubar/MenubarRadioGroup.vue.d.ts +21 -0
- package/dist/types/components/menubar/MenubarRadioGroup.vue.d.ts.map +1 -0
- package/dist/types/components/menubar/MenubarRadioItem.vue.d.ts +20 -0
- package/dist/types/components/menubar/MenubarRadioItem.vue.d.ts.map +1 -0
- package/dist/types/components/menubar/MenubarSeparator.vue.d.ts +7 -0
- package/dist/types/components/menubar/MenubarSeparator.vue.d.ts.map +1 -0
- package/dist/types/components/menubar/MenubarSub.vue.d.ts +32 -0
- package/dist/types/components/menubar/MenubarSub.vue.d.ts.map +1 -0
- package/dist/types/components/menubar/menubar.variants.d.ts +4 -0
- package/dist/types/components/menubar/menubar.variants.d.ts.map +1 -0
- package/dist/types/components/meter-group/MeterGroup.vue.d.ts +19 -0
- package/dist/types/components/meter-group/MeterGroup.vue.d.ts.map +1 -0
- package/dist/types/components/meter-group/meter-group.variants.d.ts +34 -0
- package/dist/types/components/meter-group/meter-group.variants.d.ts.map +1 -0
- package/dist/types/components/meter-group/types.d.ts +8 -0
- package/dist/types/components/meter-group/types.d.ts.map +1 -0
- package/dist/types/components/meter-group/utils/tones.d.ts +4 -0
- package/dist/types/components/meter-group/utils/tones.d.ts.map +1 -0
- package/dist/types/components/multi-combobox/MultiCombobox.vue.d.ts +48 -0
- package/dist/types/components/multi-combobox/MultiCombobox.vue.d.ts.map +1 -0
- package/dist/types/components/multi-combobox/multi-combobox.variants.d.ts +15 -0
- package/dist/types/components/multi-combobox/multi-combobox.variants.d.ts.map +1 -0
- package/dist/types/components/multi-select/MultiSelect.vue.d.ts +47 -0
- package/dist/types/components/multi-select/MultiSelect.vue.d.ts.map +1 -0
- package/dist/types/components/multi-select/multi-select.variants.d.ts +3 -0
- package/dist/types/components/multi-select/multi-select.variants.d.ts.map +1 -0
- package/dist/types/components/nav-link/NavLink.vue.d.ts +27 -0
- package/dist/types/components/nav-link/NavLink.vue.d.ts.map +1 -0
- package/dist/types/components/nav-link/nav-link.variants.d.ts +35 -0
- package/dist/types/components/nav-link/nav-link.variants.d.ts.map +1 -0
- package/dist/types/components/number-format/NumberFormat.vue.d.ts +13 -0
- package/dist/types/components/number-format/NumberFormat.vue.d.ts.map +1 -0
- package/dist/types/components/number-input/NumberInput.vue.d.ts +30 -0
- package/dist/types/components/number-input/NumberInput.vue.d.ts.map +1 -0
- package/dist/types/components/number-input/number-input.variants.d.ts +33 -0
- package/dist/types/components/number-input/number-input.variants.d.ts.map +1 -0
- package/dist/types/components/page/Page.vue.d.ts +21 -0
- package/dist/types/components/page/Page.vue.d.ts.map +1 -0
- package/dist/types/components/page/PageAside.vue.d.ts +18 -0
- package/dist/types/components/page/PageAside.vue.d.ts.map +1 -0
- package/dist/types/components/page/PageBody.vue.d.ts +17 -0
- package/dist/types/components/page/PageBody.vue.d.ts.map +1 -0
- package/dist/types/components/page/PageHeader.vue.d.ts +22 -0
- package/dist/types/components/page/PageHeader.vue.d.ts.map +1 -0
- package/dist/types/components/panel/Panel.vue.d.ts +33 -0
- package/dist/types/components/panel/Panel.vue.d.ts.map +1 -0
- package/dist/types/components/panel/panel.variants.d.ts +20 -0
- package/dist/types/components/panel/panel.variants.d.ts.map +1 -0
- package/dist/types/components/password-input/PasswordInput.vue.d.ts +23 -0
- package/dist/types/components/password-input/PasswordInput.vue.d.ts.map +1 -0
- package/dist/types/components/pin-input/PinInput.vue.d.ts +32 -0
- package/dist/types/components/pin-input/PinInput.vue.d.ts.map +1 -0
- package/dist/types/components/pin-input/pin-input.variants.d.ts +35 -0
- package/dist/types/components/pin-input/pin-input.variants.d.ts.map +1 -0
- package/dist/types/components/popconfirm/Popconfirm.vue.d.ts +43 -0
- package/dist/types/components/popconfirm/Popconfirm.vue.d.ts.map +1 -0
- package/dist/types/components/popover/Popover.vue.d.ts +36 -0
- package/dist/types/components/popover/Popover.vue.d.ts.map +1 -0
- package/dist/types/components/prev-next/PrevNext.vue.d.ts +18 -0
- package/dist/types/components/prev-next/PrevNext.vue.d.ts.map +1 -0
- package/dist/types/components/prev-next/PrevNextLink.vue.d.ts +23 -0
- package/dist/types/components/prev-next/PrevNextLink.vue.d.ts.map +1 -0
- package/dist/types/components/prev-next/prev-next.variants.d.ts +35 -0
- package/dist/types/components/prev-next/prev-next.variants.d.ts.map +1 -0
- package/dist/types/components/progress/Progress.vue.d.ts +20 -0
- package/dist/types/components/progress/Progress.vue.d.ts.map +1 -0
- package/dist/types/components/progress/composables/useProgressValue.d.ts +16 -0
- package/dist/types/components/progress/composables/useProgressValue.d.ts.map +1 -0
- package/dist/types/components/progress/progress.variants.d.ts +53 -0
- package/dist/types/components/progress/progress.variants.d.ts.map +1 -0
- package/dist/types/components/prose/Prose.vue.d.ts +20 -0
- package/dist/types/components/prose/Prose.vue.d.ts.map +1 -0
- package/dist/types/components/radio-group/RadioGroup.vue.d.ts +34 -0
- package/dist/types/components/radio-group/RadioGroup.vue.d.ts.map +1 -0
- package/dist/types/components/radio-group/radio-group.variants.d.ts +2 -0
- package/dist/types/components/radio-group/radio-group.variants.d.ts.map +1 -0
- package/dist/types/components/range-calendar/RangeCalendar.vue.d.ts +35 -0
- package/dist/types/components/range-calendar/RangeCalendar.vue.d.ts.map +1 -0
- package/dist/types/components/range-calendar/composables/useRangeAnchor.d.ts +7 -0
- package/dist/types/components/range-calendar/composables/useRangeAnchor.d.ts.map +1 -0
- package/dist/types/components/range-calendar/range-calendar.variants.d.ts +3 -0
- package/dist/types/components/range-calendar/range-calendar.variants.d.ts.map +1 -0
- package/dist/types/components/range-calendar/utils/limit.d.ts +3 -0
- package/dist/types/components/range-calendar/utils/limit.d.ts.map +1 -0
- package/dist/types/components/range-slider/RangeSlider.vue.d.ts +36 -0
- package/dist/types/components/range-slider/RangeSlider.vue.d.ts.map +1 -0
- package/dist/types/components/rating/Rating.vue.d.ts +27 -0
- package/dist/types/components/rating/Rating.vue.d.ts.map +1 -0
- package/dist/types/components/rating/rating.variants.d.ts +41 -0
- package/dist/types/components/rating/rating.variants.d.ts.map +1 -0
- package/dist/types/components/rating/utils/fill.d.ts +2 -0
- package/dist/types/components/rating/utils/fill.d.ts.map +1 -0
- package/dist/types/components/result/Result.vue.d.ts +29 -0
- package/dist/types/components/result/Result.vue.d.ts.map +1 -0
- package/dist/types/components/result/result.variants.d.ts +40 -0
- package/dist/types/components/result/result.variants.d.ts.map +1 -0
- package/dist/types/components/ring-progress/RingProgress.vue.d.ts +30 -0
- package/dist/types/components/ring-progress/RingProgress.vue.d.ts.map +1 -0
- package/dist/types/components/ring-progress/ring-progress.variants.d.ts +55 -0
- package/dist/types/components/ring-progress/ring-progress.variants.d.ts.map +1 -0
- package/dist/types/components/ripple/Ripple.vue.d.ts +7 -0
- package/dist/types/components/ripple/Ripple.vue.d.ts.map +1 -0
- package/dist/types/components/ripple/useRipple.d.ts +5 -0
- package/dist/types/components/ripple/useRipple.d.ts.map +1 -0
- package/dist/types/components/scroll-area/ScrollArea.vue.d.ts +34 -0
- package/dist/types/components/scroll-area/ScrollArea.vue.d.ts.map +1 -0
- package/dist/types/components/scroll-area/composables/useEdgeShadow.d.ts +12 -0
- package/dist/types/components/scroll-area/composables/useEdgeShadow.d.ts.map +1 -0
- package/dist/types/components/scroll-area/composables/useLayerLock.d.ts +3 -0
- package/dist/types/components/scroll-area/composables/useLayerLock.d.ts.map +1 -0
- package/dist/types/components/scroll-area/composables/useOverlayScrollbars.d.ts +10 -0
- package/dist/types/components/scroll-area/composables/useOverlayScrollbars.d.ts.map +1 -0
- package/dist/types/components/scroll-area/composables/useWheelRedirect.d.ts +3 -0
- package/dist/types/components/scroll-area/composables/useWheelRedirect.d.ts.map +1 -0
- package/dist/types/components/scroll-area/scroll-restore.d.ts +35 -0
- package/dist/types/components/scroll-area/scroll-restore.d.ts.map +1 -0
- package/dist/types/components/search-input/SearchInput.vue.d.ts +27 -0
- package/dist/types/components/search-input/SearchInput.vue.d.ts.map +1 -0
- package/dist/types/components/section/Section.vue.d.ts +19 -0
- package/dist/types/components/section/Section.vue.d.ts.map +1 -0
- package/dist/types/components/segmented-control/SegmentedControl.vue.d.ts +36 -0
- package/dist/types/components/segmented-control/SegmentedControl.vue.d.ts.map +1 -0
- package/dist/types/components/segmented-control/segmented-control.variants.d.ts +61 -0
- package/dist/types/components/segmented-control/segmented-control.variants.d.ts.map +1 -0
- package/dist/types/components/select/Select.vue.d.ts +43 -0
- package/dist/types/components/select/Select.vue.d.ts.map +1 -0
- package/dist/types/components/select/SelectList.vue.d.ts +20 -0
- package/dist/types/components/select/SelectList.vue.d.ts.map +1 -0
- package/dist/types/components/select/select.variants.d.ts +8 -0
- package/dist/types/components/select/select.variants.d.ts.map +1 -0
- package/dist/types/components/select/types.d.ts +14 -0
- package/dist/types/components/select/types.d.ts.map +1 -0
- package/dist/types/components/sheet/Sheet.vue.d.ts +41 -0
- package/dist/types/components/sheet/Sheet.vue.d.ts.map +1 -0
- package/dist/types/components/sheet/composables/useDragToDismiss.d.ts +13 -0
- package/dist/types/components/sheet/composables/useDragToDismiss.d.ts.map +1 -0
- package/dist/types/components/sheet/sheet.variants.d.ts +4 -0
- package/dist/types/components/sheet/sheet.variants.d.ts.map +1 -0
- package/dist/types/components/sidebar/DrawerScope.d.ts +5 -0
- package/dist/types/components/sidebar/DrawerScope.d.ts.map +1 -0
- package/dist/types/components/sidebar/Sidebar.vue.d.ts +26 -0
- package/dist/types/components/sidebar/Sidebar.vue.d.ts.map +1 -0
- package/dist/types/components/sidebar/SidebarGroup.vue.d.ts +21 -0
- package/dist/types/components/sidebar/SidebarGroup.vue.d.ts.map +1 -0
- package/dist/types/components/sidebar/SidebarTrigger.vue.d.ts +7 -0
- package/dist/types/components/sidebar/SidebarTrigger.vue.d.ts.map +1 -0
- package/dist/types/components/sidebar/context.d.ts +11 -0
- package/dist/types/components/sidebar/context.d.ts.map +1 -0
- package/dist/types/components/simple-grid/SimpleGrid.vue.d.ts +26 -0
- package/dist/types/components/simple-grid/SimpleGrid.vue.d.ts.map +1 -0
- package/dist/types/components/simple-grid/simple-grid.variants.d.ts +43 -0
- package/dist/types/components/simple-grid/simple-grid.variants.d.ts.map +1 -0
- package/dist/types/components/skeleton/Skeleton.vue.d.ts +24 -0
- package/dist/types/components/skeleton/Skeleton.vue.d.ts.map +1 -0
- package/dist/types/components/slider/Slider.vue.d.ts +34 -0
- package/dist/types/components/slider/Slider.vue.d.ts.map +1 -0
- package/dist/types/components/slider/SliderHandle.vue.d.ts +10 -0
- package/dist/types/components/slider/SliderHandle.vue.d.ts.map +1 -0
- package/dist/types/components/slider/SliderMarks.vue.d.ts +13 -0
- package/dist/types/components/slider/SliderMarks.vue.d.ts.map +1 -0
- package/dist/types/components/slider/composables/useSliderChrome.d.ts +16 -0
- package/dist/types/components/slider/composables/useSliderChrome.d.ts.map +1 -0
- package/dist/types/components/slider/slider.variants.d.ts +30 -0
- package/dist/types/components/slider/slider.variants.d.ts.map +1 -0
- package/dist/types/components/space/Space.vue.d.ts +9 -0
- package/dist/types/components/space/Space.vue.d.ts.map +1 -0
- package/dist/types/components/space/space.variants.d.ts +31 -0
- package/dist/types/components/space/space.variants.d.ts.map +1 -0
- package/dist/types/components/spinner/Spinner.vue.d.ts +11 -0
- package/dist/types/components/spinner/Spinner.vue.d.ts.map +1 -0
- package/dist/types/components/spinner/spinner.variants.d.ts +22 -0
- package/dist/types/components/spinner/spinner.variants.d.ts.map +1 -0
- package/dist/types/components/splitter/Splitter.vue.d.ts +21 -0
- package/dist/types/components/splitter/Splitter.vue.d.ts.map +1 -0
- package/dist/types/components/splitter/SplitterHandle.vue.d.ts +8 -0
- package/dist/types/components/splitter/SplitterHandle.vue.d.ts.map +1 -0
- package/dist/types/components/splitter/SplitterPanel.vue.d.ts +22 -0
- package/dist/types/components/splitter/SplitterPanel.vue.d.ts.map +1 -0
- package/dist/types/components/spoiler/Spoiler.vue.d.ts +29 -0
- package/dist/types/components/spoiler/Spoiler.vue.d.ts.map +1 -0
- package/dist/types/components/spoiler/SpoilerPainter.d.ts +35 -0
- package/dist/types/components/spoiler/SpoilerPainter.d.ts.map +1 -0
- package/dist/types/components/spoiler/composables/useReveal.d.ts +17 -0
- package/dist/types/components/spoiler/composables/useReveal.d.ts.map +1 -0
- package/dist/types/components/spoiler/composables/useSpoiler.d.ts +5 -0
- package/dist/types/components/spoiler/composables/useSpoiler.d.ts.map +1 -0
- package/dist/types/components/spoiler/utils/irisOrigin.d.ts +6 -0
- package/dist/types/components/spoiler/utils/irisOrigin.d.ts.map +1 -0
- package/dist/types/components/spoiler/worklet.d.ts +2 -0
- package/dist/types/components/spoiler/worklet.d.ts.map +1 -0
- package/dist/types/components/stack/Stack.vue.d.ts +24 -0
- package/dist/types/components/stack/Stack.vue.d.ts.map +1 -0
- package/dist/types/components/stack/stack.variants.d.ts +73 -0
- package/dist/types/components/stack/stack.variants.d.ts.map +1 -0
- package/dist/types/components/statistic/Statistic.vue.d.ts +37 -0
- package/dist/types/components/statistic/Statistic.vue.d.ts.map +1 -0
- package/dist/types/components/statistic/statistic.variants.d.ts +46 -0
- package/dist/types/components/statistic/statistic.variants.d.ts.map +1 -0
- package/dist/types/components/switch/Switch.vue.d.ts +30 -0
- package/dist/types/components/switch/Switch.vue.d.ts.map +1 -0
- package/dist/types/components/switch/switch.variants.d.ts +23 -0
- package/dist/types/components/switch/switch.variants.d.ts.map +1 -0
- package/dist/types/components/table/Table.vue.d.ts +26 -0
- package/dist/types/components/table/Table.vue.d.ts.map +1 -0
- package/dist/types/components/table/TableBody.vue.d.ts +17 -0
- package/dist/types/components/table/TableBody.vue.d.ts.map +1 -0
- package/dist/types/components/table/TableCell.vue.d.ts +22 -0
- package/dist/types/components/table/TableCell.vue.d.ts.map +1 -0
- package/dist/types/components/table/TableHead.vue.d.ts +24 -0
- package/dist/types/components/table/TableHead.vue.d.ts.map +1 -0
- package/dist/types/components/table/TableHeader.vue.d.ts +17 -0
- package/dist/types/components/table/TableHeader.vue.d.ts.map +1 -0
- package/dist/types/components/table/TableRow.vue.d.ts +17 -0
- package/dist/types/components/table/TableRow.vue.d.ts.map +1 -0
- package/dist/types/components/table/table.variants.d.ts +87 -0
- package/dist/types/components/table/table.variants.d.ts.map +1 -0
- package/dist/types/components/tabs/Tabs.vue.d.ts +33 -0
- package/dist/types/components/tabs/Tabs.vue.d.ts.map +1 -0
- package/dist/types/components/tabs/TabsContent.vue.d.ts +18 -0
- package/dist/types/components/tabs/TabsContent.vue.d.ts.map +1 -0
- package/dist/types/components/tabs/TabsList.vue.d.ts +18 -0
- package/dist/types/components/tabs/TabsList.vue.d.ts.map +1 -0
- package/dist/types/components/tabs/TabsTrigger.vue.d.ts +19 -0
- package/dist/types/components/tabs/TabsTrigger.vue.d.ts.map +1 -0
- package/dist/types/components/tabs/context.d.ts +10 -0
- package/dist/types/components/tabs/context.d.ts.map +1 -0
- package/dist/types/components/tabs/tabs.variants.d.ts +130 -0
- package/dist/types/components/tabs/tabs.variants.d.ts.map +1 -0
- package/dist/types/components/tag/Tag.vue.d.ts +25 -0
- package/dist/types/components/tag/Tag.vue.d.ts.map +1 -0
- package/dist/types/components/tag/tag.variants.d.ts +67 -0
- package/dist/types/components/tag/tag.variants.d.ts.map +1 -0
- package/dist/types/components/tags-input/TagsInput.vue.d.ts +38 -0
- package/dist/types/components/tags-input/TagsInput.vue.d.ts.map +1 -0
- package/dist/types/components/tags-input/TagsInputChip.vue.d.ts +14 -0
- package/dist/types/components/tags-input/TagsInputChip.vue.d.ts.map +1 -0
- package/dist/types/components/tags-input/tags-input.variants.d.ts +92 -0
- package/dist/types/components/tags-input/tags-input.variants.d.ts.map +1 -0
- package/dist/types/components/text/Text.vue.d.ts +25 -0
- package/dist/types/components/text/Text.vue.d.ts.map +1 -0
- package/dist/types/components/text/text.variants.d.ts +91 -0
- package/dist/types/components/text/text.variants.d.ts.map +1 -0
- package/dist/types/components/textarea/Textarea.vue.d.ts +28 -0
- package/dist/types/components/textarea/Textarea.vue.d.ts.map +1 -0
- package/dist/types/components/textarea/textarea.variants.d.ts +59 -0
- package/dist/types/components/textarea/textarea.variants.d.ts.map +1 -0
- package/dist/types/components/time/Time.vue.d.ts +11 -0
- package/dist/types/components/time/Time.vue.d.ts.map +1 -0
- package/dist/types/components/time/composables/useNow.d.ts +2 -0
- package/dist/types/components/time/composables/useNow.d.ts.map +1 -0
- package/dist/types/components/time/utils/relativeTime.d.ts +2 -0
- package/dist/types/components/time/utils/relativeTime.d.ts.map +1 -0
- package/dist/types/components/time-field/TimeField.vue.d.ts +51 -0
- package/dist/types/components/time-field/TimeField.vue.d.ts.map +1 -0
- package/dist/types/components/toast/Toaster.vue.d.ts +10 -0
- package/dist/types/components/toast/Toaster.vue.d.ts.map +1 -0
- package/dist/types/components/toast/composables/useToastExpand.d.ts +6 -0
- package/dist/types/components/toast/composables/useToastExpand.d.ts.map +1 -0
- package/dist/types/components/toast/composables/useToastLayout.d.ts +16 -0
- package/dist/types/components/toast/composables/useToastLayout.d.ts.map +1 -0
- package/dist/types/components/toast/store.d.ts +68 -0
- package/dist/types/components/toast/store.d.ts.map +1 -0
- package/dist/types/components/toggle/Toggle.vue.d.ts +42 -0
- package/dist/types/components/toggle/Toggle.vue.d.ts.map +1 -0
- package/dist/types/components/toggle/toggle.variants.d.ts +167 -0
- package/dist/types/components/toggle/toggle.variants.d.ts.map +1 -0
- package/dist/types/components/tooltip/Tooltip.vue.d.ts +31 -0
- package/dist/types/components/tooltip/Tooltip.vue.d.ts.map +1 -0
- package/dist/types/components/tooltip/TooltipProvider.vue.d.ts +21 -0
- package/dist/types/components/tooltip/TooltipProvider.vue.d.ts.map +1 -0
- package/dist/types/components/tree-select/TreeSelect.vue.d.ts +40 -0
- package/dist/types/components/tree-select/TreeSelect.vue.d.ts.map +1 -0
- package/dist/types/components/tree-select/tree-select.variants.d.ts +5 -0
- package/dist/types/components/tree-select/tree-select.variants.d.ts.map +1 -0
- package/dist/types/components/tree-select/types.d.ts +10 -0
- package/dist/types/components/tree-select/types.d.ts.map +1 -0
- package/dist/types/components/visually-hidden/VisuallyHidden.vue.d.ts +14 -0
- package/dist/types/components/visually-hidden/VisuallyHidden.vue.d.ts.map +1 -0
- package/dist/types/index.d.ts +223 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/lib/a11y.d.ts +3 -0
- package/dist/types/lib/a11y.d.ts.map +1 -0
- package/dist/types/lib/caret.d.ts +6 -0
- package/dist/types/lib/caret.d.ts.map +1 -0
- package/dist/types/lib/cn.d.ts +3 -0
- package/dist/types/lib/cn.d.ts.map +1 -0
- package/dist/types/lib/collapse.d.ts +14 -0
- package/dist/types/lib/collapse.d.ts.map +1 -0
- package/dist/types/lib/date.d.ts +28 -0
- package/dist/types/lib/date.d.ts.map +1 -0
- package/dist/types/lib/dev.d.ts +3 -0
- package/dist/types/lib/dev.d.ts.map +1 -0
- package/dist/types/lib/field-focus.d.ts +6 -0
- package/dist/types/lib/field-focus.d.ts.map +1 -0
- package/dist/types/lib/passthrough.d.ts +4 -0
- package/dist/types/lib/passthrough.d.ts.map +1 -0
- package/dist/types/lib/tv.d.ts +3 -0
- package/dist/types/lib/tv.d.ts.map +1 -0
- package/dist/types/lib/tw-merge.d.ts +16 -0
- package/dist/types/lib/tw-merge.d.ts.map +1 -0
- package/dist/types/locale/en-US.d.ts +3 -0
- package/dist/types/locale/en-US.d.ts.map +1 -0
- package/dist/types/locale/index.d.ts +8 -0
- package/dist/types/locale/index.d.ts.map +1 -0
- package/dist/types/locale/types.d.ts +154 -0
- package/dist/types/locale/types.d.ts.map +1 -0
- package/dist/types/locale/zh-CN.d.ts +3 -0
- package/dist/types/locale/zh-CN.d.ts.map +1 -0
- package/dist/types/motion.d.ts +53 -0
- package/dist/types/motion.d.ts.map +1 -0
- package/dist/types/singletons.d.ts +3 -0
- package/dist/types/singletons.d.ts.map +1 -0
- package/package.json +85 -0
- package/src/components/accordion/Accordion.vue +37 -0
- package/src/components/accordion/AccordionContent.vue +29 -0
- package/src/components/accordion/AccordionItem.vue +18 -0
- package/src/components/accordion/AccordionTrigger.vue +40 -0
- package/src/components/accordion/accordion.variants.ts +19 -0
- package/src/components/alert/Alert.vue +70 -0
- package/src/components/alert-dialog/AlertDialog.vue +117 -0
- package/src/components/anchor/Anchor.vue +76 -0
- package/src/components/anchor/composables/useScrollSpy.ts +69 -0
- package/src/components/app-shell/AppShell.vue +102 -0
- package/src/components/app-shell/composables/useDesktopQuery.ts +20 -0
- package/src/components/aspect-ratio/AspectRatio.vue +29 -0
- package/src/components/avatar/Avatar.vue +57 -0
- package/src/components/avatar/AvatarGroup.vue +40 -0
- package/src/components/avatar/avatar-group.variants.ts +15 -0
- package/src/components/avatar/avatar.variants.ts +18 -0
- package/src/components/avatar/context.ts +16 -0
- package/src/components/badge/Badge.vue +67 -0
- package/src/components/badge/badge.variants.ts +54 -0
- package/src/components/banner/Banner.vue +179 -0
- package/src/components/banner/banner.variants.ts +52 -0
- package/src/components/banner/composables/useAutoplay.ts +31 -0
- package/src/components/banner/icons.ts +7 -0
- package/src/components/banner/types.ts +9 -0
- package/src/components/banner/utils/direction.ts +10 -0
- package/src/components/blockquote/Blockquote.vue +14 -0
- package/src/components/breadcrumb/Breadcrumb.vue +21 -0
- package/src/components/breadcrumb/BreadcrumbItem.vue +38 -0
- package/src/components/breadcrumb/BreadcrumbSeparator.vue +16 -0
- package/src/components/button/Button.vue +132 -0
- package/src/components/button/IconSlot.vue +36 -0
- package/src/components/button/button.variants.ts +113 -0
- package/src/components/button-group/ButtonGroup.vue +37 -0
- package/src/components/button-group/button-group.variants.ts +51 -0
- package/src/components/calendar/Calendar.vue +159 -0
- package/src/components/calendar/CalendarHeader.vue +51 -0
- package/src/components/calendar/CalendarLevels.vue +174 -0
- package/src/components/calendar/calendar.variants.ts +83 -0
- package/src/components/calendar/composables/useCalendarLevels.ts +52 -0
- package/src/components/calendar/utils/format.ts +23 -0
- package/src/components/callout/Callout.vue +34 -0
- package/src/components/callout/callout.variants.ts +33 -0
- package/src/components/callout/icons.ts +10 -0
- package/src/components/card/Card.vue +27 -0
- package/src/components/card/card.variants.ts +16 -0
- package/src/components/center/Center.vue +23 -0
- package/src/components/checkbox/Checkbox.vue +83 -0
- package/src/components/checkbox/checkbox.variants.ts +70 -0
- package/src/components/checkbox-group/CheckboxGroup.vue +58 -0
- package/src/components/checkbox-group/checkbox-group.variants.ts +16 -0
- package/src/components/chip/Chip.vue +107 -0
- package/src/components/chip/IconSlot.vue +46 -0
- package/src/components/chip/chip.variants.ts +67 -0
- package/src/components/chip/composables/useChipRoot.ts +20 -0
- package/src/components/close-button/CloseButton.vue +41 -0
- package/src/components/code/Code.vue +11 -0
- package/src/components/code-block/CodeBlock.vue +63 -0
- package/src/components/code-block/highlighter.ts +98 -0
- package/src/components/collapsible/Collapsible.vue +25 -0
- package/src/components/collapsible/CollapsibleContent.vue +31 -0
- package/src/components/collapsible/CollapsibleTrigger.vue +37 -0
- package/src/components/combobox/Combobox.vue +145 -0
- package/src/components/combobox/ComboboxList.vue +98 -0
- package/src/components/combobox/combobox.variants.ts +12 -0
- package/src/components/command-palette/CommandPalette.vue +97 -0
- package/src/components/command-palette/CommandPaletteItem.vue +49 -0
- package/src/components/command-palette/CommandPalettePanel.vue +95 -0
- package/src/components/command-palette/command-palette.variants.ts +45 -0
- package/src/components/command-palette/composables/useHotkey.ts +17 -0
- package/src/components/command-palette/types.ts +23 -0
- package/src/components/command-palette/utils/hotkey.ts +27 -0
- package/src/components/command-palette/utils/match.ts +76 -0
- package/src/components/container/Container.vue +21 -0
- package/src/components/container/container.variants.ts +18 -0
- package/src/components/context-menu/ContextMenu.vue +43 -0
- package/src/components/context-menu/ContextMenuCheckboxItem.vue +35 -0
- package/src/components/context-menu/ContextMenuGroup.vue +14 -0
- package/src/components/context-menu/ContextMenuItem.vue +30 -0
- package/src/components/context-menu/ContextMenuLabel.vue +14 -0
- package/src/components/context-menu/ContextMenuRadioGroup.vue +13 -0
- package/src/components/context-menu/ContextMenuRadioItem.vue +32 -0
- package/src/components/context-menu/ContextMenuSeparator.vue +12 -0
- package/src/components/context-menu/ContextMenuSub.vue +54 -0
- package/src/components/copy-button/CopyButton.vue +61 -0
- package/src/components/copy-button/composables/useCopy.ts +31 -0
- package/src/components/date-field/DateField.vue +155 -0
- package/src/components/date-field/composables/useSegmentFocus.ts +22 -0
- package/src/components/date-field/date-field.variants.ts +33 -0
- package/src/components/date-picker/DatePicker.vue +135 -0
- package/src/components/date-picker/date-picker.variants.ts +5 -0
- package/src/components/date-range-field/DateRangeField.vue +171 -0
- package/src/components/date-range-field/date-range-field.variants.ts +5 -0
- package/src/components/date-range-field/utils/validity.ts +21 -0
- package/src/components/date-range-picker/DateRangePicker.vue +138 -0
- package/src/components/date-time-picker/DateTimePicker.vue +174 -0
- package/src/components/date-time-picker/date-time-picker.variants.ts +5 -0
- package/src/components/description-list/DescriptionDetails.vue +13 -0
- package/src/components/description-list/DescriptionList.vue +13 -0
- package/src/components/description-list/DescriptionTerm.vue +13 -0
- package/src/components/dialog/Dialog.vue +103 -0
- package/src/components/dialog/dialog.variants.ts +32 -0
- package/src/components/disclosure-icon/DisclosureIcon.vue +36 -0
- package/src/components/disclosure-icon/disclosure-icon.variants.ts +25 -0
- package/src/components/divider/Divider.vue +43 -0
- package/src/components/drawer/Drawer.vue +95 -0
- package/src/components/drawer/drawer.variants.ts +19 -0
- package/src/components/dropdown-menu/DropdownMenu.vue +67 -0
- package/src/components/dropdown-menu/DropdownMenuCheckboxItem.vue +35 -0
- package/src/components/dropdown-menu/DropdownMenuGroup.vue +14 -0
- package/src/components/dropdown-menu/DropdownMenuItem.vue +30 -0
- package/src/components/dropdown-menu/DropdownMenuLabel.vue +14 -0
- package/src/components/dropdown-menu/DropdownMenuRadioGroup.vue +13 -0
- package/src/components/dropdown-menu/DropdownMenuRadioItem.vue +32 -0
- package/src/components/dropdown-menu/DropdownMenuSeparator.vue +12 -0
- package/src/components/dropdown-menu/DropdownMenuSub.vue +54 -0
- package/src/components/dropdown-menu/dropdown-menu.variants.ts +19 -0
- package/src/components/empty/Empty.vue +50 -0
- package/src/components/empty/empty.variants.ts +67 -0
- package/src/components/file-upload/FileUpload.vue +186 -0
- package/src/components/file-upload/composables/useFileDrop.ts +42 -0
- package/src/components/file-upload/composables/useObjectUrls.ts +33 -0
- package/src/components/file-upload/file-upload.variants.ts +31 -0
- package/src/components/file-upload/utils/select.ts +58 -0
- package/src/components/file-upload/utils/size.ts +16 -0
- package/src/components/flex/Flex.vue +28 -0
- package/src/components/flex/flex.variants.ts +49 -0
- package/src/components/form/Form.vue +70 -0
- package/src/components/form/composables/useForm.ts +108 -0
- package/src/components/form/context.ts +18 -0
- package/src/components/form/form.variants.ts +5 -0
- package/src/components/form/standard-schema.ts +26 -0
- package/src/components/form/utils/errors.ts +48 -0
- package/src/components/form/utils/focus.ts +10 -0
- package/src/components/form/utils/values.ts +23 -0
- package/src/components/form-field/FormField.vue +103 -0
- package/src/components/form-field/context.ts +62 -0
- package/src/components/form-field/form-field.variants.ts +26 -0
- package/src/components/form-layout/FormLayout.vue +59 -0
- package/src/components/form-layout/form-layout.variants.ts +33 -0
- package/src/components/grid/Grid.vue +22 -0
- package/src/components/grid/grid.variants.ts +35 -0
- package/src/components/heading/Heading.vue +49 -0
- package/src/components/heading/heading.variants.ts +30 -0
- package/src/components/highlight/Highlight.vue +31 -0
- package/src/components/hover-card/HoverCard.vue +53 -0
- package/src/components/icon-button/IconButton.vue +60 -0
- package/src/components/image/Image.vue +138 -0
- package/src/components/image/ImageGroup.vue +43 -0
- package/src/components/image/composables/useImage.ts +153 -0
- package/src/components/image/context.ts +18 -0
- package/src/components/image/image.variants.ts +17 -0
- package/src/components/image/resolver.ts +15 -0
- package/src/components/indicator/Indicator.vue +37 -0
- package/src/components/indicator/indicator.variants.ts +26 -0
- package/src/components/inline/Inline.vue +24 -0
- package/src/components/inline/inline.variants.ts +41 -0
- package/src/components/input/Input.vue +43 -0
- package/src/components/input/InputAction.vue +26 -0
- package/src/components/input/InputBase.vue +129 -0
- package/src/components/input/input.variants.ts +68 -0
- package/src/components/input-group/InputGroup.vue +35 -0
- package/src/components/input-group/InputGroupAddon.vue +14 -0
- package/src/components/input-group/InputGroupScope.vue +23 -0
- package/src/components/input-group/context.ts +18 -0
- package/src/components/input-group/input-group.variants.ts +13 -0
- package/src/components/kbd/Kbd.vue +11 -0
- package/src/components/lightbox/Lightbox.vue +249 -0
- package/src/components/lightbox/LightboxChrome.vue +113 -0
- package/src/components/lightbox/LightboxStrip.vue +91 -0
- package/src/components/lightbox/LightboxThumbs.vue +73 -0
- package/src/components/lightbox/LightboxToolbar.vue +73 -0
- package/src/components/lightbox/composables/useLightboxFrames.ts +38 -0
- package/src/components/lightbox/composables/useLightboxGesture.ts +204 -0
- package/src/components/lightbox/composables/useLightboxHint.ts +37 -0
- package/src/components/lightbox/composables/useLightboxLarge.ts +62 -0
- package/src/components/lightbox/composables/useLightboxMotion.ts +146 -0
- package/src/components/lightbox/composables/useLightboxPaging.ts +96 -0
- package/src/components/lightbox/composables/useLightboxPhase.ts +59 -0
- package/src/components/lightbox/composables/useLightboxPose.ts +35 -0
- package/src/components/lightbox/composables/useLightboxRotation.ts +48 -0
- package/src/components/lightbox/composables/useLightboxSlides.ts +31 -0
- package/src/components/lightbox/composables/useLightboxZoom.ts +148 -0
- package/src/components/lightbox/types.ts +10 -0
- package/src/components/lightbox/utils/download.ts +29 -0
- package/src/components/lightbox/utils/gesture.ts +54 -0
- package/src/components/lightbox/utils/paging.ts +33 -0
- package/src/components/lightbox/utils/pose.ts +125 -0
- package/src/components/lightbox/utils/zoom.ts +113 -0
- package/src/components/link/Link.vue +29 -0
- package/src/components/link/link.variants.ts +14 -0
- package/src/components/list/List.vue +13 -0
- package/src/components/list/ListItem.vue +13 -0
- package/src/components/listbox/Listbox.vue +103 -0
- package/src/components/listbox/listbox.variants.ts +23 -0
- package/src/components/loading-overlay/LoadingOverlay.vue +54 -0
- package/src/components/loading-overlay/composables/useDelayedVisible.ts +51 -0
- package/src/components/loading-overlay/loading-overlay.variants.ts +25 -0
- package/src/components/mark/Mark.vue +11 -0
- package/src/components/menubar/Menubar.vue +29 -0
- package/src/components/menubar/MenubarCheckboxItem.vue +35 -0
- package/src/components/menubar/MenubarGroup.vue +14 -0
- package/src/components/menubar/MenubarItem.vue +30 -0
- package/src/components/menubar/MenubarLabel.vue +14 -0
- package/src/components/menubar/MenubarMenu.vue +43 -0
- package/src/components/menubar/MenubarRadioGroup.vue +13 -0
- package/src/components/menubar/MenubarRadioItem.vue +32 -0
- package/src/components/menubar/MenubarSeparator.vue +12 -0
- package/src/components/menubar/MenubarSub.vue +42 -0
- package/src/components/menubar/menubar.variants.ts +17 -0
- package/src/components/meter-group/MeterGroup.vue +102 -0
- package/src/components/meter-group/meter-group.variants.ts +38 -0
- package/src/components/meter-group/types.ts +9 -0
- package/src/components/meter-group/utils/tones.ts +14 -0
- package/src/components/multi-combobox/MultiCombobox.vue +207 -0
- package/src/components/multi-combobox/multi-combobox.variants.ts +14 -0
- package/src/components/multi-select/MultiSelect.vue +187 -0
- package/src/components/multi-select/multi-select.variants.ts +13 -0
- package/src/components/nav-link/NavLink.vue +50 -0
- package/src/components/nav-link/nav-link.variants.ts +30 -0
- package/src/components/number-format/NumberFormat.vue +50 -0
- package/src/components/number-input/NumberInput.vue +109 -0
- package/src/components/number-input/number-input.variants.ts +28 -0
- package/src/components/page/Page.vue +23 -0
- package/src/components/page/PageAside.vue +28 -0
- package/src/components/page/PageBody.vue +13 -0
- package/src/components/page/PageHeader.vue +35 -0
- package/src/components/panel/Panel.vue +59 -0
- package/src/components/panel/panel.variants.ts +29 -0
- package/src/components/password-input/PasswordInput.vue +56 -0
- package/src/components/pin-input/PinInput.vue +75 -0
- package/src/components/pin-input/pin-input.variants.ts +31 -0
- package/src/components/popconfirm/Popconfirm.vue +112 -0
- package/src/components/popover/Popover.vue +52 -0
- package/src/components/prev-next/PrevNext.vue +22 -0
- package/src/components/prev-next/PrevNextLink.vue +44 -0
- package/src/components/prev-next/prev-next.variants.ts +28 -0
- package/src/components/progress/Progress.vue +59 -0
- package/src/components/progress/composables/useProgressValue.ts +40 -0
- package/src/components/progress/progress.variants.ts +46 -0
- package/src/components/prose/Prose.vue +14 -0
- package/src/components/radio-group/RadioGroup.vue +86 -0
- package/src/components/radio-group/radio-group.variants.ts +5 -0
- package/src/components/range-calendar/RangeCalendar.vue +184 -0
- package/src/components/range-calendar/composables/useRangeAnchor.ts +16 -0
- package/src/components/range-calendar/range-calendar.variants.ts +24 -0
- package/src/components/range-calendar/utils/limit.ts +11 -0
- package/src/components/range-slider/RangeSlider.vue +128 -0
- package/src/components/rating/Rating.vue +97 -0
- package/src/components/rating/rating.variants.ts +46 -0
- package/src/components/rating/utils/fill.ts +4 -0
- package/src/components/result/Result.vue +51 -0
- package/src/components/result/result.variants.ts +24 -0
- package/src/components/ring-progress/RingProgress.vue +76 -0
- package/src/components/ring-progress/ring-progress.variants.ts +55 -0
- package/src/components/ripple/LICENSE +9 -0
- package/src/components/ripple/Ripple.vue +19 -0
- package/src/components/ripple/useRipple.ts +211 -0
- package/src/components/scroll-area/ScrollArea.vue +128 -0
- package/src/components/scroll-area/composables/useEdgeShadow.ts +32 -0
- package/src/components/scroll-area/composables/useLayerLock.ts +39 -0
- package/src/components/scroll-area/composables/useOverlayScrollbars.ts +109 -0
- package/src/components/scroll-area/composables/useWheelRedirect.ts +30 -0
- package/src/components/scroll-area/scroll-restore.ts +153 -0
- package/src/components/search-input/SearchInput.vue +57 -0
- package/src/components/section/Section.vue +19 -0
- package/src/components/segmented-control/SegmentedControl.vue +79 -0
- package/src/components/segmented-control/segmented-control.variants.ts +46 -0
- package/src/components/select/Select.vue +102 -0
- package/src/components/select/SelectList.vue +108 -0
- package/src/components/select/select.variants.ts +42 -0
- package/src/components/select/types.ts +21 -0
- package/src/components/sheet/Sheet.vue +118 -0
- package/src/components/sheet/composables/useDragToDismiss.ts +64 -0
- package/src/components/sheet/sheet.variants.ts +19 -0
- package/src/components/sidebar/DrawerScope.ts +15 -0
- package/src/components/sidebar/Sidebar.vue +67 -0
- package/src/components/sidebar/SidebarGroup.vue +68 -0
- package/src/components/sidebar/SidebarTrigger.vue +27 -0
- package/src/components/sidebar/context.ts +20 -0
- package/src/components/simple-grid/SimpleGrid.vue +27 -0
- package/src/components/simple-grid/simple-grid.variants.ts +25 -0
- package/src/components/skeleton/Skeleton.vue +28 -0
- package/src/components/slider/Slider.vue +110 -0
- package/src/components/slider/SliderHandle.vue +27 -0
- package/src/components/slider/SliderMarks.vue +40 -0
- package/src/components/slider/composables/useSliderChrome.ts +44 -0
- package/src/components/slider/slider.variants.ts +64 -0
- package/src/components/space/Space.vue +15 -0
- package/src/components/space/space.variants.ts +18 -0
- package/src/components/spinner/Spinner.vue +25 -0
- package/src/components/spinner/spinner.variants.ts +15 -0
- package/src/components/splitter/Splitter.vue +23 -0
- package/src/components/splitter/SplitterHandle.vue +31 -0
- package/src/components/splitter/SplitterPanel.vue +28 -0
- package/src/components/spoiler/LICENSE +19 -0
- package/src/components/spoiler/Spoiler.vue +45 -0
- package/src/components/spoiler/SpoilerPainter.ts +197 -0
- package/src/components/spoiler/composables/useReveal.ts +53 -0
- package/src/components/spoiler/composables/useSpoiler.ts +68 -0
- package/src/components/spoiler/utils/irisOrigin.ts +40 -0
- package/src/components/spoiler/worklet.ts +199 -0
- package/src/components/stack/Stack.vue +23 -0
- package/src/components/stack/stack.variants.ts +34 -0
- package/src/components/statistic/Statistic.vue +92 -0
- package/src/components/statistic/statistic.variants.ts +51 -0
- package/src/components/switch/Switch.vue +66 -0
- package/src/components/switch/switch.variants.ts +34 -0
- package/src/components/table/Table.vue +41 -0
- package/src/components/table/TableBody.vue +13 -0
- package/src/components/table/TableCell.vue +21 -0
- package/src/components/table/TableHead.vue +25 -0
- package/src/components/table/TableHeader.vue +13 -0
- package/src/components/table/TableRow.vue +13 -0
- package/src/components/table/table.variants.ts +56 -0
- package/src/components/tabs/Tabs.vue +41 -0
- package/src/components/tabs/TabsContent.vue +17 -0
- package/src/components/tabs/TabsList.vue +28 -0
- package/src/components/tabs/TabsTrigger.vue +33 -0
- package/src/components/tabs/context.ts +24 -0
- package/src/components/tabs/tabs.variants.ts +95 -0
- package/src/components/tag/Tag.vue +40 -0
- package/src/components/tag/tag.variants.ts +57 -0
- package/src/components/tags-input/TagsInput.vue +132 -0
- package/src/components/tags-input/TagsInputChip.vue +29 -0
- package/src/components/tags-input/tags-input.variants.ts +47 -0
- package/src/components/text/Text.vue +40 -0
- package/src/components/text/text.variants.ts +41 -0
- package/src/components/textarea/Textarea.vue +111 -0
- package/src/components/textarea/textarea.variants.ts +47 -0
- package/src/components/time/Time.vue +64 -0
- package/src/components/time/composables/useNow.ts +27 -0
- package/src/components/time/utils/relativeTime.ts +20 -0
- package/src/components/time-field/TimeField.vue +162 -0
- package/src/components/toast/Toaster.vue +173 -0
- package/src/components/toast/composables/useToastExpand.ts +27 -0
- package/src/components/toast/composables/useToastLayout.ts +84 -0
- package/src/components/toast/store.ts +234 -0
- package/src/components/toggle/Toggle.vue +102 -0
- package/src/components/toggle/toggle.variants.ts +10 -0
- package/src/components/tooltip/Tooltip.vue +46 -0
- package/src/components/tooltip/TooltipProvider.vue +22 -0
- package/src/components/tree-select/TreeSelect.vue +178 -0
- package/src/components/tree-select/tree-select.variants.ts +27 -0
- package/src/components/tree-select/types.ts +34 -0
- package/src/components/visually-hidden/VisuallyHidden.vue +11 -0
- package/src/index.ts +252 -0
- package/src/lib/a11y.ts +20 -0
- package/src/lib/caret.ts +52 -0
- package/src/lib/cn.ts +9 -0
- package/src/lib/collapse.ts +45 -0
- package/src/lib/date.ts +111 -0
- package/src/lib/dev.ts +13 -0
- package/src/lib/field-focus.ts +40 -0
- package/src/lib/passthrough.ts +9 -0
- package/src/lib/tv.ts +6 -0
- package/src/lib/tw-merge.ts +25 -0
- package/src/locale/en-US.ts +152 -0
- package/src/locale/index.ts +67 -0
- package/src/locale/types.ts +154 -0
- package/src/locale/zh-CN.ts +152 -0
- package/src/motion.ts +41 -0
- package/src/singletons.ts +3 -0
- package/src/styles/base.css +22 -0
- package/src/styles/density.css +32 -0
- package/src/styles/interaction.css +294 -0
- package/src/styles/mappings.css +104 -0
- package/src/styles/motion.css +606 -0
- package/src/styles/palette.css +36 -0
- package/src/styles/scroll.css +45 -0
- package/src/styles/semantic.css +225 -0
- package/src/styles/spoiler.css +65 -0
- package/src/styles/tokens.css +14 -0
- package/src/styles/typography.css +259 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["$attrs","$attrs","$attrs","$attrs","$attrs","$attrs","$attrs","$attrs","$attrs","$attrs","$slots","$attrs","$attrs","$attrs","$attrs","$attrs","$attrs","$attrs","$attrs","$attrs","$slots","$attrs","$attrs","$attrs","$attrs","$attrs","$attrs","$attrs","$attrs","$attrs","$attrs","$attrs","$attrs","$attrs","$attrs","$attrs","$attrs","$attrs","$attrs","$attrs","$slots","$attrs","$attrs","$attrs","$slots","$attrs","$attrs","$attrs","$attrs","$attrs","$attrs","$attrs","$slots","$slots","$slots","$slots","$attrs","$attrs","$attrs","$attrs","$slots"],"sources":["../src/lib/tw-merge.ts","../src/lib/cn.ts","../src/lib/tv.ts","../src/motion.ts","../src/locale/zh-CN.ts","../src/locale/en-US.ts","../src/locale/index.ts","../src/singletons.ts","../src/lib/dev.ts","../src/lib/a11y.ts","../src/components/button/button.variants.ts","../src/components/spinner/spinner.variants.ts","../src/components/spinner/Spinner.vue","../src/components/spinner/Spinner.vue","../src/components/button/IconSlot.vue","../src/components/button/IconSlot.vue","../src/components/ripple/useRipple.ts","../src/components/ripple/Ripple.vue","../src/components/ripple/Ripple.vue","../src/components/button/Button.vue","../src/components/button/Button.vue","../src/components/tooltip/Tooltip.vue","../src/components/tooltip/Tooltip.vue","../src/lib/passthrough.ts","../src/components/icon-button/IconButton.vue","../src/components/icon-button/IconButton.vue","../src/components/close-button/CloseButton.vue","../src/components/close-button/CloseButton.vue","../src/components/copy-button/composables/useCopy.ts","../src/components/copy-button/CopyButton.vue","../src/components/copy-button/CopyButton.vue","../src/components/button-group/button-group.variants.ts","../src/components/button-group/ButtonGroup.vue","../src/components/button-group/ButtonGroup.vue","../src/components/tag/tag.variants.ts","../src/components/tag/Tag.vue","../src/components/tag/Tag.vue","../src/components/chip/chip.variants.ts","../src/components/chip/IconSlot.vue","../src/components/chip/IconSlot.vue","../src/components/chip/composables/useChipRoot.ts","../src/components/chip/Chip.vue","../src/components/chip/Chip.vue","../src/components/skeleton/Skeleton.vue","../src/components/skeleton/Skeleton.vue","../src/components/visually-hidden/VisuallyHidden.vue","../src/components/visually-hidden/VisuallyHidden.vue","../src/components/lightbox/LightboxStrip.vue","../src/components/lightbox/LightboxStrip.vue","../src/components/scroll-area/composables/useOverlayScrollbars.ts","../src/components/scroll-area/composables/useEdgeShadow.ts","../src/components/scroll-area/composables/useWheelRedirect.ts","../src/components/scroll-area/composables/useLayerLock.ts","../src/components/scroll-area/ScrollArea.vue","../src/components/scroll-area/ScrollArea.vue","../src/components/highlight/Highlight.vue","../src/components/highlight/Highlight.vue","../src/components/lightbox/LightboxThumbs.vue","../src/components/lightbox/LightboxThumbs.vue","../src/components/lightbox/LightboxToolbar.vue","../src/components/lightbox/LightboxToolbar.vue","../src/components/lightbox/LightboxChrome.vue","../src/components/lightbox/LightboxChrome.vue","../src/components/lightbox/utils/zoom.ts","../src/components/lightbox/utils/pose.ts","../src/components/lightbox/composables/useLightboxMotion.ts","../src/components/lightbox/utils/gesture.ts","../src/components/lightbox/composables/useLightboxZoom.ts","../src/components/lightbox/composables/useLightboxGesture.ts","../src/components/lightbox/utils/paging.ts","../src/components/lightbox/composables/useLightboxPaging.ts","../src/components/lightbox/composables/useLightboxFrames.ts","../src/components/lightbox/composables/useLightboxLarge.ts","../src/components/lightbox/composables/useLightboxPose.ts","../src/components/lightbox/composables/useLightboxPhase.ts","../src/components/lightbox/composables/useLightboxHint.ts","../src/components/lightbox/composables/useLightboxSlides.ts","../src/components/lightbox/composables/useLightboxRotation.ts","../src/components/lightbox/utils/download.ts","../src/components/lightbox/Lightbox.vue","../src/components/lightbox/Lightbox.vue","../src/components/image/image.variants.ts","../src/components/image/resolver.ts","../src/components/image/composables/useImage.ts","../src/components/image/context.ts","../src/components/image/Image.vue","../src/components/image/Image.vue","../src/components/avatar/avatar.variants.ts","../src/components/avatar/context.ts","../src/components/avatar/Avatar.vue","../src/components/avatar/Avatar.vue","../src/components/avatar/avatar-group.variants.ts","../src/components/avatar/AvatarGroup.vue","../src/components/avatar/AvatarGroup.vue","../src/components/badge/badge.variants.ts","../src/components/badge/Badge.vue","../src/components/badge/Badge.vue","../src/components/indicator/indicator.variants.ts","../src/components/indicator/Indicator.vue","../src/components/indicator/Indicator.vue","../src/components/callout/callout.variants.ts","../src/components/callout/icons.ts","../src/components/callout/Callout.vue","../src/components/callout/Callout.vue","../src/lib/collapse.ts","../src/components/alert/Alert.vue","../src/components/alert/Alert.vue","../src/components/prev-next/PrevNext.vue","../src/components/prev-next/PrevNext.vue","../src/components/prev-next/prev-next.variants.ts","../src/components/prev-next/PrevNextLink.vue","../src/components/prev-next/PrevNextLink.vue","../src/components/table/table.variants.ts","../src/components/table/Table.vue","../src/components/table/Table.vue","../src/components/table/TableHeader.vue","../src/components/table/TableHeader.vue","../src/components/table/TableBody.vue","../src/components/table/TableBody.vue","../src/components/table/TableRow.vue","../src/components/table/TableRow.vue","../src/components/table/TableHead.vue","../src/components/table/TableHead.vue","../src/components/table/TableCell.vue","../src/components/table/TableCell.vue","../src/components/tabs/context.ts","../src/components/tabs/Tabs.vue","../src/components/tabs/Tabs.vue","../src/components/tabs/tabs.variants.ts","../src/components/tabs/TabsList.vue","../src/components/tabs/TabsList.vue","../src/components/tabs/TabsTrigger.vue","../src/components/tabs/TabsTrigger.vue","../src/components/tabs/TabsContent.vue","../src/components/tabs/TabsContent.vue","../src/lib/field-focus.ts","../src/components/input/input.variants.ts","../src/components/input/InputAction.vue","../src/components/input/InputAction.vue","../src/components/form-field/context.ts","../src/components/input-group/context.ts","../src/components/input/InputBase.vue","../src/components/input/InputBase.vue","../src/components/input/Input.vue","../src/components/input/Input.vue","../src/lib/caret.ts","../src/components/textarea/textarea.variants.ts","../src/components/textarea/Textarea.vue","../src/components/textarea/Textarea.vue","../src/components/number-input/number-input.variants.ts","../src/components/number-input/NumberInput.vue","../src/components/number-input/NumberInput.vue","../src/components/password-input/PasswordInput.vue","../src/components/password-input/PasswordInput.vue","../src/components/search-input/SearchInput.vue","../src/components/search-input/SearchInput.vue","../src/components/input-group/input-group.variants.ts","../src/components/input-group/InputGroup.vue","../src/components/input-group/InputGroup.vue","../src/components/input-group/InputGroupAddon.vue","../src/components/input-group/InputGroupAddon.vue","../src/components/disclosure-icon/disclosure-icon.variants.ts","../src/components/disclosure-icon/DisclosureIcon.vue","../src/components/disclosure-icon/DisclosureIcon.vue","../src/components/card/card.variants.ts","../src/components/card/Card.vue","../src/components/card/Card.vue","../src/components/select/select.variants.ts","../src/components/select/types.ts","../src/components/select/SelectList.vue","../src/components/select/SelectList.vue","../src/components/select/Select.vue","../src/components/select/Select.vue","../src/components/multi-select/multi-select.variants.ts","../src/components/multi-select/MultiSelect.vue","../src/components/multi-select/MultiSelect.vue","../src/components/combobox/combobox.variants.ts","../src/components/combobox/ComboboxList.vue","../src/components/combobox/ComboboxList.vue","../src/components/combobox/Combobox.vue","../src/components/combobox/Combobox.vue","../src/components/kbd/Kbd.vue","../src/components/kbd/Kbd.vue","../src/components/command-palette/command-palette.variants.ts","../src/components/command-palette/CommandPaletteItem.vue","../src/components/command-palette/CommandPaletteItem.vue","../src/components/command-palette/types.ts","../src/components/command-palette/utils/match.ts","../src/components/command-palette/CommandPalettePanel.vue","../src/components/command-palette/CommandPalettePanel.vue","../src/components/command-palette/utils/hotkey.ts","../src/components/command-palette/composables/useHotkey.ts","../src/components/command-palette/CommandPalette.vue","../src/components/command-palette/CommandPalette.vue","../src/components/listbox/listbox.variants.ts","../src/components/listbox/Listbox.vue","../src/components/listbox/Listbox.vue","../src/components/tree-select/tree-select.variants.ts","../src/components/tree-select/types.ts","../src/components/tree-select/TreeSelect.vue","../src/components/tree-select/TreeSelect.vue","../src/components/checkbox/checkbox.variants.ts","../src/components/checkbox/Checkbox.vue","../src/components/checkbox/Checkbox.vue","../src/components/checkbox-group/checkbox-group.variants.ts","../src/components/checkbox-group/CheckboxGroup.vue","../src/components/checkbox-group/CheckboxGroup.vue","../src/components/radio-group/radio-group.variants.ts","../src/components/radio-group/RadioGroup.vue","../src/components/radio-group/RadioGroup.vue","../src/components/switch/switch.variants.ts","../src/components/switch/Switch.vue","../src/components/switch/Switch.vue","../src/components/slider/composables/useSliderChrome.ts","../src/components/slider/slider.variants.ts","../src/components/slider/SliderHandle.vue","../src/components/slider/SliderHandle.vue","../src/components/slider/SliderMarks.vue","../src/components/slider/SliderMarks.vue","../src/components/slider/Slider.vue","../src/components/slider/Slider.vue","../src/components/range-slider/RangeSlider.vue","../src/components/range-slider/RangeSlider.vue","../src/components/toggle/toggle.variants.ts","../src/components/toggle/Toggle.vue","../src/components/toggle/Toggle.vue","../src/components/tags-input/tags-input.variants.ts","../src/components/tags-input/TagsInputChip.vue","../src/components/tags-input/TagsInputChip.vue","../src/components/tags-input/TagsInput.vue","../src/components/tags-input/TagsInput.vue","../src/components/multi-combobox/multi-combobox.variants.ts","../src/components/multi-combobox/MultiCombobox.vue","../src/components/multi-combobox/MultiCombobox.vue","../src/lib/date.ts","../src/components/calendar/calendar.variants.ts","../src/components/calendar/CalendarHeader.vue","../src/components/calendar/CalendarHeader.vue","../src/components/calendar/utils/format.ts","../src/components/calendar/CalendarLevels.vue","../src/components/calendar/CalendarLevels.vue","../src/components/calendar/composables/useCalendarLevels.ts","../src/components/calendar/Calendar.vue","../src/components/calendar/Calendar.vue","../src/components/date-field/composables/useSegmentFocus.ts","../src/components/date-field/date-field.variants.ts","../src/components/date-field/DateField.vue","../src/components/date-field/DateField.vue","../src/components/input-group/InputGroupScope.vue","../src/components/input-group/InputGroupScope.vue","../src/components/date-picker/date-picker.variants.ts","../src/components/date-picker/DatePicker.vue","../src/components/date-picker/DatePicker.vue","../src/components/date-range-field/date-range-field.variants.ts","../src/components/date-range-field/utils/validity.ts","../src/components/date-range-field/DateRangeField.vue","../src/components/date-range-field/DateRangeField.vue","../src/components/range-calendar/composables/useRangeAnchor.ts","../src/components/range-calendar/range-calendar.variants.ts","../src/components/range-calendar/utils/limit.ts","../src/components/range-calendar/RangeCalendar.vue","../src/components/range-calendar/RangeCalendar.vue","../src/components/date-range-picker/DateRangePicker.vue","../src/components/date-range-picker/DateRangePicker.vue","../src/components/time-field/TimeField.vue","../src/components/time-field/TimeField.vue","../src/components/date-time-picker/date-time-picker.variants.ts","../src/components/date-time-picker/DateTimePicker.vue","../src/components/date-time-picker/DateTimePicker.vue","../src/components/rating/rating.variants.ts","../src/components/rating/utils/fill.ts","../src/components/rating/Rating.vue","../src/components/rating/Rating.vue","../src/components/text/text.variants.ts","../src/components/text/Text.vue","../src/components/text/Text.vue","../src/components/file-upload/composables/useFileDrop.ts","../src/components/file-upload/composables/useObjectUrls.ts","../src/components/file-upload/file-upload.variants.ts","../src/components/file-upload/utils/select.ts","../src/components/file-upload/utils/size.ts","../src/components/file-upload/FileUpload.vue","../src/components/file-upload/FileUpload.vue","../src/components/dialog/dialog.variants.ts","../src/components/heading/heading.variants.ts","../src/components/heading/Heading.vue","../src/components/heading/Heading.vue","../src/components/alert-dialog/AlertDialog.vue","../src/components/alert-dialog/AlertDialog.vue","../src/components/popconfirm/Popconfirm.vue","../src/components/popconfirm/Popconfirm.vue","../src/components/hover-card/HoverCard.vue","../src/components/hover-card/HoverCard.vue","../src/components/context-menu/ContextMenu.vue","../src/components/context-menu/ContextMenu.vue","../src/components/dropdown-menu/dropdown-menu.variants.ts","../src/components/context-menu/ContextMenuItem.vue","../src/components/context-menu/ContextMenuItem.vue","../src/components/context-menu/ContextMenuCheckboxItem.vue","../src/components/context-menu/ContextMenuCheckboxItem.vue","../src/components/context-menu/ContextMenuGroup.vue","../src/components/context-menu/ContextMenuGroup.vue","../src/components/context-menu/ContextMenuSub.vue","../src/components/context-menu/ContextMenuSub.vue","../src/components/context-menu/ContextMenuLabel.vue","../src/components/context-menu/ContextMenuLabel.vue","../src/components/context-menu/ContextMenuSeparator.vue","../src/components/context-menu/ContextMenuSeparator.vue","../src/components/context-menu/ContextMenuRadioGroup.vue","../src/components/context-menu/ContextMenuRadioGroup.vue","../src/components/context-menu/ContextMenuRadioItem.vue","../src/components/context-menu/ContextMenuRadioItem.vue","../src/components/sheet/composables/useDragToDismiss.ts","../src/components/sheet/sheet.variants.ts","../src/components/sheet/Sheet.vue","../src/components/sheet/Sheet.vue","../src/components/loading-overlay/composables/useDelayedVisible.ts","../src/components/loading-overlay/loading-overlay.variants.ts","../src/components/loading-overlay/LoadingOverlay.vue","../src/components/loading-overlay/LoadingOverlay.vue","../src/components/panel/panel.variants.ts","../src/components/panel/Panel.vue","../src/components/panel/Panel.vue","../src/components/progress/composables/useProgressValue.ts","../src/components/progress/progress.variants.ts","../src/components/progress/Progress.vue","../src/components/progress/Progress.vue","../src/components/ring-progress/ring-progress.variants.ts","../src/components/ring-progress/RingProgress.vue","../src/components/ring-progress/RingProgress.vue","../src/components/meter-group/meter-group.variants.ts","../src/components/meter-group/utils/tones.ts","../src/components/meter-group/MeterGroup.vue","../src/components/meter-group/MeterGroup.vue","../src/components/empty/empty.variants.ts","../src/components/empty/Empty.vue","../src/components/empty/Empty.vue","../src/components/result/result.variants.ts","../src/components/result/Result.vue","../src/components/result/Result.vue","../src/components/number-format/NumberFormat.vue","../src/components/number-format/NumberFormat.vue","../src/components/statistic/statistic.variants.ts","../src/components/statistic/Statistic.vue","../src/components/statistic/Statistic.vue","../src/components/banner/banner.variants.ts","../src/components/banner/composables/useAutoplay.ts","../src/components/banner/icons.ts","../src/components/banner/utils/direction.ts","../src/components/banner/Banner.vue","../src/components/banner/Banner.vue","../src/components/menubar/menubar.variants.ts","../src/components/menubar/Menubar.vue","../src/components/menubar/Menubar.vue","../src/components/menubar/MenubarMenu.vue","../src/components/menubar/MenubarMenu.vue","../src/components/menubar/MenubarItem.vue","../src/components/menubar/MenubarItem.vue","../src/components/menubar/MenubarCheckboxItem.vue","../src/components/menubar/MenubarCheckboxItem.vue","../src/components/menubar/MenubarGroup.vue","../src/components/menubar/MenubarGroup.vue","../src/components/menubar/MenubarSub.vue","../src/components/menubar/MenubarSub.vue","../src/components/menubar/MenubarLabel.vue","../src/components/menubar/MenubarLabel.vue","../src/components/menubar/MenubarSeparator.vue","../src/components/menubar/MenubarSeparator.vue","../src/components/menubar/MenubarRadioGroup.vue","../src/components/menubar/MenubarRadioGroup.vue","../src/components/menubar/MenubarRadioItem.vue","../src/components/menubar/MenubarRadioItem.vue","../src/components/form/standard-schema.ts","../src/components/form/utils/errors.ts","../src/components/form/utils/values.ts","../src/components/form/composables/useForm.ts","../src/components/form/context.ts","../src/components/form/form.variants.ts","../src/components/form/utils/focus.ts","../src/components/form/Form.vue","../src/components/form/Form.vue","../src/components/form-field/form-field.variants.ts","../src/components/form-field/FormField.vue","../src/components/form-field/FormField.vue","../src/components/form-layout/form-layout.variants.ts","../src/components/form-layout/FormLayout.vue","../src/components/form-layout/FormLayout.vue","../src/components/pin-input/pin-input.variants.ts","../src/components/pin-input/PinInput.vue","../src/components/pin-input/PinInput.vue","../src/components/segmented-control/segmented-control.variants.ts","../src/components/segmented-control/SegmentedControl.vue","../src/components/segmented-control/SegmentedControl.vue","../src/components/prose/Prose.vue","../src/components/prose/Prose.vue","../src/components/link/link.variants.ts","../src/components/link/Link.vue","../src/components/link/Link.vue","../src/components/code/Code.vue","../src/components/code/Code.vue","../src/components/blockquote/Blockquote.vue","../src/components/blockquote/Blockquote.vue","../src/components/mark/Mark.vue","../src/components/mark/Mark.vue","../src/components/code-block/highlighter.ts","../src/components/code-block/CodeBlock.vue","../src/components/code-block/CodeBlock.vue","../src/components/list/List.vue","../src/components/list/List.vue","../src/components/list/ListItem.vue","../src/components/list/ListItem.vue","../src/components/description-list/DescriptionList.vue","../src/components/description-list/DescriptionList.vue","../src/components/description-list/DescriptionTerm.vue","../src/components/description-list/DescriptionTerm.vue","../src/components/description-list/DescriptionDetails.vue","../src/components/description-list/DescriptionDetails.vue","../src/components/time/utils/relativeTime.ts","../src/components/time/composables/useNow.ts","../src/components/time/Time.vue","../src/components/time/Time.vue","../src/components/stack/stack.variants.ts","../src/components/stack/Stack.vue","../src/components/stack/Stack.vue","../src/components/inline/inline.variants.ts","../src/components/inline/Inline.vue","../src/components/inline/Inline.vue","../src/components/flex/flex.variants.ts","../src/components/flex/Flex.vue","../src/components/flex/Flex.vue","../src/components/grid/grid.variants.ts","../src/components/grid/Grid.vue","../src/components/grid/Grid.vue","../src/components/simple-grid/simple-grid.variants.ts","../src/components/simple-grid/SimpleGrid.vue","../src/components/simple-grid/SimpleGrid.vue","../src/components/container/container.variants.ts","../src/components/container/Container.vue","../src/components/container/Container.vue","../src/components/center/Center.vue","../src/components/center/Center.vue","../src/components/space/space.variants.ts","../src/components/space/Space.vue","../src/components/space/Space.vue","../src/components/aspect-ratio/AspectRatio.vue","../src/components/aspect-ratio/AspectRatio.vue","../src/components/divider/Divider.vue","../src/components/divider/Divider.vue","../src/components/splitter/Splitter.vue","../src/components/splitter/Splitter.vue","../src/components/splitter/SplitterPanel.vue","../src/components/splitter/SplitterPanel.vue","../src/components/splitter/SplitterHandle.vue","../src/components/splitter/SplitterHandle.vue","../src/components/collapsible/Collapsible.vue","../src/components/collapsible/Collapsible.vue","../src/components/collapsible/CollapsibleTrigger.vue","../src/components/collapsible/CollapsibleTrigger.vue","../src/components/collapsible/CollapsibleContent.vue","../src/components/collapsible/CollapsibleContent.vue","../src/components/accordion/accordion.variants.ts","../src/components/accordion/Accordion.vue","../src/components/accordion/Accordion.vue","../src/components/accordion/AccordionItem.vue","../src/components/accordion/AccordionItem.vue","../src/components/accordion/AccordionTrigger.vue","../src/components/accordion/AccordionTrigger.vue","../src/components/accordion/AccordionContent.vue","../src/components/accordion/AccordionContent.vue","../src/components/sidebar/context.ts","../src/components/nav-link/nav-link.variants.ts","../src/components/nav-link/NavLink.vue","../src/components/nav-link/NavLink.vue","../src/components/sidebar/Sidebar.vue","../src/components/sidebar/Sidebar.vue","../src/components/sidebar/SidebarGroup.vue","../src/components/sidebar/SidebarGroup.vue","../src/components/tooltip/TooltipProvider.vue","../src/components/tooltip/TooltipProvider.vue","../src/components/drawer/drawer.variants.ts","../src/components/drawer/Drawer.vue","../src/components/drawer/Drawer.vue","../src/components/sidebar/DrawerScope.ts","../src/components/app-shell/composables/useDesktopQuery.ts","../src/components/app-shell/AppShell.vue","../src/components/app-shell/AppShell.vue","../src/components/page/Page.vue","../src/components/page/Page.vue","../src/components/page/PageHeader.vue","../src/components/page/PageHeader.vue","../src/components/page/PageBody.vue","../src/components/page/PageBody.vue","../src/components/page/PageAside.vue","../src/components/page/PageAside.vue","../src/components/section/Section.vue","../src/components/section/Section.vue","../src/components/anchor/composables/useScrollSpy.ts","../src/components/anchor/Anchor.vue","../src/components/anchor/Anchor.vue","../src/components/breadcrumb/Breadcrumb.vue","../src/components/breadcrumb/Breadcrumb.vue","../src/components/breadcrumb/BreadcrumbItem.vue","../src/components/breadcrumb/BreadcrumbItem.vue","../src/components/breadcrumb/BreadcrumbSeparator.vue","../src/components/breadcrumb/BreadcrumbSeparator.vue","../src/components/popover/Popover.vue","../src/components/popover/Popover.vue","../src/components/dropdown-menu/DropdownMenu.vue","../src/components/dropdown-menu/DropdownMenu.vue","../src/components/dropdown-menu/DropdownMenuItem.vue","../src/components/dropdown-menu/DropdownMenuItem.vue","../src/components/dropdown-menu/DropdownMenuCheckboxItem.vue","../src/components/dropdown-menu/DropdownMenuCheckboxItem.vue","../src/components/dropdown-menu/DropdownMenuGroup.vue","../src/components/dropdown-menu/DropdownMenuGroup.vue","../src/components/dropdown-menu/DropdownMenuSub.vue","../src/components/dropdown-menu/DropdownMenuSub.vue","../src/components/dropdown-menu/DropdownMenuLabel.vue","../src/components/dropdown-menu/DropdownMenuLabel.vue","../src/components/dropdown-menu/DropdownMenuSeparator.vue","../src/components/dropdown-menu/DropdownMenuSeparator.vue","../src/components/dropdown-menu/DropdownMenuRadioGroup.vue","../src/components/dropdown-menu/DropdownMenuRadioGroup.vue","../src/components/dropdown-menu/DropdownMenuRadioItem.vue","../src/components/dropdown-menu/DropdownMenuRadioItem.vue","../src/components/dialog/Dialog.vue","../src/components/dialog/Dialog.vue","../src/components/sidebar/SidebarTrigger.vue","../src/components/sidebar/SidebarTrigger.vue","../src/components/toast/store.ts","../src/components/toast/composables/useToastLayout.ts","../src/components/toast/composables/useToastExpand.ts","../src/components/toast/Toaster.vue","../src/components/toast/Toaster.vue","../src/components/spoiler/worklet.ts","../src/components/spoiler/SpoilerPainter.ts","../src/components/spoiler/composables/useSpoiler.ts","../src/components/spoiler/utils/irisOrigin.ts","../src/components/spoiler/composables/useReveal.ts","../src/components/spoiler/Spoiler.vue","../src/components/spoiler/Spoiler.vue","../src/components/image/ImageGroup.vue","../src/components/image/ImageGroup.vue","../src/components/scroll-area/scroll-restore.ts"],"sourcesContent":["export type HnClassGroupIds = 'hn-anim' | 'hn-transition' | 'hn-press' | 'hn-scroll'\n\nexport const TW_MERGE_CONFIG = {\n extend: {\n theme: {\n text: ['md'],\n ease: ['enter', 'enter-strong', 'exit', 'move', 'press'],\n },\n classGroups: {\n 'hn-anim': [\n 'hn-anim-fade',\n 'hn-anim-pop',\n 'hn-anim-modal',\n 'hn-anim-sheet-top',\n 'hn-anim-sheet-bottom',\n 'hn-anim-sheet-left',\n 'hn-anim-sheet-right',\n 'hn-anim-collapse',\n ],\n 'hn-transition': ['hn-transition', 'hn-transition-base'],\n 'hn-press': ['hn-press-lg', 'hn-press-none'],\n 'hn-scroll': ['hn-scroll-area'],\n },\n },\n}\n","import { clsx, type ClassValue } from 'clsx'\nimport { extendTailwindMerge } from 'tailwind-merge'\nimport { TW_MERGE_CONFIG, type HnClassGroupIds } from './tw-merge'\n\nconst twMerge = extendTailwindMerge<HnClassGroupIds>(TW_MERGE_CONFIG)\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import { createTV } from 'tailwind-variants'\nimport { TW_MERGE_CONFIG } from './tw-merge'\n\nexport const tv = createTV({ twMergeConfig: TW_MERGE_CONFIG })\n\nexport type { VariantProps } from 'tailwind-variants'\n","export type Bezier = readonly [number, number, number, number]\n\nexport const EASE = {\n enter: [0, 0, 0.2, 1],\n enterStrong: [0.05, 0.7, 0.1, 1],\n exit: [0.4, 0, 1, 1],\n move: [0.4, 0, 0.2, 1],\n press: [0.3, 1.2, 0.6, 1],\n} as const satisfies Record<string, Bezier>\n\nexport const DURATION = {\n fast: 0.2,\n base: 0.3,\n slow: 0.45,\n exit: 0.2,\n} as const\n\nexport const TRAVEL = {\n sm: 4,\n md: 10,\n} as const\n\nexport const STAGGER = 0.024\n\nexport const cssEase = (bezier: Bezier) => `cubic-bezier(${bezier.join(',')})`\n\nexport const TRANSITION = {\n fast: { duration: DURATION.fast, ease: EASE.move },\n base: { duration: DURATION.base, ease: EASE.move },\n enter: { duration: DURATION.base, ease: EASE.enter },\n enterStrong: { duration: DURATION.slow, ease: EASE.enterStrong },\n exit: { duration: DURATION.exit, ease: EASE.exit },\n press: { duration: DURATION.fast, ease: EASE.press },\n layout: { duration: DURATION.base, ease: EASE.move },\n} as const\n\nexport type TransitionName = keyof typeof TRANSITION\n\nexport function prefersReducedMotion(): boolean {\n return typeof window !== 'undefined' && matchMedia('(prefers-reduced-motion: reduce)').matches\n}\n","import type { UiMessages } from './types'\n\nexport const zhCN: UiMessages = {\n tag: 'zh-CN',\n common: {\n close: '关闭',\n copy: '复制',\n copied: '已复制',\n clear: '清除',\n loading: '加载中',\n confirm: '确定',\n cancel: '取消',\n },\n banner: {\n prev: '上一条',\n next: '下一条',\n },\n pagination: {\n navLabel: '翻页',\n prev: '上一页',\n next: '下一页',\n first: '首页',\n last: '末页',\n pageLabel: n => `第 ${n} 页`,\n totalLabel: n => `共 ${n} 条`,\n },\n table: {\n empty: '暂无数据',\n loading: '加载中',\n sortAsc: '升序排列',\n sortDesc: '降序排列',\n sortNone: '取消排序',\n selectRow: '选择此行',\n selectAll: '全选',\n },\n select: {\n placeholder: '请选择',\n empty: '无匹配项',\n optionCountLabel: n => `${n} 个选项可用`,\n },\n upload: {\n choose: '选择文件',\n dropHint: '拖拽文件到此处,或点击选择',\n tooLargeLabel: readableSize => `文件超出 ${readableSize} 上限`,\n remove: '移除',\n removeFile: name => `移除 ${name}`,\n },\n time: {\n justNow: '刚刚',\n unknown: '未知时间',\n },\n scroll: {\n regionLabel: '可滚动区域',\n },\n toast: {\n regionLabel: '通知',\n },\n spoiler: {\n revealLabel: '剧透内容,点击显示',\n hideLabel: '隐藏剧透',\n },\n codeblock: {\n copy: '复制代码',\n },\n splitter: {\n handleLabel: '调整面板大小',\n },\n sidebar: {\n navLabel: '侧边导航',\n toggleLabel: '切换侧栏',\n },\n anchor: {\n navLabel: '本页目录',\n },\n breadcrumb: {\n navLabel: '面包屑',\n },\n lightbox: {\n zoomIn: '放大',\n zoomOut: '缩小',\n resetZoom: '恢复原始大小',\n rotate: '旋转',\n download: '下载',\n loadingLarge: '正在加载原图',\n },\n chip: {\n remove: '移除',\n },\n numberInput: {\n increase: '增加',\n decrease: '减少',\n },\n passwordInput: {\n show: '显示密码',\n hide: '隐藏密码',\n },\n combobox: {\n placeholder: '输入或选择',\n toggle: '展开选项',\n },\n slider: {\n minimum: '最小值',\n maximum: '最大值',\n },\n pinInput: {\n cellLabel: (index, total) => `第 ${index} 位,共 ${total} 位`,\n },\n dateField: {\n year: '年',\n month: '月',\n day: '日',\n hour: '时',\n minute: '分',\n second: '秒',\n dayPeriod: '上午或下午',\n },\n dateRangeField: {\n start: '开始日期',\n end: '结束日期',\n separator: '至',\n },\n datePicker: {\n open: '打开日历',\n },\n dateTimePicker: {\n time: '时间',\n },\n rating: {\n star: value => `${value} 星`,\n label: (value, max) => `${value} 星,满分 ${max} 星`,\n },\n form: {\n required: '必填',\n },\n command: {\n label: '命令面板',\n placeholder: '搜索',\n empty: '无匹配项',\n },\n calendar: {\n label: '日历',\n prev: '上个月',\n next: '下个月',\n prevYear: '上一年',\n nextYear: '下一年',\n prevYears: '前十二年',\n nextYears: '后十二年',\n pickMonth: '选择月份',\n pickYear: '选择年份',\n weekStartsOn: 1,\n },\n}\n","import type { UiMessages } from './types'\n\nexport const enUS: UiMessages = {\n tag: 'en-US',\n common: {\n close: 'Close',\n copy: 'Copy',\n copied: 'Copied',\n clear: 'Clear',\n loading: 'Loading',\n confirm: 'Confirm',\n cancel: 'Cancel',\n },\n banner: {\n prev: 'Previous notice',\n next: 'Next notice',\n },\n pagination: {\n navLabel: 'Pagination',\n prev: 'Previous page',\n next: 'Next page',\n first: 'First page',\n last: 'Last page',\n pageLabel: n => `Page ${n}`,\n totalLabel: n => `${n} items`,\n },\n table: {\n empty: 'No data',\n loading: 'Loading',\n sortAsc: 'Sort ascending',\n sortDesc: 'Sort descending',\n sortNone: 'Clear sorting',\n selectRow: 'Select row',\n selectAll: 'Select all',\n },\n select: {\n placeholder: 'Select',\n empty: 'No matches',\n optionCountLabel: n => `${n} options available`,\n },\n upload: {\n choose: 'Choose file',\n dropHint: 'Drop files here, or click to browse',\n tooLargeLabel: readableSize => `File exceeds the ${readableSize} limit`,\n remove: 'Remove',\n removeFile: name => `Remove ${name}`,\n },\n time: {\n justNow: 'Just now',\n unknown: 'Unknown time',\n },\n scroll: {\n regionLabel: 'Scrollable region',\n },\n toast: {\n regionLabel: 'Notifications',\n },\n spoiler: {\n revealLabel: 'Spoiler, click to reveal',\n hideLabel: 'Hide spoiler',\n },\n codeblock: {\n copy: 'Copy code',\n },\n splitter: {\n handleLabel: 'Resize panel',\n },\n sidebar: {\n navLabel: 'Sidebar navigation',\n toggleLabel: 'Toggle sidebar',\n },\n anchor: {\n navLabel: 'On this page',\n },\n breadcrumb: {\n navLabel: 'Breadcrumb',\n },\n lightbox: {\n zoomIn: 'Zoom in',\n zoomOut: 'Zoom out',\n resetZoom: 'Reset zoom',\n rotate: 'Rotate',\n download: 'Download',\n loadingLarge: 'Loading HD',\n },\n chip: {\n remove: 'Remove',\n },\n numberInput: {\n increase: 'Increase',\n decrease: 'Decrease',\n },\n passwordInput: {\n show: 'Show password',\n hide: 'Hide password',\n },\n combobox: {\n placeholder: 'Type or choose',\n toggle: 'Show options',\n },\n slider: {\n minimum: 'Minimum',\n maximum: 'Maximum',\n },\n pinInput: {\n cellLabel: (index, total) => `Digit ${index} of ${total}`,\n },\n dateField: {\n year: 'Year',\n month: 'Month',\n day: 'Day',\n hour: 'Hour',\n minute: 'Minute',\n second: 'Second',\n dayPeriod: 'AM or PM',\n },\n dateRangeField: {\n start: 'start date',\n end: 'end date',\n separator: '–',\n },\n datePicker: {\n open: 'Open calendar',\n },\n dateTimePicker: {\n time: 'Time',\n },\n rating: {\n star: value => `${value} ${value === 1 ? 'star' : 'stars'}`,\n label: (value, max) => `${value} out of ${max} stars`,\n },\n form: {\n required: 'Required',\n },\n command: {\n label: 'Command palette',\n placeholder: 'Search',\n empty: 'No matches',\n },\n calendar: {\n label: 'Calendar',\n prev: 'Previous month',\n next: 'Next month',\n prevYear: 'Previous year',\n nextYear: 'Next year',\n prevYears: 'Previous twelve years',\n nextYears: 'Next twelve years',\n pickMonth: 'Choose a month',\n pickYear: 'Choose a year',\n weekStartsOn: 0,\n },\n}\n","import {\n computed,\n inject,\n provide,\n toValue,\n type ComputedRef,\n type InjectionKey,\n type MaybeRefOrGetter,\n} from 'vue'\nimport type { PartialUiMessages, UiMessages } from './types'\nimport { zhCN } from './zh-CN'\n\nconst UI_LOCALE_KEY = Symbol('hn-ui-locale') as InjectionKey<ComputedRef<UiMessages>>\n\nconst fallbackLocale = computed(() => zhCN)\n\nfunction merge(base: UiMessages, patch: PartialUiMessages): UiMessages {\n return {\n tag: patch.tag ?? base.tag,\n common: { ...base.common, ...patch.common },\n banner: { ...base.banner, ...patch.banner },\n pagination: { ...base.pagination, ...patch.pagination },\n table: { ...base.table, ...patch.table },\n select: { ...base.select, ...patch.select },\n upload: { ...base.upload, ...patch.upload },\n time: { ...base.time, ...patch.time },\n scroll: { ...base.scroll, ...patch.scroll },\n toast: { ...base.toast, ...patch.toast },\n spoiler: { ...base.spoiler, ...patch.spoiler },\n codeblock: { ...base.codeblock, ...patch.codeblock },\n splitter: { ...base.splitter, ...patch.splitter },\n sidebar: { ...base.sidebar, ...patch.sidebar },\n anchor: { ...base.anchor, ...patch.anchor },\n breadcrumb: { ...base.breadcrumb, ...patch.breadcrumb },\n lightbox: { ...base.lightbox, ...patch.lightbox },\n chip: { ...base.chip, ...patch.chip },\n numberInput: { ...base.numberInput, ...patch.numberInput },\n passwordInput: { ...base.passwordInput, ...patch.passwordInput },\n combobox: { ...base.combobox, ...patch.combobox },\n slider: { ...base.slider, ...patch.slider },\n pinInput: { ...base.pinInput, ...patch.pinInput },\n dateField: { ...base.dateField, ...patch.dateField },\n dateRangeField: { ...base.dateRangeField, ...patch.dateRangeField },\n calendar: { ...base.calendar, ...patch.calendar },\n datePicker: { ...base.datePicker, ...patch.datePicker },\n dateTimePicker: { ...base.dateTimePicker, ...patch.dateTimePicker },\n rating: { ...base.rating, ...patch.rating },\n form: { ...base.form, ...patch.form },\n command: { ...base.command, ...patch.command },\n }\n}\n\nexport function provideUiLocale(\n messages: MaybeRefOrGetter<PartialUiMessages>,\n): ComputedRef<UiMessages> {\n const resolved = computed(() => merge(zhCN, toValue(messages)))\n provide(UI_LOCALE_KEY, resolved)\n return resolved\n}\n\nexport function useUiLocale(): ComputedRef<UiMessages> {\n return inject(UI_LOCALE_KEY, fallbackLocale)\n}\n\nexport { zhCN } from './zh-CN'\nexport { enUS } from './en-US'\nexport type { UiMessages, PartialUiMessages } from './types'\n","export const REQUIRED_SINGLETONS = ['vue', 'reka-ui', '@hina-ui/vue'] as const\n\nexport type RequiredSingleton = (typeof REQUIRED_SINGLETONS)[number]\n","const warned = new Set<string>()\n\nexport function devWarn(scope: string, message: string, key?: string) {\n if (!import.meta.env.DEV) return\n const id = `${scope}:${key ?? message}`\n if (warned.has(id)) return\n warned.add(id)\n console.warn(`[Hina UI] ${scope}: ${message}`)\n}\n\nexport function resetDevWarnings() {\n warned.clear()\n}\n","import { useAttrs, watchEffect } from 'vue'\nimport { devWarn } from './dev'\n\nexport function useAccessibleName(scope: string, required: () => boolean) {\n if (!import.meta.env.DEV) return\n const attrs = useAttrs()\n watchEffect(() => {\n if (!required()) return\n if (attrs['aria-label'] || attrs['aria-labelledby'] || attrs.title) return\n devWarn(scope, '缺少可访问名称,请提供 aria-label 或 aria-labelledby。', 'accessible-name')\n })\n}\n\nexport function useRequiredLabel(scope: string, has: () => boolean, what: string) {\n if (!import.meta.env.DEV) return\n watchEffect(() => {\n if (has()) return\n devWarn(scope, `缺少${what},屏幕阅读器无法识别该控件。`, `required-label:${what}`)\n })\n}\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const button = tv({\n base: [\n 'hn-interactive relative isolate inline-flex shrink-0 items-center justify-center',\n 'gap-[var(--hn-control-gap)] rounded-md border border-transparent',\n 'font-medium whitespace-nowrap select-none',\n 'disabled:pointer-events-none disabled:opacity-50',\n 'data-disabled:pointer-events-none data-disabled:opacity-50',\n ],\n variants: {\n variant: {\n solid: 'hn-state-layer',\n soft: 'hn-state-layer',\n outline: 'hn-state-layer border-line hover:border-line-strong',\n ghost: 'hn-state-layer',\n link: 'hn-link hn-press-none',\n },\n tone: {\n accent: '',\n neutral: '',\n danger: '',\n },\n size: {\n sm: 'h-[var(--hn-control-h-sm)] px-[var(--hn-control-px-sm)] text-sm [&_svg]:size-3.5',\n md: 'h-[var(--hn-control-h-md)] px-[var(--hn-control-px-md)] text-base [&_svg]:size-4',\n lg: 'h-[var(--hn-control-h-lg)] px-[var(--hn-control-px-lg)] text-md [&_svg]:size-[1.125rem]',\n },\n iconOnly: {\n true: 'aspect-square px-0',\n },\n block: {\n true: 'w-full',\n },\n pill: {\n true: 'rounded-full',\n },\n },\n compoundVariants: [\n {\n variant: 'solid',\n tone: 'accent',\n class: 'bg-accent text-accent-on',\n },\n {\n variant: 'solid',\n tone: 'neutral',\n class: 'bg-neutral-solid text-neutral-solid-on',\n },\n {\n variant: 'solid',\n tone: 'danger',\n class: 'bg-danger text-danger-on',\n },\n {\n variant: 'soft',\n tone: 'accent',\n class: 'bg-accent-soft text-accent-text',\n },\n { variant: 'soft', tone: 'neutral', class: 'bg-subtle text-fg' },\n {\n variant: 'soft',\n tone: 'danger',\n class: 'bg-danger-soft text-danger-text',\n },\n {\n variant: 'outline',\n tone: 'accent',\n class: 'text-accent-text',\n },\n { variant: 'outline', tone: 'neutral', class: 'text-fg' },\n {\n variant: 'outline',\n tone: 'danger',\n class: 'text-danger-text',\n },\n {\n variant: 'ghost',\n tone: 'accent',\n class: 'text-accent-text',\n },\n { variant: 'ghost', tone: 'neutral', class: 'text-fg' },\n {\n variant: 'ghost',\n tone: 'danger',\n class: 'text-danger-text',\n },\n { variant: 'link', tone: 'accent', class: '[--hn-link-color:var(--hn-accent-text)]' },\n { variant: 'link', tone: 'neutral', class: '[--hn-link-color:var(--hn-fg-default)]' },\n { variant: 'link', tone: 'danger', class: '[--hn-link-color:var(--hn-danger-text)]' },\n { variant: 'link', class: 'h-auto rounded-none border-0 px-0' },\n { size: 'lg', iconOnly: true, class: 'hn-press-lg' },\n ],\n defaultVariants: {\n variant: 'solid',\n tone: 'accent',\n size: 'md',\n },\n})\n\nexport const buttonIconBox = tv({\n base: 'relative inline-flex shrink-0 items-center justify-center',\n variants: {\n size: {\n sm: 'size-3.5',\n md: 'size-4',\n lg: 'size-[1.125rem]',\n },\n },\n defaultVariants: { size: 'md' },\n})\n\nexport type ButtonVariants = VariantProps<typeof button>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const spinner = tv({\n base: 'inline-block shrink-0 rounded-full border-current border-e-transparent align-[-0.125em]',\n variants: {\n size: {\n sm: 'size-3.5 border-[1.5px]',\n md: 'size-4 border-2',\n lg: 'size-5 border-2',\n },\n },\n defaultVariants: { size: 'md' },\n})\n\nexport type SpinnerVariants = VariantProps<typeof spinner>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import { spinner, type SpinnerVariants } from './spinner.variants'\n\n defineOptions({ name: 'HnSpinner', inheritAttrs: false })\n\n const props = withDefaults(defineProps<{ size?: SpinnerVariants['size']; label?: string }>(), {\n size: 'md',\n })\n\n const t = useUiLocale()\n</script>\n\n<template>\n <span\n v-bind=\"$attrs\"\n role=\"status\"\n :aria-label=\"props.label ?? t.common.loading\"\n :class=\"cn(spinner({ size: props.size }))\"\n :style=\"{\n animation: 'hn-spin var(--hn-spin-duration) var(--hn-ease-linear) infinite',\n }\"\n />\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import { spinner, type SpinnerVariants } from './spinner.variants'\n\n defineOptions({ name: 'HnSpinner', inheritAttrs: false })\n\n const props = withDefaults(defineProps<{ size?: SpinnerVariants['size']; label?: string }>(), {\n size: 'md',\n })\n\n const t = useUiLocale()\n</script>\n\n<template>\n <span\n v-bind=\"$attrs\"\n role=\"status\"\n :aria-label=\"props.label ?? t.common.loading\"\n :class=\"cn(spinner({ size: props.size }))\"\n :style=\"{\n animation: 'hn-spin var(--hn-spin-duration) var(--hn-ease-linear) infinite',\n }\"\n />\n</template>\n","<script setup lang=\"ts\">\n import Spinner from '../spinner/Spinner.vue'\n\n defineOptions({ name: 'HnButtonIconSlot' })\n\n const props = defineProps<{\n boxClass: string\n swapped: boolean\n spinnerSize: 'sm' | 'md'\n }>()\n</script>\n\n<template>\n <span :class=\"props.boxClass\">\n <span\n class=\"hn-transition inline-flex items-center justify-center\"\n :class=\"props.swapped ? 'scale-90 opacity-0' : 'scale-100 opacity-100'\"\n >\n <slot />\n </span>\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-90 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-90 opacity-0\"\n >\n <span\n v-if=\"props.swapped\"\n aria-hidden=\"true\"\n class=\"absolute inset-0 inline-flex items-center justify-center\"\n >\n <Spinner :size=\"props.spinnerSize\" />\n </span>\n </Transition>\n </span>\n</template>\n","<script setup lang=\"ts\">\n import Spinner from '../spinner/Spinner.vue'\n\n defineOptions({ name: 'HnButtonIconSlot' })\n\n const props = defineProps<{\n boxClass: string\n swapped: boolean\n spinnerSize: 'sm' | 'md'\n }>()\n</script>\n\n<template>\n <span :class=\"props.boxClass\">\n <span\n class=\"hn-transition inline-flex items-center justify-center\"\n :class=\"props.swapped ? 'scale-90 opacity-0' : 'scale-100 opacity-100'\"\n >\n <slot />\n </span>\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-90 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-90 opacity-0\"\n >\n <span\n v-if=\"props.swapped\"\n aria-hidden=\"true\"\n class=\"absolute inset-0 inline-flex items-center justify-center\"\n >\n <Spinner :size=\"props.spinnerSize\" />\n </span>\n </Transition>\n </span>\n</template>\n","import { onBeforeUnmount, onMounted, ref, type Ref } from 'vue'\nimport { prefersReducedMotion } from '../../motion'\n\nconst INITIAL_ORIGIN_SCALE = 0.2\nconst PADDING = 12\nconst SOFT_EDGE_MINIMUM_SIZE = 75\nconst SOFT_EDGE_CONTAINER_RATIO = 0.35\nconst GROW_MS = 150\nconst MINIMUM_PRESS_MS = 225\nconst TOUCH_DELAY_MS = 150\n\nconst STATE = {\n inactive: 0,\n touchDelay: 1,\n holding: 2,\n waitingForClick: 3,\n} as const\n\ntype RippleState = (typeof STATE)[keyof typeof STATE]\n\nexport function useRipple(\n container: Ref<HTMLElement | null>,\n surface: Ref<HTMLElement | null>,\n isDisabled: () => boolean,\n) {\n const pressed = ref(false)\n\n let host: HTMLElement | null = null\n let state: RippleState = STATE.inactive\n let startEvent: PointerEvent | undefined\n let checkBoundsAfterContextMenu = false\n let growAnimation: Animation | undefined\n let initialSize = 0\n let rippleScale = ''\n let rippleSize = ''\n\n const isTouch = ({ pointerType }: PointerEvent) => pointerType === 'touch'\n\n function shouldReact(event: PointerEvent) {\n if (isDisabled() || !event.isPrimary) return false\n if (startEvent && startEvent.pointerId !== event.pointerId) return false\n if (event.type === 'pointerenter' || event.type === 'pointerleave') return !isTouch(event)\n return isTouch(event) || event.buttons === 1\n }\n\n function inBounds({ x, y }: PointerEvent) {\n const rect = container.value?.getBoundingClientRect()\n if (!rect) return false\n return x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom\n }\n\n function determineRippleSize() {\n const rect = container.value?.getBoundingClientRect()\n if (!rect) return\n const maxDim = Math.max(rect.height, rect.width)\n const softEdgeSize = Math.max(SOFT_EDGE_CONTAINER_RATIO * maxDim, SOFT_EDGE_MINIMUM_SIZE)\n initialSize = Math.floor(maxDim * INITIAL_ORIGIN_SCALE)\n const maxRadius = Math.hypot(rect.width, rect.height) + PADDING\n rippleScale = `${(maxRadius + softEdgeSize) / initialSize}`\n rippleSize = `${initialSize}px`\n }\n\n function normalizedCoords(event: PointerEvent) {\n const rect = container.value?.getBoundingClientRect()\n if (!rect) return { x: 0, y: 0 }\n return {\n x: event.pageX - (window.scrollX + rect.left),\n y: event.pageY - (window.scrollY + rect.top),\n }\n }\n\n function translationCoords(positionEvent?: PointerEvent) {\n const rect = container.value?.getBoundingClientRect()\n if (!rect) return { startPoint: { x: 0, y: 0 }, endPoint: { x: 0, y: 0 } }\n const endPoint = {\n x: (rect.width - initialSize) / 2,\n y: (rect.height - initialSize) / 2,\n }\n return {\n startPoint: positionEvent ? normalizedCoords(positionEvent) : endPoint,\n endPoint,\n }\n }\n\n function startPress(positionEvent?: PointerEvent) {\n const el = surface.value\n if (!el) return\n pressed.value = true\n growAnimation?.cancel()\n growAnimation = undefined\n determineRippleSize()\n const { startPoint, endPoint } = translationCoords(positionEvent)\n if (typeof el.animate !== 'function') return\n if (prefersReducedMotion()) return\n growAnimation = el.animate(\n {\n height: [rippleSize, rippleSize],\n width: [rippleSize, rippleSize],\n transform: [\n `translate(${startPoint.x}px,${startPoint.y}px) scale(1)`,\n `translate(${endPoint.x}px,${endPoint.y}px) scale(${rippleScale})`,\n ],\n },\n {\n pseudoElement: '::after',\n duration: GROW_MS,\n easing: 'linear',\n fill: 'forwards',\n },\n )\n growAnimation.finished.catch(() => {})\n }\n\n function endPress() {\n startEvent = undefined\n state = STATE.inactive\n const animation = growAnimation\n let playedMs = Infinity\n if (typeof animation?.currentTime === 'number') playedMs = animation.currentTime\n else if (animation?.currentTime) playedMs = animation.currentTime.to('ms').value\n if (playedMs >= MINIMUM_PRESS_MS) {\n pressed.value = false\n return\n }\n window.setTimeout(() => {\n if (growAnimation !== animation) return\n pressed.value = false\n }, MINIMUM_PRESS_MS - playedMs)\n }\n\n function onPointerDown(event: PointerEvent) {\n if (!shouldReact(event)) return\n startEvent = event\n if (!isTouch(event)) {\n state = STATE.waitingForClick\n startPress(event)\n return\n }\n if (checkBoundsAfterContextMenu && !inBounds(event)) return\n checkBoundsAfterContextMenu = false\n state = STATE.touchDelay\n window.setTimeout(() => {\n if (state !== STATE.touchDelay) return\n state = STATE.holding\n startPress(event)\n }, TOUCH_DELAY_MS)\n }\n\n function onPointerUp(event: PointerEvent) {\n if (!shouldReact(event)) return\n if (state === STATE.holding) {\n state = STATE.waitingForClick\n return\n }\n if (state === STATE.touchDelay) {\n state = STATE.waitingForClick\n startPress(startEvent)\n }\n }\n\n function onPointerLeave(event: PointerEvent) {\n if (!shouldReact(event)) return\n if (state !== STATE.inactive) endPress()\n }\n\n function onPointerCancel(event: PointerEvent) {\n if (!shouldReact(event)) return\n endPress()\n }\n\n function onClick() {\n if (isDisabled()) return\n if (state === STATE.waitingForClick) {\n endPress()\n return\n }\n if (state === STATE.inactive) {\n startPress()\n endPress()\n }\n }\n\n function onContextMenu() {\n if (isDisabled()) return\n checkBoundsAfterContextMenu = true\n endPress()\n }\n\n const listeners: [string, EventListener][] = [\n ['click', onClick as EventListener],\n ['contextmenu', onContextMenu as EventListener],\n ['pointercancel', onPointerCancel as EventListener],\n ['pointerdown', onPointerDown as EventListener],\n ['pointerleave', onPointerLeave as EventListener],\n ['pointerup', onPointerUp as EventListener],\n ]\n\n onMounted(() => {\n host = container.value?.parentElement ?? null\n if (!host) return\n for (const [name, fn] of listeners) host.addEventListener(name, fn, true)\n })\n\n onBeforeUnmount(() => {\n if (!host) return\n for (const [name, fn] of listeners) host.removeEventListener(name, fn, true)\n host = null\n })\n\n return { pressed }\n}\n","<script setup lang=\"ts\">\n import { ref } from 'vue'\n import { useRipple } from './useRipple'\n\n defineOptions({ name: 'HnRipple' })\n\n const props = defineProps<{ disabled?: boolean }>()\n\n const container = ref<HTMLElement | null>(null)\n const surface = ref<HTMLElement | null>(null)\n\n const { pressed } = useRipple(container, surface, () => !!props.disabled)\n</script>\n\n<template>\n <div ref=\"container\" aria-hidden=\"true\" class=\"hn-ripple\">\n <div ref=\"surface\" class=\"hn-ripple-surface\" :data-pressed=\"pressed ? '' : undefined\"></div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { ref } from 'vue'\n import { useRipple } from './useRipple'\n\n defineOptions({ name: 'HnRipple' })\n\n const props = defineProps<{ disabled?: boolean }>()\n\n const container = ref<HTMLElement | null>(null)\n const surface = ref<HTMLElement | null>(null)\n\n const { pressed } = useRipple(container, surface, () => !!props.disabled)\n</script>\n\n<template>\n <div ref=\"container\" aria-hidden=\"true\" class=\"hn-ripple\">\n <div ref=\"surface\" class=\"hn-ripple-surface\" :data-pressed=\"pressed ? '' : undefined\"></div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed, useSlots } from 'vue'\n import { Primitive, type PrimitiveProps } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { useAccessibleName } from '../../lib/a11y'\n import { button, buttonIconBox, type ButtonVariants } from './button.variants'\n import IconSlot from './IconSlot.vue'\n import Ripple from '../ripple/Ripple.vue'\n import Spinner from '../spinner/Spinner.vue'\n\n defineOptions({ name: 'HnButton' })\n\n const props = withDefaults(\n defineProps<\n PrimitiveProps & {\n variant?: ButtonVariants['variant']\n tone?: ButtonVariants['tone']\n size?: ButtonVariants['size']\n type?: 'button' | 'submit' | 'reset'\n iconOnly?: boolean\n block?: boolean\n pill?: boolean\n loading?: boolean\n disabled?: boolean\n ripple?: boolean\n class?: string\n }\n >(),\n { as: 'button', type: 'button', ripple: true },\n )\n\n const slots = useSlots()\n\n useAccessibleName('Button', () => !!props.iconOnly)\n\n const isDisabled = computed(() => props.disabled || props.loading)\n const isNativeButton = computed(() => props.as === 'button' && !props.asChild)\n\n const spinnerAt = computed<'icon' | 'trailing' | 'center'>(() =>\n slots.icon ? 'icon' : slots.trailing ? 'trailing' : 'center',\n )\n\n const withRipple = computed(() => props.ripple && props.variant !== 'link')\n\n const nativeAttrs = computed(() => {\n if (isNativeButton.value) {\n return { type: props.type, disabled: isDisabled.value }\n }\n return isDisabled.value\n ? { 'data-disabled': '', 'aria-disabled': 'true', tabindex: -1 }\n : undefined\n })\n\n const spinnerSize = computed<'sm' | 'md'>(() => (props.size === 'lg' ? 'md' : 'sm'))\n const iconBox = computed(() => buttonIconBox({ size: props.size }))\n\n function guard(event: MouseEvent) {\n if (!isDisabled.value) return\n event.preventDefault()\n event.stopImmediatePropagation()\n }\n</script>\n\n<template>\n <Primitive\n :as=\"props.as\"\n :as-child=\"props.asChild\"\n v-bind=\"nativeAttrs\"\n :aria-busy=\"props.loading || undefined\"\n :data-loading=\"props.loading ? '' : undefined\"\n :class=\"\n cn(\n button({\n variant: props.variant,\n tone: props.tone,\n size: props.size,\n iconOnly: props.iconOnly,\n block: props.block,\n pill: props.pill,\n }),\n props.class,\n )\n \"\n @click.capture=\"guard\"\n >\n <slot v-if=\"props.asChild\" />\n <template v-else>\n <Ripple v-if=\"withRipple\" :disabled=\"isDisabled\" />\n\n <IconSlot\n v-if=\"slots.icon\"\n :box-class=\"iconBox\"\n :swapped=\"!!props.loading && spinnerAt === 'icon'\"\n :spinner-size=\"spinnerSize\"\n >\n <slot name=\"icon\" />\n </IconSlot>\n\n <span\n v-if=\"slots.default\"\n class=\"hn-transition inline-flex items-center gap-[var(--hn-control-gap)]\"\n :class=\"props.loading && spinnerAt === 'center' ? 'opacity-0' : 'opacity-100'\"\n >\n <slot />\n </span>\n\n <IconSlot\n v-if=\"slots.trailing\"\n :box-class=\"iconBox\"\n :swapped=\"!!props.loading && spinnerAt === 'trailing'\"\n :spinner-size=\"spinnerSize\"\n >\n <slot name=\"trailing\" />\n </IconSlot>\n\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"opacity-0\"\n >\n <span\n v-if=\"props.loading && spinnerAt === 'center'\"\n aria-hidden=\"true\"\n class=\"absolute inset-0 flex items-center justify-center\"\n >\n <Spinner :size=\"spinnerSize\" />\n </span>\n </Transition>\n </template>\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\n import { computed, useSlots } from 'vue'\n import { Primitive, type PrimitiveProps } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { useAccessibleName } from '../../lib/a11y'\n import { button, buttonIconBox, type ButtonVariants } from './button.variants'\n import IconSlot from './IconSlot.vue'\n import Ripple from '../ripple/Ripple.vue'\n import Spinner from '../spinner/Spinner.vue'\n\n defineOptions({ name: 'HnButton' })\n\n const props = withDefaults(\n defineProps<\n PrimitiveProps & {\n variant?: ButtonVariants['variant']\n tone?: ButtonVariants['tone']\n size?: ButtonVariants['size']\n type?: 'button' | 'submit' | 'reset'\n iconOnly?: boolean\n block?: boolean\n pill?: boolean\n loading?: boolean\n disabled?: boolean\n ripple?: boolean\n class?: string\n }\n >(),\n { as: 'button', type: 'button', ripple: true },\n )\n\n const slots = useSlots()\n\n useAccessibleName('Button', () => !!props.iconOnly)\n\n const isDisabled = computed(() => props.disabled || props.loading)\n const isNativeButton = computed(() => props.as === 'button' && !props.asChild)\n\n const spinnerAt = computed<'icon' | 'trailing' | 'center'>(() =>\n slots.icon ? 'icon' : slots.trailing ? 'trailing' : 'center',\n )\n\n const withRipple = computed(() => props.ripple && props.variant !== 'link')\n\n const nativeAttrs = computed(() => {\n if (isNativeButton.value) {\n return { type: props.type, disabled: isDisabled.value }\n }\n return isDisabled.value\n ? { 'data-disabled': '', 'aria-disabled': 'true', tabindex: -1 }\n : undefined\n })\n\n const spinnerSize = computed<'sm' | 'md'>(() => (props.size === 'lg' ? 'md' : 'sm'))\n const iconBox = computed(() => buttonIconBox({ size: props.size }))\n\n function guard(event: MouseEvent) {\n if (!isDisabled.value) return\n event.preventDefault()\n event.stopImmediatePropagation()\n }\n</script>\n\n<template>\n <Primitive\n :as=\"props.as\"\n :as-child=\"props.asChild\"\n v-bind=\"nativeAttrs\"\n :aria-busy=\"props.loading || undefined\"\n :data-loading=\"props.loading ? '' : undefined\"\n :class=\"\n cn(\n button({\n variant: props.variant,\n tone: props.tone,\n size: props.size,\n iconOnly: props.iconOnly,\n block: props.block,\n pill: props.pill,\n }),\n props.class,\n )\n \"\n @click.capture=\"guard\"\n >\n <slot v-if=\"props.asChild\" />\n <template v-else>\n <Ripple v-if=\"withRipple\" :disabled=\"isDisabled\" />\n\n <IconSlot\n v-if=\"slots.icon\"\n :box-class=\"iconBox\"\n :swapped=\"!!props.loading && spinnerAt === 'icon'\"\n :spinner-size=\"spinnerSize\"\n >\n <slot name=\"icon\" />\n </IconSlot>\n\n <span\n v-if=\"slots.default\"\n class=\"hn-transition inline-flex items-center gap-[var(--hn-control-gap)]\"\n :class=\"props.loading && spinnerAt === 'center' ? 'opacity-0' : 'opacity-100'\"\n >\n <slot />\n </span>\n\n <IconSlot\n v-if=\"slots.trailing\"\n :box-class=\"iconBox\"\n :swapped=\"!!props.loading && spinnerAt === 'trailing'\"\n :spinner-size=\"spinnerSize\"\n >\n <slot name=\"trailing\" />\n </IconSlot>\n\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"opacity-0\"\n >\n <span\n v-if=\"props.loading && spinnerAt === 'center'\"\n aria-hidden=\"true\"\n class=\"absolute inset-0 flex items-center justify-center\"\n >\n <Spinner :size=\"spinnerSize\" />\n </span>\n </Transition>\n </template>\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\n import { TooltipRoot, TooltipTrigger, TooltipPortal, TooltipContent, TooltipArrow } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnTooltip' })\n\n const props = withDefaults(\n defineProps<{\n content?: string\n side?: 'top' | 'right' | 'bottom' | 'left'\n align?: 'start' | 'center' | 'end'\n sideOffset?: number\n open?: boolean\n disabled?: boolean\n class?: string\n }>(),\n { side: 'top', align: 'center', sideOffset: 8, open: undefined, disabled: false },\n )\n</script>\n\n<template>\n <TooltipRoot :open=\"props.open\" :disabled=\"props.disabled\" ignore-non-keyboard-focus>\n <TooltipTrigger as-child>\n <slot />\n </TooltipTrigger>\n <TooltipPortal>\n <TooltipContent\n :side=\"props.side\"\n :align=\"props.align\"\n :side-offset=\"props.sideOffset\"\n :aria-label=\"props.content\"\n :update-position-strategy=\"props.open === undefined ? 'optimized' : 'always'\"\n :class=\"\n cn(\n 'hn-anim-pop [--hn-pop-in:var(--hn-duration-fast)] bg-neutral-solid text-neutral-solid-on z-(--hn-z-overlay)',\n 'max-w-xs rounded-md px-2.5 py-1 text-xs shadow-md',\n props.class,\n )\n \"\n >\n <slot name=\"content\">{{ props.content }}</slot>\n <TooltipArrow :width=\"10\" :height=\"5\" class=\"fill-neutral-solid\" />\n </TooltipContent>\n </TooltipPortal>\n </TooltipRoot>\n</template>\n","<script setup lang=\"ts\">\n import { TooltipRoot, TooltipTrigger, TooltipPortal, TooltipContent, TooltipArrow } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnTooltip' })\n\n const props = withDefaults(\n defineProps<{\n content?: string\n side?: 'top' | 'right' | 'bottom' | 'left'\n align?: 'start' | 'center' | 'end'\n sideOffset?: number\n open?: boolean\n disabled?: boolean\n class?: string\n }>(),\n { side: 'top', align: 'center', sideOffset: 8, open: undefined, disabled: false },\n )\n</script>\n\n<template>\n <TooltipRoot :open=\"props.open\" :disabled=\"props.disabled\" ignore-non-keyboard-focus>\n <TooltipTrigger as-child>\n <slot />\n </TooltipTrigger>\n <TooltipPortal>\n <TooltipContent\n :side=\"props.side\"\n :align=\"props.align\"\n :side-offset=\"props.sideOffset\"\n :aria-label=\"props.content\"\n :update-position-strategy=\"props.open === undefined ? 'optimized' : 'always'\"\n :class=\"\n cn(\n 'hn-anim-pop [--hn-pop-in:var(--hn-duration-fast)] bg-neutral-solid text-neutral-solid-on z-(--hn-z-overlay)',\n 'max-w-xs rounded-md px-2.5 py-1 text-xs shadow-md',\n props.class,\n )\n \"\n >\n <slot name=\"content\">{{ props.content }}</slot>\n <TooltipArrow :width=\"10\" :height=\"5\" class=\"fill-neutral-solid\" />\n </TooltipContent>\n </TooltipPortal>\n </TooltipRoot>\n</template>\n","import { defineComponent } from 'vue'\n\nexport const Passthrough = defineComponent({\n name: 'HnPassthrough',\n setup:\n (_, { slots }) =>\n () =>\n slots.default?.(),\n})\n","<script setup lang=\"ts\">\n import { injectTooltipProviderContext, type PrimitiveProps } from 'reka-ui'\n import Button from '../button/Button.vue'\n import Tooltip from '../tooltip/Tooltip.vue'\n import { Passthrough } from '../../lib/passthrough'\n import type { ButtonVariants } from '../button/button.variants'\n\n defineOptions({ name: 'HnIconButton', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<\n PrimitiveProps & {\n label: string\n tooltip?: boolean\n side?: 'top' | 'right' | 'bottom' | 'left'\n variant?: ButtonVariants['variant']\n tone?: ButtonVariants['tone']\n size?: ButtonVariants['size']\n type?: 'button' | 'submit' | 'reset'\n pill?: boolean\n loading?: boolean\n disabled?: boolean\n class?: string\n }\n >(),\n {\n as: 'button',\n tooltip: true,\n side: 'top',\n variant: 'ghost',\n tone: 'neutral',\n type: 'button',\n },\n )\n\n const provider = injectTooltipProviderContext(null)\n const Wrapper = provider ? Tooltip : Passthrough\n</script>\n\n<template>\n <Wrapper :disabled=\"!props.tooltip\" :content=\"props.label\" :side=\"props.side\">\n <Button\n v-bind=\"$attrs\"\n icon-only\n :as=\"props.as\"\n :as-child=\"props.asChild\"\n :variant=\"props.variant\"\n :tone=\"props.tone\"\n :size=\"props.size\"\n :type=\"props.type\"\n :pill=\"props.pill\"\n :loading=\"props.loading\"\n :disabled=\"props.disabled\"\n :aria-label=\"props.label\"\n :class=\"props.class\"\n >\n <slot />\n </Button>\n </Wrapper>\n</template>\n","<script setup lang=\"ts\">\n import { injectTooltipProviderContext, type PrimitiveProps } from 'reka-ui'\n import Button from '../button/Button.vue'\n import Tooltip from '../tooltip/Tooltip.vue'\n import { Passthrough } from '../../lib/passthrough'\n import type { ButtonVariants } from '../button/button.variants'\n\n defineOptions({ name: 'HnIconButton', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<\n PrimitiveProps & {\n label: string\n tooltip?: boolean\n side?: 'top' | 'right' | 'bottom' | 'left'\n variant?: ButtonVariants['variant']\n tone?: ButtonVariants['tone']\n size?: ButtonVariants['size']\n type?: 'button' | 'submit' | 'reset'\n pill?: boolean\n loading?: boolean\n disabled?: boolean\n class?: string\n }\n >(),\n {\n as: 'button',\n tooltip: true,\n side: 'top',\n variant: 'ghost',\n tone: 'neutral',\n type: 'button',\n },\n )\n\n const provider = injectTooltipProviderContext(null)\n const Wrapper = provider ? Tooltip : Passthrough\n</script>\n\n<template>\n <Wrapper :disabled=\"!props.tooltip\" :content=\"props.label\" :side=\"props.side\">\n <Button\n v-bind=\"$attrs\"\n icon-only\n :as=\"props.as\"\n :as-child=\"props.asChild\"\n :variant=\"props.variant\"\n :tone=\"props.tone\"\n :size=\"props.size\"\n :type=\"props.type\"\n :pill=\"props.pill\"\n :loading=\"props.loading\"\n :disabled=\"props.disabled\"\n :aria-label=\"props.label\"\n :class=\"props.class\"\n >\n <slot />\n </Button>\n </Wrapper>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { X } from '@lucide/vue'\n import IconButton from '../icon-button/IconButton.vue'\n import { useUiLocale } from '../../locale'\n import { cn } from '../../lib/cn'\n import type { ButtonVariants } from '../button/button.variants'\n\n defineOptions({ name: 'HnCloseButton', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n label?: string\n size?: 'xs' | ButtonVariants['size']\n disabled?: boolean\n tooltip?: boolean\n class?: string\n }>(),\n { size: 'sm', tooltip: false },\n )\n\n const t = useUiLocale()\n\n const buttonSize = computed(() => (props.size === 'xs' ? 'sm' : props.size))\n</script>\n\n<template>\n <IconButton\n v-bind=\"$attrs\"\n :label=\"props.label ?? t.common.close\"\n :tooltip=\"props.tooltip\"\n :size=\"buttonSize\"\n pill\n :disabled=\"props.disabled\"\n variant=\"ghost\"\n tone=\"neutral\"\n :class=\"cn(props.size === 'xs' && 'size-5 [&_svg]:size-3', props.class)\"\n >\n <X />\n </IconButton>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { X } from '@lucide/vue'\n import IconButton from '../icon-button/IconButton.vue'\n import { useUiLocale } from '../../locale'\n import { cn } from '../../lib/cn'\n import type { ButtonVariants } from '../button/button.variants'\n\n defineOptions({ name: 'HnCloseButton', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n label?: string\n size?: 'xs' | ButtonVariants['size']\n disabled?: boolean\n tooltip?: boolean\n class?: string\n }>(),\n { size: 'sm', tooltip: false },\n )\n\n const t = useUiLocale()\n\n const buttonSize = computed(() => (props.size === 'xs' ? 'sm' : props.size))\n</script>\n\n<template>\n <IconButton\n v-bind=\"$attrs\"\n :label=\"props.label ?? t.common.close\"\n :tooltip=\"props.tooltip\"\n :size=\"buttonSize\"\n pill\n :disabled=\"props.disabled\"\n variant=\"ghost\"\n tone=\"neutral\"\n :class=\"cn(props.size === 'xs' && 'size-5 [&_svg]:size-3', props.class)\"\n >\n <X />\n </IconButton>\n</template>\n","import { onBeforeUnmount, shallowRef } from 'vue'\n\nexport const COPIED_RESET_MS = 2000\n\nexport function useCopy(\n text: () => string,\n onCopied?: (value: string) => void,\n resetAfter: () => number = () => COPIED_RESET_MS,\n) {\n const copied = shallowRef(false)\n let timer: ReturnType<typeof setTimeout> | undefined\n\n async function copy() {\n const value = text()\n try {\n await navigator.clipboard.writeText(value)\n } catch {\n return\n }\n copied.value = true\n onCopied?.(value)\n clearTimeout(timer)\n timer = setTimeout(() => {\n copied.value = false\n }, resetAfter())\n }\n\n onBeforeUnmount(() => clearTimeout(timer))\n\n return { copied, copy }\n}\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { Check, Copy } from '@lucide/vue'\n import IconButton from '../icon-button/IconButton.vue'\n import { useUiLocale } from '../../locale'\n import { useCopy, COPIED_RESET_MS } from './composables/useCopy'\n import type { ButtonVariants } from '../button/button.variants'\n\n defineOptions({ name: 'HnCopyButton', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n text: string\n label?: string\n size?: ButtonVariants['size']\n timeout?: number\n disabled?: boolean\n tooltip?: boolean\n class?: string\n }>(),\n { size: 'sm', timeout: COPIED_RESET_MS },\n )\n\n const emit = defineEmits<{ copied: [text: string] }>()\n\n const t = useUiLocale()\n\n const { copied, copy } = useCopy(\n () => props.text,\n value => emit('copied', value),\n () => props.timeout,\n )\n\n const label = computed(() =>\n copied.value ? t.value.common.copied : (props.label ?? t.value.common.copy),\n )\n</script>\n\n<template>\n <IconButton\n v-bind=\"$attrs\"\n :label=\"label\"\n :tooltip=\"props.tooltip\"\n :size=\"props.size\"\n :disabled=\"props.disabled\"\n :class=\"props.class\"\n @click=\"copy\"\n >\n <span class=\"relative inline-flex size-[1em]\">\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-90 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-90 opacity-0\"\n >\n <Check v-if=\"copied\" key=\"check\" class=\"text-success-text absolute inset-0\" />\n <Copy v-else key=\"copy\" class=\"absolute inset-0\" />\n </Transition>\n </span>\n </IconButton>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { Check, Copy } from '@lucide/vue'\n import IconButton from '../icon-button/IconButton.vue'\n import { useUiLocale } from '../../locale'\n import { useCopy, COPIED_RESET_MS } from './composables/useCopy'\n import type { ButtonVariants } from '../button/button.variants'\n\n defineOptions({ name: 'HnCopyButton', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n text: string\n label?: string\n size?: ButtonVariants['size']\n timeout?: number\n disabled?: boolean\n tooltip?: boolean\n class?: string\n }>(),\n { size: 'sm', timeout: COPIED_RESET_MS },\n )\n\n const emit = defineEmits<{ copied: [text: string] }>()\n\n const t = useUiLocale()\n\n const { copied, copy } = useCopy(\n () => props.text,\n value => emit('copied', value),\n () => props.timeout,\n )\n\n const label = computed(() =>\n copied.value ? t.value.common.copied : (props.label ?? t.value.common.copy),\n )\n</script>\n\n<template>\n <IconButton\n v-bind=\"$attrs\"\n :label=\"label\"\n :tooltip=\"props.tooltip\"\n :size=\"props.size\"\n :disabled=\"props.disabled\"\n :class=\"props.class\"\n @click=\"copy\"\n >\n <span class=\"relative inline-flex size-[1em]\">\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-90 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-90 opacity-0\"\n >\n <Check v-if=\"copied\" key=\"check\" class=\"text-success-text absolute inset-0\" />\n <Copy v-else key=\"copy\" class=\"absolute inset-0\" />\n </Transition>\n </span>\n </IconButton>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const buttonGroup = tv({\n base: ['isolate align-middle', '[&>*]:[--hn-press-scale:1]', '[&>*:focus-visible]:z-10'],\n variants: {\n orientation: {\n horizontal: [\n '[&>*:not(:first-child)]:-ms-px',\n '[&>*:not(:first-child)]:rounded-s-none',\n '[&>*:not(:last-child)]:rounded-e-none',\n ],\n vertical: [\n 'flex-col',\n '[&>*:not(:first-child)]:-mt-px',\n '[&>*:not(:first-child)]:rounded-t-none',\n '[&>*:not(:last-child)]:rounded-b-none',\n ],\n },\n block: {\n true: 'flex w-full [&>*]:flex-1',\n false: 'inline-flex',\n },\n divider: {\n true: [\n '[&>*:not(:first-child)]:before:absolute',\n '[&>*:not(:first-child)]:before:bg-current',\n '[&>*:not(:first-child)]:before:opacity-25',\n ],\n },\n },\n compoundVariants: [\n {\n divider: true,\n orientation: 'horizontal',\n class:\n '[&>*:not(:first-child)]:before:start-0 [&>*:not(:first-child)]:before:inset-y-1/4 [&>*:not(:first-child)]:before:w-px',\n },\n {\n divider: true,\n orientation: 'vertical',\n class:\n '[&>*:not(:first-child)]:before:top-0 [&>*:not(:first-child)]:before:inset-x-1/4 [&>*:not(:first-child)]:before:h-px',\n },\n ],\n defaultVariants: {\n orientation: 'horizontal',\n block: false,\n },\n})\n\nexport type ButtonGroupVariants = VariantProps<typeof buttonGroup>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import { buttonGroup, type ButtonGroupVariants } from './button-group.variants'\n\n defineOptions({ name: 'HnButtonGroup' })\n\n const props = withDefaults(\n defineProps<{\n label?: string\n orientation?: ButtonGroupVariants['orientation']\n block?: boolean\n divider?: boolean\n class?: string\n }>(),\n { orientation: 'horizontal', block: false, divider: false },\n )\n</script>\n\n<template>\n <div\n role=\"group\"\n :aria-label=\"props.label\"\n :aria-orientation=\"props.orientation === 'vertical' ? 'vertical' : undefined\"\n :class=\"\n cn(\n buttonGroup({\n orientation: props.orientation,\n block: props.block,\n divider: props.divider,\n }),\n props.class,\n )\n \"\n >\n <slot />\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import { buttonGroup, type ButtonGroupVariants } from './button-group.variants'\n\n defineOptions({ name: 'HnButtonGroup' })\n\n const props = withDefaults(\n defineProps<{\n label?: string\n orientation?: ButtonGroupVariants['orientation']\n block?: boolean\n divider?: boolean\n class?: string\n }>(),\n { orientation: 'horizontal', block: false, divider: false },\n )\n</script>\n\n<template>\n <div\n role=\"group\"\n :aria-label=\"props.label\"\n :aria-orientation=\"props.orientation === 'vertical' ? 'vertical' : undefined\"\n :class=\"\n cn(\n buttonGroup({\n orientation: props.orientation,\n block: props.block,\n divider: props.divider,\n }),\n props.class,\n )\n \"\n >\n <slot />\n </div>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const tag = tv({\n base: [\n 'inline-flex shrink-0 items-center gap-1 rounded-sm border border-transparent',\n 'font-medium whitespace-nowrap select-none',\n ],\n variants: {\n variant: {\n soft: '',\n solid: '',\n outline: 'border-line',\n },\n tone: {\n accent: '',\n neutral: '',\n success: '',\n warning: '',\n danger: '',\n info: '',\n },\n size: {\n sm: 'h-5 px-1.5 text-xs [&_svg]:size-3',\n md: 'h-6 px-2 text-sm [&_svg]:size-3.5',\n },\n pill: {\n true: 'rounded-full',\n },\n },\n compoundVariants: [\n { variant: 'soft', tone: 'accent', class: 'bg-accent-soft text-accent-text' },\n { variant: 'soft', tone: 'neutral', class: 'bg-subtle text-fg' },\n { variant: 'soft', tone: 'success', class: 'bg-success-soft text-success-text' },\n { variant: 'soft', tone: 'warning', class: 'bg-warning-soft text-warning-text' },\n { variant: 'soft', tone: 'danger', class: 'bg-danger-soft text-danger-text' },\n { variant: 'soft', tone: 'info', class: 'bg-info-soft text-info-text' },\n { variant: 'solid', tone: 'accent', class: 'bg-accent text-accent-on' },\n { variant: 'solid', tone: 'neutral', class: 'bg-neutral-solid text-neutral-solid-on' },\n { variant: 'solid', tone: 'success', class: 'bg-success text-success-on' },\n { variant: 'solid', tone: 'warning', class: 'bg-warning text-warning-on' },\n { variant: 'solid', tone: 'danger', class: 'bg-danger text-danger-on' },\n { variant: 'solid', tone: 'info', class: 'bg-info text-info-on' },\n { variant: 'outline', tone: 'accent', class: 'text-accent-text' },\n { variant: 'outline', tone: 'neutral', class: 'text-muted' },\n { variant: 'outline', tone: 'success', class: 'text-success-text' },\n { variant: 'outline', tone: 'warning', class: 'text-warning-text' },\n { variant: 'outline', tone: 'danger', class: 'text-danger-text' },\n { variant: 'outline', tone: 'info', class: 'text-info-text' },\n ],\n defaultVariants: {\n variant: 'soft',\n tone: 'neutral',\n size: 'sm',\n },\n})\n\nexport type TagVariants = VariantProps<typeof tag>\n","<script setup lang=\"ts\">\n import { Primitive, type PrimitiveProps } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { tag, type TagVariants } from './tag.variants'\n\n defineOptions({ name: 'HnTag' })\n\n const props = withDefaults(\n defineProps<\n PrimitiveProps & {\n variant?: TagVariants['variant']\n tone?: TagVariants['tone']\n size?: TagVariants['size']\n pill?: boolean\n class?: string\n }\n >(),\n { as: 'span' },\n )\n</script>\n\n<template>\n <Primitive\n :as=\"props.as\"\n :as-child=\"props.asChild\"\n :class=\"\n cn(\n tag({\n variant: props.variant,\n tone: props.tone,\n size: props.size,\n pill: props.pill,\n }),\n props.class,\n )\n \"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\n import { Primitive, type PrimitiveProps } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { tag, type TagVariants } from './tag.variants'\n\n defineOptions({ name: 'HnTag' })\n\n const props = withDefaults(\n defineProps<\n PrimitiveProps & {\n variant?: TagVariants['variant']\n tone?: TagVariants['tone']\n size?: TagVariants['size']\n pill?: boolean\n class?: string\n }\n >(),\n { as: 'span' },\n )\n</script>\n\n<template>\n <Primitive\n :as=\"props.as\"\n :as-child=\"props.asChild\"\n :class=\"\n cn(\n tag({\n variant: props.variant,\n tone: props.tone,\n size: props.size,\n pill: props.pill,\n }),\n props.class,\n )\n \"\n >\n <slot />\n </Primitive>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const chip = tv({\n base: [\n 'relative inline-flex shrink-0 items-center rounded-full border border-transparent',\n 'font-medium whitespace-nowrap select-none',\n ],\n variants: {\n variant: {\n soft: '',\n outline: 'border-line',\n },\n tone: {\n neutral: '',\n accent: '',\n },\n size: {\n sm: 'h-[calc(var(--hn-control-h-sm)-0.25rem)] px-2 text-xs [&_svg]:size-3',\n md: 'h-[var(--hn-control-h-sm)] px-2.5 text-sm [&_svg]:size-3.5',\n },\n interactive: {\n true: 'hn-interactive hn-state-layer',\n },\n selected: {\n true: '',\n },\n disabled: {\n true: 'pointer-events-none opacity-50',\n },\n },\n compoundVariants: [\n { variant: 'soft', tone: 'neutral', class: 'bg-subtle text-fg' },\n { variant: 'soft', tone: 'accent', class: 'bg-accent-soft text-accent-text' },\n { variant: 'outline', tone: 'neutral', class: 'text-fg' },\n { variant: 'outline', tone: 'accent', class: 'text-accent-text' },\n { selected: true, class: 'text-accent-text' },\n ],\n defaultVariants: {\n variant: 'soft',\n tone: 'neutral',\n size: 'md',\n },\n})\n\nexport const chipIcon = tv({\n base: 'relative inline-flex shrink-0 items-center justify-center',\n variants: {\n size: {\n sm: 'me-1 size-3',\n md: 'me-1.5 size-3.5',\n },\n },\n defaultVariants: { size: 'md' },\n})\n\nexport const chipRemove = tv({\n base: 'hn-press-none disabled:opacity-100',\n variants: {\n size: {\n sm: 'ms-1 -me-1 size-4 [&_svg]:size-3',\n md: 'ms-1 -me-1.5 [&_svg]:size-3.5',\n },\n },\n defaultVariants: { size: 'md' },\n})\n\nexport type ChipVariants = VariantProps<typeof chip>\n","<script setup lang=\"ts\">\n import { Check } from '@lucide/vue'\n import { chipIcon, type ChipVariants } from './chip.variants'\n\n defineOptions({ name: 'HnChipIconSlot' })\n\n const props = defineProps<{\n size?: ChipVariants['size']\n checked: boolean\n icon: boolean\n }>()\n</script>\n\n<template>\n <span\n data-hn-icon\n class=\"hn-collapse-x\"\n :class=\"props.icon || props.checked ? 'hn-collapse-open' : 'hn-collapse-closed'\"\n >\n <span class=\"hn-collapse-body\">\n <span :class=\"chipIcon({ size: props.size })\">\n <span\n v-if=\"props.icon\"\n class=\"hn-transition inline-flex items-center justify-center\"\n :class=\"props.checked ? 'scale-90 opacity-0' : 'scale-100 opacity-100'\"\n >\n <slot />\n </span>\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-90 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-90 opacity-0\"\n >\n <span\n v-if=\"props.checked\"\n aria-hidden=\"true\"\n class=\"absolute inset-0 inline-flex items-center justify-center\"\n >\n <Check />\n </span>\n </Transition>\n </span>\n </span>\n </span>\n</template>\n","<script setup lang=\"ts\">\n import { Check } from '@lucide/vue'\n import { chipIcon, type ChipVariants } from './chip.variants'\n\n defineOptions({ name: 'HnChipIconSlot' })\n\n const props = defineProps<{\n size?: ChipVariants['size']\n checked: boolean\n icon: boolean\n }>()\n</script>\n\n<template>\n <span\n data-hn-icon\n class=\"hn-collapse-x\"\n :class=\"props.icon || props.checked ? 'hn-collapse-open' : 'hn-collapse-closed'\"\n >\n <span class=\"hn-collapse-body\">\n <span :class=\"chipIcon({ size: props.size })\">\n <span\n v-if=\"props.icon\"\n class=\"hn-transition inline-flex items-center justify-center\"\n :class=\"props.checked ? 'scale-90 opacity-0' : 'scale-100 opacity-100'\"\n >\n <slot />\n </span>\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-90 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-90 opacity-0\"\n >\n <span\n v-if=\"props.checked\"\n aria-hidden=\"true\"\n class=\"absolute inset-0 inline-flex items-center justify-center\"\n >\n <Check />\n </span>\n </Transition>\n </span>\n </span>\n </span>\n</template>\n","import { computed } from 'vue'\nimport type { PrimitiveProps } from 'reka-ui'\n\nexport function useChipRoot(props: PrimitiveProps & { selectable?: boolean; disabled?: boolean }) {\n const tag = computed(() => props.as ?? (props.selectable ? 'button' : 'span'))\n const nativeButton = computed(() => tag.value === 'button' && !props.asChild)\n const interactive = computed(\n () => !!props.selectable || tag.value === 'button' || tag.value === 'a' || !!props.asChild,\n )\n\n const attrs = computed(() => {\n if (nativeButton.value) return { type: 'button', disabled: props.disabled }\n if (interactive.value && props.disabled) {\n return { 'data-disabled': '', 'aria-disabled': 'true', tabindex: -1 }\n }\n return props.disabled ? { 'data-disabled': '' } : undefined\n })\n\n return { tag, interactive, attrs }\n}\n","<script setup lang=\"ts\">\n import { computed, useSlots } from 'vue'\n import { Primitive, type PrimitiveProps } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { devWarn } from '../../lib/dev'\n import { useUiLocale } from '../../locale'\n import Ripple from '../ripple/Ripple.vue'\n import CloseButton from '../close-button/CloseButton.vue'\n import IconSlot from './IconSlot.vue'\n import { useChipRoot } from './composables/useChipRoot'\n import { chip, chipRemove, type ChipVariants } from './chip.variants'\n\n defineOptions({ name: 'HnChip' })\n\n const props = withDefaults(\n defineProps<\n PrimitiveProps & {\n variant?: ChipVariants['variant']\n tone?: ChipVariants['tone']\n size?: ChipVariants['size']\n selectable?: boolean\n removable?: boolean\n disabled?: boolean\n ripple?: boolean\n class?: string\n }\n >(),\n { ripple: true },\n )\n\n const selected = defineModel<boolean>('selected', { default: false })\n\n const emit = defineEmits<{ remove: [] }>()\n\n const slots = useSlots()\n const t = useUiLocale()\n\n if (props.selectable && props.removable) {\n devWarn('Chip', 'selectable 与 removable 不能同时使用,removable 已忽略')\n }\n\n const { tag, interactive, attrs } = useChipRoot(props)\n const removable = computed(() => props.removable && !props.selectable)\n const showCheck = computed(() => props.selectable && selected.value)\n\n function guard(event: MouseEvent) {\n if (!props.disabled) return\n event.preventDefault()\n event.stopImmediatePropagation()\n }\n\n function toggle() {\n if (props.selectable) selected.value = !selected.value\n }\n\n function onRemoveKeydown(event: KeyboardEvent) {\n if (event.key !== 'Backspace' && event.key !== 'Delete') return\n event.preventDefault()\n emit('remove')\n }\n</script>\n\n<template>\n <Primitive\n :as=\"tag\"\n data-hn-chip\n :as-child=\"props.asChild\"\n v-bind=\"attrs\"\n :aria-pressed=\"props.selectable ? selected : undefined\"\n :data-state=\"showCheck ? 'selected' : undefined\"\n :class=\"\n cn(\n chip({\n variant: props.variant,\n tone: props.tone,\n size: props.size,\n interactive,\n selected: showCheck,\n disabled: props.disabled,\n }),\n props.class,\n )\n \"\n @click.capture=\"guard\"\n @click=\"toggle\"\n >\n <Ripple v-if=\"interactive && props.ripple\" :disabled=\"props.disabled\" />\n <IconSlot\n v-if=\"props.selectable || slots.icon\"\n :size=\"props.size\"\n :checked=\"showCheck\"\n :icon=\"!!slots.icon\"\n >\n <slot name=\"icon\" />\n </IconSlot>\n <slot />\n <CloseButton\n v-if=\"removable\"\n size=\"xs\"\n :label=\"t.chip.remove\"\n :disabled=\"props.disabled\"\n :class=\"chipRemove({ size: props.size })\"\n @click.stop=\"emit('remove')\"\n @keydown=\"onRemoveKeydown\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\n import { computed, useSlots } from 'vue'\n import { Primitive, type PrimitiveProps } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { devWarn } from '../../lib/dev'\n import { useUiLocale } from '../../locale'\n import Ripple from '../ripple/Ripple.vue'\n import CloseButton from '../close-button/CloseButton.vue'\n import IconSlot from './IconSlot.vue'\n import { useChipRoot } from './composables/useChipRoot'\n import { chip, chipRemove, type ChipVariants } from './chip.variants'\n\n defineOptions({ name: 'HnChip' })\n\n const props = withDefaults(\n defineProps<\n PrimitiveProps & {\n variant?: ChipVariants['variant']\n tone?: ChipVariants['tone']\n size?: ChipVariants['size']\n selectable?: boolean\n removable?: boolean\n disabled?: boolean\n ripple?: boolean\n class?: string\n }\n >(),\n { ripple: true },\n )\n\n const selected = defineModel<boolean>('selected', { default: false })\n\n const emit = defineEmits<{ remove: [] }>()\n\n const slots = useSlots()\n const t = useUiLocale()\n\n if (props.selectable && props.removable) {\n devWarn('Chip', 'selectable 与 removable 不能同时使用,removable 已忽略')\n }\n\n const { tag, interactive, attrs } = useChipRoot(props)\n const removable = computed(() => props.removable && !props.selectable)\n const showCheck = computed(() => props.selectable && selected.value)\n\n function guard(event: MouseEvent) {\n if (!props.disabled) return\n event.preventDefault()\n event.stopImmediatePropagation()\n }\n\n function toggle() {\n if (props.selectable) selected.value = !selected.value\n }\n\n function onRemoveKeydown(event: KeyboardEvent) {\n if (event.key !== 'Backspace' && event.key !== 'Delete') return\n event.preventDefault()\n emit('remove')\n }\n</script>\n\n<template>\n <Primitive\n :as=\"tag\"\n data-hn-chip\n :as-child=\"props.asChild\"\n v-bind=\"attrs\"\n :aria-pressed=\"props.selectable ? selected : undefined\"\n :data-state=\"showCheck ? 'selected' : undefined\"\n :class=\"\n cn(\n chip({\n variant: props.variant,\n tone: props.tone,\n size: props.size,\n interactive,\n selected: showCheck,\n disabled: props.disabled,\n }),\n props.class,\n )\n \"\n @click.capture=\"guard\"\n @click=\"toggle\"\n >\n <Ripple v-if=\"interactive && props.ripple\" :disabled=\"props.disabled\" />\n <IconSlot\n v-if=\"props.selectable || slots.icon\"\n :size=\"props.size\"\n :checked=\"showCheck\"\n :icon=\"!!slots.icon\"\n >\n <slot name=\"icon\" />\n </IconSlot>\n <slot />\n <CloseButton\n v-if=\"removable\"\n size=\"xs\"\n :label=\"t.chip.remove\"\n :disabled=\"props.disabled\"\n :class=\"chipRemove({ size: props.size })\"\n @click.stop=\"emit('remove')\"\n @keydown=\"onRemoveKeydown\"\n />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnSkeleton' })\n\n const props = withDefaults(\n defineProps<{\n loading?: boolean\n as?: string\n class?: string\n }>(),\n { loading: true, as: 'span' },\n )\n</script>\n\n<template>\n <slot v-if=\"!props.loading\" />\n <component\n :is=\"props.as\"\n v-else\n aria-hidden=\"true\"\n inert\n tabindex=\"-1\"\n :class=\"cn('hn-skeleton block', props.class)\"\n >\n <slot />\n </component>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnSkeleton' })\n\n const props = withDefaults(\n defineProps<{\n loading?: boolean\n as?: string\n class?: string\n }>(),\n { loading: true, as: 'span' },\n )\n</script>\n\n<template>\n <slot v-if=\"!props.loading\" />\n <component\n :is=\"props.as\"\n v-else\n aria-hidden=\"true\"\n inert\n tabindex=\"-1\"\n :class=\"cn('hn-skeleton block', props.class)\"\n >\n <slot />\n </component>\n</template>\n","<script setup lang=\"ts\">\n import { VisuallyHidden as RekaVisuallyHidden } from 'reka-ui'\n\n defineOptions({ name: 'HnVisuallyHidden' })\n</script>\n\n<template>\n <RekaVisuallyHidden>\n <slot />\n </RekaVisuallyHidden>\n</template>\n","<script setup lang=\"ts\">\n import { VisuallyHidden as RekaVisuallyHidden } from 'reka-ui'\n\n defineOptions({ name: 'HnVisuallyHidden' })\n</script>\n\n<template>\n <RekaVisuallyHidden>\n <slot />\n </RekaVisuallyHidden>\n</template>\n","<script setup lang=\"ts\">\n import { Motion, type MotionValue, type ValueAnimationTransition } from 'motion-v'\n import type { Rect } from './utils/pose'\n import type { LightboxItem } from './types'\n\n defineOptions({ name: 'HnLightboxStrip' })\n\n const props = defineProps<{\n slides: { item: LightboxItem; at: number; key: string }[]\n index: number\n width: number\n stripX: MotionValue<number>\n currentClass: string\n currentStyle: Record<string, unknown>\n frameOf: (item: LightboxItem) => Rect\n rotationOf: (item: LightboxItem) => number\n baseOf: (item: LightboxItem) => number\n transition: ValueAnimationTransition\n largeSrc?: string\n largeReady: boolean\n }>()\n\n const emit = defineEmits<{ learn: [id: string, image: HTMLImageElement] }>()\n\n function px(rect: Rect) {\n return {\n left: `${rect.x}px`,\n top: `${rect.y}px`,\n width: `${rect.width}px`,\n height: `${rect.height}px`,\n }\n }\n</script>\n\n<template>\n <Motion class=\"absolute inset-0\" :style=\"{ x: props.stripX }\">\n <div\n v-for=\"slide in props.slides\"\n :key=\"slide.key\"\n class=\"absolute inset-y-0\"\n :style=\"{ left: `${slide.at * props.width}px`, width: `${props.width}px` }\"\n >\n <Motion\n v-if=\"slide.at === props.index\"\n data-hn-frame\n :class=\"props.currentClass\"\n :style=\"props.currentStyle\"\n >\n <img\n :src=\"slide.item.src\"\n :alt=\"slide.item.alt\"\n draggable=\"false\"\n class=\"block size-full object-contain\"\n @load=\"emit('learn', slide.item.id, $event.target as HTMLImageElement)\"\n />\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"opacity-0\"\n >\n <img\n v-if=\"props.largeReady\"\n :src=\"props.largeSrc\"\n alt=\"\"\n aria-hidden=\"true\"\n draggable=\"false\"\n class=\"absolute inset-0 size-full object-contain\"\n />\n </Transition>\n </Motion>\n <Motion\n v-else\n data-hn-frame\n class=\"absolute\"\n :style=\"px(props.frameOf(slide.item))\"\n :initial=\"false\"\n :animate=\"{ rotate: props.rotationOf(slide.item), scale: props.baseOf(slide.item) }\"\n :transition=\"props.transition\"\n >\n <img\n :src=\"slide.item.src\"\n :alt=\"slide.item.alt\"\n draggable=\"false\"\n class=\"block size-full object-contain\"\n @load=\"emit('learn', slide.item.id, $event.target as HTMLImageElement)\"\n />\n </Motion>\n </div>\n </Motion>\n</template>\n","<script setup lang=\"ts\">\n import { Motion, type MotionValue, type ValueAnimationTransition } from 'motion-v'\n import type { Rect } from './utils/pose'\n import type { LightboxItem } from './types'\n\n defineOptions({ name: 'HnLightboxStrip' })\n\n const props = defineProps<{\n slides: { item: LightboxItem; at: number; key: string }[]\n index: number\n width: number\n stripX: MotionValue<number>\n currentClass: string\n currentStyle: Record<string, unknown>\n frameOf: (item: LightboxItem) => Rect\n rotationOf: (item: LightboxItem) => number\n baseOf: (item: LightboxItem) => number\n transition: ValueAnimationTransition\n largeSrc?: string\n largeReady: boolean\n }>()\n\n const emit = defineEmits<{ learn: [id: string, image: HTMLImageElement] }>()\n\n function px(rect: Rect) {\n return {\n left: `${rect.x}px`,\n top: `${rect.y}px`,\n width: `${rect.width}px`,\n height: `${rect.height}px`,\n }\n }\n</script>\n\n<template>\n <Motion class=\"absolute inset-0\" :style=\"{ x: props.stripX }\">\n <div\n v-for=\"slide in props.slides\"\n :key=\"slide.key\"\n class=\"absolute inset-y-0\"\n :style=\"{ left: `${slide.at * props.width}px`, width: `${props.width}px` }\"\n >\n <Motion\n v-if=\"slide.at === props.index\"\n data-hn-frame\n :class=\"props.currentClass\"\n :style=\"props.currentStyle\"\n >\n <img\n :src=\"slide.item.src\"\n :alt=\"slide.item.alt\"\n draggable=\"false\"\n class=\"block size-full object-contain\"\n @load=\"emit('learn', slide.item.id, $event.target as HTMLImageElement)\"\n />\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"opacity-0\"\n >\n <img\n v-if=\"props.largeReady\"\n :src=\"props.largeSrc\"\n alt=\"\"\n aria-hidden=\"true\"\n draggable=\"false\"\n class=\"absolute inset-0 size-full object-contain\"\n />\n </Transition>\n </Motion>\n <Motion\n v-else\n data-hn-frame\n class=\"absolute\"\n :style=\"px(props.frameOf(slide.item))\"\n :initial=\"false\"\n :animate=\"{ rotate: props.rotationOf(slide.item), scale: props.baseOf(slide.item) }\"\n :transition=\"props.transition\"\n >\n <img\n :src=\"slide.item.src\"\n :alt=\"slide.item.alt\"\n draggable=\"false\"\n class=\"block size-full object-contain\"\n @load=\"emit('learn', slide.item.id, $event.target as HTMLImageElement)\"\n />\n </Motion>\n </div>\n </Motion>\n</template>\n","import { onBeforeUnmount, onMounted, shallowRef, type ShallowRef } from 'vue'\nimport {\n OverlayScrollbars,\n type OverlayScrollbars as OSInstance,\n type PartialOptions,\n} from 'overlayscrollbars'\n\ntype OSEvent = 'scroll' | 'updated'\n\ntype IdleRequest = (callback: () => void, options?: { timeout: number }) => number\n\nfunction idleScheduler(): [(task: () => void) => void, () => void] {\n if (typeof window === 'undefined') {\n const noop = () => {}\n return [noop, noop]\n }\n const hasIdle = typeof window.requestIdleCallback === 'function'\n const request: IdleRequest = hasIdle ? window.requestIdleCallback : window.requestAnimationFrame\n const cancelRequest = hasIdle ? window.cancelIdleCallback : window.cancelAnimationFrame\n let requestId: number | undefined\n let frameId: number | undefined\n\n const cancel = () => {\n if (requestId !== undefined) cancelRequest(requestId)\n if (frameId !== undefined) cancelAnimationFrame(frameId)\n requestId = undefined\n frameId = undefined\n }\n const schedule = (task: () => void) => {\n cancel()\n requestId = request(\n hasIdle\n ? () => {\n cancel()\n frameId = requestAnimationFrame(task)\n }\n : task,\n { timeout: 2233 },\n )\n }\n return [schedule, cancel]\n}\n\nexport function useOverlayScrollbars(\n host: ShallowRef<HTMLElement | undefined>,\n content: ShallowRef<HTMLElement | undefined>,\n options: () => PartialOptions,\n) {\n const viewport = shallowRef<HTMLElement>()\n const instance = shallowRef<OSInstance>()\n const listeners: Array<[OSEvent, () => void]> = []\n const [schedule, cancelSchedule] = idleScheduler()\n\n let lastGesture = Number.NEGATIVE_INFINITY\n let retryId: ReturnType<typeof setTimeout> | undefined\n\n const markGesture = () => {\n lastGesture = performance.now()\n }\n\n function onEvent(event: OSEvent, cb: () => void) {\n listeners.push([event, cb])\n }\n\n onMounted(() => {\n const target = host.value\n if (target) {\n for (const name of ['wheel', 'touchmove', 'scroll'] as const) {\n target.addEventListener(name, markGesture, { passive: true, capture: true })\n }\n }\n schedule(function takeover() {\n if (!host.value || !content.value) return\n if (performance.now() - lastGesture < 250) {\n retryId = setTimeout(takeover, 300)\n return\n }\n if (target) {\n for (const name of ['wheel', 'touchmove', 'scroll'] as const) {\n target.removeEventListener(name, markGesture, { capture: true })\n }\n }\n instance.value = OverlayScrollbars(\n {\n target: host.value,\n elements: { viewport: content.value, content: content.value },\n },\n options(),\n )\n viewport.value = instance.value.elements().viewport\n for (const [event, cb] of listeners) instance.value.on(event, cb)\n })\n })\n\n onBeforeUnmount(() => {\n cancelSchedule()\n clearTimeout(retryId)\n if (host.value) {\n for (const name of ['wheel', 'touchmove', 'scroll'] as const) {\n host.value.removeEventListener(name, markGesture, { capture: true })\n }\n }\n instance.value?.destroy()\n instance.value = undefined\n viewport.value = undefined\n })\n\n return { viewport, instance, onEvent }\n}\n","import { shallowRef, type ShallowRef } from 'vue'\n\nexport function useEdgeShadow(\n viewport: ShallowRef<HTMLElement | undefined>,\n opts: () => { direction: 'vertical' | 'horizontal' | 'both'; shadow: boolean },\n) {\n const showXStart = shallowRef(false)\n const showXEnd = shallowRef(false)\n const showYStart = shallowRef(false)\n const showYEnd = shallowRef(false)\n\n function updateEdges() {\n const el = viewport.value\n const { direction, shadow } = opts()\n if (!el || !shadow) {\n showXStart.value = false\n showXEnd.value = false\n showYStart.value = false\n showYEnd.value = false\n return\n }\n const room = 1\n const x = direction !== 'vertical'\n const y = direction !== 'horizontal'\n showXStart.value = x && Math.abs(el.scrollLeft) > room\n showXEnd.value = x && Math.abs(el.scrollLeft) + el.clientWidth < el.scrollWidth - room\n showYStart.value = y && el.scrollTop > room\n showYEnd.value = y && el.scrollTop + el.clientHeight < el.scrollHeight - room\n }\n\n return { showXStart, showXEnd, showYStart, showYEnd, updateEdges }\n}\n","import { watch, type ShallowRef } from 'vue'\n\nexport function useWheelRedirect(\n viewport: ShallowRef<HTMLElement | undefined>,\n enabled: () => boolean,\n) {\n function onWheel(event: WheelEvent) {\n if (!enabled()) return\n const el = viewport.value\n if (!el) return\n if (Math.abs(event.deltaY) <= Math.abs(event.deltaX)) return\n const max = el.scrollWidth - el.clientWidth\n if (max <= 0) return\n const atStart = el.scrollLeft <= 0 && event.deltaY < 0\n const atEnd = el.scrollLeft >= max - 1 && event.deltaY > 0\n if (atStart || atEnd) return\n event.preventDefault()\n el.scrollLeft += event.deltaY\n }\n\n watch(\n viewport,\n (el, _, onCleanup) => {\n if (!el) return\n el.addEventListener('wheel', onWheel, { passive: false })\n onCleanup(() => el.removeEventListener('wheel', onWheel))\n },\n { immediate: true },\n )\n}\n","import { createSharedComposable, useMutationObserver } from '@vueuse/core'\nimport { onBeforeUnmount, ref, watch, type ShallowRef } from 'vue'\n\nconst useBodyPointerLock = createSharedComposable(() => {\n const locked = ref(false)\n if (typeof document !== 'undefined') {\n const read = () => {\n locked.value = document.body.style.pointerEvents === 'none'\n }\n read()\n useMutationObserver(document.body, read, { attributes: true, attributeFilter: ['style'] })\n }\n return locked\n})\n\nfunction block(event: Event) {\n event.preventDefault()\n}\n\nexport function useLayerLock(viewport: ShallowRef<HTMLElement | undefined>) {\n const locked = useBodyPointerLock()\n let release: (() => void) | undefined\n\n function apply() {\n release?.()\n release = undefined\n const el = viewport.value\n if (!el || !locked.value || getComputedStyle(el).pointerEvents !== 'none') return\n el.addEventListener('wheel', block, { passive: false })\n el.addEventListener('touchmove', block, { passive: false })\n release = () => {\n el.removeEventListener('wheel', block)\n el.removeEventListener('touchmove', block)\n }\n }\n\n watch([locked, viewport], apply, { flush: 'post' })\n onBeforeUnmount(() => release?.())\n}\n","<script setup lang=\"ts\">\n import { computed, shallowRef, watch } from 'vue'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import { useOverlayScrollbars } from './composables/useOverlayScrollbars'\n import { useEdgeShadow } from './composables/useEdgeShadow'\n import { useWheelRedirect } from './composables/useWheelRedirect'\n import { useLayerLock } from './composables/useLayerLock'\n\n defineOptions({ name: 'HnScrollArea', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n direction?: 'vertical' | 'horizontal' | 'both'\n autoHide?: 'never' | 'scroll' | 'leave' | 'move'\n scrollbar?: boolean\n wheelRedirect?: boolean\n shadow?: boolean\n focusable?: boolean\n label?: string\n class?: string\n }>(),\n {\n direction: 'vertical',\n autoHide: 'leave',\n scrollbar: true,\n wheelRedirect: true,\n shadow: true,\n focusable: false,\n },\n )\n\n const t = useUiLocale()\n const host = shallowRef<HTMLElement>()\n const content = shallowRef<HTMLElement>()\n\n const overflow = {\n vertical: { x: 'hidden', y: 'scroll' },\n horizontal: { x: 'scroll', y: 'hidden' },\n both: { x: 'scroll', y: 'scroll' },\n } as const\n\n function options() {\n return {\n scrollbars: {\n theme: 'os-theme-dark',\n visibility: props.scrollbar ? ('auto' as const) : ('hidden' as const),\n autoHide: props.autoHide,\n autoHideDelay: 800,\n },\n overflow: overflow[props.direction],\n update: {\n elementEvents: [\n ['img', 'load'],\n ['*', 'transitionend animationend'],\n ] as Array<[string, string]>,\n },\n }\n }\n\n const { viewport, instance, onEvent } = useOverlayScrollbars(host, content, options)\n const { showXStart, showXEnd, showYStart, showYEnd, updateEdges } = useEdgeShadow(\n viewport,\n () => ({ direction: props.direction, shadow: props.shadow }),\n )\n\n onEvent('scroll', updateEdges)\n onEvent('updated', updateEdges)\n watch(viewport, () => updateEdges())\n\n useWheelRedirect(viewport, () => props.direction === 'horizontal' && props.wheelRedirect)\n useLayerLock(viewport)\n\n watch(\n () => [props.direction, props.autoHide, props.scrollbar],\n () => instance.value?.options(options()),\n )\n\n defineExpose({ viewport, instance })\n</script>\n\n<template>\n <div :class=\"cn('hn-scroll-area relative flex flex-col overflow-hidden', props.class)\">\n <div\n ref=\"host\"\n v-bind=\"$attrs\"\n data-overlayscrollbars-initialize\n :tabindex=\"props.focusable ? 0 : undefined\"\n :role=\"props.focusable ? 'region' : undefined\"\n :aria-label=\"props.focusable ? (props.label ?? t.scroll.regionLabel) : undefined\"\n class=\"w-full min-h-0 grow\"\n >\n <div ref=\"content\" data-overlayscrollbars-contents>\n <slot />\n </div>\n </div>\n <template v-if=\"props.shadow\">\n <div\n v-if=\"props.direction !== 'vertical'\"\n class=\"hn-scroll-shadow\"\n data-side=\"x-start\"\n :data-visible=\"showXStart ? '' : undefined\"\n aria-hidden=\"true\"\n />\n <div\n v-if=\"props.direction !== 'vertical'\"\n class=\"hn-scroll-shadow\"\n data-side=\"x-end\"\n :data-visible=\"showXEnd ? '' : undefined\"\n aria-hidden=\"true\"\n />\n <div\n v-if=\"props.direction !== 'horizontal'\"\n class=\"hn-scroll-shadow\"\n data-side=\"y-start\"\n :data-visible=\"showYStart ? '' : undefined\"\n aria-hidden=\"true\"\n />\n <div\n v-if=\"props.direction !== 'horizontal'\"\n class=\"hn-scroll-shadow\"\n data-side=\"y-end\"\n :data-visible=\"showYEnd ? '' : undefined\"\n aria-hidden=\"true\"\n />\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed, shallowRef, watch } from 'vue'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import { useOverlayScrollbars } from './composables/useOverlayScrollbars'\n import { useEdgeShadow } from './composables/useEdgeShadow'\n import { useWheelRedirect } from './composables/useWheelRedirect'\n import { useLayerLock } from './composables/useLayerLock'\n\n defineOptions({ name: 'HnScrollArea', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n direction?: 'vertical' | 'horizontal' | 'both'\n autoHide?: 'never' | 'scroll' | 'leave' | 'move'\n scrollbar?: boolean\n wheelRedirect?: boolean\n shadow?: boolean\n focusable?: boolean\n label?: string\n class?: string\n }>(),\n {\n direction: 'vertical',\n autoHide: 'leave',\n scrollbar: true,\n wheelRedirect: true,\n shadow: true,\n focusable: false,\n },\n )\n\n const t = useUiLocale()\n const host = shallowRef<HTMLElement>()\n const content = shallowRef<HTMLElement>()\n\n const overflow = {\n vertical: { x: 'hidden', y: 'scroll' },\n horizontal: { x: 'scroll', y: 'hidden' },\n both: { x: 'scroll', y: 'scroll' },\n } as const\n\n function options() {\n return {\n scrollbars: {\n theme: 'os-theme-dark',\n visibility: props.scrollbar ? ('auto' as const) : ('hidden' as const),\n autoHide: props.autoHide,\n autoHideDelay: 800,\n },\n overflow: overflow[props.direction],\n update: {\n elementEvents: [\n ['img', 'load'],\n ['*', 'transitionend animationend'],\n ] as Array<[string, string]>,\n },\n }\n }\n\n const { viewport, instance, onEvent } = useOverlayScrollbars(host, content, options)\n const { showXStart, showXEnd, showYStart, showYEnd, updateEdges } = useEdgeShadow(\n viewport,\n () => ({ direction: props.direction, shadow: props.shadow }),\n )\n\n onEvent('scroll', updateEdges)\n onEvent('updated', updateEdges)\n watch(viewport, () => updateEdges())\n\n useWheelRedirect(viewport, () => props.direction === 'horizontal' && props.wheelRedirect)\n useLayerLock(viewport)\n\n watch(\n () => [props.direction, props.autoHide, props.scrollbar],\n () => instance.value?.options(options()),\n )\n\n defineExpose({ viewport, instance })\n</script>\n\n<template>\n <div :class=\"cn('hn-scroll-area relative flex flex-col overflow-hidden', props.class)\">\n <div\n ref=\"host\"\n v-bind=\"$attrs\"\n data-overlayscrollbars-initialize\n :tabindex=\"props.focusable ? 0 : undefined\"\n :role=\"props.focusable ? 'region' : undefined\"\n :aria-label=\"props.focusable ? (props.label ?? t.scroll.regionLabel) : undefined\"\n class=\"w-full min-h-0 grow\"\n >\n <div ref=\"content\" data-overlayscrollbars-contents>\n <slot />\n </div>\n </div>\n <template v-if=\"props.shadow\">\n <div\n v-if=\"props.direction !== 'vertical'\"\n class=\"hn-scroll-shadow\"\n data-side=\"x-start\"\n :data-visible=\"showXStart ? '' : undefined\"\n aria-hidden=\"true\"\n />\n <div\n v-if=\"props.direction !== 'vertical'\"\n class=\"hn-scroll-shadow\"\n data-side=\"x-end\"\n :data-visible=\"showXEnd ? '' : undefined\"\n aria-hidden=\"true\"\n />\n <div\n v-if=\"props.direction !== 'horizontal'\"\n class=\"hn-scroll-shadow\"\n data-side=\"y-start\"\n :data-visible=\"showYStart ? '' : undefined\"\n aria-hidden=\"true\"\n />\n <div\n v-if=\"props.direction !== 'horizontal'\"\n class=\"hn-scroll-shadow\"\n data-side=\"y-end\"\n :data-visible=\"showYEnd ? '' : undefined\"\n aria-hidden=\"true\"\n />\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { Motion } from 'motion-v'\n import { cn } from '../../lib/cn'\n import { TRANSITION, prefersReducedMotion } from '../../motion'\n\n defineOptions({ name: 'HnHighlight' })\n\n const props = withDefaults(\n defineProps<{\n id?: string\n as?: 'div' | 'li'\n class?: string\n }>(),\n { id: undefined, as: 'div' },\n )\n\n const transition = computed(() => (prefersReducedMotion() ? { duration: 0 } : TRANSITION.layout))\n</script>\n\n<template>\n <Motion\n :as=\"props.as\"\n layout\n :layout-id=\"props.id\"\n aria-hidden=\"true\"\n data-hn-highlight\n :transition=\"transition\"\n :class=\"cn('pointer-events-none', props.class)\"\n />\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { Motion } from 'motion-v'\n import { cn } from '../../lib/cn'\n import { TRANSITION, prefersReducedMotion } from '../../motion'\n\n defineOptions({ name: 'HnHighlight' })\n\n const props = withDefaults(\n defineProps<{\n id?: string\n as?: 'div' | 'li'\n class?: string\n }>(),\n { id: undefined, as: 'div' },\n )\n\n const transition = computed(() => (prefersReducedMotion() ? { duration: 0 } : TRANSITION.layout))\n</script>\n\n<template>\n <Motion\n :as=\"props.as\"\n layout\n :layout-id=\"props.id\"\n aria-hidden=\"true\"\n data-hn-highlight\n :transition=\"transition\"\n :class=\"cn('pointer-events-none', props.class)\"\n />\n</template>\n","<script setup lang=\"ts\">\n import { nextTick, useId, watch, type ComponentPublicInstance } from 'vue'\n import { cn } from '../../lib/cn'\n import { prefersReducedMotion } from '../../motion'\n import ScrollArea from '../scroll-area/ScrollArea.vue'\n import Highlight from '../highlight/Highlight.vue'\n import Ripple from '../ripple/Ripple.vue'\n import type { LightboxItem } from './types'\n\n defineOptions({ name: 'HnLightboxThumbs' })\n\n const props = defineProps<{\n items: LightboxItem[]\n index: number\n }>()\n\n const emit = defineEmits<{ select: [index: number] }>()\n\n const buttons: HTMLElement[] = []\n const highlightId = useId()\n\n function setButton(at: number, el: Element | ComponentPublicInstance | null) {\n if (el instanceof HTMLElement) buttons[at] = el\n }\n\n watch(\n () => [props.index, props.items.length] as const,\n async () => {\n await nextTick()\n buttons[props.index]?.scrollIntoView({\n behavior: prefersReducedMotion() ? 'auto' : 'smooth',\n block: 'nearest',\n inline: 'center',\n })\n },\n { immediate: true, flush: 'post' },\n )\n</script>\n\n<template>\n <ScrollArea direction=\"horizontal\" :scrollbar=\"false\" class=\"max-w-full\">\n <div data-hn-thumbs class=\"relative isolate flex w-max gap-2 px-4 py-3\">\n <button\n v-for=\"(item, at) in props.items\"\n :key=\"item.id\"\n :ref=\"el => setButton(at, el)\"\n type=\"button\"\n :aria-label=\"item.alt\"\n :aria-current=\"at === props.index ? 'true' : undefined\"\n :class=\"\n cn(\n 'hn-interactive hn-state-layer hn-press-none hn-transition relative z-[1] size-14 shrink-0 overflow-hidden rounded-md',\n at === props.index ? 'z-0 opacity-100' : 'opacity-60',\n )\n \"\n @click=\"emit('select', at)\"\n >\n <Ripple />\n <img\n :src=\"item.src\"\n alt=\"\"\n draggable=\"false\"\n class=\"relative -z-10 size-full object-cover\"\n />\n <Highlight\n v-if=\"at === props.index\"\n :id=\"highlightId\"\n class=\"ring-accent absolute inset-0 rounded-md ring-2 ring-inset\"\n />\n </button>\n </div>\n </ScrollArea>\n</template>\n","<script setup lang=\"ts\">\n import { nextTick, useId, watch, type ComponentPublicInstance } from 'vue'\n import { cn } from '../../lib/cn'\n import { prefersReducedMotion } from '../../motion'\n import ScrollArea from '../scroll-area/ScrollArea.vue'\n import Highlight from '../highlight/Highlight.vue'\n import Ripple from '../ripple/Ripple.vue'\n import type { LightboxItem } from './types'\n\n defineOptions({ name: 'HnLightboxThumbs' })\n\n const props = defineProps<{\n items: LightboxItem[]\n index: number\n }>()\n\n const emit = defineEmits<{ select: [index: number] }>()\n\n const buttons: HTMLElement[] = []\n const highlightId = useId()\n\n function setButton(at: number, el: Element | ComponentPublicInstance | null) {\n if (el instanceof HTMLElement) buttons[at] = el\n }\n\n watch(\n () => [props.index, props.items.length] as const,\n async () => {\n await nextTick()\n buttons[props.index]?.scrollIntoView({\n behavior: prefersReducedMotion() ? 'auto' : 'smooth',\n block: 'nearest',\n inline: 'center',\n })\n },\n { immediate: true, flush: 'post' },\n )\n</script>\n\n<template>\n <ScrollArea direction=\"horizontal\" :scrollbar=\"false\" class=\"max-w-full\">\n <div data-hn-thumbs class=\"relative isolate flex w-max gap-2 px-4 py-3\">\n <button\n v-for=\"(item, at) in props.items\"\n :key=\"item.id\"\n :ref=\"el => setButton(at, el)\"\n type=\"button\"\n :aria-label=\"item.alt\"\n :aria-current=\"at === props.index ? 'true' : undefined\"\n :class=\"\n cn(\n 'hn-interactive hn-state-layer hn-press-none hn-transition relative z-[1] size-14 shrink-0 overflow-hidden rounded-md',\n at === props.index ? 'z-0 opacity-100' : 'opacity-60',\n )\n \"\n @click=\"emit('select', at)\"\n >\n <Ripple />\n <img\n :src=\"item.src\"\n alt=\"\"\n draggable=\"false\"\n class=\"relative -z-10 size-full object-cover\"\n />\n <Highlight\n v-if=\"at === props.index\"\n :id=\"highlightId\"\n class=\"ring-accent absolute inset-0 rounded-md ring-2 ring-inset\"\n />\n </button>\n </div>\n </ScrollArea>\n</template>\n","<script setup lang=\"ts\">\n import { Download, RotateCw, Shrink, ZoomIn, ZoomOut } from '@lucide/vue'\n import { useUiLocale } from '../../locale'\n import IconButton from '../icon-button/IconButton.vue'\n import LightboxThumbs from './LightboxThumbs.vue'\n import type { LightboxItem } from './types'\n\n defineOptions({ name: 'HnLightboxToolbar' })\n\n const props = defineProps<{\n items: LightboxItem[]\n index: number\n zoomed: boolean\n }>()\n\n const emit = defineEmits<{\n select: [index: number]\n zoomIn: []\n zoomOut: []\n reset: []\n rotate: []\n download: []\n }>()\n\n const t = useUiLocale()\n</script>\n\n<template>\n <div class=\"flex flex-col items-center gap-1 pb-3\">\n <LightboxThumbs\n v-if=\"props.items.length > 1\"\n :items=\"props.items\"\n :index=\"props.index\"\n @select=\"emit('select', $event)\"\n />\n <div class=\"flex items-center gap-1\">\n <IconButton\n :label=\"t.lightbox.zoomOut\"\n variant=\"soft\"\n pill\n class=\"hidden pointer-fine:inline-flex\"\n @click=\"emit('zoomOut')\"\n >\n <ZoomOut />\n </IconButton>\n <IconButton\n :label=\"t.lightbox.zoomIn\"\n variant=\"soft\"\n pill\n class=\"hidden pointer-fine:inline-flex\"\n @click=\"emit('zoomIn')\"\n >\n <ZoomIn />\n </IconButton>\n <IconButton\n :label=\"t.lightbox.resetZoom\"\n variant=\"soft\"\n pill\n :disabled=\"!props.zoomed\"\n class=\"hidden pointer-fine:inline-flex\"\n @click=\"emit('reset')\"\n >\n <Shrink />\n </IconButton>\n <IconButton :label=\"t.lightbox.rotate\" variant=\"soft\" pill @click=\"emit('rotate')\">\n <RotateCw />\n </IconButton>\n <IconButton :label=\"t.lightbox.download\" variant=\"soft\" pill @click=\"emit('download')\">\n <Download />\n </IconButton>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { Download, RotateCw, Shrink, ZoomIn, ZoomOut } from '@lucide/vue'\n import { useUiLocale } from '../../locale'\n import IconButton from '../icon-button/IconButton.vue'\n import LightboxThumbs from './LightboxThumbs.vue'\n import type { LightboxItem } from './types'\n\n defineOptions({ name: 'HnLightboxToolbar' })\n\n const props = defineProps<{\n items: LightboxItem[]\n index: number\n zoomed: boolean\n }>()\n\n const emit = defineEmits<{\n select: [index: number]\n zoomIn: []\n zoomOut: []\n reset: []\n rotate: []\n download: []\n }>()\n\n const t = useUiLocale()\n</script>\n\n<template>\n <div class=\"flex flex-col items-center gap-1 pb-3\">\n <LightboxThumbs\n v-if=\"props.items.length > 1\"\n :items=\"props.items\"\n :index=\"props.index\"\n @select=\"emit('select', $event)\"\n />\n <div class=\"flex items-center gap-1\">\n <IconButton\n :label=\"t.lightbox.zoomOut\"\n variant=\"soft\"\n pill\n class=\"hidden pointer-fine:inline-flex\"\n @click=\"emit('zoomOut')\"\n >\n <ZoomOut />\n </IconButton>\n <IconButton\n :label=\"t.lightbox.zoomIn\"\n variant=\"soft\"\n pill\n class=\"hidden pointer-fine:inline-flex\"\n @click=\"emit('zoomIn')\"\n >\n <ZoomIn />\n </IconButton>\n <IconButton\n :label=\"t.lightbox.resetZoom\"\n variant=\"soft\"\n pill\n :disabled=\"!props.zoomed\"\n class=\"hidden pointer-fine:inline-flex\"\n @click=\"emit('reset')\"\n >\n <Shrink />\n </IconButton>\n <IconButton :label=\"t.lightbox.rotate\" variant=\"soft\" pill @click=\"emit('rotate')\">\n <RotateCw />\n </IconButton>\n <IconButton :label=\"t.lightbox.download\" variant=\"soft\" pill @click=\"emit('download')\">\n <Download />\n </IconButton>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { DialogClose } from 'reka-ui'\n import { Motion, type MotionValue } from 'motion-v'\n import { ChevronLeft, ChevronRight } from '@lucide/vue'\n import { useUiLocale } from '../../locale'\n import CloseButton from '../close-button/CloseButton.vue'\n import IconButton from '../icon-button/IconButton.vue'\n import Spinner from '../spinner/Spinner.vue'\n import Tag from '../tag/Tag.vue'\n import LightboxToolbar from './LightboxToolbar.vue'\n import type { LightboxItem } from './types'\n\n defineOptions({ name: 'HnLightboxChrome' })\n\n const props = defineProps<{\n items: LightboxItem[]\n index: number\n zoomed: boolean\n waiting: boolean\n loop: boolean\n presence: MotionValue<number>\n hint: { x: MotionValue<number>; y: MotionValue<number> }\n }>()\n\n const emit = defineEmits<{\n prev: []\n next: []\n select: [index: number]\n zoomIn: []\n zoomOut: []\n reset: []\n rotate: []\n download: []\n }>()\n\n const t = useUiLocale()\n</script>\n\n<template>\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"opacity-0\"\n >\n <Motion\n v-if=\"props.waiting\"\n class=\"pointer-events-none absolute start-0 top-0 -translate-x-full p-3\"\n :style=\"{ x: props.hint.x, y: props.hint.y }\"\n >\n <Tag variant=\"soft\" tone=\"neutral\" pill class=\"whitespace-nowrap\">\n <Spinner size=\"sm\" />\n {{ t.lightbox.loadingLarge }}\n </Tag>\n </Motion>\n </Transition>\n <Motion\n v-if=\"props.items.length > 1\"\n class=\"pointer-events-none absolute inset-y-0 start-0 hidden items-center ps-4 pointer-fine:flex\"\n :style=\"{ opacity: props.presence }\"\n >\n <IconButton\n :label=\"t.pagination.prev\"\n variant=\"soft\"\n size=\"lg\"\n pill\n :disabled=\"!props.loop && props.index <= 0\"\n class=\"pointer-events-auto\"\n @click=\"emit('prev')\"\n >\n <ChevronLeft />\n </IconButton>\n </Motion>\n <Motion\n v-if=\"props.items.length > 1\"\n class=\"pointer-events-none absolute inset-y-0 end-0 hidden items-center pe-4 pointer-fine:flex\"\n :style=\"{ opacity: props.presence }\"\n >\n <IconButton\n :label=\"t.pagination.next\"\n variant=\"soft\"\n size=\"lg\"\n pill\n :disabled=\"!props.loop && props.index >= props.items.length - 1\"\n class=\"pointer-events-auto\"\n @click=\"emit('next')\"\n >\n <ChevronRight />\n </IconButton>\n </Motion>\n <Motion class=\"absolute end-4 top-4\" :style=\"{ opacity: props.presence }\">\n <DialogClose as-child>\n <CloseButton size=\"md\" />\n </DialogClose>\n </Motion>\n <Motion\n data-hn-chrome\n class=\"absolute inset-x-0 bottom-0 flex touch-pan-x justify-center\"\n :style=\"{ opacity: props.presence }\"\n >\n <LightboxToolbar\n :items=\"props.items\"\n :index=\"props.index\"\n :zoomed=\"props.zoomed\"\n @select=\"emit('select', $event)\"\n @zoom-in=\"emit('zoomIn')\"\n @zoom-out=\"emit('zoomOut')\"\n @reset=\"emit('reset')\"\n @rotate=\"emit('rotate')\"\n @download=\"emit('download')\"\n />\n </Motion>\n</template>\n","<script setup lang=\"ts\">\n import { DialogClose } from 'reka-ui'\n import { Motion, type MotionValue } from 'motion-v'\n import { ChevronLeft, ChevronRight } from '@lucide/vue'\n import { useUiLocale } from '../../locale'\n import CloseButton from '../close-button/CloseButton.vue'\n import IconButton from '../icon-button/IconButton.vue'\n import Spinner from '../spinner/Spinner.vue'\n import Tag from '../tag/Tag.vue'\n import LightboxToolbar from './LightboxToolbar.vue'\n import type { LightboxItem } from './types'\n\n defineOptions({ name: 'HnLightboxChrome' })\n\n const props = defineProps<{\n items: LightboxItem[]\n index: number\n zoomed: boolean\n waiting: boolean\n loop: boolean\n presence: MotionValue<number>\n hint: { x: MotionValue<number>; y: MotionValue<number> }\n }>()\n\n const emit = defineEmits<{\n prev: []\n next: []\n select: [index: number]\n zoomIn: []\n zoomOut: []\n reset: []\n rotate: []\n download: []\n }>()\n\n const t = useUiLocale()\n</script>\n\n<template>\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"opacity-0\"\n >\n <Motion\n v-if=\"props.waiting\"\n class=\"pointer-events-none absolute start-0 top-0 -translate-x-full p-3\"\n :style=\"{ x: props.hint.x, y: props.hint.y }\"\n >\n <Tag variant=\"soft\" tone=\"neutral\" pill class=\"whitespace-nowrap\">\n <Spinner size=\"sm\" />\n {{ t.lightbox.loadingLarge }}\n </Tag>\n </Motion>\n </Transition>\n <Motion\n v-if=\"props.items.length > 1\"\n class=\"pointer-events-none absolute inset-y-0 start-0 hidden items-center ps-4 pointer-fine:flex\"\n :style=\"{ opacity: props.presence }\"\n >\n <IconButton\n :label=\"t.pagination.prev\"\n variant=\"soft\"\n size=\"lg\"\n pill\n :disabled=\"!props.loop && props.index <= 0\"\n class=\"pointer-events-auto\"\n @click=\"emit('prev')\"\n >\n <ChevronLeft />\n </IconButton>\n </Motion>\n <Motion\n v-if=\"props.items.length > 1\"\n class=\"pointer-events-none absolute inset-y-0 end-0 hidden items-center pe-4 pointer-fine:flex\"\n :style=\"{ opacity: props.presence }\"\n >\n <IconButton\n :label=\"t.pagination.next\"\n variant=\"soft\"\n size=\"lg\"\n pill\n :disabled=\"!props.loop && props.index >= props.items.length - 1\"\n class=\"pointer-events-auto\"\n @click=\"emit('next')\"\n >\n <ChevronRight />\n </IconButton>\n </Motion>\n <Motion class=\"absolute end-4 top-4\" :style=\"{ opacity: props.presence }\">\n <DialogClose as-child>\n <CloseButton size=\"md\" />\n </DialogClose>\n </Motion>\n <Motion\n data-hn-chrome\n class=\"absolute inset-x-0 bottom-0 flex touch-pan-x justify-center\"\n :style=\"{ opacity: props.presence }\"\n >\n <LightboxToolbar\n :items=\"props.items\"\n :index=\"props.index\"\n :zoomed=\"props.zoomed\"\n @select=\"emit('select', $event)\"\n @zoom-in=\"emit('zoomIn')\"\n @zoom-out=\"emit('zoomOut')\"\n @reset=\"emit('reset')\"\n @rotate=\"emit('rotate')\"\n @download=\"emit('download')\"\n />\n </Motion>\n</template>\n","export interface Size {\n width: number\n height: number\n}\n\nexport interface Point {\n x: number\n y: number\n}\n\nexport interface Bounds {\n minX: number\n maxX: number\n minY: number\n maxY: number\n}\n\nexport const ZOOM_MIN = 1\nexport const ZOOM_MAX = 6\nexport const ZOOM_DOUBLE_TAP = 2.5\nexport const ZOOM_STEP = 1.5\nexport const OVERSHOOT = 0.55\nexport const WHEEL_INTENSITY = 0.002\n\nexport const ZOOM_EPSILON = 0.001\n\nexport function isZoomed(zoom: number): boolean {\n return zoom > ZOOM_MIN + ZOOM_EPSILON\n}\n\nexport function rotatedSize(size: Size, rotation: number): Size {\n const quarter = Math.round(rotation / 90) % 2\n return quarter === 0 ? size : { width: size.height, height: size.width }\n}\n\nexport function fitSize(natural: Size, stage: Size, rotation = 0): Size {\n const upright = rotatedSize(natural, rotation)\n if (upright.width <= 0 || upright.height <= 0) return { width: 0, height: 0 }\n const scale = Math.min(stage.width / upright.width, stage.height / upright.height)\n return { width: upright.width * scale, height: upright.height * scale }\n}\n\nexport function panBounds(displayed: Size, stage: Size): Bounds {\n const x = Math.max(0, (displayed.width - stage.width) / 2)\n const y = Math.max(0, (displayed.height - stage.height) / 2)\n return { minX: x ? -x : 0, maxX: x, minY: y ? -y : 0, maxY: y }\n}\n\nexport function clampOffset(offset: Point, bounds: Bounds): Point {\n return {\n x: Math.min(Math.max(offset.x, bounds.minX), bounds.maxX),\n y: Math.min(Math.max(offset.y, bounds.minY), bounds.maxY),\n }\n}\n\nexport function zoomAbout(offset: Point, zoom: number, next: number, focal: Point): Point {\n const ratio = next / zoom\n return {\n x: focal.x - (focal.x - offset.x) * ratio,\n y: focal.y - (focal.y - offset.y) * ratio,\n }\n}\n\nfunction resist(over: number, span: number, coefficient: number): number {\n return (1 - 1 / ((over * coefficient) / span + 1)) * span\n}\n\nexport function rubberBand(\n value: number,\n min: number,\n max: number,\n span: number,\n coefficient = OVERSHOOT,\n): number {\n if (span <= 0) return Math.min(Math.max(value, min), max)\n if (value > max) return max + resist(value - max, span, coefficient)\n if (value < min) return min - resist(min - value, span, coefficient)\n return value\n}\n\nexport function elasticOffset(offset: Point, bounds: Bounds, stage: Size): Point {\n return {\n x: rubberBand(offset.x, bounds.minX, bounds.maxX, stage.width),\n y: rubberBand(offset.y, bounds.minY, bounds.maxY, stage.height),\n }\n}\n\nexport function clampZoom(zoom: number, min = ZOOM_MIN, max = ZOOM_MAX): number {\n return Math.min(Math.max(zoom, min), max)\n}\n\nexport function elasticZoom(zoom: number, min = ZOOM_MIN, max = ZOOM_MAX): number {\n const lo = Math.log(min)\n const hi = Math.log(max)\n return Math.exp(rubberBand(Math.log(zoom), lo, hi, hi - lo))\n}\n\nexport function pinchZoom(startZoom: number, startDistance: number, distance: number): number {\n if (startDistance <= 0) return startZoom\n return startZoom * (distance / startDistance)\n}\n\nexport function wheelZoom(zoom: number, deltaY: number, intensity = WHEEL_INTENSITY): number {\n return zoom * Math.exp(-deltaY * intensity)\n}\n\nexport function doubleTapZoom(zoom: number): number {\n return isZoomed(zoom) ? ZOOM_MIN : ZOOM_DOUBLE_TAP\n}\n\nexport function stepZoom(zoom: number, direction: 1 | -1): number {\n return clampZoom(zoom * ZOOM_STEP ** direction)\n}\n","import type { ImageVariants } from '../../image/image.variants'\nimport { fitSize, rotatedSize, type Size } from './zoom'\n\nexport interface Rect {\n x: number\n y: number\n width: number\n height: number\n}\n\nexport interface Pose {\n x: number\n y: number\n scale: number\n rotate: number\n clipPath: string\n}\n\nexport const REST_POSE: Pose = {\n x: 0,\n y: 0,\n scale: 1,\n rotate: 0,\n clipPath: 'inset(0px 0px 0px 0px round 0px)',\n}\nexport const TRAVEL_SPRING = { type: 'spring', visualDuration: 0.3, bounce: 0 } as const\nexport const RETURN_SPRING = { ...TRAVEL_SPRING, visualDuration: 0.22 } as const\nexport const DISMISS_SCALE = 0.7\nexport const DISMISS_TRAVEL = 0.3\nexport const DISMISS_COMMIT = 0.5\nexport const DISMISS_VELOCITY = 600\n\nfunction px(value: number): string {\n return `${Math.round(value * 100) / 100}px`\n}\n\nexport function fitRect(natural: Size, stage: Size, rotation = 0): Rect {\n const size = fitSize(natural, stage, rotation)\n return {\n x: (stage.width - size.width) / 2,\n y: (stage.height - size.height) / 2,\n width: size.width,\n height: size.height,\n }\n}\n\nexport function renderedRect(box: Rect, natural: Size, fit: ImageVariants['fit'] = 'cover'): Rect {\n if (fit === 'fill' || natural.width <= 0 || natural.height <= 0) return { ...box }\n const contain = Math.min(box.width / natural.width, box.height / natural.height)\n const cover = Math.max(box.width / natural.width, box.height / natural.height)\n const scale =\n fit === 'cover'\n ? cover\n : fit === 'contain'\n ? contain\n : fit === 'none'\n ? 1\n : Math.min(contain, 1)\n const width = natural.width * scale\n const height = natural.height * scale\n return {\n x: box.x + (box.width - width) / 2,\n y: box.y + (box.height - height) / 2,\n width,\n height,\n }\n}\n\nfunction intersect(a: Rect, b: Rect): Rect {\n const x = Math.max(a.x, b.x)\n const y = Math.max(a.y, b.y)\n const right = Math.min(a.x + a.width, b.x + b.width)\n const bottom = Math.min(a.y + a.height, b.y + b.height)\n return { x, y, width: Math.max(0, right - x), height: Math.max(0, bottom - y) }\n}\n\nexport function openPose(\n frame: Rect,\n box: Rect,\n natural: Size,\n fit?: ImageVariants['fit'],\n radius = 0,\n): Pose {\n const rendered = renderedRect(box, natural, fit)\n if (frame.width <= 0 || frame.height <= 0 || rendered.width <= 0) return REST_POSE\n const scale = rendered.width / frame.width\n const visible = intersect(box, rendered)\n const top = (visible.y - rendered.y) / scale\n const left = (visible.x - rendered.x) / scale\n const right = (rendered.x + rendered.width - visible.x - visible.width) / scale\n const bottom = (rendered.y + rendered.height - visible.y - visible.height) / scale\n const corner = Math.max(0, radius) / scale\n return {\n x: rendered.x + rendered.width / 2 - (frame.x + frame.width / 2),\n y: rendered.y + rendered.height / 2 - (frame.y + frame.height / 2),\n scale,\n rotate: 0,\n clipPath: `inset(${px(top)} ${px(right)} ${px(bottom)} ${px(left)} round ${px(corner)})`,\n }\n}\n\nexport function baseScale(frame: Size, stage: Size, rotation: number): number {\n const visual = rotatedSize(frame, rotation)\n if (visual.width <= 0 || visual.height <= 0) return 1\n if (rotation % 180 === 0) return 1\n return Math.min(stage.width / visual.width, stage.height / visual.height)\n}\n\nexport function radiusOf(el: Element | null | undefined): number {\n for (let node = el, depth = 0; node && depth < 2; node = node.parentElement, depth += 1) {\n const value = Number.parseFloat(getComputedStyle(node).borderTopLeftRadius)\n if (value > 0) return value\n }\n return 0\n}\n\nexport function dismissProgress(offsetY: number, stageHeight: number): number {\n if (stageHeight <= 0) return 0\n return Math.min(1, Math.max(0, offsetY) / (stageHeight * DISMISS_TRAVEL))\n}\n\nexport function shouldDismiss(offsetY: number, velocityY: number, stageHeight: number): boolean {\n if (offsetY <= 0) return false\n return dismissProgress(offsetY, stageHeight) >= DISMISS_COMMIT || velocityY >= DISMISS_VELOCITY\n}\n","import { animate, useMotionValue, type ValueAnimationTransition } from 'motion-v'\nimport { TRANSITION, prefersReducedMotion, type TransitionName } from '../../../motion'\nimport { rubberBand } from '../utils/zoom'\nimport {\n DISMISS_SCALE,\n REST_POSE,\n RETURN_SPRING,\n TRAVEL_SPRING,\n dismissProgress,\n shouldDismiss,\n type Pose,\n} from '../utils/pose'\n\nconst FADE_POSE: Pose = { ...REST_POSE, scale: 0.98 }\n\ntype Timing = ValueAnimationTransition\n\nexport function useLightboxMotion(stageHeight: () => number, restScale: () => number) {\n const x = useMotionValue(0)\n const y = useMotionValue(0)\n const scale = useMotionValue(1)\n const rotate = useMotionValue(0)\n const clipPath = useMotionValue(REST_POSE.clipPath)\n const opacity = useMotionValue(1)\n const presence = useMotionValue(0)\n\n function timing(value: Timing) {\n return prefersReducedMotion() ? { duration: 0 } : value\n }\n\n function transition(name: TransitionName) {\n return timing(TRANSITION[name])\n }\n\n function settle(controls: { finished: Promise<unknown> }[]): Promise<void> {\n return Promise.all(controls.map(control => control.finished)).then(() => undefined)\n }\n\n function stop() {\n x.stop()\n y.stop()\n scale.stop()\n rotate.stop()\n presence.stop()\n }\n\n function jumpTo(pose: Pose) {\n x.jump(pose.x)\n y.jump(pose.y)\n scale.jump(pose.scale)\n rotate.jump(pose.rotate)\n clipPath.jump(pose.clipPath)\n }\n\n function nearestTurn(target: number): number {\n return target + Math.round((rotate.get() - target) / 360) * 360\n }\n\n function poseTo(pose: Pose, t: ReturnType<typeof timing>) {\n return [\n animate(x, pose.x, t),\n animate(y, pose.y, t),\n animate(scale, pose.scale, t),\n animate(rotate, nearestTurn(pose.rotate), t),\n animate(clipPath, pose.clipPath, t),\n ]\n }\n\n function enter(from: Pose | null): Promise<void> {\n const t = from ? timing(TRAVEL_SPRING) : transition('enterStrong')\n jumpTo(from ?? FADE_POSE)\n opacity.jump(from ? 1 : 0)\n presence.jump(0)\n return settle([...poseTo(REST_POSE, t), animate(opacity, 1, t), animate(presence, 1, t)])\n }\n\n function resume(): Promise<void> {\n stop()\n const t = timing(TRAVEL_SPRING)\n const rest = { ...REST_POSE, scale: restScale(), rotate: rotate.get() }\n return settle([...poseTo(rest, t), animate(opacity, 1, t), animate(presence, 1, t)])\n }\n\n function leave(to: Pose | null): Promise<void> {\n stop()\n const t = to ? timing(RETURN_SPRING) : transition('exit')\n const travel = to ? poseTo(to, t) : [animate(scale, FADE_POSE.scale, t), animate(opacity, 0, t)]\n return settle([...travel, animate(presence, 0, t)])\n }\n\n function dismissMove(offsetY: number) {\n y.set(offsetY < 0 ? rubberBand(offsetY, 0, Infinity, stageHeight()) : offsetY)\n const progress = dismissProgress(offsetY, stageHeight())\n scale.set(restScale() * (1 - (1 - DISMISS_SCALE) * progress))\n presence.set(1 - progress)\n }\n\n function dismissRelease(offsetY: number, velocityY: number): boolean {\n if (shouldDismiss(offsetY, velocityY, stageHeight())) return true\n const t = transition('press')\n animate(x, 0, t)\n animate(y, 0, t)\n animate(scale, restScale(), t)\n animate(presence, 1, t)\n return false\n }\n\n function dismissCancel() {\n animate(presence, 1, transition('fast'))\n }\n\n function turn(degrees: number) {\n const t = transition('base')\n animate(rotate, degrees, t)\n animate(scale, restScale(), t)\n animate(x, 0, t)\n animate(y, 0, t)\n }\n\n function reset(degrees: number) {\n x.jump(0)\n y.jump(0)\n rotate.jump(degrees)\n scale.jump(restScale())\n }\n\n return {\n x,\n y,\n scale,\n rotate,\n clipPath,\n opacity,\n presence,\n transition,\n stop,\n enter,\n resume,\n leave,\n dismissMove,\n dismissRelease,\n dismissCancel,\n turn,\n reset,\n }\n}\n","import type { Point } from './zoom'\n\nexport interface Touch extends Point {\n time: number\n}\n\nexport const DRAG_THRESHOLD = 4\nexport const TAP_MAX_DISTANCE = 10\nexport const TAP_MAX_MS = 300\nexport const DOUBLE_TAP_MS = 300\nexport const DOUBLE_TAP_DISTANCE = 25\nexport const WHEEL_LINE = 16\nexport const TRACKPAD_INTENSITY = 0.01\n\nexport const FLING = {\n power: 0.8,\n timeConstant: 750,\n bounceStiffness: 200,\n bounceDamping: 40,\n restDelta: 1,\n restSpeed: 10,\n} as const\n\nexport function midpoint(a: Point, b: Point): Point {\n return { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 }\n}\n\nexport function distance(a: Point, b: Point): number {\n return Math.hypot(b.x - a.x, b.y - a.y)\n}\n\nexport function dragAxis(start: Point, current: Point): 'x' | 'y' | null {\n const dx = Math.abs(current.x - start.x)\n const dy = Math.abs(current.y - start.y)\n if (Math.max(dx, dy) < DRAG_THRESHOLD) return null\n return dx > dy ? 'x' : 'y'\n}\n\nexport function isTap(start: Touch, end: Touch): boolean {\n return distance(start, end) <= TAP_MAX_DISTANCE && end.time - start.time <= TAP_MAX_MS\n}\n\nexport function isDoubleTap(previous: Touch | null, next: Touch): boolean {\n if (!previous) return false\n return (\n next.time - previous.time <= DOUBLE_TAP_MS && distance(previous, next) <= DOUBLE_TAP_DISTANCE\n )\n}\n\nexport function wheelDelta(deltaY: number, deltaMode: number, stageHeight: number): number {\n if (deltaMode === 1) return deltaY * WHEEL_LINE\n if (deltaMode === 2) return deltaY * stageHeight\n return deltaY\n}\n","import { onBeforeUnmount, shallowRef } from 'vue'\nimport { animate } from 'motion-v'\nimport { prefersReducedMotion, type TransitionName } from '../../../motion'\nimport type { useLightboxMotion } from './useLightboxMotion'\nimport { FLING, TRACKPAD_INTENSITY } from '../utils/gesture'\nimport {\n WHEEL_INTENSITY,\n ZOOM_MIN,\n clampOffset,\n clampZoom,\n doubleTapZoom,\n elasticOffset,\n elasticZoom,\n isZoomed,\n panBounds,\n stepZoom,\n wheelZoom,\n zoomAbout,\n type Bounds,\n type Point,\n type Size,\n} from '../utils/zoom'\n\nexport interface PinchStart {\n distance: number\n zoom: number\n mid: Point\n offset: Point\n}\n\nexport function useLightboxZoom(\n motion: ReturnType<typeof useLightboxMotion>,\n geometry: () => { fit: Size; stage: Size; base: number },\n) {\n const { x, y, scale } = motion\n const zoomed = shallowRef(false)\n const unsubscribe = scale.on('change', value => {\n zoomed.value = isZoomed(value / geometry().base)\n })\n onBeforeUnmount(unsubscribe)\n\n const zoom = () => scale.get() / geometry().base\n const offset = (): Point => ({ x: x.get(), y: y.get() })\n\n function bounds(level = zoom()): Bounds {\n const { fit, stage } = geometry()\n return panBounds({ width: fit.width * level, height: fit.height * level }, stage)\n }\n\n function place(level: number, next: Point) {\n x.stop()\n y.stop()\n scale.stop()\n scale.set(level * geometry().base)\n x.set(next.x)\n y.set(next.y)\n }\n\n function target(level: number, focal: Point): { level: number; offset: Point } {\n const clamped = clampZoom(level)\n if (!isZoomed(clamped)) return { level: ZOOM_MIN, offset: { x: 0, y: 0 } }\n return {\n level: clamped,\n offset: clampOffset(zoomAbout(offset(), zoom(), clamped, focal), bounds(clamped)),\n }\n }\n\n function zoomTo(level: number, focal: Point, name: TransitionName = 'base') {\n const to = target(level, focal)\n const t = motion.transition(name)\n animate(scale, to.level * geometry().base, t)\n animate(x, to.offset.x, t)\n animate(y, to.offset.y, t)\n }\n\n function step(direction: 1 | -1) {\n zoomTo(stepZoom(zoom(), direction), { x: 0, y: 0 })\n }\n\n function reset() {\n zoomTo(ZOOM_MIN, { x: 0, y: 0 })\n }\n\n function wheel(delta: number, focal: Point, trackpad: boolean) {\n const intensity = trackpad ? TRACKPAD_INTENSITY : WHEEL_INTENSITY\n const to = target(wheelZoom(zoom(), delta, intensity), focal)\n place(to.level, to.offset)\n }\n\n function doubleTap(focal: Point) {\n zoomTo(doubleTapZoom(zoom()), focal)\n }\n\n function pinch(start: PinchStart, mid: Point, ratio: number) {\n const level = elasticZoom(start.zoom * ratio)\n const about = zoomAbout(start.offset, start.zoom, level, start.mid)\n place(level, { x: about.x + mid.x - start.mid.x, y: about.y + mid.y - start.mid.y })\n }\n\n function settle(focal: Point) {\n zoomTo(zoom(), focal, 'press')\n }\n\n function pan(origin: Point, delta: Point) {\n const next = elasticOffset(\n { x: origin.x + delta.x, y: origin.y + delta.y },\n bounds(),\n geometry().stage,\n )\n x.set(next.x)\n y.set(next.y)\n }\n\n function glide(value: typeof x, min: number, max: number) {\n const from = value.get()\n const velocity = value.getVelocity()\n const target = Math.min(Math.max(from + FLING.power * velocity, min), max)\n if (target === from && velocity === 0) return\n animate(value, target, { type: 'inertia', velocity, min, max, ...FLING })\n }\n\n function fling() {\n const b = bounds()\n if (prefersReducedMotion()) {\n const clamped = clampOffset(offset(), b)\n x.set(clamped.x)\n y.set(clamped.y)\n return\n }\n glide(x, b.minX, b.maxX)\n glide(y, b.minY, b.maxY)\n }\n\n return {\n zoomed,\n zoom,\n isZoomed: () => isZoomed(zoom()),\n zoomTo,\n step,\n reset,\n wheel,\n doubleTap,\n pinch,\n settle,\n pan,\n fling,\n }\n}\n","import { shallowRef } from 'vue'\nimport type { useLightboxMotion } from './useLightboxMotion'\nimport type { PinchStart, useLightboxZoom } from './useLightboxZoom'\nimport {\n distance,\n dragAxis,\n isDoubleTap,\n isTap,\n midpoint,\n wheelDelta,\n type Touch,\n} from '../utils/gesture'\nimport type { Point } from '../utils/zoom'\n\nexport type GestureMode = 'idle' | 'pending' | 'pan' | 'pinch' | 'dismiss' | 'page' | 'none'\n\nexport function useLightboxGesture(options: {\n stage: () => HTMLElement | undefined\n motion: ReturnType<typeof useLightboxMotion>\n zoom: ReturnType<typeof useLightboxZoom>\n paging: {\n grab: () => boolean\n move: (offset: number) => void\n release: (offset: number) => void\n settle: () => void\n }\n enabled: () => boolean\n interrupt: () => void\n inside: (target: EventTarget | null) => boolean\n dismiss: () => void\n tapOutside: () => void\n}) {\n const { motion, zoom, paging } = options\n const mode = shallowRef<GestureMode>('idle')\n const pointers = new Map<number, Point>()\n let start: Touch = { x: 0, y: 0, time: 0 }\n let origin: Point = { x: 0, y: 0 }\n let delta: Point = { x: 0, y: 0 }\n let pinch: PinchStart | null = null\n let lastMid: Point = { x: 0, y: 0 }\n let lastTap: Touch | null = null\n let startInside = false\n let takeover = false\n let busyTap: Touch | null = null\n\n function relative(point: Point): Point {\n const rect = options.stage()?.getBoundingClientRect()\n if (!rect) return point\n return { x: point.x - rect.x - rect.width / 2, y: point.y - rect.y - rect.height / 2 }\n }\n\n function capture(event: PointerEvent, on: boolean) {\n const stage = options.stage()\n if (!stage) return\n try {\n if (on) stage.setPointerCapture(event.pointerId)\n else stage.releasePointerCapture(event.pointerId)\n } catch {\n return\n }\n }\n\n function isControl(target: EventTarget | null): boolean {\n return (\n target instanceof Element &&\n !!target.closest('button, a, input, [role=\"button\"], [data-hn-chrome]')\n )\n }\n\n function pair(): [Point, Point] | null {\n const list = [...pointers.values()]\n return list.length >= 2 ? [list[0]!, list[1]!] : null\n }\n\n function onPointerdown(event: PointerEvent) {\n if (event.pointerType === 'mouse' && event.button !== 0) return\n if (isControl(event.target)) return\n if (!options.enabled()) {\n busyTap = { x: event.clientX, y: event.clientY, time: event.timeStamp }\n return\n }\n capture(event, true)\n pointers.set(event.pointerId, { x: event.clientX, y: event.clientY })\n if (pointers.size === 1) {\n motion.stop()\n takeover = paging.grab()\n start = { x: event.clientX, y: event.clientY, time: event.timeStamp }\n origin = { x: motion.x.get(), y: motion.y.get() }\n delta = { x: 0, y: 0 }\n startInside = options.inside(event.target)\n mode.value = 'pending'\n return\n }\n const points = pair()\n if (!points || pointers.size !== 2) return\n if (mode.value === 'dismiss') motion.dismissCancel()\n paging.settle()\n lastMid = relative(midpoint(...points))\n pinch = {\n distance: distance(...points),\n zoom: zoom.zoom(),\n mid: lastMid,\n offset: { x: motion.x.get(), y: motion.y.get() },\n }\n mode.value = 'pinch'\n }\n\n function onPointermove(event: PointerEvent) {\n if (!pointers.has(event.pointerId)) return\n pointers.set(event.pointerId, { x: event.clientX, y: event.clientY })\n if (mode.value === 'pinch') {\n const points = pair()\n if (!points || !pinch) return\n lastMid = relative(midpoint(...points))\n zoom.pinch(pinch, lastMid, distance(...points) / pinch.distance)\n return\n }\n if (pointers.size !== 1) return\n const point = { x: event.clientX, y: event.clientY }\n if (mode.value === 'pending') {\n const axis = dragAxis(start, point)\n if (!axis) return\n mode.value = zoom.isZoomed() ? 'pan' : axis === 'y' ? 'dismiss' : 'page'\n if (mode.value !== 'page') paging.settle()\n }\n delta = { x: point.x - start.x, y: point.y - start.y }\n if (mode.value === 'pan') zoom.pan(origin, delta)\n else if (mode.value === 'dismiss') motion.dismissMove(origin.y + delta.y)\n else if (mode.value === 'page') paging.move(delta.x)\n }\n\n function finish(event: PointerEvent, cancelled: boolean) {\n if (busyTap) {\n const end: Touch = { x: event.clientX, y: event.clientY, time: event.timeStamp }\n if (!cancelled && isTap(busyTap, end)) options.interrupt()\n busyTap = null\n return\n }\n if (!pointers.has(event.pointerId)) return\n pointers.delete(event.pointerId)\n capture(event, false)\n if (mode.value === 'pinch') {\n zoom.settle(lastMid)\n pinch = null\n mode.value = pointers.size ? 'none' : 'idle'\n return\n }\n if (pointers.size) return\n const current = mode.value\n mode.value = 'idle'\n if (current === 'pan') {\n zoom.fling()\n return\n }\n if (current === 'page') {\n if (cancelled) paging.settle()\n else paging.release(delta.x)\n return\n }\n if (current === 'dismiss') {\n const velocity = cancelled ? 0 : motion.y.getVelocity()\n if (motion.dismissRelease(motion.y.get(), velocity)) options.dismiss()\n return\n }\n paging.release(0)\n if (cancelled || current !== 'pending') return\n const end: Touch = { x: event.clientX, y: event.clientY, time: event.timeStamp }\n if (!isTap(start, end)) return\n if (takeover) {\n lastTap = null\n return\n }\n if (!startInside) {\n lastTap = null\n options.tapOutside()\n return\n }\n if (isDoubleTap(lastTap, end)) {\n lastTap = null\n zoom.doubleTap(relative(end))\n } else {\n lastTap = end\n }\n }\n\n function onPointerup(event: PointerEvent) {\n finish(event, false)\n }\n\n function onPointercancel(event: PointerEvent) {\n finish(event, true)\n }\n\n function onWheel(event: WheelEvent) {\n if (isControl(event.target)) return\n event.preventDefault()\n if (!options.enabled()) return\n const height = options.stage()?.clientHeight ?? 0\n const delta = wheelDelta(event.deltaY, event.deltaMode, height)\n zoom.wheel(delta, relative({ x: event.clientX, y: event.clientY }), event.ctrlKey)\n }\n\n return { mode, onPointerdown, onPointermove, onPointerup, onPointercancel, onWheel }\n}\n","import { rubberBand } from './zoom'\n\nexport const PAGE_COMMIT = 0.2\nexport const PAGE_VELOCITY = 400\nexport const PAGE_PROJECTION = 0.25\n\nexport function pageSteps(offset: number, velocity: number, width: number): number {\n if (width <= 0) return 0\n if (Math.abs(offset) < width * PAGE_COMMIT && Math.abs(velocity) < PAGE_VELOCITY) return 0\n const projected = offset + velocity * PAGE_PROJECTION\n if (projected === 0) return 0\n return projected < 0 ? 1 : -1\n}\n\nexport function clampIndex(index: number, count: number): number {\n if (count <= 0) return 0\n return Math.min(Math.max(index, 0), count - 1)\n}\n\nexport function wrapIndex(index: number, count: number): number {\n if (count <= 0) return 0\n return ((index % count) + count) % count\n}\n\nexport function shortestDelta(delta: number, count: number): number {\n if (count <= 0) return 0\n const forward = wrapIndex(delta, count)\n return forward > count / 2 ? forward - count : forward\n}\n\nexport function edgePosition(raw: number, count: number, width: number): number {\n return rubberBand(raw, -Math.max(0, count - 1) * width, 0, width)\n}\n","import { onBeforeUnmount, shallowRef, type Ref } from 'vue'\nimport { animate, useMotionValue, type ValueAnimationTransition } from 'motion-v'\nimport { prefersReducedMotion } from '../../../motion'\nimport { clampIndex, edgePosition, pageSteps, shortestDelta, wrapIndex } from '../utils/paging'\nimport { TRAVEL_SPRING } from '../utils/pose'\n\nconst PAGE_EPSILON = 0.001\n\nexport function useLightboxPaging(options: {\n index: Ref<number>\n count: () => number\n width: () => number\n loop: () => boolean\n}) {\n const stripX = useMotionValue(0)\n const position = shallowRef(0)\n const low = shallowRef(0)\n const high = shallowRef(0)\n let origin = 0\n\n function looping(): boolean {\n return options.loop() && options.count() > 1\n }\n\n function rest(at: number): number {\n return -at * options.width()\n }\n\n function track(value: number) {\n const width = options.width()\n const page = width > 0 ? -value / width : position.value\n const nextLow = Math.floor(page + PAGE_EPSILON)\n const nextHigh = Math.ceil(page - PAGE_EPSILON)\n if (nextLow !== low.value) low.value = nextLow\n if (nextHigh !== high.value) high.value = nextHigh\n }\n\n const untrack = stripX.on('change', track)\n onBeforeUnmount(untrack)\n\n function sync() {\n position.value = options.index.value\n stripX.jump(rest(position.value))\n track(stripX.get())\n }\n\n function range(): [number, number] {\n return [low.value, high.value]\n }\n\n function grab(): boolean {\n stripX.stop()\n origin = stripX.get()\n return Math.abs(origin - rest(position.value)) > PAGE_EPSILON\n }\n\n function move(offset: number) {\n const raw = origin + offset\n stripX.set(looping() ? raw : edgePosition(raw, options.count(), options.width()))\n }\n\n function travel(to: number, transition: ValueAnimationTransition<number>): boolean {\n const count = options.count()\n const target = looping() ? to : clampIndex(to, count)\n const real = looping() ? wrapIndex(target, count) : target\n const changed = real !== options.index.value\n position.value = target\n if (changed) options.index.value = real\n animate(stripX, rest(target), transition)\n return changed\n }\n\n function withVelocity(velocity: number): ValueAnimationTransition<number> {\n return prefersReducedMotion() ? { duration: 0 } : { ...TRAVEL_SPRING, velocity }\n }\n\n function go(to: number): boolean {\n const target = looping()\n ? position.value + shortestDelta(to - options.index.value, options.count())\n : to\n return travel(target, withVelocity(0))\n }\n\n function release(offset: number) {\n const width = options.width()\n const velocity = stripX.getVelocity()\n const from = width > 0 ? Math.round(-origin / width) : position.value\n travel(from + pageSteps(offset, velocity, width), withVelocity(velocity))\n }\n\n function settle() {\n if (stripX.get() !== rest(position.value)) travel(position.value, withVelocity(0))\n }\n\n return { stripX, position, range, sync, grab, move, release, go, settle }\n}\n","import { reactive, shallowRef } from 'vue'\nimport type { LightboxItem } from '../types'\nimport { fitRect, type Rect } from '../utils/pose'\nimport type { Size } from '../utils/zoom'\n\nexport function useLightboxFrames(items: () => LightboxItem[]) {\n const stage = shallowRef<Size>({ width: 0, height: 0 })\n const naturals = reactive(new Map<string, Size>())\n\n function measure(el: HTMLElement | undefined) {\n stage.value = { width: el?.clientWidth ?? 0, height: el?.clientHeight ?? 0 }\n }\n\n function read() {\n for (const item of items()) {\n const el = item.source?.()\n if (el?.naturalWidth && el.naturalHeight) {\n naturals.set(item.id, { width: el.naturalWidth, height: el.naturalHeight })\n }\n }\n }\n\n function learn(id: string, img: HTMLImageElement) {\n if (naturals.has(id) || !img.naturalWidth || !img.naturalHeight) return\n naturals.set(id, { width: img.naturalWidth, height: img.naturalHeight })\n }\n\n function naturalOf(item: LightboxItem | undefined): Size | undefined {\n return item ? naturals.get(item.id) : undefined\n }\n\n function frameOf(item: LightboxItem | undefined): Rect {\n const natural = naturalOf(item)\n return natural ? fitRect(natural, stage.value) : { x: 0, y: 0, ...stage.value }\n }\n\n return { stage, measure, read, learn, naturalOf, frameOf }\n}\n","import { onBeforeUnmount, shallowRef, watch } from 'vue'\nimport type { LightboxItem } from '../types'\n\nexport const LARGE_HINT_DELAY_MS = 800\n\nexport function useLightboxLarge(item: () => LightboxItem | undefined, active: () => boolean) {\n const src = shallowRef<string>()\n const ready = shallowRef(false)\n const waiting = shallowRef(false)\n let loader: HTMLImageElement | null = null\n let timer: ReturnType<typeof setTimeout> | null = null\n\n function reset() {\n if (loader) loader.src = ''\n loader = null\n if (timer) clearTimeout(timer)\n timer = null\n src.value = undefined\n ready.value = false\n waiting.value = false\n }\n\n function load(target: LightboxItem) {\n const url = target.preview\n if (!url || url === target.src) return\n src.value = url\n const img = new Image()\n loader = img\n img.decoding = 'async'\n img.src = url\n timer = setTimeout(() => {\n if (loader === img && !ready.value) waiting.value = true\n }, LARGE_HINT_DELAY_MS)\n const done = () => {\n if (loader !== img) return\n if (timer) clearTimeout(timer)\n timer = null\n waiting.value = false\n ready.value = true\n }\n const decode = typeof img.decode === 'function' ? img.decode() : Promise.resolve()\n decode.then(done, () => {\n if (loader !== img) return\n if (timer) clearTimeout(timer)\n timer = null\n waiting.value = false\n })\n }\n\n watch(\n () => [active() ? item() : undefined] as const,\n ([target]) => {\n reset()\n if (target) load(target)\n },\n { immediate: true },\n )\n\n onBeforeUnmount(reset)\n\n return { src, ready, waiting }\n}\n","import type { useLightboxFrames } from './useLightboxFrames'\nimport { openPose, radiusOf, type Pose, type Rect } from '../utils/pose'\nimport type { LightboxItem } from '../types'\n\nexport function useLightboxPose(\n frames: ReturnType<typeof useLightboxFrames>,\n current: () => LightboxItem | undefined,\n) {\n function sourceBox(): Rect | null {\n const el = current()?.source?.()\n if (!el?.isConnected) return null\n const rect = el.getBoundingClientRect()\n if (rect.width <= 0 || rect.height <= 0) return null\n const stage = frames.stage.value\n if (\n rect.bottom <= 0 ||\n rect.right <= 0 ||\n rect.top >= stage.height ||\n rect.left >= stage.width\n ) {\n return null\n }\n return { x: rect.x, y: rect.y, width: rect.width, height: rect.height }\n }\n\n function fromSource(): Pose | null {\n const item = current()\n const box = sourceBox()\n const natural = frames.naturalOf(item)\n if (!box || !natural) return null\n return openPose(frames.frameOf(item), box, natural, item?.fit, radiusOf(item?.source?.()))\n }\n\n return { fromSource }\n}\n","import { nextTick, shallowRef, type Ref } from 'vue'\nimport type { useLightboxMotion } from './useLightboxMotion'\nimport type { Pose } from '../utils/pose'\n\nexport type LightboxPhase = 'closed' | 'entering' | 'open' | 'closing'\n\nexport function useLightboxPhase(options: {\n open: Ref<boolean>\n mounted: Ref<boolean>\n locked: Ref<boolean>\n motion: ReturnType<typeof useLightboxMotion>\n pose: () => Pose | null\n prepare: () => void\n layout: () => void\n}) {\n const { motion } = options\n const phase = shallowRef<LightboxPhase>('closed')\n let generation = 0\n\n async function show() {\n if (phase.value !== 'closed') return\n phase.value = 'entering'\n const run = ++generation\n options.prepare()\n options.mounted.value = true\n options.locked.value = true\n await nextTick()\n options.layout()\n await motion.enter(options.pose())\n if (run === generation) phase.value = 'open'\n }\n\n async function reopen() {\n if (phase.value !== 'closing') return\n phase.value = 'entering'\n const run = ++generation\n await motion.resume()\n if (run === generation) phase.value = 'open'\n }\n\n async function close() {\n if (phase.value === 'closed' || phase.value === 'closing') return\n phase.value = 'closing'\n const run = ++generation\n await motion.leave(options.pose())\n if (run !== generation) return\n phase.value = 'closed'\n options.mounted.value = false\n options.locked.value = false\n if (options.open.value) options.open.value = false\n }\n\n function interrupt() {\n if (phase.value === 'entering') void close()\n else if (phase.value === 'closing') void reopen()\n }\n\n return { current: () => phase.value, show, close, reopen, interrupt }\n}\n","import { useTransform } from 'motion-v'\nimport type { useLightboxMotion } from './useLightboxMotion'\nimport type { useLightboxFrames } from './useLightboxFrames'\nimport type { useLightboxPaging } from './useLightboxPaging'\nimport type { LightboxItem } from '../types'\n\nexport function useLightboxHint(options: {\n motion: ReturnType<typeof useLightboxMotion>\n frames: ReturnType<typeof useLightboxFrames>\n paging: ReturnType<typeof useLightboxPaging>\n current: () => LightboxItem | undefined\n}) {\n const { motion, frames, paging } = options\n\n function corner() {\n const frame = frames.frameOf(options.current())\n const stage = frames.stage.value\n const scale = motion.scale.get()\n const angle = (motion.rotate.get() * Math.PI) / 180\n const cos = Math.abs(Math.cos(angle))\n const sin = Math.abs(Math.sin(angle))\n const width = (frame.width * cos + frame.height * sin) * scale\n const height = (frame.width * sin + frame.height * cos) * scale\n const centerX =\n paging.stripX.get() + paging.position.value * stage.width + frame.x + frame.width / 2\n const centerY = frame.y + frame.height / 2 + motion.y.get()\n return {\n x: Math.min(centerX + motion.x.get() + width / 2, stage.width),\n y: Math.max(centerY - height / 2, 0),\n }\n }\n\n const x = useTransform(() => corner().x)\n const y = useTransform(() => corner().y)\n\n return { x, y }\n}\n","import { computed } from 'vue'\nimport type { useLightboxPaging } from './useLightboxPaging'\nimport { wrapIndex } from '../utils/paging'\nimport type { LightboxItem } from '../types'\n\nexport interface LightboxSlide {\n item: LightboxItem\n at: number\n key: string\n}\n\nexport function useLightboxSlides(\n paging: ReturnType<typeof useLightboxPaging>,\n items: () => LightboxItem[],\n looping: () => boolean,\n) {\n return computed<LightboxSlide[]>(() => {\n const list = items()\n const count = list.length\n const [low, high] = paging.range()\n const loop = looping()\n const from = loop ? low - 1 : Math.max(0, low - 1)\n const to = loop ? high + 1 : Math.min(count - 1, high + 1)\n const slides: LightboxSlide[] = []\n for (let at = from; at <= to; at += 1) {\n const item = list[wrapIndex(at, count)]\n if (item) slides.push({ item, at, key: loop ? `${item.id}@${at}` : item.id })\n }\n return slides\n })\n}\n","import { reactive } from 'vue'\nimport type { useLightboxFrames } from './useLightboxFrames'\nimport { baseScale } from '../utils/pose'\nimport { rotatedSize } from '../utils/zoom'\nimport type { LightboxItem } from '../types'\n\nexport function useLightboxRotation(\n frames: ReturnType<typeof useLightboxFrames>,\n current: () => LightboxItem | undefined,\n) {\n const rotations = reactive(new Map<string, number>())\n\n function rotationOf(item: LightboxItem | undefined): number {\n return item ? (rotations.get(item.id) ?? 0) : 0\n }\n\n function baseOf(item: LightboxItem | undefined): number {\n return baseScale(frames.frameOf(item), frames.stage.value, rotationOf(item) % 360)\n }\n\n function geometry() {\n const item = current()\n const base = baseOf(item)\n const visual = rotatedSize(frames.frameOf(item), rotationOf(item) % 360)\n return {\n fit: { width: visual.width * base, height: visual.height * base },\n stage: frames.stage.value,\n base,\n }\n }\n\n function clear() {\n rotations.clear()\n }\n\n function advance(): number {\n const item = current()\n if (!item) return 0\n rotations.set(item.id, rotationOf(item) + 90)\n return rotationOf(item)\n }\n\n function drop(item: LightboxItem | undefined) {\n if (item) rotations.set(item.id, Math.round(rotationOf(item) / 360) * 360)\n }\n\n return { rotationOf, baseOf, geometry, clear, advance, drop }\n}\n","export function fileNameOf(url: string, fallback = 'image'): string {\n try {\n const parsed = new URL(url, 'http://localhost')\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') return fallback\n const name = decodeURIComponent(parsed.pathname.split('/').filter(Boolean).pop() ?? '')\n return name || fallback\n } catch {\n return fallback\n }\n}\n\nexport async function saveImage(url: string): Promise<'saved' | 'opened'> {\n try {\n const response = await fetch(url, { mode: 'cors' })\n if (!response.ok) throw new Error(String(response.status))\n const blob = await response.blob()\n const href = URL.createObjectURL(blob)\n const anchor = Object.assign(document.createElement('a'), {\n href,\n download: fileNameOf(url),\n })\n anchor.click()\n setTimeout(() => URL.revokeObjectURL(href), 0)\n return 'saved'\n } catch {\n window.open(url, '_blank', 'noopener')\n return 'opened'\n }\n}\n","<script setup lang=\"ts\">\n import { computed, onMounted, shallowRef, watch } from 'vue'\n import { DialogRoot, DialogPortal, DialogContent, DialogTitle, useBodyScrollLock } from 'reka-ui'\n import { Motion } from 'motion-v'\n import { useEventListener } from '@vueuse/core'\n import { cn } from '../../lib/cn'\n import VisuallyHidden from '../visually-hidden/VisuallyHidden.vue'\n import LightboxStrip from './LightboxStrip.vue'\n import LightboxChrome from './LightboxChrome.vue'\n import { useLightboxMotion } from './composables/useLightboxMotion'\n import { useLightboxZoom } from './composables/useLightboxZoom'\n import { useLightboxGesture } from './composables/useLightboxGesture'\n import { useLightboxPaging } from './composables/useLightboxPaging'\n import { useLightboxFrames } from './composables/useLightboxFrames'\n import { useLightboxLarge } from './composables/useLightboxLarge'\n import { useLightboxPose } from './composables/useLightboxPose'\n import { useLightboxPhase } from './composables/useLightboxPhase'\n import { useLightboxHint } from './composables/useLightboxHint'\n import { useLightboxSlides } from './composables/useLightboxSlides'\n import { useLightboxRotation } from './composables/useLightboxRotation'\n import { clampIndex } from './utils/paging'\n import { saveImage } from './utils/download'\n import type { LightboxItem } from './types'\n\n defineOptions({ name: 'HnLightbox' })\n\n const props = defineProps<{\n items: LightboxItem[]\n loop?: boolean\n class?: string\n }>()\n\n const open = defineModel<boolean>('open', { default: false })\n const index = defineModel<number>('index', { default: 0 })\n\n const mounted = shallowRef(false)\n const stageEl = shallowRef<HTMLElement>()\n const count = computed(() => props.items.length)\n const current = computed(() => props.items[index.value])\n\n const frames = useLightboxFrames(() => props.items)\n const pose = useLightboxPose(frames, () => current.value)\n const rotation = useLightboxRotation(frames, () => current.value)\n const locked = useBodyScrollLock(false)\n\n const motion = useLightboxMotion(\n () => frames.stage.value.height,\n () => rotation.baseOf(current.value),\n )\n\n const zoom = useLightboxZoom(motion, rotation.geometry)\n\n const paging = useLightboxPaging({\n index,\n count: () => count.value,\n width: () => frames.stage.value.width,\n loop: () => !!props.loop,\n })\n\n function measure() {\n frames.measure(stageEl.value)\n paging.sync()\n }\n\n const phase = useLightboxPhase({\n open,\n mounted,\n locked,\n motion,\n pose: pose.fromSource,\n prepare: () => {\n rotation.clear()\n frames.read()\n },\n layout: measure,\n })\n\n const close = phase.close\n\n const gesture = useLightboxGesture({\n stage: () => stageEl.value,\n motion,\n zoom,\n paging,\n enabled: () => phase.current() === 'open',\n interrupt: phase.interrupt,\n inside: target => target instanceof Element && !!target.closest('[data-hn-frame]'),\n dismiss: () => void close(),\n tapOutside: () => void close(),\n })\n\n const large = useLightboxLarge(\n () => current.value,\n () => mounted.value,\n )\n\n const hint = useLightboxHint({ motion, frames, paging, current: () => current.value })\n\n const looping = computed(() => !!props.loop && count.value > 1)\n const slides = useLightboxSlides(\n paging,\n () => props.items,\n () => looping.value,\n )\n\n function go(to: number) {\n if (zoom.isZoomed()) zoom.reset()\n paging.go(to)\n }\n\n function rotate() {\n if (phase.current() === 'open') motion.turn(rotation.advance())\n }\n\n function download() {\n const item = current.value\n if (item) void saveImage(item.preview || item.src)\n }\n\n watch(open, value => {\n if (value) void phase.show()\n else void close()\n })\n\n watch(index, (to, from) => {\n rotation.drop(props.items[from])\n motion.reset(rotation.rotationOf(props.items[to]))\n })\n\n watch(count, () => {\n const clamped = clampIndex(index.value, count.value)\n if (clamped !== index.value) index.value = clamped\n if (mounted.value) paging.sync()\n })\n\n onMounted(() => {\n if (open.value) void phase.show()\n })\n\n useEventListener('resize', () => {\n if (mounted.value) measure()\n })\n\n function onEscape(event: Event) {\n event.preventDefault()\n void close()\n }\n\n function onKeydown(event: KeyboardEvent) {\n if (phase.current() !== 'open') return\n if (event.key === 'ArrowLeft') go(index.value - 1)\n else if (event.key === 'ArrowRight') go(index.value + 1)\n else return\n event.preventDefault()\n }\n\n const currentStyle = computed(() => {\n const frame = frames.frameOf(current.value)\n return {\n left: `${frame.x}px`,\n top: `${frame.y}px`,\n width: `${frame.width}px`,\n height: `${frame.height}px`,\n x: motion.x,\n y: motion.y,\n scale: motion.scale,\n rotate: motion.rotate,\n clipPath: motion.clipPath,\n opacity: motion.opacity,\n }\n })\n\n const currentClass = computed(() =>\n cn(\n 'absolute will-change-transform',\n !zoom.zoomed.value && 'cursor-zoom-in',\n zoom.zoomed.value && (gesture.mode.value === 'pan' ? 'cursor-grabbing' : 'cursor-grab'),\n ),\n )\n</script>\n\n<template>\n <DialogRoot :open=\"mounted\" @update:open=\"value => !value && close()\">\n <DialogPortal>\n <DialogContent\n as-child\n :aria-describedby=\"undefined\"\n @escape-key-down=\"onEscape\"\n @interact-outside=\"event => event.preventDefault()\"\n >\n <div\n ref=\"stageEl\"\n :data-hn-phase=\"phase.current()\"\n :class=\"\n cn(\n 'dark fixed inset-0 z-(--hn-z-overlay) touch-none outline-none select-none',\n props.class,\n )\n \"\n @pointerdown=\"gesture.onPointerdown\"\n @pointermove=\"gesture.onPointermove\"\n @pointerup=\"gesture.onPointerup\"\n @pointercancel=\"gesture.onPointercancel\"\n @wheel=\"gesture.onWheel\"\n @keydown=\"onKeydown\"\n >\n <div aria-hidden=\"true\" class=\"pointer-events-none absolute inset-0 isolate\">\n <Motion class=\"hn-scrim\" :style=\"{ opacity: motion.presence }\" />\n </div>\n <LightboxStrip\n :slides=\"slides\"\n :index=\"paging.position.value\"\n :width=\"frames.stage.value.width\"\n :strip-x=\"paging.stripX\"\n :current-class=\"currentClass\"\n :current-style=\"currentStyle\"\n :frame-of=\"frames.frameOf\"\n :rotation-of=\"rotation.rotationOf\"\n :base-of=\"rotation.baseOf\"\n :transition=\"motion.transition('base')\"\n :large-src=\"large.src.value\"\n :large-ready=\"large.ready.value\"\n @learn=\"frames.learn\"\n />\n <DialogTitle as-child>\n <VisuallyHidden>{{ current?.alt }}</VisuallyHidden>\n </DialogTitle>\n <LightboxChrome\n :items=\"props.items\"\n :index=\"index\"\n :zoomed=\"zoom.zoomed.value\"\n :waiting=\"large.waiting.value\"\n :loop=\"looping\"\n :hint=\"hint\"\n :presence=\"motion.presence\"\n @prev=\"go(index - 1)\"\n @next=\"go(index + 1)\"\n @select=\"go\"\n @zoom-in=\"zoom.step(1)\"\n @zoom-out=\"zoom.step(-1)\"\n @reset=\"zoom.reset()\"\n @rotate=\"rotate\"\n @download=\"download\"\n />\n </div>\n </DialogContent>\n </DialogPortal>\n </DialogRoot>\n</template>\n","<script setup lang=\"ts\">\n import { computed, onMounted, shallowRef, watch } from 'vue'\n import { DialogRoot, DialogPortal, DialogContent, DialogTitle, useBodyScrollLock } from 'reka-ui'\n import { Motion } from 'motion-v'\n import { useEventListener } from '@vueuse/core'\n import { cn } from '../../lib/cn'\n import VisuallyHidden from '../visually-hidden/VisuallyHidden.vue'\n import LightboxStrip from './LightboxStrip.vue'\n import LightboxChrome from './LightboxChrome.vue'\n import { useLightboxMotion } from './composables/useLightboxMotion'\n import { useLightboxZoom } from './composables/useLightboxZoom'\n import { useLightboxGesture } from './composables/useLightboxGesture'\n import { useLightboxPaging } from './composables/useLightboxPaging'\n import { useLightboxFrames } from './composables/useLightboxFrames'\n import { useLightboxLarge } from './composables/useLightboxLarge'\n import { useLightboxPose } from './composables/useLightboxPose'\n import { useLightboxPhase } from './composables/useLightboxPhase'\n import { useLightboxHint } from './composables/useLightboxHint'\n import { useLightboxSlides } from './composables/useLightboxSlides'\n import { useLightboxRotation } from './composables/useLightboxRotation'\n import { clampIndex } from './utils/paging'\n import { saveImage } from './utils/download'\n import type { LightboxItem } from './types'\n\n defineOptions({ name: 'HnLightbox' })\n\n const props = defineProps<{\n items: LightboxItem[]\n loop?: boolean\n class?: string\n }>()\n\n const open = defineModel<boolean>('open', { default: false })\n const index = defineModel<number>('index', { default: 0 })\n\n const mounted = shallowRef(false)\n const stageEl = shallowRef<HTMLElement>()\n const count = computed(() => props.items.length)\n const current = computed(() => props.items[index.value])\n\n const frames = useLightboxFrames(() => props.items)\n const pose = useLightboxPose(frames, () => current.value)\n const rotation = useLightboxRotation(frames, () => current.value)\n const locked = useBodyScrollLock(false)\n\n const motion = useLightboxMotion(\n () => frames.stage.value.height,\n () => rotation.baseOf(current.value),\n )\n\n const zoom = useLightboxZoom(motion, rotation.geometry)\n\n const paging = useLightboxPaging({\n index,\n count: () => count.value,\n width: () => frames.stage.value.width,\n loop: () => !!props.loop,\n })\n\n function measure() {\n frames.measure(stageEl.value)\n paging.sync()\n }\n\n const phase = useLightboxPhase({\n open,\n mounted,\n locked,\n motion,\n pose: pose.fromSource,\n prepare: () => {\n rotation.clear()\n frames.read()\n },\n layout: measure,\n })\n\n const close = phase.close\n\n const gesture = useLightboxGesture({\n stage: () => stageEl.value,\n motion,\n zoom,\n paging,\n enabled: () => phase.current() === 'open',\n interrupt: phase.interrupt,\n inside: target => target instanceof Element && !!target.closest('[data-hn-frame]'),\n dismiss: () => void close(),\n tapOutside: () => void close(),\n })\n\n const large = useLightboxLarge(\n () => current.value,\n () => mounted.value,\n )\n\n const hint = useLightboxHint({ motion, frames, paging, current: () => current.value })\n\n const looping = computed(() => !!props.loop && count.value > 1)\n const slides = useLightboxSlides(\n paging,\n () => props.items,\n () => looping.value,\n )\n\n function go(to: number) {\n if (zoom.isZoomed()) zoom.reset()\n paging.go(to)\n }\n\n function rotate() {\n if (phase.current() === 'open') motion.turn(rotation.advance())\n }\n\n function download() {\n const item = current.value\n if (item) void saveImage(item.preview || item.src)\n }\n\n watch(open, value => {\n if (value) void phase.show()\n else void close()\n })\n\n watch(index, (to, from) => {\n rotation.drop(props.items[from])\n motion.reset(rotation.rotationOf(props.items[to]))\n })\n\n watch(count, () => {\n const clamped = clampIndex(index.value, count.value)\n if (clamped !== index.value) index.value = clamped\n if (mounted.value) paging.sync()\n })\n\n onMounted(() => {\n if (open.value) void phase.show()\n })\n\n useEventListener('resize', () => {\n if (mounted.value) measure()\n })\n\n function onEscape(event: Event) {\n event.preventDefault()\n void close()\n }\n\n function onKeydown(event: KeyboardEvent) {\n if (phase.current() !== 'open') return\n if (event.key === 'ArrowLeft') go(index.value - 1)\n else if (event.key === 'ArrowRight') go(index.value + 1)\n else return\n event.preventDefault()\n }\n\n const currentStyle = computed(() => {\n const frame = frames.frameOf(current.value)\n return {\n left: `${frame.x}px`,\n top: `${frame.y}px`,\n width: `${frame.width}px`,\n height: `${frame.height}px`,\n x: motion.x,\n y: motion.y,\n scale: motion.scale,\n rotate: motion.rotate,\n clipPath: motion.clipPath,\n opacity: motion.opacity,\n }\n })\n\n const currentClass = computed(() =>\n cn(\n 'absolute will-change-transform',\n !zoom.zoomed.value && 'cursor-zoom-in',\n zoom.zoomed.value && (gesture.mode.value === 'pan' ? 'cursor-grabbing' : 'cursor-grab'),\n ),\n )\n</script>\n\n<template>\n <DialogRoot :open=\"mounted\" @update:open=\"value => !value && close()\">\n <DialogPortal>\n <DialogContent\n as-child\n :aria-describedby=\"undefined\"\n @escape-key-down=\"onEscape\"\n @interact-outside=\"event => event.preventDefault()\"\n >\n <div\n ref=\"stageEl\"\n :data-hn-phase=\"phase.current()\"\n :class=\"\n cn(\n 'dark fixed inset-0 z-(--hn-z-overlay) touch-none outline-none select-none',\n props.class,\n )\n \"\n @pointerdown=\"gesture.onPointerdown\"\n @pointermove=\"gesture.onPointermove\"\n @pointerup=\"gesture.onPointerup\"\n @pointercancel=\"gesture.onPointercancel\"\n @wheel=\"gesture.onWheel\"\n @keydown=\"onKeydown\"\n >\n <div aria-hidden=\"true\" class=\"pointer-events-none absolute inset-0 isolate\">\n <Motion class=\"hn-scrim\" :style=\"{ opacity: motion.presence }\" />\n </div>\n <LightboxStrip\n :slides=\"slides\"\n :index=\"paging.position.value\"\n :width=\"frames.stage.value.width\"\n :strip-x=\"paging.stripX\"\n :current-class=\"currentClass\"\n :current-style=\"currentStyle\"\n :frame-of=\"frames.frameOf\"\n :rotation-of=\"rotation.rotationOf\"\n :base-of=\"rotation.baseOf\"\n :transition=\"motion.transition('base')\"\n :large-src=\"large.src.value\"\n :large-ready=\"large.ready.value\"\n @learn=\"frames.learn\"\n />\n <DialogTitle as-child>\n <VisuallyHidden>{{ current?.alt }}</VisuallyHidden>\n </DialogTitle>\n <LightboxChrome\n :items=\"props.items\"\n :index=\"index\"\n :zoomed=\"zoom.zoomed.value\"\n :waiting=\"large.waiting.value\"\n :loop=\"looping\"\n :hint=\"hint\"\n :presence=\"motion.presence\"\n @prev=\"go(index - 1)\"\n @next=\"go(index + 1)\"\n @select=\"go\"\n @zoom-in=\"zoom.step(1)\"\n @zoom-out=\"zoom.step(-1)\"\n @reset=\"zoom.reset()\"\n @rotate=\"rotate\"\n @download=\"download\"\n />\n </div>\n </DialogContent>\n </DialogPortal>\n </DialogRoot>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const image = tv({\n base: 'block size-full',\n variants: {\n fit: {\n cover: 'object-cover',\n contain: 'object-contain',\n fill: 'object-fill',\n none: 'object-none',\n 'scale-down': 'object-scale-down',\n },\n },\n defaultVariants: { fit: 'cover' },\n})\n\nexport type ImageVariants = VariantProps<typeof image>\n","import { inject, provide, type InjectionKey } from 'vue'\n\nexport type ImageVariant = 'image' | 'preview'\n\nexport type ImageResolver = (src: string, variant: ImageVariant) => string\n\nconst KEY: InjectionKey<ImageResolver> = Symbol('hn-image-resolver')\n\nexport function provideImageResolver(resolver: ImageResolver) {\n provide(KEY, resolver)\n}\n\nexport function useImageResolver(): ImageResolver {\n return inject(KEY, (src: string) => src)\n}\n","import { computed, nextTick, onMounted, shallowRef, watch, type ComponentPublicInstance } from 'vue'\nimport { useIntersectionObserver } from '@vueuse/core'\nimport { useImageResolver } from '../resolver'\n\nfunction ready(img: HTMLImageElement): Promise<void> {\n if (typeof img.decode === 'function') return img.decode()\n if (img.complete) {\n return img.naturalWidth > 0 ? Promise.resolve() : Promise.reject(new Error('image failed'))\n }\n return new Promise((res, rej) => {\n img.addEventListener('load', () => res(), { once: true })\n img.addEventListener('error', () => rej(new Error('image failed')), { once: true })\n })\n}\n\nexport function useImage(\n props: {\n src?: string\n fallback?: string\n lazy: boolean\n rootMargin: string\n skeleton: boolean\n },\n emit: {\n (e: 'load', size: { width: number; height: number }): void\n (e: 'error'): void\n },\n) {\n const resolve = useImageResolver()\n\n const rootEl = shallowRef<HTMLElement | ComponentPublicInstance>()\n const imageEl = shallowRef<HTMLImageElement>()\n const skeletonEl = shallowRef<HTMLElement>()\n const entered = shallowRef(!props.lazy)\n const usingFallback = shallowRef(false)\n const revealed = shallowRef(false)\n const skeletonMounted = shallowRef(true)\n const failed = shallowRef(false)\n\n let fade: Animation | null = null\n\n const { isSupported, stop } = useIntersectionObserver(\n rootEl,\n entries => {\n if (!entries.some(entry => entry.isIntersecting)) return\n entered.value = true\n stop()\n },\n { rootMargin: props.rootMargin, immediate: props.lazy },\n )\n\n const primary = computed(() => (props.src ? resolve(props.src, 'image') : ''))\n\n const fallback = computed(() => (props.fallback ? resolve(props.fallback, 'image') : ''))\n\n const resolved = computed(() => (usingFallback.value ? fallback.value : primary.value))\n\n const src = computed(() => (entered.value ? resolved.value || undefined : undefined))\n const showImage = computed(() => Boolean(resolved.value) && !failed.value)\n const showSkeleton = computed(() => props.skeleton && showImage.value && skeletonMounted.value)\n\n watch(primary, () => {\n usingFallback.value = false\n })\n\n watch(resolved, () => {\n fade?.cancel()\n fade = null\n revealed.value = false\n skeletonMounted.value = true\n failed.value = false\n })\n\n function play(el: HTMLElement, frames: Keyframe[]): Animation | null {\n const style = getComputedStyle(el)\n try {\n return el.animate(frames, {\n duration: Number.parseFloat(style.getPropertyValue('--hn-duration-base')) || 0,\n easing: style.getPropertyValue('--hn-ease-enter').trim() || 'linear',\n fill: 'forwards',\n })\n } catch {\n return null\n }\n }\n\n function afterPaint() {\n return new Promise<void>(res => requestAnimationFrame(() => requestAnimationFrame(() => res())))\n }\n\n async function reveal() {\n revealed.value = true\n\n if (!props.lazy) {\n skeletonMounted.value = false\n return\n }\n\n await nextTick()\n await afterPaint()\n\n const layer = skeletonEl.value\n const anim = layer && play(layer, [{ opacity: 1 }, { opacity: 0 }])\n if (!anim) {\n skeletonMounted.value = false\n return\n }\n\n fade = anim\n anim.finished.then(\n () => {\n if (fade === anim) skeletonMounted.value = false\n },\n () => {},\n )\n }\n\n function fail() {\n if (!usingFallback.value && fallback.value) {\n usingFallback.value = true\n return\n }\n failed.value = true\n emit('error')\n }\n\n watch(\n [imageEl, src],\n async () => {\n const img = imageEl.value\n if (!img || !src.value) return\n\n const at = src.value\n try {\n await ready(img)\n } catch {\n if (src.value === at) fail()\n return\n }\n if (src.value !== at) return\n\n emit('load', { width: img.naturalWidth, height: img.naturalHeight })\n void reveal()\n },\n { flush: 'post' },\n )\n\n onMounted(() => {\n if (!isSupported.value) entered.value = true\n })\n\n return { rootEl, imageEl, skeletonEl, src, revealed, failed, showImage, showSkeleton }\n}\n","import { inject, provide, type InjectionKey } from 'vue'\nimport type { LightboxItem } from '../lightbox/types'\n\nexport interface ImageGroupContext {\n register: (id: string, item: () => LightboxItem) => void\n unregister: (id: string) => void\n open: (id: string) => void\n}\n\nconst KEY: InjectionKey<ImageGroupContext> = Symbol('hn-image-group')\n\nexport function provideImageGroup(context: ImageGroupContext) {\n provide(KEY, context)\n}\n\nexport function useImageGroup(): ImageGroupContext | null {\n return inject(KEY, null)\n}\n","<script setup lang=\"ts\">\n import { computed, onBeforeUnmount, shallowRef, useId, watch } from 'vue'\n import { Primitive } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { useRequiredLabel } from '../../lib/a11y'\n import Skeleton from '../skeleton/Skeleton.vue'\n import Lightbox from '../lightbox/Lightbox.vue'\n import type { LightboxItem } from '../lightbox/types'\n import { image, type ImageVariants } from './image.variants'\n import { useImage } from './composables/useImage'\n import { useImageGroup } from './context'\n import { useImageResolver } from './resolver'\n\n defineOptions({ name: 'HnImage', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n src?: string\n alt?: string\n fallback?: string\n fit?: ImageVariants['fit']\n ratio?: number\n lazy?: boolean\n rootMargin?: string\n skeleton?: boolean\n eager?: boolean\n preview?: boolean | string\n draggable?: boolean\n class?: string\n imageClass?: string\n }>(),\n {\n alt: '',\n fit: 'cover',\n lazy: true,\n rootMargin: '200px',\n skeleton: true,\n eager: false,\n preview: false,\n },\n )\n\n const emit = defineEmits<{\n load: [size: { width: number; height: number }]\n error: []\n }>()\n\n const { rootEl, imageEl, skeletonEl, src, revealed, failed, showImage, showSkeleton } = useImage(\n props,\n emit,\n )\n\n useRequiredLabel('Image', () => !props.preview || !!props.alt, '替代文本')\n\n const resolve = useImageResolver()\n const previewOpen = shallowRef(false)\n const previewId = useId()\n const previewItem = computed<LightboxItem>(() => ({\n id: previewId,\n src: src.value ?? '',\n preview: resolve(\n typeof props.preview === 'string' ? props.preview : (props.src ?? ''),\n 'preview',\n ),\n alt: props.alt,\n fit: props.fit,\n source: () => imageEl.value,\n }))\n\n const group = useImageGroup()\n\n if (group) {\n watch(\n () => !!props.preview,\n on => {\n if (on) group.register(previewId, () => previewItem.value)\n else group.unregister(previewId)\n },\n { immediate: true },\n )\n onBeforeUnmount(() => group.unregister(previewId))\n }\n\n function openPreview() {\n if (!props.preview || !showImage.value || !src.value) return\n if (group) group.open(previewId)\n else previewOpen.value = true\n }\n</script>\n\n<template>\n <Primitive\n ref=\"rootEl\"\n :as=\"props.preview ? 'button' : 'span'\"\n :type=\"props.preview ? 'button' : undefined\"\n :class=\"\n cn(\n 'relative block overflow-hidden',\n props.preview && 'hn-focus-ring cursor-zoom-in',\n props.class,\n )\n \"\n :style=\"props.ratio ? { aspectRatio: String(props.ratio) } : undefined\"\n @click=\"openPreview\"\n >\n <img\n v-if=\"showImage\"\n ref=\"imageEl\"\n v-bind=\"$attrs\"\n :src=\"src\"\n :alt=\"props.alt\"\n :decoding=\"props.eager ? 'sync' : 'async'\"\n :fetchpriority=\"props.eager ? 'high' : undefined\"\n :draggable=\"props.draggable\"\n :class=\"\n cn(\n image({ fit: props.fit }),\n props.lazy ? !revealed && 'opacity-0' : 'relative z-10',\n props.imageClass,\n )\n \"\n />\n <slot v-else-if=\"failed\" name=\"error\" />\n <slot v-else name=\"empty\" />\n\n <span\n v-if=\"showSkeleton\"\n ref=\"skeletonEl\"\n aria-hidden=\"true\"\n class=\"pointer-events-none absolute inset-0\"\n >\n <slot name=\"skeleton\">\n <Skeleton class=\"size-full rounded-none\" />\n </slot>\n </span>\n <Lightbox v-if=\"props.preview && !group\" v-model:open=\"previewOpen\" :items=\"[previewItem]\" />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\n import { computed, onBeforeUnmount, shallowRef, useId, watch } from 'vue'\n import { Primitive } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { useRequiredLabel } from '../../lib/a11y'\n import Skeleton from '../skeleton/Skeleton.vue'\n import Lightbox from '../lightbox/Lightbox.vue'\n import type { LightboxItem } from '../lightbox/types'\n import { image, type ImageVariants } from './image.variants'\n import { useImage } from './composables/useImage'\n import { useImageGroup } from './context'\n import { useImageResolver } from './resolver'\n\n defineOptions({ name: 'HnImage', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n src?: string\n alt?: string\n fallback?: string\n fit?: ImageVariants['fit']\n ratio?: number\n lazy?: boolean\n rootMargin?: string\n skeleton?: boolean\n eager?: boolean\n preview?: boolean | string\n draggable?: boolean\n class?: string\n imageClass?: string\n }>(),\n {\n alt: '',\n fit: 'cover',\n lazy: true,\n rootMargin: '200px',\n skeleton: true,\n eager: false,\n preview: false,\n },\n )\n\n const emit = defineEmits<{\n load: [size: { width: number; height: number }]\n error: []\n }>()\n\n const { rootEl, imageEl, skeletonEl, src, revealed, failed, showImage, showSkeleton } = useImage(\n props,\n emit,\n )\n\n useRequiredLabel('Image', () => !props.preview || !!props.alt, '替代文本')\n\n const resolve = useImageResolver()\n const previewOpen = shallowRef(false)\n const previewId = useId()\n const previewItem = computed<LightboxItem>(() => ({\n id: previewId,\n src: src.value ?? '',\n preview: resolve(\n typeof props.preview === 'string' ? props.preview : (props.src ?? ''),\n 'preview',\n ),\n alt: props.alt,\n fit: props.fit,\n source: () => imageEl.value,\n }))\n\n const group = useImageGroup()\n\n if (group) {\n watch(\n () => !!props.preview,\n on => {\n if (on) group.register(previewId, () => previewItem.value)\n else group.unregister(previewId)\n },\n { immediate: true },\n )\n onBeforeUnmount(() => group.unregister(previewId))\n }\n\n function openPreview() {\n if (!props.preview || !showImage.value || !src.value) return\n if (group) group.open(previewId)\n else previewOpen.value = true\n }\n</script>\n\n<template>\n <Primitive\n ref=\"rootEl\"\n :as=\"props.preview ? 'button' : 'span'\"\n :type=\"props.preview ? 'button' : undefined\"\n :class=\"\n cn(\n 'relative block overflow-hidden',\n props.preview && 'hn-focus-ring cursor-zoom-in',\n props.class,\n )\n \"\n :style=\"props.ratio ? { aspectRatio: String(props.ratio) } : undefined\"\n @click=\"openPreview\"\n >\n <img\n v-if=\"showImage\"\n ref=\"imageEl\"\n v-bind=\"$attrs\"\n :src=\"src\"\n :alt=\"props.alt\"\n :decoding=\"props.eager ? 'sync' : 'async'\"\n :fetchpriority=\"props.eager ? 'high' : undefined\"\n :draggable=\"props.draggable\"\n :class=\"\n cn(\n image({ fit: props.fit }),\n props.lazy ? !revealed && 'opacity-0' : 'relative z-10',\n props.imageClass,\n )\n \"\n />\n <slot v-else-if=\"failed\" name=\"error\" />\n <slot v-else name=\"empty\" />\n\n <span\n v-if=\"showSkeleton\"\n ref=\"skeletonEl\"\n aria-hidden=\"true\"\n class=\"pointer-events-none absolute inset-0\"\n >\n <slot name=\"skeleton\">\n <Skeleton class=\"size-full rounded-none\" />\n </slot>\n </span>\n <Lightbox v-if=\"props.preview && !group\" v-model:open=\"previewOpen\" :items=\"[previewItem]\" />\n </Primitive>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const avatar = tv({\n base: [\n 'bg-inset text-muted relative inline-flex shrink-0 items-center justify-center',\n 'overflow-hidden rounded-full align-middle font-medium select-none',\n ],\n variants: {\n size: {\n sm: 'size-6 text-xs [&_svg]:size-3.5',\n md: 'size-8 text-sm [&_svg]:size-4',\n lg: 'size-10 text-base [&_svg]:size-5',\n },\n },\n defaultVariants: { size: 'md' },\n})\n\nexport type AvatarVariants = VariantProps<typeof avatar>\n","import { inject, provide, type ComputedRef, type InjectionKey } from 'vue'\nimport type { AvatarVariants } from './avatar.variants'\n\nexport interface AvatarGroupContext {\n size: AvatarVariants['size']\n}\n\nconst KEY: InjectionKey<ComputedRef<AvatarGroupContext>> = Symbol('hn-avatar-group')\n\nexport function provideAvatarGroup(context: ComputedRef<AvatarGroupContext>) {\n provide(KEY, context)\n}\n\nexport function useAvatarGroup() {\n return inject(KEY, null)\n}\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { User } from '@lucide/vue'\n import { cn } from '../../lib/cn'\n import Image from '../image/Image.vue'\n import { avatar, type AvatarVariants } from './avatar.variants'\n import { useAvatarGroup } from './context'\n\n defineOptions({ name: 'HnAvatar', inheritAttrs: false })\n\n const props = defineProps<{\n src?: string\n alt?: string\n name?: string\n size?: AvatarVariants['size']\n class?: string\n }>()\n\n const group = useAvatarGroup()\n const size = computed(() => props.size ?? group?.value.size)\n\n const initials = computed(() => {\n const name = props.name?.trim()\n if (!name) return ''\n const words = name.split(/\\s+/)\n if (words.length > 1)\n return words\n .slice(0, 2)\n .map(w => w[0]!.toUpperCase())\n .join('')\n return /^[\\p{Script=Han}\\p{Script=Hiragana}\\p{Script=Katakana}\\p{Script=Hangul}]/u.test(name)\n ? name[0]!\n : name.slice(0, 2).toUpperCase()\n })\n</script>\n\n<template>\n <Image\n :src=\"props.src\"\n :alt=\"props.alt ?? props.name ?? ''\"\n :class=\"cn(avatar({ size }), props.class)\"\n v-bind=\"$attrs\"\n >\n <template #empty>\n <slot>\n <template v-if=\"initials\">{{ initials }}</template>\n <User v-else aria-hidden=\"true\" />\n </slot>\n </template>\n <template #error>\n <slot>\n <template v-if=\"initials\">{{ initials }}</template>\n <User v-else aria-hidden=\"true\" />\n </slot>\n </template>\n </Image>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { User } from '@lucide/vue'\n import { cn } from '../../lib/cn'\n import Image from '../image/Image.vue'\n import { avatar, type AvatarVariants } from './avatar.variants'\n import { useAvatarGroup } from './context'\n\n defineOptions({ name: 'HnAvatar', inheritAttrs: false })\n\n const props = defineProps<{\n src?: string\n alt?: string\n name?: string\n size?: AvatarVariants['size']\n class?: string\n }>()\n\n const group = useAvatarGroup()\n const size = computed(() => props.size ?? group?.value.size)\n\n const initials = computed(() => {\n const name = props.name?.trim()\n if (!name) return ''\n const words = name.split(/\\s+/)\n if (words.length > 1)\n return words\n .slice(0, 2)\n .map(w => w[0]!.toUpperCase())\n .join('')\n return /^[\\p{Script=Han}\\p{Script=Hiragana}\\p{Script=Katakana}\\p{Script=Hangul}]/u.test(name)\n ? name[0]!\n : name.slice(0, 2).toUpperCase()\n })\n</script>\n\n<template>\n <Image\n :src=\"props.src\"\n :alt=\"props.alt ?? props.name ?? ''\"\n :class=\"cn(avatar({ size }), props.class)\"\n v-bind=\"$attrs\"\n >\n <template #empty>\n <slot>\n <template v-if=\"initials\">{{ initials }}</template>\n <User v-else aria-hidden=\"true\" />\n </slot>\n </template>\n <template #error>\n <slot>\n <template v-if=\"initials\">{{ initials }}</template>\n <User v-else aria-hidden=\"true\" />\n </slot>\n </template>\n </Image>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const avatarGroupItem = tv({\n base: 'ring-surface first:me-0 ring-2',\n variants: {\n size: {\n sm: '-me-1.5',\n md: '-me-2',\n lg: '-me-2.5',\n },\n },\n defaultVariants: { size: 'md' },\n})\n\nexport type AvatarGroupVariants = VariantProps<typeof avatarGroupItem>\n","<script setup lang=\"ts\">\n import { computed, useSlots, Fragment, type VNode } from 'vue'\n import { cn } from '../../lib/cn'\n import Avatar from './Avatar.vue'\n import type { AvatarVariants } from './avatar.variants'\n import { avatarGroupItem } from './avatar-group.variants'\n import { provideAvatarGroup } from './context'\n\n defineOptions({ name: 'HnAvatarGroup' })\n\n const props = defineProps<{\n max?: number\n size?: AvatarVariants['size']\n class?: string\n }>()\n\n const slots = useSlots()\n\n function flatten(nodes: VNode[] | undefined): VNode[] {\n return (nodes ?? []).flatMap(node =>\n node.type === Fragment ? flatten(node.children as VNode[]) : [node],\n )\n }\n\n const children = computed(() => flatten(slots.default?.()))\n const visible = computed(() =>\n props.max && props.max > 0 ? children.value.slice(0, props.max) : children.value,\n )\n const hidden = computed(() => children.value.length - visible.value.length)\n const item = computed(() => avatarGroupItem({ size: props.size }))\n\n provideAvatarGroup(computed(() => ({ size: props.size })))\n</script>\n\n<template>\n <div :class=\"cn('flex flex-row-reverse justify-end', props.class)\">\n <Avatar v-if=\"hidden > 0\" :class=\"item\">+{{ hidden }}</Avatar>\n <component :is=\"node\" v-for=\"(node, i) in [...visible].reverse()\" :key=\"i\" :class=\"item\" />\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed, useSlots, Fragment, type VNode } from 'vue'\n import { cn } from '../../lib/cn'\n import Avatar from './Avatar.vue'\n import type { AvatarVariants } from './avatar.variants'\n import { avatarGroupItem } from './avatar-group.variants'\n import { provideAvatarGroup } from './context'\n\n defineOptions({ name: 'HnAvatarGroup' })\n\n const props = defineProps<{\n max?: number\n size?: AvatarVariants['size']\n class?: string\n }>()\n\n const slots = useSlots()\n\n function flatten(nodes: VNode[] | undefined): VNode[] {\n return (nodes ?? []).flatMap(node =>\n node.type === Fragment ? flatten(node.children as VNode[]) : [node],\n )\n }\n\n const children = computed(() => flatten(slots.default?.()))\n const visible = computed(() =>\n props.max && props.max > 0 ? children.value.slice(0, props.max) : children.value,\n )\n const hidden = computed(() => children.value.length - visible.value.length)\n const item = computed(() => avatarGroupItem({ size: props.size }))\n\n provideAvatarGroup(computed(() => ({ size: props.size })))\n</script>\n\n<template>\n <div :class=\"cn('flex flex-row-reverse justify-end', props.class)\">\n <Avatar v-if=\"hidden > 0\" :class=\"item\">+{{ hidden }}</Avatar>\n <component :is=\"node\" v-for=\"(node, i) in [...visible].reverse()\" :key=\"i\" :class=\"item\" />\n </div>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const badge = tv({\n base: [\n 'absolute z-[1] inline-flex items-center justify-center rounded-full will-change-transform',\n 'font-medium leading-none whitespace-nowrap select-none',\n ],\n variants: {\n tone: {\n accent: 'bg-accent text-accent-on',\n neutral: 'bg-neutral-solid text-neutral-solid-on',\n success: 'bg-success text-success-on',\n warning: 'bg-warning text-warning-on',\n danger: 'bg-danger text-danger-on',\n info: 'bg-info text-info-on',\n },\n size: {\n sm: 'h-4 min-w-4 px-1 text-xs',\n md: 'h-5 min-w-5 px-1.5 text-xs',\n },\n placement: {\n 'top-end': 'top-0 end-0 translate-x-1/2 -translate-y-1/2',\n 'top-start': 'top-0 start-0 -translate-x-1/2 -translate-y-1/2',\n 'bottom-end': 'bottom-0 end-0 translate-x-1/2 translate-y-1/2',\n 'bottom-start': 'bottom-0 start-0 -translate-x-1/2 translate-y-1/2',\n },\n shape: {\n rect: '',\n circle: '',\n },\n outline: {\n true: 'ring-surface ring-2',\n false: '',\n },\n bare: {\n true: 'h-auto min-w-0 bg-transparent p-0',\n },\n },\n compoundVariants: [\n { shape: 'circle', placement: 'top-end', class: 'top-[14%] end-[14%]' },\n { shape: 'circle', placement: 'top-start', class: 'top-[14%] start-[14%]' },\n { shape: 'circle', placement: 'bottom-end', class: 'bottom-[14%] end-[14%]' },\n { shape: 'circle', placement: 'bottom-start', class: 'bottom-[14%] start-[14%]' },\n ],\n defaultVariants: {\n tone: 'danger',\n size: 'sm',\n placement: 'top-end',\n shape: 'rect',\n outline: true,\n },\n})\n\nexport type BadgeVariants = VariantProps<typeof badge>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import VisuallyHidden from '../visually-hidden/VisuallyHidden.vue'\n import { cn } from '../../lib/cn'\n import { badge, type BadgeVariants } from './badge.variants'\n\n defineOptions({ name: 'HnBadge' })\n\n const props = withDefaults(\n defineProps<{\n content?: string | number | null\n max?: number\n tone?: BadgeVariants['tone']\n size?: BadgeVariants['size']\n placement?: BadgeVariants['placement']\n shape?: BadgeVariants['shape']\n outline?: boolean\n bare?: boolean\n label?: string\n class?: string\n }>(),\n { max: 99, outline: true },\n )\n\n const visible = computed(\n () =>\n props.content !== undefined &&\n props.content !== null &&\n props.content !== '' &&\n props.content !== 0,\n )\n\n const text = computed(() =>\n typeof props.content === 'number' && props.content > props.max\n ? `${props.max}+`\n : props.content,\n )\n</script>\n\n<template>\n <span :class=\"cn('relative inline-flex shrink-0 align-middle', props.class)\">\n <slot />\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-50 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-50 opacity-0\"\n >\n <span\n v-if=\"visible\"\n :class=\"\n badge({\n tone: props.tone,\n size: props.size,\n placement: props.placement,\n shape: props.shape,\n outline: props.outline,\n bare: props.bare,\n })\n \"\n >\n <slot name=\"content\">{{ text }}</slot>\n <VisuallyHidden v-if=\"props.label\">{{ props.label }}</VisuallyHidden>\n </span>\n </Transition>\n </span>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import VisuallyHidden from '../visually-hidden/VisuallyHidden.vue'\n import { cn } from '../../lib/cn'\n import { badge, type BadgeVariants } from './badge.variants'\n\n defineOptions({ name: 'HnBadge' })\n\n const props = withDefaults(\n defineProps<{\n content?: string | number | null\n max?: number\n tone?: BadgeVariants['tone']\n size?: BadgeVariants['size']\n placement?: BadgeVariants['placement']\n shape?: BadgeVariants['shape']\n outline?: boolean\n bare?: boolean\n label?: string\n class?: string\n }>(),\n { max: 99, outline: true },\n )\n\n const visible = computed(\n () =>\n props.content !== undefined &&\n props.content !== null &&\n props.content !== '' &&\n props.content !== 0,\n )\n\n const text = computed(() =>\n typeof props.content === 'number' && props.content > props.max\n ? `${props.max}+`\n : props.content,\n )\n</script>\n\n<template>\n <span :class=\"cn('relative inline-flex shrink-0 align-middle', props.class)\">\n <slot />\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-50 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-50 opacity-0\"\n >\n <span\n v-if=\"visible\"\n :class=\"\n badge({\n tone: props.tone,\n size: props.size,\n placement: props.placement,\n shape: props.shape,\n outline: props.outline,\n bare: props.bare,\n })\n \"\n >\n <slot name=\"content\">{{ text }}</slot>\n <VisuallyHidden v-if=\"props.label\">{{ props.label }}</VisuallyHidden>\n </span>\n </Transition>\n </span>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const indicator = tv({\n base: 'relative inline-flex shrink-0 rounded-full align-middle',\n variants: {\n tone: {\n accent: 'bg-accent',\n neutral: 'bg-neutral-solid',\n success: 'bg-success',\n warning: 'bg-warning',\n danger: 'bg-danger',\n info: 'bg-info',\n },\n size: {\n sm: 'size-1.5',\n md: 'size-2',\n lg: 'size-2.5',\n },\n },\n defaultVariants: {\n tone: 'neutral',\n size: 'md',\n },\n})\n\nexport type IndicatorVariants = VariantProps<typeof indicator>\n","<script setup lang=\"ts\">\n import { Primitive, type PrimitiveProps } from 'reka-ui'\n import VisuallyHidden from '../visually-hidden/VisuallyHidden.vue'\n import { cn } from '../../lib/cn'\n import { indicator, type IndicatorVariants } from './indicator.variants'\n\n defineOptions({ name: 'HnIndicator' })\n\n const props = withDefaults(\n defineProps<\n PrimitiveProps & {\n tone?: IndicatorVariants['tone']\n size?: IndicatorVariants['size']\n pulse?: boolean\n label?: string\n class?: string\n }\n >(),\n { as: 'span' },\n )\n</script>\n\n<template>\n <Primitive\n :as=\"props.as\"\n :as-child=\"props.asChild\"\n :aria-hidden=\"props.label ? undefined : 'true'\"\n :class=\"cn(indicator({ tone: props.tone, size: props.size }), props.class)\"\n >\n <span\n v-if=\"props.pulse\"\n aria-hidden=\"true\"\n class=\"hn-ping absolute inset-0 rounded-full bg-inherit\"\n />\n <VisuallyHidden v-if=\"props.label\">{{ props.label }}</VisuallyHidden>\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\n import { Primitive, type PrimitiveProps } from 'reka-ui'\n import VisuallyHidden from '../visually-hidden/VisuallyHidden.vue'\n import { cn } from '../../lib/cn'\n import { indicator, type IndicatorVariants } from './indicator.variants'\n\n defineOptions({ name: 'HnIndicator' })\n\n const props = withDefaults(\n defineProps<\n PrimitiveProps & {\n tone?: IndicatorVariants['tone']\n size?: IndicatorVariants['size']\n pulse?: boolean\n label?: string\n class?: string\n }\n >(),\n { as: 'span' },\n )\n</script>\n\n<template>\n <Primitive\n :as=\"props.as\"\n :as-child=\"props.asChild\"\n :aria-hidden=\"props.label ? undefined : 'true'\"\n :class=\"cn(indicator({ tone: props.tone, size: props.size }), props.class)\"\n >\n <span\n v-if=\"props.pulse\"\n aria-hidden=\"true\"\n class=\"hn-ping absolute inset-0 rounded-full bg-inherit\"\n />\n <VisuallyHidden v-if=\"props.label\">{{ props.label }}</VisuallyHidden>\n </Primitive>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const callout = tv({\n base: 'flex gap-3 rounded-lg p-4',\n variants: {\n tone: {\n neutral: 'bg-subtle',\n accent: 'bg-accent-soft',\n info: 'bg-info-soft',\n success: 'bg-success-soft',\n warning: 'bg-warning-soft',\n danger: 'bg-danger-soft',\n },\n },\n defaultVariants: { tone: 'neutral' },\n})\n\nexport const calloutIcon = tv({\n base: 'mt-0.5 size-5 shrink-0',\n variants: {\n tone: {\n neutral: 'text-muted',\n accent: 'text-accent-text',\n info: 'text-info-text',\n success: 'text-success-text',\n warning: 'text-warning-text',\n danger: 'text-danger-text',\n },\n },\n defaultVariants: { tone: 'neutral' },\n})\n\nexport type CalloutVariants = VariantProps<typeof callout>\n","import { Info, Lightbulb, CircleCheck, TriangleAlert, CircleX } from '@lucide/vue'\n\nexport const calloutIcons = {\n neutral: Info,\n accent: Lightbulb,\n info: Info,\n success: CircleCheck,\n warning: TriangleAlert,\n danger: CircleX,\n} as const\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import { callout, calloutIcon, type CalloutVariants } from './callout.variants'\n import { calloutIcons } from './icons'\n\n defineOptions({ name: 'HnCallout' })\n\n const props = withDefaults(\n defineProps<{\n tone?: CalloutVariants['tone']\n title?: string\n icon?: boolean\n class?: string\n }>(),\n { tone: 'neutral', icon: true },\n )\n</script>\n\n<template>\n <div role=\"note\" :class=\"cn(callout({ tone: props.tone }), props.class)\">\n <slot name=\"icon\">\n <component\n :is=\"calloutIcons[props.tone]\"\n v-if=\"props.icon\"\n :class=\"calloutIcon({ tone: props.tone })\"\n aria-hidden=\"true\"\n />\n </slot>\n <div class=\"flex min-w-0 flex-1 flex-col gap-1\">\n <p v-if=\"props.title\" class=\"text-fg font-medium\">{{ props.title }}</p>\n <slot />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import { callout, calloutIcon, type CalloutVariants } from './callout.variants'\n import { calloutIcons } from './icons'\n\n defineOptions({ name: 'HnCallout' })\n\n const props = withDefaults(\n defineProps<{\n tone?: CalloutVariants['tone']\n title?: string\n icon?: boolean\n class?: string\n }>(),\n { tone: 'neutral', icon: true },\n )\n</script>\n\n<template>\n <div role=\"note\" :class=\"cn(callout({ tone: props.tone }), props.class)\">\n <slot name=\"icon\">\n <component\n :is=\"calloutIcons[props.tone]\"\n v-if=\"props.icon\"\n :class=\"calloutIcon({ tone: props.tone })\"\n aria-hidden=\"true\"\n />\n </slot>\n <div class=\"flex min-w-0 flex-1 flex-col gap-1\">\n <p v-if=\"props.title\" class=\"text-fg font-medium\">{{ props.title }}</p>\n <slot />\n </div>\n </div>\n</template>\n","import { getCurrentInstance, onBeforeUpdate, onMounted } from 'vue'\n\nexport type CollapseAxis = 'y' | 'x'\n\nexport function collapseGapOf(parent: Element | null, axis: CollapseAxis = 'y') {\n if (!parent) return '0px'\n const style = getComputedStyle(parent)\n const stacked = style.display.includes('flex') || style.display.includes('grid')\n const gap = axis === 'y' ? style.rowGap : style.columnGap\n return stacked && gap !== 'normal' ? gap : '0px'\n}\n\nexport function writeCollapseGap(el: Element, parent: Element | null, axis: CollapseAxis = 'y') {\n ;(el as HTMLElement).style.setProperty('--hn-collapse-gap', collapseGapOf(parent, axis))\n}\n\nexport function collapseHooks(axis: CollapseAxis = 'y', parentOf?: () => Element | null) {\n function beforeEnter(el: Element) {\n writeCollapseGap(el, el.parentElement ?? parentOf?.() ?? null, axis)\n }\n\n function beforeLeave(el: Element) {\n writeCollapseGap(el, el.parentElement, axis)\n }\n\n function afterEnter(el: Element) {\n ;(el as HTMLElement).style.removeProperty('--hn-collapse-gap')\n }\n\n return { beforeEnter, afterEnter, beforeLeave }\n}\n\nexport function useCollapseHooks(axis: CollapseAxis = 'y') {\n const instance = getCurrentInstance()\n let parent: Element | null = null\n\n function remember() {\n parent = (instance?.proxy?.$el as Node | null)?.parentElement ?? parent\n }\n\n onMounted(remember)\n onBeforeUpdate(remember)\n\n return collapseHooks(axis, () => parent)\n}\n","<script setup lang=\"ts\">\n import { computed, useSlots } from 'vue'\n import { cn } from '../../lib/cn'\n import { useCollapseHooks } from '../../lib/collapse'\n import CloseButton from '../close-button/CloseButton.vue'\n import { callout, calloutIcon, type CalloutVariants } from '../callout/callout.variants'\n import { calloutIcons } from '../callout/icons'\n\n defineOptions({ name: 'HnAlert' })\n\n const props = withDefaults(\n defineProps<{\n tone?: CalloutVariants['tone']\n title?: string\n icon?: boolean\n closable?: boolean\n class?: string\n }>(),\n { tone: 'neutral', icon: true },\n )\n\n const open = defineModel<boolean>('open', { default: true })\n\n const emit = defineEmits<{ close: [] }>()\n\n const slots = useSlots()\n const hooks = useCollapseHooks()\n\n const role = computed(() =>\n props.tone === 'danger' || props.tone === 'warning' ? 'alert' : 'status',\n )\n\n function close() {\n open.value = false\n emit('close')\n }\n</script>\n\n<template>\n <Transition\n enter-from-class=\"hn-collapse-closed\"\n enter-to-class=\"hn-collapse-open\"\n leave-from-class=\"hn-collapse-open\"\n leave-to-class=\"hn-collapse-closed\"\n v-on=\"hooks\"\n >\n <div v-if=\"open\" data-hn-alert class=\"hn-collapse\">\n <div class=\"hn-collapse-body\">\n <div :role=\"role\" :class=\"cn(callout({ tone: props.tone }), props.class)\">\n <slot name=\"icon\">\n <component\n :is=\"calloutIcons[props.tone]\"\n v-if=\"props.icon\"\n :class=\"calloutIcon({ tone: props.tone })\"\n aria-hidden=\"true\"\n />\n </slot>\n <div class=\"flex min-w-0 flex-1 flex-col gap-1\">\n <p v-if=\"props.title\" class=\"text-fg font-medium\">{{ props.title }}</p>\n <slot />\n </div>\n <div v-if=\"slots.actions\" class=\"flex shrink-0 items-center gap-2 self-center\">\n <slot name=\"actions\" />\n </div>\n <CloseButton v-if=\"props.closable\" size=\"sm\" class=\"-my-0.5 -me-1\" @click=\"close\" />\n </div>\n </div>\n </div>\n </Transition>\n</template>\n","<script setup lang=\"ts\">\n import { computed, useSlots } from 'vue'\n import { cn } from '../../lib/cn'\n import { useCollapseHooks } from '../../lib/collapse'\n import CloseButton from '../close-button/CloseButton.vue'\n import { callout, calloutIcon, type CalloutVariants } from '../callout/callout.variants'\n import { calloutIcons } from '../callout/icons'\n\n defineOptions({ name: 'HnAlert' })\n\n const props = withDefaults(\n defineProps<{\n tone?: CalloutVariants['tone']\n title?: string\n icon?: boolean\n closable?: boolean\n class?: string\n }>(),\n { tone: 'neutral', icon: true },\n )\n\n const open = defineModel<boolean>('open', { default: true })\n\n const emit = defineEmits<{ close: [] }>()\n\n const slots = useSlots()\n const hooks = useCollapseHooks()\n\n const role = computed(() =>\n props.tone === 'danger' || props.tone === 'warning' ? 'alert' : 'status',\n )\n\n function close() {\n open.value = false\n emit('close')\n }\n</script>\n\n<template>\n <Transition\n enter-from-class=\"hn-collapse-closed\"\n enter-to-class=\"hn-collapse-open\"\n leave-from-class=\"hn-collapse-open\"\n leave-to-class=\"hn-collapse-closed\"\n v-on=\"hooks\"\n >\n <div v-if=\"open\" data-hn-alert class=\"hn-collapse\">\n <div class=\"hn-collapse-body\">\n <div :role=\"role\" :class=\"cn(callout({ tone: props.tone }), props.class)\">\n <slot name=\"icon\">\n <component\n :is=\"calloutIcons[props.tone]\"\n v-if=\"props.icon\"\n :class=\"calloutIcon({ tone: props.tone })\"\n aria-hidden=\"true\"\n />\n </slot>\n <div class=\"flex min-w-0 flex-1 flex-col gap-1\">\n <p v-if=\"props.title\" class=\"text-fg font-medium\">{{ props.title }}</p>\n <slot />\n </div>\n <div v-if=\"slots.actions\" class=\"flex shrink-0 items-center gap-2 self-center\">\n <slot name=\"actions\" />\n </div>\n <CloseButton v-if=\"props.closable\" size=\"sm\" class=\"-my-0.5 -me-1\" @click=\"close\" />\n </div>\n </div>\n </div>\n </Transition>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n\n defineOptions({ name: 'HnPrevNext' })\n\n const props = defineProps<{\n label?: string\n class?: string\n }>()\n\n const t = useUiLocale()\n</script>\n\n<template>\n <nav\n :aria-label=\"props.label ?? t.pagination.navLabel\"\n :class=\"cn('grid gap-4 sm:grid-cols-2', props.class)\"\n >\n <slot />\n </nav>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n\n defineOptions({ name: 'HnPrevNext' })\n\n const props = defineProps<{\n label?: string\n class?: string\n }>()\n\n const t = useUiLocale()\n</script>\n\n<template>\n <nav\n :aria-label=\"props.label ?? t.pagination.navLabel\"\n :class=\"cn('grid gap-4 sm:grid-cols-2', props.class)\"\n >\n <slot />\n </nav>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const prevNextLink = tv({\n base: [\n 'hn-interactive hn-state-layer hn-press-lg flex flex-col gap-1 rounded-lg p-4 text-start',\n 'bg-surface border-line border shadow-sm',\n ],\n variants: {\n direction: {\n prev: 'items-start',\n next: 'items-end text-end sm:col-start-2',\n },\n },\n defaultVariants: { direction: 'next' },\n})\n\nexport const prevNextEyebrow = tv({\n base: 'text-muted inline-flex items-center gap-1 text-sm',\n variants: {\n direction: {\n prev: '',\n next: 'flex-row-reverse',\n },\n },\n defaultVariants: { direction: 'next' },\n})\n\nexport type PrevNextVariants = VariantProps<typeof prevNextLink>\n","<script setup lang=\"ts\">\n import { Primitive, type PrimitiveProps } from 'reka-ui'\n import { ArrowLeft, ArrowRight } from '@lucide/vue'\n import Ripple from '../ripple/Ripple.vue'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import { prevNextLink, prevNextEyebrow, type PrevNextVariants } from './prev-next.variants'\n\n defineOptions({ name: 'HnPrevNextLink', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<\n PrimitiveProps & {\n direction: NonNullable<PrevNextVariants['direction']>\n label?: string\n class?: string\n }\n >(),\n { as: 'a' },\n )\n\n const t = useUiLocale()\n</script>\n\n<template>\n <Primitive\n v-bind=\"$attrs\"\n :as=\"props.as\"\n :as-child=\"props.asChild\"\n :rel=\"props.direction\"\n :data-direction=\"props.direction\"\n :class=\"cn(prevNextLink({ direction: props.direction }), props.class)\"\n >\n <Ripple />\n <span :class=\"prevNextEyebrow({ direction: props.direction })\">\n <ArrowLeft v-if=\"props.direction === 'prev'\" class=\"size-4\" aria-hidden=\"true\" />\n <ArrowRight v-else class=\"size-4\" aria-hidden=\"true\" />\n {{ props.label ?? (props.direction === 'prev' ? t.pagination.prev : t.pagination.next) }}\n </span>\n <span class=\"text-fg font-medium\">\n <slot />\n </span>\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\n import { Primitive, type PrimitiveProps } from 'reka-ui'\n import { ArrowLeft, ArrowRight } from '@lucide/vue'\n import Ripple from '../ripple/Ripple.vue'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import { prevNextLink, prevNextEyebrow, type PrevNextVariants } from './prev-next.variants'\n\n defineOptions({ name: 'HnPrevNextLink', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<\n PrimitiveProps & {\n direction: NonNullable<PrevNextVariants['direction']>\n label?: string\n class?: string\n }\n >(),\n { as: 'a' },\n )\n\n const t = useUiLocale()\n</script>\n\n<template>\n <Primitive\n v-bind=\"$attrs\"\n :as=\"props.as\"\n :as-child=\"props.asChild\"\n :rel=\"props.direction\"\n :data-direction=\"props.direction\"\n :class=\"cn(prevNextLink({ direction: props.direction }), props.class)\"\n >\n <Ripple />\n <span :class=\"prevNextEyebrow({ direction: props.direction })\">\n <ArrowLeft v-if=\"props.direction === 'prev'\" class=\"size-4\" aria-hidden=\"true\" />\n <ArrowRight v-else class=\"size-4\" aria-hidden=\"true\" />\n {{ props.label ?? (props.direction === 'prev' ? t.pagination.prev : t.pagination.next) }}\n </span>\n <span class=\"text-fg font-medium\">\n <slot />\n </span>\n </Primitive>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const tableWrapper = tv({\n base: [\n 'max-w-full rounded-lg',\n '[&_th]:h-(--hn-row-h) [&_td]:h-(--hn-row-h)',\n '[&_th]:py-0 [&_td]:py-0',\n '[&_caption>span]:sticky [&_caption>span]:start-[0.75em] [&_caption>span]:inline-block',\n '[&_tbody_tr:last-child_td]:border-b-0',\n ],\n variants: {\n variant: {\n primary:\n 'bg-surface border-line border shadow-sm [&_thead_th]:bg-subtle [--hn-table-bg:var(--hn-surface)] [--hn-table-head-bg:var(--hn-bg-subtle)]',\n secondary:\n '[&_thead_th]:bg-inset [&_thead_th:first-child]:rounded-ss-md [&_thead_th:last-child]:rounded-se-md [--hn-table-bg:var(--hn-bg-canvas)] [--hn-table-head-bg:var(--hn-bg-inset)]',\n },\n hover: {\n true: '[&_tbody_tr]:hn-state-layer',\n false: '',\n },\n stickyHeader: {\n true: '[&_thead_th]:sticky [&_thead_th]:top-0 [&_thead_th]:z-[2]',\n false: '',\n },\n },\n defaultVariants: { variant: 'primary', hover: true, stickyHeader: false },\n})\n\nexport type TableVariants = VariantProps<typeof tableWrapper>\n\nexport const tableCell = tv({\n base: '',\n variants: {\n align: {\n start: '',\n center: 'text-center',\n end: 'text-end',\n },\n sticky: {\n true: 'border-line sticky start-0 z-[1] border-e',\n false: '',\n },\n head: {\n true: '',\n false: '',\n },\n },\n compoundVariants: [\n { sticky: true, head: false, class: 'bg-(--hn-table-bg)' },\n { sticky: true, head: true, class: 'bg-(--hn-table-head-bg) z-[3]!' },\n ],\n defaultVariants: { align: 'start', sticky: false, head: false },\n})\n\nexport type TableCellVariants = VariantProps<typeof tableCell>\n","<script setup lang=\"ts\">\n import ScrollArea from '../scroll-area/ScrollArea.vue'\n import { cn } from '../../lib/cn'\n import { tableWrapper, type TableVariants } from './table.variants'\n\n defineOptions({ name: 'HnTable' })\n\n const props = withDefaults(\n defineProps<{\n variant?: TableVariants['variant']\n hover?: boolean\n stickyHeader?: boolean\n caption?: string\n class?: string\n }>(),\n { variant: 'primary', hover: true, stickyHeader: false },\n )\n</script>\n\n<template>\n <ScrollArea\n :direction=\"props.stickyHeader ? 'both' : 'horizontal'\"\n :class=\"\n cn(\n tableWrapper({\n variant: props.variant,\n hover: props.hover,\n stickyHeader: props.stickyHeader,\n }),\n props.class,\n )\n \"\n >\n <table class=\"hn-table\">\n <caption v-if=\"props.caption\">\n <span>{{ props.caption }}</span>\n </caption>\n <slot />\n </table>\n </ScrollArea>\n</template>\n","<script setup lang=\"ts\">\n import ScrollArea from '../scroll-area/ScrollArea.vue'\n import { cn } from '../../lib/cn'\n import { tableWrapper, type TableVariants } from './table.variants'\n\n defineOptions({ name: 'HnTable' })\n\n const props = withDefaults(\n defineProps<{\n variant?: TableVariants['variant']\n hover?: boolean\n stickyHeader?: boolean\n caption?: string\n class?: string\n }>(),\n { variant: 'primary', hover: true, stickyHeader: false },\n )\n</script>\n\n<template>\n <ScrollArea\n :direction=\"props.stickyHeader ? 'both' : 'horizontal'\"\n :class=\"\n cn(\n tableWrapper({\n variant: props.variant,\n hover: props.hover,\n stickyHeader: props.stickyHeader,\n }),\n props.class,\n )\n \"\n >\n <table class=\"hn-table\">\n <caption v-if=\"props.caption\">\n <span>{{ props.caption }}</span>\n </caption>\n <slot />\n </table>\n </ScrollArea>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnTableHeader' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <thead :class=\"cn(props.class)\">\n <slot />\n </thead>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnTableHeader' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <thead :class=\"cn(props.class)\">\n <slot />\n </thead>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnTableBody' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <tbody :class=\"cn(props.class)\">\n <slot />\n </tbody>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnTableBody' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <tbody :class=\"cn(props.class)\">\n <slot />\n </tbody>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnTableRow' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <tr :class=\"cn(props.class)\">\n <slot />\n </tr>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnTableRow' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <tr :class=\"cn(props.class)\">\n <slot />\n </tr>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import { tableCell, type TableCellVariants } from './table.variants'\n\n defineOptions({ name: 'HnTableHead' })\n\n const props = withDefaults(\n defineProps<{\n scope?: 'col' | 'row'\n align?: TableCellVariants['align']\n sticky?: boolean\n class?: string\n }>(),\n { scope: 'col', sticky: false },\n )\n</script>\n\n<template>\n <th\n :scope=\"props.scope\"\n :class=\"cn(tableCell({ align: props.align, sticky: props.sticky, head: true }), props.class)\"\n >\n <slot />\n </th>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import { tableCell, type TableCellVariants } from './table.variants'\n\n defineOptions({ name: 'HnTableHead' })\n\n const props = withDefaults(\n defineProps<{\n scope?: 'col' | 'row'\n align?: TableCellVariants['align']\n sticky?: boolean\n class?: string\n }>(),\n { scope: 'col', sticky: false },\n )\n</script>\n\n<template>\n <th\n :scope=\"props.scope\"\n :class=\"cn(tableCell({ align: props.align, sticky: props.sticky, head: true }), props.class)\"\n >\n <slot />\n </th>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import { tableCell, type TableCellVariants } from './table.variants'\n\n defineOptions({ name: 'HnTableCell' })\n\n const props = withDefaults(\n defineProps<{\n align?: TableCellVariants['align']\n sticky?: boolean\n class?: string\n }>(),\n { sticky: false },\n )\n</script>\n\n<template>\n <td :class=\"cn(tableCell({ align: props.align, sticky: props.sticky }), props.class)\">\n <slot />\n </td>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import { tableCell, type TableCellVariants } from './table.variants'\n\n defineOptions({ name: 'HnTableCell' })\n\n const props = withDefaults(\n defineProps<{\n align?: TableCellVariants['align']\n sticky?: boolean\n class?: string\n }>(),\n { sticky: false },\n )\n</script>\n\n<template>\n <td :class=\"cn(tableCell({ align: props.align, sticky: props.sticky }), props.class)\">\n <slot />\n </td>\n</template>\n","import { inject, provide, type InjectionKey } from 'vue'\nimport type { TabsVariants } from './tabs.variants'\n\nexport interface TabsStyleContext {\n variant: NonNullable<TabsVariants['variant']>\n size: NonNullable<TabsVariants['size']>\n orientation: NonNullable<TabsVariants['orientation']>\n highlightId: string\n}\n\nconst TABS_STYLE_KEY: InjectionKey<TabsStyleContext> = Symbol('hn-tabs-style')\n\nexport function provideTabsStyle(ctx: TabsStyleContext) {\n provide(TABS_STYLE_KEY, ctx)\n}\n\nexport function useTabsStyle(): TabsStyleContext {\n return inject(TABS_STYLE_KEY, {\n variant: 'underline',\n size: 'md',\n orientation: 'horizontal',\n highlightId: '',\n })\n}\n","<script setup lang=\"ts\">\n import { TabsRoot } from 'reka-ui'\n import { useId } from 'vue'\n import { cn } from '../../lib/cn'\n import { provideTabsStyle } from './context'\n\n defineOptions({ name: 'HnTabs' })\n\n const props = withDefaults(\n defineProps<{\n defaultValue?: string\n variant?: 'underline' | 'soft'\n size?: 'sm' | 'md' | 'lg'\n orientation?: 'horizontal' | 'vertical'\n class?: string\n }>(),\n { variant: 'underline', size: 'md', orientation: 'horizontal' },\n )\n\n const modelValue = defineModel<string>()\n\n provideTabsStyle({\n variant: props.variant,\n size: props.size,\n orientation: props.orientation,\n highlightId: useId(),\n })\n</script>\n\n<template>\n <TabsRoot\n v-model=\"modelValue\"\n :default-value=\"props.defaultValue\"\n :orientation=\"props.orientation\"\n :class=\"\n cn('flex', props.orientation === 'vertical' ? 'flex-row gap-4' : 'flex-col', props.class)\n \"\n >\n <slot />\n </TabsRoot>\n</template>\n","<script setup lang=\"ts\">\n import { TabsRoot } from 'reka-ui'\n import { useId } from 'vue'\n import { cn } from '../../lib/cn'\n import { provideTabsStyle } from './context'\n\n defineOptions({ name: 'HnTabs' })\n\n const props = withDefaults(\n defineProps<{\n defaultValue?: string\n variant?: 'underline' | 'soft'\n size?: 'sm' | 'md' | 'lg'\n orientation?: 'horizontal' | 'vertical'\n class?: string\n }>(),\n { variant: 'underline', size: 'md', orientation: 'horizontal' },\n )\n\n const modelValue = defineModel<string>()\n\n provideTabsStyle({\n variant: props.variant,\n size: props.size,\n orientation: props.orientation,\n highlightId: useId(),\n })\n</script>\n\n<template>\n <TabsRoot\n v-model=\"modelValue\"\n :default-value=\"props.defaultValue\"\n :orientation=\"props.orientation\"\n :class=\"\n cn('flex', props.orientation === 'vertical' ? 'flex-row gap-4' : 'flex-col', props.class)\n \"\n >\n <slot />\n </TabsRoot>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const tabsList = tv({\n base: 'relative isolate flex',\n variants: {\n variant: {\n underline: 'border-line gap-1',\n soft: 'bg-subtle gap-1 rounded-lg p-1',\n },\n orientation: {\n horizontal: 'flex-row items-center',\n vertical: 'flex-col items-stretch',\n },\n },\n compoundVariants: [\n { variant: 'underline', orientation: 'horizontal', class: 'border-b' },\n { variant: 'underline', orientation: 'vertical', class: 'border-e' },\n { variant: 'soft', orientation: 'horizontal', class: 'inline-flex w-fit' },\n { variant: 'soft', orientation: 'vertical', class: 'h-fit' },\n ],\n defaultVariants: { variant: 'underline', orientation: 'horizontal' },\n})\n\nexport const tabsScroll = tv({\n base: '',\n variants: {\n variant: {\n underline: '',\n soft: '',\n },\n orientation: {\n horizontal: 'max-w-full',\n vertical: 'max-h-full',\n },\n },\n compoundVariants: [{ variant: 'soft', orientation: 'horizontal', class: 'w-fit' }],\n defaultVariants: { variant: 'underline', orientation: 'horizontal' },\n})\n\nexport const tabsHighlight = tv({\n base: 'absolute -z-10',\n variants: {\n variant: {\n underline: 'bg-accent rounded-full',\n soft: 'bg-surface inset-0 rounded-md shadow-sm',\n },\n orientation: {\n horizontal: '',\n vertical: '',\n },\n },\n compoundVariants: [\n { variant: 'underline', orientation: 'horizontal', class: 'inset-x-0 bottom-px h-0.5' },\n { variant: 'underline', orientation: 'vertical', class: 'inset-y-0 end-px w-0.5' },\n ],\n defaultVariants: { variant: 'underline', orientation: 'horizontal' },\n})\n\nexport const tabsTrigger = tv({\n base: [\n 'hn-interactive hn-state-layer hn-press-none hn-focus-ring text-muted relative z-[1] inline-flex shrink-0 items-center gap-1.5 text-sm font-medium whitespace-nowrap select-none',\n '[--hn-state-selected-opacity:0] [--hn-state-selected-color:var(--hn-fg-muted)]',\n 'data-[state=active]:z-0',\n 'disabled:pointer-events-none disabled:opacity-50',\n '[&_svg]:size-4',\n ],\n variants: {\n variant: {\n underline: 'data-[state=active]:text-accent-text [--hn-ripple-color:var(--hn-accent)]',\n soft: 'rounded-md data-[state=active]:text-fg',\n },\n orientation: {\n horizontal: '',\n vertical: 'justify-start',\n },\n size: {\n sm: '',\n md: '',\n lg: '',\n },\n },\n compoundVariants: [\n { variant: 'underline', orientation: 'horizontal', class: '-mb-px rounded-t-sm' },\n { variant: 'underline', orientation: 'vertical', class: '-me-px rounded-s-sm' },\n { variant: 'underline', size: 'sm', class: 'h-8 px-2.5' },\n { variant: 'underline', size: 'md', class: 'h-9 px-3' },\n { variant: 'underline', size: 'lg', class: 'h-10 px-3.5' },\n { variant: 'soft', size: 'sm', class: 'h-7 px-2.5' },\n { variant: 'soft', size: 'md', class: 'h-8 px-3' },\n { variant: 'soft', size: 'lg', class: 'h-9 px-3.5' },\n ],\n defaultVariants: { variant: 'underline', orientation: 'horizontal', size: 'md' },\n})\n\nexport type TabsVariants = VariantProps<typeof tabsTrigger>\n","<script setup lang=\"ts\">\n import { TabsList } from 'reka-ui'\n import ScrollArea from '../scroll-area/ScrollArea.vue'\n import { cn } from '../../lib/cn'\n import { useTabsStyle } from './context'\n import { tabsList, tabsScroll } from './tabs.variants'\n\n defineOptions({ name: 'HnTabsList' })\n\n const props = defineProps<{\n label?: string\n class?: string\n }>()\n\n const { variant, orientation } = useTabsStyle()\n</script>\n\n<template>\n <ScrollArea\n :direction=\"orientation\"\n :scrollbar=\"false\"\n :class=\"cn(tabsScroll({ variant, orientation }), props.class)\"\n >\n <TabsList :aria-label=\"props.label\" :class=\"cn(tabsList({ variant, orientation }))\">\n <slot />\n </TabsList>\n </ScrollArea>\n</template>\n","<script setup lang=\"ts\">\n import { TabsList } from 'reka-ui'\n import ScrollArea from '../scroll-area/ScrollArea.vue'\n import { cn } from '../../lib/cn'\n import { useTabsStyle } from './context'\n import { tabsList, tabsScroll } from './tabs.variants'\n\n defineOptions({ name: 'HnTabsList' })\n\n const props = defineProps<{\n label?: string\n class?: string\n }>()\n\n const { variant, orientation } = useTabsStyle()\n</script>\n\n<template>\n <ScrollArea\n :direction=\"orientation\"\n :scrollbar=\"false\"\n :class=\"cn(tabsScroll({ variant, orientation }), props.class)\"\n >\n <TabsList :aria-label=\"props.label\" :class=\"cn(tabsList({ variant, orientation }))\">\n <slot />\n </TabsList>\n </ScrollArea>\n</template>\n","<script setup lang=\"ts\">\n import { TabsTrigger, injectTabsRootContext } from 'reka-ui'\n import { computed } from 'vue'\n import Highlight from '../highlight/Highlight.vue'\n import Ripple from '../ripple/Ripple.vue'\n import { cn } from '../../lib/cn'\n import { useTabsStyle } from './context'\n import { tabsHighlight, tabsTrigger } from './tabs.variants'\n\n defineOptions({ name: 'HnTabsTrigger' })\n\n const props = defineProps<{\n value: string\n disabled?: boolean\n class?: string\n }>()\n\n const { variant, size, orientation, highlightId } = useTabsStyle()\n const root = injectTabsRootContext()\n const active = computed(() => root.modelValue.value === props.value)\n</script>\n\n<template>\n <TabsTrigger\n :value=\"props.value\"\n :disabled=\"props.disabled\"\n :class=\"cn(tabsTrigger({ variant, size, orientation }), props.class)\"\n >\n <Highlight v-if=\"active\" :id=\"highlightId\" :class=\"tabsHighlight({ variant, orientation })\" />\n <Ripple />\n <slot />\n </TabsTrigger>\n</template>\n","<script setup lang=\"ts\">\n import { TabsTrigger, injectTabsRootContext } from 'reka-ui'\n import { computed } from 'vue'\n import Highlight from '../highlight/Highlight.vue'\n import Ripple from '../ripple/Ripple.vue'\n import { cn } from '../../lib/cn'\n import { useTabsStyle } from './context'\n import { tabsHighlight, tabsTrigger } from './tabs.variants'\n\n defineOptions({ name: 'HnTabsTrigger' })\n\n const props = defineProps<{\n value: string\n disabled?: boolean\n class?: string\n }>()\n\n const { variant, size, orientation, highlightId } = useTabsStyle()\n const root = injectTabsRootContext()\n const active = computed(() => root.modelValue.value === props.value)\n</script>\n\n<template>\n <TabsTrigger\n :value=\"props.value\"\n :disabled=\"props.disabled\"\n :class=\"cn(tabsTrigger({ variant, size, orientation }), props.class)\"\n >\n <Highlight v-if=\"active\" :id=\"highlightId\" :class=\"tabsHighlight({ variant, orientation })\" />\n <Ripple />\n <slot />\n </TabsTrigger>\n</template>\n","<script setup lang=\"ts\">\n import { TabsContent } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnTabsContent' })\n\n const props = defineProps<{\n value: string\n class?: string\n }>()\n</script>\n\n<template>\n <TabsContent :value=\"props.value\" :class=\"cn('hn-focus-ring outline-none', props.class)\">\n <slot />\n </TabsContent>\n</template>\n","<script setup lang=\"ts\">\n import { TabsContent } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnTabsContent' })\n\n const props = defineProps<{\n value: string\n class?: string\n }>()\n</script>\n\n<template>\n <TabsContent :value=\"props.value\" :class=\"cn('hn-focus-ring outline-none', props.class)\">\n <slot />\n </TabsContent>\n</template>\n","const INTERACTIVE = 'button, a, input, textarea, select, [contenteditable], [role=\"button\"]'\nconst CONTROL = 'input:not([type=\"hidden\"]), textarea'\n\nfunction controlOf(node: Element) {\n const control = node.matches(CONTROL) ? node : node.querySelector(CONTROL)\n return control instanceof HTMLInputElement || control instanceof HTMLTextAreaElement\n ? control\n : null\n}\n\n/**\n * 点击输入面里非交互的部分(附属格、前后缀、空白)时把焦点交给最近的输入区,返回被聚焦的输入区;点击落在交互元素上或者没有可聚焦的输入区时返回 null。\n * 点击所在的段自己含输入区时只认它、不动光标(段内的处理器已经定过位);否则先向后找,再向前找;落在点击位置之后的输入区把光标放到开头,之前的放到末尾。\n */\nexport function focusFieldFrom(root: HTMLElement, target: HTMLElement) {\n if (target.closest(INTERACTIVE)) return null\n const segments = Array.from(root.children)\n const from = segments.findIndex(segment => segment.contains(target))\n const own = from >= 0 ? controlOf(segments[from]!) : null\n if (own && !own.disabled) {\n own.focus()\n return own\n }\n const after = segments.slice(from + 1)\n const before = segments.slice(0, Math.max(from, 0)).reverse()\n for (const [list, caret] of [\n [after, 'start'],\n [before, 'end'],\n ] as const) {\n for (const segment of list) {\n const control = controlOf(segment)\n if (!control || control.disabled) continue\n control.focus()\n const at = caret === 'start' ? 0 : control.value.length\n control.setSelectionRange(at, at)\n return control\n }\n }\n return null\n}\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const inputHost = tv({\n base: [\n 'hn-field text-fg flex w-full min-w-0 cursor-text items-stretch overflow-hidden rounded-md border font-medium',\n 'has-disabled:cursor-not-allowed has-disabled:opacity-50',\n ],\n variants: {\n variant: {\n primary:\n 'border-line [--hn-field-bg:var(--hn-surface)] [--hn-field-shadow:var(--hn-shadow-sm)]',\n secondary: 'border-transparent [--hn-field-bg:var(--hn-bg-inset)]',\n },\n size: {\n sm: 'h-[var(--hn-control-h-sm)] text-sm [--hn-input-h:var(--hn-control-h-sm)] [--hn-input-px:var(--hn-control-px-sm)] [--hn-input-icon:0.875rem]',\n md: 'h-[var(--hn-control-h-md)] text-base [--hn-input-h:var(--hn-control-h-md)] [--hn-input-px:var(--hn-control-px-md)] [--hn-input-icon:1rem]',\n lg: 'h-[var(--hn-control-h-lg)] text-md [--hn-input-h:var(--hn-control-h-lg)] [--hn-input-px:var(--hn-control-px-lg)] [--hn-input-icon:1.125rem]',\n },\n },\n defaultVariants: {\n variant: 'primary',\n size: 'md',\n },\n})\n\nexport const inputControl = tv({\n base: [\n 'h-full min-w-0 flex-1 bg-transparent px-[var(--hn-input-px)] text-inherit outline-none [font:inherit]',\n 'placeholder:text-faint placeholder:font-normal disabled:cursor-not-allowed',\n ],\n variants: {\n leading: {\n true: 'ps-0',\n },\n trailing: {\n true: 'pe-0',\n },\n },\n})\n\nexport const inputAdornment = tv({\n base: [\n 'text-muted relative flex min-w-[var(--hn-input-h)] shrink-0 items-center justify-center self-stretch px-1',\n '[&>svg]:size-[var(--hn-input-icon)] [&>span_svg]:size-[var(--hn-input-icon)]',\n ],\n})\n\nexport const inputAction = tv({\n base: [\n 'hn-interactive hn-state-layer text-fg cursor-pointer outline-none',\n 'focus-visible:[outline-offset:calc(var(--hn-focus-ring-offset)*-1)]',\n 'disabled:pointer-events-none',\n ],\n})\n\nexport const inputIndicator = tv({\n base: 'cursor-pointer outline-none',\n})\n\nexport const inputActionSlot = tv({\n base: 'flex shrink-0 items-stretch self-stretch',\n})\n\nexport type InputVariants = VariantProps<typeof inputHost>\n\nexport const inputEmbedded = tv({\n base: 'flex min-w-0 flex-1 items-stretch',\n})\n","<script setup lang=\"ts\">\n import { Primitive } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { inputAction, inputAdornment } from './input.variants'\n\n defineOptions({ name: 'HnInputAction' })\n\n const props = defineProps<{\n label: string\n disabled?: boolean\n class?: string\n }>()\n</script>\n\n<template>\n <Primitive\n as=\"button\"\n type=\"button\"\n :aria-label=\"props.label\"\n :disabled=\"props.disabled\"\n :class=\"cn(inputAdornment(), inputAction(), props.class)\"\n @mousedown.prevent\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\n import { Primitive } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { inputAction, inputAdornment } from './input.variants'\n\n defineOptions({ name: 'HnInputAction' })\n\n const props = defineProps<{\n label: string\n disabled?: boolean\n class?: string\n }>()\n</script>\n\n<template>\n <Primitive\n as=\"button\"\n type=\"button\"\n :aria-label=\"props.label\"\n :disabled=\"props.disabled\"\n :class=\"cn(inputAdornment(), inputAction(), props.class)\"\n @mousedown.prevent\n >\n <slot />\n </Primitive>\n</template>\n","import {\n computed,\n inject,\n provide,\n useAttrs,\n watchEffect,\n type ComputedRef,\n type InjectionKey,\n type Ref,\n} from 'vue'\n\nexport interface FormFieldContext {\n id: string\n labelId: string\n controlId: Ref<string>\n name: string | undefined\n invalid: ComputedRef<boolean>\n disabled: ComputedRef<boolean>\n describedBy: ComputedRef<string | undefined>\n}\n\nconst FORM_FIELD_KEY = Symbol('hn-form-field') as InjectionKey<FormFieldContext | null>\n\nexport function provideFormField(context: FormFieldContext) {\n provide(FORM_FIELD_KEY, context)\n}\n\nexport function shieldFormField() {\n provide(FORM_FIELD_KEY, null)\n}\n\nexport function injectFormField() {\n return inject(FORM_FIELD_KEY, null)\n}\n\ninterface Own {\n invalid?: () => boolean | undefined\n disabled?: () => boolean | undefined\n}\n\nexport function useFieldControl(own: Own = {}) {\n const attrs = useAttrs()\n const field = injectFormField()\n const id = computed(() => (attrs.id as string | undefined) ?? field?.id)\n const labelledBy = computed(\n () =>\n (attrs['aria-labelledby'] as string | undefined) ??\n (attrs['aria-label'] ? undefined : field?.labelId),\n )\n const invalid = computed(() => !!own.invalid?.() || !!field?.invalid.value)\n const disabled = computed(() => !!own.disabled?.() || !!field?.disabled.value)\n const describedBy = computed(() => {\n const parts = [attrs['aria-describedby'], field?.describedBy.value].filter(Boolean)\n return parts.length ? parts.join(' ') : undefined\n })\n if (field) {\n watchEffect(() => {\n field.controlId.value = id.value ?? field.id\n })\n }\n return { field, id, labelledBy, invalid, disabled, describedBy }\n}\n","import { inject, provide, type ComputedRef, type InjectionKey } from 'vue'\nimport type { InputVariants } from '../input/input.variants'\n\nexport interface InputGroupContext {\n size: ComputedRef<InputVariants['size']>\n disabled: ComputedRef<boolean>\n invalid: ComputedRef<boolean>\n}\n\nconst INPUT_GROUP_KEY = Symbol('hn-input-group') as InjectionKey<InputGroupContext>\n\nexport function provideInputGroup(context: InputGroupContext) {\n provide(INPUT_GROUP_KEY, context)\n}\n\nexport function injectInputGroup() {\n return inject(INPUT_GROUP_KEY, null)\n}\n","<script setup lang=\"ts\">\n import { computed, shallowRef, useSlots } from 'vue'\n import { cn } from '../../lib/cn'\n import { focusFieldFrom } from '../../lib/field-focus'\n import { useUiLocale } from '../../locale'\n import { X } from '@lucide/vue'\n import IconSlot from '../button/IconSlot.vue'\n import InputAction from './InputAction.vue'\n import Spinner from '../spinner/Spinner.vue'\n import { useFieldControl } from '../form-field/context'\n import { injectInputGroup } from '../input-group/context'\n import {\n inputActionSlot,\n inputAdornment,\n inputControl,\n inputEmbedded,\n inputHost,\n type InputVariants,\n } from './input.variants'\n\n defineOptions({ name: 'HnInputBase', inheritAttrs: false })\n\n const props = defineProps<{\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n clearable?: boolean\n loading?: boolean\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>()\n const emit = defineEmits<{ clear: [] }>()\n\n const model = defineModel<string>()\n\n const slots = useSlots()\n const t = useUiLocale()\n const group = injectInputGroup()\n const el = shallowRef<HTMLInputElement | null>(null)\n\n const size = computed(() => (group ? group.size.value : props.size))\n const {\n id: fieldId,\n invalid,\n disabled,\n describedBy,\n } = useFieldControl({\n invalid: () => props.invalid || !!group?.invalid.value,\n disabled: () => props.disabled || !!group?.disabled.value,\n })\n const clearing = computed(() => !!props.clearable && !!model.value && !disabled.value)\n const trailingSpinner = computed(() => !!props.loading && !slots.leading)\n const spinnerSize = computed(() => (size.value === 'lg' ? 'md' : 'sm'))\n\n function clear() {\n if (!model.value) return\n model.value = ''\n emit('clear')\n el.value?.focus()\n }\n\n defineExpose({ clear, focus: () => el.value?.focus() })\n</script>\n\n<template>\n <div\n data-hn-input\n :data-invalid=\"invalid ? '' : undefined\"\n :aria-busy=\"props.loading || undefined\"\n :class=\"\n cn(\n group ? inputEmbedded() : inputHost({ variant: props.variant, size: props.size }),\n props.class,\n )\n \"\n @click=\"focusFieldFrom($event.currentTarget as HTMLElement, $event.target as HTMLElement)\"\n >\n <span v-if=\"slots.leading\" :class=\"inputAdornment()\">\n <IconSlot\n box-class=\"relative inline-flex items-center justify-center\"\n :swapped=\"!!props.loading\"\n :spinner-size=\"spinnerSize\"\n >\n <slot name=\"leading\" />\n </IconSlot>\n </span>\n <input\n ref=\"el\"\n v-bind=\"$attrs\"\n v-model=\"model\"\n :id=\"fieldId\"\n :disabled=\"disabled\"\n :aria-invalid=\"invalid || undefined\"\n :aria-describedby=\"describedBy\"\n :class=\"\n inputControl({\n leading: !!slots.leading,\n trailing: clearing || trailingSpinner || !!slots.trailing,\n })\n \"\n />\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-90 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-90 opacity-0\"\n >\n <span v-if=\"trailingSpinner\" :class=\"inputAdornment()\">\n <Spinner :size=\"spinnerSize\" />\n </span>\n </Transition>\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-90 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-90 opacity-0\"\n >\n <span v-if=\"clearing\" :class=\"inputActionSlot()\">\n <InputAction :label=\"t.common.clear\" @click=\"clear\">\n <X />\n </InputAction>\n </span>\n </Transition>\n <slot name=\"action\" />\n <span v-if=\"slots.trailing\" :class=\"inputAdornment()\">\n <slot name=\"trailing\" />\n </span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed, shallowRef, useSlots } from 'vue'\n import { cn } from '../../lib/cn'\n import { focusFieldFrom } from '../../lib/field-focus'\n import { useUiLocale } from '../../locale'\n import { X } from '@lucide/vue'\n import IconSlot from '../button/IconSlot.vue'\n import InputAction from './InputAction.vue'\n import Spinner from '../spinner/Spinner.vue'\n import { useFieldControl } from '../form-field/context'\n import { injectInputGroup } from '../input-group/context'\n import {\n inputActionSlot,\n inputAdornment,\n inputControl,\n inputEmbedded,\n inputHost,\n type InputVariants,\n } from './input.variants'\n\n defineOptions({ name: 'HnInputBase', inheritAttrs: false })\n\n const props = defineProps<{\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n clearable?: boolean\n loading?: boolean\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>()\n const emit = defineEmits<{ clear: [] }>()\n\n const model = defineModel<string>()\n\n const slots = useSlots()\n const t = useUiLocale()\n const group = injectInputGroup()\n const el = shallowRef<HTMLInputElement | null>(null)\n\n const size = computed(() => (group ? group.size.value : props.size))\n const {\n id: fieldId,\n invalid,\n disabled,\n describedBy,\n } = useFieldControl({\n invalid: () => props.invalid || !!group?.invalid.value,\n disabled: () => props.disabled || !!group?.disabled.value,\n })\n const clearing = computed(() => !!props.clearable && !!model.value && !disabled.value)\n const trailingSpinner = computed(() => !!props.loading && !slots.leading)\n const spinnerSize = computed(() => (size.value === 'lg' ? 'md' : 'sm'))\n\n function clear() {\n if (!model.value) return\n model.value = ''\n emit('clear')\n el.value?.focus()\n }\n\n defineExpose({ clear, focus: () => el.value?.focus() })\n</script>\n\n<template>\n <div\n data-hn-input\n :data-invalid=\"invalid ? '' : undefined\"\n :aria-busy=\"props.loading || undefined\"\n :class=\"\n cn(\n group ? inputEmbedded() : inputHost({ variant: props.variant, size: props.size }),\n props.class,\n )\n \"\n @click=\"focusFieldFrom($event.currentTarget as HTMLElement, $event.target as HTMLElement)\"\n >\n <span v-if=\"slots.leading\" :class=\"inputAdornment()\">\n <IconSlot\n box-class=\"relative inline-flex items-center justify-center\"\n :swapped=\"!!props.loading\"\n :spinner-size=\"spinnerSize\"\n >\n <slot name=\"leading\" />\n </IconSlot>\n </span>\n <input\n ref=\"el\"\n v-bind=\"$attrs\"\n v-model=\"model\"\n :id=\"fieldId\"\n :disabled=\"disabled\"\n :aria-invalid=\"invalid || undefined\"\n :aria-describedby=\"describedBy\"\n :class=\"\n inputControl({\n leading: !!slots.leading,\n trailing: clearing || trailingSpinner || !!slots.trailing,\n })\n \"\n />\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-90 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-90 opacity-0\"\n >\n <span v-if=\"trailingSpinner\" :class=\"inputAdornment()\">\n <Spinner :size=\"spinnerSize\" />\n </span>\n </Transition>\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-90 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-90 opacity-0\"\n >\n <span v-if=\"clearing\" :class=\"inputActionSlot()\">\n <InputAction :label=\"t.common.clear\" @click=\"clear\">\n <X />\n </InputAction>\n </span>\n </Transition>\n <slot name=\"action\" />\n <span v-if=\"slots.trailing\" :class=\"inputAdornment()\">\n <slot name=\"trailing\" />\n </span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { shallowRef } from 'vue'\n import InputBase from './InputBase.vue'\n import type { InputVariants } from './input.variants'\n\n defineOptions({ name: 'HnInput', inheritAttrs: false })\n\n const props = defineProps<{\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n clearable?: boolean\n loading?: boolean\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>()\n const emit = defineEmits<{ clear: [] }>()\n\n const model = defineModel<string>()\n\n const base = shallowRef<InstanceType<typeof InputBase> | null>(null)\n\n defineExpose({ clear: () => base.value?.clear(), focus: () => base.value?.focus() })\n</script>\n\n<template>\n <InputBase\n ref=\"base\"\n v-bind=\"$attrs\"\n v-model=\"model\"\n :variant=\"props.variant\"\n :size=\"props.size\"\n :clearable=\"props.clearable\"\n :loading=\"props.loading\"\n :disabled=\"props.disabled\"\n :invalid=\"props.invalid\"\n :class=\"props.class\"\n @clear=\"emit('clear')\"\n >\n <template v-if=\"$slots.leading\" #leading><slot name=\"leading\" /></template>\n <template v-if=\"$slots.trailing\" #trailing><slot name=\"trailing\" /></template>\n </InputBase>\n</template>\n","<script setup lang=\"ts\">\n import { shallowRef } from 'vue'\n import InputBase from './InputBase.vue'\n import type { InputVariants } from './input.variants'\n\n defineOptions({ name: 'HnInput', inheritAttrs: false })\n\n const props = defineProps<{\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n clearable?: boolean\n loading?: boolean\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>()\n const emit = defineEmits<{ clear: [] }>()\n\n const model = defineModel<string>()\n\n const base = shallowRef<InstanceType<typeof InputBase> | null>(null)\n\n defineExpose({ clear: () => base.value?.clear(), focus: () => base.value?.focus() })\n</script>\n\n<template>\n <InputBase\n ref=\"base\"\n v-bind=\"$attrs\"\n v-model=\"model\"\n :variant=\"props.variant\"\n :size=\"props.size\"\n :clearable=\"props.clearable\"\n :loading=\"props.loading\"\n :disabled=\"props.disabled\"\n :invalid=\"props.invalid\"\n :class=\"props.class\"\n @clear=\"emit('clear')\"\n >\n <template v-if=\"$slots.leading\" #leading><slot name=\"leading\" /></template>\n <template v-if=\"$slots.trailing\" #trailing><slot name=\"trailing\" /></template>\n </InputBase>\n</template>\n","const MIRRORED = [\n 'font-family',\n 'font-size',\n 'font-weight',\n 'font-style',\n 'font-variant',\n 'font-feature-settings',\n 'line-height',\n 'letter-spacing',\n 'word-spacing',\n 'text-indent',\n 'text-transform',\n 'tab-size',\n 'direction',\n 'padding-top',\n 'padding-right',\n 'padding-bottom',\n 'padding-left',\n 'border-top-width',\n 'border-right-width',\n 'border-bottom-width',\n 'border-left-width',\n]\n\n/**\n * 量出 textarea 光标所在行的顶边(相对 textarea 自身的边框盒)。\n * 原生没有光标几何 API,只能用同排版的镜像块把光标前的文字排一遍。\n */\nexport function caretTop(node: HTMLTextAreaElement, at = node.selectionEnd): number {\n const style = getComputedStyle(node)\n const mirror = node.ownerDocument.createElement('div')\n for (const prop of MIRRORED) mirror.style.setProperty(prop, style.getPropertyValue(prop))\n Object.assign(mirror.style, {\n position: 'absolute',\n top: '0',\n insetInlineStart: '-9999px',\n visibility: 'hidden',\n pointerEvents: 'none',\n boxSizing: 'border-box',\n width: `${node.offsetWidth}px`,\n whiteSpace: 'pre-wrap',\n overflowWrap: 'break-word',\n })\n mirror.textContent = node.value.slice(0, at)\n const marker = node.ownerDocument.createElement('span')\n marker.textContent = node.value.slice(at) || ''\n mirror.append(marker)\n node.ownerDocument.body.append(mirror)\n const top = marker.offsetTop\n mirror.remove()\n return top\n}\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const textarea = tv({\n base: [\n 'hn-field text-fg flex w-full min-w-0 cursor-text flex-col overflow-hidden rounded-md border font-medium',\n 'has-disabled:cursor-not-allowed has-disabled:opacity-50',\n ],\n variants: {\n variant: {\n primary:\n 'border-line [--hn-field-bg:var(--hn-surface)] [--hn-field-shadow:var(--hn-shadow-sm)]',\n secondary: 'border-transparent [--hn-field-bg:var(--hn-bg-inset)]',\n },\n size: {\n sm: 'text-sm [--hn-textarea-h:var(--hn-control-h-sm)] [--hn-textarea-px:var(--hn-control-px-sm)]',\n md: 'text-base [--hn-textarea-h:var(--hn-control-h-md)] [--hn-textarea-px:var(--hn-control-px-md)]',\n lg: 'text-md [--hn-textarea-h:var(--hn-control-h-lg)] [--hn-textarea-px:var(--hn-control-px-lg)]',\n },\n autosize: {\n true: [\n 'min-h-[calc((var(--hn-textarea-rows)_-_1)_*_1lh_+_var(--hn-textarea-h))]',\n 'max-h-[calc((var(--hn-textarea-max-rows)_-_1)_*_1lh_+_var(--hn-textarea-h))]',\n ],\n false: 'h-[calc((var(--hn-textarea-rows)_-_1)_*_1lh_+_var(--hn-textarea-h))]',\n },\n resize: {\n none: 'resize-none',\n vertical: 'resize-y',\n },\n },\n defaultVariants: {\n variant: 'primary',\n size: 'md',\n autosize: false,\n resize: 'vertical',\n },\n})\n\nexport const textareaField = tv({\n base: [\n 'block w-full resize-none overflow-hidden bg-transparent text-inherit outline-none [font:inherit]',\n 'px-[var(--hn-textarea-px)] py-[calc((var(--hn-textarea-h)_-_1lh)/2_-_1px)]',\n 'placeholder:text-faint placeholder:font-normal disabled:cursor-not-allowed',\n ],\n})\n\nexport type TextareaVariants = VariantProps<typeof textarea>\n","<script setup lang=\"ts\">\n import { computed, nextTick, onMounted, shallowRef, watch } from 'vue'\n import { cn } from '../../lib/cn'\n import { useFieldControl } from '../form-field/context'\n import { caretTop } from '../../lib/caret'\n import ScrollArea from '../scroll-area/ScrollArea.vue'\n import { textarea, textareaField, type TextareaVariants } from './textarea.variants'\n\n defineOptions({ name: 'HnTextarea', inheritAttrs: false })\n\n const {\n id: fieldId,\n invalid,\n disabled,\n describedBy,\n } = useFieldControl({\n invalid: () => props.invalid,\n disabled: () => props.disabled,\n })\n\n const props = withDefaults(\n defineProps<{\n variant?: TextareaVariants['variant']\n size?: TextareaVariants['size']\n rows?: number\n autosize?: boolean | { minRows?: number; maxRows?: number }\n resize?: TextareaVariants['resize']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>(),\n { rows: 3 },\n )\n\n const model = defineModel<string>()\n\n const el = shallowRef<HTMLTextAreaElement | null>(null)\n const area = shallowRef<InstanceType<typeof ScrollArea>>()\n\n const bounds = computed(() => {\n const options = props.autosize === true ? {} : props.autosize || null\n return { min: options?.minRows ?? props.rows, max: options?.maxRows }\n })\n\n function fit() {\n const node = el.value\n if (!node) return\n node.style.height = 'auto'\n node.style.height = `${node.scrollHeight}px`\n if (document.activeElement === node) reveal(node)\n }\n\n function reveal(node: HTMLTextAreaElement) {\n const scroller =\n area.value?.viewport ?? node.closest<HTMLElement>('[data-overlayscrollbars-initialize]')\n if (!scroller) return\n const box = scroller.getBoundingClientRect()\n const top = node.getBoundingClientRect().top + caretTop(node)\n const bottom = top + parseFloat(getComputedStyle(node).lineHeight)\n if (bottom > box.bottom) scroller.scrollTop += bottom - box.bottom\n else if (top < box.top) scroller.scrollTop -= box.top - top\n }\n\n function focus(event: MouseEvent) {\n const node = el.value\n if (!node || node.disabled || event.target === node) return\n node.focus()\n node.setSelectionRange(node.value.length, node.value.length)\n }\n\n onMounted(fit)\n watch(\n () => [model.value, props.size, bounds.value.min],\n () => void nextTick(fit),\n )\n</script>\n\n<template>\n <div\n data-hn-textarea\n :data-invalid=\"invalid ? '' : undefined\"\n :style=\"{ '--hn-textarea-rows': bounds.min, '--hn-textarea-max-rows': bounds.max }\"\n :class=\"\n cn(\n textarea({\n variant: props.variant,\n size: props.size,\n autosize: Boolean(props.autosize),\n resize: props.autosize ? 'none' : props.resize,\n }),\n props.class,\n )\n \"\n @click=\"focus\"\n >\n <ScrollArea ref=\"area\" :shadow=\"false\" class=\"min-h-0 grow\">\n <textarea\n ref=\"el\"\n v-bind=\"$attrs\"\n v-model=\"model\"\n :id=\"fieldId\"\n :rows=\"bounds.min\"\n :disabled=\"disabled\"\n :aria-invalid=\"invalid || undefined\"\n :aria-describedby=\"describedBy\"\n :class=\"textareaField()\"\n @input=\"fit\"\n />\n </ScrollArea>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed, nextTick, onMounted, shallowRef, watch } from 'vue'\n import { cn } from '../../lib/cn'\n import { useFieldControl } from '../form-field/context'\n import { caretTop } from '../../lib/caret'\n import ScrollArea from '../scroll-area/ScrollArea.vue'\n import { textarea, textareaField, type TextareaVariants } from './textarea.variants'\n\n defineOptions({ name: 'HnTextarea', inheritAttrs: false })\n\n const {\n id: fieldId,\n invalid,\n disabled,\n describedBy,\n } = useFieldControl({\n invalid: () => props.invalid,\n disabled: () => props.disabled,\n })\n\n const props = withDefaults(\n defineProps<{\n variant?: TextareaVariants['variant']\n size?: TextareaVariants['size']\n rows?: number\n autosize?: boolean | { minRows?: number; maxRows?: number }\n resize?: TextareaVariants['resize']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>(),\n { rows: 3 },\n )\n\n const model = defineModel<string>()\n\n const el = shallowRef<HTMLTextAreaElement | null>(null)\n const area = shallowRef<InstanceType<typeof ScrollArea>>()\n\n const bounds = computed(() => {\n const options = props.autosize === true ? {} : props.autosize || null\n return { min: options?.minRows ?? props.rows, max: options?.maxRows }\n })\n\n function fit() {\n const node = el.value\n if (!node) return\n node.style.height = 'auto'\n node.style.height = `${node.scrollHeight}px`\n if (document.activeElement === node) reveal(node)\n }\n\n function reveal(node: HTMLTextAreaElement) {\n const scroller =\n area.value?.viewport ?? node.closest<HTMLElement>('[data-overlayscrollbars-initialize]')\n if (!scroller) return\n const box = scroller.getBoundingClientRect()\n const top = node.getBoundingClientRect().top + caretTop(node)\n const bottom = top + parseFloat(getComputedStyle(node).lineHeight)\n if (bottom > box.bottom) scroller.scrollTop += bottom - box.bottom\n else if (top < box.top) scroller.scrollTop -= box.top - top\n }\n\n function focus(event: MouseEvent) {\n const node = el.value\n if (!node || node.disabled || event.target === node) return\n node.focus()\n node.setSelectionRange(node.value.length, node.value.length)\n }\n\n onMounted(fit)\n watch(\n () => [model.value, props.size, bounds.value.min],\n () => void nextTick(fit),\n )\n</script>\n\n<template>\n <div\n data-hn-textarea\n :data-invalid=\"invalid ? '' : undefined\"\n :style=\"{ '--hn-textarea-rows': bounds.min, '--hn-textarea-max-rows': bounds.max }\"\n :class=\"\n cn(\n textarea({\n variant: props.variant,\n size: props.size,\n autosize: Boolean(props.autosize),\n resize: props.autosize ? 'none' : props.resize,\n }),\n props.class,\n )\n \"\n @click=\"focus\"\n >\n <ScrollArea ref=\"area\" :shadow=\"false\" class=\"min-h-0 grow\">\n <textarea\n ref=\"el\"\n v-bind=\"$attrs\"\n v-model=\"model\"\n :id=\"fieldId\"\n :rows=\"bounds.min\"\n :disabled=\"disabled\"\n :aria-invalid=\"invalid || undefined\"\n :aria-describedby=\"describedBy\"\n :class=\"textareaField()\"\n @input=\"fit\"\n />\n </ScrollArea>\n </div>\n</template>\n","import { tv } from '../../lib/tv'\n\nexport const numberInputStepper = tv({\n base: 'border-line flex shrink-0 flex-col border-s',\n variants: {\n size: {\n sm: '[&_svg]:size-3',\n md: '[&_svg]:size-3',\n lg: '[&_svg]:size-3.5',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nexport const numberInputStep = tv({\n base: [\n 'hn-interactive hn-state-layer hn-press-none text-muted',\n 'flex min-h-0 flex-1 basis-0 items-center justify-center px-1.5 outline-none',\n 'disabled:pointer-events-none disabled:opacity-40',\n ],\n variants: {\n divided: {\n true: 'border-line border-t',\n },\n },\n})\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { ChevronDown, ChevronUp } from '@lucide/vue'\n import {\n NumberFieldDecrement,\n NumberFieldIncrement,\n NumberFieldInput,\n NumberFieldRoot,\n useForwardPropsEmits,\n type NumberFieldRootEmits,\n } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import { useFieldControl } from '../form-field/context'\n import { injectInputGroup } from '../input-group/context'\n import {\n inputControl,\n inputEmbedded,\n inputHost,\n type InputVariants,\n } from '../input/input.variants'\n import { numberInputStep, numberInputStepper } from './number-input.variants'\n\n defineOptions({ name: 'HnNumberInput', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n modelValue?: number | null\n defaultValue?: number\n min?: number\n max?: number\n step?: number\n stepSnapping?: boolean\n formatOptions?: Intl.NumberFormatOptions\n locale?: string\n controls?: boolean\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n disabled?: boolean\n readonly?: boolean\n invalid?: boolean\n class?: string\n }>(),\n { step: 1, stepSnapping: true, controls: true },\n )\n const emits = defineEmits<NumberFieldRootEmits>()\n\n const t = useUiLocale()\n const group = injectInputGroup()\n const size = computed(() => (group ? group.size.value : props.size))\n const {\n id: fieldId,\n invalid,\n disabled,\n describedBy,\n } = useFieldControl({\n invalid: () => props.invalid || !!group?.invalid.value,\n disabled: () => props.disabled || !!group?.disabled.value,\n })\n\n const forwarded = useForwardPropsEmits(\n () => ({\n modelValue: props.modelValue,\n defaultValue: props.defaultValue,\n min: props.min,\n max: props.max,\n step: props.step,\n stepSnapping: props.stepSnapping,\n formatOptions: props.formatOptions,\n readonly: props.readonly,\n }),\n emits,\n )\n</script>\n\n<template>\n <NumberFieldRoot\n v-bind=\"forwarded\"\n :locale=\"props.locale ?? t.tag\"\n :disabled=\"disabled\"\n data-hn-number-input\n :data-invalid=\"invalid ? '' : undefined\"\n :class=\"\n cn(\n group ? inputEmbedded() : inputHost({ variant: props.variant, size: props.size }),\n props.class,\n )\n \"\n >\n <NumberFieldInput\n v-bind=\"$attrs\"\n :id=\"fieldId\"\n :aria-invalid=\"invalid || undefined\"\n :aria-describedby=\"describedBy\"\n :class=\"cn(inputControl(), 'tabular-nums')\"\n />\n <div v-if=\"props.controls\" :class=\"numberInputStepper({ size })\">\n <NumberFieldIncrement :aria-label=\"t.numberInput.increase\" :class=\"numberInputStep()\">\n <ChevronUp />\n </NumberFieldIncrement>\n <NumberFieldDecrement\n :aria-label=\"t.numberInput.decrease\"\n :class=\"numberInputStep({ divided: true })\"\n >\n <ChevronDown />\n </NumberFieldDecrement>\n </div>\n </NumberFieldRoot>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { ChevronDown, ChevronUp } from '@lucide/vue'\n import {\n NumberFieldDecrement,\n NumberFieldIncrement,\n NumberFieldInput,\n NumberFieldRoot,\n useForwardPropsEmits,\n type NumberFieldRootEmits,\n } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import { useFieldControl } from '../form-field/context'\n import { injectInputGroup } from '../input-group/context'\n import {\n inputControl,\n inputEmbedded,\n inputHost,\n type InputVariants,\n } from '../input/input.variants'\n import { numberInputStep, numberInputStepper } from './number-input.variants'\n\n defineOptions({ name: 'HnNumberInput', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n modelValue?: number | null\n defaultValue?: number\n min?: number\n max?: number\n step?: number\n stepSnapping?: boolean\n formatOptions?: Intl.NumberFormatOptions\n locale?: string\n controls?: boolean\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n disabled?: boolean\n readonly?: boolean\n invalid?: boolean\n class?: string\n }>(),\n { step: 1, stepSnapping: true, controls: true },\n )\n const emits = defineEmits<NumberFieldRootEmits>()\n\n const t = useUiLocale()\n const group = injectInputGroup()\n const size = computed(() => (group ? group.size.value : props.size))\n const {\n id: fieldId,\n invalid,\n disabled,\n describedBy,\n } = useFieldControl({\n invalid: () => props.invalid || !!group?.invalid.value,\n disabled: () => props.disabled || !!group?.disabled.value,\n })\n\n const forwarded = useForwardPropsEmits(\n () => ({\n modelValue: props.modelValue,\n defaultValue: props.defaultValue,\n min: props.min,\n max: props.max,\n step: props.step,\n stepSnapping: props.stepSnapping,\n formatOptions: props.formatOptions,\n readonly: props.readonly,\n }),\n emits,\n )\n</script>\n\n<template>\n <NumberFieldRoot\n v-bind=\"forwarded\"\n :locale=\"props.locale ?? t.tag\"\n :disabled=\"disabled\"\n data-hn-number-input\n :data-invalid=\"invalid ? '' : undefined\"\n :class=\"\n cn(\n group ? inputEmbedded() : inputHost({ variant: props.variant, size: props.size }),\n props.class,\n )\n \"\n >\n <NumberFieldInput\n v-bind=\"$attrs\"\n :id=\"fieldId\"\n :aria-invalid=\"invalid || undefined\"\n :aria-describedby=\"describedBy\"\n :class=\"cn(inputControl(), 'tabular-nums')\"\n />\n <div v-if=\"props.controls\" :class=\"numberInputStepper({ size })\">\n <NumberFieldIncrement :aria-label=\"t.numberInput.increase\" :class=\"numberInputStep()\">\n <ChevronUp />\n </NumberFieldIncrement>\n <NumberFieldDecrement\n :aria-label=\"t.numberInput.decrease\"\n :class=\"numberInputStep({ divided: true })\"\n >\n <ChevronDown />\n </NumberFieldDecrement>\n </div>\n </NumberFieldRoot>\n</template>\n","<script setup lang=\"ts\">\n import { Eye, EyeOff } from '@lucide/vue'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import InputBase from '../input/InputBase.vue'\n import InputAction from '../input/InputAction.vue'\n import type { InputVariants } from '../input/input.variants'\n\n defineOptions({ name: 'HnPasswordInput', inheritAttrs: false })\n\n const props = defineProps<{\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>()\n\n const model = defineModel<string>()\n const visible = defineModel<boolean>('visible', { default: false })\n\n const t = useUiLocale()\n</script>\n\n<template>\n <InputBase\n v-bind=\"$attrs\"\n v-model=\"model\"\n :type=\"visible ? 'text' : 'password'\"\n :variant=\"props.variant\"\n :size=\"props.size\"\n :disabled=\"props.disabled\"\n :invalid=\"props.invalid\"\n :class=\"cn('[&_input::-ms-reveal]:hidden', props.class)\"\n >\n <template #action>\n <InputAction\n :label=\"visible ? t.passwordInput.hide : t.passwordInput.show\"\n :disabled=\"props.disabled\"\n @click=\"visible = !visible\"\n >\n <span class=\"relative inline-flex\">\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-90 opacity-0\"\n leave-active-class=\"hn-transition absolute\"\n leave-to-class=\"scale-90 opacity-0\"\n >\n <EyeOff v-if=\"visible\" key=\"hide\" />\n <Eye v-else key=\"show\" />\n </Transition>\n </span>\n </InputAction>\n </template>\n </InputBase>\n</template>\n","<script setup lang=\"ts\">\n import { Eye, EyeOff } from '@lucide/vue'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import InputBase from '../input/InputBase.vue'\n import InputAction from '../input/InputAction.vue'\n import type { InputVariants } from '../input/input.variants'\n\n defineOptions({ name: 'HnPasswordInput', inheritAttrs: false })\n\n const props = defineProps<{\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>()\n\n const model = defineModel<string>()\n const visible = defineModel<boolean>('visible', { default: false })\n\n const t = useUiLocale()\n</script>\n\n<template>\n <InputBase\n v-bind=\"$attrs\"\n v-model=\"model\"\n :type=\"visible ? 'text' : 'password'\"\n :variant=\"props.variant\"\n :size=\"props.size\"\n :disabled=\"props.disabled\"\n :invalid=\"props.invalid\"\n :class=\"cn('[&_input::-ms-reveal]:hidden', props.class)\"\n >\n <template #action>\n <InputAction\n :label=\"visible ? t.passwordInput.hide : t.passwordInput.show\"\n :disabled=\"props.disabled\"\n @click=\"visible = !visible\"\n >\n <span class=\"relative inline-flex\">\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-90 opacity-0\"\n leave-active-class=\"hn-transition absolute\"\n leave-to-class=\"scale-90 opacity-0\"\n >\n <EyeOff v-if=\"visible\" key=\"hide\" />\n <Eye v-else key=\"show\" />\n </Transition>\n </span>\n </InputAction>\n </template>\n </InputBase>\n</template>\n","<script setup lang=\"ts\">\n import { Search } from '@lucide/vue'\n import { cn } from '../../lib/cn'\n import InputBase from '../input/InputBase.vue'\n import type { InputVariants } from '../input/input.variants'\n\n defineOptions({ name: 'HnSearchInput', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n clearable?: boolean\n loading?: boolean\n disabled?: boolean\n class?: string\n }>(),\n { clearable: true },\n )\n const emit = defineEmits<{ search: [value: string]; clear: [] }>()\n\n const model = defineModel<string>({ default: '' })\n\n function onEscape(event: KeyboardEvent) {\n if (!model.value) return\n event.preventDefault()\n model.value = ''\n emit('clear')\n }\n</script>\n\n<template>\n <InputBase\n type=\"search\"\n enterkeyhint=\"search\"\n v-bind=\"$attrs\"\n v-model=\"model\"\n :variant=\"props.variant\"\n :size=\"props.size\"\n :clearable=\"props.clearable\"\n :loading=\"props.loading\"\n :disabled=\"props.disabled\"\n :class=\"\n cn(\n '[&_input]:appearance-none [&_input::-webkit-search-cancel-button]:appearance-none [&_input::-webkit-search-decoration]:appearance-none',\n props.class,\n )\n \"\n @keydown.enter=\"emit('search', model)\"\n @keydown.esc=\"onEscape\"\n @clear=\"emit('clear')\"\n >\n <template #leading>\n <Search />\n </template>\n </InputBase>\n</template>\n","<script setup lang=\"ts\">\n import { Search } from '@lucide/vue'\n import { cn } from '../../lib/cn'\n import InputBase from '../input/InputBase.vue'\n import type { InputVariants } from '../input/input.variants'\n\n defineOptions({ name: 'HnSearchInput', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n clearable?: boolean\n loading?: boolean\n disabled?: boolean\n class?: string\n }>(),\n { clearable: true },\n )\n const emit = defineEmits<{ search: [value: string]; clear: [] }>()\n\n const model = defineModel<string>({ default: '' })\n\n function onEscape(event: KeyboardEvent) {\n if (!model.value) return\n event.preventDefault()\n model.value = ''\n emit('clear')\n }\n</script>\n\n<template>\n <InputBase\n type=\"search\"\n enterkeyhint=\"search\"\n v-bind=\"$attrs\"\n v-model=\"model\"\n :variant=\"props.variant\"\n :size=\"props.size\"\n :clearable=\"props.clearable\"\n :loading=\"props.loading\"\n :disabled=\"props.disabled\"\n :class=\"\n cn(\n '[&_input]:appearance-none [&_input::-webkit-search-cancel-button]:appearance-none [&_input::-webkit-search-decoration]:appearance-none',\n props.class,\n )\n \"\n @keydown.enter=\"emit('search', model)\"\n @keydown.esc=\"onEscape\"\n @clear=\"emit('clear')\"\n >\n <template #leading>\n <Search />\n </template>\n </InputBase>\n</template>\n","import { tv } from '../../lib/tv'\n\nexport const inputGroup = tv({\n base: [\n '[&>*+*]:border-s [&>*+*]:border-s-line',\n '[&>button]:h-auto [&>button]:rounded-none [&>button]:[--hn-press-scale:1]',\n '[&>button:focus-visible]:-outline-offset-2',\n ],\n})\n\nexport const inputGroupAddon = tv({\n base: 'text-muted flex shrink-0 items-center gap-2 px-[var(--hn-input-px)] whitespace-nowrap [&>svg]:size-[var(--hn-input-icon)]',\n})\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { cn } from '../../lib/cn'\n import { focusFieldFrom } from '../../lib/field-focus'\n import { inputHost, type InputVariants } from '../input/input.variants'\n import { provideInputGroup } from './context'\n import { inputGroup } from './input-group.variants'\n\n defineOptions({ name: 'HnInputGroup' })\n\n const props = defineProps<{\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>()\n\n provideInputGroup({\n size: computed(() => props.size),\n disabled: computed(() => !!props.disabled),\n invalid: computed(() => !!props.invalid),\n })\n</script>\n\n<template>\n <div\n data-hn-input-group\n :data-invalid=\"props.invalid ? '' : undefined\"\n :class=\"cn(inputHost({ variant: props.variant, size: props.size }), inputGroup(), props.class)\"\n @click=\"focusFieldFrom($event.currentTarget as HTMLElement, $event.target as HTMLElement)\"\n >\n <slot />\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { cn } from '../../lib/cn'\n import { focusFieldFrom } from '../../lib/field-focus'\n import { inputHost, type InputVariants } from '../input/input.variants'\n import { provideInputGroup } from './context'\n import { inputGroup } from './input-group.variants'\n\n defineOptions({ name: 'HnInputGroup' })\n\n const props = defineProps<{\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>()\n\n provideInputGroup({\n size: computed(() => props.size),\n disabled: computed(() => !!props.disabled),\n invalid: computed(() => !!props.invalid),\n })\n</script>\n\n<template>\n <div\n data-hn-input-group\n :data-invalid=\"props.invalid ? '' : undefined\"\n :class=\"cn(inputHost({ variant: props.variant, size: props.size }), inputGroup(), props.class)\"\n @click=\"focusFieldFrom($event.currentTarget as HTMLElement, $event.target as HTMLElement)\"\n >\n <slot />\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import { inputGroupAddon } from './input-group.variants'\n\n defineOptions({ name: 'HnInputGroupAddon' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <span data-hn-input-group-addon :class=\"cn(inputGroupAddon(), props.class)\">\n <slot />\n </span>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import { inputGroupAddon } from './input-group.variants'\n\n defineOptions({ name: 'HnInputGroupAddon' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <span data-hn-input-group-addon :class=\"cn(inputGroupAddon(), props.class)\">\n <slot />\n </span>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const disclosureIcon = tv({\n base: 'hn-transition shrink-0',\n variants: {\n direction: {\n down: '',\n end: '',\n },\n state: {\n auto: '',\n open: '',\n closed: '',\n },\n },\n compoundVariants: [\n { direction: 'down', state: 'auto', class: 'group-data-open/hn-disclosure:rotate-180' },\n { direction: 'end', state: 'auto', class: 'group-data-open/hn-disclosure:rotate-90' },\n { direction: 'down', state: 'open', class: 'rotate-180' },\n { direction: 'end', state: 'open', class: 'rotate-90' },\n ],\n defaultVariants: { direction: 'down', state: 'auto' },\n})\n\nexport type DisclosureIconVariants = VariantProps<typeof disclosureIcon>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { ChevronDown, ChevronRight } from '@lucide/vue'\n import { cn } from '../../lib/cn'\n import { disclosureIcon, type DisclosureIconVariants } from './disclosure-icon.variants'\n\n defineOptions({ name: 'HnDisclosureIcon' })\n\n const props = withDefaults(\n defineProps<{\n direction?: DisclosureIconVariants['direction']\n open?: boolean\n class?: string\n }>(),\n { direction: 'down', open: undefined },\n )\n\n const classes = computed(() =>\n cn(\n 'inline-flex',\n disclosureIcon({\n direction: props.direction,\n state: props.open === undefined ? 'auto' : props.open ? 'open' : 'closed',\n }),\n props.class,\n ),\n )\n</script>\n\n<template>\n <span aria-hidden=\"true\" :class=\"classes\">\n <slot>\n <component :is=\"props.direction === 'end' ? ChevronRight : ChevronDown\" />\n </slot>\n </span>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { ChevronDown, ChevronRight } from '@lucide/vue'\n import { cn } from '../../lib/cn'\n import { disclosureIcon, type DisclosureIconVariants } from './disclosure-icon.variants'\n\n defineOptions({ name: 'HnDisclosureIcon' })\n\n const props = withDefaults(\n defineProps<{\n direction?: DisclosureIconVariants['direction']\n open?: boolean\n class?: string\n }>(),\n { direction: 'down', open: undefined },\n )\n\n const classes = computed(() =>\n cn(\n 'inline-flex',\n disclosureIcon({\n direction: props.direction,\n state: props.open === undefined ? 'auto' : props.open ? 'open' : 'closed',\n }),\n props.class,\n ),\n )\n</script>\n\n<template>\n <span aria-hidden=\"true\" :class=\"classes\">\n <slot>\n <component :is=\"props.direction === 'end' ? ChevronRight : ChevronDown\" />\n </slot>\n </span>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const card = tv({\n base: 'bg-surface border-line block rounded-lg border shadow-sm',\n variants: {\n padded: {\n true: 'p-[var(--hn-panel-p)]',\n false: 'overflow-hidden',\n },\n },\n defaultVariants: {\n padded: true,\n },\n})\n\nexport type CardVariants = VariantProps<typeof card>\n","<script setup lang=\"ts\">\n import { Primitive, type PrimitiveProps } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { card } from './card.variants'\n\n defineOptions({ name: 'HnCard' })\n\n const props = withDefaults(\n defineProps<\n PrimitiveProps & {\n padded?: boolean\n class?: string\n }\n >(),\n { as: 'div', padded: true },\n )\n</script>\n\n<template>\n <Primitive\n :as=\"props.as\"\n :as-child=\"props.asChild\"\n :class=\"cn(card({ padded: props.padded }), props.class)\"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\n import { Primitive, type PrimitiveProps } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { card } from './card.variants'\n\n defineOptions({ name: 'HnCard' })\n\n const props = withDefaults(\n defineProps<\n PrimitiveProps & {\n padded?: boolean\n class?: string\n }\n >(),\n { as: 'div', padded: true },\n )\n</script>\n\n<template>\n <Primitive\n :as=\"props.as\"\n :as-child=\"props.asChild\"\n :class=\"cn(card({ padded: props.padded }), props.class)\"\n >\n <slot />\n </Primitive>\n</template>\n","import { tv } from '../../lib/tv'\n\nexport const selectTrigger = tv({\n base: [\n 'group/hn-disclosure cursor-pointer items-center ps-[var(--hn-input-px)] pe-0 text-start',\n 'data-placeholder:text-faint data-placeholder:font-normal',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n '[&_svg]:size-[var(--hn-input-icon)] [&_svg]:shrink-0',\n ],\n})\n\nexport const selectContent = tv({\n base: [\n 'hn-anim-pop z-(--hn-z-overlay) flex w-[var(--reka-select-trigger-width)] min-w-40 flex-col overflow-hidden shadow-md outline-none',\n '[&[data-hn-fresh]_[data-highlighted]:not(:hover)]:[--hn-state-hover-opacity:0]',\n ],\n})\n\nexport const selectList = tv({\n base: 'max-h-[min(20rem,var(--reka-select-content-available-height))]',\n})\n\nexport const selectItem = tv({\n base: [\n 'hn-interactive hn-state-layer hn-press-none relative isolate flex w-full cursor-pointer',\n 'items-center gap-[var(--hn-control-gap)] rounded-md px-2.5 py-2 text-start text-sm select-none',\n 'text-fg outline-none [&_svg]:size-4 [&_svg]:shrink-0',\n 'data-disabled:pointer-events-none data-disabled:opacity-50',\n ],\n})\n\nexport const selectLabel = tv({\n base: 'text-muted px-2.5 py-1.5 text-xs font-medium',\n})\n\nexport const selectEmpty = tv({\n base: 'text-muted px-2.5 py-2 text-sm',\n})\n\nexport const selectListBody = tv({\n base: 'flex flex-col p-1',\n})\n","export interface SelectOption {\n value: string | number\n label: string\n description?: string\n disabled?: boolean\n}\n\nexport interface SelectOptionGroup {\n label: string\n options: SelectOption[]\n}\n\nexport type SelectItems = Array<SelectOption | SelectOptionGroup>\n\nexport function isOptionGroup(item: SelectOption | SelectOptionGroup): item is SelectOptionGroup {\n return 'options' in item\n}\n\nexport function flattenOptions(items: SelectItems): SelectOption[] {\n return items.flatMap(item => (isOptionGroup(item) ? item.options : [item]))\n}\n","<script setup lang=\"ts\">\n import { Check } from '@lucide/vue'\n import {\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectItemIndicator,\n SelectItemText,\n SelectLabel,\n SelectPortal,\n } from 'reka-ui'\n import { ref } from 'vue'\n import { useUiLocale } from '../../locale'\n import Card from '../card/Card.vue'\n import ScrollArea from '../scroll-area/ScrollArea.vue'\n import {\n selectContent,\n selectEmpty,\n selectItem,\n selectLabel,\n selectList,\n selectListBody,\n } from './select.variants'\n import { isOptionGroup, type SelectItems, type SelectOption } from './types'\n\n defineOptions({ name: 'HnSelectList' })\n\n const props = defineProps<{ options: SelectItems; keyboard?: boolean }>()\n\n const fresh = ref(false)\n\n defineSlots<{ option(props: { option: SelectOption }): unknown }>()\n\n const t = useUiLocale()\n</script>\n\n<template>\n <SelectPortal>\n <SelectContent as-child position=\"popper\" align=\"start\" :side-offset=\"8\">\n <Card\n :padded=\"false\"\n data-hn-select-content\n :data-hn-fresh=\"fresh ? '' : undefined\"\n :class=\"selectContent()\"\n @vue:mounted=\"fresh = !props.keyboard\"\n @keydown=\"fresh = false\"\n @pointermove=\"fresh = false\"\n >\n <ScrollArea :class=\"selectList()\">\n <div :class=\"selectListBody()\">\n <template\n v-for=\"item in props.options\"\n :key=\"isOptionGroup(item) ? item.label : item.value\"\n >\n <SelectGroup v-if=\"isOptionGroup(item)\">\n <SelectLabel :class=\"selectLabel()\">{{ item.label }}</SelectLabel>\n <SelectItem\n v-for=\"option in item.options\"\n :key=\"option.value\"\n :value=\"option.value\"\n :disabled=\"option.disabled\"\n :text-value=\"option.label\"\n :class=\"selectItem()\"\n >\n <SelectItemText as-child>\n <span class=\"min-w-0 flex-1\">\n <slot name=\"option\" :option=\"option\">\n <span class=\"block truncate\">{{ option.label }}</span>\n <span v-if=\"option.description\" class=\"text-muted block truncate text-xs\">\n {{ option.description }}\n </span>\n </slot>\n </span>\n </SelectItemText>\n <span class=\"flex size-4 shrink-0 items-center justify-center\">\n <SelectItemIndicator><Check /></SelectItemIndicator>\n </span>\n </SelectItem>\n </SelectGroup>\n <SelectItem\n v-else\n :value=\"item.value\"\n :disabled=\"item.disabled\"\n :text-value=\"item.label\"\n :class=\"selectItem()\"\n >\n <SelectItemText as-child>\n <span class=\"min-w-0 flex-1\">\n <slot name=\"option\" :option=\"item\">\n <span class=\"block truncate\">{{ item.label }}</span>\n <span v-if=\"item.description\" class=\"text-muted block truncate text-xs\">\n {{ item.description }}\n </span>\n </slot>\n </span>\n </SelectItemText>\n <span class=\"flex size-4 shrink-0 items-center justify-center\">\n <SelectItemIndicator><Check /></SelectItemIndicator>\n </span>\n </SelectItem>\n </template>\n <div v-if=\"props.options.length === 0\" :class=\"selectEmpty()\">{{ t.select.empty }}</div>\n </div>\n </ScrollArea>\n </Card>\n </SelectContent>\n </SelectPortal>\n</template>\n","<script setup lang=\"ts\">\n import { Check } from '@lucide/vue'\n import {\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectItemIndicator,\n SelectItemText,\n SelectLabel,\n SelectPortal,\n } from 'reka-ui'\n import { ref } from 'vue'\n import { useUiLocale } from '../../locale'\n import Card from '../card/Card.vue'\n import ScrollArea from '../scroll-area/ScrollArea.vue'\n import {\n selectContent,\n selectEmpty,\n selectItem,\n selectLabel,\n selectList,\n selectListBody,\n } from './select.variants'\n import { isOptionGroup, type SelectItems, type SelectOption } from './types'\n\n defineOptions({ name: 'HnSelectList' })\n\n const props = defineProps<{ options: SelectItems; keyboard?: boolean }>()\n\n const fresh = ref(false)\n\n defineSlots<{ option(props: { option: SelectOption }): unknown }>()\n\n const t = useUiLocale()\n</script>\n\n<template>\n <SelectPortal>\n <SelectContent as-child position=\"popper\" align=\"start\" :side-offset=\"8\">\n <Card\n :padded=\"false\"\n data-hn-select-content\n :data-hn-fresh=\"fresh ? '' : undefined\"\n :class=\"selectContent()\"\n @vue:mounted=\"fresh = !props.keyboard\"\n @keydown=\"fresh = false\"\n @pointermove=\"fresh = false\"\n >\n <ScrollArea :class=\"selectList()\">\n <div :class=\"selectListBody()\">\n <template\n v-for=\"item in props.options\"\n :key=\"isOptionGroup(item) ? item.label : item.value\"\n >\n <SelectGroup v-if=\"isOptionGroup(item)\">\n <SelectLabel :class=\"selectLabel()\">{{ item.label }}</SelectLabel>\n <SelectItem\n v-for=\"option in item.options\"\n :key=\"option.value\"\n :value=\"option.value\"\n :disabled=\"option.disabled\"\n :text-value=\"option.label\"\n :class=\"selectItem()\"\n >\n <SelectItemText as-child>\n <span class=\"min-w-0 flex-1\">\n <slot name=\"option\" :option=\"option\">\n <span class=\"block truncate\">{{ option.label }}</span>\n <span v-if=\"option.description\" class=\"text-muted block truncate text-xs\">\n {{ option.description }}\n </span>\n </slot>\n </span>\n </SelectItemText>\n <span class=\"flex size-4 shrink-0 items-center justify-center\">\n <SelectItemIndicator><Check /></SelectItemIndicator>\n </span>\n </SelectItem>\n </SelectGroup>\n <SelectItem\n v-else\n :value=\"item.value\"\n :disabled=\"item.disabled\"\n :text-value=\"item.label\"\n :class=\"selectItem()\"\n >\n <SelectItemText as-child>\n <span class=\"min-w-0 flex-1\">\n <slot name=\"option\" :option=\"item\">\n <span class=\"block truncate\">{{ item.label }}</span>\n <span v-if=\"item.description\" class=\"text-muted block truncate text-xs\">\n {{ item.description }}\n </span>\n </slot>\n </span>\n </SelectItemText>\n <span class=\"flex size-4 shrink-0 items-center justify-center\">\n <SelectItemIndicator><Check /></SelectItemIndicator>\n </span>\n </SelectItem>\n </template>\n <div v-if=\"props.options.length === 0\" :class=\"selectEmpty()\">{{ t.select.empty }}</div>\n </div>\n </ScrollArea>\n </Card>\n </SelectContent>\n </SelectPortal>\n</template>\n","<script setup lang=\"ts\">\n import { computed, ref } from 'vue'\n import { SelectRoot, SelectTrigger } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import DisclosureIcon from '../disclosure-icon/DisclosureIcon.vue'\n import { useFieldControl } from '../form-field/context'\n import { injectInputGroup } from '../input-group/context'\n import {\n inputAdornment,\n inputEmbedded,\n inputHost,\n type InputVariants,\n } from '../input/input.variants'\n import SelectList from './SelectList.vue'\n import { selectTrigger } from './select.variants'\n import { flattenOptions, type SelectItems, type SelectOption } from './types'\n\n defineOptions({ name: 'HnSelect', inheritAttrs: false })\n\n const props = defineProps<{\n options: SelectItems\n placeholder?: string\n name?: string\n required?: boolean\n autocomplete?: string\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>()\n\n const model = defineModel<string | number | null>()\n const open = defineModel<boolean>('open', { default: false })\n\n defineSlots<{\n value(props: { option: SelectOption }): unknown\n option(props: { option: SelectOption }): unknown\n }>()\n\n const t = useUiLocale()\n const group = injectInputGroup()\n const keyboard = ref(false)\n\n const {\n id: fieldId,\n invalid,\n disabled,\n describedBy,\n } = useFieldControl({\n invalid: () => props.invalid || !!group?.invalid.value,\n disabled: () => props.disabled || !!group?.disabled.value,\n })\n const selected = computed(() =>\n flattenOptions(props.options).find(option => option.value === model.value),\n )\n</script>\n\n<template>\n <SelectRoot\n v-model=\"model\"\n v-model:open=\"open\"\n :disabled=\"disabled\"\n :name=\"props.name\"\n :required=\"props.required\"\n :autocomplete=\"props.autocomplete\"\n >\n <SelectTrigger\n v-bind=\"$attrs\"\n :id=\"fieldId\"\n :aria-describedby=\"describedBy\"\n data-hn-select\n @keydown=\"keyboard = true\"\n @pointerdown=\"keyboard = false\"\n :data-invalid=\"invalid ? '' : undefined\"\n :aria-invalid=\"invalid || undefined\"\n :class=\"\n cn(\n group ? inputEmbedded() : inputHost({ variant: props.variant, size: props.size }),\n selectTrigger(),\n props.class,\n )\n \"\n >\n <span class=\"min-w-0 flex-1 truncate\">\n <template v-if=\"selected\">\n <slot name=\"value\" :option=\"selected\">{{ selected.label }}</slot>\n </template>\n <template v-else>{{ props.placeholder ?? t.select.placeholder }}</template>\n </span>\n <span :class=\"inputAdornment()\">\n <DisclosureIcon />\n </span>\n </SelectTrigger>\n <SelectList :options=\"props.options\" :keyboard=\"keyboard\">\n <template #option=\"slotProps\">\n <slot name=\"option\" v-bind=\"slotProps\" />\n </template>\n </SelectList>\n </SelectRoot>\n</template>\n","<script setup lang=\"ts\">\n import { computed, ref } from 'vue'\n import { SelectRoot, SelectTrigger } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import DisclosureIcon from '../disclosure-icon/DisclosureIcon.vue'\n import { useFieldControl } from '../form-field/context'\n import { injectInputGroup } from '../input-group/context'\n import {\n inputAdornment,\n inputEmbedded,\n inputHost,\n type InputVariants,\n } from '../input/input.variants'\n import SelectList from './SelectList.vue'\n import { selectTrigger } from './select.variants'\n import { flattenOptions, type SelectItems, type SelectOption } from './types'\n\n defineOptions({ name: 'HnSelect', inheritAttrs: false })\n\n const props = defineProps<{\n options: SelectItems\n placeholder?: string\n name?: string\n required?: boolean\n autocomplete?: string\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>()\n\n const model = defineModel<string | number | null>()\n const open = defineModel<boolean>('open', { default: false })\n\n defineSlots<{\n value(props: { option: SelectOption }): unknown\n option(props: { option: SelectOption }): unknown\n }>()\n\n const t = useUiLocale()\n const group = injectInputGroup()\n const keyboard = ref(false)\n\n const {\n id: fieldId,\n invalid,\n disabled,\n describedBy,\n } = useFieldControl({\n invalid: () => props.invalid || !!group?.invalid.value,\n disabled: () => props.disabled || !!group?.disabled.value,\n })\n const selected = computed(() =>\n flattenOptions(props.options).find(option => option.value === model.value),\n )\n</script>\n\n<template>\n <SelectRoot\n v-model=\"model\"\n v-model:open=\"open\"\n :disabled=\"disabled\"\n :name=\"props.name\"\n :required=\"props.required\"\n :autocomplete=\"props.autocomplete\"\n >\n <SelectTrigger\n v-bind=\"$attrs\"\n :id=\"fieldId\"\n :aria-describedby=\"describedBy\"\n data-hn-select\n @keydown=\"keyboard = true\"\n @pointerdown=\"keyboard = false\"\n :data-invalid=\"invalid ? '' : undefined\"\n :aria-invalid=\"invalid || undefined\"\n :class=\"\n cn(\n group ? inputEmbedded() : inputHost({ variant: props.variant, size: props.size }),\n selectTrigger(),\n props.class,\n )\n \"\n >\n <span class=\"min-w-0 flex-1 truncate\">\n <template v-if=\"selected\">\n <slot name=\"value\" :option=\"selected\">{{ selected.label }}</slot>\n </template>\n <template v-else>{{ props.placeholder ?? t.select.placeholder }}</template>\n </span>\n <span :class=\"inputAdornment()\">\n <DisclosureIcon />\n </span>\n </SelectTrigger>\n <SelectList :options=\"props.options\" :keyboard=\"keyboard\">\n <template #option=\"slotProps\">\n <slot name=\"option\" v-bind=\"slotProps\" />\n </template>\n </SelectList>\n </SelectRoot>\n</template>\n","import { tv } from '../../lib/tv'\n\nexport const multiSelectTrigger = tv({\n base: [\n 'group/hn-disclosure cursor-pointer items-center ps-[var(--hn-input-px)] pe-0 text-start',\n 'data-placeholder:text-faint data-placeholder:font-normal',\n 'data-disabled:cursor-not-allowed data-disabled:opacity-50',\n ],\n})\n\nexport const multiSelectChips = tv({\n base: 'flex min-w-0 flex-1 items-center gap-1 overflow-hidden',\n})\n","<script setup lang=\"ts\">\n import { computed, ref } from 'vue'\n import { SelectRoot, SelectTrigger } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import Chip from '../chip/Chip.vue'\n import VisuallyHidden from '../visually-hidden/VisuallyHidden.vue'\n import { X } from '@lucide/vue'\n import InputAction from '../input/InputAction.vue'\n import DisclosureIcon from '../disclosure-icon/DisclosureIcon.vue'\n import { useFieldControl } from '../form-field/context'\n import { injectInputGroup } from '../input-group/context'\n import {\n inputActionSlot,\n inputAdornment,\n inputEmbedded,\n inputHost,\n type InputVariants,\n } from '../input/input.variants'\n import SelectList from '../select/SelectList.vue'\n import { flattenOptions, type SelectItems, type SelectOption } from '../select/types'\n import { multiSelectChips, multiSelectTrigger } from './multi-select.variants'\n\n defineOptions({ name: 'HnMultiSelect', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n options: SelectItems\n placeholder?: string\n name?: string\n required?: boolean\n autocomplete?: string\n maxVisible?: number\n clearable?: boolean\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>(),\n { maxVisible: 2, clearable: false },\n )\n const emit = defineEmits<{ clear: [] }>()\n\n const model = defineModel<Array<string | number>>({ default: () => [] })\n const open = defineModel<boolean>('open', { default: false })\n\n defineSlots<{ option(props: { option: SelectOption }): unknown }>()\n\n const t = useUiLocale()\n const group = injectInputGroup()\n const keyboard = ref(false)\n\n const size = computed(() => (group ? group.size.value : props.size))\n const {\n id: fieldId,\n invalid,\n disabled,\n describedBy,\n } = useFieldControl({\n invalid: () => props.invalid || !!group?.invalid.value,\n disabled: () => props.disabled || !!group?.disabled.value,\n })\n const selected = computed(() =>\n flattenOptions(props.options).filter(option => model.value.includes(option.value)),\n )\n const formOptions = computed(() => flattenOptions(props.options))\n const visible = computed(() => selected.value.slice(0, props.maxVisible))\n const overflow = computed(() => selected.value.length - visible.value.length)\n const chipSize = computed(() => (size.value === 'sm' ? 'sm' : 'md'))\n const clearing = computed(() => props.clearable && selected.value.length > 0 && !disabled.value)\n\n function remove(value: string | number) {\n if (disabled.value) return\n model.value = model.value.filter(item => item !== value)\n }\n\n function clear() {\n if (!model.value.length) return\n model.value = []\n emit('clear')\n }\n\n function isolate(event: Event) {\n if ((event.target as HTMLElement).closest('button')) event.stopPropagation()\n }\n</script>\n\n<template>\n <SelectRoot\n v-model=\"model\"\n v-model:open=\"open\"\n :disabled=\"disabled\"\n :required=\"props.required\"\n multiple\n >\n <SelectTrigger\n v-bind=\"$attrs\"\n as=\"div\"\n :id=\"fieldId\"\n :aria-describedby=\"describedBy\"\n data-hn-multi-select\n @keydown=\"keyboard = true\"\n @pointerdown=\"keyboard = false\"\n :tabindex=\"disabled ? -1 : 0\"\n :aria-disabled=\"disabled || undefined\"\n :data-invalid=\"invalid ? '' : undefined\"\n :aria-invalid=\"invalid || undefined\"\n :class=\"\n cn(\n group ? inputEmbedded() : inputHost({ variant: props.variant, size: props.size }),\n multiSelectTrigger(),\n props.class,\n )\n \"\n >\n <span :class=\"multiSelectChips()\">\n <template v-if=\"selected.length\">\n <Chip\n v-for=\"option in visible\"\n :key=\"option.value\"\n :size=\"chipSize\"\n removable\n :disabled=\"disabled\"\n class=\"max-w-40 min-w-0 shrink data-disabled:opacity-100\"\n @pointerdown=\"isolate\"\n @click=\"isolate\"\n @remove=\"remove(option.value)\"\n >\n <span class=\"min-w-0 truncate\">{{ option.label }}</span>\n </Chip>\n <Chip\n v-if=\"overflow > 0\"\n :size=\"chipSize\"\n :disabled=\"disabled\"\n class=\"shrink-0 data-disabled:opacity-100\"\n >\n +{{ overflow }}\n </Chip>\n </template>\n <span v-else class=\"min-w-0 truncate\">{{ props.placeholder ?? t.select.placeholder }}</span>\n </span>\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-90 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-90 opacity-0\"\n >\n <span v-if=\"clearing\" data-hn-multi-select-clear :class=\"inputActionSlot()\">\n <InputAction :label=\"t.common.clear\" @pointerdown.stop @click.stop=\"clear\">\n <X />\n </InputAction>\n </span>\n </Transition>\n <span :class=\"inputAdornment()\">\n <DisclosureIcon />\n </span>\n </SelectTrigger>\n <!-- Reka 2.10 BubbleSelect assigns arrays to select.value, which loses multiple values. -->\n <VisuallyHidden v-if=\"props.name\" as-child>\n <select\n v-model=\"model\"\n multiple\n :name=\"props.name\"\n :required=\"props.required\"\n :autocomplete=\"props.autocomplete\"\n :disabled=\"disabled\"\n aria-hidden=\"true\"\n tabindex=\"-1\"\n >\n <option\n v-for=\"option in formOptions\"\n :key=\"option.value\"\n :value=\"option.value\"\n :disabled=\"option.disabled\"\n >\n {{ option.label }}\n </option>\n </select>\n </VisuallyHidden>\n <SelectList :options=\"props.options\" :keyboard=\"keyboard\">\n <template #option=\"slotProps\">\n <slot name=\"option\" v-bind=\"slotProps\" />\n </template>\n </SelectList>\n </SelectRoot>\n</template>\n","<script setup lang=\"ts\">\n import { computed, ref } from 'vue'\n import { SelectRoot, SelectTrigger } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import Chip from '../chip/Chip.vue'\n import VisuallyHidden from '../visually-hidden/VisuallyHidden.vue'\n import { X } from '@lucide/vue'\n import InputAction from '../input/InputAction.vue'\n import DisclosureIcon from '../disclosure-icon/DisclosureIcon.vue'\n import { useFieldControl } from '../form-field/context'\n import { injectInputGroup } from '../input-group/context'\n import {\n inputActionSlot,\n inputAdornment,\n inputEmbedded,\n inputHost,\n type InputVariants,\n } from '../input/input.variants'\n import SelectList from '../select/SelectList.vue'\n import { flattenOptions, type SelectItems, type SelectOption } from '../select/types'\n import { multiSelectChips, multiSelectTrigger } from './multi-select.variants'\n\n defineOptions({ name: 'HnMultiSelect', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n options: SelectItems\n placeholder?: string\n name?: string\n required?: boolean\n autocomplete?: string\n maxVisible?: number\n clearable?: boolean\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>(),\n { maxVisible: 2, clearable: false },\n )\n const emit = defineEmits<{ clear: [] }>()\n\n const model = defineModel<Array<string | number>>({ default: () => [] })\n const open = defineModel<boolean>('open', { default: false })\n\n defineSlots<{ option(props: { option: SelectOption }): unknown }>()\n\n const t = useUiLocale()\n const group = injectInputGroup()\n const keyboard = ref(false)\n\n const size = computed(() => (group ? group.size.value : props.size))\n const {\n id: fieldId,\n invalid,\n disabled,\n describedBy,\n } = useFieldControl({\n invalid: () => props.invalid || !!group?.invalid.value,\n disabled: () => props.disabled || !!group?.disabled.value,\n })\n const selected = computed(() =>\n flattenOptions(props.options).filter(option => model.value.includes(option.value)),\n )\n const formOptions = computed(() => flattenOptions(props.options))\n const visible = computed(() => selected.value.slice(0, props.maxVisible))\n const overflow = computed(() => selected.value.length - visible.value.length)\n const chipSize = computed(() => (size.value === 'sm' ? 'sm' : 'md'))\n const clearing = computed(() => props.clearable && selected.value.length > 0 && !disabled.value)\n\n function remove(value: string | number) {\n if (disabled.value) return\n model.value = model.value.filter(item => item !== value)\n }\n\n function clear() {\n if (!model.value.length) return\n model.value = []\n emit('clear')\n }\n\n function isolate(event: Event) {\n if ((event.target as HTMLElement).closest('button')) event.stopPropagation()\n }\n</script>\n\n<template>\n <SelectRoot\n v-model=\"model\"\n v-model:open=\"open\"\n :disabled=\"disabled\"\n :required=\"props.required\"\n multiple\n >\n <SelectTrigger\n v-bind=\"$attrs\"\n as=\"div\"\n :id=\"fieldId\"\n :aria-describedby=\"describedBy\"\n data-hn-multi-select\n @keydown=\"keyboard = true\"\n @pointerdown=\"keyboard = false\"\n :tabindex=\"disabled ? -1 : 0\"\n :aria-disabled=\"disabled || undefined\"\n :data-invalid=\"invalid ? '' : undefined\"\n :aria-invalid=\"invalid || undefined\"\n :class=\"\n cn(\n group ? inputEmbedded() : inputHost({ variant: props.variant, size: props.size }),\n multiSelectTrigger(),\n props.class,\n )\n \"\n >\n <span :class=\"multiSelectChips()\">\n <template v-if=\"selected.length\">\n <Chip\n v-for=\"option in visible\"\n :key=\"option.value\"\n :size=\"chipSize\"\n removable\n :disabled=\"disabled\"\n class=\"max-w-40 min-w-0 shrink data-disabled:opacity-100\"\n @pointerdown=\"isolate\"\n @click=\"isolate\"\n @remove=\"remove(option.value)\"\n >\n <span class=\"min-w-0 truncate\">{{ option.label }}</span>\n </Chip>\n <Chip\n v-if=\"overflow > 0\"\n :size=\"chipSize\"\n :disabled=\"disabled\"\n class=\"shrink-0 data-disabled:opacity-100\"\n >\n +{{ overflow }}\n </Chip>\n </template>\n <span v-else class=\"min-w-0 truncate\">{{ props.placeholder ?? t.select.placeholder }}</span>\n </span>\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-90 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-90 opacity-0\"\n >\n <span v-if=\"clearing\" data-hn-multi-select-clear :class=\"inputActionSlot()\">\n <InputAction :label=\"t.common.clear\" @pointerdown.stop @click.stop=\"clear\">\n <X />\n </InputAction>\n </span>\n </Transition>\n <span :class=\"inputAdornment()\">\n <DisclosureIcon />\n </span>\n </SelectTrigger>\n <!-- Reka 2.10 BubbleSelect assigns arrays to select.value, which loses multiple values. -->\n <VisuallyHidden v-if=\"props.name\" as-child>\n <select\n v-model=\"model\"\n multiple\n :name=\"props.name\"\n :required=\"props.required\"\n :autocomplete=\"props.autocomplete\"\n :disabled=\"disabled\"\n aria-hidden=\"true\"\n tabindex=\"-1\"\n >\n <option\n v-for=\"option in formOptions\"\n :key=\"option.value\"\n :value=\"option.value\"\n :disabled=\"option.disabled\"\n >\n {{ option.label }}\n </option>\n </select>\n </VisuallyHidden>\n <SelectList :options=\"props.options\" :keyboard=\"keyboard\">\n <template #option=\"slotProps\">\n <slot name=\"option\" v-bind=\"slotProps\" />\n </template>\n </SelectList>\n </SelectRoot>\n</template>\n","import { tv } from '../../lib/tv'\n\nexport const comboboxContent = tv({\n base: [\n 'hn-anim-pop z-(--hn-z-overlay) flex w-[var(--reka-combobox-trigger-width)] min-w-40 flex-col overflow-hidden shadow-md outline-none',\n '[&[data-hn-fresh]_[data-highlighted]:not(:hover)]:[--hn-state-hover-opacity:0]',\n ],\n})\n\nexport const comboboxList = tv({\n base: 'max-h-[min(20rem,var(--reka-combobox-content-available-height))]',\n})\n","<script setup lang=\"ts\">\n import { Check } from '@lucide/vue'\n import {\n ComboboxContent,\n ComboboxEmpty,\n ComboboxGroup,\n ComboboxItem,\n ComboboxItemIndicator,\n ComboboxLabel,\n ComboboxPortal,\n } from 'reka-ui'\n import { ref } from 'vue'\n import { useUiLocale } from '../../locale'\n import Card from '../card/Card.vue'\n import ScrollArea from '../scroll-area/ScrollArea.vue'\n import { selectEmpty, selectItem, selectLabel, selectListBody } from '../select/select.variants'\n import { isOptionGroup, type SelectItems, type SelectOption } from '../select/types'\n import { comboboxContent, comboboxList } from './combobox.variants'\n\n defineOptions({ name: 'HnComboboxList' })\n\n const props = defineProps<{ options: SelectItems; keyboard?: boolean }>()\n\n const fresh = ref(false)\n\n defineSlots<{ option(props: { option: SelectOption }): unknown }>()\n\n const t = useUiLocale()\n</script>\n\n<template>\n <ComboboxPortal>\n <ComboboxContent as-child position=\"popper\" align=\"start\" :side-offset=\"8\">\n <Card\n :padded=\"false\"\n data-hn-combobox-content\n :data-hn-fresh=\"fresh && !props.keyboard ? '' : undefined\"\n :class=\"comboboxContent()\"\n @vue:mounted=\"fresh = true\"\n @keydown=\"fresh = false\"\n @pointermove=\"fresh = false\"\n >\n <ScrollArea :class=\"comboboxList()\">\n <div :class=\"selectListBody()\">\n <template\n v-for=\"item in props.options\"\n :key=\"isOptionGroup(item) ? item.label : item.value\"\n >\n <ComboboxGroup v-if=\"isOptionGroup(item)\">\n <ComboboxLabel :class=\"selectLabel()\">{{ item.label }}</ComboboxLabel>\n <ComboboxItem\n v-for=\"option in item.options\"\n :key=\"option.value\"\n :value=\"option.value\"\n :text-value=\"option.label\"\n :disabled=\"option.disabled\"\n :class=\"selectItem()\"\n >\n <span class=\"min-w-0 flex-1\">\n <slot name=\"option\" :option=\"option\">\n <span class=\"block truncate\">{{ option.label }}</span>\n <span v-if=\"option.description\" class=\"text-muted block truncate text-xs\">\n {{ option.description }}\n </span>\n </slot>\n </span>\n <span class=\"flex size-4 shrink-0 items-center justify-center\">\n <ComboboxItemIndicator><Check /></ComboboxItemIndicator>\n </span>\n </ComboboxItem>\n </ComboboxGroup>\n <ComboboxItem\n v-else\n :value=\"item.value\"\n :text-value=\"item.label\"\n :disabled=\"item.disabled\"\n :class=\"selectItem()\"\n >\n <span class=\"min-w-0 flex-1\">\n <slot name=\"option\" :option=\"item\">\n <span class=\"block truncate\">{{ item.label }}</span>\n <span v-if=\"item.description\" class=\"text-muted block truncate text-xs\">\n {{ item.description }}\n </span>\n </slot>\n </span>\n <span class=\"flex size-4 shrink-0 items-center justify-center\">\n <ComboboxItemIndicator><Check /></ComboboxItemIndicator>\n </span>\n </ComboboxItem>\n </template>\n <ComboboxEmpty :class=\"selectEmpty()\">{{ t.select.empty }}</ComboboxEmpty>\n </div>\n </ScrollArea>\n </Card>\n </ComboboxContent>\n </ComboboxPortal>\n</template>\n","<script setup lang=\"ts\">\n import { Check } from '@lucide/vue'\n import {\n ComboboxContent,\n ComboboxEmpty,\n ComboboxGroup,\n ComboboxItem,\n ComboboxItemIndicator,\n ComboboxLabel,\n ComboboxPortal,\n } from 'reka-ui'\n import { ref } from 'vue'\n import { useUiLocale } from '../../locale'\n import Card from '../card/Card.vue'\n import ScrollArea from '../scroll-area/ScrollArea.vue'\n import { selectEmpty, selectItem, selectLabel, selectListBody } from '../select/select.variants'\n import { isOptionGroup, type SelectItems, type SelectOption } from '../select/types'\n import { comboboxContent, comboboxList } from './combobox.variants'\n\n defineOptions({ name: 'HnComboboxList' })\n\n const props = defineProps<{ options: SelectItems; keyboard?: boolean }>()\n\n const fresh = ref(false)\n\n defineSlots<{ option(props: { option: SelectOption }): unknown }>()\n\n const t = useUiLocale()\n</script>\n\n<template>\n <ComboboxPortal>\n <ComboboxContent as-child position=\"popper\" align=\"start\" :side-offset=\"8\">\n <Card\n :padded=\"false\"\n data-hn-combobox-content\n :data-hn-fresh=\"fresh && !props.keyboard ? '' : undefined\"\n :class=\"comboboxContent()\"\n @vue:mounted=\"fresh = true\"\n @keydown=\"fresh = false\"\n @pointermove=\"fresh = false\"\n >\n <ScrollArea :class=\"comboboxList()\">\n <div :class=\"selectListBody()\">\n <template\n v-for=\"item in props.options\"\n :key=\"isOptionGroup(item) ? item.label : item.value\"\n >\n <ComboboxGroup v-if=\"isOptionGroup(item)\">\n <ComboboxLabel :class=\"selectLabel()\">{{ item.label }}</ComboboxLabel>\n <ComboboxItem\n v-for=\"option in item.options\"\n :key=\"option.value\"\n :value=\"option.value\"\n :text-value=\"option.label\"\n :disabled=\"option.disabled\"\n :class=\"selectItem()\"\n >\n <span class=\"min-w-0 flex-1\">\n <slot name=\"option\" :option=\"option\">\n <span class=\"block truncate\">{{ option.label }}</span>\n <span v-if=\"option.description\" class=\"text-muted block truncate text-xs\">\n {{ option.description }}\n </span>\n </slot>\n </span>\n <span class=\"flex size-4 shrink-0 items-center justify-center\">\n <ComboboxItemIndicator><Check /></ComboboxItemIndicator>\n </span>\n </ComboboxItem>\n </ComboboxGroup>\n <ComboboxItem\n v-else\n :value=\"item.value\"\n :text-value=\"item.label\"\n :disabled=\"item.disabled\"\n :class=\"selectItem()\"\n >\n <span class=\"min-w-0 flex-1\">\n <slot name=\"option\" :option=\"item\">\n <span class=\"block truncate\">{{ item.label }}</span>\n <span v-if=\"item.description\" class=\"text-muted block truncate text-xs\">\n {{ item.description }}\n </span>\n </slot>\n </span>\n <span class=\"flex size-4 shrink-0 items-center justify-center\">\n <ComboboxItemIndicator><Check /></ComboboxItemIndicator>\n </span>\n </ComboboxItem>\n </template>\n <ComboboxEmpty :class=\"selectEmpty()\">{{ t.select.empty }}</ComboboxEmpty>\n </div>\n </ScrollArea>\n </Card>\n </ComboboxContent>\n </ComboboxPortal>\n</template>\n","<script setup lang=\"ts\">\n import { computed, ref, shallowRef, watch } from 'vue'\n import { ComboboxAnchor, ComboboxInput, ComboboxRoot, ComboboxTrigger } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { focusFieldFrom } from '../../lib/field-focus'\n import { useUiLocale } from '../../locale'\n import { X } from '@lucide/vue'\n import InputAction from '../input/InputAction.vue'\n import DisclosureIcon from '../disclosure-icon/DisclosureIcon.vue'\n import { useFieldControl } from '../form-field/context'\n import { injectInputGroup } from '../input-group/context'\n import {\n inputActionSlot,\n inputAdornment,\n inputControl,\n inputEmbedded,\n inputHost,\n inputIndicator,\n type InputVariants,\n } from '../input/input.variants'\n import { flattenOptions, type SelectItems, type SelectOption } from '../select/types'\n import ComboboxList from './ComboboxList.vue'\n\n defineOptions({ name: 'HnCombobox', inheritAttrs: false })\n\n const props = defineProps<{\n options: SelectItems\n placeholder?: string\n ignoreFilter?: boolean\n clearable?: boolean\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>()\n const emit = defineEmits<{ clear: [] }>()\n\n const model = defineModel<string | number | null>()\n const search = defineModel<string>('search', { default: '' })\n const open = defineModel<boolean>('open', { default: false })\n\n defineSlots<{ option(props: { option: SelectOption }): unknown }>()\n\n const t = useUiLocale()\n const group = injectInputGroup()\n const keyboard = ref(false)\n const input = shallowRef<{ $el: HTMLInputElement } | null>(null)\n\n const size = computed(() => (group ? group.size.value : props.size))\n const {\n id: fieldId,\n invalid,\n disabled,\n describedBy,\n } = useFieldControl({\n invalid: () => props.invalid || !!group?.invalid.value,\n disabled: () => props.disabled || !!group?.disabled.value,\n })\n const clearing = computed(\n () => !!props.clearable && model.value != null && model.value !== '' && !disabled.value,\n )\n\n function displayValue(value: string | number | null | undefined) {\n return flattenOptions(props.options).find(option => option.value === value)?.label ?? ''\n }\n\n function clear() {\n model.value = null\n search.value = ''\n emit('clear')\n input.value?.$el.focus()\n }\n\n watch(search, value => {\n if (value === '' && model.value != null) model.value = null\n })\n\n watch(open, value => {\n if (!value) keyboard.value = false\n })\n</script>\n\n<template>\n <ComboboxRoot\n v-model=\"model\"\n v-model:open=\"open\"\n :disabled=\"disabled\"\n :ignore-filter=\"props.ignoreFilter\"\n open-on-click\n >\n <ComboboxAnchor as-child>\n <div\n data-hn-combobox\n :data-invalid=\"invalid ? '' : undefined\"\n :class=\"\n cn(\n group ? inputEmbedded() : inputHost({ variant: props.variant, size: props.size }),\n props.class,\n )\n \"\n @click=\"focusFieldFrom($event.currentTarget as HTMLElement, $event.target as HTMLElement)\"\n @keydown=\"keyboard = true\"\n >\n <ComboboxInput\n ref=\"input\"\n v-bind=\"$attrs\"\n v-model=\"search\"\n :id=\"fieldId\"\n :aria-describedby=\"describedBy\"\n :display-value=\"displayValue\"\n :placeholder=\"props.placeholder ?? t.combobox.placeholder\"\n :disabled=\"disabled\"\n :aria-invalid=\"invalid || undefined\"\n :class=\"inputControl({ trailing: true })\"\n />\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-90 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-90 opacity-0\"\n >\n <span v-if=\"clearing\" data-hn-combobox-clear :class=\"inputActionSlot()\">\n <InputAction :label=\"t.common.clear\" @click=\"clear\">\n <X />\n </InputAction>\n </span>\n </Transition>\n <ComboboxTrigger\n :aria-label=\"t.combobox.toggle\"\n :disabled=\"disabled\"\n :class=\"cn(inputAdornment(), inputIndicator())\"\n @mousedown.prevent\n >\n <DisclosureIcon :open=\"open\" />\n </ComboboxTrigger>\n </div>\n </ComboboxAnchor>\n <ComboboxList :options=\"props.options\" :keyboard=\"keyboard\">\n <template #option=\"slotProps\">\n <slot name=\"option\" v-bind=\"slotProps\" />\n </template>\n </ComboboxList>\n </ComboboxRoot>\n</template>\n","<script setup lang=\"ts\">\n import { computed, ref, shallowRef, watch } from 'vue'\n import { ComboboxAnchor, ComboboxInput, ComboboxRoot, ComboboxTrigger } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { focusFieldFrom } from '../../lib/field-focus'\n import { useUiLocale } from '../../locale'\n import { X } from '@lucide/vue'\n import InputAction from '../input/InputAction.vue'\n import DisclosureIcon from '../disclosure-icon/DisclosureIcon.vue'\n import { useFieldControl } from '../form-field/context'\n import { injectInputGroup } from '../input-group/context'\n import {\n inputActionSlot,\n inputAdornment,\n inputControl,\n inputEmbedded,\n inputHost,\n inputIndicator,\n type InputVariants,\n } from '../input/input.variants'\n import { flattenOptions, type SelectItems, type SelectOption } from '../select/types'\n import ComboboxList from './ComboboxList.vue'\n\n defineOptions({ name: 'HnCombobox', inheritAttrs: false })\n\n const props = defineProps<{\n options: SelectItems\n placeholder?: string\n ignoreFilter?: boolean\n clearable?: boolean\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>()\n const emit = defineEmits<{ clear: [] }>()\n\n const model = defineModel<string | number | null>()\n const search = defineModel<string>('search', { default: '' })\n const open = defineModel<boolean>('open', { default: false })\n\n defineSlots<{ option(props: { option: SelectOption }): unknown }>()\n\n const t = useUiLocale()\n const group = injectInputGroup()\n const keyboard = ref(false)\n const input = shallowRef<{ $el: HTMLInputElement } | null>(null)\n\n const size = computed(() => (group ? group.size.value : props.size))\n const {\n id: fieldId,\n invalid,\n disabled,\n describedBy,\n } = useFieldControl({\n invalid: () => props.invalid || !!group?.invalid.value,\n disabled: () => props.disabled || !!group?.disabled.value,\n })\n const clearing = computed(\n () => !!props.clearable && model.value != null && model.value !== '' && !disabled.value,\n )\n\n function displayValue(value: string | number | null | undefined) {\n return flattenOptions(props.options).find(option => option.value === value)?.label ?? ''\n }\n\n function clear() {\n model.value = null\n search.value = ''\n emit('clear')\n input.value?.$el.focus()\n }\n\n watch(search, value => {\n if (value === '' && model.value != null) model.value = null\n })\n\n watch(open, value => {\n if (!value) keyboard.value = false\n })\n</script>\n\n<template>\n <ComboboxRoot\n v-model=\"model\"\n v-model:open=\"open\"\n :disabled=\"disabled\"\n :ignore-filter=\"props.ignoreFilter\"\n open-on-click\n >\n <ComboboxAnchor as-child>\n <div\n data-hn-combobox\n :data-invalid=\"invalid ? '' : undefined\"\n :class=\"\n cn(\n group ? inputEmbedded() : inputHost({ variant: props.variant, size: props.size }),\n props.class,\n )\n \"\n @click=\"focusFieldFrom($event.currentTarget as HTMLElement, $event.target as HTMLElement)\"\n @keydown=\"keyboard = true\"\n >\n <ComboboxInput\n ref=\"input\"\n v-bind=\"$attrs\"\n v-model=\"search\"\n :id=\"fieldId\"\n :aria-describedby=\"describedBy\"\n :display-value=\"displayValue\"\n :placeholder=\"props.placeholder ?? t.combobox.placeholder\"\n :disabled=\"disabled\"\n :aria-invalid=\"invalid || undefined\"\n :class=\"inputControl({ trailing: true })\"\n />\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-90 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-90 opacity-0\"\n >\n <span v-if=\"clearing\" data-hn-combobox-clear :class=\"inputActionSlot()\">\n <InputAction :label=\"t.common.clear\" @click=\"clear\">\n <X />\n </InputAction>\n </span>\n </Transition>\n <ComboboxTrigger\n :aria-label=\"t.combobox.toggle\"\n :disabled=\"disabled\"\n :class=\"cn(inputAdornment(), inputIndicator())\"\n @mousedown.prevent\n >\n <DisclosureIcon :open=\"open\" />\n </ComboboxTrigger>\n </div>\n </ComboboxAnchor>\n <ComboboxList :options=\"props.options\" :keyboard=\"keyboard\">\n <template #option=\"slotProps\">\n <slot name=\"option\" v-bind=\"slotProps\" />\n </template>\n </ComboboxList>\n </ComboboxRoot>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnKbd' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <kbd :class=\"cn('hn-kbd', props.class)\"><slot /></kbd>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnKbd' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <kbd :class=\"cn('hn-kbd', props.class)\"><slot /></kbd>\n</template>\n","import { tv } from '../../lib/tv'\n\nexport const commandWrapper = tv({\n base: 'pointer-events-none fixed inset-0 z-(--hn-z-overlay) grid items-start justify-items-center p-4 pt-[15dvh] max-sm:pt-4',\n})\n\nexport const commandCard = tv({\n base: 'flex w-full max-w-xl flex-col overflow-hidden outline-none',\n variants: {\n inline: {\n false: 'hn-anim-modal pointer-events-auto shadow-lg',\n },\n },\n defaultVariants: {\n inline: false,\n },\n})\n\nexport const commandInputRow = tv({\n base: 'border-line text-muted flex h-12 shrink-0 items-center gap-2.5 border-b px-4 [&>svg]:size-4 [&>svg]:shrink-0',\n})\n\nexport const commandInput = tv({\n base: 'text-fg placeholder:text-faint h-full min-w-0 flex-1 bg-transparent text-sm outline-none',\n})\n\nexport const commandList = tv({\n base: 'max-h-[min(24rem,60dvh)]',\n})\n\nexport const commandItemBody = tv({\n base: 'flex min-w-0 flex-1 flex-col',\n})\n\nexport const commandItemMatch = tv({\n base: 'text-accent-text font-medium',\n})\n\nexport const commandItemHint = tv({\n base: 'ms-auto flex shrink-0 items-center gap-1',\n})\n\nexport const commandEmpty = tv({\n base: 'text-muted px-4 py-8 text-center text-sm',\n})\n","<script setup lang=\"ts\">\n import { ListboxItem } from 'reka-ui'\n import { computed } from 'vue'\n import Kbd from '../kbd/Kbd.vue'\n import { selectItem } from '../select/select.variants'\n import { commandItemBody, commandItemHint, commandItemMatch } from './command-palette.variants'\n import type { CommandMatch } from './utils/match'\n\n defineOptions({ name: 'HnCommandPaletteItem' })\n\n const props = defineProps<{ match: CommandMatch }>()\n const emit = defineEmits<{ select: [] }>()\n\n const parts = computed(() => {\n const { item, start, end } = props.match\n if (start < 0) return [item.label, '', '']\n return [item.label.slice(0, start), item.label.slice(start, end), item.label.slice(end)]\n })\n</script>\n\n<template>\n <ListboxItem\n :value=\"props.match.item.id\"\n :disabled=\"props.match.item.disabled\"\n data-hn-highlight-only\n :class=\"selectItem()\"\n @select=\"emit('select')\"\n >\n <component\n :is=\"props.match.item.icon\"\n v-if=\"props.match.item.icon\"\n aria-hidden=\"true\"\n class=\"text-muted\"\n />\n <span :class=\"commandItemBody()\">\n <span class=\"truncate\">\n <span v-text=\"parts[0]\" />\n <span v-if=\"parts[1]\" :class=\"commandItemMatch()\" v-text=\"parts[1]\" />\n <span v-if=\"parts[2]\" v-text=\"parts[2]\" />\n </span>\n <span v-if=\"props.match.item.description\" class=\"text-muted truncate text-xs\">\n {{ props.match.item.description }}\n </span>\n </span>\n <span v-if=\"props.match.item.kbd?.length\" :class=\"commandItemHint()\">\n <Kbd v-for=\"key in props.match.item.kbd\" :key=\"key\">{{ key }}</Kbd>\n </span>\n </ListboxItem>\n</template>\n","<script setup lang=\"ts\">\n import { ListboxItem } from 'reka-ui'\n import { computed } from 'vue'\n import Kbd from '../kbd/Kbd.vue'\n import { selectItem } from '../select/select.variants'\n import { commandItemBody, commandItemHint, commandItemMatch } from './command-palette.variants'\n import type { CommandMatch } from './utils/match'\n\n defineOptions({ name: 'HnCommandPaletteItem' })\n\n const props = defineProps<{ match: CommandMatch }>()\n const emit = defineEmits<{ select: [] }>()\n\n const parts = computed(() => {\n const { item, start, end } = props.match\n if (start < 0) return [item.label, '', '']\n return [item.label.slice(0, start), item.label.slice(start, end), item.label.slice(end)]\n })\n</script>\n\n<template>\n <ListboxItem\n :value=\"props.match.item.id\"\n :disabled=\"props.match.item.disabled\"\n data-hn-highlight-only\n :class=\"selectItem()\"\n @select=\"emit('select')\"\n >\n <component\n :is=\"props.match.item.icon\"\n v-if=\"props.match.item.icon\"\n aria-hidden=\"true\"\n class=\"text-muted\"\n />\n <span :class=\"commandItemBody()\">\n <span class=\"truncate\">\n <span v-text=\"parts[0]\" />\n <span v-if=\"parts[1]\" :class=\"commandItemMatch()\" v-text=\"parts[1]\" />\n <span v-if=\"parts[2]\" v-text=\"parts[2]\" />\n </span>\n <span v-if=\"props.match.item.description\" class=\"text-muted truncate text-xs\">\n {{ props.match.item.description }}\n </span>\n </span>\n <span v-if=\"props.match.item.kbd?.length\" :class=\"commandItemHint()\">\n <Kbd v-for=\"key in props.match.item.kbd\" :key=\"key\">{{ key }}</Kbd>\n </span>\n </ListboxItem>\n</template>\n","import type { Component } from 'vue'\n\nexport interface CommandItem {\n id: string\n label: string\n description?: string\n keywords?: string[]\n icon?: Component\n kbd?: string[]\n disabled?: boolean\n onSelect?: () => void\n}\n\nexport interface CommandGroup {\n label: string\n items: CommandItem[]\n}\n\nexport type CommandItems = Array<CommandItem | CommandGroup>\n\nexport function isCommandGroup(entry: CommandItem | CommandGroup): entry is CommandGroup {\n return 'items' in entry\n}\n","import { isCommandGroup, type CommandItem, type CommandItems } from '../types'\n\nexport interface CommandMatch {\n item: CommandItem\n start: number\n end: number\n}\n\nexport interface CommandSection {\n key: string\n label?: string\n matches: CommandMatch[]\n}\n\ninterface Scored extends CommandMatch {\n score: number\n}\n\ninterface ScoredSection extends CommandSection {\n best: number\n}\n\nfunction score(item: CommandItem, query: string): Scored | null {\n if (!query) return { item, start: -1, end: -1, score: 0 }\n const label = item.label.toLowerCase()\n const at = label.indexOf(query)\n if (at === 0) return { item, start: 0, end: query.length, score: label === query ? 4 : 3 }\n if (at > 0) return { item, start: at, end: at + query.length, score: 2 }\n const keywords = item.keywords?.map(keyword => keyword.toLowerCase()) ?? []\n if (keywords.includes(query)) return { item, start: -1, end: -1, score: 1.5 }\n if (keywords.some(keyword => keyword.includes(query)))\n return { item, start: -1, end: -1, score: 1 }\n if (item.description?.toLowerCase().includes(query)) {\n return { item, start: -1, end: -1, score: 0.5 }\n }\n return null\n}\n\nfunction rank(items: CommandItem[], query: string): Scored[] {\n return items\n .map(item => score(item, query))\n .filter((match): match is Scored => match !== null)\n .sort((a, b) => b.score - a.score)\n}\n\nexport function filterCommands(items: CommandItems, query: string): CommandSection[] {\n const q = query.trim().toLowerCase()\n const sections: ScoredSection[] = []\n let loose: CommandItem[] = []\n const push = (label: string | undefined, entries: CommandItem[]) => {\n const ranked = rank(entries, q)\n if (ranked.length === 0) return\n sections.push({\n key: String(sections.length),\n label,\n best: ranked[0]!.score,\n matches: ranked.map(({ item, start, end }) => ({ item, start, end })),\n })\n }\n const flush = () => {\n if (loose.length === 0) return\n push(undefined, loose)\n loose = []\n }\n for (const entry of items) {\n if (!isCommandGroup(entry)) {\n loose.push(entry)\n continue\n }\n flush()\n push(entry.label, entry.items)\n }\n flush()\n if (q) sections.sort((a, b) => b.best - a.best)\n return sections.map(({ key, label, matches }) => ({ key, label, matches }))\n}\n","<script setup lang=\"ts\">\n import { Search } from '@lucide/vue'\n import {\n ListboxContent,\n ListboxFilter,\n ListboxGroup,\n ListboxGroupLabel,\n ListboxRoot,\n } from 'reka-ui'\n import { computed } from 'vue'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import Card from '../card/Card.vue'\n import ScrollArea from '../scroll-area/ScrollArea.vue'\n import { selectLabel, selectListBody } from '../select/select.variants'\n import CommandPaletteItem from './CommandPaletteItem.vue'\n import {\n commandCard,\n commandEmpty,\n commandInput,\n commandInputRow,\n commandList,\n } from './command-palette.variants'\n import type { CommandItem, CommandItems } from './types'\n import { filterCommands } from './utils/match'\n\n defineOptions({ name: 'HnCommandPalettePanel', inheritAttrs: false })\n\n const props = defineProps<{\n items: CommandItems\n label: string\n placeholder?: string\n ignoreFilter?: boolean\n autoFocus?: boolean\n inline?: boolean\n class?: string\n }>()\n\n const emit = defineEmits<{ select: [item: CommandItem] }>()\n\n const search = defineModel<string>('search', { default: '' })\n\n const t = useUiLocale()\n\n const sections = computed(() =>\n filterCommands(props.items, props.ignoreFilter ? '' : search.value),\n )\n</script>\n\n<template>\n <Card\n v-bind=\"$attrs\"\n data-hn-command-palette\n :padded=\"false\"\n :class=\"cn(commandCard({ inline: props.inline }), props.class)\"\n >\n <slot />\n <ListboxRoot selection-behavior=\"replace\" highlight-on-hover class=\"flex min-h-0 flex-col\">\n <div :class=\"commandInputRow()\">\n <Search aria-hidden=\"true\" />\n <ListboxFilter\n v-model=\"search\"\n :auto-focus=\"props.autoFocus\"\n :placeholder=\"props.placeholder ?? t.command.placeholder\"\n :aria-label=\"props.label\"\n :class=\"commandInput()\"\n />\n </div>\n <ScrollArea :class=\"commandList()\">\n <ListboxContent :aria-label=\"props.label\" :class=\"selectListBody()\">\n <template v-for=\"section in sections\" :key=\"section.key\">\n <ListboxGroup v-if=\"section.label\">\n <ListboxGroupLabel :class=\"selectLabel()\">{{ section.label }}</ListboxGroupLabel>\n <CommandPaletteItem\n v-for=\"match in section.matches\"\n :key=\"match.item.id\"\n :match=\"match\"\n @select=\"emit('select', match.item)\"\n />\n </ListboxGroup>\n <template v-else>\n <CommandPaletteItem\n v-for=\"match in section.matches\"\n :key=\"match.item.id\"\n :match=\"match\"\n @select=\"emit('select', match.item)\"\n />\n </template>\n </template>\n <div v-if=\"sections.length === 0\" :class=\"commandEmpty()\">{{ t.command.empty }}</div>\n </ListboxContent>\n </ScrollArea>\n </ListboxRoot>\n </Card>\n</template>\n","<script setup lang=\"ts\">\n import { Search } from '@lucide/vue'\n import {\n ListboxContent,\n ListboxFilter,\n ListboxGroup,\n ListboxGroupLabel,\n ListboxRoot,\n } from 'reka-ui'\n import { computed } from 'vue'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import Card from '../card/Card.vue'\n import ScrollArea from '../scroll-area/ScrollArea.vue'\n import { selectLabel, selectListBody } from '../select/select.variants'\n import CommandPaletteItem from './CommandPaletteItem.vue'\n import {\n commandCard,\n commandEmpty,\n commandInput,\n commandInputRow,\n commandList,\n } from './command-palette.variants'\n import type { CommandItem, CommandItems } from './types'\n import { filterCommands } from './utils/match'\n\n defineOptions({ name: 'HnCommandPalettePanel', inheritAttrs: false })\n\n const props = defineProps<{\n items: CommandItems\n label: string\n placeholder?: string\n ignoreFilter?: boolean\n autoFocus?: boolean\n inline?: boolean\n class?: string\n }>()\n\n const emit = defineEmits<{ select: [item: CommandItem] }>()\n\n const search = defineModel<string>('search', { default: '' })\n\n const t = useUiLocale()\n\n const sections = computed(() =>\n filterCommands(props.items, props.ignoreFilter ? '' : search.value),\n )\n</script>\n\n<template>\n <Card\n v-bind=\"$attrs\"\n data-hn-command-palette\n :padded=\"false\"\n :class=\"cn(commandCard({ inline: props.inline }), props.class)\"\n >\n <slot />\n <ListboxRoot selection-behavior=\"replace\" highlight-on-hover class=\"flex min-h-0 flex-col\">\n <div :class=\"commandInputRow()\">\n <Search aria-hidden=\"true\" />\n <ListboxFilter\n v-model=\"search\"\n :auto-focus=\"props.autoFocus\"\n :placeholder=\"props.placeholder ?? t.command.placeholder\"\n :aria-label=\"props.label\"\n :class=\"commandInput()\"\n />\n </div>\n <ScrollArea :class=\"commandList()\">\n <ListboxContent :aria-label=\"props.label\" :class=\"selectListBody()\">\n <template v-for=\"section in sections\" :key=\"section.key\">\n <ListboxGroup v-if=\"section.label\">\n <ListboxGroupLabel :class=\"selectLabel()\">{{ section.label }}</ListboxGroupLabel>\n <CommandPaletteItem\n v-for=\"match in section.matches\"\n :key=\"match.item.id\"\n :match=\"match\"\n @select=\"emit('select', match.item)\"\n />\n </ListboxGroup>\n <template v-else>\n <CommandPaletteItem\n v-for=\"match in section.matches\"\n :key=\"match.item.id\"\n :match=\"match\"\n @select=\"emit('select', match.item)\"\n />\n </template>\n </template>\n <div v-if=\"sections.length === 0\" :class=\"commandEmpty()\">{{ t.command.empty }}</div>\n </ListboxContent>\n </ScrollArea>\n </ListboxRoot>\n </Card>\n</template>\n","export interface Hotkey {\n key: string\n mod: boolean\n shift: boolean\n alt: boolean\n}\n\nexport function parseHotkey(spec: string): Hotkey {\n const parts = spec\n .toLowerCase()\n .split('+')\n .map(part => part.trim())\n .filter(Boolean)\n const modifiers = parts.slice(0, -1)\n return {\n key: parts.at(-1) ?? '',\n mod: modifiers.includes('mod'),\n shift: modifiers.includes('shift'),\n alt: modifiers.includes('alt'),\n }\n}\n\nexport function matchesHotkey(event: KeyboardEvent, hotkey: Hotkey): boolean {\n if (event.key.toLowerCase() !== hotkey.key) return false\n const mod = event.metaKey || event.ctrlKey\n return mod === hotkey.mod && event.shiftKey === hotkey.shift && event.altKey === hotkey.alt\n}\n","import { useEventListener } from '@vueuse/core'\nimport { computed, toValue, type MaybeRefOrGetter } from 'vue'\nimport { matchesHotkey, parseHotkey } from '../utils/hotkey'\n\nexport function useHotkey(spec: MaybeRefOrGetter<string | undefined>, handler: () => void) {\n const hotkey = computed(() => {\n const value = toValue(spec)\n return value ? parseHotkey(value) : null\n })\n\n useEventListener('keydown', (event: KeyboardEvent) => {\n if (!hotkey.value || event.defaultPrevented || event.repeat) return\n if (!matchesHotkey(event, hotkey.value)) return\n event.preventDefault()\n handler()\n })\n}\n","<script setup lang=\"ts\">\n import {\n DialogContent,\n DialogOverlay,\n DialogPortal,\n DialogRoot,\n DialogTitle,\n DialogTrigger,\n VisuallyHidden,\n } from 'reka-ui'\n import { computed, watch } from 'vue'\n import { useUiLocale } from '../../locale'\n import CommandPalettePanel from './CommandPalettePanel.vue'\n import { useHotkey } from './composables/useHotkey'\n import { commandWrapper } from './command-palette.variants'\n import type { CommandItem, CommandItems } from './types'\n\n defineOptions({ name: 'HnCommandPalette', inheritAttrs: false })\n\n const props = defineProps<{\n items: CommandItems\n placeholder?: string\n label?: string\n hotkey?: string\n ignoreFilter?: boolean\n inline?: boolean\n class?: string\n }>()\n\n const emit = defineEmits<{ select: [item: CommandItem] }>()\n\n const open = defineModel<boolean>('open', { default: false })\n const search = defineModel<string>('search', { default: '' })\n\n const t = useUiLocale()\n\n const label = computed(() => props.label ?? t.value.command.label)\n\n useHotkey(\n () => (props.inline ? undefined : props.hotkey),\n () => {\n open.value = !open.value\n },\n )\n\n watch(open, value => {\n if (!value) search.value = ''\n })\n\n function select(item: CommandItem) {\n item.onSelect?.()\n emit('select', item)\n if (!props.inline) open.value = false\n }\n</script>\n\n<template>\n <CommandPalettePanel\n v-if=\"props.inline\"\n v-bind=\"$attrs\"\n v-model:search=\"search\"\n inline\n :items=\"props.items\"\n :label=\"label\"\n :placeholder=\"props.placeholder\"\n :ignore-filter=\"props.ignoreFilter\"\n :class=\"props.class\"\n @select=\"select\"\n />\n <DialogRoot v-else v-model:open=\"open\">\n <DialogTrigger v-if=\"$slots.default\" as-child>\n <slot />\n </DialogTrigger>\n <DialogPortal>\n <DialogOverlay class=\"hn-scrim\" />\n <div :class=\"commandWrapper()\">\n <DialogContent as-child>\n <CommandPalettePanel\n v-bind=\"$attrs\"\n v-model:search=\"search\"\n auto-focus\n :items=\"props.items\"\n :label=\"label\"\n :placeholder=\"props.placeholder\"\n :ignore-filter=\"props.ignoreFilter\"\n :class=\"props.class\"\n @select=\"select\"\n >\n <VisuallyHidden>\n <DialogTitle>{{ label }}</DialogTitle>\n </VisuallyHidden>\n </CommandPalettePanel>\n </DialogContent>\n </div>\n </DialogPortal>\n </DialogRoot>\n</template>\n","<script setup lang=\"ts\">\n import {\n DialogContent,\n DialogOverlay,\n DialogPortal,\n DialogRoot,\n DialogTitle,\n DialogTrigger,\n VisuallyHidden,\n } from 'reka-ui'\n import { computed, watch } from 'vue'\n import { useUiLocale } from '../../locale'\n import CommandPalettePanel from './CommandPalettePanel.vue'\n import { useHotkey } from './composables/useHotkey'\n import { commandWrapper } from './command-palette.variants'\n import type { CommandItem, CommandItems } from './types'\n\n defineOptions({ name: 'HnCommandPalette', inheritAttrs: false })\n\n const props = defineProps<{\n items: CommandItems\n placeholder?: string\n label?: string\n hotkey?: string\n ignoreFilter?: boolean\n inline?: boolean\n class?: string\n }>()\n\n const emit = defineEmits<{ select: [item: CommandItem] }>()\n\n const open = defineModel<boolean>('open', { default: false })\n const search = defineModel<string>('search', { default: '' })\n\n const t = useUiLocale()\n\n const label = computed(() => props.label ?? t.value.command.label)\n\n useHotkey(\n () => (props.inline ? undefined : props.hotkey),\n () => {\n open.value = !open.value\n },\n )\n\n watch(open, value => {\n if (!value) search.value = ''\n })\n\n function select(item: CommandItem) {\n item.onSelect?.()\n emit('select', item)\n if (!props.inline) open.value = false\n }\n</script>\n\n<template>\n <CommandPalettePanel\n v-if=\"props.inline\"\n v-bind=\"$attrs\"\n v-model:search=\"search\"\n inline\n :items=\"props.items\"\n :label=\"label\"\n :placeholder=\"props.placeholder\"\n :ignore-filter=\"props.ignoreFilter\"\n :class=\"props.class\"\n @select=\"select\"\n />\n <DialogRoot v-else v-model:open=\"open\">\n <DialogTrigger v-if=\"$slots.default\" as-child>\n <slot />\n </DialogTrigger>\n <DialogPortal>\n <DialogOverlay class=\"hn-scrim\" />\n <div :class=\"commandWrapper()\">\n <DialogContent as-child>\n <CommandPalettePanel\n v-bind=\"$attrs\"\n v-model:search=\"search\"\n auto-focus\n :items=\"props.items\"\n :label=\"label\"\n :placeholder=\"props.placeholder\"\n :ignore-filter=\"props.ignoreFilter\"\n :class=\"props.class\"\n @select=\"select\"\n >\n <VisuallyHidden>\n <DialogTitle>{{ label }}</DialogTitle>\n </VisuallyHidden>\n </CommandPalettePanel>\n </DialogContent>\n </div>\n </DialogPortal>\n </DialogRoot>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const listbox = tv({\n base: [\n 'flex w-full min-w-0 flex-col overflow-hidden rounded-md data-disabled:opacity-50',\n '[&:not(:focus-within)_[data-highlighted]:not(:hover)]:[--hn-state-hover-opacity:0]',\n ],\n variants: {\n variant: {\n primary: 'border-line bg-surface border shadow-sm',\n secondary: 'bg-inset',\n },\n },\n defaultVariants: {\n variant: 'primary',\n },\n})\n\nexport const listboxContent = tv({\n base: 'flex flex-col p-1 outline-none',\n})\n\nexport type ListboxVariants = VariantProps<typeof listbox>\n","<script setup lang=\"ts\">\n import { Check } from '@lucide/vue'\n import {\n ListboxContent,\n ListboxGroup,\n ListboxGroupLabel,\n ListboxItem,\n ListboxItemIndicator,\n ListboxRoot,\n } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { useFieldControl } from '../form-field/context'\n import { useUiLocale } from '../../locale'\n import ScrollArea from '../scroll-area/ScrollArea.vue'\n import { selectEmpty, selectItem, selectLabel } from '../select/select.variants'\n import { isOptionGroup, type SelectItems, type SelectOption } from '../select/types'\n import { listbox, listboxContent, type ListboxVariants } from './listbox.variants'\n\n defineOptions({ name: 'HnListbox', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n options: SelectItems\n multiple?: boolean\n maxHeight?: string\n variant?: ListboxVariants['variant']\n disabled?: boolean\n class?: string\n }>(),\n { maxHeight: '20rem' },\n )\n\n const model = defineModel<string | number | null | Array<string | number>>()\n\n defineSlots<{ option(props: { option: SelectOption }): unknown }>()\n\n const t = useUiLocale()\n\n const { labelledBy, invalid, disabled, describedBy } = useFieldControl({\n disabled: () => props.disabled,\n })\n</script>\n\n<template>\n <ListboxRoot\n v-model=\"model\"\n :multiple=\"props.multiple\"\n :disabled=\"disabled\"\n :aria-labelledby=\"labelledBy\"\n :aria-describedby=\"describedBy\"\n :aria-invalid=\"invalid || undefined\"\n data-hn-listbox\n :data-disabled=\"disabled ? '' : undefined\"\n :data-invalid=\"invalid ? '' : undefined\"\n :class=\"cn(listbox({ variant: props.variant }), props.class)\"\n >\n <ScrollArea :style=\"{ maxHeight: props.maxHeight }\">\n <ListboxContent v-bind=\"$attrs\" :class=\"listboxContent()\">\n <template\n v-for=\"item in props.options\"\n :key=\"isOptionGroup(item) ? item.label : item.value\"\n >\n <ListboxGroup v-if=\"isOptionGroup(item)\">\n <ListboxGroupLabel :class=\"selectLabel()\">{{ item.label }}</ListboxGroupLabel>\n <ListboxItem\n v-for=\"option in item.options\"\n :key=\"option.value\"\n :value=\"option.value\"\n :disabled=\"option.disabled\"\n :class=\"selectItem()\"\n >\n <span class=\"min-w-0 flex-1\">\n <slot name=\"option\" :option=\"option\">\n <span class=\"block truncate\">{{ option.label }}</span>\n <span v-if=\"option.description\" class=\"text-muted block truncate text-xs\">\n {{ option.description }}\n </span>\n </slot>\n </span>\n <span class=\"flex size-4 shrink-0 items-center justify-center\">\n <ListboxItemIndicator><Check /></ListboxItemIndicator>\n </span>\n </ListboxItem>\n </ListboxGroup>\n <ListboxItem v-else :value=\"item.value\" :disabled=\"item.disabled\" :class=\"selectItem()\">\n <span class=\"min-w-0 flex-1\">\n <slot name=\"option\" :option=\"item\">\n <span class=\"block truncate\">{{ item.label }}</span>\n <span v-if=\"item.description\" class=\"text-muted block truncate text-xs\">\n {{ item.description }}\n </span>\n </slot>\n </span>\n <span class=\"flex size-4 shrink-0 items-center justify-center\">\n <ListboxItemIndicator><Check /></ListboxItemIndicator>\n </span>\n </ListboxItem>\n </template>\n <div v-if=\"props.options.length === 0\" :class=\"selectEmpty()\">{{ t.select.empty }}</div>\n </ListboxContent>\n </ScrollArea>\n </ListboxRoot>\n</template>\n","<script setup lang=\"ts\">\n import { Check } from '@lucide/vue'\n import {\n ListboxContent,\n ListboxGroup,\n ListboxGroupLabel,\n ListboxItem,\n ListboxItemIndicator,\n ListboxRoot,\n } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { useFieldControl } from '../form-field/context'\n import { useUiLocale } from '../../locale'\n import ScrollArea from '../scroll-area/ScrollArea.vue'\n import { selectEmpty, selectItem, selectLabel } from '../select/select.variants'\n import { isOptionGroup, type SelectItems, type SelectOption } from '../select/types'\n import { listbox, listboxContent, type ListboxVariants } from './listbox.variants'\n\n defineOptions({ name: 'HnListbox', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n options: SelectItems\n multiple?: boolean\n maxHeight?: string\n variant?: ListboxVariants['variant']\n disabled?: boolean\n class?: string\n }>(),\n { maxHeight: '20rem' },\n )\n\n const model = defineModel<string | number | null | Array<string | number>>()\n\n defineSlots<{ option(props: { option: SelectOption }): unknown }>()\n\n const t = useUiLocale()\n\n const { labelledBy, invalid, disabled, describedBy } = useFieldControl({\n disabled: () => props.disabled,\n })\n</script>\n\n<template>\n <ListboxRoot\n v-model=\"model\"\n :multiple=\"props.multiple\"\n :disabled=\"disabled\"\n :aria-labelledby=\"labelledBy\"\n :aria-describedby=\"describedBy\"\n :aria-invalid=\"invalid || undefined\"\n data-hn-listbox\n :data-disabled=\"disabled ? '' : undefined\"\n :data-invalid=\"invalid ? '' : undefined\"\n :class=\"cn(listbox({ variant: props.variant }), props.class)\"\n >\n <ScrollArea :style=\"{ maxHeight: props.maxHeight }\">\n <ListboxContent v-bind=\"$attrs\" :class=\"listboxContent()\">\n <template\n v-for=\"item in props.options\"\n :key=\"isOptionGroup(item) ? item.label : item.value\"\n >\n <ListboxGroup v-if=\"isOptionGroup(item)\">\n <ListboxGroupLabel :class=\"selectLabel()\">{{ item.label }}</ListboxGroupLabel>\n <ListboxItem\n v-for=\"option in item.options\"\n :key=\"option.value\"\n :value=\"option.value\"\n :disabled=\"option.disabled\"\n :class=\"selectItem()\"\n >\n <span class=\"min-w-0 flex-1\">\n <slot name=\"option\" :option=\"option\">\n <span class=\"block truncate\">{{ option.label }}</span>\n <span v-if=\"option.description\" class=\"text-muted block truncate text-xs\">\n {{ option.description }}\n </span>\n </slot>\n </span>\n <span class=\"flex size-4 shrink-0 items-center justify-center\">\n <ListboxItemIndicator><Check /></ListboxItemIndicator>\n </span>\n </ListboxItem>\n </ListboxGroup>\n <ListboxItem v-else :value=\"item.value\" :disabled=\"item.disabled\" :class=\"selectItem()\">\n <span class=\"min-w-0 flex-1\">\n <slot name=\"option\" :option=\"item\">\n <span class=\"block truncate\">{{ item.label }}</span>\n <span v-if=\"item.description\" class=\"text-muted block truncate text-xs\">\n {{ item.description }}\n </span>\n </slot>\n </span>\n <span class=\"flex size-4 shrink-0 items-center justify-center\">\n <ListboxItemIndicator><Check /></ListboxItemIndicator>\n </span>\n </ListboxItem>\n </template>\n <div v-if=\"props.options.length === 0\" :class=\"selectEmpty()\">{{ t.select.empty }}</div>\n </ListboxContent>\n </ScrollArea>\n </ListboxRoot>\n</template>\n","import { tv } from '../../lib/tv'\n\nexport const treeSelectContent = tv({\n base: [\n 'hn-anim-pop z-(--hn-z-overlay) flex w-[var(--reka-popover-trigger-width)] min-w-40 flex-col overflow-hidden shadow-md outline-none',\n ],\n})\n\nexport const treeSelectList = tv({\n base: 'max-h-[min(20rem,var(--reka-popover-content-available-height))]',\n})\n\nexport const treeSelectRow = tv({\n base: [\n 'hn-interactive hn-state-layer hn-press-none relative isolate flex w-full cursor-pointer',\n 'items-center gap-1 rounded-md py-2 pe-2.5 text-start text-sm select-none',\n 'text-fg [&_svg]:size-4 [&_svg]:shrink-0',\n 'data-disabled:pointer-events-none data-disabled:opacity-50',\n ],\n})\n\nexport const treeSelectToggle = tv({\n base: [\n 'text-muted flex size-5 shrink-0 cursor-pointer items-center justify-center rounded-sm',\n '[&>span>svg]:size-3.5',\n ],\n})\n","export interface TreeSelectNode {\n value: string | number\n label: string\n description?: string\n disabled?: boolean\n children?: TreeSelectNode[]\n}\n\nexport function findNode(\n nodes: TreeSelectNode[],\n value: string | number | null | undefined,\n): TreeSelectNode | undefined {\n for (const node of nodes) {\n if (node.value === value) return node\n const hit = node.children && findNode(node.children, value)\n if (hit) return hit\n }\n return undefined\n}\n\nexport function pathTo(\n nodes: TreeSelectNode[],\n value: string | number | null | undefined,\n trail: Array<string | number> = [],\n): Array<string | number> | null {\n for (const node of nodes) {\n if (node.value === value) return trail\n if (node.children) {\n const hit = pathTo(node.children, value, [...trail, node.value])\n if (hit) return hit\n }\n }\n return null\n}\n","<script setup lang=\"ts\">\n import { computed, ref, watch } from 'vue'\n import { Check } from '@lucide/vue'\n import {\n PopoverContent,\n PopoverPortal,\n PopoverRoot,\n PopoverTrigger,\n TreeItem,\n TreeRoot,\n } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import Card from '../card/Card.vue'\n import DisclosureIcon from '../disclosure-icon/DisclosureIcon.vue'\n import { useFieldControl } from '../form-field/context'\n import { injectInputGroup } from '../input-group/context'\n import {\n inputAdornment,\n inputEmbedded,\n inputHost,\n type InputVariants,\n } from '../input/input.variants'\n import ScrollArea from '../scroll-area/ScrollArea.vue'\n import { selectEmpty, selectTrigger } from '../select/select.variants'\n import {\n treeSelectContent,\n treeSelectList,\n treeSelectRow,\n treeSelectToggle,\n } from './tree-select.variants'\n import { findNode, pathTo, type TreeSelectNode } from './types'\n\n defineOptions({ name: 'HnTreeSelect', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n items: TreeSelectNode[]\n placeholder?: string\n defaultExpanded?: Array<string | number>\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>(),\n { defaultExpanded: () => [] },\n )\n\n const model = defineModel<string | number | null>()\n const open = defineModel<boolean>('open', { default: false })\n\n defineSlots<{ node(props: { node: TreeSelectNode }): unknown }>()\n\n const t = useUiLocale()\n const group = injectInputGroup()\n\n const {\n id: fieldId,\n invalid,\n disabled,\n describedBy,\n } = useFieldControl({\n invalid: () => props.invalid || !!group?.invalid.value,\n disabled: () => props.disabled || !!group?.disabled.value,\n })\n const selected = computed(() => findNode(props.items, model.value))\n const expanded = ref<string[]>([])\n\n watch(\n open,\n isOpen => {\n if (!isOpen) return\n const path = pathTo(props.items, model.value) ?? []\n expanded.value = Array.from(\n new Set([...props.defaultExpanded, ...path].map(value => String(value))),\n )\n },\n { immediate: true },\n )\n\n function key(node: TreeSelectNode) {\n return String(node.value)\n }\n\n function choose(node: TreeSelectNode | undefined) {\n if (!node || node.disabled) return\n model.value = node.value\n open.value = false\n }\n\n function keepRowClick(event: CustomEvent<{ originalEvent: Event }>) {\n if (event.detail.originalEvent.type === 'click') event.preventDefault()\n }\n</script>\n\n<template>\n <PopoverRoot v-model:open=\"open\" modal>\n <PopoverTrigger\n v-bind=\"$attrs\"\n :id=\"fieldId\"\n :aria-describedby=\"describedBy\"\n data-hn-tree-select\n role=\"combobox\"\n :aria-expanded=\"open\"\n :disabled=\"disabled\"\n :data-placeholder=\"selected ? undefined : ''\"\n :data-invalid=\"invalid ? '' : undefined\"\n :aria-invalid=\"invalid || undefined\"\n :class=\"\n cn(\n group ? inputEmbedded() : inputHost({ variant: props.variant, size: props.size }),\n selectTrigger(),\n props.class,\n )\n \"\n >\n <span class=\"min-w-0 flex-1 truncate\">\n {{ selected ? selected.label : (props.placeholder ?? t.select.placeholder) }}\n </span>\n <span :class=\"inputAdornment()\">\n <DisclosureIcon />\n </span>\n </PopoverTrigger>\n <PopoverPortal>\n <PopoverContent as-child align=\"start\" :side-offset=\"8\">\n <Card :padded=\"false\" data-hn-tree-select-content :class=\"treeSelectContent()\">\n <ScrollArea :class=\"treeSelectList()\">\n <TreeRoot\n v-slot=\"{ flattenItems }\"\n v-model:expanded=\"expanded\"\n :items=\"props.items\"\n :get-key=\"key\"\n :get-children=\"node => node.children\"\n :model-value=\"selected\"\n class=\"flex flex-col p-1 outline-none\"\n @update:model-value=\"choose\"\n >\n <TreeItem\n v-for=\"item in flattenItems\"\n v-slot=\"{ isExpanded, isSelected, handleToggle }\"\n :key=\"item._id\"\n v-bind=\"item.bind\"\n :value=\"item.value\"\n :level=\"item.level\"\n :disabled=\"item.value.disabled\"\n :class=\"treeSelectRow()\"\n :style=\"{ paddingInlineStart: `calc(0.375rem + ${(item.level - 1) * 1.25}rem)` }\"\n @toggle=\"keepRowClick\"\n >\n <span\n v-if=\"item.hasChildren\"\n :class=\"treeSelectToggle()\"\n @click.stop=\"handleToggle()\"\n >\n <DisclosureIcon direction=\"end\" :open=\"isExpanded\" />\n </span>\n <span v-else class=\"size-5 shrink-0\" />\n <span class=\"min-w-0 flex-1\">\n <slot name=\"node\" :node=\"item.value\">\n <span class=\"block truncate\">{{ item.value.label }}</span>\n <span v-if=\"item.value.description\" class=\"text-muted block truncate text-xs\">\n {{ item.value.description }}\n </span>\n </slot>\n </span>\n <span class=\"flex size-4 shrink-0 items-center justify-center\">\n <Check v-if=\"isSelected\" />\n </span>\n </TreeItem>\n <div v-if=\"props.items.length === 0\" :class=\"selectEmpty()\">{{ t.select.empty }}</div>\n </TreeRoot>\n </ScrollArea>\n </Card>\n </PopoverContent>\n </PopoverPortal>\n </PopoverRoot>\n</template>\n","<script setup lang=\"ts\">\n import { computed, ref, watch } from 'vue'\n import { Check } from '@lucide/vue'\n import {\n PopoverContent,\n PopoverPortal,\n PopoverRoot,\n PopoverTrigger,\n TreeItem,\n TreeRoot,\n } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import Card from '../card/Card.vue'\n import DisclosureIcon from '../disclosure-icon/DisclosureIcon.vue'\n import { useFieldControl } from '../form-field/context'\n import { injectInputGroup } from '../input-group/context'\n import {\n inputAdornment,\n inputEmbedded,\n inputHost,\n type InputVariants,\n } from '../input/input.variants'\n import ScrollArea from '../scroll-area/ScrollArea.vue'\n import { selectEmpty, selectTrigger } from '../select/select.variants'\n import {\n treeSelectContent,\n treeSelectList,\n treeSelectRow,\n treeSelectToggle,\n } from './tree-select.variants'\n import { findNode, pathTo, type TreeSelectNode } from './types'\n\n defineOptions({ name: 'HnTreeSelect', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n items: TreeSelectNode[]\n placeholder?: string\n defaultExpanded?: Array<string | number>\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>(),\n { defaultExpanded: () => [] },\n )\n\n const model = defineModel<string | number | null>()\n const open = defineModel<boolean>('open', { default: false })\n\n defineSlots<{ node(props: { node: TreeSelectNode }): unknown }>()\n\n const t = useUiLocale()\n const group = injectInputGroup()\n\n const {\n id: fieldId,\n invalid,\n disabled,\n describedBy,\n } = useFieldControl({\n invalid: () => props.invalid || !!group?.invalid.value,\n disabled: () => props.disabled || !!group?.disabled.value,\n })\n const selected = computed(() => findNode(props.items, model.value))\n const expanded = ref<string[]>([])\n\n watch(\n open,\n isOpen => {\n if (!isOpen) return\n const path = pathTo(props.items, model.value) ?? []\n expanded.value = Array.from(\n new Set([...props.defaultExpanded, ...path].map(value => String(value))),\n )\n },\n { immediate: true },\n )\n\n function key(node: TreeSelectNode) {\n return String(node.value)\n }\n\n function choose(node: TreeSelectNode | undefined) {\n if (!node || node.disabled) return\n model.value = node.value\n open.value = false\n }\n\n function keepRowClick(event: CustomEvent<{ originalEvent: Event }>) {\n if (event.detail.originalEvent.type === 'click') event.preventDefault()\n }\n</script>\n\n<template>\n <PopoverRoot v-model:open=\"open\" modal>\n <PopoverTrigger\n v-bind=\"$attrs\"\n :id=\"fieldId\"\n :aria-describedby=\"describedBy\"\n data-hn-tree-select\n role=\"combobox\"\n :aria-expanded=\"open\"\n :disabled=\"disabled\"\n :data-placeholder=\"selected ? undefined : ''\"\n :data-invalid=\"invalid ? '' : undefined\"\n :aria-invalid=\"invalid || undefined\"\n :class=\"\n cn(\n group ? inputEmbedded() : inputHost({ variant: props.variant, size: props.size }),\n selectTrigger(),\n props.class,\n )\n \"\n >\n <span class=\"min-w-0 flex-1 truncate\">\n {{ selected ? selected.label : (props.placeholder ?? t.select.placeholder) }}\n </span>\n <span :class=\"inputAdornment()\">\n <DisclosureIcon />\n </span>\n </PopoverTrigger>\n <PopoverPortal>\n <PopoverContent as-child align=\"start\" :side-offset=\"8\">\n <Card :padded=\"false\" data-hn-tree-select-content :class=\"treeSelectContent()\">\n <ScrollArea :class=\"treeSelectList()\">\n <TreeRoot\n v-slot=\"{ flattenItems }\"\n v-model:expanded=\"expanded\"\n :items=\"props.items\"\n :get-key=\"key\"\n :get-children=\"node => node.children\"\n :model-value=\"selected\"\n class=\"flex flex-col p-1 outline-none\"\n @update:model-value=\"choose\"\n >\n <TreeItem\n v-for=\"item in flattenItems\"\n v-slot=\"{ isExpanded, isSelected, handleToggle }\"\n :key=\"item._id\"\n v-bind=\"item.bind\"\n :value=\"item.value\"\n :level=\"item.level\"\n :disabled=\"item.value.disabled\"\n :class=\"treeSelectRow()\"\n :style=\"{ paddingInlineStart: `calc(0.375rem + ${(item.level - 1) * 1.25}rem)` }\"\n @toggle=\"keepRowClick\"\n >\n <span\n v-if=\"item.hasChildren\"\n :class=\"treeSelectToggle()\"\n @click.stop=\"handleToggle()\"\n >\n <DisclosureIcon direction=\"end\" :open=\"isExpanded\" />\n </span>\n <span v-else class=\"size-5 shrink-0\" />\n <span class=\"min-w-0 flex-1\">\n <slot name=\"node\" :node=\"item.value\">\n <span class=\"block truncate\">{{ item.value.label }}</span>\n <span v-if=\"item.value.description\" class=\"text-muted block truncate text-xs\">\n {{ item.value.description }}\n </span>\n </slot>\n </span>\n <span class=\"flex size-4 shrink-0 items-center justify-center\">\n <Check v-if=\"isSelected\" />\n </span>\n </TreeItem>\n <div v-if=\"props.items.length === 0\" :class=\"selectEmpty()\">{{ t.select.empty }}</div>\n </TreeRoot>\n </ScrollArea>\n </Card>\n </PopoverContent>\n </PopoverPortal>\n </PopoverRoot>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const checkbox = tv({\n base: [\n 'text-fg grid w-fit max-w-full cursor-pointer grid-cols-[auto_minmax(0,1fr)] items-center gap-x-[var(--hn-field-gap)] select-none',\n 'data-disabled:cursor-not-allowed data-disabled:opacity-50',\n ],\n variants: {\n size: {\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-md',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nexport const checkboxBox = tv({\n base: [\n 'hn-focus-ring hn-state-layer hn-transition-base relative grid shrink-0 cursor-pointer place-items-center',\n 'size-[var(--hn-checkbox-size)] border',\n 'border-line bg-surface shadow-sm disabled:cursor-not-allowed',\n '[--hn-state-selected-color:var(--hn-accent-on)] [--hn-state-selected-opacity:0]',\n 'data-[state=checked]:border-accent data-[state=checked]:bg-accent data-[state=checked]:text-surface',\n 'data-[state=indeterminate]:border-accent data-[state=indeterminate]:bg-accent data-[state=indeterminate]:text-surface',\n 'data-invalid:border-danger data-invalid:focus-visible:outline-danger',\n '[&_svg]:col-start-1 [&_svg]:row-start-1 [&_svg]:size-[var(--hn-checkbox-icon)] [&_svg]:stroke-[3]',\n ],\n variants: {\n shape: {\n square: 'rounded-xs',\n round: 'rounded-full',\n },\n size: {\n sm: '[--hn-checkbox-icon:0.625rem] [--hn-checkbox-size:0.875rem]',\n md: '[--hn-checkbox-icon:0.75rem] [--hn-checkbox-size:1rem]',\n lg: '[--hn-checkbox-icon:0.875rem] [--hn-checkbox-size:1.125rem]',\n },\n },\n defaultVariants: {\n shape: 'square',\n size: 'md',\n },\n})\n\nexport const checkboxTitle = tv({\n base: 'flex min-h-[1lh] min-w-0 items-center',\n})\n\nexport const checkboxTitleText = tv({\n base: 'block [text-box:trim-both_cap_alphabetic]',\n})\n\nexport const checkboxDescription = tv({\n base: 'text-muted col-start-2 block',\n variants: {\n size: {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nexport type CheckboxVariants = VariantProps<typeof checkbox>\n","<script setup lang=\"ts\">\n import { Check, Minus } from '@lucide/vue'\n import { CheckboxRoot } from 'reka-ui'\n import { useSlots } from 'vue'\n import { cn } from '../../lib/cn'\n import { useFieldControl } from '../form-field/context'\n import {\n checkbox,\n checkboxBox,\n checkboxDescription,\n checkboxTitle,\n checkboxTitleText,\n type CheckboxVariants,\n } from './checkbox.variants'\n\n defineOptions({ name: 'HnCheckbox', inheritAttrs: false })\n\n const props = defineProps<{\n size?: CheckboxVariants['size']\n description?: string\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>()\n\n const model = defineModel<boolean | 'indeterminate'>({ default: false })\n\n const slots = useSlots()\n\n const {\n id: fieldId,\n invalid,\n disabled,\n describedBy,\n } = useFieldControl({\n invalid: () => props.invalid,\n disabled: () => props.disabled,\n })\n</script>\n\n<template>\n <label\n data-hn-checkbox\n data-hn-state-group\n :data-disabled=\"disabled ? '' : undefined\"\n :class=\"cn(checkbox({ size: props.size }), props.class)\"\n >\n <CheckboxRoot\n v-slot=\"{ state }\"\n v-bind=\"$attrs\"\n v-model=\"model\"\n :id=\"fieldId\"\n :disabled=\"disabled\"\n :aria-invalid=\"invalid || undefined\"\n :aria-describedby=\"describedBy\"\n :data-invalid=\"invalid ? '' : undefined\"\n :class=\"checkboxBox({ size: props.size })\"\n >\n <Transition\n enter-active-class=\"hn-transition-press\"\n enter-from-class=\"scale-50 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-50 opacity-0\"\n >\n <Check v-if=\"state === true\" aria-hidden=\"true\" />\n </Transition>\n <Transition\n enter-active-class=\"hn-transition-press\"\n enter-from-class=\"scale-50 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-50 opacity-0\"\n >\n <Minus v-if=\"state === 'indeterminate'\" aria-hidden=\"true\" />\n </Transition>\n </CheckboxRoot>\n <span v-if=\"slots.default\" :class=\"checkboxTitle()\">\n <span :class=\"checkboxTitleText()\"><slot /></span>\n </span>\n <span v-if=\"props.description\" :class=\"checkboxDescription({ size: props.size })\">\n {{ props.description }}\n </span>\n </label>\n</template>\n","<script setup lang=\"ts\">\n import { Check, Minus } from '@lucide/vue'\n import { CheckboxRoot } from 'reka-ui'\n import { useSlots } from 'vue'\n import { cn } from '../../lib/cn'\n import { useFieldControl } from '../form-field/context'\n import {\n checkbox,\n checkboxBox,\n checkboxDescription,\n checkboxTitle,\n checkboxTitleText,\n type CheckboxVariants,\n } from './checkbox.variants'\n\n defineOptions({ name: 'HnCheckbox', inheritAttrs: false })\n\n const props = defineProps<{\n size?: CheckboxVariants['size']\n description?: string\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>()\n\n const model = defineModel<boolean | 'indeterminate'>({ default: false })\n\n const slots = useSlots()\n\n const {\n id: fieldId,\n invalid,\n disabled,\n describedBy,\n } = useFieldControl({\n invalid: () => props.invalid,\n disabled: () => props.disabled,\n })\n</script>\n\n<template>\n <label\n data-hn-checkbox\n data-hn-state-group\n :data-disabled=\"disabled ? '' : undefined\"\n :class=\"cn(checkbox({ size: props.size }), props.class)\"\n >\n <CheckboxRoot\n v-slot=\"{ state }\"\n v-bind=\"$attrs\"\n v-model=\"model\"\n :id=\"fieldId\"\n :disabled=\"disabled\"\n :aria-invalid=\"invalid || undefined\"\n :aria-describedby=\"describedBy\"\n :data-invalid=\"invalid ? '' : undefined\"\n :class=\"checkboxBox({ size: props.size })\"\n >\n <Transition\n enter-active-class=\"hn-transition-press\"\n enter-from-class=\"scale-50 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-50 opacity-0\"\n >\n <Check v-if=\"state === true\" aria-hidden=\"true\" />\n </Transition>\n <Transition\n enter-active-class=\"hn-transition-press\"\n enter-from-class=\"scale-50 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-50 opacity-0\"\n >\n <Minus v-if=\"state === 'indeterminate'\" aria-hidden=\"true\" />\n </Transition>\n </CheckboxRoot>\n <span v-if=\"slots.default\" :class=\"checkboxTitle()\">\n <span :class=\"checkboxTitleText()\"><slot /></span>\n </span>\n <span v-if=\"props.description\" :class=\"checkboxDescription({ size: props.size })\">\n {{ props.description }}\n </span>\n </label>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const checkboxGroup = tv({\n base: 'flex min-w-0',\n variants: {\n orientation: {\n vertical: 'flex-col gap-2',\n horizontal: 'flex-row flex-wrap gap-x-[var(--hn-inline-gap)] gap-y-2',\n },\n },\n defaultVariants: {\n orientation: 'vertical',\n },\n})\n\nexport type CheckboxGroupVariants = VariantProps<typeof checkboxGroup>\n","<script setup lang=\"ts\">\n import { CheckboxGroupRoot } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { shieldFormField, useFieldControl } from '../form-field/context'\n import Checkbox from '../checkbox/Checkbox.vue'\n import type { CheckboxVariants } from '../checkbox/checkbox.variants'\n import type { SelectOption } from '../select/types'\n import { checkboxGroup, type CheckboxGroupVariants } from './checkbox-group.variants'\n\n defineOptions({ name: 'HnCheckboxGroup' })\n\n const props = defineProps<{\n options: SelectOption[]\n orientation?: CheckboxGroupVariants['orientation']\n size?: CheckboxVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>()\n\n const model = defineModel<Array<string | number>>({ default: () => [] })\n\n const { labelledBy, invalid, disabled, describedBy } = useFieldControl({\n invalid: () => props.invalid,\n disabled: () => props.disabled,\n })\n shieldFormField()\n\n defineSlots<{ option(props: { option: SelectOption }): unknown }>()\n</script>\n\n<template>\n <CheckboxGroupRoot\n v-model=\"model\"\n :disabled=\"disabled\"\n :roving-focus=\"false\"\n role=\"group\"\n :aria-labelledby=\"labelledBy\"\n :aria-describedby=\"describedBy\"\n :aria-invalid=\"invalid || undefined\"\n data-hn-checkbox-group\n :data-orientation=\"props.orientation ?? 'vertical'\"\n :data-disabled=\"disabled ? '' : undefined\"\n :class=\"cn(checkboxGroup({ orientation: props.orientation }), props.class)\"\n >\n <Checkbox\n v-for=\"option in props.options\"\n :key=\"option.value\"\n :value=\"option.value\"\n :size=\"props.size\"\n :disabled=\"disabled || option.disabled\"\n :invalid=\"invalid\"\n :description=\"option.description\"\n >\n <slot name=\"option\" :option=\"option\">{{ option.label }}</slot>\n </Checkbox>\n </CheckboxGroupRoot>\n</template>\n","<script setup lang=\"ts\">\n import { CheckboxGroupRoot } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { shieldFormField, useFieldControl } from '../form-field/context'\n import Checkbox from '../checkbox/Checkbox.vue'\n import type { CheckboxVariants } from '../checkbox/checkbox.variants'\n import type { SelectOption } from '../select/types'\n import { checkboxGroup, type CheckboxGroupVariants } from './checkbox-group.variants'\n\n defineOptions({ name: 'HnCheckboxGroup' })\n\n const props = defineProps<{\n options: SelectOption[]\n orientation?: CheckboxGroupVariants['orientation']\n size?: CheckboxVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>()\n\n const model = defineModel<Array<string | number>>({ default: () => [] })\n\n const { labelledBy, invalid, disabled, describedBy } = useFieldControl({\n invalid: () => props.invalid,\n disabled: () => props.disabled,\n })\n shieldFormField()\n\n defineSlots<{ option(props: { option: SelectOption }): unknown }>()\n</script>\n\n<template>\n <CheckboxGroupRoot\n v-model=\"model\"\n :disabled=\"disabled\"\n :roving-focus=\"false\"\n role=\"group\"\n :aria-labelledby=\"labelledBy\"\n :aria-describedby=\"describedBy\"\n :aria-invalid=\"invalid || undefined\"\n data-hn-checkbox-group\n :data-orientation=\"props.orientation ?? 'vertical'\"\n :data-disabled=\"disabled ? '' : undefined\"\n :class=\"cn(checkboxGroup({ orientation: props.orientation }), props.class)\"\n >\n <Checkbox\n v-for=\"option in props.options\"\n :key=\"option.value\"\n :value=\"option.value\"\n :size=\"props.size\"\n :disabled=\"disabled || option.disabled\"\n :invalid=\"invalid\"\n :description=\"option.description\"\n >\n <slot name=\"option\" :option=\"option\">{{ option.label }}</slot>\n </Checkbox>\n </CheckboxGroupRoot>\n</template>\n","import { tv } from '../../lib/tv'\n\nexport const radioDot = tv({\n base: 'block size-[calc(var(--hn-checkbox-size)/2)] bg-surface rounded-full',\n})\n","<script setup lang=\"ts\">\n import { RadioGroupItem, RadioGroupRoot } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { useFieldControl } from '../form-field/context'\n import {\n checkbox,\n checkboxBox,\n checkboxDescription,\n checkboxTitle,\n checkboxTitleText,\n type CheckboxVariants,\n } from '../checkbox/checkbox.variants'\n import {\n checkboxGroup,\n type CheckboxGroupVariants,\n } from '../checkbox-group/checkbox-group.variants'\n import type { SelectOption } from '../select/types'\n import { radioDot } from './radio-group.variants'\n\n defineOptions({ name: 'HnRadioGroup' })\n\n const props = defineProps<{\n options: SelectOption[]\n orientation?: CheckboxGroupVariants['orientation']\n size?: CheckboxVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>()\n\n const model = defineModel<string | number | null>()\n\n const { labelledBy, invalid, disabled, describedBy } = useFieldControl({\n invalid: () => props.invalid,\n disabled: () => props.disabled,\n })\n\n defineSlots<{ option(props: { option: SelectOption }): unknown }>()\n</script>\n\n<template>\n <RadioGroupRoot\n v-model=\"model\"\n :disabled=\"disabled\"\n :aria-labelledby=\"labelledBy\"\n :aria-describedby=\"describedBy\"\n :aria-invalid=\"invalid || undefined\"\n data-hn-radio-group\n :class=\"cn(checkboxGroup({ orientation: props.orientation }), props.class)\"\n >\n <label\n v-for=\"option in props.options\"\n :key=\"option.value\"\n data-hn-radio\n data-hn-state-group\n :data-disabled=\"disabled || option.disabled ? '' : undefined\"\n :class=\"checkbox({ size: props.size })\"\n >\n <RadioGroupItem\n v-slot=\"{ checked }\"\n :value=\"option.value\"\n :disabled=\"option.disabled\"\n :aria-invalid=\"invalid || undefined\"\n :data-invalid=\"invalid ? '' : undefined\"\n :class=\"checkboxBox({ shape: 'round', size: props.size })\"\n >\n <Transition\n enter-active-class=\"hn-transition-press\"\n enter-from-class=\"scale-50 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-50 opacity-0\"\n >\n <span v-if=\"checked\" :class=\"radioDot()\" />\n </Transition>\n </RadioGroupItem>\n <span :class=\"checkboxTitle()\">\n <span :class=\"checkboxTitleText()\">\n <slot name=\"option\" :option=\"option\">{{ option.label }}</slot>\n </span>\n </span>\n <span v-if=\"option.description\" :class=\"checkboxDescription({ size: props.size })\">\n {{ option.description }}\n </span>\n </label>\n </RadioGroupRoot>\n</template>\n","<script setup lang=\"ts\">\n import { RadioGroupItem, RadioGroupRoot } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { useFieldControl } from '../form-field/context'\n import {\n checkbox,\n checkboxBox,\n checkboxDescription,\n checkboxTitle,\n checkboxTitleText,\n type CheckboxVariants,\n } from '../checkbox/checkbox.variants'\n import {\n checkboxGroup,\n type CheckboxGroupVariants,\n } from '../checkbox-group/checkbox-group.variants'\n import type { SelectOption } from '../select/types'\n import { radioDot } from './radio-group.variants'\n\n defineOptions({ name: 'HnRadioGroup' })\n\n const props = defineProps<{\n options: SelectOption[]\n orientation?: CheckboxGroupVariants['orientation']\n size?: CheckboxVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>()\n\n const model = defineModel<string | number | null>()\n\n const { labelledBy, invalid, disabled, describedBy } = useFieldControl({\n invalid: () => props.invalid,\n disabled: () => props.disabled,\n })\n\n defineSlots<{ option(props: { option: SelectOption }): unknown }>()\n</script>\n\n<template>\n <RadioGroupRoot\n v-model=\"model\"\n :disabled=\"disabled\"\n :aria-labelledby=\"labelledBy\"\n :aria-describedby=\"describedBy\"\n :aria-invalid=\"invalid || undefined\"\n data-hn-radio-group\n :class=\"cn(checkboxGroup({ orientation: props.orientation }), props.class)\"\n >\n <label\n v-for=\"option in props.options\"\n :key=\"option.value\"\n data-hn-radio\n data-hn-state-group\n :data-disabled=\"disabled || option.disabled ? '' : undefined\"\n :class=\"checkbox({ size: props.size })\"\n >\n <RadioGroupItem\n v-slot=\"{ checked }\"\n :value=\"option.value\"\n :disabled=\"option.disabled\"\n :aria-invalid=\"invalid || undefined\"\n :data-invalid=\"invalid ? '' : undefined\"\n :class=\"checkboxBox({ shape: 'round', size: props.size })\"\n >\n <Transition\n enter-active-class=\"hn-transition-press\"\n enter-from-class=\"scale-50 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-50 opacity-0\"\n >\n <span v-if=\"checked\" :class=\"radioDot()\" />\n </Transition>\n </RadioGroupItem>\n <span :class=\"checkboxTitle()\">\n <span :class=\"checkboxTitleText()\">\n <slot name=\"option\" :option=\"option\">{{ option.label }}</slot>\n </span>\n </span>\n <span v-if=\"option.description\" :class=\"checkboxDescription({ size: props.size })\">\n {{ option.description }}\n </span>\n </label>\n </RadioGroupRoot>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const switchTrack = tv({\n base: [\n 'hn-focus-ring hn-state-layer hn-transition-base group/hn-switch relative box-border shrink-0 cursor-pointer',\n 'h-[var(--hn-switch-h)] w-[var(--hn-switch-w)] rounded-full border border-transparent',\n 'bg-line-strong text-fg disabled:cursor-not-allowed',\n '[--hn-state-selected-color:currentColor] [--hn-state-selected-opacity:0]',\n '[--hn-switch-p:0] [--hn-switch-travel:calc(var(--hn-switch-w)-var(--hn-switch-thumb)-8px)] rtl:[--hn-switch-dir:-1]',\n 'data-hn-on:bg-accent data-hn-on:text-accent-on data-hn-on:[--hn-switch-p:1]',\n 'data-invalid:border-danger data-invalid:focus-visible:outline-danger',\n ],\n variants: {\n size: {\n sm: '[--hn-switch-h:1.25rem] [--hn-switch-thumb:0.75rem] [--hn-switch-w:2rem]',\n md: '[--hn-switch-h:1.5rem] [--hn-switch-thumb:1rem] [--hn-switch-w:2.5rem]',\n lg: '[--hn-switch-h:1.75rem] [--hn-switch-thumb:1.25rem] [--hn-switch-w:3rem]',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nexport const switchThumb = tv({\n base: [\n 'hn-switch-thumb pointer-events-none absolute top-0.75 start-0.75 box-border block rounded-full',\n 'size-[var(--hn-switch-thumb)]',\n '[translate:calc(var(--hn-switch-p)*var(--hn-switch-travel)*var(--hn-switch-dir,1))_0]',\n 'border-line bg-surface border shadow-sm',\n ],\n})\n\nexport type SwitchVariants = VariantProps<typeof switchTrack>\n","<script setup lang=\"ts\">\n import { SwitchRoot } from 'reka-ui'\n import { useSlots } from 'vue'\n import { cn } from '../../lib/cn'\n import { useFieldControl } from '../form-field/context'\n import {\n checkbox,\n checkboxDescription,\n checkboxTitle,\n checkboxTitleText,\n } from '../checkbox/checkbox.variants'\n import { switchThumb, switchTrack, type SwitchVariants } from './switch.variants'\n\n defineOptions({ name: 'HnSwitch', inheritAttrs: false })\n\n const props = defineProps<{\n size?: SwitchVariants['size']\n description?: string\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>()\n\n const model = defineModel<boolean>({ default: false })\n\n const slots = useSlots()\n\n const {\n id: fieldId,\n invalid,\n disabled,\n describedBy,\n } = useFieldControl({\n invalid: () => props.invalid,\n disabled: () => props.disabled,\n })\n</script>\n\n<template>\n <label\n data-hn-switch\n data-hn-state-group\n :data-disabled=\"disabled ? '' : undefined\"\n :class=\"cn(checkbox({ size: props.size }), props.class)\"\n >\n <SwitchRoot\n v-bind=\"$attrs\"\n v-model=\"model\"\n :id=\"fieldId\"\n :disabled=\"disabled\"\n :aria-invalid=\"invalid || undefined\"\n :aria-describedby=\"describedBy\"\n :data-invalid=\"invalid ? '' : undefined\"\n :data-hn-on=\"model ? '' : undefined\"\n :class=\"switchTrack({ size: props.size })\"\n >\n <span data-hn-thumb aria-hidden=\"true\" :class=\"switchThumb()\" />\n </SwitchRoot>\n <span v-if=\"slots.default\" :class=\"checkboxTitle()\">\n <span :class=\"checkboxTitleText()\"><slot /></span>\n </span>\n <span v-if=\"props.description\" :class=\"checkboxDescription({ size: props.size })\">\n {{ props.description }}\n </span>\n </label>\n</template>\n","<script setup lang=\"ts\">\n import { SwitchRoot } from 'reka-ui'\n import { useSlots } from 'vue'\n import { cn } from '../../lib/cn'\n import { useFieldControl } from '../form-field/context'\n import {\n checkbox,\n checkboxDescription,\n checkboxTitle,\n checkboxTitleText,\n } from '../checkbox/checkbox.variants'\n import { switchThumb, switchTrack, type SwitchVariants } from './switch.variants'\n\n defineOptions({ name: 'HnSwitch', inheritAttrs: false })\n\n const props = defineProps<{\n size?: SwitchVariants['size']\n description?: string\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>()\n\n const model = defineModel<boolean>({ default: false })\n\n const slots = useSlots()\n\n const {\n id: fieldId,\n invalid,\n disabled,\n describedBy,\n } = useFieldControl({\n invalid: () => props.invalid,\n disabled: () => props.disabled,\n })\n</script>\n\n<template>\n <label\n data-hn-switch\n data-hn-state-group\n :data-disabled=\"disabled ? '' : undefined\"\n :class=\"cn(checkbox({ size: props.size }), props.class)\"\n >\n <SwitchRoot\n v-bind=\"$attrs\"\n v-model=\"model\"\n :id=\"fieldId\"\n :disabled=\"disabled\"\n :aria-invalid=\"invalid || undefined\"\n :aria-describedby=\"describedBy\"\n :data-invalid=\"invalid ? '' : undefined\"\n :data-hn-on=\"model ? '' : undefined\"\n :class=\"switchTrack({ size: props.size })\"\n >\n <span data-hn-thumb aria-hidden=\"true\" :class=\"switchThumb()\" />\n </SwitchRoot>\n <span v-if=\"slots.default\" :class=\"checkboxTitle()\">\n <span :class=\"checkboxTitleText()\"><slot /></span>\n </span>\n <span v-if=\"props.description\" :class=\"checkboxDescription({ size: props.size })\">\n {{ props.description }}\n </span>\n </label>\n</template>\n","import { useEventListener } from '@vueuse/core'\nimport { computed, ref, type Ref } from 'vue'\n\nexport function useSliderChrome(disabled: Ref<boolean>, label: Ref<'auto' | 'always' | 'none'>) {\n const dragging = ref(false)\n const hovered = ref(false)\n const ring = ref(false)\n let pointer = false\n\n const labelOpen = computed(\n () =>\n label.value === 'always' ||\n (!disabled.value && (hovered.value || ring.value || dragging.value)),\n )\n\n function release() {\n dragging.value = false\n }\n\n useEventListener(['pointerup', 'pointercancel'], release, { passive: true })\n\n function onPointerDown(event: PointerEvent) {\n pointer = true\n if (disabled.value) return\n const root = event.currentTarget as HTMLElement\n if (!root.firstElementChild?.contains(event.target as Node)) return\n dragging.value = true\n }\n\n function onFocusIn() {\n ring.value = !pointer\n pointer = false\n }\n\n const listeners = {\n keydown: () => (ring.value = true),\n focusin: onFocusIn,\n focusout: () => (ring.value = false),\n pointerenter: (event: PointerEvent) => (hovered.value = event.pointerType === 'mouse'),\n pointerleave: () => (hovered.value = false),\n }\n\n return { dragging, hovered, ring, labelOpen, onPointerDown, listeners }\n}\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const slider = tv({\n base: 'group/hn-slider relative flex w-full min-w-0 flex-col data-disabled:cursor-not-allowed data-disabled:opacity-50',\n variants: {\n size: {\n sm: '[--hn-slider-h:1.25rem] [--hn-slider-thumb:0.75rem]',\n md: '[--hn-slider-h:1.5rem] [--hn-slider-thumb:1rem]',\n lg: '[--hn-slider-h:1.75rem] [--hn-slider-thumb:1.25rem]',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nexport const sliderRoot = tv({\n base: [\n 'bg-line-strong relative flex h-[var(--hn-slider-h)] w-full cursor-pointer touch-none rounded-full select-none',\n 'data-disabled:pointer-events-none',\n ],\n})\n\nexport const sliderTrack = tv({\n base: 'absolute inset-0 overflow-hidden rounded-full',\n})\n\nexport const sliderRange = tv({\n base: [\n 'hn-slider-move bg-accent absolute inset-y-0 start-0 rounded-full group-data-dragging/hn-slider:transition-none',\n 'w-[calc((100%-var(--hn-slider-thumb)-0.5rem)*var(--hn-slider-p)+var(--hn-slider-thumb)+0.5rem)]',\n ],\n})\n\nexport const sliderRangeBetween = tv({\n base: [\n 'hn-slider-move bg-accent absolute inset-y-0 rounded-full group-data-dragging/hn-slider:transition-none',\n 'start-[calc(var(--hn-slider-p)*(100%-var(--hn-slider-thumb)-0.5rem))]',\n 'w-[calc((var(--hn-slider-q)-var(--hn-slider-p))*(100%-var(--hn-slider-thumb)-0.5rem)+var(--hn-slider-thumb)+0.5rem)]',\n ],\n})\n\nexport const sliderThumb = tv({\n base: [\n 'hn-state-layer hn-slider-move border-line bg-surface text-fg top-1 !block size-[var(--hn-slider-thumb)] cursor-grab rounded-full border shadow-sm outline-none',\n '!start-[calc(0.25rem+var(--hn-slider-thumb)/2+var(--hn-slider-p)*(100%-0.5rem-var(--hn-slider-thumb)))]',\n 'data-focus-ring:outline-2 data-focus-ring:outline-offset-2 data-focus-ring:outline-solid data-focus-ring:outline-(--hn-focus-ring)',\n 'group-data-dragging/hn-slider:cursor-grabbing group-data-dragging/hn-slider:transition-none data-disabled:cursor-not-allowed',\n ],\n})\n\nexport const sliderMarks = tv({\n base: 'pointer-events-none absolute inset-x-[calc(var(--hn-slider-thumb)/2+0.25rem)] top-1/2 h-0',\n})\n\nexport const sliderMark = tv({\n base: 'border-line-strong bg-surface block size-1.5 shrink-0 rounded-full border',\n})\n\nexport const sliderMarkLabels = tv({\n base: 'text-muted relative mx-[calc(var(--hn-slider-thumb)/2+0.25rem)] h-4 text-xs',\n})\n\nexport type SliderVariants = VariantProps<typeof slider>\n","<script setup lang=\"ts\">\n import { injectTooltipProviderContext, SliderThumb } from 'reka-ui'\n import Tooltip from '../tooltip/Tooltip.vue'\n import { sliderThumb } from './slider.variants'\n\n defineOptions({ name: 'HnSliderHandle', inheritAttrs: false })\n\n const props = defineProps<{ text: string; open: boolean; ring: boolean; tooltip: boolean }>()\n\n const tooltips = !!injectTooltipProviderContext(null)\n</script>\n\n<template>\n <Tooltip v-if=\"props.tooltip && tooltips\" :open=\"props.open\" :content=\"props.text\">\n <SliderThumb\n v-bind=\"$attrs\"\n :data-focus-ring=\"props.ring ? '' : undefined\"\n :class=\"sliderThumb()\"\n />\n </Tooltip>\n <SliderThumb\n v-else\n v-bind=\"$attrs\"\n :data-focus-ring=\"props.ring ? '' : undefined\"\n :class=\"sliderThumb()\"\n />\n</template>\n","<script setup lang=\"ts\">\n import { injectTooltipProviderContext, SliderThumb } from 'reka-ui'\n import Tooltip from '../tooltip/Tooltip.vue'\n import { sliderThumb } from './slider.variants'\n\n defineOptions({ name: 'HnSliderHandle', inheritAttrs: false })\n\n const props = defineProps<{ text: string; open: boolean; ring: boolean; tooltip: boolean }>()\n\n const tooltips = !!injectTooltipProviderContext(null)\n</script>\n\n<template>\n <Tooltip v-if=\"props.tooltip && tooltips\" :open=\"props.open\" :content=\"props.text\">\n <SliderThumb\n v-bind=\"$attrs\"\n :data-focus-ring=\"props.ring ? '' : undefined\"\n :class=\"sliderThumb()\"\n />\n </Tooltip>\n <SliderThumb\n v-else\n v-bind=\"$attrs\"\n :data-focus-ring=\"props.ring ? '' : undefined\"\n :class=\"sliderThumb()\"\n />\n</template>\n","<script setup lang=\"ts\">\n import { sliderMark, sliderMarkLabels, sliderMarks } from './slider.variants'\n\n defineOptions({ name: 'HnSliderMarks' })\n\n const props = defineProps<{\n marks: Array<{ value: number; label?: string }>\n min: number\n max: number\n labels?: boolean\n }>()\n\n function percent(value: number) {\n const span = props.max - props.min\n return span > 0 ? ((value - props.min) / span) * 100 : 0\n }\n</script>\n\n<template>\n <span v-if=\"props.labels\" aria-hidden=\"true\" :class=\"sliderMarkLabels()\">\n <span\n v-for=\"mark in props.marks\"\n :key=\"mark.value\"\n class=\"absolute top-0 flex w-0 justify-center whitespace-nowrap\"\n :style=\"{ insetInlineStart: `${percent(mark.value)}%` }\"\n >\n {{ mark.label }}\n </span>\n </span>\n <span v-else aria-hidden=\"true\" :class=\"sliderMarks()\">\n <span\n v-for=\"mark in props.marks\"\n :key=\"mark.value\"\n class=\"absolute top-0 flex h-0 w-0 items-center justify-center\"\n :style=\"{ insetInlineStart: `${percent(mark.value)}%` }\"\n >\n <span :class=\"sliderMark()\" />\n </span>\n </span>\n</template>\n","<script setup lang=\"ts\">\n import { sliderMark, sliderMarkLabels, sliderMarks } from './slider.variants'\n\n defineOptions({ name: 'HnSliderMarks' })\n\n const props = defineProps<{\n marks: Array<{ value: number; label?: string }>\n min: number\n max: number\n labels?: boolean\n }>()\n\n function percent(value: number) {\n const span = props.max - props.min\n return span > 0 ? ((value - props.min) / span) * 100 : 0\n }\n</script>\n\n<template>\n <span v-if=\"props.labels\" aria-hidden=\"true\" :class=\"sliderMarkLabels()\">\n <span\n v-for=\"mark in props.marks\"\n :key=\"mark.value\"\n class=\"absolute top-0 flex w-0 justify-center whitespace-nowrap\"\n :style=\"{ insetInlineStart: `${percent(mark.value)}%` }\"\n >\n {{ mark.label }}\n </span>\n </span>\n <span v-else aria-hidden=\"true\" :class=\"sliderMarks()\">\n <span\n v-for=\"mark in props.marks\"\n :key=\"mark.value\"\n class=\"absolute top-0 flex h-0 w-0 items-center justify-center\"\n :style=\"{ insetInlineStart: `${percent(mark.value)}%` }\"\n >\n <span :class=\"sliderMark()\" />\n </span>\n </span>\n</template>\n","<script setup lang=\"ts\">\n import { SliderRoot, SliderTrack } from 'reka-ui'\n import { computed, toRef } from 'vue'\n import { cn } from '../../lib/cn'\n import { useFieldControl } from '../form-field/context'\n import { useUiLocale } from '../../locale'\n import { useSliderChrome } from './composables/useSliderChrome'\n import SliderHandle from './SliderHandle.vue'\n import SliderMarks from './SliderMarks.vue'\n import {\n slider,\n sliderRange,\n sliderRoot,\n sliderTrack,\n type SliderVariants,\n } from './slider.variants'\n\n defineOptions({ name: 'HnSlider', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n min?: number\n max?: number\n step?: number\n marks?: Array<{ value: number; label?: string }>\n label?: 'auto' | 'always' | 'none'\n format?: (value: number) => string\n size?: SliderVariants['size']\n disabled?: boolean\n class?: string\n }>(),\n { min: 0, max: 100, step: 1, label: 'auto' },\n )\n\n const emit = defineEmits<{ commit: [value: number] }>()\n\n const model = defineModel<number>()\n\n const t = useUiLocale()\n const { labelledBy, invalid, disabled, describedBy } = useFieldControl({\n disabled: () => props.disabled,\n })\n const { dragging, ring, labelOpen, onPointerDown, listeners } = useSliderChrome(\n disabled,\n toRef(props, 'label'),\n )\n\n const values = computed(() => [model.value ?? props.min])\n const text = computed(() => {\n const value = values.value[0]!\n return props.format ? props.format(value) : new Intl.NumberFormat(t.value.tag).format(value)\n })\n const hasMarkLabels = computed(() => !!props.marks?.some(mark => mark.label))\n const position = computed(() => {\n const span = props.max - props.min\n const p = span > 0 ? (values.value[0]! - props.min) / span : 0\n return { '--hn-slider-p': String(p) }\n })\n</script>\n\n<template>\n <span\n data-hn-slider\n data-hn-state-group\n :data-disabled=\"disabled ? '' : undefined\"\n :data-dragging=\"dragging ? '' : undefined\"\n :style=\"position\"\n :class=\"cn(slider({ size: props.size }), props.class)\"\n @pointerdown.capture=\"onPointerDown\"\n v-on=\"listeners\"\n >\n <SliderRoot\n :model-value=\"values\"\n :min=\"props.min\"\n :max=\"props.max\"\n :step=\"props.step\"\n :disabled=\"disabled\"\n :class=\"sliderRoot()\"\n @update:model-value=\"value => (model = value?.[0])\"\n @value-commit=\"value => emit('commit', value[0]!)\"\n >\n <SliderTrack :class=\"sliderTrack()\">\n <span :class=\"sliderRange()\" />\n </SliderTrack>\n <SliderMarks\n v-if=\"props.marks?.length\"\n :marks=\"props.marks\"\n :min=\"props.min\"\n :max=\"props.max\"\n />\n <SliderHandle\n v-bind=\"$attrs\"\n :aria-labelledby=\"labelledBy\"\n :aria-describedby=\"describedBy\"\n :aria-invalid=\"invalid || undefined\"\n :text=\"text\"\n :open=\"labelOpen\"\n :ring=\"ring\"\n :tooltip=\"props.label !== 'none'\"\n />\n </SliderRoot>\n <SliderMarks\n v-if=\"hasMarkLabels\"\n :marks=\"props.marks!\"\n :min=\"props.min\"\n :max=\"props.max\"\n labels\n />\n </span>\n</template>\n","<script setup lang=\"ts\">\n import { SliderRoot, SliderTrack } from 'reka-ui'\n import { computed, toRef } from 'vue'\n import { cn } from '../../lib/cn'\n import { useFieldControl } from '../form-field/context'\n import { useUiLocale } from '../../locale'\n import { useSliderChrome } from './composables/useSliderChrome'\n import SliderHandle from './SliderHandle.vue'\n import SliderMarks from './SliderMarks.vue'\n import {\n slider,\n sliderRange,\n sliderRoot,\n sliderTrack,\n type SliderVariants,\n } from './slider.variants'\n\n defineOptions({ name: 'HnSlider', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n min?: number\n max?: number\n step?: number\n marks?: Array<{ value: number; label?: string }>\n label?: 'auto' | 'always' | 'none'\n format?: (value: number) => string\n size?: SliderVariants['size']\n disabled?: boolean\n class?: string\n }>(),\n { min: 0, max: 100, step: 1, label: 'auto' },\n )\n\n const emit = defineEmits<{ commit: [value: number] }>()\n\n const model = defineModel<number>()\n\n const t = useUiLocale()\n const { labelledBy, invalid, disabled, describedBy } = useFieldControl({\n disabled: () => props.disabled,\n })\n const { dragging, ring, labelOpen, onPointerDown, listeners } = useSliderChrome(\n disabled,\n toRef(props, 'label'),\n )\n\n const values = computed(() => [model.value ?? props.min])\n const text = computed(() => {\n const value = values.value[0]!\n return props.format ? props.format(value) : new Intl.NumberFormat(t.value.tag).format(value)\n })\n const hasMarkLabels = computed(() => !!props.marks?.some(mark => mark.label))\n const position = computed(() => {\n const span = props.max - props.min\n const p = span > 0 ? (values.value[0]! - props.min) / span : 0\n return { '--hn-slider-p': String(p) }\n })\n</script>\n\n<template>\n <span\n data-hn-slider\n data-hn-state-group\n :data-disabled=\"disabled ? '' : undefined\"\n :data-dragging=\"dragging ? '' : undefined\"\n :style=\"position\"\n :class=\"cn(slider({ size: props.size }), props.class)\"\n @pointerdown.capture=\"onPointerDown\"\n v-on=\"listeners\"\n >\n <SliderRoot\n :model-value=\"values\"\n :min=\"props.min\"\n :max=\"props.max\"\n :step=\"props.step\"\n :disabled=\"disabled\"\n :class=\"sliderRoot()\"\n @update:model-value=\"value => (model = value?.[0])\"\n @value-commit=\"value => emit('commit', value[0]!)\"\n >\n <SliderTrack :class=\"sliderTrack()\">\n <span :class=\"sliderRange()\" />\n </SliderTrack>\n <SliderMarks\n v-if=\"props.marks?.length\"\n :marks=\"props.marks\"\n :min=\"props.min\"\n :max=\"props.max\"\n />\n <SliderHandle\n v-bind=\"$attrs\"\n :aria-labelledby=\"labelledBy\"\n :aria-describedby=\"describedBy\"\n :aria-invalid=\"invalid || undefined\"\n :text=\"text\"\n :open=\"labelOpen\"\n :ring=\"ring\"\n :tooltip=\"props.label !== 'none'\"\n />\n </SliderRoot>\n <SliderMarks\n v-if=\"hasMarkLabels\"\n :marks=\"props.marks!\"\n :min=\"props.min\"\n :max=\"props.max\"\n labels\n />\n </span>\n</template>\n","<script setup lang=\"ts\">\n import { SliderRoot, SliderTrack } from 'reka-ui'\n import { computed, toRef } from 'vue'\n import { cn } from '../../lib/cn'\n import { useFieldControl } from '../form-field/context'\n import { useUiLocale } from '../../locale'\n import { useSliderChrome } from '../slider/composables/useSliderChrome'\n import SliderHandle from '../slider/SliderHandle.vue'\n import SliderMarks from '../slider/SliderMarks.vue'\n import {\n slider,\n sliderRangeBetween,\n sliderRoot,\n sliderTrack,\n type SliderVariants,\n } from '../slider/slider.variants'\n\n defineOptions({ name: 'HnRangeSlider', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n min?: number\n max?: number\n step?: number\n minSteps?: number\n marks?: Array<{ value: number; label?: string }>\n label?: 'auto' | 'always' | 'none'\n format?: (value: number) => string\n size?: SliderVariants['size']\n disabled?: boolean\n class?: string\n }>(),\n { min: 0, max: 100, step: 1, minSteps: 0, label: 'auto' },\n )\n\n const emit = defineEmits<{ commit: [value: [number, number]] }>()\n\n const model = defineModel<[number, number]>()\n\n const t = useUiLocale()\n const { labelledBy, invalid, disabled, describedBy } = useFieldControl({\n disabled: () => props.disabled,\n })\n const { dragging, ring, labelOpen, onPointerDown, listeners } = useSliderChrome(\n disabled,\n toRef(props, 'label'),\n )\n\n const values = computed<[number, number]>(() => model.value ?? [props.min, props.max])\n const hasMarkLabels = computed(() => !!props.marks?.some(mark => mark.label))\n\n function fraction(value: number) {\n const span = props.max - props.min\n return span > 0 ? (value - props.min) / span : 0\n }\n\n function text(value: number) {\n return props.format ? props.format(value) : new Intl.NumberFormat(t.value.tag).format(value)\n }\n\n const position = computed(() => ({\n '--hn-slider-p': String(fraction(values.value[0])),\n '--hn-slider-q': String(fraction(values.value[1])),\n }))\n</script>\n\n<template>\n <span\n data-hn-range-slider\n data-hn-state-group\n role=\"group\"\n v-bind=\"$attrs\"\n :aria-labelledby=\"labelledBy\"\n :aria-describedby=\"describedBy\"\n :aria-invalid=\"invalid || undefined\"\n :data-disabled=\"disabled ? '' : undefined\"\n :data-dragging=\"dragging ? '' : undefined\"\n :style=\"position\"\n :class=\"cn(slider({ size: props.size }), props.class)\"\n @pointerdown.capture=\"onPointerDown\"\n v-on=\"listeners\"\n >\n <SliderRoot\n :model-value=\"values\"\n :min=\"props.min\"\n :max=\"props.max\"\n :step=\"props.step\"\n :min-steps-between-thumbs=\"props.minSteps\"\n :disabled=\"disabled\"\n :class=\"sliderRoot()\"\n @update:model-value=\"value => (model = [value![0]!, value![1]!])\"\n @value-commit=\"value => emit('commit', [value[0]!, value[1]!])\"\n >\n <SliderTrack :class=\"sliderTrack()\">\n <span :class=\"sliderRangeBetween()\" />\n </SliderTrack>\n <SliderMarks\n v-if=\"props.marks?.length\"\n :marks=\"props.marks\"\n :min=\"props.min\"\n :max=\"props.max\"\n />\n <SliderHandle\n :aria-label=\"t.slider.minimum\"\n :style=\"{ '--hn-slider-p': String(fraction(values[0])) }\"\n :text=\"text(values[0])\"\n :open=\"labelOpen\"\n :ring=\"ring\"\n :tooltip=\"props.label !== 'none'\"\n />\n <SliderHandle\n :aria-label=\"t.slider.maximum\"\n :style=\"{ '--hn-slider-p': String(fraction(values[1])) }\"\n :text=\"text(values[1])\"\n :open=\"labelOpen\"\n :ring=\"ring\"\n :tooltip=\"props.label !== 'none'\"\n />\n </SliderRoot>\n <SliderMarks\n v-if=\"hasMarkLabels\"\n :marks=\"props.marks!\"\n :min=\"props.min\"\n :max=\"props.max\"\n labels\n />\n </span>\n</template>\n","<script setup lang=\"ts\">\n import { SliderRoot, SliderTrack } from 'reka-ui'\n import { computed, toRef } from 'vue'\n import { cn } from '../../lib/cn'\n import { useFieldControl } from '../form-field/context'\n import { useUiLocale } from '../../locale'\n import { useSliderChrome } from '../slider/composables/useSliderChrome'\n import SliderHandle from '../slider/SliderHandle.vue'\n import SliderMarks from '../slider/SliderMarks.vue'\n import {\n slider,\n sliderRangeBetween,\n sliderRoot,\n sliderTrack,\n type SliderVariants,\n } from '../slider/slider.variants'\n\n defineOptions({ name: 'HnRangeSlider', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n min?: number\n max?: number\n step?: number\n minSteps?: number\n marks?: Array<{ value: number; label?: string }>\n label?: 'auto' | 'always' | 'none'\n format?: (value: number) => string\n size?: SliderVariants['size']\n disabled?: boolean\n class?: string\n }>(),\n { min: 0, max: 100, step: 1, minSteps: 0, label: 'auto' },\n )\n\n const emit = defineEmits<{ commit: [value: [number, number]] }>()\n\n const model = defineModel<[number, number]>()\n\n const t = useUiLocale()\n const { labelledBy, invalid, disabled, describedBy } = useFieldControl({\n disabled: () => props.disabled,\n })\n const { dragging, ring, labelOpen, onPointerDown, listeners } = useSliderChrome(\n disabled,\n toRef(props, 'label'),\n )\n\n const values = computed<[number, number]>(() => model.value ?? [props.min, props.max])\n const hasMarkLabels = computed(() => !!props.marks?.some(mark => mark.label))\n\n function fraction(value: number) {\n const span = props.max - props.min\n return span > 0 ? (value - props.min) / span : 0\n }\n\n function text(value: number) {\n return props.format ? props.format(value) : new Intl.NumberFormat(t.value.tag).format(value)\n }\n\n const position = computed(() => ({\n '--hn-slider-p': String(fraction(values.value[0])),\n '--hn-slider-q': String(fraction(values.value[1])),\n }))\n</script>\n\n<template>\n <span\n data-hn-range-slider\n data-hn-state-group\n role=\"group\"\n v-bind=\"$attrs\"\n :aria-labelledby=\"labelledBy\"\n :aria-describedby=\"describedBy\"\n :aria-invalid=\"invalid || undefined\"\n :data-disabled=\"disabled ? '' : undefined\"\n :data-dragging=\"dragging ? '' : undefined\"\n :style=\"position\"\n :class=\"cn(slider({ size: props.size }), props.class)\"\n @pointerdown.capture=\"onPointerDown\"\n v-on=\"listeners\"\n >\n <SliderRoot\n :model-value=\"values\"\n :min=\"props.min\"\n :max=\"props.max\"\n :step=\"props.step\"\n :min-steps-between-thumbs=\"props.minSteps\"\n :disabled=\"disabled\"\n :class=\"sliderRoot()\"\n @update:model-value=\"value => (model = [value![0]!, value![1]!])\"\n @value-commit=\"value => emit('commit', [value[0]!, value[1]!])\"\n >\n <SliderTrack :class=\"sliderTrack()\">\n <span :class=\"sliderRangeBetween()\" />\n </SliderTrack>\n <SliderMarks\n v-if=\"props.marks?.length\"\n :marks=\"props.marks\"\n :min=\"props.min\"\n :max=\"props.max\"\n />\n <SliderHandle\n :aria-label=\"t.slider.minimum\"\n :style=\"{ '--hn-slider-p': String(fraction(values[0])) }\"\n :text=\"text(values[0])\"\n :open=\"labelOpen\"\n :ring=\"ring\"\n :tooltip=\"props.label !== 'none'\"\n />\n <SliderHandle\n :aria-label=\"t.slider.maximum\"\n :style=\"{ '--hn-slider-p': String(fraction(values[1])) }\"\n :text=\"text(values[1])\"\n :open=\"labelOpen\"\n :ring=\"ring\"\n :tooltip=\"props.label !== 'none'\"\n />\n </SliderRoot>\n <SliderMarks\n v-if=\"hasMarkLabels\"\n :marks=\"props.marks!\"\n :min=\"props.min\"\n :max=\"props.max\"\n labels\n />\n </span>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\nimport { button } from '../button/button.variants'\n\nexport const toggle = tv({\n extend: button,\n base: 'aria-pressed:text-accent-text',\n defaultVariants: { variant: 'ghost', tone: 'neutral', size: 'md' },\n})\n\nexport type ToggleVariants = VariantProps<typeof toggle>\n","<script setup lang=\"ts\">\n import { Toggle as ToggleRoot, injectTooltipProviderContext } from 'reka-ui'\n import { computed, useSlots } from 'vue'\n import { cn } from '../../lib/cn'\n import { useFieldControl } from '../form-field/context'\n import { useAccessibleName } from '../../lib/a11y'\n import { Passthrough } from '../../lib/passthrough'\n import { buttonIconBox } from '../button/button.variants'\n import Ripple from '../ripple/Ripple.vue'\n import Tooltip from '../tooltip/Tooltip.vue'\n import { toggle, type ToggleVariants } from './toggle.variants'\n\n defineOptions({ name: 'HnToggle', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n label?: string\n tooltip?: boolean\n side?: 'top' | 'right' | 'bottom' | 'left'\n variant?: Extract<ToggleVariants['variant'], 'ghost' | 'outline'>\n size?: ToggleVariants['size']\n pill?: boolean\n disabled?: boolean\n ripple?: boolean\n class?: string\n }>(),\n { tooltip: true, side: 'top', variant: 'ghost', ripple: true },\n )\n\n const pressed = defineModel<boolean>({ default: false })\n\n const slots = useSlots()\n\n const {\n id: fieldId,\n disabled,\n describedBy,\n } = useFieldControl({\n disabled: () => props.disabled,\n })\n\n defineSlots<{\n default(): unknown\n icon(props: { pressed: boolean }): unknown\n 'pressed-icon'(): unknown\n }>()\n\n useAccessibleName('Toggle', () => !props.label && !slots.default)\n\n const provider = injectTooltipProviderContext(null)\n const Wrapper = provider ? Tooltip : Passthrough\n\n const iconBox = computed(() => buttonIconBox({ size: props.size }))\n const swapped = computed(() => pressed.value && !!slots['pressed-icon'])\n</script>\n\n<template>\n <Wrapper\n :disabled=\"!props.tooltip || !props.label\"\n :content=\"props.label ?? ''\"\n :side=\"props.side\"\n >\n <ToggleRoot\n v-bind=\"$attrs\"\n v-model=\"pressed\"\n :id=\"fieldId\"\n :disabled=\"disabled\"\n :aria-describedby=\"describedBy\"\n :aria-label=\"props.label\"\n data-hn-toggle\n :class=\"\n cn(\n toggle({\n variant: props.variant,\n size: props.size,\n iconOnly: !!props.label,\n pill: props.pill,\n }),\n props.class,\n )\n \"\n >\n <Ripple v-if=\"props.ripple\" :disabled=\"disabled\" />\n <span v-if=\"slots.icon\" :class=\"iconBox\">\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-90 opacity-0\"\n leave-active-class=\"hn-transition absolute\"\n leave-to-class=\"scale-90 opacity-0\"\n >\n <span v-if=\"swapped\" key=\"on\" class=\"inline-flex items-center justify-center\">\n <slot name=\"pressed-icon\" />\n </span>\n <span v-else key=\"off\" class=\"inline-flex items-center justify-center\">\n <slot name=\"icon\" :pressed=\"pressed\" />\n </span>\n </Transition>\n </span>\n <span v-if=\"slots.default\" class=\"inline-flex items-center\"><slot /></span>\n </ToggleRoot>\n </Wrapper>\n</template>\n","<script setup lang=\"ts\">\n import { Toggle as ToggleRoot, injectTooltipProviderContext } from 'reka-ui'\n import { computed, useSlots } from 'vue'\n import { cn } from '../../lib/cn'\n import { useFieldControl } from '../form-field/context'\n import { useAccessibleName } from '../../lib/a11y'\n import { Passthrough } from '../../lib/passthrough'\n import { buttonIconBox } from '../button/button.variants'\n import Ripple from '../ripple/Ripple.vue'\n import Tooltip from '../tooltip/Tooltip.vue'\n import { toggle, type ToggleVariants } from './toggle.variants'\n\n defineOptions({ name: 'HnToggle', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n label?: string\n tooltip?: boolean\n side?: 'top' | 'right' | 'bottom' | 'left'\n variant?: Extract<ToggleVariants['variant'], 'ghost' | 'outline'>\n size?: ToggleVariants['size']\n pill?: boolean\n disabled?: boolean\n ripple?: boolean\n class?: string\n }>(),\n { tooltip: true, side: 'top', variant: 'ghost', ripple: true },\n )\n\n const pressed = defineModel<boolean>({ default: false })\n\n const slots = useSlots()\n\n const {\n id: fieldId,\n disabled,\n describedBy,\n } = useFieldControl({\n disabled: () => props.disabled,\n })\n\n defineSlots<{\n default(): unknown\n icon(props: { pressed: boolean }): unknown\n 'pressed-icon'(): unknown\n }>()\n\n useAccessibleName('Toggle', () => !props.label && !slots.default)\n\n const provider = injectTooltipProviderContext(null)\n const Wrapper = provider ? Tooltip : Passthrough\n\n const iconBox = computed(() => buttonIconBox({ size: props.size }))\n const swapped = computed(() => pressed.value && !!slots['pressed-icon'])\n</script>\n\n<template>\n <Wrapper\n :disabled=\"!props.tooltip || !props.label\"\n :content=\"props.label ?? ''\"\n :side=\"props.side\"\n >\n <ToggleRoot\n v-bind=\"$attrs\"\n v-model=\"pressed\"\n :id=\"fieldId\"\n :disabled=\"disabled\"\n :aria-describedby=\"describedBy\"\n :aria-label=\"props.label\"\n data-hn-toggle\n :class=\"\n cn(\n toggle({\n variant: props.variant,\n size: props.size,\n iconOnly: !!props.label,\n pill: props.pill,\n }),\n props.class,\n )\n \"\n >\n <Ripple v-if=\"props.ripple\" :disabled=\"disabled\" />\n <span v-if=\"slots.icon\" :class=\"iconBox\">\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-90 opacity-0\"\n leave-active-class=\"hn-transition absolute\"\n leave-to-class=\"scale-90 opacity-0\"\n >\n <span v-if=\"swapped\" key=\"on\" class=\"inline-flex items-center justify-center\">\n <slot name=\"pressed-icon\" />\n </span>\n <span v-else key=\"off\" class=\"inline-flex items-center justify-center\">\n <slot name=\"icon\" :pressed=\"pressed\" />\n </span>\n </Transition>\n </span>\n <span v-if=\"slots.default\" class=\"inline-flex items-center\"><slot /></span>\n </ToggleRoot>\n </Wrapper>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const tagsInputHost = tv({\n base: 'relative h-auto min-h-[var(--hn-input-h)] gap-1 ps-[var(--hn-input-px)]',\n variants: {\n size: {\n sm: 'py-[calc((0.25rem-2px)/2)]',\n md: 'py-[calc((var(--hn-control-h-md)-var(--hn-control-h-sm)-2px)/2)]',\n lg: 'py-[calc((var(--hn-control-h-lg)-var(--hn-control-h-sm)-2px)/2)]',\n },\n trailing: {\n true: 'pe-[var(--hn-input-h)]',\n false: 'pe-[var(--hn-input-px)]',\n },\n },\n defaultVariants: { size: 'md', trailing: false },\n})\n\nexport const tagsInputList = tv({\n base: 'flex min-w-0 flex-1 flex-wrap items-center gap-1',\n})\n\nexport const tagsInputRow = tv({\n base: 'h-[var(--hn-control-h-sm)]',\n variants: {\n size: {\n sm: 'h-[calc(var(--hn-control-h-sm)-0.25rem)]',\n md: '',\n lg: '',\n },\n },\n defaultVariants: { size: 'md' },\n})\n\nexport const tagsInputControl = tv({\n extend: tagsInputRow,\n base: [\n 'min-w-20 flex-1 bg-transparent text-inherit outline-none [font:inherit]',\n 'placeholder:text-faint placeholder:font-normal disabled:cursor-not-allowed',\n ],\n})\n\nexport const tagsInputChip = tv({\n base: 'max-w-full min-w-0 shrink data-disabled:opacity-100',\n})\n\nexport type TagsInputVariants = VariantProps<typeof tagsInputHost>\n","<script setup lang=\"ts\">\n import { TagsInputItemText } from 'reka-ui'\n import Chip from '../chip/Chip.vue'\n import type { ChipVariants } from '../chip/chip.variants'\n import { tagsInputChip } from './tags-input.variants'\n\n defineOptions({ name: 'HnTagsInputChip', inheritAttrs: false })\n\n const props = defineProps<{ tag: string; size: ChipVariants['size']; disabled?: boolean }>()\n\n const emit = defineEmits<{ remove: [] }>()\n</script>\n\n<template>\n <Chip\n v-bind=\"$attrs\"\n :size=\"props.size\"\n removable\n :disabled=\"props.disabled\"\n :class=\"tagsInputChip()\"\n :data-state=\"undefined\"\n :aria-current=\"undefined\"\n @remove=\"emit('remove')\"\n >\n <TagsInputItemText as-child>\n <span class=\"min-w-0 truncate\">{{ props.tag }}</span>\n </TagsInputItemText>\n </Chip>\n</template>\n","<script setup lang=\"ts\">\n import { TagsInputItemText } from 'reka-ui'\n import Chip from '../chip/Chip.vue'\n import type { ChipVariants } from '../chip/chip.variants'\n import { tagsInputChip } from './tags-input.variants'\n\n defineOptions({ name: 'HnTagsInputChip', inheritAttrs: false })\n\n const props = defineProps<{ tag: string; size: ChipVariants['size']; disabled?: boolean }>()\n\n const emit = defineEmits<{ remove: [] }>()\n</script>\n\n<template>\n <Chip\n v-bind=\"$attrs\"\n :size=\"props.size\"\n removable\n :disabled=\"props.disabled\"\n :class=\"tagsInputChip()\"\n :data-state=\"undefined\"\n :aria-current=\"undefined\"\n @remove=\"emit('remove')\"\n >\n <TagsInputItemText as-child>\n <span class=\"min-w-0 truncate\">{{ props.tag }}</span>\n </TagsInputItemText>\n </Chip>\n</template>\n","<script setup lang=\"ts\">\n import { TagsInputInput, TagsInputItem, TagsInputRoot } from 'reka-ui'\n import { computed } from 'vue'\n import { cn } from '../../lib/cn'\n import { useFieldControl } from '../form-field/context'\n import { focusFieldFrom } from '../../lib/field-focus'\n import { useUiLocale } from '../../locale'\n import { X } from '@lucide/vue'\n import InputAction from '../input/InputAction.vue'\n import { inputActionSlot, inputHost, type InputVariants } from '../input/input.variants'\n import TagsInputChip from './TagsInputChip.vue'\n import { tagsInputControl, tagsInputHost, tagsInputList } from './tags-input.variants'\n\n defineOptions({ name: 'HnTagsInput', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n placeholder?: string\n max?: number\n duplicate?: boolean\n delimiter?: string | RegExp\n addOnPaste?: boolean\n addOnBlur?: boolean\n clearable?: boolean\n name?: string\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>(),\n { max: 0, delimiter: ',', addOnPaste: true, addOnBlur: false, clearable: false },\n )\n\n const emit = defineEmits<{ invalid: [value: string]; clear: [] }>()\n\n const model = defineModel<string[]>({ default: () => [] })\n\n const t = useUiLocale()\n\n const {\n id: fieldId,\n invalid,\n disabled,\n describedBy,\n } = useFieldControl({\n invalid: () => props.invalid,\n disabled: () => props.disabled,\n })\n\n const chipSize = computed(() => (props.size === 'sm' ? 'sm' : 'md'))\n const clearing = computed(() => props.clearable && model.value.length > 0 && !disabled.value)\n\n function remove(tag: string) {\n if (disabled.value) return\n model.value = model.value.filter(item => item !== tag)\n }\n\n function clear() {\n if (!model.value.length) return\n model.value = []\n emit('clear')\n }\n\n function onInputKeydown(event: KeyboardEvent) {\n if (event.isComposing || (event.target as HTMLInputElement).value !== '') return\n if (event.key === 'Backspace') {\n event.preventDefault()\n event.stopImmediatePropagation()\n if (model.value.length) model.value = model.value.slice(0, -1)\n } else if (event.key === 'Delete' || event.key === 'ArrowLeft' || event.key === 'ArrowRight') {\n event.stopImmediatePropagation()\n }\n }\n</script>\n\n<template>\n <div\n data-hn-tags-input\n :data-invalid=\"invalid ? '' : undefined\"\n @click=\"focusFieldFrom($event.currentTarget as HTMLElement, $event.target as HTMLElement)\"\n :class=\"\n cn(\n inputHost({ variant: props.variant, size: props.size }),\n tagsInputHost({ size: props.size, trailing: clearing }),\n props.class,\n )\n \"\n >\n <TagsInputRoot\n v-model=\"model\"\n :max=\"props.max\"\n :duplicate=\"props.duplicate\"\n :delimiter=\"props.delimiter\"\n :add-on-paste=\"props.addOnPaste\"\n :add-on-blur=\"props.addOnBlur\"\n :name=\"props.name\"\n :disabled=\"disabled\"\n :class=\"tagsInputList()\"\n @invalid=\"value => emit('invalid', String(value))\"\n >\n <TagsInputItem v-for=\"tag in model\" :key=\"tag\" :value=\"tag\" as-child>\n <TagsInputChip :tag=\"tag\" :size=\"chipSize\" :disabled=\"disabled\" @remove=\"remove(tag)\" />\n </TagsInputItem>\n <TagsInputInput\n v-bind=\"$attrs\"\n @keydown.capture=\"onInputKeydown\"\n :id=\"fieldId\"\n :placeholder=\"props.placeholder\"\n :aria-invalid=\"invalid || undefined\"\n :aria-describedby=\"describedBy\"\n :class=\"tagsInputControl({ size: props.size })\"\n />\n </TagsInputRoot>\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-90 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-90 opacity-0\"\n >\n <span\n v-if=\"clearing\"\n data-hn-tags-input-clear\n :class=\"cn(inputActionSlot(), 'absolute inset-y-0 end-0')\"\n >\n <InputAction :label=\"t.common.clear\" @click.stop=\"clear\">\n <X />\n </InputAction>\n </span>\n </Transition>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { TagsInputInput, TagsInputItem, TagsInputRoot } from 'reka-ui'\n import { computed } from 'vue'\n import { cn } from '../../lib/cn'\n import { useFieldControl } from '../form-field/context'\n import { focusFieldFrom } from '../../lib/field-focus'\n import { useUiLocale } from '../../locale'\n import { X } from '@lucide/vue'\n import InputAction from '../input/InputAction.vue'\n import { inputActionSlot, inputHost, type InputVariants } from '../input/input.variants'\n import TagsInputChip from './TagsInputChip.vue'\n import { tagsInputControl, tagsInputHost, tagsInputList } from './tags-input.variants'\n\n defineOptions({ name: 'HnTagsInput', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n placeholder?: string\n max?: number\n duplicate?: boolean\n delimiter?: string | RegExp\n addOnPaste?: boolean\n addOnBlur?: boolean\n clearable?: boolean\n name?: string\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>(),\n { max: 0, delimiter: ',', addOnPaste: true, addOnBlur: false, clearable: false },\n )\n\n const emit = defineEmits<{ invalid: [value: string]; clear: [] }>()\n\n const model = defineModel<string[]>({ default: () => [] })\n\n const t = useUiLocale()\n\n const {\n id: fieldId,\n invalid,\n disabled,\n describedBy,\n } = useFieldControl({\n invalid: () => props.invalid,\n disabled: () => props.disabled,\n })\n\n const chipSize = computed(() => (props.size === 'sm' ? 'sm' : 'md'))\n const clearing = computed(() => props.clearable && model.value.length > 0 && !disabled.value)\n\n function remove(tag: string) {\n if (disabled.value) return\n model.value = model.value.filter(item => item !== tag)\n }\n\n function clear() {\n if (!model.value.length) return\n model.value = []\n emit('clear')\n }\n\n function onInputKeydown(event: KeyboardEvent) {\n if (event.isComposing || (event.target as HTMLInputElement).value !== '') return\n if (event.key === 'Backspace') {\n event.preventDefault()\n event.stopImmediatePropagation()\n if (model.value.length) model.value = model.value.slice(0, -1)\n } else if (event.key === 'Delete' || event.key === 'ArrowLeft' || event.key === 'ArrowRight') {\n event.stopImmediatePropagation()\n }\n }\n</script>\n\n<template>\n <div\n data-hn-tags-input\n :data-invalid=\"invalid ? '' : undefined\"\n @click=\"focusFieldFrom($event.currentTarget as HTMLElement, $event.target as HTMLElement)\"\n :class=\"\n cn(\n inputHost({ variant: props.variant, size: props.size }),\n tagsInputHost({ size: props.size, trailing: clearing }),\n props.class,\n )\n \"\n >\n <TagsInputRoot\n v-model=\"model\"\n :max=\"props.max\"\n :duplicate=\"props.duplicate\"\n :delimiter=\"props.delimiter\"\n :add-on-paste=\"props.addOnPaste\"\n :add-on-blur=\"props.addOnBlur\"\n :name=\"props.name\"\n :disabled=\"disabled\"\n :class=\"tagsInputList()\"\n @invalid=\"value => emit('invalid', String(value))\"\n >\n <TagsInputItem v-for=\"tag in model\" :key=\"tag\" :value=\"tag\" as-child>\n <TagsInputChip :tag=\"tag\" :size=\"chipSize\" :disabled=\"disabled\" @remove=\"remove(tag)\" />\n </TagsInputItem>\n <TagsInputInput\n v-bind=\"$attrs\"\n @keydown.capture=\"onInputKeydown\"\n :id=\"fieldId\"\n :placeholder=\"props.placeholder\"\n :aria-invalid=\"invalid || undefined\"\n :aria-describedby=\"describedBy\"\n :class=\"tagsInputControl({ size: props.size })\"\n />\n </TagsInputRoot>\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-90 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-90 opacity-0\"\n >\n <span\n v-if=\"clearing\"\n data-hn-tags-input-clear\n :class=\"cn(inputActionSlot(), 'absolute inset-y-0 end-0')\"\n >\n <InputAction :label=\"t.common.clear\" @click.stop=\"clear\">\n <X />\n </InputAction>\n </span>\n </Transition>\n </div>\n</template>\n","import { tv } from '../../lib/tv'\n\nexport const multiComboboxHost = tv({\n base: '',\n variants: {\n clearing: {\n true: 'pe-[calc(2*var(--hn-input-h))]',\n },\n },\n})\n\nexport const multiComboboxEnd = tv({\n base: 'absolute inset-y-0 end-0 flex items-stretch',\n})\n","<script setup lang=\"ts\">\n import { computed, reactive, ref, shallowRef, watch } from 'vue'\n import { ComboboxAnchor, ComboboxInput, ComboboxRoot, ComboboxTrigger } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { useFieldControl } from '../form-field/context'\n import { focusFieldFrom } from '../../lib/field-focus'\n import { useUiLocale } from '../../locale'\n import { buttonIconBox } from '../button/button.variants'\n import IconSlot from '../button/IconSlot.vue'\n import Chip from '../chip/Chip.vue'\n import { X } from '@lucide/vue'\n import InputAction from '../input/InputAction.vue'\n import ComboboxList from '../combobox/ComboboxList.vue'\n import DisclosureIcon from '../disclosure-icon/DisclosureIcon.vue'\n import {\n inputActionSlot,\n inputAdornment,\n inputHost,\n inputIndicator,\n type InputVariants,\n } from '../input/input.variants'\n import { flattenOptions, type SelectItems, type SelectOption } from '../select/types'\n import {\n tagsInputChip,\n tagsInputControl,\n tagsInputHost,\n tagsInputList,\n } from '../tags-input/tags-input.variants'\n import { multiComboboxEnd, multiComboboxHost } from './multi-combobox.variants'\n\n defineOptions({ name: 'HnMultiCombobox', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n options: SelectItems\n placeholder?: string\n ignoreFilter?: boolean\n loading?: boolean\n clearable?: boolean\n name?: string\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>(),\n { clearable: false },\n )\n const emit = defineEmits<{ clear: [] }>()\n\n const model = defineModel<Array<string | number>>({ default: () => [] })\n const search = defineModel<string>('search', { default: '' })\n const open = defineModel<boolean>('open', { default: false })\n\n defineSlots<{ option(props: { option: SelectOption }): unknown }>()\n\n const t = useUiLocale()\n const keyboard = ref(false)\n const input = shallowRef<{ $el: HTMLInputElement } | null>(null)\n\n const {\n id: fieldId,\n invalid,\n disabled,\n describedBy,\n } = useFieldControl({\n invalid: () => props.invalid,\n disabled: () => props.disabled,\n })\n\n const labels = reactive(new Map<string | number, string>())\n watch(\n () => props.options,\n options => {\n for (const option of flattenOptions(options)) labels.set(option.value, option.label)\n },\n { immediate: true, deep: true },\n )\n\n const selected = computed(() =>\n model.value.map(value => ({ value, label: labels.get(value) ?? String(value) })),\n )\n const chipSize = computed(() => (props.size === 'sm' ? 'sm' : 'md'))\n const clearing = computed(() => props.clearable && selected.value.length > 0 && !disabled.value)\n\n watch(open, value => {\n if (!value) keyboard.value = false\n })\n\n function remove(value: string | number) {\n if (disabled.value) return\n model.value = model.value.filter(item => item !== value)\n }\n\n function clear() {\n if (!model.value.length) return\n model.value = []\n emit('clear')\n input.value?.$el.focus()\n }\n\n function onHostClick(event: MouseEvent) {\n const focused = focusFieldFrom(event.currentTarget as HTMLElement, event.target as HTMLElement)\n if (focused && !open.value) open.value = true\n }\n\n function onInputKeydown(event: KeyboardEvent) {\n keyboard.value = true\n if (\n event.key !== 'Backspace' ||\n (event.target as HTMLInputElement).value !== '' ||\n !model.value.length\n )\n return\n model.value = model.value.slice(0, -1)\n }\n</script>\n\n<template>\n <ComboboxRoot\n v-model=\"model\"\n v-model:open=\"open\"\n :disabled=\"disabled\"\n :ignore-filter=\"props.ignoreFilter\"\n :name=\"props.name\"\n multiple\n open-on-click\n >\n <ComboboxAnchor as-child>\n <div\n data-hn-multi-combobox\n :data-invalid=\"invalid ? '' : undefined\"\n :aria-busy=\"props.loading || undefined\"\n :class=\"\n cn(\n inputHost({ variant: props.variant, size: props.size }),\n tagsInputHost({ size: props.size, trailing: true }),\n multiComboboxHost({ clearing }),\n props.class,\n )\n \"\n @click=\"onHostClick\"\n >\n <div :class=\"tagsInputList()\">\n <Chip\n v-for=\"option in selected\"\n :key=\"option.value\"\n :size=\"chipSize\"\n removable\n :disabled=\"disabled\"\n :class=\"tagsInputChip()\"\n @remove=\"remove(option.value)\"\n >\n <span class=\"min-w-0 truncate\">{{ option.label }}</span>\n </Chip>\n <ComboboxInput\n ref=\"input\"\n v-bind=\"$attrs\"\n v-model=\"search\"\n :placeholder=\"\n selected.length ? undefined : (props.placeholder ?? t.combobox.placeholder)\n \"\n :disabled=\"disabled\"\n :id=\"fieldId\"\n :aria-invalid=\"invalid || undefined\"\n :aria-describedby=\"describedBy\"\n :class=\"tagsInputControl({ size: props.size })\"\n @keydown=\"onInputKeydown\"\n />\n </div>\n <span :class=\"multiComboboxEnd()\">\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-90 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-90 opacity-0\"\n >\n <span v-if=\"clearing\" data-hn-multi-combobox-clear :class=\"inputActionSlot()\">\n <InputAction :label=\"t.common.clear\" @click=\"clear\">\n <X />\n </InputAction>\n </span>\n </Transition>\n <ComboboxTrigger\n :aria-label=\"t.combobox.toggle\"\n :disabled=\"disabled\"\n :class=\"cn(inputAdornment(), inputIndicator())\"\n @mousedown.prevent\n >\n <IconSlot\n :box-class=\"buttonIconBox({ size: props.size })\"\n :swapped=\"!!props.loading\"\n spinner-size=\"sm\"\n >\n <DisclosureIcon :open=\"open\" />\n </IconSlot>\n </ComboboxTrigger>\n </span>\n </div>\n </ComboboxAnchor>\n <ComboboxList :options=\"props.options\" :keyboard=\"keyboard\">\n <template #option=\"slotProps\">\n <slot name=\"option\" v-bind=\"slotProps\" />\n </template>\n </ComboboxList>\n </ComboboxRoot>\n</template>\n","<script setup lang=\"ts\">\n import { computed, reactive, ref, shallowRef, watch } from 'vue'\n import { ComboboxAnchor, ComboboxInput, ComboboxRoot, ComboboxTrigger } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { useFieldControl } from '../form-field/context'\n import { focusFieldFrom } from '../../lib/field-focus'\n import { useUiLocale } from '../../locale'\n import { buttonIconBox } from '../button/button.variants'\n import IconSlot from '../button/IconSlot.vue'\n import Chip from '../chip/Chip.vue'\n import { X } from '@lucide/vue'\n import InputAction from '../input/InputAction.vue'\n import ComboboxList from '../combobox/ComboboxList.vue'\n import DisclosureIcon from '../disclosure-icon/DisclosureIcon.vue'\n import {\n inputActionSlot,\n inputAdornment,\n inputHost,\n inputIndicator,\n type InputVariants,\n } from '../input/input.variants'\n import { flattenOptions, type SelectItems, type SelectOption } from '../select/types'\n import {\n tagsInputChip,\n tagsInputControl,\n tagsInputHost,\n tagsInputList,\n } from '../tags-input/tags-input.variants'\n import { multiComboboxEnd, multiComboboxHost } from './multi-combobox.variants'\n\n defineOptions({ name: 'HnMultiCombobox', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n options: SelectItems\n placeholder?: string\n ignoreFilter?: boolean\n loading?: boolean\n clearable?: boolean\n name?: string\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>(),\n { clearable: false },\n )\n const emit = defineEmits<{ clear: [] }>()\n\n const model = defineModel<Array<string | number>>({ default: () => [] })\n const search = defineModel<string>('search', { default: '' })\n const open = defineModel<boolean>('open', { default: false })\n\n defineSlots<{ option(props: { option: SelectOption }): unknown }>()\n\n const t = useUiLocale()\n const keyboard = ref(false)\n const input = shallowRef<{ $el: HTMLInputElement } | null>(null)\n\n const {\n id: fieldId,\n invalid,\n disabled,\n describedBy,\n } = useFieldControl({\n invalid: () => props.invalid,\n disabled: () => props.disabled,\n })\n\n const labels = reactive(new Map<string | number, string>())\n watch(\n () => props.options,\n options => {\n for (const option of flattenOptions(options)) labels.set(option.value, option.label)\n },\n { immediate: true, deep: true },\n )\n\n const selected = computed(() =>\n model.value.map(value => ({ value, label: labels.get(value) ?? String(value) })),\n )\n const chipSize = computed(() => (props.size === 'sm' ? 'sm' : 'md'))\n const clearing = computed(() => props.clearable && selected.value.length > 0 && !disabled.value)\n\n watch(open, value => {\n if (!value) keyboard.value = false\n })\n\n function remove(value: string | number) {\n if (disabled.value) return\n model.value = model.value.filter(item => item !== value)\n }\n\n function clear() {\n if (!model.value.length) return\n model.value = []\n emit('clear')\n input.value?.$el.focus()\n }\n\n function onHostClick(event: MouseEvent) {\n const focused = focusFieldFrom(event.currentTarget as HTMLElement, event.target as HTMLElement)\n if (focused && !open.value) open.value = true\n }\n\n function onInputKeydown(event: KeyboardEvent) {\n keyboard.value = true\n if (\n event.key !== 'Backspace' ||\n (event.target as HTMLInputElement).value !== '' ||\n !model.value.length\n )\n return\n model.value = model.value.slice(0, -1)\n }\n</script>\n\n<template>\n <ComboboxRoot\n v-model=\"model\"\n v-model:open=\"open\"\n :disabled=\"disabled\"\n :ignore-filter=\"props.ignoreFilter\"\n :name=\"props.name\"\n multiple\n open-on-click\n >\n <ComboboxAnchor as-child>\n <div\n data-hn-multi-combobox\n :data-invalid=\"invalid ? '' : undefined\"\n :aria-busy=\"props.loading || undefined\"\n :class=\"\n cn(\n inputHost({ variant: props.variant, size: props.size }),\n tagsInputHost({ size: props.size, trailing: true }),\n multiComboboxHost({ clearing }),\n props.class,\n )\n \"\n @click=\"onHostClick\"\n >\n <div :class=\"tagsInputList()\">\n <Chip\n v-for=\"option in selected\"\n :key=\"option.value\"\n :size=\"chipSize\"\n removable\n :disabled=\"disabled\"\n :class=\"tagsInputChip()\"\n @remove=\"remove(option.value)\"\n >\n <span class=\"min-w-0 truncate\">{{ option.label }}</span>\n </Chip>\n <ComboboxInput\n ref=\"input\"\n v-bind=\"$attrs\"\n v-model=\"search\"\n :placeholder=\"\n selected.length ? undefined : (props.placeholder ?? t.combobox.placeholder)\n \"\n :disabled=\"disabled\"\n :id=\"fieldId\"\n :aria-invalid=\"invalid || undefined\"\n :aria-describedby=\"describedBy\"\n :class=\"tagsInputControl({ size: props.size })\"\n @keydown=\"onInputKeydown\"\n />\n </div>\n <span :class=\"multiComboboxEnd()\">\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-90 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-90 opacity-0\"\n >\n <span v-if=\"clearing\" data-hn-multi-combobox-clear :class=\"inputActionSlot()\">\n <InputAction :label=\"t.common.clear\" @click=\"clear\">\n <X />\n </InputAction>\n </span>\n </Transition>\n <ComboboxTrigger\n :aria-label=\"t.combobox.toggle\"\n :disabled=\"disabled\"\n :class=\"cn(inputAdornment(), inputIndicator())\"\n @mousedown.prevent\n >\n <IconSlot\n :box-class=\"buttonIconBox({ size: props.size })\"\n :swapped=\"!!props.loading\"\n spinner-size=\"sm\"\n >\n <DisclosureIcon :open=\"open\" />\n </IconSlot>\n </ComboboxTrigger>\n </span>\n </div>\n </ComboboxAnchor>\n <ComboboxList :options=\"props.options\" :keyboard=\"keyboard\">\n <template #option=\"slotProps\">\n <slot name=\"option\" v-bind=\"slotProps\" />\n </template>\n </ComboboxList>\n </ComboboxRoot>\n</template>\n","import {\n CalendarDate,\n CalendarDateTime,\n Time,\n parseDate,\n parseDateTime,\n parseTime,\n type DateValue,\n} from '@internationalized/date'\n\nexport type DateGranularity = 'day' | 'hour' | 'minute' | 'second'\nexport type TimeGranularity = 'hour' | 'minute' | 'second'\n\nconst TIME_LENGTH: Record<TimeGranularity, number> = {\n hour: 'HH:mm'.length,\n minute: 'HH:mm'.length,\n second: 'HH:mm:ss'.length,\n}\n\nexport function parseTimeValue(value: string | null | undefined): Time | undefined {\n if (!value) return undefined\n try {\n return parseTime(value)\n } catch {\n return undefined\n }\n}\n\nexport function formatTimeValue(\n value: { hour: number; minute: number; second: number },\n granularity: TimeGranularity = 'minute',\n): string {\n return new Time(value.hour, value.minute, value.second)\n .toString()\n .slice(0, TIME_LENGTH[granularity])\n}\n\nexport function splitDateTime(value: string | null | undefined) {\n if (!value) return { date: null, time: null }\n const [date, time] = value.split('T')\n return { date: date || null, time: time || null }\n}\n\nexport function joinDateTime(date: string | null, time: string | null) {\n return date && time ? `${date}T${time}` : null\n}\n\nexport interface DateRangeValue {\n start: string | null\n end: string | null\n}\n\ninterface DateRangeParts {\n start: DateValue | undefined\n end: DateValue | undefined\n}\n\nconst LENGTH: Record<DateGranularity, number> = {\n day: 'YYYY-MM-DD'.length,\n hour: 'YYYY-MM-DDTHH:mm'.length,\n minute: 'YYYY-MM-DDTHH:mm'.length,\n second: 'YYYY-MM-DDTHH:mm:ss'.length,\n}\n\nexport function parseDateValue(\n value: string | null | undefined,\n granularity: DateGranularity = 'day',\n): DateValue | undefined {\n if (!value) return undefined\n try {\n if (granularity === 'day') return parseDate(value.slice(0, LENGTH.day))\n return value.includes('T')\n ? parseDateTime(value)\n : parseDate(value).toDate('UTC')\n ? toDateTime(parseDate(value))\n : undefined\n } catch {\n return undefined\n }\n}\n\nexport function formatDateValue(value: DateValue, granularity: DateGranularity = 'day'): string {\n if (granularity === 'day') return new CalendarDate(value.year, value.month, value.day).toString()\n const time = value instanceof CalendarDateTime ? value : toDateTime(value)\n return time.toString().slice(0, LENGTH[granularity])\n}\n\nexport function parseDateRange(\n value: DateRangeValue | null | undefined,\n granularity: DateGranularity = 'day',\n): DateRangeParts {\n return {\n start: parseDateValue(value?.start, granularity),\n end: parseDateValue(value?.end, granularity),\n }\n}\n\nexport function formatDateRange(\n value: DateRangeParts,\n granularity: DateGranularity = 'day',\n): DateRangeValue | null {\n if (!value.start && !value.end) return null\n return {\n start: value.start ? formatDateValue(value.start, granularity) : null,\n end: value.end ? formatDateValue(value.end, granularity) : null,\n }\n}\n\nfunction toDateTime(value: DateValue) {\n return new CalendarDateTime(value.year, value.month, value.day)\n}\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const calendarRoot = tv({\n base: 'text-fg inline-flex flex-col select-none [--hn-calendar-row-gap:--spacing(0.5)] data-disabled:pointer-events-none data-disabled:opacity-50',\n variants: {\n size: {\n sm: 'text-sm [--hn-calendar-cell:var(--hn-control-h-sm)]',\n md: 'text-base [--hn-calendar-cell:var(--hn-control-h-md)]',\n lg: 'text-md [--hn-calendar-cell:var(--hn-control-h-lg)]',\n },\n },\n defaultVariants: { size: 'md' },\n})\n\nexport const calendarPicker = tv({\n base: 'flex w-[calc(7*var(--hn-calendar-cell))] flex-col gap-2 outline-none',\n})\n\nexport const calendarHeader = tv({\n base: 'flex items-center justify-between gap-2',\n})\n\nexport const calendarHeading = tv({\n base: 'min-w-0 flex-1 justify-center font-medium whitespace-nowrap tabular-nums',\n variants: {\n still: {\n true: 'inline-flex h-[var(--hn-calendar-cell)] items-center px-[var(--hn-control-px-sm)]',\n },\n },\n})\n\nexport const calendarGrid = tv({\n base: 'w-full border-separate [border-spacing:0_var(--hn-calendar-row-gap)]',\n variants: {\n units: {\n true: 'table-fixed border-spacing-0',\n },\n },\n})\n\nexport const calendarUnits = tv({\n base: 'flex h-[calc(7*var(--hn-calendar-cell)+8*var(--hn-calendar-row-gap))] flex-col justify-center',\n})\n\nexport const calendarHeadCell = tv({\n base: 'text-muted size-[var(--hn-calendar-cell)] p-0 text-center align-middle font-normal',\n variants: {\n size: {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-sm',\n },\n },\n defaultVariants: { size: 'md' },\n})\n\nexport const calendarCell = tv({\n base: 'p-0 text-center align-middle',\n})\n\nexport const calendarDay = tv({\n base: [\n 'hn-interactive hn-state-layer relative inline-flex size-[var(--hn-calendar-cell)] items-center justify-center rounded-md tabular-nums',\n 'data-[outside-view]:text-faint data-[today]:not-[[data-selected]]:text-accent-text data-[today]:not-[[data-selected]]:font-semibold',\n 'data-[selected]:bg-accent data-[selected]:text-accent-on data-[selected]:font-medium',\n 'data-disabled:text-faint data-disabled:pointer-events-none data-[unavailable]:text-faint data-[unavailable]:line-through data-[unavailable]:pointer-events-none',\n ],\n})\n\nexport const calendarUnitCell = tv({\n base: 'p-1 align-middle',\n})\n\nexport const calendarUnit = tv({\n base: [\n 'hn-interactive hn-state-layer relative flex h-[var(--hn-calendar-cell)] w-full items-center justify-center rounded-md whitespace-nowrap tabular-nums',\n 'data-[today]:not-[[data-selected]]:text-accent-text data-[today]:not-[[data-selected]]:font-semibold',\n 'data-[selected]:bg-accent data-[selected]:text-accent-on data-[selected]:font-medium',\n 'data-disabled:text-faint data-disabled:pointer-events-none data-[unavailable]:text-faint data-[unavailable]:pointer-events-none',\n ],\n})\n\nexport type CalendarVariants = VariantProps<typeof calendarRoot>\n","<script setup lang=\"ts\">\n import type { Component } from 'vue'\n import { ChevronLeft, ChevronRight } from '@lucide/vue'\n import Button from '../button/Button.vue'\n import IconButton from '../icon-button/IconButton.vue'\n import { calendarHeader, calendarHeading, type CalendarVariants } from './calendar.variants'\n\n defineOptions({ name: 'HnCalendarHeader' })\n\n const props = defineProps<{\n prev: Component\n next: Component\n prevLabel: string\n nextLabel: string\n heading: string\n pickLabel?: string\n size?: CalendarVariants['size']\n disabled?: boolean\n }>()\n const emit = defineEmits<{ pick: [] }>()\n</script>\n\n<template>\n <div :class=\"calendarHeader()\">\n <component :is=\"props.prev\" as-child>\n <IconButton :label=\"props.prevLabel\" :size=\"props.size\">\n <ChevronLeft />\n </IconButton>\n </component>\n <Button\n v-if=\"props.pickLabel\"\n variant=\"ghost\"\n tone=\"neutral\"\n :size=\"props.size\"\n :class=\"calendarHeading()\"\n :aria-label=\"props.pickLabel\"\n :disabled=\"props.disabled\"\n @click=\"emit('pick')\"\n >\n {{ props.heading }}\n </Button>\n <span v-else :class=\"calendarHeading({ still: true })\">\n {{ props.heading }}\n </span>\n <component :is=\"props.next\" as-child>\n <IconButton :label=\"props.nextLabel\" :size=\"props.size\">\n <ChevronRight />\n </IconButton>\n </component>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import type { Component } from 'vue'\n import { ChevronLeft, ChevronRight } from '@lucide/vue'\n import Button from '../button/Button.vue'\n import IconButton from '../icon-button/IconButton.vue'\n import { calendarHeader, calendarHeading, type CalendarVariants } from './calendar.variants'\n\n defineOptions({ name: 'HnCalendarHeader' })\n\n const props = defineProps<{\n prev: Component\n next: Component\n prevLabel: string\n nextLabel: string\n heading: string\n pickLabel?: string\n size?: CalendarVariants['size']\n disabled?: boolean\n }>()\n const emit = defineEmits<{ pick: [] }>()\n</script>\n\n<template>\n <div :class=\"calendarHeader()\">\n <component :is=\"props.prev\" as-child>\n <IconButton :label=\"props.prevLabel\" :size=\"props.size\">\n <ChevronLeft />\n </IconButton>\n </component>\n <Button\n v-if=\"props.pickLabel\"\n variant=\"ghost\"\n tone=\"neutral\"\n :size=\"props.size\"\n :class=\"calendarHeading()\"\n :aria-label=\"props.pickLabel\"\n :disabled=\"props.disabled\"\n @click=\"emit('pick')\"\n >\n {{ props.heading }}\n </Button>\n <span v-else :class=\"calendarHeading({ still: true })\">\n {{ props.heading }}\n </span>\n <component :is=\"props.next\" as-child>\n <IconButton :label=\"props.nextLabel\" :size=\"props.size\">\n <ChevronRight />\n </IconButton>\n </component>\n </div>\n</template>\n","import { getLocalTimeZone, type DateValue } from '@internationalized/date'\n\nconst local = (date: DateValue) => date.toDate(getLocalTimeZone())\n\nexport function formatMonthHeading(tag: string, date: DateValue) {\n return new Intl.DateTimeFormat(tag, { year: 'numeric', month: 'long' }).format(local(date))\n}\n\nexport function formatYearHeading(tag: string, date: DateValue) {\n return new Intl.DateTimeFormat(tag, { year: 'numeric' }).format(local(date))\n}\n\nexport function formatMonthName(tag: string, date: DateValue) {\n return new Intl.DateTimeFormat(tag, { month: 'short' }).format(local(date))\n}\n\nexport function formatDigits(tag: string, value: number) {\n return new Intl.NumberFormat(tag, { useGrouping: false }).format(value)\n}\n\nexport function formatYearsHeading(tag: string, cells: DateValue[]) {\n return `${formatDigits(tag, cells[0]!.year)} – ${formatDigits(tag, cells.at(-1)!.year)}`\n}\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import {\n MonthPickerCell,\n MonthPickerCellTrigger,\n MonthPickerGrid,\n MonthPickerGridBody,\n MonthPickerGridRow,\n MonthPickerNext,\n MonthPickerPrev,\n MonthPickerRoot,\n YearPickerCell,\n YearPickerCellTrigger,\n YearPickerGrid,\n YearPickerGridBody,\n YearPickerGridRow,\n YearPickerNext,\n YearPickerPrev,\n YearPickerRoot,\n } from 'reka-ui'\n import type { DateValue } from '@internationalized/date'\n import { useUiLocale } from '../../locale'\n import CalendarHeader from './CalendarHeader.vue'\n import type { CalendarLevel } from './composables/useCalendarLevels'\n import {\n formatDigits,\n formatMonthName,\n formatYearHeading,\n formatYearsHeading,\n } from './utils/format'\n import {\n calendarGrid,\n calendarPicker,\n calendarUnit,\n calendarUnitCell,\n calendarUnits,\n type CalendarVariants,\n } from './calendar.variants'\n\n defineOptions({ name: 'HnCalendarLevels' })\n\n type Picked = DateValue | DateValue[] | undefined\n\n const props = defineProps<{\n view: DateValue\n size?: CalendarVariants['size']\n minValue?: DateValue\n maxValue?: DateValue\n disabled?: boolean\n }>()\n const emit = defineEmits<{\n pickMonth: [value: Picked]\n pickYear: [value: Picked]\n followYear: [date: DateValue]\n back: []\n entered: []\n }>()\n\n const level = defineModel<CalendarLevel>('level', { required: true })\n\n const t = useUiLocale()\n const yearHeading = computed(() => formatYearHeading(t.value.tag, props.view))\n</script>\n\n<template>\n <Transition\n mode=\"out-in\"\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-90 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-90 opacity-0\"\n @after-enter=\"emit('entered')\"\n >\n <div v-if=\"level === 'day'\" key=\"day\" :class=\"calendarPicker()\">\n <slot />\n </div>\n\n <MonthPickerRoot\n v-else-if=\"level === 'month'\"\n key=\"month\"\n v-slot=\"{ grid: months }\"\n :placeholder=\"props.view\"\n :model-value=\"props.view\"\n :min-value=\"props.minValue\"\n :max-value=\"props.maxValue\"\n :locale=\"t.tag\"\n :calendar-label=\"t.calendar.label\"\n :disabled=\"props.disabled\"\n prevent-deselect\n initial-focus\n :class=\"calendarPicker()\"\n @update:model-value=\"emit('pickMonth', $event)\"\n @update:placeholder=\"emit('followYear', $event)\"\n @keydown.esc.stop.prevent=\"emit('back')\"\n >\n <CalendarHeader\n :prev=\"MonthPickerPrev\"\n :next=\"MonthPickerNext\"\n :prev-label=\"t.calendar.prevYear\"\n :next-label=\"t.calendar.nextYear\"\n :heading=\"yearHeading\"\n :pick-label=\"t.calendar.pickYear\"\n :size=\"props.size\"\n :disabled=\"props.disabled\"\n @pick=\"level = 'year'\"\n />\n <div :class=\"calendarUnits()\">\n <MonthPickerGrid :class=\"calendarGrid({ units: true })\">\n <MonthPickerGridBody>\n <MonthPickerGridRow v-for=\"(row, index) in months.rows\" :key=\"index\">\n <MonthPickerCell\n v-for=\"month in row\"\n :key=\"month.toString()\"\n :date=\"month\"\n :class=\"calendarUnitCell()\"\n >\n <MonthPickerCellTrigger :month=\"month\" :class=\"calendarUnit()\">\n {{ formatMonthName(t.tag, month) }}\n </MonthPickerCellTrigger>\n </MonthPickerCell>\n </MonthPickerGridRow>\n </MonthPickerGridBody>\n </MonthPickerGrid>\n </div>\n </MonthPickerRoot>\n\n <YearPickerRoot\n v-else\n key=\"year\"\n v-slot=\"{ grid: years }\"\n :placeholder=\"props.view\"\n :model-value=\"props.view\"\n :min-value=\"props.minValue\"\n :max-value=\"props.maxValue\"\n :locale=\"t.tag\"\n :calendar-label=\"t.calendar.label\"\n :disabled=\"props.disabled\"\n :years-per-page=\"12\"\n prevent-deselect\n initial-focus\n :class=\"calendarPicker()\"\n @update:model-value=\"emit('pickYear', $event)\"\n @update:placeholder=\"emit('followYear', $event)\"\n @keydown.esc.stop.prevent=\"emit('back')\"\n >\n <CalendarHeader\n :prev=\"YearPickerPrev\"\n :next=\"YearPickerNext\"\n :prev-label=\"t.calendar.prevYears\"\n :next-label=\"t.calendar.nextYears\"\n :heading=\"formatYearsHeading(t.tag, years.cells)\"\n :size=\"props.size\"\n />\n <div :class=\"calendarUnits()\">\n <YearPickerGrid :class=\"calendarGrid({ units: true })\">\n <YearPickerGridBody>\n <YearPickerGridRow v-for=\"(row, index) in years.rows\" :key=\"index\">\n <YearPickerCell\n v-for=\"year in row\"\n :key=\"year.toString()\"\n :date=\"year\"\n :class=\"calendarUnitCell()\"\n >\n <YearPickerCellTrigger :year=\"year\" :class=\"calendarUnit()\">\n {{ formatDigits(t.tag, year.year) }}\n </YearPickerCellTrigger>\n </YearPickerCell>\n </YearPickerGridRow>\n </YearPickerGridBody>\n </YearPickerGrid>\n </div>\n </YearPickerRoot>\n </Transition>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import {\n MonthPickerCell,\n MonthPickerCellTrigger,\n MonthPickerGrid,\n MonthPickerGridBody,\n MonthPickerGridRow,\n MonthPickerNext,\n MonthPickerPrev,\n MonthPickerRoot,\n YearPickerCell,\n YearPickerCellTrigger,\n YearPickerGrid,\n YearPickerGridBody,\n YearPickerGridRow,\n YearPickerNext,\n YearPickerPrev,\n YearPickerRoot,\n } from 'reka-ui'\n import type { DateValue } from '@internationalized/date'\n import { useUiLocale } from '../../locale'\n import CalendarHeader from './CalendarHeader.vue'\n import type { CalendarLevel } from './composables/useCalendarLevels'\n import {\n formatDigits,\n formatMonthName,\n formatYearHeading,\n formatYearsHeading,\n } from './utils/format'\n import {\n calendarGrid,\n calendarPicker,\n calendarUnit,\n calendarUnitCell,\n calendarUnits,\n type CalendarVariants,\n } from './calendar.variants'\n\n defineOptions({ name: 'HnCalendarLevels' })\n\n type Picked = DateValue | DateValue[] | undefined\n\n const props = defineProps<{\n view: DateValue\n size?: CalendarVariants['size']\n minValue?: DateValue\n maxValue?: DateValue\n disabled?: boolean\n }>()\n const emit = defineEmits<{\n pickMonth: [value: Picked]\n pickYear: [value: Picked]\n followYear: [date: DateValue]\n back: []\n entered: []\n }>()\n\n const level = defineModel<CalendarLevel>('level', { required: true })\n\n const t = useUiLocale()\n const yearHeading = computed(() => formatYearHeading(t.value.tag, props.view))\n</script>\n\n<template>\n <Transition\n mode=\"out-in\"\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-90 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-90 opacity-0\"\n @after-enter=\"emit('entered')\"\n >\n <div v-if=\"level === 'day'\" key=\"day\" :class=\"calendarPicker()\">\n <slot />\n </div>\n\n <MonthPickerRoot\n v-else-if=\"level === 'month'\"\n key=\"month\"\n v-slot=\"{ grid: months }\"\n :placeholder=\"props.view\"\n :model-value=\"props.view\"\n :min-value=\"props.minValue\"\n :max-value=\"props.maxValue\"\n :locale=\"t.tag\"\n :calendar-label=\"t.calendar.label\"\n :disabled=\"props.disabled\"\n prevent-deselect\n initial-focus\n :class=\"calendarPicker()\"\n @update:model-value=\"emit('pickMonth', $event)\"\n @update:placeholder=\"emit('followYear', $event)\"\n @keydown.esc.stop.prevent=\"emit('back')\"\n >\n <CalendarHeader\n :prev=\"MonthPickerPrev\"\n :next=\"MonthPickerNext\"\n :prev-label=\"t.calendar.prevYear\"\n :next-label=\"t.calendar.nextYear\"\n :heading=\"yearHeading\"\n :pick-label=\"t.calendar.pickYear\"\n :size=\"props.size\"\n :disabled=\"props.disabled\"\n @pick=\"level = 'year'\"\n />\n <div :class=\"calendarUnits()\">\n <MonthPickerGrid :class=\"calendarGrid({ units: true })\">\n <MonthPickerGridBody>\n <MonthPickerGridRow v-for=\"(row, index) in months.rows\" :key=\"index\">\n <MonthPickerCell\n v-for=\"month in row\"\n :key=\"month.toString()\"\n :date=\"month\"\n :class=\"calendarUnitCell()\"\n >\n <MonthPickerCellTrigger :month=\"month\" :class=\"calendarUnit()\">\n {{ formatMonthName(t.tag, month) }}\n </MonthPickerCellTrigger>\n </MonthPickerCell>\n </MonthPickerGridRow>\n </MonthPickerGridBody>\n </MonthPickerGrid>\n </div>\n </MonthPickerRoot>\n\n <YearPickerRoot\n v-else\n key=\"year\"\n v-slot=\"{ grid: years }\"\n :placeholder=\"props.view\"\n :model-value=\"props.view\"\n :min-value=\"props.minValue\"\n :max-value=\"props.maxValue\"\n :locale=\"t.tag\"\n :calendar-label=\"t.calendar.label\"\n :disabled=\"props.disabled\"\n :years-per-page=\"12\"\n prevent-deselect\n initial-focus\n :class=\"calendarPicker()\"\n @update:model-value=\"emit('pickYear', $event)\"\n @update:placeholder=\"emit('followYear', $event)\"\n @keydown.esc.stop.prevent=\"emit('back')\"\n >\n <CalendarHeader\n :prev=\"YearPickerPrev\"\n :next=\"YearPickerNext\"\n :prev-label=\"t.calendar.prevYears\"\n :next-label=\"t.calendar.nextYears\"\n :heading=\"formatYearsHeading(t.tag, years.cells)\"\n :size=\"props.size\"\n />\n <div :class=\"calendarUnits()\">\n <YearPickerGrid :class=\"calendarGrid({ units: true })\">\n <YearPickerGridBody>\n <YearPickerGridRow v-for=\"(row, index) in years.rows\" :key=\"index\">\n <YearPickerCell\n v-for=\"year in row\"\n :key=\"year.toString()\"\n :date=\"year\"\n :class=\"calendarUnitCell()\"\n >\n <YearPickerCellTrigger :year=\"year\" :class=\"calendarUnit()\">\n {{ formatDigits(t.tag, year.year) }}\n </YearPickerCellTrigger>\n </YearPickerCell>\n </YearPickerGridRow>\n </YearPickerGridBody>\n </YearPickerGrid>\n </div>\n </YearPickerRoot>\n </Transition>\n</template>\n","import { ref, shallowRef, type Ref } from 'vue'\nimport type { DateValue } from '@internationalized/date'\n\nexport type CalendarLevel = 'day' | 'month' | 'year'\n\nexport function useCalendarLevels(initial: DateValue, root: Ref<{ $el: HTMLElement } | null>) {\n const level = ref<CalendarLevel>('day')\n const view = shallowRef<DateValue>(initial)\n const returning = ref(false)\n\n function first(next: DateValue | DateValue[] | undefined) {\n return Array.isArray(next) ? next[0] : next\n }\n\n function toDay() {\n returning.value = true\n level.value = 'day'\n }\n\n function onEntered() {\n if (level.value !== 'day' || !returning.value) return\n returning.value = false\n root.value?.$el\n .querySelector<HTMLElement>('[data-reka-calendar-cell-trigger][tabindex=\"0\"]')\n ?.focus()\n }\n\n function pickMonth(next: DateValue | DateValue[] | undefined) {\n const picked = first(next)\n if (!picked) return\n view.value = view.value.set({ year: picked.year, month: picked.month })\n toDay()\n }\n\n function pickYear(next: DateValue | DateValue[] | undefined) {\n const picked = first(next)\n if (!picked) return\n view.value = view.value.set({ year: picked.year })\n level.value = 'month'\n }\n\n function followYear(date: DateValue) {\n view.value = view.value.set({ year: date.year })\n }\n\n function back() {\n if (level.value === 'year') level.value = 'month'\n else if (level.value === 'month') toDay()\n }\n\n return { level, view, pickMonth, pickYear, followYear, back, onEntered }\n}\n","<script setup lang=\"ts\">\n import { computed, shallowRef, watch } from 'vue'\n import {\n CalendarCell,\n CalendarCellTrigger,\n CalendarGrid,\n CalendarGridBody,\n CalendarGridHead,\n CalendarGridRow,\n CalendarHeadCell,\n CalendarNext,\n CalendarPrev,\n CalendarRoot,\n } from 'reka-ui'\n import { getLocalTimeZone, today, type DateValue } from '@internationalized/date'\n import { cn } from '../../lib/cn'\n import { formatDateValue, parseDateValue } from '../../lib/date'\n import { useUiLocale } from '../../locale'\n import CalendarHeader from './CalendarHeader.vue'\n import CalendarLevels from './CalendarLevels.vue'\n import { useCalendarLevels } from './composables/useCalendarLevels'\n import { formatMonthHeading } from './utils/format'\n import {\n calendarCell,\n calendarDay,\n calendarGrid,\n calendarHeadCell,\n calendarRoot,\n type CalendarVariants,\n } from './calendar.variants'\n\n defineOptions({ name: 'HnCalendar' })\n\n const props = withDefaults(\n defineProps<{\n min?: string\n max?: string\n unavailable?: (date: string) => boolean\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6\n weekdayFormat?: 'narrow' | 'short'\n fixedWeeks?: boolean\n size?: CalendarVariants['size']\n autofocus?: boolean\n readonly?: boolean\n disabled?: boolean\n class?: string\n }>(),\n { weekdayFormat: 'narrow', fixedWeeks: true, size: 'md' },\n )\n\n const model = defineModel<string | null>({ default: null })\n const shown = defineModel<string>('placeholder')\n\n const t = useUiLocale()\n const root = shallowRef<{ $el: HTMLElement } | null>(null)\n\n const value = computed(() => parseDateValue(model.value))\n const placeholder = computed(() => parseDateValue(shown.value))\n const minValue = computed(() => parseDateValue(props.min))\n const maxValue = computed(() => parseDateValue(props.max))\n const weekStartsOn = computed(() => props.weekStartsOn ?? t.value.calendar.weekStartsOn)\n const unavailable = computed(() =>\n props.unavailable ? (date: DateValue) => props.unavailable!(formatDateValue(date)) : undefined,\n )\n\n const { level, view, pickMonth, pickYear, followYear, back, onEntered } = useCalendarLevels(\n value.value ?? placeholder.value ?? today(getLocalTimeZone()),\n root,\n )\n watch(placeholder, next => {\n if (next && next.compare(view.value) !== 0) view.value = next\n })\n watch(view, next => {\n shown.value = formatDateValue(next)\n })\n\n const monthHeading = computed(() => formatMonthHeading(t.value.tag, view.value))\n\n function update(next: DateValue | DateValue[] | undefined) {\n const picked = Array.isArray(next) ? next[0] : next\n model.value = picked ? formatDateValue(picked) : null\n }\n</script>\n\n<template>\n <CalendarRoot\n ref=\"root\"\n v-slot=\"{ weekDays, grid }\"\n data-hn-calendar\n :data-level=\"level\"\n :model-value=\"value\"\n :placeholder=\"view\"\n :min-value=\"minValue\"\n :max-value=\"maxValue\"\n :is-date-unavailable=\"unavailable\"\n :week-starts-on=\"weekStartsOn\"\n :weekday-format=\"props.weekdayFormat\"\n :fixed-weeks=\"props.fixedWeeks\"\n :initial-focus=\"props.autofocus\"\n :locale=\"t.tag\"\n :calendar-label=\"t.calendar.label\"\n :disabled=\"props.disabled\"\n :readonly=\"props.readonly\"\n :class=\"cn(calendarRoot({ size: props.size }), props.class)\"\n @update:model-value=\"update\"\n @update:placeholder=\"view = $event\"\n >\n <CalendarLevels\n v-model:level=\"level\"\n :view=\"view\"\n :size=\"props.size\"\n :min-value=\"minValue\"\n :max-value=\"maxValue\"\n :disabled=\"props.disabled\"\n @pick-month=\"pickMonth\"\n @pick-year=\"pickYear\"\n @follow-year=\"followYear\"\n @back=\"back\"\n @entered=\"onEntered\"\n >\n <CalendarHeader\n :prev=\"CalendarPrev\"\n :next=\"CalendarNext\"\n :prev-label=\"t.calendar.prev\"\n :next-label=\"t.calendar.next\"\n :heading=\"monthHeading\"\n :pick-label=\"t.calendar.pickMonth\"\n :size=\"props.size\"\n :disabled=\"props.disabled\"\n @pick=\"level = 'month'\"\n />\n <CalendarGrid v-for=\"month in grid\" :key=\"month.value.toString()\" :class=\"calendarGrid()\">\n <CalendarGridHead>\n <CalendarGridRow>\n <CalendarHeadCell\n v-for=\"day in weekDays\"\n :key=\"day\"\n :class=\"calendarHeadCell({ size: props.size })\"\n >\n {{ day }}\n </CalendarHeadCell>\n </CalendarGridRow>\n </CalendarGridHead>\n <CalendarGridBody>\n <CalendarGridRow v-for=\"(week, index) in month.rows\" :key=\"index\">\n <CalendarCell\n v-for=\"day in week\"\n :key=\"day.toString()\"\n :date=\"day\"\n :class=\"calendarCell()\"\n >\n <CalendarCellTrigger :day=\"day\" :month=\"month.value\" :class=\"calendarDay()\" />\n </CalendarCell>\n </CalendarGridRow>\n </CalendarGridBody>\n </CalendarGrid>\n </CalendarLevels>\n </CalendarRoot>\n</template>\n","<script setup lang=\"ts\">\n import { computed, shallowRef, watch } from 'vue'\n import {\n CalendarCell,\n CalendarCellTrigger,\n CalendarGrid,\n CalendarGridBody,\n CalendarGridHead,\n CalendarGridRow,\n CalendarHeadCell,\n CalendarNext,\n CalendarPrev,\n CalendarRoot,\n } from 'reka-ui'\n import { getLocalTimeZone, today, type DateValue } from '@internationalized/date'\n import { cn } from '../../lib/cn'\n import { formatDateValue, parseDateValue } from '../../lib/date'\n import { useUiLocale } from '../../locale'\n import CalendarHeader from './CalendarHeader.vue'\n import CalendarLevels from './CalendarLevels.vue'\n import { useCalendarLevels } from './composables/useCalendarLevels'\n import { formatMonthHeading } from './utils/format'\n import {\n calendarCell,\n calendarDay,\n calendarGrid,\n calendarHeadCell,\n calendarRoot,\n type CalendarVariants,\n } from './calendar.variants'\n\n defineOptions({ name: 'HnCalendar' })\n\n const props = withDefaults(\n defineProps<{\n min?: string\n max?: string\n unavailable?: (date: string) => boolean\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6\n weekdayFormat?: 'narrow' | 'short'\n fixedWeeks?: boolean\n size?: CalendarVariants['size']\n autofocus?: boolean\n readonly?: boolean\n disabled?: boolean\n class?: string\n }>(),\n { weekdayFormat: 'narrow', fixedWeeks: true, size: 'md' },\n )\n\n const model = defineModel<string | null>({ default: null })\n const shown = defineModel<string>('placeholder')\n\n const t = useUiLocale()\n const root = shallowRef<{ $el: HTMLElement } | null>(null)\n\n const value = computed(() => parseDateValue(model.value))\n const placeholder = computed(() => parseDateValue(shown.value))\n const minValue = computed(() => parseDateValue(props.min))\n const maxValue = computed(() => parseDateValue(props.max))\n const weekStartsOn = computed(() => props.weekStartsOn ?? t.value.calendar.weekStartsOn)\n const unavailable = computed(() =>\n props.unavailable ? (date: DateValue) => props.unavailable!(formatDateValue(date)) : undefined,\n )\n\n const { level, view, pickMonth, pickYear, followYear, back, onEntered } = useCalendarLevels(\n value.value ?? placeholder.value ?? today(getLocalTimeZone()),\n root,\n )\n watch(placeholder, next => {\n if (next && next.compare(view.value) !== 0) view.value = next\n })\n watch(view, next => {\n shown.value = formatDateValue(next)\n })\n\n const monthHeading = computed(() => formatMonthHeading(t.value.tag, view.value))\n\n function update(next: DateValue | DateValue[] | undefined) {\n const picked = Array.isArray(next) ? next[0] : next\n model.value = picked ? formatDateValue(picked) : null\n }\n</script>\n\n<template>\n <CalendarRoot\n ref=\"root\"\n v-slot=\"{ weekDays, grid }\"\n data-hn-calendar\n :data-level=\"level\"\n :model-value=\"value\"\n :placeholder=\"view\"\n :min-value=\"minValue\"\n :max-value=\"maxValue\"\n :is-date-unavailable=\"unavailable\"\n :week-starts-on=\"weekStartsOn\"\n :weekday-format=\"props.weekdayFormat\"\n :fixed-weeks=\"props.fixedWeeks\"\n :initial-focus=\"props.autofocus\"\n :locale=\"t.tag\"\n :calendar-label=\"t.calendar.label\"\n :disabled=\"props.disabled\"\n :readonly=\"props.readonly\"\n :class=\"cn(calendarRoot({ size: props.size }), props.class)\"\n @update:model-value=\"update\"\n @update:placeholder=\"view = $event\"\n >\n <CalendarLevels\n v-model:level=\"level\"\n :view=\"view\"\n :size=\"props.size\"\n :min-value=\"minValue\"\n :max-value=\"maxValue\"\n :disabled=\"props.disabled\"\n @pick-month=\"pickMonth\"\n @pick-year=\"pickYear\"\n @follow-year=\"followYear\"\n @back=\"back\"\n @entered=\"onEntered\"\n >\n <CalendarHeader\n :prev=\"CalendarPrev\"\n :next=\"CalendarNext\"\n :prev-label=\"t.calendar.prev\"\n :next-label=\"t.calendar.next\"\n :heading=\"monthHeading\"\n :pick-label=\"t.calendar.pickMonth\"\n :size=\"props.size\"\n :disabled=\"props.disabled\"\n @pick=\"level = 'month'\"\n />\n <CalendarGrid v-for=\"month in grid\" :key=\"month.value.toString()\" :class=\"calendarGrid()\">\n <CalendarGridHead>\n <CalendarGridRow>\n <CalendarHeadCell\n v-for=\"day in weekDays\"\n :key=\"day\"\n :class=\"calendarHeadCell({ size: props.size })\"\n >\n {{ day }}\n </CalendarHeadCell>\n </CalendarGridRow>\n </CalendarGridHead>\n <CalendarGridBody>\n <CalendarGridRow v-for=\"(week, index) in month.rows\" :key=\"index\">\n <CalendarCell\n v-for=\"day in week\"\n :key=\"day.toString()\"\n :date=\"day\"\n :class=\"calendarCell()\"\n >\n <CalendarCellTrigger :day=\"day\" :month=\"month.value\" :class=\"calendarDay()\" />\n </CalendarCell>\n </CalendarGridRow>\n </CalendarGridBody>\n </CalendarGrid>\n </CalendarLevels>\n </CalendarRoot>\n</template>\n","import type { Ref } from 'vue'\n\nexport function useSegmentFocus(host: Ref<HTMLElement | null>) {\n function segments() {\n return Array.from(\n host.value?.querySelectorAll<HTMLElement>('[data-hn-segment]:not([aria-hidden=\"true\"])') ??\n [],\n )\n }\n\n function focus() {\n const all = segments()\n ;(all.find(segment => segment.hasAttribute('data-placeholder')) ?? all[0])?.focus()\n }\n\n function onHostClick(event: MouseEvent) {\n if ((event.target as Element).closest('[data-hn-segment], button')) return\n focus()\n }\n\n return { focus, onHostClick }\n}\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const dateFieldHost = tv({\n base: 'data-disabled:cursor-not-allowed data-disabled:opacity-50',\n})\n\nexport const dateFieldControl = tv({\n base: 'flex h-full min-w-0 flex-1 items-center px-[var(--hn-input-px)] tabular-nums select-none',\n variants: {\n leading: {\n true: 'ps-0',\n },\n trailing: {\n true: 'pe-0',\n },\n },\n})\n\nexport const dateFieldSegment = tv({\n base: 'hn-transition rounded-xs outline-none',\n variants: {\n part: {\n literal: 'text-faint px-px',\n editable: [\n 'px-0.5 focus:bg-accent-soft focus:text-accent-text',\n 'data-placeholder:text-faint data-placeholder:font-normal data-disabled:cursor-not-allowed',\n ],\n },\n },\n defaultVariants: { part: 'editable' },\n})\n\nexport type DateFieldVariants = VariantProps<typeof dateFieldSegment>\n","<script setup lang=\"ts\">\n import { computed, shallowRef, useSlots } from 'vue'\n import { DateFieldInput, DateFieldRoot } from 'reka-ui'\n import type { DateValue } from '@internationalized/date'\n import { cn } from '../../lib/cn'\n import { formatDateValue, parseDateValue, type DateGranularity } from '../../lib/date'\n import { useUiLocale } from '../../locale'\n import { X } from '@lucide/vue'\n import InputAction from '../input/InputAction.vue'\n import { useFieldControl } from '../form-field/context'\n import { injectInputGroup } from '../input-group/context'\n import {\n inputActionSlot,\n inputAdornment,\n inputEmbedded,\n inputHost,\n type InputVariants,\n } from '../input/input.variants'\n import { useSegmentFocus } from './composables/useSegmentFocus'\n import { dateFieldControl, dateFieldHost, dateFieldSegment } from './date-field.variants'\n\n defineOptions({ name: 'HnDateField', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n placeholder?: string\n min?: string\n max?: string\n granularity?: DateGranularity\n hourCycle?: 12 | 24\n clearable?: boolean\n readonly?: boolean\n name?: string\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>(),\n { granularity: 'day', clearable: false },\n )\n const emit = defineEmits<{ clear: [] }>()\n\n const model = defineModel<string | null>({ default: null })\n\n const slots = useSlots()\n const t = useUiLocale()\n const group = injectInputGroup()\n const host = shallowRef<HTMLElement | null>(null)\n\n const size = computed(() => (group ? group.size.value : props.size))\n const { labelledBy, invalid, disabled, describedBy } = useFieldControl({\n invalid: () => props.invalid || !!group?.invalid.value || outOfRange.value,\n disabled: () => props.disabled || !!group?.disabled.value,\n })\n\n const value = computed(() => parseDateValue(model.value, props.granularity))\n const placeholder = computed(() => parseDateValue(props.placeholder, props.granularity))\n const minValue = computed(() => parseDateValue(props.min, props.granularity))\n const maxValue = computed(() => parseDateValue(props.max, props.granularity))\n const outOfRange = computed(\n () =>\n !!value.value &&\n ((!!minValue.value && value.value.compare(minValue.value) < 0) ||\n (!!maxValue.value && value.value.compare(maxValue.value) > 0)),\n )\n const clearing = computed(() => props.clearable && model.value != null && !disabled.value)\n\n function segmentLabel(part: string) {\n return (t.value.dateField as Record<string, string | undefined>)[part]\n }\n\n function update(next: DateValue | undefined) {\n model.value = next ? formatDateValue(next, props.granularity) : null\n }\n\n const { focus, onHostClick } = useSegmentFocus(host)\n\n function clear() {\n if (model.value == null) return\n model.value = null\n emit('clear')\n focus()\n }\n\n defineExpose({ clear, focus })\n</script>\n\n<template>\n <div\n ref=\"host\"\n data-hn-date-field\n :data-invalid=\"invalid ? '' : undefined\"\n :data-disabled=\"disabled ? '' : undefined\"\n :class=\"\n cn(\n group ? inputEmbedded() : inputHost({ variant: props.variant, size: props.size }),\n dateFieldHost(),\n props.class,\n )\n \"\n @click=\"onHostClick\"\n >\n <span v-if=\"slots.leading\" :class=\"inputAdornment()\">\n <slot name=\"leading\" />\n </span>\n <DateFieldRoot\n v-slot=\"{ segments: parts }\"\n v-bind=\"$attrs\"\n :aria-labelledby=\"labelledBy\"\n :aria-describedby=\"describedBy\"\n :model-value=\"value\"\n :placeholder=\"placeholder\"\n :min-value=\"minValue\"\n :max-value=\"maxValue\"\n :granularity=\"props.granularity\"\n :hour-cycle=\"props.hourCycle\"\n :locale=\"t.tag\"\n :disabled=\"disabled\"\n :readonly=\"props.readonly\"\n :name=\"props.name\"\n :aria-invalid=\"invalid || undefined\"\n :class=\"\n dateFieldControl({ leading: !!slots.leading, trailing: clearing || !!slots.trailing })\n \"\n @update:model-value=\"update\"\n >\n <DateFieldInput\n v-for=\"part in parts\"\n :key=\"part.part\"\n :part=\"part.part\"\n data-hn-segment\n :aria-label=\"part.part === 'literal' ? undefined : segmentLabel(part.part)\"\n :class=\"dateFieldSegment({ part: part.part === 'literal' ? 'literal' : 'editable' })\"\n >\n {{ part.value }}\n </DateFieldInput>\n </DateFieldRoot>\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-90 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-90 opacity-0\"\n >\n <span v-if=\"clearing\" :class=\"inputActionSlot()\">\n <InputAction :label=\"t.common.clear\" @click=\"clear\">\n <X />\n </InputAction>\n </span>\n </Transition>\n <span v-if=\"slots.trailing\" :class=\"inputAdornment()\">\n <slot name=\"trailing\" />\n </span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed, shallowRef, useSlots } from 'vue'\n import { DateFieldInput, DateFieldRoot } from 'reka-ui'\n import type { DateValue } from '@internationalized/date'\n import { cn } from '../../lib/cn'\n import { formatDateValue, parseDateValue, type DateGranularity } from '../../lib/date'\n import { useUiLocale } from '../../locale'\n import { X } from '@lucide/vue'\n import InputAction from '../input/InputAction.vue'\n import { useFieldControl } from '../form-field/context'\n import { injectInputGroup } from '../input-group/context'\n import {\n inputActionSlot,\n inputAdornment,\n inputEmbedded,\n inputHost,\n type InputVariants,\n } from '../input/input.variants'\n import { useSegmentFocus } from './composables/useSegmentFocus'\n import { dateFieldControl, dateFieldHost, dateFieldSegment } from './date-field.variants'\n\n defineOptions({ name: 'HnDateField', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n placeholder?: string\n min?: string\n max?: string\n granularity?: DateGranularity\n hourCycle?: 12 | 24\n clearable?: boolean\n readonly?: boolean\n name?: string\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>(),\n { granularity: 'day', clearable: false },\n )\n const emit = defineEmits<{ clear: [] }>()\n\n const model = defineModel<string | null>({ default: null })\n\n const slots = useSlots()\n const t = useUiLocale()\n const group = injectInputGroup()\n const host = shallowRef<HTMLElement | null>(null)\n\n const size = computed(() => (group ? group.size.value : props.size))\n const { labelledBy, invalid, disabled, describedBy } = useFieldControl({\n invalid: () => props.invalid || !!group?.invalid.value || outOfRange.value,\n disabled: () => props.disabled || !!group?.disabled.value,\n })\n\n const value = computed(() => parseDateValue(model.value, props.granularity))\n const placeholder = computed(() => parseDateValue(props.placeholder, props.granularity))\n const minValue = computed(() => parseDateValue(props.min, props.granularity))\n const maxValue = computed(() => parseDateValue(props.max, props.granularity))\n const outOfRange = computed(\n () =>\n !!value.value &&\n ((!!minValue.value && value.value.compare(minValue.value) < 0) ||\n (!!maxValue.value && value.value.compare(maxValue.value) > 0)),\n )\n const clearing = computed(() => props.clearable && model.value != null && !disabled.value)\n\n function segmentLabel(part: string) {\n return (t.value.dateField as Record<string, string | undefined>)[part]\n }\n\n function update(next: DateValue | undefined) {\n model.value = next ? formatDateValue(next, props.granularity) : null\n }\n\n const { focus, onHostClick } = useSegmentFocus(host)\n\n function clear() {\n if (model.value == null) return\n model.value = null\n emit('clear')\n focus()\n }\n\n defineExpose({ clear, focus })\n</script>\n\n<template>\n <div\n ref=\"host\"\n data-hn-date-field\n :data-invalid=\"invalid ? '' : undefined\"\n :data-disabled=\"disabled ? '' : undefined\"\n :class=\"\n cn(\n group ? inputEmbedded() : inputHost({ variant: props.variant, size: props.size }),\n dateFieldHost(),\n props.class,\n )\n \"\n @click=\"onHostClick\"\n >\n <span v-if=\"slots.leading\" :class=\"inputAdornment()\">\n <slot name=\"leading\" />\n </span>\n <DateFieldRoot\n v-slot=\"{ segments: parts }\"\n v-bind=\"$attrs\"\n :aria-labelledby=\"labelledBy\"\n :aria-describedby=\"describedBy\"\n :model-value=\"value\"\n :placeholder=\"placeholder\"\n :min-value=\"minValue\"\n :max-value=\"maxValue\"\n :granularity=\"props.granularity\"\n :hour-cycle=\"props.hourCycle\"\n :locale=\"t.tag\"\n :disabled=\"disabled\"\n :readonly=\"props.readonly\"\n :name=\"props.name\"\n :aria-invalid=\"invalid || undefined\"\n :class=\"\n dateFieldControl({ leading: !!slots.leading, trailing: clearing || !!slots.trailing })\n \"\n @update:model-value=\"update\"\n >\n <DateFieldInput\n v-for=\"part in parts\"\n :key=\"part.part\"\n :part=\"part.part\"\n data-hn-segment\n :aria-label=\"part.part === 'literal' ? undefined : segmentLabel(part.part)\"\n :class=\"dateFieldSegment({ part: part.part === 'literal' ? 'literal' : 'editable' })\"\n >\n {{ part.value }}\n </DateFieldInput>\n </DateFieldRoot>\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-90 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-90 opacity-0\"\n >\n <span v-if=\"clearing\" :class=\"inputActionSlot()\">\n <InputAction :label=\"t.common.clear\" @click=\"clear\">\n <X />\n </InputAction>\n </span>\n </Transition>\n <span v-if=\"slots.trailing\" :class=\"inputAdornment()\">\n <slot name=\"trailing\" />\n </span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import type { InputVariants } from '../input/input.variants'\n import { provideInputGroup } from './context'\n\n defineOptions({ name: 'HnInputGroupScope' })\n\n const props = defineProps<{\n size?: InputVariants['size']\n disabled?: boolean\n invalid?: boolean\n }>()\n\n provideInputGroup({\n size: computed(() => props.size),\n disabled: computed(() => !!props.disabled),\n invalid: computed(() => !!props.invalid),\n })\n</script>\n\n<template>\n <slot />\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import type { InputVariants } from '../input/input.variants'\n import { provideInputGroup } from './context'\n\n defineOptions({ name: 'HnInputGroupScope' })\n\n const props = defineProps<{\n size?: InputVariants['size']\n disabled?: boolean\n invalid?: boolean\n }>()\n\n provideInputGroup({\n size: computed(() => props.size),\n disabled: computed(() => !!props.disabled),\n invalid: computed(() => !!props.invalid),\n })\n</script>\n\n<template>\n <slot />\n</template>\n","import { tv } from '../../lib/tv'\n\nexport const datePickerContent = tv({\n base: 'hn-anim-pop z-(--hn-z-overlay) p-2 shadow-md outline-none',\n})\n","<script setup lang=\"ts\">\n import { computed, shallowRef, useSlots } from 'vue'\n import {\n PopoverAnchor,\n PopoverContent,\n PopoverPortal,\n PopoverRoot,\n PopoverTrigger,\n } from 'reka-ui'\n import { CalendarDays } from '@lucide/vue'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import Calendar from '../calendar/Calendar.vue'\n import type { CalendarVariants } from '../calendar/calendar.variants'\n import Card from '../card/Card.vue'\n import DateField from '../date-field/DateField.vue'\n import { useFieldControl } from '../form-field/context'\n import { injectInputGroup } from '../input-group/context'\n import InputGroupScope from '../input-group/InputGroupScope.vue'\n import InputAction from '../input/InputAction.vue'\n import { inputEmbedded, inputHost, type InputVariants } from '../input/input.variants'\n import { datePickerContent } from './date-picker.variants'\n\n defineOptions({ name: 'HnDatePicker', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n placeholder?: string\n min?: string\n max?: string\n unavailable?: (date: string) => boolean\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6\n weekdayFormat?: 'narrow' | 'short'\n fixedWeeks?: boolean\n clearable?: boolean\n readonly?: boolean\n name?: string\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>(),\n { clearable: false, fixedWeeks: true },\n )\n const emit = defineEmits<{ clear: [] }>()\n\n const model = defineModel<string | null>({ default: null })\n const open = defineModel<boolean>('open', { default: false })\n\n const slots = useSlots()\n const t = useUiLocale()\n const outer = injectInputGroup()\n const host = shallowRef<HTMLElement | null>(null)\n\n const size = computed(() => (outer ? outer.size.value : props.size))\n const { invalid, disabled } = useFieldControl({\n invalid: () => props.invalid || !!outer?.invalid.value,\n disabled: () => props.disabled || !!outer?.disabled.value,\n })\n const calendarSize = computed<CalendarVariants['size']>(() => size.value ?? 'md')\n\n function pick(next: string | null) {\n model.value = next\n if (next) open.value = false\n }\n</script>\n\n<template>\n <PopoverRoot v-model:open=\"open\" modal>\n <PopoverAnchor as-child>\n <div\n ref=\"host\"\n data-hn-date-picker\n :data-invalid=\"invalid ? '' : undefined\"\n :class=\"\n cn(\n outer ? inputEmbedded() : inputHost({ variant: props.variant, size: props.size }),\n props.class,\n )\n \"\n >\n <InputGroupScope :size=\"size\" :disabled=\"disabled\" :invalid=\"invalid\">\n <DateField\n v-bind=\"$attrs\"\n :model-value=\"model\"\n :placeholder=\"props.placeholder\"\n :min=\"props.min\"\n :max=\"props.max\"\n :clearable=\"props.clearable\"\n :readonly=\"props.readonly\"\n :name=\"props.name\"\n @update:model-value=\"model = $event\"\n @clear=\"emit('clear')\"\n >\n <template v-if=\"slots.leading\" #leading>\n <slot name=\"leading\" />\n </template>\n </DateField>\n </InputGroupScope>\n <PopoverTrigger as-child>\n <InputAction :label=\"t.datePicker.open\" :disabled=\"disabled\">\n <CalendarDays />\n </InputAction>\n </PopoverTrigger>\n </div>\n </PopoverAnchor>\n <PopoverPortal>\n <PopoverContent\n as-child\n side=\"bottom\"\n align=\"start\"\n :side-offset=\"8\"\n @open-auto-focus.prevent\n >\n <Card :padded=\"false\" :class=\"datePickerContent()\">\n <Calendar\n :model-value=\"model\"\n :placeholder=\"props.placeholder\"\n :min=\"props.min\"\n :max=\"props.max\"\n :unavailable=\"props.unavailable\"\n :week-starts-on=\"props.weekStartsOn\"\n :weekday-format=\"props.weekdayFormat\"\n :fixed-weeks=\"props.fixedWeeks\"\n :size=\"calendarSize\"\n :readonly=\"props.readonly\"\n autofocus\n @update:model-value=\"pick\"\n />\n </Card>\n </PopoverContent>\n </PopoverPortal>\n </PopoverRoot>\n</template>\n","<script setup lang=\"ts\">\n import { computed, shallowRef, useSlots } from 'vue'\n import {\n PopoverAnchor,\n PopoverContent,\n PopoverPortal,\n PopoverRoot,\n PopoverTrigger,\n } from 'reka-ui'\n import { CalendarDays } from '@lucide/vue'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import Calendar from '../calendar/Calendar.vue'\n import type { CalendarVariants } from '../calendar/calendar.variants'\n import Card from '../card/Card.vue'\n import DateField from '../date-field/DateField.vue'\n import { useFieldControl } from '../form-field/context'\n import { injectInputGroup } from '../input-group/context'\n import InputGroupScope from '../input-group/InputGroupScope.vue'\n import InputAction from '../input/InputAction.vue'\n import { inputEmbedded, inputHost, type InputVariants } from '../input/input.variants'\n import { datePickerContent } from './date-picker.variants'\n\n defineOptions({ name: 'HnDatePicker', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n placeholder?: string\n min?: string\n max?: string\n unavailable?: (date: string) => boolean\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6\n weekdayFormat?: 'narrow' | 'short'\n fixedWeeks?: boolean\n clearable?: boolean\n readonly?: boolean\n name?: string\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>(),\n { clearable: false, fixedWeeks: true },\n )\n const emit = defineEmits<{ clear: [] }>()\n\n const model = defineModel<string | null>({ default: null })\n const open = defineModel<boolean>('open', { default: false })\n\n const slots = useSlots()\n const t = useUiLocale()\n const outer = injectInputGroup()\n const host = shallowRef<HTMLElement | null>(null)\n\n const size = computed(() => (outer ? outer.size.value : props.size))\n const { invalid, disabled } = useFieldControl({\n invalid: () => props.invalid || !!outer?.invalid.value,\n disabled: () => props.disabled || !!outer?.disabled.value,\n })\n const calendarSize = computed<CalendarVariants['size']>(() => size.value ?? 'md')\n\n function pick(next: string | null) {\n model.value = next\n if (next) open.value = false\n }\n</script>\n\n<template>\n <PopoverRoot v-model:open=\"open\" modal>\n <PopoverAnchor as-child>\n <div\n ref=\"host\"\n data-hn-date-picker\n :data-invalid=\"invalid ? '' : undefined\"\n :class=\"\n cn(\n outer ? inputEmbedded() : inputHost({ variant: props.variant, size: props.size }),\n props.class,\n )\n \"\n >\n <InputGroupScope :size=\"size\" :disabled=\"disabled\" :invalid=\"invalid\">\n <DateField\n v-bind=\"$attrs\"\n :model-value=\"model\"\n :placeholder=\"props.placeholder\"\n :min=\"props.min\"\n :max=\"props.max\"\n :clearable=\"props.clearable\"\n :readonly=\"props.readonly\"\n :name=\"props.name\"\n @update:model-value=\"model = $event\"\n @clear=\"emit('clear')\"\n >\n <template v-if=\"slots.leading\" #leading>\n <slot name=\"leading\" />\n </template>\n </DateField>\n </InputGroupScope>\n <PopoverTrigger as-child>\n <InputAction :label=\"t.datePicker.open\" :disabled=\"disabled\">\n <CalendarDays />\n </InputAction>\n </PopoverTrigger>\n </div>\n </PopoverAnchor>\n <PopoverPortal>\n <PopoverContent\n as-child\n side=\"bottom\"\n align=\"start\"\n :side-offset=\"8\"\n @open-auto-focus.prevent\n >\n <Card :padded=\"false\" :class=\"datePickerContent()\">\n <Calendar\n :model-value=\"model\"\n :placeholder=\"props.placeholder\"\n :min=\"props.min\"\n :max=\"props.max\"\n :unavailable=\"props.unavailable\"\n :week-starts-on=\"props.weekStartsOn\"\n :weekday-format=\"props.weekdayFormat\"\n :fixed-weeks=\"props.fixedWeeks\"\n :size=\"calendarSize\"\n :readonly=\"props.readonly\"\n autofocus\n @update:model-value=\"pick\"\n />\n </Card>\n </PopoverContent>\n </PopoverPortal>\n </PopoverRoot>\n</template>\n","import { tv } from '../../lib/tv'\n\nexport const dateRangeFieldSeparator = tv({\n base: 'text-faint shrink-0 px-1 select-none',\n})\n","import type { DateValue } from '@internationalized/date'\n\ninterface Bounds {\n min?: DateValue\n max?: DateValue\n}\n\ninterface Parts {\n start?: DateValue\n end?: DateValue\n}\n\nfunction outside(value: DateValue | undefined, { min, max }: Bounds) {\n if (!value) return false\n return (!!min && value.compare(min) < 0) || (!!max && value.compare(max) > 0)\n}\n\nexport function isRangeInvalid({ start, end }: Parts, bounds: Bounds) {\n if (outside(start, bounds) || outside(end, bounds)) return true\n return !!start && !!end && start.compare(end) > 0\n}\n","<script setup lang=\"ts\">\n import { computed, shallowRef, useSlots } from 'vue'\n import { DateRangeFieldInput, DateRangeFieldRoot, type DateRange } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import {\n formatDateRange,\n parseDateRange,\n parseDateValue,\n type DateGranularity,\n type DateRangeValue,\n } from '../../lib/date'\n import { useUiLocale } from '../../locale'\n import { X } from '@lucide/vue'\n import InputAction from '../input/InputAction.vue'\n import { useFieldControl } from '../form-field/context'\n import { injectInputGroup } from '../input-group/context'\n import {\n inputActionSlot,\n inputAdornment,\n inputEmbedded,\n inputHost,\n type InputVariants,\n } from '../input/input.variants'\n import { useSegmentFocus } from '../date-field/composables/useSegmentFocus'\n import {\n dateFieldControl,\n dateFieldHost,\n dateFieldSegment,\n } from '../date-field/date-field.variants'\n import { dateRangeFieldSeparator } from './date-range-field.variants'\n import { isRangeInvalid } from './utils/validity'\n\n defineOptions({ name: 'HnDateRangeField', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n placeholder?: string\n min?: string\n max?: string\n granularity?: DateGranularity\n hourCycle?: 12 | 24\n clearable?: boolean\n readonly?: boolean\n name?: string\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>(),\n { granularity: 'day', clearable: false },\n )\n const emit = defineEmits<{ clear: [] }>()\n\n const model = defineModel<DateRangeValue | null>({ default: null })\n\n const slots = useSlots()\n const t = useUiLocale()\n const group = injectInputGroup()\n const host = shallowRef<HTMLElement | null>(null)\n\n const { labelledBy, invalid, disabled, describedBy } = useFieldControl({\n invalid: () => props.invalid || !!group?.invalid.value || outOfRange.value,\n disabled: () => props.disabled || !!group?.disabled.value,\n })\n\n const value = computed(() => parseDateRange(model.value, props.granularity))\n const placeholder = computed(() => parseDateValue(props.placeholder, props.granularity))\n const minValue = computed(() => parseDateValue(props.min, props.granularity))\n const maxValue = computed(() => parseDateValue(props.max, props.granularity))\n const outOfRange = computed(() =>\n isRangeInvalid(value.value, { min: minValue.value, max: maxValue.value }),\n )\n const clearing = computed(() => props.clearable && model.value != null && !disabled.value)\n\n const sides = ['start', 'end'] as const\n\n function segmentLabel(side: 'start' | 'end', part: string) {\n const name = (t.value.dateField as Record<string, string | undefined>)[part]\n return `${t.value.dateRangeField[side]} ${name}`\n }\n\n function update(next: DateRange) {\n model.value = formatDateRange(next, props.granularity)\n }\n\n const { focus, onHostClick } = useSegmentFocus(host)\n\n function clear() {\n if (model.value == null) return\n model.value = null\n emit('clear')\n focus()\n }\n\n defineExpose({ clear, focus })\n</script>\n\n<template>\n <div\n ref=\"host\"\n data-hn-date-range-field\n :data-invalid=\"invalid ? '' : undefined\"\n :data-disabled=\"disabled ? '' : undefined\"\n :class=\"\n cn(\n group ? inputEmbedded() : inputHost({ variant: props.variant, size: props.size }),\n dateFieldHost(),\n props.class,\n )\n \"\n @click=\"onHostClick\"\n >\n <span v-if=\"slots.leading\" :class=\"inputAdornment()\">\n <slot name=\"leading\" />\n </span>\n <DateRangeFieldRoot\n v-slot=\"{ segments }\"\n v-bind=\"$attrs\"\n :aria-labelledby=\"labelledBy\"\n :aria-describedby=\"describedBy\"\n :model-value=\"value\"\n :placeholder=\"placeholder\"\n :min-value=\"minValue\"\n :max-value=\"maxValue\"\n :granularity=\"props.granularity\"\n :hour-cycle=\"props.hourCycle\"\n :locale=\"t.tag\"\n :disabled=\"disabled\"\n :readonly=\"props.readonly\"\n :name=\"props.name\"\n :aria-invalid=\"invalid || undefined\"\n :class=\"\n dateFieldControl({ leading: !!slots.leading, trailing: clearing || !!slots.trailing })\n \"\n @update:model-value=\"update\"\n >\n <template v-for=\"(side, index) in sides\" :key=\"side\">\n <span v-if=\"index\" aria-hidden=\"true\" :class=\"dateRangeFieldSeparator()\">\n {{ t.dateRangeField.separator }}\n </span>\n <DateRangeFieldInput\n v-for=\"part in segments[side]\"\n :key=\"`${side}-${part.part}`\"\n :type=\"side\"\n :part=\"part.part\"\n data-hn-segment\n :aria-label=\"part.part === 'literal' ? undefined : segmentLabel(side, part.part)\"\n :class=\"dateFieldSegment({ part: part.part === 'literal' ? 'literal' : 'editable' })\"\n >\n {{ part.value }}\n </DateRangeFieldInput>\n </template>\n </DateRangeFieldRoot>\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-90 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-90 opacity-0\"\n >\n <span v-if=\"clearing\" :class=\"inputActionSlot()\">\n <InputAction :label=\"t.common.clear\" @click=\"clear\">\n <X />\n </InputAction>\n </span>\n </Transition>\n <span v-if=\"slots.trailing\" :class=\"inputAdornment()\">\n <slot name=\"trailing\" />\n </span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed, shallowRef, useSlots } from 'vue'\n import { DateRangeFieldInput, DateRangeFieldRoot, type DateRange } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import {\n formatDateRange,\n parseDateRange,\n parseDateValue,\n type DateGranularity,\n type DateRangeValue,\n } from '../../lib/date'\n import { useUiLocale } from '../../locale'\n import { X } from '@lucide/vue'\n import InputAction from '../input/InputAction.vue'\n import { useFieldControl } from '../form-field/context'\n import { injectInputGroup } from '../input-group/context'\n import {\n inputActionSlot,\n inputAdornment,\n inputEmbedded,\n inputHost,\n type InputVariants,\n } from '../input/input.variants'\n import { useSegmentFocus } from '../date-field/composables/useSegmentFocus'\n import {\n dateFieldControl,\n dateFieldHost,\n dateFieldSegment,\n } from '../date-field/date-field.variants'\n import { dateRangeFieldSeparator } from './date-range-field.variants'\n import { isRangeInvalid } from './utils/validity'\n\n defineOptions({ name: 'HnDateRangeField', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n placeholder?: string\n min?: string\n max?: string\n granularity?: DateGranularity\n hourCycle?: 12 | 24\n clearable?: boolean\n readonly?: boolean\n name?: string\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>(),\n { granularity: 'day', clearable: false },\n )\n const emit = defineEmits<{ clear: [] }>()\n\n const model = defineModel<DateRangeValue | null>({ default: null })\n\n const slots = useSlots()\n const t = useUiLocale()\n const group = injectInputGroup()\n const host = shallowRef<HTMLElement | null>(null)\n\n const { labelledBy, invalid, disabled, describedBy } = useFieldControl({\n invalid: () => props.invalid || !!group?.invalid.value || outOfRange.value,\n disabled: () => props.disabled || !!group?.disabled.value,\n })\n\n const value = computed(() => parseDateRange(model.value, props.granularity))\n const placeholder = computed(() => parseDateValue(props.placeholder, props.granularity))\n const minValue = computed(() => parseDateValue(props.min, props.granularity))\n const maxValue = computed(() => parseDateValue(props.max, props.granularity))\n const outOfRange = computed(() =>\n isRangeInvalid(value.value, { min: minValue.value, max: maxValue.value }),\n )\n const clearing = computed(() => props.clearable && model.value != null && !disabled.value)\n\n const sides = ['start', 'end'] as const\n\n function segmentLabel(side: 'start' | 'end', part: string) {\n const name = (t.value.dateField as Record<string, string | undefined>)[part]\n return `${t.value.dateRangeField[side]} ${name}`\n }\n\n function update(next: DateRange) {\n model.value = formatDateRange(next, props.granularity)\n }\n\n const { focus, onHostClick } = useSegmentFocus(host)\n\n function clear() {\n if (model.value == null) return\n model.value = null\n emit('clear')\n focus()\n }\n\n defineExpose({ clear, focus })\n</script>\n\n<template>\n <div\n ref=\"host\"\n data-hn-date-range-field\n :data-invalid=\"invalid ? '' : undefined\"\n :data-disabled=\"disabled ? '' : undefined\"\n :class=\"\n cn(\n group ? inputEmbedded() : inputHost({ variant: props.variant, size: props.size }),\n dateFieldHost(),\n props.class,\n )\n \"\n @click=\"onHostClick\"\n >\n <span v-if=\"slots.leading\" :class=\"inputAdornment()\">\n <slot name=\"leading\" />\n </span>\n <DateRangeFieldRoot\n v-slot=\"{ segments }\"\n v-bind=\"$attrs\"\n :aria-labelledby=\"labelledBy\"\n :aria-describedby=\"describedBy\"\n :model-value=\"value\"\n :placeholder=\"placeholder\"\n :min-value=\"minValue\"\n :max-value=\"maxValue\"\n :granularity=\"props.granularity\"\n :hour-cycle=\"props.hourCycle\"\n :locale=\"t.tag\"\n :disabled=\"disabled\"\n :readonly=\"props.readonly\"\n :name=\"props.name\"\n :aria-invalid=\"invalid || undefined\"\n :class=\"\n dateFieldControl({ leading: !!slots.leading, trailing: clearing || !!slots.trailing })\n \"\n @update:model-value=\"update\"\n >\n <template v-for=\"(side, index) in sides\" :key=\"side\">\n <span v-if=\"index\" aria-hidden=\"true\" :class=\"dateRangeFieldSeparator()\">\n {{ t.dateRangeField.separator }}\n </span>\n <DateRangeFieldInput\n v-for=\"part in segments[side]\"\n :key=\"`${side}-${part.part}`\"\n :type=\"side\"\n :part=\"part.part\"\n data-hn-segment\n :aria-label=\"part.part === 'literal' ? undefined : segmentLabel(side, part.part)\"\n :class=\"dateFieldSegment({ part: part.part === 'literal' ? 'literal' : 'editable' })\"\n >\n {{ part.value }}\n </DateRangeFieldInput>\n </template>\n </DateRangeFieldRoot>\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-90 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-90 opacity-0\"\n >\n <span v-if=\"clearing\" :class=\"inputActionSlot()\">\n <InputAction :label=\"t.common.clear\" @click=\"clear\">\n <X />\n </InputAction>\n </span>\n </Transition>\n <span v-if=\"slots.trailing\" :class=\"inputAdornment()\">\n <slot name=\"trailing\" />\n </span>\n </div>\n</template>\n","import { shallowRef, watch, type Ref } from 'vue'\nimport type { DateValue } from '@internationalized/date'\n\nexport function useRangeAnchor(start: Ref<DateValue | undefined>) {\n const anchor = shallowRef<DateValue | undefined>(start.value)\n\n watch(start, next => {\n anchor.value = next\n })\n\n function onStartValue(next: DateValue | undefined) {\n anchor.value = next\n }\n\n return { anchor, onStartValue }\n}\n","import { tv } from '../../lib/tv'\nimport { calendarCell, calendarDay } from '../calendar/calendar.variants'\n\nexport const rangeCalendarCell = tv({\n extend: calendarCell,\n base: [\n 'first:rounded-s-md last:rounded-e-md',\n 'has-[[data-selected]]:bg-accent-soft has-[[data-highlighted]]:bg-accent-soft',\n 'has-[[data-selection-start]]:rounded-s-md has-[[data-highlighted-start]]:rounded-s-md',\n 'has-[[data-selection-end]]:rounded-e-md has-[[data-highlighted-end]]:rounded-e-md',\n ],\n})\n\nexport const rangeCalendarDay = tv({\n extend: calendarDay,\n base: [\n 'data-[highlighted]:text-accent-text',\n 'data-[highlighted]:not-[[data-highlighted-end]]:[--hn-state-hover-opacity:0]',\n 'data-[selected]:not-[[data-selection-start]]:not-[[data-selection-end]]:bg-transparent',\n 'data-[selected]:not-[[data-selection-start]]:not-[[data-selection-end]]:text-accent-text',\n 'data-[selected]:not-[[data-selection-start]]:not-[[data-selection-end]]:font-normal',\n 'data-[selected]:[--hn-state-selected-opacity:0]',\n ],\n})\n","import type { DateValue } from '@internationalized/date'\n\nexport function maximumDaysMatcher(\n start: DateValue | undefined,\n end: DateValue | undefined,\n maximumDays: number | undefined,\n) {\n if (!start || end || !maximumDays) return undefined\n const reach = maximumDays - 1\n return (date: DateValue) => Math.abs(date.compare(start)) > reach\n}\n","<script setup lang=\"ts\">\n import { computed, shallowRef, watch } from 'vue'\n import {\n RangeCalendarCell,\n RangeCalendarCellTrigger,\n RangeCalendarGrid,\n RangeCalendarGridBody,\n RangeCalendarGridHead,\n RangeCalendarGridRow,\n RangeCalendarHeadCell,\n RangeCalendarNext,\n RangeCalendarPrev,\n RangeCalendarRoot,\n type DateRange,\n } from 'reka-ui'\n import { getLocalTimeZone, today, type DateValue } from '@internationalized/date'\n import { cn } from '../../lib/cn'\n import {\n formatDateRange,\n formatDateValue,\n parseDateRange,\n parseDateValue,\n type DateRangeValue,\n } from '../../lib/date'\n import { useUiLocale } from '../../locale'\n import CalendarHeader from '../calendar/CalendarHeader.vue'\n import CalendarLevels from '../calendar/CalendarLevels.vue'\n import { useCalendarLevels } from '../calendar/composables/useCalendarLevels'\n import { formatMonthHeading } from '../calendar/utils/format'\n import {\n calendarGrid,\n calendarHeadCell,\n calendarRoot,\n type CalendarVariants,\n } from '../calendar/calendar.variants'\n import { useRangeAnchor } from './composables/useRangeAnchor'\n import { rangeCalendarCell, rangeCalendarDay } from './range-calendar.variants'\n import { maximumDaysMatcher } from './utils/limit'\n\n defineOptions({ name: 'HnRangeCalendar' })\n\n const props = withDefaults(\n defineProps<{\n min?: string\n max?: string\n maximumDays?: number\n unavailable?: (date: string) => boolean\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6\n weekdayFormat?: 'narrow' | 'short'\n fixedWeeks?: boolean\n size?: CalendarVariants['size']\n autofocus?: boolean\n readonly?: boolean\n disabled?: boolean\n class?: string\n }>(),\n { weekdayFormat: 'narrow', fixedWeeks: true, size: 'md' },\n )\n\n const model = defineModel<DateRangeValue | null>({ default: null })\n const shown = defineModel<string>('placeholder')\n\n const t = useUiLocale()\n const root = shallowRef<{ $el: HTMLElement } | null>(null)\n\n const value = computed(() => parseDateRange(model.value))\n const placeholder = computed(() => parseDateValue(shown.value))\n const minValue = computed(() => parseDateValue(props.min))\n const maxValue = computed(() => parseDateValue(props.max))\n const weekStartsOn = computed(() => props.weekStartsOn ?? t.value.calendar.weekStartsOn)\n const unavailable = computed(() =>\n props.unavailable ? (date: DateValue) => props.unavailable!(formatDateValue(date)) : undefined,\n )\n const { anchor, onStartValue } = useRangeAnchor(computed(() => value.value.start))\n const limited = computed(() =>\n maximumDaysMatcher(anchor.value, value.value.end, props.maximumDays),\n )\n function isDateDisabled(date: DateValue) {\n return limited.value ? limited.value(date) : false\n }\n\n const { level, view, pickMonth, pickYear, followYear, back, onEntered } = useCalendarLevels(\n value.value.start ?? placeholder.value ?? today(getLocalTimeZone()),\n root,\n )\n watch(placeholder, next => {\n if (next && next.compare(view.value) !== 0) view.value = next\n })\n watch(view, next => {\n shown.value = formatDateValue(next)\n })\n\n const monthHeading = computed(() => formatMonthHeading(t.value.tag, view.value))\n\n function update(next: DateRange) {\n model.value = formatDateRange(next)\n }\n</script>\n\n<template>\n <RangeCalendarRoot\n ref=\"root\"\n v-slot=\"{ weekDays, grid }\"\n data-hn-range-calendar\n :data-level=\"level\"\n :model-value=\"value\"\n :placeholder=\"view\"\n :min-value=\"minValue\"\n :max-value=\"maxValue\"\n :is-date-disabled=\"isDateDisabled\"\n :is-date-unavailable=\"unavailable\"\n :week-starts-on=\"weekStartsOn\"\n :weekday-format=\"props.weekdayFormat\"\n :fixed-weeks=\"props.fixedWeeks\"\n :initial-focus=\"props.autofocus\"\n :locale=\"t.tag\"\n :calendar-label=\"t.calendar.label\"\n :disabled=\"props.disabled\"\n :readonly=\"props.readonly\"\n :class=\"cn(calendarRoot({ size: props.size }), props.class)\"\n @update:model-value=\"update\"\n @update:start-value=\"onStartValue\"\n @update:placeholder=\"view = $event\"\n >\n <CalendarLevels\n v-model:level=\"level\"\n :view=\"view\"\n :size=\"props.size\"\n :min-value=\"minValue\"\n :max-value=\"maxValue\"\n :disabled=\"props.disabled\"\n @pick-month=\"pickMonth\"\n @pick-year=\"pickYear\"\n @follow-year=\"followYear\"\n @back=\"back\"\n @entered=\"onEntered\"\n >\n <CalendarHeader\n :prev=\"RangeCalendarPrev\"\n :next=\"RangeCalendarNext\"\n :prev-label=\"t.calendar.prev\"\n :next-label=\"t.calendar.next\"\n :heading=\"monthHeading\"\n :pick-label=\"t.calendar.pickMonth\"\n :size=\"props.size\"\n :disabled=\"props.disabled\"\n @pick=\"level = 'month'\"\n />\n <RangeCalendarGrid\n v-for=\"month in grid\"\n :key=\"month.value.toString()\"\n :class=\"calendarGrid()\"\n >\n <RangeCalendarGridHead>\n <RangeCalendarGridRow>\n <RangeCalendarHeadCell\n v-for=\"day in weekDays\"\n :key=\"day\"\n :class=\"calendarHeadCell({ size: props.size })\"\n >\n {{ day }}\n </RangeCalendarHeadCell>\n </RangeCalendarGridRow>\n </RangeCalendarGridHead>\n <RangeCalendarGridBody>\n <RangeCalendarGridRow v-for=\"(week, index) in month.rows\" :key=\"index\">\n <RangeCalendarCell\n v-for=\"day in week\"\n :key=\"day.toString()\"\n :date=\"day\"\n :class=\"rangeCalendarCell()\"\n >\n <RangeCalendarCellTrigger\n :day=\"day\"\n :month=\"month.value\"\n :class=\"rangeCalendarDay()\"\n />\n </RangeCalendarCell>\n </RangeCalendarGridRow>\n </RangeCalendarGridBody>\n </RangeCalendarGrid>\n </CalendarLevels>\n </RangeCalendarRoot>\n</template>\n","<script setup lang=\"ts\">\n import { computed, shallowRef, watch } from 'vue'\n import {\n RangeCalendarCell,\n RangeCalendarCellTrigger,\n RangeCalendarGrid,\n RangeCalendarGridBody,\n RangeCalendarGridHead,\n RangeCalendarGridRow,\n RangeCalendarHeadCell,\n RangeCalendarNext,\n RangeCalendarPrev,\n RangeCalendarRoot,\n type DateRange,\n } from 'reka-ui'\n import { getLocalTimeZone, today, type DateValue } from '@internationalized/date'\n import { cn } from '../../lib/cn'\n import {\n formatDateRange,\n formatDateValue,\n parseDateRange,\n parseDateValue,\n type DateRangeValue,\n } from '../../lib/date'\n import { useUiLocale } from '../../locale'\n import CalendarHeader from '../calendar/CalendarHeader.vue'\n import CalendarLevels from '../calendar/CalendarLevels.vue'\n import { useCalendarLevels } from '../calendar/composables/useCalendarLevels'\n import { formatMonthHeading } from '../calendar/utils/format'\n import {\n calendarGrid,\n calendarHeadCell,\n calendarRoot,\n type CalendarVariants,\n } from '../calendar/calendar.variants'\n import { useRangeAnchor } from './composables/useRangeAnchor'\n import { rangeCalendarCell, rangeCalendarDay } from './range-calendar.variants'\n import { maximumDaysMatcher } from './utils/limit'\n\n defineOptions({ name: 'HnRangeCalendar' })\n\n const props = withDefaults(\n defineProps<{\n min?: string\n max?: string\n maximumDays?: number\n unavailable?: (date: string) => boolean\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6\n weekdayFormat?: 'narrow' | 'short'\n fixedWeeks?: boolean\n size?: CalendarVariants['size']\n autofocus?: boolean\n readonly?: boolean\n disabled?: boolean\n class?: string\n }>(),\n { weekdayFormat: 'narrow', fixedWeeks: true, size: 'md' },\n )\n\n const model = defineModel<DateRangeValue | null>({ default: null })\n const shown = defineModel<string>('placeholder')\n\n const t = useUiLocale()\n const root = shallowRef<{ $el: HTMLElement } | null>(null)\n\n const value = computed(() => parseDateRange(model.value))\n const placeholder = computed(() => parseDateValue(shown.value))\n const minValue = computed(() => parseDateValue(props.min))\n const maxValue = computed(() => parseDateValue(props.max))\n const weekStartsOn = computed(() => props.weekStartsOn ?? t.value.calendar.weekStartsOn)\n const unavailable = computed(() =>\n props.unavailable ? (date: DateValue) => props.unavailable!(formatDateValue(date)) : undefined,\n )\n const { anchor, onStartValue } = useRangeAnchor(computed(() => value.value.start))\n const limited = computed(() =>\n maximumDaysMatcher(anchor.value, value.value.end, props.maximumDays),\n )\n function isDateDisabled(date: DateValue) {\n return limited.value ? limited.value(date) : false\n }\n\n const { level, view, pickMonth, pickYear, followYear, back, onEntered } = useCalendarLevels(\n value.value.start ?? placeholder.value ?? today(getLocalTimeZone()),\n root,\n )\n watch(placeholder, next => {\n if (next && next.compare(view.value) !== 0) view.value = next\n })\n watch(view, next => {\n shown.value = formatDateValue(next)\n })\n\n const monthHeading = computed(() => formatMonthHeading(t.value.tag, view.value))\n\n function update(next: DateRange) {\n model.value = formatDateRange(next)\n }\n</script>\n\n<template>\n <RangeCalendarRoot\n ref=\"root\"\n v-slot=\"{ weekDays, grid }\"\n data-hn-range-calendar\n :data-level=\"level\"\n :model-value=\"value\"\n :placeholder=\"view\"\n :min-value=\"minValue\"\n :max-value=\"maxValue\"\n :is-date-disabled=\"isDateDisabled\"\n :is-date-unavailable=\"unavailable\"\n :week-starts-on=\"weekStartsOn\"\n :weekday-format=\"props.weekdayFormat\"\n :fixed-weeks=\"props.fixedWeeks\"\n :initial-focus=\"props.autofocus\"\n :locale=\"t.tag\"\n :calendar-label=\"t.calendar.label\"\n :disabled=\"props.disabled\"\n :readonly=\"props.readonly\"\n :class=\"cn(calendarRoot({ size: props.size }), props.class)\"\n @update:model-value=\"update\"\n @update:start-value=\"onStartValue\"\n @update:placeholder=\"view = $event\"\n >\n <CalendarLevels\n v-model:level=\"level\"\n :view=\"view\"\n :size=\"props.size\"\n :min-value=\"minValue\"\n :max-value=\"maxValue\"\n :disabled=\"props.disabled\"\n @pick-month=\"pickMonth\"\n @pick-year=\"pickYear\"\n @follow-year=\"followYear\"\n @back=\"back\"\n @entered=\"onEntered\"\n >\n <CalendarHeader\n :prev=\"RangeCalendarPrev\"\n :next=\"RangeCalendarNext\"\n :prev-label=\"t.calendar.prev\"\n :next-label=\"t.calendar.next\"\n :heading=\"monthHeading\"\n :pick-label=\"t.calendar.pickMonth\"\n :size=\"props.size\"\n :disabled=\"props.disabled\"\n @pick=\"level = 'month'\"\n />\n <RangeCalendarGrid\n v-for=\"month in grid\"\n :key=\"month.value.toString()\"\n :class=\"calendarGrid()\"\n >\n <RangeCalendarGridHead>\n <RangeCalendarGridRow>\n <RangeCalendarHeadCell\n v-for=\"day in weekDays\"\n :key=\"day\"\n :class=\"calendarHeadCell({ size: props.size })\"\n >\n {{ day }}\n </RangeCalendarHeadCell>\n </RangeCalendarGridRow>\n </RangeCalendarGridHead>\n <RangeCalendarGridBody>\n <RangeCalendarGridRow v-for=\"(week, index) in month.rows\" :key=\"index\">\n <RangeCalendarCell\n v-for=\"day in week\"\n :key=\"day.toString()\"\n :date=\"day\"\n :class=\"rangeCalendarCell()\"\n >\n <RangeCalendarCellTrigger\n :day=\"day\"\n :month=\"month.value\"\n :class=\"rangeCalendarDay()\"\n />\n </RangeCalendarCell>\n </RangeCalendarGridRow>\n </RangeCalendarGridBody>\n </RangeCalendarGrid>\n </CalendarLevels>\n </RangeCalendarRoot>\n</template>\n","<script setup lang=\"ts\">\n import { computed, shallowRef, useSlots } from 'vue'\n import {\n PopoverAnchor,\n PopoverContent,\n PopoverPortal,\n PopoverRoot,\n PopoverTrigger,\n } from 'reka-ui'\n import { CalendarRange } from '@lucide/vue'\n import { cn } from '../../lib/cn'\n import type { DateRangeValue } from '../../lib/date'\n import { useUiLocale } from '../../locale'\n import type { CalendarVariants } from '../calendar/calendar.variants'\n import Card from '../card/Card.vue'\n import DateRangeField from '../date-range-field/DateRangeField.vue'\n import { datePickerContent } from '../date-picker/date-picker.variants'\n import { useFieldControl } from '../form-field/context'\n import { injectInputGroup } from '../input-group/context'\n import InputGroupScope from '../input-group/InputGroupScope.vue'\n import InputAction from '../input/InputAction.vue'\n import { inputEmbedded, inputHost, type InputVariants } from '../input/input.variants'\n import RangeCalendar from '../range-calendar/RangeCalendar.vue'\n\n defineOptions({ name: 'HnDateRangePicker', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n placeholder?: string\n min?: string\n max?: string\n maximumDays?: number\n unavailable?: (date: string) => boolean\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6\n weekdayFormat?: 'narrow' | 'short'\n fixedWeeks?: boolean\n clearable?: boolean\n readonly?: boolean\n name?: string\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>(),\n { clearable: false, fixedWeeks: true },\n )\n const emit = defineEmits<{ clear: [] }>()\n\n const model = defineModel<DateRangeValue | null>({ default: null })\n const open = defineModel<boolean>('open', { default: false })\n\n const slots = useSlots()\n const t = useUiLocale()\n const outer = injectInputGroup()\n const host = shallowRef<HTMLElement | null>(null)\n\n const size = computed(() => (outer ? outer.size.value : props.size))\n const { invalid, disabled } = useFieldControl({\n invalid: () => props.invalid || !!outer?.invalid.value,\n disabled: () => props.disabled || !!outer?.disabled.value,\n })\n const calendarSize = computed<CalendarVariants['size']>(() => size.value ?? 'md')\n\n function pick(next: DateRangeValue | null) {\n model.value = next\n if (next?.start && next.end) open.value = false\n }\n</script>\n\n<template>\n <PopoverRoot v-model:open=\"open\" modal>\n <PopoverAnchor as-child>\n <div\n ref=\"host\"\n data-hn-date-range-picker\n :data-invalid=\"invalid ? '' : undefined\"\n :class=\"\n cn(\n outer ? inputEmbedded() : inputHost({ variant: props.variant, size: props.size }),\n props.class,\n )\n \"\n >\n <InputGroupScope :size=\"size\" :disabled=\"disabled\" :invalid=\"invalid\">\n <DateRangeField\n v-bind=\"$attrs\"\n :model-value=\"model\"\n :placeholder=\"props.placeholder\"\n :min=\"props.min\"\n :max=\"props.max\"\n :clearable=\"props.clearable\"\n :readonly=\"props.readonly\"\n :name=\"props.name\"\n @update:model-value=\"model = $event\"\n @clear=\"emit('clear')\"\n >\n <template v-if=\"slots.leading\" #leading>\n <slot name=\"leading\" />\n </template>\n </DateRangeField>\n </InputGroupScope>\n <PopoverTrigger as-child>\n <InputAction :label=\"t.datePicker.open\" :disabled=\"disabled\">\n <CalendarRange />\n </InputAction>\n </PopoverTrigger>\n </div>\n </PopoverAnchor>\n <PopoverPortal>\n <PopoverContent\n as-child\n side=\"bottom\"\n align=\"start\"\n :side-offset=\"8\"\n @open-auto-focus.prevent\n >\n <Card :padded=\"false\" :class=\"datePickerContent()\">\n <RangeCalendar\n :model-value=\"model\"\n :placeholder=\"props.placeholder\"\n :min=\"props.min\"\n :max=\"props.max\"\n :maximum-days=\"props.maximumDays\"\n :unavailable=\"props.unavailable\"\n :week-starts-on=\"props.weekStartsOn\"\n :weekday-format=\"props.weekdayFormat\"\n :fixed-weeks=\"props.fixedWeeks\"\n :size=\"calendarSize\"\n :readonly=\"props.readonly\"\n autofocus\n @update:model-value=\"pick\"\n />\n </Card>\n </PopoverContent>\n </PopoverPortal>\n </PopoverRoot>\n</template>\n","<script setup lang=\"ts\">\n import { computed, shallowRef, useSlots } from 'vue'\n import {\n PopoverAnchor,\n PopoverContent,\n PopoverPortal,\n PopoverRoot,\n PopoverTrigger,\n } from 'reka-ui'\n import { CalendarRange } from '@lucide/vue'\n import { cn } from '../../lib/cn'\n import type { DateRangeValue } from '../../lib/date'\n import { useUiLocale } from '../../locale'\n import type { CalendarVariants } from '../calendar/calendar.variants'\n import Card from '../card/Card.vue'\n import DateRangeField from '../date-range-field/DateRangeField.vue'\n import { datePickerContent } from '../date-picker/date-picker.variants'\n import { useFieldControl } from '../form-field/context'\n import { injectInputGroup } from '../input-group/context'\n import InputGroupScope from '../input-group/InputGroupScope.vue'\n import InputAction from '../input/InputAction.vue'\n import { inputEmbedded, inputHost, type InputVariants } from '../input/input.variants'\n import RangeCalendar from '../range-calendar/RangeCalendar.vue'\n\n defineOptions({ name: 'HnDateRangePicker', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n placeholder?: string\n min?: string\n max?: string\n maximumDays?: number\n unavailable?: (date: string) => boolean\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6\n weekdayFormat?: 'narrow' | 'short'\n fixedWeeks?: boolean\n clearable?: boolean\n readonly?: boolean\n name?: string\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>(),\n { clearable: false, fixedWeeks: true },\n )\n const emit = defineEmits<{ clear: [] }>()\n\n const model = defineModel<DateRangeValue | null>({ default: null })\n const open = defineModel<boolean>('open', { default: false })\n\n const slots = useSlots()\n const t = useUiLocale()\n const outer = injectInputGroup()\n const host = shallowRef<HTMLElement | null>(null)\n\n const size = computed(() => (outer ? outer.size.value : props.size))\n const { invalid, disabled } = useFieldControl({\n invalid: () => props.invalid || !!outer?.invalid.value,\n disabled: () => props.disabled || !!outer?.disabled.value,\n })\n const calendarSize = computed<CalendarVariants['size']>(() => size.value ?? 'md')\n\n function pick(next: DateRangeValue | null) {\n model.value = next\n if (next?.start && next.end) open.value = false\n }\n</script>\n\n<template>\n <PopoverRoot v-model:open=\"open\" modal>\n <PopoverAnchor as-child>\n <div\n ref=\"host\"\n data-hn-date-range-picker\n :data-invalid=\"invalid ? '' : undefined\"\n :class=\"\n cn(\n outer ? inputEmbedded() : inputHost({ variant: props.variant, size: props.size }),\n props.class,\n )\n \"\n >\n <InputGroupScope :size=\"size\" :disabled=\"disabled\" :invalid=\"invalid\">\n <DateRangeField\n v-bind=\"$attrs\"\n :model-value=\"model\"\n :placeholder=\"props.placeholder\"\n :min=\"props.min\"\n :max=\"props.max\"\n :clearable=\"props.clearable\"\n :readonly=\"props.readonly\"\n :name=\"props.name\"\n @update:model-value=\"model = $event\"\n @clear=\"emit('clear')\"\n >\n <template v-if=\"slots.leading\" #leading>\n <slot name=\"leading\" />\n </template>\n </DateRangeField>\n </InputGroupScope>\n <PopoverTrigger as-child>\n <InputAction :label=\"t.datePicker.open\" :disabled=\"disabled\">\n <CalendarRange />\n </InputAction>\n </PopoverTrigger>\n </div>\n </PopoverAnchor>\n <PopoverPortal>\n <PopoverContent\n as-child\n side=\"bottom\"\n align=\"start\"\n :side-offset=\"8\"\n @open-auto-focus.prevent\n >\n <Card :padded=\"false\" :class=\"datePickerContent()\">\n <RangeCalendar\n :model-value=\"model\"\n :placeholder=\"props.placeholder\"\n :min=\"props.min\"\n :max=\"props.max\"\n :maximum-days=\"props.maximumDays\"\n :unavailable=\"props.unavailable\"\n :week-starts-on=\"props.weekStartsOn\"\n :weekday-format=\"props.weekdayFormat\"\n :fixed-weeks=\"props.fixedWeeks\"\n :size=\"calendarSize\"\n :readonly=\"props.readonly\"\n autofocus\n @update:model-value=\"pick\"\n />\n </Card>\n </PopoverContent>\n </PopoverPortal>\n </PopoverRoot>\n</template>\n","<script setup lang=\"ts\">\n import { computed, shallowRef, useSlots } from 'vue'\n import { TimeFieldInput, TimeFieldRoot, type TimeValue } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { formatTimeValue, parseTimeValue, type TimeGranularity } from '../../lib/date'\n import { useUiLocale } from '../../locale'\n import { X } from '@lucide/vue'\n import InputAction from '../input/InputAction.vue'\n import { useFieldControl } from '../form-field/context'\n import { injectInputGroup } from '../input-group/context'\n import {\n inputActionSlot,\n inputAdornment,\n inputEmbedded,\n inputHost,\n type InputVariants,\n } from '../input/input.variants'\n import { useSegmentFocus } from '../date-field/composables/useSegmentFocus'\n import {\n dateFieldControl,\n dateFieldHost,\n dateFieldSegment,\n } from '../date-field/date-field.variants'\n\n defineOptions({ name: 'HnTimeField', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n placeholder?: string\n min?: string\n max?: string\n granularity?: TimeGranularity\n hourCycle?: 12 | 24\n minuteStep?: number\n clearable?: boolean\n readonly?: boolean\n name?: string\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>(),\n { granularity: 'minute', clearable: false },\n )\n const emit = defineEmits<{ clear: [] }>()\n\n const model = defineModel<string | null>({ default: null })\n\n const slots = useSlots()\n const t = useUiLocale()\n const group = injectInputGroup()\n const host = shallowRef<HTMLElement | null>(null)\n\n const { labelledBy, invalid, disabled, describedBy } = useFieldControl({\n invalid: () => props.invalid || !!group?.invalid.value || outOfRange.value,\n disabled: () => props.disabled || !!group?.disabled.value,\n })\n\n const value = computed(() => parseTimeValue(model.value))\n const placeholder = computed(() => parseTimeValue(props.placeholder))\n const minValue = computed(() => parseTimeValue(props.min))\n const maxValue = computed(() => parseTimeValue(props.max))\n const step = computed(() => (props.minuteStep ? { minute: props.minuteStep } : undefined))\n const outOfRange = computed(\n () =>\n !!value.value &&\n ((!!minValue.value && value.value.compare(minValue.value) < 0) ||\n (!!maxValue.value && value.value.compare(maxValue.value) > 0)),\n )\n const clearing = computed(() => props.clearable && model.value != null && !disabled.value)\n\n function segmentLabel(part: string) {\n return (t.value.dateField as Record<string, string | undefined>)[part]\n }\n\n function update(next: TimeValue | undefined) {\n model.value = next ? formatTimeValue(next, props.granularity) : null\n }\n\n const { focus, onHostClick } = useSegmentFocus(host)\n\n function clear() {\n if (model.value == null) return\n model.value = null\n emit('clear')\n focus()\n }\n\n defineExpose({ clear, focus })\n</script>\n\n<template>\n <div\n ref=\"host\"\n data-hn-time-field\n :data-invalid=\"invalid ? '' : undefined\"\n :data-disabled=\"disabled ? '' : undefined\"\n :class=\"\n cn(\n group ? inputEmbedded() : inputHost({ variant: props.variant, size: props.size }),\n dateFieldHost(),\n props.class,\n )\n \"\n @click=\"onHostClick\"\n >\n <span v-if=\"slots.leading\" :class=\"inputAdornment()\">\n <slot name=\"leading\" />\n </span>\n <TimeFieldRoot\n v-slot=\"{ segments: parts }\"\n v-bind=\"$attrs\"\n :aria-labelledby=\"labelledBy\"\n :aria-describedby=\"describedBy\"\n :model-value=\"value\"\n :placeholder=\"placeholder\"\n :min-value=\"minValue\"\n :max-value=\"maxValue\"\n :granularity=\"props.granularity\"\n :hour-cycle=\"props.hourCycle\"\n :step=\"step\"\n :step-snapping=\"!!step\"\n hide-time-zone\n :locale=\"t.tag\"\n :disabled=\"disabled\"\n :readonly=\"props.readonly\"\n :name=\"props.name\"\n :aria-invalid=\"invalid || undefined\"\n :class=\"\n dateFieldControl({ leading: !!slots.leading, trailing: clearing || !!slots.trailing })\n \"\n @update:model-value=\"update\"\n >\n <TimeFieldInput\n v-for=\"part in parts\"\n :key=\"part.part\"\n :part=\"part.part\"\n data-hn-segment\n :aria-label=\"part.part === 'literal' ? undefined : segmentLabel(part.part)\"\n :class=\"dateFieldSegment({ part: part.part === 'literal' ? 'literal' : 'editable' })\"\n >\n {{ part.value }}\n </TimeFieldInput>\n </TimeFieldRoot>\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-90 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-90 opacity-0\"\n >\n <span v-if=\"clearing\" :class=\"inputActionSlot()\">\n <InputAction :label=\"t.common.clear\" @click=\"clear\">\n <X />\n </InputAction>\n </span>\n </Transition>\n <span v-if=\"slots.trailing\" :class=\"inputAdornment()\">\n <slot name=\"trailing\" />\n </span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed, shallowRef, useSlots } from 'vue'\n import { TimeFieldInput, TimeFieldRoot, type TimeValue } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { formatTimeValue, parseTimeValue, type TimeGranularity } from '../../lib/date'\n import { useUiLocale } from '../../locale'\n import { X } from '@lucide/vue'\n import InputAction from '../input/InputAction.vue'\n import { useFieldControl } from '../form-field/context'\n import { injectInputGroup } from '../input-group/context'\n import {\n inputActionSlot,\n inputAdornment,\n inputEmbedded,\n inputHost,\n type InputVariants,\n } from '../input/input.variants'\n import { useSegmentFocus } from '../date-field/composables/useSegmentFocus'\n import {\n dateFieldControl,\n dateFieldHost,\n dateFieldSegment,\n } from '../date-field/date-field.variants'\n\n defineOptions({ name: 'HnTimeField', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n placeholder?: string\n min?: string\n max?: string\n granularity?: TimeGranularity\n hourCycle?: 12 | 24\n minuteStep?: number\n clearable?: boolean\n readonly?: boolean\n name?: string\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>(),\n { granularity: 'minute', clearable: false },\n )\n const emit = defineEmits<{ clear: [] }>()\n\n const model = defineModel<string | null>({ default: null })\n\n const slots = useSlots()\n const t = useUiLocale()\n const group = injectInputGroup()\n const host = shallowRef<HTMLElement | null>(null)\n\n const { labelledBy, invalid, disabled, describedBy } = useFieldControl({\n invalid: () => props.invalid || !!group?.invalid.value || outOfRange.value,\n disabled: () => props.disabled || !!group?.disabled.value,\n })\n\n const value = computed(() => parseTimeValue(model.value))\n const placeholder = computed(() => parseTimeValue(props.placeholder))\n const minValue = computed(() => parseTimeValue(props.min))\n const maxValue = computed(() => parseTimeValue(props.max))\n const step = computed(() => (props.minuteStep ? { minute: props.minuteStep } : undefined))\n const outOfRange = computed(\n () =>\n !!value.value &&\n ((!!minValue.value && value.value.compare(minValue.value) < 0) ||\n (!!maxValue.value && value.value.compare(maxValue.value) > 0)),\n )\n const clearing = computed(() => props.clearable && model.value != null && !disabled.value)\n\n function segmentLabel(part: string) {\n return (t.value.dateField as Record<string, string | undefined>)[part]\n }\n\n function update(next: TimeValue | undefined) {\n model.value = next ? formatTimeValue(next, props.granularity) : null\n }\n\n const { focus, onHostClick } = useSegmentFocus(host)\n\n function clear() {\n if (model.value == null) return\n model.value = null\n emit('clear')\n focus()\n }\n\n defineExpose({ clear, focus })\n</script>\n\n<template>\n <div\n ref=\"host\"\n data-hn-time-field\n :data-invalid=\"invalid ? '' : undefined\"\n :data-disabled=\"disabled ? '' : undefined\"\n :class=\"\n cn(\n group ? inputEmbedded() : inputHost({ variant: props.variant, size: props.size }),\n dateFieldHost(),\n props.class,\n )\n \"\n @click=\"onHostClick\"\n >\n <span v-if=\"slots.leading\" :class=\"inputAdornment()\">\n <slot name=\"leading\" />\n </span>\n <TimeFieldRoot\n v-slot=\"{ segments: parts }\"\n v-bind=\"$attrs\"\n :aria-labelledby=\"labelledBy\"\n :aria-describedby=\"describedBy\"\n :model-value=\"value\"\n :placeholder=\"placeholder\"\n :min-value=\"minValue\"\n :max-value=\"maxValue\"\n :granularity=\"props.granularity\"\n :hour-cycle=\"props.hourCycle\"\n :step=\"step\"\n :step-snapping=\"!!step\"\n hide-time-zone\n :locale=\"t.tag\"\n :disabled=\"disabled\"\n :readonly=\"props.readonly\"\n :name=\"props.name\"\n :aria-invalid=\"invalid || undefined\"\n :class=\"\n dateFieldControl({ leading: !!slots.leading, trailing: clearing || !!slots.trailing })\n \"\n @update:model-value=\"update\"\n >\n <TimeFieldInput\n v-for=\"part in parts\"\n :key=\"part.part\"\n :part=\"part.part\"\n data-hn-segment\n :aria-label=\"part.part === 'literal' ? undefined : segmentLabel(part.part)\"\n :class=\"dateFieldSegment({ part: part.part === 'literal' ? 'literal' : 'editable' })\"\n >\n {{ part.value }}\n </TimeFieldInput>\n </TimeFieldRoot>\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-90 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-90 opacity-0\"\n >\n <span v-if=\"clearing\" :class=\"inputActionSlot()\">\n <InputAction :label=\"t.common.clear\" @click=\"clear\">\n <X />\n </InputAction>\n </span>\n </Transition>\n <span v-if=\"slots.trailing\" :class=\"inputAdornment()\">\n <slot name=\"trailing\" />\n </span>\n </div>\n</template>\n","import { tv } from '../../lib/tv'\n\nexport const dateTimePickerFooter = tv({\n base: 'mt-2 flex items-center justify-between gap-2',\n})\n","<script setup lang=\"ts\">\n import { computed, shallowRef, useSlots } from 'vue'\n import {\n PopoverAnchor,\n PopoverContent,\n PopoverPortal,\n PopoverRoot,\n PopoverTrigger,\n } from 'reka-ui'\n import { CalendarClock } from '@lucide/vue'\n import { cn } from '../../lib/cn'\n import { joinDateTime, splitDateTime, type TimeGranularity } from '../../lib/date'\n import { useUiLocale } from '../../locale'\n import Button from '../button/Button.vue'\n import Calendar from '../calendar/Calendar.vue'\n import type { CalendarVariants } from '../calendar/calendar.variants'\n import Card from '../card/Card.vue'\n import DateField from '../date-field/DateField.vue'\n import { datePickerContent } from '../date-picker/date-picker.variants'\n import { useFieldControl } from '../form-field/context'\n import { injectInputGroup } from '../input-group/context'\n import InputGroupScope from '../input-group/InputGroupScope.vue'\n import InputAction from '../input/InputAction.vue'\n import { inputEmbedded, inputHost, type InputVariants } from '../input/input.variants'\n import TimeField from '../time-field/TimeField.vue'\n import { dateTimePickerFooter } from './date-time-picker.variants'\n\n defineOptions({ name: 'HnDateTimePicker', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n placeholder?: string\n min?: string\n max?: string\n granularity?: Exclude<TimeGranularity, 'hour'>\n hourCycle?: 12 | 24\n minuteStep?: number\n unavailable?: (date: string) => boolean\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6\n weekdayFormat?: 'narrow' | 'short'\n fixedWeeks?: boolean\n clearable?: boolean\n readonly?: boolean\n name?: string\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>(),\n { granularity: 'minute', clearable: false, fixedWeeks: true },\n )\n const emit = defineEmits<{ clear: [] }>()\n\n const model = defineModel<string | null>({ default: null })\n const open = defineModel<boolean>('open', { default: false })\n\n const slots = useSlots()\n const t = useUiLocale()\n const outer = injectInputGroup()\n const host = shallowRef<HTMLElement | null>(null)\n\n const size = computed(() => (outer ? outer.size.value : props.size))\n const { invalid, disabled } = useFieldControl({\n invalid: () => props.invalid || !!outer?.invalid.value,\n disabled: () => props.disabled || !!outer?.disabled.value,\n })\n const calendarSize = computed<CalendarVariants['size']>(() => size.value ?? 'md')\n\n const parts = computed(() => splitDateTime(model.value))\n const fallbackTime = computed(\n () =>\n splitDateTime(props.placeholder).time ??\n (props.granularity === 'second' ? '00:00:00' : '00:00'),\n )\n const minDate = computed(() => splitDateTime(props.min).date ?? undefined)\n const maxDate = computed(() => splitDateTime(props.max).date ?? undefined)\n\n function pickDate(date: string | null) {\n model.value = joinDateTime(date, parts.value.time ?? fallbackTime.value)\n }\n\n function pickTime(time: string | null) {\n model.value = joinDateTime(parts.value.date, time)\n }\n\n function done() {\n open.value = false\n }\n</script>\n\n<template>\n <PopoverRoot v-model:open=\"open\" modal>\n <PopoverAnchor as-child>\n <div\n ref=\"host\"\n data-hn-date-time-picker\n :data-invalid=\"invalid ? '' : undefined\"\n :class=\"\n cn(\n outer ? inputEmbedded() : inputHost({ variant: props.variant, size: props.size }),\n props.class,\n )\n \"\n >\n <InputGroupScope :size=\"size\" :disabled=\"disabled\" :invalid=\"invalid\">\n <DateField\n v-bind=\"$attrs\"\n :model-value=\"model\"\n :placeholder=\"props.placeholder\"\n :min=\"props.min\"\n :max=\"props.max\"\n :granularity=\"props.granularity\"\n :hour-cycle=\"props.hourCycle\"\n :clearable=\"props.clearable\"\n :readonly=\"props.readonly\"\n :name=\"props.name\"\n @update:model-value=\"model = $event\"\n @clear=\"emit('clear')\"\n >\n <template v-if=\"slots.leading\" #leading>\n <slot name=\"leading\" />\n </template>\n </DateField>\n </InputGroupScope>\n <PopoverTrigger as-child>\n <InputAction :label=\"t.datePicker.open\" :disabled=\"disabled\">\n <CalendarClock />\n </InputAction>\n </PopoverTrigger>\n </div>\n </PopoverAnchor>\n <PopoverPortal>\n <PopoverContent\n as-child\n side=\"bottom\"\n align=\"start\"\n :side-offset=\"8\"\n @open-auto-focus.prevent\n >\n <Card :padded=\"false\" :class=\"datePickerContent()\">\n <Calendar\n :model-value=\"parts.date\"\n :placeholder=\"splitDateTime(props.placeholder).date ?? undefined\"\n :min=\"minDate\"\n :max=\"maxDate\"\n :unavailable=\"props.unavailable\"\n :week-starts-on=\"props.weekStartsOn\"\n :weekday-format=\"props.weekdayFormat\"\n :fixed-weeks=\"props.fixedWeeks\"\n :size=\"calendarSize\"\n :readonly=\"props.readonly\"\n autofocus\n @update:model-value=\"pickDate\"\n />\n <div :class=\"dateTimePickerFooter()\">\n <TimeField\n :model-value=\"parts.time\"\n :placeholder=\"fallbackTime\"\n :granularity=\"props.granularity\"\n :hour-cycle=\"props.hourCycle\"\n :minute-step=\"props.minuteStep\"\n :size=\"calendarSize\"\n :readonly=\"props.readonly\"\n :aria-label=\"t.dateTimePicker.time\"\n @update:model-value=\"pickTime\"\n />\n <Button :size=\"calendarSize\" @click=\"done\">{{ t.common.confirm }}</Button>\n </div>\n </Card>\n </PopoverContent>\n </PopoverPortal>\n </PopoverRoot>\n</template>\n","<script setup lang=\"ts\">\n import { computed, shallowRef, useSlots } from 'vue'\n import {\n PopoverAnchor,\n PopoverContent,\n PopoverPortal,\n PopoverRoot,\n PopoverTrigger,\n } from 'reka-ui'\n import { CalendarClock } from '@lucide/vue'\n import { cn } from '../../lib/cn'\n import { joinDateTime, splitDateTime, type TimeGranularity } from '../../lib/date'\n import { useUiLocale } from '../../locale'\n import Button from '../button/Button.vue'\n import Calendar from '../calendar/Calendar.vue'\n import type { CalendarVariants } from '../calendar/calendar.variants'\n import Card from '../card/Card.vue'\n import DateField from '../date-field/DateField.vue'\n import { datePickerContent } from '../date-picker/date-picker.variants'\n import { useFieldControl } from '../form-field/context'\n import { injectInputGroup } from '../input-group/context'\n import InputGroupScope from '../input-group/InputGroupScope.vue'\n import InputAction from '../input/InputAction.vue'\n import { inputEmbedded, inputHost, type InputVariants } from '../input/input.variants'\n import TimeField from '../time-field/TimeField.vue'\n import { dateTimePickerFooter } from './date-time-picker.variants'\n\n defineOptions({ name: 'HnDateTimePicker', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n placeholder?: string\n min?: string\n max?: string\n granularity?: Exclude<TimeGranularity, 'hour'>\n hourCycle?: 12 | 24\n minuteStep?: number\n unavailable?: (date: string) => boolean\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6\n weekdayFormat?: 'narrow' | 'short'\n fixedWeeks?: boolean\n clearable?: boolean\n readonly?: boolean\n name?: string\n variant?: InputVariants['variant']\n size?: InputVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>(),\n { granularity: 'minute', clearable: false, fixedWeeks: true },\n )\n const emit = defineEmits<{ clear: [] }>()\n\n const model = defineModel<string | null>({ default: null })\n const open = defineModel<boolean>('open', { default: false })\n\n const slots = useSlots()\n const t = useUiLocale()\n const outer = injectInputGroup()\n const host = shallowRef<HTMLElement | null>(null)\n\n const size = computed(() => (outer ? outer.size.value : props.size))\n const { invalid, disabled } = useFieldControl({\n invalid: () => props.invalid || !!outer?.invalid.value,\n disabled: () => props.disabled || !!outer?.disabled.value,\n })\n const calendarSize = computed<CalendarVariants['size']>(() => size.value ?? 'md')\n\n const parts = computed(() => splitDateTime(model.value))\n const fallbackTime = computed(\n () =>\n splitDateTime(props.placeholder).time ??\n (props.granularity === 'second' ? '00:00:00' : '00:00'),\n )\n const minDate = computed(() => splitDateTime(props.min).date ?? undefined)\n const maxDate = computed(() => splitDateTime(props.max).date ?? undefined)\n\n function pickDate(date: string | null) {\n model.value = joinDateTime(date, parts.value.time ?? fallbackTime.value)\n }\n\n function pickTime(time: string | null) {\n model.value = joinDateTime(parts.value.date, time)\n }\n\n function done() {\n open.value = false\n }\n</script>\n\n<template>\n <PopoverRoot v-model:open=\"open\" modal>\n <PopoverAnchor as-child>\n <div\n ref=\"host\"\n data-hn-date-time-picker\n :data-invalid=\"invalid ? '' : undefined\"\n :class=\"\n cn(\n outer ? inputEmbedded() : inputHost({ variant: props.variant, size: props.size }),\n props.class,\n )\n \"\n >\n <InputGroupScope :size=\"size\" :disabled=\"disabled\" :invalid=\"invalid\">\n <DateField\n v-bind=\"$attrs\"\n :model-value=\"model\"\n :placeholder=\"props.placeholder\"\n :min=\"props.min\"\n :max=\"props.max\"\n :granularity=\"props.granularity\"\n :hour-cycle=\"props.hourCycle\"\n :clearable=\"props.clearable\"\n :readonly=\"props.readonly\"\n :name=\"props.name\"\n @update:model-value=\"model = $event\"\n @clear=\"emit('clear')\"\n >\n <template v-if=\"slots.leading\" #leading>\n <slot name=\"leading\" />\n </template>\n </DateField>\n </InputGroupScope>\n <PopoverTrigger as-child>\n <InputAction :label=\"t.datePicker.open\" :disabled=\"disabled\">\n <CalendarClock />\n </InputAction>\n </PopoverTrigger>\n </div>\n </PopoverAnchor>\n <PopoverPortal>\n <PopoverContent\n as-child\n side=\"bottom\"\n align=\"start\"\n :side-offset=\"8\"\n @open-auto-focus.prevent\n >\n <Card :padded=\"false\" :class=\"datePickerContent()\">\n <Calendar\n :model-value=\"parts.date\"\n :placeholder=\"splitDateTime(props.placeholder).date ?? undefined\"\n :min=\"minDate\"\n :max=\"maxDate\"\n :unavailable=\"props.unavailable\"\n :week-starts-on=\"props.weekStartsOn\"\n :weekday-format=\"props.weekdayFormat\"\n :fixed-weeks=\"props.fixedWeeks\"\n :size=\"calendarSize\"\n :readonly=\"props.readonly\"\n autofocus\n @update:model-value=\"pickDate\"\n />\n <div :class=\"dateTimePickerFooter()\">\n <TimeField\n :model-value=\"parts.time\"\n :placeholder=\"fallbackTime\"\n :granularity=\"props.granularity\"\n :hour-cycle=\"props.hourCycle\"\n :minute-step=\"props.minuteStep\"\n :size=\"calendarSize\"\n :readonly=\"props.readonly\"\n :aria-label=\"t.dateTimePicker.time\"\n @update:model-value=\"pickTime\"\n />\n <Button :size=\"calendarSize\" @click=\"done\">{{ t.common.confirm }}</Button>\n </div>\n </Card>\n </PopoverContent>\n </PopoverPortal>\n </PopoverRoot>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const ratingRoot = tv({\n base: 'inline-flex items-center gap-0.5 data-disabled:pointer-events-none data-disabled:opacity-50',\n variants: {\n size: {\n sm: '[--hn-rating-size:--spacing(4)]',\n md: '[--hn-rating-size:--spacing(5)]',\n lg: '[--hn-rating-size:--spacing(6)]',\n },\n },\n defaultVariants: { size: 'md' },\n})\n\nexport const ratingItem = tv({\n base: [\n 'relative inline-flex size-[var(--hn-rating-size)] shrink-0 rounded-xs',\n 'has-[:focus-visible]:[outline:var(--hn-focus-ring-width)_solid_var(--hn-focus-ring)] has-[:focus-visible]:[outline-offset:var(--hn-focus-ring-offset)]',\n ],\n})\n\nexport const ratingStep = tv({\n base: [\n 'group/hn-rating-step absolute inset-y-0 start-0 cursor-pointer overflow-hidden outline-none',\n '[width:var(--reka-rating-item-step-width)] [opacity:var(--reka-rating-item-step-opacity)] [z-index:var(--reka-rating-item-step-z-index)]',\n 'disabled:cursor-not-allowed',\n ],\n})\n\nexport const ratingStar = tv({\n base: 'text-line-strong size-[var(--hn-rating-size)] shrink-0 fill-transparent transition-[color,fill] duration-(--hn-duration-fast) ease-(--hn-ease-enter)',\n variants: {\n active: {\n true: 'text-warning fill-current',\n false:\n 'group-data-[state=active]/hn-rating-step:text-warning group-data-[state=active]/hn-rating-step:fill-current',\n },\n },\n defaultVariants: { active: false },\n})\n\nexport const ratingFill = tv({\n base: 'absolute inset-y-0 start-0 overflow-hidden',\n})\n\nexport type RatingVariants = VariantProps<typeof ratingRoot>\n","export function starFill(value: number, index: number) {\n const portion = Math.min(Math.max(value - (index - 1), 0), 1)\n return `${Math.round(portion * 1000) / 10}%`\n}\n","<script setup lang=\"ts\">\n import { RatingItem, RatingItemIndicator, RatingRoot } from 'reka-ui'\n import { Star } from '@lucide/vue'\n import { cn } from '../../lib/cn'\n import { useFieldControl } from '../form-field/context'\n import { useUiLocale } from '../../locale'\n import {\n ratingFill,\n ratingItem,\n ratingRoot,\n ratingStar,\n ratingStep,\n type RatingVariants,\n } from './rating.variants'\n import { starFill } from './utils/fill'\n\n defineOptions({ name: 'HnRating', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n max?: number\n step?: 1 | 0.5\n clearable?: boolean\n readonly?: boolean\n name?: string\n size?: RatingVariants['size']\n disabled?: boolean\n class?: string\n }>(),\n { max: 5, step: 1, clearable: true },\n )\n\n const model = defineModel<number>({ default: 0 })\n\n const t = useUiLocale()\n\n const { labelledBy, invalid, disabled, describedBy } = useFieldControl({\n disabled: () => props.disabled,\n })\n</script>\n\n<template>\n <span\n v-if=\"props.readonly\"\n v-bind=\"$attrs\"\n data-hn-rating\n data-readonly\n role=\"img\"\n :aria-label=\"t.rating.label(model, props.max)\"\n :class=\"cn(ratingRoot({ size: props.size }), props.class)\"\n >\n <span v-for=\"index in props.max\" :key=\"index\" :class=\"ratingItem()\">\n <Star :class=\"ratingStar()\" />\n <span :class=\"ratingFill()\" :style=\"{ width: starFill(model, index) }\">\n <Star :class=\"ratingStar({ active: true })\" />\n </span>\n </span>\n </span>\n <RatingRoot\n v-else\n v-slot=\"{ items }\"\n v-bind=\"$attrs\"\n data-hn-rating\n :data-disabled=\"disabled ? '' : undefined\"\n :data-invalid=\"invalid ? '' : undefined\"\n :aria-labelledby=\"labelledBy\"\n :aria-describedby=\"describedBy\"\n :aria-invalid=\"invalid || undefined\"\n :model-value=\"model\"\n :length=\"props.max\"\n :step=\"props.step\"\n :clearable=\"props.clearable\"\n hoverable\n :disabled=\"disabled\"\n :name=\"props.name\"\n :class=\"cn(ratingRoot({ size: props.size }), props.class)\"\n @update:model-value=\"model = $event\"\n >\n <RatingItem\n v-for=\"item in items\"\n :key=\"item\"\n v-slot=\"{ steps }\"\n :item=\"item\"\n :class=\"ratingItem()\"\n >\n <RatingItemIndicator\n v-for=\"step in steps\"\n :key=\"step\"\n :step=\"step\"\n :aria-label=\"t.rating.star(step)\"\n :class=\"ratingStep()\"\n >\n <Star :class=\"ratingStar()\" />\n </RatingItemIndicator>\n </RatingItem>\n </RatingRoot>\n</template>\n","<script setup lang=\"ts\">\n import { RatingItem, RatingItemIndicator, RatingRoot } from 'reka-ui'\n import { Star } from '@lucide/vue'\n import { cn } from '../../lib/cn'\n import { useFieldControl } from '../form-field/context'\n import { useUiLocale } from '../../locale'\n import {\n ratingFill,\n ratingItem,\n ratingRoot,\n ratingStar,\n ratingStep,\n type RatingVariants,\n } from './rating.variants'\n import { starFill } from './utils/fill'\n\n defineOptions({ name: 'HnRating', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n max?: number\n step?: 1 | 0.5\n clearable?: boolean\n readonly?: boolean\n name?: string\n size?: RatingVariants['size']\n disabled?: boolean\n class?: string\n }>(),\n { max: 5, step: 1, clearable: true },\n )\n\n const model = defineModel<number>({ default: 0 })\n\n const t = useUiLocale()\n\n const { labelledBy, invalid, disabled, describedBy } = useFieldControl({\n disabled: () => props.disabled,\n })\n</script>\n\n<template>\n <span\n v-if=\"props.readonly\"\n v-bind=\"$attrs\"\n data-hn-rating\n data-readonly\n role=\"img\"\n :aria-label=\"t.rating.label(model, props.max)\"\n :class=\"cn(ratingRoot({ size: props.size }), props.class)\"\n >\n <span v-for=\"index in props.max\" :key=\"index\" :class=\"ratingItem()\">\n <Star :class=\"ratingStar()\" />\n <span :class=\"ratingFill()\" :style=\"{ width: starFill(model, index) }\">\n <Star :class=\"ratingStar({ active: true })\" />\n </span>\n </span>\n </span>\n <RatingRoot\n v-else\n v-slot=\"{ items }\"\n v-bind=\"$attrs\"\n data-hn-rating\n :data-disabled=\"disabled ? '' : undefined\"\n :data-invalid=\"invalid ? '' : undefined\"\n :aria-labelledby=\"labelledBy\"\n :aria-describedby=\"describedBy\"\n :aria-invalid=\"invalid || undefined\"\n :model-value=\"model\"\n :length=\"props.max\"\n :step=\"props.step\"\n :clearable=\"props.clearable\"\n hoverable\n :disabled=\"disabled\"\n :name=\"props.name\"\n :class=\"cn(ratingRoot({ size: props.size }), props.class)\"\n @update:model-value=\"model = $event\"\n >\n <RatingItem\n v-for=\"item in items\"\n :key=\"item\"\n v-slot=\"{ steps }\"\n :item=\"item\"\n :class=\"ratingItem()\"\n >\n <RatingItemIndicator\n v-for=\"step in steps\"\n :key=\"step\"\n :step=\"step\"\n :aria-label=\"t.rating.star(step)\"\n :class=\"ratingStep()\"\n >\n <Star :class=\"ratingStar()\" />\n </RatingItemIndicator>\n </RatingItem>\n </RatingRoot>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const text = tv({\n variants: {\n size: {\n xs: 'text-xs',\n sm: 'text-sm',\n base: 'text-base',\n md: 'text-md',\n lg: 'text-lg',\n xl: 'text-xl',\n '2xl': 'text-2xl',\n },\n tone: {\n default: 'text-fg',\n muted: 'text-muted',\n faint: 'text-faint',\n disabled: 'text-disabled',\n accent: 'text-accent-text',\n success: 'text-success-text',\n warning: 'text-warning-text',\n danger: 'text-danger-text',\n info: 'text-info-text',\n },\n weight: {\n normal: 'font-normal',\n medium: 'font-medium',\n semibold: 'font-semibold',\n },\n truncate: {\n true: 'truncate',\n },\n },\n defaultVariants: {\n size: 'base',\n tone: 'default',\n weight: 'normal',\n },\n})\n\nexport type TextVariants = VariantProps<typeof text>\n","<script setup lang=\"ts\">\n import { Primitive, type PrimitiveProps } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { text, type TextVariants } from './text.variants'\n\n defineOptions({ name: 'HnText' })\n\n const props = withDefaults(\n defineProps<\n PrimitiveProps & {\n size?: TextVariants['size']\n tone?: TextVariants['tone']\n weight?: TextVariants['weight']\n truncate?: boolean\n class?: string\n }\n >(),\n { as: 'p' },\n )\n</script>\n\n<template>\n <Primitive\n :as=\"props.as\"\n :as-child=\"props.asChild\"\n :class=\"\n cn(\n text({\n size: props.size,\n tone: props.tone,\n weight: props.weight,\n truncate: props.truncate,\n }),\n props.class,\n )\n \"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\n import { Primitive, type PrimitiveProps } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { text, type TextVariants } from './text.variants'\n\n defineOptions({ name: 'HnText' })\n\n const props = withDefaults(\n defineProps<\n PrimitiveProps & {\n size?: TextVariants['size']\n tone?: TextVariants['tone']\n weight?: TextVariants['weight']\n truncate?: boolean\n class?: string\n }\n >(),\n { as: 'p' },\n )\n</script>\n\n<template>\n <Primitive\n :as=\"props.as\"\n :as-child=\"props.asChild\"\n :class=\"\n cn(\n text({\n size: props.size,\n tone: props.tone,\n weight: props.weight,\n truncate: props.truncate,\n }),\n props.class,\n )\n \"\n >\n <slot />\n </Primitive>\n</template>\n","import { ref, type Ref } from 'vue'\n\nexport function useFileDrop(disabled: Ref<boolean>, onFiles: (files: File[]) => void) {\n const dragging = ref(false)\n let depth = 0\n\n function onDragEnter(event: DragEvent) {\n if (disabled.value) return\n event.preventDefault()\n depth += 1\n dragging.value = true\n }\n\n function onDragOver(event: DragEvent) {\n if (disabled.value) return\n event.preventDefault()\n }\n\n function onDragLeave() {\n if (disabled.value) return\n depth = Math.max(depth - 1, 0)\n if (depth === 0) dragging.value = false\n }\n\n function onDrop(event: DragEvent) {\n if (disabled.value) return\n event.preventDefault()\n depth = 0\n dragging.value = false\n const files = Array.from(event.dataTransfer?.files ?? [])\n if (files.length) onFiles(files)\n }\n\n function onChange(event: Event) {\n const input = event.target as HTMLInputElement\n const files = Array.from(input.files ?? [])\n input.value = ''\n if (files.length) onFiles(files)\n }\n\n return { dragging, onDragEnter, onDragOver, onDragLeave, onDrop, onChange }\n}\n","import { onBeforeUnmount, shallowRef, watch, type Ref } from 'vue'\n\nexport function useObjectUrls(files: Ref<File[]>, enabled: Ref<boolean>) {\n const urls = shallowRef(new Map<File, string>())\n\n function revokeAll() {\n for (const url of urls.value.values()) URL.revokeObjectURL(url)\n urls.value = new Map()\n }\n\n watch(\n [files, enabled],\n ([list, on]) => {\n const supported = typeof URL !== 'undefined' && typeof URL.createObjectURL === 'function'\n if (!on || !supported) {\n if (urls.value.size) revokeAll()\n return\n }\n const next = new Map<File, string>()\n for (const file of list) {\n if (!file.type.startsWith('image/')) continue\n next.set(file, urls.value.get(file) ?? URL.createObjectURL(file))\n }\n for (const [file, url] of urls.value) if (!next.has(file)) URL.revokeObjectURL(url)\n urls.value = next\n },\n { immediate: true },\n )\n\n onBeforeUnmount(revokeAll)\n\n return { urls }\n}\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const fileUploadRoot = tv({\n base: 'flex w-full min-w-0 flex-col gap-2',\n})\n\nexport const fileUploadArea = tv({\n base: [\n 'hn-interactive hn-state-layer text-muted border-line flex w-full flex-1 flex-col items-center justify-center gap-2 rounded-md border border-dashed px-4 py-6 text-center text-sm',\n 'hover:border-line-strong data-[dragging]:border-accent data-[dragging]:text-accent-text',\n 'data-invalid:border-danger disabled:cursor-not-allowed disabled:opacity-50',\n ],\n})\n\nexport const fileUploadList = tv({\n base: 'flex flex-col gap-1',\n})\n\nexport const fileUploadItem = tv({\n base: 'bg-subtle flex min-w-0 items-center gap-3 rounded-md px-3 py-2',\n})\n\nexport const fileUploadThumb = tv({\n base: 'text-muted flex size-10 shrink-0 items-center justify-center overflow-hidden rounded-sm bg-inset [&>img]:size-full [&>img]:object-cover [&>svg]:size-5',\n})\n\nexport const fileUploadMeta = tv({\n base: 'flex min-w-0 flex-1 flex-col',\n})\n\nexport type FileUploadVariants = VariantProps<typeof fileUploadArea>\n","export type FileUploadReason = 'type' | 'size' | 'count'\n\nexport interface FileUploadRejection {\n file: File\n reason: FileUploadReason\n}\n\ninterface Rules {\n accept?: string\n maxSize?: number\n maxFiles?: number\n multiple?: boolean\n}\n\nfunction matchesAccept(file: File, accept: string | undefined) {\n if (!accept) return true\n const name = file.name.toLowerCase()\n const type = file.type.toLowerCase()\n return accept\n .split(',')\n .map(rule => rule.trim().toLowerCase())\n .filter(Boolean)\n .some(rule => {\n if (rule.startsWith('.')) return name.endsWith(rule)\n if (rule.endsWith('/*')) return type.startsWith(rule.slice(0, -1))\n return type === rule\n })\n}\n\nfunction sameFile(a: File, b: File) {\n return a.name === b.name && a.size === b.size && a.lastModified === b.lastModified\n}\n\nexport function selectFiles(current: File[], incoming: File[], rules: Rules) {\n const rejected: FileUploadRejection[] = []\n const next = rules.multiple ? [...current] : current.slice(0, 1)\n for (const file of incoming) {\n if (!matchesAccept(file, rules.accept)) {\n rejected.push({ file, reason: 'type' })\n continue\n }\n if (rules.maxSize !== undefined && file.size > rules.maxSize) {\n rejected.push({ file, reason: 'size' })\n continue\n }\n if (next.some(existing => sameFile(existing, file))) continue\n if (!rules.multiple) {\n next.splice(0, next.length, file)\n continue\n }\n if (rules.maxFiles !== undefined && next.length >= rules.maxFiles) {\n rejected.push({ file, reason: 'count' })\n continue\n }\n next.push(file)\n }\n return { next, rejected }\n}\n","const UNITS = ['byte', 'kilobyte', 'megabyte', 'gigabyte'] as const\n\nexport function formatSize(tag: string, bytes: number) {\n let value = bytes\n let index = 0\n while (value >= 1024 && index < UNITS.length - 1) {\n value /= 1024\n index += 1\n }\n return new Intl.NumberFormat(tag, {\n style: 'unit',\n unit: UNITS[index],\n unitDisplay: 'narrow',\n maximumFractionDigits: index === 0 ? 0 : 1,\n }).format(value)\n}\n","<script setup lang=\"ts\">\n import { computed, shallowRef } from 'vue'\n import { File as FileIcon, Upload, X } from '@lucide/vue'\n import { cn } from '../../lib/cn'\n import { useFieldControl } from '../form-field/context'\n import { useUiLocale } from '../../locale'\n import Button from '../button/Button.vue'\n import IconSlot from '../button/IconSlot.vue'\n import IconButton from '../icon-button/IconButton.vue'\n import Text from '../text/Text.vue'\n import { useFileDrop } from './composables/useFileDrop'\n import { useObjectUrls } from './composables/useObjectUrls'\n import {\n fileUploadArea,\n fileUploadItem,\n fileUploadList,\n fileUploadMeta,\n fileUploadRoot,\n fileUploadThumb,\n } from './file-upload.variants'\n import { selectFiles, type FileUploadRejection } from './utils/select'\n import { formatSize } from './utils/size'\n\n defineOptions({ name: 'HnFileUpload', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n multiple?: boolean\n accept?: string\n maxSize?: number\n maxFiles?: number\n variant?: 'area' | 'button'\n list?: boolean\n preview?: boolean\n name?: string\n loading?: boolean\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>(),\n { variant: 'area', list: true, preview: true },\n )\n const emit = defineEmits<{ reject: [rejections: FileUploadRejection[]] }>()\n\n const model = defineModel<File | File[] | null>({ default: null })\n\n const t = useUiLocale()\n const input = shallowRef<HTMLInputElement | null>(null)\n\n const {\n field,\n id: fieldId,\n invalid,\n disabled,\n describedBy,\n } = useFieldControl({\n invalid: () => props.invalid,\n disabled: () => !!props.disabled || !!props.loading,\n })\n const files = computed<File[]>(() =>\n Array.isArray(model.value) ? model.value : model.value ? [model.value] : [],\n )\n\n function commit(next: File[]) {\n model.value = props.multiple ? next : (next[0] ?? null)\n }\n\n function take(incoming: File[]) {\n const { next, rejected } = selectFiles(files.value, incoming, {\n accept: props.accept,\n maxSize: props.maxSize,\n maxFiles: props.maxFiles,\n multiple: props.multiple,\n })\n if (rejected.length) emit('reject', rejected)\n commit(next)\n }\n\n function remove(file: File) {\n commit(files.value.filter(item => item !== file))\n }\n\n function browse() {\n if (!disabled.value) input.value?.click()\n }\n\n const { dragging, onDragEnter, onDragOver, onDragLeave, onDrop, onChange } = useFileDrop(\n disabled,\n take,\n )\n const { urls } = useObjectUrls(\n files,\n computed(() => props.preview),\n )\n</script>\n\n<template>\n <div data-hn-file-upload :class=\"cn(fileUploadRoot(), props.class)\">\n <input\n ref=\"input\"\n type=\"file\"\n class=\"hidden\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n :name=\"props.name\"\n :accept=\"props.accept\"\n :multiple=\"props.multiple\"\n :disabled=\"disabled\"\n @change=\"onChange\"\n />\n <button\n v-if=\"props.variant === 'area'\"\n v-bind=\"$attrs\"\n type=\"button\"\n data-hn-file-upload-area\n :id=\"fieldId\"\n :aria-describedby=\"describedBy\"\n :aria-invalid=\"invalid || undefined\"\n :data-dragging=\"dragging ? '' : undefined\"\n :data-invalid=\"invalid ? '' : undefined\"\n :aria-busy=\"props.loading || undefined\"\n :disabled=\"disabled\"\n :class=\"fileUploadArea()\"\n @click=\"browse\"\n @dragenter=\"onDragEnter\"\n @dragover=\"onDragOver\"\n @dragleave=\"onDragLeave\"\n @drop=\"onDrop\"\n >\n <IconSlot\n box-class=\"relative inline-flex size-6 items-center justify-center [&>svg]:size-6\"\n :swapped=\"!!props.loading\"\n spinner-size=\"md\"\n >\n <slot name=\"icon\">\n <Upload aria-hidden=\"true\" />\n </slot>\n </IconSlot>\n <slot>{{ t.upload.dropHint }}</slot>\n </button>\n <Button\n v-else\n v-bind=\"$attrs\"\n :id=\"fieldId\"\n :aria-describedby=\"describedBy\"\n :aria-invalid=\"invalid || undefined\"\n variant=\"outline\"\n tone=\"neutral\"\n :loading=\"props.loading\"\n :disabled=\"props.disabled || !!field?.disabled.value\"\n class=\"self-start\"\n @click=\"browse\"\n >\n <slot name=\"icon\">\n <Upload />\n </slot>\n <slot>{{ t.upload.choose }}</slot>\n </Button>\n <ul v-if=\"props.list && files.length\" :class=\"fileUploadList()\">\n <li\n v-for=\"file in files\"\n :key=\"`${file.name}-${file.size}-${file.lastModified}`\"\n :class=\"fileUploadItem()\"\n >\n <span :class=\"fileUploadThumb()\">\n <img v-if=\"urls.get(file)\" :src=\"urls.get(file)\" alt=\"\" />\n <FileIcon v-else aria-hidden=\"true\" />\n </span>\n <span :class=\"fileUploadMeta()\">\n <Text as=\"span\" size=\"sm\" truncate>{{ file.name }}</Text>\n <Text as=\"span\" size=\"xs\" tone=\"muted\">{{ formatSize(t.tag, file.size) }}</Text>\n </span>\n <IconButton\n variant=\"ghost\"\n tone=\"neutral\"\n size=\"sm\"\n :label=\"t.upload.removeFile(file.name)\"\n :disabled=\"disabled\"\n @click=\"remove(file)\"\n >\n <X />\n </IconButton>\n </li>\n </ul>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed, shallowRef } from 'vue'\n import { File as FileIcon, Upload, X } from '@lucide/vue'\n import { cn } from '../../lib/cn'\n import { useFieldControl } from '../form-field/context'\n import { useUiLocale } from '../../locale'\n import Button from '../button/Button.vue'\n import IconSlot from '../button/IconSlot.vue'\n import IconButton from '../icon-button/IconButton.vue'\n import Text from '../text/Text.vue'\n import { useFileDrop } from './composables/useFileDrop'\n import { useObjectUrls } from './composables/useObjectUrls'\n import {\n fileUploadArea,\n fileUploadItem,\n fileUploadList,\n fileUploadMeta,\n fileUploadRoot,\n fileUploadThumb,\n } from './file-upload.variants'\n import { selectFiles, type FileUploadRejection } from './utils/select'\n import { formatSize } from './utils/size'\n\n defineOptions({ name: 'HnFileUpload', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n multiple?: boolean\n accept?: string\n maxSize?: number\n maxFiles?: number\n variant?: 'area' | 'button'\n list?: boolean\n preview?: boolean\n name?: string\n loading?: boolean\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>(),\n { variant: 'area', list: true, preview: true },\n )\n const emit = defineEmits<{ reject: [rejections: FileUploadRejection[]] }>()\n\n const model = defineModel<File | File[] | null>({ default: null })\n\n const t = useUiLocale()\n const input = shallowRef<HTMLInputElement | null>(null)\n\n const {\n field,\n id: fieldId,\n invalid,\n disabled,\n describedBy,\n } = useFieldControl({\n invalid: () => props.invalid,\n disabled: () => !!props.disabled || !!props.loading,\n })\n const files = computed<File[]>(() =>\n Array.isArray(model.value) ? model.value : model.value ? [model.value] : [],\n )\n\n function commit(next: File[]) {\n model.value = props.multiple ? next : (next[0] ?? null)\n }\n\n function take(incoming: File[]) {\n const { next, rejected } = selectFiles(files.value, incoming, {\n accept: props.accept,\n maxSize: props.maxSize,\n maxFiles: props.maxFiles,\n multiple: props.multiple,\n })\n if (rejected.length) emit('reject', rejected)\n commit(next)\n }\n\n function remove(file: File) {\n commit(files.value.filter(item => item !== file))\n }\n\n function browse() {\n if (!disabled.value) input.value?.click()\n }\n\n const { dragging, onDragEnter, onDragOver, onDragLeave, onDrop, onChange } = useFileDrop(\n disabled,\n take,\n )\n const { urls } = useObjectUrls(\n files,\n computed(() => props.preview),\n )\n</script>\n\n<template>\n <div data-hn-file-upload :class=\"cn(fileUploadRoot(), props.class)\">\n <input\n ref=\"input\"\n type=\"file\"\n class=\"hidden\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n :name=\"props.name\"\n :accept=\"props.accept\"\n :multiple=\"props.multiple\"\n :disabled=\"disabled\"\n @change=\"onChange\"\n />\n <button\n v-if=\"props.variant === 'area'\"\n v-bind=\"$attrs\"\n type=\"button\"\n data-hn-file-upload-area\n :id=\"fieldId\"\n :aria-describedby=\"describedBy\"\n :aria-invalid=\"invalid || undefined\"\n :data-dragging=\"dragging ? '' : undefined\"\n :data-invalid=\"invalid ? '' : undefined\"\n :aria-busy=\"props.loading || undefined\"\n :disabled=\"disabled\"\n :class=\"fileUploadArea()\"\n @click=\"browse\"\n @dragenter=\"onDragEnter\"\n @dragover=\"onDragOver\"\n @dragleave=\"onDragLeave\"\n @drop=\"onDrop\"\n >\n <IconSlot\n box-class=\"relative inline-flex size-6 items-center justify-center [&>svg]:size-6\"\n :swapped=\"!!props.loading\"\n spinner-size=\"md\"\n >\n <slot name=\"icon\">\n <Upload aria-hidden=\"true\" />\n </slot>\n </IconSlot>\n <slot>{{ t.upload.dropHint }}</slot>\n </button>\n <Button\n v-else\n v-bind=\"$attrs\"\n :id=\"fieldId\"\n :aria-describedby=\"describedBy\"\n :aria-invalid=\"invalid || undefined\"\n variant=\"outline\"\n tone=\"neutral\"\n :loading=\"props.loading\"\n :disabled=\"props.disabled || !!field?.disabled.value\"\n class=\"self-start\"\n @click=\"browse\"\n >\n <slot name=\"icon\">\n <Upload />\n </slot>\n <slot>{{ t.upload.choose }}</slot>\n </Button>\n <ul v-if=\"props.list && files.length\" :class=\"fileUploadList()\">\n <li\n v-for=\"file in files\"\n :key=\"`${file.name}-${file.size}-${file.lastModified}`\"\n :class=\"fileUploadItem()\"\n >\n <span :class=\"fileUploadThumb()\">\n <img v-if=\"urls.get(file)\" :src=\"urls.get(file)\" alt=\"\" />\n <FileIcon v-else aria-hidden=\"true\" />\n </span>\n <span :class=\"fileUploadMeta()\">\n <Text as=\"span\" size=\"sm\" truncate>{{ file.name }}</Text>\n <Text as=\"span\" size=\"xs\" tone=\"muted\">{{ formatSize(t.tag, file.size) }}</Text>\n </span>\n <IconButton\n variant=\"ghost\"\n tone=\"neutral\"\n size=\"sm\"\n :label=\"t.upload.removeFile(file.name)\"\n :disabled=\"disabled\"\n @click=\"remove(file)\"\n >\n <X />\n </IconButton>\n </li>\n </ul>\n </div>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const dialogWrapper = tv({\n base: '',\n variants: {\n placement: {\n center: 'place-items-center p-4',\n bottom: 'items-end justify-items-center p-4',\n auto: 'place-items-center p-4 max-sm:items-end max-sm:justify-items-stretch',\n },\n },\n defaultVariants: { placement: 'auto' },\n})\n\nexport const dialogCard = tv({\n base: '',\n variants: {\n placement: {\n center: 'hn-anim-modal',\n bottom: 'hn-anim-sheet-bottom',\n auto: 'hn-anim-modal max-sm:hn-anim-sheet-bottom max-sm:max-w-none',\n },\n size: {\n sm: 'max-w-sm',\n md: 'max-w-md',\n lg: 'max-w-xl',\n },\n },\n defaultVariants: { placement: 'auto', size: 'md' },\n})\n\nexport type DialogVariants = VariantProps<typeof dialogCard>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const heading = tv({\n base: 'text-fg',\n variants: {\n size: {\n xs: 'text-xs',\n sm: 'text-sm',\n base: 'text-base',\n md: 'text-md',\n lg: 'text-lg',\n xl: 'text-xl',\n '2xl': 'text-2xl',\n },\n weight: {\n normal: 'font-normal',\n medium: 'font-medium',\n semibold: 'font-semibold',\n },\n truncate: {\n true: 'truncate',\n },\n },\n compoundVariants: [{ size: ['xl', '2xl'], class: 'tracking-tight' }],\n defaultVariants: {\n weight: 'semibold',\n },\n})\n\nexport type HeadingVariants = VariantProps<typeof heading>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { Primitive } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { heading, type HeadingVariants } from './heading.variants'\n\n defineOptions({ name: 'HnHeading' })\n\n const props = withDefaults(\n defineProps<{\n level?: 1 | 2 | 3 | 4 | 5 | 6\n size?: HeadingVariants['size']\n weight?: HeadingVariants['weight']\n truncate?: boolean\n class?: string\n }>(),\n { level: 2 },\n )\n\n const sizeByLevel = {\n 1: '2xl',\n 2: 'xl',\n 3: 'lg',\n 4: 'md',\n 5: 'base',\n 6: 'sm',\n } as const\n\n const tag = computed(() => `h${props.level}`)\n const size = computed(() => props.size ?? sizeByLevel[props.level])\n</script>\n\n<template>\n <Primitive\n :as=\"tag\"\n :class=\"\n cn(\n heading({\n size: size,\n weight: props.weight,\n truncate: props.truncate,\n }),\n props.class,\n )\n \"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { Primitive } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { heading, type HeadingVariants } from './heading.variants'\n\n defineOptions({ name: 'HnHeading' })\n\n const props = withDefaults(\n defineProps<{\n level?: 1 | 2 | 3 | 4 | 5 | 6\n size?: HeadingVariants['size']\n weight?: HeadingVariants['weight']\n truncate?: boolean\n class?: string\n }>(),\n { level: 2 },\n )\n\n const sizeByLevel = {\n 1: '2xl',\n 2: 'xl',\n 3: 'lg',\n 4: 'md',\n 5: 'base',\n 6: 'sm',\n } as const\n\n const tag = computed(() => `h${props.level}`)\n const size = computed(() => props.size ?? sizeByLevel[props.level])\n</script>\n\n<template>\n <Primitive\n :as=\"tag\"\n :class=\"\n cn(\n heading({\n size: size,\n weight: props.weight,\n truncate: props.truncate,\n }),\n props.class,\n )\n \"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\n import { ref } from 'vue'\n import {\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogOverlay,\n AlertDialogPortal,\n AlertDialogRoot,\n AlertDialogTitle,\n AlertDialogTrigger,\n } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import Button from '../button/Button.vue'\n import Card from '../card/Card.vue'\n import { dialogCard, dialogWrapper } from '../dialog/dialog.variants'\n import Heading from '../heading/Heading.vue'\n import Text from '../text/Text.vue'\n\n defineOptions({ name: 'HnAlertDialog' })\n\n const props = withDefaults(\n defineProps<{\n title: string\n description?: string\n confirmText?: string\n cancelText?: string\n tone?: 'accent' | 'danger'\n size?: 'sm' | 'md'\n placement?: 'center' | 'bottom'\n onConfirm?: () => unknown\n class?: string\n }>(),\n { tone: 'accent', size: 'sm' },\n )\n const emit = defineEmits<{ cancel: [] }>()\n\n const open = defineModel<boolean>('open')\n const busy = ref(false)\n const t = useUiLocale()\n\n function guard(event: Event) {\n if (busy.value) event.preventDefault()\n }\n\n async function confirm() {\n if (busy.value) return\n const result = props.onConfirm?.()\n if (result instanceof Promise) {\n busy.value = true\n try {\n await result\n } finally {\n busy.value = false\n }\n }\n open.value = false\n }\n</script>\n\n<template>\n <AlertDialogRoot v-model:open=\"open\">\n <AlertDialogTrigger v-if=\"$slots.default\" as-child>\n <slot />\n </AlertDialogTrigger>\n <AlertDialogPortal>\n <AlertDialogOverlay class=\"hn-scrim\" />\n <div\n :class=\"\n cn(\n 'pointer-events-none fixed inset-0 z-(--hn-z-overlay) grid',\n dialogWrapper({ placement: props.placement ?? 'auto' }),\n )\n \"\n >\n <AlertDialogContent as-child @escape-key-down=\"guard\">\n <Card\n :padded=\"false\"\n data-hn-alert-dialog\n :aria-busy=\"busy || undefined\"\n :class=\"\n cn(\n 'pointer-events-auto flex w-full flex-col gap-4 shadow-lg outline-none',\n 'py-(--hn-panel-p)',\n dialogCard({ placement: props.placement ?? 'auto', size: props.size }),\n props.class,\n )\n \"\n >\n <div class=\"flex min-w-0 flex-col gap-1.5 px-(--hn-panel-p)\">\n <AlertDialogTitle as-child>\n <Heading :level=\"2\" size=\"lg\">{{ props.title }}</Heading>\n </AlertDialogTitle>\n <AlertDialogDescription v-if=\"props.description\" as-child>\n <Text tone=\"muted\">{{ props.description }}</Text>\n </AlertDialogDescription>\n </div>\n <div v-if=\"$slots.content\" class=\"px-(--hn-panel-p)\">\n <slot name=\"content\" />\n </div>\n <div class=\"flex justify-end gap-(--hn-inline-gap) px-(--hn-panel-p)\">\n <AlertDialogCancel as-child>\n <Button variant=\"soft\" tone=\"neutral\" :disabled=\"busy\" @click=\"emit('cancel')\">\n {{ props.cancelText ?? t.common.cancel }}\n </Button>\n </AlertDialogCancel>\n <Button :tone=\"props.tone\" :loading=\"busy\" @click=\"confirm\">\n {{ props.confirmText ?? t.common.confirm }}\n </Button>\n </div>\n </Card>\n </AlertDialogContent>\n </div>\n </AlertDialogPortal>\n </AlertDialogRoot>\n</template>\n","<script setup lang=\"ts\">\n import { ref } from 'vue'\n import {\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogOverlay,\n AlertDialogPortal,\n AlertDialogRoot,\n AlertDialogTitle,\n AlertDialogTrigger,\n } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import Button from '../button/Button.vue'\n import Card from '../card/Card.vue'\n import { dialogCard, dialogWrapper } from '../dialog/dialog.variants'\n import Heading from '../heading/Heading.vue'\n import Text from '../text/Text.vue'\n\n defineOptions({ name: 'HnAlertDialog' })\n\n const props = withDefaults(\n defineProps<{\n title: string\n description?: string\n confirmText?: string\n cancelText?: string\n tone?: 'accent' | 'danger'\n size?: 'sm' | 'md'\n placement?: 'center' | 'bottom'\n onConfirm?: () => unknown\n class?: string\n }>(),\n { tone: 'accent', size: 'sm' },\n )\n const emit = defineEmits<{ cancel: [] }>()\n\n const open = defineModel<boolean>('open')\n const busy = ref(false)\n const t = useUiLocale()\n\n function guard(event: Event) {\n if (busy.value) event.preventDefault()\n }\n\n async function confirm() {\n if (busy.value) return\n const result = props.onConfirm?.()\n if (result instanceof Promise) {\n busy.value = true\n try {\n await result\n } finally {\n busy.value = false\n }\n }\n open.value = false\n }\n</script>\n\n<template>\n <AlertDialogRoot v-model:open=\"open\">\n <AlertDialogTrigger v-if=\"$slots.default\" as-child>\n <slot />\n </AlertDialogTrigger>\n <AlertDialogPortal>\n <AlertDialogOverlay class=\"hn-scrim\" />\n <div\n :class=\"\n cn(\n 'pointer-events-none fixed inset-0 z-(--hn-z-overlay) grid',\n dialogWrapper({ placement: props.placement ?? 'auto' }),\n )\n \"\n >\n <AlertDialogContent as-child @escape-key-down=\"guard\">\n <Card\n :padded=\"false\"\n data-hn-alert-dialog\n :aria-busy=\"busy || undefined\"\n :class=\"\n cn(\n 'pointer-events-auto flex w-full flex-col gap-4 shadow-lg outline-none',\n 'py-(--hn-panel-p)',\n dialogCard({ placement: props.placement ?? 'auto', size: props.size }),\n props.class,\n )\n \"\n >\n <div class=\"flex min-w-0 flex-col gap-1.5 px-(--hn-panel-p)\">\n <AlertDialogTitle as-child>\n <Heading :level=\"2\" size=\"lg\">{{ props.title }}</Heading>\n </AlertDialogTitle>\n <AlertDialogDescription v-if=\"props.description\" as-child>\n <Text tone=\"muted\">{{ props.description }}</Text>\n </AlertDialogDescription>\n </div>\n <div v-if=\"$slots.content\" class=\"px-(--hn-panel-p)\">\n <slot name=\"content\" />\n </div>\n <div class=\"flex justify-end gap-(--hn-inline-gap) px-(--hn-panel-p)\">\n <AlertDialogCancel as-child>\n <Button variant=\"soft\" tone=\"neutral\" :disabled=\"busy\" @click=\"emit('cancel')\">\n {{ props.cancelText ?? t.common.cancel }}\n </Button>\n </AlertDialogCancel>\n <Button :tone=\"props.tone\" :loading=\"busy\" @click=\"confirm\">\n {{ props.confirmText ?? t.common.confirm }}\n </Button>\n </div>\n </Card>\n </AlertDialogContent>\n </div>\n </AlertDialogPortal>\n </AlertDialogRoot>\n</template>\n","<script setup lang=\"ts\">\n import { computed, ref, useId } from 'vue'\n import { PopoverContent, PopoverPortal, PopoverRoot, PopoverTrigger } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import Button from '../button/Button.vue'\n import Card from '../card/Card.vue'\n import Text from '../text/Text.vue'\n\n defineOptions({ name: 'HnPopconfirm' })\n\n const props = withDefaults(\n defineProps<{\n title: string\n description?: string\n confirmText?: string\n cancelText?: string\n tone?: 'accent' | 'danger'\n side?: 'top' | 'right' | 'bottom' | 'left'\n align?: 'start' | 'center' | 'end'\n sideOffset?: number\n onConfirm?: () => unknown\n class?: string\n }>(),\n { tone: 'accent', side: 'bottom', align: 'center', sideOffset: 8 },\n )\n const emit = defineEmits<{ cancel: [] }>()\n\n const open = defineModel<boolean>('open')\n const busy = ref(false)\n const t = useUiLocale()\n const titleId = useId()\n const descriptionId = useId()\n\n const pressOrigin = computed(() => {\n if (props.side === 'left') return 'right'\n if (props.side === 'right') return 'left'\n if (props.align === 'start') return 'left'\n if (props.align === 'end') return 'right'\n return 'center'\n })\n\n function guard(event: Event) {\n if (busy.value) event.preventDefault()\n }\n\n function cancel() {\n emit('cancel')\n open.value = false\n }\n\n async function confirm() {\n if (busy.value) return\n const result = props.onConfirm?.()\n if (result instanceof Promise) {\n busy.value = true\n try {\n await result\n } finally {\n busy.value = false\n }\n }\n open.value = false\n }\n</script>\n\n<template>\n <PopoverRoot v-model:open=\"open\" modal>\n <PopoverTrigger as-child :style=\"{ transformOrigin: pressOrigin }\">\n <slot />\n </PopoverTrigger>\n <PopoverPortal>\n <PopoverContent\n as-child\n :side=\"props.side\"\n :align=\"props.align\"\n :side-offset=\"props.sideOffset\"\n :aria-describedby=\"props.description ? `${titleId} ${descriptionId}` : titleId\"\n @escape-key-down=\"guard\"\n @interact-outside=\"guard\"\n >\n <Card\n data-hn-popconfirm\n :padded=\"false\"\n :aria-busy=\"busy || undefined\"\n :class=\"\n cn(\n 'hn-anim-pop z-(--hn-z-overlay) flex w-max max-w-xs min-w-56 flex-col gap-2.5 p-3 shadow-md outline-none',\n props.class,\n )\n \"\n >\n <div class=\"flex flex-col gap-0.5\">\n <Text :id=\"titleId\" weight=\"medium\">{{ props.title }}</Text>\n <Text v-if=\"props.description\" :id=\"descriptionId\" tone=\"muted\" size=\"sm\">\n {{ props.description }}\n </Text>\n </div>\n <slot name=\"content\" />\n <div class=\"flex justify-end gap-2\">\n <Button size=\"sm\" variant=\"soft\" tone=\"neutral\" :disabled=\"busy\" @click=\"cancel\">\n {{ props.cancelText ?? t.common.cancel }}\n </Button>\n <Button size=\"sm\" :tone=\"props.tone\" :loading=\"busy\" @click=\"confirm\">\n {{ props.confirmText ?? t.common.confirm }}\n </Button>\n </div>\n </Card>\n </PopoverContent>\n </PopoverPortal>\n </PopoverRoot>\n</template>\n","<script setup lang=\"ts\">\n import { computed, ref, useId } from 'vue'\n import { PopoverContent, PopoverPortal, PopoverRoot, PopoverTrigger } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import Button from '../button/Button.vue'\n import Card from '../card/Card.vue'\n import Text from '../text/Text.vue'\n\n defineOptions({ name: 'HnPopconfirm' })\n\n const props = withDefaults(\n defineProps<{\n title: string\n description?: string\n confirmText?: string\n cancelText?: string\n tone?: 'accent' | 'danger'\n side?: 'top' | 'right' | 'bottom' | 'left'\n align?: 'start' | 'center' | 'end'\n sideOffset?: number\n onConfirm?: () => unknown\n class?: string\n }>(),\n { tone: 'accent', side: 'bottom', align: 'center', sideOffset: 8 },\n )\n const emit = defineEmits<{ cancel: [] }>()\n\n const open = defineModel<boolean>('open')\n const busy = ref(false)\n const t = useUiLocale()\n const titleId = useId()\n const descriptionId = useId()\n\n const pressOrigin = computed(() => {\n if (props.side === 'left') return 'right'\n if (props.side === 'right') return 'left'\n if (props.align === 'start') return 'left'\n if (props.align === 'end') return 'right'\n return 'center'\n })\n\n function guard(event: Event) {\n if (busy.value) event.preventDefault()\n }\n\n function cancel() {\n emit('cancel')\n open.value = false\n }\n\n async function confirm() {\n if (busy.value) return\n const result = props.onConfirm?.()\n if (result instanceof Promise) {\n busy.value = true\n try {\n await result\n } finally {\n busy.value = false\n }\n }\n open.value = false\n }\n</script>\n\n<template>\n <PopoverRoot v-model:open=\"open\" modal>\n <PopoverTrigger as-child :style=\"{ transformOrigin: pressOrigin }\">\n <slot />\n </PopoverTrigger>\n <PopoverPortal>\n <PopoverContent\n as-child\n :side=\"props.side\"\n :align=\"props.align\"\n :side-offset=\"props.sideOffset\"\n :aria-describedby=\"props.description ? `${titleId} ${descriptionId}` : titleId\"\n @escape-key-down=\"guard\"\n @interact-outside=\"guard\"\n >\n <Card\n data-hn-popconfirm\n :padded=\"false\"\n :aria-busy=\"busy || undefined\"\n :class=\"\n cn(\n 'hn-anim-pop z-(--hn-z-overlay) flex w-max max-w-xs min-w-56 flex-col gap-2.5 p-3 shadow-md outline-none',\n props.class,\n )\n \"\n >\n <div class=\"flex flex-col gap-0.5\">\n <Text :id=\"titleId\" weight=\"medium\">{{ props.title }}</Text>\n <Text v-if=\"props.description\" :id=\"descriptionId\" tone=\"muted\" size=\"sm\">\n {{ props.description }}\n </Text>\n </div>\n <slot name=\"content\" />\n <div class=\"flex justify-end gap-2\">\n <Button size=\"sm\" variant=\"soft\" tone=\"neutral\" :disabled=\"busy\" @click=\"cancel\">\n {{ props.cancelText ?? t.common.cancel }}\n </Button>\n <Button size=\"sm\" :tone=\"props.tone\" :loading=\"busy\" @click=\"confirm\">\n {{ props.confirmText ?? t.common.confirm }}\n </Button>\n </div>\n </Card>\n </PopoverContent>\n </PopoverPortal>\n </PopoverRoot>\n</template>\n","<script setup lang=\"ts\">\n import { HoverCardContent, HoverCardPortal, HoverCardRoot, HoverCardTrigger } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import Card from '../card/Card.vue'\n\n defineOptions({ name: 'HnHoverCard' })\n\n const props = withDefaults(\n defineProps<{\n side?: 'top' | 'right' | 'bottom' | 'left'\n align?: 'start' | 'center' | 'end'\n sideOffset?: number\n openDelay?: number\n closeDelay?: number\n padded?: boolean\n class?: string\n }>(),\n {\n side: 'bottom',\n align: 'center',\n sideOffset: 8,\n openDelay: 300,\n closeDelay: 150,\n padded: true,\n },\n )\n\n const open = defineModel<boolean>('open')\n</script>\n\n<template>\n <HoverCardRoot v-model:open=\"open\" :open-delay=\"props.openDelay\" :close-delay=\"props.closeDelay\">\n <HoverCardTrigger as-child>\n <slot />\n </HoverCardTrigger>\n <HoverCardPortal>\n <HoverCardContent\n as-child\n :side=\"props.side\"\n :align=\"props.align\"\n :side-offset=\"props.sideOffset\"\n >\n <Card\n data-hn-hover-card\n :padded=\"props.padded\"\n :class=\"cn('hn-anim-pop z-(--hn-z-overlay) max-w-sm shadow-md outline-none', props.class)\"\n >\n <slot name=\"content\" />\n </Card>\n </HoverCardContent>\n </HoverCardPortal>\n </HoverCardRoot>\n</template>\n","<script setup lang=\"ts\">\n import { HoverCardContent, HoverCardPortal, HoverCardRoot, HoverCardTrigger } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import Card from '../card/Card.vue'\n\n defineOptions({ name: 'HnHoverCard' })\n\n const props = withDefaults(\n defineProps<{\n side?: 'top' | 'right' | 'bottom' | 'left'\n align?: 'start' | 'center' | 'end'\n sideOffset?: number\n openDelay?: number\n closeDelay?: number\n padded?: boolean\n class?: string\n }>(),\n {\n side: 'bottom',\n align: 'center',\n sideOffset: 8,\n openDelay: 300,\n closeDelay: 150,\n padded: true,\n },\n )\n\n const open = defineModel<boolean>('open')\n</script>\n\n<template>\n <HoverCardRoot v-model:open=\"open\" :open-delay=\"props.openDelay\" :close-delay=\"props.closeDelay\">\n <HoverCardTrigger as-child>\n <slot />\n </HoverCardTrigger>\n <HoverCardPortal>\n <HoverCardContent\n as-child\n :side=\"props.side\"\n :align=\"props.align\"\n :side-offset=\"props.sideOffset\"\n >\n <Card\n data-hn-hover-card\n :padded=\"props.padded\"\n :class=\"cn('hn-anim-pop z-(--hn-z-overlay) max-w-sm shadow-md outline-none', props.class)\"\n >\n <slot name=\"content\" />\n </Card>\n </HoverCardContent>\n </HoverCardPortal>\n </HoverCardRoot>\n</template>\n","<script setup lang=\"ts\">\n import {\n ContextMenuContent,\n ContextMenuPortal,\n ContextMenuRoot,\n ContextMenuTrigger,\n } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import Card from '../card/Card.vue'\n\n defineOptions({ name: 'HnContextMenu' })\n\n const props = defineProps<{\n label?: string\n disabled?: boolean\n class?: string\n }>()\n\n const open = defineModel<boolean>('open')\n</script>\n\n<template>\n <ContextMenuRoot v-model:open=\"open\" modal>\n <ContextMenuTrigger as-child :disabled=\"props.disabled\">\n <slot />\n </ContextMenuTrigger>\n <ContextMenuPortal>\n <ContextMenuContent as-child :aria-label=\"props.label\">\n <Card\n :padded=\"false\"\n :class=\"\n cn(\n 'hn-anim-pop z-(--hn-z-overlay) flex min-w-40 flex-col gap-0.5 p-1 shadow-md outline-none',\n props.class,\n )\n \"\n >\n <slot name=\"content\" />\n </Card>\n </ContextMenuContent>\n </ContextMenuPortal>\n </ContextMenuRoot>\n</template>\n","<script setup lang=\"ts\">\n import {\n ContextMenuContent,\n ContextMenuPortal,\n ContextMenuRoot,\n ContextMenuTrigger,\n } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import Card from '../card/Card.vue'\n\n defineOptions({ name: 'HnContextMenu' })\n\n const props = defineProps<{\n label?: string\n disabled?: boolean\n class?: string\n }>()\n\n const open = defineModel<boolean>('open')\n</script>\n\n<template>\n <ContextMenuRoot v-model:open=\"open\" modal>\n <ContextMenuTrigger as-child :disabled=\"props.disabled\">\n <slot />\n </ContextMenuTrigger>\n <ContextMenuPortal>\n <ContextMenuContent as-child :aria-label=\"props.label\">\n <Card\n :padded=\"false\"\n :class=\"\n cn(\n 'hn-anim-pop z-(--hn-z-overlay) flex min-w-40 flex-col gap-0.5 p-1 shadow-md outline-none',\n props.class,\n )\n \"\n >\n <slot name=\"content\" />\n </Card>\n </ContextMenuContent>\n </ContextMenuPortal>\n </ContextMenuRoot>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const dropdownItem = tv({\n base: [\n 'hn-interactive hn-state-layer hn-press-none relative isolate flex w-full cursor-pointer',\n 'items-center gap-[var(--hn-control-gap)] rounded-md px-2.5 py-2 text-start text-sm select-none',\n 'outline-none [&_svg]:size-4 [&_svg]:shrink-0',\n 'data-disabled:pointer-events-none data-disabled:opacity-50',\n ],\n variants: {\n tone: {\n neutral: 'text-fg',\n danger: 'text-danger-text [--hn-state-color:var(--hn-danger)]',\n },\n },\n defaultVariants: { tone: 'neutral' },\n})\n\nexport type DropdownItemVariants = VariantProps<typeof dropdownItem>\n","<script setup lang=\"ts\">\n import { ContextMenuItem } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { dropdownItem, type DropdownItemVariants } from '../dropdown-menu/dropdown-menu.variants'\n\n defineOptions({ name: 'HnContextMenuItem', inheritAttrs: false })\n\n const props = defineProps<{\n tone?: DropdownItemVariants['tone']\n disabled?: boolean\n textValue?: string\n class?: string\n }>()\n\n const emit = defineEmits<{ select: [event: Event] }>()\n</script>\n\n<template>\n <ContextMenuItem\n v-bind=\"$attrs\"\n :disabled=\"props.disabled\"\n :text-value=\"props.textValue\"\n :class=\"cn(dropdownItem({ tone: props.tone }), props.class)\"\n @select=\"emit('select', $event)\"\n >\n <slot name=\"icon\" />\n <span class=\"min-w-0 flex-1\"><slot /></span>\n <slot name=\"trailing\" />\n </ContextMenuItem>\n</template>\n","<script setup lang=\"ts\">\n import { ContextMenuItem } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { dropdownItem, type DropdownItemVariants } from '../dropdown-menu/dropdown-menu.variants'\n\n defineOptions({ name: 'HnContextMenuItem', inheritAttrs: false })\n\n const props = defineProps<{\n tone?: DropdownItemVariants['tone']\n disabled?: boolean\n textValue?: string\n class?: string\n }>()\n\n const emit = defineEmits<{ select: [event: Event] }>()\n</script>\n\n<template>\n <ContextMenuItem\n v-bind=\"$attrs\"\n :disabled=\"props.disabled\"\n :text-value=\"props.textValue\"\n :class=\"cn(dropdownItem({ tone: props.tone }), props.class)\"\n @select=\"emit('select', $event)\"\n >\n <slot name=\"icon\" />\n <span class=\"min-w-0 flex-1\"><slot /></span>\n <slot name=\"trailing\" />\n </ContextMenuItem>\n</template>\n","<script setup lang=\"ts\">\n import { Check } from '@lucide/vue'\n import { ContextMenuCheckboxItem, ContextMenuItemIndicator } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { dropdownItem } from '../dropdown-menu/dropdown-menu.variants'\n\n defineOptions({ name: 'HnContextMenuCheckboxItem', inheritAttrs: false })\n\n const props = defineProps<{\n disabled?: boolean\n textValue?: string\n class?: string\n }>()\n\n const checked = defineModel<boolean>('checked', { default: false })\n</script>\n\n<template>\n <ContextMenuCheckboxItem\n v-bind=\"$attrs\"\n v-model=\"checked\"\n :disabled=\"props.disabled\"\n :text-value=\"props.textValue\"\n :class=\"cn(dropdownItem(), props.class)\"\n @select=\"(event: Event) => event.preventDefault()\"\n >\n <span class=\"min-w-0 flex-1\"><slot /></span>\n <slot name=\"trailing\" />\n <span class=\"flex size-4 shrink-0 items-center justify-center\">\n <ContextMenuItemIndicator>\n <Check />\n </ContextMenuItemIndicator>\n </span>\n </ContextMenuCheckboxItem>\n</template>\n","<script setup lang=\"ts\">\n import { Check } from '@lucide/vue'\n import { ContextMenuCheckboxItem, ContextMenuItemIndicator } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { dropdownItem } from '../dropdown-menu/dropdown-menu.variants'\n\n defineOptions({ name: 'HnContextMenuCheckboxItem', inheritAttrs: false })\n\n const props = defineProps<{\n disabled?: boolean\n textValue?: string\n class?: string\n }>()\n\n const checked = defineModel<boolean>('checked', { default: false })\n</script>\n\n<template>\n <ContextMenuCheckboxItem\n v-bind=\"$attrs\"\n v-model=\"checked\"\n :disabled=\"props.disabled\"\n :text-value=\"props.textValue\"\n :class=\"cn(dropdownItem(), props.class)\"\n @select=\"(event: Event) => event.preventDefault()\"\n >\n <span class=\"min-w-0 flex-1\"><slot /></span>\n <slot name=\"trailing\" />\n <span class=\"flex size-4 shrink-0 items-center justify-center\">\n <ContextMenuItemIndicator>\n <Check />\n </ContextMenuItemIndicator>\n </span>\n </ContextMenuCheckboxItem>\n</template>\n","<script setup lang=\"ts\">\n import { ContextMenuGroup } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnContextMenuGroup' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <ContextMenuGroup :class=\"cn('flex flex-col gap-0.5', props.class)\">\n <slot />\n </ContextMenuGroup>\n</template>\n","<script setup lang=\"ts\">\n import { ContextMenuGroup } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnContextMenuGroup' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <ContextMenuGroup :class=\"cn('flex flex-col gap-0.5', props.class)\">\n <slot />\n </ContextMenuGroup>\n</template>\n","<script setup lang=\"ts\">\n import { ChevronRight } from '@lucide/vue'\n import {\n ContextMenuPortal,\n ContextMenuSub,\n ContextMenuSubContent,\n ContextMenuSubTrigger,\n } from 'reka-ui'\n import Card from '../card/Card.vue'\n import { cn } from '../../lib/cn'\n import { dropdownItem } from '../dropdown-menu/dropdown-menu.variants'\n\n defineOptions({ name: 'HnContextMenuSub' })\n\n const props = defineProps<{\n label?: string\n disabled?: boolean\n textValue?: string\n class?: string\n }>()\n\n const open = defineModel<boolean>('open')\n</script>\n\n<template>\n <ContextMenuSub v-model:open=\"open\">\n <ContextMenuSubTrigger\n :disabled=\"props.disabled\"\n :text-value=\"props.textValue ?? props.label\"\n :class=\"dropdownItem()\"\n >\n <slot name=\"icon\" />\n <span class=\"min-w-0 flex-1\">\n <slot name=\"label\">{{ props.label }}</slot>\n </span>\n <ChevronRight class=\"text-muted\" />\n </ContextMenuSubTrigger>\n <ContextMenuPortal>\n <ContextMenuSubContent as-child :side-offset=\"4\">\n <Card\n :padded=\"false\"\n :class=\"\n cn(\n 'hn-anim-pop z-(--hn-z-overlay) flex min-w-40 flex-col gap-0.5 p-1 shadow-md outline-none',\n props.class,\n )\n \"\n >\n <slot />\n </Card>\n </ContextMenuSubContent>\n </ContextMenuPortal>\n </ContextMenuSub>\n</template>\n","<script setup lang=\"ts\">\n import { ChevronRight } from '@lucide/vue'\n import {\n ContextMenuPortal,\n ContextMenuSub,\n ContextMenuSubContent,\n ContextMenuSubTrigger,\n } from 'reka-ui'\n import Card from '../card/Card.vue'\n import { cn } from '../../lib/cn'\n import { dropdownItem } from '../dropdown-menu/dropdown-menu.variants'\n\n defineOptions({ name: 'HnContextMenuSub' })\n\n const props = defineProps<{\n label?: string\n disabled?: boolean\n textValue?: string\n class?: string\n }>()\n\n const open = defineModel<boolean>('open')\n</script>\n\n<template>\n <ContextMenuSub v-model:open=\"open\">\n <ContextMenuSubTrigger\n :disabled=\"props.disabled\"\n :text-value=\"props.textValue ?? props.label\"\n :class=\"dropdownItem()\"\n >\n <slot name=\"icon\" />\n <span class=\"min-w-0 flex-1\">\n <slot name=\"label\">{{ props.label }}</slot>\n </span>\n <ChevronRight class=\"text-muted\" />\n </ContextMenuSubTrigger>\n <ContextMenuPortal>\n <ContextMenuSubContent as-child :side-offset=\"4\">\n <Card\n :padded=\"false\"\n :class=\"\n cn(\n 'hn-anim-pop z-(--hn-z-overlay) flex min-w-40 flex-col gap-0.5 p-1 shadow-md outline-none',\n props.class,\n )\n \"\n >\n <slot />\n </Card>\n </ContextMenuSubContent>\n </ContextMenuPortal>\n </ContextMenuSub>\n</template>\n","<script setup lang=\"ts\">\n import { ContextMenuLabel } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnContextMenuLabel' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <ContextMenuLabel :class=\"cn('text-muted px-2.5 py-1.5 text-xs font-medium', props.class)\">\n <slot />\n </ContextMenuLabel>\n</template>\n","<script setup lang=\"ts\">\n import { ContextMenuLabel } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnContextMenuLabel' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <ContextMenuLabel :class=\"cn('text-muted px-2.5 py-1.5 text-xs font-medium', props.class)\">\n <slot />\n </ContextMenuLabel>\n</template>\n","<script setup lang=\"ts\">\n import { ContextMenuSeparator } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnContextMenuSeparator' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <ContextMenuSeparator :class=\"cn('bg-line -mx-1 my-1 h-px', props.class)\" />\n</template>\n","<script setup lang=\"ts\">\n import { ContextMenuSeparator } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnContextMenuSeparator' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <ContextMenuSeparator :class=\"cn('bg-line -mx-1 my-1 h-px', props.class)\" />\n</template>\n","<script setup lang=\"ts\">\n import { ContextMenuRadioGroup } from 'reka-ui'\n\n defineOptions({ name: 'HnContextMenuRadioGroup' })\n\n const value = defineModel<string>()\n</script>\n\n<template>\n <ContextMenuRadioGroup v-model=\"value\">\n <slot />\n </ContextMenuRadioGroup>\n</template>\n","<script setup lang=\"ts\">\n import { ContextMenuRadioGroup } from 'reka-ui'\n\n defineOptions({ name: 'HnContextMenuRadioGroup' })\n\n const value = defineModel<string>()\n</script>\n\n<template>\n <ContextMenuRadioGroup v-model=\"value\">\n <slot />\n </ContextMenuRadioGroup>\n</template>\n","<script setup lang=\"ts\">\n import { Check } from '@lucide/vue'\n import { ContextMenuItemIndicator, ContextMenuRadioItem } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { dropdownItem } from '../dropdown-menu/dropdown-menu.variants'\n\n defineOptions({ name: 'HnContextMenuRadioItem', inheritAttrs: false })\n\n const props = defineProps<{\n value: string\n disabled?: boolean\n textValue?: string\n class?: string\n }>()\n</script>\n\n<template>\n <ContextMenuRadioItem\n v-bind=\"$attrs\"\n :value=\"props.value\"\n :disabled=\"props.disabled\"\n :text-value=\"props.textValue\"\n :class=\"cn(dropdownItem(), props.class)\"\n >\n <span class=\"min-w-0 flex-1\"><slot /></span>\n <span class=\"flex size-4 shrink-0 items-center justify-center\">\n <ContextMenuItemIndicator>\n <Check class=\"size-4\" />\n </ContextMenuItemIndicator>\n </span>\n </ContextMenuRadioItem>\n</template>\n","<script setup lang=\"ts\">\n import { Check } from '@lucide/vue'\n import { ContextMenuItemIndicator, ContextMenuRadioItem } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { dropdownItem } from '../dropdown-menu/dropdown-menu.variants'\n\n defineOptions({ name: 'HnContextMenuRadioItem', inheritAttrs: false })\n\n const props = defineProps<{\n value: string\n disabled?: boolean\n textValue?: string\n class?: string\n }>()\n</script>\n\n<template>\n <ContextMenuRadioItem\n v-bind=\"$attrs\"\n :value=\"props.value\"\n :disabled=\"props.disabled\"\n :text-value=\"props.textValue\"\n :class=\"cn(dropdownItem(), props.class)\"\n >\n <span class=\"min-w-0 flex-1\"><slot /></span>\n <span class=\"flex size-4 shrink-0 items-center justify-center\">\n <ContextMenuItemIndicator>\n <Check class=\"size-4\" />\n </ContextMenuItemIndicator>\n </span>\n </ContextMenuRadioItem>\n</template>\n","import { onBeforeUnmount, shallowRef, watch, type Ref } from 'vue'\n\ninterface Options {\n enabled: () => boolean\n open: Ref<boolean | undefined>\n dismiss: () => void\n}\n\nconst DISTANCE_RATIO = 0.3\nconst FLICK_VELOCITY = 0.6\n\nexport function useDragToDismiss(panel: () => HTMLElement | null, options: Options) {\n const dragging = shallowRef(false)\n const offset = shallowRef(0)\n let startY = 0\n let startTime = 0\n let pointerId: number | null = null\n\n function onPointerMove(event: PointerEvent) {\n if (event.pointerId !== pointerId) return\n offset.value = Math.max(0, event.clientY - startY)\n }\n\n function detach() {\n window.removeEventListener('pointermove', onPointerMove)\n window.removeEventListener('pointerup', finish)\n window.removeEventListener('pointercancel', finish)\n pointerId = null\n dragging.value = false\n }\n\n function finish(event: PointerEvent) {\n if (event.pointerId !== pointerId) return\n detach()\n const height = panel()?.offsetHeight ?? 0\n const elapsed = Math.max(1, performance.now() - startTime)\n const velocity = offset.value / elapsed\n const far = height > 0 && offset.value > height * DISTANCE_RATIO\n if (offset.value > 0 && (far || velocity > FLICK_VELOCITY)) {\n options.dismiss()\n return\n }\n offset.value = 0\n }\n\n function onPointerDown(event: PointerEvent) {\n if (!options.enabled() || pointerId !== null || event.button !== 0) return\n pointerId = event.pointerId\n startY = event.clientY\n startTime = performance.now()\n dragging.value = true\n window.addEventListener('pointermove', onPointerMove)\n window.addEventListener('pointerup', finish)\n window.addEventListener('pointercancel', finish)\n }\n\n watch(options.open, value => {\n if (value) offset.value = 0\n })\n\n onBeforeUnmount(detach)\n\n return { dragging, offset, onPointerDown }\n}\n","import { tv } from '../../lib/tv'\n\nexport const sheetPanel = tv({\n base: [\n 'hn-anim-sheet-bottom hn-transition pointer-events-auto fixed inset-x-0 bottom-0 z-(--hn-z-overlay)',\n 'mx-auto flex max-h-[calc(100dvh-3rem)] w-full flex-col gap-4 sm:max-w-xl',\n 'rounded-t-xl rounded-b-none border-b-0 pt-2 shadow-lg outline-none',\n 'pb-[max(var(--hn-panel-p),env(safe-area-inset-bottom))]',\n 'data-dragging:transition-none',\n ],\n})\n\nexport const sheetGrip = tv({\n base: 'flex shrink-0 cursor-grab touch-none flex-col select-none data-dragging:cursor-grabbing',\n})\n\nexport const sheetHandle = tv({\n base: 'bg-line-strong hn-transition-base mx-auto mb-3 h-1.5 w-10 rounded-full data-disabled:opacity-50',\n})\n","<script setup lang=\"ts\">\n import { computed, shallowRef } from 'vue'\n import {\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogOverlay,\n DialogPortal,\n DialogRoot,\n DialogTitle,\n DialogTrigger,\n } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import Card from '../card/Card.vue'\n import CloseButton from '../close-button/CloseButton.vue'\n import Heading from '../heading/Heading.vue'\n import ScrollArea from '../scroll-area/ScrollArea.vue'\n import Text from '../text/Text.vue'\n import { useDragToDismiss } from './composables/useDragToDismiss'\n import { sheetGrip, sheetHandle, sheetPanel } from './sheet.variants'\n\n defineOptions({ name: 'HnSheet' })\n\n const props = withDefaults(\n defineProps<{\n title: string\n description?: string\n handle?: boolean\n locked?: boolean\n class?: string\n }>(),\n { handle: true, locked: false },\n )\n\n const open = defineModel<boolean>('open')\n const t = useUiLocale()\n const panel = shallowRef<{ $el: HTMLElement } | null>(null)\n\n const { dragging, offset, onPointerDown } = useDragToDismiss(() => panel.value?.$el ?? null, {\n enabled: () => !props.locked,\n open,\n dismiss: () => (open.value = false),\n })\n\n const style = computed(() =>\n offset.value\n ? { transform: `translateY(${offset.value}px)`, '--hn-sheet-from-y': `${offset.value}px` }\n : undefined,\n )\n\n function guard(event: Event) {\n if (props.locked) event.preventDefault()\n }\n\n function close() {\n open.value = false\n }\n</script>\n\n<template>\n <DialogRoot v-model:open=\"open\">\n <DialogTrigger v-if=\"$slots.default\" as-child>\n <slot />\n </DialogTrigger>\n <DialogPortal>\n <DialogOverlay class=\"hn-scrim\" />\n <DialogContent as-child @escape-key-down=\"guard\" @interact-outside=\"guard\">\n <Card\n ref=\"panel\"\n data-hn-sheet\n :data-dragging=\"dragging ? '' : undefined\"\n :padded=\"false\"\n :style=\"style\"\n :class=\"cn(sheetPanel(), props.class)\"\n >\n <div\n data-hn-sheet-grip\n :data-dragging=\"dragging ? '' : undefined\"\n :class=\"sheetGrip()\"\n @pointerdown=\"onPointerDown\"\n >\n <div\n v-if=\"props.handle\"\n aria-hidden=\"true\"\n :data-disabled=\"props.locked ? '' : undefined\"\n :class=\"sheetHandle()\"\n />\n <div class=\"flex items-start justify-between gap-4 px-(--hn-panel-p)\">\n <div class=\"flex min-w-0 flex-col gap-1.5\">\n <DialogTitle as-child>\n <Heading :level=\"2\" size=\"lg\">{{ props.title }}</Heading>\n </DialogTitle>\n <DialogDescription v-if=\"props.description\" as-child>\n <Text tone=\"muted\">{{ props.description }}</Text>\n </DialogDescription>\n </div>\n <DialogClose v-if=\"!props.handle\" as-child>\n <CloseButton :disabled=\"props.locked\" class=\"-mt-1.5 -me-1.5 shrink-0\" />\n </DialogClose>\n </div>\n </div>\n <ScrollArea v-if=\"$slots.content\" class=\"min-h-0 grow\">\n <div class=\"px-(--hn-panel-p) py-1\">\n <slot name=\"content\" :close=\"close\" />\n </div>\n </ScrollArea>\n <div\n v-if=\"$slots.footer\"\n class=\"flex shrink-0 justify-end gap-(--hn-inline-gap) px-(--hn-panel-p)\"\n >\n <slot name=\"footer\" :close=\"close\" />\n </div>\n </Card>\n </DialogContent>\n </DialogPortal>\n </DialogRoot>\n</template>\n","<script setup lang=\"ts\">\n import { computed, shallowRef } from 'vue'\n import {\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogOverlay,\n DialogPortal,\n DialogRoot,\n DialogTitle,\n DialogTrigger,\n } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import Card from '../card/Card.vue'\n import CloseButton from '../close-button/CloseButton.vue'\n import Heading from '../heading/Heading.vue'\n import ScrollArea from '../scroll-area/ScrollArea.vue'\n import Text from '../text/Text.vue'\n import { useDragToDismiss } from './composables/useDragToDismiss'\n import { sheetGrip, sheetHandle, sheetPanel } from './sheet.variants'\n\n defineOptions({ name: 'HnSheet' })\n\n const props = withDefaults(\n defineProps<{\n title: string\n description?: string\n handle?: boolean\n locked?: boolean\n class?: string\n }>(),\n { handle: true, locked: false },\n )\n\n const open = defineModel<boolean>('open')\n const t = useUiLocale()\n const panel = shallowRef<{ $el: HTMLElement } | null>(null)\n\n const { dragging, offset, onPointerDown } = useDragToDismiss(() => panel.value?.$el ?? null, {\n enabled: () => !props.locked,\n open,\n dismiss: () => (open.value = false),\n })\n\n const style = computed(() =>\n offset.value\n ? { transform: `translateY(${offset.value}px)`, '--hn-sheet-from-y': `${offset.value}px` }\n : undefined,\n )\n\n function guard(event: Event) {\n if (props.locked) event.preventDefault()\n }\n\n function close() {\n open.value = false\n }\n</script>\n\n<template>\n <DialogRoot v-model:open=\"open\">\n <DialogTrigger v-if=\"$slots.default\" as-child>\n <slot />\n </DialogTrigger>\n <DialogPortal>\n <DialogOverlay class=\"hn-scrim\" />\n <DialogContent as-child @escape-key-down=\"guard\" @interact-outside=\"guard\">\n <Card\n ref=\"panel\"\n data-hn-sheet\n :data-dragging=\"dragging ? '' : undefined\"\n :padded=\"false\"\n :style=\"style\"\n :class=\"cn(sheetPanel(), props.class)\"\n >\n <div\n data-hn-sheet-grip\n :data-dragging=\"dragging ? '' : undefined\"\n :class=\"sheetGrip()\"\n @pointerdown=\"onPointerDown\"\n >\n <div\n v-if=\"props.handle\"\n aria-hidden=\"true\"\n :data-disabled=\"props.locked ? '' : undefined\"\n :class=\"sheetHandle()\"\n />\n <div class=\"flex items-start justify-between gap-4 px-(--hn-panel-p)\">\n <div class=\"flex min-w-0 flex-col gap-1.5\">\n <DialogTitle as-child>\n <Heading :level=\"2\" size=\"lg\">{{ props.title }}</Heading>\n </DialogTitle>\n <DialogDescription v-if=\"props.description\" as-child>\n <Text tone=\"muted\">{{ props.description }}</Text>\n </DialogDescription>\n </div>\n <DialogClose v-if=\"!props.handle\" as-child>\n <CloseButton :disabled=\"props.locked\" class=\"-mt-1.5 -me-1.5 shrink-0\" />\n </DialogClose>\n </div>\n </div>\n <ScrollArea v-if=\"$slots.content\" class=\"min-h-0 grow\">\n <div class=\"px-(--hn-panel-p) py-1\">\n <slot name=\"content\" :close=\"close\" />\n </div>\n </ScrollArea>\n <div\n v-if=\"$slots.footer\"\n class=\"flex shrink-0 justify-end gap-(--hn-inline-gap) px-(--hn-panel-p)\"\n >\n <slot name=\"footer\" :close=\"close\" />\n </div>\n </Card>\n </DialogContent>\n </DialogPortal>\n </DialogRoot>\n</template>\n","import { onBeforeUnmount, shallowRef, watch } from 'vue'\n\ninterface Delays {\n delay: number\n minVisible: number\n}\n\nexport function useDelayedVisible(visible: () => boolean, delays: () => Delays) {\n const shown = shallowRef(false)\n let timer: ReturnType<typeof setTimeout> | undefined\n let shownAt = 0\n\n function clear() {\n clearTimeout(timer)\n timer = undefined\n }\n\n function show() {\n shown.value = true\n shownAt = performance.now()\n timer = undefined\n }\n\n function hide() {\n shown.value = false\n timer = undefined\n }\n\n watch(\n visible,\n value => {\n clear()\n const { delay, minVisible } = delays()\n if (value) {\n if (shown.value) return\n if (delay <= 0) show()\n else timer = setTimeout(show, delay)\n return\n }\n if (!shown.value) return\n const remaining = minVisible - (performance.now() - shownAt)\n if (remaining <= 0) hide()\n else timer = setTimeout(hide, remaining)\n },\n { immediate: true },\n )\n\n onBeforeUnmount(clear)\n\n return shown\n}\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const loadingOverlay = tv({\n base: 'bg-veil flex flex-col items-center justify-center gap-3',\n variants: {\n fixed: {\n true: 'fixed inset-0 z-(--hn-z-overlay)',\n false: 'absolute inset-0 z-10',\n },\n },\n defaultVariants: { fixed: false },\n})\n\nexport const loadingBlocker = tv({\n base: '',\n variants: {\n fixed: {\n true: 'fixed inset-0 z-(--hn-z-overlay)',\n false: 'absolute inset-0 z-10',\n },\n },\n defaultVariants: { fixed: false },\n})\n\nexport type LoadingOverlayVariants = VariantProps<typeof loadingOverlay>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import Spinner from '../spinner/Spinner.vue'\n import type { SpinnerVariants } from '../spinner/spinner.variants'\n import Text from '../text/Text.vue'\n import { useDelayedVisible } from './composables/useDelayedVisible'\n import { loadingBlocker, loadingOverlay } from './loading-overlay.variants'\n\n defineOptions({ name: 'HnLoadingOverlay' })\n\n const props = withDefaults(\n defineProps<{\n visible?: boolean\n text?: string\n fixed?: boolean\n size?: SpinnerVariants['size']\n delay?: number\n minVisible?: number\n class?: string\n }>(),\n { visible: false, fixed: false, size: 'md', delay: 300, minVisible: 300 },\n )\n\n const shown = useDelayedVisible(\n () => props.visible,\n () => ({ delay: props.delay, minVisible: props.minVisible }),\n )\n</script>\n\n<template>\n <div\n v-if=\"props.visible && !shown\"\n data-hn-loading-blocker\n aria-hidden=\"true\"\n :class=\"loadingBlocker({ fixed: props.fixed })\"\n />\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"opacity-0\"\n >\n <div\n v-if=\"shown\"\n data-hn-loading-overlay\n :class=\"cn(loadingOverlay({ fixed: props.fixed }), props.class)\"\n >\n <slot>\n <Spinner :size=\"props.size\" :label=\"props.text\" />\n <Text v-if=\"props.text\" size=\"sm\" tone=\"muted\" aria-hidden=\"true\">{{ props.text }}</Text>\n </slot>\n </div>\n </Transition>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import Spinner from '../spinner/Spinner.vue'\n import type { SpinnerVariants } from '../spinner/spinner.variants'\n import Text from '../text/Text.vue'\n import { useDelayedVisible } from './composables/useDelayedVisible'\n import { loadingBlocker, loadingOverlay } from './loading-overlay.variants'\n\n defineOptions({ name: 'HnLoadingOverlay' })\n\n const props = withDefaults(\n defineProps<{\n visible?: boolean\n text?: string\n fixed?: boolean\n size?: SpinnerVariants['size']\n delay?: number\n minVisible?: number\n class?: string\n }>(),\n { visible: false, fixed: false, size: 'md', delay: 300, minVisible: 300 },\n )\n\n const shown = useDelayedVisible(\n () => props.visible,\n () => ({ delay: props.delay, minVisible: props.minVisible }),\n )\n</script>\n\n<template>\n <div\n v-if=\"props.visible && !shown\"\n data-hn-loading-blocker\n aria-hidden=\"true\"\n :class=\"loadingBlocker({ fixed: props.fixed })\"\n />\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"opacity-0\"\n >\n <div\n v-if=\"shown\"\n data-hn-loading-overlay\n :class=\"cn(loadingOverlay({ fixed: props.fixed }), props.class)\"\n >\n <slot>\n <Spinner :size=\"props.size\" :label=\"props.text\" />\n <Text v-if=\"props.text\" size=\"sm\" tone=\"muted\" aria-hidden=\"true\">{{ props.text }}</Text>\n </slot>\n </div>\n </Transition>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const panelHeader = tv({\n base: 'flex items-start justify-between gap-4 px-(--hn-panel-p) pt-(--hn-panel-p)',\n})\n\nexport const panelTitle = tv({\n base: 'flex min-w-0 items-center gap-2',\n})\n\nexport const panelIcon = tv({\n base: 'text-muted flex shrink-0 [&_svg]:size-4.5',\n})\n\nexport const panelActions = tv({\n base: 'flex shrink-0 items-center gap-2',\n})\n\nexport const panelBody = tv({\n base: 'pt-4',\n variants: {\n padded: {\n true: 'px-(--hn-panel-p) pb-(--hn-panel-p)',\n },\n },\n defaultVariants: { padded: true },\n})\n\nexport type PanelVariants = VariantProps<typeof panelBody>\n","<script setup lang=\"ts\">\n import { useSlots } from 'vue'\n import { cn } from '../../lib/cn'\n import Card from '../card/Card.vue'\n import Heading from '../heading/Heading.vue'\n import Text from '../text/Text.vue'\n import { panelActions, panelBody, panelHeader, panelIcon, panelTitle } from './panel.variants'\n\n defineOptions({ name: 'HnPanel' })\n\n const props = withDefaults(\n defineProps<{\n title: string\n description?: string\n count?: number\n level?: 2 | 3 | 4\n padded?: boolean\n class?: string\n }>(),\n { level: 2, padded: true },\n )\n\n const slots = useSlots()\n</script>\n\n<template>\n <Card data-hn-panel :padded=\"false\" :class=\"cn('flex flex-col', props.class)\">\n <div :class=\"panelHeader()\">\n <div class=\"flex min-w-0 flex-col gap-1\">\n <div :class=\"panelTitle()\">\n <span v-if=\"slots.icon\" :class=\"panelIcon()\" aria-hidden=\"true\">\n <slot name=\"icon\" />\n </span>\n <Heading :level=\"props.level\" size=\"base\" class=\"min-w-0\">\n <slot name=\"title\">{{ props.title }}</slot>\n </Heading>\n <Text\n v-if=\"props.count !== undefined\"\n as=\"span\"\n tone=\"muted\"\n size=\"sm\"\n class=\"tabular-nums\"\n >\n {{ props.count }}\n </Text>\n </div>\n <Text v-if=\"props.description || slots.description\" tone=\"muted\" size=\"sm\">\n <slot name=\"description\">{{ props.description }}</slot>\n </Text>\n </div>\n <div v-if=\"slots.actions\" :class=\"panelActions()\">\n <slot name=\"actions\" />\n </div>\n </div>\n <div v-if=\"slots.default\" :class=\"panelBody({ padded: props.padded })\">\n <slot />\n </div>\n </Card>\n</template>\n","<script setup lang=\"ts\">\n import { useSlots } from 'vue'\n import { cn } from '../../lib/cn'\n import Card from '../card/Card.vue'\n import Heading from '../heading/Heading.vue'\n import Text from '../text/Text.vue'\n import { panelActions, panelBody, panelHeader, panelIcon, panelTitle } from './panel.variants'\n\n defineOptions({ name: 'HnPanel' })\n\n const props = withDefaults(\n defineProps<{\n title: string\n description?: string\n count?: number\n level?: 2 | 3 | 4\n padded?: boolean\n class?: string\n }>(),\n { level: 2, padded: true },\n )\n\n const slots = useSlots()\n</script>\n\n<template>\n <Card data-hn-panel :padded=\"false\" :class=\"cn('flex flex-col', props.class)\">\n <div :class=\"panelHeader()\">\n <div class=\"flex min-w-0 flex-col gap-1\">\n <div :class=\"panelTitle()\">\n <span v-if=\"slots.icon\" :class=\"panelIcon()\" aria-hidden=\"true\">\n <slot name=\"icon\" />\n </span>\n <Heading :level=\"props.level\" size=\"base\" class=\"min-w-0\">\n <slot name=\"title\">{{ props.title }}</slot>\n </Heading>\n <Text\n v-if=\"props.count !== undefined\"\n as=\"span\"\n tone=\"muted\"\n size=\"sm\"\n class=\"tabular-nums\"\n >\n {{ props.count }}\n </Text>\n </div>\n <Text v-if=\"props.description || slots.description\" tone=\"muted\" size=\"sm\">\n <slot name=\"description\">{{ props.description }}</slot>\n </Text>\n </div>\n <div v-if=\"slots.actions\" :class=\"panelActions()\">\n <slot name=\"actions\" />\n </div>\n </div>\n <div v-if=\"slots.default\" :class=\"panelBody({ padded: props.padded })\">\n <slot />\n </div>\n </Card>\n</template>\n","import { computed, toValue, type MaybeRefOrGetter } from 'vue'\nimport { useUiLocale } from '../../../locale'\n\nexport type ProgressFormat = (value: number, max: number) => string\n\ninterface Options {\n value: MaybeRefOrGetter<number | null | undefined>\n max: MaybeRefOrGetter<number>\n label: MaybeRefOrGetter<string | undefined>\n format: MaybeRefOrGetter<ProgressFormat | undefined>\n}\n\nexport function useProgressValue(options: Options) {\n const t = useUiLocale()\n\n const current = computed(() => {\n const value = toValue(options.value)\n if (typeof value !== 'number') return null\n return Math.min(Math.max(value, 0), toValue(options.max))\n })\n\n const ratio = computed(() => {\n const max = toValue(options.max)\n return current.value === null || max <= 0 ? 0 : current.value / max\n })\n\n const text = computed(() => {\n if (current.value === null) return undefined\n const format = toValue(options.format)\n if (format) return format(current.value, toValue(options.max))\n return new Intl.NumberFormat(t.value.tag, {\n style: 'percent',\n maximumFractionDigits: 0,\n }).format(ratio.value)\n })\n\n const name = computed(() => toValue(options.label) ?? text.value ?? t.value.common.loading)\n\n return { current, ratio, text, name }\n}\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const progress = tv({\n base: 'flex w-full min-w-0 flex-col gap-1.5',\n})\n\nexport const progressHeader = tv({\n base: 'text-fg flex items-baseline justify-between gap-3 text-sm',\n})\n\nexport const progressValue = tv({\n base: 'text-muted ms-auto tabular-nums',\n})\n\nexport const progressTrack = tv({\n base: 'bg-line-strong relative w-full overflow-hidden rounded-full rtl:[--hn-progress-dir:-1]',\n variants: {\n size: {\n sm: 'h-1',\n md: 'h-2',\n lg: 'h-3',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nexport const progressBar = tv({\n base: 'hn-progress-bar block h-full w-[calc(var(--hn-progress-p,0)*100%)] rounded-full',\n variants: {\n tone: {\n accent: 'bg-accent',\n neutral: 'bg-neutral-solid',\n success: 'bg-success',\n warning: 'bg-warning',\n danger: 'bg-danger',\n info: 'bg-info',\n },\n },\n defaultVariants: {\n tone: 'accent',\n },\n})\n\nexport type ProgressVariants = VariantProps<typeof progressTrack> & VariantProps<typeof progressBar>\n","<script setup lang=\"ts\">\n import { ProgressIndicator, ProgressRoot } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { useProgressValue, type ProgressFormat } from './composables/useProgressValue'\n import {\n progress,\n progressBar,\n progressHeader,\n progressTrack,\n progressValue,\n type ProgressVariants,\n } from './progress.variants'\n\n defineOptions({ name: 'HnProgress', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n value?: number | null\n max?: number\n label?: string\n showValue?: boolean\n format?: ProgressFormat\n tone?: ProgressVariants['tone']\n size?: ProgressVariants['size']\n class?: string\n }>(),\n { value: null, max: 100, showValue: false },\n )\n\n const { current, ratio, text, name } = useProgressValue({\n value: () => props.value,\n max: () => props.max,\n label: () => props.label,\n format: () => props.format,\n })\n</script>\n\n<template>\n <div\n data-hn-progress\n :class=\"cn(progress(), props.class)\"\n :style=\"{ '--hn-progress-p': String(ratio) }\"\n >\n <div v-if=\"props.label || (props.showValue && text)\" :class=\"progressHeader()\">\n <span v-if=\"props.label\">{{ props.label }}</span>\n <span v-if=\"props.showValue && text\" :class=\"progressValue()\">{{ text }}</span>\n </div>\n <ProgressRoot\n v-bind=\"$attrs\"\n :model-value=\"current\"\n :max=\"props.max\"\n :get-value-label=\"() => name\"\n :get-value-text=\"props.format ? () => text : undefined\"\n :class=\"progressTrack({ size: props.size })\"\n >\n <ProgressIndicator :class=\"progressBar({ tone: props.tone })\" />\n </ProgressRoot>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { ProgressIndicator, ProgressRoot } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { useProgressValue, type ProgressFormat } from './composables/useProgressValue'\n import {\n progress,\n progressBar,\n progressHeader,\n progressTrack,\n progressValue,\n type ProgressVariants,\n } from './progress.variants'\n\n defineOptions({ name: 'HnProgress', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n value?: number | null\n max?: number\n label?: string\n showValue?: boolean\n format?: ProgressFormat\n tone?: ProgressVariants['tone']\n size?: ProgressVariants['size']\n class?: string\n }>(),\n { value: null, max: 100, showValue: false },\n )\n\n const { current, ratio, text, name } = useProgressValue({\n value: () => props.value,\n max: () => props.max,\n label: () => props.label,\n format: () => props.format,\n })\n</script>\n\n<template>\n <div\n data-hn-progress\n :class=\"cn(progress(), props.class)\"\n :style=\"{ '--hn-progress-p': String(ratio) }\"\n >\n <div v-if=\"props.label || (props.showValue && text)\" :class=\"progressHeader()\">\n <span v-if=\"props.label\">{{ props.label }}</span>\n <span v-if=\"props.showValue && text\" :class=\"progressValue()\">{{ text }}</span>\n </div>\n <ProgressRoot\n v-bind=\"$attrs\"\n :model-value=\"current\"\n :max=\"props.max\"\n :get-value-label=\"() => name\"\n :get-value-text=\"props.format ? () => text : undefined\"\n :class=\"progressTrack({ size: props.size })\"\n >\n <ProgressIndicator :class=\"progressBar({ tone: props.tone })\" />\n </ProgressRoot>\n </div>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const ringProgress = tv({\n base: 'inline-flex flex-col items-center gap-1.5',\n})\n\nexport const ringProgressRoot = tv({\n base: 'relative shrink-0',\n variants: {\n size: {\n sm: 'size-10 text-xs',\n md: 'size-16 text-sm',\n lg: 'size-24 text-lg',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nexport const ringProgressSvg = tv({\n base: 'hn-ring-spin size-full -rotate-90',\n})\n\nexport const ringProgressTrack = tv({\n base: 'stroke-line-strong fill-none',\n})\n\nexport const ringProgressArc = tv({\n base: 'hn-ring-arc fill-none',\n variants: {\n tone: {\n accent: 'stroke-accent',\n neutral: 'stroke-neutral-solid',\n success: 'stroke-success',\n warning: 'stroke-warning',\n danger: 'stroke-danger',\n info: 'stroke-info',\n },\n },\n defaultVariants: {\n tone: 'accent',\n },\n})\n\nexport const ringProgressCenter = tv({\n base: 'text-fg absolute inset-0 flex items-center justify-center tabular-nums',\n})\n\nexport const ringProgressLabel = tv({\n base: 'text-muted text-sm',\n})\n\nexport type RingProgressVariants = VariantProps<typeof ringProgressRoot> &\n VariantProps<typeof ringProgressArc>\n","<script setup lang=\"ts\">\n import { ProgressRoot } from 'reka-ui'\n import { computed, useSlots } from 'vue'\n import { cn } from '../../lib/cn'\n import { useProgressValue, type ProgressFormat } from '../progress/composables/useProgressValue'\n import {\n ringProgress,\n ringProgressArc,\n ringProgressCenter,\n ringProgressLabel,\n ringProgressRoot,\n ringProgressSvg,\n ringProgressTrack,\n type RingProgressVariants,\n } from './ring-progress.variants'\n\n defineOptions({ name: 'HnRingProgress', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n value?: number | null\n max?: number\n label?: string\n showValue?: boolean\n format?: ProgressFormat\n tone?: RingProgressVariants['tone']\n size?: RingProgressVariants['size']\n class?: string\n }>(),\n { value: null, max: 100, showValue: false },\n )\n\n const slots = useSlots()\n const { current, text, name } = useProgressValue({\n value: () => props.value,\n max: () => props.max,\n label: () => props.label,\n format: () => props.format,\n })\n const offset = computed(() => {\n if (current.value === null) return 75\n return props.max > 0 ? 100 - (current.value * 100) / props.max : 100\n })\n</script>\n\n<template>\n <div data-hn-ring-progress :class=\"cn(ringProgress(), props.class)\">\n <ProgressRoot\n v-bind=\"$attrs\"\n :model-value=\"current\"\n :max=\"props.max\"\n :get-value-label=\"() => name\"\n :get-value-text=\"props.format ? () => text : undefined\"\n :class=\"ringProgressRoot({ size: props.size })\"\n >\n <svg viewBox=\"0 0 100 100\" aria-hidden=\"true\" :class=\"ringProgressSvg()\">\n <circle cx=\"50\" cy=\"50\" r=\"45\" stroke-width=\"10\" :class=\"ringProgressTrack()\" />\n <circle\n cx=\"50\"\n cy=\"50\"\n r=\"45\"\n stroke-width=\"10\"\n pathLength=\"100\"\n stroke-dasharray=\"100\"\n :stroke-dashoffset=\"offset\"\n :stroke-linecap=\"offset < 100 ? 'round' : undefined\"\n :class=\"ringProgressArc({ tone: props.tone })\"\n />\n </svg>\n <div v-if=\"slots.default || (props.showValue && text)\" :class=\"ringProgressCenter()\">\n <slot>{{ text }}</slot>\n </div>\n </ProgressRoot>\n <span v-if=\"props.label\" :class=\"ringProgressLabel()\">{{ props.label }}</span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { ProgressRoot } from 'reka-ui'\n import { computed, useSlots } from 'vue'\n import { cn } from '../../lib/cn'\n import { useProgressValue, type ProgressFormat } from '../progress/composables/useProgressValue'\n import {\n ringProgress,\n ringProgressArc,\n ringProgressCenter,\n ringProgressLabel,\n ringProgressRoot,\n ringProgressSvg,\n ringProgressTrack,\n type RingProgressVariants,\n } from './ring-progress.variants'\n\n defineOptions({ name: 'HnRingProgress', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n value?: number | null\n max?: number\n label?: string\n showValue?: boolean\n format?: ProgressFormat\n tone?: RingProgressVariants['tone']\n size?: RingProgressVariants['size']\n class?: string\n }>(),\n { value: null, max: 100, showValue: false },\n )\n\n const slots = useSlots()\n const { current, text, name } = useProgressValue({\n value: () => props.value,\n max: () => props.max,\n label: () => props.label,\n format: () => props.format,\n })\n const offset = computed(() => {\n if (current.value === null) return 75\n return props.max > 0 ? 100 - (current.value * 100) / props.max : 100\n })\n</script>\n\n<template>\n <div data-hn-ring-progress :class=\"cn(ringProgress(), props.class)\">\n <ProgressRoot\n v-bind=\"$attrs\"\n :model-value=\"current\"\n :max=\"props.max\"\n :get-value-label=\"() => name\"\n :get-value-text=\"props.format ? () => text : undefined\"\n :class=\"ringProgressRoot({ size: props.size })\"\n >\n <svg viewBox=\"0 0 100 100\" aria-hidden=\"true\" :class=\"ringProgressSvg()\">\n <circle cx=\"50\" cy=\"50\" r=\"45\" stroke-width=\"10\" :class=\"ringProgressTrack()\" />\n <circle\n cx=\"50\"\n cy=\"50\"\n r=\"45\"\n stroke-width=\"10\"\n pathLength=\"100\"\n stroke-dasharray=\"100\"\n :stroke-dashoffset=\"offset\"\n :stroke-linecap=\"offset < 100 ? 'round' : undefined\"\n :class=\"ringProgressArc({ tone: props.tone })\"\n />\n </svg>\n <div v-if=\"slots.default || (props.showValue && text)\" :class=\"ringProgressCenter()\">\n <slot>{{ text }}</slot>\n </div>\n </ProgressRoot>\n <span v-if=\"props.label\" :class=\"ringProgressLabel()\">{{ props.label }}</span>\n </div>\n</template>\n","import { tv } from '../../lib/tv'\n\nexport const meterGroup = tv({\n base: 'flex w-full min-w-0 flex-col gap-2',\n})\n\nexport const meterHeader = tv({\n base: 'text-fg flex items-baseline justify-between gap-3 text-sm',\n})\n\nexport const meterSegment = tv({\n base: 'hn-progress-bar block h-full shrink-0',\n variants: {\n tone: {\n accent: 'bg-accent',\n neutral: 'bg-neutral-solid',\n success: 'bg-success',\n warning: 'bg-warning',\n danger: 'bg-danger',\n info: 'bg-info',\n },\n },\n defaultVariants: {\n tone: 'accent',\n },\n})\n\nexport const meterLegend = tv({\n base: 'flex flex-wrap gap-x-4 gap-y-1 text-sm',\n})\n\nexport const meterLegendItem = tv({\n base: 'inline-flex items-center gap-1.5',\n})\n\nexport const meterValue = tv({\n base: 'text-muted tabular-nums',\n})\n","import type { MeterTone } from '../types'\n\nexport const METER_TONES: MeterTone[] = [\n 'accent',\n 'info',\n 'success',\n 'warning',\n 'danger',\n 'neutral',\n]\n\nexport function toneAt(index: number): MeterTone {\n return METER_TONES[index % METER_TONES.length]!\n}\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import Indicator from '../indicator/Indicator.vue'\n import type { ProgressFormat } from '../progress/composables/useProgressValue'\n import { progressTrack, type ProgressVariants } from '../progress/progress.variants'\n import {\n meterGroup,\n meterHeader,\n meterLegend,\n meterLegendItem,\n meterSegment,\n meterValue,\n } from './meter-group.variants'\n import type { MeterItem } from './types'\n import { toneAt } from './utils/tones'\n\n defineOptions({ name: 'HnMeterGroup', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n items: MeterItem[]\n max?: number\n label?: string\n legend?: boolean\n format?: ProgressFormat\n size?: ProgressVariants['size']\n class?: string\n }>(),\n { max: 100, legend: true },\n )\n\n const t = useUiLocale()\n\n const percent = computed(\n () => new Intl.NumberFormat(t.value.tag, { style: 'percent', maximumFractionDigits: 0 }),\n )\n\n function text(value: number) {\n if (props.format) return props.format(value, props.max)\n return percent.value.format(props.max > 0 ? value / props.max : 0)\n }\n\n const entries = computed(() =>\n props.items.map((item, index) => {\n const value = Math.min(Math.max(item.value, 0), props.max)\n const ratio = props.max > 0 ? value / props.max : 0\n return {\n ...item,\n value,\n tone: item.tone ?? toneAt(index),\n width: `${ratio * 100}%`,\n text: text(value),\n }\n }),\n )\n\n const total = computed(() =>\n text(\n Math.min(\n entries.value.reduce((sum, entry) => sum + entry.value, 0),\n props.max,\n ),\n ),\n )\n</script>\n\n<template>\n <div data-hn-meter-group :class=\"cn(meterGroup(), props.class)\">\n <div v-if=\"props.label\" :class=\"meterHeader()\">\n <span>{{ props.label }}</span>\n <span :class=\"meterValue()\">{{ total }}</span>\n </div>\n <div\n v-bind=\"$attrs\"\n role=\"group\"\n :aria-label=\"props.label\"\n :class=\"cn(progressTrack({ size: props.size }), 'flex')\"\n >\n <span\n v-for=\"entry in entries\"\n :key=\"entry.label\"\n role=\"meter\"\n :aria-label=\"entry.label\"\n :aria-valuenow=\"entry.value\"\n aria-valuemin=\"0\"\n :aria-valuemax=\"props.max\"\n :aria-valuetext=\"props.format ? entry.text : undefined\"\n :class=\"meterSegment({ tone: entry.tone })\"\n :style=\"{ width: entry.width }\"\n />\n </div>\n <div v-if=\"props.legend\" :class=\"meterLegend()\">\n <span v-for=\"entry in entries\" :key=\"entry.label\" :class=\"meterLegendItem()\">\n <Indicator :tone=\"entry.tone\" size=\"sm\" />\n <span>{{ entry.label }}</span>\n <span :class=\"meterValue()\">{{ entry.text }}</span>\n </span>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import Indicator from '../indicator/Indicator.vue'\n import type { ProgressFormat } from '../progress/composables/useProgressValue'\n import { progressTrack, type ProgressVariants } from '../progress/progress.variants'\n import {\n meterGroup,\n meterHeader,\n meterLegend,\n meterLegendItem,\n meterSegment,\n meterValue,\n } from './meter-group.variants'\n import type { MeterItem } from './types'\n import { toneAt } from './utils/tones'\n\n defineOptions({ name: 'HnMeterGroup', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<{\n items: MeterItem[]\n max?: number\n label?: string\n legend?: boolean\n format?: ProgressFormat\n size?: ProgressVariants['size']\n class?: string\n }>(),\n { max: 100, legend: true },\n )\n\n const t = useUiLocale()\n\n const percent = computed(\n () => new Intl.NumberFormat(t.value.tag, { style: 'percent', maximumFractionDigits: 0 }),\n )\n\n function text(value: number) {\n if (props.format) return props.format(value, props.max)\n return percent.value.format(props.max > 0 ? value / props.max : 0)\n }\n\n const entries = computed(() =>\n props.items.map((item, index) => {\n const value = Math.min(Math.max(item.value, 0), props.max)\n const ratio = props.max > 0 ? value / props.max : 0\n return {\n ...item,\n value,\n tone: item.tone ?? toneAt(index),\n width: `${ratio * 100}%`,\n text: text(value),\n }\n }),\n )\n\n const total = computed(() =>\n text(\n Math.min(\n entries.value.reduce((sum, entry) => sum + entry.value, 0),\n props.max,\n ),\n ),\n )\n</script>\n\n<template>\n <div data-hn-meter-group :class=\"cn(meterGroup(), props.class)\">\n <div v-if=\"props.label\" :class=\"meterHeader()\">\n <span>{{ props.label }}</span>\n <span :class=\"meterValue()\">{{ total }}</span>\n </div>\n <div\n v-bind=\"$attrs\"\n role=\"group\"\n :aria-label=\"props.label\"\n :class=\"cn(progressTrack({ size: props.size }), 'flex')\"\n >\n <span\n v-for=\"entry in entries\"\n :key=\"entry.label\"\n role=\"meter\"\n :aria-label=\"entry.label\"\n :aria-valuenow=\"entry.value\"\n aria-valuemin=\"0\"\n :aria-valuemax=\"props.max\"\n :aria-valuetext=\"props.format ? entry.text : undefined\"\n :class=\"meterSegment({ tone: entry.tone })\"\n :style=\"{ width: entry.width }\"\n />\n </div>\n <div v-if=\"props.legend\" :class=\"meterLegend()\">\n <span v-for=\"entry in entries\" :key=\"entry.label\" :class=\"meterLegendItem()\">\n <Indicator :tone=\"entry.tone\" size=\"sm\" />\n <span>{{ entry.label }}</span>\n <span :class=\"meterValue()\">{{ entry.text }}</span>\n </span>\n </div>\n </div>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const empty = tv({\n base: 'flex w-full min-w-0 flex-col items-center justify-center text-center',\n variants: {\n size: {\n sm: 'gap-2 px-4 py-6',\n md: 'gap-3 px-6 py-10',\n lg: 'gap-4 px-8 py-14',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nexport const emptyIcon = tv({\n base: 'bg-subtle text-muted flex shrink-0 items-center justify-center rounded-full [&_svg]:shrink-0',\n variants: {\n size: {\n sm: 'size-10 [&_svg]:size-5',\n md: 'size-12 [&_svg]:size-6',\n lg: 'size-14 [&_svg]:size-7',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nexport const emptyText = tv({\n base: 'flex max-w-sm flex-col items-center gap-1',\n})\n\nexport const emptyTitle = tv({\n base: 'text-fg font-medium text-balance',\n variants: {\n size: {\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nexport const emptyDescription = tv({\n base: 'text-muted text-balance',\n variants: {\n size: {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-sm',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nexport const emptyActions = tv({\n base: 'flex flex-wrap items-center justify-center gap-2',\n})\n\nexport type EmptyVariants = VariantProps<typeof empty>\n","<script setup lang=\"ts\">\n import { Inbox } from '@lucide/vue'\n import { useSlots } from 'vue'\n import { cn } from '../../lib/cn'\n import {\n empty,\n emptyActions,\n emptyDescription,\n emptyIcon,\n emptyText,\n emptyTitle,\n type EmptyVariants,\n } from './empty.variants'\n\n defineOptions({ name: 'HnEmpty' })\n\n const props = withDefaults(\n defineProps<{\n title?: string\n description?: string\n icon?: boolean\n size?: EmptyVariants['size']\n class?: string\n }>(),\n { icon: true, size: 'md' },\n )\n\n const slots = useSlots()\n</script>\n\n<template>\n <div data-hn-empty :class=\"cn(empty({ size: props.size }), props.class)\">\n <span v-if=\"slots.icon\" aria-hidden=\"true\" class=\"flex shrink-0 justify-center\">\n <slot name=\"icon\" />\n </span>\n <span v-else-if=\"props.icon\" aria-hidden=\"true\" :class=\"emptyIcon({ size: props.size })\">\n <Inbox />\n </span>\n <div v-if=\"props.title || props.description\" :class=\"emptyText()\">\n <p v-if=\"props.title\" :class=\"emptyTitle({ size: props.size })\">{{ props.title }}</p>\n <p v-if=\"props.description\" :class=\"emptyDescription({ size: props.size })\">\n {{ props.description }}\n </p>\n </div>\n <slot />\n <div v-if=\"slots.actions\" :class=\"emptyActions()\">\n <slot name=\"actions\" />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { Inbox } from '@lucide/vue'\n import { useSlots } from 'vue'\n import { cn } from '../../lib/cn'\n import {\n empty,\n emptyActions,\n emptyDescription,\n emptyIcon,\n emptyText,\n emptyTitle,\n type EmptyVariants,\n } from './empty.variants'\n\n defineOptions({ name: 'HnEmpty' })\n\n const props = withDefaults(\n defineProps<{\n title?: string\n description?: string\n icon?: boolean\n size?: EmptyVariants['size']\n class?: string\n }>(),\n { icon: true, size: 'md' },\n )\n\n const slots = useSlots()\n</script>\n\n<template>\n <div data-hn-empty :class=\"cn(empty({ size: props.size }), props.class)\">\n <span v-if=\"slots.icon\" aria-hidden=\"true\" class=\"flex shrink-0 justify-center\">\n <slot name=\"icon\" />\n </span>\n <span v-else-if=\"props.icon\" aria-hidden=\"true\" :class=\"emptyIcon({ size: props.size })\">\n <Inbox />\n </span>\n <div v-if=\"props.title || props.description\" :class=\"emptyText()\">\n <p v-if=\"props.title\" :class=\"emptyTitle({ size: props.size })\">{{ props.title }}</p>\n <p v-if=\"props.description\" :class=\"emptyDescription({ size: props.size })\">\n {{ props.description }}\n </p>\n </div>\n <slot />\n <div v-if=\"slots.actions\" :class=\"emptyActions()\">\n <slot name=\"actions\" />\n </div>\n </div>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const resultIcon = tv({\n base: 'flex shrink-0 items-center justify-center rounded-full [&_svg]:shrink-0',\n variants: {\n status: {\n success: 'bg-success-soft text-success-text',\n error: 'bg-danger-soft text-danger-text',\n warning: 'bg-warning-soft text-warning-text',\n info: 'bg-info-soft text-info-text',\n },\n size: {\n sm: 'size-12 [&_svg]:size-6',\n md: 'size-14 [&_svg]:size-7',\n lg: 'size-18 [&_svg]:size-9',\n },\n },\n defaultVariants: {\n status: 'info',\n size: 'md',\n },\n})\n\nexport type ResultVariants = VariantProps<typeof resultIcon>\n","<script setup lang=\"ts\">\n import { CircleCheck, CircleX, Info, TriangleAlert } from '@lucide/vue'\n import { useSlots } from 'vue'\n import Empty from '../empty/Empty.vue'\n import { resultIcon, type ResultVariants } from './result.variants'\n\n defineOptions({ name: 'HnResult' })\n\n const props = withDefaults(\n defineProps<{\n status?: ResultVariants['status']\n title?: string\n description?: string\n size?: ResultVariants['size']\n class?: string\n }>(),\n { status: 'info', size: 'md' },\n )\n\n const slots = useSlots()\n\n const icons = {\n success: CircleCheck,\n error: CircleX,\n warning: TriangleAlert,\n info: Info,\n }\n</script>\n\n<template>\n <Empty\n data-hn-result\n :data-status=\"props.status\"\n :title=\"props.title\"\n :description=\"props.description\"\n :size=\"props.size\"\n :class=\"props.class\"\n >\n <template #icon>\n <slot name=\"icon\">\n <span :class=\"resultIcon({ status: props.status, size: props.size })\">\n <component :is=\"icons[props.status]\" />\n </span>\n </slot>\n </template>\n <slot />\n <template v-if=\"slots.actions\" #actions>\n <slot name=\"actions\" />\n </template>\n </Empty>\n</template>\n","<script setup lang=\"ts\">\n import { CircleCheck, CircleX, Info, TriangleAlert } from '@lucide/vue'\n import { useSlots } from 'vue'\n import Empty from '../empty/Empty.vue'\n import { resultIcon, type ResultVariants } from './result.variants'\n\n defineOptions({ name: 'HnResult' })\n\n const props = withDefaults(\n defineProps<{\n status?: ResultVariants['status']\n title?: string\n description?: string\n size?: ResultVariants['size']\n class?: string\n }>(),\n { status: 'info', size: 'md' },\n )\n\n const slots = useSlots()\n\n const icons = {\n success: CircleCheck,\n error: CircleX,\n warning: TriangleAlert,\n info: Info,\n }\n</script>\n\n<template>\n <Empty\n data-hn-result\n :data-status=\"props.status\"\n :title=\"props.title\"\n :description=\"props.description\"\n :size=\"props.size\"\n :class=\"props.class\"\n >\n <template #icon>\n <slot name=\"icon\">\n <span :class=\"resultIcon({ status: props.status, size: props.size })\">\n <component :is=\"icons[props.status]\" />\n </span>\n </slot>\n </template>\n <slot />\n <template v-if=\"slots.actions\" #actions>\n <slot name=\"actions\" />\n </template>\n </Empty>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { cn } from '../../lib/cn'\n import { devWarn } from '../../lib/dev'\n import { useUiLocale } from '../../locale'\n\n defineOptions({ name: 'HnNumberFormat' })\n\n const props = withDefaults(\n defineProps<{\n value?: number | null\n format?: 'decimal' | 'compact' | 'percent' | 'currency'\n currency?: string\n precision?: number\n class?: string\n }>(),\n { format: 'decimal' },\n )\n\n const t = useUiLocale()\n\n const valid = computed(() => typeof props.value === 'number' && Number.isFinite(props.value))\n\n const text = computed(() => {\n if (!valid.value) return '—'\n const options: Intl.NumberFormatOptions = {}\n if (props.format === 'compact') options.notation = 'compact'\n if (props.format === 'percent') options.style = 'percent'\n if (props.format === 'currency') {\n if (props.currency) {\n options.style = 'currency'\n options.currency = props.currency\n } else {\n devWarn('NumberFormat', 'currency 档需要 currency 代码,已退回 decimal')\n }\n }\n if (props.precision != null) options.maximumFractionDigits = props.precision\n return new Intl.NumberFormat(t.value.tag, options).format(props.value as number)\n })\n\n const full = computed(() =>\n valid.value && props.format === 'compact'\n ? new Intl.NumberFormat(t.value.tag).format(props.value as number)\n : undefined,\n )\n</script>\n\n<template>\n <span :title=\"full\" :class=\"cn(props.class)\">{{ text }}</span>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { cn } from '../../lib/cn'\n import { devWarn } from '../../lib/dev'\n import { useUiLocale } from '../../locale'\n\n defineOptions({ name: 'HnNumberFormat' })\n\n const props = withDefaults(\n defineProps<{\n value?: number | null\n format?: 'decimal' | 'compact' | 'percent' | 'currency'\n currency?: string\n precision?: number\n class?: string\n }>(),\n { format: 'decimal' },\n )\n\n const t = useUiLocale()\n\n const valid = computed(() => typeof props.value === 'number' && Number.isFinite(props.value))\n\n const text = computed(() => {\n if (!valid.value) return '—'\n const options: Intl.NumberFormatOptions = {}\n if (props.format === 'compact') options.notation = 'compact'\n if (props.format === 'percent') options.style = 'percent'\n if (props.format === 'currency') {\n if (props.currency) {\n options.style = 'currency'\n options.currency = props.currency\n } else {\n devWarn('NumberFormat', 'currency 档需要 currency 代码,已退回 decimal')\n }\n }\n if (props.precision != null) options.maximumFractionDigits = props.precision\n return new Intl.NumberFormat(t.value.tag, options).format(props.value as number)\n })\n\n const full = computed(() =>\n valid.value && props.format === 'compact'\n ? new Intl.NumberFormat(t.value.tag).format(props.value as number)\n : undefined,\n )\n</script>\n\n<template>\n <span :title=\"full\" :class=\"cn(props.class)\">{{ text }}</span>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const statistic = tv({\n base: 'flex min-w-0 items-start justify-between gap-4',\n})\n\nexport const statisticBody = tv({\n base: 'flex min-w-0 flex-col gap-1',\n})\n\nexport const statisticLabel = tv({\n base: 'text-muted text-sm',\n})\n\nexport const statisticValue = tv({\n base: 'text-fg flex items-baseline gap-1 font-semibold tracking-tight tabular-nums',\n variants: {\n size: {\n sm: 'text-xl',\n md: 'text-2xl',\n lg: 'text-3xl',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nexport const statisticAffix = tv({\n base: 'text-muted text-sm font-normal',\n})\n\nexport const statisticDelta = tv({\n base: 'flex flex-wrap items-center gap-x-1 text-sm whitespace-nowrap [&_svg]:size-4 [&_svg]:shrink-0',\n variants: {\n tone: {\n success: 'text-success-text',\n danger: 'text-danger-text',\n neutral: 'text-muted',\n },\n },\n defaultVariants: {\n tone: 'neutral',\n },\n})\n\nexport const statisticIcon = tv({\n base: 'bg-subtle text-muted flex size-10 shrink-0 items-center justify-center rounded-md [&_svg]:size-5',\n})\n\nexport type StatisticVariants = VariantProps<typeof statisticValue>\n","<script setup lang=\"ts\">\n import { TrendingDown, TrendingUp } from '@lucide/vue'\n import { computed, useSlots } from 'vue'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import NumberFormat from '../number-format/NumberFormat.vue'\n import Skeleton from '../skeleton/Skeleton.vue'\n import {\n statistic,\n statisticAffix,\n statisticBody,\n statisticDelta,\n statisticIcon,\n statisticLabel,\n statisticValue,\n type StatisticVariants,\n } from './statistic.variants'\n\n defineOptions({ name: 'HnStatistic' })\n\n const props = withDefaults(\n defineProps<{\n label: string\n value?: number | string | null\n format?: 'decimal' | 'compact' | 'percent' | 'currency'\n currency?: string\n precision?: number\n prefix?: string\n suffix?: string\n delta?: number\n deltaLabel?: string\n invert?: boolean\n loading?: boolean\n size?: StatisticVariants['size']\n class?: string\n }>(),\n { format: 'decimal', invert: false, loading: false, size: 'md' },\n )\n\n const slots = useSlots()\n const t = useUiLocale()\n\n const deltaText = computed(() => {\n if (props.delta === undefined) return undefined\n return new Intl.NumberFormat(t.value.tag, {\n style: 'percent',\n maximumFractionDigits: 1,\n signDisplay: 'exceptZero',\n }).format(props.delta)\n })\n\n const deltaTone = computed(() => {\n if (!props.delta) return 'neutral'\n return props.delta > 0 !== props.invert ? 'success' : 'danger'\n })\n</script>\n\n<template>\n <div data-hn-statistic :class=\"cn(statistic(), props.class)\">\n <div :class=\"statisticBody()\">\n <span :class=\"statisticLabel()\">{{ props.label }}</span>\n <span :class=\"statisticValue({ size: props.size })\">\n <Skeleton v-if=\"props.loading\" class=\"h-[1.25em] w-24\" />\n <template v-else>\n <span v-if=\"props.prefix\" :class=\"statisticAffix()\">{{ props.prefix }}</span>\n <NumberFormat\n v-if=\"typeof props.value === 'number'\"\n :value=\"props.value\"\n :format=\"props.format\"\n :currency=\"props.currency\"\n :precision=\"props.precision\"\n />\n <span v-else>{{ props.value ?? '—' }}</span>\n <span v-if=\"props.suffix\" :class=\"statisticAffix()\">{{ props.suffix }}</span>\n </template>\n </span>\n <span v-if=\"deltaText\" :class=\"statisticDelta({ tone: deltaTone })\">\n <Skeleton v-if=\"props.loading\" class=\"h-[1.25em] w-16\" />\n <template v-else>\n <TrendingUp v-if=\"props.delta! > 0\" aria-hidden=\"true\" />\n <TrendingDown v-else-if=\"props.delta! < 0\" aria-hidden=\"true\" />\n <span>{{ deltaText }}</span>\n <span v-if=\"props.deltaLabel\" class=\"text-muted\">{{ props.deltaLabel }}</span>\n </template>\n </span>\n <slot />\n </div>\n <span v-if=\"slots.icon\" aria-hidden=\"true\" :class=\"statisticIcon()\">\n <slot name=\"icon\" />\n </span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { TrendingDown, TrendingUp } from '@lucide/vue'\n import { computed, useSlots } from 'vue'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import NumberFormat from '../number-format/NumberFormat.vue'\n import Skeleton from '../skeleton/Skeleton.vue'\n import {\n statistic,\n statisticAffix,\n statisticBody,\n statisticDelta,\n statisticIcon,\n statisticLabel,\n statisticValue,\n type StatisticVariants,\n } from './statistic.variants'\n\n defineOptions({ name: 'HnStatistic' })\n\n const props = withDefaults(\n defineProps<{\n label: string\n value?: number | string | null\n format?: 'decimal' | 'compact' | 'percent' | 'currency'\n currency?: string\n precision?: number\n prefix?: string\n suffix?: string\n delta?: number\n deltaLabel?: string\n invert?: boolean\n loading?: boolean\n size?: StatisticVariants['size']\n class?: string\n }>(),\n { format: 'decimal', invert: false, loading: false, size: 'md' },\n )\n\n const slots = useSlots()\n const t = useUiLocale()\n\n const deltaText = computed(() => {\n if (props.delta === undefined) return undefined\n return new Intl.NumberFormat(t.value.tag, {\n style: 'percent',\n maximumFractionDigits: 1,\n signDisplay: 'exceptZero',\n }).format(props.delta)\n })\n\n const deltaTone = computed(() => {\n if (!props.delta) return 'neutral'\n return props.delta > 0 !== props.invert ? 'success' : 'danger'\n })\n</script>\n\n<template>\n <div data-hn-statistic :class=\"cn(statistic(), props.class)\">\n <div :class=\"statisticBody()\">\n <span :class=\"statisticLabel()\">{{ props.label }}</span>\n <span :class=\"statisticValue({ size: props.size })\">\n <Skeleton v-if=\"props.loading\" class=\"h-[1.25em] w-24\" />\n <template v-else>\n <span v-if=\"props.prefix\" :class=\"statisticAffix()\">{{ props.prefix }}</span>\n <NumberFormat\n v-if=\"typeof props.value === 'number'\"\n :value=\"props.value\"\n :format=\"props.format\"\n :currency=\"props.currency\"\n :precision=\"props.precision\"\n />\n <span v-else>{{ props.value ?? '—' }}</span>\n <span v-if=\"props.suffix\" :class=\"statisticAffix()\">{{ props.suffix }}</span>\n </template>\n </span>\n <span v-if=\"deltaText\" :class=\"statisticDelta({ tone: deltaTone })\">\n <Skeleton v-if=\"props.loading\" class=\"h-[1.25em] w-16\" />\n <template v-else>\n <TrendingUp v-if=\"props.delta! > 0\" aria-hidden=\"true\" />\n <TrendingDown v-else-if=\"props.delta! < 0\" aria-hidden=\"true\" />\n <span>{{ deltaText }}</span>\n <span v-if=\"props.deltaLabel\" class=\"text-muted\">{{ props.deltaLabel }}</span>\n </template>\n </span>\n <slot />\n </div>\n <span v-if=\"slots.icon\" aria-hidden=\"true\" :class=\"statisticIcon()\">\n <slot name=\"icon\" />\n </span>\n </div>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const banner = tv({\n base: 'hn-transition-base grid w-full grid-cols-[1fr_auto] items-center gap-3 px-4 py-2.5 text-sm sm:grid-cols-[1fr_auto_1fr] [&_a]:[--hn-link-color:currentColor]',\n variants: {\n tone: {\n neutral: 'bg-neutral-solid text-neutral-solid-on',\n accent: 'bg-accent text-accent-on',\n info: 'bg-info text-info-on',\n success: 'bg-success text-success-on',\n warning: 'bg-warning text-warning-on',\n danger: 'bg-danger text-danger-on',\n },\n },\n defaultVariants: { tone: 'accent' },\n})\n\nexport const bannerContent = tv({\n base: 'flex min-w-0 flex-wrap items-center gap-x-3 gap-y-1 sm:col-start-2 sm:justify-center sm:text-center',\n})\n\nexport const bannerIcon = tv({\n base: 'size-4 shrink-0',\n})\n\nexport const bannerActions = tv({\n base: 'flex shrink-0 items-center gap-2',\n})\n\nexport const bannerItem = tv({\n base: 'flex min-w-0 flex-wrap items-center gap-x-3 gap-y-1 sm:justify-center',\n})\n\nexport const bannerControls = tv({\n base: 'col-start-2 -my-1 -me-1 flex shrink-0 items-center gap-1 justify-self-end sm:col-start-3',\n})\n\nexport const bannerCounter = tv({\n base: 'text-xs tabular-nums',\n})\n\nconst slideForward = {\n enterFrom: 'opacity-0 translate-x-4 rtl:-translate-x-4',\n leaveTo: 'opacity-0 -translate-x-4 rtl:translate-x-4',\n}\n\nexport const bannerSlide = {\n forward: slideForward,\n backward: { enterFrom: slideForward.leaveTo, leaveTo: slideForward.enterFrom },\n}\n\nexport type BannerVariants = VariantProps<typeof banner>\n","import { useDocumentVisibility, useIntervalFn, useMediaQuery } from '@vueuse/core'\nimport { computed, onMounted, ref, toValue, watch, type MaybeRefOrGetter } from 'vue'\n\nexport function useAutoplay(\n interval: MaybeRefOrGetter<number | undefined>,\n enabled: MaybeRefOrGetter<boolean>,\n tick: () => void,\n) {\n const hovered = ref(false)\n const focused = ref(false)\n const visibility = useDocumentVisibility()\n const reducedMotion = useMediaQuery('(prefers-reduced-motion: reduce)')\n\n const active = computed(\n () =>\n toValue(enabled) &&\n (toValue(interval) ?? 0) > 0 &&\n !hovered.value &&\n !focused.value &&\n visibility.value !== 'hidden' &&\n !reducedMotion.value,\n )\n\n const timer = useIntervalFn(tick, () => toValue(interval) ?? 0, { immediate: false })\n\n onMounted(() => {\n watch(active, value => (value ? timer.resume() : timer.pause()), { immediate: true })\n })\n\n return { hovered, focused, active }\n}\n","import { Megaphone } from '@lucide/vue'\nimport { calloutIcons } from '../callout/icons'\n\nexport const bannerIcons = {\n ...calloutIcons,\n accent: Megaphone,\n} as const\n","export type SlideDirection = 1 | -1\n\nexport function stepBetween(previous: number, next: number, count: number): SlideDirection {\n if (count < 2) return 1\n const from = ((previous % count) + count) % count\n const to = ((next % count) + count) % count\n if (to === (from + 1) % count) return 1\n if (to === (from - 1 + count) % count) return -1\n return to > from ? 1 : -1\n}\n","<script setup lang=\"ts\" generic=\"T\">\n import { ChevronLeft, ChevronRight } from '@lucide/vue'\n import { computed, ref, watch } from 'vue'\n import { cn } from '../../lib/cn'\n import { useCollapseHooks } from '../../lib/collapse'\n import { useUiLocale } from '../../locale'\n import CloseButton from '../close-button/CloseButton.vue'\n import IconButton from '../icon-button/IconButton.vue'\n import {\n banner,\n bannerActions,\n bannerContent,\n bannerControls,\n bannerCounter,\n bannerIcon,\n bannerItem,\n bannerSlide,\n type BannerVariants,\n } from './banner.variants'\n import { useAutoplay } from './composables/useAutoplay'\n import { bannerIcons } from './icons'\n import type { BannerNotice } from './types'\n import { stepBetween } from './utils/direction'\n\n defineOptions({ name: 'HnBanner' })\n\n const props = withDefaults(\n defineProps<{\n tone?: BannerVariants['tone']\n icon?: boolean\n closable?: boolean\n items?: T[]\n autoplay?: number\n class?: string\n }>(),\n { tone: 'accent', icon: true },\n )\n\n const open = defineModel<boolean>('open', { default: true })\n const index = defineModel<number>('index', { default: 0 })\n\n const emit = defineEmits<{ close: [] }>()\n\n const slots = defineSlots<{\n default?(): unknown\n icon?(): unknown\n actions?(): unknown\n item?(props: { item: T; index: number }): unknown\n }>()\n\n const t = useUiLocale()\n const hooks = useCollapseHooks()\n\n const count = computed(() => props.items?.length ?? 0)\n const multiple = computed(() => count.value > 1)\n const at = computed(() =>\n count.value ? ((index.value % count.value) + count.value) % count.value : 0,\n )\n const current = computed(() => props.items?.[at.value])\n const notice = computed(() => current.value as BannerNotice | undefined)\n const tone = computed(() => notice.value?.tone ?? props.tone)\n const icon = computed(() => notice.value?.icon ?? bannerIcons[tone.value])\n\n const direction = ref<1 | -1>(1)\n let pending: 1 | -1 | undefined\n\n watch(index, (next, previous) => {\n direction.value = pending ?? stepBetween(previous, next, count.value)\n pending = undefined\n })\n\n const slide = computed(() => bannerSlide[direction.value > 0 ? 'forward' : 'backward'])\n\n function go(step: 1 | -1) {\n pending = step\n index.value = (at.value + step + count.value) % count.value\n }\n\n const autoplay = useAutoplay(\n () => props.autoplay,\n () => multiple.value && open.value,\n () => go(1),\n )\n\n function close() {\n open.value = false\n emit('close')\n }\n</script>\n\n<template>\n <Transition\n enter-from-class=\"hn-collapse-closed\"\n enter-to-class=\"hn-collapse-open\"\n leave-from-class=\"hn-collapse-open\"\n leave-to-class=\"hn-collapse-closed\"\n v-on=\"hooks\"\n >\n <div v-if=\"open\" data-hn-banner class=\"hn-collapse w-full\">\n <div class=\"hn-collapse-body\">\n <div\n :data-tone=\"tone\"\n :class=\"cn(banner({ tone }), props.class)\"\n @pointerenter=\"autoplay.hovered.value = true\"\n @pointerleave=\"autoplay.hovered.value = false\"\n @focusin=\"autoplay.focused.value = true\"\n @focusout=\"autoplay.focused.value = false\"\n >\n <div :class=\"bannerContent()\">\n <span\n v-if=\"props.items\"\n :aria-live=\"multiple && !props.autoplay ? 'polite' : undefined\"\n class=\"flex min-w-0 items-center\"\n >\n <Transition\n mode=\"out-in\"\n enter-active-class=\"hn-transition-base\"\n :enter-from-class=\"slide.enterFrom\"\n leave-active-class=\"hn-transition\"\n :leave-to-class=\"slide.leaveTo\"\n >\n <span :key=\"at\" :class=\"bannerItem()\">\n <slot name=\"icon\">\n <component\n :is=\"icon\"\n v-if=\"props.icon\"\n :class=\"bannerIcon()\"\n aria-hidden=\"true\"\n />\n </slot>\n <slot name=\"item\" :item=\"current as T\" :index=\"at\" />\n </span>\n </Transition>\n </span>\n <template v-else>\n <slot name=\"icon\">\n <component :is=\"icon\" v-if=\"props.icon\" :class=\"bannerIcon()\" aria-hidden=\"true\" />\n </slot>\n <slot />\n </template>\n <div v-if=\"slots.actions\" :class=\"bannerActions()\">\n <slot name=\"actions\" />\n </div>\n </div>\n <div v-if=\"multiple || props.closable\" :class=\"bannerControls()\">\n <template v-if=\"multiple\">\n <IconButton\n size=\"sm\"\n pill\n variant=\"ghost\"\n tone=\"neutral\"\n :tooltip=\"false\"\n :label=\"t.banner.prev\"\n class=\"text-current\"\n @click=\"go(-1)\"\n >\n <ChevronLeft />\n </IconButton>\n <span :class=\"bannerCounter()\">{{ at + 1 }} / {{ count }}</span>\n <IconButton\n size=\"sm\"\n pill\n variant=\"ghost\"\n tone=\"neutral\"\n :tooltip=\"false\"\n :label=\"t.banner.next\"\n class=\"text-current\"\n @click=\"go(1)\"\n >\n <ChevronRight />\n </IconButton>\n </template>\n <CloseButton v-if=\"props.closable\" size=\"sm\" class=\"text-current\" @click=\"close\" />\n </div>\n </div>\n </div>\n </div>\n </Transition>\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\n import { ChevronLeft, ChevronRight } from '@lucide/vue'\n import { computed, ref, watch } from 'vue'\n import { cn } from '../../lib/cn'\n import { useCollapseHooks } from '../../lib/collapse'\n import { useUiLocale } from '../../locale'\n import CloseButton from '../close-button/CloseButton.vue'\n import IconButton from '../icon-button/IconButton.vue'\n import {\n banner,\n bannerActions,\n bannerContent,\n bannerControls,\n bannerCounter,\n bannerIcon,\n bannerItem,\n bannerSlide,\n type BannerVariants,\n } from './banner.variants'\n import { useAutoplay } from './composables/useAutoplay'\n import { bannerIcons } from './icons'\n import type { BannerNotice } from './types'\n import { stepBetween } from './utils/direction'\n\n defineOptions({ name: 'HnBanner' })\n\n const props = withDefaults(\n defineProps<{\n tone?: BannerVariants['tone']\n icon?: boolean\n closable?: boolean\n items?: T[]\n autoplay?: number\n class?: string\n }>(),\n { tone: 'accent', icon: true },\n )\n\n const open = defineModel<boolean>('open', { default: true })\n const index = defineModel<number>('index', { default: 0 })\n\n const emit = defineEmits<{ close: [] }>()\n\n const slots = defineSlots<{\n default?(): unknown\n icon?(): unknown\n actions?(): unknown\n item?(props: { item: T; index: number }): unknown\n }>()\n\n const t = useUiLocale()\n const hooks = useCollapseHooks()\n\n const count = computed(() => props.items?.length ?? 0)\n const multiple = computed(() => count.value > 1)\n const at = computed(() =>\n count.value ? ((index.value % count.value) + count.value) % count.value : 0,\n )\n const current = computed(() => props.items?.[at.value])\n const notice = computed(() => current.value as BannerNotice | undefined)\n const tone = computed(() => notice.value?.tone ?? props.tone)\n const icon = computed(() => notice.value?.icon ?? bannerIcons[tone.value])\n\n const direction = ref<1 | -1>(1)\n let pending: 1 | -1 | undefined\n\n watch(index, (next, previous) => {\n direction.value = pending ?? stepBetween(previous, next, count.value)\n pending = undefined\n })\n\n const slide = computed(() => bannerSlide[direction.value > 0 ? 'forward' : 'backward'])\n\n function go(step: 1 | -1) {\n pending = step\n index.value = (at.value + step + count.value) % count.value\n }\n\n const autoplay = useAutoplay(\n () => props.autoplay,\n () => multiple.value && open.value,\n () => go(1),\n )\n\n function close() {\n open.value = false\n emit('close')\n }\n</script>\n\n<template>\n <Transition\n enter-from-class=\"hn-collapse-closed\"\n enter-to-class=\"hn-collapse-open\"\n leave-from-class=\"hn-collapse-open\"\n leave-to-class=\"hn-collapse-closed\"\n v-on=\"hooks\"\n >\n <div v-if=\"open\" data-hn-banner class=\"hn-collapse w-full\">\n <div class=\"hn-collapse-body\">\n <div\n :data-tone=\"tone\"\n :class=\"cn(banner({ tone }), props.class)\"\n @pointerenter=\"autoplay.hovered.value = true\"\n @pointerleave=\"autoplay.hovered.value = false\"\n @focusin=\"autoplay.focused.value = true\"\n @focusout=\"autoplay.focused.value = false\"\n >\n <div :class=\"bannerContent()\">\n <span\n v-if=\"props.items\"\n :aria-live=\"multiple && !props.autoplay ? 'polite' : undefined\"\n class=\"flex min-w-0 items-center\"\n >\n <Transition\n mode=\"out-in\"\n enter-active-class=\"hn-transition-base\"\n :enter-from-class=\"slide.enterFrom\"\n leave-active-class=\"hn-transition\"\n :leave-to-class=\"slide.leaveTo\"\n >\n <span :key=\"at\" :class=\"bannerItem()\">\n <slot name=\"icon\">\n <component\n :is=\"icon\"\n v-if=\"props.icon\"\n :class=\"bannerIcon()\"\n aria-hidden=\"true\"\n />\n </slot>\n <slot name=\"item\" :item=\"current as T\" :index=\"at\" />\n </span>\n </Transition>\n </span>\n <template v-else>\n <slot name=\"icon\">\n <component :is=\"icon\" v-if=\"props.icon\" :class=\"bannerIcon()\" aria-hidden=\"true\" />\n </slot>\n <slot />\n </template>\n <div v-if=\"slots.actions\" :class=\"bannerActions()\">\n <slot name=\"actions\" />\n </div>\n </div>\n <div v-if=\"multiple || props.closable\" :class=\"bannerControls()\">\n <template v-if=\"multiple\">\n <IconButton\n size=\"sm\"\n pill\n variant=\"ghost\"\n tone=\"neutral\"\n :tooltip=\"false\"\n :label=\"t.banner.prev\"\n class=\"text-current\"\n @click=\"go(-1)\"\n >\n <ChevronLeft />\n </IconButton>\n <span :class=\"bannerCounter()\">{{ at + 1 }} / {{ count }}</span>\n <IconButton\n size=\"sm\"\n pill\n variant=\"ghost\"\n tone=\"neutral\"\n :tooltip=\"false\"\n :label=\"t.banner.next\"\n class=\"text-current\"\n @click=\"go(1)\"\n >\n <ChevronRight />\n </IconButton>\n </template>\n <CloseButton v-if=\"props.closable\" size=\"sm\" class=\"text-current\" @click=\"close\" />\n </div>\n </div>\n </div>\n </div>\n </Transition>\n</template>\n","import { tv } from '../../lib/tv'\n\nexport const menubarRoot = tv({\n base: 'bg-surface border-line inline-flex items-center gap-0.5 rounded-lg border p-1',\n})\n\nexport const menubarTrigger = tv({\n base: [\n 'hn-interactive hn-state-layer hn-press-none relative isolate inline-flex h-8 shrink-0 items-center',\n 'text-fg gap-1.5 rounded-md px-2.5 text-sm font-medium outline-none select-none',\n 'data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:size-4 [&_svg]:shrink-0',\n ],\n})\n\nexport const menubarContent = tv({\n base: 'hn-anim-pop z-(--hn-z-overlay) flex min-w-40 flex-col gap-0.5 p-1 shadow-md outline-none',\n})\n","<script setup lang=\"ts\">\n import { MenubarRoot } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { menubarRoot } from './menubar.variants'\n\n defineOptions({ name: 'HnMenubar' })\n\n const props = withDefaults(\n defineProps<{\n label?: string\n loop?: boolean\n class?: string\n }>(),\n { loop: true },\n )\n\n const value = defineModel<string>()\n</script>\n\n<template>\n <MenubarRoot\n v-model=\"value\"\n :loop=\"props.loop\"\n :aria-label=\"props.label\"\n :class=\"cn(menubarRoot(), props.class)\"\n >\n <slot />\n </MenubarRoot>\n</template>\n","<script setup lang=\"ts\">\n import { MenubarRoot } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { menubarRoot } from './menubar.variants'\n\n defineOptions({ name: 'HnMenubar' })\n\n const props = withDefaults(\n defineProps<{\n label?: string\n loop?: boolean\n class?: string\n }>(),\n { loop: true },\n )\n\n const value = defineModel<string>()\n</script>\n\n<template>\n <MenubarRoot\n v-model=\"value\"\n :loop=\"props.loop\"\n :aria-label=\"props.label\"\n :class=\"cn(menubarRoot(), props.class)\"\n >\n <slot />\n </MenubarRoot>\n</template>\n","<script setup lang=\"ts\">\n import { shallowRef } from 'vue'\n import { MenubarContent, MenubarMenu, MenubarPortal, MenubarTrigger } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import Card from '../card/Card.vue'\n import { menubarContent, menubarTrigger } from './menubar.variants'\n\n defineOptions({ name: 'HnMenubarMenu' })\n\n const props = defineProps<{\n label?: string\n value?: string\n disabled?: boolean\n class?: string\n }>()\n\n const panel = shallowRef<{ $el: HTMLElement } | null>(null)\n\n function ignoreWhileClosing(event: Event) {\n if (panel.value?.$el.dataset.state === 'closed') event.preventDefault()\n }\n</script>\n\n<template>\n <MenubarMenu :value=\"props.value\">\n <MenubarTrigger :disabled=\"props.disabled\" :class=\"menubarTrigger()\">\n <slot name=\"label\">{{ props.label }}</slot>\n </MenubarTrigger>\n <MenubarPortal>\n <MenubarContent\n as-child\n align=\"start\"\n :side-offset=\"4\"\n @focus-outside=\"ignoreWhileClosing\"\n @interact-outside=\"ignoreWhileClosing\"\n >\n <Card ref=\"panel\" :padded=\"false\" :class=\"cn(menubarContent(), props.class)\">\n <slot />\n </Card>\n </MenubarContent>\n </MenubarPortal>\n </MenubarMenu>\n</template>\n","<script setup lang=\"ts\">\n import { shallowRef } from 'vue'\n import { MenubarContent, MenubarMenu, MenubarPortal, MenubarTrigger } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import Card from '../card/Card.vue'\n import { menubarContent, menubarTrigger } from './menubar.variants'\n\n defineOptions({ name: 'HnMenubarMenu' })\n\n const props = defineProps<{\n label?: string\n value?: string\n disabled?: boolean\n class?: string\n }>()\n\n const panel = shallowRef<{ $el: HTMLElement } | null>(null)\n\n function ignoreWhileClosing(event: Event) {\n if (panel.value?.$el.dataset.state === 'closed') event.preventDefault()\n }\n</script>\n\n<template>\n <MenubarMenu :value=\"props.value\">\n <MenubarTrigger :disabled=\"props.disabled\" :class=\"menubarTrigger()\">\n <slot name=\"label\">{{ props.label }}</slot>\n </MenubarTrigger>\n <MenubarPortal>\n <MenubarContent\n as-child\n align=\"start\"\n :side-offset=\"4\"\n @focus-outside=\"ignoreWhileClosing\"\n @interact-outside=\"ignoreWhileClosing\"\n >\n <Card ref=\"panel\" :padded=\"false\" :class=\"cn(menubarContent(), props.class)\">\n <slot />\n </Card>\n </MenubarContent>\n </MenubarPortal>\n </MenubarMenu>\n</template>\n","<script setup lang=\"ts\">\n import { MenubarItem } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { dropdownItem, type DropdownItemVariants } from '../dropdown-menu/dropdown-menu.variants'\n\n defineOptions({ name: 'HnMenubarItem', inheritAttrs: false })\n\n const props = defineProps<{\n tone?: DropdownItemVariants['tone']\n disabled?: boolean\n textValue?: string\n class?: string\n }>()\n\n const emit = defineEmits<{ select: [event: Event] }>()\n</script>\n\n<template>\n <MenubarItem\n v-bind=\"$attrs\"\n :disabled=\"props.disabled\"\n :text-value=\"props.textValue\"\n :class=\"cn(dropdownItem({ tone: props.tone }), props.class)\"\n @select=\"emit('select', $event)\"\n >\n <slot name=\"icon\" />\n <span class=\"min-w-0 flex-1\"><slot /></span>\n <slot name=\"trailing\" />\n </MenubarItem>\n</template>\n","<script setup lang=\"ts\">\n import { MenubarItem } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { dropdownItem, type DropdownItemVariants } from '../dropdown-menu/dropdown-menu.variants'\n\n defineOptions({ name: 'HnMenubarItem', inheritAttrs: false })\n\n const props = defineProps<{\n tone?: DropdownItemVariants['tone']\n disabled?: boolean\n textValue?: string\n class?: string\n }>()\n\n const emit = defineEmits<{ select: [event: Event] }>()\n</script>\n\n<template>\n <MenubarItem\n v-bind=\"$attrs\"\n :disabled=\"props.disabled\"\n :text-value=\"props.textValue\"\n :class=\"cn(dropdownItem({ tone: props.tone }), props.class)\"\n @select=\"emit('select', $event)\"\n >\n <slot name=\"icon\" />\n <span class=\"min-w-0 flex-1\"><slot /></span>\n <slot name=\"trailing\" />\n </MenubarItem>\n</template>\n","<script setup lang=\"ts\">\n import { Check } from '@lucide/vue'\n import { MenubarCheckboxItem, MenubarItemIndicator } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { dropdownItem } from '../dropdown-menu/dropdown-menu.variants'\n\n defineOptions({ name: 'HnMenubarCheckboxItem', inheritAttrs: false })\n\n const props = defineProps<{\n disabled?: boolean\n textValue?: string\n class?: string\n }>()\n\n const checked = defineModel<boolean>('checked', { default: false })\n</script>\n\n<template>\n <MenubarCheckboxItem\n v-bind=\"$attrs\"\n v-model=\"checked\"\n :disabled=\"props.disabled\"\n :text-value=\"props.textValue\"\n :class=\"cn(dropdownItem(), props.class)\"\n @select=\"(event: Event) => event.preventDefault()\"\n >\n <span class=\"min-w-0 flex-1\"><slot /></span>\n <slot name=\"trailing\" />\n <span class=\"flex size-4 shrink-0 items-center justify-center\">\n <MenubarItemIndicator>\n <Check />\n </MenubarItemIndicator>\n </span>\n </MenubarCheckboxItem>\n</template>\n","<script setup lang=\"ts\">\n import { Check } from '@lucide/vue'\n import { MenubarCheckboxItem, MenubarItemIndicator } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { dropdownItem } from '../dropdown-menu/dropdown-menu.variants'\n\n defineOptions({ name: 'HnMenubarCheckboxItem', inheritAttrs: false })\n\n const props = defineProps<{\n disabled?: boolean\n textValue?: string\n class?: string\n }>()\n\n const checked = defineModel<boolean>('checked', { default: false })\n</script>\n\n<template>\n <MenubarCheckboxItem\n v-bind=\"$attrs\"\n v-model=\"checked\"\n :disabled=\"props.disabled\"\n :text-value=\"props.textValue\"\n :class=\"cn(dropdownItem(), props.class)\"\n @select=\"(event: Event) => event.preventDefault()\"\n >\n <span class=\"min-w-0 flex-1\"><slot /></span>\n <slot name=\"trailing\" />\n <span class=\"flex size-4 shrink-0 items-center justify-center\">\n <MenubarItemIndicator>\n <Check />\n </MenubarItemIndicator>\n </span>\n </MenubarCheckboxItem>\n</template>\n","<script setup lang=\"ts\">\n import { MenubarGroup } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnMenubarGroup' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <MenubarGroup :class=\"cn('flex flex-col gap-0.5', props.class)\">\n <slot />\n </MenubarGroup>\n</template>\n","<script setup lang=\"ts\">\n import { MenubarGroup } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnMenubarGroup' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <MenubarGroup :class=\"cn('flex flex-col gap-0.5', props.class)\">\n <slot />\n </MenubarGroup>\n</template>\n","<script setup lang=\"ts\">\n import { ChevronRight } from '@lucide/vue'\n import { MenubarPortal, MenubarSub, MenubarSubContent, MenubarSubTrigger } from 'reka-ui'\n import Card from '../card/Card.vue'\n import { cn } from '../../lib/cn'\n import { dropdownItem } from '../dropdown-menu/dropdown-menu.variants'\n import { menubarContent } from './menubar.variants'\n\n defineOptions({ name: 'HnMenubarSub' })\n\n const props = defineProps<{\n label?: string\n disabled?: boolean\n textValue?: string\n class?: string\n }>()\n\n const open = defineModel<boolean>('open')\n</script>\n\n<template>\n <MenubarSub v-model:open=\"open\">\n <MenubarSubTrigger\n :disabled=\"props.disabled\"\n :text-value=\"props.textValue ?? props.label\"\n :class=\"dropdownItem()\"\n >\n <slot name=\"icon\" />\n <span class=\"min-w-0 flex-1\">\n <slot name=\"label\">{{ props.label }}</slot>\n </span>\n <ChevronRight class=\"text-muted\" />\n </MenubarSubTrigger>\n <MenubarPortal>\n <MenubarSubContent as-child :side-offset=\"4\">\n <Card :padded=\"false\" :class=\"cn(menubarContent(), props.class)\">\n <slot />\n </Card>\n </MenubarSubContent>\n </MenubarPortal>\n </MenubarSub>\n</template>\n","<script setup lang=\"ts\">\n import { ChevronRight } from '@lucide/vue'\n import { MenubarPortal, MenubarSub, MenubarSubContent, MenubarSubTrigger } from 'reka-ui'\n import Card from '../card/Card.vue'\n import { cn } from '../../lib/cn'\n import { dropdownItem } from '../dropdown-menu/dropdown-menu.variants'\n import { menubarContent } from './menubar.variants'\n\n defineOptions({ name: 'HnMenubarSub' })\n\n const props = defineProps<{\n label?: string\n disabled?: boolean\n textValue?: string\n class?: string\n }>()\n\n const open = defineModel<boolean>('open')\n</script>\n\n<template>\n <MenubarSub v-model:open=\"open\">\n <MenubarSubTrigger\n :disabled=\"props.disabled\"\n :text-value=\"props.textValue ?? props.label\"\n :class=\"dropdownItem()\"\n >\n <slot name=\"icon\" />\n <span class=\"min-w-0 flex-1\">\n <slot name=\"label\">{{ props.label }}</slot>\n </span>\n <ChevronRight class=\"text-muted\" />\n </MenubarSubTrigger>\n <MenubarPortal>\n <MenubarSubContent as-child :side-offset=\"4\">\n <Card :padded=\"false\" :class=\"cn(menubarContent(), props.class)\">\n <slot />\n </Card>\n </MenubarSubContent>\n </MenubarPortal>\n </MenubarSub>\n</template>\n","<script setup lang=\"ts\">\n import { MenubarLabel } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnMenubarLabel' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <MenubarLabel :class=\"cn('text-muted px-2.5 py-1.5 text-xs font-medium', props.class)\">\n <slot />\n </MenubarLabel>\n</template>\n","<script setup lang=\"ts\">\n import { MenubarLabel } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnMenubarLabel' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <MenubarLabel :class=\"cn('text-muted px-2.5 py-1.5 text-xs font-medium', props.class)\">\n <slot />\n </MenubarLabel>\n</template>\n","<script setup lang=\"ts\">\n import { MenubarSeparator } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnMenubarSeparator' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <MenubarSeparator :class=\"cn('bg-line -mx-1 my-1 h-px', props.class)\" />\n</template>\n","<script setup lang=\"ts\">\n import { MenubarSeparator } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnMenubarSeparator' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <MenubarSeparator :class=\"cn('bg-line -mx-1 my-1 h-px', props.class)\" />\n</template>\n","<script setup lang=\"ts\">\n import { MenubarRadioGroup } from 'reka-ui'\n\n defineOptions({ name: 'HnMenubarRadioGroup' })\n\n const value = defineModel<string>()\n</script>\n\n<template>\n <MenubarRadioGroup v-model=\"value\">\n <slot />\n </MenubarRadioGroup>\n</template>\n","<script setup lang=\"ts\">\n import { MenubarRadioGroup } from 'reka-ui'\n\n defineOptions({ name: 'HnMenubarRadioGroup' })\n\n const value = defineModel<string>()\n</script>\n\n<template>\n <MenubarRadioGroup v-model=\"value\">\n <slot />\n </MenubarRadioGroup>\n</template>\n","<script setup lang=\"ts\">\n import { Check } from '@lucide/vue'\n import { MenubarItemIndicator, MenubarRadioItem } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { dropdownItem } from '../dropdown-menu/dropdown-menu.variants'\n\n defineOptions({ name: 'HnMenubarRadioItem', inheritAttrs: false })\n\n const props = defineProps<{\n value: string\n disabled?: boolean\n textValue?: string\n class?: string\n }>()\n</script>\n\n<template>\n <MenubarRadioItem\n v-bind=\"$attrs\"\n :value=\"props.value\"\n :disabled=\"props.disabled\"\n :text-value=\"props.textValue\"\n :class=\"cn(dropdownItem(), props.class)\"\n >\n <span class=\"min-w-0 flex-1\"><slot /></span>\n <span class=\"flex size-4 shrink-0 items-center justify-center\">\n <MenubarItemIndicator>\n <Check class=\"size-4\" />\n </MenubarItemIndicator>\n </span>\n </MenubarRadioItem>\n</template>\n","<script setup lang=\"ts\">\n import { Check } from '@lucide/vue'\n import { MenubarItemIndicator, MenubarRadioItem } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { dropdownItem } from '../dropdown-menu/dropdown-menu.variants'\n\n defineOptions({ name: 'HnMenubarRadioItem', inheritAttrs: false })\n\n const props = defineProps<{\n value: string\n disabled?: boolean\n textValue?: string\n class?: string\n }>()\n</script>\n\n<template>\n <MenubarRadioItem\n v-bind=\"$attrs\"\n :value=\"props.value\"\n :disabled=\"props.disabled\"\n :text-value=\"props.textValue\"\n :class=\"cn(dropdownItem(), props.class)\"\n >\n <span class=\"min-w-0 flex-1\"><slot /></span>\n <span class=\"flex size-4 shrink-0 items-center justify-center\">\n <MenubarItemIndicator>\n <Check class=\"size-4\" />\n </MenubarItemIndicator>\n </span>\n </MenubarRadioItem>\n</template>\n","export interface StandardSchemaIssue {\n message: string\n path?: ReadonlyArray<PropertyKey | { key: PropertyKey }>\n}\n\nexport interface StandardSchemaResult {\n value?: unknown\n issues?: ReadonlyArray<StandardSchemaIssue>\n}\n\nexport interface StandardSchema {\n '~standard': {\n version: 1\n vendor: string\n validate: (value: unknown) => StandardSchemaResult | Promise<StandardSchemaResult>\n }\n}\n\nexport type FormValues = Record<string, unknown>\nexport type FormErrors = Record<string, string>\nexport type FormValidator = (values: FormValues) => FormErrors | Promise<FormErrors>\nexport type FormRules = StandardSchema | FormValidator\n\nexport function isStandardSchema(rules: FormRules): rules is StandardSchema {\n return typeof rules === 'object' && rules !== null && '~standard' in rules\n}\n","import {\n isStandardSchema,\n type FormErrors,\n type FormRules,\n type FormValues,\n type StandardSchemaIssue,\n} from '../standard-schema'\n\nexport const ROOT = ''\n\nexport function issueKey(issue: StandardSchemaIssue) {\n return (issue.path ?? [])\n .map(part => String(typeof part === 'object' && part !== null ? part.key : part))\n .join('.')\n}\n\nexport function issuesToErrors(issues: ReadonlyArray<StandardSchemaIssue>): FormErrors {\n const errors: FormErrors = {}\n for (const issue of issues) {\n const key = issueKey(issue)\n if (!(key in errors)) errors[key] = issue.message\n }\n return errors\n}\n\nexport function readPath(values: FormValues, key: string): unknown {\n return key\n .split('.')\n .reduce<unknown>(\n (current, part) =>\n current && typeof current === 'object'\n ? (current as Record<string, unknown>)[part]\n : undefined,\n values,\n )\n}\n\nexport async function runRules(\n rules: FormRules | undefined,\n values: FormValues,\n): Promise<FormErrors> {\n if (!rules) return {}\n if (isStandardSchema(rules)) {\n const result = await rules['~standard'].validate(values)\n return result.issues ? issuesToErrors(result.issues) : {}\n }\n return await rules(values)\n}\n","function isPlain(value: unknown): value is Record<string, unknown> {\n return Object.prototype.toString.call(value) === '[object Object]'\n}\n\nexport function snapshot(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(snapshot)\n if (isPlain(value)) {\n return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, snapshot(item)]))\n }\n return value\n}\n\nexport function same(a: unknown, b: unknown): boolean {\n if (a === b) return true\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((item, index) => same(item, b[index]))\n }\n if (isPlain(a) && isPlain(b)) {\n const keys = Object.keys(a)\n return keys.length === Object.keys(b).length && keys.every(key => same(a[key], b[key]))\n }\n return false\n}\n","import { computed, ref, shallowRef } from 'vue'\nimport type { FormErrors, FormRules, FormValues } from '../standard-schema'\nimport { ROOT, readPath, runRules } from '../utils/errors'\nimport { same, snapshot } from '../utils/values'\n\nexport type FormValidateOn = 'submit' | 'blur' | 'change'\n\ninterface Options {\n values: () => FormValues\n rules: () => FormRules | undefined\n validateOn: () => FormValidateOn\n}\n\ninterface ServerError {\n message: string\n value: unknown\n}\n\nexport function useForm(options: Options) {\n const found = shallowRef<FormErrors>({})\n const touched = ref(new Set<string>())\n const submitted = ref(false)\n const submitting = ref(false)\n const server = shallowRef(new Map<string, ServerError>())\n let initial = snapshot(options.values()) as FormValues\n\n function shown(key: string) {\n if (submitted.value || touched.value.has(key)) return true\n const mode = options.validateOn()\n return mode === 'change' && !same(readPath(options.values(), key), readPath(initial, key))\n }\n\n const errors = computed<FormErrors>(() => {\n const result: FormErrors = {}\n for (const [key, message] of Object.entries(found.value)) {\n if (key !== ROOT && shown(key)) result[key] = message\n }\n for (const [key, entry] of server.value) result[key] = entry.message\n return result\n })\n const formError = computed(() => found.value[ROOT])\n const invalid = computed(() => Object.keys(errors.value).length > 0 || !!formError.value)\n\n async function validate() {\n found.value = await runRules(options.rules(), options.values())\n return Object.keys(found.value).length === 0\n }\n\n function touch(name: string) {\n if (touched.value.has(name)) return\n touched.value = new Set(touched.value).add(name)\n if (options.validateOn() !== 'submit') void validate()\n }\n\n function onChange() {\n const values = options.values()\n if (server.value.size) {\n const next = new Map(server.value)\n for (const [key, entry] of next) if (readPath(values, key) !== entry.value) next.delete(key)\n if (next.size !== server.value.size) server.value = next\n }\n if (submitted.value || options.validateOn() !== 'submit') void validate()\n }\n\n async function submit(handler?: (values: FormValues) => unknown) {\n submitted.value = true\n const valid = await validate()\n if (!valid || server.value.size) return false\n submitting.value = true\n try {\n await handler?.(options.values())\n } finally {\n submitting.value = false\n }\n return true\n }\n\n function setErrors(next: FormErrors) {\n const values = options.values()\n const map = new Map<string, ServerError>()\n for (const [key, message] of Object.entries(next)) {\n map.set(key, { message, value: readPath(values, key) })\n }\n server.value = map\n }\n\n function reset() {\n found.value = {}\n touched.value = new Set()\n submitted.value = false\n server.value = new Map()\n initial = snapshot(options.values()) as FormValues\n }\n\n return {\n errors,\n formError,\n invalid,\n submitted,\n submitting,\n validate,\n touch,\n onChange,\n submit,\n setErrors,\n reset,\n }\n}\n","import { inject, provide, type ComputedRef, type InjectionKey, type Ref } from 'vue'\nimport type { FormErrors } from './standard-schema'\n\nexport interface FormContext {\n errors: Ref<FormErrors>\n disabled: ComputedRef<boolean>\n touch: (name: string) => void\n}\n\nconst FORM_KEY = Symbol('hn-form') as InjectionKey<FormContext>\n\nexport function provideForm(context: FormContext) {\n provide(FORM_KEY, context)\n}\n\nexport function injectForm() {\n return inject(FORM_KEY, null)\n}\n","import { tv } from '../../lib/tv'\n\nexport const formRoot = tv({\n base: 'flex flex-col gap-4',\n})\n","const FOCUSABLE = 'input,select,textarea,button,[tabindex],[contenteditable=\"true\"]'\n\nexport function focusFirstInvalid(root: HTMLElement) {\n const invalid = root.querySelector<HTMLElement>('[aria-invalid=\"true\"]')\n if (!invalid) return\n const target = invalid.matches(FOCUSABLE)\n ? invalid\n : invalid.querySelector<HTMLElement>(FOCUSABLE)\n target?.focus()\n}\n","<script setup lang=\"ts\">\n import { computed, shallowRef, watch } from 'vue'\n import { cn } from '../../lib/cn'\n import { useForm, type FormValidateOn } from './composables/useForm'\n import { provideForm } from './context'\n import { formRoot } from './form.variants'\n import { focusFirstInvalid } from './utils/focus'\n import type { FormErrors, FormRules, FormValues } from './standard-schema'\n\n defineOptions({ name: 'HnForm' })\n\n const props = withDefaults(\n defineProps<{\n values: FormValues\n rules?: FormRules\n validateOn?: FormValidateOn\n disabled?: boolean\n onSubmit?: (values: FormValues) => unknown\n class?: string\n }>(),\n { validateOn: 'submit' },\n )\n\n const root = shallowRef<HTMLFormElement | null>(null)\n\n const form = useForm({\n values: () => props.values,\n rules: () => props.rules,\n validateOn: () => props.validateOn,\n })\n\n watch(() => props.values, form.onChange, { deep: true })\n\n provideForm({\n errors: form.errors,\n disabled: computed(() => !!props.disabled || form.submitting.value),\n touch: form.touch,\n })\n\n async function submit() {\n if (props.disabled || form.submitting.value) return\n const ok = await form.submit(props.onSubmit)\n if (!ok && root.value) focusFirstInvalid(root.value)\n }\n\n function setErrors(errors: FormErrors) {\n form.setErrors(errors)\n }\n\n defineExpose({ submit, validate: form.validate, reset: form.reset, setErrors })\n</script>\n\n<template>\n <form\n ref=\"root\"\n data-hn-form\n novalidate\n :aria-busy=\"form.submitting.value || undefined\"\n :class=\"cn(formRoot(), props.class)\"\n @submit.prevent=\"submit\"\n >\n <slot\n :errors=\"form.errors.value\"\n :error=\"form.formError.value\"\n :invalid=\"form.invalid.value\"\n :submitting=\"form.submitting.value\"\n :submitted=\"form.submitted.value\"\n />\n </form>\n</template>\n","<script setup lang=\"ts\">\n import { computed, shallowRef, watch } from 'vue'\n import { cn } from '../../lib/cn'\n import { useForm, type FormValidateOn } from './composables/useForm'\n import { provideForm } from './context'\n import { formRoot } from './form.variants'\n import { focusFirstInvalid } from './utils/focus'\n import type { FormErrors, FormRules, FormValues } from './standard-schema'\n\n defineOptions({ name: 'HnForm' })\n\n const props = withDefaults(\n defineProps<{\n values: FormValues\n rules?: FormRules\n validateOn?: FormValidateOn\n disabled?: boolean\n onSubmit?: (values: FormValues) => unknown\n class?: string\n }>(),\n { validateOn: 'submit' },\n )\n\n const root = shallowRef<HTMLFormElement | null>(null)\n\n const form = useForm({\n values: () => props.values,\n rules: () => props.rules,\n validateOn: () => props.validateOn,\n })\n\n watch(() => props.values, form.onChange, { deep: true })\n\n provideForm({\n errors: form.errors,\n disabled: computed(() => !!props.disabled || form.submitting.value),\n touch: form.touch,\n })\n\n async function submit() {\n if (props.disabled || form.submitting.value) return\n const ok = await form.submit(props.onSubmit)\n if (!ok && root.value) focusFirstInvalid(root.value)\n }\n\n function setErrors(errors: FormErrors) {\n form.setErrors(errors)\n }\n\n defineExpose({ submit, validate: form.validate, reset: form.reset, setErrors })\n</script>\n\n<template>\n <form\n ref=\"root\"\n data-hn-form\n novalidate\n :aria-busy=\"form.submitting.value || undefined\"\n :class=\"cn(formRoot(), props.class)\"\n @submit.prevent=\"submit\"\n >\n <slot\n :errors=\"form.errors.value\"\n :error=\"form.formError.value\"\n :invalid=\"form.invalid.value\"\n :submitting=\"form.submitting.value\"\n :submitted=\"form.submitted.value\"\n />\n </form>\n</template>\n","import { tv } from '../../lib/tv'\n\nexport const formFieldRoot = tv({\n base: 'flex min-w-0 flex-col gap-1.5',\n})\n\nexport const formFieldLabel = tv({\n base: 'text-fg inline-flex items-center gap-1 text-sm font-medium',\n variants: {\n disabled: {\n true: 'text-disabled',\n },\n },\n})\n\nexport const formFieldMark = tv({\n base: 'text-danger-text',\n})\n\nexport const formFieldDescription = tv({\n base: 'text-muted text-sm',\n})\n\nexport const formFieldMessage = tv({\n base: 'text-danger-text text-sm',\n})\n","<script setup lang=\"ts\">\n import { computed, ref, shallowRef, useId, useSlots } from 'vue'\n import { cn } from '../../lib/cn'\n import { collapseHooks } from '../../lib/collapse'\n import { useUiLocale } from '../../locale'\n import VisuallyHidden from '../visually-hidden/VisuallyHidden.vue'\n import { injectForm } from '../form/context'\n import { provideFormField } from './context'\n import {\n formFieldDescription,\n formFieldLabel,\n formFieldMark,\n formFieldMessage,\n formFieldRoot,\n } from './form-field.variants'\n\n defineOptions({ name: 'HnFormField' })\n\n const props = defineProps<{\n name?: string\n label?: string\n description?: string\n error?: string\n required?: boolean\n disabled?: boolean\n class?: string\n }>()\n\n const slots = useSlots()\n const t = useUiLocale()\n const form = injectForm()\n\n const root = shallowRef<HTMLElement | null>(null)\n const hooks = collapseHooks('y', () => root.value)\n\n const id = useId()\n const labelId = useId()\n const descriptionId = useId()\n const messageId = useId()\n const controlId = ref(id)\n\n const message = computed(\n () => props.error || (props.name ? form?.errors.value[props.name] : undefined),\n )\n const invalid = computed(() => !!message.value)\n const disabled = computed(() => !!props.disabled || !!form?.disabled.value)\n const described = computed(() => !!props.description || !!slots.description)\n const describedBy = computed(() => {\n const ids = []\n if (described.value) ids.push(descriptionId)\n if (invalid.value) ids.push(messageId)\n return ids.length ? ids.join(' ') : undefined\n })\n\n provideFormField({ id, labelId, controlId, name: props.name, invalid, disabled, describedBy })\n\n function onFocusOut() {\n if (props.name) form?.touch(props.name)\n }\n</script>\n\n<template>\n <div\n ref=\"root\"\n data-hn-form-field\n :data-invalid=\"invalid ? '' : undefined\"\n :data-disabled=\"disabled ? '' : undefined\"\n :class=\"cn(formFieldRoot(), props.class)\"\n @focusout=\"onFocusOut\"\n >\n <label\n v-if=\"props.label || slots.label\"\n :id=\"labelId\"\n :for=\"controlId\"\n :class=\"formFieldLabel({ disabled })\"\n >\n <slot name=\"label\">{{ props.label }}</slot>\n <span v-if=\"props.required\" :class=\"formFieldMark()\" aria-hidden=\"true\">*</span>\n <VisuallyHidden v-if=\"props.required\">{{ t.form.required }}</VisuallyHidden>\n </label>\n <slot />\n <p v-if=\"described\" :id=\"descriptionId\" :class=\"formFieldDescription()\">\n <slot name=\"description\">{{ props.description }}</slot>\n </p>\n <Transition\n enter-from-class=\"hn-collapse-closed\"\n enter-to-class=\"hn-collapse-open\"\n leave-from-class=\"hn-collapse-open\"\n leave-to-class=\"hn-collapse-closed\"\n v-on=\"hooks\"\n >\n <div\n v-if=\"message\"\n data-hn-form-field-message\n class=\"hn-collapse [--hn-collapse-out:var(--hn-duration-fast)]\"\n >\n <div class=\"hn-collapse-body\">\n <p :id=\"messageId\" :class=\"formFieldMessage()\" aria-live=\"polite\">{{ message }}</p>\n </div>\n </div>\n </Transition>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed, ref, shallowRef, useId, useSlots } from 'vue'\n import { cn } from '../../lib/cn'\n import { collapseHooks } from '../../lib/collapse'\n import { useUiLocale } from '../../locale'\n import VisuallyHidden from '../visually-hidden/VisuallyHidden.vue'\n import { injectForm } from '../form/context'\n import { provideFormField } from './context'\n import {\n formFieldDescription,\n formFieldLabel,\n formFieldMark,\n formFieldMessage,\n formFieldRoot,\n } from './form-field.variants'\n\n defineOptions({ name: 'HnFormField' })\n\n const props = defineProps<{\n name?: string\n label?: string\n description?: string\n error?: string\n required?: boolean\n disabled?: boolean\n class?: string\n }>()\n\n const slots = useSlots()\n const t = useUiLocale()\n const form = injectForm()\n\n const root = shallowRef<HTMLElement | null>(null)\n const hooks = collapseHooks('y', () => root.value)\n\n const id = useId()\n const labelId = useId()\n const descriptionId = useId()\n const messageId = useId()\n const controlId = ref(id)\n\n const message = computed(\n () => props.error || (props.name ? form?.errors.value[props.name] : undefined),\n )\n const invalid = computed(() => !!message.value)\n const disabled = computed(() => !!props.disabled || !!form?.disabled.value)\n const described = computed(() => !!props.description || !!slots.description)\n const describedBy = computed(() => {\n const ids = []\n if (described.value) ids.push(descriptionId)\n if (invalid.value) ids.push(messageId)\n return ids.length ? ids.join(' ') : undefined\n })\n\n provideFormField({ id, labelId, controlId, name: props.name, invalid, disabled, describedBy })\n\n function onFocusOut() {\n if (props.name) form?.touch(props.name)\n }\n</script>\n\n<template>\n <div\n ref=\"root\"\n data-hn-form-field\n :data-invalid=\"invalid ? '' : undefined\"\n :data-disabled=\"disabled ? '' : undefined\"\n :class=\"cn(formFieldRoot(), props.class)\"\n @focusout=\"onFocusOut\"\n >\n <label\n v-if=\"props.label || slots.label\"\n :id=\"labelId\"\n :for=\"controlId\"\n :class=\"formFieldLabel({ disabled })\"\n >\n <slot name=\"label\">{{ props.label }}</slot>\n <span v-if=\"props.required\" :class=\"formFieldMark()\" aria-hidden=\"true\">*</span>\n <VisuallyHidden v-if=\"props.required\">{{ t.form.required }}</VisuallyHidden>\n </label>\n <slot />\n <p v-if=\"described\" :id=\"descriptionId\" :class=\"formFieldDescription()\">\n <slot name=\"description\">{{ props.description }}</slot>\n </p>\n <Transition\n enter-from-class=\"hn-collapse-closed\"\n enter-to-class=\"hn-collapse-open\"\n leave-from-class=\"hn-collapse-open\"\n leave-to-class=\"hn-collapse-closed\"\n v-on=\"hooks\"\n >\n <div\n v-if=\"message\"\n data-hn-form-field-message\n class=\"hn-collapse [--hn-collapse-out:var(--hn-duration-fast)]\"\n >\n <div class=\"hn-collapse-body\">\n <p :id=\"messageId\" :class=\"formFieldMessage()\" aria-live=\"polite\">{{ message }}</p>\n </div>\n </div>\n </Transition>\n </div>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const formLayoutRoot = tv({\n base: 'm-0 min-w-0 border-0 p-0',\n})\n\nexport const formLayoutLegend = tv({\n base: 'text-fg p-0 text-base font-medium',\n})\n\nexport const formLayoutDescription = tv({\n base: 'text-muted mt-1 text-sm',\n})\n\nexport const formLayoutGrid = tv({\n base: 'grid gap-4',\n variants: {\n columns: {\n 1: 'grid-cols-1',\n 2: 'grid-cols-1 sm:grid-cols-2',\n 3: 'grid-cols-1 sm:grid-cols-3',\n 4: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-4',\n },\n headed: {\n true: 'mt-4',\n },\n },\n defaultVariants: {\n columns: 1,\n },\n})\n\nexport type FormLayoutVariants = VariantProps<typeof formLayoutGrid>\n","<script setup lang=\"ts\">\n import { computed, shallowRef, useId, useSlots } from 'vue'\n import { cn } from '../../lib/cn'\n import { injectForm, provideForm } from '../form/context'\n import type { FormErrors } from '../form/standard-schema'\n import {\n formLayoutDescription,\n formLayoutGrid,\n formLayoutLegend,\n formLayoutRoot,\n type FormLayoutVariants,\n } from './form-layout.variants'\n\n defineOptions({ name: 'HnFormLayout' })\n\n const props = withDefaults(\n defineProps<{\n legend?: string\n description?: string\n columns?: FormLayoutVariants['columns']\n disabled?: boolean\n class?: string\n }>(),\n { columns: 1 },\n )\n\n const slots = useSlots()\n const form = injectForm()\n const descriptionId = useId()\n\n const headed = computed(() => !!props.legend || !!slots.legend)\n const described = computed(() => !!props.description || !!slots.description)\n const disabled = computed(() => !!props.disabled || !!form?.disabled.value)\n\n provideForm({\n errors: form?.errors ?? shallowRef<FormErrors>({}),\n disabled,\n touch: form?.touch ?? (() => {}),\n })\n</script>\n\n<template>\n <fieldset\n data-hn-form-layout\n :disabled=\"disabled || undefined\"\n :aria-describedby=\"described ? descriptionId : undefined\"\n :class=\"cn(formLayoutRoot(), props.class)\"\n >\n <legend v-if=\"headed\" :class=\"formLayoutLegend()\">\n <slot name=\"legend\">{{ props.legend }}</slot>\n </legend>\n <p v-if=\"described\" :id=\"descriptionId\" :class=\"formLayoutDescription()\">\n <slot name=\"description\">{{ props.description }}</slot>\n </p>\n <div :class=\"formLayoutGrid({ columns: props.columns, headed: headed || described })\">\n <slot />\n </div>\n </fieldset>\n</template>\n","<script setup lang=\"ts\">\n import { computed, shallowRef, useId, useSlots } from 'vue'\n import { cn } from '../../lib/cn'\n import { injectForm, provideForm } from '../form/context'\n import type { FormErrors } from '../form/standard-schema'\n import {\n formLayoutDescription,\n formLayoutGrid,\n formLayoutLegend,\n formLayoutRoot,\n type FormLayoutVariants,\n } from './form-layout.variants'\n\n defineOptions({ name: 'HnFormLayout' })\n\n const props = withDefaults(\n defineProps<{\n legend?: string\n description?: string\n columns?: FormLayoutVariants['columns']\n disabled?: boolean\n class?: string\n }>(),\n { columns: 1 },\n )\n\n const slots = useSlots()\n const form = injectForm()\n const descriptionId = useId()\n\n const headed = computed(() => !!props.legend || !!slots.legend)\n const described = computed(() => !!props.description || !!slots.description)\n const disabled = computed(() => !!props.disabled || !!form?.disabled.value)\n\n provideForm({\n errors: form?.errors ?? shallowRef<FormErrors>({}),\n disabled,\n touch: form?.touch ?? (() => {}),\n })\n</script>\n\n<template>\n <fieldset\n data-hn-form-layout\n :disabled=\"disabled || undefined\"\n :aria-describedby=\"described ? descriptionId : undefined\"\n :class=\"cn(formLayoutRoot(), props.class)\"\n >\n <legend v-if=\"headed\" :class=\"formLayoutLegend()\">\n <slot name=\"legend\">{{ props.legend }}</slot>\n </legend>\n <p v-if=\"described\" :id=\"descriptionId\" :class=\"formLayoutDescription()\">\n <slot name=\"description\">{{ props.description }}</slot>\n </p>\n <div :class=\"formLayoutGrid({ columns: props.columns, headed: headed || described })\">\n <slot />\n </div>\n </fieldset>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const pinInput = tv({\n base: 'inline-flex max-w-full gap-2',\n})\n\nexport const pinInputCell = tv({\n base: [\n 'hn-field text-fg shrink-0 rounded-md border text-center font-medium tabular-nums outline-none [font-family:inherit]',\n 'placeholder:text-faint placeholder:font-normal',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n ],\n variants: {\n variant: {\n primary:\n 'border-line [--hn-field-bg:var(--hn-surface)] [--hn-field-shadow:var(--hn-shadow-sm)]',\n secondary: 'border-transparent [--hn-field-bg:var(--hn-bg-inset)]',\n },\n size: {\n sm: 'size-[var(--hn-control-h-sm)] text-sm',\n md: 'size-[var(--hn-control-h-md)] text-base',\n lg: 'size-[var(--hn-control-h-lg)] text-md',\n },\n },\n defaultVariants: {\n variant: 'primary',\n size: 'md',\n },\n})\n\nexport type PinInputVariants = VariantProps<typeof pinInputCell>\n","<script setup lang=\"ts\">\n import { PinInputInput, PinInputRoot } from 'reka-ui'\n import { computed } from 'vue'\n import { cn } from '../../lib/cn'\n import { useFieldControl } from '../form-field/context'\n import { useUiLocale } from '../../locale'\n import { pinInput, pinInputCell, type PinInputVariants } from './pin-input.variants'\n\n defineOptions({ name: 'HnPinInput' })\n\n const props = withDefaults(\n defineProps<{\n length?: number\n type?: 'text' | 'number'\n mask?: boolean\n otp?: boolean\n placeholder?: string\n name?: string\n variant?: PinInputVariants['variant']\n size?: PinInputVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>(),\n { length: 6, type: 'text', placeholder: '' },\n )\n\n const emit = defineEmits<{ complete: [value: string] }>()\n\n const model = defineModel<string>({ default: '' })\n\n const t = useUiLocale()\n\n const { labelledBy, invalid, disabled, describedBy } = useFieldControl({\n invalid: () => props.invalid,\n disabled: () => props.disabled,\n })\n\n const cells = computed(() => Array.from({ length: props.length }, (_, i) => model.value[i] ?? ''))\n\n function update(value: (string | number)[] | undefined) {\n const next = (value ?? []).map(cell => (cell === undefined ? '' : String(cell))).join('')\n if (next !== model.value) model.value = next\n }\n</script>\n\n<template>\n <PinInputRoot\n role=\"group\"\n :aria-labelledby=\"labelledBy\"\n :aria-describedby=\"describedBy\"\n :model-value=\"cells\"\n :type=\"props.type\"\n :mask=\"props.mask\"\n :otp=\"props.otp\"\n :placeholder=\"props.placeholder\"\n :name=\"props.name\"\n :disabled=\"disabled\"\n data-hn-pin-input\n :data-invalid=\"invalid ? '' : undefined\"\n :class=\"cn(pinInput(), props.class)\"\n @update:model-value=\"update\"\n @complete=\"value => emit('complete', value.map(String).join(''))\"\n >\n <PinInputInput\n v-for=\"index in props.length\"\n :key=\"index\"\n :index=\"index - 1\"\n :aria-label=\"t.pinInput.cellLabel(index, props.length)\"\n :aria-invalid=\"invalid || undefined\"\n :data-invalid=\"invalid ? '' : undefined\"\n :class=\"pinInputCell({ variant: props.variant, size: props.size })\"\n />\n </PinInputRoot>\n</template>\n","<script setup lang=\"ts\">\n import { PinInputInput, PinInputRoot } from 'reka-ui'\n import { computed } from 'vue'\n import { cn } from '../../lib/cn'\n import { useFieldControl } from '../form-field/context'\n import { useUiLocale } from '../../locale'\n import { pinInput, pinInputCell, type PinInputVariants } from './pin-input.variants'\n\n defineOptions({ name: 'HnPinInput' })\n\n const props = withDefaults(\n defineProps<{\n length?: number\n type?: 'text' | 'number'\n mask?: boolean\n otp?: boolean\n placeholder?: string\n name?: string\n variant?: PinInputVariants['variant']\n size?: PinInputVariants['size']\n disabled?: boolean\n invalid?: boolean\n class?: string\n }>(),\n { length: 6, type: 'text', placeholder: '' },\n )\n\n const emit = defineEmits<{ complete: [value: string] }>()\n\n const model = defineModel<string>({ default: '' })\n\n const t = useUiLocale()\n\n const { labelledBy, invalid, disabled, describedBy } = useFieldControl({\n invalid: () => props.invalid,\n disabled: () => props.disabled,\n })\n\n const cells = computed(() => Array.from({ length: props.length }, (_, i) => model.value[i] ?? ''))\n\n function update(value: (string | number)[] | undefined) {\n const next = (value ?? []).map(cell => (cell === undefined ? '' : String(cell))).join('')\n if (next !== model.value) model.value = next\n }\n</script>\n\n<template>\n <PinInputRoot\n role=\"group\"\n :aria-labelledby=\"labelledBy\"\n :aria-describedby=\"describedBy\"\n :model-value=\"cells\"\n :type=\"props.type\"\n :mask=\"props.mask\"\n :otp=\"props.otp\"\n :placeholder=\"props.placeholder\"\n :name=\"props.name\"\n :disabled=\"disabled\"\n data-hn-pin-input\n :data-invalid=\"invalid ? '' : undefined\"\n :class=\"cn(pinInput(), props.class)\"\n @update:model-value=\"update\"\n @complete=\"value => emit('complete', value.map(String).join(''))\"\n >\n <PinInputInput\n v-for=\"index in props.length\"\n :key=\"index\"\n :index=\"index - 1\"\n :aria-label=\"t.pinInput.cellLabel(index, props.length)\"\n :aria-invalid=\"invalid || undefined\"\n :data-invalid=\"invalid ? '' : undefined\"\n :class=\"pinInputCell({ variant: props.variant, size: props.size })\"\n />\n </PinInputRoot>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const segmentedControl = tv({\n base: [\n 'group/hn-segmented bg-inset relative isolate max-w-full rounded-md p-1 select-none',\n 'data-disabled:cursor-not-allowed data-disabled:opacity-50',\n ],\n variants: {\n orientation: {\n horizontal: 'flex-row',\n vertical: 'flex-col',\n },\n block: {\n true: 'flex w-full',\n false: 'inline-flex w-fit',\n },\n },\n defaultVariants: { orientation: 'horizontal', block: false },\n})\n\nexport const segmentedItem = tv({\n base: [\n 'hn-interactive hn-state-layer hn-press-none text-muted relative z-[1] inline-flex shrink-0 items-center justify-center',\n 'gap-[var(--hn-control-gap)] rounded-xs font-medium whitespace-nowrap',\n '[--hn-state-selected-opacity:0] [--hn-state-selected-color:var(--hn-fg-muted)] aria-pressed:z-0 aria-pressed:text-fg',\n 'disabled:pointer-events-none disabled:not-in-data-disabled:opacity-50',\n ],\n variants: {\n size: {\n sm: 'h-[calc(var(--hn-control-h-sm)-(--spacing(2)))] px-[var(--hn-control-px-sm)] text-sm [&_svg]:size-3.5',\n md: 'h-[calc(var(--hn-control-h-md)-(--spacing(2)))] px-[var(--hn-control-px-md)] text-base [&_svg]:size-4',\n lg: 'h-[calc(var(--hn-control-h-lg)-(--spacing(2)))] px-[var(--hn-control-px-lg)] text-md [&_svg]:size-[1.125rem]',\n },\n block: {\n true: 'flex-1 basis-0',\n },\n },\n defaultVariants: { size: 'md' },\n})\n\nexport const segmentedThumb = tv({\n base: 'bg-surface absolute inset-0 -z-10 rounded-xs shadow-sm',\n})\n\nexport type SegmentedControlVariants = VariantProps<typeof segmentedControl>\nexport type SegmentedItemVariants = VariantProps<typeof segmentedItem>\n","<script setup lang=\"ts\">\n import { ToggleGroupItem, ToggleGroupRoot, type AcceptableValue } from 'reka-ui'\n import { computed, useId, useSlots } from 'vue'\n import { cn } from '../../lib/cn'\n import { useFieldControl } from '../form-field/context'\n import Highlight from '../highlight/Highlight.vue'\n import Ripple from '../ripple/Ripple.vue'\n import type { SelectOption } from '../select/types'\n import {\n segmentedControl,\n segmentedItem,\n segmentedThumb,\n type SegmentedControlVariants,\n type SegmentedItemVariants,\n } from './segmented-control.variants'\n\n defineOptions({ name: 'HnSegmentedControl' })\n\n const props = withDefaults(\n defineProps<{\n options: SelectOption[]\n size?: SegmentedItemVariants['size']\n orientation?: SegmentedControlVariants['orientation']\n block?: boolean\n disabled?: boolean\n class?: string\n }>(),\n { orientation: 'horizontal', block: false },\n )\n\n const model = defineModel<string | number>()\n\n defineSlots<{ option(props: { option: SelectOption }): unknown }>()\n\n const slots = useSlots()\n\n const { labelledBy, disabled, describedBy } = useFieldControl({\n disabled: () => props.disabled,\n })\n const highlightId = useId()\n\n const current = computed(\n () => model.value ?? props.options.find(option => !option.disabled)?.value,\n )\n\n function select(value: AcceptableValue | AcceptableValue[] | undefined) {\n if (typeof value === 'string' || typeof value === 'number') model.value = value\n }\n</script>\n\n<template>\n <ToggleGroupRoot\n type=\"single\"\n :model-value=\"current\"\n :disabled=\"disabled\"\n :aria-labelledby=\"labelledBy\"\n :aria-describedby=\"describedBy\"\n :orientation=\"props.orientation\"\n data-hn-segmented-control\n :data-disabled=\"disabled ? '' : undefined\"\n :class=\"\n cn(segmentedControl({ orientation: props.orientation, block: props.block }), props.class)\n \"\n @update:model-value=\"select\"\n >\n <ToggleGroupItem\n v-for=\"option in props.options\"\n :key=\"option.value\"\n :value=\"option.value\"\n :disabled=\"option.disabled\"\n :aria-label=\"slots.option ? option.label : undefined\"\n :class=\"segmentedItem({ size: props.size, block: props.block })\"\n >\n <Highlight v-if=\"option.value === current\" :id=\"highlightId\" :class=\"segmentedThumb()\" />\n <Ripple />\n <slot name=\"option\" :option=\"option\">{{ option.label }}</slot>\n </ToggleGroupItem>\n </ToggleGroupRoot>\n</template>\n","<script setup lang=\"ts\">\n import { ToggleGroupItem, ToggleGroupRoot, type AcceptableValue } from 'reka-ui'\n import { computed, useId, useSlots } from 'vue'\n import { cn } from '../../lib/cn'\n import { useFieldControl } from '../form-field/context'\n import Highlight from '../highlight/Highlight.vue'\n import Ripple from '../ripple/Ripple.vue'\n import type { SelectOption } from '../select/types'\n import {\n segmentedControl,\n segmentedItem,\n segmentedThumb,\n type SegmentedControlVariants,\n type SegmentedItemVariants,\n } from './segmented-control.variants'\n\n defineOptions({ name: 'HnSegmentedControl' })\n\n const props = withDefaults(\n defineProps<{\n options: SelectOption[]\n size?: SegmentedItemVariants['size']\n orientation?: SegmentedControlVariants['orientation']\n block?: boolean\n disabled?: boolean\n class?: string\n }>(),\n { orientation: 'horizontal', block: false },\n )\n\n const model = defineModel<string | number>()\n\n defineSlots<{ option(props: { option: SelectOption }): unknown }>()\n\n const slots = useSlots()\n\n const { labelledBy, disabled, describedBy } = useFieldControl({\n disabled: () => props.disabled,\n })\n const highlightId = useId()\n\n const current = computed(\n () => model.value ?? props.options.find(option => !option.disabled)?.value,\n )\n\n function select(value: AcceptableValue | AcceptableValue[] | undefined) {\n if (typeof value === 'string' || typeof value === 'number') model.value = value\n }\n</script>\n\n<template>\n <ToggleGroupRoot\n type=\"single\"\n :model-value=\"current\"\n :disabled=\"disabled\"\n :aria-labelledby=\"labelledBy\"\n :aria-describedby=\"describedBy\"\n :orientation=\"props.orientation\"\n data-hn-segmented-control\n :data-disabled=\"disabled ? '' : undefined\"\n :class=\"\n cn(segmentedControl({ orientation: props.orientation, block: props.block }), props.class)\n \"\n @update:model-value=\"select\"\n >\n <ToggleGroupItem\n v-for=\"option in props.options\"\n :key=\"option.value\"\n :value=\"option.value\"\n :disabled=\"option.disabled\"\n :aria-label=\"slots.option ? option.label : undefined\"\n :class=\"segmentedItem({ size: props.size, block: props.block })\"\n >\n <Highlight v-if=\"option.value === current\" :id=\"highlightId\" :class=\"segmentedThumb()\" />\n <Ripple />\n <slot name=\"option\" :option=\"option\">{{ option.label }}</slot>\n </ToggleGroupItem>\n </ToggleGroupRoot>\n</template>\n","<script setup lang=\"ts\">\n import { Primitive, type PrimitiveProps } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnProse' })\n\n const props = withDefaults(defineProps<PrimitiveProps & { class?: string }>(), { as: 'div' })\n</script>\n\n<template>\n <Primitive :as=\"props.as\" :as-child=\"props.asChild\" :class=\"cn('hn-prose', props.class)\">\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\n import { Primitive, type PrimitiveProps } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnProse' })\n\n const props = withDefaults(defineProps<PrimitiveProps & { class?: string }>(), { as: 'div' })\n</script>\n\n<template>\n <Primitive :as=\"props.as\" :as-child=\"props.asChild\" :class=\"cn('hn-prose', props.class)\">\n <slot />\n </Primitive>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const link = tv({\n base: 'hn-link cursor-pointer',\n variants: {\n tone: {\n accent: '[--hn-link-color:var(--hn-accent-text)]',\n neutral: '[--hn-link-color:var(--hn-fg-default)]',\n },\n },\n defaultVariants: { tone: 'accent' },\n})\n\nexport type LinkVariants = VariantProps<typeof link>\n","<script setup lang=\"ts\">\n import { Primitive, type PrimitiveProps } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { link, type LinkVariants } from './link.variants'\n\n defineOptions({ name: 'HnLink' })\n\n const props = withDefaults(\n defineProps<\n PrimitiveProps & {\n tone?: LinkVariants['tone']\n underline?: boolean\n class?: string\n }\n >(),\n { as: 'a', tone: 'accent' },\n )\n</script>\n\n<template>\n <Primitive\n :as=\"props.as\"\n :as-child=\"props.asChild\"\n :data-underline=\"props.underline ? '' : undefined\"\n :class=\"cn(link({ tone: props.tone }), props.class)\"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\n import { Primitive, type PrimitiveProps } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { link, type LinkVariants } from './link.variants'\n\n defineOptions({ name: 'HnLink' })\n\n const props = withDefaults(\n defineProps<\n PrimitiveProps & {\n tone?: LinkVariants['tone']\n underline?: boolean\n class?: string\n }\n >(),\n { as: 'a', tone: 'accent' },\n )\n</script>\n\n<template>\n <Primitive\n :as=\"props.as\"\n :as-child=\"props.asChild\"\n :data-underline=\"props.underline ? '' : undefined\"\n :class=\"cn(link({ tone: props.tone }), props.class)\"\n >\n <slot />\n </Primitive>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnCode' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <code :class=\"cn('hn-code', props.class)\"><slot /></code>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnCode' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <code :class=\"cn('hn-code', props.class)\"><slot /></code>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnBlockquote' })\n\n const props = defineProps<{ cite?: string; class?: string }>()\n</script>\n\n<template>\n <blockquote :class=\"cn('hn-blockquote', props.class)\">\n <slot />\n <footer v-if=\"props.cite\" class=\"text-faint mt-2 text-sm\">—— {{ props.cite }}</footer>\n </blockquote>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnBlockquote' })\n\n const props = defineProps<{ cite?: string; class?: string }>()\n</script>\n\n<template>\n <blockquote :class=\"cn('hn-blockquote', props.class)\">\n <slot />\n <footer v-if=\"props.cite\" class=\"text-faint mt-2 text-sm\">—— {{ props.cite }}</footer>\n </blockquote>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnMark' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <mark :class=\"cn('hn-mark', props.class)\"><slot /></mark>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnMark' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <mark :class=\"cn('hn-mark', props.class)\"><slot /></mark>\n</template>\n","import type { HighlighterCore, ThemedToken } from 'shiki/core'\n\nconst langLoaders: Record<string, () => Promise<{ default: unknown }>> = {\n typescript: () => import('shiki/langs/typescript.mjs'),\n tsx: () => import('shiki/langs/tsx.mjs'),\n javascript: () => import('shiki/langs/javascript.mjs'),\n jsx: () => import('shiki/langs/jsx.mjs'),\n vue: () => import('shiki/langs/vue.mjs'),\n html: () => import('shiki/langs/html.mjs'),\n css: () => import('shiki/langs/css.mjs'),\n json: () => import('shiki/langs/json.mjs'),\n bash: () => import('shiki/langs/bash.mjs'),\n markdown: () => import('shiki/langs/markdown.mjs'),\n yaml: () => import('shiki/langs/yaml.mjs'),\n sql: () => import('shiki/langs/sql.mjs'),\n prisma: () => import('shiki/langs/prisma.mjs'),\n diff: () => import('shiki/langs/diff.mjs'),\n}\n\nconst langAliases: Record<string, string> = {\n ts: 'typescript',\n js: 'javascript',\n sh: 'bash',\n shell: 'bash',\n zsh: 'bash',\n md: 'markdown',\n yml: 'yaml',\n}\n\nlet core: Promise<HighlighterCore> | undefined\nconst loadedLangs = new Set<string>()\n\nfunction getCore() {\n core ??= (async () => {\n const [{ createHighlighterCore }, { createJavaScriptRegexEngine }, light, dark] =\n await Promise.all([\n import('shiki/core'),\n import('shiki/engine/javascript'),\n import('shiki/themes/vitesse-light.mjs'),\n import('shiki/themes/vitesse-dark.mjs'),\n ])\n return createHighlighterCore({\n themes: [light.default, dark.default],\n langs: [],\n engine: createJavaScriptRegexEngine({ forgiving: true }),\n })\n })()\n return core\n}\n\nfunction escape(text: string): string {\n return text\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n}\n\nfunction inlineStyle(style: ThemedToken['htmlStyle']): string {\n if (!style) return ''\n if (typeof style === 'string') return style\n return Object.entries(style)\n .map(([key, value]) => `${key}:${value}`)\n .join(';')\n}\n\nexport function tokensToHtml(lines: ThemedToken[][]): string {\n return lines\n .map(line =>\n line\n .map(\n token =>\n `<span style=\"${escape(inlineStyle(token.htmlStyle))}\">${escape(token.content)}</span>`,\n )\n .join(''),\n )\n .join('\\n')\n}\n\nexport async function tokenize(code: string, lang: string): Promise<ThemedToken[][] | null> {\n const resolved = langAliases[lang] ?? lang\n const load = langLoaders[resolved]\n if (!load) return null\n\n const highlighter = await getCore()\n if (!loadedLangs.has(resolved)) {\n await highlighter.loadLanguage(\n (await load()).default as Parameters<HighlighterCore['loadLanguage']>[0],\n )\n loadedLangs.add(resolved)\n }\n\n return highlighter.codeToTokens(code, {\n lang: resolved,\n themes: { light: 'vitesse-light', dark: 'vitesse-dark' },\n defaultColor: false,\n }).tokens\n}\n","<script setup lang=\"ts\">\n import { computed, onMounted, shallowRef, watch } from 'vue'\n import type { ThemedToken } from 'shiki/core'\n import { cn } from '../../lib/cn'\n import { devWarn } from '../../lib/dev'\n import { useUiLocale } from '../../locale'\n import CopyButton from '../copy-button/CopyButton.vue'\n import ScrollArea from '../scroll-area/ScrollArea.vue'\n import { tokenize } from './highlighter'\n\n defineOptions({ name: 'HnCodeBlock' })\n\n const props = withDefaults(\n defineProps<{\n code: string\n lang?: string\n label?: string\n html?: string\n copyable?: boolean\n class?: string\n }>(),\n { copyable: true },\n )\n\n const t = useUiLocale()\n const tag = computed(() => props.label ?? props.lang)\n\n const tokens = shallowRef<ThemedToken[][] | null>(null)\n\n onMounted(() => {\n watch(\n () => [props.code, props.lang, props.html] as const,\n async ([code, lang, html]) => {\n if (html || !lang) {\n tokens.value = null\n return\n }\n try {\n const result = await tokenize(code, lang)\n if (code === props.code && lang === props.lang) tokens.value = result\n } catch (error) {\n tokens.value = null\n devWarn('CodeBlock', `着色管线失败,已退回素文本(lang=\"${lang}\"):${String(error)}`, lang)\n }\n },\n { immediate: true },\n )\n })\n</script>\n\n<template>\n <div :data-lang=\"props.lang\" :class=\"cn('relative', props.class)\">\n <ScrollArea direction=\"horizontal\" focusable :label=\"tag\" class=\"hn-pre\">\n <pre\n class=\"m-0\"\n ><code v-if=\"props.html\" v-html=\"props.html\"></code><code v-else-if=\"tokens\"><template v-for=\"(line, i) of tokens\" :key=\"i\">{{ i ? '\\n' : '' }}<span v-for=\"(tk, j) of line\" :key=\"j\" :style=\"tk.htmlStyle\">{{ tk.content }}</span></template></code><code v-else>{{ code }}</code></pre>\n </ScrollArea>\n <div class=\"absolute top-2 end-2 flex items-center gap-2\">\n <span v-if=\"tag\" class=\"text-faint font-mono text-xs select-none\">{{ tag }}</span>\n <CopyButton v-if=\"copyable\" :text=\"props.code\" :label=\"t.codeblock.copy\" />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed, onMounted, shallowRef, watch } from 'vue'\n import type { ThemedToken } from 'shiki/core'\n import { cn } from '../../lib/cn'\n import { devWarn } from '../../lib/dev'\n import { useUiLocale } from '../../locale'\n import CopyButton from '../copy-button/CopyButton.vue'\n import ScrollArea from '../scroll-area/ScrollArea.vue'\n import { tokenize } from './highlighter'\n\n defineOptions({ name: 'HnCodeBlock' })\n\n const props = withDefaults(\n defineProps<{\n code: string\n lang?: string\n label?: string\n html?: string\n copyable?: boolean\n class?: string\n }>(),\n { copyable: true },\n )\n\n const t = useUiLocale()\n const tag = computed(() => props.label ?? props.lang)\n\n const tokens = shallowRef<ThemedToken[][] | null>(null)\n\n onMounted(() => {\n watch(\n () => [props.code, props.lang, props.html] as const,\n async ([code, lang, html]) => {\n if (html || !lang) {\n tokens.value = null\n return\n }\n try {\n const result = await tokenize(code, lang)\n if (code === props.code && lang === props.lang) tokens.value = result\n } catch (error) {\n tokens.value = null\n devWarn('CodeBlock', `着色管线失败,已退回素文本(lang=\"${lang}\"):${String(error)}`, lang)\n }\n },\n { immediate: true },\n )\n })\n</script>\n\n<template>\n <div :data-lang=\"props.lang\" :class=\"cn('relative', props.class)\">\n <ScrollArea direction=\"horizontal\" focusable :label=\"tag\" class=\"hn-pre\">\n <pre\n class=\"m-0\"\n ><code v-if=\"props.html\" v-html=\"props.html\"></code><code v-else-if=\"tokens\"><template v-for=\"(line, i) of tokens\" :key=\"i\">{{ i ? '\\n' : '' }}<span v-for=\"(tk, j) of line\" :key=\"j\" :style=\"tk.htmlStyle\">{{ tk.content }}</span></template></code><code v-else>{{ code }}</code></pre>\n </ScrollArea>\n <div class=\"absolute top-2 end-2 flex items-center gap-2\">\n <span v-if=\"tag\" class=\"text-faint font-mono text-xs select-none\">{{ tag }}</span>\n <CopyButton v-if=\"copyable\" :text=\"props.code\" :label=\"t.codeblock.copy\" />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnList' })\n\n const props = defineProps<{ ordered?: boolean; class?: string }>()\n</script>\n\n<template>\n <component :is=\"props.ordered ? 'ol' : 'ul'\" :class=\"cn('hn-list', props.class)\">\n <slot />\n </component>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnList' })\n\n const props = defineProps<{ ordered?: boolean; class?: string }>()\n</script>\n\n<template>\n <component :is=\"props.ordered ? 'ol' : 'ul'\" :class=\"cn('hn-list', props.class)\">\n <slot />\n </component>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnListItem' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <li :class=\"cn(props.class)\">\n <slot />\n </li>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnListItem' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <li :class=\"cn(props.class)\">\n <slot />\n </li>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnDescriptionList' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <dl :class=\"cn('hn-dl', props.class)\">\n <slot />\n </dl>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnDescriptionList' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <dl :class=\"cn('hn-dl', props.class)\">\n <slot />\n </dl>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnDescriptionTerm' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <dt :class=\"cn(props.class)\">\n <slot />\n </dt>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnDescriptionTerm' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <dt :class=\"cn(props.class)\">\n <slot />\n </dt>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnDescriptionDetails' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <dd :class=\"cn(props.class)\">\n <slot />\n </dd>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnDescriptionDetails' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <dd :class=\"cn(props.class)\">\n <slot />\n </dd>\n</template>\n","const DIVISIONS = [\n [60, 'second'],\n [60, 'minute'],\n [24, 'hour'],\n [7, 'day'],\n [4.34524, 'week'],\n [12, 'month'],\n [Infinity, 'year'],\n] as const\n\nexport function relativeTime(target: Date, nowMs: number, tag: string, justNow: string): string {\n let duration = (target.getTime() - nowMs) / 1000\n if (Math.abs(duration) < 45) return justNow\n const rtf = new Intl.RelativeTimeFormat(tag, { numeric: 'auto' })\n for (const [amount, unit] of DIVISIONS) {\n if (Math.abs(duration) < amount) return rtf.format(Math.round(duration), unit)\n duration /= amount\n }\n return ''\n}\n","import { onBeforeUnmount, onMounted, ref, watch } from 'vue'\n\nexport function useNow(active: () => boolean, intervalMs = 30_000) {\n const now = ref(Date.now())\n let timer: ReturnType<typeof setInterval> | undefined\n\n onMounted(() => {\n watch(\n active,\n on => {\n clearInterval(timer)\n timer = undefined\n if (on) {\n now.value = Date.now()\n timer = setInterval(() => {\n now.value = Date.now()\n }, intervalMs)\n }\n },\n { immediate: true },\n )\n })\n\n onBeforeUnmount(() => clearInterval(timer))\n\n return now\n}\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { cn } from '../../lib/cn'\n import { devWarn } from '../../lib/dev'\n import { useUiLocale } from '../../locale'\n import { relativeTime } from './utils/relativeTime'\n import { useNow } from './composables/useNow'\n\n defineOptions({ name: 'HnTime' })\n\n const props = withDefaults(\n defineProps<{\n value?: string | number | Date | null\n format?: 'datetime' | 'date' | 'time' | 'relative'\n class?: string\n }>(),\n { format: 'datetime' },\n )\n\n const t = useUiLocale()\n\n const date = computed(() => {\n if (props.value == null || props.value === '') return null\n const parsed = new Date(props.value)\n if (Number.isNaN(parsed.getTime())) {\n devWarn('Time', `value 无法解析为时间:${String(props.value)}`, String(props.value))\n return null\n }\n return parsed\n })\n\n const now = useNow(() => props.format === 'relative')\n\n const absoluteOptions = {\n datetime: { dateStyle: 'medium', timeStyle: 'short' },\n date: { dateStyle: 'medium' },\n time: { timeStyle: 'short' },\n } as const satisfies Record<string, Intl.DateTimeFormatOptions>\n\n const text = computed(() => {\n if (!date.value) return t.value.time.unknown\n if (props.format === 'relative')\n return relativeTime(date.value, now.value, t.value.tag, t.value.time.justNow)\n return new Intl.DateTimeFormat(t.value.tag, absoluteOptions[props.format]).format(date.value)\n })\n\n const absolute = computed(() =>\n date.value\n ? new Intl.DateTimeFormat(t.value.tag, absoluteOptions.datetime).format(date.value)\n : undefined,\n )\n</script>\n\n<template>\n <time\n v-if=\"date\"\n :datetime=\"date.toISOString()\"\n :title=\"format === 'relative' ? absolute : undefined\"\n :class=\"cn(props.class)\"\n >\n {{ text }}\n </time>\n <span v-else :class=\"cn(props.class)\">{{ text }}</span>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { cn } from '../../lib/cn'\n import { devWarn } from '../../lib/dev'\n import { useUiLocale } from '../../locale'\n import { relativeTime } from './utils/relativeTime'\n import { useNow } from './composables/useNow'\n\n defineOptions({ name: 'HnTime' })\n\n const props = withDefaults(\n defineProps<{\n value?: string | number | Date | null\n format?: 'datetime' | 'date' | 'time' | 'relative'\n class?: string\n }>(),\n { format: 'datetime' },\n )\n\n const t = useUiLocale()\n\n const date = computed(() => {\n if (props.value == null || props.value === '') return null\n const parsed = new Date(props.value)\n if (Number.isNaN(parsed.getTime())) {\n devWarn('Time', `value 无法解析为时间:${String(props.value)}`, String(props.value))\n return null\n }\n return parsed\n })\n\n const now = useNow(() => props.format === 'relative')\n\n const absoluteOptions = {\n datetime: { dateStyle: 'medium', timeStyle: 'short' },\n date: { dateStyle: 'medium' },\n time: { timeStyle: 'short' },\n } as const satisfies Record<string, Intl.DateTimeFormatOptions>\n\n const text = computed(() => {\n if (!date.value) return t.value.time.unknown\n if (props.format === 'relative')\n return relativeTime(date.value, now.value, t.value.tag, t.value.time.justNow)\n return new Intl.DateTimeFormat(t.value.tag, absoluteOptions[props.format]).format(date.value)\n })\n\n const absolute = computed(() =>\n date.value\n ? new Intl.DateTimeFormat(t.value.tag, absoluteOptions.datetime).format(date.value)\n : undefined,\n )\n</script>\n\n<template>\n <time\n v-if=\"date\"\n :datetime=\"date.toISOString()\"\n :title=\"format === 'relative' ? absolute : undefined\"\n :class=\"cn(props.class)\"\n >\n {{ text }}\n </time>\n <span v-else :class=\"cn(props.class)\">{{ text }}</span>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const stack = tv({\n base: 'flex flex-col',\n variants: {\n gap: {\n none: 'gap-0',\n xs: 'gap-1',\n sm: 'gap-2',\n md: 'gap-[var(--hn-stack-gap)]',\n lg: 'gap-6',\n xl: 'gap-8',\n },\n align: {\n start: 'items-start',\n center: 'items-center',\n end: 'items-end',\n stretch: 'items-stretch',\n },\n justify: {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n between: 'justify-between',\n around: 'justify-around',\n evenly: 'justify-evenly',\n },\n },\n defaultVariants: {\n gap: 'md',\n },\n})\n\nexport type StackVariants = VariantProps<typeof stack>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import { stack, type StackVariants } from './stack.variants'\n\n defineOptions({ name: 'HnStack' })\n\n const props = withDefaults(\n defineProps<{\n as?: string\n gap?: StackVariants['gap']\n align?: StackVariants['align']\n justify?: StackVariants['justify']\n class?: string\n }>(),\n { as: 'div' },\n )\n</script>\n\n<template>\n <component :is=\"props.as\" :class=\"cn(stack({ gap, align, justify }), props.class)\">\n <slot />\n </component>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import { stack, type StackVariants } from './stack.variants'\n\n defineOptions({ name: 'HnStack' })\n\n const props = withDefaults(\n defineProps<{\n as?: string\n gap?: StackVariants['gap']\n align?: StackVariants['align']\n justify?: StackVariants['justify']\n class?: string\n }>(),\n { as: 'div' },\n )\n</script>\n\n<template>\n <component :is=\"props.as\" :class=\"cn(stack({ gap, align, justify }), props.class)\">\n <slot />\n </component>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const inline = tv({\n base: 'flex',\n variants: {\n gap: {\n none: 'gap-0',\n xs: 'gap-1',\n sm: 'gap-2',\n md: 'gap-[var(--hn-inline-gap)]',\n lg: 'gap-6',\n xl: 'gap-8',\n },\n align: {\n start: 'items-start',\n center: 'items-center',\n end: 'items-end',\n baseline: 'items-baseline',\n stretch: 'items-stretch',\n },\n justify: {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n between: 'justify-between',\n around: 'justify-around',\n evenly: 'justify-evenly',\n },\n wrap: {\n true: 'flex-wrap',\n false: 'flex-nowrap',\n },\n },\n defaultVariants: {\n gap: 'md',\n align: 'center',\n wrap: true,\n },\n})\n\nexport type InlineVariants = VariantProps<typeof inline>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import { inline, type InlineVariants } from './inline.variants'\n\n defineOptions({ name: 'HnInline' })\n\n const props = withDefaults(\n defineProps<{\n as?: string\n gap?: InlineVariants['gap']\n align?: InlineVariants['align']\n justify?: InlineVariants['justify']\n wrap?: boolean\n class?: string\n }>(),\n { as: 'div', wrap: true },\n )\n</script>\n\n<template>\n <component :is=\"props.as\" :class=\"cn(inline({ gap, align, justify, wrap }), props.class)\">\n <slot />\n </component>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import { inline, type InlineVariants } from './inline.variants'\n\n defineOptions({ name: 'HnInline' })\n\n const props = withDefaults(\n defineProps<{\n as?: string\n gap?: InlineVariants['gap']\n align?: InlineVariants['align']\n justify?: InlineVariants['justify']\n wrap?: boolean\n class?: string\n }>(),\n { as: 'div', wrap: true },\n )\n</script>\n\n<template>\n <component :is=\"props.as\" :class=\"cn(inline({ gap, align, justify, wrap }), props.class)\">\n <slot />\n </component>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const flex = tv({\n base: 'flex',\n variants: {\n direction: {\n row: 'flex-row',\n col: 'flex-col',\n 'row-reverse': 'flex-row-reverse',\n 'col-reverse': 'flex-col-reverse',\n },\n gap: {\n none: 'gap-0',\n xs: 'gap-1',\n sm: 'gap-2',\n md: '',\n lg: 'gap-6',\n xl: 'gap-8',\n },\n align: {\n start: 'items-start',\n center: 'items-center',\n end: 'items-end',\n baseline: 'items-baseline',\n stretch: 'items-stretch',\n },\n justify: {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n between: 'justify-between',\n around: 'justify-around',\n evenly: 'justify-evenly',\n },\n wrap: {\n true: 'flex-wrap',\n false: 'flex-nowrap',\n },\n },\n compoundVariants: [\n { direction: ['row', 'row-reverse'], gap: 'md', class: 'gap-[var(--hn-inline-gap)]' },\n { direction: ['col', 'col-reverse'], gap: 'md', class: 'gap-[var(--hn-stack-gap)]' },\n ],\n defaultVariants: {\n direction: 'row',\n },\n})\n\nexport type FlexVariants = VariantProps<typeof flex>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import { flex, type FlexVariants } from './flex.variants'\n\n defineOptions({ name: 'HnFlex' })\n\n const props = withDefaults(\n defineProps<{\n as?: string\n direction?: FlexVariants['direction']\n gap?: FlexVariants['gap']\n align?: FlexVariants['align']\n justify?: FlexVariants['justify']\n wrap?: boolean\n class?: string\n }>(),\n { as: 'div' },\n )\n</script>\n\n<template>\n <component\n :is=\"props.as\"\n :class=\"cn(flex({ direction, gap, align, justify, wrap }), props.class)\"\n >\n <slot />\n </component>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import { flex, type FlexVariants } from './flex.variants'\n\n defineOptions({ name: 'HnFlex' })\n\n const props = withDefaults(\n defineProps<{\n as?: string\n direction?: FlexVariants['direction']\n gap?: FlexVariants['gap']\n align?: FlexVariants['align']\n justify?: FlexVariants['justify']\n wrap?: boolean\n class?: string\n }>(),\n { as: 'div' },\n )\n</script>\n\n<template>\n <component\n :is=\"props.as\"\n :class=\"cn(flex({ direction, gap, align, justify, wrap }), props.class)\"\n >\n <slot />\n </component>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const grid = tv({\n base: 'grid',\n variants: {\n cols: {\n 1: 'grid-cols-1',\n 2: 'grid-cols-2',\n 3: 'grid-cols-3',\n 4: 'grid-cols-4',\n 5: 'grid-cols-5',\n 6: 'grid-cols-6',\n 7: 'grid-cols-7',\n 8: 'grid-cols-8',\n 9: 'grid-cols-9',\n 10: 'grid-cols-10',\n 11: 'grid-cols-11',\n 12: 'grid-cols-12',\n },\n gap: {\n none: 'gap-0',\n xs: 'gap-1',\n sm: 'gap-2',\n md: 'gap-x-[var(--hn-inline-gap)] gap-y-[var(--hn-stack-gap)]',\n lg: 'gap-6',\n xl: 'gap-8',\n },\n },\n defaultVariants: {\n cols: 1,\n gap: 'md',\n },\n})\n\nexport type GridVariants = VariantProps<typeof grid>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import { grid, type GridVariants } from './grid.variants'\n\n defineOptions({ name: 'HnGrid' })\n\n const props = withDefaults(\n defineProps<{\n as?: string\n cols?: GridVariants['cols']\n gap?: GridVariants['gap']\n class?: string\n }>(),\n { as: 'div' },\n )\n</script>\n\n<template>\n <component :is=\"props.as\" :class=\"cn(grid({ cols, gap }), props.class)\">\n <slot />\n </component>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import { grid, type GridVariants } from './grid.variants'\n\n defineOptions({ name: 'HnGrid' })\n\n const props = withDefaults(\n defineProps<{\n as?: string\n cols?: GridVariants['cols']\n gap?: GridVariants['gap']\n class?: string\n }>(),\n { as: 'div' },\n )\n</script>\n\n<template>\n <component :is=\"props.as\" :class=\"cn(grid({ cols, gap }), props.class)\">\n <slot />\n </component>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const simpleGrid = tv({\n base: 'grid',\n variants: {\n fit: {\n false: 'grid-cols-[repeat(auto-fill,minmax(var(--hn-simple-grid-min),1fr))]',\n true: 'grid-cols-[repeat(auto-fit,minmax(var(--hn-simple-grid-min),1fr))]',\n },\n gap: {\n none: 'gap-0',\n xs: 'gap-1',\n sm: 'gap-2',\n md: 'gap-x-[var(--hn-inline-gap)] gap-y-[var(--hn-stack-gap)]',\n lg: 'gap-6',\n xl: 'gap-8',\n },\n },\n defaultVariants: {\n fit: false,\n gap: 'md',\n },\n})\n\nexport type SimpleGridVariants = VariantProps<typeof simpleGrid>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import { simpleGrid, type SimpleGridVariants } from './simple-grid.variants'\n\n defineOptions({ name: 'HnSimpleGrid' })\n\n const props = withDefaults(\n defineProps<{\n as?: string\n min?: string\n fit?: boolean\n gap?: SimpleGridVariants['gap']\n class?: string\n }>(),\n { as: 'div', min: '14rem', fit: false },\n )\n</script>\n\n<template>\n <component\n :is=\"props.as\"\n :style=\"{ '--hn-simple-grid-min': props.min }\"\n :class=\"cn(simpleGrid({ fit, gap }), props.class)\"\n >\n <slot />\n </component>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import { simpleGrid, type SimpleGridVariants } from './simple-grid.variants'\n\n defineOptions({ name: 'HnSimpleGrid' })\n\n const props = withDefaults(\n defineProps<{\n as?: string\n min?: string\n fit?: boolean\n gap?: SimpleGridVariants['gap']\n class?: string\n }>(),\n { as: 'div', min: '14rem', fit: false },\n )\n</script>\n\n<template>\n <component\n :is=\"props.as\"\n :style=\"{ '--hn-simple-grid-min': props.min }\"\n :class=\"cn(simpleGrid({ fit, gap }), props.class)\"\n >\n <slot />\n </component>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const container = tv({\n base: 'mx-auto w-full px-4 sm:px-6',\n variants: {\n size: {\n sm: 'max-w-3xl',\n md: 'max-w-5xl',\n lg: 'max-w-6xl',\n xl: 'max-w-7xl',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nexport type ContainerVariants = VariantProps<typeof container>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import { container, type ContainerVariants } from './container.variants'\n\n defineOptions({ name: 'HnContainer' })\n\n const props = withDefaults(\n defineProps<{\n as?: string\n size?: ContainerVariants['size']\n class?: string\n }>(),\n { as: 'div' },\n )\n</script>\n\n<template>\n <component :is=\"props.as\" :class=\"cn(container({ size }), props.class)\">\n <slot />\n </component>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import { container, type ContainerVariants } from './container.variants'\n\n defineOptions({ name: 'HnContainer' })\n\n const props = withDefaults(\n defineProps<{\n as?: string\n size?: ContainerVariants['size']\n class?: string\n }>(),\n { as: 'div' },\n )\n</script>\n\n<template>\n <component :is=\"props.as\" :class=\"cn(container({ size }), props.class)\">\n <slot />\n </component>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnCenter' })\n\n const props = withDefaults(\n defineProps<{\n as?: string\n inline?: boolean\n class?: string\n }>(),\n { as: 'div', inline: false },\n )\n</script>\n\n<template>\n <component\n :is=\"props.as\"\n :class=\"cn(props.inline ? 'inline-flex' : 'flex', 'items-center justify-center', props.class)\"\n >\n <slot />\n </component>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnCenter' })\n\n const props = withDefaults(\n defineProps<{\n as?: string\n inline?: boolean\n class?: string\n }>(),\n { as: 'div', inline: false },\n )\n</script>\n\n<template>\n <component\n :is=\"props.as\"\n :class=\"cn(props.inline ? 'inline-flex' : 'flex', 'items-center justify-center', props.class)\"\n >\n <slot />\n </component>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const space = tv({\n base: 'shrink-0',\n variants: {\n size: {\n xs: 'size-1',\n sm: 'size-2',\n md: 'size-4',\n lg: 'size-6',\n xl: 'size-8',\n flex: 'flex-1 self-stretch',\n },\n },\n defaultVariants: { size: 'flex' },\n})\n\nexport type SpaceVariants = VariantProps<typeof space>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import { space, type SpaceVariants } from './space.variants'\n\n defineOptions({ name: 'HnSpace' })\n\n const props = defineProps<{\n size?: SpaceVariants['size']\n class?: string\n }>()\n</script>\n\n<template>\n <div aria-hidden=\"true\" :class=\"cn(space({ size: props.size }), props.class)\" />\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import { space, type SpaceVariants } from './space.variants'\n\n defineOptions({ name: 'HnSpace' })\n\n const props = defineProps<{\n size?: SpaceVariants['size']\n class?: string\n }>()\n</script>\n\n<template>\n <div aria-hidden=\"true\" :class=\"cn(space({ size: props.size }), props.class)\" />\n</template>\n","<script setup lang=\"ts\">\n import { AspectRatio as RekaAspectRatio } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnAspectRatio' })\n\n const props = withDefaults(\n defineProps<{\n ratio?: number\n class?: string\n }>(),\n { ratio: 16 / 9 },\n )\n</script>\n\n<template>\n <div\n :class=\"\n cn(\n '[&_img]:size-full [&_img]:object-cover [&_video]:size-full [&_video]:object-cover',\n props.class,\n )\n \"\n >\n <RekaAspectRatio :ratio=\"props.ratio\">\n <slot />\n </RekaAspectRatio>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { AspectRatio as RekaAspectRatio } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnAspectRatio' })\n\n const props = withDefaults(\n defineProps<{\n ratio?: number\n class?: string\n }>(),\n { ratio: 16 / 9 },\n )\n</script>\n\n<template>\n <div\n :class=\"\n cn(\n '[&_img]:size-full [&_img]:object-cover [&_video]:size-full [&_video]:object-cover',\n props.class,\n )\n \"\n >\n <RekaAspectRatio :ratio=\"props.ratio\">\n <slot />\n </RekaAspectRatio>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { useSlots } from 'vue'\n import { Separator } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnDivider' })\n\n const props = withDefaults(\n defineProps<{\n orientation?: 'horizontal' | 'vertical'\n decorative?: boolean\n class?: string\n }>(),\n { orientation: 'horizontal', decorative: false },\n )\n\n const slots = useSlots()\n</script>\n\n<template>\n <div\n v-if=\"slots.default && props.orientation === 'horizontal'\"\n :class=\"cn('flex w-full items-center gap-3', props.class)\"\n >\n <Separator decorative class=\"bg-line h-px flex-1\" />\n <span class=\"text-faint shrink-0 text-sm\">\n <slot />\n </span>\n <Separator decorative class=\"bg-line h-px flex-1\" />\n </div>\n <Separator\n v-else\n :orientation=\"props.orientation\"\n :decorative=\"props.decorative\"\n :class=\"\n cn(\n 'bg-line',\n props.orientation === 'horizontal' ? 'h-px w-full' : 'w-px self-stretch',\n props.class,\n )\n \"\n />\n</template>\n","<script setup lang=\"ts\">\n import { useSlots } from 'vue'\n import { Separator } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnDivider' })\n\n const props = withDefaults(\n defineProps<{\n orientation?: 'horizontal' | 'vertical'\n decorative?: boolean\n class?: string\n }>(),\n { orientation: 'horizontal', decorative: false },\n )\n\n const slots = useSlots()\n</script>\n\n<template>\n <div\n v-if=\"slots.default && props.orientation === 'horizontal'\"\n :class=\"cn('flex w-full items-center gap-3', props.class)\"\n >\n <Separator decorative class=\"bg-line h-px flex-1\" />\n <span class=\"text-faint shrink-0 text-sm\">\n <slot />\n </span>\n <Separator decorative class=\"bg-line h-px flex-1\" />\n </div>\n <Separator\n v-else\n :orientation=\"props.orientation\"\n :decorative=\"props.decorative\"\n :class=\"\n cn(\n 'bg-line',\n props.orientation === 'horizontal' ? 'h-px w-full' : 'w-px self-stretch',\n props.class,\n )\n \"\n />\n</template>\n","<script setup lang=\"ts\">\n import { SplitterGroup } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnSplitter' })\n\n const props = withDefaults(\n defineProps<{\n direction?: 'horizontal' | 'vertical'\n autoSaveId?: string\n class?: string\n }>(),\n { direction: 'horizontal' },\n )\n</script>\n\n<template>\n <div :class=\"cn(props.class)\">\n <SplitterGroup :direction=\"props.direction\" :auto-save-id=\"props.autoSaveId\">\n <slot />\n </SplitterGroup>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { SplitterGroup } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnSplitter' })\n\n const props = withDefaults(\n defineProps<{\n direction?: 'horizontal' | 'vertical'\n autoSaveId?: string\n class?: string\n }>(),\n { direction: 'horizontal' },\n )\n</script>\n\n<template>\n <div :class=\"cn(props.class)\">\n <SplitterGroup :direction=\"props.direction\" :auto-save-id=\"props.autoSaveId\">\n <slot />\n </SplitterGroup>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { SplitterPanel as RekaSplitterPanel } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnSplitterPanel' })\n\n const props = defineProps<{\n defaultSize?: number\n minSize?: number\n maxSize?: number\n collapsible?: boolean\n collapsedSize?: number\n class?: string\n }>()\n</script>\n\n<template>\n <RekaSplitterPanel\n :default-size=\"props.defaultSize\"\n :min-size=\"props.minSize\"\n :max-size=\"props.maxSize\"\n :collapsible=\"props.collapsible\"\n :collapsed-size=\"props.collapsedSize\"\n :class=\"cn('min-h-0 min-w-0', props.class)\"\n >\n <slot />\n </RekaSplitterPanel>\n</template>\n","<script setup lang=\"ts\">\n import { SplitterPanel as RekaSplitterPanel } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnSplitterPanel' })\n\n const props = defineProps<{\n defaultSize?: number\n minSize?: number\n maxSize?: number\n collapsible?: boolean\n collapsedSize?: number\n class?: string\n }>()\n</script>\n\n<template>\n <RekaSplitterPanel\n :default-size=\"props.defaultSize\"\n :min-size=\"props.minSize\"\n :max-size=\"props.maxSize\"\n :collapsible=\"props.collapsible\"\n :collapsed-size=\"props.collapsedSize\"\n :class=\"cn('min-h-0 min-w-0', props.class)\"\n >\n <slot />\n </RekaSplitterPanel>\n</template>\n","<script setup lang=\"ts\">\n import { SplitterResizeHandle } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n\n defineOptions({ name: 'HnSplitterHandle' })\n\n const props = defineProps<{\n label?: string\n class?: string\n }>()\n\n const t = useUiLocale()\n</script>\n\n<template>\n <SplitterResizeHandle\n :aria-label=\"props.label ?? t.splitter.handleLabel\"\n :class=\"\n cn(\n 'hn-focus-ring group/handle relative flex shrink-0 items-center justify-center',\n 'data-[orientation=horizontal]:w-2 data-[orientation=vertical]:h-2',\n props.class,\n )\n \"\n >\n <div\n class=\"border-line group-hover/handle:border-line-strong group-data-[resize-handle-state=drag]/handle:border-line-strong group-data-[orientation=horizontal]/handle:h-full group-data-[orientation=horizontal]/handle:border-s group-data-[orientation=vertical]/handle:w-full group-data-[orientation=vertical]/handle:border-t\"\n />\n </SplitterResizeHandle>\n</template>\n","<script setup lang=\"ts\">\n import { SplitterResizeHandle } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n\n defineOptions({ name: 'HnSplitterHandle' })\n\n const props = defineProps<{\n label?: string\n class?: string\n }>()\n\n const t = useUiLocale()\n</script>\n\n<template>\n <SplitterResizeHandle\n :aria-label=\"props.label ?? t.splitter.handleLabel\"\n :class=\"\n cn(\n 'hn-focus-ring group/handle relative flex shrink-0 items-center justify-center',\n 'data-[orientation=horizontal]:w-2 data-[orientation=vertical]:h-2',\n props.class,\n )\n \"\n >\n <div\n class=\"border-line group-hover/handle:border-line-strong group-data-[resize-handle-state=drag]/handle:border-line-strong group-data-[orientation=horizontal]/handle:h-full group-data-[orientation=horizontal]/handle:border-s group-data-[orientation=vertical]/handle:w-full group-data-[orientation=vertical]/handle:border-t\"\n />\n </SplitterResizeHandle>\n</template>\n","<script setup lang=\"ts\">\n import { CollapsibleRoot, useForwardPropsEmits, type CollapsibleRootEmits } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnCollapsible' })\n\n const props = defineProps<{\n open?: boolean\n defaultOpen?: boolean\n disabled?: boolean\n class?: string\n }>()\n const emits = defineEmits<CollapsibleRootEmits>()\n\n const forwarded = useForwardPropsEmits(\n () => ({ open: props.open, defaultOpen: props.defaultOpen, disabled: props.disabled }),\n emits,\n )\n</script>\n\n<template>\n <CollapsibleRoot v-bind=\"forwarded\" :class=\"cn(props.class)\">\n <slot />\n </CollapsibleRoot>\n</template>\n","<script setup lang=\"ts\">\n import { CollapsibleRoot, useForwardPropsEmits, type CollapsibleRootEmits } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnCollapsible' })\n\n const props = defineProps<{\n open?: boolean\n defaultOpen?: boolean\n disabled?: boolean\n class?: string\n }>()\n const emits = defineEmits<CollapsibleRootEmits>()\n\n const forwarded = useForwardPropsEmits(\n () => ({ open: props.open, defaultOpen: props.defaultOpen, disabled: props.disabled }),\n emits,\n )\n</script>\n\n<template>\n <CollapsibleRoot v-bind=\"forwarded\" :class=\"cn(props.class)\">\n <slot />\n </CollapsibleRoot>\n</template>\n","<script setup lang=\"ts\">\n import { CollapsibleTrigger as RekaCollapsibleTrigger } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import Button from '../button/Button.vue'\n import DisclosureIcon from '../disclosure-icon/DisclosureIcon.vue'\n\n defineOptions({ name: 'HnCollapsibleTrigger' })\n\n const props = withDefaults(\n defineProps<{\n asChild?: boolean\n icon?: boolean\n class?: string\n }>(),\n { icon: true },\n )\n\n const slots = defineSlots<{\n default?: () => unknown\n icon?: () => unknown\n }>()\n</script>\n\n<template>\n <RekaCollapsibleTrigger as-child :class=\"cn('group/hn-disclosure', props.class)\">\n <slot v-if=\"props.asChild\" />\n <Button v-else variant=\"ghost\" tone=\"neutral\">\n <slot />\n <template v-if=\"props.icon\" #trailing>\n <DisclosureIcon v-if=\"!slots.icon\" />\n <DisclosureIcon v-else>\n <slot name=\"icon\" />\n </DisclosureIcon>\n </template>\n </Button>\n </RekaCollapsibleTrigger>\n</template>\n","<script setup lang=\"ts\">\n import { CollapsibleTrigger as RekaCollapsibleTrigger } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import Button from '../button/Button.vue'\n import DisclosureIcon from '../disclosure-icon/DisclosureIcon.vue'\n\n defineOptions({ name: 'HnCollapsibleTrigger' })\n\n const props = withDefaults(\n defineProps<{\n asChild?: boolean\n icon?: boolean\n class?: string\n }>(),\n { icon: true },\n )\n\n const slots = defineSlots<{\n default?: () => unknown\n icon?: () => unknown\n }>()\n</script>\n\n<template>\n <RekaCollapsibleTrigger as-child :class=\"cn('group/hn-disclosure', props.class)\">\n <slot v-if=\"props.asChild\" />\n <Button v-else variant=\"ghost\" tone=\"neutral\">\n <slot />\n <template v-if=\"props.icon\" #trailing>\n <DisclosureIcon v-if=\"!slots.icon\" />\n <DisclosureIcon v-else>\n <slot name=\"icon\" />\n </DisclosureIcon>\n </template>\n </Button>\n </RekaCollapsibleTrigger>\n</template>\n","<script setup lang=\"ts\">\n import { onBeforeUpdate, onMounted, shallowRef, type ComponentPublicInstance } from 'vue'\n import { CollapsibleContent as RekaCollapsibleContent } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { writeCollapseGap } from '../../lib/collapse'\n\n defineOptions({ name: 'HnCollapsibleContent' })\n\n const props = defineProps<{ class?: string }>()\n\n const content = shallowRef<ComponentPublicInstance | null>(null)\n\n function measure() {\n const el = content.value?.$el as Element | undefined\n if (el instanceof Element) writeCollapseGap(el, el.parentElement)\n }\n\n onMounted(measure)\n onBeforeUpdate(measure)\n</script>\n\n<template>\n <RekaCollapsibleContent\n ref=\"content\"\n :class=\"\n cn('hn-anim-collapse [--hn-collapse-h:var(--reka-collapsible-content-height)]', props.class)\n \"\n >\n <slot />\n </RekaCollapsibleContent>\n</template>\n","<script setup lang=\"ts\">\n import { onBeforeUpdate, onMounted, shallowRef, type ComponentPublicInstance } from 'vue'\n import { CollapsibleContent as RekaCollapsibleContent } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { writeCollapseGap } from '../../lib/collapse'\n\n defineOptions({ name: 'HnCollapsibleContent' })\n\n const props = defineProps<{ class?: string }>()\n\n const content = shallowRef<ComponentPublicInstance | null>(null)\n\n function measure() {\n const el = content.value?.$el as Element | undefined\n if (el instanceof Element) writeCollapseGap(el, el.parentElement)\n }\n\n onMounted(measure)\n onBeforeUpdate(measure)\n</script>\n\n<template>\n <RekaCollapsibleContent\n ref=\"content\"\n :class=\"\n cn('hn-anim-collapse [--hn-collapse-h:var(--reka-collapsible-content-height)]', props.class)\n \"\n >\n <slot />\n </RekaCollapsibleContent>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const accordion = tv({\n base: 'divide-line flex flex-col divide-y',\n})\n\nexport const accordionTrigger = tv({\n base: [\n 'group/hn-disclosure hn-interactive hn-state-layer hn-press-none',\n 'text-fg -mx-3 flex w-[calc(100%+--spacing(6))] items-center justify-between gap-3 rounded-md px-3 py-3 text-start text-base font-medium',\n 'disabled:pointer-events-none disabled:opacity-50 [&_svg]:size-4',\n ],\n})\n\nexport const accordionContent = tv({\n base: 'hn-anim-collapse [--hn-collapse-h:var(--reka-accordion-content-height)]',\n})\n\nexport type AccordionVariants = VariantProps<typeof accordion>\n","<script setup lang=\"ts\">\n import { AccordionRoot, useForwardPropsEmits, type AccordionRootEmits } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { accordion } from './accordion.variants'\n\n defineOptions({ name: 'HnAccordion' })\n\n const props = withDefaults(\n defineProps<{\n type?: 'single' | 'multiple'\n collapsible?: boolean\n modelValue?: string | string[]\n defaultValue?: string | string[]\n disabled?: boolean\n class?: string\n }>(),\n { type: 'single' },\n )\n const emits = defineEmits<AccordionRootEmits>()\n\n const forwarded = useForwardPropsEmits(\n () => ({\n type: props.type,\n collapsible: props.collapsible,\n modelValue: props.modelValue,\n defaultValue: props.defaultValue,\n disabled: props.disabled,\n }),\n emits,\n )\n</script>\n\n<template>\n <AccordionRoot v-bind=\"forwarded\" :class=\"cn(accordion(), props.class)\">\n <slot />\n </AccordionRoot>\n</template>\n","<script setup lang=\"ts\">\n import { AccordionRoot, useForwardPropsEmits, type AccordionRootEmits } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { accordion } from './accordion.variants'\n\n defineOptions({ name: 'HnAccordion' })\n\n const props = withDefaults(\n defineProps<{\n type?: 'single' | 'multiple'\n collapsible?: boolean\n modelValue?: string | string[]\n defaultValue?: string | string[]\n disabled?: boolean\n class?: string\n }>(),\n { type: 'single' },\n )\n const emits = defineEmits<AccordionRootEmits>()\n\n const forwarded = useForwardPropsEmits(\n () => ({\n type: props.type,\n collapsible: props.collapsible,\n modelValue: props.modelValue,\n defaultValue: props.defaultValue,\n disabled: props.disabled,\n }),\n emits,\n )\n</script>\n\n<template>\n <AccordionRoot v-bind=\"forwarded\" :class=\"cn(accordion(), props.class)\">\n <slot />\n </AccordionRoot>\n</template>\n","<script setup lang=\"ts\">\n import { AccordionItem as RekaAccordionItem } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnAccordionItem' })\n\n const props = defineProps<{\n value: string\n disabled?: boolean\n class?: string\n }>()\n</script>\n\n<template>\n <RekaAccordionItem :value=\"props.value\" :disabled=\"props.disabled\" :class=\"cn(props.class)\">\n <slot />\n </RekaAccordionItem>\n</template>\n","<script setup lang=\"ts\">\n import { AccordionItem as RekaAccordionItem } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnAccordionItem' })\n\n const props = defineProps<{\n value: string\n disabled?: boolean\n class?: string\n }>()\n</script>\n\n<template>\n <RekaAccordionItem :value=\"props.value\" :disabled=\"props.disabled\" :class=\"cn(props.class)\">\n <slot />\n </RekaAccordionItem>\n</template>\n","<script setup lang=\"ts\">\n import { AccordionHeader, AccordionTrigger as RekaAccordionTrigger } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import Ripple from '../ripple/Ripple.vue'\n import DisclosureIcon from '../disclosure-icon/DisclosureIcon.vue'\n import { accordionTrigger } from './accordion.variants'\n\n defineOptions({ name: 'HnAccordionTrigger' })\n\n const props = withDefaults(\n defineProps<{\n level?: 2 | 3 | 4 | 5 | 6\n icon?: boolean\n class?: string\n }>(),\n { level: 3, icon: true },\n )\n\n const slots = defineSlots<{\n default?: () => unknown\n icon?: () => unknown\n }>()\n</script>\n\n<template>\n <AccordionHeader :as=\"`h${props.level}`\" class=\"m-0\">\n <RekaAccordionTrigger :class=\"cn(accordionTrigger(), props.class)\">\n <Ripple />\n <span class=\"min-w-0 flex-1\">\n <slot />\n </span>\n <template v-if=\"props.icon\">\n <DisclosureIcon v-if=\"!slots.icon\" />\n <DisclosureIcon v-else>\n <slot name=\"icon\" />\n </DisclosureIcon>\n </template>\n </RekaAccordionTrigger>\n </AccordionHeader>\n</template>\n","<script setup lang=\"ts\">\n import { AccordionHeader, AccordionTrigger as RekaAccordionTrigger } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import Ripple from '../ripple/Ripple.vue'\n import DisclosureIcon from '../disclosure-icon/DisclosureIcon.vue'\n import { accordionTrigger } from './accordion.variants'\n\n defineOptions({ name: 'HnAccordionTrigger' })\n\n const props = withDefaults(\n defineProps<{\n level?: 2 | 3 | 4 | 5 | 6\n icon?: boolean\n class?: string\n }>(),\n { level: 3, icon: true },\n )\n\n const slots = defineSlots<{\n default?: () => unknown\n icon?: () => unknown\n }>()\n</script>\n\n<template>\n <AccordionHeader :as=\"`h${props.level}`\" class=\"m-0\">\n <RekaAccordionTrigger :class=\"cn(accordionTrigger(), props.class)\">\n <Ripple />\n <span class=\"min-w-0 flex-1\">\n <slot />\n </span>\n <template v-if=\"props.icon\">\n <DisclosureIcon v-if=\"!slots.icon\" />\n <DisclosureIcon v-else>\n <slot name=\"icon\" />\n </DisclosureIcon>\n </template>\n </RekaAccordionTrigger>\n </AccordionHeader>\n</template>\n","<script setup lang=\"ts\">\n import { onBeforeUpdate, onMounted, shallowRef, type ComponentPublicInstance } from 'vue'\n import { AccordionContent as RekaAccordionContent } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { writeCollapseGap } from '../../lib/collapse'\n import { accordionContent } from './accordion.variants'\n\n defineOptions({ name: 'HnAccordionContent' })\n\n const props = defineProps<{ class?: string }>()\n\n const content = shallowRef<ComponentPublicInstance | null>(null)\n\n function measure() {\n const el = content.value?.$el as Element | undefined\n if (el instanceof Element) writeCollapseGap(el, el.parentElement)\n }\n\n onMounted(measure)\n onBeforeUpdate(measure)\n</script>\n\n<template>\n <RekaAccordionContent ref=\"content\" :class=\"cn(accordionContent(), props.class)\">\n <div class=\"pb-4\">\n <slot />\n </div>\n </RekaAccordionContent>\n</template>\n","<script setup lang=\"ts\">\n import { onBeforeUpdate, onMounted, shallowRef, type ComponentPublicInstance } from 'vue'\n import { AccordionContent as RekaAccordionContent } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { writeCollapseGap } from '../../lib/collapse'\n import { accordionContent } from './accordion.variants'\n\n defineOptions({ name: 'HnAccordionContent' })\n\n const props = defineProps<{ class?: string }>()\n\n const content = shallowRef<ComponentPublicInstance | null>(null)\n\n function measure() {\n const el = content.value?.$el as Element | undefined\n if (el instanceof Element) writeCollapseGap(el, el.parentElement)\n }\n\n onMounted(measure)\n onBeforeUpdate(measure)\n</script>\n\n<template>\n <RekaAccordionContent ref=\"content\" :class=\"cn(accordionContent(), props.class)\">\n <div class=\"pb-4\">\n <slot />\n </div>\n </RekaAccordionContent>\n</template>\n","import { inject, provide, type InjectionKey, type Ref } from 'vue'\n\nexport type SidebarState = 'expanded' | 'rail' | 'hidden'\n\nexport interface SidebarContext {\n state: Readonly<Ref<SidebarState>>\n toggle: () => void\n openMobile: () => void\n inDrawer?: boolean\n}\n\nconst SIDEBAR_KEY = Symbol('hn-sidebar') as InjectionKey<SidebarContext>\n\nexport function provideSidebar(context: SidebarContext) {\n provide(SIDEBAR_KEY, context)\n}\n\nexport function useSidebar() {\n return inject(SIDEBAR_KEY, null)\n}\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const navLink = tv({\n base: [\n 'hn-interactive hn-state-layer hn-press-none relative isolate flex cursor-pointer items-center',\n 'data-disabled:pointer-events-none data-disabled:opacity-50',\n 'h-9 gap-[var(--hn-control-gap)] rounded-md ps-2.5 pe-2 text-sm select-none',\n '[&_svg]:size-4 [&_svg]:shrink-0',\n ],\n variants: {\n active: {\n true: 'text-fg font-medium',\n false: 'text-muted',\n },\n },\n defaultVariants: { active: false },\n})\n\nexport const navLinkLabel = tv({\n base: 'shrink-0 whitespace-nowrap',\n variants: {\n rail: {\n true: 'opacity-0 [transition:opacity_calc(var(--hn-duration-fast)/2)_var(--hn-ease-exit)]',\n false: 'opacity-100 [transition:opacity_var(--hn-duration-fast)_var(--hn-ease-enter)]',\n },\n },\n defaultVariants: { rail: false },\n})\n\nexport type NavLinkVariants = VariantProps<typeof navLink>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { Primitive, type PrimitiveProps } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { Passthrough } from '../../lib/passthrough'\n import Tooltip from '../tooltip/Tooltip.vue'\n import { useSidebar } from '../sidebar/context'\n import { navLink, navLinkLabel } from './nav-link.variants'\n\n defineOptions({ name: 'HnNavLink', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<\n PrimitiveProps & {\n active?: boolean\n disabled?: boolean\n label?: string\n class?: string\n }\n >(),\n { as: 'a', active: false, disabled: false },\n )\n\n const sidebar = useSidebar()\n const rail = computed(() => sidebar?.state.value === 'rail')\n\n const Wrapper = sidebar ? Tooltip : Passthrough\n</script>\n\n<template>\n <Wrapper :disabled=\"!rail || !props.label\" :content=\"props.label\" side=\"right\">\n <Primitive\n v-bind=\"$attrs\"\n :as=\"props.as\"\n :as-child=\"props.asChild\"\n :aria-current=\"props.active ? 'page' : undefined\"\n :data-state=\"props.active ? 'selected' : undefined\"\n :aria-disabled=\"props.disabled ? 'true' : undefined\"\n :data-disabled=\"props.disabled ? '' : undefined\"\n :tabindex=\"props.disabled ? -1 : undefined\"\n :aria-label=\"rail ? props.label : undefined\"\n :class=\"cn(navLink({ active: props.active }), props.class)\"\n >\n <slot name=\"icon\" />\n <span :aria-hidden=\"rail ? 'true' : undefined\" data-hn-label :class=\"navLinkLabel({ rail })\">\n <slot />\n </span>\n </Primitive>\n </Wrapper>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { Primitive, type PrimitiveProps } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { Passthrough } from '../../lib/passthrough'\n import Tooltip from '../tooltip/Tooltip.vue'\n import { useSidebar } from '../sidebar/context'\n import { navLink, navLinkLabel } from './nav-link.variants'\n\n defineOptions({ name: 'HnNavLink', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<\n PrimitiveProps & {\n active?: boolean\n disabled?: boolean\n label?: string\n class?: string\n }\n >(),\n { as: 'a', active: false, disabled: false },\n )\n\n const sidebar = useSidebar()\n const rail = computed(() => sidebar?.state.value === 'rail')\n\n const Wrapper = sidebar ? Tooltip : Passthrough\n</script>\n\n<template>\n <Wrapper :disabled=\"!rail || !props.label\" :content=\"props.label\" side=\"right\">\n <Primitive\n v-bind=\"$attrs\"\n :as=\"props.as\"\n :as-child=\"props.asChild\"\n :aria-current=\"props.active ? 'page' : undefined\"\n :data-state=\"props.active ? 'selected' : undefined\"\n :aria-disabled=\"props.disabled ? 'true' : undefined\"\n :data-disabled=\"props.disabled ? '' : undefined\"\n :tabindex=\"props.disabled ? -1 : undefined\"\n :aria-label=\"rail ? props.label : undefined\"\n :class=\"cn(navLink({ active: props.active }), props.class)\"\n >\n <slot name=\"icon\" />\n <span :aria-hidden=\"rail ? 'true' : undefined\" data-hn-label :class=\"navLinkLabel({ rail })\">\n <slot />\n </span>\n </Primitive>\n </Wrapper>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { Motion } from 'motion-v'\n import { cn } from '../../lib/cn'\n import { TRANSITION, prefersReducedMotion } from '../../motion'\n import { useUiLocale } from '../../locale'\n import ScrollArea from '../scroll-area/ScrollArea.vue'\n import { useSidebar } from './context'\n\n defineOptions({ name: 'HnSidebar' })\n\n const props = defineProps<{\n label?: string\n class?: string\n }>()\n\n const t = useUiLocale()\n const sidebar = useSidebar()\n const state = computed(() => sidebar?.state.value ?? 'expanded')\n const inDrawer = computed(() => sidebar?.inDrawer ?? false)\n\n const width = computed(() => {\n if (state.value === 'rail') return 56\n if (state.value === 'hidden') return 0\n return 256\n })\n\n const transition = computed(() => (prefersReducedMotion() ? { duration: 0 } : TRANSITION.layout))\n</script>\n\n<template>\n <Motion\n as=\"aside\"\n :initial=\"false\"\n :animate=\"inDrawer ? undefined : { width }\"\n :transition=\"transition\"\n :data-state=\"state\"\n :class=\"\n cn(\n 'flex h-full min-h-0 shrink-0 flex-col overflow-hidden',\n inDrawer\n ? 'w-full'\n : 'border-line border-e [transition:border-color_var(--hn-duration-base)_var(--hn-ease-move)]',\n !inDrawer && state === 'hidden' && 'border-e-transparent',\n props.class,\n )\n \"\n >\n <div v-if=\"$slots.header\" :class=\"cn('shrink-0', !inDrawer && 'px-3 py-3')\">\n <slot name=\"header\" :state=\"state\" />\n </div>\n <ScrollArea class=\"min-h-0 flex-1\">\n <nav\n :aria-label=\"props.label ?? t.sidebar.navLabel\"\n :class=\"cn('flex flex-col gap-1', !inDrawer && 'px-2.5 py-2')\"\n >\n <slot />\n </nav>\n </ScrollArea>\n <div\n v-if=\"$slots.footer\"\n :class=\"cn('border-line shrink-0 border-t', !inDrawer && 'px-3 py-3')\"\n >\n <slot name=\"footer\" :state=\"state\" />\n </div>\n </Motion>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { Motion } from 'motion-v'\n import { cn } from '../../lib/cn'\n import { TRANSITION, prefersReducedMotion } from '../../motion'\n import { useUiLocale } from '../../locale'\n import ScrollArea from '../scroll-area/ScrollArea.vue'\n import { useSidebar } from './context'\n\n defineOptions({ name: 'HnSidebar' })\n\n const props = defineProps<{\n label?: string\n class?: string\n }>()\n\n const t = useUiLocale()\n const sidebar = useSidebar()\n const state = computed(() => sidebar?.state.value ?? 'expanded')\n const inDrawer = computed(() => sidebar?.inDrawer ?? false)\n\n const width = computed(() => {\n if (state.value === 'rail') return 56\n if (state.value === 'hidden') return 0\n return 256\n })\n\n const transition = computed(() => (prefersReducedMotion() ? { duration: 0 } : TRANSITION.layout))\n</script>\n\n<template>\n <Motion\n as=\"aside\"\n :initial=\"false\"\n :animate=\"inDrawer ? undefined : { width }\"\n :transition=\"transition\"\n :data-state=\"state\"\n :class=\"\n cn(\n 'flex h-full min-h-0 shrink-0 flex-col overflow-hidden',\n inDrawer\n ? 'w-full'\n : 'border-line border-e [transition:border-color_var(--hn-duration-base)_var(--hn-ease-move)]',\n !inDrawer && state === 'hidden' && 'border-e-transparent',\n props.class,\n )\n \"\n >\n <div v-if=\"$slots.header\" :class=\"cn('shrink-0', !inDrawer && 'px-3 py-3')\">\n <slot name=\"header\" :state=\"state\" />\n </div>\n <ScrollArea class=\"min-h-0 flex-1\">\n <nav\n :aria-label=\"props.label ?? t.sidebar.navLabel\"\n :class=\"cn('flex flex-col gap-1', !inDrawer && 'px-2.5 py-2')\"\n >\n <slot />\n </nav>\n </ScrollArea>\n <div\n v-if=\"$slots.footer\"\n :class=\"cn('border-line shrink-0 border-t', !inDrawer && 'px-3 py-3')\"\n >\n <slot name=\"footer\" :state=\"state\" />\n </div>\n </Motion>\n</template>\n","<script setup lang=\"ts\">\n import { computed, ref } from 'vue'\n import { cn } from '../../lib/cn'\n import Button from '../button/Button.vue'\n import DisclosureIcon from '../disclosure-icon/DisclosureIcon.vue'\n import Collapsible from '../collapsible/Collapsible.vue'\n import CollapsibleTrigger from '../collapsible/CollapsibleTrigger.vue'\n import CollapsibleContent from '../collapsible/CollapsibleContent.vue'\n import { useSidebar } from './context'\n\n defineOptions({ name: 'HnSidebarGroup' })\n\n const props = withDefaults(\n defineProps<{\n label: string\n defaultOpen?: boolean\n class?: string\n }>(),\n { defaultOpen: true },\n )\n\n const sidebar = useSidebar()\n const rail = computed(() => sidebar?.state.value === 'rail')\n\n const open = ref(props.defaultOpen)\n</script>\n\n<template>\n <Collapsible\n :open=\"rail || open\"\n :class=\"cn(props.class)\"\n @update:open=\"v => (rail ? undefined : (open = v))\"\n >\n <div class=\"hn-collapse\" :class=\"rail ? 'hn-collapse-closed' : 'hn-collapse-open'\">\n <div class=\"hn-collapse-body\">\n <CollapsibleTrigger as-child>\n <Button\n variant=\"ghost\"\n tone=\"neutral\"\n size=\"sm\"\n block\n :tabindex=\"rail ? -1 : undefined\"\n class=\"text-muted justify-between font-medium\"\n >\n {{ props.label }}\n <template #trailing>\n <DisclosureIcon direction=\"end\" />\n </template>\n </Button>\n </CollapsibleTrigger>\n </div>\n </div>\n <div\n aria-hidden=\"true\"\n class=\"hn-collapse\"\n :class=\"rail ? 'hn-collapse-open' : 'hn-collapse-closed'\"\n >\n <div class=\"hn-collapse-body\">\n <div class=\"border-line mx-2 my-1.5 border-t\" />\n </div>\n </div>\n <CollapsibleContent>\n <div class=\"flex flex-col gap-0.5 pt-1\">\n <slot />\n </div>\n </CollapsibleContent>\n </Collapsible>\n</template>\n","<script setup lang=\"ts\">\n import { computed, ref } from 'vue'\n import { cn } from '../../lib/cn'\n import Button from '../button/Button.vue'\n import DisclosureIcon from '../disclosure-icon/DisclosureIcon.vue'\n import Collapsible from '../collapsible/Collapsible.vue'\n import CollapsibleTrigger from '../collapsible/CollapsibleTrigger.vue'\n import CollapsibleContent from '../collapsible/CollapsibleContent.vue'\n import { useSidebar } from './context'\n\n defineOptions({ name: 'HnSidebarGroup' })\n\n const props = withDefaults(\n defineProps<{\n label: string\n defaultOpen?: boolean\n class?: string\n }>(),\n { defaultOpen: true },\n )\n\n const sidebar = useSidebar()\n const rail = computed(() => sidebar?.state.value === 'rail')\n\n const open = ref(props.defaultOpen)\n</script>\n\n<template>\n <Collapsible\n :open=\"rail || open\"\n :class=\"cn(props.class)\"\n @update:open=\"v => (rail ? undefined : (open = v))\"\n >\n <div class=\"hn-collapse\" :class=\"rail ? 'hn-collapse-closed' : 'hn-collapse-open'\">\n <div class=\"hn-collapse-body\">\n <CollapsibleTrigger as-child>\n <Button\n variant=\"ghost\"\n tone=\"neutral\"\n size=\"sm\"\n block\n :tabindex=\"rail ? -1 : undefined\"\n class=\"text-muted justify-between font-medium\"\n >\n {{ props.label }}\n <template #trailing>\n <DisclosureIcon direction=\"end\" />\n </template>\n </Button>\n </CollapsibleTrigger>\n </div>\n </div>\n <div\n aria-hidden=\"true\"\n class=\"hn-collapse\"\n :class=\"rail ? 'hn-collapse-open' : 'hn-collapse-closed'\"\n >\n <div class=\"hn-collapse-body\">\n <div class=\"border-line mx-2 my-1.5 border-t\" />\n </div>\n </div>\n <CollapsibleContent>\n <div class=\"flex flex-col gap-0.5 pt-1\">\n <slot />\n </div>\n </CollapsibleContent>\n </Collapsible>\n</template>\n","<script setup lang=\"ts\">\n import { TooltipProvider as RekaTooltipProvider } from 'reka-ui'\n\n defineOptions({ name: 'HnTooltipProvider' })\n\n const props = withDefaults(\n defineProps<{\n delayDuration?: number\n skipDelayDuration?: number\n }>(),\n { delayDuration: 150, skipDelayDuration: 300 },\n )\n</script>\n\n<template>\n <RekaTooltipProvider\n :delay-duration=\"props.delayDuration\"\n :skip-delay-duration=\"props.skipDelayDuration\"\n >\n <slot />\n </RekaTooltipProvider>\n</template>\n","<script setup lang=\"ts\">\n import { TooltipProvider as RekaTooltipProvider } from 'reka-ui'\n\n defineOptions({ name: 'HnTooltipProvider' })\n\n const props = withDefaults(\n defineProps<{\n delayDuration?: number\n skipDelayDuration?: number\n }>(),\n { delayDuration: 150, skipDelayDuration: 300 },\n )\n</script>\n\n<template>\n <RekaTooltipProvider\n :delay-duration=\"props.delayDuration\"\n :skip-delay-duration=\"props.skipDelayDuration\"\n >\n <slot />\n </RekaTooltipProvider>\n</template>\n","import { tv, type VariantProps } from '../../lib/tv'\n\nexport const drawerCard = tv({\n base: '',\n variants: {\n side: {\n start: 'start-0',\n end: 'end-0',\n },\n size: {\n sm: 'w-72',\n md: 'w-90',\n lg: 'w-120',\n },\n },\n defaultVariants: { side: 'end', size: 'md' },\n})\n\nexport type DrawerVariants = VariantProps<typeof drawerCard>\n","<script setup lang=\"ts\">\n import {\n DialogRoot,\n DialogTrigger,\n DialogPortal,\n DialogOverlay,\n DialogContent,\n DialogTitle,\n DialogDescription,\n DialogClose,\n } from 'reka-ui'\n import CloseButton from '../close-button/CloseButton.vue'\n import Card from '../card/Card.vue'\n import ScrollArea from '../scroll-area/ScrollArea.vue'\n import Heading from '../heading/Heading.vue'\n import Text from '../text/Text.vue'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import { drawerCard } from './drawer.variants'\n\n defineOptions({ name: 'HnDrawer' })\n\n const props = withDefaults(\n defineProps<{\n title: string\n description?: string\n side?: 'start' | 'end'\n size?: 'sm' | 'md' | 'lg'\n locked?: boolean\n class?: string\n }>(),\n { side: 'end', size: 'md', locked: false },\n )\n\n function guard(e: Event) {\n if (props.locked) e.preventDefault()\n }\n\n const open = defineModel<boolean>('open')\n const t = useUiLocale()\n\n function close() {\n open.value = false\n }\n</script>\n\n<template>\n <DialogRoot v-model:open=\"open\">\n <DialogTrigger v-if=\"$slots.default\" as-child>\n <slot />\n </DialogTrigger>\n <DialogPortal>\n <DialogOverlay class=\"hn-scrim\" />\n <DialogContent as-child @escape-key-down=\"guard\" @interact-outside=\"guard\">\n <Card\n :data-hn-side=\"props.side\"\n :padded=\"false\"\n :class=\"\n cn(\n 'hn-anim-drawer pointer-events-auto fixed inset-y-0 z-(--hn-z-overlay) flex flex-col gap-4',\n 'max-w-[calc(100vw-3rem)] rounded-none py-(--hn-panel-p) shadow-lg outline-none',\n drawerCard({ side: props.side, size: props.size }),\n props.class,\n )\n \"\n >\n <div class=\"flex shrink-0 items-start justify-between gap-4 px-(--hn-panel-p)\">\n <div class=\"flex min-w-0 flex-col gap-1.5\">\n <DialogTitle as-child>\n <Heading :level=\"2\" size=\"lg\">{{ props.title }}</Heading>\n </DialogTitle>\n <DialogDescription v-if=\"props.description\" as-child>\n <Text tone=\"muted\">{{ props.description }}</Text>\n </DialogDescription>\n </div>\n <DialogClose as-child>\n <CloseButton :disabled=\"props.locked\" class=\"-mt-1.5 -me-1.5 shrink-0\" />\n </DialogClose>\n </div>\n <ScrollArea v-if=\"$slots.content\" class=\"min-h-0 grow\">\n <div class=\"px-(--hn-panel-p) py-1\">\n <slot name=\"content\" :close=\"close\" />\n </div>\n </ScrollArea>\n <div\n v-if=\"$slots.footer\"\n class=\"flex shrink-0 justify-end gap-(--hn-inline-gap) px-(--hn-panel-p)\"\n >\n <slot name=\"footer\" :close=\"close\" />\n </div>\n </Card>\n </DialogContent>\n </DialogPortal>\n </DialogRoot>\n</template>\n","<script setup lang=\"ts\">\n import {\n DialogRoot,\n DialogTrigger,\n DialogPortal,\n DialogOverlay,\n DialogContent,\n DialogTitle,\n DialogDescription,\n DialogClose,\n } from 'reka-ui'\n import CloseButton from '../close-button/CloseButton.vue'\n import Card from '../card/Card.vue'\n import ScrollArea from '../scroll-area/ScrollArea.vue'\n import Heading from '../heading/Heading.vue'\n import Text from '../text/Text.vue'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import { drawerCard } from './drawer.variants'\n\n defineOptions({ name: 'HnDrawer' })\n\n const props = withDefaults(\n defineProps<{\n title: string\n description?: string\n side?: 'start' | 'end'\n size?: 'sm' | 'md' | 'lg'\n locked?: boolean\n class?: string\n }>(),\n { side: 'end', size: 'md', locked: false },\n )\n\n function guard(e: Event) {\n if (props.locked) e.preventDefault()\n }\n\n const open = defineModel<boolean>('open')\n const t = useUiLocale()\n\n function close() {\n open.value = false\n }\n</script>\n\n<template>\n <DialogRoot v-model:open=\"open\">\n <DialogTrigger v-if=\"$slots.default\" as-child>\n <slot />\n </DialogTrigger>\n <DialogPortal>\n <DialogOverlay class=\"hn-scrim\" />\n <DialogContent as-child @escape-key-down=\"guard\" @interact-outside=\"guard\">\n <Card\n :data-hn-side=\"props.side\"\n :padded=\"false\"\n :class=\"\n cn(\n 'hn-anim-drawer pointer-events-auto fixed inset-y-0 z-(--hn-z-overlay) flex flex-col gap-4',\n 'max-w-[calc(100vw-3rem)] rounded-none py-(--hn-panel-p) shadow-lg outline-none',\n drawerCard({ side: props.side, size: props.size }),\n props.class,\n )\n \"\n >\n <div class=\"flex shrink-0 items-start justify-between gap-4 px-(--hn-panel-p)\">\n <div class=\"flex min-w-0 flex-col gap-1.5\">\n <DialogTitle as-child>\n <Heading :level=\"2\" size=\"lg\">{{ props.title }}</Heading>\n </DialogTitle>\n <DialogDescription v-if=\"props.description\" as-child>\n <Text tone=\"muted\">{{ props.description }}</Text>\n </DialogDescription>\n </div>\n <DialogClose as-child>\n <CloseButton :disabled=\"props.locked\" class=\"-mt-1.5 -me-1.5 shrink-0\" />\n </DialogClose>\n </div>\n <ScrollArea v-if=\"$slots.content\" class=\"min-h-0 grow\">\n <div class=\"px-(--hn-panel-p) py-1\">\n <slot name=\"content\" :close=\"close\" />\n </div>\n </ScrollArea>\n <div\n v-if=\"$slots.footer\"\n class=\"flex shrink-0 justify-end gap-(--hn-inline-gap) px-(--hn-panel-p)\"\n >\n <slot name=\"footer\" :close=\"close\" />\n </div>\n </Card>\n </DialogContent>\n </DialogPortal>\n </DialogRoot>\n</template>\n","import { defineComponent, h, ref } from 'vue'\nimport { provideSidebar, type SidebarState } from './context'\n\nexport default defineComponent({\n name: 'HnSidebarDrawerScope',\n setup(_, { slots }) {\n provideSidebar({\n state: ref<SidebarState>('expanded'),\n toggle: () => {},\n openMobile: () => {},\n inDrawer: true,\n })\n return () => h('div', { class: 'contents' }, slots.default?.())\n },\n})\n","import { onBeforeUnmount, onMounted, ref } from 'vue'\n\nexport function useDesktopQuery(query = '(min-width: 64rem)') {\n const isDesktop = ref(true)\n let media: MediaQueryList | undefined\n\n function onChange() {\n isDesktop.value = media?.matches ?? true\n }\n\n onMounted(() => {\n media = window.matchMedia(query)\n media.addEventListener('change', onChange)\n onChange()\n })\n\n onBeforeUnmount(() => media?.removeEventListener('change', onChange))\n\n return isDesktop\n}\n","<script setup lang=\"ts\">\n import { computed, getCurrentInstance, shallowRef, watch } from 'vue'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import ScrollArea from '../scroll-area/ScrollArea.vue'\n import TooltipProvider from '../tooltip/TooltipProvider.vue'\n import Drawer from '../drawer/Drawer.vue'\n import DrawerScope from '../sidebar/DrawerScope'\n import { provideSidebar, type SidebarState } from '../sidebar/context'\n import { useDesktopQuery } from './composables/useDesktopQuery'\n\n defineOptions({ name: 'HnAppShell' })\n\n const props = withDefaults(\n defineProps<{\n collapsible?: 'rail' | 'hidden'\n restoreKey?: string\n autoClose?: boolean\n class?: string\n }>(),\n { collapsible: 'rail', autoClose: true },\n )\n\n const t = useUiLocale()\n\n const sidebar = defineModel<SidebarState>('sidebar', { default: 'expanded' })\n const mobileOpen = defineModel<boolean>('mobileOpen', { default: false })\n const main = shallowRef<InstanceType<typeof ScrollArea>>()\n\n defineExpose({\n mainViewport: computed(() => main.value?.viewport),\n mainArea: main,\n })\n\n const isDesktop = useDesktopQuery()\n\n function toggle() {\n if (!isDesktop.value) {\n mobileOpen.value = !mobileOpen.value\n return\n }\n sidebar.value = sidebar.value === 'expanded' ? props.collapsible : 'expanded'\n }\n\n provideSidebar({\n state: computed(() => sidebar.value),\n toggle,\n openMobile: () => (mobileOpen.value = true),\n })\n\n type Navigable = { currentRoute?: { value?: { fullPath?: string } } }\n const router = getCurrentInstance()?.appContext.config.globalProperties.$router as\n Navigable | undefined\n\n watch(\n () => router?.currentRoute?.value?.fullPath,\n () => {\n if (props.autoClose) mobileOpen.value = false\n },\n )\n</script>\n\n<template>\n <TooltipProvider>\n <div :class=\"cn('bg-canvas text-fg flex h-screen flex-col overflow-hidden', props.class)\">\n <div v-if=\"$slots.banner\" class=\"shrink-0\">\n <slot name=\"banner\" />\n </div>\n <div class=\"flex min-h-0 flex-1\">\n <div v-if=\"$slots.sidebar\" class=\"hidden h-full shrink-0 lg:block\">\n <slot name=\"sidebar\" />\n </div>\n <div class=\"flex min-h-0 min-w-0 flex-1 flex-col\">\n <header v-if=\"$slots.header\" class=\"border-line bg-canvas shrink-0 border-b\">\n <div class=\"flex h-14 items-center gap-3 px-4 sm:px-6\">\n <slot name=\"header\" />\n </div>\n </header>\n <main class=\"min-h-0 min-w-0 flex-1\">\n <ScrollArea ref=\"main\" :data-scroll-restore=\"props.restoreKey\" class=\"h-full\">\n <slot />\n </ScrollArea>\n </main>\n </div>\n </div>\n <Drawer\n v-if=\"$slots.sidebar\"\n v-model:open=\"mobileOpen\"\n :title=\"t.sidebar.navLabel\"\n side=\"start\"\n size=\"sm\"\n class=\"lg:hidden\"\n >\n <template #content>\n <DrawerScope>\n <slot name=\"sidebar\" />\n </DrawerScope>\n </template>\n </Drawer>\n </div>\n </TooltipProvider>\n</template>\n","<script setup lang=\"ts\">\n import { computed, getCurrentInstance, shallowRef, watch } from 'vue'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import ScrollArea from '../scroll-area/ScrollArea.vue'\n import TooltipProvider from '../tooltip/TooltipProvider.vue'\n import Drawer from '../drawer/Drawer.vue'\n import DrawerScope from '../sidebar/DrawerScope'\n import { provideSidebar, type SidebarState } from '../sidebar/context'\n import { useDesktopQuery } from './composables/useDesktopQuery'\n\n defineOptions({ name: 'HnAppShell' })\n\n const props = withDefaults(\n defineProps<{\n collapsible?: 'rail' | 'hidden'\n restoreKey?: string\n autoClose?: boolean\n class?: string\n }>(),\n { collapsible: 'rail', autoClose: true },\n )\n\n const t = useUiLocale()\n\n const sidebar = defineModel<SidebarState>('sidebar', { default: 'expanded' })\n const mobileOpen = defineModel<boolean>('mobileOpen', { default: false })\n const main = shallowRef<InstanceType<typeof ScrollArea>>()\n\n defineExpose({\n mainViewport: computed(() => main.value?.viewport),\n mainArea: main,\n })\n\n const isDesktop = useDesktopQuery()\n\n function toggle() {\n if (!isDesktop.value) {\n mobileOpen.value = !mobileOpen.value\n return\n }\n sidebar.value = sidebar.value === 'expanded' ? props.collapsible : 'expanded'\n }\n\n provideSidebar({\n state: computed(() => sidebar.value),\n toggle,\n openMobile: () => (mobileOpen.value = true),\n })\n\n type Navigable = { currentRoute?: { value?: { fullPath?: string } } }\n const router = getCurrentInstance()?.appContext.config.globalProperties.$router as\n Navigable | undefined\n\n watch(\n () => router?.currentRoute?.value?.fullPath,\n () => {\n if (props.autoClose) mobileOpen.value = false\n },\n )\n</script>\n\n<template>\n <TooltipProvider>\n <div :class=\"cn('bg-canvas text-fg flex h-screen flex-col overflow-hidden', props.class)\">\n <div v-if=\"$slots.banner\" class=\"shrink-0\">\n <slot name=\"banner\" />\n </div>\n <div class=\"flex min-h-0 flex-1\">\n <div v-if=\"$slots.sidebar\" class=\"hidden h-full shrink-0 lg:block\">\n <slot name=\"sidebar\" />\n </div>\n <div class=\"flex min-h-0 min-w-0 flex-1 flex-col\">\n <header v-if=\"$slots.header\" class=\"border-line bg-canvas shrink-0 border-b\">\n <div class=\"flex h-14 items-center gap-3 px-4 sm:px-6\">\n <slot name=\"header\" />\n </div>\n </header>\n <main class=\"min-h-0 min-w-0 flex-1\">\n <ScrollArea ref=\"main\" :data-scroll-restore=\"props.restoreKey\" class=\"h-full\">\n <slot />\n </ScrollArea>\n </main>\n </div>\n </div>\n <Drawer\n v-if=\"$slots.sidebar\"\n v-model:open=\"mobileOpen\"\n :title=\"t.sidebar.navLabel\"\n side=\"start\"\n size=\"sm\"\n class=\"lg:hidden\"\n >\n <template #content>\n <DrawerScope>\n <slot name=\"sidebar\" />\n </DrawerScope>\n </template>\n </Drawer>\n </div>\n </TooltipProvider>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import Container from '../container/Container.vue'\n import type { ContainerVariants } from '../container/container.variants'\n\n defineOptions({ name: 'HnPage' })\n\n const props = defineProps<{\n size?: ContainerVariants['size']\n class?: string\n }>()\n</script>\n\n<template>\n <Container :size=\"props.size\" :class=\"cn('py-8', props.class)\">\n <div class=\"flex gap-10\">\n <div class=\"flex min-w-0 flex-1 flex-col gap-8\">\n <slot />\n </div>\n <slot name=\"aside\" />\n </div>\n </Container>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import Container from '../container/Container.vue'\n import type { ContainerVariants } from '../container/container.variants'\n\n defineOptions({ name: 'HnPage' })\n\n const props = defineProps<{\n size?: ContainerVariants['size']\n class?: string\n }>()\n</script>\n\n<template>\n <Container :size=\"props.size\" :class=\"cn('py-8', props.class)\">\n <div class=\"flex gap-10\">\n <div class=\"flex min-w-0 flex-1 flex-col gap-8\">\n <slot />\n </div>\n <slot name=\"aside\" />\n </div>\n </Container>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import Heading from '../heading/Heading.vue'\n import Text from '../text/Text.vue'\n\n defineOptions({ name: 'HnPageHeader' })\n\n const props = defineProps<{\n eyebrow?: string\n title?: string\n description?: string\n class?: string\n }>()\n</script>\n\n<template>\n <header :class=\"cn('flex flex-col gap-2', props.class)\">\n <div class=\"flex flex-col items-start gap-3 md:flex-row\">\n <div class=\"flex min-w-0 flex-1 flex-col gap-2\">\n <Text v-if=\"props.eyebrow\" as=\"span\" size=\"sm\" weight=\"medium\" tone=\"accent\">\n {{ props.eyebrow }}\n </Text>\n <Heading v-if=\"props.title\" :level=\"1\">{{ props.title }}</Heading>\n <Text v-if=\"props.description\" tone=\"muted\">{{ props.description }}</Text>\n </div>\n <div\n v-if=\"$slots.actions\"\n class=\"flex w-full flex-wrap items-center gap-2 md:w-auto md:shrink-0\"\n >\n <slot name=\"actions\" />\n </div>\n </div>\n <slot />\n </header>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import Heading from '../heading/Heading.vue'\n import Text from '../text/Text.vue'\n\n defineOptions({ name: 'HnPageHeader' })\n\n const props = defineProps<{\n eyebrow?: string\n title?: string\n description?: string\n class?: string\n }>()\n</script>\n\n<template>\n <header :class=\"cn('flex flex-col gap-2', props.class)\">\n <div class=\"flex flex-col items-start gap-3 md:flex-row\">\n <div class=\"flex min-w-0 flex-1 flex-col gap-2\">\n <Text v-if=\"props.eyebrow\" as=\"span\" size=\"sm\" weight=\"medium\" tone=\"accent\">\n {{ props.eyebrow }}\n </Text>\n <Heading v-if=\"props.title\" :level=\"1\">{{ props.title }}</Heading>\n <Text v-if=\"props.description\" tone=\"muted\">{{ props.description }}</Text>\n </div>\n <div\n v-if=\"$slots.actions\"\n class=\"flex w-full flex-wrap items-center gap-2 md:w-auto md:shrink-0\"\n >\n <slot name=\"actions\" />\n </div>\n </div>\n <slot />\n </header>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnPageBody' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <div :class=\"cn('flex min-w-0 flex-col gap-6', props.class)\">\n <slot />\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnPageBody' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <div :class=\"cn('flex min-w-0 flex-col gap-6', props.class)\">\n <slot />\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { useId } from 'vue'\n import { cn } from '../../lib/cn'\n import Text from '../text/Text.vue'\n\n defineOptions({ name: 'HnPageAside' })\n\n const props = defineProps<{\n label?: string\n class?: string\n }>()\n\n const titleId = useId()\n</script>\n\n<template>\n <aside\n :aria-labelledby=\"props.label ? titleId : undefined\"\n :class=\"cn('hidden w-56 shrink-0 xl:block', props.class)\"\n >\n <div class=\"sticky top-8 flex flex-col gap-3\">\n <Text v-if=\"props.label\" :id=\"titleId\" as=\"h2\" size=\"sm\" tone=\"muted\" weight=\"medium\">\n {{ props.label }}\n </Text>\n <slot />\n </div>\n </aside>\n</template>\n","<script setup lang=\"ts\">\n import { useId } from 'vue'\n import { cn } from '../../lib/cn'\n import Text from '../text/Text.vue'\n\n defineOptions({ name: 'HnPageAside' })\n\n const props = defineProps<{\n label?: string\n class?: string\n }>()\n\n const titleId = useId()\n</script>\n\n<template>\n <aside\n :aria-labelledby=\"props.label ? titleId : undefined\"\n :class=\"cn('hidden w-56 shrink-0 xl:block', props.class)\"\n >\n <div class=\"sticky top-8 flex flex-col gap-3\">\n <Text v-if=\"props.label\" :id=\"titleId\" as=\"h2\" size=\"sm\" tone=\"muted\" weight=\"medium\">\n {{ props.label }}\n </Text>\n <slot />\n </div>\n </aside>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import Heading from '../heading/Heading.vue'\n\n defineOptions({ name: 'HnSection' })\n\n const props = defineProps<{\n title?: string\n id?: string\n class?: string\n }>()\n</script>\n\n<template>\n <section :id=\"props.id\" :class=\"cn('flex scroll-mt-6 flex-col gap-4', props.class)\">\n <Heading v-if=\"props.title\" :level=\"2\">{{ props.title }}</Heading>\n <slot />\n </section>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import Heading from '../heading/Heading.vue'\n\n defineOptions({ name: 'HnSection' })\n\n const props = defineProps<{\n title?: string\n id?: string\n class?: string\n }>()\n</script>\n\n<template>\n <section :id=\"props.id\" :class=\"cn('flex scroll-mt-6 flex-col gap-4', props.class)\">\n <Heading v-if=\"props.title\" :level=\"2\">{{ props.title }}</Heading>\n <slot />\n </section>\n</template>\n","import { useIntersectionObserver } from '@vueuse/core'\nimport { computed, onMounted, shallowRef, watch } from 'vue'\nimport { prefersReducedMotion } from '../../../motion'\n\nexport interface SpyEntry {\n id: string\n label: string\n depth: number\n}\n\nexport function useScrollSpy(entries: () => SpyEntry[]) {\n const visible = shallowRef<ReadonlySet<string>>(new Set())\n const targets = shallowRef<Array<HTMLElement | null>>([])\n const seen = new Set<string>()\n\n const covered = computed(() => entries().filter(entry => visible.value.has(entry.id)))\n const current = computed(() => covered.value[0]?.id)\n const span = computed(() => {\n const rows = entries().flatMap((entry, index) => (visible.value.has(entry.id) ? [index] : []))\n return rows.length ? `${rows[0]! + 1} / ${rows.at(-1)! + 2}` : undefined\n })\n\n useIntersectionObserver(\n targets,\n observed => {\n const next = new Set(visible.value)\n for (const entry of observed) {\n if (entry.isIntersecting) {\n seen.add(entry.target.id)\n next.add(entry.target.id)\n } else if (seen.has(entry.target.id)) {\n next.delete(entry.target.id)\n }\n }\n if (next.size) visible.value = next\n },\n { rootMargin: '0px 0px -15% 0px' },\n )\n\n function targetOf(id: string) {\n return document.getElementById(id)\n }\n\n function locate() {\n seen.clear()\n targets.value = entries().map(({ id }) => targetOf(id))\n }\n\n onMounted(() => {\n const hash = decodeURIComponent(location.hash.slice(1))\n if (hash && entries().some(entry => entry.id === hash)) visible.value = new Set([hash])\n locate()\n watch(entries, () => {\n visible.value = new Set()\n locate()\n })\n })\n\n function jump(event: MouseEvent, id: string) {\n const el = targetOf(id)\n if (!el) return\n event.preventDefault()\n el.scrollIntoView({ behavior: prefersReducedMotion() ? 'auto' : 'smooth', block: 'start' })\n history.replaceState(history.state, '', `#${id}`)\n visible.value = new Set([id])\n }\n\n return { visible, covered, current, span, jump }\n}\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import Highlight from '../highlight/Highlight.vue'\n import { useScrollSpy } from './composables/useScrollSpy'\n\n export interface AnchorItem {\n id: string\n label: string\n children?: AnchorItem[]\n }\n\n defineOptions({ name: 'HnAnchor' })\n\n const props = defineProps<{\n items: AnchorItem[]\n label?: string\n class?: string\n }>()\n\n const t = useUiLocale()\n\n const entries = computed(() =>\n props.items.flatMap(item => [\n { id: item.id, label: item.label, depth: 0 },\n ...(item.children ?? []).map(child => ({ id: child.id, label: child.label, depth: 1 })),\n ]),\n )\n\n const { visible, current, span, jump } = useScrollSpy(() => entries.value)\n</script>\n\n<template>\n <nav :aria-label=\"props.label ?? t.anchor.navLabel\" :class=\"cn(props.class)\">\n <ul class=\"border-line relative grid grid-cols-1 border-s\">\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"opacity-0\"\n >\n <Highlight\n v-if=\"span\"\n as=\"li\"\n role=\"presentation\"\n :style=\"{ gridRow: span }\"\n class=\"bg-accent col-start-1 -ms-px w-0.5 self-stretch justify-self-start rounded-full\"\n />\n </Transition>\n <li\n v-for=\"(entry, index) in entries\"\n :key=\"entry.id\"\n class=\"col-start-1\"\n :style=\"{ gridRow: index + 1 }\"\n >\n <a\n :href=\"`#${entry.id}`\"\n :aria-current=\"current === entry.id ? 'location' : undefined\"\n :class=\"\n cn(\n 'hn-link block py-1 text-sm',\n entry.depth === 0 ? 'ps-3' : 'ps-6',\n visible.has(entry.id)\n ? 'font-medium [--hn-link-color:var(--hn-fg-default)]'\n : '[--hn-link-color:var(--hn-fg-muted)]',\n )\n \"\n @click=\"jump($event, entry.id)\"\n >\n {{ entry.label }}\n </a>\n </li>\n </ul>\n </nav>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import Highlight from '../highlight/Highlight.vue'\n import { useScrollSpy } from './composables/useScrollSpy'\n\n export interface AnchorItem {\n id: string\n label: string\n children?: AnchorItem[]\n }\n\n defineOptions({ name: 'HnAnchor' })\n\n const props = defineProps<{\n items: AnchorItem[]\n label?: string\n class?: string\n }>()\n\n const t = useUiLocale()\n\n const entries = computed(() =>\n props.items.flatMap(item => [\n { id: item.id, label: item.label, depth: 0 },\n ...(item.children ?? []).map(child => ({ id: child.id, label: child.label, depth: 1 })),\n ]),\n )\n\n const { visible, current, span, jump } = useScrollSpy(() => entries.value)\n</script>\n\n<template>\n <nav :aria-label=\"props.label ?? t.anchor.navLabel\" :class=\"cn(props.class)\">\n <ul class=\"border-line relative grid grid-cols-1 border-s\">\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"opacity-0\"\n >\n <Highlight\n v-if=\"span\"\n as=\"li\"\n role=\"presentation\"\n :style=\"{ gridRow: span }\"\n class=\"bg-accent col-start-1 -ms-px w-0.5 self-stretch justify-self-start rounded-full\"\n />\n </Transition>\n <li\n v-for=\"(entry, index) in entries\"\n :key=\"entry.id\"\n class=\"col-start-1\"\n :style=\"{ gridRow: index + 1 }\"\n >\n <a\n :href=\"`#${entry.id}`\"\n :aria-current=\"current === entry.id ? 'location' : undefined\"\n :class=\"\n cn(\n 'hn-link block py-1 text-sm',\n entry.depth === 0 ? 'ps-3' : 'ps-6',\n visible.has(entry.id)\n ? 'font-medium [--hn-link-color:var(--hn-fg-default)]'\n : '[--hn-link-color:var(--hn-fg-muted)]',\n )\n \"\n @click=\"jump($event, entry.id)\"\n >\n {{ entry.label }}\n </a>\n </li>\n </ul>\n </nav>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n\n defineOptions({ name: 'HnBreadcrumb' })\n\n const props = defineProps<{\n label?: string\n class?: string\n }>()\n\n const t = useUiLocale()\n</script>\n\n<template>\n <nav :aria-label=\"props.label ?? t.breadcrumb.navLabel\" :class=\"cn(props.class)\">\n <ol class=\"flex flex-wrap items-center gap-1.5 text-sm\">\n <slot />\n </ol>\n </nav>\n</template>\n","<script setup lang=\"ts\">\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n\n defineOptions({ name: 'HnBreadcrumb' })\n\n const props = defineProps<{\n label?: string\n class?: string\n }>()\n\n const t = useUiLocale()\n</script>\n\n<template>\n <nav :aria-label=\"props.label ?? t.breadcrumb.navLabel\" :class=\"cn(props.class)\">\n <ol class=\"flex flex-wrap items-center gap-1.5 text-sm\">\n <slot />\n </ol>\n </nav>\n</template>\n","<script setup lang=\"ts\">\n import { Primitive, type PrimitiveProps } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnBreadcrumbItem', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<\n PrimitiveProps & {\n current?: boolean\n class?: string\n }\n >(),\n { as: 'a', current: false },\n )\n</script>\n\n<template>\n <li class=\"flex items-center\">\n <span\n v-if=\"props.current\"\n v-bind=\"$attrs\"\n aria-current=\"page\"\n :class=\"cn('text-fg font-medium', props.class)\"\n >\n <slot />\n </span>\n <Primitive\n v-else\n v-bind=\"$attrs\"\n :as=\"props.as\"\n :as-child=\"props.asChild\"\n :class=\"cn('hn-link [--hn-link-color:var(--hn-fg-muted)]', props.class)\"\n >\n <slot />\n </Primitive>\n </li>\n</template>\n","<script setup lang=\"ts\">\n import { Primitive, type PrimitiveProps } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnBreadcrumbItem', inheritAttrs: false })\n\n const props = withDefaults(\n defineProps<\n PrimitiveProps & {\n current?: boolean\n class?: string\n }\n >(),\n { as: 'a', current: false },\n )\n</script>\n\n<template>\n <li class=\"flex items-center\">\n <span\n v-if=\"props.current\"\n v-bind=\"$attrs\"\n aria-current=\"page\"\n :class=\"cn('text-fg font-medium', props.class)\"\n >\n <slot />\n </span>\n <Primitive\n v-else\n v-bind=\"$attrs\"\n :as=\"props.as\"\n :as-child=\"props.asChild\"\n :class=\"cn('hn-link [--hn-link-color:var(--hn-fg-muted)]', props.class)\"\n >\n <slot />\n </Primitive>\n </li>\n</template>\n","<script setup lang=\"ts\">\n import { ChevronRight } from '@lucide/vue'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnBreadcrumbSeparator' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <li aria-hidden=\"true\" :class=\"cn('text-faint flex items-center', props.class)\">\n <slot>\n <ChevronRight class=\"size-3.5\" />\n </slot>\n </li>\n</template>\n","<script setup lang=\"ts\">\n import { ChevronRight } from '@lucide/vue'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnBreadcrumbSeparator' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <li aria-hidden=\"true\" :class=\"cn('text-faint flex items-center', props.class)\">\n <slot>\n <ChevronRight class=\"size-3.5\" />\n </slot>\n </li>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { PopoverRoot, PopoverTrigger, PopoverPortal, PopoverContent } from 'reka-ui'\n import Card from '../card/Card.vue'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnPopover' })\n\n const props = withDefaults(\n defineProps<{\n side?: 'top' | 'right' | 'bottom' | 'left'\n align?: 'start' | 'center' | 'end'\n sideOffset?: number\n padded?: boolean\n class?: string\n }>(),\n { side: 'bottom', align: 'center', sideOffset: 8, padded: true },\n )\n\n const open = defineModel<boolean>('open')\n\n const pressOrigin = computed(() => {\n if (props.side === 'left') return 'right'\n if (props.side === 'right') return 'left'\n if (props.align === 'start') return 'left'\n if (props.align === 'end') return 'right'\n return 'center'\n })\n</script>\n\n<template>\n <PopoverRoot v-model:open=\"open\" modal>\n <PopoverTrigger as-child :style=\"{ transformOrigin: pressOrigin }\">\n <slot />\n </PopoverTrigger>\n <PopoverPortal>\n <PopoverContent\n as-child\n :side=\"props.side\"\n :align=\"props.align\"\n :side-offset=\"props.sideOffset\"\n >\n <Card\n :padded=\"props.padded\"\n :class=\"cn('hn-anim-pop z-(--hn-z-overlay) max-w-sm shadow-md outline-none', props.class)\"\n >\n <slot name=\"content\" />\n </Card>\n </PopoverContent>\n </PopoverPortal>\n </PopoverRoot>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { PopoverRoot, PopoverTrigger, PopoverPortal, PopoverContent } from 'reka-ui'\n import Card from '../card/Card.vue'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnPopover' })\n\n const props = withDefaults(\n defineProps<{\n side?: 'top' | 'right' | 'bottom' | 'left'\n align?: 'start' | 'center' | 'end'\n sideOffset?: number\n padded?: boolean\n class?: string\n }>(),\n { side: 'bottom', align: 'center', sideOffset: 8, padded: true },\n )\n\n const open = defineModel<boolean>('open')\n\n const pressOrigin = computed(() => {\n if (props.side === 'left') return 'right'\n if (props.side === 'right') return 'left'\n if (props.align === 'start') return 'left'\n if (props.align === 'end') return 'right'\n return 'center'\n })\n</script>\n\n<template>\n <PopoverRoot v-model:open=\"open\" modal>\n <PopoverTrigger as-child :style=\"{ transformOrigin: pressOrigin }\">\n <slot />\n </PopoverTrigger>\n <PopoverPortal>\n <PopoverContent\n as-child\n :side=\"props.side\"\n :align=\"props.align\"\n :side-offset=\"props.sideOffset\"\n >\n <Card\n :padded=\"props.padded\"\n :class=\"cn('hn-anim-pop z-(--hn-z-overlay) max-w-sm shadow-md outline-none', props.class)\"\n >\n <slot name=\"content\" />\n </Card>\n </PopoverContent>\n </PopoverPortal>\n </PopoverRoot>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import {\n DropdownMenuRoot,\n DropdownMenuTrigger,\n DropdownMenuPortal,\n DropdownMenuContent,\n } from 'reka-ui'\n import Card from '../card/Card.vue'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnDropdownMenu' })\n\n const props = withDefaults(\n defineProps<{\n label?: string\n side?: 'top' | 'right' | 'bottom' | 'left'\n align?: 'start' | 'center' | 'end'\n sideOffset?: number\n class?: string\n }>(),\n { side: 'bottom', align: 'center', sideOffset: 8 },\n )\n\n const open = defineModel<boolean>('open')\n\n const pressOrigin = computed(() => {\n if (props.side === 'left') return 'right'\n if (props.side === 'right') return 'left'\n if (props.align === 'start') return 'left'\n if (props.align === 'end') return 'right'\n return 'center'\n })\n</script>\n\n<template>\n <DropdownMenuRoot v-model:open=\"open\" modal>\n <DropdownMenuTrigger\n as-child\n class=\"group/hn-disclosure\"\n :style=\"{ transformOrigin: pressOrigin }\"\n >\n <slot />\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent\n as-child\n :aria-label=\"props.label\"\n :side=\"props.side\"\n :align=\"props.align\"\n :side-offset=\"props.sideOffset\"\n >\n <Card\n :padded=\"false\"\n :class=\"\n cn(\n 'hn-anim-pop z-(--hn-z-overlay) flex min-w-40 flex-col gap-0.5 p-1 shadow-md outline-none',\n props.class,\n )\n \"\n >\n <slot name=\"content\" />\n </Card>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import {\n DropdownMenuRoot,\n DropdownMenuTrigger,\n DropdownMenuPortal,\n DropdownMenuContent,\n } from 'reka-ui'\n import Card from '../card/Card.vue'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnDropdownMenu' })\n\n const props = withDefaults(\n defineProps<{\n label?: string\n side?: 'top' | 'right' | 'bottom' | 'left'\n align?: 'start' | 'center' | 'end'\n sideOffset?: number\n class?: string\n }>(),\n { side: 'bottom', align: 'center', sideOffset: 8 },\n )\n\n const open = defineModel<boolean>('open')\n\n const pressOrigin = computed(() => {\n if (props.side === 'left') return 'right'\n if (props.side === 'right') return 'left'\n if (props.align === 'start') return 'left'\n if (props.align === 'end') return 'right'\n return 'center'\n })\n</script>\n\n<template>\n <DropdownMenuRoot v-model:open=\"open\" modal>\n <DropdownMenuTrigger\n as-child\n class=\"group/hn-disclosure\"\n :style=\"{ transformOrigin: pressOrigin }\"\n >\n <slot />\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent\n as-child\n :aria-label=\"props.label\"\n :side=\"props.side\"\n :align=\"props.align\"\n :side-offset=\"props.sideOffset\"\n >\n <Card\n :padded=\"false\"\n :class=\"\n cn(\n 'hn-anim-pop z-(--hn-z-overlay) flex min-w-40 flex-col gap-0.5 p-1 shadow-md outline-none',\n props.class,\n )\n \"\n >\n <slot name=\"content\" />\n </Card>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n</template>\n","<script setup lang=\"ts\">\n import { DropdownMenuItem } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { dropdownItem, type DropdownItemVariants } from './dropdown-menu.variants'\n\n defineOptions({ name: 'HnDropdownMenuItem', inheritAttrs: false })\n\n const props = defineProps<{\n tone?: DropdownItemVariants['tone']\n disabled?: boolean\n textValue?: string\n class?: string\n }>()\n\n const emit = defineEmits<{ select: [event: Event] }>()\n</script>\n\n<template>\n <DropdownMenuItem\n v-bind=\"$attrs\"\n :disabled=\"props.disabled\"\n :text-value=\"props.textValue\"\n :class=\"cn(dropdownItem({ tone: props.tone }), props.class)\"\n @select=\"emit('select', $event)\"\n >\n <slot name=\"icon\" />\n <span class=\"min-w-0 flex-1\"><slot /></span>\n <slot name=\"trailing\" />\n </DropdownMenuItem>\n</template>\n","<script setup lang=\"ts\">\n import { DropdownMenuItem } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { dropdownItem, type DropdownItemVariants } from './dropdown-menu.variants'\n\n defineOptions({ name: 'HnDropdownMenuItem', inheritAttrs: false })\n\n const props = defineProps<{\n tone?: DropdownItemVariants['tone']\n disabled?: boolean\n textValue?: string\n class?: string\n }>()\n\n const emit = defineEmits<{ select: [event: Event] }>()\n</script>\n\n<template>\n <DropdownMenuItem\n v-bind=\"$attrs\"\n :disabled=\"props.disabled\"\n :text-value=\"props.textValue\"\n :class=\"cn(dropdownItem({ tone: props.tone }), props.class)\"\n @select=\"emit('select', $event)\"\n >\n <slot name=\"icon\" />\n <span class=\"min-w-0 flex-1\"><slot /></span>\n <slot name=\"trailing\" />\n </DropdownMenuItem>\n</template>\n","<script setup lang=\"ts\">\n import { Check } from '@lucide/vue'\n import { DropdownMenuCheckboxItem, DropdownMenuItemIndicator } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { dropdownItem } from './dropdown-menu.variants'\n\n defineOptions({ name: 'HnDropdownMenuCheckboxItem', inheritAttrs: false })\n\n const props = defineProps<{\n disabled?: boolean\n textValue?: string\n class?: string\n }>()\n\n const checked = defineModel<boolean>('checked', { default: false })\n</script>\n\n<template>\n <DropdownMenuCheckboxItem\n v-bind=\"$attrs\"\n v-model=\"checked\"\n :disabled=\"props.disabled\"\n :text-value=\"props.textValue\"\n :class=\"cn(dropdownItem(), props.class)\"\n @select=\"(event: Event) => event.preventDefault()\"\n >\n <span class=\"min-w-0 flex-1\"><slot /></span>\n <slot name=\"trailing\" />\n <span class=\"flex size-4 shrink-0 items-center justify-center\">\n <DropdownMenuItemIndicator>\n <Check />\n </DropdownMenuItemIndicator>\n </span>\n </DropdownMenuCheckboxItem>\n</template>\n","<script setup lang=\"ts\">\n import { Check } from '@lucide/vue'\n import { DropdownMenuCheckboxItem, DropdownMenuItemIndicator } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { dropdownItem } from './dropdown-menu.variants'\n\n defineOptions({ name: 'HnDropdownMenuCheckboxItem', inheritAttrs: false })\n\n const props = defineProps<{\n disabled?: boolean\n textValue?: string\n class?: string\n }>()\n\n const checked = defineModel<boolean>('checked', { default: false })\n</script>\n\n<template>\n <DropdownMenuCheckboxItem\n v-bind=\"$attrs\"\n v-model=\"checked\"\n :disabled=\"props.disabled\"\n :text-value=\"props.textValue\"\n :class=\"cn(dropdownItem(), props.class)\"\n @select=\"(event: Event) => event.preventDefault()\"\n >\n <span class=\"min-w-0 flex-1\"><slot /></span>\n <slot name=\"trailing\" />\n <span class=\"flex size-4 shrink-0 items-center justify-center\">\n <DropdownMenuItemIndicator>\n <Check />\n </DropdownMenuItemIndicator>\n </span>\n </DropdownMenuCheckboxItem>\n</template>\n","<script setup lang=\"ts\">\n import { DropdownMenuGroup } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnDropdownMenuGroup' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <DropdownMenuGroup :class=\"cn('flex flex-col gap-0.5', props.class)\">\n <slot />\n </DropdownMenuGroup>\n</template>\n","<script setup lang=\"ts\">\n import { DropdownMenuGroup } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnDropdownMenuGroup' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <DropdownMenuGroup :class=\"cn('flex flex-col gap-0.5', props.class)\">\n <slot />\n </DropdownMenuGroup>\n</template>\n","<script setup lang=\"ts\">\n import { ChevronRight } from '@lucide/vue'\n import {\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuPortal,\n DropdownMenuSubContent,\n } from 'reka-ui'\n import Card from '../card/Card.vue'\n import { cn } from '../../lib/cn'\n import { dropdownItem } from './dropdown-menu.variants'\n\n defineOptions({ name: 'HnDropdownMenuSub' })\n\n const props = defineProps<{\n label?: string\n disabled?: boolean\n textValue?: string\n class?: string\n }>()\n\n const open = defineModel<boolean>('open')\n</script>\n\n<template>\n <DropdownMenuSub v-model:open=\"open\">\n <DropdownMenuSubTrigger\n :disabled=\"props.disabled\"\n :text-value=\"props.textValue ?? props.label\"\n :class=\"dropdownItem()\"\n >\n <slot name=\"icon\" />\n <span class=\"min-w-0 flex-1\">\n <slot name=\"label\">{{ props.label }}</slot>\n </span>\n <ChevronRight class=\"text-muted\" />\n </DropdownMenuSubTrigger>\n <DropdownMenuPortal>\n <DropdownMenuSubContent as-child :side-offset=\"4\">\n <Card\n :padded=\"false\"\n :class=\"\n cn(\n 'hn-anim-pop z-(--hn-z-overlay) flex min-w-40 flex-col gap-0.5 p-1 shadow-md outline-none',\n props.class,\n )\n \"\n >\n <slot />\n </Card>\n </DropdownMenuSubContent>\n </DropdownMenuPortal>\n </DropdownMenuSub>\n</template>\n","<script setup lang=\"ts\">\n import { ChevronRight } from '@lucide/vue'\n import {\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuPortal,\n DropdownMenuSubContent,\n } from 'reka-ui'\n import Card from '../card/Card.vue'\n import { cn } from '../../lib/cn'\n import { dropdownItem } from './dropdown-menu.variants'\n\n defineOptions({ name: 'HnDropdownMenuSub' })\n\n const props = defineProps<{\n label?: string\n disabled?: boolean\n textValue?: string\n class?: string\n }>()\n\n const open = defineModel<boolean>('open')\n</script>\n\n<template>\n <DropdownMenuSub v-model:open=\"open\">\n <DropdownMenuSubTrigger\n :disabled=\"props.disabled\"\n :text-value=\"props.textValue ?? props.label\"\n :class=\"dropdownItem()\"\n >\n <slot name=\"icon\" />\n <span class=\"min-w-0 flex-1\">\n <slot name=\"label\">{{ props.label }}</slot>\n </span>\n <ChevronRight class=\"text-muted\" />\n </DropdownMenuSubTrigger>\n <DropdownMenuPortal>\n <DropdownMenuSubContent as-child :side-offset=\"4\">\n <Card\n :padded=\"false\"\n :class=\"\n cn(\n 'hn-anim-pop z-(--hn-z-overlay) flex min-w-40 flex-col gap-0.5 p-1 shadow-md outline-none',\n props.class,\n )\n \"\n >\n <slot />\n </Card>\n </DropdownMenuSubContent>\n </DropdownMenuPortal>\n </DropdownMenuSub>\n</template>\n","<script setup lang=\"ts\">\n import { DropdownMenuLabel } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnDropdownMenuLabel' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <DropdownMenuLabel :class=\"cn('text-muted px-2.5 py-1.5 text-xs font-medium', props.class)\">\n <slot />\n </DropdownMenuLabel>\n</template>\n","<script setup lang=\"ts\">\n import { DropdownMenuLabel } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnDropdownMenuLabel' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <DropdownMenuLabel :class=\"cn('text-muted px-2.5 py-1.5 text-xs font-medium', props.class)\">\n <slot />\n </DropdownMenuLabel>\n</template>\n","<script setup lang=\"ts\">\n import { DropdownMenuSeparator } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnDropdownMenuSeparator' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <DropdownMenuSeparator :class=\"cn('bg-line -mx-1 my-1 h-px', props.class)\" />\n</template>\n","<script setup lang=\"ts\">\n import { DropdownMenuSeparator } from 'reka-ui'\n import { cn } from '../../lib/cn'\n\n defineOptions({ name: 'HnDropdownMenuSeparator' })\n\n const props = defineProps<{ class?: string }>()\n</script>\n\n<template>\n <DropdownMenuSeparator :class=\"cn('bg-line -mx-1 my-1 h-px', props.class)\" />\n</template>\n","<script setup lang=\"ts\">\n import { DropdownMenuRadioGroup } from 'reka-ui'\n\n defineOptions({ name: 'HnDropdownMenuRadioGroup' })\n\n const value = defineModel<string>()\n</script>\n\n<template>\n <DropdownMenuRadioGroup v-model=\"value\">\n <slot />\n </DropdownMenuRadioGroup>\n</template>\n","<script setup lang=\"ts\">\n import { DropdownMenuRadioGroup } from 'reka-ui'\n\n defineOptions({ name: 'HnDropdownMenuRadioGroup' })\n\n const value = defineModel<string>()\n</script>\n\n<template>\n <DropdownMenuRadioGroup v-model=\"value\">\n <slot />\n </DropdownMenuRadioGroup>\n</template>\n","<script setup lang=\"ts\">\n import { Check } from '@lucide/vue'\n import { DropdownMenuRadioItem, DropdownMenuItemIndicator } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { dropdownItem } from './dropdown-menu.variants'\n\n defineOptions({ name: 'HnDropdownMenuRadioItem', inheritAttrs: false })\n\n const props = defineProps<{\n value: string\n disabled?: boolean\n textValue?: string\n class?: string\n }>()\n</script>\n\n<template>\n <DropdownMenuRadioItem\n v-bind=\"$attrs\"\n :value=\"props.value\"\n :disabled=\"props.disabled\"\n :text-value=\"props.textValue\"\n :class=\"cn(dropdownItem(), props.class)\"\n >\n <span class=\"min-w-0 flex-1\"><slot /></span>\n <span class=\"flex size-4 shrink-0 items-center justify-center\">\n <DropdownMenuItemIndicator>\n <Check class=\"size-4\" />\n </DropdownMenuItemIndicator>\n </span>\n </DropdownMenuRadioItem>\n</template>\n","<script setup lang=\"ts\">\n import { Check } from '@lucide/vue'\n import { DropdownMenuRadioItem, DropdownMenuItemIndicator } from 'reka-ui'\n import { cn } from '../../lib/cn'\n import { dropdownItem } from './dropdown-menu.variants'\n\n defineOptions({ name: 'HnDropdownMenuRadioItem', inheritAttrs: false })\n\n const props = defineProps<{\n value: string\n disabled?: boolean\n textValue?: string\n class?: string\n }>()\n</script>\n\n<template>\n <DropdownMenuRadioItem\n v-bind=\"$attrs\"\n :value=\"props.value\"\n :disabled=\"props.disabled\"\n :text-value=\"props.textValue\"\n :class=\"cn(dropdownItem(), props.class)\"\n >\n <span class=\"min-w-0 flex-1\"><slot /></span>\n <span class=\"flex size-4 shrink-0 items-center justify-center\">\n <DropdownMenuItemIndicator>\n <Check class=\"size-4\" />\n </DropdownMenuItemIndicator>\n </span>\n </DropdownMenuRadioItem>\n</template>\n","<script setup lang=\"ts\">\n import {\n DialogRoot,\n DialogTrigger,\n DialogPortal,\n DialogOverlay,\n DialogContent,\n DialogTitle,\n DialogDescription,\n DialogClose,\n } from 'reka-ui'\n import CloseButton from '../close-button/CloseButton.vue'\n import Card from '../card/Card.vue'\n import ScrollArea from '../scroll-area/ScrollArea.vue'\n import Heading from '../heading/Heading.vue'\n import Text from '../text/Text.vue'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import { dialogWrapper, dialogCard } from './dialog.variants'\n\n defineOptions({ name: 'HnDialog' })\n\n const props = withDefaults(\n defineProps<{\n title: string\n description?: string\n size?: 'sm' | 'md' | 'lg'\n placement?: 'center' | 'bottom'\n locked?: boolean\n class?: string\n }>(),\n { size: 'md', locked: false },\n )\n\n function guard(e: Event) {\n if (props.locked) e.preventDefault()\n }\n\n const open = defineModel<boolean>('open')\n const t = useUiLocale()\n\n function close() {\n open.value = false\n }\n</script>\n\n<template>\n <DialogRoot v-model:open=\"open\">\n <DialogTrigger v-if=\"$slots.default\" as-child>\n <slot />\n </DialogTrigger>\n <DialogPortal>\n <DialogOverlay class=\"hn-scrim\" />\n <div\n :class=\"\n cn(\n 'pointer-events-none fixed inset-0 z-(--hn-z-overlay) grid',\n dialogWrapper({ placement: props.placement ?? 'auto' }),\n )\n \"\n >\n <DialogContent as-child @escape-key-down=\"guard\" @interact-outside=\"guard\">\n <Card\n :padded=\"false\"\n :class=\"\n cn(\n 'pointer-events-auto flex w-full flex-col gap-4 shadow-lg outline-none',\n 'max-h-[calc(100dvh-2rem)] py-(--hn-panel-p)',\n dialogCard({ placement: props.placement ?? 'auto', size: props.size }),\n props.class,\n )\n \"\n >\n <div class=\"flex shrink-0 items-start justify-between gap-4 px-(--hn-panel-p)\">\n <div class=\"flex min-w-0 flex-col gap-1.5\">\n <DialogTitle as-child>\n <Heading :level=\"2\" size=\"lg\">{{ props.title }}</Heading>\n </DialogTitle>\n <DialogDescription v-if=\"props.description\" as-child>\n <Text tone=\"muted\">{{ props.description }}</Text>\n </DialogDescription>\n </div>\n <DialogClose as-child>\n <CloseButton :disabled=\"props.locked\" class=\"-mt-1.5 -me-1.5 shrink-0\" />\n </DialogClose>\n </div>\n <ScrollArea v-if=\"$slots.content\" class=\"min-h-0\">\n <div class=\"px-(--hn-panel-p) py-1\">\n <slot name=\"content\" :close=\"close\" />\n </div>\n </ScrollArea>\n <div\n v-if=\"$slots.footer\"\n class=\"flex shrink-0 justify-end gap-(--hn-inline-gap) px-(--hn-panel-p)\"\n >\n <slot name=\"footer\" :close=\"close\" />\n </div>\n </Card>\n </DialogContent>\n </div>\n </DialogPortal>\n </DialogRoot>\n</template>\n","<script setup lang=\"ts\">\n import {\n DialogRoot,\n DialogTrigger,\n DialogPortal,\n DialogOverlay,\n DialogContent,\n DialogTitle,\n DialogDescription,\n DialogClose,\n } from 'reka-ui'\n import CloseButton from '../close-button/CloseButton.vue'\n import Card from '../card/Card.vue'\n import ScrollArea from '../scroll-area/ScrollArea.vue'\n import Heading from '../heading/Heading.vue'\n import Text from '../text/Text.vue'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import { dialogWrapper, dialogCard } from './dialog.variants'\n\n defineOptions({ name: 'HnDialog' })\n\n const props = withDefaults(\n defineProps<{\n title: string\n description?: string\n size?: 'sm' | 'md' | 'lg'\n placement?: 'center' | 'bottom'\n locked?: boolean\n class?: string\n }>(),\n { size: 'md', locked: false },\n )\n\n function guard(e: Event) {\n if (props.locked) e.preventDefault()\n }\n\n const open = defineModel<boolean>('open')\n const t = useUiLocale()\n\n function close() {\n open.value = false\n }\n</script>\n\n<template>\n <DialogRoot v-model:open=\"open\">\n <DialogTrigger v-if=\"$slots.default\" as-child>\n <slot />\n </DialogTrigger>\n <DialogPortal>\n <DialogOverlay class=\"hn-scrim\" />\n <div\n :class=\"\n cn(\n 'pointer-events-none fixed inset-0 z-(--hn-z-overlay) grid',\n dialogWrapper({ placement: props.placement ?? 'auto' }),\n )\n \"\n >\n <DialogContent as-child @escape-key-down=\"guard\" @interact-outside=\"guard\">\n <Card\n :padded=\"false\"\n :class=\"\n cn(\n 'pointer-events-auto flex w-full flex-col gap-4 shadow-lg outline-none',\n 'max-h-[calc(100dvh-2rem)] py-(--hn-panel-p)',\n dialogCard({ placement: props.placement ?? 'auto', size: props.size }),\n props.class,\n )\n \"\n >\n <div class=\"flex shrink-0 items-start justify-between gap-4 px-(--hn-panel-p)\">\n <div class=\"flex min-w-0 flex-col gap-1.5\">\n <DialogTitle as-child>\n <Heading :level=\"2\" size=\"lg\">{{ props.title }}</Heading>\n </DialogTitle>\n <DialogDescription v-if=\"props.description\" as-child>\n <Text tone=\"muted\">{{ props.description }}</Text>\n </DialogDescription>\n </div>\n <DialogClose as-child>\n <CloseButton :disabled=\"props.locked\" class=\"-mt-1.5 -me-1.5 shrink-0\" />\n </DialogClose>\n </div>\n <ScrollArea v-if=\"$slots.content\" class=\"min-h-0\">\n <div class=\"px-(--hn-panel-p) py-1\">\n <slot name=\"content\" :close=\"close\" />\n </div>\n </ScrollArea>\n <div\n v-if=\"$slots.footer\"\n class=\"flex shrink-0 justify-end gap-(--hn-inline-gap) px-(--hn-panel-p)\"\n >\n <slot name=\"footer\" :close=\"close\" />\n </div>\n </Card>\n </DialogContent>\n </div>\n </DialogPortal>\n </DialogRoot>\n</template>\n","<script setup lang=\"ts\">\n import { PanelLeft } from '@lucide/vue'\n import Button from '../button/Button.vue'\n import { useUiLocale } from '../../locale'\n import { useSidebar } from './context'\n\n defineOptions({ name: 'HnSidebarTrigger' })\n\n const props = defineProps<{ class?: string }>()\n\n const t = useUiLocale()\n const sidebar = useSidebar()\n</script>\n\n<template>\n <Button\n v-if=\"sidebar\"\n icon-only\n variant=\"ghost\"\n tone=\"neutral\"\n :aria-label=\"t.sidebar.toggleLabel\"\n :class=\"props.class\"\n @click=\"sidebar.toggle()\"\n >\n <PanelLeft />\n </Button>\n</template>\n","<script setup lang=\"ts\">\n import { PanelLeft } from '@lucide/vue'\n import Button from '../button/Button.vue'\n import { useUiLocale } from '../../locale'\n import { useSidebar } from './context'\n\n defineOptions({ name: 'HnSidebarTrigger' })\n\n const props = defineProps<{ class?: string }>()\n\n const t = useUiLocale()\n const sidebar = useSidebar()\n</script>\n\n<template>\n <Button\n v-if=\"sidebar\"\n icon-only\n variant=\"ghost\"\n tone=\"neutral\"\n :aria-label=\"t.sidebar.toggleLabel\"\n :class=\"props.class\"\n @click=\"sidebar.toggle()\"\n >\n <PanelLeft />\n </Button>\n</template>\n","import { markRaw, reactive, type Component } from 'vue'\nimport { DURATION } from '../../motion'\n\nexport type ToastTone = 'neutral' | 'success' | 'danger' | 'warning' | 'info' | 'loading'\n\nexport type ToasterPosition =\n 'bottom-end' | 'bottom-start' | 'bottom-center' | 'top-end' | 'top-start' | 'top-center'\n\nexport interface ToastAction {\n label: string\n onClick?: () => void\n}\n\nexport interface ToastItem {\n id: number | string\n tone: ToastTone\n message: string\n description?: string\n duration: number\n open: boolean\n action?: ToastAction\n cancel?: ToastAction\n component?: Component\n componentProps?: Record<string, unknown>\n onDismiss?: (id: number | string) => void\n onAutoClose?: (id: number | string) => void\n}\n\nexport interface ToastOptions {\n id?: number | string\n tone?: ToastTone\n description?: string\n duration?: number\n action?: ToastAction\n cancel?: ToastAction\n onDismiss?: (id: number | string) => void\n onAutoClose?: (id: number | string) => void\n}\n\ntype MessageInput<T> = string | { message: string; description?: string } | T\n\nexport interface ToastPromiseMessages<T> {\n loading: string\n success: MessageInput<(value: T) => string | { message: string; description?: string }>\n error: MessageInput<(reason: unknown) => string | { message: string; description?: string }>\n}\n\nconst MAX_VISIBLE = 5\nconst SETTLE_DELAY = (DURATION.exit + 0.06) * 1000\n\nlet seed = 0\n\nexport const toastState: { items: ToastItem[] } = reactive({ items: [] })\n\ninterface Timer {\n handle: ReturnType<typeof setTimeout> | undefined\n remaining: number\n startedAt: number\n}\n\nconst timers = new Map<number | string, Timer>()\nconst pauseReasons = new Set<string>()\n\nfunction fire(id: number | string) {\n timers.delete(id)\n const item = toastState.items.find(t => t.id === id)\n if (item) close(item, 'auto')\n}\n\nfunction startTimer(item: ToastItem) {\n stopTimer(item.id)\n if (item.duration <= 0) return\n const timer: Timer = { handle: undefined, remaining: item.duration, startedAt: Date.now() }\n timers.set(item.id, timer)\n if (pauseReasons.size === 0) timer.handle = setTimeout(() => fire(item.id), timer.remaining)\n}\n\nfunction stopTimer(id: number | string) {\n const timer = timers.get(id)\n if (timer?.handle) clearTimeout(timer.handle)\n timers.delete(id)\n}\n\nexport function pauseTimers(reason: string) {\n if (pauseReasons.has(reason)) return\n const wasRunning = pauseReasons.size === 0\n pauseReasons.add(reason)\n if (!wasRunning) return\n for (const timer of timers.values()) {\n if (!timer.handle) continue\n clearTimeout(timer.handle)\n timer.handle = undefined\n timer.remaining = Math.max(0, timer.remaining - (Date.now() - timer.startedAt))\n }\n}\n\nexport function resumeTimers(reason: string) {\n pauseReasons.delete(reason)\n if (pauseReasons.size > 0) return\n for (const [id, timer] of timers) {\n if (timer.handle) continue\n timer.startedAt = Date.now()\n timer.handle = setTimeout(() => fire(id), timer.remaining)\n }\n}\n\nfunction settle(item: ToastItem) {\n const index = toastState.items.indexOf(item)\n if (index >= 0) toastState.items.splice(index, 1)\n}\n\nfunction close(item: ToastItem, source: 'manual' | 'auto') {\n if (!item.open) return\n item.open = false\n stopTimer(item.id)\n if (source === 'auto') item.onAutoClose?.(item.id)\n item.onDismiss?.(item.id)\n setTimeout(() => settle(item), SETTLE_DELAY)\n}\n\nexport function dismiss(id?: number | string) {\n for (const item of toastState.items) {\n if (id !== undefined && item.id !== id) continue\n close(item, 'manual')\n }\n}\n\nfunction defaultDuration(tone: ToastTone) {\n return tone === 'loading' ? 0 : 4000\n}\n\ninterface InternalOptions extends ToastOptions {\n component?: Component\n componentProps?: Record<string, unknown>\n}\n\nfunction push(message: string, options: InternalOptions = {}) {\n const tone = options.tone ?? 'neutral'\n const existing =\n options.id !== undefined ? toastState.items.find(t => t.id === options.id) : undefined\n\n if (existing && existing.open) {\n existing.tone = tone\n existing.message = message\n existing.description = options.description\n existing.duration = options.duration ?? defaultDuration(tone)\n existing.action = options.action\n existing.cancel = options.cancel\n existing.component = options.component ? markRaw(options.component) : undefined\n existing.componentProps = options.componentProps\n if (options.onDismiss) existing.onDismiss = options.onDismiss\n if (options.onAutoClose) existing.onAutoClose = options.onAutoClose\n startTimer(existing)\n return existing.id\n }\n\n if (existing) settle(existing)\n\n const item: ToastItem = {\n id: options.id ?? ++seed,\n tone,\n message,\n description: options.description,\n duration: options.duration ?? defaultDuration(tone),\n open: true,\n action: options.action,\n cancel: options.cancel,\n component: options.component ? markRaw(options.component) : undefined,\n componentProps: options.componentProps,\n onDismiss: options.onDismiss,\n onAutoClose: options.onAutoClose,\n }\n toastState.items.push(item)\n startTimer(item)\n\n const visible = toastState.items.filter(t => t.open)\n for (const stale of visible.slice(0, Math.max(0, visible.length - MAX_VISIBLE))) {\n close(stale, 'manual')\n }\n return item.id\n}\n\nfunction resolveMessage(\n input: MessageInput<(v: never) => string | { message: string; description?: string }>,\n value: unknown,\n): { message: string; description?: string } {\n const raw = typeof input === 'function' ? (input as (v: unknown) => unknown)(value) : input\n if (typeof raw === 'string') return { message: raw }\n return raw as { message: string; description?: string }\n}\n\ntype TonedOptions = Omit<ToastOptions, 'tone'>\n\nfunction promiseToast<T>(\n promise: Promise<T>,\n messages: ToastPromiseMessages<T>,\n options: TonedOptions = {},\n): Promise<T> {\n const id = push(messages.loading, { ...options, tone: 'loading', duration: 0 })\n promise\n .then(value => {\n const done = resolveMessage(messages.success, value)\n push(done.message, { ...options, id, tone: 'success', description: done.description })\n })\n .catch(reason => {\n const done = resolveMessage(messages.error, reason)\n push(done.message, { ...options, id, tone: 'danger', description: done.description })\n })\n return promise\n}\n\nexport const toast = Object.assign(\n (message: string, options?: ToastOptions) => push(message, options),\n {\n success: (message: string, options?: TonedOptions) =>\n push(message, { ...options, tone: 'success' }),\n danger: (message: string, options?: TonedOptions) =>\n push(message, { ...options, tone: 'danger' }),\n warning: (message: string, options?: TonedOptions) =>\n push(message, { ...options, tone: 'warning' }),\n info: (message: string, options?: TonedOptions) => push(message, { ...options, tone: 'info' }),\n loading: (message: string, options?: TonedOptions) =>\n push(message, { ...options, tone: 'loading' }),\n custom: (\n component: Component,\n options?: TonedOptions & { props?: Record<string, unknown> },\n ) => {\n const { props: componentProps, ...rest } = options ?? {}\n return push('', { ...rest, component, componentProps })\n },\n promise: promiseToast,\n dismiss,\n },\n)\n","import { computed, onBeforeUnmount, reactive, watch } from 'vue'\nimport { toastState, type ToastItem } from '../store'\n\nexport const VISIBLE_STACK = 3\n\nconst GAP = 12\nconst CARD_CHROME_BLOCK = 34\n\nexport function useToastLayout() {\n const heights = reactive(new Map<number | string, number>())\n const observers = new Map<number | string, { observer: ResizeObserver; el: HTMLElement }>()\n const lastLayout = new Map<number | string, { index: number; offset: number }>()\n\n const openItems = computed(() => toastState.items.filter(item => item.open))\n\n const layout = computed(() => {\n const map = new Map<number | string, { index: number; offset: number }>()\n const open = openItems.value\n let offset = 0\n for (let i = open.length - 1; i >= 0; i -= 1) {\n const item = open[i]!\n const index = open.length - 1 - i\n map.set(item.id, { index, offset })\n offset += (heights.get(item.id) ?? 0) + GAP\n }\n for (const [id, slot] of map) lastLayout.set(id, slot)\n return map\n })\n\n const frontHeight = computed(() => {\n const front = openItems.value.at(-1)\n return front ? (heights.get(front.id) ?? 0) : 0\n })\n\n function slotOf(item: ToastItem) {\n return layout.value.get(item.id) ?? lastLayout.get(item.id) ?? { index: 0, offset: 0 }\n }\n\n function itemStyle(item: ToastItem) {\n const slot = slotOf(item)\n const selfHeight = heights.get(item.id)\n return {\n '--hn-t-index': String(slot.index),\n '--hn-t-offset': `${slot.offset}px`,\n ...(selfHeight ? { '--hn-t-self-h': `${selfHeight}px` } : {}),\n ...(frontHeight.value > 0 ? { '--hn-t-front-h': `${frontHeight.value}px` } : {}),\n }\n }\n\n function setItemRef(id: number | string, refValue: unknown) {\n const el = refValue\n if (!(el instanceof HTMLElement)) return\n const existing = observers.get(id)\n if (existing?.el === el) return\n existing?.observer.disconnect()\n const observer = new ResizeObserver(() => {\n heights.set(id, el.offsetHeight + CARD_CHROME_BLOCK)\n })\n observer.observe(el)\n heights.set(id, el.offsetHeight + CARD_CHROME_BLOCK)\n observers.set(id, { observer, el })\n }\n\n watch(\n () => toastState.items.length,\n () => {\n const alive = new Set(toastState.items.map(item => item.id))\n for (const [id, entry] of observers) {\n if (alive.has(id)) continue\n entry.observer.disconnect()\n observers.delete(id)\n heights.delete(id)\n lastLayout.delete(id)\n }\n },\n )\n\n onBeforeUnmount(() => {\n for (const entry of observers.values()) entry.observer.disconnect()\n observers.clear()\n })\n\n return { slotOf, itemStyle, setItemRef }\n}\n","import { computed, onBeforeUnmount, onMounted, ref } from 'vue'\nimport { pauseTimers, resumeTimers } from '../store'\n\nexport function useToastExpand() {\n const reasons = ref(new Set<string>())\n const expanded = computed(() => reasons.value.size > 0)\n\n function enter(reason: string) {\n reasons.value.add(reason)\n pauseTimers(reason)\n }\n\n function leave(reason: string) {\n reasons.value.delete(reason)\n resumeTimers(reason)\n }\n\n function onVisibility() {\n if (document.hidden) pauseTimers('hidden')\n else resumeTimers('hidden')\n }\n\n onMounted(() => document.addEventListener('visibilitychange', onVisibility))\n onBeforeUnmount(() => document.removeEventListener('visibilitychange', onVisibility))\n\n return { expanded, enter, leave }\n}\n","<script setup lang=\"ts\">\n import {\n ToastProvider,\n ToastPortal,\n ToastViewport,\n ToastRoot,\n ToastTitle,\n ToastDescription,\n ToastClose,\n } from 'reka-ui'\n import { CircleCheck, CircleX, TriangleAlert, Info } from '@lucide/vue'\n import Button from '../button/Button.vue'\n import CloseButton from '../close-button/CloseButton.vue'\n import Spinner from '../spinner/Spinner.vue'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import {\n toastState,\n dismiss,\n type ToastItem,\n type ToastTone,\n type ToasterPosition,\n } from './store'\n import { useToastLayout, VISIBLE_STACK } from './composables/useToastLayout'\n import { useToastExpand } from './composables/useToastExpand'\n\n defineOptions({ name: 'HnToaster' })\n\n const props = defineProps<{\n position?: ToasterPosition\n label?: string\n class?: string\n }>()\n\n const t = useUiLocale()\n\n const icons: Partial<Record<ToastTone, unknown>> = {\n success: CircleCheck,\n danger: CircleX,\n warning: TriangleAlert,\n info: Info,\n }\n\n const iconColor: Partial<Record<ToastTone, string>> = {\n success: 'text-success-text',\n danger: 'text-danger-text',\n warning: 'text-warning-text',\n info: 'text-info-text',\n }\n\n const positionClass: Record<ToasterPosition | 'auto', string> = {\n 'bottom-end': 'bottom-4 end-4 hn-scrollbar-safe',\n 'bottom-start': 'bottom-4 start-4',\n 'bottom-center': 'bottom-4 inset-x-0 mx-auto hn-scrollbar-safe-center',\n 'top-end': 'top-4 end-4 hn-scrollbar-safe',\n 'top-start': 'top-4 start-4',\n 'top-center': 'top-4 inset-x-0 mx-auto hn-scrollbar-safe-center',\n auto: 'max-sm:bottom-4 max-sm:inset-x-0 max-sm:mx-auto max-sm:hn-scrollbar-safe-center sm:top-4 sm:end-4 sm:hn-scrollbar-safe',\n }\n\n const { slotOf, itemStyle, setItemRef } = useToastLayout()\n const { expanded, enter, leave } = useToastExpand()\n\n function runAction(item: ToastItem, kind: 'action' | 'cancel') {\n item[kind]?.onClick?.()\n dismiss(item.id)\n }\n</script>\n\n<template>\n <ToastProvider swipe-direction=\"right\">\n <ToastRoot\n v-for=\"item in toastState.items\"\n :key=\"item.id\"\n :open=\"true\"\n :duration=\"Infinity\"\n class=\"hn-toast-item group/toast outline-none\"\n :style=\"itemStyle(item)\"\n :data-hn-behind=\"slotOf(item).index > 0 ? '' : undefined\"\n :data-hn-hidden=\"slotOf(item).index >= VISIBLE_STACK ? '' : undefined\"\n :data-hn-removed=\"item.open ? undefined : ''\"\n :tabindex=\"slotOf(item).index === 0 ? 0 : -1\"\n @update:open=\"v => !v && dismiss(item.id)\"\n >\n <div class=\"hn-toast-card bg-surface border-line relative rounded-lg border p-4 shadow-md\">\n <div\n v-if=\"item.component\"\n :ref=\"refValue => setItemRef(item.id, refValue)\"\n class=\"hn-toast-body\"\n >\n <component :is=\"item.component\" v-bind=\"item.componentProps\" :toast-id=\"item.id\" />\n </div>\n <div\n v-else\n :ref=\"refValue => setItemRef(item.id, refValue)\"\n class=\"hn-toast-body flex w-full items-start gap-3\"\n >\n <div v-if=\"item.tone !== 'neutral'\" class=\"relative mt-0.5 size-5 shrink-0\">\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-90 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-90 opacity-0\"\n >\n <span\n v-if=\"item.tone === 'loading'\"\n class=\"absolute inset-0 inline-flex items-center justify-center\"\n >\n <Spinner size=\"md\" class=\"text-muted\" />\n </span>\n <component\n :is=\"icons[item.tone]\"\n v-else\n :key=\"item.tone\"\n class=\"absolute inset-0 size-5\"\n :class=\"iconColor[item.tone]\"\n aria-hidden=\"true\"\n />\n </Transition>\n </div>\n <div class=\"flex min-w-0 flex-1 flex-col gap-1 pe-6\">\n <ToastTitle class=\"text-fg font-medium\">{{ item.message }}</ToastTitle>\n <ToastDescription v-if=\"item.description\" class=\"text-muted text-sm\">\n {{ item.description }}\n </ToastDescription>\n <div v-if=\"item.action || item.cancel\" class=\"mt-1.5 flex gap-(--hn-inline-gap)\">\n <Button\n v-if=\"item.cancel\"\n size=\"sm\"\n variant=\"ghost\"\n tone=\"neutral\"\n @click=\"runAction(item, 'cancel')\"\n >\n {{ item.cancel.label }}\n </Button>\n <Button\n v-if=\"item.action\"\n size=\"sm\"\n variant=\"soft\"\n @click=\"runAction(item, 'action')\"\n >\n {{ item.action.label }}\n </Button>\n </div>\n </div>\n </div>\n </div>\n <ToastClose as-child>\n <CloseButton\n class=\"absolute top-2 end-2 opacity-0 group-hover/toast:opacity-100 focus-visible:opacity-100\"\n />\n </ToastClose>\n </ToastRoot>\n <ToastPortal>\n <ToastViewport\n :label=\"props.label ?? t.toast.regionLabel\"\n :data-pos=\"props.position ?? 'auto'\"\n :data-expanded=\"expanded ? '' : undefined\"\n :class=\"\n cn(\n 'pointer-events-none fixed z-(--hn-z-toast) w-96 max-w-[calc(100vw-2rem)] outline-none',\n positionClass[props.position ?? 'auto'],\n props.class,\n )\n \"\n @pointerenter=\"enter('hover')\"\n @pointerleave=\"leave('hover')\"\n @focusin=\"enter('focus')\"\n @focusout=\"leave('focus')\"\n />\n </ToastPortal>\n </ToastProvider>\n</template>\n","<script setup lang=\"ts\">\n import {\n ToastProvider,\n ToastPortal,\n ToastViewport,\n ToastRoot,\n ToastTitle,\n ToastDescription,\n ToastClose,\n } from 'reka-ui'\n import { CircleCheck, CircleX, TriangleAlert, Info } from '@lucide/vue'\n import Button from '../button/Button.vue'\n import CloseButton from '../close-button/CloseButton.vue'\n import Spinner from '../spinner/Spinner.vue'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import {\n toastState,\n dismiss,\n type ToastItem,\n type ToastTone,\n type ToasterPosition,\n } from './store'\n import { useToastLayout, VISIBLE_STACK } from './composables/useToastLayout'\n import { useToastExpand } from './composables/useToastExpand'\n\n defineOptions({ name: 'HnToaster' })\n\n const props = defineProps<{\n position?: ToasterPosition\n label?: string\n class?: string\n }>()\n\n const t = useUiLocale()\n\n const icons: Partial<Record<ToastTone, unknown>> = {\n success: CircleCheck,\n danger: CircleX,\n warning: TriangleAlert,\n info: Info,\n }\n\n const iconColor: Partial<Record<ToastTone, string>> = {\n success: 'text-success-text',\n danger: 'text-danger-text',\n warning: 'text-warning-text',\n info: 'text-info-text',\n }\n\n const positionClass: Record<ToasterPosition | 'auto', string> = {\n 'bottom-end': 'bottom-4 end-4 hn-scrollbar-safe',\n 'bottom-start': 'bottom-4 start-4',\n 'bottom-center': 'bottom-4 inset-x-0 mx-auto hn-scrollbar-safe-center',\n 'top-end': 'top-4 end-4 hn-scrollbar-safe',\n 'top-start': 'top-4 start-4',\n 'top-center': 'top-4 inset-x-0 mx-auto hn-scrollbar-safe-center',\n auto: 'max-sm:bottom-4 max-sm:inset-x-0 max-sm:mx-auto max-sm:hn-scrollbar-safe-center sm:top-4 sm:end-4 sm:hn-scrollbar-safe',\n }\n\n const { slotOf, itemStyle, setItemRef } = useToastLayout()\n const { expanded, enter, leave } = useToastExpand()\n\n function runAction(item: ToastItem, kind: 'action' | 'cancel') {\n item[kind]?.onClick?.()\n dismiss(item.id)\n }\n</script>\n\n<template>\n <ToastProvider swipe-direction=\"right\">\n <ToastRoot\n v-for=\"item in toastState.items\"\n :key=\"item.id\"\n :open=\"true\"\n :duration=\"Infinity\"\n class=\"hn-toast-item group/toast outline-none\"\n :style=\"itemStyle(item)\"\n :data-hn-behind=\"slotOf(item).index > 0 ? '' : undefined\"\n :data-hn-hidden=\"slotOf(item).index >= VISIBLE_STACK ? '' : undefined\"\n :data-hn-removed=\"item.open ? undefined : ''\"\n :tabindex=\"slotOf(item).index === 0 ? 0 : -1\"\n @update:open=\"v => !v && dismiss(item.id)\"\n >\n <div class=\"hn-toast-card bg-surface border-line relative rounded-lg border p-4 shadow-md\">\n <div\n v-if=\"item.component\"\n :ref=\"refValue => setItemRef(item.id, refValue)\"\n class=\"hn-toast-body\"\n >\n <component :is=\"item.component\" v-bind=\"item.componentProps\" :toast-id=\"item.id\" />\n </div>\n <div\n v-else\n :ref=\"refValue => setItemRef(item.id, refValue)\"\n class=\"hn-toast-body flex w-full items-start gap-3\"\n >\n <div v-if=\"item.tone !== 'neutral'\" class=\"relative mt-0.5 size-5 shrink-0\">\n <Transition\n enter-active-class=\"hn-transition-base\"\n enter-from-class=\"scale-90 opacity-0\"\n leave-active-class=\"hn-transition\"\n leave-to-class=\"scale-90 opacity-0\"\n >\n <span\n v-if=\"item.tone === 'loading'\"\n class=\"absolute inset-0 inline-flex items-center justify-center\"\n >\n <Spinner size=\"md\" class=\"text-muted\" />\n </span>\n <component\n :is=\"icons[item.tone]\"\n v-else\n :key=\"item.tone\"\n class=\"absolute inset-0 size-5\"\n :class=\"iconColor[item.tone]\"\n aria-hidden=\"true\"\n />\n </Transition>\n </div>\n <div class=\"flex min-w-0 flex-1 flex-col gap-1 pe-6\">\n <ToastTitle class=\"text-fg font-medium\">{{ item.message }}</ToastTitle>\n <ToastDescription v-if=\"item.description\" class=\"text-muted text-sm\">\n {{ item.description }}\n </ToastDescription>\n <div v-if=\"item.action || item.cancel\" class=\"mt-1.5 flex gap-(--hn-inline-gap)\">\n <Button\n v-if=\"item.cancel\"\n size=\"sm\"\n variant=\"ghost\"\n tone=\"neutral\"\n @click=\"runAction(item, 'cancel')\"\n >\n {{ item.cancel.label }}\n </Button>\n <Button\n v-if=\"item.action\"\n size=\"sm\"\n variant=\"soft\"\n @click=\"runAction(item, 'action')\"\n >\n {{ item.action.label }}\n </Button>\n </div>\n </div>\n </div>\n </div>\n <ToastClose as-child>\n <CloseButton\n class=\"absolute top-2 end-2 opacity-0 group-hover/toast:opacity-100 focus-visible:opacity-100\"\n />\n </ToastClose>\n </ToastRoot>\n <ToastPortal>\n <ToastViewport\n :label=\"props.label ?? t.toast.regionLabel\"\n :data-pos=\"props.position ?? 'auto'\"\n :data-expanded=\"expanded ? '' : undefined\"\n :class=\"\n cn(\n 'pointer-events-none fixed z-(--hn-z-toast) w-96 max-w-[calc(100vw-2rem)] outline-none',\n positionClass[props.position ?? 'auto'],\n props.class,\n )\n \"\n @pointerenter=\"enter('hover')\"\n @pointerleave=\"leave('hover')\"\n @focusin=\"enter('focus')\"\n @focusout=\"leave('focus')\"\n />\n </ToastPortal>\n </ToastProvider>\n</template>\n","declare function registerPaint(name: string, painter: unknown): void\n\nconst workletMain = () => {\n const M = Math\n\n const lcgrand =\n (seed = 1) =>\n (a = 0, b = 1) =>\n a +\n (M.abs(b - a) * (M.imul(48271, (seed = M.imul(214013, seed) + 2531011)) & 0x7fffffff)) /\n 0x7fffffff\n\n const pol2vec = (l: number, a = 0) => [l * M.cos(a), l * M.sin(a)] as const\n const vecmag = ([x, y]: readonly number[]) => M.sqrt(x! * x! + y! * y!)\n const vecnorm = ([x, y]: readonly number[], l = vecmag([x!, y!])) =>\n l === 0 ? ([0, 0] as const) : ([x! / l, y! / l] as const)\n\n const trapezoidalWave = (l: number, a: number, b: number) => {\n const s = M.max(a, l - b)\n return (t: number) => {\n if (t < a) return M.max(0, t / a)\n if (t > s) return M.max(0, 1 - (t - s) / (l - s))\n return 1\n }\n }\n\n const cycle = (x: number, n: number) => ((x % n) + n) % n\n const mirror = (x: number, n: number, r: number) => (x < r ? n + x : x > n - r ? x - n : x)\n const clamp = (min: number, x: number, max: number) => M.max(min, M.min(x, max))\n\n const cycleBounds = ([x, y]: readonly number[], [w, h]: readonly number[], r: number) => {\n const tx = cycle(x!, w!)\n const ty = cycle(y!, h!)\n return [\n [tx, ty],\n [mirror(tx, w!, r), mirror(ty, h!, r)],\n ] as const\n }\n\n const easeOutCubic = (t: number) => --t * t * t + 1\n\n type World = { t: number; tStop: number; tStart: number; n: number }\n\n const animateFadeInOut = (world: World, idx: number, duration: number) => {\n const direction = world.tStop <= world.t ? 'out' : 'in'\n const animationStartT = direction === 'in' ? world.tStart : world.tStop\n const t = animationStartT + ((2 / 3) * duration * idx) / world.n\n const fadeFor = (1 / 3) * duration\n\n let progress = 0\n if (direction === 'in') {\n progress = (fadeFor + t - world.t) / fadeFor || 0\n } else {\n progress = (world.t - t) / fadeFor || 1\n }\n\n return easeOutCubic(1 - clamp(0, progress, 1))\n }\n\n const FAKE_WORDS = [5, 3, 4, 4, 2, 4, 7, 6, 8, 6, 3, 1, 6]\n\n const makeWordDistribution = (line: number, em: number, space: number) => {\n let marker = 0\n let i = 0\n let wordslen = 0\n const chunks: [number, number][] = []\n\n do {\n const endOfWord = M.min(line, marker + FAKE_WORDS[i++ % FAKE_WORDS.length]! * em)\n wordslen += endOfWord - marker\n chunks.push([marker, (marker = endOfWord)])\n } while ((marker += space) < line)\n\n if (chunks.length >= 0) chunks[chunks.length - 1]![1] = line\n\n return (t: number) => {\n const w = t * wordslen\n let m = 0\n for (const [start, end] of chunks) {\n const wordLength = end - start\n if (m < w && w <= m + wordLength) return start + w - m\n m += wordLength\n }\n return 0\n }\n }\n\n const getVar = (props: { get(name: string): unknown }, name: string) => {\n const val = props.get(name)\n if (typeof val === 'string') return val\n return String(val ?? '')\n }\n\n class HnSpoilerWorklet {\n static get contextOptions() {\n return { alpha: true }\n }\n\n static get inputProperties() {\n return [\n '--hn-nz-t',\n '--hn-nz-stop',\n '--hn-nz-fade',\n '--hn-nz-gap',\n '--hn-nz-accent',\n '--hn-nz-words',\n '--hn-nz-density',\n ]\n }\n\n paint(\n ctx: CanvasRenderingContext2D,\n size: { width: number; height: number },\n props: { get(name: string): unknown },\n ) {\n const rand = lcgrand(4011505)\n\n const accent = (getVar(props, '--hn-nz-accent') || '0 0% 0%').split(' ')\n const mimicWords = getVar(props, '--hn-nz-words').trim() === 'true'\n const vmin = 2\n const vmax = 12\n const width = size.width\n const height = size.height\n const gaps = (getVar(props, '--hn-nz-gap') || '0px 0px').split(' ').map(parseFloat)\n const hgap = gaps[0] ?? 0\n const vgap = gaps[1] ?? 0\n const density = parseFloat(getVar(props, '--hn-nz-density')) || 0.08\n const sizedev = (globalThis as { devicePixelRatio?: number }).devicePixelRatio! > 1 ? 0.5 : 0\n const fadeDuration = parseFloat(getVar(props, '--hn-nz-fade')) || 0\n\n const world: World = {\n t: parseFloat(getVar(props, '--hn-nz-t') || '0'),\n tStop: parseFloat(getVar(props, '--hn-nz-stop') || 'Infinity'),\n tStart: 0,\n n: M.round(M.min(5000, density * (width - 2 * hgap) * (height - 2 * vgap))),\n }\n\n const lineWidth = width - 2 * hgap\n const lineHeight = height - 2 * vgap\n\n const wordDist = mimicWords\n ? makeWordDistribution(lineWidth, lineHeight, M.max(12, lineHeight / 4))\n : (x: number) => x * (width - 2 * hgap)\n\n ctx.clearRect(0, 0, size.width, size.height)\n\n for (let i = 0; i < world.n; ++i) {\n const x0 = hgap + wordDist(rand())\n const y0 = rand(vgap, height - vgap)\n const v0mag = rand(vmin, vmax)\n const size0 = rand(1, 1 + sizedev)\n\n const l = parseInt(accent[2] ?? '0')\n const ldir = l > 50 ? -1 : 1\n const lightness = M.floor(clamp(0, l + ldir * rand(0, 30), 100))\n\n const v0 = pol2vec(v0mag, rand(0, M.PI * 2))\n const vx0 = v0[0]\n const vy0 = v0[1]\n vecnorm(v0)\n\n const shape = rand() > 0.5 ? 'square' : 'circle'\n const lifetime = rand(0.3, 1.5)\n const respawn = rand(0, 1)\n const visibilityFn = trapezoidalWave(lifetime, 0.15, 0.3)\n const phase = rand(0, lifetime + respawn)\n\n const cantSpawnNoMore =\n M.floor((world.tStop + phase) / (lifetime + respawn)) <\n M.floor((world.t + phase) / (lifetime + respawn))\n if (cantSpawnNoMore) continue\n\n const t = M.min(lifetime, (world.t + phase) % (lifetime + respawn))\n const x = x0 + vx0 * t\n const y = y0 + vy0 * t\n\n const fade = animateFadeInOut(world, i, fadeDuration)\n const alpha = fade * (1 - t / lifetime)\n const psize = fade * (size0 * visibilityFn(t))\n\n for (const [wx, wy] of cycleBounds([x, y], [width, height], psize / 2)) {\n ctx.beginPath()\n ctx.fillStyle = `hsl(${accent[0]} ${accent[1]} ${lightness}% / ${M.round(alpha * 100)}%)`\n if (shape === 'square') {\n ctx.rect(wx!, wy!, psize, psize)\n } else {\n ctx.arc(wx!, wy!, psize / 2, 0, M.PI * 2)\n }\n ctx.closePath()\n ctx.fill()\n }\n }\n }\n }\n\n registerPaint('hn-spoiler', HnSpoilerWorklet)\n}\n\nexport const workletSource = `(${workletMain.toString()})()`\n","import { workletSource } from './worklet'\nimport { prefersReducedMotion } from '../../motion'\n\nexport const isPaintWorkletSupported =\n typeof CSS !== 'undefined' && (CSS as { paintWorklet?: unknown }).paintWorklet !== undefined\n\nlet workletRegistered = false\n\nexport function registerSpoilerWorklet() {\n if (workletRegistered || !isPaintWorkletSupported) return\n workletRegistered = true\n const paintWorklet = (CSS as unknown as { paintWorklet: { addModule(url: string): void } })\n .paintWorklet\n paintWorklet.addModule(\n URL.createObjectURL(new Blob([workletSource], { type: 'application/javascript' })),\n )\n}\n\nexport interface SpoilerPainterOptions {\n fps?: number\n gap?: number\n density?: number\n mimicWords?: boolean\n accent?: string\n}\n\nconst DEFAULTS = {\n fps: 24,\n gap: 6,\n density: 0.12,\n mimicWords: true,\n accent: '0 0% 20%',\n} as const\n\nconst BLOCK_MAX_TILE = 293\nconst INLINE_MAX_TILE = 333\nconst GAP_RATIO = 8\nconst DEFAULT_FADE_S = 1.5\n\nexport class SpoilerPainter {\n readonly el: HTMLElement\n maxFPS: number = DEFAULTS.fps\n\n private t = 0\n private t0 = 0\n private tstop: number | null = null\n private raf: number | null = null\n private fadeS = 0\n private hidden = false\n private destroyed = false\n\n constructor(el: HTMLElement, options: SpoilerPainterOptions = {}) {\n registerSpoilerWorklet()\n this.el = el\n this.update(options)\n }\n\n get isHidden() {\n return this.hidden\n }\n\n update({\n fps = DEFAULTS.fps,\n gap = DEFAULTS.gap,\n density = DEFAULTS.density,\n mimicWords = DEFAULTS.mimicWords,\n accent = DEFAULTS.accent,\n }: SpoilerPainterOptions = {}) {\n if (this.destroyed) return\n\n this.maxFPS = prefersReducedMotion() ? 0 : fps\n\n this.el.style.setProperty('--hn-nz-density', String(density))\n this.el.style.setProperty('--hn-nz-accent', accent)\n\n const isBlockElement = getComputedStyle(this.el).getPropertyValue('display') !== 'inline'\n this.useBackgroundStyle('auto', 'auto', false)\n\n if (isBlockElement) {\n this.el.style.setProperty('--hn-nz-words', 'false')\n const rect = this.el.getBoundingClientRect()\n\n if (rect.width * rect.height > BLOCK_MAX_TILE * BLOCK_MAX_TILE) {\n this.useBackgroundStyle(\n Math.min(rect.width, BLOCK_MAX_TILE),\n Math.min(rect.height, BLOCK_MAX_TILE),\n true,\n )\n } else {\n const capGap = Math.floor(Math.min(gap, rect.width / GAP_RATIO, rect.height / GAP_RATIO))\n this.el.style.setProperty('--hn-nz-gap', `${capGap}px ${capGap}px`)\n }\n return\n }\n\n this.el.style.setProperty('--hn-nz-words', String(mimicWords))\n const rects = [...this.el.getClientRects()]\n const heightOfLine = Math.min(...rects.map(r => r.height))\n\n this.useBackgroundStyle(INLINE_MAX_TILE, heightOfLine, true)\n const capGap = Math.floor(Math.min(heightOfLine / GAP_RATIO, gap))\n this.el.style.setProperty('--hn-nz-gap', `0 ${capGap}px`)\n }\n\n private useBackgroundStyle(ws: string | number, hs: string | number, tile: boolean) {\n const w = typeof ws === 'number' ? `${ws}px` : ws\n const h = typeof hs === 'number' ? `${hs}px` : hs\n const repeatAndPosition = tile ? 'repeat left center' : 'no-repeat center center'\n this.el.style.background = `paint(hn-spoiler) ${repeatAndPosition} / ${w} ${h}`\n }\n\n private setFade(value: number) {\n this.fadeS = value\n this.el.style.setProperty('--hn-nz-fade', `${value}s`)\n }\n\n private setT(value: number) {\n this.t = value\n this.el.style.setProperty('--hn-nz-t', value.toFixed(3))\n }\n\n private setTstop(value: number | null) {\n this.tstop = value\n if (value !== null) {\n this.el.style.setProperty('--hn-nz-stop', value.toFixed(3))\n } else {\n this.el.style.removeProperty('--hn-nz-stop')\n }\n }\n\n private parseFade(value: number | boolean | undefined) {\n if (this.maxFPS <= 0) return 0\n return value === true || value === undefined ? DEFAULT_FADE_S : Number(value)\n }\n\n hide(animate?: number | boolean) {\n if (this.destroyed) return\n this.hidden = true\n this.setFade(this.parseFade(animate))\n this.setTstop(null)\n this.setT(0)\n this.startAnimation()\n }\n\n reveal(animate?: number | boolean) {\n if (this.destroyed) return\n this.hidden = false\n const duration = this.parseFade(animate)\n this.setFade(duration)\n this.setTstop(this.t)\n if (duration <= 0) this.stopAnimation()\n }\n\n private frame = (now: DOMHighResTimeStamp) => {\n if (this.destroyed) return\n const shouldStop = this.tstop !== null && this.t > this.tstop + this.fadeS\n\n if (this.maxFPS > 0 && !shouldStop) {\n this.raf = requestAnimationFrame(this.frame)\n }\n\n const dt = now - this.t0\n if (dt > 0 && dt < 1000 / this.maxFPS) return\n\n this.setT(this.t + dt / 1000)\n this.t0 = now\n }\n\n private startAnimation() {\n this.t0 = performance.now()\n this.frame(this.t0)\n }\n\n private stopAnimation() {\n if (this.raf !== null) {\n cancelAnimationFrame(this.raf)\n this.raf = null\n }\n }\n\n destroy() {\n this.destroyed = true\n this.stopAnimation()\n this.el.style.removeProperty('background')\n for (const prop of [\n '--hn-nz-t',\n '--hn-nz-stop',\n '--hn-nz-fade',\n '--hn-nz-gap',\n '--hn-nz-words',\n '--hn-nz-density',\n '--hn-nz-accent',\n ]) {\n this.el.style.removeProperty(prop)\n }\n }\n}\n","import { onBeforeUnmount, onMounted, ref, watch, type Ref } from 'vue'\nimport { isPaintWorkletSupported, SpoilerPainter } from '../SpoilerPainter'\n\nconst ACCENT_LIGHT = '0 0% 20%'\nconst ACCENT_DARK = '0 0% 100%'\n\nexport function useSpoiler(\n host: Ref<HTMLElement | null>,\n hidden: Ref<boolean>,\n forceFallback: () => boolean,\n) {\n const usesFallback = ref(true)\n\n let painter: SpoilerPainter | undefined\n let themeObserver: MutationObserver | undefined\n let resizeObserver: ResizeObserver | undefined\n const isDark = ref(false)\n\n const accent = () => (isDark.value ? ACCENT_DARK : ACCENT_LIGHT)\n\n onMounted(() => {\n usesFallback.value = !isPaintWorkletSupported || forceFallback()\n if (usesFallback.value || !host.value) return\n\n const readTheme = () => {\n isDark.value = document.documentElement.classList.contains('dark')\n }\n readTheme()\n themeObserver = new MutationObserver(readTheme)\n themeObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n })\n\n painter = new SpoilerPainter(host.value, { accent: accent() })\n\n resizeObserver = new ResizeObserver(() => {\n painter?.update({ accent: accent() })\n })\n resizeObserver.observe(host.value)\n\n watch(\n hidden,\n value => {\n if (!painter) return\n if (value !== painter.isHidden) {\n if (value) {\n painter.hide()\n } else {\n painter.reveal()\n }\n }\n },\n { immediate: true },\n )\n\n watch(isDark, () => painter?.update({ accent: accent() }))\n })\n\n onBeforeUnmount(() => {\n painter?.destroy()\n painter = undefined\n themeObserver?.disconnect()\n resizeObserver?.disconnect()\n })\n\n return { usesFallback }\n}\n","export interface IrisOrigin {\n x: number\n y: number\n}\n\nexport function irisOrigin(\n rects: readonly DOMRect[],\n clientX: number,\n clientY: number,\n): IrisOrigin | null {\n const valid = rects.filter(r => r.width > 0 && r.height > 0)\n if (valid.length === 0) return null\n\n const totalWidth = valid.reduce((sum, r) => sum + r.width, 0)\n const lineHeight = valid[0]!.height\n\n let virtualX: number | null = null\n let virtualY = 0\n let walked = 0\n for (const r of valid) {\n const inside =\n clientY >= r.top - 2 &&\n clientY <= r.bottom + 2 &&\n clientX >= r.left - 2 &&\n clientX <= r.right + 2\n if (inside) {\n virtualX = walked + (clientX - r.left)\n virtualY = clientY - r.top\n break\n }\n walked += r.width\n }\n\n if (virtualX === null || totalWidth === 0 || lineHeight === 0) return null\n\n return {\n x: (virtualX / totalWidth) * 100,\n y: (virtualY / lineHeight) * 100,\n }\n}\n","import { computed, type Ref } from 'vue'\nimport { irisOrigin } from '../utils/irisOrigin'\n\nexport function useReveal(\n host: Ref<HTMLElement | null>,\n hidden: Ref<boolean>,\n revealOn: () => 'click' | 'hover',\n) {\n function setOrigin(event?: MouseEvent) {\n const el = host.value\n if (!el) return\n if (!event || !hidden.value) return\n\n const origin = irisOrigin([...el.getClientRects()], event.clientX, event.clientY)\n if (!origin) {\n el.style.removeProperty('--hn-iris-x')\n el.style.removeProperty('--hn-iris-y')\n return\n }\n el.style.setProperty('--hn-iris-x', `${origin.x.toFixed(1)}%`)\n el.style.setProperty('--hn-iris-y', `${origin.y.toFixed(1)}%`)\n }\n\n function toggle(event?: MouseEvent) {\n setOrigin(event)\n hidden.value = !hidden.value\n }\n\n const handlers = computed(() => {\n if (revealOn() === 'hover') {\n return {\n mouseenter: (event: MouseEvent) => {\n setOrigin(event)\n hidden.value = false\n },\n mouseleave: () => (hidden.value = true),\n focus: () => (hidden.value = false),\n blur: () => (hidden.value = true),\n }\n }\n return {\n click: toggle,\n keydown: (event: KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n toggle()\n }\n },\n }\n })\n\n return handlers\n}\n","<script setup lang=\"ts\">\n import { computed, ref } from 'vue'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import { useSpoiler } from './composables/useSpoiler'\n import { useReveal } from './composables/useReveal'\n\n defineOptions({ name: 'HnSpoiler' })\n\n const props = withDefaults(\n defineProps<{\n revealOn?: 'click' | 'hover'\n forceFallback?: boolean\n class?: string\n }>(),\n { revealOn: 'click' },\n )\n\n const hidden = defineModel<boolean>('hidden', { default: true })\n\n const t = useUiLocale()\n const host = ref<HTMLElement | null>(null)\n const { usesFallback } = useSpoiler(host, hidden, () => !!props.forceFallback)\n\n const label = computed(() =>\n hidden.value ? t.value.spoiler.revealLabel : t.value.spoiler.hideLabel,\n )\n\n const handlers = useReveal(host, hidden, () => props.revealOn)\n</script>\n\n<template>\n <span\n ref=\"host\"\n :class=\"cn(usesFallback ? 'hn-spoiler-fb' : 'hn-spoiler', props.class)\"\n :data-hidden=\"hidden ? '' : undefined\"\n :role=\"props.revealOn === 'click' ? 'button' : undefined\"\n tabindex=\"0\"\n :aria-label=\"label\"\n :aria-expanded=\"!hidden\"\n v-on=\"handlers\"\n >\n <span class=\"hn-spoiler-inner\"><slot /></span>\n </span>\n</template>\n","<script setup lang=\"ts\">\n import { computed, ref } from 'vue'\n import { cn } from '../../lib/cn'\n import { useUiLocale } from '../../locale'\n import { useSpoiler } from './composables/useSpoiler'\n import { useReveal } from './composables/useReveal'\n\n defineOptions({ name: 'HnSpoiler' })\n\n const props = withDefaults(\n defineProps<{\n revealOn?: 'click' | 'hover'\n forceFallback?: boolean\n class?: string\n }>(),\n { revealOn: 'click' },\n )\n\n const hidden = defineModel<boolean>('hidden', { default: true })\n\n const t = useUiLocale()\n const host = ref<HTMLElement | null>(null)\n const { usesFallback } = useSpoiler(host, hidden, () => !!props.forceFallback)\n\n const label = computed(() =>\n hidden.value ? t.value.spoiler.revealLabel : t.value.spoiler.hideLabel,\n )\n\n const handlers = useReveal(host, hidden, () => props.revealOn)\n</script>\n\n<template>\n <span\n ref=\"host\"\n :class=\"cn(usesFallback ? 'hn-spoiler-fb' : 'hn-spoiler', props.class)\"\n :data-hidden=\"hidden ? '' : undefined\"\n :role=\"props.revealOn === 'click' ? 'button' : undefined\"\n tabindex=\"0\"\n :aria-label=\"label\"\n :aria-expanded=\"!hidden\"\n v-on=\"handlers\"\n >\n <span class=\"hn-spoiler-inner\"><slot /></span>\n </span>\n</template>\n","<script setup lang=\"ts\">\n import { computed, reactive, shallowRef } from 'vue'\n import Lightbox from '../lightbox/Lightbox.vue'\n import type { LightboxItem } from '../lightbox/types'\n import { provideImageGroup } from './context'\n\n defineOptions({ name: 'HnImageGroup' })\n\n const props = defineProps<{ loop?: boolean }>()\n\n const registry = reactive(new Map<string, () => LightboxItem>())\n const open = shallowRef(false)\n const index = shallowRef(0)\n\n function byDom(a: LightboxItem, b: LightboxItem): number {\n const first = a.source?.()\n const second = b.source?.()\n if (!first || !second || first === second) return 0\n return first.compareDocumentPosition(second) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1\n }\n\n const items = computed(() => [...registry.values()].map(read => read()).sort(byDom))\n\n provideImageGroup({\n register: (id, item) => {\n registry.set(id, item)\n },\n unregister: id => {\n registry.delete(id)\n },\n open: id => {\n const at = items.value.findIndex(item => item.id === id)\n if (at < 0) return\n index.value = at\n open.value = true\n },\n })\n</script>\n\n<template>\n <slot />\n <Lightbox v-model:open=\"open\" v-model:index=\"index\" :items=\"items\" :loop=\"props.loop\" />\n</template>\n","<script setup lang=\"ts\">\n import { computed, reactive, shallowRef } from 'vue'\n import Lightbox from '../lightbox/Lightbox.vue'\n import type { LightboxItem } from '../lightbox/types'\n import { provideImageGroup } from './context'\n\n defineOptions({ name: 'HnImageGroup' })\n\n const props = defineProps<{ loop?: boolean }>()\n\n const registry = reactive(new Map<string, () => LightboxItem>())\n const open = shallowRef(false)\n const index = shallowRef(0)\n\n function byDom(a: LightboxItem, b: LightboxItem): number {\n const first = a.source?.()\n const second = b.source?.()\n if (!first || !second || first === second) return 0\n return first.compareDocumentPosition(second) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1\n }\n\n const items = computed(() => [...registry.values()].map(read => read()).sort(byDom))\n\n provideImageGroup({\n register: (id, item) => {\n registry.set(id, item)\n },\n unregister: id => {\n registry.delete(id)\n },\n open: id => {\n const at = items.value.findIndex(item => item.id === id)\n if (at < 0) return\n index.value = at\n open.value = true\n },\n })\n</script>\n\n<template>\n <slot />\n <Lightbox v-model:open=\"open\" v-model:index=\"index\" :items=\"items\" :loop=\"props.loop\" />\n</template>\n","export const SCROLL_STATE_FIELD = 'hnScroll'\nexport const RESTORE_DEADLINE_MS = 3000\nexport const SAVE_THROTTLE_MS = 500\nexport const SCROLL_RESTORE_ATTR = 'data-scroll-restore'\nexport const SCROLL_ATOP_ATTR = 'data-scroll-atop'\nexport const SCROLL_AT_ATTR = 'data-scroll-at'\nexport const SCROLL_ATOP_HIDE_PX = 8\n\nexport function atopOff(top: number, off: boolean) {\n if (top > SCROLL_ATOP_HIDE_PX) return true\n if (top <= 0) return false\n return off\n}\n\nexport function firstPaintRestoreScript() {\n return `(function(){try{if(document.readyState!==\"loading\")return;\nvar r=(history.state&&history.state.${SCROLL_STATE_FIELD})||{};\nvar coarse=!!(window.matchMedia&&matchMedia(\"(pointer: coarse)\").matches);\nvar cs=\ndocument.querySelectorAll('[${SCROLL_ATOP_ATTR}]');\nvar mark=function(c,t){if(!coarse){c.style.marginTop=-Math.round(Math.max(0,t))+\"px\";return;}\nif(t>${SCROLL_ATOP_HIDE_PX})c.setAttribute(\"data-off\",\"true\");else if(t<=0)c.setAttribute(\"data-off\",\"false\");};\nfor(var i=0;i<cs.length;i++){mark(cs[i],Math.max(0,r[cs[i].getAttribute(\"${SCROLL_ATOP_ATTR}\")]||0));}\nfor(var k in r){var t=Math.max(0,r[k]);var e=\ndocument.querySelector('[${SCROLL_RESTORE_ATTR}=\"'+k+'\"]');if(e){e.scrollTop=t;e.setAttribute(\"${SCROLL_AT_ATTR}\",String(e.scrollTop));}}\nfor(var i=0;i<cs.length;i++){(function(c){\nvar e=\ndocument.querySelector('[${SCROLL_RESTORE_ATTR}=\"'+c.getAttribute(\"${SCROLL_ATOP_ATTR}\")+'\"]');\nif(!e)return;\nvar sync=function(){if(e.scrollHeight<=e.clientHeight){e.removeEventListener(\"scroll\",sync);return;}mark(c,e.scrollTop);};\ne.addEventListener(\"scroll\",sync,{passive:true});\n})(cs[i]);}\n}catch{}})()`.replace(/\\n/g, '')\n}\n\nexport type ScrollRecord = Record<string, number>\n\nexport interface ScrollRestorerPorts {\n getViewport: () => HTMLElement | null\n /** Where the first-paint script left the scroller, read once and cleared. */\n takeFirstPaintTop: () => number | undefined\n readState: () => unknown\n writeState: (state: Record<string, unknown>) => void\n setTimer: (fn: () => void, ms: number) => () => void\n}\n\nexport interface ScrollRestorer {\n restore: (initial?: boolean) => void\n settle: () => void\n abandon: () => void\n save: () => void\n saveSoon: () => void\n dispose: () => void\n isPending: () => boolean\n}\n\nexport function readScrollRecord(state: unknown): ScrollRecord {\n if (!state || typeof state !== 'object') return {}\n const record = (state as Record<string, unknown>)[SCROLL_STATE_FIELD]\n if (!record || typeof record !== 'object') return {}\n return record as ScrollRecord\n}\n\nexport function writeScrollRecord(state: unknown, key: string, top: number) {\n const base = state && typeof state === 'object' ? (state as Record<string, unknown>) : {}\n return {\n ...base,\n [SCROLL_STATE_FIELD]: { ...readScrollRecord(base), [key]: top },\n }\n}\n\nfunction readEntryId(state: unknown) {\n if (!state || typeof state !== 'object') return undefined\n return (state as Record<string, unknown>).position\n}\n\nexport function createScrollRestorer(key: string, ports: ScrollRestorerPorts): ScrollRestorer {\n let pending: number | null = null\n let clearDeadline: (() => void) | null = null\n let clearThrottle: (() => void) | null = null\n let entry: unknown\n\n function stopWaiting() {\n pending = null\n clearDeadline?.()\n clearDeadline = null\n }\n\n function apply(top: number) {\n const el = ports.getViewport()\n if (!el) return false\n el.scrollTop = top\n return el.scrollHeight - el.clientHeight + 1 >= top\n }\n\n function save() {\n if (pending !== null) return\n if (readEntryId(ports.readState()) !== entry) return\n const el = ports.getViewport()\n if (!el) return\n ports.writeState(writeScrollRecord(ports.readState(), key, el.scrollTop))\n }\n\n return {\n restore(initial) {\n stopWaiting()\n entry = readEntryId(ports.readState())\n\n const saved = readScrollRecord(ports.readState())[key]\n const firstPaintTop = ports.takeFirstPaintTop()\n\n if (initial) {\n // The first-paint script already put the scroller where this entry\n // wants it, so anything else means the reader moved it while the page\n // was still hydrating — the wheel listener that would have cancelled a\n // restore is only attached from here on.\n if (saved === undefined) return\n const el = ports.getViewport()\n if (firstPaintTop !== undefined && el && el.scrollTop !== firstPaintTop) return\n }\n\n const top = saved ?? 0\n if (apply(top)) return\n pending = top\n clearDeadline = ports.setTimer(stopWaiting, RESTORE_DEADLINE_MS)\n },\n\n settle() {\n if (pending === null) return\n if (apply(pending)) stopWaiting()\n },\n\n abandon: stopWaiting,\n\n isPending: () => pending !== null,\n\n save,\n\n saveSoon() {\n if (clearThrottle) return\n clearThrottle = ports.setTimer(() => {\n clearThrottle = null\n save()\n }, SAVE_THROTTLE_MS)\n },\n\n dispose() {\n stopWaiting()\n clearThrottle?.()\n clearThrottle = null\n },\n }\n}\n"],"mappings":"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"}
|