@tradalab/lyra 2.6.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/blocks/index.d.ts +222 -1
- package/dist/blocks/index.js +729 -15
- package/dist/blocks/index.js.map +1 -1
- package/dist/{chunk-HN3UZUCS.js → chunk-BTZYRWFX.js} +15 -34
- package/dist/chunk-BTZYRWFX.js.map +1 -0
- package/dist/{chunk-L6AHYXII.js → chunk-CV3UXQBT.js} +4 -60
- package/dist/chunk-CV3UXQBT.js.map +1 -0
- package/dist/chunk-DUWK53B5.js +642 -0
- package/dist/chunk-DUWK53B5.js.map +1 -0
- package/dist/chunk-FHM6VOPQ.js +72 -0
- package/dist/chunk-FHM6VOPQ.js.map +1 -0
- package/dist/{chunk-LZZ3UOPT.js → chunk-XJJQAQWJ.js} +24 -3
- package/dist/chunk-XJJQAQWJ.js.map +1 -0
- package/dist/data-table/index.js +2 -1
- package/dist/data-table/index.js.map +1 -1
- package/dist/shell/index.d.ts +8 -21
- package/dist/shell/index.js +31 -61
- package/dist/shell/index.js.map +1 -1
- package/dist/ui/index.d.ts +8 -1
- package/dist/ui/index.js +38 -389
- package/dist/ui/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-HN3UZUCS.js.map +0 -1
- package/dist/chunk-L6AHYXII.js.map +0 -1
- package/dist/chunk-LZZ3UOPT.js.map +0 -1
- package/dist/chunk-VA6K3TP3.js +0 -281
- package/dist/chunk-VA6K3TP3.js.map +0 -1
package/dist/blocks/index.js.map
CHANGED
|
@@ -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","../../src/blocks/tz-picker.tsx","../../src/blocks/option-picker.tsx"],"names":["jsx","jsxs","createContext","useState","useContext","useId","React2","React3"],"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","\"use client\"\n\nimport * as React from \"react\"\n\nimport {\n Combobox,\n ComboboxContent,\n ComboboxEmpty,\n ComboboxInput,\n ComboboxItem,\n ComboboxList,\n} from \"~/ui/primitives/combobox.js\"\n\n/**\n * Pick an IANA timezone instead of typing one.\n *\n * A zone is a spelling test with silent failure: `Asia/HoChiMinh`, `GMT+7` and `ICT` all look\n * right and none of them is a zone. Go's `time.LoadLocation` does not reject a wrong one\n * loudly - it fails, logs, and the caller falls back to UTC - so a typo becomes a whole site's\n * timesheet shifted by seven hours, which nobody reads as a spelling mistake.\n *\n * ⚠️ `Asia/Saigon` is NOT one of those typos. `Intl.supportedValuesOf(\"timeZone\")` returns the\n * CLDR canonical names, and CLDR canonical for Vietnam IS `Asia/Saigon` - `Asia/Ho_Chi_Minh`\n * does not appear in that list at all. Same for `Asia/Calcutta` over `Asia/Kolkata` and\n * `Europe/Kiev` over `Europe/Kyiv`; see IANA_PRIMARY below for the measured set.\n *\n * The offered names are RENAMED to their IANA primaries anyway, because the offered name is the\n * STORED name, and the stored name is what every backend, log line and export then carries. Go\n * tzdata, this platform, and the people reading a Vietnamese timesheet all say\n * `Asia/Ho_Chi_Minh`; a control that can only offer `Asia/Saigon` reads as broken to all three,\n * and being technically correct did not stop somebody asking why the city was missing.\n *\n * A value stored under EITHER spelling still renders as itself with a correct offset: `Intl`\n * resolves both, and the entry list appends whatever is stored when the offered list omits it.\n *\n * Lives in lyra rather than nekit even though it carries domain logic, because the rule that\n * decides is not \"UI vs logic\" - it is whether the component knows where its data comes from.\n * `PeoplePicker` next door takes an injected `search` for exactly that reason. This one reads\n * `Intl`, which is in the runtime: no network, no session, nothing an app has to hand it.\n *\n * Every zone is shown WITH its current offset. Four hundred names sorted alphabetically is\n * unusable; \"Asia/Ho_Chi_Minh · GMT+7\" is something a person can confirm at a glance, and that\n * glance is the only check standing between a typo and a wrong month.\n */\n\n/** A curated fallback for a runtime without `Intl.supportedValuesOf` (pre-2022 browsers).\n * Short on purpose - it exists so the control still works, not to be a tz database. */\nconst FALLBACK_ZONES = [\n \"UTC\",\n \"Asia/Ho_Chi_Minh\",\n \"Asia/Bangkok\",\n \"Asia/Singapore\",\n \"Asia/Tokyo\",\n \"Asia/Seoul\",\n \"Asia/Shanghai\",\n \"Asia/Kolkata\",\n \"Europe/London\",\n \"Europe/Berlin\",\n \"America/New_York\",\n \"America/Los_Angeles\",\n]\n\n/**\n * CLDR canonical name -> the IANA primary name, for the zones where they disagree.\n *\n * MEASURED, not recalled: Node 22 / ICU reports 417 zones, and for each pair below the CLDR\n * spelling is present, the IANA spelling is absent, and `Intl` resolves the IANA spelling\n * anyway. That last fact is what makes the rename safe - the offset lookup does not care which\n * name it is handed.\n *\n * ⚠️ Renaming the OFFERED name, not the accepted one. A site already saved as `Asia/Saigon`\n * keeps working and keeps showing `Asia/Saigon`, because the entry list appends a stored value\n * the offered list does not contain. Nothing is rewritten behind anybody.\n *\n * This list changes about once a decade, when IANA renames a zone and CLDR declines to follow.\n * If a pair here ever starts appearing under both spellings, delete that row rather than\n * shadowing a real entry.\n */\nconst IANA_PRIMARY: Record<string, string> = {\n \"America/Buenos_Aires\": \"America/Argentina/Buenos_Aires\",\n \"America/Godthab\": \"America/Nuuk\",\n \"Asia/Calcutta\": \"Asia/Kolkata\",\n \"Asia/Katmandu\": \"Asia/Kathmandu\",\n \"Asia/Rangoon\": \"Asia/Yangon\",\n \"Asia/Saigon\": \"Asia/Ho_Chi_Minh\",\n \"Atlantic/Faeroe\": \"Atlantic/Faroe\",\n \"Europe/Kiev\": \"Europe/Kyiv\",\n \"Pacific/Ponape\": \"Pacific/Pohnpei\",\n \"Pacific/Truk\": \"Pacific/Chuuk\",\n}\n\nexport interface TzPickerLabels {\n /** Shown when the value is empty and `allowInherit`. Default: \"Inherit\". */\n inherit?: string\n /** Placeholder for the search input. Default: \"Search timezone\". */\n search?: string\n /** Shown when the filter matches nothing. Default: \"No match\". */\n noMatch?: string\n // No `suggested`/`all` headings: the list is one flat group now. Declaring labels nothing\n // renders is how a message file ends up with keys three translators maintain for no screen.\n}\n\ninterface Zone {\n name: string\n offset: string\n}\n\n/**\n * Built once per page load, not per render: resolving the offset of ~420 zones means ~420\n * `Intl.DateTimeFormat` constructions, cheap once and visible on every keystroke.\n */\nlet cachedZones: Zone[] | null = null\n\nfunction allZones(): Zone[] {\n if (cachedZones) return cachedZones\n let names: string[]\n try {\n const supported = (Intl as unknown as { supportedValuesOf?: (k: string) => string[] })\n .supportedValuesOf\n names = supported ? supported(\"timeZone\") : FALLBACK_ZONES\n } catch {\n names = FALLBACK_ZONES\n }\n cachedZones = names.map((name) => {\n const primary = IANA_PRIMARY[name] ?? name\n // The offset is resolved from the name being SHOWN, so a wrong row in the table above\n // surfaces as a wrong offset next to the name rather than as a silently different zone.\n return { name: primary, offset: offsetOf(primary) }\n })\n return cachedZones\n}\n\n/** The zone's offset right now, as ICU spells it: \"GMT+7\", not \"UTC+7\". DST makes it a\n * snapshot, which is what a person recognising their own zone needs - not a promise about\n * January. */\nfunction offsetOf(tz: string): string {\n try {\n const parts = new Intl.DateTimeFormat(\"en-US\", {\n timeZone: tz,\n timeZoneName: \"shortOffset\",\n }).formatToParts(new Date())\n return parts.find((p) => p.type === \"timeZoneName\")?.value ?? \"\"\n } catch {\n return \"\"\n }\n}\n\n/**\n * The viewer\\u2019s own zone, under the SAME spelling the offered list uses.\n *\n * \\u26a0\\ufe0f The mapping is not optional. `resolvedOptions().timeZone` reports the CLDR canonical name\n * even when the machine is set to the IANA one - a laptop on `Asia/Ho_Chi_Minh` answers\n * `Asia/Saigon` - so without this the lookup below misses, and the \"your own zone first\"\n * shortcut silently stops working for exactly the countries IANA_PRIMARY covers. Silently,\n * because the control still renders a perfectly good list; it just no longer helps.\n */\nfunction browserTz(): string {\n try {\n const tz = Intl.DateTimeFormat().resolvedOptions().timeZone || \"UTC\"\n return IANA_PRIMARY[tz] ?? tz\n } catch {\n return \"UTC\"\n }\n}\n\nexport interface TzPickerProps {\n /** IANA zone name, or \"\" for inherit. */\n value: string\n onChange: (tz: string) => void\n /**\n * Whether an empty value is meaningful here. It usually is: a device inherits from its site,\n * a site from its unit, a unit from its parent. Set false where a zone must be chosen.\n */\n allowInherit?: boolean\n labels?: TzPickerLabels\n disabled?: boolean\n id?: string\n className?: string\n}\n\n/**\n * Field names are `tz`/`name`, NOT `value`/`label`, on purpose: Base UI treats an item shaped\n * `{ value, label }` as self-describing and renders `label` directly, silently ignoring\n * `itemToStringLabel`. The offset would then vanish from the input - which is the one part of\n * the label that makes a zone recognisable.\n */\ninterface Entry {\n tz: string\n name: string\n offset: string\n}\n\nexport function TzPicker({\n value,\n onChange,\n allowInherit = true,\n labels,\n disabled,\n id,\n className,\n}: TzPickerProps) {\n const l = {\n inherit: labels?.inherit ?? \"Inherit\",\n search: labels?.search ?? \"Search timezone\",\n noMatch: labels?.noMatch ?? \"No match\",\n }\n const own = React.useMemo(() => browserTz(), [])\n\n const entries = React.useMemo<Entry[]>(() => {\n const zones = allZones()\n const out: Entry[] = []\n if (allowInherit) out.push({ tz: \"\", name: l.inherit, offset: \"\" })\n // The person filling this form is almost always near the place they are describing, so\n // their own zone is the likeliest answer - and the one hardest to find by scrolling.\n const ownZone = zones.find((z) => z.name === own)\n if (ownZone) out.push({ tz: own, name: own, offset: ownZone.offset })\n for (const z of zones) {\n if (z.name === own) continue\n out.push({ tz: z.name, name: z.name, offset: z.offset })\n }\n // A stored zone the LIST does not contain - an alias CLDR canonicalises away\n // (`Asia/Ho_Chi_Minh`), or one dropped from a later release. It keeps its own name, so the\n // control never misreports what is saved, and it still gets an offset: `Intl` resolves the\n // alias fine even though `supportedValuesOf` omits it. Only a genuinely invalid zone ends\n // up with an empty offset here.\n if (value !== \"\" && !zones.some((z) => z.name === value)) {\n out.push({ tz: value, name: value, offset: offsetOf(value) })\n }\n return out\n }, [allowInherit, l.inherit, own, value])\n\n const selected = entries.find((e) => e.tz === value) ?? entries[0]\n\n return (\n <Combobox\n items={entries}\n value={selected}\n onValueChange={(item: Entry | null) => onChange(item?.tz ?? \"\")}\n // Searchable by name AND offset: somebody who knows \"+7\" but not the city can still land\n // on it.\n itemToStringLabel={(e: Entry) => (e.offset ? `${e.name} · ${e.offset}` : e.name)}\n itemToStringValue={(e: Entry) => e.tz}\n isItemEqualToValue={(a: Entry, b: Entry) => a.tz === b.tz}\n disabled={disabled}\n >\n {/* w-full, not the default w-fit: a combobox trigger sized to its content renders short\n and clipped inside a form column, which reads as a different kind of field. */}\n <ComboboxInput\n id={id}\n placeholder={l.search}\n className={className ?? \"w-full\"}\n // A clear button only where empty is a legitimate answer. Where a zone is required,\n // clearing would offer a state the form cannot save.\n showClear={allowInherit}\n />\n <ComboboxContent>\n <ComboboxEmpty>{l.noMatch}</ComboboxEmpty>\n <ComboboxList>\n {(entry: Entry) => (\n <ComboboxItem key={entry.tz || \"__inherit\"} value={entry}>\n <span className=\"flex-1 truncate\">{entry.name}</span>\n <span className=\"text-muted-foreground text-xs\">{entry.offset}</span>\n </ComboboxItem>\n )}\n </ComboboxList>\n </ComboboxContent>\n </Combobox>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport {\n Combobox,\n ComboboxContent,\n ComboboxEmpty,\n ComboboxInput,\n ComboboxItem,\n ComboboxList,\n} from \"~/ui/primitives/combobox.js\"\n\n/**\n * Pick one id from a known set.\n *\n * The set is INJECTED. That is what lets this live in lyra: it never learns where the\n * options came from, so it works the same for org members, groups, or anything else the app\n * has already loaded - which is exactly how the three copies it replaces differed.\n *\n * Why it exists at all: the screens that use it used to ask for raw uuids typed into a text\n * box. Nobody knows a uuid, so the only way anyone filled those fields was by copying from\n * somewhere else, and a copy can be off by one row. In `people` that attached a personnel\n * record to the wrong account - a wrong-but-valid uid passes every server check and is found\n * by whoever opens someone else's file under their own name.\n *\n * Filtering is client-side, deliberately: every set here is org-scoped and already loaded for\n * the surrounding screen, so matching locally is instant and costs no round trip. A picker\n * paging over every account that exists (admin's platform-wide search) is a different\n * component with a different failure mode - see `PeoplePicker` in `@tradalab/lyra/people`,\n * which takes an async `search` and does not hold a controlled value.\n */\n\n/** One choosable thing: an id plus what a person actually recognises it by. */\nexport interface PickOption {\n id: string\n label: string\n /** Secondary line - an email, a status. Searchable along with the label. */\n hint?: string\n}\n\nexport interface OptionPickerLabels {\n /** Shown when nothing is selected. */\n placeholder?: string\n /** Placeholder inside the search box. */\n search?: string\n /** Shown when the filter matches nothing. */\n empty?: string\n}\n\nconst FALLBACK: Required<OptionPickerLabels> = {\n placeholder: \"Select…\",\n search: \"Search\",\n empty: \"No match\",\n}\n\n/**\n * Field names are `id`/`label`, and `label` is what Base UI renders when an item is shaped\n * `{ value, label }`. This shape uses `id`, so `itemToStringLabel` below is what actually\n * decides the input text - the same trap TzPicker documents.\n */\ninterface Entry extends PickOption {\n /** Present only for the empty selection, so `value` can round-trip \"\" safely. */\n none?: boolean\n}\n\nexport function OptionPicker({\n value,\n onChange,\n options,\n labels,\n disabled,\n id,\n className,\n}: {\n value: string\n onChange: (id: string) => void\n options: PickOption[]\n labels?: OptionPickerLabels\n disabled?: boolean\n id?: string\n className?: string\n}) {\n const t = (k: keyof OptionPickerLabels) => labels?.[k] ?? FALLBACK[k]\n const placeholder = labels?.placeholder ?? FALLBACK.placeholder\n\n const entries = React.useMemo<Entry[]>(() => {\n const out: Entry[] = [{ id: \"\", label: placeholder, none: true }, ...options]\n // A stored id that is nobody on the list: the account left the org, or the record was\n // linked before this control existed. Show the raw id rather than an empty box - the\n // field is NOT empty, and rendering it as empty invites overwriting it by accident.\n if (value !== \"\" && !options.some((o) => o.id === value)) {\n out.push({ id: value, label: value })\n }\n return out\n }, [options, value, placeholder])\n\n const selected = entries.find((e) => e.id === value) ?? entries[0]\n\n return (\n <Combobox\n items={entries}\n value={selected}\n onValueChange={(e: Entry | null) => onChange(e?.id ?? \"\")}\n // The id is part of the searchable text, not only the label: somebody holding a uid\n // from a log must still be able to find the person it belongs to.\n itemToStringLabel={(e: Entry) => (e.none ? e.label : `${e.label} ${e.hint ?? \"\"} ${e.id}`)}\n isItemEqualToValue={(a: Entry, b: Entry) => a.id === b.id}\n disabled={disabled}\n >\n {/* w-full, not the default w-fit: sized to content it renders short and clipped inside\n a form column. */}\n <ComboboxInput id={id} placeholder={t(\"search\")} className={className ?? \"w-full\"} />\n <ComboboxContent>\n <ComboboxEmpty>{t(\"empty\")}</ComboboxEmpty>\n <ComboboxList>\n {(entry: Entry) => (\n <ComboboxItem key={entry.id || \"__none\"} value={entry}>\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"truncate text-sm\">{entry.label}</span>\n {entry.hint ? (\n <span className=\"text-muted-foreground truncate text-xs\">{entry.hint}</span>\n ) : null}\n </div>\n </ComboboxItem>\n )}\n </ComboboxList>\n </ComboboxContent>\n </Combobox>\n )\n}\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","../../src/blocks/tz-picker.tsx","../../src/blocks/option-picker.tsx","../../src/blocks/mcp-settings.tsx","../../src/blocks/llm-settings.tsx"],"names":["React","jsx","jsxs","createContext","useState","useContext","useId","React2","React3","FALLBACK","React4","messageOf","provider","Fragment"],"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","\"use client\"\n\nimport * as React from \"react\"\n\nimport {\n Combobox,\n ComboboxContent,\n ComboboxEmpty,\n ComboboxInput,\n ComboboxItem,\n ComboboxList,\n} from \"~/ui/primitives/combobox.js\"\n\n/**\n * Pick an IANA timezone instead of typing one.\n *\n * A zone is a spelling test with silent failure: `Asia/HoChiMinh`, `GMT+7` and `ICT` all look\n * right and none of them is a zone. Go's `time.LoadLocation` does not reject a wrong one\n * loudly - it fails, logs, and the caller falls back to UTC - so a typo becomes a whole site's\n * timesheet shifted by seven hours, which nobody reads as a spelling mistake.\n *\n * ⚠️ `Asia/Saigon` is NOT one of those typos. `Intl.supportedValuesOf(\"timeZone\")` returns the\n * CLDR canonical names, and CLDR canonical for Vietnam IS `Asia/Saigon` - `Asia/Ho_Chi_Minh`\n * does not appear in that list at all. Same for `Asia/Calcutta` over `Asia/Kolkata` and\n * `Europe/Kiev` over `Europe/Kyiv`; see IANA_PRIMARY below for the measured set.\n *\n * The offered names are RENAMED to their IANA primaries anyway, because the offered name is the\n * STORED name, and the stored name is what every backend, log line and export then carries. Go\n * tzdata, this platform, and the people reading a Vietnamese timesheet all say\n * `Asia/Ho_Chi_Minh`; a control that can only offer `Asia/Saigon` reads as broken to all three,\n * and being technically correct did not stop somebody asking why the city was missing.\n *\n * A value stored under EITHER spelling still renders as itself with a correct offset: `Intl`\n * resolves both, and the entry list appends whatever is stored when the offered list omits it.\n *\n * Lives in lyra rather than nekit even though it carries domain logic, because the rule that\n * decides is not \"UI vs logic\" - it is whether the component knows where its data comes from.\n * `PeoplePicker` next door takes an injected `search` for exactly that reason. This one reads\n * `Intl`, which is in the runtime: no network, no session, nothing an app has to hand it.\n *\n * Every zone is shown WITH its current offset. Four hundred names sorted alphabetically is\n * unusable; \"Asia/Ho_Chi_Minh · GMT+7\" is something a person can confirm at a glance, and that\n * glance is the only check standing between a typo and a wrong month.\n */\n\n/** A curated fallback for a runtime without `Intl.supportedValuesOf` (pre-2022 browsers).\n * Short on purpose - it exists so the control still works, not to be a tz database. */\nconst FALLBACK_ZONES = [\n \"UTC\",\n \"Asia/Ho_Chi_Minh\",\n \"Asia/Bangkok\",\n \"Asia/Singapore\",\n \"Asia/Tokyo\",\n \"Asia/Seoul\",\n \"Asia/Shanghai\",\n \"Asia/Kolkata\",\n \"Europe/London\",\n \"Europe/Berlin\",\n \"America/New_York\",\n \"America/Los_Angeles\",\n]\n\n/**\n * CLDR canonical name -> the IANA primary name, for the zones where they disagree.\n *\n * MEASURED, not recalled: Node 22 / ICU reports 417 zones, and for each pair below the CLDR\n * spelling is present, the IANA spelling is absent, and `Intl` resolves the IANA spelling\n * anyway. That last fact is what makes the rename safe - the offset lookup does not care which\n * name it is handed.\n *\n * ⚠️ Renaming the OFFERED name, not the accepted one. A site already saved as `Asia/Saigon`\n * keeps working and keeps showing `Asia/Saigon`, because the entry list appends a stored value\n * the offered list does not contain. Nothing is rewritten behind anybody.\n *\n * This list changes about once a decade, when IANA renames a zone and CLDR declines to follow.\n * If a pair here ever starts appearing under both spellings, delete that row rather than\n * shadowing a real entry.\n */\nconst IANA_PRIMARY: Record<string, string> = {\n \"America/Buenos_Aires\": \"America/Argentina/Buenos_Aires\",\n \"America/Godthab\": \"America/Nuuk\",\n \"Asia/Calcutta\": \"Asia/Kolkata\",\n \"Asia/Katmandu\": \"Asia/Kathmandu\",\n \"Asia/Rangoon\": \"Asia/Yangon\",\n \"Asia/Saigon\": \"Asia/Ho_Chi_Minh\",\n \"Atlantic/Faeroe\": \"Atlantic/Faroe\",\n \"Europe/Kiev\": \"Europe/Kyiv\",\n \"Pacific/Ponape\": \"Pacific/Pohnpei\",\n \"Pacific/Truk\": \"Pacific/Chuuk\",\n}\n\nexport interface TzPickerLabels {\n /** Shown when the value is empty and `allowInherit`. Default: \"Inherit\". */\n inherit?: string\n /** Placeholder for the search input. Default: \"Search timezone\". */\n search?: string\n /** Shown when the filter matches nothing. Default: \"No match\". */\n noMatch?: string\n // No `suggested`/`all` headings: the list is one flat group now. Declaring labels nothing\n // renders is how a message file ends up with keys three translators maintain for no screen.\n}\n\ninterface Zone {\n name: string\n offset: string\n}\n\n/**\n * Built once per page load, not per render: resolving the offset of ~420 zones means ~420\n * `Intl.DateTimeFormat` constructions, cheap once and visible on every keystroke.\n */\nlet cachedZones: Zone[] | null = null\n\nfunction allZones(): Zone[] {\n if (cachedZones) return cachedZones\n let names: string[]\n try {\n const supported = (Intl as unknown as { supportedValuesOf?: (k: string) => string[] })\n .supportedValuesOf\n names = supported ? supported(\"timeZone\") : FALLBACK_ZONES\n } catch {\n names = FALLBACK_ZONES\n }\n cachedZones = names.map((name) => {\n const primary = IANA_PRIMARY[name] ?? name\n // The offset is resolved from the name being SHOWN, so a wrong row in the table above\n // surfaces as a wrong offset next to the name rather than as a silently different zone.\n return { name: primary, offset: offsetOf(primary) }\n })\n return cachedZones\n}\n\n/** The zone's offset right now, as ICU spells it: \"GMT+7\", not \"UTC+7\". DST makes it a\n * snapshot, which is what a person recognising their own zone needs - not a promise about\n * January. */\nfunction offsetOf(tz: string): string {\n try {\n const parts = new Intl.DateTimeFormat(\"en-US\", {\n timeZone: tz,\n timeZoneName: \"shortOffset\",\n }).formatToParts(new Date())\n return parts.find((p) => p.type === \"timeZoneName\")?.value ?? \"\"\n } catch {\n return \"\"\n }\n}\n\n/**\n * The viewer\\u2019s own zone, under the SAME spelling the offered list uses.\n *\n * \\u26a0\\ufe0f The mapping is not optional. `resolvedOptions().timeZone` reports the CLDR canonical name\n * even when the machine is set to the IANA one - a laptop on `Asia/Ho_Chi_Minh` answers\n * `Asia/Saigon` - so without this the lookup below misses, and the \"your own zone first\"\n * shortcut silently stops working for exactly the countries IANA_PRIMARY covers. Silently,\n * because the control still renders a perfectly good list; it just no longer helps.\n */\nfunction browserTz(): string {\n try {\n const tz = Intl.DateTimeFormat().resolvedOptions().timeZone || \"UTC\"\n return IANA_PRIMARY[tz] ?? tz\n } catch {\n return \"UTC\"\n }\n}\n\nexport interface TzPickerProps {\n /** IANA zone name, or \"\" for inherit. */\n value: string\n onChange: (tz: string) => void\n /**\n * Whether an empty value is meaningful here. It usually is: a device inherits from its site,\n * a site from its unit, a unit from its parent. Set false where a zone must be chosen.\n */\n allowInherit?: boolean\n labels?: TzPickerLabels\n disabled?: boolean\n id?: string\n className?: string\n}\n\n/**\n * Field names are `tz`/`name`, NOT `value`/`label`, on purpose: Base UI treats an item shaped\n * `{ value, label }` as self-describing and renders `label` directly, silently ignoring\n * `itemToStringLabel`. The offset would then vanish from the input - which is the one part of\n * the label that makes a zone recognisable.\n */\ninterface Entry {\n tz: string\n name: string\n offset: string\n}\n\nexport function TzPicker({\n value,\n onChange,\n allowInherit = true,\n labels,\n disabled,\n id,\n className,\n}: TzPickerProps) {\n const l = {\n inherit: labels?.inherit ?? \"Inherit\",\n search: labels?.search ?? \"Search timezone\",\n noMatch: labels?.noMatch ?? \"No match\",\n }\n const own = React.useMemo(() => browserTz(), [])\n\n const entries = React.useMemo<Entry[]>(() => {\n const zones = allZones()\n const out: Entry[] = []\n if (allowInherit) out.push({ tz: \"\", name: l.inherit, offset: \"\" })\n // The person filling this form is almost always near the place they are describing, so\n // their own zone is the likeliest answer - and the one hardest to find by scrolling.\n const ownZone = zones.find((z) => z.name === own)\n if (ownZone) out.push({ tz: own, name: own, offset: ownZone.offset })\n for (const z of zones) {\n if (z.name === own) continue\n out.push({ tz: z.name, name: z.name, offset: z.offset })\n }\n // A stored zone the LIST does not contain - an alias CLDR canonicalises away\n // (`Asia/Ho_Chi_Minh`), or one dropped from a later release. It keeps its own name, so the\n // control never misreports what is saved, and it still gets an offset: `Intl` resolves the\n // alias fine even though `supportedValuesOf` omits it. Only a genuinely invalid zone ends\n // up with an empty offset here.\n if (value !== \"\" && !zones.some((z) => z.name === value)) {\n out.push({ tz: value, name: value, offset: offsetOf(value) })\n }\n return out\n }, [allowInherit, l.inherit, own, value])\n\n const selected = entries.find((e) => e.tz === value) ?? entries[0]\n\n return (\n <Combobox\n items={entries}\n value={selected}\n onValueChange={(item: Entry | null) => onChange(item?.tz ?? \"\")}\n // Searchable by name AND offset: somebody who knows \"+7\" but not the city can still land\n // on it.\n itemToStringLabel={(e: Entry) => (e.offset ? `${e.name} · ${e.offset}` : e.name)}\n itemToStringValue={(e: Entry) => e.tz}\n isItemEqualToValue={(a: Entry, b: Entry) => a.tz === b.tz}\n disabled={disabled}\n >\n {/* w-full, not the default w-fit: a combobox trigger sized to its content renders short\n and clipped inside a form column, which reads as a different kind of field. */}\n <ComboboxInput\n id={id}\n placeholder={l.search}\n className={className ?? \"w-full\"}\n // A clear button only where empty is a legitimate answer. Where a zone is required,\n // clearing would offer a state the form cannot save.\n showClear={allowInherit}\n />\n <ComboboxContent>\n <ComboboxEmpty>{l.noMatch}</ComboboxEmpty>\n <ComboboxList>\n {(entry: Entry) => (\n <ComboboxItem key={entry.tz || \"__inherit\"} value={entry}>\n <span className=\"flex-1 truncate\">{entry.name}</span>\n <span className=\"text-muted-foreground text-xs\">{entry.offset}</span>\n </ComboboxItem>\n )}\n </ComboboxList>\n </ComboboxContent>\n </Combobox>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport {\n Combobox,\n ComboboxContent,\n ComboboxEmpty,\n ComboboxInput,\n ComboboxItem,\n ComboboxList,\n} from \"~/ui/primitives/combobox.js\"\n\n/**\n * Pick one id from a known set.\n *\n * The set is INJECTED. That is what lets this live in lyra: it never learns where the\n * options came from, so it works the same for org members, groups, or anything else the app\n * has already loaded - which is exactly how the three copies it replaces differed.\n *\n * Why it exists at all: the screens that use it used to ask for raw uuids typed into a text\n * box. Nobody knows a uuid, so the only way anyone filled those fields was by copying from\n * somewhere else, and a copy can be off by one row. In `people` that attached a personnel\n * record to the wrong account - a wrong-but-valid uid passes every server check and is found\n * by whoever opens someone else's file under their own name.\n *\n * Filtering is client-side, deliberately: every set here is org-scoped and already loaded for\n * the surrounding screen, so matching locally is instant and costs no round trip. A picker\n * paging over every account that exists (admin's platform-wide search) is a different\n * component with a different failure mode - see `PeoplePicker` in `@tradalab/lyra/people`,\n * which takes an async `search` and does not hold a controlled value.\n */\n\n/** One choosable thing: an id plus what a person actually recognises it by. */\nexport interface PickOption {\n id: string\n label: string\n /** Secondary line - an email, a status. Searchable along with the label. */\n hint?: string\n}\n\nexport interface OptionPickerLabels {\n /** Shown when nothing is selected. */\n placeholder?: string\n /** Placeholder inside the search box. */\n search?: string\n /** Shown when the filter matches nothing. */\n empty?: string\n}\n\nconst FALLBACK: Required<OptionPickerLabels> = {\n placeholder: \"Select…\",\n search: \"Search\",\n empty: \"No match\",\n}\n\n/**\n * Field names are `id`/`label`, and `label` is what Base UI renders when an item is shaped\n * `{ value, label }`. This shape uses `id`, so `itemToStringLabel` below is what actually\n * decides the input text - the same trap TzPicker documents.\n */\ninterface Entry extends PickOption {\n /** Present only for the empty selection, so `value` can round-trip \"\" safely. */\n none?: boolean\n}\n\nexport function OptionPicker({\n value,\n onChange,\n options,\n labels,\n disabled,\n id,\n className,\n}: {\n value: string\n onChange: (id: string) => void\n options: PickOption[]\n labels?: OptionPickerLabels\n disabled?: boolean\n id?: string\n className?: string\n}) {\n const t = (k: keyof OptionPickerLabels) => labels?.[k] ?? FALLBACK[k]\n const placeholder = labels?.placeholder ?? FALLBACK.placeholder\n\n const entries = React.useMemo<Entry[]>(() => {\n const out: Entry[] = [{ id: \"\", label: placeholder, none: true }, ...options]\n // A stored id that is nobody on the list: the account left the org, or the record was\n // linked before this control existed. Show the raw id rather than an empty box - the\n // field is NOT empty, and rendering it as empty invites overwriting it by accident.\n if (value !== \"\" && !options.some((o) => o.id === value)) {\n out.push({ id: value, label: value })\n }\n return out\n }, [options, value, placeholder])\n\n const selected = entries.find((e) => e.id === value) ?? entries[0]\n\n return (\n <Combobox\n items={entries}\n value={selected}\n onValueChange={(e: Entry | null) => onChange(e?.id ?? \"\")}\n // The id is part of the searchable text, not only the label: somebody holding a uid\n // from a log must still be able to find the person it belongs to.\n itemToStringLabel={(e: Entry) => (e.none ? e.label : `${e.label} ${e.hint ?? \"\"} ${e.id}`)}\n isItemEqualToValue={(a: Entry, b: Entry) => a.id === b.id}\n disabled={disabled}\n >\n {/* w-full, not the default w-fit: sized to content it renders short and clipped inside\n a form column. */}\n <ComboboxInput id={id} placeholder={t(\"search\")} className={className ?? \"w-full\"} />\n <ComboboxContent>\n <ComboboxEmpty>{t(\"empty\")}</ComboboxEmpty>\n <ComboboxList>\n {(entry: Entry) => (\n <ComboboxItem key={entry.id || \"__none\"} value={entry}>\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"truncate text-sm\">{entry.label}</span>\n {entry.hint ? (\n <span className=\"text-muted-foreground truncate text-xs\">{entry.hint}</span>\n ) : null}\n </div>\n </ComboboxItem>\n )}\n </ComboboxList>\n </ComboboxContent>\n </Combobox>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { CheckIcon, CopyIcon } from \"lucide-react\"\n\nimport { Alert, AlertDescription } from \"~/ui/primitives/alert.js\"\nimport { Badge } from \"~/ui/primitives/badge.js\"\nimport { Button } from \"~/ui/primitives/button.js\"\nimport {\n Field,\n FieldContent,\n FieldDescription,\n FieldGroup,\n FieldLabel,\n FieldLegend,\n FieldSeparator,\n FieldSet,\n} from \"~/ui/primitives/field.js\"\nimport { Spinner } from \"~/ui/primitives/spinner.js\"\nimport { Switch } from \"~/ui/primitives/switch.js\"\n\n/**\n * The settings screen for a scorix app's MCP tools: the user's switch, one switch per tool,\n * the programs allowed in, and the calls as they happen.\n *\n * The api is INJECTED and its types are declared here, shaped like the `scorixMCP` that\n * `scorix generate proto` emits, so an app passes that object as is. Importing scorix's types\n * would put a desktop framework under the UI kit of every web app.\n *\n * `copy` is injected too, and without it there is no copy button: `navigator.clipboard` needs\n * a secure context, which only WebView2 grants a scorix app. Reaching for it here would work\n * on Windows and do nothing on macOS and Linux.\n */\n\nexport interface McpTool {\n name: string\n description: string\n destructive: boolean\n enabled: boolean\n}\n\nexport interface McpClient {\n path: string\n name?: string\n approved_at: string\n}\n\nexport interface McpStatus {\n offered: boolean\n enabled: boolean\n running: boolean\n tools: McpTool[]\n clients: McpClient[]\n client: { command: string; args: string[] }\n audit_log: string\n}\n\nexport interface McpCall {\n tool: string\n client: string\n client_path: string\n outcome: \"ok\" | \"error\" | \"denied\"\n error?: string\n ms: number\n}\n\nexport interface McpSettingsApi {\n status(): Promise<McpStatus>\n enable(enabled: boolean): Promise<McpStatus>\n setTool(name: string, enabled: boolean): Promise<McpStatus>\n revokeClient(path: string): Promise<McpStatus>\n onCall?(cb: (call: McpCall) => void): () => void\n}\n\nexport interface McpSettingsLabels {\n enable?: string\n enableHint?: string\n running?: string\n stopped?: string\n notOffered?: string\n connect?: string\n connectHint?: string\n copy?: string\n copied?: string\n copyConfig?: string\n tools?: string\n toolsHint?: string\n asksFirst?: string\n asksFirstHint?: string\n clients?: string\n clientsHint?: string\n clientsEmpty?: string\n revoke?: string\n activity?: string\n activityEmpty?: string\n ok?: string\n error?: string\n denied?: string\n auditLog?: string\n auditLogHint?: string\n retry?: string\n}\n\nconst FALLBACK: Required<McpSettingsLabels> = {\n enable: \"Allow MCP clients\",\n enableHint: \"Let an AI agent such as Claude Desktop or Cursor use the tools this app offers.\",\n running: \"Running\",\n stopped: \"Off\",\n notOffered: \"This build of the app offers no MCP tools.\",\n connect: \"Connect a client\",\n connectHint: \"Add this to the client's MCP configuration, then restart the client.\",\n copy: \"Copy\",\n copied: \"Copied\",\n copyConfig: \"Copy configuration\",\n tools: \"Tools\",\n toolsHint: \"A tool turned off is hidden from every client.\",\n asksFirst: \"Asks first\",\n asksFirstHint: \"You confirm every call in a dialog.\",\n clients: \"Allowed programs\",\n clientsHint: \"A program is added when you allow it, the first time it runs a tool.\",\n clientsEmpty: \"No program allowed yet.\",\n revoke: \"Remove\",\n activity: \"Recent calls\",\n activityEmpty: \"Calls show up here while this screen is open.\",\n ok: \"OK\",\n error: \"Failed\",\n denied: \"Denied\",\n auditLog: \"Audit log\",\n auditLogHint: \"Every call is written here, with credential-like arguments hidden.\",\n retry: \"Retry\",\n}\n\nconst RECENT_CALLS = 20\n\nconst OUTCOME_VARIANT = { ok: \"secondary\", error: \"destructive\", denied: \"outline\" } as const\n\ninterface SeenCall extends McpCall {\n key: number\n at: Date\n}\n\nfunction messageOf(err: unknown): string {\n return err instanceof Error ? err.message : String(err)\n}\n\nfunction baseName(path: string): string {\n return path.split(/[\\\\/]/).pop() || path\n}\n\nexport function McpSettings({\n api,\n serverName,\n copy,\n labels,\n locale,\n className,\n}: {\n api: McpSettingsApi\n /** The key under `mcpServers` in the configuration snippet: the app's own short name. */\n serverName: string\n copy?: (text: string) => Promise<void>\n labels?: McpSettingsLabels\n locale?: string\n className?: string\n}) {\n const t = { ...FALLBACK, ...labels }\n const id = React.useId()\n const [status, setStatus] = React.useState<McpStatus | null>(null)\n const [loadError, setLoadError] = React.useState<string | null>(null)\n const [error, setError] = React.useState<string | null>(null)\n const [busy, setBusy] = React.useState(false)\n const [copied, setCopied] = React.useState(false)\n const [calls, setCalls] = React.useState<SeenCall[]>([])\n // Bumped when a change starts and when it ends, so a refresh that raced one is dropped\n // instead of putting back what the change just replaced.\n const changes = React.useRef(0)\n const callKey = React.useRef(0)\n\n const load = React.useCallback(() => {\n setLoadError(null)\n api.status().then(setStatus, (err: unknown) => setLoadError(messageOf(err)))\n }, [api])\n\n React.useEffect(load, [load])\n\n React.useEffect(() => {\n if (!api.onCall) return\n return api.onCall((call) => {\n setCalls((prev) => [{ ...call, key: ++callKey.current, at: new Date() }, ...prev].slice(0, RECENT_CALLS))\n // A program the user just allowed did so in a native dialog, outside this screen; the\n // call it then makes is the only sign that the list of programs changed.\n const started = changes.current\n api.status().then(\n (next) => {\n if (changes.current === started) setStatus(next)\n },\n // A refresh nobody asked for keeps the last answer on screen rather than raising an error.\n () => {},\n )\n })\n }, [api])\n\n React.useEffect(() => {\n if (!copied) return\n const timer = setTimeout(() => setCopied(false), 2000)\n return () => clearTimeout(timer)\n }, [copied])\n\n const change = async (action: () => Promise<McpStatus>) => {\n changes.current++\n setBusy(true)\n setError(null)\n try {\n setStatus(await action())\n } catch (err) {\n setError(messageOf(err))\n } finally {\n changes.current++\n setBusy(false)\n }\n }\n\n if (!status) {\n if (!loadError) return <Spinner className={className} />\n return (\n <Alert variant=\"destructive\" className={className}>\n <AlertDescription className=\"flex items-center justify-between gap-3\">\n <span>{loadError}</span>\n <Button size=\"xs\" variant=\"outline\" onClick={load}>\n {t.retry}\n </Button>\n </AlertDescription>\n </Alert>\n )\n }\n\n if (!status.offered) {\n return (\n <FieldGroup className={className}>\n <FieldSet className=\"min-w-0\">\n <FieldLegend>{t.enable}</FieldLegend>\n <FieldDescription>{t.notOffered}</FieldDescription>\n </FieldSet>\n </FieldGroup>\n )\n }\n\n // Serialised, not assembled by hand: a Windows path pasted into JSON needs its backslashes\n // escaped, and a snippet the client cannot parse fails with no hint of why.\n const snippet = JSON.stringify(\n { mcpServers: { [serverName]: { command: status.client.command, args: status.client.args } } },\n null,\n 2,\n )\n const day = (iso: string) => {\n const d = new Date(iso)\n return Number.isNaN(d.getTime()) ? iso : d.toLocaleDateString(locale)\n }\n\n return (\n // min-w-0 on every FieldSet: a fieldset is min-content wide by default, so one long path or\n // config line would widen the whole screen instead of truncating or scrolling.\n <FieldGroup className={className}>\n {error ? (\n <Alert variant=\"destructive\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n ) : null}\n\n <FieldSet className=\"min-w-0\">\n <Field orientation=\"horizontal\">\n <FieldContent>\n <div className=\"flex items-center gap-2\">\n <FieldLabel htmlFor={`${id}-enable`} className=\"text-sm\">\n {t.enable}\n </FieldLabel>\n <Badge variant=\"outline\">{status.running ? t.running : t.stopped}</Badge>\n </div>\n <FieldDescription>{t.enableHint}</FieldDescription>\n </FieldContent>\n <Switch\n id={`${id}-enable`}\n checked={status.enabled}\n disabled={busy}\n onCheckedChange={(on) => void change(() => api.enable(on))}\n />\n </Field>\n </FieldSet>\n\n <FieldSeparator />\n <FieldSet className=\"min-w-0\">\n <FieldLegend>{t.connect}</FieldLegend>\n <FieldDescription>{t.connectHint}</FieldDescription>\n <div className=\"relative\">\n <pre className=\"bg-muted/50 overflow-x-auto border px-3 py-2 font-mono text-xs leading-relaxed\">{snippet}</pre>\n {copy ? (\n <Button\n size=\"xs\"\n variant=\"outline\"\n className=\"bg-background absolute top-2 right-2\"\n aria-label={t.copyConfig}\n onClick={() =>\n void copy(snippet).then(\n () => setCopied(true),\n (err: unknown) => setError(messageOf(err)),\n )\n }\n >\n {copied ? <CheckIcon /> : <CopyIcon />}\n {copied ? t.copied : t.copy}\n </Button>\n ) : null}\n </div>\n </FieldSet>\n\n <FieldSeparator />\n <FieldSet className=\"min-w-0\">\n <FieldLegend>{t.tools}</FieldLegend>\n <FieldDescription>{t.toolsHint}</FieldDescription>\n {status.tools.map((tool) => (\n <Field key={tool.name} orientation=\"horizontal\" data-disabled={!status.enabled}>\n <FieldContent>\n <div className=\"flex items-center gap-2\">\n <FieldLabel htmlFor={`${id}-tool-${tool.name}`} className=\"font-mono text-xs\">\n {tool.name}\n </FieldLabel>\n {tool.destructive ? (\n <Badge variant=\"destructive\" title={t.asksFirstHint}>\n {t.asksFirst}\n </Badge>\n ) : null}\n </div>\n <FieldDescription>{tool.description}</FieldDescription>\n </FieldContent>\n <Switch\n id={`${id}-tool-${tool.name}`}\n size=\"sm\"\n checked={tool.enabled}\n disabled={busy || !status.enabled}\n onCheckedChange={(on) => void change(() => api.setTool(tool.name, on))}\n />\n </Field>\n ))}\n </FieldSet>\n\n <FieldSeparator />\n <FieldSet className=\"min-w-0\">\n <FieldLegend>{t.clients}</FieldLegend>\n <FieldDescription>{t.clientsHint}</FieldDescription>\n {status.clients.length === 0 ? (\n <p className=\"text-muted-foreground text-xs\">{t.clientsEmpty}</p>\n ) : (\n <ul className=\"divide-y border\">\n {status.clients.map((client) => {\n const who = client.name || baseName(client.path)\n return (\n <li key={client.path} className=\"flex items-center gap-3 px-3 py-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm\">{who}</div>\n {/* Cut at the start: the end of a path names the program, and the start is the\n same home directory on every row. bdi keeps the path itself left to right. */}\n <div\n className=\"text-muted-foreground truncate text-left font-mono text-xs [direction:rtl]\"\n title={client.path}\n >\n <bdi>{client.path}</bdi>\n </div>\n </div>\n <span className=\"text-muted-foreground text-xs whitespace-nowrap\">{day(client.approved_at)}</span>\n <Button\n size=\"xs\"\n variant=\"ghost\"\n aria-label={`${t.revoke} ${who}`}\n disabled={busy}\n onClick={() => void change(() => api.revokeClient(client.path))}\n >\n {t.revoke}\n </Button>\n </li>\n )\n })}\n </ul>\n )}\n </FieldSet>\n\n {api.onCall ? (\n <>\n <FieldSeparator />\n <FieldSet className=\"min-w-0\">\n <FieldLegend>{t.activity}</FieldLegend>\n {calls.length === 0 ? (\n <p className=\"text-muted-foreground text-xs\">{t.activityEmpty}</p>\n ) : (\n <ul aria-label={t.activity} className=\"divide-y border\">\n {calls.map((call) => (\n <li key={call.key} className=\"flex items-center gap-3 px-3 py-1.5 text-xs\" title={call.error}>\n <span className=\"text-muted-foreground tabular-nums\">{call.at.toLocaleTimeString(locale)}</span>\n <span className=\"min-w-0 flex-1 truncate font-mono\">{call.tool}</span>\n <span className=\"text-muted-foreground max-w-40 truncate\" title={call.client_path}>\n {call.client || baseName(call.client_path)}\n </span>\n <Badge variant={OUTCOME_VARIANT[call.outcome]}>{t[call.outcome]}</Badge>\n <span className=\"text-muted-foreground w-14 text-right tabular-nums\">{call.ms} ms</span>\n </li>\n ))}\n </ul>\n )}\n </FieldSet>\n </>\n ) : null}\n\n <FieldSeparator />\n <FieldSet className=\"min-w-0\">\n <FieldLegend>{t.auditLog}</FieldLegend>\n <FieldDescription>{t.auditLogHint}</FieldDescription>\n <code\n className=\"bg-muted/50 block truncate border px-3 py-2 text-left font-mono text-xs [direction:rtl]\"\n title={status.audit_log}\n >\n <bdi>{status.audit_log}</bdi>\n </code>\n </FieldSet>\n </FieldGroup>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { PlusIcon } from \"lucide-react\"\n\nimport { Alert, AlertDescription } from \"~/ui/primitives/alert.js\"\nimport { Badge } from \"~/ui/primitives/badge.js\"\nimport { Button } from \"~/ui/primitives/button.js\"\nimport {\n Field,\n FieldContent,\n FieldDescription,\n FieldGroup,\n FieldLabel,\n FieldLegend,\n FieldSeparator,\n FieldSet,\n} from \"~/ui/primitives/field.js\"\nimport { Input } from \"~/ui/primitives/input.js\"\nimport { NativeSelect, NativeSelectOption } from \"~/ui/primitives/native-select.js\"\nimport { Progress } from \"~/ui/primitives/progress.js\"\nimport { Spinner } from \"~/ui/primitives/spinner.js\"\nimport { Switch } from \"~/ui/primitives/switch.js\"\n\n/**\n * The settings screen for a scorix app's language models: which provider and model each of the\n * app's slots uses, the providers the user added with their keys, and downloads with progress.\n *\n * The api is INJECTED and its types are declared here, shaped like the JSON of scorix's\n * `mod:llm:*` commands, so an app maps each method to one `invoke` call. Importing scorix's types\n * would put a desktop framework under the UI kit of every web app.\n *\n * Keys never come back from the api: a provider lists which secret fields hold a value, and the\n * form sends only the ones the user typed into or cleared.\n */\n\nexport type LlmCapability = \"chat\" | \"embed\" | \"vision\" | \"audio\" | \"tools\" | \"transcribe\" | (string & {})\n\nexport interface LlmField {\n key: string\n label: string\n kind: \"text\" | \"url\" | \"secret\" | \"bool\"\n required: boolean\n default?: string\n description?: string\n}\n\nexport interface LlmDriver {\n name: string\n fields: LlmField[]\n}\n\nexport interface LlmProvider {\n id: string\n /** Absent for a provider the app runs itself. */\n driver?: string\n values: Record<string, string>\n /** The secret fields that hold a value; never the value. */\n secrets: string[]\n capabilities: LlmCapability[]\n local: boolean\n /** Can download and delete models. */\n manages: boolean\n editable: boolean\n error?: string\n}\n\nexport interface LlmSlot {\n name: string\n label: string\n description?: string\n needs: LlmCapability[]\n local_only: boolean\n provider?: string\n model?: string\n error?: string\n}\n\nexport interface LlmState {\n providers: LlmProvider[]\n slots: LlmSlot[]\n}\n\nexport interface LlmModel {\n id: string\n size?: number\n parameter_size?: string\n quantization?: string\n}\n\nexport interface LlmFound {\n name: string\n driver: string\n base_url: string\n version?: string\n}\n\nexport interface LlmProviderInput {\n id: string\n driver: string\n values: Record<string, string>\n /** Only the secret fields being changed; an empty string removes one. */\n secrets: Record<string, string>\n}\n\nexport interface LlmPullProgress {\n provider: string\n model: string\n status: string\n done: number\n total: number\n}\n\nexport interface LlmSettingsApi {\n state(): Promise<LlmState>\n drivers(): Promise<LlmDriver[]>\n saveProvider(input: LlmProviderInput): Promise<LlmState>\n deleteProvider(id: string): Promise<LlmState>\n bind(slot: string, provider: string, model: string): Promise<LlmState>\n unbind(slot: string): Promise<LlmState>\n models(provider: string): Promise<LlmModel[]>\n /** Without these three there is no download button. */\n pull?(provider: string, model: string): Promise<boolean>\n cancelPull?(provider: string, model: string): Promise<boolean>\n onPull?(cb: (p: LlmPullProgress) => void): () => void\n /** Runtimes already running on this machine, offered as providers to add. */\n detect?(): Promise<LlmFound[]>\n}\n\nexport interface LlmSettingsLabels {\n slots?: string\n slotsHint?: string\n notSet?: string\n model?: string\n modelHint?: string\n localOnly?: string\n localOnlyHint?: string\n download?: string\n notDownloaded?: string\n cancel?: string\n providers?: string\n providersHint?: string\n providersEmpty?: string\n add?: string\n edit?: string\n remove?: string\n removeConfirm?: string\n keep?: string\n byApp?: string\n thisMachine?: string\n remote?: string\n keySaved?: string\n driver?: string\n id?: string\n idHint?: string\n save?: string\n keyKeep?: string\n keyRemove?: string\n running?: string\n addFound?: string\n retry?: string\n capabilities?: Partial<Record<string, string>>\n}\n\nconst FALLBACK: Required<Omit<LlmSettingsLabels, \"capabilities\">> = {\n slots: \"Models for this app\",\n slotsHint: \"Each feature uses the provider and model chosen here.\",\n notSet: \"Not set\",\n model: \"Model\",\n modelHint: \"Type a name or pick one the provider has.\",\n localOnly: \"This machine only\",\n localOnlyHint: \"What this feature reads never leaves the computer.\",\n download: \"Download\",\n notDownloaded: \"Not on this computer yet\",\n cancel: \"Cancel\",\n providers: \"Providers\",\n providersHint: \"Services and programs that run models.\",\n providersEmpty: \"No provider yet.\",\n add: \"Add provider\",\n edit: \"Edit\",\n remove: \"Remove\",\n removeConfirm: \"Remove\",\n keep: \"Keep\",\n byApp: \"run by the app\",\n thisMachine: \"this machine\",\n remote: \"remote\",\n keySaved: \"key saved\",\n driver: \"Type\",\n id: \"Name\",\n idHint: \"Lowercase letters, digits, dot, dash and underscore.\",\n save: \"Save\",\n keyKeep: \"Saved; leave empty to keep it\",\n keyRemove: \"Remove key\",\n running: \"Running on this computer\",\n addFound: \"Add\",\n retry: \"Retry\",\n}\n\nconst CAPABILITY: Record<string, string> = {\n chat: \"chat\",\n embed: \"embeddings\",\n vision: \"vision\",\n audio: \"audio\",\n tools: \"tools\",\n transcribe: \"speech to text\",\n}\n\nfunction messageOf(err: unknown): string {\n return err instanceof Error ? err.message : String(err)\n}\n\nfunction hostOf(url: string | undefined): string {\n if (!url) return \"\"\n try {\n const u = new URL(url)\n return u.host + (u.pathname === \"/\" ? \"\" : u.pathname)\n } catch {\n return url\n }\n}\n\n// Ollama reports each layer on its own, and after the weights come a license and a template of a\n// few KB: in whole megabytes they would read \"0 MB / 0 MB\".\nfunction sizeOf(bytes: number): string {\n if (bytes >= 1 << 30) return `${(bytes / (1 << 30)).toFixed(1)} GB`\n if (bytes >= 1 << 20) return `${Math.round(bytes / (1 << 20))} MB`\n return `${Math.ceil(bytes / 1024)} KB`\n}\n\n// The same test the module applies on bind, so the list offers only what it would accept.\nfunction serves(slot: LlmSlot, p: LlmProvider): boolean {\n return slot.needs.every((c) => p.capabilities.includes(c)) && (!slot.local_only || p.local)\n}\n\ninterface Draft {\n /** Set when editing; a new provider has none yet. */\n existing?: LlmProvider\n driver: string\n id: string\n values: Record<string, string>\n secrets: Record<string, string>\n}\n\n// A provider id has no slash, so this cannot join two different pairs into one key.\nconst pullKey = (provider: string, model: string) => `${provider}/${model}`\n\nexport function LlmSettings({\n api,\n labels,\n className,\n}: {\n api: LlmSettingsApi\n labels?: LlmSettingsLabels\n className?: string\n}) {\n const t = { ...FALLBACK, ...labels }\n const cap = (c: string) => labels?.capabilities?.[c] ?? CAPABILITY[c] ?? c\n const id = React.useId()\n const [state, setState] = React.useState<LlmState | null>(null)\n const [drivers, setDrivers] = React.useState<LlmDriver[]>([])\n const [found, setFound] = React.useState<LlmFound[]>([])\n const [loadError, setLoadError] = React.useState<string | null>(null)\n const [error, setError] = React.useState<string | null>(null)\n const [busy, setBusy] = React.useState(false)\n const [draft, setDraft] = React.useState<Draft | null>(null)\n const [draftError, setDraftError] = React.useState<string | null>(null)\n const [removing, setRemoving] = React.useState<string | null>(null)\n const [models, setModels] = React.useState<Record<string, LlmModel[]>>({})\n const [typed, setTyped] = React.useState<Record<string, string>>({})\n const [pulls, setPulls] = React.useState<Record<string, LlmPullProgress>>({})\n\n const load = React.useCallback(() => {\n setLoadError(null)\n Promise.all([api.state(), api.drivers()]).then(\n ([s, d]) => {\n setState(s)\n setDrivers(d)\n },\n (err: unknown) => setLoadError(messageOf(err)),\n )\n // Offered, not required: a screen with nothing detected is a normal one.\n api.detect?.().then(setFound, () => {})\n }, [api])\n\n React.useEffect(load, [load])\n\n React.useEffect(() => {\n if (!api.onPull) return\n return api.onPull((p) => setPulls((prev) => ({ ...prev, [pullKey(p.provider, p.model)]: p })))\n }, [api])\n\n const listModels = React.useCallback(\n (provider: string) => {\n api.models(provider).then(\n (ms) => setModels((prev) => ({ ...prev, [provider]: ms })),\n // A provider that cannot list its models still takes a typed name.\n () => setModels((prev) => ({ ...prev, [provider]: [] })),\n )\n },\n [api],\n )\n\n const bound = React.useMemo(() => new Set((state?.slots ?? []).map((s) => s.provider).filter(Boolean) as string[]), [state])\n React.useEffect(() => {\n for (const p of bound) if (!(p in models)) listModels(p)\n }, [bound, models, listModels])\n\n const change = async (action: () => Promise<LlmState>) => {\n setBusy(true)\n setError(null)\n try {\n setState(await action())\n } catch (err) {\n setError(messageOf(err))\n } finally {\n setBusy(false)\n }\n }\n\n if (!state) {\n if (!loadError) return <Spinner className={className} />\n return (\n <Alert variant=\"destructive\" className={className}>\n <AlertDescription className=\"flex items-center justify-between gap-3\">\n <span>{loadError}</span>\n <Button size=\"xs\" variant=\"outline\" onClick={load}>\n {t.retry}\n </Button>\n </AlertDescription>\n </Alert>\n )\n }\n\n const provider = (pid: string | undefined) => state.providers.find((p) => p.id === pid)\n\n const saveDraft = async () => {\n if (!draft) return\n const d = drivers.find((x) => x.name === draft.driver)\n const values: Record<string, string> = {}\n const secrets: Record<string, string> = {}\n for (const f of d?.fields ?? []) {\n if (f.kind !== \"secret\") {\n if (draft.values[f.key]) values[f.key] = draft.values[f.key] as string\n } else if (f.key in draft.secrets) {\n secrets[f.key] = draft.secrets[f.key] as string\n }\n }\n setBusy(true)\n setDraftError(null)\n try {\n setState(await api.saveProvider({ id: draft.id, driver: draft.driver, values, secrets }))\n setModels((prev) => {\n const next = { ...prev }\n delete next[draft.id]\n return next\n })\n setDraft(null)\n } catch (err) {\n // Kept next to the form, which stays open with what was typed.\n setDraftError(messageOf(err))\n } finally {\n setBusy(false)\n }\n }\n\n const startDraft = (next: Draft) => {\n setDraft(next)\n setDraftError(null)\n setRemoving(null)\n }\n\n const newDraft = (driver: string, values: Record<string, string> = {}, name = driver): Draft => {\n const taken = new Set(state.providers.map((p) => p.id))\n let pid = name\n for (let i = 2; taken.has(pid); i++) pid = `${name}-${i}`\n return { driver, id: pid, values, secrets: {} }\n }\n\n const form = (d: Draft) => {\n const spec = drivers.find((x) => x.name === d.driver)\n const set = (patch: Partial<Draft>) => setDraft({ ...d, ...patch })\n return (\n <div className=\"bg-muted/30 flex flex-col gap-3 border px-3 py-3\" data-testid=\"provider-form\">\n {draftError ? (\n <Alert variant=\"destructive\">\n <AlertDescription>{draftError}</AlertDescription>\n </Alert>\n ) : null}\n {d.existing ? null : (\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <Field>\n <FieldLabel htmlFor={`${id}-driver`}>{t.driver}</FieldLabel>\n <NativeSelect id={`${id}-driver`} value={d.driver} onChange={(e) => set(newDraft(e.target.value))}>\n {drivers.map((x) => (\n <NativeSelectOption key={x.name} value={x.name}>\n {x.name}\n </NativeSelectOption>\n ))}\n </NativeSelect>\n </Field>\n <Field>\n <FieldLabel htmlFor={`${id}-id`}>{t.id}</FieldLabel>\n <Input id={`${id}-id`} value={d.id} spellCheck={false} onChange={(e) => set({ id: e.target.value.toLowerCase() })} />\n <FieldDescription>{t.idHint}</FieldDescription>\n </Field>\n </div>\n )}\n {spec?.fields.map((f) => {\n const fid = `${id}-f-${f.key}`\n if (f.kind === \"bool\") {\n const on = (d.values[f.key] ?? f.default ?? \"false\") === \"true\"\n return (\n <Field key={f.key} orientation=\"horizontal\">\n <FieldContent>\n <FieldLabel htmlFor={fid}>{f.label}</FieldLabel>\n {f.description ? <FieldDescription>{f.description}</FieldDescription> : null}\n </FieldContent>\n <Switch id={fid} size=\"sm\" checked={on} onCheckedChange={(v) => set({ values: { ...d.values, [f.key]: v ? \"true\" : \"false\" } })} />\n </Field>\n )\n }\n if (f.kind === \"secret\") {\n const saved = d.existing?.secrets.includes(f.key) ?? false\n const cleared = d.secrets[f.key] === \"\" && saved\n return (\n <Field key={f.key}>\n <FieldLabel htmlFor={fid}>{f.label}</FieldLabel>\n <div className=\"flex gap-2\">\n <Input\n id={fid}\n type=\"password\"\n autoComplete=\"off\"\n placeholder={saved && !cleared ? t.keyKeep : undefined}\n value={d.secrets[f.key] ?? \"\"}\n onChange={(e) => {\n const secrets = { ...d.secrets, [f.key]: e.target.value }\n // Emptied again: back to \"leave it as it is\", not \"remove it\".\n if (e.target.value === \"\" && !cleared) delete secrets[f.key]\n set({ secrets })\n }}\n />\n {saved && !cleared ? (\n <Button variant=\"outline\" size=\"sm\" onClick={() => set({ secrets: { ...d.secrets, [f.key]: \"\" } })}>\n {t.keyRemove}\n </Button>\n ) : null}\n </div>\n {f.description ? <FieldDescription>{f.description}</FieldDescription> : null}\n </Field>\n )\n }\n return (\n <Field key={f.key}>\n <FieldLabel htmlFor={fid}>{f.label}</FieldLabel>\n <Input\n id={fid}\n type={f.kind === \"url\" ? \"url\" : \"text\"}\n spellCheck={false}\n placeholder={f.default}\n required={f.required}\n value={d.values[f.key] ?? \"\"}\n onChange={(e) => set({ values: { ...d.values, [f.key]: e.target.value } })}\n />\n {f.description ? <FieldDescription>{f.description}</FieldDescription> : null}\n </Field>\n )\n })}\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"ghost\" size=\"sm\" disabled={busy} onClick={() => setDraft(null)}>\n {t.cancel}\n </Button>\n <Button size=\"sm\" disabled={busy || !d.id} onClick={() => void saveDraft()}>\n {t.save}\n </Button>\n </div>\n </div>\n )\n }\n\n const unused = found.filter((f) => !state.providers.some((p) => p.values.base_url === f.base_url))\n\n return (\n // min-w-0 on every FieldSet: a fieldset is min-content wide by default, so one long URL\n // would widen the whole screen instead of truncating.\n <FieldGroup className={className}>\n {error ? (\n <Alert variant=\"destructive\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n ) : null}\n\n <FieldSet className=\"min-w-0\">\n <FieldLegend>{t.slots}</FieldLegend>\n <FieldDescription>{t.slotsHint}</FieldDescription>\n <ul className=\"divide-y border\">\n {state.slots.map((slot) => {\n const current = provider(slot.provider)\n const choices = state.providers.filter((p) => p.id === slot.provider || serves(slot, p))\n const known = slot.provider ? models[slot.provider] : undefined\n const draftModel = typed[slot.name] ?? slot.model ?? \"\"\n // Downloads follow the model the slot is bound to, not the text being typed: a\n // button that came and went with every keystroke would offer half a name.\n const chosen = slot.model ?? \"\"\n const pull = current ? pulls[pullKey(current.id, chosen)] : undefined\n const pulling = pull !== undefined\n const missing = known !== undefined && chosen !== \"\" && !known.some((m) => m.id === chosen)\n const commit = () => {\n if (!slot.provider || draftModel === (slot.model ?? \"\")) return\n void change(() => api.bind(slot.name, slot.provider as string, draftModel))\n }\n return (\n <li key={slot.name} className=\"flex flex-col gap-2 px-3 py-3\" data-testid={`slot-${slot.name}`}>\n <div className=\"flex flex-wrap items-start gap-x-6 gap-y-2\">\n <div className=\"min-w-40 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium\">{slot.label}</span>\n {slot.local_only ? (\n <Badge variant=\"outline\" title={t.localOnlyHint}>\n {t.localOnly}\n </Badge>\n ) : null}\n </div>\n {slot.description ? <p className=\"text-muted-foreground text-xs\">{slot.description}</p> : null}\n </div>\n <div className=\"flex w-full gap-2 sm:w-auto\">\n <NativeSelect\n aria-label={`${slot.label}: ${t.providers}`}\n className=\"sm:w-40\"\n value={slot.provider ?? \"\"}\n disabled={busy}\n onChange={(e) => {\n const next = e.target.value\n setTyped((prev) => {\n const rest = { ...prev }\n delete rest[slot.name]\n return rest\n })\n void change(() => (next ? api.bind(slot.name, next, \"\") : api.unbind(slot.name)))\n }}\n >\n <NativeSelectOption value=\"\">{t.notSet}</NativeSelectOption>\n {choices.map((p) => (\n <NativeSelectOption key={p.id} value={p.id}>\n {p.id}\n </NativeSelectOption>\n ))}\n </NativeSelect>\n <Input\n aria-label={`${slot.label}: ${t.model}`}\n title={t.modelHint}\n // Chrome draws the datalist arrow in solid black, louder than anything else here.\n className=\"sm:w-56 [&::-webkit-calendar-picker-indicator]:opacity-30\"\n list={`${id}-models-${slot.name}`}\n spellCheck={false}\n placeholder={t.model}\n disabled={busy || !slot.provider}\n value={draftModel}\n onChange={(e) => setTyped((prev) => ({ ...prev, [slot.name]: e.target.value }))}\n onBlur={commit}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") commit()\n }}\n />\n <datalist id={`${id}-models-${slot.name}`}>\n {known?.map((m) => (\n <option key={m.id} value={m.id}>\n {[m.parameter_size, m.quantization, m.size ? sizeOf(m.size) : \"\"].filter(Boolean).join(\" · \")}\n </option>\n ))}\n </datalist>\n </div>\n </div>\n {slot.error ? <p className=\"text-destructive text-xs\">{slot.error}</p> : null}\n {current?.manages && api.pull && missing && !pulling ? (\n <div className=\"flex items-center justify-end gap-3\">\n <span className=\"text-muted-foreground text-xs\">{t.notDownloaded}</span>\n <Button\n size=\"xs\"\n variant=\"outline\"\n disabled={busy}\n onClick={() => {\n const key = pullKey(current.id, chosen)\n const end = () =>\n setPulls((prev) => {\n const rest = { ...prev }\n delete rest[key]\n return rest\n })\n setPulls((prev) => ({ ...prev, [key]: { provider: current.id, model: chosen, status: \"\", done: 0, total: 0 } }))\n api.pull?.(current.id, chosen).then(\n (done) => {\n end()\n if (done) listModels(current.id)\n },\n (err: unknown) => {\n end()\n setError(messageOf(err))\n },\n )\n }}\n >\n {t.download} {chosen}\n </Button>\n </div>\n ) : null}\n {pulling && current ? (\n <div className=\"flex items-center gap-3\" data-testid={`pull-${slot.name}`}>\n <Progress className=\"flex-1\" value={pull.total > 0 ? (pull.done / pull.total) * 100 : 0} />\n <span className=\"text-muted-foreground w-28 text-right text-xs tabular-nums\">\n {pull.total > 0 ? `${sizeOf(pull.done)} / ${sizeOf(pull.total)}` : pull.status}\n </span>\n {api.cancelPull ? (\n <Button size=\"xs\" variant=\"ghost\" onClick={() => void api.cancelPull?.(current.id, pull.model)}>\n {t.cancel}\n </Button>\n ) : null}\n </div>\n ) : null}\n </li>\n )\n })}\n </ul>\n </FieldSet>\n\n <FieldSeparator />\n <FieldSet className=\"min-w-0\">\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <FieldLegend>{t.providers}</FieldLegend>\n <FieldDescription>{t.providersHint}</FieldDescription>\n </div>\n <Button\n size=\"sm\"\n variant=\"outline\"\n disabled={busy || drivers.length === 0}\n onClick={() => startDraft(newDraft(drivers[0]?.name ?? \"\"))}\n >\n <PlusIcon />\n {t.add}\n </Button>\n </div>\n {draft && !draft.existing ? form(draft) : null}\n {state.providers.length === 0 ? (\n <p className=\"text-muted-foreground text-xs\">{t.providersEmpty}</p>\n ) : (\n <ul className=\"divide-y border\">\n {state.providers.map((p) =>\n draft?.existing?.id === p.id ? (\n <li key={p.id} className=\"p-0\">\n {form(draft)}\n </li>\n ) : (\n <li key={p.id} className=\"flex items-center gap-3 px-3 py-2\" data-testid={`provider-${p.id}`}>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate text-sm font-medium\">{p.id}</span>\n {/* A provider named after its driver, as a detected one is, says it once. */}\n {p.driver !== p.id ? <span className=\"text-muted-foreground text-xs\">{p.driver ?? t.byApp}</span> : null}\n </div>\n <div className=\"text-muted-foreground flex flex-wrap items-center gap-x-2 text-xs [&>*:not(:first-child)]:before:mr-2 [&>*:not(:first-child)]:before:content-['·']\">\n {p.values.base_url ? (\n <span className=\"max-w-64 truncate font-mono\" title={p.values.base_url}>\n {hostOf(p.values.base_url)}\n </span>\n ) : null}\n <span>{p.local ? t.thisMachine : t.remote}</span>\n {p.secrets.length > 0 ? <span>{t.keySaved}</span> : null}\n {p.capabilities.length > 0 ? <span>{p.capabilities.map(cap).join(\", \")}</span> : null}\n </div>\n {p.error ? <p className=\"text-destructive text-xs\">{p.error}</p> : null}\n </div>\n {p.editable ? (\n removing === p.id ? (\n <>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => setRemoving(null)}>\n {t.keep}\n </Button>\n <Button\n size=\"xs\"\n variant=\"destructive\"\n disabled={busy}\n onClick={() => {\n setRemoving(null)\n void change(() => api.deleteProvider(p.id))\n }}\n >\n {t.removeConfirm} {p.id}\n </Button>\n </>\n ) : (\n <>\n <Button\n size=\"xs\"\n variant=\"ghost\"\n aria-label={`${t.edit} ${p.id}`}\n disabled={busy}\n onClick={() => startDraft({ existing: p, driver: p.driver ?? \"\", id: p.id, values: { ...p.values }, secrets: {} })}\n >\n {t.edit}\n </Button>\n <Button size=\"xs\" variant=\"ghost\" aria-label={`${t.remove} ${p.id}`} disabled={busy} onClick={() => setRemoving(p.id)}>\n {t.remove}\n </Button>\n </>\n )\n ) : null}\n </li>\n ),\n )}\n </ul>\n )}\n {unused.length > 0 ? (\n <div className=\"flex flex-col gap-1\">\n <p className=\"text-muted-foreground text-xs\">{t.running}</p>\n <ul className=\"divide-y border border-dashed\">\n {unused.map((f) => (\n <li key={f.base_url} className=\"flex items-center gap-3 px-3 py-2\">\n <span className=\"text-sm\">{f.name}</span>\n {f.version ? <span className=\"text-muted-foreground text-xs\">{f.version}</span> : null}\n <span className=\"text-muted-foreground min-w-0 flex-1 truncate font-mono text-xs\">{f.base_url}</span>\n <Button\n size=\"xs\"\n variant=\"outline\"\n aria-label={`${t.addFound} ${f.name}`}\n disabled={busy || !drivers.some((d) => d.name === f.driver)}\n onClick={() => startDraft(newDraft(f.driver, { base_url: f.base_url }, f.name))}\n >\n {t.addFound}\n </Button>\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n </FieldSet>\n </FieldGroup>\n )\n}\n"]}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { useMobile } from './chunk-QYA2HGKW.js';
|
|
2
|
+
import { Separator } from './chunk-XJJQAQWJ.js';
|
|
2
3
|
import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuItem } from './chunk-VEWKPOMS.js';
|
|
3
4
|
import { Avatar, AvatarImage, AvatarFallback } from './chunk-F2ET7EL2.js';
|
|
4
5
|
import { Button, Input } from './chunk-VGOGWZCF.js';
|
|
5
6
|
import { cn } from './chunk-XH55BHUU.js';
|
|
6
|
-
import * as
|
|
7
|
-
import { Slot,
|
|
7
|
+
import * as React6 from 'react';
|
|
8
|
+
import { Slot, ContextMenu as ContextMenu$1, ScrollArea as ScrollArea$1, Dialog, Tooltip as Tooltip$1 } from 'radix-ui';
|
|
8
9
|
import { ChevronRightIcon, MoreHorizontalIcon, CheckIcon, XIcon, PanelLeftIcon, CircleUser, Users, LogOut, LogIn } from 'lucide-react';
|
|
9
10
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
10
11
|
import { cva } from 'class-variance-authority';
|
|
@@ -113,26 +114,6 @@ function BreadcrumbEllipsis({
|
|
|
113
114
|
}
|
|
114
115
|
);
|
|
115
116
|
}
|
|
116
|
-
function Separator({
|
|
117
|
-
className,
|
|
118
|
-
orientation = "horizontal",
|
|
119
|
-
decorative = true,
|
|
120
|
-
...props
|
|
121
|
-
}) {
|
|
122
|
-
return /* @__PURE__ */ jsx(
|
|
123
|
-
Separator$1.Root,
|
|
124
|
-
{
|
|
125
|
-
"data-slot": "separator",
|
|
126
|
-
decorative,
|
|
127
|
-
orientation,
|
|
128
|
-
className: cn(
|
|
129
|
-
"shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch",
|
|
130
|
-
className
|
|
131
|
-
),
|
|
132
|
-
...props
|
|
133
|
-
}
|
|
134
|
-
);
|
|
135
|
-
}
|
|
136
117
|
function ContextMenu({
|
|
137
118
|
...props
|
|
138
119
|
}) {
|
|
@@ -585,9 +566,9 @@ var SIDEBAR_WIDTH = "16rem";
|
|
|
585
566
|
var SIDEBAR_WIDTH_MOBILE = "18rem";
|
|
586
567
|
var SIDEBAR_WIDTH_ICON = "3rem";
|
|
587
568
|
var SIDEBAR_KEYBOARD_SHORTCUT = "b";
|
|
588
|
-
var SidebarContext =
|
|
569
|
+
var SidebarContext = React6.createContext(null);
|
|
589
570
|
function useSidebar() {
|
|
590
|
-
const context =
|
|
571
|
+
const context = React6.useContext(SidebarContext);
|
|
591
572
|
if (!context) {
|
|
592
573
|
throw new Error("useSidebar must be used within a SidebarProvider.");
|
|
593
574
|
}
|
|
@@ -603,10 +584,10 @@ function SidebarProvider({
|
|
|
603
584
|
...props
|
|
604
585
|
}) {
|
|
605
586
|
const isMobile = useMobile();
|
|
606
|
-
const [openMobile, setOpenMobile] =
|
|
607
|
-
const [_open, _setOpen] =
|
|
587
|
+
const [openMobile, setOpenMobile] = React6.useState(false);
|
|
588
|
+
const [_open, _setOpen] = React6.useState(defaultOpen);
|
|
608
589
|
const open = openProp ?? _open;
|
|
609
|
-
const setOpen =
|
|
590
|
+
const setOpen = React6.useCallback(
|
|
610
591
|
(value) => {
|
|
611
592
|
const openState = typeof value === "function" ? value(open) : value;
|
|
612
593
|
if (setOpenProp) {
|
|
@@ -618,10 +599,10 @@ function SidebarProvider({
|
|
|
618
599
|
},
|
|
619
600
|
[setOpenProp, open]
|
|
620
601
|
);
|
|
621
|
-
const toggleSidebar =
|
|
602
|
+
const toggleSidebar = React6.useCallback(() => {
|
|
622
603
|
return isMobile ? setOpenMobile((open2) => !open2) : setOpen((open2) => !open2);
|
|
623
604
|
}, [isMobile, setOpen, setOpenMobile]);
|
|
624
|
-
|
|
605
|
+
React6.useEffect(() => {
|
|
625
606
|
const handleKeyDown = (event) => {
|
|
626
607
|
if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {
|
|
627
608
|
event.preventDefault();
|
|
@@ -632,7 +613,7 @@ function SidebarProvider({
|
|
|
632
613
|
return () => window.removeEventListener("keydown", handleKeyDown);
|
|
633
614
|
}, [toggleSidebar]);
|
|
634
615
|
const state = open ? "expanded" : "collapsed";
|
|
635
|
-
const contextValue =
|
|
616
|
+
const contextValue = React6.useMemo(
|
|
636
617
|
() => ({
|
|
637
618
|
state,
|
|
638
619
|
open,
|
|
@@ -1076,7 +1057,7 @@ function SidebarMenuSkeleton({
|
|
|
1076
1057
|
showIcon = false,
|
|
1077
1058
|
...props
|
|
1078
1059
|
}) {
|
|
1079
|
-
const [width] =
|
|
1060
|
+
const [width] = React6.useState(() => {
|
|
1080
1061
|
return `${Math.floor(Math.random() * 40) + 50}%`;
|
|
1081
1062
|
});
|
|
1082
1063
|
return /* @__PURE__ */ jsxs(
|
|
@@ -1245,6 +1226,6 @@ function initialsOf(value) {
|
|
|
1245
1226
|
return (letters || base.slice(0, 2)).toUpperCase();
|
|
1246
1227
|
}
|
|
1247
1228
|
|
|
1248
|
-
export { AccountMenu, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, ScrollArea, ScrollBar,
|
|
1249
|
-
//# sourceMappingURL=chunk-
|
|
1250
|
-
//# sourceMappingURL=chunk-
|
|
1229
|
+
export { AccountMenu, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, ScrollArea, ScrollBar, 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, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, defaultAccountMenuLabels, initialsOf, useSidebar };
|
|
1230
|
+
//# sourceMappingURL=chunk-BTZYRWFX.js.map
|
|
1231
|
+
//# sourceMappingURL=chunk-BTZYRWFX.js.map
|