@adea-ai/ui 0.76.0 → 0.77.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.
@@ -1 +1 @@
1
- {"version":3,"file":"paste-token-editor.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/paste-token-editor.tsx"],"names":[],"mappings":"AAiBA,OAAO,EAUL,KAAK,UAAU,EAChB,MAAM,gBAAgB,CAAA;AAIvB,MAAM,MAAM,eAAe,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,EAAE,CAAA;CAAE,CAAA;AAIpE,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,EAAE,SAAS,UAAU,EAAE,CAAA;IAC7B,GAAG,EAAE,CAAC,OAAO,EAAE,mBAAmB,GAAG,SAAS,KAAK,IAAI,CAAA;IACvD,aAAa,EAAE,MAAM,MAAM,CAAA;IAC3B,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAA;IAC1C,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,EAAE,MAAM,OAAO,CAAA;IACxB,kBAAkB,EAAE,MAAM,IAAI,CAAA;IAC9B,gBAAgB,EAAE,MAAM,IAAI,CAAA;IAC5B,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,SAAS,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAA;CAC1C,CAAA;AAsBD,qFAAqF;AACrF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,kCAmlB5D"}
1
+ {"version":3,"file":"paste-token-editor.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/paste-token-editor.tsx"],"names":[],"mappings":"AAiBA,OAAO,EAUL,KAAK,UAAU,EAChB,MAAM,gBAAgB,CAAA;AAIvB,MAAM,MAAM,eAAe,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,EAAE,CAAA;CAAE,CAAA;AAIpE,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,EAAE,SAAS,UAAU,EAAE,CAAA;IAC7B,GAAG,EAAE,CAAC,OAAO,EAAE,mBAAmB,GAAG,SAAS,KAAK,IAAI,CAAA;IACvD,aAAa,EAAE,MAAM,MAAM,CAAA;IAC3B,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAA;IAC1C,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,EAAE,MAAM,OAAO,CAAA;IACxB,kBAAkB,EAAE,MAAM,IAAI,CAAA;IAC9B,gBAAgB,EAAE,MAAM,IAAI,CAAA;IAC5B,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,SAAS,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAA;CAC1C,CAAA;AAsBD,qFAAqF;AACrF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,kCAkmB5D"}
@@ -38,6 +38,16 @@ function PasteTokenEditor(props) {
38
38
  let mirror;
39
39
  let previewTimer;
40
40
  let scheduledBlockId = null;
41
+ /**
42
+ * What scheduled the current preview. A caret event must not cancel a preview
43
+ * the pointer is owed: a programmatic caret restore (`setCaret` defers to an
44
+ * animation frame) dispatches its `select` event as a separate task that can
45
+ * land *after* a pointermove has already scheduled the hover preview, and a
46
+ * caret with no token under it would otherwise tear that preview down with no
47
+ * further pointermove ever arriving to reschedule it. The pointer's own leave,
48
+ * scroll, blur and reset paths still close unconditionally.
49
+ */
50
+ let previewSource = null;
41
51
  let rawPasteNext = false;
42
52
  let suppressPasteInput = false;
43
53
  let nativePasteInputSeen = false;
@@ -53,12 +63,14 @@ function PasteTokenEditor(props) {
53
63
  clearTimer();
54
64
  scheduledBlockId = null;
55
65
  snappedCaretPreview = null;
66
+ previewSource = null;
56
67
  setPreview(null);
57
68
  };
58
- const schedulePreview = (block) => {
69
+ const schedulePreview = (block, source) => {
59
70
  if (scheduledBlockId === block.id) return;
60
71
  clearTimer();
61
72
  scheduledBlockId = block.id;
73
+ previewSource = source;
62
74
  setPreview(null);
63
75
  previewTimer = setTimeout(() => {
64
76
  previewTimer = void 0;
@@ -131,12 +143,12 @@ function PasteTokenEditor(props) {
131
143
  const caret = field.selectionStart;
132
144
  const range = ranges().find((candidate) => caret > candidate.start && caret < candidate.end);
133
145
  if (range) {
134
- schedulePreview(range.block);
146
+ schedulePreview(range.block, "caret");
135
147
  return;
136
148
  }
137
149
  const snappedRange = snappedCaretPreview?.position === caret ? ranges().find((candidate) => candidate.block.id === snappedCaretPreview?.blockId) : void 0;
138
- if (snappedRange) schedulePreview(snappedRange.block);
139
- else closePreview();
150
+ if (snappedRange) schedulePreview(snappedRange.block, "caret");
151
+ else if (previewSource !== "pointer") closePreview();
140
152
  };
141
153
  const openKeyboardPreview = () => {
142
154
  if (!field) return false;
@@ -146,6 +158,7 @@ function PasteTokenEditor(props) {
146
158
  if (!range) return false;
147
159
  clearTimer();
148
160
  scheduledBlockId = range.block.id;
161
+ previewSource = "keyboard";
149
162
  setPreview(range.block);
150
163
  return true;
151
164
  };
@@ -159,7 +172,7 @@ function PasteTokenEditor(props) {
159
172
  if (event.clientX >= rect.left && event.clientX <= rect.right && event.clientY >= rect.top && event.clientY <= rect.bottom) {
160
173
  const sequence = Number(span.dataset.pasteSeq);
161
174
  const range = ranges().find((candidate) => candidate.block.seq === sequence);
162
- if (range) schedulePreview(range.block);
175
+ if (range) schedulePreview(range.block, "pointer");
163
176
  else closePreview();
164
177
  return;
165
178
  }
@@ -1 +1 @@
1
- {"version":3,"file":"paste-token-editor.js","names":["For","Show","createEffect","createMemo","createSignal","createUniqueId","on","onCleanup","onMount","countLines","findTokenRanges","formatToken","isPasteBlock","nextSeq","pruneBlocks","shouldCollapse","stripTrailingBlankLines","tokenRangeAt","PasteBlock","summarizePastePreview","Tooltip","KobalteTooltip","PasteTokenDraft","text","blocks","TokenRange","start","end","block","Segment","PasteTokenEditorProps","value","resetKey","ref","element","HTMLTextAreaElement","createBlockId","onChange","draft","inputLabel","placeholder","disabled","readOnly","composing","onCompositionStart","onCompositionEnd","onFocus","onBlur","onKeyDown","event","KeyboardEvent","PREVIEW_OPEN_DELAY_MS","isTouchDevice","window","matchMedia","matches","isBlockquotePrefix","linePrefix","sawMarker","index","length","code","charCodeAt","PasteTokenEditor","props","preview","setPreview","previewSummary","content","lines","descriptionId","keyboardHintId","field","mirror","HTMLDivElement","previewTimer","ReturnType","setTimeout","scheduledBlockId","rawPasteNext","suppressPasteInput","nativePasteInputSeen","keyboardNavigationPending","acceptingTextDrop","snappedCaretPreview","blockId","position","ranges","clearTimer","clearTimeout","undefined","closePreview","schedulePreview","id","current","find","range","change","snapToTokenEdge","tokenRanges","edge","setCaret","focus","requestAnimationFrame","setSelectionRange","replaceRange","removed","filter","nextStart","Math","min","map","nextEnd","max","next","slice","some","expandToken","segments","result","cursor","push","scheduleCaretPreview","selectionStart","selectionEnd","caret","candidate","snappedRange","openKeyboardPreview","schedulePointerPreview","MouseEvent","buttons","span","querySelectorAll","HTMLElement","rect","getBoundingClientRect","clientX","left","right","clientY","top","bottom","sequence","Number","dataset","pasteSeq","seq","snapSelection","direction","selectionDirection","handleKeyDown","metaKey","ctrlKey","shiftKey","altKey","key","toLowerCase","isComposing","keyCode","preventDefault","collapsed","plainModifier","backspace","deletion","remove","adjacent","boundary","lastIndexOf","indexOf","from","to","active","navigation","leftward","nextRanges","expandSelectionForClipboard","covered","handlePaste","ClipboardEvent","forceRaw","pasted","clipboardData","getData","cleaned","before","after","leading","endsWith","trailing","startsWith","insert","inserted","document","execCommand","handleDragOver","DragEvent","dataTransfer","types","includes","handleDragLeave","handleDrop","dropped","handleClipboard","expanded","setData","type","handleClick","detail","addEventListener","removeEventListener","_$createComponent","open","onOpenChange","openDelay","children","Trigger","as","_el$","_tmpl$","_$use","_$insert","each","segment","_el$4","_tmpl$4","_$effect","_$setAttribute","_el$5","_tmpl$5","_el$2","_tmpl$2","$$keydown","_$addEventListener","scrollTop","currentTarget","scrollLeft","$$mousemove","$$click","$$input","_p$","_v$","_v$2","_v$3","_v$4","_v$5","e","t","a","o","i","_el$3","_tmpl$3","when","summary","Portal","Content","_el$6","_tmpl$6","hiddenLines","_el$7","_tmpl$7","_el$8","firstChild","_el$0","nextSibling","_el$9","_$memo","hiddenCharacters","_el$1","_tmpl$8","_el$10","_el$12","_el$11","Arrow","_$delegateEvents","_$createComponent","KobalteTooltip","_$setAttribute","_$memo","_$delegateEvents"],"sources":["../../../src/components/conversation/paste-token-editor.tsx"],"sourcesContent":["/*\n * Substantially translated from KiroCrew website/src/components/ChatInput.tsx\n * and PasteHighlightLayer.tsx at 283e136c0f902e965a535a7c9548c57c7504fed0.\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * Licensed under Apache-2.0; see LICENSE and NOTICE.\n */\nimport {\n For,\n Show,\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n on,\n onCleanup,\n onMount,\n} from 'solid-js'\nimport {\n countLines,\n findTokenRanges,\n formatToken,\n isPasteBlock,\n nextSeq,\n pruneBlocks,\n shouldCollapse,\n stripTrailingBlankLines,\n tokenRangeAt,\n type PasteBlock,\n} from './paste-tokens'\nimport { summarizePastePreview } from './paste-preview'\nimport { Tooltip as KobalteTooltip } from '@kobalte/core/tooltip'\n\nexport type PasteTokenDraft = { text: string; blocks: PasteBlock[] }\ntype TokenRange = { start: number; end: number; block: PasteBlock }\ntype Segment = { text: string; block?: PasteBlock }\n\nexport type PasteTokenEditorProps = {\n value: string\n resetKey?: unknown\n blocks: readonly PasteBlock[]\n ref: (element: HTMLTextAreaElement | undefined) => void\n createBlockId: () => string\n onChange: (draft: PasteTokenDraft) => void\n inputLabel: string\n placeholder: string\n disabled?: boolean\n readOnly?: boolean\n composing: () => boolean\n onCompositionStart: () => void\n onCompositionEnd: () => void\n onFocus: () => void\n onBlur: () => void\n onKeyDown: (event: KeyboardEvent) => void\n}\n\nconst PREVIEW_OPEN_DELAY_MS = 300\n\nfunction isTouchDevice(): boolean {\n return (\n typeof window !== 'undefined' &&\n typeof window.matchMedia === 'function' &&\n (window.matchMedia('(pointer: coarse)').matches || window.matchMedia('(hover: none)').matches)\n )\n}\n\nfunction isBlockquotePrefix(linePrefix: string): boolean {\n let sawMarker = false\n for (let index = 0; index < linePrefix.length; index += 1) {\n const code = linePrefix.charCodeAt(index)\n if (code === 62) sawMarker = true\n else if (code !== 32 && code !== 9) return false\n }\n return sawMarker\n}\n\n/** Controlled plain-text editor that treats known paste markers as atomic ranges. */\nexport function PasteTokenEditor(props: PasteTokenEditorProps) {\n const [preview, setPreview] = createSignal<PasteBlock | null>(null)\n const previewSummary = createMemo(() => {\n const block = preview()\n return block ? summarizePastePreview(block.content, block.lines) : null\n })\n const descriptionId = `paste-preview-${createUniqueId()}`\n const keyboardHintId = `paste-keyboard-hint-${createUniqueId()}`\n let field: HTMLTextAreaElement | undefined\n let mirror: HTMLDivElement | undefined\n let previewTimer: ReturnType<typeof setTimeout> | undefined\n let scheduledBlockId: string | null = null\n let rawPasteNext = false\n let suppressPasteInput = false\n let nativePasteInputSeen = false\n let keyboardNavigationPending = false\n let acceptingTextDrop = false\n let snappedCaretPreview: { blockId: string; position: number } | null = null\n\n const ranges = () => findTokenRanges(props.value, props.blocks)\n const clearTimer = () => {\n clearTimeout(previewTimer)\n previewTimer = undefined\n }\n const closePreview = () => {\n clearTimer()\n scheduledBlockId = null\n snappedCaretPreview = null\n setPreview(null)\n }\n const schedulePreview = (block: PasteBlock) => {\n if (scheduledBlockId === block.id) return\n clearTimer()\n scheduledBlockId = block.id\n setPreview(null)\n previewTimer = setTimeout(() => {\n previewTimer = undefined\n const current = ranges().find((range) => range.block.id === block.id)\n if (current) setPreview(current.block)\n else closePreview()\n }, PREVIEW_OPEN_DELAY_MS)\n }\n const change = (text: string, blocks: readonly PasteBlock[] = props.blocks) => {\n props.onChange({ text, blocks: pruneBlocks(text, [...blocks]) })\n }\n const snapToTokenEdge = (\n position: number,\n tokenRanges: readonly TokenRange[] = ranges(),\n edge?: 'start' | 'end'\n ) => {\n for (const range of tokenRanges) {\n if (position > range.start && position < range.end) {\n if (edge === 'start') return range.start\n if (edge === 'end') return range.end\n return position - range.start <= range.end - position ? range.start : range.end\n }\n }\n return position\n }\n const setCaret = (position: number, focus = false) => {\n requestAnimationFrame(() => {\n if (!field) return\n if (focus) field.focus()\n field.setSelectionRange(position, position)\n })\n }\n const replaceRange = (start: number, end: number) => {\n if (!field) return\n const removed = ranges().filter((range) => range.start < end && range.end > start)\n if (!removed.length) return\n const nextStart = Math.min(start, ...removed.map((range) => range.start))\n const nextEnd = Math.max(end, ...removed.map((range) => range.end))\n const next = props.value.slice(0, nextStart) + props.value.slice(nextEnd)\n change(\n next,\n props.blocks.filter((block) => !removed.some((range) => range.block.id === block.id))\n )\n setCaret(nextStart)\n }\n const expandToken = (range: TokenRange) => {\n const next =\n props.value.slice(0, range.start) + range.block.content + props.value.slice(range.end)\n change(\n next,\n props.blocks.filter((block) => block.id !== range.block.id)\n )\n closePreview()\n setCaret(range.start + range.block.content.length, true)\n }\n\n const segments = (): Segment[] => {\n const result: Segment[] = []\n let cursor = 0\n for (const range of ranges()) {\n if (range.start > cursor) result.push({ text: props.value.slice(cursor, range.start) })\n result.push({ text: props.value.slice(range.start, range.end), block: range.block })\n cursor = range.end\n }\n if (cursor < props.value.length) result.push({ text: props.value.slice(cursor) })\n if (!result.length) result.push({ text: props.value })\n return result\n }\n\n const scheduleCaretPreview = () => {\n if (isTouchDevice() || props.composing() || !field) {\n closePreview()\n return\n }\n if (field.selectionStart !== field.selectionEnd) {\n closePreview()\n return\n }\n const caret = field.selectionStart\n const range = ranges().find((candidate) => caret > candidate.start && caret < candidate.end)\n if (range) {\n schedulePreview(range.block)\n return\n }\n const snappedRange =\n snappedCaretPreview?.position === caret\n ? ranges().find((candidate) => candidate.block.id === snappedCaretPreview?.blockId)\n : undefined\n if (snappedRange) schedulePreview(snappedRange.block)\n else closePreview()\n }\n\n const openKeyboardPreview = (): boolean => {\n if (!field) return false\n const start = field.selectionStart\n const end = field.selectionEnd\n const range = ranges().find((candidate) =>\n start === end\n ? start >= candidate.start && start <= candidate.end\n : candidate.start < end && candidate.end > start\n )\n if (!range) return false\n clearTimer()\n scheduledBlockId = range.block.id\n setPreview(range.block)\n return true\n }\n\n const schedulePointerPreview = (event: MouseEvent) => {\n if (isTouchDevice() || props.composing() || event.buttons !== 0 || !mirror) {\n closePreview()\n return\n }\n for (const span of mirror.querySelectorAll<HTMLElement>('[data-paste-seq]')) {\n const rect = span.getBoundingClientRect()\n if (\n event.clientX >= rect.left &&\n event.clientX <= rect.right &&\n event.clientY >= rect.top &&\n event.clientY <= rect.bottom\n ) {\n const sequence = Number(span.dataset.pasteSeq)\n const range = ranges().find((candidate) => candidate.block.seq === sequence)\n if (range) schedulePreview(range.block)\n else closePreview()\n return\n }\n }\n closePreview()\n }\n\n const snapSelection = () => {\n if (!field || props.composing() || acceptingTextDrop) return\n const start = field.selectionStart\n const end = field.selectionEnd\n const direction = field.selectionDirection\n const tokenRanges = ranges()\n if (start === end) {\n if (keyboardNavigationPending) return\n scheduleCaretPreview()\n const next = snapToTokenEdge(start, tokenRanges)\n if (next !== start) {\n const range = tokenRanges.find(\n (candidate) => start > candidate.start && start < candidate.end\n )\n if (range) snappedCaretPreview = { blockId: range.block.id, position: next }\n field.setSelectionRange(next, next, direction)\n }\n return\n }\n scheduleCaretPreview()\n const nextStart = snapToTokenEdge(start, tokenRanges)\n const nextEnd = snapToTokenEdge(end, tokenRanges)\n if (nextStart !== start || nextEnd !== end) {\n field.setSelectionRange(Math.min(nextStart, nextEnd), Math.max(nextStart, nextEnd), direction)\n }\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n snappedCaretPreview = null\n rawPasteNext =\n (event.metaKey || event.ctrlKey) &&\n event.shiftKey &&\n !event.altKey &&\n event.key.toLowerCase() === 'v'\n if (props.composing() || event.isComposing || event.keyCode === 229 || !field) {\n props.onKeyDown(event)\n return\n }\n if (\n event.key === 'ArrowDown' &&\n event.altKey &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.shiftKey &&\n openKeyboardPreview()\n ) {\n event.preventDefault()\n props.onKeyDown(event)\n return\n }\n if (event.key === 'Escape' && preview()) closePreview()\n\n const value = props.value\n const start = field.selectionStart\n const end = field.selectionEnd\n const collapsed = start === end\n const tokenRanges = ranges()\n const plainModifier = !event.metaKey && !event.ctrlKey && !event.altKey\n const backspace = event.key === 'Backspace'\n const deletion = backspace || event.key === 'Delete'\n let remove: readonly [number, number] | undefined\n\n if (deletion && !collapsed) {\n if (tokenRanges.some((range) => range.start < end && range.end > start)) remove = [start, end]\n } else if (deletion) {\n const adjacent = tokenRanges.find((range) =>\n backspace ? range.end === start : range.start === start\n )\n if (adjacent && (plainModifier || event.altKey || event.ctrlKey)) {\n remove = [adjacent.start, adjacent.end]\n } else if (event.metaKey) {\n const boundary = backspace\n ? value.lastIndexOf('\\n', start - 1) + 1\n : value.indexOf('\\n', start)\n const from = backspace ? boundary : start\n const to = backspace ? start : boundary < 0 ? value.length : boundary\n if (tokenRanges.some((range) => range.start < to && range.end > from)) remove = [from, to]\n }\n }\n if (remove) {\n event.preventDefault()\n replaceRange(remove[0], remove[1])\n props.onKeyDown(event)\n return\n }\n\n if (plainModifier && collapsed && !event.shiftKey) {\n const left = event.key === 'ArrowLeft'\n const right = event.key === 'ArrowRight'\n const adjacent = left\n ? tokenRanges.find((range) => range.end === start)\n : right\n ? tokenRanges.find((range) => range.start === start)\n : undefined\n if (adjacent) {\n event.preventDefault()\n setCaret(left ? adjacent.start : adjacent.end)\n props.onKeyDown(event)\n return\n }\n }\n if (!event.metaKey && !event.ctrlKey && !event.altKey && event.shiftKey) {\n const direction = field.selectionDirection === 'backward' ? 'backward' : 'forward'\n const active = direction === 'backward' ? start : end\n const adjacent =\n event.key === 'ArrowLeft'\n ? tokenRanges.find((range) => range.end === active)\n : event.key === 'ArrowRight'\n ? tokenRanges.find((range) => range.start === active)\n : undefined\n if (adjacent) {\n event.preventDefault()\n requestAnimationFrame(() => {\n if (!field) return\n if (event.key === 'ArrowLeft' && direction === 'backward')\n field.setSelectionRange(adjacent.start, end, 'backward')\n else if (event.key === 'ArrowLeft')\n field.setSelectionRange(\n start,\n adjacent.start,\n start <= adjacent.start ? 'forward' : 'backward'\n )\n else if (direction === 'backward')\n field.setSelectionRange(adjacent.end, end, adjacent.end <= end ? 'backward' : 'forward')\n else field.setSelectionRange(start, adjacent.end, 'forward')\n })\n props.onKeyDown(event)\n return\n }\n }\n\n const navigation =\n event.key === 'Home' ||\n event.key === 'End' ||\n ((event.key === 'ArrowLeft' || event.key === 'ArrowRight') &&\n (event.metaKey || event.ctrlKey || event.altKey))\n if (navigation) {\n const leftward = event.key === 'ArrowLeft' || event.key === 'Home'\n keyboardNavigationPending = true\n requestAnimationFrame(() => {\n if (field) {\n const nextRanges = findTokenRanges(field.value, props.blocks)\n const edge = leftward ? 'start' : 'end'\n const nextStart = snapToTokenEdge(field.selectionStart, nextRanges, edge)\n const nextEnd = snapToTokenEdge(field.selectionEnd, nextRanges, edge)\n if (nextStart !== field.selectionStart || nextEnd !== field.selectionEnd) {\n field.setSelectionRange(\n Math.min(nextStart, nextEnd),\n Math.max(nextStart, nextEnd),\n field.selectionDirection\n )\n }\n }\n keyboardNavigationPending = false\n })\n }\n props.onKeyDown(event)\n }\n\n const expandSelectionForClipboard = (start: number, end: number): string | null => {\n if (start === end) return null\n const covered = ranges().filter((range) => range.start >= start && range.end <= end)\n if (!covered.length) return null\n let result = ''\n let cursor = start\n for (const range of covered) {\n result += props.value.slice(cursor, range.start) + range.block.content\n cursor = range.end\n }\n return result + props.value.slice(cursor, end)\n }\n\n const handlePaste = (event: ClipboardEvent) => {\n const forceRaw = rawPasteNext\n rawPasteNext = false\n const pasted = event.clipboardData?.getData('text/plain') ?? ''\n if (!pasted || !field || props.readOnly || props.disabled) return\n const cleaned = forceRaw ? pasted : stripTrailingBlankLines(pasted)\n const start = field.selectionStart\n const end = field.selectionEnd\n const before = props.value.slice(0, start)\n const after = props.value.slice(end)\n\n if (!forceRaw && shouldCollapse(cleaned)) {\n const id = props.createBlockId()\n if (props.blocks.some((block) => block.id === id)) return\n const block: PasteBlock = {\n id,\n seq: nextSeq([...props.blocks]),\n lines: countLines(cleaned),\n content: cleaned,\n }\n if (!isPasteBlock(block)) return\n const linePrefix = before.slice(before.lastIndexOf('\\n') + 1)\n const leading =\n before && !before.endsWith('\\n') && !isBlockquotePrefix(linePrefix) ? '\\n' : ''\n const trailing = after && !after.startsWith('\\n') ? '\\n' : ''\n const insert = leading + formatToken(block) + trailing\n event.preventDefault()\n change(before + insert + after, [...props.blocks, block])\n closePreview()\n setCaret(before.length + insert.length)\n return\n }\n if (forceRaw) return\n if (cleaned !== pasted && cleaned !== '') {\n event.preventDefault()\n const next = before + cleaned + after\n nativePasteInputSeen = false\n suppressPasteInput = true\n let inserted = false\n try {\n inserted =\n typeof document.execCommand === 'function' &&\n document.execCommand('insertText', false, cleaned)\n } catch {\n inserted = false\n }\n if (!nativePasteInputSeen) suppressPasteInput = false\n change(next)\n if (inserted && field.value === next) return\n setCaret(before.length + cleaned.length)\n }\n }\n\n const handleDragOver = (event: DragEvent) => {\n if (!field || props.readOnly || props.disabled || props.composing()) return\n if (event.dataTransfer?.types.includes('text/plain')) {\n acceptingTextDrop = true\n closePreview()\n event.preventDefault()\n }\n }\n\n const handleDragLeave = () => {\n acceptingTextDrop = false\n }\n\n const handleDrop = (event: DragEvent) => {\n if (!field || props.readOnly || props.disabled || props.composing()) {\n acceptingTextDrop = false\n return\n }\n if (!event.dataTransfer?.types.includes('text/plain')) {\n acceptingTextDrop = false\n return\n }\n const dropped = event.dataTransfer.getData('text/plain')\n event.preventDefault()\n acceptingTextDrop = false\n if (!dropped) return\n\n const tokenRanges = ranges()\n let start = field.selectionStart\n let end = field.selectionEnd\n const removed = tokenRanges.filter((range) =>\n start === end\n ? start > range.start && start < range.end\n : range.start < end && range.end > start\n )\n if (removed.length) {\n start = Math.min(start, ...removed.map((range) => range.start))\n end = Math.max(end, ...removed.map((range) => range.end))\n }\n\n change(props.value.slice(0, start) + dropped + props.value.slice(end))\n closePreview()\n setCaret(start + dropped.length)\n }\n\n const handleClipboard = (event: ClipboardEvent) => {\n if (!field || !event.clipboardData) return\n const start = field.selectionStart\n const end = field.selectionEnd\n const expanded = expandSelectionForClipboard(start, end)\n if (expanded === null) return\n event.clipboardData.setData('text/plain', expanded)\n event.preventDefault()\n if (event.type === 'cut') {\n change(props.value.slice(0, start) + props.value.slice(end))\n setCaret(start)\n }\n }\n\n const handleClick = (event: MouseEvent) => {\n if (!field || !props.blocks.length) return\n const range = tokenRangeAt(props.value, props.blocks, field.selectionStart)\n if (!range) return\n if (isTouchDevice() || event.detail >= 2) expandToken(range)\n else {\n requestAnimationFrame(() => field?.setSelectionRange(range.start, range.end))\n }\n }\n\n createEffect(on(() => props.value, closePreview))\n createEffect(on(() => props.blocks, closePreview))\n createEffect(\n on(\n () => props.resetKey,\n () => {\n rawPasteNext = false\n closePreview()\n }\n )\n )\n onMount(() => {\n window.addEventListener('scroll', closePreview, true)\n window.addEventListener('resize', closePreview)\n onCleanup(() => {\n window.removeEventListener('scroll', closePreview, true)\n window.removeEventListener('resize', closePreview)\n })\n })\n onCleanup(() => clearTimer())\n\n return (\n <KobalteTooltip\n open={!!preview()}\n onOpenChange={(open) => {\n if (!open) closePreview()\n }}\n openDelay={PREVIEW_OPEN_DELAY_MS}\n >\n <KobalteTooltip.Trigger as=\"div\" class=\"relative\">\n <div\n ref={(element) => (mirror = element)}\n data-slot=\"paste-token-mirror\"\n aria-hidden=\"true\"\n class=\"pointer-events-none absolute inset-0 overflow-hidden select-none whitespace-pre-wrap break-words px-4 py-3 text-sm text-transparent\"\n >\n <For each={segments()}>\n {(segment) =>\n segment.block ? (\n <span\n class=\"box-decoration-clone rounded-md bg-primary-subtle\"\n data-paste-seq={segment.block.seq}\n >\n {segment.text}\n </span>\n ) : (\n <span>{segment.text}</span>\n )\n }\n </For>\n {props.value.endsWith('\\n') ? '\\u200b' : ''}\n </div>\n <textarea\n ref={(element) => {\n field = element\n props.ref(element)\n onCleanup(() => {\n if (field === element) field = undefined\n props.ref(undefined)\n })\n }}\n data-slot=\"composer-input\"\n aria-label={props.inputLabel}\n aria-describedby={preview() ? `${keyboardHintId} ${descriptionId}` : keyboardHintId}\n aria-keyshortcuts=\"Alt+ArrowDown\"\n class=\"relative field-sizing-content text-foreground placeholder:text-muted-foreground min-h-11 max-h-36 w-full resize-none border-0 bg-transparent px-4 py-3 text-sm outline-none disabled:opacity-50\"\n value={props.value}\n disabled={props.disabled}\n readOnly={props.readOnly}\n placeholder={props.placeholder}\n rows={1}\n onInput={(event) => {\n if (suppressPasteInput) {\n suppressPasteInput = false\n nativePasteInputSeen = true\n return\n }\n change(event.currentTarget.value)\n }}\n onPaste={handlePaste}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onCopy={handleClipboard}\n onCut={handleClipboard}\n onClick={handleClick}\n onSelect={snapSelection}\n onMouseMove={schedulePointerPreview}\n onMouseLeave={closePreview}\n onScroll={(event) => {\n if (mirror) {\n mirror.scrollTop = event.currentTarget.scrollTop\n mirror.scrollLeft = event.currentTarget.scrollLeft\n }\n closePreview()\n }}\n onCompositionStart={props.onCompositionStart}\n onCompositionEnd={props.onCompositionEnd}\n onFocus={props.onFocus}\n onBlur={() => {\n rawPasteNext = false\n acceptingTextDrop = false\n props.onBlur()\n closePreview()\n }}\n onKeyDown={handleKeyDown}\n />\n <span id={keyboardHintId} class=\"visually-hidden\">\n When the caret is next to a paste token or a token is selected, press Alt+Down Arrow to\n preview its text. Press Escape to close the preview.\n </span>\n </KobalteTooltip.Trigger>\n <Show when={previewSummary()}>\n {(summary) => (\n <KobalteTooltip.Portal>\n <KobalteTooltip.Content\n id={descriptionId}\n data-slot=\"paste-token-preview\"\n class=\"bg-scrim text-scrim-foreground z-(--z-tooltip) w-fit max-w-64 rounded-md px-2 py-1 text-xs origin-(--kb-tooltip-content-transform-origin) text-balance data-expanded:animate-in data-expanded:fade-in-0 data-expanded:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 data-expanded:duration-150 data-closed:duration-100\"\n >\n <pre class=\"m-0 max-h-48 max-w-64 overflow-y-auto whitespace-pre-wrap break-words font-mono\">\n {summary().text}\n </pre>\n <Show when={summary().hiddenLines > 0}>\n <span>+{summary().hiddenLines} more lines</span>\n </Show>\n <Show when={summary().hiddenLines === 0 && summary().hiddenCharacters > 0}>\n <span>+{summary().hiddenCharacters} more characters</span>\n </Show>\n <KobalteTooltip.Arrow aria-hidden=\"true\" />\n </KobalteTooltip.Content>\n </KobalteTooltip.Portal>\n )}\n </Show>\n </KobalteTooltip>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"paste-token-editor.js","names":["For","Show","createEffect","createMemo","createSignal","createUniqueId","on","onCleanup","onMount","countLines","findTokenRanges","formatToken","isPasteBlock","nextSeq","pruneBlocks","shouldCollapse","stripTrailingBlankLines","tokenRangeAt","PasteBlock","summarizePastePreview","Tooltip","KobalteTooltip","PasteTokenDraft","text","blocks","TokenRange","start","end","block","Segment","PasteTokenEditorProps","value","resetKey","ref","element","HTMLTextAreaElement","createBlockId","onChange","draft","inputLabel","placeholder","disabled","readOnly","composing","onCompositionStart","onCompositionEnd","onFocus","onBlur","onKeyDown","event","KeyboardEvent","PREVIEW_OPEN_DELAY_MS","isTouchDevice","window","matchMedia","matches","isBlockquotePrefix","linePrefix","sawMarker","index","length","code","charCodeAt","PasteTokenEditor","props","preview","setPreview","previewSummary","content","lines","descriptionId","keyboardHintId","field","mirror","HTMLDivElement","previewTimer","ReturnType","setTimeout","scheduledBlockId","previewSource","rawPasteNext","suppressPasteInput","nativePasteInputSeen","keyboardNavigationPending","acceptingTextDrop","snappedCaretPreview","blockId","position","ranges","clearTimer","clearTimeout","undefined","closePreview","schedulePreview","source","id","current","find","range","change","snapToTokenEdge","tokenRanges","edge","setCaret","focus","requestAnimationFrame","setSelectionRange","replaceRange","removed","filter","nextStart","Math","min","map","nextEnd","max","next","slice","some","expandToken","segments","result","cursor","push","scheduleCaretPreview","selectionStart","selectionEnd","caret","candidate","snappedRange","openKeyboardPreview","schedulePointerPreview","MouseEvent","buttons","span","querySelectorAll","HTMLElement","rect","getBoundingClientRect","clientX","left","right","clientY","top","bottom","sequence","Number","dataset","pasteSeq","seq","snapSelection","direction","selectionDirection","handleKeyDown","metaKey","ctrlKey","shiftKey","altKey","key","toLowerCase","isComposing","keyCode","preventDefault","collapsed","plainModifier","backspace","deletion","remove","adjacent","boundary","lastIndexOf","indexOf","from","to","active","navigation","leftward","nextRanges","expandSelectionForClipboard","covered","handlePaste","ClipboardEvent","forceRaw","pasted","clipboardData","getData","cleaned","before","after","leading","endsWith","trailing","startsWith","insert","inserted","document","execCommand","handleDragOver","DragEvent","dataTransfer","types","includes","handleDragLeave","handleDrop","dropped","handleClipboard","expanded","setData","type","handleClick","detail","addEventListener","removeEventListener","_$createComponent","open","onOpenChange","openDelay","children","Trigger","as","_el$","_tmpl$","_$use","_$insert","each","segment","_el$4","_tmpl$4","_$effect","_$setAttribute","_el$5","_tmpl$5","_el$2","_tmpl$2","$$keydown","_$addEventListener","scrollTop","currentTarget","scrollLeft","$$mousemove","$$click","$$input","_p$","_v$","_v$2","_v$3","_v$4","_v$5","e","t","a","o","i","_el$3","_tmpl$3","when","summary","Portal","Content","_el$6","_tmpl$6","hiddenLines","_el$7","_tmpl$7","_el$8","firstChild","_el$0","nextSibling","_el$9","_$memo","hiddenCharacters","_el$1","_tmpl$8","_el$10","_el$12","_el$11","Arrow","_$delegateEvents","_$createComponent","KobalteTooltip","_$setAttribute","_$memo","_$delegateEvents"],"sources":["../../../src/components/conversation/paste-token-editor.tsx"],"sourcesContent":["/*\n * Substantially translated from KiroCrew website/src/components/ChatInput.tsx\n * and PasteHighlightLayer.tsx at 283e136c0f902e965a535a7c9548c57c7504fed0.\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * Licensed under Apache-2.0; see LICENSE and NOTICE.\n */\nimport {\n For,\n Show,\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n on,\n onCleanup,\n onMount,\n} from 'solid-js'\nimport {\n countLines,\n findTokenRanges,\n formatToken,\n isPasteBlock,\n nextSeq,\n pruneBlocks,\n shouldCollapse,\n stripTrailingBlankLines,\n tokenRangeAt,\n type PasteBlock,\n} from './paste-tokens'\nimport { summarizePastePreview } from './paste-preview'\nimport { Tooltip as KobalteTooltip } from '@kobalte/core/tooltip'\n\nexport type PasteTokenDraft = { text: string; blocks: PasteBlock[] }\ntype TokenRange = { start: number; end: number; block: PasteBlock }\ntype Segment = { text: string; block?: PasteBlock }\n\nexport type PasteTokenEditorProps = {\n value: string\n resetKey?: unknown\n blocks: readonly PasteBlock[]\n ref: (element: HTMLTextAreaElement | undefined) => void\n createBlockId: () => string\n onChange: (draft: PasteTokenDraft) => void\n inputLabel: string\n placeholder: string\n disabled?: boolean\n readOnly?: boolean\n composing: () => boolean\n onCompositionStart: () => void\n onCompositionEnd: () => void\n onFocus: () => void\n onBlur: () => void\n onKeyDown: (event: KeyboardEvent) => void\n}\n\nconst PREVIEW_OPEN_DELAY_MS = 300\n\nfunction isTouchDevice(): boolean {\n return (\n typeof window !== 'undefined' &&\n typeof window.matchMedia === 'function' &&\n (window.matchMedia('(pointer: coarse)').matches || window.matchMedia('(hover: none)').matches)\n )\n}\n\nfunction isBlockquotePrefix(linePrefix: string): boolean {\n let sawMarker = false\n for (let index = 0; index < linePrefix.length; index += 1) {\n const code = linePrefix.charCodeAt(index)\n if (code === 62) sawMarker = true\n else if (code !== 32 && code !== 9) return false\n }\n return sawMarker\n}\n\n/** Controlled plain-text editor that treats known paste markers as atomic ranges. */\nexport function PasteTokenEditor(props: PasteTokenEditorProps) {\n const [preview, setPreview] = createSignal<PasteBlock | null>(null)\n const previewSummary = createMemo(() => {\n const block = preview()\n return block ? summarizePastePreview(block.content, block.lines) : null\n })\n const descriptionId = `paste-preview-${createUniqueId()}`\n const keyboardHintId = `paste-keyboard-hint-${createUniqueId()}`\n let field: HTMLTextAreaElement | undefined\n let mirror: HTMLDivElement | undefined\n let previewTimer: ReturnType<typeof setTimeout> | undefined\n let scheduledBlockId: string | null = null\n /**\n * What scheduled the current preview. A caret event must not cancel a preview\n * the pointer is owed: a programmatic caret restore (`setCaret` defers to an\n * animation frame) dispatches its `select` event as a separate task that can\n * land *after* a pointermove has already scheduled the hover preview, and a\n * caret with no token under it would otherwise tear that preview down with no\n * further pointermove ever arriving to reschedule it. The pointer's own leave,\n * scroll, blur and reset paths still close unconditionally.\n */\n let previewSource: 'pointer' | 'caret' | 'keyboard' | null = null\n let rawPasteNext = false\n let suppressPasteInput = false\n let nativePasteInputSeen = false\n let keyboardNavigationPending = false\n let acceptingTextDrop = false\n let snappedCaretPreview: { blockId: string; position: number } | null = null\n\n const ranges = () => findTokenRanges(props.value, props.blocks)\n const clearTimer = () => {\n clearTimeout(previewTimer)\n previewTimer = undefined\n }\n const closePreview = () => {\n clearTimer()\n scheduledBlockId = null\n snappedCaretPreview = null\n previewSource = null\n setPreview(null)\n }\n const schedulePreview = (block: PasteBlock, source: 'pointer' | 'caret') => {\n if (scheduledBlockId === block.id) return\n clearTimer()\n scheduledBlockId = block.id\n previewSource = source\n setPreview(null)\n previewTimer = setTimeout(() => {\n previewTimer = undefined\n const current = ranges().find((range) => range.block.id === block.id)\n if (current) setPreview(current.block)\n else closePreview()\n }, PREVIEW_OPEN_DELAY_MS)\n }\n const change = (text: string, blocks: readonly PasteBlock[] = props.blocks) => {\n props.onChange({ text, blocks: pruneBlocks(text, [...blocks]) })\n }\n const snapToTokenEdge = (\n position: number,\n tokenRanges: readonly TokenRange[] = ranges(),\n edge?: 'start' | 'end'\n ) => {\n for (const range of tokenRanges) {\n if (position > range.start && position < range.end) {\n if (edge === 'start') return range.start\n if (edge === 'end') return range.end\n return position - range.start <= range.end - position ? range.start : range.end\n }\n }\n return position\n }\n const setCaret = (position: number, focus = false) => {\n requestAnimationFrame(() => {\n if (!field) return\n if (focus) field.focus()\n field.setSelectionRange(position, position)\n })\n }\n const replaceRange = (start: number, end: number) => {\n if (!field) return\n const removed = ranges().filter((range) => range.start < end && range.end > start)\n if (!removed.length) return\n const nextStart = Math.min(start, ...removed.map((range) => range.start))\n const nextEnd = Math.max(end, ...removed.map((range) => range.end))\n const next = props.value.slice(0, nextStart) + props.value.slice(nextEnd)\n change(\n next,\n props.blocks.filter((block) => !removed.some((range) => range.block.id === block.id))\n )\n setCaret(nextStart)\n }\n const expandToken = (range: TokenRange) => {\n const next =\n props.value.slice(0, range.start) + range.block.content + props.value.slice(range.end)\n change(\n next,\n props.blocks.filter((block) => block.id !== range.block.id)\n )\n closePreview()\n setCaret(range.start + range.block.content.length, true)\n }\n\n const segments = (): Segment[] => {\n const result: Segment[] = []\n let cursor = 0\n for (const range of ranges()) {\n if (range.start > cursor) result.push({ text: props.value.slice(cursor, range.start) })\n result.push({ text: props.value.slice(range.start, range.end), block: range.block })\n cursor = range.end\n }\n if (cursor < props.value.length) result.push({ text: props.value.slice(cursor) })\n if (!result.length) result.push({ text: props.value })\n return result\n }\n\n const scheduleCaretPreview = () => {\n if (isTouchDevice() || props.composing() || !field) {\n closePreview()\n return\n }\n if (field.selectionStart !== field.selectionEnd) {\n closePreview()\n return\n }\n const caret = field.selectionStart\n const range = ranges().find((candidate) => caret > candidate.start && caret < candidate.end)\n if (range) {\n schedulePreview(range.block, 'caret')\n return\n }\n const snappedRange =\n snappedCaretPreview?.position === caret\n ? ranges().find((candidate) => candidate.block.id === snappedCaretPreview?.blockId)\n : undefined\n if (snappedRange) schedulePreview(snappedRange.block, 'caret')\n // A caret with no token under it dismisses a caret-sourced preview, but a\n // pointer-scheduled preview outlives it: the pointer has not moved.\n else if (previewSource !== 'pointer') closePreview()\n }\n\n const openKeyboardPreview = (): boolean => {\n if (!field) return false\n const start = field.selectionStart\n const end = field.selectionEnd\n const range = ranges().find((candidate) =>\n start === end\n ? start >= candidate.start && start <= candidate.end\n : candidate.start < end && candidate.end > start\n )\n if (!range) return false\n clearTimer()\n scheduledBlockId = range.block.id\n previewSource = 'keyboard'\n setPreview(range.block)\n return true\n }\n\n const schedulePointerPreview = (event: MouseEvent) => {\n if (isTouchDevice() || props.composing() || event.buttons !== 0 || !mirror) {\n closePreview()\n return\n }\n for (const span of mirror.querySelectorAll<HTMLElement>('[data-paste-seq]')) {\n const rect = span.getBoundingClientRect()\n if (\n event.clientX >= rect.left &&\n event.clientX <= rect.right &&\n event.clientY >= rect.top &&\n event.clientY <= rect.bottom\n ) {\n const sequence = Number(span.dataset.pasteSeq)\n const range = ranges().find((candidate) => candidate.block.seq === sequence)\n if (range) schedulePreview(range.block, 'pointer')\n else closePreview()\n return\n }\n }\n closePreview()\n }\n\n const snapSelection = () => {\n if (!field || props.composing() || acceptingTextDrop) return\n const start = field.selectionStart\n const end = field.selectionEnd\n const direction = field.selectionDirection\n const tokenRanges = ranges()\n if (start === end) {\n if (keyboardNavigationPending) return\n scheduleCaretPreview()\n const next = snapToTokenEdge(start, tokenRanges)\n if (next !== start) {\n const range = tokenRanges.find(\n (candidate) => start > candidate.start && start < candidate.end\n )\n if (range) snappedCaretPreview = { blockId: range.block.id, position: next }\n field.setSelectionRange(next, next, direction)\n }\n return\n }\n scheduleCaretPreview()\n const nextStart = snapToTokenEdge(start, tokenRanges)\n const nextEnd = snapToTokenEdge(end, tokenRanges)\n if (nextStart !== start || nextEnd !== end) {\n field.setSelectionRange(Math.min(nextStart, nextEnd), Math.max(nextStart, nextEnd), direction)\n }\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n snappedCaretPreview = null\n rawPasteNext =\n (event.metaKey || event.ctrlKey) &&\n event.shiftKey &&\n !event.altKey &&\n event.key.toLowerCase() === 'v'\n if (props.composing() || event.isComposing || event.keyCode === 229 || !field) {\n props.onKeyDown(event)\n return\n }\n if (\n event.key === 'ArrowDown' &&\n event.altKey &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.shiftKey &&\n openKeyboardPreview()\n ) {\n event.preventDefault()\n props.onKeyDown(event)\n return\n }\n if (event.key === 'Escape' && preview()) closePreview()\n\n const value = props.value\n const start = field.selectionStart\n const end = field.selectionEnd\n const collapsed = start === end\n const tokenRanges = ranges()\n const plainModifier = !event.metaKey && !event.ctrlKey && !event.altKey\n const backspace = event.key === 'Backspace'\n const deletion = backspace || event.key === 'Delete'\n let remove: readonly [number, number] | undefined\n\n if (deletion && !collapsed) {\n if (tokenRanges.some((range) => range.start < end && range.end > start)) remove = [start, end]\n } else if (deletion) {\n const adjacent = tokenRanges.find((range) =>\n backspace ? range.end === start : range.start === start\n )\n if (adjacent && (plainModifier || event.altKey || event.ctrlKey)) {\n remove = [adjacent.start, adjacent.end]\n } else if (event.metaKey) {\n const boundary = backspace\n ? value.lastIndexOf('\\n', start - 1) + 1\n : value.indexOf('\\n', start)\n const from = backspace ? boundary : start\n const to = backspace ? start : boundary < 0 ? value.length : boundary\n if (tokenRanges.some((range) => range.start < to && range.end > from)) remove = [from, to]\n }\n }\n if (remove) {\n event.preventDefault()\n replaceRange(remove[0], remove[1])\n props.onKeyDown(event)\n return\n }\n\n if (plainModifier && collapsed && !event.shiftKey) {\n const left = event.key === 'ArrowLeft'\n const right = event.key === 'ArrowRight'\n const adjacent = left\n ? tokenRanges.find((range) => range.end === start)\n : right\n ? tokenRanges.find((range) => range.start === start)\n : undefined\n if (adjacent) {\n event.preventDefault()\n setCaret(left ? adjacent.start : adjacent.end)\n props.onKeyDown(event)\n return\n }\n }\n if (!event.metaKey && !event.ctrlKey && !event.altKey && event.shiftKey) {\n const direction = field.selectionDirection === 'backward' ? 'backward' : 'forward'\n const active = direction === 'backward' ? start : end\n const adjacent =\n event.key === 'ArrowLeft'\n ? tokenRanges.find((range) => range.end === active)\n : event.key === 'ArrowRight'\n ? tokenRanges.find((range) => range.start === active)\n : undefined\n if (adjacent) {\n event.preventDefault()\n requestAnimationFrame(() => {\n if (!field) return\n if (event.key === 'ArrowLeft' && direction === 'backward')\n field.setSelectionRange(adjacent.start, end, 'backward')\n else if (event.key === 'ArrowLeft')\n field.setSelectionRange(\n start,\n adjacent.start,\n start <= adjacent.start ? 'forward' : 'backward'\n )\n else if (direction === 'backward')\n field.setSelectionRange(adjacent.end, end, adjacent.end <= end ? 'backward' : 'forward')\n else field.setSelectionRange(start, adjacent.end, 'forward')\n })\n props.onKeyDown(event)\n return\n }\n }\n\n const navigation =\n event.key === 'Home' ||\n event.key === 'End' ||\n ((event.key === 'ArrowLeft' || event.key === 'ArrowRight') &&\n (event.metaKey || event.ctrlKey || event.altKey))\n if (navigation) {\n const leftward = event.key === 'ArrowLeft' || event.key === 'Home'\n keyboardNavigationPending = true\n requestAnimationFrame(() => {\n if (field) {\n const nextRanges = findTokenRanges(field.value, props.blocks)\n const edge = leftward ? 'start' : 'end'\n const nextStart = snapToTokenEdge(field.selectionStart, nextRanges, edge)\n const nextEnd = snapToTokenEdge(field.selectionEnd, nextRanges, edge)\n if (nextStart !== field.selectionStart || nextEnd !== field.selectionEnd) {\n field.setSelectionRange(\n Math.min(nextStart, nextEnd),\n Math.max(nextStart, nextEnd),\n field.selectionDirection\n )\n }\n }\n keyboardNavigationPending = false\n })\n }\n props.onKeyDown(event)\n }\n\n const expandSelectionForClipboard = (start: number, end: number): string | null => {\n if (start === end) return null\n const covered = ranges().filter((range) => range.start >= start && range.end <= end)\n if (!covered.length) return null\n let result = ''\n let cursor = start\n for (const range of covered) {\n result += props.value.slice(cursor, range.start) + range.block.content\n cursor = range.end\n }\n return result + props.value.slice(cursor, end)\n }\n\n const handlePaste = (event: ClipboardEvent) => {\n const forceRaw = rawPasteNext\n rawPasteNext = false\n const pasted = event.clipboardData?.getData('text/plain') ?? ''\n if (!pasted || !field || props.readOnly || props.disabled) return\n const cleaned = forceRaw ? pasted : stripTrailingBlankLines(pasted)\n const start = field.selectionStart\n const end = field.selectionEnd\n const before = props.value.slice(0, start)\n const after = props.value.slice(end)\n\n if (!forceRaw && shouldCollapse(cleaned)) {\n const id = props.createBlockId()\n if (props.blocks.some((block) => block.id === id)) return\n const block: PasteBlock = {\n id,\n seq: nextSeq([...props.blocks]),\n lines: countLines(cleaned),\n content: cleaned,\n }\n if (!isPasteBlock(block)) return\n const linePrefix = before.slice(before.lastIndexOf('\\n') + 1)\n const leading =\n before && !before.endsWith('\\n') && !isBlockquotePrefix(linePrefix) ? '\\n' : ''\n const trailing = after && !after.startsWith('\\n') ? '\\n' : ''\n const insert = leading + formatToken(block) + trailing\n event.preventDefault()\n change(before + insert + after, [...props.blocks, block])\n closePreview()\n setCaret(before.length + insert.length)\n return\n }\n if (forceRaw) return\n if (cleaned !== pasted && cleaned !== '') {\n event.preventDefault()\n const next = before + cleaned + after\n nativePasteInputSeen = false\n suppressPasteInput = true\n let inserted = false\n try {\n inserted =\n typeof document.execCommand === 'function' &&\n document.execCommand('insertText', false, cleaned)\n } catch {\n inserted = false\n }\n if (!nativePasteInputSeen) suppressPasteInput = false\n change(next)\n if (inserted && field.value === next) return\n setCaret(before.length + cleaned.length)\n }\n }\n\n const handleDragOver = (event: DragEvent) => {\n if (!field || props.readOnly || props.disabled || props.composing()) return\n if (event.dataTransfer?.types.includes('text/plain')) {\n acceptingTextDrop = true\n closePreview()\n event.preventDefault()\n }\n }\n\n const handleDragLeave = () => {\n acceptingTextDrop = false\n }\n\n const handleDrop = (event: DragEvent) => {\n if (!field || props.readOnly || props.disabled || props.composing()) {\n acceptingTextDrop = false\n return\n }\n if (!event.dataTransfer?.types.includes('text/plain')) {\n acceptingTextDrop = false\n return\n }\n const dropped = event.dataTransfer.getData('text/plain')\n event.preventDefault()\n acceptingTextDrop = false\n if (!dropped) return\n\n const tokenRanges = ranges()\n let start = field.selectionStart\n let end = field.selectionEnd\n const removed = tokenRanges.filter((range) =>\n start === end\n ? start > range.start && start < range.end\n : range.start < end && range.end > start\n )\n if (removed.length) {\n start = Math.min(start, ...removed.map((range) => range.start))\n end = Math.max(end, ...removed.map((range) => range.end))\n }\n\n change(props.value.slice(0, start) + dropped + props.value.slice(end))\n closePreview()\n setCaret(start + dropped.length)\n }\n\n const handleClipboard = (event: ClipboardEvent) => {\n if (!field || !event.clipboardData) return\n const start = field.selectionStart\n const end = field.selectionEnd\n const expanded = expandSelectionForClipboard(start, end)\n if (expanded === null) return\n event.clipboardData.setData('text/plain', expanded)\n event.preventDefault()\n if (event.type === 'cut') {\n change(props.value.slice(0, start) + props.value.slice(end))\n setCaret(start)\n }\n }\n\n const handleClick = (event: MouseEvent) => {\n if (!field || !props.blocks.length) return\n const range = tokenRangeAt(props.value, props.blocks, field.selectionStart)\n if (!range) return\n if (isTouchDevice() || event.detail >= 2) expandToken(range)\n else {\n requestAnimationFrame(() => field?.setSelectionRange(range.start, range.end))\n }\n }\n\n createEffect(on(() => props.value, closePreview))\n createEffect(on(() => props.blocks, closePreview))\n createEffect(\n on(\n () => props.resetKey,\n () => {\n rawPasteNext = false\n closePreview()\n }\n )\n )\n onMount(() => {\n window.addEventListener('scroll', closePreview, true)\n window.addEventListener('resize', closePreview)\n onCleanup(() => {\n window.removeEventListener('scroll', closePreview, true)\n window.removeEventListener('resize', closePreview)\n })\n })\n onCleanup(() => clearTimer())\n\n return (\n <KobalteTooltip\n open={!!preview()}\n onOpenChange={(open) => {\n if (!open) closePreview()\n }}\n openDelay={PREVIEW_OPEN_DELAY_MS}\n >\n <KobalteTooltip.Trigger as=\"div\" class=\"relative\">\n <div\n ref={(element) => (mirror = element)}\n data-slot=\"paste-token-mirror\"\n aria-hidden=\"true\"\n class=\"pointer-events-none absolute inset-0 overflow-hidden select-none whitespace-pre-wrap break-words px-4 py-3 text-sm text-transparent\"\n >\n <For each={segments()}>\n {(segment) =>\n segment.block ? (\n <span\n class=\"box-decoration-clone rounded-md bg-primary-subtle\"\n data-paste-seq={segment.block.seq}\n >\n {segment.text}\n </span>\n ) : (\n <span>{segment.text}</span>\n )\n }\n </For>\n {props.value.endsWith('\\n') ? '\\u200b' : ''}\n </div>\n <textarea\n ref={(element) => {\n field = element\n props.ref(element)\n onCleanup(() => {\n if (field === element) field = undefined\n props.ref(undefined)\n })\n }}\n data-slot=\"composer-input\"\n aria-label={props.inputLabel}\n aria-describedby={preview() ? `${keyboardHintId} ${descriptionId}` : keyboardHintId}\n aria-keyshortcuts=\"Alt+ArrowDown\"\n class=\"relative field-sizing-content text-foreground placeholder:text-muted-foreground min-h-11 max-h-36 w-full resize-none border-0 bg-transparent px-4 py-3 text-sm outline-none disabled:opacity-50\"\n value={props.value}\n disabled={props.disabled}\n readOnly={props.readOnly}\n placeholder={props.placeholder}\n rows={1}\n onInput={(event) => {\n if (suppressPasteInput) {\n suppressPasteInput = false\n nativePasteInputSeen = true\n return\n }\n change(event.currentTarget.value)\n }}\n onPaste={handlePaste}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onCopy={handleClipboard}\n onCut={handleClipboard}\n onClick={handleClick}\n onSelect={snapSelection}\n onMouseMove={schedulePointerPreview}\n onMouseLeave={closePreview}\n onScroll={(event) => {\n if (mirror) {\n mirror.scrollTop = event.currentTarget.scrollTop\n mirror.scrollLeft = event.currentTarget.scrollLeft\n }\n closePreview()\n }}\n onCompositionStart={props.onCompositionStart}\n onCompositionEnd={props.onCompositionEnd}\n onFocus={props.onFocus}\n onBlur={() => {\n rawPasteNext = false\n acceptingTextDrop = false\n props.onBlur()\n closePreview()\n }}\n onKeyDown={handleKeyDown}\n />\n <span id={keyboardHintId} class=\"visually-hidden\">\n When the caret is next to a paste token or a token is selected, press Alt+Down Arrow to\n preview its text. Press Escape to close the preview.\n </span>\n </KobalteTooltip.Trigger>\n <Show when={previewSummary()}>\n {(summary) => (\n <KobalteTooltip.Portal>\n <KobalteTooltip.Content\n id={descriptionId}\n data-slot=\"paste-token-preview\"\n class=\"bg-scrim text-scrim-foreground z-(--z-tooltip) w-fit max-w-64 rounded-md px-2 py-1 text-xs origin-(--kb-tooltip-content-transform-origin) text-balance data-expanded:animate-in data-expanded:fade-in-0 data-expanded:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 data-expanded:duration-150 data-closed:duration-100\"\n >\n <pre class=\"m-0 max-h-48 max-w-64 overflow-y-auto whitespace-pre-wrap break-words font-mono\">\n {summary().text}\n </pre>\n <Show when={summary().hiddenLines > 0}>\n <span>+{summary().hiddenLines} more lines</span>\n </Show>\n <Show when={summary().hiddenLines === 0 && summary().hiddenCharacters > 0}>\n <span>+{summary().hiddenCharacters} more characters</span>\n </Show>\n <KobalteTooltip.Arrow aria-hidden=\"true\" />\n </KobalteTooltip.Content>\n </KobalteTooltip.Portal>\n )}\n </Show>\n </KobalteTooltip>\n )\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/command/command.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,IAAI,UAAU,EAC3B,YAAY,IAAI,SAAS,EACzB,YAAY,IAAI,SAAS,EACzB,YAAY,IAAI,SAAS,EACzB,WAAW,IAAI,QAAQ,EACvB,WAAW,IAAI,QAAQ,EACvB,cAAc,IAAI,WAAW,EAC7B,WAAW,IAAI,QAAQ,EACvB,gBAAgB,IAAI,aAAa,EAElC,MAAM,YAAY,CAAA;AAEnB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAK9C;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,QAAQ,CAAC,kCAY7D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,UAAU,CAAC,kCAerE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,SAAS,CAAC,kCAmBnE;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,QAAQ,CAAC,kCAgCjE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,SAAS,CAAC,kCAcnE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,SAAS,CAAC,kCAanE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,QAAQ,CAAC,kCAajE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,aAAa,CAAC,kCAG3E;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,WAAW,CAAC,kCAQvE;AAED,wDAAwD;AACxD,wBAAgB,eAAe,CAAC,KAAK,EAAE;IACrC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAA;CAC9C,kCAQA"}
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/command/command.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,IAAI,UAAU,EAC3B,YAAY,IAAI,SAAS,EACzB,YAAY,IAAI,SAAS,EACzB,YAAY,IAAI,SAAS,EACzB,WAAW,IAAI,QAAQ,EACvB,WAAW,IAAI,QAAQ,EACvB,cAAc,IAAI,WAAW,EAC7B,WAAW,IAAI,QAAQ,EACvB,gBAAgB,IAAI,aAAa,EAElC,MAAM,YAAY,CAAA;AAEnB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAK9C;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,QAAQ,CAAC,kCAY7D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,UAAU,CAAC,kCAqBrE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,SAAS,CAAC,kCAmBnE;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,QAAQ,CAAC,kCAgCjE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,SAAS,CAAC,kCAcnE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,SAAS,CAAC,kCAanE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,QAAQ,CAAC,kCAajE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,aAAa,CAAC,kCAG3E;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,WAAW,CAAC,kCAQvE;AAED,wDAAwD;AACxD,wBAAgB,eAAe,CAAC,KAAK,EAAE;IACrC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAA;CAC9C,kCAQA"}
@@ -32,7 +32,7 @@ function Command(props) {
32
32
  }
33
33
  function CommandDialog$1(props) {
34
34
  const [local, rest] = splitProps(props, ["class"]);
35
- return createComponent(CommandDialog, mergeProps({ get ["class"]() {
35
+ return createComponent(CommandDialog, mergeProps({ get contentClassName() {
36
36
  return cn("bg-popover text-popover-foreground fixed top-1/3 left-1/2 z-(--z-dialog) w-full max-w-lg -translate-x-1/2 -translate-y-1/2", "overflow-hidden rounded-xl border border-border shadow-xl", "data-expanded:animate-in data-expanded:fade-in-0 data-expanded:zoom-in-95", "data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", local.class);
37
37
  } }, rest));
38
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"command.js","names":["CommandDialog","CmdkDialog","CommandEmpty","CmdkEmpty","CommandGroup","CmdkGroup","CommandInput","CmdkInput","CommandItem","CmdkItem","CommandList","CmdkList","CommandLoading","CmdkLoading","CommandRoot","CmdkRoot","CommandSeparator","CmdkSeparator","useCommandState","Search","ComponentProps","createEffect","createSignal","splitProps","menuItem","cn","Command","props","local","rest","_$createComponent","_$mergeProps","class","_el$","_tmpl$","_$insert","wrapper","setWrapper","HTMLDivElement","resultCount","state","filtered","count","root","selector","querySelector","setAttribute","_el$2","_tmpl$2","_$use","role","CommandShortcut","children","_el$3","_tmpl$3","_$effect","_$className","_$createComponent","CmdkRoot","_$mergeProps","CommandDialog","CmdkDialog","CommandInput","CmdkInput","CommandList","CmdkList","CommandEmpty","CmdkEmpty","CommandGroup","CmdkGroup","CommandItem","CmdkItem","CommandSeparator","CmdkSeparator","CommandLoading","CmdkLoading","_$className"],"sources":["../../../../src/components/ui/command/command.tsx"],"sourcesContent":["import {\n CommandDialog as CmdkDialog,\n CommandEmpty as CmdkEmpty,\n CommandGroup as CmdkGroup,\n CommandInput as CmdkInput,\n CommandItem as CmdkItem,\n CommandList as CmdkList,\n CommandLoading as CmdkLoading,\n CommandRoot as CmdkRoot,\n CommandSeparator as CmdkSeparator,\n useCommandState,\n} from 'cmdk-solid'\nimport { Search } from 'lucide-solid'\nimport type { ComponentProps } from 'solid-js'\nimport { createEffect, createSignal, splitProps } from 'solid-js'\nimport { menuItem } from '#lib/overlay'\nimport { cn } from '#lib/utils'\n\n/**\n * Command.\n *\n * The command palette: a filtered list of everything the user can do, ranked\n * by fuzzy match. It is the one place in an app where a keyboard-first surface\n * is the *primary* one, so it carries rules the rest of the system does not:\n *\n * - Every item must be reachable by typing its name. If a user has to\n * remember which group it lives in, the palette has failed at its job.\n * - Groups exist for reading, not for navigation. The ranking crosses them.\n * - The empty state is not an apology — it should offer the closest thing\n * the app could guess, or say plainly that nothing matched.\n *\n * cmdk-solid supplies the filter, the scoring, the `aria-activedescendant`\n * wiring and the arrow-key navigation.\n */\nexport function Command(props: ComponentProps<typeof CmdkRoot>) {\n const [local, rest] = splitProps(props, ['class'])\n\n return (\n <CmdkRoot\n class={cn(\n 'bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-xl',\n local.class\n )}\n {...rest}\n />\n )\n}\n\nexport function CommandDialog(props: ComponentProps<typeof CmdkDialog>) {\n const [local, rest] = splitProps(props, ['class'])\n\n return (\n <CmdkDialog\n class={cn(\n 'bg-popover text-popover-foreground fixed top-1/3 left-1/2 z-(--z-dialog) w-full max-w-lg -translate-x-1/2 -translate-y-1/2',\n 'overflow-hidden rounded-xl border border-border shadow-xl',\n 'data-expanded:animate-in data-expanded:fade-in-0 data-expanded:zoom-in-95',\n 'data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95',\n local.class\n )}\n {...rest}\n />\n )\n}\n\nexport function CommandInput(props: ComponentProps<typeof CmdkInput>) {\n const [local, rest] = splitProps(props, ['class'])\n\n return (\n <div\n data-slot=\"command-input-wrapper\"\n class=\"flex h-11 items-center gap-2 border-b border-border px-3\"\n >\n <Search class=\"size-4 shrink-0 text-muted-foreground\" aria-hidden=\"true\" />\n <CmdkInput\n class={cn(\n 'h-full w-full bg-transparent text-sm outline-none placeholder:text-muted-foreground',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n local.class\n )}\n {...rest}\n />\n </div>\n )\n}\n\n/**\n * The scrolling list.\n *\n * Two DOM corrections, and both are deliberate. cmdk builds a `role=\"listbox\"`\n * whose children include two elements ARIA does not allow there:\n *\n * - a bare `<div cmdk-list-sizer>` with no role, wrapped around every group;\n * - a `<div cmdk-separator role=\"separator\">`, and `separator` is a menu and\n * toolbar role — inside a listbox the only owned elements may be `option`\n * and `group`.\n *\n * Both are pure presentation: the sizer is layout, and the separator is a\n * hairline between groups that the groups already structure. `role=\"presentation\"`\n * is their accurate role rather than a workaround — each is flattened out of the\n * accessibility tree, and the options inside are reached exactly as before.\n *\n * Written onto the mounted nodes rather than through props, because cmdk owns\n * this markup and does not forward a `ref`; in an effect rather than `onMount`,\n * because cmdk renders the sizer with the first item, after the list itself.\n */\nexport function CommandList(props: ComponentProps<typeof CmdkList>) {\n const [local, rest] = splitProps(props, ['class'])\n const [wrapper, setWrapper] = createSignal<HTMLDivElement>()\n const resultCount = useCommandState((state) => state.filtered.count)\n\n createEffect(() => {\n const root = wrapper()\n if (!root) return\n for (const selector of ['[cmdk-list-sizer]', '[cmdk-separator]']) {\n root.querySelector(selector)?.setAttribute('role', 'presentation')\n }\n\n /*\n * A `listbox` must own at least one `option`, so a listbox with nothing in it\n * is invalid ARIA — which is what a search with no matches produces. When\n * there are no results the list is inert, so it becomes presentational and\n * the empty message carries the information instead. It keeps its `id`, so\n * the input's `aria-controls` still resolves.\n */\n root\n .querySelector('[cmdk-list]')\n ?.setAttribute('role', resultCount() > 0 ? 'listbox' : 'presentation')\n })\n\n return (\n <div ref={setWrapper} class=\"contents\">\n <CmdkList\n class={cn('max-h-80 scroll-py-1 overflow-y-auto overflow-x-hidden p-1', local.class)}\n {...rest}\n />\n </div>\n )\n}\n\nexport function CommandEmpty(props: ComponentProps<typeof CmdkEmpty>) {\n const [local, rest] = splitProps(props, ['class'])\n\n return (\n <CmdkEmpty\n /*\n * A status rather than plain text: when the list is presentational, this is\n * the only thing that tells a screen reader the search matched nothing.\n */\n role=\"status\"\n class={cn('text-muted-foreground py-8 text-center text-sm', local.class)}\n {...rest}\n />\n )\n}\n\nexport function CommandGroup(props: ComponentProps<typeof CmdkGroup>) {\n const [local, rest] = splitProps(props, ['class'])\n\n return (\n <CmdkGroup\n class={cn(\n 'text-foreground overflow-hidden p-1',\n '[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-2xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:tracking-wide [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group-heading]]:uppercase',\n local.class\n )}\n {...rest}\n />\n )\n}\n\nexport function CommandItem(props: ComponentProps<typeof CmdkItem>) {\n const [local, rest] = splitProps(props, ['class'])\n\n return (\n <CmdkItem\n class={cn(\n menuItem,\n 'data-[selected=true]:bg-surface-hover data-[selected=true]:text-foreground',\n local.class\n )}\n {...rest}\n />\n )\n}\n\nexport function CommandSeparator(props: ComponentProps<typeof CmdkSeparator>) {\n const [local, rest] = splitProps(props, ['class'])\n return <CmdkSeparator class={cn('bg-border -mx-1 my-1 h-px', local.class)} {...rest} />\n}\n\nexport function CommandLoading(props: ComponentProps<typeof CmdkLoading>) {\n const [local, rest] = splitProps(props, ['class'])\n return (\n <CmdkLoading\n class={cn('text-muted-foreground py-6 text-center text-sm', local.class)}\n {...rest}\n />\n )\n}\n\n/** The keyboard hint a palette item usually carries. */\nexport function CommandShortcut(props: {\n class?: string\n children?: ComponentProps<'span'>['children']\n}) {\n return (\n <span\n class={cn('text-muted-foreground ms-auto font-mono text-2xs tracking-widest', props.class)}\n >\n {props.children}\n </span>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"command.js","names":["CommandDialog","CmdkDialog","CommandEmpty","CmdkEmpty","CommandGroup","CmdkGroup","CommandInput","CmdkInput","CommandItem","CmdkItem","CommandList","CmdkList","CommandLoading","CmdkLoading","CommandRoot","CmdkRoot","CommandSeparator","CmdkSeparator","useCommandState","Search","ComponentProps","createEffect","createSignal","splitProps","menuItem","cn","Command","props","local","rest","_$createComponent","_$mergeProps","class","contentClassName","_el$","_tmpl$","_$insert","wrapper","setWrapper","HTMLDivElement","resultCount","state","filtered","count","root","selector","querySelector","setAttribute","_el$2","_tmpl$2","_$use","role","CommandShortcut","children","_el$3","_tmpl$3","_$effect","_$className","_$createComponent","CmdkRoot","_$mergeProps","CommandDialog","CmdkDialog","CommandInput","CmdkInput","CommandList","CmdkList","CommandEmpty","CmdkEmpty","CommandGroup","CmdkGroup","CommandItem","CmdkItem","CommandSeparator","CmdkSeparator","CommandLoading","CmdkLoading","_$className"],"sources":["../../../../src/components/ui/command/command.tsx"],"sourcesContent":["import {\n CommandDialog as CmdkDialog,\n CommandEmpty as CmdkEmpty,\n CommandGroup as CmdkGroup,\n CommandInput as CmdkInput,\n CommandItem as CmdkItem,\n CommandList as CmdkList,\n CommandLoading as CmdkLoading,\n CommandRoot as CmdkRoot,\n CommandSeparator as CmdkSeparator,\n useCommandState,\n} from 'cmdk-solid'\nimport { Search } from 'lucide-solid'\nimport type { ComponentProps } from 'solid-js'\nimport { createEffect, createSignal, splitProps } from 'solid-js'\nimport { menuItem } from '#lib/overlay'\nimport { cn } from '#lib/utils'\n\n/**\n * Command.\n *\n * The command palette: a filtered list of everything the user can do, ranked\n * by fuzzy match. It is the one place in an app where a keyboard-first surface\n * is the *primary* one, so it carries rules the rest of the system does not:\n *\n * - Every item must be reachable by typing its name. If a user has to\n * remember which group it lives in, the palette has failed at its job.\n * - Groups exist for reading, not for navigation. The ranking crosses them.\n * - The empty state is not an apology — it should offer the closest thing\n * the app could guess, or say plainly that nothing matched.\n *\n * cmdk-solid supplies the filter, the scoring, the `aria-activedescendant`\n * wiring and the arrow-key navigation.\n */\nexport function Command(props: ComponentProps<typeof CmdkRoot>) {\n const [local, rest] = splitProps(props, ['class'])\n\n return (\n <CmdkRoot\n class={cn(\n 'bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-xl',\n local.class\n )}\n {...rest}\n />\n )\n}\n\nexport function CommandDialog(props: ComponentProps<typeof CmdkDialog>) {\n // cmdk's Dialog splits `contentClassName` onto the role=\"dialog\" content\n // element and routes every other prop (including `class`) to the inner\n // Command. The surface must live on the content: a `class` here styles the\n // Command (fixed, so visible) while the dialog element itself renders as an\n // unstyled zero-height wrapper at the end of body — invisible to role\n // queries and axe.\n const [local, rest] = splitProps(props, ['class'])\n\n return (\n <CmdkDialog\n contentClassName={cn(\n 'bg-popover text-popover-foreground fixed top-1/3 left-1/2 z-(--z-dialog) w-full max-w-lg -translate-x-1/2 -translate-y-1/2',\n 'overflow-hidden rounded-xl border border-border shadow-xl',\n 'data-expanded:animate-in data-expanded:fade-in-0 data-expanded:zoom-in-95',\n 'data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95',\n local.class\n )}\n {...rest}\n />\n )\n}\n\nexport function CommandInput(props: ComponentProps<typeof CmdkInput>) {\n const [local, rest] = splitProps(props, ['class'])\n\n return (\n <div\n data-slot=\"command-input-wrapper\"\n class=\"flex h-11 items-center gap-2 border-b border-border px-3\"\n >\n <Search class=\"size-4 shrink-0 text-muted-foreground\" aria-hidden=\"true\" />\n <CmdkInput\n class={cn(\n 'h-full w-full bg-transparent text-sm outline-none placeholder:text-muted-foreground',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n local.class\n )}\n {...rest}\n />\n </div>\n )\n}\n\n/**\n * The scrolling list.\n *\n * Two DOM corrections, and both are deliberate. cmdk builds a `role=\"listbox\"`\n * whose children include two elements ARIA does not allow there:\n *\n * - a bare `<div cmdk-list-sizer>` with no role, wrapped around every group;\n * - a `<div cmdk-separator role=\"separator\">`, and `separator` is a menu and\n * toolbar role — inside a listbox the only owned elements may be `option`\n * and `group`.\n *\n * Both are pure presentation: the sizer is layout, and the separator is a\n * hairline between groups that the groups already structure. `role=\"presentation\"`\n * is their accurate role rather than a workaround — each is flattened out of the\n * accessibility tree, and the options inside are reached exactly as before.\n *\n * Written onto the mounted nodes rather than through props, because cmdk owns\n * this markup and does not forward a `ref`; in an effect rather than `onMount`,\n * because cmdk renders the sizer with the first item, after the list itself.\n */\nexport function CommandList(props: ComponentProps<typeof CmdkList>) {\n const [local, rest] = splitProps(props, ['class'])\n const [wrapper, setWrapper] = createSignal<HTMLDivElement>()\n const resultCount = useCommandState((state) => state.filtered.count)\n\n createEffect(() => {\n const root = wrapper()\n if (!root) return\n for (const selector of ['[cmdk-list-sizer]', '[cmdk-separator]']) {\n root.querySelector(selector)?.setAttribute('role', 'presentation')\n }\n\n /*\n * A `listbox` must own at least one `option`, so a listbox with nothing in it\n * is invalid ARIA — which is what a search with no matches produces. When\n * there are no results the list is inert, so it becomes presentational and\n * the empty message carries the information instead. It keeps its `id`, so\n * the input's `aria-controls` still resolves.\n */\n root\n .querySelector('[cmdk-list]')\n ?.setAttribute('role', resultCount() > 0 ? 'listbox' : 'presentation')\n })\n\n return (\n <div ref={setWrapper} class=\"contents\">\n <CmdkList\n class={cn('max-h-80 scroll-py-1 overflow-y-auto overflow-x-hidden p-1', local.class)}\n {...rest}\n />\n </div>\n )\n}\n\nexport function CommandEmpty(props: ComponentProps<typeof CmdkEmpty>) {\n const [local, rest] = splitProps(props, ['class'])\n\n return (\n <CmdkEmpty\n /*\n * A status rather than plain text: when the list is presentational, this is\n * the only thing that tells a screen reader the search matched nothing.\n */\n role=\"status\"\n class={cn('text-muted-foreground py-8 text-center text-sm', local.class)}\n {...rest}\n />\n )\n}\n\nexport function CommandGroup(props: ComponentProps<typeof CmdkGroup>) {\n const [local, rest] = splitProps(props, ['class'])\n\n return (\n <CmdkGroup\n class={cn(\n 'text-foreground overflow-hidden p-1',\n '[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-2xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:tracking-wide [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group-heading]]:uppercase',\n local.class\n )}\n {...rest}\n />\n )\n}\n\nexport function CommandItem(props: ComponentProps<typeof CmdkItem>) {\n const [local, rest] = splitProps(props, ['class'])\n\n return (\n <CmdkItem\n class={cn(\n menuItem,\n 'data-[selected=true]:bg-surface-hover data-[selected=true]:text-foreground',\n local.class\n )}\n {...rest}\n />\n )\n}\n\nexport function CommandSeparator(props: ComponentProps<typeof CmdkSeparator>) {\n const [local, rest] = splitProps(props, ['class'])\n return <CmdkSeparator class={cn('bg-border -mx-1 my-1 h-px', local.class)} {...rest} />\n}\n\nexport function CommandLoading(props: ComponentProps<typeof CmdkLoading>) {\n const [local, rest] = splitProps(props, ['class'])\n return (\n <CmdkLoading\n class={cn('text-muted-foreground py-6 text-center text-sm', local.class)}\n {...rest}\n />\n )\n}\n\n/** The keyboard hint a palette item usually carries. */\nexport function CommandShortcut(props: {\n class?: string\n children?: ComponentProps<'span'>['children']\n}) {\n return (\n <span\n class={cn('text-muted-foreground ms-auto font-mono text-2xs tracking-widest', props.class)}\n >\n {props.children}\n </span>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,SAAgB0B,QAAQC,OAAwC;CAC9D,MAAM,CAACC,OAAOC,QAAQN,WAAWI,OAAO,CAAC,OAAO,CAAC;CAEjD,OAAAG,gBACGf,aAAQgB,WAAA,EAAA,KAAA,WAAA;EAAA,OACAN,GACL,6FACAG,MAAMI,KACR;CAAC,EAAA,GACGH,IAAI,CAAA;AAGd;AAEA,SAAgB7B,gBAAc2B,OAA0C;CAOtE,MAAM,CAACC,OAAOC,QAAQN,WAAWI,OAAO,CAAC,OAAO,CAAC;CAEjD,OAAAG,gBACG7B,eAAU8B,WAAA,EAAA,IACTE,mBAAgB;EAAA,OAAER,GAChB,8HACA,6DACA,6EACA,0EACAG,MAAMI,KACR;CAAC,EAAA,GACGH,IAAI,CAAA;AAGd;AAEA,SAAgBvB,eAAaqB,OAAyC;CACpE,MAAM,CAACC,OAAOC,QAAQN,WAAWI,OAAO,CAAC,OAAO,CAAC;CAEjD,cAAA;EAAA,IAAAO,OAAAC,OAAA;EAAAC,OAAAF,MAAAJ,gBAKKX,QAAM;GAAA,SAAA;GAAA,eAAA;EAAA,CAAA,GAAA,IAAA;EAAAiB,OAAAF,MAAAJ,gBACNvB,cAASwB,WAAA,EAAA,KAAA,WAAA;GAAA,OACDN,GACL,uFACA,mDACAG,MAAMI,KACR;EAAC,EAAA,GACGH,IAAI,CAAA,GAAA,IAAA;EAAA,OAAAK;CAAA,EAAA,CAAA;AAIhB;;;;;;;;;;;;;;;;;;;;;AAsBA,SAAgBxB,cAAYiB,OAAwC;CAClE,MAAM,CAACC,OAAOC,QAAQN,WAAWI,OAAO,CAAC,OAAO,CAAC;CACjD,MAAM,CAACU,SAASC,cAAchB,aAA6B;CAC3D,MAAMkB,cAActB,iBAAiBuB,UAAUA,MAAMC,SAASC,KAAK;CAEnEtB,mBAAmB;EACjB,MAAMuB,OAAOP,QAAQ;EACrB,IAAI,CAACO,MAAM;EACX,KAAK,MAAMC,YAAY,CAAC,qBAAqB,kBAAkB,GAC7DD,KAAKE,cAAcD,QAAQ,CAAC,EAAEE,aAAa,QAAQ,cAAc;EAUnEH,KACGE,cAAc,aAAa,CAAC,EAC3BC,aAAa,QAAQP,YAAY,IAAI,IAAI,YAAY,cAAc;CACzE,CAAC;CAED,cAAA;EAAA,IAAAQ,QAAAC,QAAA;EAAAC,IACYZ,YAAUU,KAAA;EAAAZ,OAAAY,OAAAlB,gBACjBnB,aAAQoB,WAAA,EAAA,KAAA,WAAA;GAAA,OACAN,GAAG,8DAA8DG,MAAMI,KAAK;EAAC,EAAA,GAChFH,IAAI,CAAA,CAAA;EAAA,OAAAmB;CAAA,EAAA,CAAA;AAIhB;AAEA,SAAgB9C,eAAayB,OAAyC;CACpE,MAAM,CAACC,OAAOC,QAAQN,WAAWI,OAAO,CAAC,OAAO,CAAC;CAEjD,OAAAG,gBACG3B,cACC4B,WAAA;EAIAoB,MAAI;EAAA,KAAA,WAAA;GAAA,OACG1B,GAAG,kDAAkDG,MAAMI,KAAK;EAAC;CAAA,GACpEH,IAAI,CAAA;AAGd;AAEA,SAAgBzB,eAAauB,OAAyC;CACpE,MAAM,CAACC,OAAOC,QAAQN,WAAWI,OAAO,CAAC,OAAO,CAAC;CAEjD,OAAAG,gBACGzB,cAAS0B,WAAA,EAAA,KAAA,WAAA;EAAA,OACDN,GACL,uCACA,iQACAG,MAAMI,KACR;CAAC,EAAA,GACGH,IAAI,CAAA;AAGd;AAEA,SAAgBrB,cAAYmB,OAAwC;CAClE,MAAM,CAACC,OAAOC,QAAQN,WAAWI,OAAO,CAAC,OAAO,CAAC;CAEjD,OAAAG,gBACGrB,aAAQsB,WAAA,EAAA,KAAA,WAAA;EAAA,OACAN,GACLD,UACA,8EACAI,MAAMI,KACR;CAAC,EAAA,GACGH,IAAI,CAAA;AAGd;AAEA,SAAgBb,mBAAiBW,OAA6C;CAC5E,MAAM,CAACC,OAAOC,QAAQN,WAAWI,OAAO,CAAC,OAAO,CAAC;CACjD,OAAAG,gBAAQb,kBAAac,WAAA,EAAA,KAAA,WAAA;EAAA,OAAQN,GAAG,6BAA6BG,MAAMI,KAAK;CAAC,EAAA,GAAMH,IAAI,CAAA;AACrF;AAEA,SAAgBjB,iBAAee,OAA2C;CACxE,MAAM,CAACC,OAAOC,QAAQN,WAAWI,OAAO,CAAC,OAAO,CAAC;CACjD,OAAAG,gBACGjB,gBAAWkB,WAAA,EAAA,KAAA,WAAA;EAAA,OACHN,GAAG,kDAAkDG,MAAMI,KAAK;CAAC,EAAA,GACpEH,IAAI,CAAA;AAGd;;AAGA,SAAgBuB,gBAAgBzB,OAG7B;CACD,cAAA;EAAA,IAAA2B,QAAAC,QAAA;EAAAnB,OAAAkB,aAIK3B,MAAM0B,QAAQ;EAAAG,aAAAC,UAAAH,OAFR7B,GAAG,oEAAoEE,MAAMK,KAAK,CAAC,CAAA;EAAA,OAAAsB;CAAA,EAAA,CAAA;AAKhG"}
@@ -4,7 +4,7 @@
4
4
  "title": "Appearance Editor",
5
5
  "description": "",
6
6
  "dependencies": [
7
- "@adea-ai/themes@^0.7.0",
7
+ "@adea-ai/themes@^0.8.0",
8
8
  "@kobalte/core@^0.13.14",
9
9
  "lucide-solid@^1.48.0"
10
10
  ],
package/dist/r/lib.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "title": "Class-name and token helpers",
5
5
  "description": "The private helpers the components import: the class-name merge, the variant recipes, the token manifest and the theme bridge. Installed automatically as a peer of any component that needs it.",
6
6
  "dependencies": [
7
- "@adea-ai/themes@^0.7.0",
7
+ "@adea-ai/themes@^0.8.0",
8
8
  "class-variance-authority@^0.7.1",
9
9
  "cn@^0.4.0"
10
10
  ],
@@ -1670,7 +1670,7 @@
1670
1670
  "title": "Appearance Editor",
1671
1671
  "description": "",
1672
1672
  "dependencies": [
1673
- "@adea-ai/themes@^0.7.0",
1673
+ "@adea-ai/themes@^0.8.0",
1674
1674
  "@kobalte/core@^0.13.14",
1675
1675
  "lucide-solid@^1.48.0"
1676
1676
  ],
@@ -2064,7 +2064,7 @@
2064
2064
  "title": "Class-name and token helpers",
2065
2065
  "description": "The private helpers the components import: the class-name merge, the variant recipes, the token manifest and the theme bridge. Installed automatically as a peer of any component that needs it.",
2066
2066
  "dependencies": [
2067
- "@adea-ai/themes@^0.7.0",
2067
+ "@adea-ai/themes@^0.8.0",
2068
2068
  "class-variance-authority@^0.7.1",
2069
2069
  "cn@^0.4.0"
2070
2070
  ],
@@ -86,6 +86,16 @@ export function PasteTokenEditor(props: PasteTokenEditorProps) {
86
86
  let mirror: HTMLDivElement | undefined
87
87
  let previewTimer: ReturnType<typeof setTimeout> | undefined
88
88
  let scheduledBlockId: string | null = null
89
+ /**
90
+ * What scheduled the current preview. A caret event must not cancel a preview
91
+ * the pointer is owed: a programmatic caret restore (`setCaret` defers to an
92
+ * animation frame) dispatches its `select` event as a separate task that can
93
+ * land *after* a pointermove has already scheduled the hover preview, and a
94
+ * caret with no token under it would otherwise tear that preview down with no
95
+ * further pointermove ever arriving to reschedule it. The pointer's own leave,
96
+ * scroll, blur and reset paths still close unconditionally.
97
+ */
98
+ let previewSource: 'pointer' | 'caret' | 'keyboard' | null = null
89
99
  let rawPasteNext = false
90
100
  let suppressPasteInput = false
91
101
  let nativePasteInputSeen = false
@@ -102,12 +112,14 @@ export function PasteTokenEditor(props: PasteTokenEditorProps) {
102
112
  clearTimer()
103
113
  scheduledBlockId = null
104
114
  snappedCaretPreview = null
115
+ previewSource = null
105
116
  setPreview(null)
106
117
  }
107
- const schedulePreview = (block: PasteBlock) => {
118
+ const schedulePreview = (block: PasteBlock, source: 'pointer' | 'caret') => {
108
119
  if (scheduledBlockId === block.id) return
109
120
  clearTimer()
110
121
  scheduledBlockId = block.id
122
+ previewSource = source
111
123
  setPreview(null)
112
124
  previewTimer = setTimeout(() => {
113
125
  previewTimer = undefined
@@ -189,15 +201,17 @@ export function PasteTokenEditor(props: PasteTokenEditorProps) {
189
201
  const caret = field.selectionStart
190
202
  const range = ranges().find((candidate) => caret > candidate.start && caret < candidate.end)
191
203
  if (range) {
192
- schedulePreview(range.block)
204
+ schedulePreview(range.block, 'caret')
193
205
  return
194
206
  }
195
207
  const snappedRange =
196
208
  snappedCaretPreview?.position === caret
197
209
  ? ranges().find((candidate) => candidate.block.id === snappedCaretPreview?.blockId)
198
210
  : undefined
199
- if (snappedRange) schedulePreview(snappedRange.block)
200
- else closePreview()
211
+ if (snappedRange) schedulePreview(snappedRange.block, 'caret')
212
+ // A caret with no token under it dismisses a caret-sourced preview, but a
213
+ // pointer-scheduled preview outlives it: the pointer has not moved.
214
+ else if (previewSource !== 'pointer') closePreview()
201
215
  }
202
216
 
203
217
  const openKeyboardPreview = (): boolean => {
@@ -212,6 +226,7 @@ export function PasteTokenEditor(props: PasteTokenEditorProps) {
212
226
  if (!range) return false
213
227
  clearTimer()
214
228
  scheduledBlockId = range.block.id
229
+ previewSource = 'keyboard'
215
230
  setPreview(range.block)
216
231
  return true
217
232
  }
@@ -231,7 +246,7 @@ export function PasteTokenEditor(props: PasteTokenEditorProps) {
231
246
  ) {
232
247
  const sequence = Number(span.dataset.pasteSeq)
233
248
  const range = ranges().find((candidate) => candidate.block.seq === sequence)
234
- if (range) schedulePreview(range.block)
249
+ if (range) schedulePreview(range.block, 'pointer')
235
250
  else closePreview()
236
251
  return
237
252
  }
@@ -47,11 +47,17 @@ export function Command(props: ComponentProps<typeof CmdkRoot>) {
47
47
  }
48
48
 
49
49
  export function CommandDialog(props: ComponentProps<typeof CmdkDialog>) {
50
+ // cmdk's Dialog splits `contentClassName` onto the role="dialog" content
51
+ // element and routes every other prop (including `class`) to the inner
52
+ // Command. The surface must live on the content: a `class` here styles the
53
+ // Command (fixed, so visible) while the dialog element itself renders as an
54
+ // unstyled zero-height wrapper at the end of body — invisible to role
55
+ // queries and axe.
50
56
  const [local, rest] = splitProps(props, ['class'])
51
57
 
52
58
  return (
53
59
  <CmdkDialog
54
- class={cn(
60
+ contentClassName={cn(
55
61
  'bg-popover text-popover-foreground fixed top-1/3 left-1/2 z-(--z-dialog) w-full max-w-lg -translate-x-1/2 -translate-y-1/2',
56
62
  'overflow-hidden rounded-xl border border-border shadow-xl',
57
63
  'data-expanded:animate-in data-expanded:fade-in-0 data-expanded:zoom-in-95',
@@ -50,63 +50,63 @@
50
50
  :root {
51
51
  /* @generated theme:root — run `bun run theme:build` after changing the catalogue */
52
52
  /* The canvas and its text */
53
- --background: oklch(0.933 0.016 261.79);
54
- --foreground: oklch(0.3697 0.0285 266.52);
53
+ --background: oklch(1 0 0);
54
+ --foreground: oklch(0.2542 0.0111 254.04);
55
55
 
56
56
  /* Raised surfaces */
57
- --card: oklch(0.898 0.0108 261.79);
58
- --card-foreground: oklch(0.3697 0.0285 266.52);
59
- --popover: oklch(0.868 0.0151 261.79);
60
- --popover-foreground: oklch(0.3697 0.0285 266.52);
61
- --surface-hover: oklch(0.833 0.0209 261.79);
62
- --surface-active: oklch(0.783 0.0144 261.79);
57
+ --card: oklch(0.965 0 0);
58
+ --card-foreground: oklch(0.2542 0.0111 254.04);
59
+ --popover: oklch(0.935 0 0);
60
+ --popover-foreground: oklch(0.2542 0.0111 254.04);
61
+ --surface-hover: oklch(0.9 0 0);
62
+ --surface-active: oklch(0.85 0 0);
63
63
 
64
64
  --surface: var(--background);
65
65
  --surface-raised: var(--card);
66
66
  --surface-overlay: var(--popover);
67
67
 
68
68
  /* The interactive colour */
69
- --primary: oklch(0.4513 0.1518 253.31);
70
- --primary-foreground: oklch(0.9513 0.0074 260.73);
71
- --ring: oklch(0.4513 0.1518 253.31);
72
- --accent: oklch(0.833 0.0209 261.79);
73
- --accent-foreground: oklch(0.3697 0.0285 266.52);
69
+ --primary: oklch(0.5143 0.1668 301.69);
70
+ --primary-foreground: oklch(1 0 0);
71
+ --ring: oklch(0.5143 0.1668 301.69);
72
+ --accent: oklch(0.9 0 0);
73
+ --accent-foreground: oklch(0.2542 0.0111 254.04);
74
74
 
75
75
  /* Neutral fills and secondary text */
76
- --secondary: oklch(0.898 0.0108 261.79);
77
- --secondary-foreground: oklch(0.3697 0.0285 266.52);
78
- --muted: oklch(0.898 0.0108 261.79);
79
- --muted-foreground: oklch(0.474 0.0245 265.01);
76
+ --secondary: oklch(0.965 0 0);
77
+ --secondary-foreground: oklch(0.2542 0.0111 254.04);
78
+ --muted: oklch(0.965 0 0);
79
+ --muted-foreground: oklch(0.4929 0.0076 254.04);
80
80
 
81
81
  /* Status fills; solid labels and subtle surfaces come from the catalogue. */
82
- --destructive: oklch(0.4705 0.1626 25.78);
83
- --destructive-foreground: oklch(0.933 0.016 261.79);
84
- --destructive-action: oklch(0.4705 0.1626 25.78);
85
- --destructive-action-foreground: oklch(0.933 0.016 261.79);
86
- --success: oklch(0.4311 0.1809 145.62);
87
- --success-foreground: oklch(0.933 0.016 261.79);
88
- --warning: oklch(0.4556 0.1401 79.91);
89
- --warning-foreground: oklch(0.933 0.016 261.79);
90
- --info: oklch(0.4915 0.1155 202.14);
91
- --info-foreground: oklch(0.933 0.016 261.79);
92
- --destructive-subtle: oklch(0.8683 0.0365 279.15);
93
- --success-subtle: oklch(0.8627 0.0391 245.53);
94
- --warning-subtle: oklch(0.8662 0.0334 286.73);
95
- --info-subtle: oklch(0.8712 0.0299 253.44);
82
+ --destructive: oklch(0.5165 0.1626 25.78);
83
+ --destructive-foreground: oklch(1 0 0);
84
+ --destructive-action: oklch(0.5165 0.1626 25.78);
85
+ --destructive-action-foreground: oklch(1 0 0);
86
+ --success: oklch(0.4771 0.1809 145.62);
87
+ --success-foreground: oklch(1 0 0);
88
+ --warning: oklch(0.5016 0.1401 79.91);
89
+ --warning-foreground: oklch(1 0 0);
90
+ --info: oklch(0.5375 0.1155 202.14);
91
+ --info-foreground: oklch(1 0 0);
92
+ --destructive-subtle: oklch(0.9323 0.0228 25.78);
93
+ --success-subtle: oklch(0.9268 0.0253 145.62);
94
+ --warning-subtle: oklch(0.9302 0.0196 79.91);
95
+ --info-subtle: oklch(0.9353 0.0162 202.14);
96
96
 
97
97
  /* Lines */
98
- --border: oklch(0.783 0.0144 261.79);
99
- --input: oklch(0.783 0.0144 261.79);
98
+ --border: oklch(0.85 0 0);
99
+ --input: oklch(0.85 0 0);
100
100
 
101
101
  /* The primary, so a focus ring is the interactive colour. */
102
102
  --ring: var(--primary);
103
103
 
104
104
  /* The sidebar */
105
- --sidebar: oklch(0.898 0.0108 261.79);
106
- --sidebar-foreground: oklch(0.3697 0.0285 266.52);
107
- --sidebar-accent: oklch(0.833 0.0209 261.79);
108
- --sidebar-border: oklch(0.783 0.0144 261.79);
109
- --sidebar-muted-foreground: oklch(0.474 0.0245 265.01);
105
+ --sidebar: oklch(0.965 0 0);
106
+ --sidebar-foreground: oklch(0.2542 0.0111 254.04);
107
+ --sidebar-accent: oklch(0.9 0 0);
108
+ --sidebar-border: oklch(0.85 0 0);
109
+ --sidebar-muted-foreground: oklch(0.4929 0.0076 254.04);
110
110
 
111
111
  --sidebar-primary: var(--primary);
112
112
  --sidebar-primary-foreground: var(--primary-foreground);
@@ -114,12 +114,12 @@
114
114
  --sidebar-ring: var(--ring);
115
115
 
116
116
  /* Charts */
117
- --chart-1: oklch(0.4513 0.1518 253.31);
118
- --chart-2: oklch(0.4683 0.1668 301.69);
119
- --chart-3: oklch(0.4915 0.1155 202.14);
120
- --chart-4: oklch(0.4311 0.1809 145.62);
121
- --chart-5: oklch(0.4556 0.1401 79.91);
122
- --chart-6: oklch(0.4705 0.1626 25.78);
117
+ --chart-1: oklch(0.4973 0.1518 253.31);
118
+ --chart-2: oklch(0.5143 0.1668 301.69);
119
+ --chart-3: oklch(0.5375 0.1155 202.14);
120
+ --chart-4: oklch(0.4771 0.1809 145.62);
121
+ --chart-5: oklch(0.5016 0.1401 79.91);
122
+ --chart-6: oklch(0.5165 0.1626 25.78);
123
123
 
124
124
  /* Diff surfaces, over the status roles. */
125
125
  --diff-add: color-mix(in oklch, var(--success) 18%, transparent);
@@ -151,7 +151,7 @@
151
151
  * Both values come from @adea-ai/themes, so the accent blocks below are the same
152
152
  * rule rather than a matching one — which is what they were not, before.
153
153
  */
154
- --primary-hover: oklch(0.4013 0.1518 253.31);
154
+ --primary-hover: oklch(0.4643 0.1668 301.69);
155
155
  --primary-subtle: color-mix(in oklch, var(--primary) 10%, transparent);
156
156
  /* The window chrome, one step off the canvas. */
157
157
  --chrome: var(--surface);
@@ -166,7 +166,7 @@
166
166
  * light one, but a sunken one is *always* darker, because the metaphor is a
167
167
  * well cut into the page rather than a panel laid on it.
168
168
  */
169
- --surface-sunken: oklch(0.913 0.008 261.79);
169
+ --surface-sunken: oklch(0.98 0 0);
170
170
  --chrome-alpha: 0.9;
171
171
 
172
172
  color-scheme: light;
@@ -187,63 +187,63 @@
187
187
  .dark {
188
188
  /* @generated theme:dark — run `bun run theme:build` after changing the catalogue */
189
189
  /* The canvas and its text */
190
- --background: oklch(0.1918 0.0238 265.37);
191
- --foreground: oklch(0.7933 0.0217 261.76);
190
+ --background: oklch(0.1756 0.0063 300.91);
191
+ --foreground: oklch(0.942 0.0054 297.72);
192
192
 
193
193
  /* Raised surfaces */
194
- --card: oklch(0.2268 0.0288 265.37);
195
- --card-foreground: oklch(0.7933 0.0217 261.76);
196
- --popover: oklch(0.2568 0.033 265.37);
197
- --popover-foreground: oklch(0.7933 0.0217 261.76);
198
- --surface-hover: oklch(0.2918 0.038 265.37);
199
- --surface-active: oklch(0.3418 0.0214 265.37);
194
+ --card: oklch(0.2106 0.0076 300.91);
195
+ --card-foreground: oklch(0.942 0.0054 297.72);
196
+ --popover: oklch(0.2406 0.0088 300.91);
197
+ --popover-foreground: oklch(0.942 0.0054 297.72);
198
+ --surface-hover: oklch(0.2756 0.0101 300.91);
199
+ --surface-active: oklch(0.3256 0.0057 300.91);
200
200
 
201
201
  --surface: var(--background);
202
202
  --surface-raised: var(--card);
203
203
  --surface-overlay: var(--popover);
204
204
 
205
205
  /* The interactive colour */
206
- --primary: oklch(0.7153 0.1518 253.31);
207
- --primary-foreground: oklch(0.1918 0.0238 265.37);
208
- --ring: oklch(0.7153 0.1518 253.31);
209
- --accent: oklch(0.2918 0.038 265.37);
210
- --accent-foreground: oklch(0.7933 0.0217 261.76);
206
+ --primary: oklch(0.7323 0.1668 301.69);
207
+ --primary-foreground: oklch(0.1756 0.0063 300.91);
208
+ --ring: oklch(0.7323 0.1668 301.69);
209
+ --accent: oklch(0.2756 0.0101 300.91);
210
+ --accent-foreground: oklch(0.942 0.0054 297.72);
211
211
 
212
212
  /* Neutral fills and secondary text */
213
- --secondary: oklch(0.2268 0.0288 265.37);
214
- --secondary-foreground: oklch(0.7933 0.0217 261.76);
215
- --muted: oklch(0.2268 0.0288 265.37);
216
- --muted-foreground: oklch(0.6308 0.0224 262.91);
213
+ --secondary: oklch(0.2106 0.0076 300.91);
214
+ --secondary-foreground: oklch(0.942 0.0054 297.72);
215
+ --muted: oklch(0.2106 0.0076 300.91);
216
+ --muted-foreground: oklch(0.6967 0.0057 298.74);
217
217
 
218
218
  /* Status fills; solid labels and subtle surfaces come from the catalogue. */
219
219
  --destructive: oklch(0.7345 0.1626 25.78);
220
- --destructive-foreground: oklch(0.1918 0.0238 265.37);
220
+ --destructive-foreground: oklch(0.1756 0.0063 300.91);
221
221
  --destructive-action: oklch(0.7345 0.1626 25.78);
222
- --destructive-action-foreground: oklch(0.1918 0.0238 265.37);
222
+ --destructive-action-foreground: oklch(0.1756 0.0063 300.91);
223
223
  --success: oklch(0.6951 0.1809 145.62);
224
- --success-foreground: oklch(0.1918 0.0238 265.37);
224
+ --success-foreground: oklch(0.1756 0.0063 300.91);
225
225
  --warning: oklch(0.7196 0.1401 79.91);
226
- --warning-foreground: oklch(0.1918 0.0238 265.37);
226
+ --warning-foreground: oklch(0.1756 0.0063 300.91);
227
227
  --info: oklch(0.7555 0.1155 202.14);
228
- --info-foreground: oklch(0.1918 0.0238 265.37);
229
- --destructive-subtle: oklch(0.2678 0.0432 282.23);
230
- --success-subtle: oklch(0.2623 0.0458 248.61);
231
- --warning-subtle: oklch(0.2657 0.0401 289.81);
232
- --info-subtle: oklch(0.2707 0.0366 256.52);
228
+ --info-foreground: oklch(0.1756 0.0063 300.91);
229
+ --destructive-subtle: oklch(0.2538 0.0282 312.79);
230
+ --success-subtle: oklch(0.2483 0.0307 279.17);
231
+ --warning-subtle: oklch(0.2518 0.025 320.37);
232
+ --info-subtle: oklch(0.2568 0.0216 287.08);
233
233
 
234
234
  /* Lines */
235
- --border: oklch(0.3418 0.0214 265.37);
236
- --input: oklch(0.3418 0.0214 265.37);
235
+ --border: oklch(0.3256 0.0057 300.91);
236
+ --input: oklch(0.3256 0.0057 300.91);
237
237
 
238
238
  /* The primary, so a focus ring is the interactive colour. */
239
239
  --ring: var(--primary);
240
240
 
241
241
  /* The sidebar */
242
- --sidebar: oklch(0.2268 0.0288 265.37);
243
- --sidebar-foreground: oklch(0.7933 0.0217 261.76);
244
- --sidebar-accent: oklch(0.2918 0.038 265.37);
245
- --sidebar-border: oklch(0.3418 0.0214 265.37);
246
- --sidebar-muted-foreground: oklch(0.6308 0.0224 262.91);
242
+ --sidebar: oklch(0.2106 0.0076 300.91);
243
+ --sidebar-foreground: oklch(0.942 0.0054 297.72);
244
+ --sidebar-accent: oklch(0.2756 0.0101 300.91);
245
+ --sidebar-border: oklch(0.3256 0.0057 300.91);
246
+ --sidebar-muted-foreground: oklch(0.6967 0.0057 298.74);
247
247
 
248
248
  --sidebar-primary: var(--primary);
249
249
  --sidebar-primary-foreground: var(--primary-foreground);
@@ -279,7 +279,7 @@
279
279
  * Both values come from @adea-ai/themes, so the accent blocks below are the same
280
280
  * rule rather than a matching one — which is what they were not, before.
281
281
  */
282
- --primary-hover: oklch(0.7653 0.1518 253.31);
282
+ --primary-hover: oklch(0.7823 0.1668 301.69);
283
283
  --primary-subtle: color-mix(in oklch, var(--primary) 16%, transparent);
284
284
  /* The window chrome, one step off the canvas. */
285
285
  --chrome: var(--surface);
@@ -294,7 +294,7 @@
294
294
  * light one, but a sunken one is *always* darker, because the metaphor is a
295
295
  * well cut into the page rather than a panel laid on it.
296
296
  */
297
- --surface-sunken: oklch(0.1718 0.0199 265.37);
297
+ --surface-sunken: oklch(0.1556 0.0049 300.91);
298
298
  --chrome-alpha: 0.9;
299
299
 
300
300
  color-scheme: dark;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adea-ai/ui",
3
- "version": "0.76.0",
3
+ "version": "0.77.0",
4
4
  "description": "The Adea design system: Kobalte-backed Solid components, semantic OKLCH tokens, and the app-shell layout primitives shared by Adea and Cortana.",
5
5
  "keywords": [
6
6
  "adea",
@@ -106,7 +106,7 @@
106
106
  "check:packed-paste-model": "node scripts/check-packed-paste-model.mjs"
107
107
  },
108
108
  "dependencies": {
109
- "@adea-ai/themes": "^0.7.0",
109
+ "@adea-ai/themes": "^0.8.0",
110
110
  "@corvu/calendar": "^0.1.2",
111
111
  "@corvu/drawer": "^0.2.4",
112
112
  "@corvu/otp-field": "^0.1.4",
package/registry.json CHANGED
@@ -1670,7 +1670,7 @@
1670
1670
  "title": "Appearance Editor",
1671
1671
  "description": "",
1672
1672
  "dependencies": [
1673
- "@adea-ai/themes@^0.7.0",
1673
+ "@adea-ai/themes@^0.8.0",
1674
1674
  "@kobalte/core@^0.13.14",
1675
1675
  "lucide-solid@^1.48.0"
1676
1676
  ],
@@ -2064,7 +2064,7 @@
2064
2064
  "title": "Class-name and token helpers",
2065
2065
  "description": "The private helpers the components import: the class-name merge, the variant recipes, the token manifest and the theme bridge. Installed automatically as a peer of any component that needs it.",
2066
2066
  "dependencies": [
2067
- "@adea-ai/themes@^0.7.0",
2067
+ "@adea-ai/themes@^0.8.0",
2068
2068
  "class-variance-authority@^0.7.1",
2069
2069
  "cn@^0.4.0"
2070
2070
  ],
@@ -86,6 +86,16 @@ export function PasteTokenEditor(props: PasteTokenEditorProps) {
86
86
  let mirror: HTMLDivElement | undefined
87
87
  let previewTimer: ReturnType<typeof setTimeout> | undefined
88
88
  let scheduledBlockId: string | null = null
89
+ /**
90
+ * What scheduled the current preview. A caret event must not cancel a preview
91
+ * the pointer is owed: a programmatic caret restore (`setCaret` defers to an
92
+ * animation frame) dispatches its `select` event as a separate task that can
93
+ * land *after* a pointermove has already scheduled the hover preview, and a
94
+ * caret with no token under it would otherwise tear that preview down with no
95
+ * further pointermove ever arriving to reschedule it. The pointer's own leave,
96
+ * scroll, blur and reset paths still close unconditionally.
97
+ */
98
+ let previewSource: 'pointer' | 'caret' | 'keyboard' | null = null
89
99
  let rawPasteNext = false
90
100
  let suppressPasteInput = false
91
101
  let nativePasteInputSeen = false
@@ -102,12 +112,14 @@ export function PasteTokenEditor(props: PasteTokenEditorProps) {
102
112
  clearTimer()
103
113
  scheduledBlockId = null
104
114
  snappedCaretPreview = null
115
+ previewSource = null
105
116
  setPreview(null)
106
117
  }
107
- const schedulePreview = (block: PasteBlock) => {
118
+ const schedulePreview = (block: PasteBlock, source: 'pointer' | 'caret') => {
108
119
  if (scheduledBlockId === block.id) return
109
120
  clearTimer()
110
121
  scheduledBlockId = block.id
122
+ previewSource = source
111
123
  setPreview(null)
112
124
  previewTimer = setTimeout(() => {
113
125
  previewTimer = undefined
@@ -189,15 +201,17 @@ export function PasteTokenEditor(props: PasteTokenEditorProps) {
189
201
  const caret = field.selectionStart
190
202
  const range = ranges().find((candidate) => caret > candidate.start && caret < candidate.end)
191
203
  if (range) {
192
- schedulePreview(range.block)
204
+ schedulePreview(range.block, 'caret')
193
205
  return
194
206
  }
195
207
  const snappedRange =
196
208
  snappedCaretPreview?.position === caret
197
209
  ? ranges().find((candidate) => candidate.block.id === snappedCaretPreview?.blockId)
198
210
  : undefined
199
- if (snappedRange) schedulePreview(snappedRange.block)
200
- else closePreview()
211
+ if (snappedRange) schedulePreview(snappedRange.block, 'caret')
212
+ // A caret with no token under it dismisses a caret-sourced preview, but a
213
+ // pointer-scheduled preview outlives it: the pointer has not moved.
214
+ else if (previewSource !== 'pointer') closePreview()
201
215
  }
202
216
 
203
217
  const openKeyboardPreview = (): boolean => {
@@ -212,6 +226,7 @@ export function PasteTokenEditor(props: PasteTokenEditorProps) {
212
226
  if (!range) return false
213
227
  clearTimer()
214
228
  scheduledBlockId = range.block.id
229
+ previewSource = 'keyboard'
215
230
  setPreview(range.block)
216
231
  return true
217
232
  }
@@ -231,7 +246,7 @@ export function PasteTokenEditor(props: PasteTokenEditorProps) {
231
246
  ) {
232
247
  const sequence = Number(span.dataset.pasteSeq)
233
248
  const range = ranges().find((candidate) => candidate.block.seq === sequence)
234
- if (range) schedulePreview(range.block)
249
+ if (range) schedulePreview(range.block, 'pointer')
235
250
  else closePreview()
236
251
  return
237
252
  }
@@ -47,11 +47,17 @@ export function Command(props: ComponentProps<typeof CmdkRoot>) {
47
47
  }
48
48
 
49
49
  export function CommandDialog(props: ComponentProps<typeof CmdkDialog>) {
50
+ // cmdk's Dialog splits `contentClassName` onto the role="dialog" content
51
+ // element and routes every other prop (including `class`) to the inner
52
+ // Command. The surface must live on the content: a `class` here styles the
53
+ // Command (fixed, so visible) while the dialog element itself renders as an
54
+ // unstyled zero-height wrapper at the end of body — invisible to role
55
+ // queries and axe.
50
56
  const [local, rest] = splitProps(props, ['class'])
51
57
 
52
58
  return (
53
59
  <CmdkDialog
54
- class={cn(
60
+ contentClassName={cn(
55
61
  'bg-popover text-popover-foreground fixed top-1/3 left-1/2 z-(--z-dialog) w-full max-w-lg -translate-x-1/2 -translate-y-1/2',
56
62
  'overflow-hidden rounded-xl border border-border shadow-xl',
57
63
  'data-expanded:animate-in data-expanded:fade-in-0 data-expanded:zoom-in-95',
@@ -50,63 +50,63 @@
50
50
  :root {
51
51
  /* @generated theme:root — run `bun run theme:build` after changing the catalogue */
52
52
  /* The canvas and its text */
53
- --background: oklch(0.933 0.016 261.79);
54
- --foreground: oklch(0.3697 0.0285 266.52);
53
+ --background: oklch(1 0 0);
54
+ --foreground: oklch(0.2542 0.0111 254.04);
55
55
 
56
56
  /* Raised surfaces */
57
- --card: oklch(0.898 0.0108 261.79);
58
- --card-foreground: oklch(0.3697 0.0285 266.52);
59
- --popover: oklch(0.868 0.0151 261.79);
60
- --popover-foreground: oklch(0.3697 0.0285 266.52);
61
- --surface-hover: oklch(0.833 0.0209 261.79);
62
- --surface-active: oklch(0.783 0.0144 261.79);
57
+ --card: oklch(0.965 0 0);
58
+ --card-foreground: oklch(0.2542 0.0111 254.04);
59
+ --popover: oklch(0.935 0 0);
60
+ --popover-foreground: oklch(0.2542 0.0111 254.04);
61
+ --surface-hover: oklch(0.9 0 0);
62
+ --surface-active: oklch(0.85 0 0);
63
63
 
64
64
  --surface: var(--background);
65
65
  --surface-raised: var(--card);
66
66
  --surface-overlay: var(--popover);
67
67
 
68
68
  /* The interactive colour */
69
- --primary: oklch(0.4513 0.1518 253.31);
70
- --primary-foreground: oklch(0.9513 0.0074 260.73);
71
- --ring: oklch(0.4513 0.1518 253.31);
72
- --accent: oklch(0.833 0.0209 261.79);
73
- --accent-foreground: oklch(0.3697 0.0285 266.52);
69
+ --primary: oklch(0.5143 0.1668 301.69);
70
+ --primary-foreground: oklch(1 0 0);
71
+ --ring: oklch(0.5143 0.1668 301.69);
72
+ --accent: oklch(0.9 0 0);
73
+ --accent-foreground: oklch(0.2542 0.0111 254.04);
74
74
 
75
75
  /* Neutral fills and secondary text */
76
- --secondary: oklch(0.898 0.0108 261.79);
77
- --secondary-foreground: oklch(0.3697 0.0285 266.52);
78
- --muted: oklch(0.898 0.0108 261.79);
79
- --muted-foreground: oklch(0.474 0.0245 265.01);
76
+ --secondary: oklch(0.965 0 0);
77
+ --secondary-foreground: oklch(0.2542 0.0111 254.04);
78
+ --muted: oklch(0.965 0 0);
79
+ --muted-foreground: oklch(0.4929 0.0076 254.04);
80
80
 
81
81
  /* Status fills; solid labels and subtle surfaces come from the catalogue. */
82
- --destructive: oklch(0.4705 0.1626 25.78);
83
- --destructive-foreground: oklch(0.933 0.016 261.79);
84
- --destructive-action: oklch(0.4705 0.1626 25.78);
85
- --destructive-action-foreground: oklch(0.933 0.016 261.79);
86
- --success: oklch(0.4311 0.1809 145.62);
87
- --success-foreground: oklch(0.933 0.016 261.79);
88
- --warning: oklch(0.4556 0.1401 79.91);
89
- --warning-foreground: oklch(0.933 0.016 261.79);
90
- --info: oklch(0.4915 0.1155 202.14);
91
- --info-foreground: oklch(0.933 0.016 261.79);
92
- --destructive-subtle: oklch(0.8683 0.0365 279.15);
93
- --success-subtle: oklch(0.8627 0.0391 245.53);
94
- --warning-subtle: oklch(0.8662 0.0334 286.73);
95
- --info-subtle: oklch(0.8712 0.0299 253.44);
82
+ --destructive: oklch(0.5165 0.1626 25.78);
83
+ --destructive-foreground: oklch(1 0 0);
84
+ --destructive-action: oklch(0.5165 0.1626 25.78);
85
+ --destructive-action-foreground: oklch(1 0 0);
86
+ --success: oklch(0.4771 0.1809 145.62);
87
+ --success-foreground: oklch(1 0 0);
88
+ --warning: oklch(0.5016 0.1401 79.91);
89
+ --warning-foreground: oklch(1 0 0);
90
+ --info: oklch(0.5375 0.1155 202.14);
91
+ --info-foreground: oklch(1 0 0);
92
+ --destructive-subtle: oklch(0.9323 0.0228 25.78);
93
+ --success-subtle: oklch(0.9268 0.0253 145.62);
94
+ --warning-subtle: oklch(0.9302 0.0196 79.91);
95
+ --info-subtle: oklch(0.9353 0.0162 202.14);
96
96
 
97
97
  /* Lines */
98
- --border: oklch(0.783 0.0144 261.79);
99
- --input: oklch(0.783 0.0144 261.79);
98
+ --border: oklch(0.85 0 0);
99
+ --input: oklch(0.85 0 0);
100
100
 
101
101
  /* The primary, so a focus ring is the interactive colour. */
102
102
  --ring: var(--primary);
103
103
 
104
104
  /* The sidebar */
105
- --sidebar: oklch(0.898 0.0108 261.79);
106
- --sidebar-foreground: oklch(0.3697 0.0285 266.52);
107
- --sidebar-accent: oklch(0.833 0.0209 261.79);
108
- --sidebar-border: oklch(0.783 0.0144 261.79);
109
- --sidebar-muted-foreground: oklch(0.474 0.0245 265.01);
105
+ --sidebar: oklch(0.965 0 0);
106
+ --sidebar-foreground: oklch(0.2542 0.0111 254.04);
107
+ --sidebar-accent: oklch(0.9 0 0);
108
+ --sidebar-border: oklch(0.85 0 0);
109
+ --sidebar-muted-foreground: oklch(0.4929 0.0076 254.04);
110
110
 
111
111
  --sidebar-primary: var(--primary);
112
112
  --sidebar-primary-foreground: var(--primary-foreground);
@@ -114,12 +114,12 @@
114
114
  --sidebar-ring: var(--ring);
115
115
 
116
116
  /* Charts */
117
- --chart-1: oklch(0.4513 0.1518 253.31);
118
- --chart-2: oklch(0.4683 0.1668 301.69);
119
- --chart-3: oklch(0.4915 0.1155 202.14);
120
- --chart-4: oklch(0.4311 0.1809 145.62);
121
- --chart-5: oklch(0.4556 0.1401 79.91);
122
- --chart-6: oklch(0.4705 0.1626 25.78);
117
+ --chart-1: oklch(0.4973 0.1518 253.31);
118
+ --chart-2: oklch(0.5143 0.1668 301.69);
119
+ --chart-3: oklch(0.5375 0.1155 202.14);
120
+ --chart-4: oklch(0.4771 0.1809 145.62);
121
+ --chart-5: oklch(0.5016 0.1401 79.91);
122
+ --chart-6: oklch(0.5165 0.1626 25.78);
123
123
 
124
124
  /* Diff surfaces, over the status roles. */
125
125
  --diff-add: color-mix(in oklch, var(--success) 18%, transparent);
@@ -151,7 +151,7 @@
151
151
  * Both values come from @adea-ai/themes, so the accent blocks below are the same
152
152
  * rule rather than a matching one — which is what they were not, before.
153
153
  */
154
- --primary-hover: oklch(0.4013 0.1518 253.31);
154
+ --primary-hover: oklch(0.4643 0.1668 301.69);
155
155
  --primary-subtle: color-mix(in oklch, var(--primary) 10%, transparent);
156
156
  /* The window chrome, one step off the canvas. */
157
157
  --chrome: var(--surface);
@@ -166,7 +166,7 @@
166
166
  * light one, but a sunken one is *always* darker, because the metaphor is a
167
167
  * well cut into the page rather than a panel laid on it.
168
168
  */
169
- --surface-sunken: oklch(0.913 0.008 261.79);
169
+ --surface-sunken: oklch(0.98 0 0);
170
170
  --chrome-alpha: 0.9;
171
171
 
172
172
  color-scheme: light;
@@ -187,63 +187,63 @@
187
187
  .dark {
188
188
  /* @generated theme:dark — run `bun run theme:build` after changing the catalogue */
189
189
  /* The canvas and its text */
190
- --background: oklch(0.1918 0.0238 265.37);
191
- --foreground: oklch(0.7933 0.0217 261.76);
190
+ --background: oklch(0.1756 0.0063 300.91);
191
+ --foreground: oklch(0.942 0.0054 297.72);
192
192
 
193
193
  /* Raised surfaces */
194
- --card: oklch(0.2268 0.0288 265.37);
195
- --card-foreground: oklch(0.7933 0.0217 261.76);
196
- --popover: oklch(0.2568 0.033 265.37);
197
- --popover-foreground: oklch(0.7933 0.0217 261.76);
198
- --surface-hover: oklch(0.2918 0.038 265.37);
199
- --surface-active: oklch(0.3418 0.0214 265.37);
194
+ --card: oklch(0.2106 0.0076 300.91);
195
+ --card-foreground: oklch(0.942 0.0054 297.72);
196
+ --popover: oklch(0.2406 0.0088 300.91);
197
+ --popover-foreground: oklch(0.942 0.0054 297.72);
198
+ --surface-hover: oklch(0.2756 0.0101 300.91);
199
+ --surface-active: oklch(0.3256 0.0057 300.91);
200
200
 
201
201
  --surface: var(--background);
202
202
  --surface-raised: var(--card);
203
203
  --surface-overlay: var(--popover);
204
204
 
205
205
  /* The interactive colour */
206
- --primary: oklch(0.7153 0.1518 253.31);
207
- --primary-foreground: oklch(0.1918 0.0238 265.37);
208
- --ring: oklch(0.7153 0.1518 253.31);
209
- --accent: oklch(0.2918 0.038 265.37);
210
- --accent-foreground: oklch(0.7933 0.0217 261.76);
206
+ --primary: oklch(0.7323 0.1668 301.69);
207
+ --primary-foreground: oklch(0.1756 0.0063 300.91);
208
+ --ring: oklch(0.7323 0.1668 301.69);
209
+ --accent: oklch(0.2756 0.0101 300.91);
210
+ --accent-foreground: oklch(0.942 0.0054 297.72);
211
211
 
212
212
  /* Neutral fills and secondary text */
213
- --secondary: oklch(0.2268 0.0288 265.37);
214
- --secondary-foreground: oklch(0.7933 0.0217 261.76);
215
- --muted: oklch(0.2268 0.0288 265.37);
216
- --muted-foreground: oklch(0.6308 0.0224 262.91);
213
+ --secondary: oklch(0.2106 0.0076 300.91);
214
+ --secondary-foreground: oklch(0.942 0.0054 297.72);
215
+ --muted: oklch(0.2106 0.0076 300.91);
216
+ --muted-foreground: oklch(0.6967 0.0057 298.74);
217
217
 
218
218
  /* Status fills; solid labels and subtle surfaces come from the catalogue. */
219
219
  --destructive: oklch(0.7345 0.1626 25.78);
220
- --destructive-foreground: oklch(0.1918 0.0238 265.37);
220
+ --destructive-foreground: oklch(0.1756 0.0063 300.91);
221
221
  --destructive-action: oklch(0.7345 0.1626 25.78);
222
- --destructive-action-foreground: oklch(0.1918 0.0238 265.37);
222
+ --destructive-action-foreground: oklch(0.1756 0.0063 300.91);
223
223
  --success: oklch(0.6951 0.1809 145.62);
224
- --success-foreground: oklch(0.1918 0.0238 265.37);
224
+ --success-foreground: oklch(0.1756 0.0063 300.91);
225
225
  --warning: oklch(0.7196 0.1401 79.91);
226
- --warning-foreground: oklch(0.1918 0.0238 265.37);
226
+ --warning-foreground: oklch(0.1756 0.0063 300.91);
227
227
  --info: oklch(0.7555 0.1155 202.14);
228
- --info-foreground: oklch(0.1918 0.0238 265.37);
229
- --destructive-subtle: oklch(0.2678 0.0432 282.23);
230
- --success-subtle: oklch(0.2623 0.0458 248.61);
231
- --warning-subtle: oklch(0.2657 0.0401 289.81);
232
- --info-subtle: oklch(0.2707 0.0366 256.52);
228
+ --info-foreground: oklch(0.1756 0.0063 300.91);
229
+ --destructive-subtle: oklch(0.2538 0.0282 312.79);
230
+ --success-subtle: oklch(0.2483 0.0307 279.17);
231
+ --warning-subtle: oklch(0.2518 0.025 320.37);
232
+ --info-subtle: oklch(0.2568 0.0216 287.08);
233
233
 
234
234
  /* Lines */
235
- --border: oklch(0.3418 0.0214 265.37);
236
- --input: oklch(0.3418 0.0214 265.37);
235
+ --border: oklch(0.3256 0.0057 300.91);
236
+ --input: oklch(0.3256 0.0057 300.91);
237
237
 
238
238
  /* The primary, so a focus ring is the interactive colour. */
239
239
  --ring: var(--primary);
240
240
 
241
241
  /* The sidebar */
242
- --sidebar: oklch(0.2268 0.0288 265.37);
243
- --sidebar-foreground: oklch(0.7933 0.0217 261.76);
244
- --sidebar-accent: oklch(0.2918 0.038 265.37);
245
- --sidebar-border: oklch(0.3418 0.0214 265.37);
246
- --sidebar-muted-foreground: oklch(0.6308 0.0224 262.91);
242
+ --sidebar: oklch(0.2106 0.0076 300.91);
243
+ --sidebar-foreground: oklch(0.942 0.0054 297.72);
244
+ --sidebar-accent: oklch(0.2756 0.0101 300.91);
245
+ --sidebar-border: oklch(0.3256 0.0057 300.91);
246
+ --sidebar-muted-foreground: oklch(0.6967 0.0057 298.74);
247
247
 
248
248
  --sidebar-primary: var(--primary);
249
249
  --sidebar-primary-foreground: var(--primary-foreground);
@@ -279,7 +279,7 @@
279
279
  * Both values come from @adea-ai/themes, so the accent blocks below are the same
280
280
  * rule rather than a matching one — which is what they were not, before.
281
281
  */
282
- --primary-hover: oklch(0.7653 0.1518 253.31);
282
+ --primary-hover: oklch(0.7823 0.1668 301.69);
283
283
  --primary-subtle: color-mix(in oklch, var(--primary) 16%, transparent);
284
284
  /* The window chrome, one step off the canvas. */
285
285
  --chrome: var(--surface);
@@ -294,7 +294,7 @@
294
294
  * light one, but a sunken one is *always* darker, because the metaphor is a
295
295
  * well cut into the page rather than a panel laid on it.
296
296
  */
297
- --surface-sunken: oklch(0.1718 0.0199 265.37);
297
+ --surface-sunken: oklch(0.1556 0.0049 300.91);
298
298
  --chrome-alpha: 0.9;
299
299
 
300
300
  color-scheme: dark;