@adea-ai/ui 0.75.1 → 0.76.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/conversation/paste-token-editor.d.ts.map +1 -1
- package/dist/components/conversation/paste-token-editor.js +18 -5
- package/dist/components/conversation/paste-token-editor.js.map +1 -1
- package/dist/r/src/components/conversation/paste-token-editor.tsx +20 -5
- package/dist/r/src/styles/base.css +6 -3
- package/package.json +1 -1
- package/src/components/conversation/paste-token-editor.tsx +20 -5
- package/src/styles/base.css +6 -3
|
@@ -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,
|
|
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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"}
|
|
@@ -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
|
-
|
|
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
|
}
|
|
@@ -512,18 +512,21 @@
|
|
|
512
512
|
overscroll-behavior-y: none;
|
|
513
513
|
-webkit-font-smoothing: antialiased;
|
|
514
514
|
-moz-osx-font-smoothing: grayscale;
|
|
515
|
-
/* The interface default: 14px/1.55, matching the `text-sm` rung. */
|
|
516
515
|
font-family: var(--font-sans);
|
|
517
|
-
font-size: var(--text-sm);
|
|
518
|
-
line-height: var(--text-sm--line-height);
|
|
519
516
|
font-synthesis-weight: none;
|
|
520
517
|
text-rendering: optimizeLegibility;
|
|
521
518
|
}
|
|
522
519
|
|
|
523
520
|
body {
|
|
524
521
|
margin: 0;
|
|
522
|
+
/* The interface default: 14px/1.55, matching the `text-sm` rung. It lives on
|
|
523
|
+
the body, not the root: every rung is written in rem against a 16px root,
|
|
524
|
+
so `font-size: var(--text-sm)` on `html` would make 1rem = 14px and
|
|
525
|
+
`text-sm` would compute to 12.25px — 87.5% of the size it defines. */
|
|
525
526
|
background: var(--background);
|
|
526
527
|
color: var(--foreground);
|
|
528
|
+
font-size: var(--text-sm);
|
|
529
|
+
line-height: var(--text-sm--line-height);
|
|
527
530
|
transition:
|
|
528
531
|
background-color var(--duration-normal) var(--ease-out),
|
|
529
532
|
color var(--duration-normal) var(--ease-out);
|
package/package.json
CHANGED
|
@@ -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
|
-
|
|
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
|
}
|
package/src/styles/base.css
CHANGED
|
@@ -512,18 +512,21 @@
|
|
|
512
512
|
overscroll-behavior-y: none;
|
|
513
513
|
-webkit-font-smoothing: antialiased;
|
|
514
514
|
-moz-osx-font-smoothing: grayscale;
|
|
515
|
-
/* The interface default: 14px/1.55, matching the `text-sm` rung. */
|
|
516
515
|
font-family: var(--font-sans);
|
|
517
|
-
font-size: var(--text-sm);
|
|
518
|
-
line-height: var(--text-sm--line-height);
|
|
519
516
|
font-synthesis-weight: none;
|
|
520
517
|
text-rendering: optimizeLegibility;
|
|
521
518
|
}
|
|
522
519
|
|
|
523
520
|
body {
|
|
524
521
|
margin: 0;
|
|
522
|
+
/* The interface default: 14px/1.55, matching the `text-sm` rung. It lives on
|
|
523
|
+
the body, not the root: every rung is written in rem against a 16px root,
|
|
524
|
+
so `font-size: var(--text-sm)` on `html` would make 1rem = 14px and
|
|
525
|
+
`text-sm` would compute to 12.25px — 87.5% of the size it defines. */
|
|
525
526
|
background: var(--background);
|
|
526
527
|
color: var(--foreground);
|
|
528
|
+
font-size: var(--text-sm);
|
|
529
|
+
line-height: var(--text-sm--line-height);
|
|
527
530
|
transition:
|
|
528
531
|
background-color var(--duration-normal) var(--ease-out),
|
|
529
532
|
color var(--duration-normal) var(--ease-out);
|