@neuronection/assistant-ui 0.49.0 → 0.50.1

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.
Files changed (39) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +1 -0
  3. package/dist/admin-user-table.js +1 -1
  4. package/dist/ai-magic-fill.js +1 -1
  5. package/dist/{chunk-RXFQZMSF.js → chunk-3YIVKKT6.js} +3 -3
  6. package/dist/{chunk-RXFQZMSF.js.map → chunk-3YIVKKT6.js.map} +1 -1
  7. package/dist/{chunk-OIET4P2M.js → chunk-47CRUWHB.js} +4 -4
  8. package/dist/{chunk-OIET4P2M.js.map → chunk-47CRUWHB.js.map} +1 -1
  9. package/dist/{chunk-67FLOT4X.js → chunk-5U45TQJE.js} +3 -3
  10. package/dist/{chunk-67FLOT4X.js.map → chunk-5U45TQJE.js.map} +1 -1
  11. package/dist/{chunk-WY5TO6R4.js → chunk-6ANLDUGL.js} +3 -3
  12. package/dist/{chunk-WY5TO6R4.js.map → chunk-6ANLDUGL.js.map} +1 -1
  13. package/dist/{chunk-PTTJJEYJ.js → chunk-CCFVDJHU.js} +3 -3
  14. package/dist/{chunk-PTTJJEYJ.js.map → chunk-CCFVDJHU.js.map} +1 -1
  15. package/dist/{chunk-QUVVOG7K.js → chunk-MFM4W6ZO.js} +3 -3
  16. package/dist/{chunk-QUVVOG7K.js.map → chunk-MFM4W6ZO.js.map} +1 -1
  17. package/dist/chunk-SNHU4PV3.js +169 -0
  18. package/dist/chunk-SNHU4PV3.js.map +1 -0
  19. package/dist/{chunk-URLF67WR.js → chunk-SVRCZUNQ.js} +6 -2
  20. package/dist/chunk-SVRCZUNQ.js.map +1 -0
  21. package/dist/{chunk-BCKOBT7T.js → chunk-UMI4M4MF.js} +3 -3
  22. package/dist/{chunk-BCKOBT7T.js.map → chunk-UMI4M4MF.js.map} +1 -1
  23. package/dist/{chunk-YM4YN3YC.js → chunk-X6L5Z5LV.js} +3 -3
  24. package/dist/{chunk-YM4YN3YC.js.map → chunk-X6L5Z5LV.js.map} +1 -1
  25. package/dist/combobox.js +1 -1
  26. package/dist/index.d.ts +59 -1
  27. package/dist/index.js +25 -24
  28. package/dist/instance-mode-control.d.ts +62 -0
  29. package/dist/instance-mode-control.js +3 -0
  30. package/dist/instance-mode-control.js.map +1 -0
  31. package/dist/markdown-diff-view.js +1 -1
  32. package/dist/model-picker.js +1 -1
  33. package/dist/model-registry.js +1 -1
  34. package/dist/profile-switcher.js +1 -1
  35. package/dist/provider-form.js +1 -1
  36. package/dist/styles.css +1 -1
  37. package/dist/task-assignment-picker.js +1 -1
  38. package/package.json +6 -2
  39. package/dist/chunk-URLF67WR.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/markdown-diff-view/blockSplit.ts","../src/components/markdown-diff-view/MarkdownDiffView.tsx"],"names":["MarkdownDiffView","useRef"],"mappings":"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","file":"chunk-QUVVOG7K.js","sourcesContent":["function fenceMarkerOf(\n trimmed: string,\n): { char: string; bare: boolean } | null {\n const bare = /^(`{3,}|~{3,})$/.exec(trimmed)\n const marker = bare?.[1] ?? /^(`{3,}|~{3,})/.exec(trimmed)?.[1]\n if (marker === undefined || marker.length === 0) {\n return null\n }\n return { char: marker.charAt(0), bare: bare !== null }\n}\n\nexport function splitMarkdownBlocks(markdown: string): string[] {\n const lines = markdown.replace(/\\r\\n?/g, '\\n').split('\\n')\n const blocks: string[] = []\n let current: string[] = []\n let fenceChar: string | null = null\n let inMath = false\n\n const flush = () => {\n if (current.some((line) => line.trim() !== '')) {\n blocks.push(current.join('\\n').trim())\n }\n current = []\n }\n\n for (const line of lines) {\n const trimmed = line.trim()\n const marker = fenceMarkerOf(trimmed)\n if (fenceChar !== null) {\n current.push(line)\n if (marker !== null && marker.bare && marker.char === fenceChar) {\n fenceChar = null\n }\n continue\n }\n if (marker !== null) {\n flush()\n fenceChar = marker.char\n current.push(line)\n continue\n }\n if (inMath) {\n current.push(line)\n if (trimmed.endsWith('$$')) {\n inMath = false\n }\n continue\n }\n if (trimmed === '$$') {\n flush()\n inMath = true\n current.push(line)\n continue\n }\n if (trimmed.startsWith('$$')) {\n flush()\n current.push(line)\n if (!trimmed.endsWith('$$') || trimmed.length <= 4) {\n inMath = true\n }\n continue\n }\n if (trimmed === '') {\n flush()\n continue\n }\n current.push(line)\n }\n flush()\n return blocks\n}\n","import * as React from 'react'\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport {\n ChevronDown,\n ChevronRight,\n ChevronUp,\n Minus,\n Plus,\n} from 'lucide-react'\n\nimport { cn } from '../../lib/utils'\nimport { MarkdownSurface } from '../chat-markdown'\nimport { computeUnitDiff, type DiffRow } from '../text-diff-view/lineDiff'\n\nimport { splitMarkdownBlocks } from './blockSplit'\n\nexport interface MarkdownDiffViewLabels {\n original?: string\n suggested?: string\n /** Fold summary for a run of hidden unchanged blocks. */\n unchangedBlocks?: (count: number) => string\n showLess?: string\n prevChange?: string\n nextChange?: string\n changePosition?: (index: number, total: number) => string\n noChanges?: string\n}\n\nconst DEFAULT_LABELS: Required<MarkdownDiffViewLabels> = {\n original: 'Original',\n suggested: 'Suggested',\n unchangedBlocks: (count) =>\n count === 1 ? '1 unchanged block' : `${count} unchanged blocks`,\n showLess: 'Show less',\n prevChange: 'Previous change',\n nextChange: 'Next change',\n changePosition: (index, total) => `${index}/${total}`,\n noChanges: 'No changes',\n}\n\nexport interface MarkdownDiffViewProps {\n original: string\n suggested: string\n /** Unchanged blocks kept visible around each change; the rest fold. Default 1. */\n contextBlocks?: number\n showHeader?: boolean\n showNav?: boolean\n labels?: Partial<MarkdownDiffViewLabels>\n /** Applied to the outer box. */\n className?: string\n /** Applied to the scrolling body — size the view here (e.g. `max-h-80`). */\n bodyClassName?: string\n}\n\nfunction isChangedRow(row: DiffRow): boolean {\n return (\n row.kind === 'pair' &&\n (row.left?.kind === 'del' || row.right?.kind === 'add')\n )\n}\n\ninterface FlatRow {\n key: string\n row: DiffRow\n foldOf?: number\n collapseOf?: number\n}\n\nfunction BlockSurface({ value }: { value: string }) {\n return <MarkdownSurface value={value} className=\"min-w-0 [&>*:first-child]:mt-0 [&>*:last-child]:mb-0\" />\n}\n\nexport const MarkdownDiffView = React.forwardRef<\n HTMLDivElement,\n MarkdownDiffViewProps\n>(function MarkdownDiffView(\n {\n original,\n suggested,\n contextBlocks = 1,\n showHeader = true,\n showNav = true,\n labels,\n className,\n bodyClassName,\n },\n ref,\n) {\n const mergedLabels = { ...DEFAULT_LABELS, ...labels }\n const [expanded, setExpanded] = useState<Set<number>>(new Set())\n const [activeGroup, setActiveGroup] = useState(0)\n const scrollRef = React.useRef<HTMLDivElement | null>(null)\n const rowRefs = useRef(new Map<number, HTMLDivElement>())\n\n const diff = useMemo(\n () =>\n computeUnitDiff(splitMarkdownBlocks(original), splitMarkdownBlocks(suggested), {\n contextUnits: contextBlocks,\n }),\n [original, suggested, contextBlocks],\n )\n\n const flatRows = useMemo<FlatRow[]>(() => {\n const out: FlatRow[] = []\n diff.rows.forEach((row, index) => {\n if (row.kind === 'fold' && expanded.has(index)) {\n row.hidden.forEach((hiddenRow, hiddenIndex) => {\n out.push({ key: `${index}.${hiddenIndex}`, row: hiddenRow })\n })\n out.push({ key: `${index}.collapse`, row, collapseOf: index })\n } else {\n out.push({\n key: String(index),\n row,\n foldOf: row.kind === 'fold' ? index : undefined,\n })\n }\n })\n return out\n }, [diff.rows, expanded])\n\n const changeGroups = useMemo<number[]>(() => {\n const groups: number[] = []\n let inGroup = false\n flatRows.forEach((entry, index) => {\n const changed = isChangedRow(entry.row)\n if (changed && !inGroup) {\n groups.push(index)\n }\n inGroup = changed\n })\n return groups\n }, [flatRows])\n\n useEffect(() => {\n setExpanded(new Set())\n setActiveGroup(0)\n }, [original, suggested])\n\n useEffect(() => {\n if (activeGroup >= changeGroups.length) {\n setActiveGroup(0)\n }\n }, [activeGroup, changeGroups.length])\n\n useEffect(() => {\n const target = changeGroups[activeGroup]\n if (target === undefined) {\n return\n }\n const element = rowRefs.current.get(target)\n if (element && typeof element.scrollIntoView === 'function') {\n element.scrollIntoView({ block: 'center' })\n }\n }, [activeGroup, changeGroups])\n\n if (diff.added === 0 && diff.removed === 0) {\n return (\n <div\n ref={ref}\n data-as=\"markdown-diff-view\"\n className={cn(\n 'text-[var(--as-muted-fg)] border-[var(--as-border)] bg-[var(--as-subtle)] rounded-md border p-3 text-xs',\n className,\n )}\n >\n {mergedLabels.noChanges}\n </div>\n )\n }\n\n const activeGroupStart = changeGroups[activeGroup]\n const activeGroupEnd =\n activeGroupStart === undefined\n ? undefined\n : (() => {\n for (\n let index = activeGroupStart + 1;\n index < flatRows.length;\n index += 1\n ) {\n const entry = flatRows[index]\n if (entry !== undefined && isChangedRow(entry.row)) {\n return index\n }\n }\n return flatRows.length\n })()\n\n const renderRow = (entry: FlatRow, index: number) => {\n const row = entry.row\n if (row.kind === 'fold') {\n if (entry.collapseOf !== undefined) {\n const collapseOf = entry.collapseOf\n return (\n <button\n key={entry.key}\n type=\"button\"\n onClick={() =>\n setExpanded((current) => {\n const next = new Set(current)\n next.delete(collapseOf)\n return next\n })\n }\n className=\"text-[var(--as-muted-fg)] hover:bg-[var(--as-subtle)] hover:text-[var(--as-fg)] flex w-full items-center gap-1 px-3 py-0.5 text-left text-[11px]\"\n >\n <ChevronDown className=\"size-3\" aria-hidden />\n {mergedLabels.showLess}\n </button>\n )\n }\n const foldOf = entry.foldOf\n return (\n <button\n key={entry.key}\n type=\"button\"\n onClick={() => {\n if (foldOf !== undefined) {\n setExpanded((current) => {\n const next = new Set(current)\n next.add(foldOf)\n return next\n })\n }\n }}\n className=\"text-[var(--as-muted-fg)] hover:bg-[var(--as-subtle)] hover:text-[var(--as-fg)] flex w-full items-center gap-1 px-3 py-0.5 text-left text-[11px]\"\n >\n <ChevronRight className=\"size-3\" aria-hidden />\n {mergedLabels.unchangedBlocks(row.count)}\n </button>\n )\n }\n const changed = isChangedRow(row)\n const active =\n activeGroupStart !== undefined &&\n activeGroupEnd !== undefined &&\n index >= activeGroupStart &&\n index < activeGroupEnd\n if (!changed) {\n const text = row.left?.text ?? row.right?.text ?? ''\n return (\n <div\n key={entry.key}\n ref={(node) => {\n if (node) {\n rowRefs.current.set(index, node)\n } else {\n rowRefs.current.delete(index)\n }\n }}\n data-context=\"\"\n className={cn('border-[var(--as-border)] px-3 py-1.5', active && 'bg-[var(--as-primary)]/5')}\n >\n <BlockSurface value={text} />\n </div>\n )\n }\n return (\n <div\n key={entry.key}\n ref={(node) => {\n if (node) {\n rowRefs.current.set(index, node)\n } else {\n rowRefs.current.delete(index)\n }\n }}\n className={cn('grid grid-cols-2', active && 'bg-[var(--as-primary)]/5')}\n data-changed={changed || undefined}\n data-active={active || undefined}\n >\n {(['left', 'right'] as const).map((side) => {\n const cell = row[side]\n const isAdd = cell?.kind === 'add'\n const isDel = cell?.kind === 'del'\n return (\n <div\n key={side}\n data-kind={isAdd ? 'add' : isDel ? 'del' : undefined}\n className={cn(\n 'min-w-0 px-3 py-1.5',\n isAdd && 'bg-[var(--as-success)]/10',\n isDel && 'bg-[var(--as-danger)]/10',\n cell === null && 'bg-[var(--as-subtle)]/50',\n )}\n >\n {cell === null ? null : <BlockSurface value={cell.text} />}\n </div>\n )\n })}\n </div>\n )\n }\n\n return (\n <div\n ref={ref}\n data-as=\"markdown-diff-view\"\n className={cn(\n 'bg-[var(--as-surface)] border-[var(--as-border)] flex flex-col overflow-hidden rounded-md border text-sm leading-relaxed',\n className,\n )}\n >\n {showHeader ? (\n <div className=\"border-[var(--as-border)] text-[var(--as-muted-fg)] grid grid-cols-[1fr_auto_1fr] items-center gap-2 border-b px-3 py-1.5 text-[11px] font-medium tracking-wide uppercase\">\n <span className=\"flex items-center gap-1\">\n <Minus className=\"size-3 text-[var(--as-danger)]\" aria-hidden />\n {mergedLabels.original}\n </span>\n <span className=\"flex items-center gap-2\">\n <span>\n <span className=\"text-[var(--as-success)]\">+{diff.added}</span>{' '}\n <span className=\"text-[var(--as-danger)]\">−{diff.removed}</span>\n </span>\n {showNav && changeGroups.length > 0 ? (\n <span className=\"flex items-center gap-0.5\">\n <button\n type=\"button\"\n aria-label={mergedLabels.prevChange}\n title={mergedLabels.prevChange}\n disabled={activeGroup === 0}\n onClick={() => setActiveGroup((value) => Math.max(0, value - 1))}\n className=\"hover:bg-[var(--as-border)] hover:text-[var(--as-fg)] rounded p-0.5 disabled:opacity-40\"\n >\n <ChevronUp className=\"size-3.5\" aria-hidden />\n </button>\n <span className=\"tabular-nums\">\n {mergedLabels.changePosition(activeGroup + 1, changeGroups.length)}\n </span>\n <button\n type=\"button\"\n aria-label={mergedLabels.nextChange}\n title={mergedLabels.nextChange}\n disabled={activeGroup >= changeGroups.length - 1}\n onClick={() =>\n setActiveGroup((value) => Math.min(changeGroups.length - 1, value + 1))\n }\n className=\"hover:bg-[var(--as-border)] hover:text-[var(--as-fg)] rounded p-0.5 disabled:opacity-40\"\n >\n <ChevronDown className=\"size-3.5\" aria-hidden />\n </button>\n </span>\n ) : null}\n </span>\n <span className=\"flex items-center justify-end gap-1\">\n {mergedLabels.suggested}\n <Plus className=\"size-3 text-[var(--as-success)]\" aria-hidden />\n </span>\n </div>\n ) : null}\n <div ref={scrollRef} className={cn('min-h-0 flex-1 overflow-y-auto', bodyClassName)}>\n {flatRows.map((entry, index) => renderRow(entry, index))}\n </div>\n </div>\n )\n})\n"]}
1
+ {"version":3,"sources":["../src/components/markdown-diff-view/blockSplit.ts","../src/components/markdown-diff-view/MarkdownDiffView.tsx"],"names":["MarkdownDiffView","useRef"],"mappings":"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","file":"chunk-MFM4W6ZO.js","sourcesContent":["function fenceMarkerOf(\n trimmed: string,\n): { char: string; bare: boolean } | null {\n const bare = /^(`{3,}|~{3,})$/.exec(trimmed)\n const marker = bare?.[1] ?? /^(`{3,}|~{3,})/.exec(trimmed)?.[1]\n if (marker === undefined || marker.length === 0) {\n return null\n }\n return { char: marker.charAt(0), bare: bare !== null }\n}\n\nexport function splitMarkdownBlocks(markdown: string): string[] {\n const lines = markdown.replace(/\\r\\n?/g, '\\n').split('\\n')\n const blocks: string[] = []\n let current: string[] = []\n let fenceChar: string | null = null\n let inMath = false\n\n const flush = () => {\n if (current.some((line) => line.trim() !== '')) {\n blocks.push(current.join('\\n').trim())\n }\n current = []\n }\n\n for (const line of lines) {\n const trimmed = line.trim()\n const marker = fenceMarkerOf(trimmed)\n if (fenceChar !== null) {\n current.push(line)\n if (marker !== null && marker.bare && marker.char === fenceChar) {\n fenceChar = null\n }\n continue\n }\n if (marker !== null) {\n flush()\n fenceChar = marker.char\n current.push(line)\n continue\n }\n if (inMath) {\n current.push(line)\n if (trimmed.endsWith('$$')) {\n inMath = false\n }\n continue\n }\n if (trimmed === '$$') {\n flush()\n inMath = true\n current.push(line)\n continue\n }\n if (trimmed.startsWith('$$')) {\n flush()\n current.push(line)\n if (!trimmed.endsWith('$$') || trimmed.length <= 4) {\n inMath = true\n }\n continue\n }\n if (trimmed === '') {\n flush()\n continue\n }\n current.push(line)\n }\n flush()\n return blocks\n}\n","import * as React from 'react'\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport {\n ChevronDown,\n ChevronRight,\n ChevronUp,\n Minus,\n Plus,\n} from 'lucide-react'\n\nimport { cn } from '../../lib/utils'\nimport { MarkdownSurface } from '../chat-markdown'\nimport { computeUnitDiff, type DiffRow } from '../text-diff-view/lineDiff'\n\nimport { splitMarkdownBlocks } from './blockSplit'\n\nexport interface MarkdownDiffViewLabels {\n original?: string\n suggested?: string\n /** Fold summary for a run of hidden unchanged blocks. */\n unchangedBlocks?: (count: number) => string\n showLess?: string\n prevChange?: string\n nextChange?: string\n changePosition?: (index: number, total: number) => string\n noChanges?: string\n}\n\nconst DEFAULT_LABELS: Required<MarkdownDiffViewLabels> = {\n original: 'Original',\n suggested: 'Suggested',\n unchangedBlocks: (count) =>\n count === 1 ? '1 unchanged block' : `${count} unchanged blocks`,\n showLess: 'Show less',\n prevChange: 'Previous change',\n nextChange: 'Next change',\n changePosition: (index, total) => `${index}/${total}`,\n noChanges: 'No changes',\n}\n\nexport interface MarkdownDiffViewProps {\n original: string\n suggested: string\n /** Unchanged blocks kept visible around each change; the rest fold. Default 1. */\n contextBlocks?: number\n showHeader?: boolean\n showNav?: boolean\n labels?: Partial<MarkdownDiffViewLabels>\n /** Applied to the outer box. */\n className?: string\n /** Applied to the scrolling body — size the view here (e.g. `max-h-80`). */\n bodyClassName?: string\n}\n\nfunction isChangedRow(row: DiffRow): boolean {\n return (\n row.kind === 'pair' &&\n (row.left?.kind === 'del' || row.right?.kind === 'add')\n )\n}\n\ninterface FlatRow {\n key: string\n row: DiffRow\n foldOf?: number\n collapseOf?: number\n}\n\nfunction BlockSurface({ value }: { value: string }) {\n return <MarkdownSurface value={value} className=\"min-w-0 [&>*:first-child]:mt-0 [&>*:last-child]:mb-0\" />\n}\n\nexport const MarkdownDiffView = React.forwardRef<\n HTMLDivElement,\n MarkdownDiffViewProps\n>(function MarkdownDiffView(\n {\n original,\n suggested,\n contextBlocks = 1,\n showHeader = true,\n showNav = true,\n labels,\n className,\n bodyClassName,\n },\n ref,\n) {\n const mergedLabels = { ...DEFAULT_LABELS, ...labels }\n const [expanded, setExpanded] = useState<Set<number>>(new Set())\n const [activeGroup, setActiveGroup] = useState(0)\n const scrollRef = React.useRef<HTMLDivElement | null>(null)\n const rowRefs = useRef(new Map<number, HTMLDivElement>())\n\n const diff = useMemo(\n () =>\n computeUnitDiff(splitMarkdownBlocks(original), splitMarkdownBlocks(suggested), {\n contextUnits: contextBlocks,\n }),\n [original, suggested, contextBlocks],\n )\n\n const flatRows = useMemo<FlatRow[]>(() => {\n const out: FlatRow[] = []\n diff.rows.forEach((row, index) => {\n if (row.kind === 'fold' && expanded.has(index)) {\n row.hidden.forEach((hiddenRow, hiddenIndex) => {\n out.push({ key: `${index}.${hiddenIndex}`, row: hiddenRow })\n })\n out.push({ key: `${index}.collapse`, row, collapseOf: index })\n } else {\n out.push({\n key: String(index),\n row,\n foldOf: row.kind === 'fold' ? index : undefined,\n })\n }\n })\n return out\n }, [diff.rows, expanded])\n\n const changeGroups = useMemo<number[]>(() => {\n const groups: number[] = []\n let inGroup = false\n flatRows.forEach((entry, index) => {\n const changed = isChangedRow(entry.row)\n if (changed && !inGroup) {\n groups.push(index)\n }\n inGroup = changed\n })\n return groups\n }, [flatRows])\n\n useEffect(() => {\n setExpanded(new Set())\n setActiveGroup(0)\n }, [original, suggested])\n\n useEffect(() => {\n if (activeGroup >= changeGroups.length) {\n setActiveGroup(0)\n }\n }, [activeGroup, changeGroups.length])\n\n useEffect(() => {\n const target = changeGroups[activeGroup]\n if (target === undefined) {\n return\n }\n const element = rowRefs.current.get(target)\n if (element && typeof element.scrollIntoView === 'function') {\n element.scrollIntoView({ block: 'center' })\n }\n }, [activeGroup, changeGroups])\n\n if (diff.added === 0 && diff.removed === 0) {\n return (\n <div\n ref={ref}\n data-as=\"markdown-diff-view\"\n className={cn(\n 'text-[var(--as-muted-fg)] border-[var(--as-border)] bg-[var(--as-subtle)] rounded-md border p-3 text-xs',\n className,\n )}\n >\n {mergedLabels.noChanges}\n </div>\n )\n }\n\n const activeGroupStart = changeGroups[activeGroup]\n const activeGroupEnd =\n activeGroupStart === undefined\n ? undefined\n : (() => {\n for (\n let index = activeGroupStart + 1;\n index < flatRows.length;\n index += 1\n ) {\n const entry = flatRows[index]\n if (entry !== undefined && isChangedRow(entry.row)) {\n return index\n }\n }\n return flatRows.length\n })()\n\n const renderRow = (entry: FlatRow, index: number) => {\n const row = entry.row\n if (row.kind === 'fold') {\n if (entry.collapseOf !== undefined) {\n const collapseOf = entry.collapseOf\n return (\n <button\n key={entry.key}\n type=\"button\"\n onClick={() =>\n setExpanded((current) => {\n const next = new Set(current)\n next.delete(collapseOf)\n return next\n })\n }\n className=\"text-[var(--as-muted-fg)] hover:bg-[var(--as-subtle)] hover:text-[var(--as-fg)] flex w-full items-center gap-1 px-3 py-0.5 text-left text-[11px]\"\n >\n <ChevronDown className=\"size-3\" aria-hidden />\n {mergedLabels.showLess}\n </button>\n )\n }\n const foldOf = entry.foldOf\n return (\n <button\n key={entry.key}\n type=\"button\"\n onClick={() => {\n if (foldOf !== undefined) {\n setExpanded((current) => {\n const next = new Set(current)\n next.add(foldOf)\n return next\n })\n }\n }}\n className=\"text-[var(--as-muted-fg)] hover:bg-[var(--as-subtle)] hover:text-[var(--as-fg)] flex w-full items-center gap-1 px-3 py-0.5 text-left text-[11px]\"\n >\n <ChevronRight className=\"size-3\" aria-hidden />\n {mergedLabels.unchangedBlocks(row.count)}\n </button>\n )\n }\n const changed = isChangedRow(row)\n const active =\n activeGroupStart !== undefined &&\n activeGroupEnd !== undefined &&\n index >= activeGroupStart &&\n index < activeGroupEnd\n if (!changed) {\n const text = row.left?.text ?? row.right?.text ?? ''\n return (\n <div\n key={entry.key}\n ref={(node) => {\n if (node) {\n rowRefs.current.set(index, node)\n } else {\n rowRefs.current.delete(index)\n }\n }}\n data-context=\"\"\n className={cn('border-[var(--as-border)] px-3 py-1.5', active && 'bg-[var(--as-primary)]/5')}\n >\n <BlockSurface value={text} />\n </div>\n )\n }\n return (\n <div\n key={entry.key}\n ref={(node) => {\n if (node) {\n rowRefs.current.set(index, node)\n } else {\n rowRefs.current.delete(index)\n }\n }}\n className={cn('grid grid-cols-2', active && 'bg-[var(--as-primary)]/5')}\n data-changed={changed || undefined}\n data-active={active || undefined}\n >\n {(['left', 'right'] as const).map((side) => {\n const cell = row[side]\n const isAdd = cell?.kind === 'add'\n const isDel = cell?.kind === 'del'\n return (\n <div\n key={side}\n data-kind={isAdd ? 'add' : isDel ? 'del' : undefined}\n className={cn(\n 'min-w-0 px-3 py-1.5',\n isAdd && 'bg-[var(--as-success)]/10',\n isDel && 'bg-[var(--as-danger)]/10',\n cell === null && 'bg-[var(--as-subtle)]/50',\n )}\n >\n {cell === null ? null : <BlockSurface value={cell.text} />}\n </div>\n )\n })}\n </div>\n )\n }\n\n return (\n <div\n ref={ref}\n data-as=\"markdown-diff-view\"\n className={cn(\n 'bg-[var(--as-surface)] border-[var(--as-border)] flex flex-col overflow-hidden rounded-md border text-sm leading-relaxed',\n className,\n )}\n >\n {showHeader ? (\n <div className=\"border-[var(--as-border)] text-[var(--as-muted-fg)] grid grid-cols-[1fr_auto_1fr] items-center gap-2 border-b px-3 py-1.5 text-[11px] font-medium tracking-wide uppercase\">\n <span className=\"flex items-center gap-1\">\n <Minus className=\"size-3 text-[var(--as-danger)]\" aria-hidden />\n {mergedLabels.original}\n </span>\n <span className=\"flex items-center gap-2\">\n <span>\n <span className=\"text-[var(--as-success)]\">+{diff.added}</span>{' '}\n <span className=\"text-[var(--as-danger)]\">−{diff.removed}</span>\n </span>\n {showNav && changeGroups.length > 0 ? (\n <span className=\"flex items-center gap-0.5\">\n <button\n type=\"button\"\n aria-label={mergedLabels.prevChange}\n title={mergedLabels.prevChange}\n disabled={activeGroup === 0}\n onClick={() => setActiveGroup((value) => Math.max(0, value - 1))}\n className=\"hover:bg-[var(--as-border)] hover:text-[var(--as-fg)] rounded p-0.5 disabled:opacity-40\"\n >\n <ChevronUp className=\"size-3.5\" aria-hidden />\n </button>\n <span className=\"tabular-nums\">\n {mergedLabels.changePosition(activeGroup + 1, changeGroups.length)}\n </span>\n <button\n type=\"button\"\n aria-label={mergedLabels.nextChange}\n title={mergedLabels.nextChange}\n disabled={activeGroup >= changeGroups.length - 1}\n onClick={() =>\n setActiveGroup((value) => Math.min(changeGroups.length - 1, value + 1))\n }\n className=\"hover:bg-[var(--as-border)] hover:text-[var(--as-fg)] rounded p-0.5 disabled:opacity-40\"\n >\n <ChevronDown className=\"size-3.5\" aria-hidden />\n </button>\n </span>\n ) : null}\n </span>\n <span className=\"flex items-center justify-end gap-1\">\n {mergedLabels.suggested}\n <Plus className=\"size-3 text-[var(--as-success)]\" aria-hidden />\n </span>\n </div>\n ) : null}\n <div ref={scrollRef} className={cn('min-h-0 flex-1 overflow-y-auto', bodyClassName)}>\n {flatRows.map((entry, index) => renderRow(entry, index))}\n </div>\n </div>\n )\n})\n"]}
@@ -0,0 +1,169 @@
1
+ import { Input } from './chunk-GQDW6BBO.js';
2
+ import { ErrorBanner } from './chunk-HNMFDVMD.js';
3
+ import { Button } from './chunk-4WBBF5LH.js';
4
+ import { Badge } from './chunk-AIQJNN5B.js';
5
+ import { cn } from './chunk-RVVXVTH3.js';
6
+ import * as React from 'react';
7
+ import { ShieldAlert, ShieldCheck, LogIn, LogOut, ClipboardList } from 'lucide-react';
8
+ import { jsxs, jsx } from 'react/jsx-runtime';
9
+
10
+ var defaultLabels = {
11
+ title: "Access mode",
12
+ modeOpen: "Open \u2014 no login",
13
+ modeAuthenticated: "Login required",
14
+ modeOpenHint: "This device boots straight in; accounts exist but no one signs in.",
15
+ modeAuthenticatedHint: "Everyone signs in with their own account.",
16
+ enableLogin: "Require login",
17
+ enableLoginNote: (minLength) => `Set the owner password \u2014 at least ${minLength} characters. The owner keeps admin.`,
18
+ disableLogin: "Remove login",
19
+ disableLoginNote: "Everyone with an account loses access until login is enabled again.",
20
+ password: "Password",
21
+ confirmPassword: "Confirm password",
22
+ passwordMismatch: "The passwords do not match.",
23
+ passwordTooShort: (minLength) => `Use at least ${minLength} characters.`,
24
+ submitEnable: "Enable login",
25
+ submitDisable: "Disable login",
26
+ confirmAck: "I understand this instance will be open to anyone with access to it.",
27
+ blockedServer: "Server instances always require login.",
28
+ blockedUsers: (count) => `Other accounts exist (${count}) \u2014 remove them before login can be removed.`,
29
+ auditNote: "This change is recorded in the audit log.",
30
+ errorGeneric: "Something went wrong \u2014 try again.",
31
+ errorForbidden: "Not allowed."
32
+ };
33
+ function describeInstanceModeError(error, labels) {
34
+ const record = typeof error === "object" && error !== null ? error : {};
35
+ const detail = typeof record.detail === "string" ? record.detail : "";
36
+ const message = typeof record.message === "string" ? record.message : "";
37
+ const text = detail || message;
38
+ if (record.status === 403) return text || labels.errorForbidden;
39
+ return text || labels.errorGeneric;
40
+ }
41
+ var panelClass = "space-y-3 rounded-[var(--as-radius)] border border-[var(--as-border)] bg-[var(--as-secondary)] p-3";
42
+ var noteClass = "flex items-start gap-1.5 text-xs text-[var(--as-muted-fg)]";
43
+ var InstanceModeControl = React.forwardRef(function InstanceModeControl2({
44
+ mode,
45
+ serverIdentity = false,
46
+ otherUserCount = 0,
47
+ minPasswordLength = 10,
48
+ onSetAuthenticated,
49
+ onSetOpen,
50
+ loading = false,
51
+ error = null,
52
+ labels,
53
+ icons = {},
54
+ className
55
+ }, ref) {
56
+ const merged = { ...defaultLabels, ...labels };
57
+ const [password, setPassword] = React.useState("");
58
+ const [confirmPassword, setConfirmPassword] = React.useState("");
59
+ const [acknowledged, setAcknowledged] = React.useState(false);
60
+ const [pending, setPending] = React.useState(false);
61
+ const [actionError, setActionError] = React.useState(null);
62
+ const [touched, setTouched] = React.useState(false);
63
+ const passwordRef = React.useRef(null);
64
+ React.useEffect(() => {
65
+ setPassword("");
66
+ setConfirmPassword("");
67
+ setAcknowledged(false);
68
+ setTouched(false);
69
+ setActionError(null);
70
+ }, [mode]);
71
+ const enable = mode === "open";
72
+ const tooShort = password.length > 0 && password.length < minPasswordLength;
73
+ const mismatch = confirmPassword.length > 0 && password !== confirmPassword;
74
+ const enableValid = password.length >= minPasswordLength && password === confirmPassword;
75
+ const blocked = serverIdentity || otherUserCount > 0;
76
+ const disableValid = !blocked && password.length > 0 && acknowledged;
77
+ const submit = async (event) => {
78
+ event.preventDefault();
79
+ setTouched(true);
80
+ if (enable ? !enableValid : !disableValid) return;
81
+ setPending(true);
82
+ setActionError(null);
83
+ try {
84
+ if (enable) {
85
+ await onSetAuthenticated(password);
86
+ } else {
87
+ await onSetOpen(password);
88
+ }
89
+ setPassword("");
90
+ setConfirmPassword("");
91
+ setAcknowledged(false);
92
+ setTouched(false);
93
+ } catch (cause) {
94
+ setActionError(describeInstanceModeError(cause, merged));
95
+ } finally {
96
+ setPending(false);
97
+ }
98
+ };
99
+ const ModeIcon = enable ? icons.open ?? ShieldAlert : icons.authenticated ?? ShieldCheck;
100
+ const ActionIcon = enable ? icons.enableLogin ?? LogIn : icons.disableLogin ?? LogOut;
101
+ const AuditIcon = icons.audit ?? ClipboardList;
102
+ return /* @__PURE__ */ jsxs("div", { ref, "data-as": "instance-mode-control", className: cn("space-y-3", className), children: [
103
+ error ? /* @__PURE__ */ jsx(ErrorBanner, { message: error }) : null,
104
+ actionError ? /* @__PURE__ */ jsx(ErrorBanner, { message: actionError }) : null,
105
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
106
+ /* @__PURE__ */ jsx(ModeIcon, { className: "size-4 text-[var(--as-muted-fg)]", "aria-hidden": "true" }),
107
+ /* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold text-[var(--as-fg)]", children: merged.title }),
108
+ /* @__PURE__ */ jsx(Badge, { variant: enable ? "warning" : "success", children: enable ? merged.modeOpen : merged.modeAuthenticated })
109
+ ] }),
110
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-[var(--as-muted-fg)]", children: enable ? merged.modeOpenHint : merged.modeAuthenticatedHint }),
111
+ /* @__PURE__ */ jsxs("form", { className: panelClass, onSubmit: submit, noValidate: true, children: [
112
+ /* @__PURE__ */ jsxs("p", { className: "flex items-center gap-1.5 text-sm font-medium text-[var(--as-fg)]", children: [
113
+ /* @__PURE__ */ jsx(ActionIcon, { className: "size-4", "aria-hidden": "true" }),
114
+ enable ? merged.enableLogin : merged.disableLogin
115
+ ] }),
116
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-[var(--as-muted-fg)]", children: enable ? merged.enableLoginNote(minPasswordLength) : merged.disableLoginNote }),
117
+ /* @__PURE__ */ jsx(
118
+ Input,
119
+ {
120
+ ref: passwordRef,
121
+ type: "password",
122
+ autoComplete: "new-password",
123
+ label: merged.password,
124
+ value: password,
125
+ onChange: (event) => setPassword(event.target.value),
126
+ error: touched && tooShort ? merged.passwordTooShort(minPasswordLength) : void 0
127
+ }
128
+ ),
129
+ enable ? /* @__PURE__ */ jsx(
130
+ Input,
131
+ {
132
+ type: "password",
133
+ autoComplete: "new-password",
134
+ label: merged.confirmPassword,
135
+ value: confirmPassword,
136
+ onChange: (event) => setConfirmPassword(event.target.value),
137
+ error: touched && mismatch ? merged.passwordMismatch : void 0
138
+ }
139
+ ) : null,
140
+ !enable && blocked ? /* @__PURE__ */ jsxs("p", { className: "flex items-start gap-1.5 text-xs text-[var(--as-destructive)]", children: [
141
+ /* @__PURE__ */ jsx(ShieldAlert, { className: "mt-0.5 size-3.5", "aria-hidden": "true" }),
142
+ serverIdentity ? merged.blockedServer : merged.blockedUsers(otherUserCount)
143
+ ] }) : null,
144
+ !enable ? /* @__PURE__ */ jsxs("label", { className: "flex items-start gap-2 text-xs text-[var(--as-fg)]", children: [
145
+ /* @__PURE__ */ jsx(
146
+ "input",
147
+ {
148
+ type: "checkbox",
149
+ checked: acknowledged,
150
+ onChange: (event) => setAcknowledged(event.target.checked),
151
+ className: "mt-0.5 size-3.5 accent-[var(--as-primary)]"
152
+ }
153
+ ),
154
+ merged.confirmAck
155
+ ] }) : null,
156
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
157
+ /* @__PURE__ */ jsx(Button, { type: "submit", size: "sm", loading: pending || loading, disabled: enable ? !enableValid : !disableValid, children: enable ? merged.submitEnable : merged.submitDisable }),
158
+ /* @__PURE__ */ jsxs("span", { className: noteClass, children: [
159
+ /* @__PURE__ */ jsx(AuditIcon, { className: "mt-0.5 size-3.5", "aria-hidden": "true" }),
160
+ merged.auditNote
161
+ ] })
162
+ ] })
163
+ ] })
164
+ ] });
165
+ });
166
+
167
+ export { InstanceModeControl, describeInstanceModeError };
168
+ //# sourceMappingURL=chunk-SNHU4PV3.js.map
169
+ //# sourceMappingURL=chunk-SNHU4PV3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/instance-mode-control/InstanceModeControl.tsx"],"names":["InstanceModeControl"],"mappings":"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","file":"chunk-SNHU4PV3.js","sourcesContent":["import * as React from 'react'\nimport { ClipboardList, LogIn, LogOut, ShieldAlert, ShieldCheck } from 'lucide-react'\nimport type { LucideIcon } from 'lucide-react'\n\nimport { cn } from '../../lib/utils'\nimport { Badge } from '../badge/Badge'\nimport { Button } from '../button/Button'\nimport { ErrorBanner } from '../error-banner/ErrorBanner'\nimport { Input } from '../input/Input'\n\nexport type InstanceAuthMode = 'open' | 'authenticated'\n\nexport interface InstanceModeControlLabels {\n title: string\n modeOpen: string\n modeAuthenticated: string\n modeOpenHint: string\n modeAuthenticatedHint: string\n enableLogin: string\n enableLoginNote: (minLength: number) => string\n disableLogin: string\n disableLoginNote: string\n password: string\n confirmPassword: string\n passwordMismatch: string\n passwordTooShort: (minLength: number) => string\n submitEnable: string\n submitDisable: string\n confirmAck: string\n blockedServer: string\n blockedUsers: (count: number) => string\n auditNote: string\n errorGeneric: string\n errorForbidden: string\n}\n\nexport interface InstanceModeControlIcons {\n open?: LucideIcon\n authenticated?: LucideIcon\n enableLogin?: LucideIcon\n disableLogin?: LucideIcon\n audit?: LucideIcon\n}\n\nexport interface InstanceModeControlProps {\n mode: InstanceAuthMode\n serverIdentity?: boolean\n otherUserCount?: number\n minPasswordLength?: number\n onSetAuthenticated: (password: string) => void | Promise<unknown>\n onSetOpen: (password: string) => void | Promise<unknown>\n loading?: boolean\n error?: string | null\n labels?: Partial<InstanceModeControlLabels>\n icons?: InstanceModeControlIcons\n className?: string\n}\n\nconst defaultLabels: InstanceModeControlLabels = {\n title: 'Access mode',\n modeOpen: 'Open — no login',\n modeAuthenticated: 'Login required',\n modeOpenHint: 'This device boots straight in; accounts exist but no one signs in.',\n modeAuthenticatedHint: 'Everyone signs in with their own account.',\n enableLogin: 'Require login',\n enableLoginNote: (minLength) =>\n `Set the owner password — at least ${minLength} characters. The owner keeps admin.`,\n disableLogin: 'Remove login',\n disableLoginNote: 'Everyone with an account loses access until login is enabled again.',\n password: 'Password',\n confirmPassword: 'Confirm password',\n passwordMismatch: 'The passwords do not match.',\n passwordTooShort: (minLength) => `Use at least ${minLength} characters.`,\n submitEnable: 'Enable login',\n submitDisable: 'Disable login',\n confirmAck: 'I understand this instance will be open to anyone with access to it.',\n blockedServer: 'Server instances always require login.',\n blockedUsers: (count) =>\n `Other accounts exist (${count}) — remove them before login can be removed.`,\n auditNote: 'This change is recorded in the audit log.',\n errorGeneric: 'Something went wrong — try again.',\n errorForbidden: 'Not allowed.',\n}\n\nexport function describeInstanceModeError(\n error: unknown,\n labels: Pick<InstanceModeControlLabels, 'errorGeneric' | 'errorForbidden'>,\n): string {\n const record = (typeof error === 'object' && error !== null ? error : {}) as {\n status?: unknown\n detail?: unknown\n message?: unknown\n }\n const detail = typeof record.detail === 'string' ? record.detail : ''\n const message = typeof record.message === 'string' ? record.message : ''\n const text = detail || message\n if (record.status === 403) return text || labels.errorForbidden\n return text || labels.errorGeneric\n}\n\nconst panelClass =\n 'space-y-3 rounded-[var(--as-radius)] border border-[var(--as-border)] bg-[var(--as-secondary)] p-3'\nconst noteClass = 'flex items-start gap-1.5 text-xs text-[var(--as-muted-fg)]'\n\n/**\n * Presentational + controlled instance access-mode panel (identity-auth\n * §4.5, ADR-06): shows the current mode and offers the two admin\n * transitions — `open → authenticated` (the owner sets credentials in\n * the same call) and `authenticated → open` (current password plus an\n * explicit acknowledgement). Blocked states (server entrypoint, other\n * accounts existing) disable the transition with a label-driven reason.\n * Data flows in through `mode`; the transitions are events out — the app\n * persists them and re-supplies the mode. Rejections surface as\n * label-driven messages and every change carries an audit note.\n */\nexport const InstanceModeControl = React.forwardRef<\n HTMLDivElement,\n InstanceModeControlProps\n>(function InstanceModeControl(\n {\n mode,\n serverIdentity = false,\n otherUserCount = 0,\n minPasswordLength = 10,\n onSetAuthenticated,\n onSetOpen,\n loading = false,\n error = null,\n labels,\n icons = {},\n className,\n },\n ref,\n) {\n const merged = { ...defaultLabels, ...labels }\n const [password, setPassword] = React.useState('')\n const [confirmPassword, setConfirmPassword] = React.useState('')\n const [acknowledged, setAcknowledged] = React.useState(false)\n const [pending, setPending] = React.useState(false)\n const [actionError, setActionError] = React.useState<string | null>(null)\n const [touched, setTouched] = React.useState(false)\n const passwordRef = React.useRef<HTMLInputElement>(null)\n\n React.useEffect(() => {\n setPassword('')\n setConfirmPassword('')\n setAcknowledged(false)\n setTouched(false)\n setActionError(null)\n }, [mode])\n\n const enable = mode === 'open'\n const tooShort = password.length > 0 && password.length < minPasswordLength\n const mismatch = confirmPassword.length > 0 && password !== confirmPassword\n const enableValid = password.length >= minPasswordLength && password === confirmPassword\n const blocked = serverIdentity || otherUserCount > 0\n const disableValid = !blocked && password.length > 0 && acknowledged\n\n const submit = async (event: React.FormEvent) => {\n event.preventDefault()\n setTouched(true)\n if (enable ? !enableValid : !disableValid) return\n setPending(true)\n setActionError(null)\n try {\n if (enable) {\n await onSetAuthenticated(password)\n } else {\n await onSetOpen(password)\n }\n setPassword('')\n setConfirmPassword('')\n setAcknowledged(false)\n setTouched(false)\n } catch (cause) {\n setActionError(describeInstanceModeError(cause, merged))\n } finally {\n setPending(false)\n }\n }\n\n const ModeIcon = enable\n ? (icons.open ?? ShieldAlert)\n : (icons.authenticated ?? ShieldCheck)\n const ActionIcon = enable ? (icons.enableLogin ?? LogIn) : (icons.disableLogin ?? LogOut)\n const AuditIcon = icons.audit ?? ClipboardList\n\n return (\n <div ref={ref} data-as=\"instance-mode-control\" className={cn('space-y-3', className)}>\n {error ? <ErrorBanner message={error} /> : null}\n {actionError ? <ErrorBanner message={actionError} /> : null}\n <div className=\"flex items-center gap-2\">\n <ModeIcon className=\"size-4 text-[var(--as-muted-fg)]\" aria-hidden=\"true\" />\n <h3 className=\"text-sm font-semibold text-[var(--as-fg)]\">{merged.title}</h3>\n <Badge variant={enable ? 'warning' : 'success'}>\n {enable ? merged.modeOpen : merged.modeAuthenticated}\n </Badge>\n </div>\n <p className=\"text-xs text-[var(--as-muted-fg)]\">\n {enable ? merged.modeOpenHint : merged.modeAuthenticatedHint}\n </p>\n <form className={panelClass} onSubmit={submit} noValidate>\n <p className=\"flex items-center gap-1.5 text-sm font-medium text-[var(--as-fg)]\">\n <ActionIcon className=\"size-4\" aria-hidden=\"true\" />\n {enable ? merged.enableLogin : merged.disableLogin}\n </p>\n <p className=\"text-xs text-[var(--as-muted-fg)]\">\n {enable ? merged.enableLoginNote(minPasswordLength) : merged.disableLoginNote}\n </p>\n <Input\n ref={passwordRef}\n type=\"password\"\n autoComplete=\"new-password\"\n label={merged.password}\n value={password}\n onChange={(event) => setPassword(event.target.value)}\n error={\n touched && tooShort ? merged.passwordTooShort(minPasswordLength) : undefined\n }\n />\n {enable ? (\n <Input\n type=\"password\"\n autoComplete=\"new-password\"\n label={merged.confirmPassword}\n value={confirmPassword}\n onChange={(event) => setConfirmPassword(event.target.value)}\n error={touched && mismatch ? merged.passwordMismatch : undefined}\n />\n ) : null}\n {!enable && blocked ? (\n <p className=\"flex items-start gap-1.5 text-xs text-[var(--as-destructive)]\">\n <ShieldAlert className=\"mt-0.5 size-3.5\" aria-hidden=\"true\" />\n {serverIdentity\n ? merged.blockedServer\n : merged.blockedUsers(otherUserCount)}\n </p>\n ) : null}\n {!enable ? (\n <label className=\"flex items-start gap-2 text-xs text-[var(--as-fg)]\">\n <input\n type=\"checkbox\"\n checked={acknowledged}\n onChange={(event) => setAcknowledged(event.target.checked)}\n className=\"mt-0.5 size-3.5 accent-[var(--as-primary)]\"\n />\n {merged.confirmAck}\n </label>\n ) : null}\n <div className=\"flex items-center gap-2\">\n <Button type=\"submit\" size=\"sm\" loading={pending || loading} disabled={enable ? !enableValid : !disableValid}>\n {enable ? merged.submitEnable : merged.submitDisable}\n </Button>\n <span className={noteClass}>\n <AuditIcon className=\"mt-0.5 size-3.5\" aria-hidden=\"true\" />\n {merged.auditNote}\n </span>\n </div>\n </form>\n </div>\n )\n})\n"]}
@@ -130,6 +130,7 @@ var ComboboxPanel = React.forwardRef(
130
130
  onOpenChange,
131
131
  searchPlaceholder,
132
132
  searchLabel = "Search options",
133
+ panelLabel,
133
134
  emptyLabel,
134
135
  loading,
135
136
  loadingLabel,
@@ -180,6 +181,7 @@ var ComboboxPanel = React.forwardRef(
180
181
  ref,
181
182
  align: "start",
182
183
  collisionPadding: 8,
184
+ "aria-label": panelLabel,
183
185
  onOpenAutoFocus: (event) => {
184
186
  event.preventDefault();
185
187
  const panel = event.currentTarget;
@@ -360,6 +362,7 @@ var Combobox = React.forwardRef(function Combobox2({
360
362
  onOpenChange: handleOpenChange,
361
363
  searchPlaceholder,
362
364
  searchLabel,
365
+ panelLabel: typeof label === "string" ? label : placeholder || "Options",
363
366
  emptyLabel,
364
367
  loading,
365
368
  loadingLabel,
@@ -474,6 +477,7 @@ var ComboboxMulti = React.forwardRef(
474
477
  onOpenChange: handleOpenChange,
475
478
  searchPlaceholder,
476
479
  searchLabel,
480
+ panelLabel: typeof label === "string" ? label : placeholder || "Options",
477
481
  emptyLabel,
478
482
  loading,
479
483
  loadingLabel,
@@ -488,5 +492,5 @@ var ComboboxMulti = React.forwardRef(
488
492
  );
489
493
 
490
494
  export { Combobox, ComboboxMulti };
491
- //# sourceMappingURL=chunk-URLF67WR.js.map
492
- //# sourceMappingURL=chunk-URLF67WR.js.map
495
+ //# sourceMappingURL=chunk-SVRCZUNQ.js.map
496
+ //# sourceMappingURL=chunk-SVRCZUNQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/combobox/Combobox.tsx"],"names":["ComboboxPanel","Combobox","ComboboxMulti"],"mappings":"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","file":"chunk-SVRCZUNQ.js","sourcesContent":["import * as React from 'react'\nimport * as PopoverPrimitive from '@radix-ui/react-popover'\nimport { Check, ChevronDown, Search, X } from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport { searchScore } from '../../lib/fuzzy'\nimport { Spinner } from '../spinner/Spinner'\n\nexport interface ComboboxOption {\n value: string\n label: string\n description?: string\n group?: string\n badge?: string\n disabled?: boolean\n}\n\nfunction defaultFilter(options: ComboboxOption[], term: string): ComboboxOption[] {\n const needle = term.trim()\n if (!needle) {\n return options\n }\n const scored = options.flatMap((option) => {\n let best: number | null = null\n for (const target of [option.label, option.value, option.description ?? '']) {\n const score = searchScore(needle, target)\n if (score !== null && (best === null || score > best)) {\n best = score\n }\n }\n return best === null ? [] : [{ option, score: best as number }]\n })\n scored.sort(\n (a, b) => b.score - a.score || a.option.label.localeCompare(b.option.label),\n )\n return scored.map((entry) => entry.option)\n}\n\n/** The option appended when `allowCreate` is on and the search term does\n * not exactly match an existing option. `value` is the raw trimmed term. */\nfunction createOption(\n options: ComboboxOption[],\n term: string,\n createLabel?: (term: string) => string,\n): ComboboxOption | null {\n const trimmed = term.trim()\n if (!trimmed) return null\n const needle = trimmed.toLowerCase()\n const exists = options.some(\n (option) =>\n option.value.toLowerCase() === needle ||\n option.label.toLowerCase() === needle,\n )\n if (exists) return null\n return {\n value: trimmed,\n label: createLabel ? createLabel(trimmed) : `Add \"${trimmed}\"`,\n }\n}\n\ninterface ComboboxListProps {\n id: string\n options: ComboboxOption[]\n activeIndex: number\n onActiveIndexChange: (index: number) => void\n selected: (value: string) => boolean\n onPick: (option: ComboboxOption) => void\n emptyLabel?: string\n loading?: boolean\n loadingLabel?: string\n listClassName?: string\n}\n\nfunction ComboboxList({\n id,\n options,\n activeIndex,\n onActiveIndexChange,\n selected,\n onPick,\n emptyLabel = 'No matches',\n loading = false,\n loadingLabel = 'Loading…',\n listClassName,\n}: ComboboxListProps) {\n const rows: React.ReactNode[] = []\n let currentGroup: string | undefined\n options.forEach((option, index) => {\n if (option.group !== undefined && option.group !== currentGroup) {\n currentGroup = option.group\n rows.push(\n <div\n key={`group-${option.group}-${index}`}\n role=\"presentation\"\n className=\"px-2 pb-0.5 pt-2 text-xs font-medium tracking-wide text-[var(--as-muted-fg)] uppercase\"\n >\n {option.group}\n </div>,\n )\n }\n const isSelected = selected(option.value)\n const isActive = index === activeIndex\n rows.push(\n <div\n key={`${option.value}-${index}`}\n id={`${id}-opt-${index}`}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={option.disabled || undefined}\n data-state={isSelected ? 'checked' : 'unchecked'}\n data-active={isActive || undefined}\n tabIndex={-1}\n className={cn(\n 'flex cursor-pointer items-center justify-between gap-2 rounded-[calc(var(--as-radius-sm)-2px)] px-2 py-1.5 text-sm text-[var(--as-fg)] outline-none',\n isActive && 'bg-[var(--as-secondary)]',\n option.disabled && 'pointer-events-none opacity-50',\n )}\n onMouseMove={() => onActiveIndexChange(index)}\n onClick={() => !option.disabled && onPick(option)}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-2 text-left\">\n <span className=\"flex min-w-0 flex-col\">\n <span className=\"truncate\">{option.label}</span>\n {option.description ? (\n <span className=\"truncate text-xs text-[var(--as-muted-fg)]\">\n {option.description}\n </span>\n ) : null}\n </span>\n {option.badge ? (\n <span className=\"shrink-0 rounded-full bg-[var(--as-secondary)] px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-wide text-[var(--as-secondary-fg)]\">\n {option.badge}\n </span>\n ) : null}\n </span>\n {isSelected ? (\n <Check className=\"size-4 shrink-0 text-[var(--as-primary)]\" aria-hidden />\n ) : null}\n </div>,\n )\n })\n return (\n <div\n id={id}\n role=\"listbox\"\n className={cn('max-h-60 overflow-y-auto p-1', listClassName)}\n >\n {loading ? (\n <div className=\"flex items-center gap-2 px-2 py-3 text-sm text-[var(--as-muted-fg)]\">\n <Spinner />\n {loadingLabel}\n </div>\n ) : options.length === 0 ? (\n <div className=\"px-2 py-3 text-center text-sm text-[var(--as-muted-fg)]\">\n {emptyLabel}\n </div>\n ) : (\n rows\n )}\n </div>\n )\n}\n\ninterface ComboboxPanelProps {\n listId: string\n options: ComboboxOption[]\n activeIndex: number\n setActiveIndex: (index: number) => void\n selected: (value: string) => boolean\n onPick: (option: ComboboxOption) => void\n search: string\n setSearch: (term: string) => void\n onOpenChange: (open: boolean) => void\n searchPlaceholder: string\n searchLabel?: string\n panelLabel: string\n emptyLabel?: string\n loading?: boolean\n loadingLabel?: string\n multi?: boolean\n panelClassName?: string\n}\n\nconst ComboboxPanel = React.forwardRef<HTMLDivElement, ComboboxPanelProps>(\n function ComboboxPanel(props, ref) {\n const {\n listId,\n options,\n activeIndex,\n setActiveIndex,\n selected,\n onPick,\n search,\n setSearch,\n onOpenChange,\n searchPlaceholder,\n searchLabel = 'Search options',\n panelLabel,\n emptyLabel,\n loading,\n loadingLabel,\n multi,\n panelClassName,\n } = props\n\n const nextEnabled = React.useCallback(\n (from: number, delta: 1 | -1) => {\n for (let step = 1; step <= options.length; step++) {\n const index =\n delta === 1\n ? (from + step) % Math.max(options.length, 1)\n : (from - step + options.length * 2) % Math.max(options.length, 1)\n if (index < options.length && !options[index]?.disabled) {\n return index\n }\n }\n return from\n },\n [options],\n )\n\n const onKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'ArrowDown') {\n event.preventDefault()\n setActiveIndex(nextEnabled(activeIndex, 1))\n } else if (event.key === 'ArrowUp') {\n event.preventDefault()\n setActiveIndex(nextEnabled(activeIndex, -1))\n } else if (event.key === 'Home') {\n event.preventDefault()\n setActiveIndex(options.findIndex((option) => !option.disabled))\n } else if (event.key === 'End') {\n event.preventDefault()\n const last = [...options].reverse().find((option) => !option.disabled)\n if (last) {\n setActiveIndex(options.lastIndexOf(last))\n }\n } else if (event.key === 'Enter') {\n event.preventDefault()\n const option = options[activeIndex]\n if (option && !option.disabled) {\n onPick(option)\n }\n } else if (event.key === 'Tab') {\n onOpenChange(false)\n }\n }\n\n return (\n <PopoverPrimitive.Content\n ref={ref}\n align=\"start\"\n collisionPadding={8}\n aria-label={panelLabel}\n onOpenAutoFocus={(event) => {\n event.preventDefault()\n const panel = event.currentTarget as HTMLElement | null\n const input = panel?.querySelector('input')\n if (input instanceof HTMLInputElement) {\n input.focus()\n }\n }}\n className={cn(\n 'as-anim-pop pointer-events-auto z-[var(--as-z-popover)] w-[var(--radix-popover-trigger-width)] min-w-48 overflow-hidden rounded-[var(--as-radius-lg)] border border-[var(--as-border)] bg-[var(--as-surface-raised)] text-[var(--as-fg)] shadow-[var(--as-shadow-3)]',\n panelClassName,\n )}\n data-as=\"combobox-panel\"\n >\n <div className=\"flex items-center gap-2 border-b border-[var(--as-border)] p-2\">\n <Search className=\"size-4 shrink-0 text-[var(--as-muted-fg)]\" aria-hidden />\n <input\n type=\"text\"\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={listId}\n aria-activedescendant={activeIndex >= 0 ? `${listId}-opt-${activeIndex}` : undefined}\n aria-label={searchLabel}\n placeholder={searchPlaceholder}\n className=\"h-7 w-full bg-transparent text-sm outline-none placeholder:text-[var(--as-muted-fg)]\"\n value={search}\n onChange={(event) => {\n setSearch(event.target.value)\n setActiveIndex(options.findIndex((option) => !option.disabled))\n }}\n onKeyDown={onKeyDown}\n />\n </div>\n <ComboboxList\n id={listId}\n options={options}\n activeIndex={activeIndex}\n onActiveIndexChange={setActiveIndex}\n selected={selected}\n onPick={onPick}\n emptyLabel={emptyLabel}\n loading={loading}\n loadingLabel={loadingLabel}\n />\n {multi ? (\n <div className=\"sr-only\" role=\"status\">\n {options.length} options\n </div>\n ) : null}\n </PopoverPrimitive.Content>\n )\n})\n\nexport interface ComboboxProps {\n options: ComboboxOption[]\n value?: string\n onChange: (value: string) => void\n placeholder?: string\n searchPlaceholder?: string\n searchLabel?: string\n emptyLabel?: string\n loadingLabel?: string\n loading?: boolean\n disabled?: boolean\n clearable?: boolean\n clearLabel?: string\n /** Offer an \"Add …\" row for search terms that match no option. */\n allowCreate?: boolean\n /** Custom label for the create row; receives the trimmed term. */\n createLabel?: (term: string) => string\n onSearchChange?: (term: string) => void\n onOpenChange?: (open: boolean) => void\n label?: string\n /** Keep the accessible name from `label` but do not render it visibly. */\n hideLabel?: boolean\n error?: string\n id?: string\n className?: string\n panelClassName?: string\n}\n\nexport const Combobox = React.forwardRef<HTMLButtonElement, ComboboxProps>(function Combobox(\n {\n options,\n value,\n onChange,\n placeholder = 'Select an option…',\n searchPlaceholder = 'Search…',\n searchLabel,\n emptyLabel,\n loadingLabel,\n loading = false,\n disabled = false,\n clearable = false,\n clearLabel = 'Clear',\n allowCreate = false,\n createLabel,\n onSearchChange,\n onOpenChange,\n label,\n hideLabel = false,\n error,\n id: idProp,\n className,\n panelClassName,\n },\n ref,\n) {\n const autoId = React.useId()\n const id = idProp ?? (label || error ? autoId : undefined)\n const listId = `${autoId}-list`\n const [open, setOpen] = React.useState(false)\n const [search, setSearch] = React.useState('')\n const [activeIndex, setActiveIndex] = React.useState(-1)\n\n const filtered = onSearchChange ? options : defaultFilter(options, search)\n const created = allowCreate ? createOption(options, search, createLabel) : null\n const panelOptions = created ? [...filtered, created] : filtered\n const selectedOption = options.find((option) => option.value === value)\n\n const handleOpenChange = (next: boolean) => {\n setOpen(next)\n onOpenChange?.(next)\n if (next) {\n setActiveIndex(options.findIndex((option) => !option.disabled))\n } else {\n setSearch('')\n setActiveIndex(-1)\n }\n }\n\n return (\n <div className={cn('flex w-full flex-col gap-1.5', className)}>\n {label && !hideLabel ? (\n <label htmlFor={id} className=\"text-sm font-medium leading-none text-[var(--as-fg)]\">\n {label}\n </label>\n ) : null}\n <PopoverPrimitive.Root modal open={open} onOpenChange={handleOpenChange}>\n <span className=\"relative inline-flex w-full\">\n <PopoverPrimitive.Trigger asChild>\n <button\n ref={ref}\n type=\"button\"\n id={id}\n data-as=\"combobox\"\n role=\"combobox\"\n aria-label={typeof label === 'string' ? label : placeholder}\n aria-haspopup=\"listbox\"\n aria-controls={open ? listId : undefined}\n aria-invalid={error ? true : undefined}\n disabled={disabled}\n onKeyDown={(event) => {\n if (!open && (event.key === 'ArrowDown' || event.key === 'ArrowUp')) {\n event.preventDefault()\n handleOpenChange(true)\n }\n }}\n className={cn(\n 'flex h-9 w-full cursor-pointer items-center justify-between gap-2 rounded-[var(--as-radius)] border border-[var(--as-border)] bg-[var(--as-surface)] px-3 py-2 text-sm text-[var(--as-fg)] transition-colors hover:border-[var(--as-fg)]/30 focus-visible:border-[var(--as-focus-ring)] focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)] disabled:cursor-not-allowed disabled:opacity-50',\n error && 'border-[var(--as-danger)]',\n clearable && selectedOption && 'pr-14',\n )}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-2 text-left\">\n {selectedOption ? (\n <span className=\"truncate font-medium\">{selectedOption.label}</span>\n ) : (\n <span className=\"text-[var(--as-muted-fg)]\">{placeholder}</span>\n )}\n </span>\n <ChevronDown\n aria-hidden\n className={cn(\n 'size-4 shrink-0 text-[var(--as-muted-fg)] transition-transform',\n open && 'rotate-180',\n )}\n />\n </button>\n </PopoverPrimitive.Trigger>\n {clearable && selectedOption ? (\n <button\n type=\"button\"\n aria-label={clearLabel}\n className=\"absolute right-7 top-1/2 [translate:0_-50%] cursor-pointer rounded-[var(--as-radius-sm)] p-0.5 text-[var(--as-muted-fg)] hover:text-[var(--as-fg)] focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]\"\n onClick={(event) => {\n event.stopPropagation()\n onChange('')\n }}\n >\n <X className=\"size-4\" aria-hidden />\n </button>\n ) : null}\n </span>\n <PopoverPrimitive.Portal>\n {open ? (\n <ComboboxPanel\n listId={listId}\n options={panelOptions}\n activeIndex={activeIndex}\n setActiveIndex={setActiveIndex}\n selected={(optionValue) => optionValue === value}\n onPick={(option) => {\n onChange(option.value)\n handleOpenChange(false)\n }}\n search={search}\n setSearch={(term) => {\n setSearch(term)\n onSearchChange?.(term)\n }}\n onOpenChange={handleOpenChange}\n searchPlaceholder={searchPlaceholder}\n searchLabel={searchLabel}\n panelLabel={typeof label === 'string' ? label : placeholder || 'Options'}\n emptyLabel={emptyLabel}\n loading={loading}\n loadingLabel={loadingLabel}\n panelClassName={panelClassName}\n />\n ) : null}\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n {error ? (\n <p role=\"alert\" className=\"text-xs font-medium text-[var(--as-danger)]\">\n {error}\n </p>\n ) : null}\n </div>\n )\n})\n\nexport interface ComboboxMultiProps {\n options: ComboboxOption[]\n value: string[]\n onChange: (value: string[]) => void\n placeholder?: string\n searchPlaceholder?: string\n searchLabel?: string\n emptyLabel?: string\n loadingLabel?: string\n loading?: boolean\n disabled?: boolean\n maxTriggerLabels?: number\n /** Offer an \"Add …\" row for search terms that match no option. */\n allowCreate?: boolean\n /** Custom label for the create row; receives the trimmed term. */\n createLabel?: (term: string) => string\n onSearchChange?: (term: string) => void\n onOpenChange?: (open: boolean) => void\n label?: string\n error?: string\n id?: string\n className?: string\n panelClassName?: string\n}\n\nexport const ComboboxMulti = React.forwardRef<HTMLButtonElement, ComboboxMultiProps>(\n function ComboboxMulti(\n {\n options,\n value,\n onChange,\n placeholder = 'Select options…',\n searchPlaceholder = 'Search…',\n searchLabel,\n emptyLabel,\n loadingLabel,\n loading = false,\n disabled = false,\n maxTriggerLabels = 3,\n allowCreate = false,\n createLabel,\n onSearchChange,\n onOpenChange,\n label,\n error,\n id: idProp,\n className,\n panelClassName,\n },\n ref,\n ) {\n const autoId = React.useId()\n const id = idProp ?? (label || error ? autoId : undefined)\n const listId = `${autoId}-list`\n const [open, setOpen] = React.useState(false)\n const [search, setSearch] = React.useState('')\n const [activeIndex, setActiveIndex] = React.useState(-1)\n\n const filtered = onSearchChange ? options : defaultFilter(options, search)\n const created = allowCreate ? createOption(options, search, createLabel) : null\n const panelOptions = created ? [...filtered, created] : filtered\n const selectedOptions = options.filter((option) => value.includes(option.value))\n const triggerLabel =\n selectedOptions.length === 0\n ? placeholder\n : selectedOptions.length > maxTriggerLabels\n ? `${selectedOptions.length} selected`\n : selectedOptions.map((option) => option.label).join(', ')\n\n const handleOpenChange = (next: boolean) => {\n setOpen(next)\n onOpenChange?.(next)\n if (next) {\n setActiveIndex(options.findIndex((option) => !option.disabled))\n } else {\n setSearch('')\n setActiveIndex(-1)\n }\n }\n\n const toggle = (optionValue: string) => {\n onChange(\n value.includes(optionValue)\n ? value.filter((entry) => entry !== optionValue)\n : [...value, optionValue],\n )\n }\n\n return (\n <div className={cn('flex w-full flex-col gap-1.5', className)}>\n {label ? (\n <label htmlFor={id} className=\"text-sm font-medium leading-none text-[var(--as-fg)]\">\n {label}\n </label>\n ) : null}\n <PopoverPrimitive.Root open={open} onOpenChange={handleOpenChange}>\n <PopoverPrimitive.Trigger asChild>\n <button\n ref={ref}\n type=\"button\"\n id={id}\n data-as=\"combobox-multi\"\n role=\"combobox\"\n aria-label={typeof label === 'string' ? label : placeholder}\n aria-haspopup=\"listbox\"\n aria-controls={open ? listId : undefined}\n aria-invalid={error ? true : undefined}\n disabled={disabled}\n onKeyDown={(event) => {\n if (!open && (event.key === 'ArrowDown' || event.key === 'ArrowUp')) {\n event.preventDefault()\n handleOpenChange(true)\n }\n }}\n className=\"flex h-9 w-full cursor-pointer items-center justify-between gap-2 rounded-[var(--as-radius)] border border-[var(--as-border)] bg-[var(--as-surface)] px-3 py-2 text-sm text-[var(--as-fg)] transition-colors hover:border-[var(--as-fg)]/30 focus-visible:border-[var(--as-focus-ring)] focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)] disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <span className=\"min-w-0 flex-1 truncate text-left\">\n {selectedOptions.length === 0 ? (\n <span className=\"text-[var(--as-muted-fg)]\">{placeholder}</span>\n ) : (\n triggerLabel\n )}\n </span>\n <ChevronDown\n aria-hidden\n className={cn(\n 'size-4 shrink-0 text-[var(--as-muted-fg)] transition-transform',\n open && 'rotate-180',\n )}\n />\n </button>\n </PopoverPrimitive.Trigger>\n <PopoverPrimitive.Portal>\n {open ? (\n <ComboboxPanel\n listId={listId}\n options={panelOptions}\n activeIndex={activeIndex}\n setActiveIndex={setActiveIndex}\n selected={(optionValue) => value.includes(optionValue)}\n onPick={(option) => toggle(option.value)}\n search={search}\n setSearch={(term) => {\n setSearch(term)\n onSearchChange?.(term)\n }}\n onOpenChange={handleOpenChange}\n searchPlaceholder={searchPlaceholder}\n searchLabel={searchLabel}\n panelLabel={typeof label === 'string' ? label : placeholder || 'Options'}\n emptyLabel={emptyLabel}\n loading={loading}\n loadingLabel={loadingLabel}\n multi\n panelClassName={panelClassName}\n />\n ) : null}\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n {error ? (\n <p role=\"alert\" className=\"text-xs font-medium text-[var(--as-danger)]\">\n {error}\n </p>\n ) : null}\n </div>\n )\n },\n)\n"]}
@@ -1,4 +1,4 @@
1
- import { Combobox } from './chunk-URLF67WR.js';
1
+ import { Combobox } from './chunk-SVRCZUNQ.js';
2
2
  import { Input } from './chunk-GQDW6BBO.js';
3
3
  import { cn } from './chunk-RVVXVTH3.js';
4
4
  import * as React from 'react';
@@ -166,5 +166,5 @@ var ProviderForm = React.forwardRef(
166
166
  );
167
167
 
168
168
  export { CUSTOM_PRESET_KEY, ProviderForm };
169
- //# sourceMappingURL=chunk-BCKOBT7T.js.map
170
- //# sourceMappingURL=chunk-BCKOBT7T.js.map
169
+ //# sourceMappingURL=chunk-UMI4M4MF.js.map
170
+ //# sourceMappingURL=chunk-UMI4M4MF.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/provider-form/ProviderForm.tsx"],"names":["ProviderForm"],"mappings":"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","file":"chunk-BCKOBT7T.js","sourcesContent":["import * as React from 'react'\nimport { Building2, House, KeyRound } from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport { Combobox } from '../combobox/Combobox'\nimport { Input } from '../input/Input'\n\n/** One entry of the app's provider catalog (ADR-006: the catalog lives in\n * the app/backend — the form only renders the picker and reports the key). */\nexport interface ProviderPresetOption {\n key: string\n name: string\n /** Local/on-premise preset — apps may default the hosting toggle from it. */\n local?: boolean\n}\n\n/** Reserved key of the built-in \"custom\" preset entry (never a catalog key). */\nexport const CUSTOM_PRESET_KEY = 'custom'\n\nexport interface ProviderFormProps extends React.ComponentProps<'div'> {\n name: string\n onNameChange: (value: string) => void\n baseUrl: string\n onBaseUrlChange: (value: string) => void\n apiKey: string\n onApiKeyChange: (value: string) => void\n namePlaceholder?: string\n baseUrlPlaceholder?: string\n nameLabel?: string\n baseUrlLabel?: string\n /** Hide the base URL field for provider types that have a fixed endpoint. */\n hideBaseUrl?: boolean\n apiKeyLabel?: string\n /** Optional preset catalog select — render only when `presets` is non-empty. */\n presets?: ProviderPresetOption[]\n presetKey?: string\n onPresetChange?: (key: string) => void\n presetLabel?: string\n customPresetLabel?: string\n /** Optional Local/Cloud toggle — render only when `showLocationKind`. */\n showLocationKind?: boolean\n locationKind?: 'local' | 'cloud'\n onLocationKindChange?: (kind: 'local' | 'cloud') => void\n locationLabel?: string\n localLabel?: string\n cloudLabel?: string\n /** Optional country select — render only when `showCountry`. */\n showCountry?: boolean\n country?: string\n onCountryChange?: (country: string) => void\n countryLabel?: string\n countryOptions?: { value: string; label: string }[]\n countryPlaceholder?: string\n /** Search-input placeholder for the country picker (searchable — the\n * catalog is ~250 entries, ADR-0024). */\n countrySearchPlaceholder?: string\n /** Empty-search result label for the country picker. */\n countryEmptyLabel?: string\n /** Accessible name of the country picker's clear button. */\n countryClearLabel?: string\n /** Hint under the key field; apps mention keyring storage here. */\n apiKeyHelp?: string\n /** The provider already stores a key (write-only field shows no value). */\n hasStoredKey?: boolean\n storedKeyLabel?: string\n keyPlaceholder?: string\n error?: string\n children?: React.ReactNode\n}\n\n/**\n * Standard provider credential fields: name, base URL and a **write-only**\n * masked API key (`onChange` only — the library never renders a stored key;\n * keyring/storage is the app's business, ADR-006).\n */\nexport const ProviderForm = React.forwardRef<HTMLDivElement, ProviderFormProps>(\n function ProviderForm(\n {\n name,\n onNameChange,\n baseUrl,\n onBaseUrlChange,\n apiKey,\n onApiKeyChange,\n namePlaceholder = 'Provider name',\n baseUrlPlaceholder = 'https://api.example.com/v1',\n nameLabel = 'Name',\n baseUrlLabel = 'API base URL',\n hideBaseUrl = false,\n apiKeyLabel = 'API key',\n apiKeyHelp,\n hasStoredKey = false,\n presets,\n presetKey = '',\n onPresetChange,\n presetLabel = 'Provider',\n customPresetLabel = 'Custom…',\n showLocationKind = false,\n locationKind = 'cloud',\n onLocationKindChange,\n locationLabel = 'Hosting',\n localLabel = 'Local / on-premise',\n cloudLabel = 'Cloud',\n showCountry = false,\n country,\n onCountryChange,\n countryLabel = 'Country',\n countryOptions = [],\n countryPlaceholder = 'Select a country…',\n countrySearchPlaceholder = 'Search countries…',\n countryEmptyLabel = 'No matching country',\n countryClearLabel = 'Clear country',\n storedKeyLabel = 'Stored — leave empty to keep',\n keyPlaceholder = 'sk-…',\n error,\n children,\n className,\n ...props\n },\n ref,\n ) {\n return (\n <div\n ref={ref}\n data-as=\"provider-form\"\n className={cn('flex w-full flex-col gap-4', className)}\n {...props}\n >\n {presets && presets.length > 0 && onPresetChange ? (\n <label className=\"block space-y-1 text-sm\">\n <span className=\"text-sm font-medium text-[var(--as-fg)]\">{presetLabel}</span>\n <select\n value={presetKey}\n onChange={(event) => onPresetChange(event.target.value)}\n className=\"w-full rounded-[var(--as-radius)] border border-[var(--as-border)] bg-[var(--as-surface)] px-3 py-2 text-sm text-[var(--as-fg)]\"\n >\n {presets.map((preset) => (\n <option key={preset.key} value={preset.key}>\n {preset.name}\n </option>\n ))}\n <option value={CUSTOM_PRESET_KEY}>{customPresetLabel}</option>\n </select>\n </label>\n ) : null}\n <Input\n label={nameLabel}\n value={name}\n onChange={(event) => onNameChange(event.target.value)}\n placeholder={namePlaceholder}\n />\n {hideBaseUrl ? null : (\n <Input\n label={baseUrlLabel}\n value={baseUrl}\n onChange={(event) => onBaseUrlChange(event.target.value)}\n placeholder={baseUrlPlaceholder}\n className=\"font-mono\"\n />\n )}\n <Input\n label={\n hasStoredKey ? (\n <>\n {apiKeyLabel}{' '}\n <span className=\"font-normal text-[var(--as-muted-fg)]\">\n ({storedKeyLabel})\n </span>\n </>\n ) : (\n apiKeyLabel\n )\n }\n type=\"password\"\n value={apiKey}\n onChange={(event) => onApiKeyChange(event.target.value)}\n placeholder={hasStoredKey ? '•••' : keyPlaceholder}\n autoComplete=\"new-password\"\n hint={\n apiKeyHelp ? (\n <span className=\"inline-flex items-center gap-1\">\n <KeyRound className=\"size-3\" aria-hidden />\n {apiKeyHelp}\n </span>\n ) : undefined\n }\n />\n {showLocationKind && onLocationKindChange ? (\n <div className=\"space-y-1\">\n <span className=\"text-sm font-medium text-[var(--as-fg)]\">{locationLabel}</span>\n <div className=\"flex gap-2\" role=\"group\" aria-label={locationLabel}>\n {(\n [\n { kind: 'local' as const, label: localLabel, Icon: House },\n { kind: 'cloud' as const, label: cloudLabel, Icon: Building2 },\n ]\n ).map(({ kind, label, Icon }) => {\n const on = locationKind === kind\n return (\n <button\n key={kind}\n type=\"button\"\n data-as-location={kind}\n aria-pressed={on}\n onClick={() => onLocationKindChange(kind)}\n className={cn(\n 'flex flex-1 cursor-pointer items-center justify-center gap-1.5 rounded-[var(--as-radius)] border px-3 py-2 text-xs font-semibold transition-all',\n 'focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]',\n on\n ? 'border-[var(--as-primary)]/30 bg-[var(--as-primary)]/10 text-[var(--as-primary)] shadow-[var(--as-shadow-1)]'\n : 'border-[var(--as-border)] bg-[var(--as-surface)] text-[var(--as-muted-fg)] hover:border-[var(--as-muted-fg)]/40',\n )}\n >\n <Icon className=\"size-3.5\" aria-hidden />\n {label}\n </button>\n )\n })}\n </div>\n </div>\n ) : null}\n {showCountry && onCountryChange ? (\n <Combobox\n options={countryOptions}\n value={country ?? ''}\n onChange={onCountryChange}\n label={countryLabel}\n placeholder={countryPlaceholder}\n searchPlaceholder={countrySearchPlaceholder}\n searchLabel={countrySearchPlaceholder}\n emptyLabel={countryEmptyLabel}\n clearable\n clearLabel={countryClearLabel}\n />\n ) : null}\n {children}\n {error ? (\n <p role=\"alert\" className=\"text-sm font-medium text-[var(--as-danger)]\">\n {error}\n </p>\n ) : null}\n </div>\n )\n },\n)\n"]}
1
+ {"version":3,"sources":["../src/components/provider-form/ProviderForm.tsx"],"names":["ProviderForm"],"mappings":"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","file":"chunk-UMI4M4MF.js","sourcesContent":["import * as React from 'react'\nimport { Building2, House, KeyRound } from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport { Combobox } from '../combobox/Combobox'\nimport { Input } from '../input/Input'\n\n/** One entry of the app's provider catalog (ADR-006: the catalog lives in\n * the app/backend — the form only renders the picker and reports the key). */\nexport interface ProviderPresetOption {\n key: string\n name: string\n /** Local/on-premise preset — apps may default the hosting toggle from it. */\n local?: boolean\n}\n\n/** Reserved key of the built-in \"custom\" preset entry (never a catalog key). */\nexport const CUSTOM_PRESET_KEY = 'custom'\n\nexport interface ProviderFormProps extends React.ComponentProps<'div'> {\n name: string\n onNameChange: (value: string) => void\n baseUrl: string\n onBaseUrlChange: (value: string) => void\n apiKey: string\n onApiKeyChange: (value: string) => void\n namePlaceholder?: string\n baseUrlPlaceholder?: string\n nameLabel?: string\n baseUrlLabel?: string\n /** Hide the base URL field for provider types that have a fixed endpoint. */\n hideBaseUrl?: boolean\n apiKeyLabel?: string\n /** Optional preset catalog select — render only when `presets` is non-empty. */\n presets?: ProviderPresetOption[]\n presetKey?: string\n onPresetChange?: (key: string) => void\n presetLabel?: string\n customPresetLabel?: string\n /** Optional Local/Cloud toggle — render only when `showLocationKind`. */\n showLocationKind?: boolean\n locationKind?: 'local' | 'cloud'\n onLocationKindChange?: (kind: 'local' | 'cloud') => void\n locationLabel?: string\n localLabel?: string\n cloudLabel?: string\n /** Optional country select — render only when `showCountry`. */\n showCountry?: boolean\n country?: string\n onCountryChange?: (country: string) => void\n countryLabel?: string\n countryOptions?: { value: string; label: string }[]\n countryPlaceholder?: string\n /** Search-input placeholder for the country picker (searchable — the\n * catalog is ~250 entries, ADR-0024). */\n countrySearchPlaceholder?: string\n /** Empty-search result label for the country picker. */\n countryEmptyLabel?: string\n /** Accessible name of the country picker's clear button. */\n countryClearLabel?: string\n /** Hint under the key field; apps mention keyring storage here. */\n apiKeyHelp?: string\n /** The provider already stores a key (write-only field shows no value). */\n hasStoredKey?: boolean\n storedKeyLabel?: string\n keyPlaceholder?: string\n error?: string\n children?: React.ReactNode\n}\n\n/**\n * Standard provider credential fields: name, base URL and a **write-only**\n * masked API key (`onChange` only — the library never renders a stored key;\n * keyring/storage is the app's business, ADR-006).\n */\nexport const ProviderForm = React.forwardRef<HTMLDivElement, ProviderFormProps>(\n function ProviderForm(\n {\n name,\n onNameChange,\n baseUrl,\n onBaseUrlChange,\n apiKey,\n onApiKeyChange,\n namePlaceholder = 'Provider name',\n baseUrlPlaceholder = 'https://api.example.com/v1',\n nameLabel = 'Name',\n baseUrlLabel = 'API base URL',\n hideBaseUrl = false,\n apiKeyLabel = 'API key',\n apiKeyHelp,\n hasStoredKey = false,\n presets,\n presetKey = '',\n onPresetChange,\n presetLabel = 'Provider',\n customPresetLabel = 'Custom…',\n showLocationKind = false,\n locationKind = 'cloud',\n onLocationKindChange,\n locationLabel = 'Hosting',\n localLabel = 'Local / on-premise',\n cloudLabel = 'Cloud',\n showCountry = false,\n country,\n onCountryChange,\n countryLabel = 'Country',\n countryOptions = [],\n countryPlaceholder = 'Select a country…',\n countrySearchPlaceholder = 'Search countries…',\n countryEmptyLabel = 'No matching country',\n countryClearLabel = 'Clear country',\n storedKeyLabel = 'Stored — leave empty to keep',\n keyPlaceholder = 'sk-…',\n error,\n children,\n className,\n ...props\n },\n ref,\n ) {\n return (\n <div\n ref={ref}\n data-as=\"provider-form\"\n className={cn('flex w-full flex-col gap-4', className)}\n {...props}\n >\n {presets && presets.length > 0 && onPresetChange ? (\n <label className=\"block space-y-1 text-sm\">\n <span className=\"text-sm font-medium text-[var(--as-fg)]\">{presetLabel}</span>\n <select\n value={presetKey}\n onChange={(event) => onPresetChange(event.target.value)}\n className=\"w-full rounded-[var(--as-radius)] border border-[var(--as-border)] bg-[var(--as-surface)] px-3 py-2 text-sm text-[var(--as-fg)]\"\n >\n {presets.map((preset) => (\n <option key={preset.key} value={preset.key}>\n {preset.name}\n </option>\n ))}\n <option value={CUSTOM_PRESET_KEY}>{customPresetLabel}</option>\n </select>\n </label>\n ) : null}\n <Input\n label={nameLabel}\n value={name}\n onChange={(event) => onNameChange(event.target.value)}\n placeholder={namePlaceholder}\n />\n {hideBaseUrl ? null : (\n <Input\n label={baseUrlLabel}\n value={baseUrl}\n onChange={(event) => onBaseUrlChange(event.target.value)}\n placeholder={baseUrlPlaceholder}\n className=\"font-mono\"\n />\n )}\n <Input\n label={\n hasStoredKey ? (\n <>\n {apiKeyLabel}{' '}\n <span className=\"font-normal text-[var(--as-muted-fg)]\">\n ({storedKeyLabel})\n </span>\n </>\n ) : (\n apiKeyLabel\n )\n }\n type=\"password\"\n value={apiKey}\n onChange={(event) => onApiKeyChange(event.target.value)}\n placeholder={hasStoredKey ? '•••' : keyPlaceholder}\n autoComplete=\"new-password\"\n hint={\n apiKeyHelp ? (\n <span className=\"inline-flex items-center gap-1\">\n <KeyRound className=\"size-3\" aria-hidden />\n {apiKeyHelp}\n </span>\n ) : undefined\n }\n />\n {showLocationKind && onLocationKindChange ? (\n <div className=\"space-y-1\">\n <span className=\"text-sm font-medium text-[var(--as-fg)]\">{locationLabel}</span>\n <div className=\"flex gap-2\" role=\"group\" aria-label={locationLabel}>\n {(\n [\n { kind: 'local' as const, label: localLabel, Icon: House },\n { kind: 'cloud' as const, label: cloudLabel, Icon: Building2 },\n ]\n ).map(({ kind, label, Icon }) => {\n const on = locationKind === kind\n return (\n <button\n key={kind}\n type=\"button\"\n data-as-location={kind}\n aria-pressed={on}\n onClick={() => onLocationKindChange(kind)}\n className={cn(\n 'flex flex-1 cursor-pointer items-center justify-center gap-1.5 rounded-[var(--as-radius)] border px-3 py-2 text-xs font-semibold transition-all',\n 'focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]',\n on\n ? 'border-[var(--as-primary)]/30 bg-[var(--as-primary)]/10 text-[var(--as-primary)] shadow-[var(--as-shadow-1)]'\n : 'border-[var(--as-border)] bg-[var(--as-surface)] text-[var(--as-muted-fg)] hover:border-[var(--as-muted-fg)]/40',\n )}\n >\n <Icon className=\"size-3.5\" aria-hidden />\n {label}\n </button>\n )\n })}\n </div>\n </div>\n ) : null}\n {showCountry && onCountryChange ? (\n <Combobox\n options={countryOptions}\n value={country ?? ''}\n onChange={onCountryChange}\n label={countryLabel}\n placeholder={countryPlaceholder}\n searchPlaceholder={countrySearchPlaceholder}\n searchLabel={countrySearchPlaceholder}\n emptyLabel={countryEmptyLabel}\n clearable\n clearLabel={countryClearLabel}\n />\n ) : null}\n {children}\n {error ? (\n <p role=\"alert\" className=\"text-sm font-medium text-[var(--as-danger)]\">\n {error}\n </p>\n ) : null}\n </div>\n )\n },\n)\n"]}
@@ -1,5 +1,5 @@
1
- import { FormModal } from './chunk-QPY2Y532.js';
2
1
  import { Textarea } from './chunk-F6J2H6UJ.js';
2
+ import { FormModal } from './chunk-QPY2Y532.js';
3
3
  import * as React from 'react';
4
4
  import { Sparkles } from 'lucide-react';
5
5
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -70,5 +70,5 @@ function AiMagicFill({
70
70
  }
71
71
 
72
72
  export { AiMagicFill };
73
- //# sourceMappingURL=chunk-YM4YN3YC.js.map
74
- //# sourceMappingURL=chunk-YM4YN3YC.js.map
73
+ //# sourceMappingURL=chunk-X6L5Z5LV.js.map
74
+ //# sourceMappingURL=chunk-X6L5Z5LV.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/ai-magic-fill/AiMagicFill.tsx"],"names":[],"mappings":";;;;;;AAqBO,SAAS,WAAA,CAAY;AAAA,EAC1B,IAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA,GAAO,KAAA;AAAA,EACP,KAAA;AAAA,EACA,KAAA,GAAQ,YAAA;AAAA,EACR,QAAA,GAAW,4BAAA;AAAA,EACX,WAAA;AAAA,EACA,WAAA,GAAc,kBAAA;AAAA,EACd,WAAA,GAAc,8BAAA;AAAA,EACd,WAAA;AAAA,EACA,WAAA,GAAc,QAAA;AAAA,EACd;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAU,eAAS,EAAE,CAAA;AAE7C,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,MAAM,OAAA,GAAU,OAAO,IAAA,EAAK;AAC5B,IAAA,IAAI,CAAC,WAAW,IAAA,EAAM;AACtB,IAAA,QAAA,CAAS,OAAO,CAAA;AAChB,IAAA,SAAA,CAAU,EAAE,CAAA;AAAA,EACd,CAAA;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,YAAA;AAAA,MACA,KAAA;AAAA,MACA,WAAA,EAAa,QAAA;AAAA,MACb,IAAA,EAAM,QAAA;AAAA,MACN,WAAA,EAAa,WAAA,IAAe,CAAA,MAAA,EAAS,KAAK,CAAA,CAAA;AAAA,MAC1C,WAAA;AAAA,MACA,UAAA,EAAY,IAAA;AAAA,MACZ,cAAA,EAAgB,CAAC,MAAA,CAAO,IAAA,EAAK;AAAA,MAC7B,QAAA,EAAU,MAAA;AAAA,MACV,gBAAA,EAAkB,SAAA;AAAA,MAElB,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAQ,eAAA,EAAgB,WAAU,qBAAA,EACrC,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uBAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,sBAAA;AAAA,cACR,SAAA,EAAU,6EAAA;AAAA,cAET,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,0BACA,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAG,sBAAA;AAAA,cACH,IAAA,EAAM,CAAA;AAAA,cACN,KAAA,EAAO,MAAA;AAAA,cACP,UAAU,CAAC,KAAA,KACT,SAAA,CAAU,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,cAE9B,WAAA;AAAA,cACA,SAAA,EAAU;AAAA;AAAA;AACZ,SAAA,EACF,CAAA;AAAA,QACC,8BACC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4MAAA,EACV,uBACH,CAAA,GACE,IAAA;AAAA,QACH,KAAA,uBACE,GAAA,EAAA,EAAE,IAAA,EAAK,SAAQ,SAAA,EAAU,+CAAA,EACvB,iBACH,CAAA,GACE;AAAA,OAAA,EACN;AAAA;AAAA,GACF;AAEJ","file":"chunk-YM4YN3YC.js","sourcesContent":["import * as React from 'react'\nimport { Sparkles } from 'lucide-react'\nimport { FormModal } from '../form-modal/FormModal'\nimport { Textarea } from '../textarea/Textarea'\n\nexport interface AiMagicFillProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n onSubmit: (prompt: string) => void\n busy?: boolean\n error?: string | null\n title?: string\n subtitle?: string\n description?: string\n promptLabel?: string\n placeholder?: string\n submitLabel?: string\n cancelLabel?: string\n className?: string\n}\n\nexport function AiMagicFill({\n open,\n onOpenChange,\n onSubmit,\n busy = false,\n error,\n title = 'Magic Fill',\n subtitle = 'AI-powered data extraction',\n description,\n promptLabel = 'Describe details',\n placeholder = 'Describe the data here…',\n submitLabel,\n cancelLabel = 'Cancel',\n className,\n}: AiMagicFillProps) {\n const [prompt, setPrompt] = React.useState('')\n\n const submit = () => {\n const trimmed = prompt.trim()\n if (!trimmed || busy) return\n onSubmit(trimmed)\n setPrompt('')\n }\n\n return (\n <FormModal\n open={open}\n onOpenChange={onOpenChange}\n title={title}\n description={subtitle}\n icon={Sparkles}\n submitLabel={submitLabel ?? `Apply ${title}`}\n cancelLabel={cancelLabel}\n submitting={busy}\n submitDisabled={!prompt.trim()}\n onSubmit={submit}\n contentClassName={className}\n >\n <div data-as=\"ai-magic-fill\" className=\"flex flex-col gap-4\">\n <div className=\"flex flex-col gap-1.5\">\n <label\n htmlFor=\"ai-magic-fill-prompt\"\n className=\"text-[11px] font-bold uppercase tracking-[0.18em] text-[var(--as-muted-fg)]\"\n >\n {promptLabel}\n </label>\n <Textarea\n id=\"ai-magic-fill-prompt\"\n rows={5}\n value={prompt}\n onChange={(event: React.ChangeEvent<HTMLTextAreaElement>) =>\n setPrompt(event.target.value)\n }\n placeholder={placeholder}\n className=\"resize-none leading-relaxed\"\n />\n </div>\n {description ? (\n <p className=\"rounded-[var(--as-radius)] border border-[color-mix(in_srgb,var(--as-ai)_25%,transparent)] bg-[color-mix(in_srgb,var(--as-ai)_8%,transparent)] p-3 text-xs font-medium leading-relaxed text-[var(--as-fg)]\">\n {description}\n </p>\n ) : null}\n {error ? (\n <p role=\"alert\" className=\"text-xs font-semibold text-[var(--as-danger)]\">\n {error}\n </p>\n ) : null}\n </div>\n </FormModal>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/components/ai-magic-fill/AiMagicFill.tsx"],"names":[],"mappings":";;;;;;AAqBO,SAAS,WAAA,CAAY;AAAA,EAC1B,IAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA,GAAO,KAAA;AAAA,EACP,KAAA;AAAA,EACA,KAAA,GAAQ,YAAA;AAAA,EACR,QAAA,GAAW,4BAAA;AAAA,EACX,WAAA;AAAA,EACA,WAAA,GAAc,kBAAA;AAAA,EACd,WAAA,GAAc,8BAAA;AAAA,EACd,WAAA;AAAA,EACA,WAAA,GAAc,QAAA;AAAA,EACd;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAU,eAAS,EAAE,CAAA;AAE7C,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,MAAM,OAAA,GAAU,OAAO,IAAA,EAAK;AAC5B,IAAA,IAAI,CAAC,WAAW,IAAA,EAAM;AACtB,IAAA,QAAA,CAAS,OAAO,CAAA;AAChB,IAAA,SAAA,CAAU,EAAE,CAAA;AAAA,EACd,CAAA;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,YAAA;AAAA,MACA,KAAA;AAAA,MACA,WAAA,EAAa,QAAA;AAAA,MACb,IAAA,EAAM,QAAA;AAAA,MACN,WAAA,EAAa,WAAA,IAAe,CAAA,MAAA,EAAS,KAAK,CAAA,CAAA;AAAA,MAC1C,WAAA;AAAA,MACA,UAAA,EAAY,IAAA;AAAA,MACZ,cAAA,EAAgB,CAAC,MAAA,CAAO,IAAA,EAAK;AAAA,MAC7B,QAAA,EAAU,MAAA;AAAA,MACV,gBAAA,EAAkB,SAAA;AAAA,MAElB,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAQ,eAAA,EAAgB,WAAU,qBAAA,EACrC,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uBAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,sBAAA;AAAA,cACR,SAAA,EAAU,6EAAA;AAAA,cAET,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,0BACA,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAG,sBAAA;AAAA,cACH,IAAA,EAAM,CAAA;AAAA,cACN,KAAA,EAAO,MAAA;AAAA,cACP,UAAU,CAAC,KAAA,KACT,SAAA,CAAU,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,cAE9B,WAAA;AAAA,cACA,SAAA,EAAU;AAAA;AAAA;AACZ,SAAA,EACF,CAAA;AAAA,QACC,8BACC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4MAAA,EACV,uBACH,CAAA,GACE,IAAA;AAAA,QACH,KAAA,uBACE,GAAA,EAAA,EAAE,IAAA,EAAK,SAAQ,SAAA,EAAU,+CAAA,EACvB,iBACH,CAAA,GACE;AAAA,OAAA,EACN;AAAA;AAAA,GACF;AAEJ","file":"chunk-X6L5Z5LV.js","sourcesContent":["import * as React from 'react'\nimport { Sparkles } from 'lucide-react'\nimport { FormModal } from '../form-modal/FormModal'\nimport { Textarea } from '../textarea/Textarea'\n\nexport interface AiMagicFillProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n onSubmit: (prompt: string) => void\n busy?: boolean\n error?: string | null\n title?: string\n subtitle?: string\n description?: string\n promptLabel?: string\n placeholder?: string\n submitLabel?: string\n cancelLabel?: string\n className?: string\n}\n\nexport function AiMagicFill({\n open,\n onOpenChange,\n onSubmit,\n busy = false,\n error,\n title = 'Magic Fill',\n subtitle = 'AI-powered data extraction',\n description,\n promptLabel = 'Describe details',\n placeholder = 'Describe the data here…',\n submitLabel,\n cancelLabel = 'Cancel',\n className,\n}: AiMagicFillProps) {\n const [prompt, setPrompt] = React.useState('')\n\n const submit = () => {\n const trimmed = prompt.trim()\n if (!trimmed || busy) return\n onSubmit(trimmed)\n setPrompt('')\n }\n\n return (\n <FormModal\n open={open}\n onOpenChange={onOpenChange}\n title={title}\n description={subtitle}\n icon={Sparkles}\n submitLabel={submitLabel ?? `Apply ${title}`}\n cancelLabel={cancelLabel}\n submitting={busy}\n submitDisabled={!prompt.trim()}\n onSubmit={submit}\n contentClassName={className}\n >\n <div data-as=\"ai-magic-fill\" className=\"flex flex-col gap-4\">\n <div className=\"flex flex-col gap-1.5\">\n <label\n htmlFor=\"ai-magic-fill-prompt\"\n className=\"text-[11px] font-bold uppercase tracking-[0.18em] text-[var(--as-muted-fg)]\"\n >\n {promptLabel}\n </label>\n <Textarea\n id=\"ai-magic-fill-prompt\"\n rows={5}\n value={prompt}\n onChange={(event: React.ChangeEvent<HTMLTextAreaElement>) =>\n setPrompt(event.target.value)\n }\n placeholder={placeholder}\n className=\"resize-none leading-relaxed\"\n />\n </div>\n {description ? (\n <p className=\"rounded-[var(--as-radius)] border border-[color-mix(in_srgb,var(--as-ai)_25%,transparent)] bg-[color-mix(in_srgb,var(--as-ai)_8%,transparent)] p-3 text-xs font-medium leading-relaxed text-[var(--as-fg)]\">\n {description}\n </p>\n ) : null}\n {error ? (\n <p role=\"alert\" className=\"text-xs font-semibold text-[var(--as-danger)]\">\n {error}\n </p>\n ) : null}\n </div>\n </FormModal>\n )\n}\n"]}
package/dist/combobox.js CHANGED
@@ -1,3 +1,3 @@
1
- export { Combobox, ComboboxMulti } from './chunk-URLF67WR.js';
1
+ export { Combobox, ComboboxMulti } from './chunk-SVRCZUNQ.js';
2
2
  //# sourceMappingURL=combobox.js.map
3
3
  //# sourceMappingURL=combobox.js.map