@tradalab/lyra 1.10.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -26,7 +26,7 @@ The stylesheet pulls in Tailwind v4, so your app needs `@tailwindcss/postcss`.
26
26
  |---|---|---|
27
27
  | `@tradalab/lyra/utils` | `cn` | server-safe |
28
28
  | `@tradalab/lyra/hooks` | `useMobile` | client |
29
- | `@tradalab/lyra/ui` | ~30 shadcn primitives + `AccountMenu` | client |
29
+ | `@tradalab/lyra/ui` | 60 shadcn primitives + `AccountMenu`, `Container` | client |
30
30
  | `@tradalab/lyra/shell` | `AppShell`, `NavItem`, `NavGroup`, `Breadcrumbs`, `useActiveRoute` | client |
31
31
  | `@tradalab/lyra/styles.css` | Tailwind v4 base + `radix-lyra` tokens (light/dark) | CSS |
32
32
 
@@ -46,9 +46,24 @@ make install # pnpm install
46
46
  make build # tsup + inject-use-client + verify-build-output
47
47
  make verify # typecheck + lint + test
48
48
  make ui-add <name> # scaffold a shadcn primitive, adapt, rebuild barrel
49
+ make ui-update <name> # overwrite a primitive with the latest upstream version
49
50
  make ui-sync # re-adapt every primitive + rebuild barrel
51
+ make ui-diff # report which primitives changed upstream (exit 1 if any)
50
52
  ```
51
53
 
54
+ **Staying current with shadcn** — `make ui-diff` compares every primitive
55
+ against the live `radix-lyra` registry and exits non-zero when one has moved.
56
+ It normalises away everything the CLI would rewrite anyway (icon-library
57
+ placeholders, `cn-*` template classes, import aliases, prettier line-wrapping),
58
+ so what it prints is real change. Prefer it over `shadcn add --diff`, which
59
+ caps its output at five files per run.
60
+
61
+ A primitive lyra deliberately diverges from carries a `customised` note in
62
+ `primitives.lock.json`; `ui-diff` lists those separately instead of failing on
63
+ them forever. Document the divergence in a JSDoc block in the file too —
64
+ `make ui-update` will overwrite it, and that note is what tells the next person
65
+ to put it back.
66
+
52
67
  **Layout** — `src/<layer>/` with a barrel `index.ts`; one tsup entry per
53
68
  subpath; ESM-only to `dist/`. **Layers** (enforced by `eslint-plugin-boundaries`):
54
69
  `utils`/`hooks` (foundation) → `ui` → `shell`. No upward imports.
@@ -57,7 +57,7 @@ declare function PanelCard({ title, description, hint, action, children }: Panel
57
57
 
58
58
  type ConfirmOptions = {
59
59
  title: string;
60
- description?: string;
60
+ description?: ReactNode;
61
61
  confirmText?: string;
62
62
  cancelText?: string;
63
63
  danger?: boolean;
@@ -1,7 +1,7 @@
1
1
  "use client";
2
- import { Label, Dialog, DialogOverlay, DialogContent, DialogTitle, DialogDescription } from '../chunk-44WIOUJJ.js';
3
- import { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from '../chunk-ZG5ZPKFL.js';
4
- import { Button } from '../chunk-KFQOYZ64.js';
2
+ import { Label, Dialog, DialogOverlay, DialogContent, DialogTitle, DialogDescription } from '../chunk-RSAN65FI.js';
3
+ import { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from '../chunk-LZZ3UOPT.js';
4
+ import { Button } from '../chunk-5Q4UTRYU.js';
5
5
  import { cn } from '../chunk-XH55BHUU.js';
6
6
  import * as React from 'react';
7
7
  import { createContext, useMemo, useState, useEffect, useContext, useCallback, useId } from 'react';
@@ -152,7 +152,7 @@ function ConfirmDialog({ options, onConfirm, onCancel }) {
152
152
  /* @__PURE__ */ jsx(DialogOverlay, { className: "fixed inset-0 bg-white/10" }),
153
153
  /* @__PURE__ */ jsxs(DialogContent, { className: cn("fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2", "p-4 w-[400px]", "focus:outline-none"), children: [
154
154
  /* @__PURE__ */ jsx(DialogTitle, { className: "text-sm font-medium", children: options.title }),
155
- options.description && /* @__PURE__ */ jsx(DialogDescription, { className: "mt-2 text-sm text-muted-foreground", children: options.description }),
155
+ options.description != null && /* @__PURE__ */ jsx(DialogDescription, { asChild: true, children: /* @__PURE__ */ jsx("div", { className: "mt-2 text-sm text-muted-foreground", children: options.description }) }),
156
156
  /* @__PURE__ */ jsxs("div", { className: "mt-2 flex justify-end gap-2", children: [
157
157
  /* @__PURE__ */ jsx(Button, { variant: "outline", size: "sm", onClick: onCancel, children: options.cancelText ?? "Cancel" }),
158
158
  /* @__PURE__ */ jsx(Button, { size: "sm", onClick: onConfirm, className: cn(options.danger && "bg-red-600 hover:bg-red-700 text-white"), children: options.confirmText ?? "Confirm" })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/blocks/form.tsx","../../src/blocks/panel.tsx","../../src/blocks/confirm/confirm-dialog.tsx","../../src/blocks/confirm/confirm-provider.tsx","../../src/blocks/confirm/use-confirm.tsx","../../src/blocks/tree/index.tsx"],"names":["jsx","jsxs","createContext","useState","useContext","useId"],"mappings":"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","file":"index.js","sourcesContent":["\nimport * as React from \"react\"\nimport { type Label as LabelPrimitive, Slot } from \"radix-ui\"\nimport { Controller, FormProvider, useFormContext, type ControllerProps, type FieldPath, type FieldValues } from \"react-hook-form\"\n\nimport { cn } from \"~/utils/cn.js\"\nimport { Label } from \"~/ui/primitives/label.js\"\n\nconst Form = FormProvider\n\ntype FormFieldContextValue<TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>> = {\n name: TName\n}\n\nconst FormFieldContext = React.createContext<FormFieldContextValue | null>(null)\n\nconst FormField = <TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>>({\n ...props\n}: ControllerProps<TFieldValues, TName>) => {\n return (\n <FormFieldContext.Provider value={{ name: props.name }}>\n <Controller {...props} />\n </FormFieldContext.Provider>\n )\n}\n\nconst useFormField = () => {\n const fieldContext = React.useContext(FormFieldContext)\n const itemContext = React.useContext(FormItemContext)\n const { getFieldState, formState } = useFormContext()\n\n if (!fieldContext) {\n throw new Error(\"useFormField should be used within <FormField>\")\n }\n\n const fieldState = getFieldState(fieldContext.name, formState)\n\n const { id } = itemContext || {}\n\n return {\n id,\n name: fieldContext.name,\n formItemId: `${id}-form-item`,\n formDescriptionId: `${id}-form-item-description`,\n formMessageId: `${id}-form-item-message`,\n ...fieldState,\n }\n}\n\ntype FormItemContextValue = {\n id: string\n}\n\nconst FormItemContext = React.createContext<FormItemContextValue | null>(null)\n\nfunction FormItem({ className, ...props }: React.ComponentProps<\"div\">) {\n const id = React.useId()\n\n return (\n <FormItemContext.Provider value={{ id }}>\n <div data-slot=\"form-item\" className={cn(\"grid gap-2\", className)} {...props} />\n </FormItemContext.Provider>\n )\n}\n\nfunction FormLabel({ className, ...props }: React.ComponentProps<typeof LabelPrimitive.Root>) {\n const { error, formItemId } = useFormField()\n\n return <Label data-slot=\"form-label\" data-error={!!error} className={cn(\"data-[error=true]:text-destructive\", className)} htmlFor={formItemId} {...props} />\n}\n\nfunction FormControl({ ...props }: React.ComponentProps<typeof Slot.Root>) {\n const { error, formItemId, formDescriptionId, formMessageId } = useFormField()\n\n return (\n <Slot.Root\n data-slot=\"form-control\"\n id={formItemId}\n aria-describedby={!error ? `${formDescriptionId}` : `${formDescriptionId} ${formMessageId}`}\n aria-invalid={!!error}\n {...props}\n />\n )\n}\n\nfunction FormDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n const { formDescriptionId } = useFormField()\n\n return <p data-slot=\"form-description\" id={formDescriptionId} className={cn(\"text-muted-foreground text-sm\", className)} {...props} />\n}\n\nfunction FormMessage({ className, ...props }: React.ComponentProps<\"p\">) {\n const { error, formMessageId } = useFormField()\n const body = error ? String(error?.message ?? \"\") : props.children\n\n if (!body) {\n return null\n }\n\n return (\n <p data-slot=\"form-message\" id={formMessageId} className={cn(\"text-destructive text-sm\", className)} {...props}>\n {body}\n </p>\n )\n}\n\nexport { useFormField, Form, FormItem, FormLabel, FormControl, FormDescription, FormMessage, FormField }\n","\nimport { type ReactNode, useEffect, useMemo, useState } from \"react\"\nimport { useRouter, useSearchParams } from \"next/navigation\"\nimport { type LucideIcon } from \"lucide-react\"\nimport { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from \"~/ui/primitives/card.js\"\nimport { cn } from \"~/utils/cn.js\"\n\ntype PanelItemType = {\n key: string\n label: string\n icon?: LucideIcon\n danger?: boolean\n hasError?: boolean\n content: ReactNode\n}\n\nexport function Panel({ name, items, enable_url }: { name?: string; items: PanelItemType[]; enable_url?: boolean }) {\n const router = useRouter()\n const params = useSearchParams()\n\n const defaultKey = items[0]?.key\n\n const panelKey = useMemo(() => `panel${name ? \"-\" + name : \"\"}`, [name])\n\n // get panel from url\n const panelFromUrl = useMemo(() => {\n if (!enable_url) return defaultKey\n return params.get(panelKey) ?? defaultKey\n }, [enable_url, params, defaultKey, panelKey])\n\n // set active\n const [active, setActive] = useState(panelFromUrl)\n\n // sync URL → state\n useEffect(() => {\n if (!enable_url) return\n setActive(panelFromUrl)\n }, [panelFromUrl, enable_url])\n\n const current = items.find(s => s.key === active) ?? items[0]\n if (!current) return null\n\n const navigate = (key: string) => {\n if (key === active) return\n setActive(key)\n if (!enable_url) return\n router.replace(`?${panelKey}=${key}`, { scroll: false })\n }\n\n return (\n <div className=\"space-y-6 h-full min-h-0 flex flex-col\">\n {/* Mobi */}\n <div className=\"lg:hidden\">\n <div className=\"inline-flex rounded-lg bg-muted p-1\">\n {items?.map(s => (\n <button\n key={s.key}\n onClick={() => navigate(s.key)}\n className={cn(\n \"rounded-md px-3 py-1.5 text-sm transition-all\",\n active === s.key ? \"bg-background text-foreground shadow-sm\" : s.danger ? \"text-destructive\" : \"text-muted-foreground hover:text-foreground\"\n )}\n >\n <span className=\"relative flex items-center gap-2\">\n {s.icon && <s.icon className=\"h-4 w-4\" />}\n {s.label}\n {s.hasError && <span className=\"absolute -top-1 -right-2 flex h-2 w-2 rounded-full bg-destructive\" />}\n </span>\n </button>\n ))}\n </div>\n </div>\n\n {/* Desktop */}\n <div className=\"grid grid-cols-1 gap-8 lg:grid-cols-[240px_1fr] flex-1 min-h-0\">\n {/* Sidebar */}\n <aside className=\"hidden space-y-1 lg:block overflow-y-auto min-h-0 pr-1 [overflow:overlay]\">\n {items?.map(s => (\n <PanelItem key={s.key} active={active === s.key} icon={s.icon} danger={s.danger} hasError={s.hasError} onClick={() => navigate(s.key)}>\n {s.label}\n </PanelItem>\n ))}\n </aside>\n {/* Content */}\n <div className=\"space-y-6 overflow-y-auto min-h-0 pr-1 [overflow:overlay]\">{current.content}</div>\n </div>\n </div>\n )\n}\n\nexport interface PanelItemProps {\n children: ReactNode\n active?: boolean\n icon?: LucideIcon\n danger?: boolean\n hasError?: boolean\n onClick?: () => void\n}\n\nfunction PanelItem({ children, active, icon: Icon, danger, hasError, onClick }: PanelItemProps) {\n return (\n <div\n onClick={onClick}\n className={cn(\n \"cursor-pointer rounded-md px-3 py-2 text-sm transition-colors flex items-center justify-between\",\n active ? \"bg-muted font-medium\" : danger ? \"text-destructive hover:bg-destructive/10\" : \"text-muted-foreground hover:bg-muted\"\n )}\n >\n <span className=\"flex items-center gap-2\">\n {Icon && <Icon className=\"h-4 w-4 shrink-0\" />}\n {children}\n </span>\n {hasError && <span className=\"h-2 w-2 rounded-full bg-destructive\" />}\n </div>\n )\n}\n\nexport interface PanelCardProps {\n title: string\n description?: string\n hint?: string\n action?: ReactNode\n children?: ReactNode\n}\n\nexport function PanelCard({ title, description, hint, action, children }: PanelCardProps) {\n return (\n <Card className={cn({ \"pb-3\": hint || action })}>\n <CardHeader>\n <CardTitle className=\"text-base\">{title}</CardTitle>\n {description && <CardDescription className=\"max-w-2xl\">{description}</CardDescription>}\n </CardHeader>\n {children && <CardContent>{children}</CardContent>}\n {(hint || action) && (\n <CardFooter className=\"flex items-center justify-between border-t !pt-3 !pb-0\">\n <p className=\"text-sm text-muted-foreground\">{hint}</p>\n {action}\n </CardFooter>\n )}\n </Card>\n )\n}\n","\nimport { Dialog, DialogContent, DialogDescription, DialogOverlay, DialogTitle } from \"~/ui/primitives/dialog.js\"\nimport { Button } from \"~/ui/primitives/button.js\"\nimport { type ConfirmOptions } from \"./types.js\"\nimport { cn } from \"~/utils/cn.js\"\n\ntype Props = {\n options: ConfirmOptions\n onConfirm: () => void\n onCancel: () => void\n}\n\nexport function ConfirmDialog({ options, onConfirm, onCancel }: Props) {\n return (\n <Dialog open onOpenChange={val => !val && onCancel()}>\n <DialogOverlay className=\"fixed inset-0 bg-white/10\" />\n <DialogContent className={cn(\"fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2\", \"p-4 w-[400px]\", \"focus:outline-none\")}>\n <DialogTitle className=\"text-sm font-medium\">{options.title}</DialogTitle>\n {options.description && <DialogDescription className=\"mt-2 text-sm text-muted-foreground\">{options.description}</DialogDescription>}\n\n <div className=\"mt-2 flex justify-end gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={onCancel}>\n {options.cancelText ?? \"Cancel\"}\n </Button>\n <Button size=\"sm\" onClick={onConfirm} className={cn(options.danger && \"bg-red-600 hover:bg-red-700 text-white\")}>\n {options.confirmText ?? \"Confirm\"}\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n","\nimport { createContext, type ReactNode, useState } from \"react\"\nimport { type ConfirmOptions } from \"./types.js\"\nimport { ConfirmDialog } from \"./confirm-dialog.js\"\n\nexport type ConfirmFn = (options: ConfirmOptions) => Promise<boolean>\n\nexport const ConfirmContext = createContext<ConfirmFn | null>(null)\n\nexport function ConfirmProvider({ children }: { children: ReactNode }) {\n const [state, setState] = useState<{\n options: ConfirmOptions\n resolve: (v: boolean) => void\n } | null>(null)\n\n const confirm: ConfirmFn = options => new Promise<boolean>(resolve => setState({ options, resolve }))\n\n const close = (result: boolean) => {\n state?.resolve(result)\n setState(null)\n }\n\n return (\n <ConfirmContext.Provider value={confirm}>\n {children}\n\n {state && <ConfirmDialog options={state.options} onConfirm={() => close(true)} onCancel={() => close(false)} />}\n </ConfirmContext.Provider>\n )\n}\n","\nimport { useContext } from \"react\"\nimport { ConfirmContext } from \"./confirm-provider.js\"\n\nexport const useConfirm = () => {\n const ctx = useContext(ConfirmContext)\n if (!ctx) {\n throw new Error(\"useConfirm must be used inside ConfirmProvider\")\n }\n return ctx\n}\n","\nimport { ChevronRight, File, Folder, FolderOpen } from \"lucide-react\"\nimport { createContext, type HTMLAttributes, type ReactNode, useCallback, useContext, useId, useState } from \"react\"\nimport { cn } from \"~/utils/cn.js\"\n\ntype TreeContextType = {\n expandedIds: Set<string>\n selectedIds: string[]\n toggleExpanded: (nodeId: string) => void\n handleSelection: (nodeId: string, ctrlKey: boolean) => void\n showLines?: boolean\n showIcons?: boolean\n selectable?: boolean\n multiSelect?: boolean\n indent?: number\n animateExpand?: boolean\n}\n\nconst TreeContext = createContext<TreeContextType | undefined>(undefined)\n\nconst useTree = () => {\n const context = useContext(TreeContext)\n if (!context) {\n throw new Error(\"Tree components must be used within a TreeProvider\")\n }\n return context\n}\n\ntype TreeNodeContextType = {\n nodeId: string\n level: number\n isLast: boolean\n parentPath: boolean[]\n}\n\nconst TreeNodeContext = createContext<TreeNodeContextType | undefined>(undefined)\n\nconst useTreeNode = () => {\n const context = useContext(TreeNodeContext)\n if (!context) {\n throw new Error(\"TreeNode components must be used within a TreeNode\")\n }\n return context\n}\n\nexport type TreeProviderProps = {\n children: ReactNode\n defaultExpandedIds?: string[]\n showLines?: boolean\n showIcons?: boolean\n selectable?: boolean\n multiSelect?: boolean\n selectedIds?: string[]\n onSelectionChange?: (selectedIds: string[]) => void\n expandedIds?: Set<string>\n onExpandedChange?: (expandedIds: Set<string>) => void\n indent?: number\n animateExpand?: boolean\n className?: string\n}\n\nexport const TreeProvider = ({\n children,\n defaultExpandedIds = [],\n showLines = true,\n showIcons = true,\n selectable = true,\n multiSelect = false,\n selectedIds,\n onSelectionChange,\n indent = 20,\n animateExpand = true,\n className,\n expandedIds,\n onExpandedChange,\n}: TreeProviderProps) => {\n const [internalExpandedIds, setInternalExpandedIds] = useState<Set<string>>(new Set(defaultExpandedIds))\n const [internalSelectedIds, setInternalSelectedIds] = useState<string[]>(selectedIds ?? [])\n\n const isControlledSelected = selectedIds !== undefined && onSelectionChange !== undefined\n const currentSelectedIds = isControlledSelected ? selectedIds : internalSelectedIds\n\n const isControlledExpanded = expandedIds !== undefined && onExpandedChange !== undefined\n const currentExpandedIds = isControlledExpanded ? expandedIds : internalExpandedIds\n\n const toggleExpanded = useCallback(\n (nodeId: string) => {\n const newSet = new Set<string>(currentExpandedIds)\n if (newSet.has(nodeId)) {\n newSet.delete(nodeId)\n } else {\n newSet.add(nodeId)\n }\n\n if (isControlledExpanded) {\n onExpandedChange?.(newSet)\n } else {\n setInternalExpandedIds(newSet)\n }\n },\n [currentExpandedIds, isControlledExpanded, onExpandedChange]\n )\n\n const handleSelection = useCallback(\n (nodeId: string, ctrlKey = false) => {\n if (!selectable) {\n return\n }\n\n let newSelection: string[]\n\n if (multiSelect && ctrlKey) {\n newSelection = currentSelectedIds.includes(nodeId) ? currentSelectedIds.filter(id => id !== nodeId) : [...currentSelectedIds, nodeId]\n } else {\n newSelection = currentSelectedIds.includes(nodeId) ? [] : [nodeId]\n }\n\n if (isControlledSelected) {\n onSelectionChange?.(newSelection)\n } else {\n setInternalSelectedIds(newSelection)\n }\n },\n [selectable, multiSelect, currentSelectedIds, isControlledSelected, onSelectionChange]\n )\n\n return (\n <TreeContext.Provider\n value={{\n expandedIds: currentExpandedIds,\n selectedIds: currentSelectedIds,\n toggleExpanded,\n handleSelection,\n showLines,\n showIcons,\n selectable,\n multiSelect,\n indent,\n animateExpand,\n }}\n >\n <div className={cn(\"w-full\", className)}>{children}</div>\n </TreeContext.Provider>\n )\n}\n\nexport type TreeViewProps = HTMLAttributes<HTMLDivElement>\n\nexport const TreeView = ({ className, children, ...props }: TreeViewProps) => (\n <div className={cn(\"p-2\", className)} {...props}>\n {children}\n </div>\n)\n\nexport type TreeNodeProps = HTMLAttributes<HTMLDivElement> & {\n nodeId?: string\n level?: number\n isLast?: boolean\n parentPath?: boolean[]\n children?: ReactNode\n}\n\nexport const TreeNode = ({ nodeId: providedNodeId, level = 0, isLast = false, parentPath = [], children, className, onClick: _onClick, ...props }: TreeNodeProps) => {\n const generatedId = useId()\n const nodeId = providedNodeId ?? generatedId\n\n // Build the parent path - mark positions where the parent was the last child\n const currentPath = level === 0 ? [] : [...parentPath]\n if (level > 0 && parentPath.length < level - 1) {\n // Fill in missing levels with false (not last)\n while (currentPath.length < level - 1) {\n currentPath.push(false)\n }\n }\n if (level > 0) {\n currentPath[level - 1] = isLast\n }\n\n return (\n <TreeNodeContext.Provider\n value={{\n nodeId,\n level,\n isLast,\n parentPath: currentPath,\n }}\n >\n <div className={cn(\"select-none\", className)} {...props}>\n {children}\n </div>\n </TreeNodeContext.Provider>\n )\n}\n\nexport type TreeNodeTriggerProps = HTMLAttributes<HTMLDivElement> & {\n expandOnClick?: boolean\n}\n\nexport const TreeNodeTrigger = ({ children, className, onClick, expandOnClick = false, ...props }: TreeNodeTriggerProps) => {\n const { selectedIds, handleSelection, toggleExpanded, indent } = useTree()\n const { nodeId, level } = useTreeNode()\n const isSelected = selectedIds.includes(nodeId)\n\n return (\n <div\n className={cn(\n \"group relative mx-1 flex cursor-pointer items-center rounded-md px-3 transition-all duration-200\",\n \"hover:bg-accent/50\",\n isSelected && \"bg-accent/80\",\n className\n )}\n style={{ paddingLeft: level * (indent ?? 0) + 8, paddingTop: \"var(--tree-item-py)\", paddingBottom: \"var(--tree-item-py)\" }}\n onClick={e => {\n handleSelection(nodeId, e.ctrlKey || e.metaKey)\n if (expandOnClick) toggleExpanded(nodeId)\n onClick?.(e)\n }}\n onDoubleClick={e => {\n if (e.ctrlKey || e.metaKey) return\n toggleExpanded(nodeId)\n }}\n {...props}\n >\n <TreeLines />\n {children}\n </div>\n )\n}\n\nexport const TreeLines = () => {\n const { showLines, indent } = useTree()\n const { level, isLast, parentPath } = useTreeNode()\n\n if (!showLines || level === 0) {\n return null\n }\n\n return (\n <div className=\"pointer-events-none absolute top-0 bottom-0 left-0\">\n {/* Render vertical lines for all parent levels */}\n {Array.from({ length: level }, (_, index) => {\n const shouldHideLine = parentPath[index] === true\n if (shouldHideLine && index === level - 1) {\n return null\n }\n\n return (\n <div\n className=\"absolute top-0 bottom-0 border-border/40 border-l\"\n key={index.toString()}\n style={{\n left: index * (indent ?? 0) + 12,\n display: shouldHideLine ? \"none\" : \"block\",\n }}\n />\n )\n })}\n\n {/* Horizontal connector line */}\n <div\n className=\"absolute top-1/2 border-border/40 border-t\"\n style={{\n left: (level - 1) * (indent ?? 0) + 12,\n width: (indent ?? 0) - 4,\n transform: \"translateY(-1px)\",\n }}\n />\n\n {/* Vertical line to midpoint for last items */}\n {isLast && (\n <div\n className=\"absolute top-0 border-border/40 border-l\"\n style={{\n left: (level - 1) * (indent ?? 0) + 12,\n height: \"50%\",\n }}\n />\n )}\n </div>\n )\n}\n\nexport type TreeNodeContentProps = HTMLAttributes<HTMLDivElement> & {\n hasChildren?: boolean\n}\n\nexport const TreeNodeContent = ({ children, hasChildren = false, className, ...props }: TreeNodeContentProps) => {\n const { expandedIds } = useTree()\n const { nodeId } = useTreeNode()\n const isExpanded = expandedIds.has(nodeId)\n\n if (!hasChildren || !isExpanded) {\n return null\n }\n\n return (\n <div className={className} {...props}>\n {children}\n </div>\n )\n}\n\nexport type TreeExpanderProps = HTMLAttributes<HTMLDivElement> & {\n hasChildren?: boolean\n}\n\nexport const TreeExpander = ({ hasChildren = false, className, onClick, ...props }: TreeExpanderProps) => {\n const { expandedIds, toggleExpanded } = useTree()\n const { nodeId } = useTreeNode()\n const isExpanded = expandedIds.has(nodeId)\n\n if (!hasChildren) {\n return <div className=\"mr-1 h-4 w-4\" />\n }\n\n return (\n <div\n className={cn(\"mr-1 flex h-4 w-4 items-center justify-center transition-transform duration-150\", isExpanded && \"rotate-90\", className)}\n onClick={e => {\n e.stopPropagation()\n toggleExpanded(nodeId)\n onClick?.(e)\n }}\n {...props}\n >\n <ChevronRight className=\"h-3 w-3 text-muted-foreground\" />\n </div>\n )\n}\n\nexport type TreeIconProps = HTMLAttributes<HTMLDivElement> & {\n icon?: ReactNode\n hasChildren?: boolean\n}\n\nexport const TreeIcon = ({ icon, hasChildren = false, className, ...props }: TreeIconProps) => {\n const { showIcons, expandedIds } = useTree()\n const { nodeId } = useTreeNode()\n const isExpanded = expandedIds.has(nodeId)\n\n if (!showIcons) {\n return null\n }\n\n const getDefaultIcon = () => (hasChildren ? isExpanded ? <FolderOpen className=\"h-4 w-4\" /> : <Folder className=\"h-4 w-4\" /> : <File className=\"h-4 w-4\" />)\n\n return (\n <div className={cn(\"mr-2 flex h-4 w-4 items-center justify-center text-muted-foreground transition-transform\", className)} {...props}>\n {icon || getDefaultIcon()}\n </div>\n )\n}\n\nexport type TreeLabelProps = HTMLAttributes<HTMLSpanElement>\n\nexport const TreeLabel = ({ className, ...props }: TreeLabelProps) => <span className={cn(\"font flex-1 truncate text-sm\", className)} {...props} />\n"]}
1
+ {"version":3,"sources":["../../src/blocks/form.tsx","../../src/blocks/panel.tsx","../../src/blocks/confirm/confirm-dialog.tsx","../../src/blocks/confirm/confirm-provider.tsx","../../src/blocks/confirm/use-confirm.tsx","../../src/blocks/tree/index.tsx"],"names":["jsx","jsxs","createContext","useState","useContext","useId"],"mappings":"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","file":"index.js","sourcesContent":["\nimport * as React from \"react\"\nimport { type Label as LabelPrimitive, Slot } from \"radix-ui\"\nimport { Controller, FormProvider, useFormContext, type ControllerProps, type FieldPath, type FieldValues } from \"react-hook-form\"\n\nimport { cn } from \"~/utils/cn.js\"\nimport { Label } from \"~/ui/primitives/label.js\"\n\nconst Form = FormProvider\n\ntype FormFieldContextValue<TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>> = {\n name: TName\n}\n\nconst FormFieldContext = React.createContext<FormFieldContextValue | null>(null)\n\nconst FormField = <TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>>({\n ...props\n}: ControllerProps<TFieldValues, TName>) => {\n return (\n <FormFieldContext.Provider value={{ name: props.name }}>\n <Controller {...props} />\n </FormFieldContext.Provider>\n )\n}\n\nconst useFormField = () => {\n const fieldContext = React.useContext(FormFieldContext)\n const itemContext = React.useContext(FormItemContext)\n const { getFieldState, formState } = useFormContext()\n\n if (!fieldContext) {\n throw new Error(\"useFormField should be used within <FormField>\")\n }\n\n const fieldState = getFieldState(fieldContext.name, formState)\n\n const { id } = itemContext || {}\n\n return {\n id,\n name: fieldContext.name,\n formItemId: `${id}-form-item`,\n formDescriptionId: `${id}-form-item-description`,\n formMessageId: `${id}-form-item-message`,\n ...fieldState,\n }\n}\n\ntype FormItemContextValue = {\n id: string\n}\n\nconst FormItemContext = React.createContext<FormItemContextValue | null>(null)\n\nfunction FormItem({ className, ...props }: React.ComponentProps<\"div\">) {\n const id = React.useId()\n\n return (\n <FormItemContext.Provider value={{ id }}>\n <div data-slot=\"form-item\" className={cn(\"grid gap-2\", className)} {...props} />\n </FormItemContext.Provider>\n )\n}\n\nfunction FormLabel({ className, ...props }: React.ComponentProps<typeof LabelPrimitive.Root>) {\n const { error, formItemId } = useFormField()\n\n return <Label data-slot=\"form-label\" data-error={!!error} className={cn(\"data-[error=true]:text-destructive\", className)} htmlFor={formItemId} {...props} />\n}\n\nfunction FormControl({ ...props }: React.ComponentProps<typeof Slot.Root>) {\n const { error, formItemId, formDescriptionId, formMessageId } = useFormField()\n\n return (\n <Slot.Root\n data-slot=\"form-control\"\n id={formItemId}\n aria-describedby={!error ? `${formDescriptionId}` : `${formDescriptionId} ${formMessageId}`}\n aria-invalid={!!error}\n {...props}\n />\n )\n}\n\nfunction FormDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n const { formDescriptionId } = useFormField()\n\n return <p data-slot=\"form-description\" id={formDescriptionId} className={cn(\"text-muted-foreground text-sm\", className)} {...props} />\n}\n\nfunction FormMessage({ className, ...props }: React.ComponentProps<\"p\">) {\n const { error, formMessageId } = useFormField()\n const body = error ? String(error?.message ?? \"\") : props.children\n\n if (!body) {\n return null\n }\n\n return (\n <p data-slot=\"form-message\" id={formMessageId} className={cn(\"text-destructive text-sm\", className)} {...props}>\n {body}\n </p>\n )\n}\n\nexport { useFormField, Form, FormItem, FormLabel, FormControl, FormDescription, FormMessage, FormField }\n","\nimport { type ReactNode, useEffect, useMemo, useState } from \"react\"\nimport { useRouter, useSearchParams } from \"next/navigation\"\nimport { type LucideIcon } from \"lucide-react\"\nimport { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from \"~/ui/primitives/card.js\"\nimport { cn } from \"~/utils/cn.js\"\n\ntype PanelItemType = {\n key: string\n label: string\n icon?: LucideIcon\n danger?: boolean\n hasError?: boolean\n content: ReactNode\n}\n\nexport function Panel({ name, items, enable_url }: { name?: string; items: PanelItemType[]; enable_url?: boolean }) {\n const router = useRouter()\n const params = useSearchParams()\n\n const defaultKey = items[0]?.key\n\n const panelKey = useMemo(() => `panel${name ? \"-\" + name : \"\"}`, [name])\n\n // get panel from url\n const panelFromUrl = useMemo(() => {\n if (!enable_url) return defaultKey\n return params.get(panelKey) ?? defaultKey\n }, [enable_url, params, defaultKey, panelKey])\n\n // set active\n const [active, setActive] = useState(panelFromUrl)\n\n // sync URL → state\n useEffect(() => {\n if (!enable_url) return\n setActive(panelFromUrl)\n }, [panelFromUrl, enable_url])\n\n const current = items.find(s => s.key === active) ?? items[0]\n if (!current) return null\n\n const navigate = (key: string) => {\n if (key === active) return\n setActive(key)\n if (!enable_url) return\n router.replace(`?${panelKey}=${key}`, { scroll: false })\n }\n\n return (\n <div className=\"space-y-6 h-full min-h-0 flex flex-col\">\n {/* Mobi */}\n <div className=\"lg:hidden\">\n <div className=\"inline-flex rounded-lg bg-muted p-1\">\n {items?.map(s => (\n <button\n key={s.key}\n onClick={() => navigate(s.key)}\n className={cn(\n \"rounded-md px-3 py-1.5 text-sm transition-all\",\n active === s.key ? \"bg-background text-foreground shadow-sm\" : s.danger ? \"text-destructive\" : \"text-muted-foreground hover:text-foreground\"\n )}\n >\n <span className=\"relative flex items-center gap-2\">\n {s.icon && <s.icon className=\"h-4 w-4\" />}\n {s.label}\n {s.hasError && <span className=\"absolute -top-1 -right-2 flex h-2 w-2 rounded-full bg-destructive\" />}\n </span>\n </button>\n ))}\n </div>\n </div>\n\n {/* Desktop */}\n <div className=\"grid grid-cols-1 gap-8 lg:grid-cols-[240px_1fr] flex-1 min-h-0\">\n {/* Sidebar */}\n <aside className=\"hidden space-y-1 lg:block overflow-y-auto min-h-0 pr-1 [overflow:overlay]\">\n {items?.map(s => (\n <PanelItem key={s.key} active={active === s.key} icon={s.icon} danger={s.danger} hasError={s.hasError} onClick={() => navigate(s.key)}>\n {s.label}\n </PanelItem>\n ))}\n </aside>\n {/* Content */}\n <div className=\"space-y-6 overflow-y-auto min-h-0 pr-1 [overflow:overlay]\">{current.content}</div>\n </div>\n </div>\n )\n}\n\nexport interface PanelItemProps {\n children: ReactNode\n active?: boolean\n icon?: LucideIcon\n danger?: boolean\n hasError?: boolean\n onClick?: () => void\n}\n\nfunction PanelItem({ children, active, icon: Icon, danger, hasError, onClick }: PanelItemProps) {\n return (\n <div\n onClick={onClick}\n className={cn(\n \"cursor-pointer rounded-md px-3 py-2 text-sm transition-colors flex items-center justify-between\",\n active ? \"bg-muted font-medium\" : danger ? \"text-destructive hover:bg-destructive/10\" : \"text-muted-foreground hover:bg-muted\"\n )}\n >\n <span className=\"flex items-center gap-2\">\n {Icon && <Icon className=\"h-4 w-4 shrink-0\" />}\n {children}\n </span>\n {hasError && <span className=\"h-2 w-2 rounded-full bg-destructive\" />}\n </div>\n )\n}\n\nexport interface PanelCardProps {\n title: string\n description?: string\n hint?: string\n action?: ReactNode\n children?: ReactNode\n}\n\nexport function PanelCard({ title, description, hint, action, children }: PanelCardProps) {\n return (\n <Card className={cn({ \"pb-3\": hint || action })}>\n <CardHeader>\n <CardTitle className=\"text-base\">{title}</CardTitle>\n {description && <CardDescription className=\"max-w-2xl\">{description}</CardDescription>}\n </CardHeader>\n {children && <CardContent>{children}</CardContent>}\n {(hint || action) && (\n <CardFooter className=\"flex items-center justify-between border-t !pt-3 !pb-0\">\n <p className=\"text-sm text-muted-foreground\">{hint}</p>\n {action}\n </CardFooter>\n )}\n </Card>\n )\n}\n","\nimport { Dialog, DialogContent, DialogDescription, DialogOverlay, DialogTitle } from \"~/ui/primitives/dialog.js\"\nimport { Button } from \"~/ui/primitives/button.js\"\nimport { type ConfirmOptions } from \"./types.js\"\nimport { cn } from \"~/utils/cn.js\"\n\ntype Props = {\n options: ConfirmOptions\n onConfirm: () => void\n onCancel: () => void\n}\n\nexport function ConfirmDialog({ options, onConfirm, onCancel }: Props) {\n return (\n <Dialog open onOpenChange={val => !val && onCancel()}>\n <DialogOverlay className=\"fixed inset-0 bg-white/10\" />\n <DialogContent className={cn(\"fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2\", \"p-4 w-[400px]\", \"focus:outline-none\")}>\n <DialogTitle className=\"text-sm font-medium\">{options.title}</DialogTitle>\n {options.description != null && (\n <DialogDescription asChild>\n <div className=\"mt-2 text-sm text-muted-foreground\">{options.description}</div>\n </DialogDescription>\n )}\n\n <div className=\"mt-2 flex justify-end gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={onCancel}>\n {options.cancelText ?? \"Cancel\"}\n </Button>\n <Button size=\"sm\" onClick={onConfirm} className={cn(options.danger && \"bg-red-600 hover:bg-red-700 text-white\")}>\n {options.confirmText ?? \"Confirm\"}\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n","\nimport { createContext, type ReactNode, useState } from \"react\"\nimport { type ConfirmOptions } from \"./types.js\"\nimport { ConfirmDialog } from \"./confirm-dialog.js\"\n\nexport type ConfirmFn = (options: ConfirmOptions) => Promise<boolean>\n\nexport const ConfirmContext = createContext<ConfirmFn | null>(null)\n\nexport function ConfirmProvider({ children }: { children: ReactNode }) {\n const [state, setState] = useState<{\n options: ConfirmOptions\n resolve: (v: boolean) => void\n } | null>(null)\n\n const confirm: ConfirmFn = options => new Promise<boolean>(resolve => setState({ options, resolve }))\n\n const close = (result: boolean) => {\n state?.resolve(result)\n setState(null)\n }\n\n return (\n <ConfirmContext.Provider value={confirm}>\n {children}\n\n {state && <ConfirmDialog options={state.options} onConfirm={() => close(true)} onCancel={() => close(false)} />}\n </ConfirmContext.Provider>\n )\n}\n","\nimport { useContext } from \"react\"\nimport { ConfirmContext } from \"./confirm-provider.js\"\n\nexport const useConfirm = () => {\n const ctx = useContext(ConfirmContext)\n if (!ctx) {\n throw new Error(\"useConfirm must be used inside ConfirmProvider\")\n }\n return ctx\n}\n","\nimport { ChevronRight, File, Folder, FolderOpen } from \"lucide-react\"\nimport { createContext, type HTMLAttributes, type ReactNode, useCallback, useContext, useId, useState } from \"react\"\nimport { cn } from \"~/utils/cn.js\"\n\ntype TreeContextType = {\n expandedIds: Set<string>\n selectedIds: string[]\n toggleExpanded: (nodeId: string) => void\n handleSelection: (nodeId: string, ctrlKey: boolean) => void\n showLines?: boolean\n showIcons?: boolean\n selectable?: boolean\n multiSelect?: boolean\n indent?: number\n animateExpand?: boolean\n}\n\nconst TreeContext = createContext<TreeContextType | undefined>(undefined)\n\nconst useTree = () => {\n const context = useContext(TreeContext)\n if (!context) {\n throw new Error(\"Tree components must be used within a TreeProvider\")\n }\n return context\n}\n\ntype TreeNodeContextType = {\n nodeId: string\n level: number\n isLast: boolean\n parentPath: boolean[]\n}\n\nconst TreeNodeContext = createContext<TreeNodeContextType | undefined>(undefined)\n\nconst useTreeNode = () => {\n const context = useContext(TreeNodeContext)\n if (!context) {\n throw new Error(\"TreeNode components must be used within a TreeNode\")\n }\n return context\n}\n\nexport type TreeProviderProps = {\n children: ReactNode\n defaultExpandedIds?: string[]\n showLines?: boolean\n showIcons?: boolean\n selectable?: boolean\n multiSelect?: boolean\n selectedIds?: string[]\n onSelectionChange?: (selectedIds: string[]) => void\n expandedIds?: Set<string>\n onExpandedChange?: (expandedIds: Set<string>) => void\n indent?: number\n animateExpand?: boolean\n className?: string\n}\n\nexport const TreeProvider = ({\n children,\n defaultExpandedIds = [],\n showLines = true,\n showIcons = true,\n selectable = true,\n multiSelect = false,\n selectedIds,\n onSelectionChange,\n indent = 20,\n animateExpand = true,\n className,\n expandedIds,\n onExpandedChange,\n}: TreeProviderProps) => {\n const [internalExpandedIds, setInternalExpandedIds] = useState<Set<string>>(new Set(defaultExpandedIds))\n const [internalSelectedIds, setInternalSelectedIds] = useState<string[]>(selectedIds ?? [])\n\n const isControlledSelected = selectedIds !== undefined && onSelectionChange !== undefined\n const currentSelectedIds = isControlledSelected ? selectedIds : internalSelectedIds\n\n const isControlledExpanded = expandedIds !== undefined && onExpandedChange !== undefined\n const currentExpandedIds = isControlledExpanded ? expandedIds : internalExpandedIds\n\n const toggleExpanded = useCallback(\n (nodeId: string) => {\n const newSet = new Set<string>(currentExpandedIds)\n if (newSet.has(nodeId)) {\n newSet.delete(nodeId)\n } else {\n newSet.add(nodeId)\n }\n\n if (isControlledExpanded) {\n onExpandedChange?.(newSet)\n } else {\n setInternalExpandedIds(newSet)\n }\n },\n [currentExpandedIds, isControlledExpanded, onExpandedChange]\n )\n\n const handleSelection = useCallback(\n (nodeId: string, ctrlKey = false) => {\n if (!selectable) {\n return\n }\n\n let newSelection: string[]\n\n if (multiSelect && ctrlKey) {\n newSelection = currentSelectedIds.includes(nodeId) ? currentSelectedIds.filter(id => id !== nodeId) : [...currentSelectedIds, nodeId]\n } else {\n newSelection = currentSelectedIds.includes(nodeId) ? [] : [nodeId]\n }\n\n if (isControlledSelected) {\n onSelectionChange?.(newSelection)\n } else {\n setInternalSelectedIds(newSelection)\n }\n },\n [selectable, multiSelect, currentSelectedIds, isControlledSelected, onSelectionChange]\n )\n\n return (\n <TreeContext.Provider\n value={{\n expandedIds: currentExpandedIds,\n selectedIds: currentSelectedIds,\n toggleExpanded,\n handleSelection,\n showLines,\n showIcons,\n selectable,\n multiSelect,\n indent,\n animateExpand,\n }}\n >\n <div className={cn(\"w-full\", className)}>{children}</div>\n </TreeContext.Provider>\n )\n}\n\nexport type TreeViewProps = HTMLAttributes<HTMLDivElement>\n\nexport const TreeView = ({ className, children, ...props }: TreeViewProps) => (\n <div className={cn(\"p-2\", className)} {...props}>\n {children}\n </div>\n)\n\nexport type TreeNodeProps = HTMLAttributes<HTMLDivElement> & {\n nodeId?: string\n level?: number\n isLast?: boolean\n parentPath?: boolean[]\n children?: ReactNode\n}\n\nexport const TreeNode = ({ nodeId: providedNodeId, level = 0, isLast = false, parentPath = [], children, className, onClick: _onClick, ...props }: TreeNodeProps) => {\n const generatedId = useId()\n const nodeId = providedNodeId ?? generatedId\n\n // Build the parent path - mark positions where the parent was the last child\n const currentPath = level === 0 ? [] : [...parentPath]\n if (level > 0 && parentPath.length < level - 1) {\n // Fill in missing levels with false (not last)\n while (currentPath.length < level - 1) {\n currentPath.push(false)\n }\n }\n if (level > 0) {\n currentPath[level - 1] = isLast\n }\n\n return (\n <TreeNodeContext.Provider\n value={{\n nodeId,\n level,\n isLast,\n parentPath: currentPath,\n }}\n >\n <div className={cn(\"select-none\", className)} {...props}>\n {children}\n </div>\n </TreeNodeContext.Provider>\n )\n}\n\nexport type TreeNodeTriggerProps = HTMLAttributes<HTMLDivElement> & {\n expandOnClick?: boolean\n}\n\nexport const TreeNodeTrigger = ({ children, className, onClick, expandOnClick = false, ...props }: TreeNodeTriggerProps) => {\n const { selectedIds, handleSelection, toggleExpanded, indent } = useTree()\n const { nodeId, level } = useTreeNode()\n const isSelected = selectedIds.includes(nodeId)\n\n return (\n <div\n className={cn(\n \"group relative mx-1 flex cursor-pointer items-center rounded-md px-3 transition-all duration-200\",\n \"hover:bg-accent/50\",\n isSelected && \"bg-accent/80\",\n className\n )}\n style={{ paddingLeft: level * (indent ?? 0) + 8, paddingTop: \"var(--tree-item-py)\", paddingBottom: \"var(--tree-item-py)\" }}\n onClick={e => {\n handleSelection(nodeId, e.ctrlKey || e.metaKey)\n if (expandOnClick) toggleExpanded(nodeId)\n onClick?.(e)\n }}\n onDoubleClick={e => {\n if (e.ctrlKey || e.metaKey) return\n toggleExpanded(nodeId)\n }}\n {...props}\n >\n <TreeLines />\n {children}\n </div>\n )\n}\n\nexport const TreeLines = () => {\n const { showLines, indent } = useTree()\n const { level, isLast, parentPath } = useTreeNode()\n\n if (!showLines || level === 0) {\n return null\n }\n\n return (\n <div className=\"pointer-events-none absolute top-0 bottom-0 left-0\">\n {/* Render vertical lines for all parent levels */}\n {Array.from({ length: level }, (_, index) => {\n const shouldHideLine = parentPath[index] === true\n if (shouldHideLine && index === level - 1) {\n return null\n }\n\n return (\n <div\n className=\"absolute top-0 bottom-0 border-border/40 border-l\"\n key={index.toString()}\n style={{\n left: index * (indent ?? 0) + 12,\n display: shouldHideLine ? \"none\" : \"block\",\n }}\n />\n )\n })}\n\n {/* Horizontal connector line */}\n <div\n className=\"absolute top-1/2 border-border/40 border-t\"\n style={{\n left: (level - 1) * (indent ?? 0) + 12,\n width: (indent ?? 0) - 4,\n transform: \"translateY(-1px)\",\n }}\n />\n\n {/* Vertical line to midpoint for last items */}\n {isLast && (\n <div\n className=\"absolute top-0 border-border/40 border-l\"\n style={{\n left: (level - 1) * (indent ?? 0) + 12,\n height: \"50%\",\n }}\n />\n )}\n </div>\n )\n}\n\nexport type TreeNodeContentProps = HTMLAttributes<HTMLDivElement> & {\n hasChildren?: boolean\n}\n\nexport const TreeNodeContent = ({ children, hasChildren = false, className, ...props }: TreeNodeContentProps) => {\n const { expandedIds } = useTree()\n const { nodeId } = useTreeNode()\n const isExpanded = expandedIds.has(nodeId)\n\n if (!hasChildren || !isExpanded) {\n return null\n }\n\n return (\n <div className={className} {...props}>\n {children}\n </div>\n )\n}\n\nexport type TreeExpanderProps = HTMLAttributes<HTMLDivElement> & {\n hasChildren?: boolean\n}\n\nexport const TreeExpander = ({ hasChildren = false, className, onClick, ...props }: TreeExpanderProps) => {\n const { expandedIds, toggleExpanded } = useTree()\n const { nodeId } = useTreeNode()\n const isExpanded = expandedIds.has(nodeId)\n\n if (!hasChildren) {\n return <div className=\"mr-1 h-4 w-4\" />\n }\n\n return (\n <div\n className={cn(\"mr-1 flex h-4 w-4 items-center justify-center transition-transform duration-150\", isExpanded && \"rotate-90\", className)}\n onClick={e => {\n e.stopPropagation()\n toggleExpanded(nodeId)\n onClick?.(e)\n }}\n {...props}\n >\n <ChevronRight className=\"h-3 w-3 text-muted-foreground\" />\n </div>\n )\n}\n\nexport type TreeIconProps = HTMLAttributes<HTMLDivElement> & {\n icon?: ReactNode\n hasChildren?: boolean\n}\n\nexport const TreeIcon = ({ icon, hasChildren = false, className, ...props }: TreeIconProps) => {\n const { showIcons, expandedIds } = useTree()\n const { nodeId } = useTreeNode()\n const isExpanded = expandedIds.has(nodeId)\n\n if (!showIcons) {\n return null\n }\n\n const getDefaultIcon = () => (hasChildren ? isExpanded ? <FolderOpen className=\"h-4 w-4\" /> : <Folder className=\"h-4 w-4\" /> : <File className=\"h-4 w-4\" />)\n\n return (\n <div className={cn(\"mr-2 flex h-4 w-4 items-center justify-center text-muted-foreground transition-transform\", className)} {...props}>\n {icon || getDefaultIcon()}\n </div>\n )\n}\n\nexport type TreeLabelProps = HTMLAttributes<HTMLSpanElement>\n\nexport const TreeLabel = ({ className, ...props }: TreeLabelProps) => <span className={cn(\"font flex-1 truncate text-sm\", className)} {...props} />\n"]}
@@ -1,6 +1,6 @@
1
1
  import { useMobile } from './chunk-QYA2HGKW.js';
2
2
  import { Input, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuItem } from './chunk-SQA4ILAK.js';
3
- import { Button } from './chunk-KFQOYZ64.js';
3
+ import { Button } from './chunk-5Q4UTRYU.js';
4
4
  import { cn } from './chunk-XH55BHUU.js';
5
5
  import * as React10 from 'react';
6
6
  import { Avatar as Avatar$1, Slot, Separator as Separator$1, ContextMenu as ContextMenu$1, ScrollArea as ScrollArea$1, Dialog, Tooltip as Tooltip$1 } from 'radix-ui';
@@ -370,23 +370,49 @@ function InputGroupTextarea({
370
370
  }
371
371
  );
372
372
  }
373
- function ContextMenu({ ...props }) {
373
+ function ContextMenu({
374
+ ...props
375
+ }) {
374
376
  return /* @__PURE__ */ jsx(ContextMenu$1.Root, { "data-slot": "context-menu", ...props });
375
377
  }
376
- function ContextMenuTrigger({ className, ...props }) {
377
- return /* @__PURE__ */ jsx(ContextMenu$1.Trigger, { "data-slot": "context-menu-trigger", className: cn("select-none", className), ...props });
378
+ function ContextMenuTrigger({
379
+ className,
380
+ ...props
381
+ }) {
382
+ return /* @__PURE__ */ jsx(
383
+ ContextMenu$1.Trigger,
384
+ {
385
+ "data-slot": "context-menu-trigger",
386
+ className: cn("select-none", className),
387
+ ...props
388
+ }
389
+ );
378
390
  }
379
- function ContextMenuGroup({ ...props }) {
391
+ function ContextMenuGroup({
392
+ ...props
393
+ }) {
380
394
  return /* @__PURE__ */ jsx(ContextMenu$1.Group, { "data-slot": "context-menu-group", ...props });
381
395
  }
382
- function ContextMenuPortal({ ...props }) {
396
+ function ContextMenuPortal({
397
+ ...props
398
+ }) {
383
399
  return /* @__PURE__ */ jsx(ContextMenu$1.Portal, { "data-slot": "context-menu-portal", ...props });
384
400
  }
385
- function ContextMenuSub({ ...props }) {
401
+ function ContextMenuSub({
402
+ ...props
403
+ }) {
386
404
  return /* @__PURE__ */ jsx(ContextMenu$1.Sub, { "data-slot": "context-menu-sub", ...props });
387
405
  }
388
- function ContextMenuRadioGroup({ ...props }) {
389
- return /* @__PURE__ */ jsx(ContextMenu$1.RadioGroup, { "data-slot": "context-menu-radio-group", ...props });
406
+ function ContextMenuRadioGroup({
407
+ ...props
408
+ }) {
409
+ return /* @__PURE__ */ jsx(
410
+ ContextMenu$1.RadioGroup,
411
+ {
412
+ "data-slot": "context-menu-radio-group",
413
+ ...props
414
+ }
415
+ );
390
416
  }
391
417
  function ContextMenuContent({
392
418
  className,
@@ -396,10 +422,7 @@ function ContextMenuContent({
396
422
  ContextMenu$1.Content,
397
423
  {
398
424
  "data-slot": "context-menu-content",
399
- className: cn(
400
- "z-50 max-h-(--radix-context-menu-content-available-height) min-w-36 origin-(--radix-context-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-none bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 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 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
401
- className
402
- ),
425
+ className: cn("z-50 max-h-(--radix-context-menu-content-available-height) min-w-36 origin-(--radix-context-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-none bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 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 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", className),
403
426
  ...props
404
427
  }
405
428
  ) });
@@ -447,15 +470,15 @@ function ContextMenuSubTrigger({
447
470
  }
448
471
  );
449
472
  }
450
- function ContextMenuSubContent({ className, ...props }) {
473
+ function ContextMenuSubContent({
474
+ className,
475
+ ...props
476
+ }) {
451
477
  return /* @__PURE__ */ jsx(
452
478
  ContextMenu$1.SubContent,
453
479
  {
454
480
  "data-slot": "context-menu-sub-content",
455
- className: cn(
456
- "z-50 min-w-32 origin-(--radix-context-menu-content-transform-origin) overflow-hidden rounded-none border bg-popover text-popover-foreground shadow-lg duration-100 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 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
457
- className
458
- ),
481
+ className: cn("z-50 min-w-32 origin-(--radix-context-menu-content-transform-origin) overflow-hidden rounded-none border bg-popover text-popover-foreground shadow-lg duration-100 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 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", className),
459
482
  ...props
460
483
  }
461
484
  );
@@ -479,7 +502,10 @@ function ContextMenuCheckboxItem({
479
502
  checked,
480
503
  ...props,
481
504
  children: [
482
- /* @__PURE__ */ jsx("span", { className: "pointer-events-none absolute right-2", children: /* @__PURE__ */ jsx(ContextMenu$1.ItemIndicator, { children: /* @__PURE__ */ jsx(CheckIcon, {}) }) }),
505
+ /* @__PURE__ */ jsx("span", { className: "pointer-events-none absolute right-2", children: /* @__PURE__ */ jsx(ContextMenu$1.ItemIndicator, { children: /* @__PURE__ */ jsx(
506
+ CheckIcon,
507
+ {}
508
+ ) }) }),
483
509
  children
484
510
  ]
485
511
  }
@@ -502,7 +528,10 @@ function ContextMenuRadioItem({
502
528
  ),
503
529
  ...props,
504
530
  children: [
505
- /* @__PURE__ */ jsx("span", { className: "pointer-events-none absolute right-2", children: /* @__PURE__ */ jsx(ContextMenu$1.ItemIndicator, { children: /* @__PURE__ */ jsx(CheckIcon, {}) }) }),
531
+ /* @__PURE__ */ jsx("span", { className: "pointer-events-none absolute right-2", children: /* @__PURE__ */ jsx(ContextMenu$1.ItemIndicator, { children: /* @__PURE__ */ jsx(
532
+ CheckIcon,
533
+ {}
534
+ ) }) }),
506
535
  children
507
536
  ]
508
537
  }
@@ -518,20 +547,39 @@ function ContextMenuLabel({
518
547
  {
519
548
  "data-slot": "context-menu-label",
520
549
  "data-inset": inset,
521
- className: cn("px-2 py-2 text-xs text-muted-foreground data-inset:pl-7", className),
550
+ className: cn(
551
+ "px-2 py-2 text-xs text-muted-foreground data-inset:pl-7",
552
+ className
553
+ ),
522
554
  ...props
523
555
  }
524
556
  );
525
557
  }
526
- function ContextMenuSeparator({ className, ...props }) {
527
- return /* @__PURE__ */ jsx(ContextMenu$1.Separator, { "data-slot": "context-menu-separator", className: cn("-mx-1 h-px bg-border", className), ...props });
558
+ function ContextMenuSeparator({
559
+ className,
560
+ ...props
561
+ }) {
562
+ return /* @__PURE__ */ jsx(
563
+ ContextMenu$1.Separator,
564
+ {
565
+ "data-slot": "context-menu-separator",
566
+ className: cn("-mx-1 h-px bg-border", className),
567
+ ...props
568
+ }
569
+ );
528
570
  }
529
- function ContextMenuShortcut({ className, ...props }) {
571
+ function ContextMenuShortcut({
572
+ className,
573
+ ...props
574
+ }) {
530
575
  return /* @__PURE__ */ jsx(
531
576
  "span",
532
577
  {
533
578
  "data-slot": "context-menu-shortcut",
534
- className: cn("ml-auto text-xs tracking-widest text-muted-foreground group-focus/context-menu-item:text-accent-foreground", className),
579
+ className: cn(
580
+ "ml-auto text-xs tracking-widest text-muted-foreground group-focus/context-menu-item:text-accent-foreground",
581
+ className
582
+ ),
535
583
  ...props
536
584
  }
537
585
  );
@@ -1435,5 +1483,5 @@ function initialsOf(value) {
1435
1483
  }
1436
1484
 
1437
1485
  export { AccountMenu, Avatar, AvatarBadge, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarImage, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, ScrollArea, ScrollBar, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Textarea, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, defaultAccountMenuLabels, initialsOf, useSidebar };
1438
- //# sourceMappingURL=chunk-V6TVUMAU.js.map
1439
- //# sourceMappingURL=chunk-V6TVUMAU.js.map
1486
+ //# sourceMappingURL=chunk-2PHVSGAE.js.map
1487
+ //# sourceMappingURL=chunk-2PHVSGAE.js.map