@hanzo/ui 8.0.8 → 8.0.12
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/LICENSE.md +21 -0
- package/dist/backends/gui/index.d.ts +2 -0
- package/dist/backends/shadcn/aspect-ratio.d.ts +4 -0
- package/dist/backends/shadcn/avatar.d.ts +6 -0
- package/dist/backends/shadcn/badge.d.ts +9 -0
- package/dist/backends/shadcn/button.d.ts +19 -0
- package/dist/backends/shadcn/card.d.ts +9 -0
- package/dist/backends/shadcn/checkbox.d.ts +9 -0
- package/dist/backends/shadcn/collapsible.d.ts +5 -0
- package/dist/backends/shadcn/command.d.ts +80 -0
- package/dist/backends/shadcn/dialog.d.ts +15 -0
- package/dist/backends/shadcn/dropdown-menu.d.ts +34 -0
- package/dist/backends/shadcn/index.d.ts +23 -0
- package/dist/backends/shadcn/input.d.ts +11 -0
- package/dist/backends/shadcn/label.d.ts +4 -0
- package/dist/backends/shadcn/popover.d.ts +7 -0
- package/dist/backends/shadcn/progress.d.ts +4 -0
- package/dist/backends/shadcn/scroll-area.d.ts +5 -0
- package/dist/backends/shadcn/select.d.ts +13 -0
- package/dist/backends/shadcn/separator.d.ts +4 -0
- package/dist/backends/shadcn/slider.d.ts +4 -0
- package/dist/backends/shadcn/switch.d.ts +4 -0
- package/dist/backends/shadcn/tabs.d.ts +7 -0
- package/dist/backends/shadcn/textarea.d.ts +4 -0
- package/dist/backends/shadcn/toaster.d.ts +10 -0
- package/dist/backends/shadcn/tooltip.d.ts +7 -0
- package/dist/backends/shadcn/utils.d.ts +8 -0
- package/dist/components.d.ts +1 -0
- package/dist/core/cn.d.ts +11 -0
- package/dist/core/fonts.d.ts +26 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/tokens.d.ts +16 -0
- package/dist/index.cjs +1138 -283
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1017 -3
- package/dist/index.js.map +1 -1
- package/dist/models/ModelSelector.d.ts +23 -0
- package/dist/models/catalog.d.ts +53 -0
- package/dist/models/index.d.ts +5 -0
- package/dist/models/types.d.ts +39 -0
- package/dist/oss/blueprint.d.ts +37 -0
- package/dist/oss/catalog.d.ts +67 -0
- package/dist/oss.cjs +190 -0
- package/dist/oss.cjs.map +1 -0
- package/dist/oss.d.ts +2 -0
- package/dist/oss.js +180 -0
- package/dist/oss.js.map +1 -0
- package/dist/primitives/AspectRatio.d.ts +1 -0
- package/dist/primitives/Avatar.d.ts +1 -0
- package/dist/primitives/AvatarFallback.d.ts +1 -0
- package/dist/primitives/AvatarImage.d.ts +1 -0
- package/dist/primitives/Badge.d.ts +1 -0
- package/dist/primitives/Button.d.ts +1 -0
- package/dist/primitives/Card.d.ts +1 -0
- package/dist/primitives/CardAction.d.ts +1 -0
- package/dist/primitives/CardContent.d.ts +1 -0
- package/dist/primitives/CardDescription.d.ts +1 -0
- package/dist/primitives/CardFooter.d.ts +1 -0
- package/dist/primitives/CardHeader.d.ts +1 -0
- package/dist/primitives/CardTitle.d.ts +1 -0
- package/dist/primitives/Checkbox.d.ts +1 -0
- package/dist/primitives/Collapsible.d.ts +1 -0
- package/dist/primitives/CollapsibleContent.d.ts +1 -0
- package/dist/primitives/CollapsibleTrigger.d.ts +1 -0
- package/dist/primitives/Command.d.ts +1 -0
- package/dist/primitives/CommandDialog.d.ts +1 -0
- package/dist/primitives/CommandEmpty.d.ts +1 -0
- package/dist/primitives/CommandGroup.d.ts +1 -0
- package/dist/primitives/CommandInput.d.ts +1 -0
- package/dist/primitives/CommandItem.d.ts +1 -0
- package/dist/primitives/CommandList.d.ts +1 -0
- package/dist/primitives/CommandSeparator.d.ts +1 -0
- package/dist/primitives/CommandShortcut.d.ts +1 -0
- package/dist/primitives/Dialog.d.ts +1 -0
- package/dist/primitives/DialogClose.d.ts +1 -0
- package/dist/primitives/DialogContent.d.ts +1 -0
- package/dist/primitives/DialogDescription.d.ts +1 -0
- package/dist/primitives/DialogFooter.d.ts +1 -0
- package/dist/primitives/DialogHeader.d.ts +1 -0
- package/dist/primitives/DialogOverlay.d.ts +1 -0
- package/dist/primitives/DialogPortal.d.ts +1 -0
- package/dist/primitives/DialogTitle.d.ts +1 -0
- package/dist/primitives/DialogTrigger.d.ts +1 -0
- package/dist/primitives/DropdownMenu.d.ts +1 -0
- package/dist/primitives/DropdownMenuCheckboxItem.d.ts +1 -0
- package/dist/primitives/DropdownMenuContent.d.ts +1 -0
- package/dist/primitives/DropdownMenuGroup.d.ts +1 -0
- package/dist/primitives/DropdownMenuItem.d.ts +1 -0
- package/dist/primitives/DropdownMenuLabel.d.ts +1 -0
- package/dist/primitives/DropdownMenuPortal.d.ts +1 -0
- package/dist/primitives/DropdownMenuRadioGroup.d.ts +1 -0
- package/dist/primitives/DropdownMenuRadioItem.d.ts +1 -0
- package/dist/primitives/DropdownMenuSeparator.d.ts +1 -0
- package/dist/primitives/DropdownMenuShortcut.d.ts +1 -0
- package/dist/primitives/DropdownMenuSub.d.ts +1 -0
- package/dist/primitives/DropdownMenuSubContent.d.ts +1 -0
- package/dist/primitives/DropdownMenuSubTrigger.d.ts +1 -0
- package/dist/primitives/DropdownMenuTrigger.d.ts +1 -0
- package/dist/primitives/Input.d.ts +1 -0
- package/dist/primitives/Label.d.ts +1 -0
- package/dist/primitives/Popover.d.ts +1 -0
- package/dist/primitives/PopoverAnchor.d.ts +1 -0
- package/dist/primitives/PopoverContent.d.ts +1 -0
- package/dist/primitives/PopoverTrigger.d.ts +1 -0
- package/dist/primitives/Progress.d.ts +1 -0
- package/dist/primitives/ScrollArea.d.ts +1 -0
- package/dist/primitives/ScrollBar.d.ts +1 -0
- package/dist/primitives/Select.d.ts +1 -0
- package/dist/primitives/SelectContent.d.ts +1 -0
- package/dist/primitives/SelectGroup.d.ts +1 -0
- package/dist/primitives/SelectItem.d.ts +1 -0
- package/dist/primitives/SelectLabel.d.ts +1 -0
- package/dist/primitives/SelectScrollDownButton.d.ts +1 -0
- package/dist/primitives/SelectScrollUpButton.d.ts +1 -0
- package/dist/primitives/SelectSeparator.d.ts +1 -0
- package/dist/primitives/SelectTrigger.d.ts +1 -0
- package/dist/primitives/SelectValue.d.ts +1 -0
- package/dist/primitives/Separator.d.ts +1 -0
- package/dist/primitives/Slider.d.ts +1 -0
- package/dist/primitives/Switch.d.ts +1 -0
- package/dist/primitives/Tabs.d.ts +1 -0
- package/dist/primitives/TabsContent.d.ts +1 -0
- package/dist/primitives/TabsList.d.ts +1 -0
- package/dist/primitives/TabsTrigger.d.ts +1 -0
- package/dist/primitives/Textarea.d.ts +1 -0
- package/dist/primitives/Toaster.d.ts +1 -0
- package/dist/primitives/Tooltip.d.ts +1 -0
- package/dist/primitives/TooltipContent.d.ts +1 -0
- package/dist/primitives/TooltipProvider.d.ts +1 -0
- package/dist/primitives/TooltipTrigger.d.ts +1 -0
- package/dist/primitives/badgeVariants.d.ts +1 -0
- package/dist/primitives/buttonVariants.d.ts +1 -0
- package/dist/primitives/index.d.ts +1 -0
- package/dist/primitives/toast.d.ts +1 -0
- package/dist/product/AnimatedLogo.d.ts +47 -0
- package/dist/product/BackendState.d.ts +42 -0
- package/dist/product/Charts.d.ts +4 -0
- package/dist/product/CommerceResource.d.ts +32 -0
- package/dist/product/ConfirmDelete.d.ts +8 -0
- package/dist/product/DataTable.d.ts +30 -2
- package/dist/product/Field.d.ts +7 -2
- package/dist/product/Filters.d.ts +29 -0
- package/dist/product/OrgMark.d.ts +21 -0
- package/dist/product/OrgSwitcher.d.ts +8 -1
- package/dist/product/PrimaryButton.d.ts +5 -0
- package/dist/product/SiteFooter.d.ts +28 -0
- package/dist/product/SiteNav.d.ts +60 -0
- package/dist/product/accent.d.ts +33 -0
- package/dist/product/animatedLogo.logic.d.ts +52 -0
- package/dist/product/brand.d.ts +45 -0
- package/dist/product/host.d.ts +21 -0
- package/dist/product/index.cjs +3205 -257
- package/dist/product/index.cjs.map +1 -1
- package/dist/product/index.d.ts +12 -0
- package/dist/product/index.js +3103 -1
- package/dist/product/index.js.map +1 -1
- package/dist/product/social/CampaignCard.d.ts +13 -0
- package/dist/product/social/ChannelBadge.d.ts +12 -0
- package/dist/product/social/PostAgenda.d.ts +5 -0
- package/dist/product/social/PostCard.d.ts +15 -0
- package/dist/product/social/PostComposer.d.ts +24 -0
- package/dist/product/social/ProviderReadinessList.d.ts +10 -0
- package/dist/product/social/SocialSummaryBar.d.ts +9 -0
- package/dist/product/social/ViewToggle.d.ts +5 -0
- package/dist/product/social/format.d.ts +16 -0
- package/dist/product/social/index.d.ts +9 -0
- package/dist/product/surfaces.data.d.ts +1 -0
- package/dist/styles/hanzo-motion.css +52 -0
- package/dist/telemetry.cjs +15 -0
- package/dist/telemetry.cjs.map +1 -0
- package/dist/telemetry.d.ts +1 -0
- package/dist/telemetry.js +4 -0
- package/dist/telemetry.js.map +1 -0
- package/package.json +106 -19
- package/dist/chunk-GDGVXU7W.js +0 -1999
- package/dist/chunk-GDGVXU7W.js.map +0 -1
- package/dist/chunk-HSPMQQVJ.cjs +0 -2066
- package/dist/chunk-HSPMQQVJ.cjs.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js","sourcesContent":[]}
|
|
1
|
+
{"version":3,"sources":["../src/backends/shadcn/aspect-ratio.tsx","../src/core/cn.ts","../src/backends/shadcn/avatar.tsx","../src/backends/shadcn/badge.tsx","../src/backends/shadcn/button.tsx","../src/backends/shadcn/card.tsx","../src/backends/shadcn/checkbox.tsx","../src/backends/shadcn/collapsible.tsx","../src/backends/shadcn/dialog.tsx","../src/backends/shadcn/command.tsx","../src/backends/shadcn/dropdown-menu.tsx","../src/backends/shadcn/input.tsx","../src/backends/shadcn/label.tsx","../src/backends/shadcn/popover.tsx","../src/backends/shadcn/progress.tsx","../src/backends/shadcn/scroll-area.tsx","../src/backends/shadcn/select.tsx","../src/backends/shadcn/separator.tsx","../src/backends/shadcn/slider.tsx","../src/backends/shadcn/switch.tsx","../src/backends/shadcn/tabs.tsx","../src/backends/shadcn/textarea.tsx","../src/backends/shadcn/toaster.tsx","../src/backends/shadcn/tooltip.tsx"],"names":["React","jsx","cva","React2","Slot","React3","CollapsibleTrigger","CollapsibleContent","React4","jsxs","React5","CommandPrimitive","CheckIcon","React7","Label","React8","React9","React10","React11","React12","Separator","React13","React14","React15","React16","React17","Sonner","React18"],"mappings":"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","file":"index.js","sourcesContent":["'use client'\n\nimport * as AspectRatioPrimitive from '@radix-ui/react-aspect-ratio'\n\n/** AspectRatio — thin passthrough of the Radix primitive (no styling needed). */\nfunction AspectRatio(props: React.ComponentProps<typeof AspectRatioPrimitive.Root>) {\n return <AspectRatioPrimitive.Root data-slot=\"aspect-ratio\" {...props} />\n}\n\nexport { AspectRatio }\n","/**\n * `cn` — the one class-name composer.\n *\n * `clsx` resolves conditional/array/object class inputs; `tailwind-merge` then\n * collapses conflicting Tailwind utilities so the LAST wins (e.g. a caller's\n * `bg-background` overrides a component's default `bg-popover`). Every component\n * in every backend that emits Tailwind classes merges through this single\n * function — one way, everywhere.\n */\nimport { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs))\n}\n","'use client'\n\nimport * as AvatarPrimitive from '@radix-ui/react-avatar'\nimport * as React from 'react'\n\nimport { cn } from './utils'\n\nconst Avatar = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Root\n ref={ref}\n data-slot=\"avatar\"\n className={cn('relative flex size-8 shrink-0 overflow-hidden rounded-full', className)}\n {...props}\n />\n))\nAvatar.displayName = AvatarPrimitive.Root.displayName\n\nconst AvatarImage = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Image>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image\n ref={ref}\n data-slot=\"avatar-image\"\n className={cn('aspect-square size-full', className)}\n {...props}\n />\n))\nAvatarImage.displayName = AvatarPrimitive.Image.displayName\n\nconst AvatarFallback = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Fallback>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n data-slot=\"avatar-fallback\"\n className={cn(\n 'bg-muted text-muted-foreground flex size-full items-center justify-center rounded-full text-sm',\n className,\n )}\n {...props}\n />\n))\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName\n\nexport { Avatar, AvatarImage, AvatarFallback }\n","'use client'\n\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { cn } from './utils'\n\nconst badgeVariants = cva(\n 'inline-flex items-center justify-center w-fit whitespace-nowrap shrink-0 rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] focus-visible:outline-none aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive [&>svg]:pointer-events-none overflow-hidden',\n {\n variants: {\n variant: {\n default:\n 'bg-primary text-primary-foreground hover:bg-primary/90 border-transparent shadow-sm',\n secondary:\n 'bg-secondary text-secondary-foreground hover:bg-secondary/80 border-transparent',\n destructive:\n 'bg-destructive text-white hover:bg-destructive/90 border-transparent shadow-sm focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',\n outline:\n 'text-foreground border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground',\n ghost: 'hover:bg-accent hover:text-accent-foreground border-transparent',\n link: 'text-primary underline-offset-4 hover:underline border-transparent',\n // Hanzo compatibility variants — retokenized to standard vars\n // (was `bg-gray-600 text-white`, an app-private color).\n inputAdornment: 'bg-muted px-2 font-medium text-foreground border-transparent',\n tags: 'text-muted-foreground border-border bg-muted rounded-lg px-2 py-1 font-normal capitalize',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n)\n\nfunction Badge({\n className,\n variant = 'default',\n asChild = false,\n ...props\n}: React.ComponentProps<'span'> &\n VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : 'span'\n return (\n <Comp\n data-slot=\"badge\"\n data-variant={variant}\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nexport { Badge, badgeVariants }\n","'use client'\n\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { Loader2 } from 'lucide-react'\nimport * as React from 'react'\n\nimport { cn } from './utils'\n\n/**\n * Button — every class is a STANDARD design token (`bg-primary`,\n * `text-primary-foreground`, `bg-accent`, `bg-secondary`, `bg-destructive`,\n * `border-input`, `ring-ring`). No app-private token names, so it renders solid\n * against any host that defines the standard shadcn variables (which the Hanzo\n * theme, `theme.css`, and every consuming app do).\n */\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*=\"size-\"])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive',\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground hover:bg-primary/90',\n destructive:\n 'bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',\n outline:\n 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50',\n secondary:\n 'bg-secondary text-secondary-foreground hover:bg-secondary/80',\n ghost:\n 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',\n link: 'text-primary underline-offset-4 hover:underline',\n // Hanzo compatibility variants (kept so existing call sites don't churn).\n primary: 'bg-primary text-primary-foreground shadow hover:bg-primary/90',\n linkFG: 'text-primary underline-offset-4 hover:underline',\n linkMuted:\n 'text-muted-foreground underline-offset-4 hover:underline hover:text-foreground',\n },\n size: {\n default: 'h-9 px-4 py-2 has-[>svg]:px-3',\n sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5',\n lg: 'h-10 rounded-md px-6 has-[>svg]:px-4',\n icon: 'size-9',\n 'icon-sm': 'size-8',\n 'icon-lg': 'size-10',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n isLoading?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n variant = 'default',\n size = 'default',\n asChild = false,\n isLoading = false,\n children,\n ...props\n },\n ref,\n ) => {\n const Comp = asChild ? Slot : 'button'\n const iconSize = size === 'icon' || size === 'icon-sm' || size === 'icon-lg'\n return (\n <Comp\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n >\n {asChild ? (\n // A Radix `Slot` calls `React.Children.only`; it must receive exactly\n // one child, so an injected spinner alongside `children` would crash\n // the tree. Pass `children` through unchanged when slotted.\n children\n ) : (\n <>\n {isLoading ? (\n <Loader2 className={cn('h-4 w-4 animate-spin', !iconSize && 'mr-2')} />\n ) : null}\n {children}\n </>\n )}\n </Comp>\n )\n },\n)\nButton.displayName = 'Button'\n\nexport { Button, buttonVariants }\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from './utils'\n\nfunction Card({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card\"\n className={cn(\n 'bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n '@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn('leading-none font-semibold', className)}\n {...props}\n />\n )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn('text-muted-foreground text-sm', className)}\n {...props}\n />\n )\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn('col-start-2 row-span-2 row-start-1 self-start justify-self-end', className)}\n {...props}\n />\n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"card-content\" className={cn('px-6', className)} {...props} />\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn('flex items-center px-6 [.border-t]:pt-6', className)}\n {...props}\n />\n )\n}\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardAction, CardDescription, CardContent }\n","'use client'\n\nimport * as CheckboxPrimitive from '@radix-ui/react-checkbox'\nimport { CheckIcon } from '@radix-ui/react-icons'\nimport * as React from 'react'\n\nimport { cn } from './utils'\n\n/**\n * Checkbox — standard-token control. Checked state uses `bg-primary` /\n * `text-primary-foreground` (was the app-private `bg-brand`), border uses\n * `border-input` (was `border-gray-400`), so it reads correctly in any host.\n */\nconst Checkbox = React.forwardRef<\n React.ComponentRef<typeof CheckboxPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n data-slot=\"checkbox\"\n className={cn(\n 'peer size-4 shrink-0 rounded-[4px] border border-input shadow-xs transition-shadow outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground aria-invalid:border-destructive',\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className={cn('flex items-center justify-center text-current')}\n >\n <CheckIcon className=\"size-3.5\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n))\nCheckbox.displayName = CheckboxPrimitive.Root.displayName\n\nexport { Checkbox }\n","'use client'\n\nimport * as CollapsiblePrimitive from '@radix-ui/react-collapsible'\n\nfunction Collapsible(props: React.ComponentProps<typeof CollapsiblePrimitive.Root>) {\n return <CollapsiblePrimitive.Root data-slot=\"collapsible\" {...props} />\n}\n\nfunction CollapsibleTrigger(\n props: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleTrigger>,\n) {\n return <CollapsiblePrimitive.CollapsibleTrigger data-slot=\"collapsible-trigger\" {...props} />\n}\n\nfunction CollapsibleContent(\n props: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleContent>,\n) {\n return <CollapsiblePrimitive.CollapsibleContent data-slot=\"collapsible-content\" {...props} />\n}\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent }\n","'use client'\n\nimport * as DialogPrimitive from '@radix-ui/react-dialog'\nimport { XIcon } from 'lucide-react'\nimport * as React from 'react'\n\nimport { cn } from './utils'\n\nconst Dialog = DialogPrimitive.Root\nconst DialogTrigger = DialogPrimitive.Trigger\nconst DialogPortal = DialogPrimitive.Portal\nconst DialogClose = DialogPrimitive.Close\n\nconst DialogOverlay = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n data-slot=\"dialog-overlay\"\n className={cn(\n 'fixed inset-0 z-50 bg-black/50 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className,\n )}\n {...props}\n />\n))\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nconst DialogContent = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & { showCloseButton?: boolean }\n>(({ className, children, showCloseButton = true, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n data-slot=\"dialog-content\"\n className={cn(\n 'bg-background text-foreground font-sans fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-lg border p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 sm:max-w-lg',\n className,\n )}\n {...props}\n >\n {children}\n {showCloseButton ? (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n className=\"ring-offset-background focus:ring-ring absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-none disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:size-4\"\n >\n <XIcon />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n ) : null}\n </DialogPrimitive.Content>\n </DialogPortal>\n))\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn('flex flex-col gap-2 text-center sm:text-left', className)}\n {...props}\n />\n )\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn('flex flex-col-reverse gap-2 sm:flex-row sm:justify-end', className)}\n {...props}\n />\n )\n}\n\nconst DialogTitle = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n data-slot=\"dialog-title\"\n className={cn('text-lg leading-none font-semibold', className)}\n {...props}\n />\n))\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\nconst DialogDescription = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n data-slot=\"dialog-description\"\n className={cn('text-muted-foreground text-sm', className)}\n {...props}\n />\n))\nDialogDescription.displayName = DialogPrimitive.Description.displayName\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n","'use client'\n\nimport { Command as CommandPrimitive } from 'cmdk'\nimport { SearchIcon } from 'lucide-react'\nimport * as React from 'react'\n\nimport { cn } from './utils'\nimport { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from './dialog'\n\nconst Command = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive\n ref={ref}\n data-slot=\"command\"\n className={cn(\n 'bg-popover text-popover-foreground font-sans flex h-full w-full flex-col overflow-hidden rounded-md',\n className,\n )}\n {...props}\n />\n))\nCommand.displayName = CommandPrimitive.displayName\n\nfunction CommandDialog({\n title = 'Command Palette',\n description = 'Search for a command to run...',\n children,\n ...props\n}: React.ComponentProps<typeof Dialog> & { title?: string; description?: string }) {\n return (\n <Dialog {...props}>\n <DialogHeader className=\"sr-only\">\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n <DialogContent className=\"overflow-hidden p-0\">\n <Command className=\"[&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\">\n {children}\n </Command>\n </DialogContent>\n </Dialog>\n )\n}\n\nconst CommandInput = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Input>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>\n>(({ className, ...props }, ref) => (\n <div data-slot=\"command-input-wrapper\" className=\"flex h-9 items-center gap-2 border-b px-3\">\n <SearchIcon className=\"size-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n ref={ref}\n data-slot=\"command-input\"\n className={cn(\n 'placeholder:text-muted-foreground flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-none disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n </div>\n))\nCommandInput.displayName = CommandPrimitive.Input.displayName\n\nconst CommandList = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.List\n ref={ref}\n data-slot=\"command-list\"\n className={cn('max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto', className)}\n {...props}\n />\n))\nCommandList.displayName = CommandPrimitive.List.displayName\n\nconst CommandEmpty = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Empty>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Empty>\n>((props, ref) => (\n <CommandPrimitive.Empty\n ref={ref}\n data-slot=\"command-empty\"\n className=\"py-6 text-center text-sm\"\n {...props}\n />\n))\nCommandEmpty.displayName = CommandPrimitive.Empty.displayName\n\nconst CommandGroup = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Group>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Group>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Group\n ref={ref}\n data-slot=\"command-group\"\n className={cn(\n 'text-foreground [&_[cmdk-group-heading]]:text-muted-foreground overflow-hidden p-1 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium',\n className,\n )}\n {...props}\n />\n))\nCommandGroup.displayName = CommandPrimitive.Group.displayName\n\nconst CommandSeparator = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Separator\n ref={ref}\n data-slot=\"command-separator\"\n className={cn('bg-border -mx-1 h-px', className)}\n {...props}\n />\n))\nCommandSeparator.displayName = CommandPrimitive.Separator.displayName\n\nconst CommandItem = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Item\n ref={ref}\n data-slot=\"command-item\"\n className={cn(\n \"data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className,\n )}\n {...props}\n />\n))\nCommandItem.displayName = CommandPrimitive.Item.displayName\n\nfunction CommandShortcut({ className, ...props }: React.ComponentProps<'span'>) {\n return (\n <span\n data-slot=\"command-shortcut\"\n className={cn('text-muted-foreground ml-auto text-xs tracking-widest', className)}\n {...props}\n />\n )\n}\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n}\n","'use client'\n\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from 'lucide-react'\nimport * as React from 'react'\n\nimport { cn } from './utils'\n\n/**\n * Dropdown menu — Radix for a11y/portal/keyboard, styled with STANDARD tokens\n * only. The prior version leaked app-private tokens (`bg-bg-dark`,\n * `bg-bg-secondary`, `text-text-secondary`, `bg-divider`, hard-coded\n * `bg-gray-300`) that were undefined in consumers, so the menu surface,\n * item-hover, label, and separators rendered transparent. Every surface here is\n * `bg-popover` / `text-popover-foreground`, every hover is `focus:bg-accent`,\n * every divider is `bg-border` — solid in any host.\n */\nconst DropdownMenu = DropdownMenuPrimitive.Root\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownMenuContent = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n className={cn(\n 'bg-popover text-popover-foreground font-sans z-50 min-w-[8rem] overflow-hidden rounded-md border p-1 shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n))\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\n\nconst DropdownMenuItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n variant?: 'default' | 'destructive'\n }\n>(({ className, inset, variant = 'default', ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden transition-colors select-none focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[inset]:pl-8 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className,\n )}\n {...props}\n />\n))\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n data-slot=\"dropdown-menu-checkbox-item\"\n checked={checked}\n className={cn(\n 'relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden transition-colors select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className,\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n))\nDropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(\n 'relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden transition-colors select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className,\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CircleIcon className=\"size-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n))\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & { inset?: boolean }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn('px-2 py-1.5 text-sm font-medium data-[inset]:pl-8', className)}\n {...props}\n />\n))\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n data-slot=\"dropdown-menu-separator\"\n className={cn('bg-border -mx-1 my-1 h-px', className)}\n {...props}\n />\n))\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\n\nfunction DropdownMenuShortcut({ className, ...props }: React.ComponentProps<'span'>) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn('text-muted-foreground ml-auto text-xs tracking-widest', className)}\n {...props}\n />\n )\n}\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & { inset?: boolean }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n 'flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground data-[inset]:pl-8',\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto size-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n))\nDropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n 'bg-popover text-popover-foreground font-sans z-50 min-w-[8rem] overflow-hidden rounded-md border p-1 shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n))\nDropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n}\n","'use client'\n\nimport { EyeIcon, EyeOffIcon } from 'lucide-react'\nimport * as React from 'react'\n\nimport { cn } from './utils'\n\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n /** Optional leading affordance (icon/text) rendered inside the field. */\n startAdornment?: React.ReactNode\n /** Optional trailing affordance rendered inside the field. */\n endAdornment?: React.ReactNode\n /** Suppress the built-in show/hide control for `type=\"password\"`. */\n hidePasswordToggle?: boolean\n}\n\n/**\n * Input — canonical shadcn field on STANDARD tokens (`border-input`,\n * `bg-transparent`, `ring-ring`, `text-foreground`, `placeholder:text-muted-foreground`).\n *\n * The previous implementation hard-coded a floating-label look with app-private\n * tokens (`bg-bg-secondary`, `border-border-input`, `text-text-default`, `h-input`)\n * that were undefined in consumers, so plain `<Input placeholder=\"…\">` rendered\n * transparent/broken. This renders solid everywhere. A bare input is emitted when\n * no adornment/password affordance is requested (the common path); adornments and\n * the password toggle add a relative wrapper only when actually used.\n */\nconst BASE =\n 'flex h-9 w-full min-w-0 rounded-md border border-input bg-transparent px-3 py-1 text-sm text-foreground shadow-xs transition-colors outline-none file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20'\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, startAdornment, endAdornment, hidePasswordToggle, ...props }, ref) => {\n const [showPassword, setShowPassword] = React.useState(false)\n const isPassword = type === 'password'\n const showToggle = isPassword && !hidePasswordToggle\n const inputType = isPassword && showPassword ? 'text' : type\n\n const field = (\n <input\n ref={ref}\n data-slot=\"input\"\n type={inputType}\n spellCheck={false}\n className={cn(\n BASE,\n startAdornment && 'pl-9',\n (endAdornment || showToggle) && 'pr-9',\n className,\n )}\n {...props}\n />\n )\n\n if (!startAdornment && !endAdornment && !showToggle) return field\n\n return (\n <div className=\"relative w-full\">\n {startAdornment ? (\n <span className=\"pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground [&_svg]:size-4\">\n {startAdornment}\n </span>\n ) : null}\n {field}\n {endAdornment && !showToggle ? (\n <span className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground [&_svg]:size-4\">\n {endAdornment}\n </span>\n ) : null}\n {showToggle ? (\n <button\n type=\"button\"\n aria-label={showPassword ? 'Hide password' : 'Show password'}\n onClick={() => setShowPassword((v) => !v)}\n className=\"absolute right-2 top-1/2 -translate-y-1/2 rounded-sm p-1 text-muted-foreground hover:text-foreground\"\n >\n {showPassword ? (\n <EyeOffIcon aria-hidden className=\"size-4\" />\n ) : (\n <EyeIcon aria-hidden className=\"size-4\" />\n )}\n </button>\n ) : null}\n </div>\n )\n },\n)\nInput.displayName = 'Input'\n\nexport { Input }\n","'use client'\n\nimport * as LabelPrimitive from '@radix-ui/react-label'\nimport * as React from 'react'\n\nimport { cn } from './utils'\n\nconst Label = React.forwardRef<\n React.ComponentRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root\n ref={ref}\n data-slot=\"label\"\n className={cn(\n 'flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50',\n className,\n )}\n {...props}\n />\n))\nLabel.displayName = LabelPrimitive.Root.displayName\n\nexport { Label }\n","'use client'\n\nimport * as PopoverPrimitive from '@radix-ui/react-popover'\nimport * as React from 'react'\n\nimport { cn } from './utils'\n\nconst Popover = PopoverPrimitive.Root\nconst PopoverTrigger = PopoverPrimitive.Trigger\nconst PopoverAnchor = PopoverPrimitive.Anchor\n\nconst PopoverContent = React.forwardRef<\n React.ComponentRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = 'center', sideOffset = 4, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'bg-popover text-popover-foreground font-sans z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border p-4 shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n))\nPopoverContent.displayName = PopoverPrimitive.Content.displayName\n\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor }\n","'use client'\n\nimport * as ProgressPrimitive from '@radix-ui/react-progress'\nimport * as React from 'react'\n\nimport { cn } from './utils'\n\nconst Progress = React.forwardRef<\n React.ComponentRef<typeof ProgressPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ProgressPrimitive.Root>\n>(({ className, value, ...props }, ref) => (\n <ProgressPrimitive.Root\n ref={ref}\n data-slot=\"progress\"\n className={cn('bg-muted relative h-2 w-full overflow-hidden rounded-full', className)}\n {...props}\n >\n <ProgressPrimitive.Indicator\n data-slot=\"progress-indicator\"\n className=\"bg-primary h-full w-full flex-1 transition-all\"\n style={{ transform: `translateX(-${100 - (value || 0)}%)` }}\n />\n </ProgressPrimitive.Root>\n))\nProgress.displayName = ProgressPrimitive.Root.displayName\n\nexport { Progress }\n","'use client'\n\nimport * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area'\nimport * as React from 'react'\n\nimport { cn } from './utils'\n\nconst ScrollBar = React.forwardRef<\n React.ComponentRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>\n>(({ className, orientation = 'vertical', ...props }, ref) => (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n ref={ref}\n data-slot=\"scroll-area-scrollbar\"\n orientation={orientation}\n className={cn(\n 'flex touch-none p-px transition-colors select-none',\n orientation === 'vertical' && 'h-full w-2.5 border-l border-l-transparent',\n orientation === 'horizontal' && 'h-2.5 flex-col border-t border-t-transparent',\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb\n data-slot=\"scroll-area-thumb\"\n className=\"bg-border relative flex-1 rounded-full\"\n />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n))\nScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName\n\nconst ScrollArea = React.forwardRef<\n React.ComponentRef<typeof ScrollAreaPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>\n>(({ className, children, ...props }, ref) => (\n <ScrollAreaPrimitive.Root\n ref={ref}\n data-slot=\"scroll-area\"\n className={cn('relative overflow-hidden', className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n data-slot=\"scroll-area-viewport\"\n className=\"size-full rounded-[inherit] outline-none focus-visible:ring-ring/50 focus-visible:ring-[3px] transition-[color,box-shadow]\"\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n))\nScrollArea.displayName = ScrollAreaPrimitive.Root.displayName\n\nexport { ScrollArea, ScrollBar }\n","'use client'\n\nimport * as SelectPrimitive from '@radix-ui/react-select'\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from 'lucide-react'\nimport * as React from 'react'\n\nimport { cn } from './utils'\n\nconst Select = SelectPrimitive.Root\nconst SelectGroup = SelectPrimitive.Group\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n data-slot=\"select-trigger\"\n className={cn(\n \"border-input bg-transparent text-foreground data-[placeholder]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:border-destructive flex h-9 w-fit items-center justify-between gap-2 rounded-md border px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className,\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDownIcon className=\"size-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n data-slot=\"select-scroll-up-button\"\n className={cn('flex cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <ChevronUpIcon className=\"size-4\" />\n </SelectPrimitive.ScrollUpButton>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n data-slot=\"select-scroll-down-button\"\n className={cn('flex cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <ChevronDownIcon className=\"size-4\" />\n </SelectPrimitive.ScrollDownButton>\n))\nSelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName\n\nconst SelectContent = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = 'popper', ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n data-slot=\"select-content\"\n position={position}\n className={cn(\n 'bg-popover text-popover-foreground font-sans relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n position === 'popper' &&\n 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1',\n className,\n )}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n 'p-1',\n position === 'popper' &&\n 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1',\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n data-slot=\"select-label\"\n className={cn('text-muted-foreground px-2 py-1.5 text-xs', className)}\n {...props}\n />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n data-slot=\"select-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className,\n )}\n {...props}\n >\n <span className=\"absolute right-2 flex size-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n data-slot=\"select-separator\"\n className={cn('bg-border pointer-events-none -mx-1 my-1 h-px', className)}\n {...props}\n />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n}\n","'use client'\n\nimport * as SeparatorPrimitive from '@radix-ui/react-separator'\nimport * as React from 'react'\n\nimport { cn } from './utils'\n\nconst Separator = React.forwardRef<\n React.ComponentRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(({ className, orientation = 'horizontal', decorative = true, ...props }, ref) => (\n <SeparatorPrimitive.Root\n ref={ref}\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n 'bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px',\n className,\n )}\n {...props}\n />\n))\nSeparator.displayName = SeparatorPrimitive.Root.displayName\n\nexport { Separator }\n","'use client'\n\nimport * as SliderPrimitive from '@radix-ui/react-slider'\nimport * as React from 'react'\n\nimport { cn } from './utils'\n\nconst Slider = React.forwardRef<\n React.ComponentRef<typeof SliderPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <SliderPrimitive.Root\n ref={ref}\n data-slot=\"slider\"\n className={cn(\n 'relative flex w-full touch-none items-center select-none data-[disabled]:opacity-50',\n className,\n )}\n {...props}\n >\n <SliderPrimitive.Track\n data-slot=\"slider-track\"\n className=\"bg-muted relative h-1.5 w-full grow overflow-hidden rounded-full\"\n >\n <SliderPrimitive.Range data-slot=\"slider-range\" className=\"bg-primary absolute h-full\" />\n </SliderPrimitive.Track>\n <SliderPrimitive.Thumb\n data-slot=\"slider-thumb\"\n className=\"border-primary bg-background ring-ring/50 block size-4 shrink-0 rounded-full border shadow-sm transition-[color,box-shadow] focus-visible:ring-4 focus-visible:outline-none disabled:pointer-events-none\"\n />\n </SliderPrimitive.Root>\n))\nSlider.displayName = SliderPrimitive.Root.displayName\n\nexport { Slider }\n","'use client'\n\nimport * as SwitchPrimitive from '@radix-ui/react-switch'\nimport * as React from 'react'\n\nimport { cn } from './utils'\n\nconst Switch = React.forwardRef<\n React.ComponentRef<typeof SwitchPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SwitchPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <SwitchPrimitive.Root\n ref={ref}\n data-slot=\"switch\"\n className={cn(\n 'peer inline-flex h-5 w-9 shrink-0 items-center rounded-full border border-transparent shadow-xs transition-colors outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input',\n className,\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className={cn(\n 'bg-background pointer-events-none block size-4 rounded-full ring-0 shadow-lg transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0',\n )}\n />\n </SwitchPrimitive.Root>\n))\nSwitch.displayName = SwitchPrimitive.Root.displayName\n\nexport { Switch }\n","'use client'\n\nimport * as TabsPrimitive from '@radix-ui/react-tabs'\nimport * as React from 'react'\n\nimport { cn } from './utils'\n\nconst Tabs = React.forwardRef<\n React.ComponentRef<typeof TabsPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Root\n ref={ref}\n data-slot=\"tabs\"\n className={cn('flex flex-col gap-2', className)}\n {...props}\n />\n))\nTabs.displayName = TabsPrimitive.Root.displayName\n\nconst TabsList = React.forwardRef<\n React.ComponentRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.List\n ref={ref}\n data-slot=\"tabs-list\"\n className={cn(\n 'bg-muted text-muted-foreground inline-flex h-9 w-fit items-center justify-center rounded-lg p-[3px]',\n className,\n )}\n {...props}\n />\n))\nTabsList.displayName = TabsPrimitive.List.displayName\n\nconst TabsTrigger = React.forwardRef<\n React.ComponentRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n data-slot=\"tabs-trigger\"\n className={cn(\n \"data-[state=active]:bg-background data-[state=active]:text-foreground focus-visible:border-ring focus-visible:ring-ring/50 inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-colors focus-visible:ring-[3px] focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow-sm [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className,\n )}\n {...props}\n />\n))\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName\n\nconst TabsContent = React.forwardRef<\n React.ComponentRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n data-slot=\"tabs-content\"\n className={cn('flex-1 outline-none', className)}\n {...props}\n />\n))\nTabsContent.displayName = TabsPrimitive.Content.displayName\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from './utils'\n\n/** Textarea — standard-token multiline field. */\nconst Textarea = React.forwardRef<HTMLTextAreaElement, React.ComponentProps<'textarea'>>(\n ({ className, ...props }, ref) => (\n <textarea\n ref={ref}\n data-slot=\"textarea\"\n className={cn(\n 'flex min-h-16 w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm text-foreground shadow-xs transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 field-sizing-content',\n className,\n )}\n {...props}\n />\n ),\n)\nTextarea.displayName = 'Textarea'\n\nexport { Textarea }\n","'use client'\n\nimport { useTheme } from 'next-themes'\nimport { Toaster as Sonner, toast, type ToasterProps } from 'sonner'\n\nimport { cn } from './utils'\n\n/**\n * Toaster — Sonner surface bound to STANDARD tokens. The prior version used\n * app-private classes (`bg-level-2`, `text-primary-fg`, `border-muted-3`); here\n * the toast surface maps to `--popover`, borders to `--border`, and buttons to\n * the primary/muted tokens via Sonner's CSS-variable API, so it matches the host\n * theme (light/dark) with no undefined tokens.\n */\nconst Toaster = ({ className, ...props }: ToasterProps) => {\n const { theme = 'system' } = useTheme()\n return (\n <Sonner\n theme={theme as ToasterProps['theme']}\n className={cn('toaster group', className)}\n style={\n {\n '--normal-bg': 'var(--popover)',\n '--normal-text': 'var(--popover-foreground)',\n '--normal-border': 'var(--border)',\n } as React.CSSProperties\n }\n toastOptions={{\n classNames: {\n toast:\n 'group toast group-[.toaster]:bg-popover group-[.toaster]:text-popover-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg',\n description: 'group-[.toast]:text-muted-foreground',\n actionButton: 'group-[.toast]:bg-primary group-[.toast]:text-primary-foreground',\n cancelButton: 'group-[.toast]:bg-muted group-[.toast]:text-muted-foreground',\n },\n }}\n {...props}\n />\n )\n}\n\nexport { Toaster, toast }\n","'use client'\n\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip'\nimport * as React from 'react'\n\nimport { cn } from './utils'\n\nconst TooltipProvider = TooltipPrimitive.Provider\nconst Tooltip = TooltipPrimitive.Root\nconst TooltipTrigger = TooltipPrimitive.Trigger\n\nconst TooltipContent = React.forwardRef<\n React.ComponentRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, children, ...props }, ref) => (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n ref={ref}\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n 'bg-popover text-popover-foreground font-sans z-50 w-fit rounded-md border px-3 py-1.5 text-xs shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n >\n {children}\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n))\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type ModelCatalogEntry } from './catalog';
|
|
2
|
+
export interface ModelSelectorProps {
|
|
3
|
+
models: ModelCatalogEntry[];
|
|
4
|
+
value?: string;
|
|
5
|
+
onChange: (id: string) => void;
|
|
6
|
+
disabled?: boolean;
|
|
7
|
+
size?: 'sm' | 'md';
|
|
8
|
+
placeholder?: string;
|
|
9
|
+
/** Default true: filter to chat-capable models (exclude embedding/image/etc.). */
|
|
10
|
+
chatOnly?: boolean;
|
|
11
|
+
className?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* ModelSelector — the one unified model picker for every Hanzo app.
|
|
15
|
+
*
|
|
16
|
+
* Family-grouped picker in a compact Radix Popover + cmdk Command combobox:
|
|
17
|
+
* grouped sections with family headers, premium markers, context suffixes,
|
|
18
|
+
* keyboard navigation, and type-to-filter search for large catalogs. Monochrome,
|
|
19
|
+
* dark-first, data-agnostic. Every class is a standard token; the font is
|
|
20
|
+
* inherited (Geist).
|
|
21
|
+
*/
|
|
22
|
+
export declare function ModelSelector({ models, value, onChange, disabled, size, placeholder, chatOnly, className, }: ModelSelectorProps): import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
export default ModelSelector;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @hanzo/ui-shadcn/models — Model catalog data layer
|
|
3
|
+
*
|
|
4
|
+
* Pure, SSR-safe helpers shared by the unified ModelSelector. No React,
|
|
5
|
+
* no browser globals — usable on the server, in edge runtimes, or the client.
|
|
6
|
+
*
|
|
7
|
+
* ModelCatalogEntry is the gateway/OpenAI-shaped record ({ id, owned_by, ... })
|
|
8
|
+
* returned by `${baseUrl}/models`. It is intentionally distinct from the
|
|
9
|
+
* registry-shaped ZenModelLike in ./types (which drives the marketing cards).
|
|
10
|
+
*/
|
|
11
|
+
export interface ModelCatalogEntry {
|
|
12
|
+
/** Gateway id, e.g. "claude-opus-4.8" */
|
|
13
|
+
id: string;
|
|
14
|
+
/** e.g. "anthropic" | "openai" | "hanzo" | "deepseek" */
|
|
15
|
+
owned_by?: string;
|
|
16
|
+
/** Optional explicit family label override */
|
|
17
|
+
family?: string;
|
|
18
|
+
/** Display label; defaults to id */
|
|
19
|
+
label?: string;
|
|
20
|
+
premium?: boolean;
|
|
21
|
+
/** "chat" (default) | "embedding" | "image" | ... */
|
|
22
|
+
modality?: string;
|
|
23
|
+
context_window?: number;
|
|
24
|
+
description?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Resolve the display family of a model.
|
|
28
|
+
* Precedence: explicit `family` → enso id (house split, beats owned_by) →
|
|
29
|
+
* owned_by map → llama id under any owner → capitalized owned_by → id prefix → "Other".
|
|
30
|
+
*/
|
|
31
|
+
export declare function familyOf(m: ModelCatalogEntry): string;
|
|
32
|
+
/**
|
|
33
|
+
* Group models by family, ordered house-then-marquee-then-alphabetical.
|
|
34
|
+
* Model order within each family is the input order (stable).
|
|
35
|
+
*/
|
|
36
|
+
export declare function groupModelsByFamily(models: ModelCatalogEntry[]): {
|
|
37
|
+
family: string;
|
|
38
|
+
models: ModelCatalogEntry[];
|
|
39
|
+
}[];
|
|
40
|
+
/**
|
|
41
|
+
* True when a model can be used for chat. Excludes embedding/image/video/
|
|
42
|
+
* music/voice/tts/rerank/guard/foley/moderation/router by explicit modality
|
|
43
|
+
* or by an id-segment heuristic.
|
|
44
|
+
*/
|
|
45
|
+
export declare function isChatModel(m: ModelCatalogEntry): boolean;
|
|
46
|
+
/** Keep only chat-capable models. */
|
|
47
|
+
export declare function filterChatModels(models: ModelCatalogEntry[]): ModelCatalogEntry[];
|
|
48
|
+
/**
|
|
49
|
+
* Fetch a model catalog from an OpenAI-shaped `/models` endpoint.
|
|
50
|
+
* SSR-safe: uses global fetch, no browser globals, no caching/state —
|
|
51
|
+
* consumers own caching. Throws on a non-2xx response.
|
|
52
|
+
*/
|
|
53
|
+
export declare function fetchModelCatalog(baseUrl?: string, token?: string): Promise<ModelCatalogEntry[]>;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { ModelSelector } from './ModelSelector';
|
|
2
|
+
export type { ModelSelectorProps } from './ModelSelector';
|
|
3
|
+
export { familyOf, groupModelsByFamily, isChatModel, filterChatModels, fetchModelCatalog, } from './catalog';
|
|
4
|
+
export type { ModelCatalogEntry } from './catalog';
|
|
5
|
+
export type { ZenModelLike, ModelFamilyLike, ModelSpecLike, ModelPricingLike } from './types';
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @hanzo/ui — Model component types
|
|
3
|
+
*
|
|
4
|
+
* These types are structurally compatible with @hanzo/zen-models ZenModel / ModelFamily,
|
|
5
|
+
* so ZenModel objects can be passed directly to these components without casting.
|
|
6
|
+
*/
|
|
7
|
+
export interface ModelSpecLike {
|
|
8
|
+
params: string;
|
|
9
|
+
activeParams?: string | null;
|
|
10
|
+
context?: number;
|
|
11
|
+
arch?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ModelPricingLike {
|
|
14
|
+
input: number | null;
|
|
15
|
+
output: number | null;
|
|
16
|
+
cacheRead?: number | null;
|
|
17
|
+
cacheWrite?: number | null;
|
|
18
|
+
}
|
|
19
|
+
export interface ZenModelLike {
|
|
20
|
+
id: string;
|
|
21
|
+
name: string;
|
|
22
|
+
description: string;
|
|
23
|
+
spec: ModelSpecLike;
|
|
24
|
+
pricing: ModelPricingLike | null;
|
|
25
|
+
/** 'available' | 'preview' | 'coming-soon' | 'contact-sales' | 'cloud-only' */
|
|
26
|
+
status: string;
|
|
27
|
+
huggingface?: string | null;
|
|
28
|
+
github?: string | null;
|
|
29
|
+
paper?: string | null;
|
|
30
|
+
}
|
|
31
|
+
export interface ModelFamilyLike {
|
|
32
|
+
id: string;
|
|
33
|
+
name: string;
|
|
34
|
+
description: string;
|
|
35
|
+
/** lucide-react icon name */
|
|
36
|
+
icon?: string;
|
|
37
|
+
/** ordered list of model IDs */
|
|
38
|
+
models: string[];
|
|
39
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What an OSS blueprint actually provisions, read from its own `docker-compose.yml`.
|
|
3
|
+
*
|
|
4
|
+
* This is the one implementation. It was written twice before it lived here — once in
|
|
5
|
+
* TypeScript for the console's App Store and once in vanilla JS for oss.hanzo.ai — and
|
|
6
|
+
* two readers of the same file format drift, which means two surfaces can disagree
|
|
7
|
+
* about what a deploy will start.
|
|
8
|
+
*
|
|
9
|
+
* Deliberately a SMALL structural reader, not a YAML implementation: it walks the
|
|
10
|
+
* `services:` block by indentation and pulls only the keys a detail view shows.
|
|
11
|
+
* Anything it cannot read is absent, never guessed, so a surface degrades to "no
|
|
12
|
+
* blueprint detail" instead of asserting something false about what will run.
|
|
13
|
+
*
|
|
14
|
+
* Pure and total — it never throws on malformed or hostile input — so it is safe to
|
|
15
|
+
* run on untrusted CDN content and testable without a DOM or a network.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* One service a blueprint provisions. `image` is absent for a service built from
|
|
19
|
+
* source (`build:` rather than `image:`).
|
|
20
|
+
*/
|
|
21
|
+
export type Service = {
|
|
22
|
+
name: string;
|
|
23
|
+
image?: string;
|
|
24
|
+
ports: string[];
|
|
25
|
+
};
|
|
26
|
+
/** What a blueprint provisions: the containers it starts and the config it expects. */
|
|
27
|
+
export type Blueprint = {
|
|
28
|
+
services: Service[];
|
|
29
|
+
env: string[];
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Parse the load-bearing facts out of a `docker-compose.yml`: the services it starts
|
|
33
|
+
* (with image + published ports) and the environment keys it expects.
|
|
34
|
+
*
|
|
35
|
+
* Environment KEYS only — never the values, which are routinely secrets.
|
|
36
|
+
*/
|
|
37
|
+
export declare function parseBlueprint(yaml: string): Blueprint;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The OSS App Store catalog — the shared client for the 1000+-app one-click
|
|
3
|
+
* open-source catalog served as a flat JSON array at `<base>/meta.json`, with per-app
|
|
4
|
+
* blueprint assets under `<base>/blueprints/<id>/`.
|
|
5
|
+
*
|
|
6
|
+
* One catalog, several surfaces: the console App Store, platform.hanzo.ai, and the
|
|
7
|
+
* public gallery at oss.hanzo.ai. They previously each carried their own copy of the
|
|
8
|
+
* shape, the normalizer and the URL builders, which is how three surfaces come to
|
|
9
|
+
* disagree about the same catalog row. This is the one implementation.
|
|
10
|
+
*
|
|
11
|
+
* The catalog is a PUBLIC CDN with open CORS, so a browser fetches it DIRECTLY — no
|
|
12
|
+
* BFF, no `/v1` proxy — which is why this works in the go:embed console where the
|
|
13
|
+
* Next reverse-proxies are pruned. The base URL is INJECTED by the caller, so this
|
|
14
|
+
* module holds no config import and its normalizers + URL builders stay pure.
|
|
15
|
+
*/
|
|
16
|
+
/** One open-source app in the catalog (the meta.json entry, load-bearing fields only). */
|
|
17
|
+
export type OssApp = {
|
|
18
|
+
/** Stable catalog id + blueprint path segment, e.g. `2fauth`, `n8n`, `postgres`. */
|
|
19
|
+
id: string;
|
|
20
|
+
/** Display name, e.g. "2FAuth". */
|
|
21
|
+
name: string;
|
|
22
|
+
/** One-line description. */
|
|
23
|
+
description: string;
|
|
24
|
+
/** Version label — often the literal string `"latest"`, rendered raw. */
|
|
25
|
+
version: string;
|
|
26
|
+
/** Bare logo filename (e.g. `logo.svg`), resolved against the blueprint path. */
|
|
27
|
+
logo: string;
|
|
28
|
+
/** Category/provenance tags (e.g. `productivity`, `self-hosted`, `caprover`). */
|
|
29
|
+
tags: string[];
|
|
30
|
+
/** External links; only github/website/docs are surfaced. */
|
|
31
|
+
links: {
|
|
32
|
+
github?: string;
|
|
33
|
+
website?: string;
|
|
34
|
+
docs?: string;
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
/** Normalize one catalog record to an `OssApp` (drops a record with no id + name). */
|
|
38
|
+
export declare function normalizeOssApp(raw: unknown): OssApp | null;
|
|
39
|
+
/** Normalize the catalog payload to the app list (bare array OR a `{data|apps|…}` wrap). */
|
|
40
|
+
export declare function normalizeOssApps(payload: unknown): OssApp[];
|
|
41
|
+
/** The per-app blueprint asset base: `<base>/blueprints/<id>`. */
|
|
42
|
+
export declare function blueprintBase(base: string, id: string): string;
|
|
43
|
+
/**
|
|
44
|
+
* The app's logo URL, or null when the entry carries no logo filename — a surface then
|
|
45
|
+
* renders its monogram fallback rather than a broken image.
|
|
46
|
+
*/
|
|
47
|
+
export declare function logoUrl(base: string, app: OssApp): string | null;
|
|
48
|
+
/**
|
|
49
|
+
* Derive `owner/repo` from a GitHub URL — the maker identity, since the catalog
|
|
50
|
+
* carries no author field. Returns null for a non-GitHub / malformed URL.
|
|
51
|
+
*/
|
|
52
|
+
export declare function ownerRepo(githubUrl?: string): string | null;
|
|
53
|
+
/** An app is one-click deployable when it carries a buildable source (its repo). */
|
|
54
|
+
export declare function hasDeploySource(app: OssApp): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Fetch + normalize the catalog from `<base>/meta.json`. Cross-origin and
|
|
57
|
+
* unauthenticated (public CDN); throws on a non-2xx or parse failure so the caller can
|
|
58
|
+
* show an honest error state. Cached on success; `force` bypasses for a manual refresh.
|
|
59
|
+
*/
|
|
60
|
+
export declare function fetchOssApps(base: string, force?: boolean): Promise<OssApp[]>;
|
|
61
|
+
/**
|
|
62
|
+
* Fetch one app's `docker-compose.yml` as raw text, or null when the entry publishes
|
|
63
|
+
* none. A 404 is a NORMAL answer for a large community catalog — not every blueprint
|
|
64
|
+
* ships compose — so this never throws: a detail view treats an absent blueprint as
|
|
65
|
+
* "nothing to show", and an optional asset must not fail a whole page.
|
|
66
|
+
*/
|
|
67
|
+
export declare function fetchCompose(base: string, id: string): Promise<string | null>;
|
package/dist/oss.cjs
ADDED
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
// src/oss/catalog.ts
|
|
5
|
+
var str = (v) => typeof v === "string" ? v : "";
|
|
6
|
+
var strTrim = (v) => {
|
|
7
|
+
const s = str(v).trim();
|
|
8
|
+
return s ? s : void 0;
|
|
9
|
+
};
|
|
10
|
+
var strList = (v) => Array.isArray(v) ? v.map((x) => typeof x === "string" ? x.trim() : "").filter((x) => x !== "") : [];
|
|
11
|
+
var asRecord = (v) => v && typeof v === "object" && !Array.isArray(v) ? v : {};
|
|
12
|
+
function normalizeOssApp(raw) {
|
|
13
|
+
const r = asRecord(raw);
|
|
14
|
+
const id = str(r.id).trim();
|
|
15
|
+
const name = str(r.name).trim() || id;
|
|
16
|
+
if (!id || !name) return null;
|
|
17
|
+
const links = asRecord(r.links);
|
|
18
|
+
return {
|
|
19
|
+
id,
|
|
20
|
+
name,
|
|
21
|
+
description: str(r.description).trim(),
|
|
22
|
+
version: str(r.version).trim() || "latest",
|
|
23
|
+
logo: str(r.logo).trim(),
|
|
24
|
+
tags: strList(r.tags),
|
|
25
|
+
links: {
|
|
26
|
+
github: strTrim(links.github),
|
|
27
|
+
website: strTrim(links.website),
|
|
28
|
+
docs: strTrim(links.docs)
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function normalizeOssApps(payload) {
|
|
33
|
+
let arr = [];
|
|
34
|
+
if (Array.isArray(payload)) arr = payload;
|
|
35
|
+
else if (payload && typeof payload === "object") {
|
|
36
|
+
for (const k of ["data", "apps", "templates", "items", "rows"]) {
|
|
37
|
+
const v = payload[k];
|
|
38
|
+
if (Array.isArray(v)) {
|
|
39
|
+
arr = v;
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
const out = [];
|
|
45
|
+
const seen = /* @__PURE__ */ new Set();
|
|
46
|
+
for (const raw of arr) {
|
|
47
|
+
const app = normalizeOssApp(raw);
|
|
48
|
+
if (app && !seen.has(app.id)) {
|
|
49
|
+
seen.add(app.id);
|
|
50
|
+
out.push(app);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return out;
|
|
54
|
+
}
|
|
55
|
+
function blueprintBase(base, id) {
|
|
56
|
+
return `${base.replace(/\/+$/, "")}/blueprints/${encodeURIComponent(id)}`;
|
|
57
|
+
}
|
|
58
|
+
function logoUrl(base, app) {
|
|
59
|
+
if (!app.logo) return null;
|
|
60
|
+
return `${blueprintBase(base, app.id)}/${app.logo}`;
|
|
61
|
+
}
|
|
62
|
+
function ownerRepo(githubUrl) {
|
|
63
|
+
if (!githubUrl) return null;
|
|
64
|
+
const m = githubUrl.match(/github\.com\/([^/\s]+)\/([^/\s#?]+)/i);
|
|
65
|
+
if (!m) return null;
|
|
66
|
+
const owner = m[1];
|
|
67
|
+
const repo = m[2].replace(/\.git$/i, "");
|
|
68
|
+
if (!owner || !repo) return null;
|
|
69
|
+
return `${owner}/${repo}`;
|
|
70
|
+
}
|
|
71
|
+
function hasDeploySource(app) {
|
|
72
|
+
return Boolean(app.links.github);
|
|
73
|
+
}
|
|
74
|
+
var cache = /* @__PURE__ */ new Map();
|
|
75
|
+
var inflight = /* @__PURE__ */ new Map();
|
|
76
|
+
async function fetchOssApps(base, force = false) {
|
|
77
|
+
const key = base.replace(/\/+$/, "");
|
|
78
|
+
if (!force) {
|
|
79
|
+
const hit = cache.get(key);
|
|
80
|
+
if (hit) return hit;
|
|
81
|
+
const pending = inflight.get(key);
|
|
82
|
+
if (pending) return pending;
|
|
83
|
+
}
|
|
84
|
+
const run = (async () => {
|
|
85
|
+
const res = await fetch(`${key}/meta.json`, {
|
|
86
|
+
headers: { Accept: "application/json" },
|
|
87
|
+
// Public catalog — no credentials, so a session cookie never leaks cross-origin.
|
|
88
|
+
credentials: "omit"
|
|
89
|
+
});
|
|
90
|
+
if (!res.ok) throw new Error(`Catalog unavailable (HTTP ${res.status})`);
|
|
91
|
+
const apps = normalizeOssApps(await res.json());
|
|
92
|
+
cache.set(key, apps);
|
|
93
|
+
return apps;
|
|
94
|
+
})();
|
|
95
|
+
inflight.set(key, run);
|
|
96
|
+
try {
|
|
97
|
+
return await run;
|
|
98
|
+
} finally {
|
|
99
|
+
inflight.delete(key);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
async function fetchCompose(base, id) {
|
|
103
|
+
try {
|
|
104
|
+
const res = await fetch(`${blueprintBase(base, id)}/docker-compose.yml`, {
|
|
105
|
+
headers: { Accept: "text/plain" },
|
|
106
|
+
credentials: "omit"
|
|
107
|
+
});
|
|
108
|
+
if (!res.ok) return null;
|
|
109
|
+
const text = await res.text();
|
|
110
|
+
return text.trim() ? text : null;
|
|
111
|
+
} catch {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// src/oss/blueprint.ts
|
|
117
|
+
var indent = (line) => line.length - line.trimStart().length;
|
|
118
|
+
function parseBlueprint(yaml) {
|
|
119
|
+
const lines = String(yaml ?? "").split(/\r?\n/);
|
|
120
|
+
const services = [];
|
|
121
|
+
const env = /* @__PURE__ */ new Set();
|
|
122
|
+
let servicesAt = -1;
|
|
123
|
+
let current = null;
|
|
124
|
+
let currentAt = -1;
|
|
125
|
+
let listKey = null;
|
|
126
|
+
let listAt = -1;
|
|
127
|
+
for (const raw of lines) {
|
|
128
|
+
const line = raw.replace(/\t/g, " ");
|
|
129
|
+
const trimmed = line.trim();
|
|
130
|
+
if (!trimmed || trimmed.startsWith("#")) continue;
|
|
131
|
+
const col = indent(line);
|
|
132
|
+
if (servicesAt < 0) {
|
|
133
|
+
if (/^services\s*:/.test(trimmed)) servicesAt = col;
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
if (col <= servicesAt) {
|
|
137
|
+
if (!/^services\s*:/.test(trimmed)) break;
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
if (current === null || col <= currentAt) {
|
|
141
|
+
const m = trimmed.match(/^([A-Za-z0-9._-]+)\s*:\s*$/);
|
|
142
|
+
if (m) {
|
|
143
|
+
current = { name: m[1], ports: [] };
|
|
144
|
+
currentAt = col;
|
|
145
|
+
services.push(current);
|
|
146
|
+
listKey = null;
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
if (!current) continue;
|
|
151
|
+
if (listKey && col > listAt && trimmed.startsWith("-")) {
|
|
152
|
+
const item = trimmed.replace(/^-\s*/, "").replace(/^["']|["']$/g, "");
|
|
153
|
+
if (listKey === "ports") current.ports.push(item);
|
|
154
|
+
else {
|
|
155
|
+
const key = item.split(/[=:]/)[0]?.trim();
|
|
156
|
+
if (key) env.add(key);
|
|
157
|
+
}
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
listKey = null;
|
|
161
|
+
const img = trimmed.match(/^image\s*:\s*(.+)$/);
|
|
162
|
+
if (img) {
|
|
163
|
+
current.image = img[1].trim().replace(/^["']|["']$/g, "");
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
if (/^ports\s*:/.test(trimmed)) {
|
|
167
|
+
listKey = "ports";
|
|
168
|
+
listAt = col;
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
if (/^environment\s*:/.test(trimmed)) {
|
|
172
|
+
listKey = "environment";
|
|
173
|
+
listAt = col;
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return { services, env: [...env].sort((a, b) => a.localeCompare(b)) };
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
exports.blueprintBase = blueprintBase;
|
|
181
|
+
exports.fetchCompose = fetchCompose;
|
|
182
|
+
exports.fetchOssApps = fetchOssApps;
|
|
183
|
+
exports.hasDeploySource = hasDeploySource;
|
|
184
|
+
exports.logoUrl = logoUrl;
|
|
185
|
+
exports.normalizeOssApp = normalizeOssApp;
|
|
186
|
+
exports.normalizeOssApps = normalizeOssApps;
|
|
187
|
+
exports.ownerRepo = ownerRepo;
|
|
188
|
+
exports.parseBlueprint = parseBlueprint;
|
|
189
|
+
//# sourceMappingURL=oss.cjs.map
|
|
190
|
+
//# sourceMappingURL=oss.cjs.map
|