@particle-academy/react-fancy 5.68.0 → 5.70.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/CHANGELOG.md +73 -0
- package/dist/{PastedFilesInput-Bt3KSTVN.d.ts → PastedFilesInput-BT5y95sb.d.ts} +2 -1
- package/dist/{PastedFilesInput-CUQeOeOA.d.cts → PastedFilesInput-Cd4k6a38.d.cts} +2 -1
- package/dist/autocomplete.cjs +3 -2
- package/dist/autocomplete.js +2 -1
- package/dist/chunk-2C64OVOZ.cjs +18 -0
- package/dist/chunk-2C64OVOZ.cjs.map +1 -0
- package/dist/{chunk-BX7EDTL4.js → chunk-37D5PYEF.js} +4 -3
- package/dist/chunk-37D5PYEF.js.map +1 -0
- package/dist/{chunk-UJRMY54A.cjs → chunk-3QCAOD2W.cjs} +4 -2
- package/dist/chunk-3QCAOD2W.cjs.map +1 -0
- package/dist/{chunk-KSU6RYWU.cjs → chunk-3T3LBIQA.cjs} +4 -2
- package/dist/chunk-3T3LBIQA.cjs.map +1 -0
- package/dist/{chunk-E4DXICU3.cjs → chunk-5YRSYS2F.cjs} +10 -10
- package/dist/{chunk-E4DXICU3.cjs.map → chunk-5YRSYS2F.cjs.map} +1 -1
- package/dist/{chunk-U5LKNGHU.cjs → chunk-6EA3DSPT.cjs} +14 -13
- package/dist/chunk-6EA3DSPT.cjs.map +1 -0
- package/dist/{chunk-YIKXJWO4.js → chunk-6PRXG7L6.js} +7 -5
- package/dist/chunk-6PRXG7L6.js.map +1 -0
- package/dist/{chunk-WKPBCB67.cjs → chunk-6QAF35AJ.cjs} +4 -2
- package/dist/chunk-6QAF35AJ.cjs.map +1 -0
- package/dist/chunk-6V44RRSB.cjs +11 -0
- package/dist/chunk-6V44RRSB.cjs.map +1 -0
- package/dist/chunk-AC3W3TIV.js +67 -0
- package/dist/chunk-AC3W3TIV.js.map +1 -0
- package/dist/{chunk-G35XN5WV.js → chunk-CDW7MFPG.js} +4 -2
- package/dist/chunk-CDW7MFPG.js.map +1 -0
- package/dist/{chunk-DCAD2JPP.js → chunk-EZL5DILH.js} +7 -6
- package/dist/chunk-EZL5DILH.js.map +1 -0
- package/dist/{chunk-ARO2DNGS.js → chunk-EZZKHMR4.js} +4 -2
- package/dist/chunk-EZZKHMR4.js.map +1 -0
- package/dist/{chunk-TQ77ZWBD.js → chunk-F4GMOMUT.js} +3 -3
- package/dist/{chunk-TQ77ZWBD.js.map → chunk-F4GMOMUT.js.map} +1 -1
- package/dist/{chunk-R6URPHEP.cjs → chunk-FHRVSYJU.cjs} +4 -3
- package/dist/chunk-FHRVSYJU.cjs.map +1 -0
- package/dist/{chunk-QSGAFKK2.js → chunk-HN5J7TK6.js} +46 -11
- package/dist/chunk-HN5J7TK6.js.map +1 -0
- package/dist/{chunk-6CAXLP7D.cjs → chunk-HNJXBMHI.cjs} +6 -6
- package/dist/{chunk-6CAXLP7D.cjs.map → chunk-HNJXBMHI.cjs.map} +1 -1
- package/dist/chunk-I3LAFKJU.js +16 -0
- package/dist/chunk-I3LAFKJU.js.map +1 -0
- package/dist/{chunk-23AVEYUP.js → chunk-J7S42MJP.js} +87 -29
- package/dist/chunk-J7S42MJP.js.map +1 -0
- package/dist/{chunk-HFK5SBNM.cjs → chunk-KKYILQTG.cjs} +7 -5
- package/dist/chunk-KKYILQTG.cjs.map +1 -0
- package/dist/{chunk-7FYRFNPX.cjs → chunk-LBSAWRFT.cjs} +52 -17
- package/dist/chunk-LBSAWRFT.cjs.map +1 -0
- package/dist/{chunk-FVI4JDLA.js → chunk-M6UAVA2I.js} +4 -2
- package/dist/chunk-M6UAVA2I.js.map +1 -0
- package/dist/{chunk-2LQR4EAN.js → chunk-NAYXNVNU.js} +7 -3
- package/dist/chunk-NAYXNVNU.js.map +1 -0
- package/dist/{chunk-G5DMYAWL.cjs → chunk-O5ORO2RX.cjs} +5 -2
- package/dist/chunk-O5ORO2RX.cjs.map +1 -0
- package/dist/{chunk-B4LVQ4QI.js → chunk-PJNUGSKI.js} +3 -3
- package/dist/{chunk-B4LVQ4QI.js.map → chunk-PJNUGSKI.js.map} +1 -1
- package/dist/{chunk-464QSZ4A.cjs → chunk-R3EJNGJV.cjs} +7 -3
- package/dist/chunk-R3EJNGJV.cjs.map +1 -0
- package/dist/chunk-S42OGG43.js +9 -0
- package/dist/chunk-S42OGG43.js.map +1 -0
- package/dist/{chunk-VZNBTCGA.js → chunk-TCMOD3WW.js} +4 -3
- package/dist/chunk-TCMOD3WW.js.map +1 -0
- package/dist/{chunk-6MXFZ3B5.cjs → chunk-UK6BGM74.cjs} +4 -3
- package/dist/chunk-UK6BGM74.cjs.map +1 -0
- package/dist/{chunk-XS3EIQFP.js → chunk-WZAKEJDL.js} +5 -2
- package/dist/chunk-WZAKEJDL.js.map +1 -0
- package/dist/{chunk-SAG6DHQK.cjs → chunk-XAKZ6VBP.cjs} +92 -34
- package/dist/chunk-XAKZ6VBP.cjs.map +1 -0
- package/dist/chunk-XNHAJQRF.cjs +69 -0
- package/dist/chunk-XNHAJQRF.cjs.map +1 -0
- package/dist/command.cjs +4 -3
- package/dist/command.js +2 -1
- package/dist/composer.cjs +7 -4
- package/dist/composer.d.cts +44 -2
- package/dist/composer.d.ts +44 -2
- package/dist/composer.js +5 -2
- package/dist/content-renderer.cjs +5 -4
- package/dist/content-renderer.js +2 -1
- package/dist/editor.cjs +5 -4
- package/dist/editor.js +3 -2
- package/dist/file-browser.cjs +6 -5
- package/dist/file-browser.js +2 -1
- package/dist/{index-XR5t8bTq.d.ts → index-BAtF94lw.d.ts} +69 -5
- package/dist/{index-DWtSViJ3.d.cts → index-xwL2MACB.d.cts} +69 -5
- package/dist/index.cjs +61 -58
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -2
- package/dist/index.d.ts +3 -2
- package/dist/index.js +16 -13
- package/dist/index.js.map +1 -1
- package/dist/input-tag.cjs +7 -6
- package/dist/input-tag.js +2 -1
- package/dist/input.cjs +4 -3
- package/dist/input.js +3 -2
- package/dist/inputs.cjs +6 -5
- package/dist/inputs.js +4 -3
- package/dist/json-editor.cjs +16 -15
- package/dist/json-editor.js +5 -4
- package/dist/paste-pills.cjs +15 -14
- package/dist/paste-pills.d.cts +1 -1
- package/dist/paste-pills.d.ts +1 -1
- package/dist/paste-pills.js +2 -1
- package/dist/pillbox.cjs +3 -2
- package/dist/pillbox.js +2 -1
- package/dist/prompt-input.cjs +8 -5
- package/dist/prompt-input.d.cts +2 -1
- package/dist/prompt-input.d.ts +2 -1
- package/dist/prompt-input.js +5 -2
- package/dist/select.cjs +3 -2
- package/dist/select.js +2 -1
- package/dist/use-acknowledged-submit-7nC0vSCP.d.cts +12 -0
- package/dist/use-acknowledged-submit-7nC0vSCP.d.ts +12 -0
- package/docs/Composer.md +62 -2
- package/docs/ContentRenderer.md +4 -1
- package/docs/PromptInput.md +67 -6
- package/package.json +1 -1
- package/dist/chunk-23AVEYUP.js.map +0 -1
- package/dist/chunk-2LQR4EAN.js.map +0 -1
- package/dist/chunk-464QSZ4A.cjs.map +0 -1
- package/dist/chunk-6MXFZ3B5.cjs.map +0 -1
- package/dist/chunk-7FYRFNPX.cjs.map +0 -1
- package/dist/chunk-ARO2DNGS.js.map +0 -1
- package/dist/chunk-BX7EDTL4.js.map +0 -1
- package/dist/chunk-DCAD2JPP.js.map +0 -1
- package/dist/chunk-FVI4JDLA.js.map +0 -1
- package/dist/chunk-G35XN5WV.js.map +0 -1
- package/dist/chunk-G5DMYAWL.cjs.map +0 -1
- package/dist/chunk-HFK5SBNM.cjs.map +0 -1
- package/dist/chunk-KSU6RYWU.cjs.map +0 -1
- package/dist/chunk-QSGAFKK2.js.map +0 -1
- package/dist/chunk-R6URPHEP.cjs.map +0 -1
- package/dist/chunk-SAG6DHQK.cjs.map +0 -1
- package/dist/chunk-U5LKNGHU.cjs.map +0 -1
- package/dist/chunk-UJRMY54A.cjs.map +0 -1
- package/dist/chunk-VZNBTCGA.js.map +0 -1
- package/dist/chunk-WKPBCB67.cjs.map +0 -1
- package/dist/chunk-XS3EIQFP.js.map +0 -1
- package/dist/chunk-YIKXJWO4.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/PromptInput/prompt-draft.ts","../src/utils/platform.ts","../src/components/PromptInput/PromptInput.tsx"],"names":["markedIds","expandMarkers","forwardRef","PromptInput","useState","useRef","useCallback","useReducer","fileRef","useMemo","useInlinePaste","useEffect","useLayoutEffect","useImperativeHandle","jsxs","cn","jsx","Icon","Fragment","InlinePasteEditor","PastedFilesInput","Tooltip","Button"],"mappings":"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","file":"chunk-SAG6DHQK.cjs","sourcesContent":["import { expandMarkers, markedIds, type HeldImage } from \"../PastePills/paste-markers\";\n\n/**\n * A file in a saved draft — an attachment chip, or the image behind an image\n * pill — described by data alone, so the draft survives `JSON.stringify`.\n *\n * The bytes are deliberately NOT in here. A `File` does not survive JSON, and\n * putting base64 in the draft by default would make every saved draft as large\n * as everything attached to it: a 6 MB screenshot becomes 8 MB of string written\n * on every keystroke by a host that saves on change. Instead the host decides\n * where bytes live, through `persistAttachment` (save) and `restoreAttachment`\n * (load), and the draft carries only the host's handle for them in `ref`.\n *\n * A host that WANTS the bytes inline passes `promptFileToDataUrl` as\n * `persistAttachment`, and `ref` is then a `data:` URL.\n */\nexport interface PromptDraftFile {\n /** Stable for the life of the draft. For an image pill, the pill's own id. */\n id: string;\n name: string;\n /** MIME type, `\"\"` when the browser did not know it. */\n type: string;\n bytes: number;\n /**\n * The host's handle for the stored bytes — whatever `persistAttachment`\n * returned: a storage key, an upload URL, a `data:` URL. Absent when the host\n * keeps nothing, in which case a restored attachment has no `File`.\n */\n ref?: string;\n}\n\n/** A paste held as a pill inside the message. Its marker sits in `text`. */\nexport type PromptDraftPill =\n | {\n kind: \"text\";\n id: string;\n text: string;\n /**\n * Shown on the pill in place of `Pasted text · N characters`. Display only:\n * sending still expands the pill to the full `text`. Plain text, flattened\n * to one line and capped at 80 characters when drawn. Optional.\n */\n label?: string;\n }\n | { kind: \"image\"; id: string; label: string; file: PromptDraftFile };\n\n/**\n * Everything a PromptInput holds, as JSON. Versioned, so a draft saved by one\n * release and read by a later one is recognised or refused, never guessed at.\n *\n * `text` is the raw value: with paste pills on, each pill is a marker in it\n * (`pasteMarker(id)`), because the message itself is the record of what is\n * attached and where. Mentions and slash commands are plain text in it.\n */\nexport interface PromptDraft {\n v: 1;\n text: string;\n pills: PromptDraftPill[];\n attachments: PromptDraftFile[];\n}\n\nexport interface PromptSetDraftOptions {\n /**\n * Focus the composer after restoring, caret at the end. Default `false`:\n * restoring a draft never moves focus or anybody's caret on its own\n * (genie#1235 was exactly that).\n */\n focus?: boolean;\n}\n\n/** The imperative handle a `ref` on `PromptInput` receives. */\nexport interface PromptInputHandle {\n /** The current draft. A fresh JSON-safe copy; mutating it changes nothing. */\n getDraft(): PromptDraft;\n /**\n * Replace the whole draft. Does NOT call `onChange` / `onDraftChange` (the\n * host is the one setting it), does NOT focus unless `{ focus: true }`.\n * A draft whose `v` this release does not know is refused with a warning.\n */\n setDraft(draft: PromptDraft, options?: PromptSetDraftOptions): void;\n /** Focus the composer, caret at the end. */\n focus(): void;\n}\n\nexport const EMPTY_DRAFT: PromptDraft = { v: 1, text: \"\", pills: [], attachments: [] };\n\nfunction readFile(raw: unknown, id?: string): PromptDraftFile | null {\n if (!raw || typeof raw !== \"object\") return null;\n const f = raw as Record<string, unknown>;\n const fileId = id ?? f.id;\n if (typeof fileId !== \"string\" || typeof f.name !== \"string\") return null;\n const out: PromptDraftFile = {\n id: fileId,\n name: f.name,\n type: typeof f.type === \"string\" ? f.type : \"\",\n bytes: typeof f.bytes === \"number\" && Number.isFinite(f.bytes) ? f.bytes : 0,\n };\n if (typeof f.ref === \"string\") out.ref = f.ref;\n return out;\n}\n\nfunction readPill(raw: unknown): PromptDraftPill | null {\n if (!raw || typeof raw !== \"object\") return null;\n const p = raw as Record<string, unknown>;\n if (typeof p.id !== \"string\") return null;\n if (p.kind === \"text\" && typeof p.text === \"string\") {\n return typeof p.label === \"string\"\n ? { kind: \"text\", id: p.id, text: p.text, label: p.label }\n : { kind: \"text\", id: p.id, text: p.text };\n }\n if (p.kind === \"image\" && typeof p.label === \"string\") {\n const file = readFile(p.file, p.id);\n return file ? { kind: \"image\", id: p.id, label: p.label, file } : null;\n }\n return null;\n}\n\n/**\n * Validate a draft from storage. `null` for anything that is not a v1 draft.\n *\n * `inline` is whether the composer can show pills. Without them (no\n * `pasteThreshold` / `pasteImages`) a pill would surface as raw marker\n * characters, so text pills are expanded in place and image pills become `[label]`\n * in the text plus an ordinary attachment — what the message would have sent.\n */\nexport function readPromptDraft(raw: unknown, inline: boolean): PromptDraft | null {\n if (!raw || typeof raw !== \"object\" || (raw as { v?: unknown }).v !== 1) return null;\n const d = raw as Record<string, unknown>;\n\n let text = typeof d.text === \"string\" ? d.text : \"\";\n let pills = (Array.isArray(d.pills) ? d.pills : [])\n .map(readPill)\n .filter((p): p is PromptDraftPill => p !== null);\n let attachments = (Array.isArray(d.attachments) ? d.attachments : [])\n .map((a) => readFile(a))\n .filter((a): a is PromptDraftFile => a !== null);\n\n // The message is the record: a pill the text no longer marks is not attached.\n const marked = new Set(markedIds(text));\n pills = pills.filter((p) => marked.has(p.id));\n\n if (!inline && pills.length > 0) {\n const texts = pills.flatMap((p) => (p.kind === \"text\" ? [{ id: p.id, text: p.text }] : []));\n const images = pills.flatMap((p) => (p.kind === \"image\" ? [p] : []));\n text = expandMarkers(\n text,\n texts,\n images.map((p) => ({ id: p.id, label: p.label }) as HeldImage),\n );\n attachments = [...attachments, ...images.map((p) => p.file)];\n pills = [];\n }\n\n return { v: 1, text, pills, attachments };\n}\n\n/** A deep, JSON-safe copy, so a host cannot mutate the component's state through it. */\nexport function clonePromptDraft(draft: PromptDraft): PromptDraft {\n return JSON.parse(JSON.stringify(draft)) as PromptDraft;\n}\n\n/** Every file a draft refers to: attachments, then image pills. */\nexport function promptDraftFiles(draft: PromptDraft): PromptDraftFile[] {\n return [\n ...draft.attachments,\n ...draft.pills.flatMap((p) => (p.kind === \"image\" ? [p.file] : [])),\n ];\n}\n\n/**\n * Read a File as a `data:` URL. Pass it as `persistAttachment` to keep the bytes\n * IN the draft — simple, and fine for small files; every saved draft then carries\n * every attached byte, base64-inflated by a third.\n */\nexport function promptFileToDataUrl(file: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(String(reader.result));\n reader.onerror = () => reject(reader.error);\n reader.readAsDataURL(file);\n });\n}\n\n/**\n * Turn a `data:` URL back into a File — the other half of `promptFileToDataUrl`:\n *\n * restoreAttachment={(f) => f.ref ? promptDataUrlToFile(f.ref, f.name, f.type) : undefined}\n *\n * Synchronous, so the restored draft has its Files on the first render.\n * `undefined` for anything that is not a `data:` URL.\n */\nexport function promptDataUrlToFile(dataUrl: string, name: string, type?: string): File | undefined {\n if (!dataUrl.startsWith(\"data:\")) return undefined;\n const comma = dataUrl.indexOf(\",\");\n if (comma < 0) return undefined;\n\n const meta = dataUrl.slice(5, comma);\n const body = dataUrl.slice(comma + 1);\n const mime = type || meta.split(\";\")[0] || \"application/octet-stream\";\n\n try {\n let bytes: Uint8Array<ArrayBuffer>;\n if (meta.endsWith(\";base64\")) {\n const bin = atob(body);\n bytes = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);\n } else {\n bytes = new TextEncoder().encode(decodeURIComponent(body));\n }\n return new File([bytes], name, { type: mime });\n } catch {\n return undefined;\n }\n}\n","/**\n * Which modifier key the user actually has.\n *\n * This exists because a keyboard hint is a CLAIM about the reader's hardware.\n * `⌘ + Enter to send` on Windows or Linux names a key that is not on the\n * keyboard, and a reader who cannot act on a hint learns to ignore hints — so\n * the cost is not one wrong glyph, it is the credibility of every hint beside\n * it. (Reported from a real Electron app running on Linux, where the glyph had\n * no font behind it either and rendered as tofu.)\n *\n * Two deliberate choices:\n *\n * 1. **The platform is an ARGUMENT, never a global read.** `detectPlatform`\n * takes the hints; `modifierKeyLabel` takes the verdict. Both branches are\n * therefore reachable from one machine, which is the only way a test can\n * cover the platform you are not sitting at. A function that reads\n * `navigator` internally can only ever be tested on the developer's own OS.\n * 2. **`generic` is the fallback, and that is not arbitrary.** Every Fancy\n * surface that submits on a modifier accepts `metaKey || ctrlKey`, so\n * `Ctrl` is a TRUE label on an Apple keyboard while `⌘` is a FALSE one\n * everywhere else. The honest default is the one that is pressable on all\n * of them.\n */\nexport type FancyPlatform = \"apple\" | \"generic\";\n\n/**\n * The parts of `navigator` the detection reads — nothing more, so a caller can\n * hand it a literal (a test, an Electron main process forwarding `process.platform`,\n * a server with a stored preference).\n */\nexport interface PlatformHints {\n /** `navigator.userAgentData` — the modern, non-spoofed answer where it exists. */\n userAgentData?: { platform?: string } | null;\n /** `navigator.platform` — deprecated, still the most reliable legacy signal. */\n platform?: string | null;\n /** `navigator.userAgent` — last resort. */\n userAgent?: string | null;\n}\n\n/**\n * `userAgentData.platform` is a short enumerated token (\"macOS\", \"Windows\",\n * \"Linux\", \"Android\", \"iOS\"), so it is matched exactly rather than by substring.\n */\nconst APPLE_UA_DATA_PLATFORMS = new Set([\"macos\", \"ios\", \"ipados\"]);\n\n/**\n * Legacy `platform` / `userAgent` are free text. iPadOS reports `MacIntel`, and\n * iOS user agents say \"like Mac OS X\" — both are Apple, so a Mac match is\n * correct for them too.\n */\nconst APPLE_FREE_TEXT = /\\b(mac|macintosh|iphone|ipad|ipod|darwin)/i;\n\n/** Resolve a platform from navigator-shaped hints. Unknown or absent ⇒ `generic`. */\nexport function detectPlatform(hints?: PlatformHints | null): FancyPlatform {\n if (!hints) return \"generic\";\n\n const uaData = hints.userAgentData?.platform;\n if (typeof uaData === \"string\" && uaData.length > 0) {\n // When the browser gives an enumerated answer, TRUST IT and stop. Falling\n // through to the free-text test would let a Windows UA string containing\n // the word \"Mac\" (a font name, a device model) overturn it.\n return APPLE_UA_DATA_PLATFORMS.has(uaData.trim().toLowerCase()) ? \"apple\" : \"generic\";\n }\n\n for (const value of [hints.platform, hints.userAgent]) {\n if (typeof value === \"string\" && APPLE_FREE_TEXT.test(value)) return \"apple\";\n }\n\n return \"generic\";\n}\n\n/**\n * The modifier key to NAME for a platform.\n *\n * `⌘` is emitted for `apple` and nothing else. A test enumerates the platform\n * values and counts that no other one can produce it, because a hint that names\n * the wrong key is worse than no hint.\n */\nexport function modifierKeyLabel(platform: FancyPlatform): \"⌘\" | \"Ctrl\" {\n return platform === \"apple\" ? \"⌘\" : \"Ctrl\";\n}\n\n/** SSR-safe read of the live browser hints. `null` off a browser. */\nexport function browserPlatformHints(): PlatformHints | null {\n if (typeof navigator === \"undefined\") return null;\n return navigator as PlatformHints;\n}\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useReducer,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Button } from \"../Button\";\nimport { Icon } from \"../Icon\";\nimport { Tooltip } from \"../Tooltip\";\nimport {\n InlinePasteEditor,\n PastedFilesInput,\n useInlinePaste,\n type ComposerPasteClassNames,\n type ComposerPastePreview,\n type InlinePasteEditorHandle,\n type HeldImage,\n type HeldPaste,\n} from \"../PastePills\";\nimport {\n EMPTY_DRAFT,\n clonePromptDraft,\n promptDraftFiles,\n readPromptDraft,\n type PromptDraft,\n type PromptDraftFile,\n type PromptDraftPill,\n type PromptInputHandle,\n type PromptSetDraftOptions,\n} from \"./prompt-draft\";\n\nexport {\n promptDataUrlToFile,\n promptFileToDataUrl,\n} from \"./prompt-draft\";\nexport type {\n PromptDraft,\n PromptDraftFile,\n PromptDraftPill,\n PromptInputHandle,\n PromptSetDraftOptions,\n} from \"./prompt-draft\";\nimport {\n browserPlatformHints,\n detectPlatform,\n modifierKeyLabel,\n type FancyPlatform,\n} from \"../../utils/platform\";\n\n/**\n * PromptInput — the chat composer every AI app rebuilds. Auto-growing\n * multi-line input with:\n *\n * • slash-command picker (`/` triggers a filtered command palette,\n * ↑/↓ navigate, Enter inserts)\n * • mention picker (`@` triggers, filtered against `mentions`)\n * • drop-to-attach (drag files anywhere on the surface), paste-to-attach\n * (a pasted screenshot becomes an attachment) + chip bar\n * • submit on ⌘/Ctrl+Enter (plain Enter inserts a newline)\n * • live token-budget meter (green → amber → red as headroom drops)\n *\n * Wire it up:\n *\n * <PromptInput\n * budgetTokens={32000}\n * commands={[{ name: \"/rewrite\", hint: \"rewrite the selection\" }]}\n * mentions={[{ id: \"ada\", name: \"Ada\", kind: \"person\" }]}\n * onSubmit={(text, attachments) => sendToAgent(text, attachments)}\n * />\n */\nexport type PromptCmd = { name: string; hint: string };\nexport type PromptMention = {\n id: string;\n name: string;\n kind: \"agent\" | \"file\" | \"person\" | string;\n};\nexport type PromptAttachment = {\n id: string;\n name: string;\n bytes: number;\n /**\n * The file the user actually attached.\n *\n * Optional because an attachment restored from a server has no File — but for\n * anything the user dropped or picked it is always present. Without it a host\n * can render a chip and nothing else: no POST, no FormData, no send-to-model.\n */\n file?: File;\n /** MIME type. Hosts branch on this to decide whether a file can be sent as-is. */\n type?: string;\n /**\n * The host's handle for the stored bytes, from `persistAttachment`. On an\n * attachment restored from a draft WITHOUT a File, this is how the host finds\n * the bytes to send.\n */\n ref?: string;\n};\n\n/**\n * `...rest` reaches the root surface, so a consumer or a bridge can tag the\n * composer with its own `data-*` handle. The component named every prop it\n * used and had no rest spread, which means a `data-handle` put on it was\n * DROPPED — silently, since React discards unknown props and the component\n * still renders perfectly. That is issue #22 all over again, and the contract\n * calls it out: \"Each interactive element has a stable identity. Agents never\n * guess DOM.\"\n */\nexport interface PromptInputProps\n extends Omit<\n HTMLAttributes<HTMLDivElement>,\n \"onSubmit\" | \"className\" | \"onChange\" | \"defaultValue\"\n > {\n /** Extra classes on the root surface. MERGED, never replaced. */\n className?: string;\n /**\n * The text, controlled. With paste pills on it carries a marker per pill\n * (`pasteMarker(id)`), exactly as `Composer`'s `value` does. Pills and\n * attachments stay internal; use `draft` to control those too.\n */\n value?: string;\n /** The starting text, uncontrolled. Ignored when `value` or `draft` is given. */\n defaultValue?: string;\n /**\n * Called with the new text when the PERSON edits it, and with `\"\"` after a\n * send. Not called by `setDraft` or a prop change: the host made those.\n */\n onChange?: (value: string) => void;\n /**\n * The whole draft, controlled: text, paste pills and attachments, as JSON.\n * Wins over `value`. Pair with `onDraftChange`.\n */\n draft?: PromptDraft;\n /** The starting draft, uncontrolled. Wins over `defaultValue`. */\n defaultDraft?: PromptDraft;\n /**\n * Called with the whole draft whenever the person changes any part of it —\n * typing, a paste, an attach, a removal, a send (which empties it) — and when\n * `persistAttachment` resolves a `ref`. Not called by `setDraft`.\n */\n onDraftChange?: (draft: PromptDraft) => void;\n /**\n * Keep an attached file somewhere and return a handle for it (a storage key, an\n * upload URL — or a `data:` URL via `promptFileToDataUrl`). Called once per\n * attached or pasted file; the result becomes the file's `ref` in the draft.\n * May return a Promise; the draft is updated (and `onDraftChange` fires) when it\n * resolves. Omit it and a draft carries file metadata only.\n */\n persistAttachment?: (\n file: File,\n entry: PromptDraftFile,\n ) => string | undefined | Promise<string | undefined>;\n /**\n * Get a File back for a draft entry restored without one (from `setDraft`,\n * `defaultDraft` or a controlled `draft`). May return a Promise. Return\n * `undefined` when there is none: the chip or pill still shows, and the\n * attachment reaches `onSubmit` with its `ref` and no `file`.\n */\n restoreAttachment?: (\n entry: PromptDraftFile,\n ) => File | undefined | Promise<File | undefined>;\n /** Token budget for the meter. */\n budgetTokens: number;\n /** Slash-commands. Names must start with `/`. */\n commands?: PromptCmd[];\n /** @-mentions. */\n mentions?: PromptMention[];\n /** Show the keyboard hint (\"Ctrl + Enter to send\", \"⌘ + Enter\" on a Mac). */\n showHint?: boolean;\n /**\n * Which modifier the hint and the default placeholder NAME. Omit it and the\n * component reads the platform after mount, which is the right answer for an\n * ordinary web app.\n *\n * Pass it when the host knows better than `navigator` does — an Electron\n * renderer forwarding `process.platform`, a remote session where the\n * keyboard is not the one running the browser, or a test that needs the\n * branch it is not sitting on. The pressed keys are unaffected either way:\n * submit is `⌘/Ctrl+Enter` on every platform, so this only decides which\n * true key gets named.\n */\n platform?: FancyPlatform;\n /** Called on ⌘/Ctrl+Enter or send button. */\n onSubmit: (text: string, attachments: PromptAttachment[]) => void;\n /**\n * Placeholder text. Defaults to a hint naming the modifier THIS platform\n * actually has, so leaving it unset is the better option — a hardcoded\n * placeholder is the other place a `⌘` ends up in front of a Windows user.\n */\n placeholder?: string;\n /** Rough estimator: chars-per-token. Defaults to 4. */\n charsPerToken?: number;\n /** Color → CSS chip mapping for mention kinds. */\n mentionColor?: Record<string, string>;\n /** Optional max textarea height in px. Defaults to 280. */\n maxHeight?: number;\n /**\n * Rendered INSIDE the rounded shell, ABOVE the attachments bar and\n * textarea. Use this slot for a drawer of tools/files/prompts/etc. so\n * the drawer and composer share one visual panel. See {@link ChatDrawer}.\n */\n aboveInput?: ReactNode;\n /**\n * Hold a paste of at least this many characters as a pill IN the message,\n * where it was pasted: on a line of its own, its full text put back in place\n * when clicked, and expanded where it sits when sent. Omit it and paste is\n * unchanged. Setting this (or `pasteImages`) swaps the textarea for an inline\n * editor that keeps the `/` and `@` pickers and the send key.\n */\n pasteThreshold?: number;\n /**\n * A pasted image becomes an inline `Pasted image N` pill AND reaches\n * `onSubmit`'s attachments, with its File, in message order; the text marks\n * where it sat as `[Pasted image N]`. Without it a pasted image is an\n * ordinary attachment chip, as before.\n */\n pasteImages?: boolean;\n /** Characters of a held paste shown at EACH end of its hover preview. Default 20. */\n previewChars?: number;\n /** Replace the paste pills' hover popover content. */\n renderPastePreview?: (preview: ComposerPastePreview) => ReactNode;\n /** Restyle the paste pills, their popover and the inline editor. Merged onto the defaults. */\n pasteClassNames?: ComposerPasteClassNames;\n /**\n * Submit pasted images with an enclosing `<form>`, under this field name: a\n * hidden `<input type=\"file\" multiple>` holds the images still in the message,\n * in message order. Needs `pasteImages`. They reach `onSubmit` either way.\n */\n pasteFilesName?: string;\n /** `\"icon\"`: an icon-only attach button whose tooltip says what it does. Default `\"label\"`. */\n attachButton?: \"label\" | \"icon\";\n /**\n * `\"icon\"`: a compact icon send button whose tooltip carries the shortcut —\n * replacing the inline `Ctrl + Enter to send` hint. Default `\"label\"`.\n */\n sendButton?: \"label\" | \"icon\";\n /**\n * Tokens already used — the caller's REAL value, e.g. an agent's context\n * usage. The meter shows this plus the estimate for the draft. Without it the\n * meter estimates the draft alone, as before.\n */\n usedTokens?: number;\n /**\n * `\"always\"` (default) — as before. `\"near-limit\"` — hidden until usage passes\n * `meterShowAt`, muted until `meterWarnAt`, warning colour past that.\n * `\"hidden\"` — never shown.\n */\n meter?: \"always\" | \"near-limit\" | \"hidden\";\n /** Fraction of `budgetTokens` at which a `\"near-limit\"` meter appears. Default 0.75. */\n meterShowAt?: number;\n /** Fraction of `budgetTokens` past which a `\"near-limit\"` meter takes the warning colour. Default 0.9. */\n meterWarnAt?: number;\n}\n\nconst DEFAULT_MENTION_COLOR: Record<string, string> = {\n agent: \"#a855f7\",\n file: \"#10b981\",\n person: \"#3b82f6\",\n};\n\nexport const PromptInput = forwardRef<PromptInputHandle, PromptInputProps>(function PromptInput({\n value: controlledValue,\n defaultValue,\n onChange,\n draft: controlledDraft,\n defaultDraft,\n onDraftChange,\n persistAttachment,\n restoreAttachment,\n budgetTokens,\n commands = [],\n mentions = [],\n showHint = true,\n platform,\n onSubmit,\n placeholder,\n charsPerToken = 4,\n mentionColor,\n maxHeight = 280,\n aboveInput,\n className,\n pasteThreshold,\n pasteImages = false,\n previewChars = 20,\n renderPastePreview,\n pasteClassNames,\n pasteFilesName,\n attachButton = \"label\",\n sendButton = \"label\",\n usedTokens,\n meter = \"always\",\n meterShowAt = 0.75,\n meterWarnAt = 0.9,\n ...rest\n}: PromptInputProps, ref) {\n /** Inline pills need an editor that can hold them; a textarea cannot. */\n const inline = pasteThreshold !== undefined || pasteImages;\n\n /*\n * ONE model for everything a draft is — text, pills, attachments — so a draft\n * read back is never a text from one moment and a list from another. Pills used\n * to live in `useInlinePaste` and attachments in their own state, which is why\n * nothing outside could read or restore them. They are now owned here and handed\n * to `useInlinePaste` controlled.\n *\n * Files cannot be JSON, so they live beside the model in `filesRef`, keyed by the\n * model's ids. `filesVersion` re-renders when a restored File arrives; that is\n * not a draft change, so nobody is told about it.\n */\n const draftControlled = controlledDraft !== undefined;\n const [innerDraft, setInnerDraft] = useState<PromptDraft>(\n () =>\n (defaultDraft && readPromptDraft(defaultDraft, inline)) || {\n ...EMPTY_DRAFT,\n text: defaultValue ?? \"\",\n },\n );\n const baseDraft = draftControlled ? controlledDraft : innerDraft;\n const model: PromptDraft =\n !draftControlled && controlledValue !== undefined && controlledValue !== baseDraft.text\n ? { ...baseDraft, text: controlledValue }\n : baseDraft;\n const modelRef = useRef(model);\n modelRef.current = model;\n const text = model.text;\n\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n const onDraftChangeRef = useRef(onDraftChange);\n onDraftChangeRef.current = onDraftChange;\n const persistRef = useRef(persistAttachment);\n persistRef.current = persistAttachment;\n\n /**\n * Apply a change to the draft. `notify` is false only for `setDraft`: a host\n * restoring a draft already knows what it set, and telling it would make every\n * restore look like the person typed — a \"dirty\" flag, a typing indicator, a\n * save that overwrites what was just loaded.\n */\n const commit = useCallback(\n (update: (current: PromptDraft) => PromptDraft, notify = true) => {\n const prev = modelRef.current;\n const next = update(prev);\n if (next === prev) return;\n modelRef.current = next;\n setInnerDraft(next);\n if (!notify) return;\n if (next.text !== prev.text) onChangeRef.current?.(next.text);\n onDraftChangeRef.current?.(next);\n },\n [],\n );\n\n const filesRef = useRef(new Map<string, File>());\n const placeholdersRef = useRef(new Map<string, File>());\n const requestedRef = useRef(new Set<string>());\n const [filesVersion, bumpFiles] = useReducer((n: number) => n + 1, 0);\n\n /** Record a ref from `persistAttachment` against whichever entry has `id`. */\n const setFileRef = useCallback(\n (id: string, fileRef: string) =>\n commit((m) => {\n const withRef = (f: PromptDraftFile) => (f.id === id ? { ...f, ref: fileRef } : f);\n if (!promptDraftFiles(m).some((f) => f.id === id)) return m;\n return {\n ...m,\n attachments: m.attachments.map(withRef),\n pills: m.pills.map((p) => (p.kind === \"image\" ? { ...p, file: withRef(p.file) } : p)),\n };\n }),\n [commit],\n );\n\n /**\n * Hand a newly attached file to the host's store. A synchronous handle is\n * returned so it lands in the same draft as the file; an async one updates the\n * draft when it arrives. A failing store loses the handle, never the attachment.\n */\n const persist = useCallback(\n (file: File, entry: PromptDraftFile): string | undefined => {\n const store = persistRef.current;\n if (!store) return undefined;\n let out: ReturnType<typeof store>;\n try {\n out = store(file, entry);\n } catch (error) {\n console.error(\"PromptInput: persistAttachment threw\", error);\n return undefined;\n }\n if (typeof out === \"string\") return out;\n if (out && typeof (out as Promise<unknown>).then === \"function\") {\n (out as Promise<string | undefined>).then(\n (fileRef) => {\n if (typeof fileRef === \"string\") setFileRef(entry.id, fileRef);\n },\n (error) => console.error(\"PromptInput: persistAttachment rejected\", error),\n );\n }\n return undefined;\n },\n [setFileRef],\n );\n\n const fileMeta = (id: string, file: File): PromptDraftFile => ({\n id,\n name: file.name,\n type: file.type,\n bytes: file.size,\n });\n\n /** A held image needs a File to show; a restored one without its bytes gets an empty stand-in. */\n const fileFor = useCallback((entry: PromptDraftFile): File => {\n const real = filesRef.current.get(entry.id);\n if (real) return real;\n let stand = placeholdersRef.current.get(entry.id);\n if (!stand) {\n stand = new File([], entry.name, { type: entry.type });\n placeholdersRef.current.set(entry.id, stand);\n }\n return stand;\n }, []);\n\n const heldPastes = useMemo<HeldPaste[]>(\n () =>\n model.pills.flatMap((p) =>\n p.kind === \"text\"\n ? [p.label !== undefined ? { id: p.id, text: p.text, label: p.label } : { id: p.id, text: p.text }]\n : [],\n ),\n [model.pills],\n );\n const heldImages = useMemo<HeldImage[]>(\n () =>\n model.pills.flatMap((p) =>\n p.kind === \"image\" ? [{ id: p.id, label: p.label, file: fileFor(p.file) }] : [],\n ),\n // filesVersion: a restored File arrived, so the stand-in can be swapped out.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [model.pills, fileFor, filesVersion],\n );\n\n const onHeldPastesChange = useCallback(\n (next: HeldPaste[]) =>\n commit((m) => {\n const current = m.pills.filter((p) => p.kind === \"text\");\n if (\n current.length === next.length &&\n current.every(\n (p, i) =>\n p.id === next[i]!.id &&\n p.kind === \"text\" &&\n p.text === next[i]!.text &&\n p.label === next[i]!.label,\n )\n ) {\n return m;\n }\n return {\n ...m,\n pills: [\n ...next.map(\n (p): PromptDraftPill =>\n p.label !== undefined\n ? { kind: \"text\", id: p.id, text: p.text, label: p.label }\n : { kind: \"text\", id: p.id, text: p.text },\n ),\n ...m.pills.filter((p) => p.kind === \"image\"),\n ],\n };\n }),\n [commit],\n );\n\n const onHeldImagesChange = useCallback(\n (next: HeldImage[]) =>\n commit((m) => {\n const before = new Map(\n m.pills.flatMap((p) => (p.kind === \"image\" ? [[p.id, p] as const] : [])),\n );\n if (before.size === next.length && next.every((i) => before.has(i.id))) return m;\n const images = next.map((image): PromptDraftPill => {\n const known = before.get(image.id);\n if (known && known.kind === \"image\") return known;\n // A new paste: its File is real, so keep it and offer it to the host.\n filesRef.current.set(image.id, image.file);\n const entry = fileMeta(image.id, image.file);\n const fileRef = persist(image.file, entry);\n return {\n kind: \"image\",\n id: image.id,\n label: image.label,\n file: fileRef === undefined ? entry : { ...entry, ref: fileRef },\n };\n });\n return { ...m, pills: [...m.pills.filter((p) => p.kind === \"text\"), ...images] };\n }),\n [commit, persist],\n );\n\n const editorRef = useRef<InlinePasteEditorHandle>(null);\n const paste = useInlinePaste({\n pasteThreshold,\n pasteImages,\n previewChars,\n renderPastePreview,\n classNames: pasteClassNames,\n disabled: false,\n heldPastes,\n onHeldPastesChange,\n heldImages,\n onHeldImagesChange,\n editorRef,\n });\n\n const attachments = useMemo<PromptAttachment[]>(\n () =>\n model.attachments.map((a) => ({\n id: a.id,\n name: a.name,\n bytes: a.bytes,\n file: filesRef.current.get(a.id),\n type: a.type,\n ...(a.ref !== undefined ? { ref: a.ref } : {}),\n })),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [model.attachments, filesVersion],\n );\n\n /*\n * Get Files back for entries that arrived without one — a restored draft, a\n * default draft, a controlled draft from storage. Each id is asked for once.\n */\n const restoreRef = useRef(restoreAttachment);\n restoreRef.current = restoreAttachment;\n useEffect(() => {\n const restore = restoreRef.current;\n if (!restore) return;\n for (const entry of promptDraftFiles(model)) {\n if (filesRef.current.has(entry.id) || requestedRef.current.has(entry.id)) continue;\n requestedRef.current.add(entry.id);\n const accept = (file: File | undefined) => {\n if (!(file instanceof Blob)) return;\n filesRef.current.set(entry.id, file as File);\n bumpFiles();\n };\n let out: ReturnType<typeof restore>;\n try {\n out = restore(entry);\n } catch (error) {\n console.error(\"PromptInput: restoreAttachment threw\", error);\n continue;\n }\n if (out && typeof (out as Promise<unknown>).then === \"function\") {\n (out as Promise<File | undefined>).then(accept, (error) =>\n console.error(\"PromptInput: restoreAttachment rejected\", error),\n );\n } else {\n accept(out as File | undefined);\n }\n }\n }, [model]);\n\n const setText = (next: string) => commit((m) => (m.text === next ? m : { ...m, text: next }));\n const [picker, setPicker] = useState<null | {\n kind: \"cmd\" | \"mention\";\n start: number;\n query: string;\n cursor: number;\n }>(null);\n const taRef = useRef<HTMLTextAreaElement>(null);\n const fileRef = useRef<HTMLInputElement>(null);\n const [dragOver, setDragOver] = useState(false);\n\n const colors = mentionColor ?? DEFAULT_MENTION_COLOR;\n\n /**\n * Resolved AFTER mount, never during render.\n *\n * `navigator` read during render disagrees with the server's HTML and\n * hydration patches it — so the fix for a wrong label would have introduced a\n * hydration mismatch instead. The first paint names `Ctrl`, which is\n * pressable on every platform including a Mac, and an Apple client swaps to\n * `⌘` on the next tick. A prop, when given, wins outright and no detection\n * runs at all.\n */\n const [detected, setDetected] = useState<FancyPlatform>(\"generic\");\n useEffect(() => {\n if (platform) return;\n setDetected(detectPlatform(browserPlatformHints()));\n }, [platform]);\n const modKey = modifierKeyLabel(platform ?? detected);\n\n const resolvedPlaceholder =\n placeholder ??\n `Ask anything. Type / for commands, @ for mentions. ${modKey}+Enter to send.`;\n\n // Estimated from what will actually be SENT — pills expanded — so a held\n // paste counts for its text, not for the few characters of its marker.\n const draftTokens = useMemo(\n () =>\n Math.ceil((inline ? paste.expand(text) : text).length / Math.max(1, charsPerToken)),\n [text, inline, paste, charsPerToken],\n );\n const tokens = (usedTokens ?? 0) + draftTokens;\n const ratio = Math.min(1, tokens / budgetTokens);\n const meterLevel: \"ok\" | \"caution\" | \"warn\" | \"muted\" | null =\n meter === \"hidden\"\n ? null\n : meter === \"near-limit\"\n ? ratio < meterShowAt\n ? null\n : ratio >= meterWarnAt\n ? \"warn\"\n : \"muted\"\n : ratio < 0.6\n ? \"ok\"\n : ratio < 0.85\n ? \"caution\"\n : \"warn\";\n const meterColor =\n meterLevel === \"ok\"\n ? \"#10b981\"\n : meterLevel === \"caution\"\n ? \"#f59e0b\"\n : meterLevel === \"warn\"\n ? \"#ef4444\"\n : \"#a1a1aa\";\n\n const filteredCmds = useMemo(\n () =>\n picker?.kind === \"cmd\"\n ? commands.filter((c) =>\n c.name.slice(1).toLowerCase().startsWith(picker.query.toLowerCase()),\n )\n : [],\n [picker, commands],\n );\n const filteredMentions = useMemo(\n () =>\n picker?.kind === \"mention\"\n ? mentions.filter((m) =>\n m.name.toLowerCase().includes(picker.query.toLowerCase()),\n )\n : [],\n [picker, mentions],\n );\n const items: Array<PromptCmd | PromptMention> =\n picker?.kind === \"cmd\"\n ? filteredCmds\n : picker?.kind === \"mention\"\n ? filteredMentions\n : [];\n\n useEffect(() => {\n const ta = taRef.current;\n if (!ta) return;\n ta.style.height = \"auto\";\n ta.style.height = Math.min(maxHeight, ta.scrollHeight) + \"px\";\n }, [text, maxHeight]);\n\n const updateText = (next: string, caret: number) => {\n setText(next);\n let triggerIdx = -1;\n let triggerKind: \"cmd\" | \"mention\" | null = null;\n for (let i = caret - 1; i >= 0; i--) {\n const ch = next[i];\n if (ch === \"@\") {\n triggerKind = \"mention\";\n triggerIdx = i;\n break;\n }\n if (ch === \"/\" && (i === 0 || /\\s/.test(next[i - 1] ?? \"\"))) {\n triggerKind = \"cmd\";\n triggerIdx = i;\n break;\n }\n if (/\\s/.test(ch)) break;\n }\n if (triggerKind !== null && triggerIdx >= 0) {\n const query = next.slice(triggerIdx + 1, caret);\n setPicker({ kind: triggerKind, start: triggerIdx, query, cursor: 0 });\n } else {\n setPicker(null);\n }\n };\n\n const insertChoice = (i: number) => {\n if (!picker || items.length === 0) return;\n const choice = items[i] ?? items[0];\n const insert =\n picker.kind === \"cmd\"\n ? (choice as PromptCmd).name + \" \"\n : `@${(choice as PromptMention).id} `;\n const before = text.slice(0, picker.start);\n const after = text.slice(picker.start + 1 + picker.query.length);\n const next = before + insert + after;\n setText(next);\n setPicker(null);\n if (inline) {\n // The editor rebuilds from the value and puts the caret back itself.\n editorRef.current?.setValue(next, before.length + insert.length);\n return;\n }\n requestAnimationFrame(() => {\n const ta = taRef.current;\n if (!ta) return;\n ta.focus();\n const pos = before.length + insert.length;\n ta.setSelectionRange(pos, pos);\n });\n };\n\n const submit = () => {\n // A message that is only a paste counts: its marker is in `text`.\n if (!text.trim() && attachments.length === 0) return;\n\n if (inline) {\n // Every pill goes out where it sits; pasted images join the attachments\n // in message order, with their Files, so a host sends them like any other.\n // A restored image without its bytes goes out with its `ref` and no `file`,\n // never with the empty stand-in that only exists so the pill can render.\n const pastedImages: PromptAttachment[] = paste.imagesIn(text).map((image) => {\n const entry = model.pills.find((p) => p.id === image.id);\n const meta = entry?.kind === \"image\" ? entry.file : fileMeta(image.id, image.file);\n return {\n id: image.id,\n name: meta.name,\n bytes: meta.bytes,\n file: filesRef.current.get(image.id),\n type: meta.type,\n ...(meta.ref !== undefined ? { ref: meta.ref } : {}),\n };\n });\n onSubmit(paste.expand(text), [...attachments, ...pastedImages]);\n } else {\n onSubmit(text, attachments);\n }\n // One commit for the whole reset, so a host saving on change sees one empty\n // draft rather than three half-empty ones.\n commit(() => EMPTY_DRAFT);\n filesRef.current.clear();\n placeholdersRef.current.clear();\n requestedRef.current.clear();\n setPicker(null);\n };\n\n /**\n * Focus requested by `setDraft(..., { focus: true })` waits for the render that\n * shows the draft: the inline editor rebuilds its DOM from the new value, which\n * would discard a caret placed before it. Children's layout effects run first,\n * so by the time this one runs the editor already holds the draft.\n */\n const pendingFocus = useRef(false);\n const focusInput = useCallback(() => {\n if (inline) {\n editorRef.current?.focus();\n return;\n }\n const ta = taRef.current;\n if (!ta) return;\n ta.focus();\n ta.setSelectionRange(ta.value.length, ta.value.length);\n }, [inline]);\n useLayoutEffect(() => {\n if (!pendingFocus.current) return;\n pendingFocus.current = false;\n focusInput();\n });\n\n useImperativeHandle(\n ref,\n () => ({\n getDraft: () => clonePromptDraft(modelRef.current),\n setDraft(next: PromptDraft, options?: PromptSetDraftOptions) {\n const read = readPromptDraft(next, inline);\n if (!read) {\n console.warn(\n \"PromptInput: setDraft ignored a draft it does not recognise (expected { v: 1, ... }).\",\n next,\n );\n return;\n }\n // Ask again for any File this draft needs that is not already held.\n for (const entry of promptDraftFiles(read)) {\n if (!filesRef.current.has(entry.id)) requestedRef.current.delete(entry.id);\n }\n setPicker(null);\n commit(() => read, false);\n // `commit` always sets state here (`read` is a new object), so a render\n // follows and the layout effect below picks the focus up.\n if (options?.focus) pendingFocus.current = true;\n },\n focus: focusInput,\n }),\n [inline, commit, focusInput],\n );\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLElement>) => {\n if (picker) {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setPicker((p) =>\n p ? { ...p, cursor: Math.min(items.length - 1, p.cursor + 1) } : p,\n );\n return;\n }\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setPicker((p) => (p ? { ...p, cursor: Math.max(0, p.cursor - 1) } : p));\n return;\n }\n // Tab completes, as Enter does: the autocomplete key people expect from a\n // shell or Claude Code. Only while a menu is open; otherwise Tab moves\n // focus as usual.\n if (((e.key === \"Enter\" && !e.metaKey && !e.ctrlKey) || (e.key === \"Tab\" && !e.shiftKey)) && items.length > 0) {\n e.preventDefault();\n insertChoice(picker.cursor);\n return;\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n setPicker(null);\n return;\n }\n }\n if (e.key === \"Enter\" && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n submit();\n }\n };\n\n /**\n * Build attachments from a FileList, KEEPING the File.\n *\n * Shared by the drop handler and the picker so the two cannot drift — the\n * picker being a second, subtly different copy of this is exactly how one of\n * them would end up dropping the File again.\n */\n const attach = (list: FileList | File[] | null) => {\n const files = Array.from(list ?? []);\n if (files.length === 0) return;\n\n const added = files.map((f) => {\n const id = crypto.randomUUID();\n filesRef.current.set(id, f);\n const entry = fileMeta(id, f);\n const fileRef = persist(f, entry);\n return fileRef === undefined ? entry : { ...entry, ref: fileRef };\n });\n commit((m) => ({ ...m, attachments: [...m.attachments, ...added] }));\n };\n\n const onDrop = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n setDragOver(false);\n attach(e.dataTransfer.files);\n };\n\n /**\n * Paste a screenshot, get an attachment.\n *\n * There was no paste handler at all, so a pasted image did nothing — no chip,\n * no error — and a host that had swapped its own paste-capable textarea for\n * this component lost the feature without noticing.\n *\n * Files attach only when the clipboard carries NO plain text. Word, Excel and\n * most editors put a picture of the selection beside the text; attaching that\n * would turn every pasted sentence into a screenshot of the sentence. A pure\n * image paste has nothing for the browser to insert, so the default is\n * prevented only then, and a text paste is never touched.\n */\n const onPaste = (e: React.ClipboardEvent<HTMLTextAreaElement>) => {\n const data = e.clipboardData;\n const files = Array.from(data?.files ?? []);\n\n if (files.length === 0 || (data?.getData(\"text/plain\") ?? \"\") !== \"\") return;\n\n e.preventDefault();\n attach(files);\n };\n\n return (\n <div\n // Spread FIRST so an internal handler or data attribute cannot be\n // clobbered from outside, and so a missing one fails loudly here rather\n // than at a consumer's selector. `className` is merged below instead.\n {...rest}\n // The component had no root handle at all, so an agent reading the\n // composer had to guess at classes. The drag state is on it too: a bridge\n // that wants to know whether a drop is in flight should not have to infer\n // it from Tailwind colours.\n data-react-fancy-prompt-input=\"\"\n data-react-fancy-prompt-input-drag={dragOver ? \"over\" : \"idle\"}\n onDragOver={(e) => {\n e.preventDefault();\n setDragOver(true);\n }}\n onDragLeave={() => setDragOver(false)}\n onDrop={onDrop}\n className={cn(\n \"relative rounded-md border bg-[color:var(--fancy-surface,var(--color-white))] transition dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\",\n dragOver\n ? \"border-violet-400 bg-violet-50/50 dark:border-violet-600 dark:bg-violet-950/30\"\n : \"border-zinc-200 dark:border-zinc-800\",\n className,\n )}\n >\n {aboveInput && (\n <div className=\"border-b border-zinc-200 dark:border-zinc-800\">\n {aboveInput}\n </div>\n )}\n {attachments.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5 border-b border-zinc-200 px-3 py-2 dark:border-zinc-800\">\n {attachments.map((a) => (\n <span\n key={a.id}\n // Stable handle per chip, so a host or agent can address one\n // attachment without guessing at markup.\n data-react-fancy-prompt-input-attachment={a.id}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] px-2 py-0.5 text-[11px] dark:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]\"\n >\n <Icon name=\"paperclip\" size=\"xs\" className=\"text-zinc-400\" />\n <span className=\"font-mono\">{a.name}</span>\n <span className=\"text-zinc-400\">{fmtSize(a.bytes)}</span>\n <button\n onClick={() =>\n commit((m) => ({\n ...m,\n attachments: m.attachments.filter((x) => x.id !== a.id),\n }))\n }\n className=\"opacity-50 hover:opacity-100\"\n aria-label=\"Remove attachment\"\n >\n ×\n </button>\n </span>\n ))}\n </div>\n )}\n\n <div className=\"relative\">\n {inline ? (\n <>\n <InlinePasteEditor\n ref={editorRef}\n value={text}\n known={paste.known}\n onChange={(next, caret) => {\n updateText(next, caret);\n paste.prune(next);\n }}\n onSubmit={submit}\n submitKey=\"mod-enter\"\n onKeyDown={onKeyDown}\n onPaste={paste.decidePaste}\n onHostsChange={paste.onHostsChange}\n placeholder={resolvedPlaceholder}\n disabled={false}\n maxHeight={maxHeight}\n placeholderClassName=\"left-3 top-2.5 text-[14px] leading-relaxed\"\n className={cn(\n \"block min-h-[5.5rem] px-3 py-2.5 text-[14px] leading-relaxed\",\n pasteClassNames?.input,\n )}\n />\n {paste.portals}\n {pasteImages && pasteFilesName && (\n <PastedFilesInput\n name={pasteFilesName}\n files={paste\n .imagesIn(text)\n .flatMap((i) => (filesRef.current.has(i.id) ? [i.file] : []))}\n />\n )}\n </>\n ) : (\n <textarea\n ref={taRef}\n value={text}\n onChange={(e) => updateText(e.target.value, e.target.selectionStart)}\n onKeyDown={onKeyDown}\n onPaste={onPaste}\n placeholder={resolvedPlaceholder}\n spellCheck={false}\n className=\"block w-full resize-none bg-transparent px-3 py-2.5 text-[14px] leading-relaxed outline-none placeholder:text-zinc-400\"\n rows={3}\n />\n )}\n\n {picker && items.length > 0 && (\n <div className=\"absolute bottom-full left-2 z-10 mb-1 w-72 overflow-hidden rounded-md border border-[color:var(--fancy-border,var(--color-zinc-200))] bg-[color:var(--fancy-surface,var(--color-white))] shadow-lg dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\">\n <div className=\"border-b border-zinc-100 bg-zinc-50 px-2 py-1 text-[10px] font-semibold uppercase tracking-wider text-zinc-500 dark:border-zinc-800 dark:bg-zinc-950\">\n {picker.kind === \"cmd\" ? \"Commands\" : \"Mention\"} · {items.length}\n </div>\n <ul className=\"max-h-56 overflow-y-auto\">\n {items.map((item, i) => {\n const active = i === picker.cursor;\n if (picker.kind === \"cmd\") {\n const c = item as PromptCmd;\n return (\n <li\n key={c.name}\n onMouseDown={(e) => {\n e.preventDefault();\n insertChoice(i);\n }}\n onMouseEnter={() =>\n setPicker((p) => (p ? { ...p, cursor: i } : p))\n }\n className={`cursor-pointer px-2 py-1.5 text-[12px] ${\n active\n ? \"bg-violet-100 dark:bg-violet-900/30\"\n : \"hover:bg-zinc-50 dark:hover:bg-zinc-800\"\n }`}\n >\n <div className=\"font-mono font-medium text-violet-700 dark:text-violet-300\">\n {c.name}\n </div>\n <div className=\"text-[11px] text-zinc-500\">{c.hint}</div>\n </li>\n );\n }\n const m = item as PromptMention;\n return (\n <li\n key={m.id}\n onMouseDown={(e) => {\n e.preventDefault();\n insertChoice(i);\n }}\n onMouseEnter={() =>\n setPicker((p) => (p ? { ...p, cursor: i } : p))\n }\n className={`flex cursor-pointer items-center gap-2 px-2 py-1.5 text-[12px] ${\n active\n ? \"bg-violet-100 dark:bg-violet-900/30\"\n : \"hover:bg-zinc-50 dark:hover:bg-zinc-800\"\n }`}\n >\n <span\n className=\"h-2 w-2 rounded-full\"\n style={{ backgroundColor: colors[m.kind] ?? \"#71717a\" }}\n />\n <span className=\"font-medium\">{m.name}</span>\n <span className=\"ml-auto text-[10px] uppercase tracking-wider text-zinc-400\">\n {m.kind}\n </span>\n </li>\n );\n })}\n </ul>\n </div>\n )}\n </div>\n\n <div className=\"flex items-center gap-2 border-t border-zinc-200 bg-zinc-50/60 px-3 py-2 dark:border-zinc-800 dark:bg-zinc-900/40\">\n <Tooltip content={attachButton === \"icon\" ? \"Attach files — or drop them here\" : \"Drop files here, or click\"}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n icon=\"paperclip\"\n className=\"shrink-0\"\n data-react-fancy-prompt-input-attach=\"\"\n // An icon alone has no name; the tooltip is not one a screen reader reads.\n aria-label={attachButton === \"icon\" ? \"Attach files\" : undefined}\n onClick={() => fileRef.current?.click()}\n >\n {attachButton === \"icon\" ? null : \"attach\"}\n </Button>\n </Tooltip>\n {/*\n The button above shipped with a no-op onClick and a tooltip reading\n \"Drop files here, or click\" — an affordance that lied. Drop-only also\n meant keyboard and touch users could not attach at all.\n\n It then shipped with a literal paperclip EMOJI as its icon, which\n needs a COLOUR\n EMOJI FONT — not merely broad coverage — so a lean container renders a\n tofu box where the affordance should be. `icon=\"paperclip\"` draws an\n SVG from the kit's own icon layer, which is the same reason the rest of\n the suite does not hand-roll iconography.\n */}\n <input\n ref={fileRef}\n type=\"file\"\n multiple\n className=\"hidden\"\n onChange={(e) => {\n attach(e.target.files);\n // Let the same file be picked twice in a row.\n e.target.value = \"\";\n }}\n />\n {meterLevel !== null && (\n <div\n data-react-fancy-prompt-input-meter=\"\"\n data-level={meterLevel}\n className=\"ml-2 flex min-w-0 items-center gap-1.5 overflow-hidden\"\n >\n <div className=\"h-1.5 w-24 shrink overflow-hidden rounded-full bg-[color:var(--fancy-border,var(--color-zinc-200))] dark:bg-[color:var(--fancy-border-dark,var(--color-zinc-700))]\">\n <div\n className=\"h-full rounded-full transition-all\"\n style={{ width: `${ratio * 100}%`, backgroundColor: meterColor }}\n />\n </div>\n <span className=\"font-mono text-[11px]\" style={{ color: meterColor }}>\n {fmtTokens(tokens)} / {fmtTokens(budgetTokens)}\n </span>\n </div>\n )}\n <div className=\"ml-auto flex shrink-0 items-center gap-2\">\n {/* With an icon send button the shortcut lives in its tooltip instead. */}\n {showHint && sendButton !== \"icon\" && (\n <span\n className=\"hidden text-[10px] text-zinc-500 sm:inline\"\n data-react-fancy-prompt-input-hint={modKey === \"⌘\" ? \"apple\" : \"generic\"}\n >\n <kbd className=\"rounded border border-[color:var(--fancy-border-strong,var(--color-zinc-300))] bg-zinc-50 px-1 py-0.5 font-mono text-[9px] text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:border-[color:var(--fancy-border-strong-dark,var(--color-zinc-700))] dark:bg-zinc-800 dark:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))]\">\n {modKey}\n </kbd>{\" \"}\n +{\" \"}\n <kbd className=\"rounded border border-[color:var(--fancy-border-strong,var(--color-zinc-300))] bg-zinc-50 px-1 py-0.5 font-mono text-[9px] text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:border-[color:var(--fancy-border-strong-dark,var(--color-zinc-700))] dark:bg-zinc-800 dark:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))]\">\n Enter\n </kbd>{\" \"}\n to send\n </span>\n )}\n {sendButton === \"icon\" ? (\n <Tooltip content={`Send · ${modKey}+Enter`}>\n <Button\n color=\"violet\"\n size=\"sm\"\n icon=\"arrow-up\"\n className=\"shrink-0\"\n data-react-fancy-prompt-input-send=\"\"\n aria-label=\"Send\"\n onClick={submit}\n />\n </Tooltip>\n ) : (\n <Button\n color=\"violet\"\n size=\"sm\"\n iconTrailing=\"arrow-right\"\n className=\"shrink-0\"\n data-react-fancy-prompt-input-send=\"\"\n onClick={submit}\n >\n send\n </Button>\n )}\n </div>\n </div>\n </div>\n );\n});\n\nfunction fmtTokens(n: number): string {\n if (n < 1000) return `${n}`;\n return `${(n / 1000).toFixed(1)}k`;\n}\n\nfunction fmtSize(b: number): string {\n if (b < 1024) return `${b} B`;\n if (b < 1024 * 1024) return `${(b / 1024).toFixed(0)} KB`;\n return `${(b / 1024 / 1024).toFixed(1)} MB`;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/JsonEditor/JsonEditor.paths.ts","../src/components/JsonEditor/JsonEditor.types.ts","../src/components/JsonEditor/JsonEditor.keymap.ts","../src/components/JsonEditor/JsonEditor.context.ts","../src/components/JsonEditor/JsonEditorValue.tsx","../src/components/JsonEditor/JsonEditorRow.tsx","../src/components/JsonEditor/JsonEditor.tsx"],"names":["resolveOption","createContext","useContext","jsx","Switch","Select","DatePicker","ColorPicker","Textarea","Input","useInlineEdit","DisplayValue","jsxs","cn","Button","Text","Badge","Fragment","useState","forwardRef","JsonEditor","useId","useRef","useMemo","useEffect","useCallback","Callout","issue"],"mappings":"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","file":"chunk-U5LKNGHU.cjs","sourcesContent":["import type {\n JsonArray,\n JsonEditorEdit,\n JsonObject,\n JsonPath,\n JsonValue,\n} from \"./JsonEditor.types\";\n\n// ---------------------------------------------------------------------------\n// Paths\n//\n// The wire form of a path is a dotted string — `user.address.city`,\n// `orders.0.total` — because that is what fits in a `data-*` attribute, a\n// keyMap key, an MCP tool argument, and a log line. `.` separates segments and\n// `\\` escapes, so a key that genuinely contains a dot is still addressable\n// (`meta.a\\.b` is `[\"meta\", \"a.b\"]`, not three segments).\n// ---------------------------------------------------------------------------\n\nexport function isJsonObject(value: JsonValue | undefined): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function isJsonArray(value: JsonValue | undefined): value is JsonArray {\n return Array.isArray(value);\n}\n\nexport function isContainerValue(value: JsonValue | undefined): boolean {\n return isJsonObject(value) || isJsonArray(value);\n}\n\n/** Split a dotted path into segments, honouring `\\.` and `\\\\`. */\nexport function parsePath(path: string): JsonPath {\n if (!path) return [];\n\n const segments: string[] = [];\n let current = \"\";\n let escaped = false;\n\n for (const char of path) {\n if (escaped) {\n current += char;\n escaped = false;\n continue;\n }\n if (char === \"\\\\\") {\n escaped = true;\n continue;\n }\n if (char === \".\") {\n segments.push(current);\n current = \"\";\n continue;\n }\n current += char;\n }\n // A trailing lone backslash is a typo, not a separator — keep it literal\n // rather than throwing on a half-typed path.\n if (escaped) current += \"\\\\\";\n segments.push(current);\n\n return segments;\n}\n\n/** The inverse of {@link parsePath}. */\nexport function pathToString(segments: JsonPath): string {\n return segments\n .map((segment) => segment.replace(/\\\\/g, \"\\\\\\\\\").replace(/\\./g, \"\\\\.\"))\n .join(\".\");\n}\n\nexport function getAtPath(value: JsonValue, segments: JsonPath): JsonValue | undefined {\n let current: JsonValue | undefined = value;\n\n for (const segment of segments) {\n if (isJsonArray(current)) {\n const index = Number(segment);\n if (!Number.isInteger(index)) return undefined;\n current = current[index];\n } else if (isJsonObject(current)) {\n if (!Object.prototype.hasOwnProperty.call(current, segment)) return undefined;\n current = current[segment];\n } else {\n return undefined;\n }\n if (current === undefined) return undefined;\n }\n\n return current;\n}\n\n/**\n * Rebuild `value` with `updater` applied to the container at `segments`,\n * cloning only the containers along that path. Returns the original reference\n * when the path does not resolve, so a no-op edit is detectable by identity.\n */\nfunction updateContainer(\n value: JsonValue,\n segments: JsonPath,\n updater: (container: JsonObject | JsonArray) => JsonObject | JsonArray | undefined,\n): JsonValue {\n if (segments.length === 0) {\n if (!isContainerValue(value)) return value;\n const next = updater(value as JsonObject | JsonArray);\n return next === undefined ? value : next;\n }\n\n const [head, ...rest] = segments as [string, ...string[]];\n\n if (isJsonArray(value)) {\n const index = Number(head);\n if (!Number.isInteger(index) || index < 0 || index >= value.length) return value;\n const child = updateContainer(value[index]!, rest, updater);\n if (child === value[index]) return value;\n const clone = value.slice();\n clone[index] = child;\n return clone;\n }\n\n if (isJsonObject(value)) {\n if (!Object.prototype.hasOwnProperty.call(value, head)) return value;\n const child = updateContainer(value[head]!, rest, updater);\n if (child === value[head]) return value;\n return { ...value, [head]: child };\n }\n\n return value;\n}\n\n/**\n * Apply one {@link JsonEditorEdit} and return a NEW document.\n *\n * Pure and total: an edit that cannot be applied — a path that does not exist,\n * a rename onto an occupied key, an insert without a key into an object —\n * returns the input unchanged rather than throwing or half-applying. The\n * component checks those cases first and raises an issue; this function is the\n * backstop for the same op arriving from a bridge, where there is no UI to warn.\n */\nexport function applyJsonEdit(value: JsonValue, edit: JsonEditorEdit): JsonValue {\n const segments = parsePath(edit.path);\n\n switch (edit.op) {\n case \"set\": {\n // An empty path is the document itself.\n if (segments.length === 0) return edit.value;\n\n const parent = segments.slice(0, -1);\n const key = segments[segments.length - 1]!;\n\n return updateContainer(value, parent, (container) => {\n if (isJsonArray(container)) {\n const index = Number(key);\n if (!Number.isInteger(index) || index < 0 || index >= container.length) return undefined;\n const clone = container.slice();\n clone[index] = edit.value;\n return clone;\n }\n return { ...container, [key]: edit.value };\n });\n }\n\n case \"remove\": {\n if (segments.length === 0) return value;\n\n const parent = segments.slice(0, -1);\n const key = segments[segments.length - 1]!;\n\n return updateContainer(value, parent, (container) => {\n if (isJsonArray(container)) {\n const index = Number(key);\n if (!Number.isInteger(index) || index < 0 || index >= container.length) return undefined;\n return container.filter((_, i) => i !== index);\n }\n if (!Object.prototype.hasOwnProperty.call(container, key)) return undefined;\n const clone: JsonObject = {};\n for (const [k, v] of Object.entries(container)) {\n if (k !== key) clone[k] = v;\n }\n return clone;\n });\n }\n\n case \"rename\": {\n if (segments.length === 0) return value;\n\n const parent = segments.slice(0, -1);\n const key = segments[segments.length - 1]!;\n\n return updateContainer(value, parent, (container) => {\n // Array indices are positional, not names — reorder is `move`.\n if (!isJsonObject(container)) return undefined;\n if (!Object.prototype.hasOwnProperty.call(container, key)) return undefined;\n if (edit.key === key) return undefined;\n // Renaming onto a live sibling would silently destroy it.\n if (Object.prototype.hasOwnProperty.call(container, edit.key)) return undefined;\n\n // Rebuilt in order: `delete` + re-add would move the key to the end,\n // which reads as the row jumping down the list for no reason.\n const clone: JsonObject = {};\n for (const [k, v] of Object.entries(container)) {\n clone[k === key ? edit.key : k] = v;\n }\n return clone;\n });\n }\n\n case \"insert\": {\n return updateContainer(value, segments, (container) => {\n if (isJsonArray(container)) return [...container, edit.value];\n if (edit.key === undefined || edit.key === \"\") return undefined;\n if (Object.prototype.hasOwnProperty.call(container, edit.key)) return undefined;\n return { ...container, [edit.key]: edit.value };\n });\n }\n\n case \"move\": {\n if (segments.length === 0) return value;\n\n const parent = segments.slice(0, -1);\n const from = Number(segments[segments.length - 1]);\n\n return updateContainer(value, parent, (container) => {\n if (!isJsonArray(container)) return undefined;\n if (!Number.isInteger(from) || from < 0 || from >= container.length) return undefined;\n const to = Math.min(Math.max(edit.to, 0), container.length - 1);\n if (to === from) return undefined;\n const clone = container.slice();\n const [moved] = clone.splice(from, 1);\n clone.splice(to, 0, moved!);\n return clone;\n });\n }\n }\n}\n\n/** A one-line summary of an edit, for the pending strip and activity events. */\nexport function describeEdit(edit: JsonEditorEdit): string {\n const at = edit.path === \"\" ? \"the document\" : edit.path;\n switch (edit.op) {\n case \"set\":\n return `set ${at}`;\n case \"remove\":\n return `remove ${at}`;\n case \"rename\":\n return `rename ${at} to ${edit.key}`;\n case \"insert\":\n return edit.key === undefined ? `append to ${at}` : `add ${edit.key} to ${at}`;\n case \"move\":\n return `move ${at} to index ${edit.to}`;\n }\n}\n","import type { HTMLAttributes } from \"react\";\nimport type { InputOption } from \"../inputs/inputs.types\";\nimport type { FieldMode } from \"../inputs/inputs.types\";\nimport type { Size } from \"../../utils/types\";\n\n// ---------------------------------------------------------------------------\n// JSON\n// ---------------------------------------------------------------------------\n\nexport type JsonPrimitive = string | number | boolean | null;\n\nexport interface JsonObject {\n [key: string]: JsonValue;\n}\n\nexport type JsonArray = JsonValue[];\n\nexport type JsonValue = JsonPrimitive | JsonObject | JsonArray;\n\n/**\n * A location inside a JSON document, one array element per segment. Array\n * indices are decimal STRINGS (`[\"orders\", \"0\", \"total\"]`) so a path is a plain\n * `string[]` an agent can emit without a tagged union, and so object keys and\n * array indices are addressed identically.\n *\n * The wire form is the dotted string produced by `pathToString` — see\n * `JsonEditor.paths.ts` for the escaping rule.\n */\nexport type JsonPath = string[];\n\n// ---------------------------------------------------------------------------\n// Declared types\n// ---------------------------------------------------------------------------\n\n/**\n * The data types a `keyMap` can impose on a JSON value.\n *\n * Each one owes BOTH a read-only representation and an edit control — that\n * pairing is the whole point of the feature, so a type with no distinct input\n * does not earn a place here.\n *\n * `json` is the escape hatch: it matches any value and edits as raw text, which\n * is how a sub-document opts out of the row-per-key treatment.\n */\nexport const JSON_FIELD_TYPES = [\n \"string\",\n \"text\",\n \"number\",\n \"integer\",\n \"boolean\",\n \"date\",\n \"datetime\",\n \"enum\",\n \"secret\",\n \"url\",\n \"email\",\n \"color\",\n \"json\",\n \"object\",\n \"array\",\n] as const;\n\nexport type JsonFieldType = (typeof JSON_FIELD_TYPES)[number];\n\n/**\n * The long form of a `keyMap` entry. The short form — a bare type name — is\n * sugar for `{ type }`.\n */\nexport interface JsonKeyRule {\n type: JsonFieldType;\n /** Overrides the raw key as the row's label. */\n label?: string;\n /** Choices for `type: \"enum\"`. Required there; ignored elsewhere. */\n options?: InputOption[];\n /** Render the value but never offer a control for it. */\n readOnly?: boolean;\n /** The key must be present. Only enforced on wildcard-free patterns. */\n required?: boolean;\n description?: string;\n placeholder?: string;\n /** Forwarded to the control for `number` / `integer` / `date` / `datetime`. */\n min?: number | string;\n max?: number | string;\n}\n\n/** One compiled `keyMap` entry: a path pattern plus the rule it imposes. */\nexport interface JsonKeyMapEntry {\n /** Path pattern; a `\"*\"` segment matches any single key or index. */\n pattern: JsonPath;\n rule: JsonKeyRule;\n /** The key exactly as written in the `keyMap`, for error messages. */\n source: string;\n /** Non-wildcard segment count — the specificity score. */\n literals: number;\n /** Declaration order, the tie-breaker at equal specificity. */\n order: number;\n}\n\nexport interface ParsedKeyMap {\n /**\n * `false` only when the STRING itself was unusable (unparseable, or valid\n * JSON of the wrong shape). Individual bad rules leave this `true` — they are\n * reported and skipped so one typo cannot silently disable a whole map.\n */\n ok: boolean;\n rules: JsonKeyMapEntry[];\n issues: JsonEditorIssue[];\n}\n\n// ---------------------------------------------------------------------------\n// Issues\n// ---------------------------------------------------------------------------\n\n/**\n * Everything the editor knows to be wrong, in one shape.\n *\n * A typing feature that silently stops typing things is worse than no typing at\n * all, because the caller believes the constraint is in force. So a broken\n * `keyMap`, a broken rule inside a working one, and a value that contradicts\n * its declared type all surface through the SAME channel — the panel, the\n * `data-issues` count, and `onIssuesChange`.\n */\nexport interface JsonEditorIssue {\n /**\n * - `keymap` — the `keyMap` string could not be used at all.\n * - `rule` — one entry in an otherwise-usable map is malformed.\n * - `type` — a value contradicts the type declared for its path.\n * - `edit` — a structural edit was refused (duplicate key, and the like).\n */\n kind: \"keymap\" | \"rule\" | \"type\" | \"edit\";\n /** Dotted path; `\"\"` for the `keyMap` as a whole. */\n path: string;\n message: string;\n /** The declared type, when the issue has one. */\n expected?: JsonFieldType;\n /** What the value actually is: `\"string\"`, `\"array\"`, `\"null\"`, … */\n actual?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Edits\n// ---------------------------------------------------------------------------\n\n/**\n * One mutation, as data.\n *\n * Every change the UI makes is expressed as one of these and applied through\n * `applyJsonEdit`, which means an MCP bridge can replay exactly what a human\n * did — and `pendingMode` can hold one in a queue instead of applying it —\n * without a second code path.\n */\nexport type JsonEditorEditBase = {\n id?: string;\n /** Human-readable summary, used by the pending strip. */\n label?: string;\n};\n\nexport type JsonEditorEdit =\n | (JsonEditorEditBase & { op: \"set\"; path: string; value: JsonValue })\n | (JsonEditorEditBase & { op: \"remove\"; path: string })\n | (JsonEditorEditBase & { op: \"rename\"; path: string; key: string })\n /** `path` is the CONTAINER. `key` is required for an object, ignored for an array. */\n | (JsonEditorEditBase & { op: \"insert\"; path: string; key?: string; value: JsonValue })\n /** `path` is the element; `to` is its new index in the same array. */\n | (JsonEditorEditBase & { op: \"move\"; path: string; to: number });\n\nexport type JsonEditorPendingEdit = JsonEditorEdit & { id: string };\n\nexport interface JsonEditorActivity {\n /** `commit` — applied to the document. `stage` / `accept` / `reject` — pending flow. */\n type: \"commit\" | \"stage\" | \"accept\" | \"reject\";\n edit: JsonEditorEdit;\n}\n\n// ---------------------------------------------------------------------------\n// Rows\n// ---------------------------------------------------------------------------\n\n/** One rendered key/value row — also the unit a bridge would address. */\nexport interface JsonEditorNode {\n path: JsonPath;\n /** `pathToString(path)`; `\"\"` for a scalar root. */\n dotted: string;\n /** The last segment: an object key or an array index. */\n key: string;\n depth: number;\n value: JsonValue;\n parentKind: \"object\" | \"array\" | \"root\";\n /** The rule that matched, if any. */\n rule?: JsonKeyRule;\n /** Declared type if a rule matched, otherwise inferred from the value. */\n type: JsonFieldType;\n declared: boolean;\n /** Renders as a collapsible branch rather than a value. */\n container: boolean;\n childCount: number;\n /** Set when the value contradicts its declared type. */\n conflict?: JsonEditorIssue;\n}\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface JsonEditorProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\" | \"defaultValue\"> {\n /** The document. Controlled — the editor keeps no copy of it. */\n value: JsonValue;\n /**\n * Called with the WHOLE next document plus the edit that produced it. The\n * edit is what a bridge would log, replay, or undo.\n */\n onChange?: (value: JsonValue, edit: JsonEditorEdit) => void;\n /**\n * Type declarations, as a **JSON string** — not an object, and an object is\n * NOT accepted as a convenience overload.\n *\n * A string survives every boundary this prop actually crosses: an MCP tool\n * argument, a config column, a `data-*` attribute, a form field. A live\n * object survives none of them, so accepting both would make the documented\n * form the second-class one in practice.\n *\n * ```jsonc\n * {\n * \"user.age\": \"number\", // short form: a bare type name\n * \"tags.*\": \"string\", // every element of an array\n * \"orders.*.total\": \"number\",\n * \"role\": { \"type\": \"enum\", \"options\": [\"admin\", \"member\"] }\n * }\n * ```\n *\n * Malformed input is never thrown and never silently ignored — see\n * {@link JsonEditorIssue}.\n */\n keyMap?: string | null;\n /**\n * `\"view\"` (the default here) renders values as text that turns into the\n * typed control when clicked; `\"edit\"` renders every control at once.\n *\n * The kit default is `\"edit\"`, and this component deliberately differs: a\n * forty-key document drawn as forty boxed inputs is not a document you can\n * read, and reading is most of what a JSON editor is for.\n */\n mode?: FieldMode;\n size?: Size;\n /** Show every value, offer no control. Overrides `mode` and every `allow*`. */\n readOnly?: boolean;\n /**\n * Dotted paths of the expanded containers. Omit BOTH this and\n * `defaultExpanded` to expand everything (pass `defaultExpanded={[]}` for a\n * large document).\n */\n expanded?: string[];\n defaultExpanded?: string[];\n onExpandedChange?: (expanded: string[]) => void;\n /** Render the issues panel. The `data-issues` count and `onIssuesChange` are unaffected. */\n showIssues?: boolean;\n onIssuesChange?: (issues: JsonEditorIssue[]) => void;\n /**\n * Trust-but-verify. With this on, an edit is STAGED into `pending` instead of\n * being applied: `onChange` does not fire until a human accepts it.\n */\n pendingMode?: boolean;\n /** Staged edits. Controlled, so an agent's proposals are inspectable. */\n pending?: JsonEditorPendingEdit[];\n onPendingChange?: (pending: JsonEditorPendingEdit[]) => void;\n /** Every mutation, staged or applied — the hook presence / undo layers listen on. */\n onActivity?: (event: JsonEditorActivity) => void;\n allowAdd?: boolean;\n allowRemove?: boolean;\n allowRename?: boolean;\n allowReorder?: boolean;\n /** Label for a scalar root document. Default `\"value\"`. */\n rootLabel?: string;\n /** Shown when the document has no keys. */\n emptyLabel?: string;\n /** Prefix for generated control ids — `<idPrefix>-<dotted path>`. */\n idPrefix?: string;\n}\n","import { resolveOption } from \"../inputs/inputs.utils\";\nimport {\n getAtPath,\n isJsonArray,\n isJsonObject,\n parsePath,\n pathToString,\n} from \"./JsonEditor.paths\";\nimport { JSON_FIELD_TYPES } from \"./JsonEditor.types\";\nimport type {\n JsonEditorIssue,\n JsonFieldType,\n JsonKeyMapEntry,\n JsonKeyRule,\n JsonPath,\n JsonValue,\n ParsedKeyMap,\n} from \"./JsonEditor.types\";\n\n// ---------------------------------------------------------------------------\n// The keyMap\n//\n// Shape: a FLAT object whose keys are dotted path patterns and whose values are\n// either a bare type name or a rule object.\n//\n// { \"user.age\": \"number\", \"orders.*.total\": \"number\", \"tags.*\": \"string\" }\n//\n// Why flat paths rather than a nested mirror of the data:\n//\n// - A nested mirror is ambiguous the moment a key needs a type AND typed\n// children — `{\"user\": {\"age\": \"number\"}}` could mean either, and resolving\n// it needs a magic key (`$type`) that a flat map does not.\n// - Arrays force a wildcard into a nested mirror anyway, so the mirror buys\n// nothing there and costs a level of nesting per segment.\n// - One rule per line is greppable, diffable and reviewable, which matters\n// when the map arrives as a string from an agent or a config column.\n// - It is sparse by construction: you declare the keys you care about, and\n// everything else is inferred from the value.\n//\n// A `*` segment matches exactly one key or index. There is deliberately no\n// `**`: \"any depth\" makes two patterns overlap in ways that are hard to reason\n// about, and every case we had for it was really \"this array's elements\".\n// ---------------------------------------------------------------------------\n\nconst TYPE_NAMES = new Set<string>(JSON_FIELD_TYPES);\n\nfunction isTypeName(value: unknown): value is JsonFieldType {\n return typeof value === \"string\" && TYPE_NAMES.has(value);\n}\n\nfunction issue(kind: JsonEditorIssue[\"kind\"], path: string, message: string): JsonEditorIssue {\n return { kind, path, message };\n}\n\n/**\n * Compile a `keyMap` JSON **string**.\n *\n * Never throws. Two failure modes, deliberately distinct:\n *\n * - The string itself is unusable (not JSON, or JSON that is not an object) —\n * `ok: false`, no rules, one `keymap` issue. The caller must show this: an\n * editor that quietly runs untyped is worse than one that refuses, because\n * the person editing believes the constraint is in force.\n * - One entry is malformed — `ok: true`, that entry dropped, one `rule` issue.\n * A typo in `orders.*.totl` must not disable the other forty rules.\n */\nexport function parseKeyMap(source?: string | null): ParsedKeyMap {\n if (source === undefined || source === null || source.trim() === \"\") {\n return { ok: true, rules: [], issues: [] };\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(source);\n } catch (error) {\n return {\n ok: false,\n rules: [],\n issues: [\n issue(\n \"keymap\",\n \"\",\n `keyMap is not valid JSON: ${error instanceof Error ? error.message : String(error)}`,\n ),\n ],\n };\n }\n\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n return {\n ok: false,\n rules: [],\n issues: [\n issue(\n \"keymap\",\n \"\",\n `keyMap must be a JSON object of path → type, got ${describeValue(parsed as JsonValue)}.`,\n ),\n ],\n };\n }\n\n const rules: JsonKeyMapEntry[] = [];\n const issues: JsonEditorIssue[] = [];\n let order = 0;\n\n for (const [key, raw] of Object.entries(parsed as Record<string, unknown>)) {\n const rule = normalizeRule(key, raw, issues);\n if (!rule) continue;\n\n const pattern = parsePath(key);\n rules.push({\n pattern,\n rule,\n source: key,\n literals: pattern.reduce((n, segment) => n + (segment === \"*\" ? 0 : 1), 0),\n order: order++,\n });\n }\n\n return { ok: true, rules, issues };\n}\n\nfunction normalizeRule(\n key: string,\n raw: unknown,\n issues: JsonEditorIssue[],\n): JsonKeyRule | undefined {\n let candidate: Record<string, unknown>;\n\n if (typeof raw === \"string\") {\n candidate = { type: raw };\n } else if (typeof raw === \"object\" && raw !== null && !Array.isArray(raw)) {\n candidate = raw as Record<string, unknown>;\n } else {\n issues.push(\n issue(\n \"rule\",\n key,\n `Expected a type name or a rule object, got ${describeValue(raw as JsonValue)}.`,\n ),\n );\n return undefined;\n }\n\n if (!isTypeName(candidate.type)) {\n issues.push(\n issue(\n \"rule\",\n key,\n `Unknown type ${JSON.stringify(candidate.type)}. Known types: ${JSON_FIELD_TYPES.join(\", \")}.`,\n ),\n );\n return undefined;\n }\n\n if (candidate.options !== undefined && !Array.isArray(candidate.options)) {\n issues.push(issue(\"rule\", key, \"`options` must be an array.\"));\n return undefined;\n }\n\n // An enum with nothing to choose from cannot type anything, and would render\n // an empty select that looks like a loading state.\n if (candidate.type === \"enum\" && (!candidate.options || candidate.options.length === 0)) {\n issues.push(issue(\"rule\", key, \"`enum` requires a non-empty `options` array.\"));\n return undefined;\n }\n\n return candidate as unknown as JsonKeyRule;\n}\n\n/**\n * The rule governing `segments`, or `undefined` when the map is silent.\n *\n * Specificity: the pattern with the most literal (non-`*`) segments wins, and\n * at equal specificity the one declared LAST wins — so a general\n * `orders.*.total` can be overridden by a specific `orders.0.total` placed\n * anywhere in the map.\n */\nexport function resolveKeyRule(\n rules: JsonKeyMapEntry[],\n segments: JsonPath,\n): JsonKeyRule | undefined {\n let best: JsonKeyMapEntry | undefined;\n\n for (const entry of rules) {\n if (!matches(entry.pattern, segments)) continue;\n if (\n !best ||\n entry.literals > best.literals ||\n (entry.literals === best.literals && entry.order > best.order)\n ) {\n best = entry;\n }\n }\n\n return best?.rule;\n}\n\nfunction matches(pattern: JsonPath, segments: JsonPath): boolean {\n if (pattern.length !== segments.length) return false;\n return pattern.every((p, i) => p === \"*\" || p === segments[i]);\n}\n\n/** What a value IS, in the vocabulary the issue messages use. */\nexport function describeValue(value: JsonValue | undefined): string {\n if (value === undefined) return \"undefined\";\n if (value === null) return \"null\";\n if (Array.isArray(value)) return \"array\";\n return typeof value;\n}\n\n/** The type a value carries on its own, when nothing declares one for it. */\nexport function inferType(value: JsonValue | undefined): JsonFieldType {\n if (Array.isArray(value)) return \"array\";\n if (value === null || value === undefined) {\n // `null` carries no type information at all, so the raw editor is the only\n // choice that neither invents a type nor drops the value.\n return \"json\";\n }\n if (typeof value === \"object\") return \"object\";\n if (typeof value === \"boolean\") return \"boolean\";\n if (typeof value === \"number\") return \"number\";\n return \"string\";\n}\n\nfunction enumValues(rule: JsonKeyRule): (string | number | boolean)[] {\n return (rule.options ?? []).map((option) => resolveOption(option).value as string);\n}\n\n/**\n * Does the value satisfy the declared type?\n *\n * Deliberately strict and deliberately non-coercing. `\"36\"` is NOT a number\n * here — the whole reason a `keyMap` exists is to make that visible rather than\n * to paper over it.\n */\nexport function typeMatches(rule: JsonKeyRule, value: JsonValue | undefined): boolean {\n switch (rule.type) {\n case \"string\":\n case \"text\":\n case \"url\":\n case \"email\":\n case \"secret\":\n case \"color\":\n return typeof value === \"string\";\n case \"number\":\n return typeof value === \"number\" && Number.isFinite(value);\n case \"integer\":\n return typeof value === \"number\" && Number.isInteger(value);\n case \"boolean\":\n return typeof value === \"boolean\";\n case \"date\":\n case \"datetime\":\n return typeof value === \"string\" && value !== \"\" && !Number.isNaN(Date.parse(value));\n case \"enum\":\n return (\n (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") &&\n enumValues(rule).some((option) => String(option) === String(value))\n );\n case \"object\":\n return isJsonObject(value);\n case \"array\":\n return isJsonArray(value);\n case \"json\":\n // The escape hatch matches anything EXCEPT text that does not parse —\n // which is exactly the state the raw editor leaves behind when someone\n // saves a half-written document.\n if (typeof value !== \"string\") return true;\n try {\n JSON.parse(value);\n return true;\n } catch {\n return false;\n }\n }\n}\n\nfunction conflictMessage(rule: JsonKeyRule, value: JsonValue | undefined): string {\n if (rule.type === \"enum\") {\n return `${JSON.stringify(value)} is not one of the declared options (${enumValues(rule)\n .map((option) => JSON.stringify(option))\n .join(\", \")}).`;\n }\n if (rule.type === \"json\") {\n return \"Raw text is not valid JSON.\";\n }\n if (rule.type === \"date\" || rule.type === \"datetime\") {\n return `Declared ${rule.type}, got ${describeValue(value)} that is not a parseable date.`;\n }\n return `Declared ${rule.type}, got ${describeValue(value)}.`;\n}\n\n/**\n * Every place the document contradicts its `keyMap`.\n *\n * Walks the value (so a conflict is found at any depth, arrays included), then\n * checks `required` on the wildcard-free patterns — a wildcard cannot say \"this\n * must exist\" about a key nobody has named.\n */\nexport function findJsonConflicts(value: JsonValue, rules: JsonKeyMapEntry[]): JsonEditorIssue[] {\n const issues: JsonEditorIssue[] = [];\n if (rules.length === 0) return issues;\n\n const walk = (node: JsonValue, segments: JsonPath) => {\n if (segments.length > 0) {\n const rule = resolveKeyRule(rules, segments);\n if (rule && !typeMatches(rule, node)) {\n issues.push({\n kind: \"type\",\n path: pathToString(segments),\n message: conflictMessage(rule, node),\n expected: rule.type,\n actual: describeValue(node),\n });\n }\n }\n\n if (isJsonArray(node)) {\n node.forEach((child, index) => walk(child, [...segments, String(index)]));\n } else if (isJsonObject(node)) {\n for (const [key, child] of Object.entries(node)) walk(child, [...segments, key]);\n }\n };\n\n walk(value, []);\n\n for (const entry of rules) {\n if (!entry.rule.required) continue;\n if (entry.pattern.includes(\"*\")) continue;\n if (getAtPath(value, entry.pattern) !== undefined) continue;\n issues.push({\n kind: \"type\",\n path: entry.source,\n message: `Required key is missing (declared ${entry.rule.type}).`,\n expected: entry.rule.type,\n actual: \"undefined\",\n });\n }\n\n return issues;\n}\n\n/** The value a newly-added key starts as, so a new row is never `undefined`. */\nexport function seedValue(type: JsonFieldType, rule?: JsonKeyRule): JsonValue {\n switch (type) {\n case \"number\":\n case \"integer\":\n return 0;\n case \"boolean\":\n return false;\n case \"object\":\n return {};\n case \"array\":\n return [];\n case \"json\":\n return null;\n case \"enum\":\n return rule?.options?.length ? (resolveOption(rule.options[0]!).value as string) : \"\";\n default:\n return \"\";\n }\n}\n","import { createContext, useContext } from \"react\";\nimport type { FieldMode } from \"../inputs/inputs.types\";\nimport type { Size } from \"../../utils/types\";\nimport type {\n JsonEditorNode,\n JsonEditorPendingEdit,\n JsonFieldType,\n JsonValue,\n} from \"./JsonEditor.types\";\n\n/**\n * Everything a row needs that is not the row itself.\n *\n * Same shape as `Table`'s context and for the same reason: a row is rendered\n * once per key in a document that can be hundreds deep, and threading a dozen\n * props through the recursion makes every signature change a rewrite.\n */\nexport interface JsonEditorContextValue {\n mode: FieldMode;\n size: Size;\n readOnly: boolean;\n allowAdd: boolean;\n allowRemove: boolean;\n allowRename: boolean;\n allowReorder: boolean;\n pendingMode: boolean;\n idPrefix: string;\n\n isExpanded: (dotted: string) => boolean;\n toggleExpanded: (dotted: string) => void;\n\n setValueAt: (node: JsonEditorNode, value: JsonValue) => void;\n removeAt: (node: JsonEditorNode) => void;\n renameAt: (node: JsonEditorNode, key: string) => void;\n moveAt: (node: JsonEditorNode, to: number) => void;\n insertInto: (dotted: string, key: string | undefined, type: JsonFieldType) => void;\n\n /** Which container's add form is open, if any. Transient UI state, never model state. */\n addingAt: string | null;\n setAddingAt: (dotted: string | null) => void;\n\n pendingFor: (dotted: string) => JsonEditorPendingEdit[];\n acceptPending: (id: string) => void;\n rejectPending: (id: string) => void;\n}\n\nexport const JsonEditorContext = createContext<JsonEditorContextValue | null>(null);\n\nexport function useJsonEditorContext(): JsonEditorContextValue {\n const context = useContext(JsonEditorContext);\n if (!context) {\n throw new Error(\"JsonEditor rows must be rendered inside a <JsonEditor>.\");\n }\n return context;\n}\n","import { ColorPicker } from \"../ColorPicker/ColorPicker\";\nimport { Input } from \"../inputs/Input/Input\";\nimport { Textarea } from \"../inputs/Textarea/Textarea\";\nimport { Select } from \"../inputs/Select/Select\";\nimport { Switch } from \"../inputs/Switch/Switch\";\nimport { DatePicker } from \"../inputs/DatePicker/DatePicker\";\nimport { DisplayValue } from \"../inputs/mode/DisplayValue\";\nimport { useInlineEdit } from \"../inputs/mode/useInlineEdit\";\nimport { resolveOption } from \"../inputs/inputs.utils\";\nimport type { FieldMode } from \"../inputs/inputs.types\";\nimport type { Size } from \"../../utils/types\";\nimport type { JsonEditorNode, JsonFieldType, JsonValue } from \"./JsonEditor.types\";\n\nexport interface JsonEditorValueProps {\n node: JsonEditorNode;\n mode: FieldMode;\n size: Size;\n /** No control at all — the row still shows the value. */\n readOnly: boolean;\n /** Stable control id: `<idPrefix>-<dotted path>`. */\n id: string;\n onCommit: (value: JsonValue) => void;\n}\n\nconst COLOR_PICKER_SIZE: Record<Size, \"sm\" | \"md\" | \"lg\"> = {\n xs: \"sm\",\n sm: \"sm\",\n md: \"md\",\n lg: \"lg\",\n xl: \"lg\",\n};\n\n/**\n * Types whose text form IS the value commit on every keystroke; types that must\n * be PARSED out of text commit on blur instead.\n *\n * That split is not fussiness. A controlled `number` field that parses per\n * keystroke turns `1.5` into `1` the moment you type the dot, and moves the\n * caret while you are still typing. Committing on blur means the intermediate\n * text is never anybody's value.\n */\nfunction isRawTextType(type: JsonFieldType): boolean {\n return type === \"number\" || type === \"integer\" || type === \"json\";\n}\n\n/** The text shown for a value in a raw editor — strings verbatim, everything else as JSON. */\nexport function toText(value: JsonValue | undefined): string {\n if (value === undefined) return \"\";\n if (typeof value === \"string\") return value;\n return JSON.stringify(value) ?? \"\";\n}\n\n/**\n * Read a raw editor's text back into a value.\n *\n * Text that will not parse as the declared type is stored AS TEXT. That is the\n * deliberate choice at the heart of this component: typing `abc` into a field\n * declared `number` neither coerces to `0`/`NaN` nor throws the keystrokes\n * away — it writes `\"abc\"` and lets the conflict machinery say so, in the same\n * place it reports bad data that arrived from the server.\n */\nexport function fromText(text: string, type: JsonFieldType): JsonValue {\n switch (type) {\n case \"number\":\n case \"integer\": {\n const trimmed = text.trim();\n if (trimmed === \"\") return text;\n const parsed = Number(trimmed);\n return Number.isFinite(parsed) ? parsed : text;\n }\n case \"boolean\": {\n const trimmed = text.trim().toLowerCase();\n if (trimmed === \"true\") return true;\n if (trimmed === \"false\") return false;\n return text;\n }\n case \"json\":\n case \"object\":\n case \"array\":\n try {\n return JSON.parse(text) as JsonValue;\n } catch {\n return text;\n }\n default:\n return text;\n }\n}\n\n/**\n * The read-or-edit control for one leaf value.\n *\n * Everything here is a `react-fancy` primitive — `Input`, `Textarea`, `Select`,\n * `Switch`, `DatePicker`, `ColorPicker` — and the view/edit swap is the kit's\n * own `useInlineEdit` + `DisplayValue`, not a private re-implementation of it.\n */\nexport function JsonEditorValue({ node, mode, size, readOnly, id, onCommit }: JsonEditorValueProps) {\n const locked = readOnly || node.rule?.readOnly === true;\n const resolvedMode: FieldMode = locked ? \"view\" : mode;\n const { value, rule } = node;\n\n // A value that contradicts its declared type cannot be shown through that\n // type's control — a number input cannot hold \"thirty-six\" — so it falls back\n // to the raw editor, which is also the only place it can be repaired.\n if (node.conflict || isRawTextType(node.type)) {\n return (\n <RawValueEditor\n id={id}\n text={toText(value)}\n type={node.type}\n mode={resolvedMode}\n size={size}\n disabled={locked}\n multiline={node.type === \"json\" || typeof value === \"object\"}\n placeholder={rule?.placeholder}\n onCommitText={(text) => onCommit(fromText(text, node.type))}\n />\n );\n }\n\n const common = { id, size, mode: resolvedMode, disabled: locked } as const;\n\n switch (node.type) {\n case \"boolean\":\n return (\n <Switch\n {...common}\n checked={value === true}\n onCheckedChange={(next) => onCommit(next)}\n />\n );\n\n case \"enum\": {\n const options = rule?.options ?? [];\n return (\n <Select\n {...common}\n list={options}\n value={String(value)}\n onValueChange={(next) => {\n // Emit the option's ORIGINAL value, so a numeric or boolean enum\n // does not silently become a string on its way through the DOM.\n const match = options\n .map((option) => resolveOption(option))\n .find((option) => String(option.value) === next);\n onCommit((match?.value ?? next) as JsonValue);\n }}\n />\n );\n }\n\n case \"date\":\n case \"datetime\":\n return (\n <DatePicker\n {...common}\n includeTime={node.type === \"datetime\"}\n min={rule?.min === undefined ? undefined : String(rule.min)}\n max={rule?.max === undefined ? undefined : String(rule.max)}\n value={typeof value === \"string\" ? value : \"\"}\n onValueChange={(next) => onCommit(next)}\n />\n );\n\n case \"color\":\n return (\n <ColorPicker\n size={COLOR_PICKER_SIZE[size]}\n mode={resolvedMode}\n disabled={locked}\n value={typeof value === \"string\" ? value : \"\"}\n onChange={(next) => onCommit(next)}\n />\n );\n\n case \"text\":\n return (\n <Textarea\n {...common}\n minRows={2}\n autoResize\n placeholder={rule?.placeholder}\n value={typeof value === \"string\" ? value : \"\"}\n onValueChange={(next) => onCommit(next)}\n />\n );\n\n case \"secret\":\n return (\n <Input\n {...common}\n type=\"password\"\n reveal\n placeholder={rule?.placeholder}\n value={typeof value === \"string\" ? value : \"\"}\n onValueChange={(next) => onCommit(next)}\n />\n );\n\n case \"url\":\n case \"email\":\n case \"string\":\n default:\n return (\n <Input\n {...common}\n type={node.type === \"url\" ? \"url\" : node.type === \"email\" ? \"email\" : \"text\"}\n placeholder={rule?.placeholder}\n value={typeof value === \"string\" ? value : \"\"}\n onValueChange={(next) => onCommit(next)}\n />\n );\n }\n}\n\ninterface RawValueEditorProps {\n id: string;\n text: string;\n type: JsonFieldType;\n mode: FieldMode;\n size: Size;\n disabled: boolean;\n multiline: boolean;\n placeholder?: string;\n onCommitText: (text: string) => void;\n}\n\n/**\n * An uncontrolled text control that commits on blur.\n *\n * Uncontrolled is what keeps the component free of a private copy of the\n * document: the half-typed text lives in the DOM node, never in React state,\n * and the `key` is the committed text — so a value changed from OUTSIDE (an\n * agent writing through a bridge, a server push) remounts the control with the\n * new text, while local typing does not.\n */\nfunction RawValueEditor({\n id,\n text,\n type,\n mode,\n size,\n disabled,\n multiline,\n placeholder,\n onCommitText,\n}: RawValueEditorProps) {\n const { showControl, interactive, enterEdit, exitEdit } = useInlineEdit(mode, disabled);\n\n if (!showControl) {\n return (\n <DisplayValue size={size} interactive={interactive} onActivate={enterEdit}>\n {text}\n </DisplayValue>\n );\n }\n\n const commit = (next: string) => {\n if (next !== text) onCommitText(next);\n };\n\n if (multiline) {\n return (\n <Textarea\n id={id}\n key={text}\n size={size}\n mode=\"edit\"\n minRows={3}\n disabled={disabled}\n placeholder={placeholder}\n defaultValue={text}\n spellCheck={false}\n autoFocus={interactive}\n className=\"font-mono\"\n onBlur={(event) => {\n commit(event.currentTarget.value);\n exitEdit();\n }}\n />\n );\n }\n\n return (\n <Input\n id={id}\n key={text}\n size={size}\n mode=\"edit\"\n type=\"text\"\n // Not `type=\"number\"`: an `<input type=number>` reports \"\" for text it\n // considers invalid, so the literal keystrokes we promise to keep would\n // be unreadable on commit. The numeric keyboard is requested instead.\n inputMode={type === \"number\" || type === \"integer\" ? \"decimal\" : undefined}\n disabled={disabled}\n placeholder={placeholder}\n defaultValue={text}\n spellCheck={false}\n autoFocus={interactive}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") event.currentTarget.blur();\n }}\n onBlur={(event) => {\n commit(event.currentTarget.value);\n exitEdit();\n }}\n />\n );\n}\n","import { useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Badge } from \"../Badge/Badge\";\nimport { Button } from \"../Button/Button\";\nimport { Text } from \"../Text/Text\";\nimport { Input } from \"../inputs/Input/Input\";\nimport { Select } from \"../inputs/Select/Select\";\nimport { useJsonEditorContext } from \"./JsonEditor.context\";\nimport { describeEdit } from \"./JsonEditor.paths\";\nimport { JsonEditorValue, toText } from \"./JsonEditorValue\";\nimport { JSON_FIELD_TYPES } from \"./JsonEditor.types\";\nimport type { JsonEditorNode, JsonFieldType } from \"./JsonEditor.types\";\n\n/** One indent step, in px. Applied as an inline style because depth is data. */\nconst INDENT = 18;\n\nexport interface JsonEditorRowProps {\n node: JsonEditorNode;\n}\n\n/**\n * One key/value row.\n *\n * Flat in the DOM rather than nested: `aria-level` carries the depth, so an\n * agent can address `[data-path=\"orders.2.total\"]` in one selector instead of\n * walking a nesting it would have to guess the shape of. It is also the\n * standard flat-tree ARIA pattern.\n */\nexport function JsonEditorRow({ node }: JsonEditorRowProps) {\n const ctx = useJsonEditorContext();\n const { dotted, key, depth, container, conflict } = node;\n\n const expanded = container ? ctx.isExpanded(dotted) : undefined;\n const pending = ctx.pendingFor(dotted);\n const renameable =\n ctx.allowRename && !ctx.readOnly && node.parentKind === \"object\" && ctx.mode === \"edit\";\n const label = node.rule?.label ?? key;\n\n return (\n <div\n data-react-fancy-json-editor-row=\"\"\n data-path={dotted}\n data-key={key}\n data-type={node.type}\n data-depth={depth}\n data-declared={node.declared ? \"true\" : \"false\"}\n data-conflict={conflict ? \"true\" : undefined}\n data-pending={pending.length > 0 ? \"true\" : undefined}\n role=\"treeitem\"\n aria-level={depth + 1}\n aria-expanded={expanded}\n className={cn(\n \"border-b border-zinc-100 py-1 last:border-b-0 dark:border-zinc-800\",\n conflict && \"bg-red-50/60 dark:bg-red-950/20\",\n pending.length > 0 && \"bg-violet-50/60 dark:bg-violet-950/20\",\n )}\n >\n <div className=\"flex items-start gap-2 px-2\" style={{ paddingInlineStart: depth * INDENT + 8 }}>\n {container ? (\n <Button\n variant=\"ghost\"\n size=\"xs\"\n data-react-fancy-json-editor-toggle=\"\"\n data-path={dotted}\n aria-label={expanded ? `Collapse ${label}` : `Expand ${label}`}\n aria-expanded={expanded}\n icon={expanded ? \"chevron-down\" : \"chevron-right\"}\n onClick={() => ctx.toggleExpanded(dotted)}\n />\n ) : (\n <span aria-hidden=\"true\" className=\"inline-block w-6 shrink-0\" />\n )}\n\n <div\n data-react-fancy-json-editor-key=\"\"\n data-path={dotted}\n className=\"w-1/3 min-w-0 shrink-0\"\n >\n {renameable ? (\n <Input\n // Uncontrolled + keyed + commit on blur: renaming per keystroke\n // would fire one structural edit per character.\n key={key}\n size={ctx.size}\n mode=\"edit\"\n defaultValue={key}\n spellCheck={false}\n aria-label={`Key of ${dotted}`}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") event.currentTarget.blur();\n }}\n onBlur={(event) => {\n const next = event.currentTarget.value;\n if (next !== key) ctx.renameAt(node, next);\n }}\n />\n ) : (\n <Text\n as=\"span\"\n size=\"sm\"\n weight=\"medium\"\n color={node.parentKind === \"array\" ? \"muted\" : \"default\"}\n className=\"block truncate py-1 font-mono\"\n title={dotted}\n >\n {node.parentKind === \"array\" ? `[${key}]` : label}\n </Text>\n )}\n {node.rule?.description && (\n <Text as=\"span\" size=\"xs\" color=\"muted\" className=\"block truncate\">\n {node.rule.description}\n </Text>\n )}\n </div>\n\n <div\n data-react-fancy-json-editor-value=\"\"\n data-path={dotted}\n data-type={node.type}\n className=\"min-w-0 flex-1\"\n >\n {container ? (\n <Text as=\"span\" size=\"sm\" color=\"muted\" className=\"block py-1 font-mono\">\n {node.type === \"array\"\n ? `[ ${node.childCount} ${node.childCount === 1 ? \"item\" : \"items\"} ]`\n : `{ ${node.childCount} ${node.childCount === 1 ? \"key\" : \"keys\"} }`}\n </Text>\n ) : (\n <JsonEditorValue\n node={node}\n mode={ctx.mode}\n size={ctx.size}\n readOnly={ctx.readOnly}\n id={`${ctx.idPrefix}-${dotted}`}\n onCommit={(next) => ctx.setValueAt(node, next)}\n />\n )}\n </div>\n\n <div className=\"flex shrink-0 items-center gap-0.5 pt-0.5\">\n {node.declared && (\n <Badge size=\"sm\" variant=\"soft\" color={conflict ? \"red\" : \"zinc\"}>\n {node.type}\n </Badge>\n )}\n {container && ctx.allowAdd && !ctx.readOnly && (\n <Button\n variant=\"ghost\"\n size=\"xs\"\n data-react-fancy-json-editor-add=\"\"\n data-path={dotted}\n aria-label={`Add to ${label}`}\n icon=\"plus\"\n onClick={() => ctx.setAddingAt(ctx.addingAt === dotted ? null : dotted)}\n />\n )}\n {ctx.allowReorder && !ctx.readOnly && node.parentKind === \"array\" && (\n <>\n <Button\n variant=\"ghost\"\n size=\"xs\"\n data-react-fancy-json-editor-move-up=\"\"\n data-path={dotted}\n aria-label={`Move ${dotted} up`}\n icon=\"arrow-up\"\n onClick={() => ctx.moveAt(node, Number(key) - 1)}\n />\n <Button\n variant=\"ghost\"\n size=\"xs\"\n data-react-fancy-json-editor-move-down=\"\"\n data-path={dotted}\n aria-label={`Move ${dotted} down`}\n icon=\"arrow-down\"\n onClick={() => ctx.moveAt(node, Number(key) + 1)}\n />\n </>\n )}\n {ctx.allowRemove && !ctx.readOnly && node.parentKind !== \"root\" && (\n <Button\n variant=\"ghost\"\n size=\"xs\"\n color=\"red\"\n data-react-fancy-json-editor-remove=\"\"\n data-path={dotted}\n aria-label={`Remove ${dotted}`}\n icon=\"trash-2\"\n onClick={() => ctx.removeAt(node)}\n />\n )}\n </div>\n </div>\n\n {conflict && (\n <Text\n as=\"span\"\n size=\"xs\"\n color=\"danger\"\n data-react-fancy-json-editor-conflict=\"\"\n data-path={dotted}\n className=\"block px-2 pb-1\"\n style={{ paddingInlineStart: depth * INDENT + 40 }}\n >\n {conflict.message}\n </Text>\n )}\n\n {pending.map((edit) => (\n <div\n key={edit.id}\n data-react-fancy-json-editor-pending=\"\"\n data-id={edit.id}\n data-path={dotted}\n className=\"flex items-center gap-2 px-2 pb-1\"\n style={{ paddingInlineStart: depth * INDENT + 40 }}\n >\n <Badge size=\"sm\" variant=\"soft\" color=\"violet\">\n proposed\n </Badge>\n <Text as=\"span\" size=\"xs\" color=\"muted\" className=\"min-w-0 truncate font-mono\">\n {edit.label ?? describeEdit(edit)}\n {edit.op === \"set\" || edit.op === \"insert\" ? ` → ${toText(edit.value)}` : \"\"}\n </Text>\n <Button\n size=\"xs\"\n color=\"emerald\"\n data-react-fancy-json-editor-accept=\"\"\n data-id={edit.id}\n onClick={() => ctx.acceptPending(edit.id)}\n >\n Accept\n </Button>\n <Button\n size=\"xs\"\n variant=\"ghost\"\n data-react-fancy-json-editor-reject=\"\"\n data-id={edit.id}\n onClick={() => ctx.rejectPending(edit.id)}\n >\n Reject\n </Button>\n </div>\n ))}\n </div>\n );\n}\n\nexport interface JsonEditorAddFormProps {\n /** Dotted path of the container being added to; `\"\"` is the document root. */\n path: string;\n kind: \"object\" | \"array\";\n depth: number;\n /** Declared type for the container's children, when the keyMap names one. */\n suggestedType?: JsonFieldType;\n}\n\n/**\n * The inline \"add a key\" form.\n *\n * Its open/closed state and its two draft fields are the only state this\n * component owns that is not in `value` — and deliberately so: a half-typed key\n * name is not part of the document, and an agent adding a key does it through\n * an `insert` edit, never by driving this form.\n */\nexport function JsonEditorAddForm({ path, kind, depth, suggestedType }: JsonEditorAddFormProps) {\n const ctx = useJsonEditorContext();\n const [key, setKey] = useState(\"\");\n const [type, setType] = useState<JsonFieldType>(suggestedType ?? \"string\");\n\n return (\n <div\n data-react-fancy-json-editor-add-form=\"\"\n data-path={path}\n className=\"flex items-center gap-2 border-b border-zinc-100 px-2 py-1.5 dark:border-zinc-800\"\n style={{ paddingInlineStart: depth * INDENT + 32 }}\n >\n {kind === \"object\" && (\n <Input\n size={ctx.size}\n mode=\"edit\"\n value={key}\n placeholder=\"key\"\n aria-label=\"New key\"\n spellCheck={false}\n data-react-fancy-json-editor-add-key=\"\"\n onValueChange={setKey}\n />\n )}\n <Select\n size={ctx.size}\n mode=\"edit\"\n aria-label=\"New value type\"\n data-react-fancy-json-editor-add-type=\"\"\n list={[...JSON_FIELD_TYPES]}\n value={type}\n onValueChange={(next) => setType(next as JsonFieldType)}\n />\n <Button\n size=\"xs\"\n color=\"blue\"\n data-react-fancy-json-editor-add-confirm=\"\"\n onClick={() => ctx.insertInto(path, kind === \"object\" ? key : undefined, type)}\n >\n Add\n </Button>\n <Button\n size=\"xs\"\n variant=\"ghost\"\n data-react-fancy-json-editor-add-cancel=\"\"\n onClick={() => ctx.setAddingAt(null)}\n >\n Cancel\n </Button>\n </div>\n );\n}\n","import { forwardRef, useCallback, useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Button } from \"../Button/Button\";\nimport { Callout } from \"../Callout/Callout\";\nimport { Text } from \"../Text/Text\";\nimport { JsonEditorContext } from \"./JsonEditor.context\";\nimport { JsonEditorAddForm, JsonEditorRow } from \"./JsonEditorRow\";\nimport { findJsonConflicts, inferType, parseKeyMap, resolveKeyRule, seedValue } from \"./JsonEditor.keymap\";\nimport {\n applyJsonEdit,\n describeEdit,\n getAtPath,\n isContainerValue,\n isJsonArray,\n isJsonObject,\n parsePath,\n pathToString,\n} from \"./JsonEditor.paths\";\nimport type { JsonEditorContextValue } from \"./JsonEditor.context\";\nimport type {\n JsonEditorEdit,\n JsonEditorIssue,\n JsonEditorNode,\n JsonEditorPendingEdit,\n JsonEditorProps,\n JsonFieldType,\n JsonKeyMapEntry,\n JsonPath,\n JsonValue,\n} from \"./JsonEditor.types\";\n\ntype RenderItem =\n | { kind: \"node\"; node: JsonEditorNode }\n | {\n kind: \"add\";\n path: string;\n containerKind: \"object\" | \"array\";\n depth: number;\n suggestedType?: JsonFieldType;\n };\n\n/** Dotted paths of every container in the document — the \"expand everything\" set. */\nfunction collectContainerPaths(value: JsonValue): string[] {\n const out: string[] = [];\n\n const walk = (node: JsonValue, segments: JsonPath) => {\n if (!isContainerValue(node)) return;\n if (segments.length > 0) out.push(pathToString(segments));\n if (isJsonArray(node)) {\n node.forEach((child, index) => walk(child, [...segments, String(index)]));\n } else if (isJsonObject(node)) {\n for (const [key, child] of Object.entries(node)) walk(child, [...segments, key]);\n }\n };\n\n walk(value, []);\n return out;\n}\n\n/**\n * JsonEditor — a key/value editor over arbitrary, arbitrarily-nested JSON, with\n * a caller-supplied `keyMap` imposing a data type on any path.\n *\n * The type does two jobs at once, which is the point of the feature: it decides\n * how a value is RENDERED when you are reading, and which control appears when\n * you are editing. `{\"user.age\": \"number\"}` is not documentation — it is the\n * reason that row is a numeric field and the reason `\"thirty-six\"` shows up in\n * red instead of quietly becoming `0`.\n *\n * The three design decisions worth knowing before you use it:\n *\n * - **`keyMap` is a JSON string, and only a string.** It has to survive an MCP\n * tool argument, a config column and a `data-*` attribute; a live object\n * survives none of those. See {@link JsonEditorProps.keyMap}.\n * - **Nothing is coerced and nothing is dropped.** A value that contradicts\n * its declared type keeps its real value, renders through the raw editor,\n * and is reported through the issues panel, the `data-issues` count and\n * `onIssuesChange` — the same channel a broken `keyMap` uses.\n * - **It is controlled, all the way down.** The document lives in `value`.\n * The only state here is which rows are expanded, which add-form is open,\n * and the half-typed text inside a control that has not committed yet.\n *\n * Every control is a `react-fancy` primitive, so restyling the kit restyles\n * this, and `mode=\"view\"` gets the kit's click-to-edit behaviour for free.\n */\nexport const JsonEditor = forwardRef<HTMLDivElement, JsonEditorProps>(function JsonEditor(\n {\n value,\n onChange,\n keyMap,\n mode = \"view\",\n size = \"sm\",\n readOnly = false,\n expanded,\n defaultExpanded,\n onExpandedChange,\n showIssues = true,\n onIssuesChange,\n pendingMode = false,\n pending,\n onPendingChange,\n onActivity,\n allowAdd = true,\n allowRemove = true,\n allowRename = true,\n allowReorder = true,\n rootLabel = \"value\",\n emptyLabel = \"No keys yet.\",\n idPrefix,\n className,\n ...rest\n },\n ref,\n) {\n const autoId = useId();\n const prefix = idPrefix ?? autoId;\n const editSeq = useRef(0);\n\n // Parsed ONCE per distinct keyMap string — not per row, not per render. The\n // map is compiled into path patterns with a specificity score, and rows only\n // ever do a match against that.\n const parsedKeyMap = useMemo(() => parseKeyMap(keyMap), [keyMap]);\n const rules = parsedKeyMap.rules;\n\n const conflicts = useMemo(() => findJsonConflicts(value, rules), [value, rules]);\n\n // Transient complaints about an edit that was refused (duplicate key, empty\n // key). They belong beside the type conflicts because from the user's side\n // they are the same thing: something they can see is wrong and can fix.\n const [editIssues, setEditIssues] = useState<JsonEditorIssue[]>([]);\n\n const issues = useMemo(\n () => [...parsedKeyMap.issues, ...conflicts, ...editIssues],\n [parsedKeyMap.issues, conflicts, editIssues],\n );\n\n const onIssuesChangeRef = useRef(onIssuesChange);\n onIssuesChangeRef.current = onIssuesChange;\n const lastIssueSignature = useRef<string | null>(null);\n\n useEffect(() => {\n const signature = JSON.stringify(issues);\n if (signature === lastIssueSignature.current) return;\n lastIssueSignature.current = signature;\n onIssuesChangeRef.current?.(issues);\n }, [issues]);\n\n // ── expansion ─────────────────────────────────────────────────────────\n // `null` means \"expanded, everything\" — the state a caller that named no\n // paths is in. Storing it as a sentinel rather than materialising every\n // container path keeps a container added later expanded too.\n const expandedControlled = expanded !== undefined;\n const [expandedUncontrolled, setExpandedUncontrolled] = useState<string[] | null>(\n defaultExpanded ?? null,\n );\n const expandedList = expandedControlled ? expanded : expandedUncontrolled;\n\n const isExpanded = useCallback(\n (dotted: string) => expandedList === null || expandedList.includes(dotted),\n [expandedList],\n );\n\n const toggleExpanded = useCallback(\n (dotted: string) => {\n const current = expandedList ?? collectContainerPaths(value);\n const next = current.includes(dotted)\n ? current.filter((path) => path !== dotted)\n : [...current, dotted];\n if (!expandedControlled) setExpandedUncontrolled(next);\n onExpandedChange?.(next);\n },\n [expandedList, expandedControlled, onExpandedChange, value],\n );\n\n // ── add form ──────────────────────────────────────────────────────────\n const [addingAt, setAddingAt] = useState<string | null>(null);\n\n // ── committing ────────────────────────────────────────────────────────\n const stagedPending = useMemo(() => pending ?? [], [pending]);\n\n const commit = useCallback(\n (edit: JsonEditorEdit) => {\n setEditIssues([]);\n\n if (pendingMode) {\n // Trust-but-verify: the edit becomes a PROPOSAL. `value` does not move\n // and `onChange` does not fire until a human accepts it.\n const staged: JsonEditorPendingEdit = {\n ...edit,\n id: edit.id ?? `${prefix}-edit-${editSeq.current++}`,\n label: edit.label ?? describeEdit(edit),\n };\n onPendingChange?.([...stagedPending, staged]);\n onActivity?.({ type: \"stage\", edit: staged });\n return;\n }\n\n const next = applyJsonEdit(value, edit);\n // `applyJsonEdit` returns the same reference when it refuses an edit, so\n // a refusal never reaches the host as a spurious \"changed\" callback.\n if (next === value) return;\n onChange?.(next, edit);\n onActivity?.({ type: \"commit\", edit });\n },\n [pendingMode, prefix, stagedPending, onPendingChange, onActivity, value, onChange],\n );\n\n const refuse = useCallback((path: string, message: string) => {\n setEditIssues([{ kind: \"edit\", path, message }]);\n }, []);\n\n const setValueAt = useCallback(\n (node: JsonEditorNode, next: JsonValue) => {\n commit({ op: \"set\", path: node.dotted, value: next });\n },\n [commit],\n );\n\n const removeAt = useCallback(\n (node: JsonEditorNode) => {\n commit({ op: \"remove\", path: node.dotted });\n },\n [commit],\n );\n\n const moveAt = useCallback(\n (node: JsonEditorNode, to: number) => {\n commit({ op: \"move\", path: node.dotted, to });\n },\n [commit],\n );\n\n const renameAt = useCallback(\n (node: JsonEditorNode, key: string) => {\n if (key === node.key) return;\n if (key.trim() === \"\") {\n refuse(node.dotted, \"A key cannot be empty.\");\n return;\n }\n const parent = getAtPath(value, node.path.slice(0, -1));\n if (isJsonObject(parent) && Object.prototype.hasOwnProperty.call(parent, key)) {\n refuse(node.dotted, `A key named \"${key}\" already exists here — rename refused.`);\n return;\n }\n commit({ op: \"rename\", path: node.dotted, key });\n },\n [commit, refuse, value],\n );\n\n const insertInto = useCallback(\n (dotted: string, key: string | undefined, type: JsonFieldType) => {\n const segments = parsePath(dotted);\n const container = dotted === \"\" ? value : getAtPath(value, segments);\n const isArray = isJsonArray(container);\n\n if (!isArray) {\n if (key === undefined || key.trim() === \"\") {\n refuse(dotted, \"A new key needs a name.\");\n return;\n }\n if (isJsonObject(container) && Object.prototype.hasOwnProperty.call(container, key)) {\n refuse(dotted, `A key named \"${key}\" already exists here.`);\n return;\n }\n }\n\n const rule = resolveKeyRule(rules, [...segments, isArray ? \"*\" : key!]);\n setAddingAt(null);\n commit({\n op: \"insert\",\n path: dotted,\n key: isArray ? undefined : key,\n value: seedValue(type, rule),\n });\n },\n [commit, refuse, rules, value],\n );\n\n const pendingFor = useCallback(\n (dotted: string) => stagedPending.filter((edit) => edit.path === dotted),\n [stagedPending],\n );\n\n const acceptPending = useCallback(\n (id: string) => {\n const edit = stagedPending.find((candidate) => candidate.id === id);\n if (!edit) return;\n const next = applyJsonEdit(value, edit);\n onPendingChange?.(stagedPending.filter((candidate) => candidate.id !== id));\n if (next !== value) {\n onChange?.(next, edit);\n onActivity?.({ type: \"accept\", edit });\n }\n },\n [stagedPending, value, onPendingChange, onChange, onActivity],\n );\n\n const rejectPending = useCallback(\n (id: string) => {\n const edit = stagedPending.find((candidate) => candidate.id === id);\n onPendingChange?.(stagedPending.filter((candidate) => candidate.id !== id));\n if (edit) onActivity?.({ type: \"reject\", edit });\n },\n [stagedPending, onPendingChange, onActivity],\n );\n\n // ── rows ──────────────────────────────────────────────────────────────\n const items = useMemo(\n () =>\n buildItems({\n value,\n rules,\n conflicts,\n isExpanded,\n addingAt,\n rootLabel,\n }),\n [value, rules, conflicts, isExpanded, addingAt, rootLabel],\n );\n\n const rootIsContainer = isContainerValue(value);\n const rootKind = isJsonArray(value) ? \"array\" : \"object\";\n const attachedIds = new Set(\n items.flatMap((item) => (item.kind === \"node\" ? [item.node.dotted] : [])),\n );\n const orphanPending = stagedPending.filter((edit) => !attachedIds.has(edit.path));\n\n const context = useMemo<JsonEditorContextValue>(\n () => ({\n mode: readOnly ? \"view\" : mode,\n size,\n readOnly,\n allowAdd: allowAdd && !readOnly,\n allowRemove: allowRemove && !readOnly,\n allowRename: allowRename && !readOnly,\n allowReorder: allowReorder && !readOnly,\n pendingMode,\n idPrefix: prefix,\n isExpanded,\n toggleExpanded,\n setValueAt,\n removeAt,\n renameAt,\n moveAt,\n insertInto,\n addingAt,\n setAddingAt,\n pendingFor,\n acceptPending,\n rejectPending,\n }),\n [\n mode,\n size,\n readOnly,\n allowAdd,\n allowRemove,\n allowRename,\n allowReorder,\n pendingMode,\n prefix,\n isExpanded,\n toggleExpanded,\n setValueAt,\n removeAt,\n renameAt,\n moveAt,\n insertInto,\n addingAt,\n pendingFor,\n acceptPending,\n rejectPending,\n ],\n );\n\n return (\n <JsonEditorContext.Provider value={context}>\n <div\n ref={ref}\n // Rest FIRST: a caller's `data-*` / `aria-*` reach the DOM, but nothing\n // they pass can overwrite the marker below or drop the internal classes.\n {...rest}\n data-react-fancy-json-editor=\"\"\n data-issues={String(issues.length)}\n data-keymap-error={parsedKeyMap.ok ? undefined : \"true\"}\n data-mode={readOnly ? \"readonly\" : mode}\n className={cn(\n \"overflow-hidden rounded-lg border border-[color:var(--fancy-border,var(--color-zinc-200))] bg-[color:var(--fancy-surface,var(--color-white))] text-[color:var(--fancy-text,var(--color-zinc-900))] dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))] dark:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\",\n className,\n )}\n >\n {showIssues && issues.length > 0 && (\n <div data-react-fancy-json-editor-issues=\"\" className=\"p-2\">\n <Callout color={parsedKeyMap.ok ? \"amber\" : \"red\"}>\n <Text size=\"sm\" weight=\"semibold\" className=\"mb-1\">\n {parsedKeyMap.ok\n ? `${issues.length} ${issues.length === 1 ? \"issue\" : \"issues\"}`\n : \"The keyMap could not be used — values are shown untyped.\"}\n </Text>\n <ul className=\"space-y-0.5\">\n {issues.map((issue, index) => (\n <li key={`${issue.kind}-${issue.path}-${index}`}>\n <Text as=\"span\" size=\"xs\" data-react-fancy-json-editor-issue=\"\" data-kind={issue.kind} data-path={issue.path}>\n {issue.path ? `${issue.path} — ` : \"\"}\n {issue.message}\n </Text>\n </li>\n ))}\n </ul>\n </Callout>\n </div>\n )}\n\n <div data-react-fancy-json-editor-tree=\"\" role=\"tree\" aria-label={rest[\"aria-label\"] ?? \"JSON document\"}>\n {items.length === 0 ? (\n <Text as=\"p\" size=\"sm\" color=\"muted\" className=\"px-3 py-4\">\n {emptyLabel}\n </Text>\n ) : (\n items.map((item) =>\n item.kind === \"node\" ? (\n <JsonEditorRow key={`row:${item.node.dotted}`} node={item.node} />\n ) : (\n <JsonEditorAddForm\n key={`add:${item.path}`}\n path={item.path}\n kind={item.containerKind}\n depth={item.depth}\n suggestedType={item.suggestedType}\n />\n ),\n )\n )}\n </div>\n\n {orphanPending.length > 0 && (\n <div data-react-fancy-json-editor-orphan-pending=\"\" className=\"border-t border-zinc-100 p-2 dark:border-zinc-800\">\n {orphanPending.map((edit) => (\n <div key={edit.id} className=\"flex items-center gap-2 py-0.5\">\n <Text as=\"span\" size=\"xs\" color=\"muted\" className=\"min-w-0 flex-1 truncate font-mono\">\n {edit.label ?? describeEdit(edit)}\n </Text>\n <Button\n size=\"xs\"\n color=\"emerald\"\n data-react-fancy-json-editor-accept=\"\"\n data-id={edit.id}\n onClick={() => acceptPending(edit.id)}\n >\n Accept\n </Button>\n <Button\n size=\"xs\"\n variant=\"ghost\"\n data-react-fancy-json-editor-reject=\"\"\n data-id={edit.id}\n onClick={() => rejectPending(edit.id)}\n >\n Reject\n </Button>\n </div>\n ))}\n </div>\n )}\n\n {rootIsContainer && allowAdd && !readOnly && (\n <div className=\"border-t border-zinc-100 p-2 dark:border-zinc-800\">\n <Button\n variant=\"ghost\"\n size=\"xs\"\n icon=\"plus\"\n data-react-fancy-json-editor-add=\"\"\n data-path=\"\"\n onClick={() => setAddingAt(addingAt === \"\" ? null : \"\")}\n >\n {rootKind === \"array\" ? \"Append item\" : \"Add key\"}\n </Button>\n </div>\n )}\n </div>\n </JsonEditorContext.Provider>\n );\n});\n\ninterface BuildItemsOptions {\n value: JsonValue;\n rules: JsonKeyMapEntry[];\n conflicts: JsonEditorIssue[];\n isExpanded: (dotted: string) => boolean;\n addingAt: string | null;\n rootLabel: string;\n}\n\nfunction buildItems({\n value,\n rules,\n conflicts,\n isExpanded,\n addingAt,\n rootLabel,\n}: BuildItemsOptions): RenderItem[] {\n const out: RenderItem[] = [];\n const conflictByPath = new Map<string, JsonEditorIssue>();\n for (const issue of conflicts) {\n if (issue.kind === \"type\" && !conflictByPath.has(issue.path)) conflictByPath.set(issue.path, issue);\n }\n\n const makeNode = (\n segments: JsonPath,\n node: JsonValue,\n depth: number,\n parentKind: JsonEditorNode[\"parentKind\"],\n ): JsonEditorNode => {\n const rule = segments.length > 0 ? resolveKeyRule(rules, segments) : undefined;\n const type = rule?.type ?? inferType(node);\n const dotted = pathToString(segments);\n const conflict = conflictByPath.get(dotted);\n // A `json` node is raw text by definition, and a node in conflict must show\n // what it really holds — neither is a branch to walk into.\n const container = !conflict && type !== \"json\" && isContainerValue(node);\n\n return {\n path: segments,\n dotted,\n key: segments[segments.length - 1] ?? rootLabel,\n depth,\n value: node,\n parentKind,\n rule,\n type,\n declared: rule !== undefined,\n container,\n childCount: isJsonArray(node)\n ? node.length\n : isJsonObject(node)\n ? Object.keys(node).length\n : 0,\n conflict,\n };\n };\n\n const emitChildren = (node: JsonValue, segments: JsonPath, depth: number) => {\n if (isJsonArray(node)) {\n node.forEach((child, index) => emit(child, [...segments, String(index)], depth, \"array\"));\n } else if (isJsonObject(node)) {\n for (const [key, child] of Object.entries(node)) {\n emit(child, [...segments, key], depth, \"object\");\n }\n }\n };\n\n const emit = (\n node: JsonValue,\n segments: JsonPath,\n depth: number,\n parentKind: JsonEditorNode[\"parentKind\"],\n ) => {\n const built = makeNode(segments, node, depth, parentKind);\n out.push({ kind: \"node\", node: built });\n\n if (!built.container || !isExpanded(built.dotted)) return;\n\n emitChildren(node, segments, depth + 1);\n if (addingAt === built.dotted) {\n out.push({\n kind: \"add\",\n path: built.dotted,\n containerKind: isJsonArray(node) ? \"array\" : \"object\",\n depth: depth + 1,\n suggestedType: resolveKeyRule(rules, [...segments, \"*\"])?.type,\n });\n }\n };\n\n if (isContainerValue(value)) {\n emitChildren(value, [], 0);\n if (addingAt === \"\") {\n out.push({\n kind: \"add\",\n path: \"\",\n containerKind: isJsonArray(value) ? \"array\" : \"object\",\n depth: 0,\n suggestedType: resolveKeyRule(rules, [\"*\"])?.type,\n });\n }\n } else {\n out.push({ kind: \"node\", node: makeNode([], value, 0, \"root\") });\n }\n\n return out;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Command/Command.context.ts","../src/components/Command/CommandInput.tsx","../src/components/Command/CommandList.tsx","../src/components/Command/CommandItem.tsx","../src/components/Command/CommandGroup.tsx","../src/components/Command/CommandEmpty.tsx","../src/components/Command/Command.tsx"],"names":["createContext","useContext","jsxs","jsx","Search","cn","useId","useControllableState","useState","useRef","useCallback","useEscapeKey","useFocusTrap","useEffect","useLayoutEffect","useAnimation","useMemo","Portal"],"mappings":"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","file":"chunk-UJRMY54A.cjs","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { CommandContextValue } from \"./Command.types\";\n\nexport const CommandContext = createContext<CommandContextValue | null>(null);\n\nexport function useCommand(): CommandContextValue {\n const ctx = useContext(CommandContext);\n if (!ctx) {\n throw new Error(\n \"Command compound components must be used within <Command>\",\n );\n }\n return ctx;\n}\n","import { Search } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useCommand } from \"./Command.context\";\nimport type { CommandInputProps } from \"./Command.types\";\n\nexport function CommandInput({\n placeholder = \"Type a command or search...\",\n className,\n}: CommandInputProps) {\n const { query, setQuery, listId } = useCommand();\n\n return (\n <div data-react-fancy-command-input=\"\" className=\"flex items-center border-b border-[color:var(--fancy-border,var(--color-zinc-200))] px-4 dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))]\">\n <Search size={16} className=\"shrink-0 text-zinc-400\" />\n <input\n type=\"text\"\n // A combobox: focus stays here while the arrows move the active option,\n // which Command announces through aria-activedescendant.\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={listId}\n aria-autocomplete=\"list\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={placeholder}\n className={cn(\n \"flex-1 bg-transparent px-3 py-3 text-sm outline-none placeholder:text-zinc-400\",\n className,\n )}\n autoFocus\n />\n </div>\n );\n}\n\nCommandInput.displayName = \"CommandInput\";\n","import { cn } from \"../../utils/cn\";\nimport { useCommand } from \"./Command.context\";\nimport type { CommandListProps } from \"./Command.types\";\n\nexport function CommandList({ children, className }: CommandListProps) {\n const { listId } = useCommand();\n\n return (\n <div\n id={listId}\n data-react-fancy-command-list=\"\"\n role=\"listbox\"\n className={cn(\"max-h-72 overflow-y-auto p-2\", className)}\n >\n {children}\n </div>\n );\n}\n\nCommandList.displayName = \"CommandList\";\n","import { useId } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useCommand } from \"./Command.context\";\nimport type { CommandItemProps } from \"./Command.types\";\n\nexport function CommandItem({\n children,\n value,\n onSelect,\n className,\n}: CommandItemProps) {\n const { query, close, shouldFilter, setActiveIndex } = useCommand();\n // Called before the filter's early return, so the hook order never changes.\n const id = useId();\n\n // Filter by query — unless the caller filters for itself (`shouldFilter={false}`).\n const text = value ?? (typeof children === \"string\" ? children : \"\");\n if (shouldFilter && query && !text.toLowerCase().includes(query.toLowerCase())) {\n return null;\n }\n\n return (\n <button\n id={id}\n data-react-fancy-command-item=\"\"\n type=\"button\"\n role=\"option\"\n // Marked active by Command itself (aria-selected + data-active), since an\n // item cannot know its own position among the rendered options.\n aria-selected={false}\n // Keyboard focus stays in the input; the items are reached with the arrows.\n tabIndex={-1}\n onMouseEnter={(e) => {\n const options = e.currentTarget\n .closest(\"[data-react-fancy-command]\")\n ?.querySelectorAll('[role=\"option\"]');\n if (options) setActiveIndex(Array.from(options).indexOf(e.currentTarget));\n }}\n className={cn(\n \"flex w-full items-center rounded-lg px-3 py-2 text-left text-sm transition-colors\",\n \"text-[color:var(--fancy-text-soft,var(--color-zinc-700))] hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] data-[active]:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] dark:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))] dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))] dark:data-[active]:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]\",\n className,\n )}\n onClick={() => {\n onSelect?.();\n close();\n }}\n >\n {children}\n </button>\n );\n}\n\nCommandItem.displayName = \"CommandItem\";\n","import { cn } from \"../../utils/cn\";\nimport type { CommandGroupProps } from \"./Command.types\";\n\nexport function CommandGroup({\n children,\n heading,\n className,\n}: CommandGroupProps) {\n return (\n <div data-react-fancy-command-group=\"\" role=\"group\" className={cn(\"py-1\", className)}>\n {heading && (\n <div className=\"px-3 py-1.5 text-xs font-medium text-zinc-400\">\n {heading}\n </div>\n )}\n {children}\n </div>\n );\n}\n\nCommandGroup.displayName = \"CommandGroup\";\n","import { cn } from \"../../utils/cn\";\nimport type { CommandEmptyProps } from \"./Command.types\";\n\nexport function CommandEmpty({\n children = \"No results found.\",\n className,\n}: CommandEmptyProps) {\n return (\n <div\n data-react-fancy-command-empty=\"\"\n className={cn(\n \"py-6 text-center text-sm text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))]\",\n className,\n )}\n >\n {children}\n </div>\n );\n}\n\nCommandEmpty.displayName = \"CommandEmpty\";\n","import {\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Portal } from \"../Portal\";\nimport { CommandContext } from \"./Command.context\";\nimport { CommandInput } from \"./CommandInput\";\nimport { CommandList } from \"./CommandList\";\nimport { CommandItem } from \"./CommandItem\";\nimport { CommandGroup } from \"./CommandGroup\";\nimport { CommandEmpty } from \"./CommandEmpty\";\nimport { useFocusTrap } from \"../../hooks/use-focus-trap\";\nimport { useEscapeKey } from \"../../hooks/use-escape-key\";\nimport { useAnimation } from \"../../hooks/use-animation\";\nimport { useControllableState } from \"../../hooks/use-controllable-state\";\nimport type { CommandProps } from \"./Command.types\";\n\nfunction CommandRoot({\n children,\n open,\n onClose,\n className,\n shouldFilter = true,\n query: controlledQuery,\n onQueryChange,\n}: CommandProps) {\n const [query, setQuery] = useControllableState(controlledQuery, \"\", onQueryChange);\n const [activeIndex, setActiveIndex] = useState(-1);\n const panelRef = useRef<HTMLDivElement>(null);\n const listId = useId();\n\n const close = useCallback(() => {\n onClose();\n setQuery(\"\");\n setActiveIndex(-1);\n }, [onClose]);\n\n useEscapeKey(close, open);\n useFocusTrap(panelRef, open);\n\n // Cmd+K global shortcut is handled by the consumer\n useEffect(() => {\n if (open) {\n const original = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = original;\n };\n }\n }, [open]);\n\n /*\n * Keyboard navigation, as a combobox: the arrows move the ACTIVE item while\n * focus stays in the input (announced through aria-activedescendant), and\n * Enter picks the active item — or the first visible one when none is active.\n *\n * Focus used to move onto the items, and Enter was handled nowhere, so typing\n * a query and pressing Enter did nothing: only a focused item took Enter, as a\n * native click. Found by Genie 2's real-window test.\n */\n useEffect(() => {\n if (!open) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const items = panelRef.current?.querySelectorAll<HTMLElement>(\n '[role=\"option\"]',\n );\n if (!items?.length) return;\n\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setActiveIndex(activeIndex < items.length - 1 ? activeIndex + 1 : 0);\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setActiveIndex(activeIndex > 0 ? activeIndex - 1 : items.length - 1);\n } else if (e.key === \"Enter\") {\n // A focused item takes Enter natively, as a click; picking here as well\n // would select it twice.\n if ((e.target as HTMLElement | null)?.getAttribute(\"role\") === \"option\") return;\n const pick = items[activeIndex] ?? items[0];\n e.preventDefault();\n pick.click();\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [open, activeIndex]);\n\n /*\n * Mark the active item and point the input at it. Done on the DOM after each\n * render because an item cannot know its own index — that is its position\n * among the options currently rendered, which filtering changes.\n */\n useLayoutEffect(() => {\n const panel = panelRef.current;\n if (!panel) return;\n\n const items = Array.from(panel.querySelectorAll<HTMLElement>('[role=\"option\"]'));\n const active = items[activeIndex];\n items.forEach((item) => {\n const on = item === active;\n item.setAttribute(\"aria-selected\", on ? \"true\" : \"false\");\n if (on) item.setAttribute(\"data-active\", \"\");\n else item.removeAttribute(\"data-active\");\n });\n\n const input = panel.querySelector<HTMLInputElement>(\"[data-react-fancy-command-input] input\");\n if (active?.id) input?.setAttribute(\"aria-activedescendant\", active.id);\n else input?.removeAttribute(\"aria-activedescendant\");\n active?.scrollIntoView?.({ block: \"nearest\" });\n });\n\n // A new query is a new list: nothing in it is active yet, so Enter picks the first match.\n const changeQuery = useCallback(\n (next: string) => {\n setQuery(next);\n setActiveIndex(-1);\n },\n [setQuery],\n );\n\n const { mounted, className: animClass, ref: animRef } = useAnimation({\n open,\n enterClass: \"fancy-slide-up\",\n exitClass: \"fancy-fade-out\",\n });\n\n const ctx = useMemo(\n () => ({\n open,\n close,\n query,\n setQuery: changeQuery,\n activeIndex,\n setActiveIndex,\n shouldFilter,\n listId,\n }),\n [open, close, query, changeQuery, activeIndex, shouldFilter, listId],\n );\n\n if (!mounted) return null;\n\n return (\n <CommandContext.Provider value={ctx}>\n <Portal>\n <div className=\"fixed inset-0 z-50 flex items-start justify-center pt-[20vh]\">\n <div\n className=\"absolute inset-0 bg-black/50 backdrop-blur-sm\"\n onClick={close}\n aria-hidden=\"true\"\n />\n <div\n ref={(node) => {\n panelRef.current = node;\n (animRef as React.MutableRefObject<HTMLElement | null>).current =\n node;\n }}\n data-react-fancy-command=\"\"\n className={cn(\n \"relative w-full max-w-lg overflow-hidden rounded-2xl border border-[color:var(--fancy-border,var(--color-zinc-200))] bg-[color:var(--fancy-surface,var(--color-white))] shadow-2xl dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\",\n animClass,\n className,\n )}\n >\n {children}\n </div>\n </div>\n </Portal>\n </CommandContext.Provider>\n );\n}\n\nexport const Command = Object.assign(CommandRoot, {\n Input: CommandInput,\n List: CommandList,\n Item: CommandItem,\n Group: CommandGroup,\n Empty: CommandEmpty,\n});\n"]}
|