@hanzo/ui 8.0.25 → 8.0.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/backends/gui/aspect-ratio.d.ts +14 -0
- package/dist/backends/gui/avatar.d.ts +16 -0
- package/dist/backends/gui/badge.d.ts +19 -0
- package/dist/backends/gui/button.d.ts +50 -0
- package/dist/backends/gui/card.d.ts +44 -0
- package/dist/backends/gui/checkbox.d.ts +9 -0
- package/dist/backends/gui/collapsible.d.ts +10 -0
- package/dist/backends/gui/command.d.ts +86 -0
- package/dist/backends/gui/command.logic.d.ts +20 -0
- package/dist/backends/gui/dialog.d.ts +27 -0
- package/dist/backends/gui/dropdown-menu.d.ts +98 -0
- package/dist/backends/gui/index.d.ts +24 -2
- package/dist/backends/gui/ink.d.ts +7 -0
- package/dist/backends/gui/input.d.ts +19 -0
- package/dist/backends/gui/label.d.ts +6 -0
- package/dist/backends/gui/popover.d.ts +22 -0
- package/dist/backends/gui/progress.d.ts +6 -0
- package/dist/backends/gui/resizable.d.ts +52 -0
- package/dist/backends/gui/resizable.logic.d.ts +23 -0
- package/dist/backends/gui/scroll-area.d.ts +45 -0
- package/dist/backends/gui/select.d.ts +30 -0
- package/dist/backends/gui/separator.d.ts +10 -0
- package/dist/backends/gui/slider.d.ts +6 -0
- package/dist/backends/gui/slot.d.ts +6 -0
- package/dist/backends/gui/switch.d.ts +6 -0
- package/dist/backends/gui/tabs.d.ts +12 -0
- package/dist/backends/gui/textarea.d.ts +11 -0
- package/dist/backends/gui/toaster.d.ts +28 -0
- package/dist/backends/gui/tooltip.d.ts +12 -0
- package/dist/chunk-2U3MNE4I.js +4 -0
- package/dist/chunk-2U3MNE4I.js.map +1 -0
- package/dist/chunk-6DDY6XZI.js +53 -0
- package/dist/chunk-6DDY6XZI.js.map +1 -0
- package/dist/chunk-6KZWRBK2.cjs +1498 -0
- package/dist/chunk-6KZWRBK2.cjs.map +1 -0
- package/dist/chunk-DC52DQ27.cjs +303 -0
- package/dist/chunk-DC52DQ27.cjs.map +1 -0
- package/dist/chunk-NQUA5YRQ.cjs +55 -0
- package/dist/chunk-NQUA5YRQ.cjs.map +1 -0
- package/dist/chunk-PI3GSHLU.js +263 -0
- package/dist/chunk-PI3GSHLU.js.map +1 -0
- package/dist/chunk-QHC2ZNAF.js +11 -0
- package/dist/chunk-QHC2ZNAF.js.map +1 -0
- package/dist/chunk-QV52JQHR.cjs +77 -0
- package/dist/chunk-QV52JQHR.cjs.map +1 -0
- package/dist/chunk-RBS5AYO4.cjs +13 -0
- package/dist/chunk-RBS5AYO4.cjs.map +1 -0
- package/dist/chunk-RCMDRI6V.js +1401 -0
- package/dist/chunk-RCMDRI6V.js.map +1 -0
- package/dist/components.d.ts +1 -1
- package/dist/core/cn.d.ts +3 -5
- package/dist/core/index.cjs +92 -0
- package/dist/core/index.cjs.map +1 -0
- package/dist/core/index.js +14 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/tokens.cjs +77 -0
- package/dist/core/tokens.cjs.map +1 -0
- package/dist/core/tokens.js +4 -0
- package/dist/core/tokens.js.map +1 -0
- package/dist/framework/index.cjs +4 -3
- package/dist/framework/index.cjs.map +1 -1
- package/dist/framework/index.js +2 -1
- package/dist/framework/index.js.map +1 -1
- package/dist/index.cjs +365 -1136
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +3 -1017
- package/dist/index.js.map +1 -1
- package/dist/models/catalog.d.ts +1 -1
- package/dist/models/index.cjs +225 -0
- package/dist/models/index.cjs.map +1 -0
- package/dist/models/index.js +218 -0
- package/dist/models/index.js.map +1 -0
- package/dist/primitives/AspectRatio.cjs +14 -0
- package/dist/primitives/AspectRatio.cjs.map +1 -0
- package/dist/primitives/AspectRatio.d.ts +1 -1
- package/dist/primitives/AspectRatio.js +5 -0
- package/dist/primitives/AspectRatio.js.map +1 -0
- package/dist/primitives/Avatar.cjs +14 -0
- package/dist/primitives/Avatar.cjs.map +1 -0
- package/dist/primitives/Avatar.d.ts +1 -1
- package/dist/primitives/Avatar.js +5 -0
- package/dist/primitives/Avatar.js.map +1 -0
- package/dist/primitives/AvatarFallback.cjs +14 -0
- package/dist/primitives/AvatarFallback.cjs.map +1 -0
- package/dist/primitives/AvatarFallback.d.ts +1 -1
- package/dist/primitives/AvatarFallback.js +5 -0
- package/dist/primitives/AvatarFallback.js.map +1 -0
- package/dist/primitives/AvatarImage.cjs +14 -0
- package/dist/primitives/AvatarImage.cjs.map +1 -0
- package/dist/primitives/AvatarImage.d.ts +1 -1
- package/dist/primitives/AvatarImage.js +5 -0
- package/dist/primitives/AvatarImage.js.map +1 -0
- package/dist/primitives/Badge.cjs +14 -0
- package/dist/primitives/Badge.cjs.map +1 -0
- package/dist/primitives/Badge.d.ts +1 -1
- package/dist/primitives/Badge.js +5 -0
- package/dist/primitives/Badge.js.map +1 -0
- package/dist/primitives/Button.cjs +14 -0
- package/dist/primitives/Button.cjs.map +1 -0
- package/dist/primitives/Button.d.ts +1 -1
- package/dist/primitives/Button.js +5 -0
- package/dist/primitives/Button.js.map +1 -0
- package/dist/primitives/Card.cjs +14 -0
- package/dist/primitives/Card.cjs.map +1 -0
- package/dist/primitives/Card.d.ts +1 -1
- package/dist/primitives/Card.js +5 -0
- package/dist/primitives/Card.js.map +1 -0
- package/dist/primitives/CardAction.cjs +14 -0
- package/dist/primitives/CardAction.cjs.map +1 -0
- package/dist/primitives/CardAction.d.ts +1 -1
- package/dist/primitives/CardAction.js +5 -0
- package/dist/primitives/CardAction.js.map +1 -0
- package/dist/primitives/CardContent.cjs +14 -0
- package/dist/primitives/CardContent.cjs.map +1 -0
- package/dist/primitives/CardContent.d.ts +1 -1
- package/dist/primitives/CardContent.js +5 -0
- package/dist/primitives/CardContent.js.map +1 -0
- package/dist/primitives/CardDescription.cjs +14 -0
- package/dist/primitives/CardDescription.cjs.map +1 -0
- package/dist/primitives/CardDescription.d.ts +1 -1
- package/dist/primitives/CardDescription.js +5 -0
- package/dist/primitives/CardDescription.js.map +1 -0
- package/dist/primitives/CardFooter.cjs +14 -0
- package/dist/primitives/CardFooter.cjs.map +1 -0
- package/dist/primitives/CardFooter.d.ts +1 -1
- package/dist/primitives/CardFooter.js +5 -0
- package/dist/primitives/CardFooter.js.map +1 -0
- package/dist/primitives/CardHeader.cjs +14 -0
- package/dist/primitives/CardHeader.cjs.map +1 -0
- package/dist/primitives/CardHeader.d.ts +1 -1
- package/dist/primitives/CardHeader.js +5 -0
- package/dist/primitives/CardHeader.js.map +1 -0
- package/dist/primitives/CardTitle.cjs +14 -0
- package/dist/primitives/CardTitle.cjs.map +1 -0
- package/dist/primitives/CardTitle.d.ts +1 -1
- package/dist/primitives/CardTitle.js +5 -0
- package/dist/primitives/CardTitle.js.map +1 -0
- package/dist/primitives/Checkbox.cjs +14 -0
- package/dist/primitives/Checkbox.cjs.map +1 -0
- package/dist/primitives/Checkbox.d.ts +1 -1
- package/dist/primitives/Checkbox.js +5 -0
- package/dist/primitives/Checkbox.js.map +1 -0
- package/dist/primitives/Collapsible.cjs +14 -0
- package/dist/primitives/Collapsible.cjs.map +1 -0
- package/dist/primitives/Collapsible.d.ts +1 -1
- package/dist/primitives/Collapsible.js +5 -0
- package/dist/primitives/Collapsible.js.map +1 -0
- package/dist/primitives/CollapsibleContent.cjs +14 -0
- package/dist/primitives/CollapsibleContent.cjs.map +1 -0
- package/dist/primitives/CollapsibleContent.d.ts +1 -1
- package/dist/primitives/CollapsibleContent.js +5 -0
- package/dist/primitives/CollapsibleContent.js.map +1 -0
- package/dist/primitives/CollapsibleTrigger.cjs +14 -0
- package/dist/primitives/CollapsibleTrigger.cjs.map +1 -0
- package/dist/primitives/CollapsibleTrigger.d.ts +1 -1
- package/dist/primitives/CollapsibleTrigger.js +5 -0
- package/dist/primitives/CollapsibleTrigger.js.map +1 -0
- package/dist/primitives/Command.cjs +14 -0
- package/dist/primitives/Command.cjs.map +1 -0
- package/dist/primitives/Command.d.ts +1 -1
- package/dist/primitives/Command.js +5 -0
- package/dist/primitives/Command.js.map +1 -0
- package/dist/primitives/CommandDialog.cjs +14 -0
- package/dist/primitives/CommandDialog.cjs.map +1 -0
- package/dist/primitives/CommandDialog.d.ts +1 -1
- package/dist/primitives/CommandDialog.js +5 -0
- package/dist/primitives/CommandDialog.js.map +1 -0
- package/dist/primitives/CommandEmpty.cjs +14 -0
- package/dist/primitives/CommandEmpty.cjs.map +1 -0
- package/dist/primitives/CommandEmpty.d.ts +1 -1
- package/dist/primitives/CommandEmpty.js +5 -0
- package/dist/primitives/CommandEmpty.js.map +1 -0
- package/dist/primitives/CommandGroup.cjs +14 -0
- package/dist/primitives/CommandGroup.cjs.map +1 -0
- package/dist/primitives/CommandGroup.d.ts +1 -1
- package/dist/primitives/CommandGroup.js +5 -0
- package/dist/primitives/CommandGroup.js.map +1 -0
- package/dist/primitives/CommandInput.cjs +14 -0
- package/dist/primitives/CommandInput.cjs.map +1 -0
- package/dist/primitives/CommandInput.d.ts +1 -1
- package/dist/primitives/CommandInput.js +5 -0
- package/dist/primitives/CommandInput.js.map +1 -0
- package/dist/primitives/CommandItem.cjs +14 -0
- package/dist/primitives/CommandItem.cjs.map +1 -0
- package/dist/primitives/CommandItem.d.ts +1 -1
- package/dist/primitives/CommandItem.js +5 -0
- package/dist/primitives/CommandItem.js.map +1 -0
- package/dist/primitives/CommandList.cjs +14 -0
- package/dist/primitives/CommandList.cjs.map +1 -0
- package/dist/primitives/CommandList.d.ts +1 -1
- package/dist/primitives/CommandList.js +5 -0
- package/dist/primitives/CommandList.js.map +1 -0
- package/dist/primitives/CommandSeparator.cjs +14 -0
- package/dist/primitives/CommandSeparator.cjs.map +1 -0
- package/dist/primitives/CommandSeparator.d.ts +1 -1
- package/dist/primitives/CommandSeparator.js +5 -0
- package/dist/primitives/CommandSeparator.js.map +1 -0
- package/dist/primitives/CommandShortcut.cjs +14 -0
- package/dist/primitives/CommandShortcut.cjs.map +1 -0
- package/dist/primitives/CommandShortcut.d.ts +1 -1
- package/dist/primitives/CommandShortcut.js +5 -0
- package/dist/primitives/CommandShortcut.js.map +1 -0
- package/dist/primitives/Dialog.cjs +14 -0
- package/dist/primitives/Dialog.cjs.map +1 -0
- package/dist/primitives/Dialog.d.ts +1 -1
- package/dist/primitives/Dialog.js +5 -0
- package/dist/primitives/Dialog.js.map +1 -0
- package/dist/primitives/DialogClose.cjs +14 -0
- package/dist/primitives/DialogClose.cjs.map +1 -0
- package/dist/primitives/DialogClose.d.ts +1 -1
- package/dist/primitives/DialogClose.js +5 -0
- package/dist/primitives/DialogClose.js.map +1 -0
- package/dist/primitives/DialogContent.cjs +14 -0
- package/dist/primitives/DialogContent.cjs.map +1 -0
- package/dist/primitives/DialogContent.d.ts +1 -1
- package/dist/primitives/DialogContent.js +5 -0
- package/dist/primitives/DialogContent.js.map +1 -0
- package/dist/primitives/DialogDescription.cjs +14 -0
- package/dist/primitives/DialogDescription.cjs.map +1 -0
- package/dist/primitives/DialogDescription.d.ts +1 -1
- package/dist/primitives/DialogDescription.js +5 -0
- package/dist/primitives/DialogDescription.js.map +1 -0
- package/dist/primitives/DialogFooter.cjs +14 -0
- package/dist/primitives/DialogFooter.cjs.map +1 -0
- package/dist/primitives/DialogFooter.d.ts +1 -1
- package/dist/primitives/DialogFooter.js +5 -0
- package/dist/primitives/DialogFooter.js.map +1 -0
- package/dist/primitives/DialogHeader.cjs +14 -0
- package/dist/primitives/DialogHeader.cjs.map +1 -0
- package/dist/primitives/DialogHeader.d.ts +1 -1
- package/dist/primitives/DialogHeader.js +5 -0
- package/dist/primitives/DialogHeader.js.map +1 -0
- package/dist/primitives/DialogOverlay.cjs +14 -0
- package/dist/primitives/DialogOverlay.cjs.map +1 -0
- package/dist/primitives/DialogOverlay.d.ts +1 -1
- package/dist/primitives/DialogOverlay.js +5 -0
- package/dist/primitives/DialogOverlay.js.map +1 -0
- package/dist/primitives/DialogPortal.cjs +14 -0
- package/dist/primitives/DialogPortal.cjs.map +1 -0
- package/dist/primitives/DialogPortal.d.ts +1 -1
- package/dist/primitives/DialogPortal.js +5 -0
- package/dist/primitives/DialogPortal.js.map +1 -0
- package/dist/primitives/DialogTitle.cjs +14 -0
- package/dist/primitives/DialogTitle.cjs.map +1 -0
- package/dist/primitives/DialogTitle.d.ts +1 -1
- package/dist/primitives/DialogTitle.js +5 -0
- package/dist/primitives/DialogTitle.js.map +1 -0
- package/dist/primitives/DialogTrigger.cjs +14 -0
- package/dist/primitives/DialogTrigger.cjs.map +1 -0
- package/dist/primitives/DialogTrigger.d.ts +1 -1
- package/dist/primitives/DialogTrigger.js +5 -0
- package/dist/primitives/DialogTrigger.js.map +1 -0
- package/dist/primitives/DropdownMenu.cjs +14 -0
- package/dist/primitives/DropdownMenu.cjs.map +1 -0
- package/dist/primitives/DropdownMenu.d.ts +1 -1
- package/dist/primitives/DropdownMenu.js +5 -0
- package/dist/primitives/DropdownMenu.js.map +1 -0
- package/dist/primitives/DropdownMenuCheckboxItem.cjs +14 -0
- package/dist/primitives/DropdownMenuCheckboxItem.cjs.map +1 -0
- package/dist/primitives/DropdownMenuCheckboxItem.d.ts +1 -1
- package/dist/primitives/DropdownMenuCheckboxItem.js +5 -0
- package/dist/primitives/DropdownMenuCheckboxItem.js.map +1 -0
- package/dist/primitives/DropdownMenuContent.cjs +14 -0
- package/dist/primitives/DropdownMenuContent.cjs.map +1 -0
- package/dist/primitives/DropdownMenuContent.d.ts +1 -1
- package/dist/primitives/DropdownMenuContent.js +5 -0
- package/dist/primitives/DropdownMenuContent.js.map +1 -0
- package/dist/primitives/DropdownMenuGroup.cjs +14 -0
- package/dist/primitives/DropdownMenuGroup.cjs.map +1 -0
- package/dist/primitives/DropdownMenuGroup.d.ts +1 -1
- package/dist/primitives/DropdownMenuGroup.js +5 -0
- package/dist/primitives/DropdownMenuGroup.js.map +1 -0
- package/dist/primitives/DropdownMenuItem.cjs +14 -0
- package/dist/primitives/DropdownMenuItem.cjs.map +1 -0
- package/dist/primitives/DropdownMenuItem.d.ts +1 -1
- package/dist/primitives/DropdownMenuItem.js +5 -0
- package/dist/primitives/DropdownMenuItem.js.map +1 -0
- package/dist/primitives/DropdownMenuLabel.cjs +14 -0
- package/dist/primitives/DropdownMenuLabel.cjs.map +1 -0
- package/dist/primitives/DropdownMenuLabel.d.ts +1 -1
- package/dist/primitives/DropdownMenuLabel.js +5 -0
- package/dist/primitives/DropdownMenuLabel.js.map +1 -0
- package/dist/primitives/DropdownMenuPortal.cjs +14 -0
- package/dist/primitives/DropdownMenuPortal.cjs.map +1 -0
- package/dist/primitives/DropdownMenuPortal.d.ts +1 -1
- package/dist/primitives/DropdownMenuPortal.js +5 -0
- package/dist/primitives/DropdownMenuPortal.js.map +1 -0
- package/dist/primitives/DropdownMenuRadioGroup.cjs +14 -0
- package/dist/primitives/DropdownMenuRadioGroup.cjs.map +1 -0
- package/dist/primitives/DropdownMenuRadioGroup.d.ts +1 -1
- package/dist/primitives/DropdownMenuRadioGroup.js +5 -0
- package/dist/primitives/DropdownMenuRadioGroup.js.map +1 -0
- package/dist/primitives/DropdownMenuRadioItem.cjs +14 -0
- package/dist/primitives/DropdownMenuRadioItem.cjs.map +1 -0
- package/dist/primitives/DropdownMenuRadioItem.d.ts +1 -1
- package/dist/primitives/DropdownMenuRadioItem.js +5 -0
- package/dist/primitives/DropdownMenuRadioItem.js.map +1 -0
- package/dist/primitives/DropdownMenuSeparator.cjs +14 -0
- package/dist/primitives/DropdownMenuSeparator.cjs.map +1 -0
- package/dist/primitives/DropdownMenuSeparator.d.ts +1 -1
- package/dist/primitives/DropdownMenuSeparator.js +5 -0
- package/dist/primitives/DropdownMenuSeparator.js.map +1 -0
- package/dist/primitives/DropdownMenuShortcut.cjs +14 -0
- package/dist/primitives/DropdownMenuShortcut.cjs.map +1 -0
- package/dist/primitives/DropdownMenuShortcut.d.ts +1 -1
- package/dist/primitives/DropdownMenuShortcut.js +5 -0
- package/dist/primitives/DropdownMenuShortcut.js.map +1 -0
- package/dist/primitives/DropdownMenuSub.cjs +14 -0
- package/dist/primitives/DropdownMenuSub.cjs.map +1 -0
- package/dist/primitives/DropdownMenuSub.d.ts +1 -1
- package/dist/primitives/DropdownMenuSub.js +5 -0
- package/dist/primitives/DropdownMenuSub.js.map +1 -0
- package/dist/primitives/DropdownMenuSubContent.cjs +14 -0
- package/dist/primitives/DropdownMenuSubContent.cjs.map +1 -0
- package/dist/primitives/DropdownMenuSubContent.d.ts +1 -1
- package/dist/primitives/DropdownMenuSubContent.js +5 -0
- package/dist/primitives/DropdownMenuSubContent.js.map +1 -0
- package/dist/primitives/DropdownMenuSubTrigger.cjs +14 -0
- package/dist/primitives/DropdownMenuSubTrigger.cjs.map +1 -0
- package/dist/primitives/DropdownMenuSubTrigger.d.ts +1 -1
- package/dist/primitives/DropdownMenuSubTrigger.js +5 -0
- package/dist/primitives/DropdownMenuSubTrigger.js.map +1 -0
- package/dist/primitives/DropdownMenuTrigger.cjs +14 -0
- package/dist/primitives/DropdownMenuTrigger.cjs.map +1 -0
- package/dist/primitives/DropdownMenuTrigger.d.ts +1 -1
- package/dist/primitives/DropdownMenuTrigger.js +5 -0
- package/dist/primitives/DropdownMenuTrigger.js.map +1 -0
- package/dist/primitives/Input.cjs +14 -0
- package/dist/primitives/Input.cjs.map +1 -0
- package/dist/primitives/Input.d.ts +1 -1
- package/dist/primitives/Input.js +5 -0
- package/dist/primitives/Input.js.map +1 -0
- package/dist/primitives/Label.cjs +14 -0
- package/dist/primitives/Label.cjs.map +1 -0
- package/dist/primitives/Label.d.ts +1 -1
- package/dist/primitives/Label.js +5 -0
- package/dist/primitives/Label.js.map +1 -0
- package/dist/primitives/Popover.cjs +14 -0
- package/dist/primitives/Popover.cjs.map +1 -0
- package/dist/primitives/Popover.d.ts +1 -1
- package/dist/primitives/Popover.js +5 -0
- package/dist/primitives/Popover.js.map +1 -0
- package/dist/primitives/PopoverAnchor.cjs +14 -0
- package/dist/primitives/PopoverAnchor.cjs.map +1 -0
- package/dist/primitives/PopoverAnchor.d.ts +1 -1
- package/dist/primitives/PopoverAnchor.js +5 -0
- package/dist/primitives/PopoverAnchor.js.map +1 -0
- package/dist/primitives/PopoverClose.cjs +14 -0
- package/dist/primitives/PopoverClose.cjs.map +1 -0
- package/dist/primitives/PopoverClose.d.ts +1 -0
- package/dist/primitives/PopoverClose.js +5 -0
- package/dist/primitives/PopoverClose.js.map +1 -0
- package/dist/primitives/PopoverContent.cjs +14 -0
- package/dist/primitives/PopoverContent.cjs.map +1 -0
- package/dist/primitives/PopoverContent.d.ts +1 -1
- package/dist/primitives/PopoverContent.js +5 -0
- package/dist/primitives/PopoverContent.js.map +1 -0
- package/dist/primitives/PopoverTrigger.cjs +14 -0
- package/dist/primitives/PopoverTrigger.cjs.map +1 -0
- package/dist/primitives/PopoverTrigger.d.ts +1 -1
- package/dist/primitives/PopoverTrigger.js +5 -0
- package/dist/primitives/PopoverTrigger.js.map +1 -0
- package/dist/primitives/Progress.cjs +14 -0
- package/dist/primitives/Progress.cjs.map +1 -0
- package/dist/primitives/Progress.d.ts +1 -1
- package/dist/primitives/Progress.js +5 -0
- package/dist/primitives/Progress.js.map +1 -0
- package/dist/primitives/ResizableHandle.cjs +14 -0
- package/dist/primitives/ResizableHandle.cjs.map +1 -0
- package/dist/primitives/ResizableHandle.d.ts +1 -0
- package/dist/primitives/ResizableHandle.js +5 -0
- package/dist/primitives/ResizableHandle.js.map +1 -0
- package/dist/primitives/ResizablePanel.cjs +14 -0
- package/dist/primitives/ResizablePanel.cjs.map +1 -0
- package/dist/primitives/ResizablePanel.d.ts +1 -0
- package/dist/primitives/ResizablePanel.js +5 -0
- package/dist/primitives/ResizablePanel.js.map +1 -0
- package/dist/primitives/ResizablePanelGroup.cjs +14 -0
- package/dist/primitives/ResizablePanelGroup.cjs.map +1 -0
- package/dist/primitives/ResizablePanelGroup.d.ts +1 -0
- package/dist/primitives/ResizablePanelGroup.js +5 -0
- package/dist/primitives/ResizablePanelGroup.js.map +1 -0
- package/dist/primitives/ScrollArea.cjs +14 -0
- package/dist/primitives/ScrollArea.cjs.map +1 -0
- package/dist/primitives/ScrollArea.d.ts +1 -1
- package/dist/primitives/ScrollArea.js +5 -0
- package/dist/primitives/ScrollArea.js.map +1 -0
- package/dist/primitives/ScrollBar.cjs +14 -0
- package/dist/primitives/ScrollBar.cjs.map +1 -0
- package/dist/primitives/ScrollBar.d.ts +1 -1
- package/dist/primitives/ScrollBar.js +5 -0
- package/dist/primitives/ScrollBar.js.map +1 -0
- package/dist/primitives/Select.cjs +14 -0
- package/dist/primitives/Select.cjs.map +1 -0
- package/dist/primitives/Select.d.ts +1 -1
- package/dist/primitives/Select.js +5 -0
- package/dist/primitives/Select.js.map +1 -0
- package/dist/primitives/SelectContent.cjs +14 -0
- package/dist/primitives/SelectContent.cjs.map +1 -0
- package/dist/primitives/SelectContent.d.ts +1 -1
- package/dist/primitives/SelectContent.js +5 -0
- package/dist/primitives/SelectContent.js.map +1 -0
- package/dist/primitives/SelectGroup.cjs +14 -0
- package/dist/primitives/SelectGroup.cjs.map +1 -0
- package/dist/primitives/SelectGroup.d.ts +1 -1
- package/dist/primitives/SelectGroup.js +5 -0
- package/dist/primitives/SelectGroup.js.map +1 -0
- package/dist/primitives/SelectItem.cjs +14 -0
- package/dist/primitives/SelectItem.cjs.map +1 -0
- package/dist/primitives/SelectItem.d.ts +1 -1
- package/dist/primitives/SelectItem.js +5 -0
- package/dist/primitives/SelectItem.js.map +1 -0
- package/dist/primitives/SelectLabel.cjs +14 -0
- package/dist/primitives/SelectLabel.cjs.map +1 -0
- package/dist/primitives/SelectLabel.d.ts +1 -1
- package/dist/primitives/SelectLabel.js +5 -0
- package/dist/primitives/SelectLabel.js.map +1 -0
- package/dist/primitives/SelectScrollDownButton.cjs +14 -0
- package/dist/primitives/SelectScrollDownButton.cjs.map +1 -0
- package/dist/primitives/SelectScrollDownButton.d.ts +1 -1
- package/dist/primitives/SelectScrollDownButton.js +5 -0
- package/dist/primitives/SelectScrollDownButton.js.map +1 -0
- package/dist/primitives/SelectScrollUpButton.cjs +14 -0
- package/dist/primitives/SelectScrollUpButton.cjs.map +1 -0
- package/dist/primitives/SelectScrollUpButton.d.ts +1 -1
- package/dist/primitives/SelectScrollUpButton.js +5 -0
- package/dist/primitives/SelectScrollUpButton.js.map +1 -0
- package/dist/primitives/SelectSeparator.cjs +14 -0
- package/dist/primitives/SelectSeparator.cjs.map +1 -0
- package/dist/primitives/SelectSeparator.d.ts +1 -1
- package/dist/primitives/SelectSeparator.js +5 -0
- package/dist/primitives/SelectSeparator.js.map +1 -0
- package/dist/primitives/SelectTrigger.cjs +14 -0
- package/dist/primitives/SelectTrigger.cjs.map +1 -0
- package/dist/primitives/SelectTrigger.d.ts +1 -1
- package/dist/primitives/SelectTrigger.js +5 -0
- package/dist/primitives/SelectTrigger.js.map +1 -0
- package/dist/primitives/SelectValue.cjs +14 -0
- package/dist/primitives/SelectValue.cjs.map +1 -0
- package/dist/primitives/SelectValue.d.ts +1 -1
- package/dist/primitives/SelectValue.js +5 -0
- package/dist/primitives/SelectValue.js.map +1 -0
- package/dist/primitives/Separator.cjs +14 -0
- package/dist/primitives/Separator.cjs.map +1 -0
- package/dist/primitives/Separator.d.ts +1 -1
- package/dist/primitives/Separator.js +5 -0
- package/dist/primitives/Separator.js.map +1 -0
- package/dist/primitives/Slider.cjs +14 -0
- package/dist/primitives/Slider.cjs.map +1 -0
- package/dist/primitives/Slider.d.ts +1 -1
- package/dist/primitives/Slider.js +5 -0
- package/dist/primitives/Slider.js.map +1 -0
- package/dist/primitives/Switch.cjs +14 -0
- package/dist/primitives/Switch.cjs.map +1 -0
- package/dist/primitives/Switch.d.ts +1 -1
- package/dist/primitives/Switch.js +5 -0
- package/dist/primitives/Switch.js.map +1 -0
- package/dist/primitives/Tabs.cjs +14 -0
- package/dist/primitives/Tabs.cjs.map +1 -0
- package/dist/primitives/Tabs.d.ts +1 -1
- package/dist/primitives/Tabs.js +5 -0
- package/dist/primitives/Tabs.js.map +1 -0
- package/dist/primitives/TabsContent.cjs +14 -0
- package/dist/primitives/TabsContent.cjs.map +1 -0
- package/dist/primitives/TabsContent.d.ts +1 -1
- package/dist/primitives/TabsContent.js +5 -0
- package/dist/primitives/TabsContent.js.map +1 -0
- package/dist/primitives/TabsList.cjs +14 -0
- package/dist/primitives/TabsList.cjs.map +1 -0
- package/dist/primitives/TabsList.d.ts +1 -1
- package/dist/primitives/TabsList.js +5 -0
- package/dist/primitives/TabsList.js.map +1 -0
- package/dist/primitives/TabsTrigger.cjs +14 -0
- package/dist/primitives/TabsTrigger.cjs.map +1 -0
- package/dist/primitives/TabsTrigger.d.ts +1 -1
- package/dist/primitives/TabsTrigger.js +5 -0
- package/dist/primitives/TabsTrigger.js.map +1 -0
- package/dist/primitives/Textarea.cjs +14 -0
- package/dist/primitives/Textarea.cjs.map +1 -0
- package/dist/primitives/Textarea.d.ts +1 -1
- package/dist/primitives/Textarea.js +5 -0
- package/dist/primitives/Textarea.js.map +1 -0
- package/dist/primitives/Toaster.cjs +14 -0
- package/dist/primitives/Toaster.cjs.map +1 -0
- package/dist/primitives/Toaster.d.ts +1 -1
- package/dist/primitives/Toaster.js +5 -0
- package/dist/primitives/Toaster.js.map +1 -0
- package/dist/primitives/Tooltip.cjs +14 -0
- package/dist/primitives/Tooltip.cjs.map +1 -0
- package/dist/primitives/Tooltip.d.ts +1 -1
- package/dist/primitives/Tooltip.js +5 -0
- package/dist/primitives/Tooltip.js.map +1 -0
- package/dist/primitives/TooltipContent.cjs +14 -0
- package/dist/primitives/TooltipContent.cjs.map +1 -0
- package/dist/primitives/TooltipContent.d.ts +1 -1
- package/dist/primitives/TooltipContent.js +5 -0
- package/dist/primitives/TooltipContent.js.map +1 -0
- package/dist/primitives/TooltipProvider.cjs +14 -0
- package/dist/primitives/TooltipProvider.cjs.map +1 -0
- package/dist/primitives/TooltipProvider.d.ts +1 -1
- package/dist/primitives/TooltipProvider.js +5 -0
- package/dist/primitives/TooltipProvider.js.map +1 -0
- package/dist/primitives/TooltipTrigger.cjs +14 -0
- package/dist/primitives/TooltipTrigger.cjs.map +1 -0
- package/dist/primitives/TooltipTrigger.d.ts +1 -1
- package/dist/primitives/TooltipTrigger.js +5 -0
- package/dist/primitives/TooltipTrigger.js.map +1 -0
- package/dist/primitives/badgeVariants.cjs +14 -0
- package/dist/primitives/badgeVariants.cjs.map +1 -0
- package/dist/primitives/badgeVariants.d.ts +1 -1
- package/dist/primitives/badgeVariants.js +5 -0
- package/dist/primitives/badgeVariants.js.map +1 -0
- package/dist/primitives/buttonVariants.cjs +14 -0
- package/dist/primitives/buttonVariants.cjs.map +1 -0
- package/dist/primitives/buttonVariants.d.ts +1 -1
- package/dist/primitives/buttonVariants.js +5 -0
- package/dist/primitives/buttonVariants.js.map +1 -0
- package/dist/primitives/index.cjs +370 -0
- package/dist/primitives/index.cjs.map +1 -0
- package/dist/primitives/index.d.ts +1 -1
- package/dist/primitives/index.js +5 -0
- package/dist/primitives/index.js.map +1 -0
- package/dist/primitives/toast.cjs +14 -0
- package/dist/primitives/toast.cjs.map +1 -0
- package/dist/primitives/toast.d.ts +1 -1
- package/dist/primitives/toast.js +5 -0
- package/dist/primitives/toast.js.map +1 -0
- package/dist/product/index.cjs +284 -35
- package/dist/product/index.cjs.map +1 -1
- package/dist/product/index.d.ts +1 -0
- package/dist/product/index.js +264 -9
- package/dist/product/index.js.map +1 -1
- package/dist/product/menu/index.d.ts +1 -1
- package/dist/theme.css +160 -0
- package/package.json +32 -84
- package/dist/backends/shadcn/aspect-ratio.d.ts +0 -4
- package/dist/backends/shadcn/avatar.d.ts +0 -6
- package/dist/backends/shadcn/badge.d.ts +0 -9
- package/dist/backends/shadcn/button.d.ts +0 -19
- package/dist/backends/shadcn/card.d.ts +0 -9
- package/dist/backends/shadcn/checkbox.d.ts +0 -9
- package/dist/backends/shadcn/collapsible.d.ts +0 -5
- package/dist/backends/shadcn/command.d.ts +0 -80
- package/dist/backends/shadcn/dialog.d.ts +0 -15
- package/dist/backends/shadcn/dropdown-menu.d.ts +0 -34
- package/dist/backends/shadcn/index.d.ts +0 -23
- package/dist/backends/shadcn/input.d.ts +0 -11
- package/dist/backends/shadcn/label.d.ts +0 -4
- package/dist/backends/shadcn/popover.d.ts +0 -7
- package/dist/backends/shadcn/progress.d.ts +0 -4
- package/dist/backends/shadcn/scroll-area.d.ts +0 -5
- package/dist/backends/shadcn/select.d.ts +0 -13
- package/dist/backends/shadcn/separator.d.ts +0 -4
- package/dist/backends/shadcn/slider.d.ts +0 -4
- package/dist/backends/shadcn/switch.d.ts +0 -4
- package/dist/backends/shadcn/tabs.d.ts +0 -7
- package/dist/backends/shadcn/textarea.d.ts +0 -4
- package/dist/backends/shadcn/toaster.d.ts +0 -10
- package/dist/backends/shadcn/tooltip.d.ts +0 -7
- package/dist/backends/shadcn/utils.d.ts +0 -8
- package/dist/billing.cjs +0 -15
- package/dist/billing.cjs.map +0 -1
- package/dist/billing.d.ts +0 -1
- package/dist/billing.js +0 -4
- package/dist/billing.js.map +0 -1
- package/dist/chunk-5CZOYONP.js +0 -343
- package/dist/chunk-5CZOYONP.js.map +0 -1
- package/dist/chunk-GWNNLYX4.cjs +0 -353
- package/dist/chunk-GWNNLYX4.cjs.map +0 -1
- package/dist/network.cjs +0 -15
- package/dist/network.cjs.map +0 -1
- package/dist/network.d.ts +0 -1
- package/dist/network.js +0 -4
- package/dist/network.js.map +0 -1
- package/dist/product/menu/DropdownMenu.d.ts +0 -29
- package/dist/wallet.cjs +0 -15
- package/dist/wallet.cjs.map +0 -1
- package/dist/wallet.d.ts +0 -1
- package/dist/wallet.js +0 -4
- package/dist/wallet.js.map +0 -1
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import * as ProgressPrimitive from '@radix-ui/react-progress';
|
|
2
|
-
import * as React from 'react';
|
|
3
|
-
declare const Progress: React.ForwardRefExoticComponent<Omit<ProgressPrimitive.ProgressProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
4
|
-
export { Progress };
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area';
|
|
2
|
-
import * as React from 'react';
|
|
3
|
-
declare const ScrollBar: React.ForwardRefExoticComponent<Omit<ScrollAreaPrimitive.ScrollAreaScrollbarProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
4
|
-
declare const ScrollArea: React.ForwardRefExoticComponent<Omit<ScrollAreaPrimitive.ScrollAreaProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
5
|
-
export { ScrollArea, ScrollBar };
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import * as SelectPrimitive from '@radix-ui/react-select';
|
|
2
|
-
import * as React from 'react';
|
|
3
|
-
declare const Select: React.FC<SelectPrimitive.SelectProps>;
|
|
4
|
-
declare const SelectGroup: React.ForwardRefExoticComponent<SelectPrimitive.SelectGroupProps & React.RefAttributes<HTMLDivElement>>;
|
|
5
|
-
declare const SelectValue: React.ForwardRefExoticComponent<SelectPrimitive.SelectValueProps & React.RefAttributes<HTMLSpanElement>>;
|
|
6
|
-
declare const SelectTrigger: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectTriggerProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
|
|
7
|
-
declare const SelectScrollUpButton: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectScrollUpButtonProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
8
|
-
declare const SelectScrollDownButton: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectScrollDownButtonProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
9
|
-
declare const SelectContent: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
10
|
-
declare const SelectLabel: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectLabelProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
11
|
-
declare const SelectItem: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectItemProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
12
|
-
declare const SelectSeparator: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectSeparatorProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
13
|
-
export { Select, SelectGroup, SelectValue, SelectTrigger, SelectContent, SelectLabel, SelectItem, SelectSeparator, SelectScrollUpButton, SelectScrollDownButton, };
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import * as SeparatorPrimitive from '@radix-ui/react-separator';
|
|
2
|
-
import * as React from 'react';
|
|
3
|
-
declare const Separator: React.ForwardRefExoticComponent<Omit<SeparatorPrimitive.SeparatorProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
4
|
-
export { Separator };
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import * as SliderPrimitive from '@radix-ui/react-slider';
|
|
2
|
-
import * as React from 'react';
|
|
3
|
-
declare const Slider: React.ForwardRefExoticComponent<Omit<SliderPrimitive.SliderProps & React.RefAttributes<HTMLSpanElement>, "ref"> & React.RefAttributes<HTMLSpanElement>>;
|
|
4
|
-
export { Slider };
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import * as SwitchPrimitive from '@radix-ui/react-switch';
|
|
2
|
-
import * as React from 'react';
|
|
3
|
-
declare const Switch: React.ForwardRefExoticComponent<Omit<SwitchPrimitive.SwitchProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
|
|
4
|
-
export { Switch };
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import * as TabsPrimitive from '@radix-ui/react-tabs';
|
|
2
|
-
import * as React from 'react';
|
|
3
|
-
declare const Tabs: React.ForwardRefExoticComponent<Omit<TabsPrimitive.TabsProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
4
|
-
declare const TabsList: React.ForwardRefExoticComponent<Omit<TabsPrimitive.TabsListProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
5
|
-
declare const TabsTrigger: React.ForwardRefExoticComponent<Omit<TabsPrimitive.TabsTriggerProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
|
|
6
|
-
declare const TabsContent: React.ForwardRefExoticComponent<Omit<TabsPrimitive.TabsContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
7
|
-
export { Tabs, TabsList, TabsTrigger, TabsContent };
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
|
-
/** Textarea — standard-token multiline field. */
|
|
3
|
-
declare const Textarea: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.TextareaHTMLAttributes<HTMLTextAreaElement>, HTMLTextAreaElement>, "ref"> & React.RefAttributes<HTMLTextAreaElement>>;
|
|
4
|
-
export { Textarea };
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { toast, type ToasterProps } from 'sonner';
|
|
2
|
-
/**
|
|
3
|
-
* Toaster — Sonner surface bound to STANDARD tokens. The prior version used
|
|
4
|
-
* app-private classes (`bg-level-2`, `text-primary-fg`, `border-muted-3`); here
|
|
5
|
-
* the toast surface maps to `--popover`, borders to `--border`, and buttons to
|
|
6
|
-
* the primary/muted tokens via Sonner's CSS-variable API, so it matches the host
|
|
7
|
-
* theme (light/dark) with no undefined tokens.
|
|
8
|
-
*/
|
|
9
|
-
declare const Toaster: ({ className, ...props }: ToasterProps) => import("react/jsx-runtime").JSX.Element;
|
|
10
|
-
export { Toaster, toast };
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import * as TooltipPrimitive from '@radix-ui/react-tooltip';
|
|
2
|
-
import * as React from 'react';
|
|
3
|
-
declare const TooltipProvider: React.FC<TooltipPrimitive.TooltipProviderProps>;
|
|
4
|
-
declare const Tooltip: React.FC<TooltipPrimitive.TooltipProps>;
|
|
5
|
-
declare const TooltipTrigger: React.ForwardRefExoticComponent<TooltipPrimitive.TooltipTriggerProps & React.RefAttributes<HTMLButtonElement>>;
|
|
6
|
-
declare const TooltipContent: React.ForwardRefExoticComponent<Omit<TooltipPrimitive.TooltipContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
7
|
-
export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Local `cn` handle for the shadcn backend.
|
|
3
|
-
*
|
|
4
|
-
* Every component in this backend merges classes through the ONE composer in the
|
|
5
|
-
* shared core; re-exporting it here keeps each component's import local
|
|
6
|
-
* (`./utils`) and the merge logic single-sourced.
|
|
7
|
-
*/
|
|
8
|
-
export { cn } from '../../core/cn';
|
package/dist/billing.cjs
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
'use strict';
|
|
3
|
-
|
|
4
|
-
var billing = require('@hanzo/ui-shadcn/billing');
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
Object.keys(billing).forEach(function (k) {
|
|
9
|
-
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
|
|
10
|
-
enumerable: true,
|
|
11
|
-
get: function () { return billing[k]; }
|
|
12
|
-
});
|
|
13
|
-
});
|
|
14
|
-
//# sourceMappingURL=billing.cjs.map
|
|
15
|
-
//# sourceMappingURL=billing.cjs.map
|
package/dist/billing.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"billing.cjs","sourcesContent":[]}
|
package/dist/billing.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from '@hanzo/ui-shadcn/billing';
|
package/dist/billing.js
DELETED
package/dist/billing.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"billing.js","sourcesContent":[]}
|
package/dist/chunk-5CZOYONP.js
DELETED
|
@@ -1,343 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
import { useEmit, labelOf } from './chunk-FVQXROBK.js';
|
|
3
|
-
import { YStack, XStack, Text, Theme, useThemeName, Portal, useControllableState, Button } from '@hanzo/gui';
|
|
4
|
-
import { Check, ChevronRight, ChevronDown } from '@hanzogui/lucide-icons-2';
|
|
5
|
-
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
6
|
-
import { useRef, useState, useCallback, useLayoutEffect, useEffect } from 'react';
|
|
7
|
-
|
|
8
|
-
var ITEM_MIN_HEIGHT = 30;
|
|
9
|
-
var ITEM_RADIUS = 7;
|
|
10
|
-
var ITEM_PX = 8;
|
|
11
|
-
var ITEM_GAP = 8;
|
|
12
|
-
var ICON_SLOT = 16;
|
|
13
|
-
var PANEL_RADIUS = 12;
|
|
14
|
-
var PANEL_PAD = 4;
|
|
15
|
-
var PANEL_GAP = 2;
|
|
16
|
-
var SEP_MARGIN = 4;
|
|
17
|
-
var FONT_LABEL = 13;
|
|
18
|
-
var FONT_MUTED = 11;
|
|
19
|
-
var FONT_SHORTCUT = 12;
|
|
20
|
-
var ACCENT = "var(--hanzo-accent, #8b5cf6)";
|
|
21
|
-
var ACCENT_SOFT = "var(--hanzo-accent-soft, rgba(139,92,246,0.16))";
|
|
22
|
-
var DANGER = "var(--hanzo-danger, #ef4444)";
|
|
23
|
-
function MenuPanel({
|
|
24
|
-
children,
|
|
25
|
-
minWidth = 200,
|
|
26
|
-
maxHeight = 360,
|
|
27
|
-
onKeyDown,
|
|
28
|
-
panelRef,
|
|
29
|
-
...rest
|
|
30
|
-
}) {
|
|
31
|
-
return /* @__PURE__ */ jsx(
|
|
32
|
-
YStack,
|
|
33
|
-
{
|
|
34
|
-
ref: panelRef,
|
|
35
|
-
role: "menu",
|
|
36
|
-
bg: "$color2",
|
|
37
|
-
borderColor: "$borderColor",
|
|
38
|
-
borderWidth: 1,
|
|
39
|
-
rounded: PANEL_RADIUS,
|
|
40
|
-
p: PANEL_PAD,
|
|
41
|
-
gap: PANEL_GAP,
|
|
42
|
-
minW: minWidth,
|
|
43
|
-
maxH: maxHeight,
|
|
44
|
-
overflow: "scroll",
|
|
45
|
-
shadowColor: "rgba(0,0,0,0.45)",
|
|
46
|
-
shadowRadius: 20,
|
|
47
|
-
shadowOffset: { width: 0, height: 10 },
|
|
48
|
-
onKeyDown,
|
|
49
|
-
...rest,
|
|
50
|
-
children
|
|
51
|
-
}
|
|
52
|
-
);
|
|
53
|
-
}
|
|
54
|
-
function MenuItemView({
|
|
55
|
-
icon,
|
|
56
|
-
label,
|
|
57
|
-
description,
|
|
58
|
-
shortcut,
|
|
59
|
-
selected = false,
|
|
60
|
-
disabled = false,
|
|
61
|
-
destructive = false,
|
|
62
|
-
hasSubmenu = false,
|
|
63
|
-
onSelect
|
|
64
|
-
}) {
|
|
65
|
-
const track = useEmit();
|
|
66
|
-
const choose = () => {
|
|
67
|
-
track({ component: "MenuItem", action: "select", id: labelOf(label), value: selected });
|
|
68
|
-
onSelect();
|
|
69
|
-
};
|
|
70
|
-
const press = () => {
|
|
71
|
-
if (!disabled) choose();
|
|
72
|
-
};
|
|
73
|
-
const onKeyDown = (e) => {
|
|
74
|
-
if (disabled) return;
|
|
75
|
-
if (e.key === "Enter" || e.key === " ") {
|
|
76
|
-
e.preventDefault();
|
|
77
|
-
choose();
|
|
78
|
-
}
|
|
79
|
-
};
|
|
80
|
-
const labelColor = destructive ? DANGER : "$color12";
|
|
81
|
-
return /* @__PURE__ */ jsxs(
|
|
82
|
-
XStack,
|
|
83
|
-
{
|
|
84
|
-
role: "menuitem",
|
|
85
|
-
tabIndex: disabled ? -1 : 0,
|
|
86
|
-
"aria-disabled": disabled || void 0,
|
|
87
|
-
items: "center",
|
|
88
|
-
gap: ITEM_GAP,
|
|
89
|
-
px: ITEM_PX,
|
|
90
|
-
minH: ITEM_MIN_HEIGHT,
|
|
91
|
-
rounded: ITEM_RADIUS,
|
|
92
|
-
cursor: disabled ? "default" : "pointer",
|
|
93
|
-
opacity: disabled ? 0.4 : 1,
|
|
94
|
-
select: "none",
|
|
95
|
-
style: { outline: "none" },
|
|
96
|
-
hoverStyle: disabled ? {} : { bg: ACCENT_SOFT },
|
|
97
|
-
pressStyle: disabled ? {} : { bg: ACCENT_SOFT },
|
|
98
|
-
focusStyle: disabled ? {} : { bg: ACCENT_SOFT },
|
|
99
|
-
onPress: press,
|
|
100
|
-
onKeyDown,
|
|
101
|
-
children: [
|
|
102
|
-
/* @__PURE__ */ jsx(XStack, { width: ICON_SLOT, height: ICON_SLOT, items: "center", justify: "center", shrink: 0, children: icon ? /* @__PURE__ */ jsx(XStack, { items: "center", justify: "center", opacity: destructive ? 1 : 0.9, style: destructive ? { color: DANGER } : void 0, children: icon }) : null }),
|
|
103
|
-
/* @__PURE__ */ jsxs(YStack, { flex: 1, minW: 0, children: [
|
|
104
|
-
/* @__PURE__ */ jsx(Text, { fontSize: FONT_LABEL, lineHeight: 18, color: labelColor, numberOfLines: 1, children: label }),
|
|
105
|
-
description ? /* @__PURE__ */ jsx(Text, { fontSize: FONT_MUTED, lineHeight: 14, color: "$color11", numberOfLines: 1, children: description }) : null
|
|
106
|
-
] }),
|
|
107
|
-
shortcut ? /* @__PURE__ */ jsx(Text, { fontSize: FONT_SHORTCUT, color: "$color11", shrink: 0, children: shortcut }) : null,
|
|
108
|
-
selected ? /* @__PURE__ */ jsx(Check, { size: 14, color: ACCENT }) : null,
|
|
109
|
-
hasSubmenu ? /* @__PURE__ */ jsx(ChevronRight, { size: 14, color: "var(--hanzo-muted, currentColor)", opacity: 0.6 }) : null
|
|
110
|
-
]
|
|
111
|
-
}
|
|
112
|
-
);
|
|
113
|
-
}
|
|
114
|
-
function MenuSeparatorView() {
|
|
115
|
-
return /* @__PURE__ */ jsx(YStack, { height: 1, bg: "$borderColor", my: SEP_MARGIN, mx: SEP_MARGIN, role: "separator" });
|
|
116
|
-
}
|
|
117
|
-
function MenuLabelView({ children }) {
|
|
118
|
-
return /* @__PURE__ */ jsx(
|
|
119
|
-
Text,
|
|
120
|
-
{
|
|
121
|
-
fontSize: FONT_MUTED,
|
|
122
|
-
color: "$color11",
|
|
123
|
-
px: ITEM_PX,
|
|
124
|
-
py: SEP_MARGIN,
|
|
125
|
-
textTransform: "uppercase",
|
|
126
|
-
letterSpacing: 0.4,
|
|
127
|
-
select: "none",
|
|
128
|
-
children
|
|
129
|
-
}
|
|
130
|
-
);
|
|
131
|
-
}
|
|
132
|
-
function renderMenuItems(items, close) {
|
|
133
|
-
return items.map((it, i) => {
|
|
134
|
-
if (it.type === "separator") return /* @__PURE__ */ jsx(MenuSeparatorView, {}, it.key ?? `sep-${i}`);
|
|
135
|
-
if (it.type === "label") return /* @__PURE__ */ jsx(MenuLabelView, { children: it.label }, it.key ?? `lbl-${i}`);
|
|
136
|
-
const { key, onSelect, closeOnSelect = true, ...rest } = it;
|
|
137
|
-
return /* @__PURE__ */ jsx(
|
|
138
|
-
MenuItemView,
|
|
139
|
-
{
|
|
140
|
-
...rest,
|
|
141
|
-
onSelect: () => {
|
|
142
|
-
onSelect();
|
|
143
|
-
if (closeOnSelect) close?.();
|
|
144
|
-
}
|
|
145
|
-
},
|
|
146
|
-
key
|
|
147
|
-
);
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
function PortalTheme({ name, children }) {
|
|
151
|
-
return /* @__PURE__ */ jsx(Theme, { name, children });
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
// src/product/menu/roving.ts
|
|
155
|
-
function menuKeyDown(e, onClose) {
|
|
156
|
-
if (e.key === "Escape") {
|
|
157
|
-
onClose?.();
|
|
158
|
-
return;
|
|
159
|
-
}
|
|
160
|
-
if (e.key !== "ArrowDown" && e.key !== "ArrowUp" && e.key !== "Home" && e.key !== "End") return;
|
|
161
|
-
if (typeof document === "undefined") return;
|
|
162
|
-
const panel = e.currentTarget;
|
|
163
|
-
const items = Array.from(
|
|
164
|
-
panel.querySelectorAll('[role="menuitem"]:not([aria-disabled="true"])')
|
|
165
|
-
);
|
|
166
|
-
if (items.length === 0) return;
|
|
167
|
-
e.preventDefault();
|
|
168
|
-
const active = document.activeElement;
|
|
169
|
-
const current = active ? items.indexOf(active) : -1;
|
|
170
|
-
let next;
|
|
171
|
-
if (e.key === "Home") next = 0;
|
|
172
|
-
else if (e.key === "End") next = items.length - 1;
|
|
173
|
-
else if (e.key === "ArrowDown") next = current < 0 ? 0 : (current + 1) % items.length;
|
|
174
|
-
else next = current <= 0 ? items.length - 1 : current - 1;
|
|
175
|
-
items[next]?.focus();
|
|
176
|
-
}
|
|
177
|
-
var EDGE = 8;
|
|
178
|
-
function FloatingMenu({
|
|
179
|
-
open,
|
|
180
|
-
onClose,
|
|
181
|
-
anchorRect,
|
|
182
|
-
anchorEl,
|
|
183
|
-
gap = 4,
|
|
184
|
-
minWidth = 200,
|
|
185
|
-
maxHeight,
|
|
186
|
-
autoFocus = true,
|
|
187
|
-
children
|
|
188
|
-
}) {
|
|
189
|
-
const themeName = useThemeName();
|
|
190
|
-
const panelRef = useRef(null);
|
|
191
|
-
const [pos, setPos] = useState(null);
|
|
192
|
-
const setPanel = useCallback((n) => {
|
|
193
|
-
panelRef.current = n;
|
|
194
|
-
}, []);
|
|
195
|
-
const place = useCallback(() => {
|
|
196
|
-
if (typeof window === "undefined") return;
|
|
197
|
-
const a = anchorRect();
|
|
198
|
-
if (!a) return;
|
|
199
|
-
const node = panelRef.current;
|
|
200
|
-
const w = node?.offsetWidth || minWidth;
|
|
201
|
-
const h = node?.offsetHeight || 0;
|
|
202
|
-
let left = a.left;
|
|
203
|
-
let top = a.bottom + gap;
|
|
204
|
-
if (left + w > window.innerWidth - EDGE) left = Math.max(EDGE, window.innerWidth - w - EDGE);
|
|
205
|
-
if (h && top + h > window.innerHeight - EDGE) {
|
|
206
|
-
const above = a.top - gap - h;
|
|
207
|
-
top = above >= EDGE ? above : Math.max(EDGE, window.innerHeight - h - EDGE);
|
|
208
|
-
}
|
|
209
|
-
setPos({ left, top });
|
|
210
|
-
}, [anchorRect, gap, minWidth]);
|
|
211
|
-
useLayoutEffect(() => {
|
|
212
|
-
if (!open) {
|
|
213
|
-
setPos(null);
|
|
214
|
-
return;
|
|
215
|
-
}
|
|
216
|
-
place();
|
|
217
|
-
if (autoFocus) panelRef.current?.focus?.();
|
|
218
|
-
}, [open, place, autoFocus]);
|
|
219
|
-
useEffect(() => {
|
|
220
|
-
if (!open || typeof document === "undefined") return;
|
|
221
|
-
const onPointerDown = (e) => {
|
|
222
|
-
const t = e.target;
|
|
223
|
-
if (panelRef.current?.contains(t)) return;
|
|
224
|
-
const anchor = anchorEl?.();
|
|
225
|
-
if (anchor && anchor.contains(t)) return;
|
|
226
|
-
onClose();
|
|
227
|
-
};
|
|
228
|
-
const onKey = (e) => {
|
|
229
|
-
if (e.key === "Escape") onClose();
|
|
230
|
-
};
|
|
231
|
-
document.addEventListener("pointerdown", onPointerDown, true);
|
|
232
|
-
document.addEventListener("keydown", onKey, true);
|
|
233
|
-
window.addEventListener("scroll", onClose, true);
|
|
234
|
-
window.addEventListener("resize", onClose);
|
|
235
|
-
window.addEventListener("blur", onClose);
|
|
236
|
-
return () => {
|
|
237
|
-
document.removeEventListener("pointerdown", onPointerDown, true);
|
|
238
|
-
document.removeEventListener("keydown", onKey, true);
|
|
239
|
-
window.removeEventListener("scroll", onClose, true);
|
|
240
|
-
window.removeEventListener("resize", onClose);
|
|
241
|
-
window.removeEventListener("blur", onClose);
|
|
242
|
-
};
|
|
243
|
-
}, [open, onClose, anchorEl]);
|
|
244
|
-
if (!open) return null;
|
|
245
|
-
return /* @__PURE__ */ jsx(Portal, { children: /* @__PURE__ */ jsx(PortalTheme, { name: themeName, children: /* @__PURE__ */ jsx(
|
|
246
|
-
MenuPanel,
|
|
247
|
-
{
|
|
248
|
-
panelRef: setPanel,
|
|
249
|
-
minWidth,
|
|
250
|
-
maxHeight,
|
|
251
|
-
tabIndex: -1,
|
|
252
|
-
onKeyDown: (e) => menuKeyDown(e, onClose),
|
|
253
|
-
style: {
|
|
254
|
-
position: "fixed",
|
|
255
|
-
left: pos?.left ?? 0,
|
|
256
|
-
top: pos?.top ?? 0,
|
|
257
|
-
zIndex: 1e5,
|
|
258
|
-
visibility: pos ? "visible" : "hidden"
|
|
259
|
-
},
|
|
260
|
-
children
|
|
261
|
-
}
|
|
262
|
-
) }) });
|
|
263
|
-
}
|
|
264
|
-
function DropdownMenu({
|
|
265
|
-
trigger,
|
|
266
|
-
items,
|
|
267
|
-
open,
|
|
268
|
-
defaultOpen = false,
|
|
269
|
-
onOpenChange,
|
|
270
|
-
minWidth = 200,
|
|
271
|
-
maxHeight
|
|
272
|
-
}) {
|
|
273
|
-
const [isOpen, setOpen] = useControllableState({
|
|
274
|
-
prop: open,
|
|
275
|
-
defaultProp: defaultOpen,
|
|
276
|
-
onChange: onOpenChange
|
|
277
|
-
});
|
|
278
|
-
const anchorRef = useRef(null);
|
|
279
|
-
const anchorRect = useCallback(() => anchorRef.current?.getBoundingClientRect() ?? null, []);
|
|
280
|
-
const anchorEl = useCallback(() => anchorRef.current, []);
|
|
281
|
-
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
282
|
-
/* @__PURE__ */ jsx(XStack, { ref: anchorRef, self: "flex-start", cursor: "pointer", onPress: () => setOpen(!isOpen), children: trigger }),
|
|
283
|
-
/* @__PURE__ */ jsx(
|
|
284
|
-
FloatingMenu,
|
|
285
|
-
{
|
|
286
|
-
open: isOpen,
|
|
287
|
-
onClose: () => setOpen(false),
|
|
288
|
-
anchorRect,
|
|
289
|
-
anchorEl,
|
|
290
|
-
minWidth,
|
|
291
|
-
maxHeight,
|
|
292
|
-
children: renderMenuItems(items, () => setOpen(false))
|
|
293
|
-
}
|
|
294
|
-
)
|
|
295
|
-
] });
|
|
296
|
-
}
|
|
297
|
-
function SelectMenu({
|
|
298
|
-
options,
|
|
299
|
-
value,
|
|
300
|
-
onChange,
|
|
301
|
-
allLabel = "All",
|
|
302
|
-
icon,
|
|
303
|
-
minWidth = 130,
|
|
304
|
-
required,
|
|
305
|
-
minHeight,
|
|
306
|
-
disabled,
|
|
307
|
-
ariaLabel
|
|
308
|
-
}) {
|
|
309
|
-
const active = value === null ? null : options.find((o) => o.key === value) ?? null;
|
|
310
|
-
const triggerLabel = active ? active.label : allLabel;
|
|
311
|
-
const items = [
|
|
312
|
-
...required ? [] : [{ key: "__all__", label: allLabel, selected: value === null, onSelect: () => onChange(null) }],
|
|
313
|
-
...options.map((o) => ({ key: o.key, label: o.label, selected: value === o.key, onSelect: () => onChange(o.key) }))
|
|
314
|
-
];
|
|
315
|
-
return /* @__PURE__ */ jsx(
|
|
316
|
-
DropdownMenu,
|
|
317
|
-
{
|
|
318
|
-
minWidth: Math.max(minWidth, 160),
|
|
319
|
-
trigger: /* @__PURE__ */ jsx(
|
|
320
|
-
Button,
|
|
321
|
-
{
|
|
322
|
-
size: minHeight && minHeight >= 40 ? "$4" : "$2",
|
|
323
|
-
minW: minWidth,
|
|
324
|
-
minH: minHeight,
|
|
325
|
-
disabled,
|
|
326
|
-
"aria-label": ariaLabel,
|
|
327
|
-
justify: "space-between",
|
|
328
|
-
borderWidth: 1,
|
|
329
|
-
borderColor: "$borderColor",
|
|
330
|
-
bg: !required && value !== null ? "$color5" : "transparent",
|
|
331
|
-
icon,
|
|
332
|
-
iconAfter: /* @__PURE__ */ jsx(ChevronDown, { size: 14, opacity: 0.6 }),
|
|
333
|
-
children: /* @__PURE__ */ jsx(Text, { fontSize: "$2", color: "$color12", numberOfLines: 1, flex: 1, children: triggerLabel })
|
|
334
|
-
}
|
|
335
|
-
),
|
|
336
|
-
items
|
|
337
|
-
}
|
|
338
|
-
);
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
export { DropdownMenu, FloatingMenu, MenuItemView, MenuLabelView, MenuPanel, MenuSeparatorView, PortalTheme, SelectMenu, renderMenuItems };
|
|
342
|
-
//# sourceMappingURL=chunk-5CZOYONP.js.map
|
|
343
|
-
//# sourceMappingURL=chunk-5CZOYONP.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/product/menu/items.tsx","../src/product/menu/portal-theme.tsx","../src/product/menu/roving.ts","../src/product/menu/FloatingMenu.tsx","../src/product/menu/DropdownMenu.tsx","../src/product/SelectMenu.tsx"],"names":["jsx","useRef","useCallback","jsxs","XStack","Text"],"mappings":"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","file":"chunk-5CZOYONP.js","sourcesContent":["'use client'\n\n/**\n * The ONE menu-item spec — every menu across the fleet renders through these\n * presentational primitives, so DropdownMenu, ContextMenu, SelectMenu and ComboBox\n * are pixel-identical. Geometry is literal px on a strict 8-grid (never random);\n * colour is theme-adaptive tokens ($color2/$color11/$color12/$borderColor) so light\n * and dark both work, with the single purple accent supplied by the brand CSS vars.\n *\n * Style props use the @hanzo/gui config shorthands (bg/items/justify/px/py/p/mx/my/\n * minW/maxH/rounded/select/shrink) — the config omits the longhand aliases.\n *\n * Panel — bg $color2 (#111 dark), hairline border, radius 12, inner pad 4, subtle\n * border+ambient elevation.\n * Item — height 30 (28–32 band), px 8, gap 8, radius 7; icon in a fixed 16px slot\n * on the left; label 13px $color12; right affordance (shortcut / check /\n * chevron) right-aligned. States: hover/active/focus → accent-soft, focus\n * visible; selected → check + purple; disabled → muted, no hover.\n * Separator — 1px hairline, 4px vertical margin.\n * Label — 11px uppercase muted section header, px 8.\n */\nimport type { ReactNode, KeyboardEvent } from 'react'\nimport { Text, XStack, YStack } from '@hanzo/gui'\nimport { Check, ChevronRight } from '@hanzogui/lucide-icons-2'\n\n// ── Geometry — literal px, 8-grid ──────────────────────────────────────────────\nconst ITEM_MIN_HEIGHT = 30\nconst ITEM_RADIUS = 7\nconst ITEM_PX = 8\nconst ITEM_GAP = 8\nconst ICON_SLOT = 16\nexport const PANEL_RADIUS = 12\nexport const PANEL_PAD = 4\nconst PANEL_GAP = 2\nconst SEP_MARGIN = 4\nconst FONT_LABEL = 13\nconst FONT_MUTED = 11\nconst FONT_SHORTCUT = 12\n\n// ── Colour — brand purple accent via CSS vars (fallbacks keep it correct even when\n// @hanzo/brand is not loaded, e.g. a bare Vite/Tauri host); everything else uses\n// theme-adaptive Tamagui tokens. ──────────────────────────────────────────────\nconst ACCENT = 'var(--hanzo-accent, #8b5cf6)'\nconst ACCENT_SOFT = 'var(--hanzo-accent-soft, rgba(139,92,246,0.16))'\nconst DANGER = 'var(--hanzo-danger, #ef4444)'\n\n// ── Declarative item model ──────────────────────────────────────────────────────\nexport type MenuItemSpec =\n | {\n type?: 'item'\n /** Stable key. */\n key: string\n label: string\n /** Leading Lucide icon (16px, unfilled) in the fixed left slot. */\n icon?: ReactNode\n /** Second muted line under the label (e.g. an id or hint). */\n description?: string\n /** Right-aligned shortcut / hint text (e.g. \"⌘K\"). */\n shortcut?: string\n /** Renders a right check + purple tint. */\n selected?: boolean\n disabled?: boolean\n /** Danger styling (red label/icon). */\n destructive?: boolean\n /** Renders a right chevron (submenu / drill-in affordance). */\n hasSubmenu?: boolean\n onSelect: () => void\n /** Keep the menu open after selecting (default: close). */\n closeOnSelect?: boolean\n }\n | { type: 'separator'; key?: string }\n | { type: 'label'; key?: string; label: string }\n\n// ── Surface ───────────────────────────────────────────────────────────────────\nexport function MenuPanel({\n children,\n minWidth = 200,\n maxHeight = 360,\n onKeyDown,\n panelRef,\n ...rest\n}: {\n children: ReactNode\n minWidth?: number\n maxHeight?: number\n onKeyDown?: (e: KeyboardEvent) => void\n /** Web DOM node of the panel (for measuring / edge-flip). */\n panelRef?: (node: HTMLElement | null) => void\n [key: string]: unknown\n}) {\n return (\n <YStack\n // Web DOM ref; Gui forwards it to the underlying node. Cast (not @ts-expect-error)\n // so it is env-agnostic — the ref type is strict under the pkg build, loose here.\n ref={panelRef as never}\n role=\"menu\"\n bg=\"$color2\"\n borderColor=\"$borderColor\"\n borderWidth={1}\n rounded={PANEL_RADIUS}\n p={PANEL_PAD}\n gap={PANEL_GAP}\n minW={minWidth}\n maxH={maxHeight}\n overflow=\"scroll\"\n // Subtle border + ambient elevation, minimal shadow.\n shadowColor=\"rgba(0,0,0,0.45)\"\n shadowRadius={20}\n shadowOffset={{ width: 0, height: 10 }}\n onKeyDown={onKeyDown as never}\n {...rest}\n >\n {children}\n </YStack>\n )\n}\n\n// ── Item — the ONE row ──────────────────────────────────────────────────────────\nimport { labelOf, useEmit } from '../instrument'\n\nexport function MenuItemView({\n icon,\n label,\n description,\n shortcut,\n selected = false,\n disabled = false,\n destructive = false,\n hasSubmenu = false,\n onSelect,\n}: Omit<Extract<MenuItemSpec, { type?: 'item' }>, 'key' | 'type' | 'closeOnSelect'>) {\n const track = useEmit()\n const choose = () => {\n track({ component: 'MenuItem', action: 'select', id: labelOf(label), value: selected })\n onSelect()\n }\n const press = () => {\n if (!disabled) choose()\n }\n const onKeyDown = (e: KeyboardEvent) => {\n if (disabled) return\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n choose()\n }\n }\n const labelColor = destructive ? DANGER : '$color12'\n return (\n <XStack\n role=\"menuitem\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n items=\"center\"\n gap={ITEM_GAP}\n px={ITEM_PX}\n minH={ITEM_MIN_HEIGHT}\n rounded={ITEM_RADIUS}\n cursor={disabled ? 'default' : 'pointer'}\n opacity={disabled ? 0.4 : 1}\n select=\"none\"\n style={{ outline: 'none' }}\n hoverStyle={disabled ? {} : { bg: ACCENT_SOFT as never }}\n pressStyle={disabled ? {} : { bg: ACCENT_SOFT as never }}\n focusStyle={disabled ? {} : { bg: ACCENT_SOFT as never }}\n onPress={press}\n onKeyDown={onKeyDown as never}\n >\n <XStack width={ICON_SLOT} height={ICON_SLOT} items=\"center\" justify=\"center\" shrink={0}>\n {icon ? (\n <XStack items=\"center\" justify=\"center\" opacity={destructive ? 1 : 0.9} style={destructive ? { color: DANGER } : undefined}>\n {icon}\n </XStack>\n ) : null}\n </XStack>\n\n <YStack flex={1} minW={0}>\n <Text fontSize={FONT_LABEL} lineHeight={18} color={labelColor as never} numberOfLines={1}>\n {label}\n </Text>\n {description ? (\n <Text fontSize={FONT_MUTED} lineHeight={14} color=\"$color11\" numberOfLines={1}>\n {description}\n </Text>\n ) : null}\n </YStack>\n\n {shortcut ? (\n <Text fontSize={FONT_SHORTCUT} color=\"$color11\" shrink={0}>\n {shortcut}\n </Text>\n ) : null}\n {selected ? <Check size={14} color={ACCENT} /> : null}\n {hasSubmenu ? <ChevronRight size={14} color=\"var(--hanzo-muted, currentColor)\" opacity={0.6} /> : null}\n </XStack>\n )\n}\n\n// ── Separator ───────────────────────────────────────────────────────────────────\nexport function MenuSeparatorView() {\n return <YStack height={1} bg=\"$borderColor\" my={SEP_MARGIN} mx={SEP_MARGIN} role=\"separator\" />\n}\n\n// ── Section label ────────────────────────────────────────────────────────────────\nexport function MenuLabelView({ children }: { children: ReactNode }) {\n return (\n <Text\n fontSize={FONT_MUTED}\n color=\"$color11\"\n px={ITEM_PX}\n py={SEP_MARGIN}\n textTransform=\"uppercase\"\n letterSpacing={0.4}\n select=\"none\"\n >\n {children}\n </Text>\n )\n}\n\n// ── The single render path shared by every menu ──────────────────────────────────\nexport function renderMenuItems(items: MenuItemSpec[], close?: () => void): ReactNode {\n return items.map((it, i) => {\n if (it.type === 'separator') return <MenuSeparatorView key={it.key ?? `sep-${i}`} />\n if (it.type === 'label') return <MenuLabelView key={it.key ?? `lbl-${i}`}>{it.label}</MenuLabelView>\n const { key, onSelect, closeOnSelect = true, ...rest } = it\n return (\n <MenuItemView\n key={key}\n {...rest}\n onSelect={() => {\n onSelect()\n if (closeOnSelect) close?.()\n }}\n />\n )\n })\n}\n","'use client'\n\n/**\n * PortalTheme — the ONE fix for \"themed content escapes its theme through a portal\".\n *\n * @hanzo/gui's `Popover.Content` and `Portal` render their children in a SEPARATE\n * React subtree (a Gorhom-style portal host mounted at the app root), NOT via\n * `ReactDOM.createPortal`. React context therefore does NOT flow from the trigger's\n * location to the host. Under a nested `<Theme name=\"dark\">` the portaled content\n * lands OUTSIDE that theme context and Tamagui throws \"Missing theme\" (or renders\n * unthemed).\n *\n * The fix is two-part and must stay two-part:\n * 1. At the TRIGGER site (theme context still available) capture the resolved\n * theme name with `useThemeName()`.\n * 2. INSIDE the portaled content re-apply it: `<PortalTheme name={captured}>`.\n *\n * Every portal-backed menu in this package (DropdownMenu, ContextMenu, SelectMenu,\n * ComboBox) uses this so a menu renders identically whether it is opened under the\n * root theme or under any nested `<Theme>`, light or dark.\n */\nimport type { ReactNode } from 'react'\nimport { Theme, useThemeName } from '@hanzo/gui'\n\n/** Capture the current resolved theme name at the trigger site. Re-exported so the\n * capture + re-apply pair reads from one module. */\nexport { useThemeName }\n\nexport function PortalTheme({ name, children }: { name: string; children: ReactNode }) {\n // `name` is the resolved theme name (e.g. \"dark\", or a compound \"dark_purple\").\n // Tamagui's `Theme` accepts the resolved name and reconstructs the context.\n return <Theme name={name as never}>{children}</Theme>\n}\n","'use client'\n\n/**\n * Roving keyboard focus for a menu panel — ArrowUp/Down move focus between enabled\n * `[role=\"menuitem\"]` children, Home/End jump to ends, Escape closes. Web/desktop\n * only (guards on `document`); native menus have no pointer-keyboard nav. Shared by\n * DropdownMenu and ContextMenu so navigation is identical.\n */\nimport type { KeyboardEvent } from 'react'\n\nexport function menuKeyDown(e: KeyboardEvent, onClose?: () => void): void {\n if (e.key === 'Escape') {\n onClose?.()\n return\n }\n if (e.key !== 'ArrowDown' && e.key !== 'ArrowUp' && e.key !== 'Home' && e.key !== 'End') return\n if (typeof document === 'undefined') return\n\n const panel = e.currentTarget as HTMLElement\n const items = Array.from(\n panel.querySelectorAll<HTMLElement>('[role=\"menuitem\"]:not([aria-disabled=\"true\"])'),\n )\n if (items.length === 0) return\n e.preventDefault()\n\n const active = document.activeElement as HTMLElement | null\n const current = active ? items.indexOf(active) : -1\n let next: number\n if (e.key === 'Home') next = 0\n else if (e.key === 'End') next = items.length - 1\n else if (e.key === 'ArrowDown') next = current < 0 ? 0 : (current + 1) % items.length\n else next = current <= 0 ? items.length - 1 : current - 1\n items[next]?.focus()\n}\n","'use client'\n\n/**\n * FloatingMenu — the ONE floating-panel mechanism for every menu. Renders the shared\n * MenuPanel through the @hanzo/gui Portal, positioned at an anchor (a trigger rect or a\n * cursor point), theme-forwarded via PortalTheme, edge-flipped, dismiss-wired and\n * keyboard-navigable.\n *\n * Why Portal, not gui Popover: gui's Popover pulls in a SheetController that re-roots the\n * trigger subtree and reads the theme from React context — on gui-native hosts\n * (react-native-web-lite, theme in context, no CSS-class fallback) that throws\n * \"Missing theme\" AT MOUNT. The raw Portal does not re-root, so DropdownMenu, ContextMenu,\n * SelectMenu and ComboBox all ride this ONE working path.\n */\nimport type { ReactNode, KeyboardEvent as ReactKeyboardEvent } from 'react'\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react'\nimport { Portal } from '@hanzo/gui'\nimport { MenuPanel } from './items'\nimport { PortalTheme, useThemeName } from './portal-theme'\nimport { menuKeyDown } from './roving'\n\nconst EDGE = 8\n\nexport type RectLike = { left: number; top: number; right: number; bottom: number; width: number; height: number }\n\nexport function FloatingMenu({\n open,\n onClose,\n anchorRect,\n anchorEl,\n gap = 4,\n minWidth = 200,\n maxHeight,\n autoFocus = true,\n children,\n}: {\n open: boolean\n onClose: () => void\n /** Anchor in viewport coords — a trigger's rect, or a zero-size rect at a cursor point. */\n anchorRect: () => RectLike | null | undefined\n /** Element excluded from outside-dismiss (the trigger / input row). */\n anchorEl?: () => HTMLElement | null | undefined\n /** Space between the anchor's bottom and the panel (0 for a cursor menu). */\n gap?: number\n minWidth?: number\n maxHeight?: number\n /** Focus the panel on open (for roving keys). ComboBox keeps focus in its input. */\n autoFocus?: boolean\n children: ReactNode\n}) {\n const themeName = useThemeName()\n const panelRef = useRef<HTMLElement | null>(null)\n const [pos, setPos] = useState<{ left: number; top: number } | null>(null)\n\n const setPanel = useCallback((n: HTMLElement | null) => {\n panelRef.current = n\n }, [])\n\n const place = useCallback(() => {\n if (typeof window === 'undefined') return\n const a = anchorRect()\n if (!a) return\n const node = panelRef.current\n const w = node?.offsetWidth || minWidth\n const h = node?.offsetHeight || 0\n let left = a.left\n let top = a.bottom + gap\n if (left + w > window.innerWidth - EDGE) left = Math.max(EDGE, window.innerWidth - w - EDGE)\n if (h && top + h > window.innerHeight - EDGE) {\n const above = a.top - gap - h\n top = above >= EDGE ? above : Math.max(EDGE, window.innerHeight - h - EDGE)\n }\n setPos({ left, top })\n }, [anchorRect, gap, minWidth])\n\n // Measure + position before paint; focus the panel for keyboard nav.\n useLayoutEffect(() => {\n if (!open) {\n setPos(null)\n return\n }\n place()\n if (autoFocus) panelRef.current?.focus?.()\n }, [open, place, autoFocus])\n\n // Dismiss on outside pointer (excluding the anchor), Escape, scroll, resize, blur.\n useEffect(() => {\n if (!open || typeof document === 'undefined') return\n const onPointerDown = (e: PointerEvent) => {\n const t = e.target as Node\n if (panelRef.current?.contains(t)) return\n const anchor = anchorEl?.()\n if (anchor && anchor.contains(t)) return\n onClose()\n }\n const onKey = (e: globalThis.KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n }\n document.addEventListener('pointerdown', onPointerDown, true)\n document.addEventListener('keydown', onKey, true)\n window.addEventListener('scroll', onClose, true)\n window.addEventListener('resize', onClose)\n window.addEventListener('blur', onClose)\n return () => {\n document.removeEventListener('pointerdown', onPointerDown, true)\n document.removeEventListener('keydown', onKey, true)\n window.removeEventListener('scroll', onClose, true)\n window.removeEventListener('resize', onClose)\n window.removeEventListener('blur', onClose)\n }\n }, [open, onClose, anchorEl])\n\n if (!open) return null\n return (\n <Portal>\n <PortalTheme name={themeName}>\n <MenuPanel\n panelRef={setPanel}\n minWidth={minWidth}\n maxHeight={maxHeight}\n tabIndex={-1}\n onKeyDown={(e: ReactKeyboardEvent) => menuKeyDown(e, onClose)}\n style={{\n position: 'fixed',\n left: pos?.left ?? 0,\n top: pos?.top ?? 0,\n zIndex: 100000,\n visibility: pos ? 'visible' : 'hidden',\n }}\n >\n {children}\n </MenuPanel>\n </PortalTheme>\n </Portal>\n )\n}\n","'use client'\n\n/**\n * DropdownMenu — a portal-theme-safe click menu. Declarative `items` rendered through the\n * ONE shared menu-item spec, so it is pixel-identical to ContextMenu/SelectMenu/ComboBox.\n * Built on FloatingMenu (gui Portal), NOT the gui Popover — so it mounts without the\n * Sheet re-root that loses theme context on gui-native hosts (react-native-web-lite).\n *\n * <DropdownMenu\n * trigger={<Button>Actions</Button>}\n * items={[\n * { key: 'rename', label: 'Rename', icon: <Pencil size={16} />, onSelect: rename },\n * { type: 'separator' },\n * { key: 'del', label: 'Delete', destructive: true, onSelect: del },\n * ]}\n * />\n */\nimport type { ReactElement } from 'react'\nimport { useCallback, useRef } from 'react'\nimport { XStack, useControllableState } from '@hanzo/gui'\nimport { renderMenuItems, type MenuItemSpec } from './items'\nimport { FloatingMenu } from './FloatingMenu'\n\nexport type DropdownMenuProps = {\n /** The clickable element. Wrapped so any element opens the menu on press. */\n trigger: ReactElement\n items: MenuItemSpec[]\n /** Controlled open state. Omit for uncontrolled. */\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n minWidth?: number\n maxHeight?: number\n}\n\nexport function DropdownMenu({\n trigger,\n items,\n open,\n defaultOpen = false,\n onOpenChange,\n minWidth = 200,\n maxHeight,\n}: DropdownMenuProps) {\n const [isOpen, setOpen] = useControllableState({\n prop: open,\n defaultProp: defaultOpen,\n onChange: onOpenChange,\n })\n const anchorRef = useRef<HTMLElement | null>(null)\n const anchorRect = useCallback(() => anchorRef.current?.getBoundingClientRect() ?? null, [])\n const anchorEl = useCallback(() => anchorRef.current, [])\n\n return (\n <>\n <XStack ref={anchorRef as never} self=\"flex-start\" cursor=\"pointer\" onPress={() => setOpen(!isOpen)}>\n {trigger}\n </XStack>\n <FloatingMenu\n open={isOpen}\n onClose={() => setOpen(false)}\n anchorRect={anchorRect}\n anchorEl={anchorEl}\n minWidth={minWidth}\n maxHeight={maxHeight}\n >\n {renderMenuItems(items, () => setOpen(false))}\n </FloatingMenu>\n </>\n )\n}\n","'use client'\n\n/**\n * SelectMenu — a compact, reusable dropdown select. Renders a labelled trigger (\"All\n * types\", or the chosen option) and a menu list with a check on the active option.\n * Prop-driven + self-contained. `value === null` is the \"all\"/unfiltered state.\n *\n * `required` turns the same control into a \"pick exactly one of N\": the null row is\n * dropped and the value is never nullable. That is the SAME control, not a second\n * one — a required field picker and a filter differ only in whether \"none\" is an\n * option, so it stays one component rather than growing a fourth select.\n *\n * A thin DropdownMenu (the ONE menu mechanism) so it is pixel-identical to every other\n * menu and rides the same portal-theme-safe Portal path — no gui Popover, no Sheet\n * re-root, works on gui-native hosts.\n */\nimport type { ReactElement } from 'react'\nimport { Button, Text } from '@hanzo/gui'\nimport { ChevronDown } from '@hanzogui/lucide-icons-2'\nimport { DropdownMenu } from './menu/DropdownMenu'\nimport type { MenuItemSpec } from './menu/items'\n\nexport type SelectOption<T extends string> = { key: T; label: string }\n\nexport function SelectMenu<T extends string>({\n options,\n value,\n onChange,\n allLabel = 'All',\n icon,\n minWidth = 130,\n required,\n minHeight,\n disabled,\n ariaLabel,\n}: {\n options: SelectOption<T>[]\n value: T | null\n onChange: (v: T | null) => void\n /** Label shown (and first menu row) for the unfiltered `null` state. */\n allLabel?: string\n /** Optional leading icon in the trigger. */\n icon?: ReactElement\n minWidth?: number\n /** Exactly one of `options` is always chosen — no \"all\"/none row. */\n required?: boolean\n /** Trigger height floor — pass the 44px tap floor on a phone. */\n minHeight?: number\n disabled?: boolean\n /** Accessible name for an unlabelled trigger. */\n ariaLabel?: string\n}) {\n const active = value === null ? null : options.find((o) => o.key === value) ?? null\n const triggerLabel = active ? active.label : allLabel\n\n const items: MenuItemSpec[] = [\n ...(required\n ? []\n : [{ key: '__all__', label: allLabel, selected: value === null, onSelect: () => onChange(null) }]),\n ...options.map((o) => ({ key: o.key, label: o.label, selected: value === o.key, onSelect: () => onChange(o.key) })),\n ]\n\n return (\n <DropdownMenu\n minWidth={Math.max(minWidth, 160)}\n trigger={\n <Button\n size={minHeight && minHeight >= 40 ? '$4' : '$2'}\n minW={minWidth}\n minH={minHeight}\n disabled={disabled}\n aria-label={ariaLabel}\n justify=\"space-between\"\n borderWidth={1}\n borderColor=\"$borderColor\"\n bg={!required && value !== null ? '$color5' : 'transparent'}\n icon={icon}\n iconAfter={<ChevronDown size={14} opacity={0.6} />}\n >\n <Text fontSize=\"$2\" color=\"$color12\" numberOfLines={1} flex={1}>\n {triggerLabel}\n </Text>\n </Button>\n }\n items={items}\n />\n )\n}\n"]}
|