@vanduo-oss/vd3-cbun 1.2.0 → 1.3.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.
Files changed (40) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/README.md +16 -14
  3. package/SKILL.md +3 -3
  4. package/dist/charts/index.cjs +18 -8
  5. package/dist/charts/index.cjs.map +2 -2
  6. package/dist/charts/index.d.ts +1 -1
  7. package/dist/charts/index.js +18 -8
  8. package/dist/charts/index.js.map +2 -2
  9. package/dist/charts/vue.d.ts +78 -7
  10. package/dist/code-editor/index.cjs +5 -3
  11. package/dist/code-editor/index.cjs.map +2 -2
  12. package/dist/code-editor/index.js +5 -3
  13. package/dist/code-editor/index.js.map +2 -2
  14. package/dist/draw/core.d.ts +6 -9
  15. package/dist/draw/index.cjs +13 -4
  16. package/dist/draw/index.cjs.map +2 -2
  17. package/dist/draw/index.d.ts +3 -7
  18. package/dist/draw/index.js +13 -4
  19. package/dist/draw/index.js.map +2 -2
  20. package/dist/draw/shapes.d.ts +12 -0
  21. package/dist/flowchart/index.cjs +4 -4
  22. package/dist/flowchart/index.cjs.map +2 -2
  23. package/dist/flowchart/index.js +4 -4
  24. package/dist/flowchart/index.js.map +2 -2
  25. package/dist/hex-grid/index.cjs +90 -62
  26. package/dist/hex-grid/index.cjs.map +3 -3
  27. package/dist/hex-grid/index.d.ts +1 -1
  28. package/dist/hex-grid/index.js +90 -62
  29. package/dist/hex-grid/index.js.map +3 -3
  30. package/dist/hex-grid/vue.d.ts +25 -1
  31. package/dist/index.js +4 -4
  32. package/dist/index.js.map +2 -2
  33. package/dist/meta.json +53 -53
  34. package/dist/music-player/index.cjs +3 -4
  35. package/dist/music-player/index.cjs.map +2 -2
  36. package/dist/music-player/index.d.ts +9 -1
  37. package/dist/music-player/index.js +3 -4
  38. package/dist/music-player/index.js.map +2 -2
  39. package/dist/music-player/vue.d.ts +49 -1
  40. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/code-editor/vue.js", "../../src/code-editor/tokenizer/scanner.js", "../../src/code-editor/tokenizer/javascript.js", "../../src/code-editor/tokenizer/html.js", "../../src/code-editor/tokenizer/css.js", "../../src/code-editor/tokenizer/json.js", "../../src/code-editor/tokenizer/markdown.js", "../../src/code-editor/tokenizer/shell.js", "../../src/code-editor/tokenizer/python.js", "../../src/code-editor/tokenizer/index.js", "../../src/code-editor/highlight.js", "../../src/code-editor/constants.js", "../../src/code-editor/editing.js", "../../src/code-editor/core.js"],
4
- "sourcesContent": ["/**\n * Vue 3 bindings for @vanduo-oss/vd3-cbun/code-editor \u2014 the primary export.\n *\n * import { VdCodeEditor } from '@vanduo-oss/vd3-cbun/code-editor';\n * <VdCodeEditor v-model=\"code\" language=\"javascript\" @change=\"onChange\" />\n *\n * The editor core stays framework-agnostic in ./core.js. SSR-safe: the editor is\n * created on mount (client) into a plain container the server can pre-render.\n */\nimport { defineComponent, h, ref, onMounted, onBeforeUnmount, watch } from 'vue';\nimport { VdCodeEditor as VdCodeEditorCore } from './core.js';\n\nexport const VdCodeEditor = defineComponent({\n name: 'VdCodeEditor',\n props: {\n /** Editor contents (v-model). */\n modelValue: { type: String, default: '' },\n /** Syntax language id or alias (e.g. `js`, `python`, `plaintext`). */\n language: { type: String, default: 'plaintext' },\n /** Render as a non-editable viewer (copy still works). */\n readOnly: { type: Boolean, default: false },\n /** Show the line-number gutter (ignored in wrap mode). */\n lineNumbers: { type: Boolean, default: true },\n /** Indent width, in spaces. */\n tabSize: { type: Number, default: 2 },\n /** Empty-state placeholder text. */\n placeholder: { type: String, default: '' },\n /** Native `maxlength` cap on the content. */\n maxLength: { type: Number, default: undefined },\n /** Soft-wrap long lines (disables the gutter + active-line). */\n wrap: { type: Boolean, default: false },\n /** Auto-close brackets/quotes and step over closers. */\n autoClose: { type: Boolean, default: true },\n /** Highlight the caret's line (ignored in wrap mode). */\n highlightActiveLine: { type: Boolean, default: true },\n /** Skip highlighting above this many characters (perf guard). */\n maxHighlightLength: { type: Number, default: 100000 },\n /** Native spellcheck on the textarea. */\n spellcheck: { type: Boolean, default: false },\n /** Show the copy-to-clipboard button (when the clipboard API exists). */\n copy: { type: Boolean, default: true },\n /** Accessible label for the textarea. */\n ariaLabel: { type: String, default: 'Code editor' },\n },\n emits: ['update:modelValue', 'change', 'focus', 'blur', 'ready'],\n setup(props, { emit, expose }) {\n const el = ref(null);\n let instance = null;\n\n const create = () => {\n instance = new VdCodeEditorCore({\n element: el.value,\n value: props.modelValue,\n language: props.language,\n readOnly: props.readOnly,\n lineNumbers: props.lineNumbers,\n tabSize: props.tabSize,\n placeholder: props.placeholder,\n maxLength: props.maxLength,\n wrap: props.wrap,\n autoClose: props.autoClose,\n highlightActiveLine: props.highlightActiveLine,\n maxHighlightLength: props.maxHighlightLength,\n spellcheck: props.spellcheck,\n copy: props.copy,\n ariaLabel: props.ariaLabel,\n });\n instance.on('change', (payload) => {\n emit('update:modelValue', payload.value);\n emit('change', payload.value);\n });\n instance.on('focus', (e) => emit('focus', e));\n instance.on('blur', (e) => emit('blur', e));\n emit('ready', instance);\n };\n\n const teardown = () => {\n if (instance) {\n instance.destroy();\n instance = null;\n }\n };\n\n onMounted(() => {\n if (typeof window === 'undefined' || !el.value) return;\n create();\n });\n\n // v-model: push external changes in without echoing a change back out.\n watch(\n () => props.modelValue,\n (next) => {\n if (instance && next !== instance.getValue()) instance.setValue(next, { silent: true });\n },\n );\n\n // Cheap props apply live.\n watch(\n () => props.language,\n (v) => instance && instance.setLanguage(v),\n );\n watch(\n () => props.readOnly,\n (v) => instance && instance.setReadOnly(v),\n );\n watch(\n () => props.tabSize,\n (v) => instance && instance.setTabSize(v),\n );\n watch(\n () => props.placeholder,\n (v) => instance && instance.setPlaceholder(v),\n );\n watch(\n () => props.autoClose,\n (v) => instance && instance.setAutoClose(v),\n );\n\n // Structural props recreate the editor (mirrors the flowchart wrapper).\n watch(\n () => [\n props.lineNumbers,\n props.wrap,\n props.highlightActiveLine,\n props.spellcheck,\n props.maxLength,\n props.maxHighlightLength,\n props.copy,\n props.ariaLabel,\n ],\n () => {\n if (!instance) return;\n teardown();\n create();\n },\n );\n\n onBeforeUnmount(teardown);\n\n expose({\n getInstance: () => instance,\n focus: () => instance && instance.focus(),\n blur: () => instance && instance.blur(),\n getValue: () => (instance ? instance.getValue() : props.modelValue),\n setValue: (value) => instance && instance.setValue(value),\n getSelection: () => (instance ? instance.getSelection() : { start: 0, end: 0, text: '' }),\n setSelection: (start, end) => instance && instance.setSelection(start, end),\n insertText: (text) => instance && instance.insertText(text),\n getContainer: () => el.value,\n });\n\n return () => h('div', { ref: el, class: 'vd-code-editor' });\n },\n});\n", "// The shared, ReDoS-safe tokenizer engine.\n//\n// Every language tokenizer is an ordered list of rules `{ type, re }` (or\n// `{ expand, re }`), where each `re` is a STICKY (`y`) regex. `scan()` tries the\n// rules at the current index; the first whose regex matches (consuming >=1 char)\n// wins. Any run of characters no rule matches becomes a single `plain` token.\n//\n// Because every rule is anchored at `lastIndex` and consumes at least one\n// character, scanning is linear in the input length \u2014 there is no cross-position\n// backtracking. Rule regexes must themselves avoid nested unbounded quantifiers\n// (no `(a+)+`) so a single rule can never backtrack catastrophically either.\n\n/**\n * Tokenize `source` with the ordered `rules`. Returns `{ type, value }[]`.\n * Guarantee: `tokens.map((t) => t.value).join('') === source` (lossless).\n */\nexport function scan(source, rules) {\n const tokens = [];\n const n = source.length;\n let i = 0;\n let plainStart = -1;\n\n const flushPlain = (end) => {\n if (plainStart !== -1 && end > plainStart) {\n tokens.push({ type: 'plain', value: source.slice(plainStart, end) });\n }\n plainStart = -1;\n };\n\n while (i < n) {\n let matched = false;\n for (let r = 0; r < rules.length; r++) {\n const rule = rules[r];\n rule.re.lastIndex = i;\n const m = rule.re.exec(source);\n if (m && m[0].length > 0) {\n flushPlain(i);\n const value = m[0];\n if (rule.expand) {\n const sub = rule.expand(value);\n for (let k = 0; k < sub.length; k++) tokens.push(sub[k]);\n } else {\n tokens.push({ type: rule.type, value });\n }\n i += value.length;\n matched = true;\n break;\n }\n }\n if (!matched) {\n if (plainStart === -1) plainStart = i;\n i++;\n }\n }\n flushPlain(n);\n return coalesce(tokens);\n}\n\n/**\n * Merge adjacent tokens of the same type into one, cutting the DOM node count.\n * Lossless \u2014 values are concatenated in order.\n */\nexport function coalesce(tokens) {\n if (tokens.length < 2) return tokens;\n const out = [{ type: tokens[0].type, value: tokens[0].value }];\n for (let i = 1; i < tokens.length; i++) {\n const cur = tokens[i];\n const prev = out[out.length - 1];\n if (cur.type === prev.type) prev.value += cur.value;\n else out.push({ type: cur.type, value: cur.value });\n }\n return out;\n}\n\n/**\n * Build a sticky, word-boundaried alternation from a list of identifier words\n * (all `[A-Za-z0-9_]`, so no escaping needed). Longer words first so the\n * alternation is order-independent even without relying on `\\b`.\n */\nexport function wordRegex(words, flags) {\n const sorted = [...words].sort((a, b) => b.length - a.length);\n return new RegExp('(?:' + sorted.join('|') + ')\\\\b', (flags || '') + 'y');\n}\n", "// JavaScript / TypeScript tokenizer. One rule set, parameterized by keyword\n// list: TypeScript is JavaScript plus a superset of type-level keywords.\n\nimport { scan, wordRegex } from './scanner.js';\n\nconst JS_KEYWORDS = [\n 'break',\n 'case',\n 'catch',\n 'class',\n 'const',\n 'continue',\n 'debugger',\n 'default',\n 'delete',\n 'do',\n 'else',\n 'export',\n 'extends',\n 'finally',\n 'for',\n 'function',\n 'if',\n 'import',\n 'in',\n 'instanceof',\n 'new',\n 'return',\n 'super',\n 'switch',\n 'this',\n 'throw',\n 'try',\n 'typeof',\n 'var',\n 'void',\n 'while',\n 'with',\n 'yield',\n 'async',\n 'await',\n 'let',\n 'static',\n 'get',\n 'set',\n 'of',\n 'as',\n 'from',\n];\n\nconst TS_KEYWORDS = [\n ...JS_KEYWORDS,\n 'interface',\n 'type',\n 'enum',\n 'implements',\n 'declare',\n 'namespace',\n 'readonly',\n 'satisfies',\n 'abstract',\n 'public',\n 'private',\n 'protected',\n 'keyof',\n 'infer',\n 'is',\n 'asserts',\n 'override',\n 'module',\n 'string',\n 'number',\n 'boolean',\n 'object',\n 'symbol',\n 'bigint',\n 'any',\n 'unknown',\n 'never',\n];\n\nconst BUILTINS = [\n 'console',\n 'window',\n 'document',\n 'globalThis',\n 'Math',\n 'JSON',\n 'Object',\n 'Array',\n 'String',\n 'Number',\n 'Boolean',\n 'Symbol',\n 'Promise',\n 'Map',\n 'Set',\n 'WeakMap',\n 'WeakSet',\n 'Date',\n 'RegExp',\n 'Error',\n 'Function',\n 'parseInt',\n 'parseFloat',\n 'isNaN',\n 'isFinite',\n 'require',\n 'module',\n 'exports',\n 'process',\n 'NaN',\n 'Infinity',\n];\n\nfunction makeRules(keywords) {\n return [\n { type: 'comment', re: /\\/\\/[^\\n]*/y },\n { type: 'comment', re: /\\/\\*[\\s\\S]*?\\*\\//y },\n { type: 'string', re: /\"(?:[^\"\\\\\\n]|\\\\.)*\"?/y },\n { type: 'string', re: /'(?:[^'\\\\\\n]|\\\\.)*'?/y },\n { type: 'string', re: /`(?:[^`\\\\]|\\\\.)*`?/y },\n {\n type: 'number',\n re: /0[xX][\\da-fA-F_]+n?|0[bB][01_]+n?|0[oO][0-7_]+n?|(?:\\d[\\d_]*\\.?[\\d_]*|\\.\\d[\\d_]*)(?:[eE][+-]?\\d+)?n?/y,\n },\n { type: 'keyword', re: wordRegex(keywords) },\n { type: 'boolean', re: /(?:true|false)\\b/y },\n { type: 'null', re: /(?:null|undefined)\\b/y },\n { type: 'builtin', re: wordRegex(BUILTINS) },\n { type: 'function', re: /[A-Za-z_$][\\w$]*(?=\\s*\\()/y },\n { type: 'plain', re: /[A-Za-z_$][\\w$]*/y },\n { type: 'operator', re: /\\.{3}|=>|[+\\-*/%=<>!&|^~?]+/y },\n { type: 'punctuation', re: /[{}()[\\];,.:]/y },\n ];\n}\n\nconst JS_RULES = makeRules(JS_KEYWORDS);\nconst TS_RULES = makeRules(TS_KEYWORDS);\n\nexport function tokenizeJavaScript(source) {\n return scan(source, JS_RULES);\n}\n\nexport function tokenizeTypeScript(source) {\n return scan(source, TS_RULES);\n}\n", "// HTML / XML tokenizer. Full tags are matched as one unit, then expanded into\n// tag-name / attribute / value sub-tokens so the tag name and attributes color\n// independently without the scanner needing any \"inside a tag\" state.\n\nimport { scan } from './scanner.js';\n\n// Split a matched tag (e.g. `<div class=\"x\" id='y'>`) into sub-tokens whose\n// values concatenate back to the input exactly (lossless).\nfunction expandTag(value) {\n const out = [];\n const open = /^<\\/?/.exec(value)[0];\n out.push({ type: 'punctuation', value: open });\n let rest = value.slice(open.length);\n\n const name = /^[a-zA-Z][\\w:-]*/.exec(rest);\n if (name) {\n out.push({ type: 'tag', value: name[0] });\n rest = rest.slice(name[0].length);\n }\n\n if (rest) {\n const inner = scan(rest, [\n { type: 'string', re: /\"[^\"]*\"?|'[^']*'?/y },\n { type: 'operator', re: /=/y },\n { type: 'punctuation', re: /\\/?>/y },\n { type: 'attribute', re: /[a-zA-Z_:@][\\w:.-]*/y },\n ]);\n for (let i = 0; i < inner.length; i++) out.push(inner[i]);\n }\n return out;\n}\n\n// The tag name (`[\\w:-]*`) and each attribute are separated by required\n// whitespace (`\\s+`), so the name run and the attribute run never overlap \u2014\n// which keeps the match linear (no catastrophic backtracking) even on an\n// unterminated tag like `<` + a very long identifier.\nconst RULES = [\n { type: 'comment', re: /<!--[\\s\\S]*?-->/y },\n { type: 'meta', re: /<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/y },\n { type: 'meta', re: /<!DOCTYPE[^>]*>/iy },\n {\n expand: expandTag,\n re: /<\\/?[a-zA-Z][\\w:-]*(?:\\s+[^\\s/>\"'=]+(?:\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s>]+))?)*\\s*\\/?>/y,\n },\n { expand: expandTag, re: /<\\/?[a-zA-Z][\\w:-]*/y },\n { type: 'meta', re: /&[a-zA-Z][a-zA-Z0-9]*;|&#\\d+;|&#x[0-9a-fA-F]+;/y },\n];\n\nexport function tokenizeHtml(source) {\n return scan(source, RULES);\n}\n", "// CSS tokenizer. A flat, stateless scan: comments, strings, at-rules, hex\n// colors, numbers+units, `!important`, property names (before a colon),\n// function names (before a paren), punctuation, and combinators.\n\nimport { scan } from './scanner.js';\n\nconst RULES = [\n { type: 'comment', re: /\\/\\*[\\s\\S]*?\\*\\//y },\n { type: 'string', re: /\"(?:[^\"\\\\\\n]|\\\\.)*\"?|'(?:[^'\\\\\\n]|\\\\.)*'?/y },\n { type: 'meta', re: /@[a-zA-Z-]+/y },\n { type: 'keyword', re: /!important\\b/y },\n { type: 'number', re: /#[0-9a-fA-F]{3,8}\\b/y },\n { type: 'number', re: /-?(?:\\d*\\.\\d+|\\d+)(?:%|[a-zA-Z]{1,4})?/y },\n { type: 'property', re: /[-a-zA-Z]+(?=\\s*:)/y },\n { type: 'function', re: /[-a-zA-Z][\\w-]*(?=\\()/y },\n { type: 'punctuation', re: /[{}()[\\];:,]/y },\n { type: 'operator', re: /[>+~*]/y },\n // Catch-all: consume an identifier/dash run (or whitespace) in one match so\n // the greedy property/function look-ahead rules run once per run, not once\n // per character (keeps scanning linear).\n { type: 'plain', re: /[-\\w$]+|\\s+/y },\n];\n\nexport function tokenizeCss(source) {\n return scan(source, RULES);\n}\n", "// JSON tokenizer. Object keys (a string immediately before a colon) color as\n// `property`; all other strings as `string`.\n\nimport { scan } from './scanner.js';\n\nconst RULES = [\n { type: 'property', re: /\"(?:[^\"\\\\]|\\\\.)*\"(?=\\s*:)/y },\n { type: 'string', re: /\"(?:[^\"\\\\]|\\\\.)*\"?/y },\n { type: 'number', re: /-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/y },\n { type: 'boolean', re: /\\b(?:true|false)\\b/y },\n { type: 'null', re: /\\bnull\\b/y },\n { type: 'punctuation', re: /[{}[\\]:,]/y },\n];\n\nexport function tokenizeJson(source) {\n return scan(source, RULES);\n}\n", "// Markdown tokenizer. Line-oriented constructs use the `m` (multiline) + `y`\n// (sticky) flags together, so an anchored `^` rule only fires at a line start.\n\nimport { scan } from './scanner.js';\n\nconst RULES = [\n { type: 'string', re: /```[\\s\\S]*?```|~~~[\\s\\S]*?~~~|`[^`\\n]*`/y },\n { type: 'keyword', re: /^ {0,3}#{1,6} [^\\n]*/my },\n { type: 'comment', re: /^ {0,3}>[^\\n]*/my },\n { type: 'punctuation', re: /^ {0,3}(?:[-*+]|\\d+\\.)\\s/my },\n { type: 'meta', re: /^ {0,3}(?:-{3,}|\\*{3,}|_{3,})\\s*$/my },\n { type: 'function', re: /!?\\[[^\\][\\n]*\\]\\([^()\\n]*\\)/y },\n { type: 'operator', re: /\\*\\*[^\\n]*?\\*\\*|__[^\\n]*?__/y },\n { type: 'meta', re: /\\*[^*\\n]+?\\*|_[^_\\n]+?_/y },\n];\n\nexport function tokenizeMarkdown(source) {\n return scan(source, RULES);\n}\n", "// Shell / Bash tokenizer. Variables (`$VAR`, `${...}`) are matched before the\n// `#` comment rule can fire, so `${#arr}` stays a variable.\n\nimport { scan, wordRegex } from './scanner.js';\n\nconst KEYWORDS = [\n 'if',\n 'then',\n 'elif',\n 'else',\n 'fi',\n 'for',\n 'while',\n 'until',\n 'do',\n 'done',\n 'case',\n 'esac',\n 'function',\n 'in',\n 'select',\n 'return',\n 'break',\n 'continue',\n 'local',\n 'export',\n 'readonly',\n 'declare',\n 'typeset',\n 'set',\n 'unset',\n 'shift',\n 'exit',\n 'source',\n 'alias',\n];\n\nconst BUILTINS = [\n 'echo',\n 'printf',\n 'read',\n 'cd',\n 'pwd',\n 'ls',\n 'cat',\n 'grep',\n 'sed',\n 'awk',\n 'cut',\n 'sort',\n 'uniq',\n 'head',\n 'tail',\n 'find',\n 'xargs',\n 'curl',\n 'wget',\n 'git',\n 'npm',\n 'pnpm',\n 'yarn',\n 'node',\n 'python',\n 'pip',\n 'docker',\n 'kubectl',\n 'make',\n 'chmod',\n 'chown',\n 'mkdir',\n 'rmdir',\n 'rm',\n 'cp',\n 'mv',\n 'touch',\n 'test',\n 'sudo',\n 'env',\n 'which',\n 'kill',\n 'ps',\n 'tar',\n 'ssh',\n];\n\nconst RULES = [\n { type: 'comment', re: /#[^\\n]*/y },\n { type: 'string', re: /\"(?:[^\"\\\\]|\\\\.)*\"?/y },\n { type: 'string', re: /'[^']*'?/y },\n { type: 'variable', re: /\\$\\{[^}\\n]*\\}?|\\$[A-Za-z_]\\w*|\\$[@*#?$!0-9-]/y },\n { type: 'keyword', re: wordRegex(KEYWORDS) },\n { type: 'builtin', re: wordRegex(BUILTINS) },\n { type: 'attribute', re: /(?:^|\\s)-{1,2}[A-Za-z][\\w-]*/y },\n { type: 'number', re: /\\b\\d+\\b/y },\n { type: 'operator', re: /\\|\\||&&|[|&;<>]+/y },\n { type: 'punctuation', re: /[(){}[\\]]/y },\n];\n\nexport function tokenizeShell(source) {\n return scan(source, RULES);\n}\n", "// Python tokenizer. Triple-quoted and prefixed (r/b/f/u) strings are matched as\n// whole strings; f-string interpolation is not sub-highlighted in v1.\n\nimport { scan, wordRegex } from './scanner.js';\n\nconst KEYWORDS = [\n 'def',\n 'class',\n 'return',\n 'if',\n 'elif',\n 'else',\n 'for',\n 'while',\n 'break',\n 'continue',\n 'pass',\n 'import',\n 'from',\n 'as',\n 'with',\n 'try',\n 'except',\n 'finally',\n 'raise',\n 'yield',\n 'lambda',\n 'global',\n 'nonlocal',\n 'del',\n 'assert',\n 'async',\n 'await',\n 'in',\n 'is',\n 'not',\n 'and',\n 'or',\n 'match',\n 'case',\n];\n\nconst BUILTINS = [\n 'print',\n 'len',\n 'range',\n 'int',\n 'float',\n 'str',\n 'list',\n 'dict',\n 'set',\n 'tuple',\n 'bool',\n 'bytes',\n 'type',\n 'isinstance',\n 'issubclass',\n 'super',\n 'open',\n 'enumerate',\n 'zip',\n 'map',\n 'filter',\n 'sorted',\n 'reversed',\n 'sum',\n 'min',\n 'max',\n 'abs',\n 'round',\n 'input',\n 'repr',\n 'format',\n 'object',\n 'self',\n 'cls',\n 'Exception',\n 'ValueError',\n 'TypeError',\n 'KeyError',\n 'IndexError',\n 'AttributeError',\n 'RuntimeError',\n];\n\nconst RULES = [\n { type: 'comment', re: /#[^\\n]*/y },\n {\n type: 'string',\n re: /[rRbBfFuU]{0,2}(?:\"\"\"[\\s\\S]*?\"\"\"|'''[\\s\\S]*?'''|\"(?:[^\"\\\\\\n]|\\\\.)*\"?|'(?:[^'\\\\\\n]|\\\\.)*'?)/y,\n },\n { type: 'meta', re: /@[A-Za-z_]\\w*/y },\n { type: 'keyword', re: wordRegex(KEYWORDS) },\n { type: 'boolean', re: /\\b(?:True|False)\\b/y },\n { type: 'null', re: /\\bNone\\b/y },\n { type: 'builtin', re: wordRegex(BUILTINS) },\n { type: 'function', re: /[A-Za-z_]\\w*(?=\\s*\\()/y },\n {\n type: 'number',\n re: /\\b0[xXoObB][0-9a-fA-F_]+\\b|\\b\\d[\\d_]*(?:\\.\\d[\\d_]*)?(?:[eE][+-]?\\d+)?[jJ]?\\b/y,\n },\n { type: 'operator', re: /:=|[+\\-*/%=<>!&|^~@]+/y },\n { type: 'punctuation', re: /[()[\\]{}:;,.]/y },\n // Catch-all: consume an identifier run (or whitespace) in one match so the\n // greedy function look-ahead rule runs once per run, not once per character.\n { type: 'plain', re: /\\w+|\\s+/y },\n];\n\nexport function tokenizePython(source) {\n return scan(source, RULES);\n}\n", "// Tokenizer registry + the public `tokenize()` entry point.\n//\n// Each language module is a pure `(source) => Token[]` function built on the\n// shared linear scanner. `tokenize()` resolves aliases, dispatches to the right\n// tokenizer, and falls back to a single `plain` token for unknown languages \u2014\n// it never throws.\n\nimport { tokenizeJavaScript, tokenizeTypeScript } from './javascript.js';\nimport { tokenizeHtml } from './html.js';\nimport { tokenizeCss } from './css.js';\nimport { tokenizeJson } from './json.js';\nimport { tokenizeMarkdown } from './markdown.js';\nimport { tokenizeShell } from './shell.js';\nimport { tokenizePython } from './python.js';\n\nconst TOKENIZERS = {\n javascript: tokenizeJavaScript,\n typescript: tokenizeTypeScript,\n html: tokenizeHtml,\n css: tokenizeCss,\n json: tokenizeJson,\n markdown: tokenizeMarkdown,\n shell: tokenizeShell,\n python: tokenizePython,\n};\n\n/** Canonical language ids the editor understands (`plaintext` = no highlight). */\nexport const LANGUAGES = Object.freeze([\n 'plaintext',\n 'javascript',\n 'typescript',\n 'html',\n 'css',\n 'json',\n 'markdown',\n 'shell',\n 'python',\n]);\n\n/** Common aliases mapped to canonical ids. */\nexport const ALIASES = Object.freeze({\n js: 'javascript',\n jsx: 'javascript',\n mjs: 'javascript',\n cjs: 'javascript',\n ts: 'typescript',\n tsx: 'typescript',\n htm: 'html',\n xml: 'html',\n vue: 'html',\n svg: 'html',\n sh: 'shell',\n bash: 'shell',\n zsh: 'shell',\n shellscript: 'shell',\n py: 'python',\n python3: 'python',\n md: 'markdown',\n mkd: 'markdown',\n json5: 'json',\n jsonc: 'json',\n text: 'plaintext',\n txt: 'plaintext',\n plain: 'plaintext',\n});\n\n/** Resolve a language id or alias to its canonical id. */\nexport function resolveLanguage(language) {\n const id = String(language || 'plaintext').toLowerCase();\n return ALIASES[id] || id;\n}\n\n/** The tokenizer function for a language, or `null` when none is registered. */\nexport function getTokenizer(language) {\n return TOKENIZERS[resolveLanguage(language)] || null;\n}\n\n/**\n * Tokenize `source` for `language`. Returns `{ type, value }[]`; the token\n * values always concatenate back to `source` exactly (lossless).\n */\nexport function tokenize(source, language) {\n if (!source) return [];\n const tokenizer = getTokenizer(language);\n if (!tokenizer) return [{ type: 'plain', value: source }];\n return tokenizer(source);\n}\n", "// Highlight rendering. Two paths, both escaping-safe:\n// - renderTokensToHtml / highlight \u2192 an escaped HTML STRING (node tests, SSR).\n// - renderTokensToDom \u2192 a DOM DocumentFragment built with createElement /\n// createTextNode. This is the RUNTIME path; untrusted source text only ever\n// reaches `textContent`, so `innerHTML` is never assigned and markup\n// injection is structurally impossible.\n\nimport { tokenize } from './tokenizer/index.js';\n\nconst ESCAPE_RE = /[&<>\"']/g;\nconst ESCAPE_MAP = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;',\n};\n\n/** Escape the five HTML metacharacters. */\nexport function escapeHtml(str) {\n return String(str).replace(ESCAPE_RE, (ch) => ESCAPE_MAP[ch]);\n}\n\n/** Render tokens to an escaped HTML string of `<span class=\"vd-tk-*\">` wrappers. */\nexport function renderTokensToHtml(tokens) {\n let html = '';\n for (let i = 0; i < tokens.length; i++) {\n const t = tokens[i];\n if (t.type === 'plain') {\n html += escapeHtml(t.value);\n } else {\n html += '<span class=\"vd-tk-' + t.type + '\">' + escapeHtml(t.value) + '</span>';\n }\n }\n return html;\n}\n\n/**\n * Tokenize + render to an escaped HTML string. A trailing newline is appended\n * when the source ends in one, so a `<pre>` layer (which collapses a single\n * trailing newline) keeps the same line count as the textarea it sits under.\n */\nexport function highlight(source, language) {\n const html = renderTokensToHtml(tokenize(source, language));\n return source.endsWith('\\n') || source === '' ? html + '\\n' : html;\n}\n\n/**\n * Build a DocumentFragment of token nodes using `doc` (an injected `document`,\n * for jsdom/SSR testability). Plain tokens become text nodes; typed tokens\n * become `<span class=\"vd-tk-*\">` with the text set via `textContent`.\n */\nexport function renderTokensToDom(tokens, doc) {\n const frag = doc.createDocumentFragment();\n for (let i = 0; i < tokens.length; i++) {\n const t = tokens[i];\n if (t.type === 'plain') {\n frag.appendChild(doc.createTextNode(t.value));\n } else {\n const span = doc.createElement('span');\n span.className = 'vd-tk-' + t.type;\n span.textContent = t.value;\n frag.appendChild(span);\n }\n }\n return frag;\n}\n", "// Shared, DOM-free constants for the code editor. Pure data and predicates \u2014\n// safe to import from node tests and from both the core and the tokenizers.\n\n/** Default indent width, in spaces. */\nexport const DEFAULT_TAB_SIZE = 2;\n\n// Above this many characters, highlighting is skipped (the editor renders one\n// escaped plain-text node) so very large documents stay responsive.\nexport const MAX_HIGHLIGHT_LENGTH = 100000;\n\n/** Characters that auto-close to the mapped closer when typed. */\nexport const AUTO_CLOSE_PAIRS = Object.freeze({\n '(': ')',\n '[': ']',\n '{': '}',\n '\"': '\"',\n \"'\": \"'\",\n '`': '`',\n});\n\n/** Opening characters that trigger auto-close. */\nexport const OPENERS = Object.freeze(Object.keys(AUTO_CLOSE_PAIRS));\n\n/** Closing characters (brackets + quotes) the caret can skip over. */\nexport const CLOSERS = Object.freeze([')', ']', '}', '\"', \"'\", '`']);\n\n/** True when `ch` is an auto-closing opener. */\nexport function isOpener(ch) {\n return Object.prototype.hasOwnProperty.call(AUTO_CLOSE_PAIRS, ch);\n}\n\n/** The closer mapped to `ch`, or `undefined`. */\nexport function closerFor(ch) {\n return AUTO_CLOSE_PAIRS[ch];\n}\n\n/** True when `open`/`close` form an auto-close pair. */\nexport function isMatchingPair(open, close) {\n return AUTO_CLOSE_PAIRS[open] === close;\n}\n", "// Pure keymap transactions. Each function takes the current textarea value and\n// selection and returns an EDIT \u2014 `{ from, to, text, selectionStart,\n// selectionEnd }` describing a replacement of `value[from..to]` with `text` plus\n// the resulting caret \u2014 or `null` to let the browser handle the key natively.\n// No DOM access, so every branch is unit-testable in plain node.\n\nimport { AUTO_CLOSE_PAIRS, CLOSERS, closerFor, isMatchingPair } from './constants.js';\n\nconst CLOSER_SET = new Set(CLOSERS);\nconst WORD = /[\\w$]/;\n\n/** Enter: copy the current line's indent, add a level after an opener, and\n * split an empty pair onto its own line. */\nexport function indentOnEnter(value, start, end, unit) {\n const lineStart = value.lastIndexOf('\\n', start - 1) + 1;\n const leading = /^[ \\t]*/.exec(value.slice(lineStart, start))[0];\n const prev = value[start - 1];\n const next = value[end];\n const opens = prev === '{' || prev === '[' || prev === '(';\n\n if (opens && isMatchingPair(prev, next)) {\n const inner = leading + unit;\n const text = '\\n' + inner + '\\n' + leading;\n const caret = start + 1 + inner.length;\n return { from: start, to: end, text, selectionStart: caret, selectionEnd: caret };\n }\n\n const indent = opens ? leading + unit : leading;\n const text = '\\n' + indent;\n const caret = start + text.length;\n return { from: start, to: end, text, selectionStart: caret, selectionEnd: caret };\n}\n\n/** Tab: insert one indent unit, or indent every line of a multi-line selection. */\nexport function handleTab(value, start, end, unit) {\n if (start !== end && value.slice(start, end).indexOf('\\n') !== -1) {\n const from = value.lastIndexOf('\\n', start - 1) + 1;\n const block = value.slice(from, end);\n const indented = block.replace(/^/gm, unit);\n const added = indented.length - block.length;\n return {\n from,\n to: end,\n text: indented,\n selectionStart: start + unit.length,\n selectionEnd: end + added,\n };\n }\n return {\n from: start,\n to: end,\n text: unit,\n selectionStart: start + unit.length,\n selectionEnd: start + unit.length,\n };\n}\n\n/** Shift-Tab: remove up to one indent unit from the start of each selected line. */\nexport function handleShiftTab(value, start, end, unit) {\n const from = value.lastIndexOf('\\n', start - 1) + 1;\n const size = unit.length || 1;\n const lines = value.slice(from, end).split('\\n');\n let firstRemoved = 0;\n let totalRemoved = 0;\n const dedented = lines\n .map((line, idx) => {\n let remove = 0;\n while (remove < size && line[remove] === ' ') remove++;\n if (remove === 0 && line[0] === '\\t') remove = 1;\n if (idx === 0) firstRemoved = remove;\n totalRemoved += remove;\n return line.slice(remove);\n })\n .join('\\n');\n return {\n from,\n to: end,\n text: dedented,\n selectionStart: Math.max(from, start - firstRemoved),\n selectionEnd: Math.max(from, end - totalRemoved),\n };\n}\n\n/** Typing an opener/quote: wrap a selection, or insert the matching closer. */\nexport function autoClosePair(char, value, start, end) {\n const closer = closerFor(char);\n if (!closer) return null;\n\n if (start !== end) {\n return {\n from: start,\n to: end,\n text: char + value.slice(start, end) + closer,\n selectionStart: start + 1,\n selectionEnd: end + 1,\n };\n }\n\n const nextChar = value[start];\n if (char === closer) {\n // Quote: skip auto-close next to a word char (apostrophes, mid-word typing).\n if (nextChar && WORD.test(nextChar)) return null;\n const prevChar = value[start - 1];\n if (prevChar && WORD.test(prevChar)) return null;\n } else if (nextChar && WORD.test(nextChar)) {\n return null;\n }\n\n return {\n from: start,\n to: end,\n text: char + closer,\n selectionStart: start + 1,\n selectionEnd: start + 1,\n };\n}\n\n/** Typing a closer when the next char is that same closer: step over it. */\nexport function skipOverCloser(char, value, start, end) {\n if (start !== end || !CLOSER_SET.has(char)) return null;\n if (value[start] === char) {\n return { caretOnly: true, selectionStart: start + 1, selectionEnd: start + 1 };\n }\n return null;\n}\n\n/** Backspace between an empty auto-pair (`()`, `\"\"`, \u2026): delete both sides. */\nexport function handleBackspacePair(value, start, end) {\n if (start !== end || start === 0) return null;\n const prev = value[start - 1];\n const next = value[start];\n if (AUTO_CLOSE_PAIRS[prev] && AUTO_CLOSE_PAIRS[prev] === next) {\n return {\n from: start - 1,\n to: start + 1,\n text: '',\n selectionStart: start - 1,\n selectionEnd: start - 1,\n };\n }\n return null;\n}\n", "// Framework-agnostic core for the code editor.\n//\n// The editing model is a native <textarea> rendered transparently over a <pre>\n// highlight layer: the browser owns caret, selection, IME, clipboard, and\n// undo/redo, while a homegrown tokenizer repaints the highlight beneath it. The\n// core builds its own DOM, keeps the two layers scroll- and glyph-aligned,\n// applies a small keymap (indent / tab / auto-close) through the native undo\n// stack, and paints only via DOM nodes \u2014 never `innerHTML`. It imports no `vue`.\n\nimport { tokenize, LANGUAGES } from './tokenizer/index.js';\nimport { renderTokensToDom, highlight } from './highlight.js';\nimport {\n indentOnEnter,\n handleTab,\n handleShiftTab,\n autoClosePair,\n skipOverCloser,\n handleBackspacePair,\n} from './editing.js';\nimport { DEFAULT_TAB_SIZE, MAX_HIGHLIGHT_LENGTH } from './constants.js';\n\n/** Current component version (mirrored in component-versions.json). */\nexport const VD_CODE_EDITOR_VERSION = '1.0.0';\n\nconst DEFAULTS = {\n value: '',\n language: 'plaintext',\n readOnly: false,\n lineNumbers: true,\n tabSize: DEFAULT_TAB_SIZE,\n placeholder: '',\n maxLength: undefined,\n wrap: false,\n autoClose: true,\n highlightActiveLine: true,\n maxHighlightLength: MAX_HIGHLIGHT_LENGTH,\n spellcheck: false,\n ariaLabel: 'Code editor',\n copy: true,\n};\n\n// Scheduler that degrades gracefully when rAF is absent (SSR/jsdom). Bound to\n// `window` so browsers never throw \"Illegal invocation\".\nconst RAF =\n typeof window !== 'undefined' && window.requestAnimationFrame\n ? window.requestAnimationFrame.bind(window)\n : (cb) => setTimeout(cb, 16);\nconst CAF =\n typeof window !== 'undefined' && window.cancelAnimationFrame\n ? window.cancelAnimationFrame.bind(window)\n : clearTimeout;\n\nfunction resolveElement(element) {\n if (!element) return null;\n if (typeof element === 'string') {\n return typeof document !== 'undefined' ? document.querySelector(element) : null;\n }\n return element;\n}\n\nfunction countNewlines(str, end) {\n let n = 0;\n const limit = end == null ? str.length : end;\n for (let i = 0; i < limit; i++) {\n if (str.charCodeAt(i) === 10) n++;\n }\n return n;\n}\n\nexport class VdCodeEditor {\n constructor(options = {}) {\n this._opts = Object.assign({}, DEFAULTS, options);\n this._listeners = Object.create(null);\n this._domListeners = [];\n this._raf = 0;\n this._ro = null;\n this._copyTimer = 0;\n this._destroyed = false;\n this._lineHeight = 21;\n this._paddingTop = 0;\n this._gutterCount = -1;\n this._lastValue = this._opts.value == null ? '' : String(this._opts.value);\n\n this.element = resolveElement(options.element);\n if (this.element) this._mount();\n }\n\n // \u2500\u2500 mounting \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n _mount() {\n const el = this.element;\n const doc = el.ownerDocument;\n const opts = this._opts;\n const showGutter = opts.lineNumbers && !opts.wrap;\n const showActiveLine = opts.highlightActiveLine && !opts.wrap;\n\n el.classList.add('vd-code-editor');\n el.classList.toggle('is-wrap', !!opts.wrap);\n el.classList.toggle('is-readonly', !!opts.readOnly);\n el.classList.toggle('has-gutter', showGutter);\n el.style.setProperty('--vd-code-editor-tab-size', String(opts.tabSize));\n\n // Active-line band (bottom layer).\n if (showActiveLine) {\n this._activeLine = doc.createElement('div');\n this._activeLine.className = 'vd-code-editor-active-line';\n this._activeLine.setAttribute('aria-hidden', 'true');\n el.appendChild(this._activeLine);\n }\n\n // Highlight layer.\n this._pre = doc.createElement('pre');\n this._pre.className = 'vd-code-editor-highlight';\n this._pre.setAttribute('aria-hidden', 'true');\n this._code = doc.createElement('code');\n this._code.className = 'vd-code-editor-code';\n this._pre.appendChild(this._code);\n el.appendChild(this._pre);\n\n // Gutter (over the band's left edge; opaque).\n if (showGutter) {\n this._gutter = doc.createElement('div');\n this._gutter.className = 'vd-code-editor-gutter';\n this._gutter.setAttribute('aria-hidden', 'true');\n this._gutterLines = doc.createElement('div');\n this._gutterLines.className = 'vd-code-editor-gutter-lines';\n this._gutter.appendChild(this._gutterLines);\n el.appendChild(this._gutter);\n }\n\n // Editable surface (top layer).\n const ta = doc.createElement('textarea');\n ta.className = 'vd-code-editor-input';\n ta.value = this._lastValue;\n ta.spellcheck = !!opts.spellcheck;\n ta.wrap = opts.wrap ? 'soft' : 'off';\n ta.setAttribute('autocomplete', 'off');\n ta.setAttribute('autocapitalize', 'off');\n ta.setAttribute('autocorrect', 'off');\n ta.setAttribute('aria-label', opts.ariaLabel || 'Code editor');\n ta.setAttribute('aria-multiline', 'true');\n if (opts.readOnly) ta.readOnly = true;\n if (opts.placeholder) ta.placeholder = opts.placeholder;\n if (opts.maxLength != null) ta.maxLength = opts.maxLength;\n ta.style.tabSize = String(opts.tabSize);\n this._pre.style.tabSize = String(opts.tabSize);\n this._textarea = ta;\n el.appendChild(ta);\n\n // Copy control (only when enabled and the clipboard API exists).\n if (opts.copy && typeof navigator !== 'undefined' && navigator.clipboard) {\n const btn = doc.createElement('button');\n btn.type = 'button';\n btn.className = 'vd-code-editor-copy';\n btn.setAttribute('aria-label', 'Copy code');\n btn.textContent = 'Copy';\n this._copyBtn = btn;\n el.appendChild(btn);\n }\n\n this._attach();\n this._measure();\n this._repaint();\n this._syncScroll();\n }\n\n _attach() {\n const ta = this._textarea;\n this._listen(ta, 'input', () => this._handleInput());\n this._listen(ta, 'scroll', () => this._syncScroll());\n this._listen(ta, 'keydown', (e) => this._handleKeydown(e));\n this._listen(ta, 'focus', (e) => this._handleFocus(e));\n this._listen(ta, 'blur', (e) => this._handleBlur(e));\n this._listen(ta, 'click', () => this._updateActiveLine());\n this._listen(ta, 'keyup', () => this._updateActiveLine());\n this._listen(ta, 'select', () => this._updateActiveLine());\n if (this._copyBtn) this._listen(this._copyBtn, 'click', () => this._handleCopy());\n\n if (typeof ResizeObserver === 'function') {\n this._ro = new ResizeObserver(() => {\n this._measure();\n this._syncScroll();\n });\n this._ro.observe(this.element);\n }\n\n // Re-measure once web fonts settle (FOUT would shift line metrics).\n const fonts = this.element.ownerDocument.fonts;\n if (fonts && fonts.ready && typeof fonts.ready.then === 'function') {\n fonts.ready.then(() => {\n if (this._destroyed) return;\n this._measure();\n this._syncScroll();\n });\n }\n }\n\n _listen(target, type, handler) {\n target.addEventListener(type, handler);\n this._domListeners.push([target, type, handler]);\n }\n\n // \u2500\u2500 rendering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n _measure() {\n if (typeof getComputedStyle !== 'function') return;\n const cs = getComputedStyle(this._textarea);\n const lh = parseFloat(cs.lineHeight);\n if (Number.isFinite(lh) && lh > 0) this._lineHeight = lh;\n const pt = parseFloat(cs.paddingTop);\n this._paddingTop = Number.isFinite(pt) ? pt : 0;\n }\n\n _scheduleRepaint() {\n if (this._raf || this._destroyed) return;\n this._raf = RAF(() => {\n this._raf = 0;\n if (!this._destroyed) this._repaint();\n });\n }\n\n _repaint() {\n const value = this._textarea.value;\n const doc = this.element.ownerDocument;\n const trailing = value.endsWith('\\n') || value === '';\n\n if (value.length > this._opts.maxHighlightLength) {\n this._code.classList.add('is-plain');\n this._code.replaceChildren(doc.createTextNode(trailing ? value + '\\n' : value));\n } else {\n this._code.classList.remove('is-plain');\n const frag = renderTokensToDom(tokenize(value, this._opts.language), doc);\n if (trailing) frag.appendChild(doc.createTextNode('\\n'));\n this._code.replaceChildren(frag);\n }\n this._updateGutter(value);\n }\n\n _updateGutter(value) {\n if (!this._gutterLines) return;\n const lines = countNewlines(value) + 1;\n if (lines === this._gutterCount) return;\n this._gutterCount = lines;\n this.element.style.setProperty(\n '--vd-code-editor-gutter-digits',\n String(Math.max(2, String(lines).length)),\n );\n let text = '1';\n for (let i = 2; i <= lines; i++) text += '\\n' + i;\n this._gutterLines.textContent = text;\n }\n\n _syncScroll() {\n const ta = this._textarea;\n if (!ta) return;\n const st = ta.scrollTop;\n if (this._pre) {\n this._pre.scrollTop = st;\n this._pre.scrollLeft = ta.scrollLeft;\n }\n if (this._gutterLines) {\n this._gutterLines.style.transform = 'translateY(' + -st + 'px)';\n }\n this._updateActiveLine();\n }\n\n _updateActiveLine() {\n if (!this._activeLine) return;\n const ta = this._textarea;\n const line = countNewlines(ta.value, ta.selectionStart || 0);\n const top = this._paddingTop + line * this._lineHeight - ta.scrollTop;\n this._activeLine.style.height = this._lineHeight + 'px';\n this._activeLine.style.transform = 'translateY(' + top + 'px)';\n }\n\n // \u2500\u2500 input + keymap \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n _handleInput() {\n this._scheduleRepaint();\n this._syncScroll();\n this._emitChangeIfChanged();\n }\n\n _emitChangeIfChanged() {\n const v = this._textarea.value;\n if (v === this._lastValue) return;\n this._lastValue = v;\n this._emit('change', { value: v });\n }\n\n _handleFocus(e) {\n this.element.classList.add('is-focused');\n this._emit('focus', e);\n }\n\n _handleBlur(e) {\n this.element.classList.remove('is-focused');\n this._emit('blur', e);\n }\n\n _handleKeydown(e) {\n if (this._opts.readOnly || e.isComposing) return;\n if (e.ctrlKey || e.metaKey || e.altKey) return;\n\n const ta = this._textarea;\n const value = ta.value;\n const s = ta.selectionStart;\n const en = ta.selectionEnd;\n const unit = ' '.repeat(this._opts.tabSize);\n\n if (e.key === 'Enter') {\n e.preventDefault();\n this._applyEdit(indentOnEnter(value, s, en, unit));\n return;\n }\n if (e.key === 'Tab') {\n e.preventDefault();\n this._applyEdit(\n e.shiftKey ? handleShiftTab(value, s, en, unit) : handleTab(value, s, en, unit),\n );\n return;\n }\n if (e.key === 'Backspace') {\n const edit = handleBackspacePair(value, s, en);\n if (edit) {\n e.preventDefault();\n this._applyEdit(edit);\n }\n return;\n }\n if (e.key.length === 1 && this._opts.autoClose) {\n const skip = skipOverCloser(e.key, value, s, en);\n if (skip) {\n e.preventDefault();\n ta.setSelectionRange(skip.selectionStart, skip.selectionEnd);\n this._updateActiveLine();\n return;\n }\n const auto = autoClosePair(e.key, value, s, en);\n if (auto) {\n e.preventDefault();\n this._applyEdit(auto);\n }\n }\n }\n\n // Apply an edit, preferring execCommand so the native undo stack is preserved;\n // fall back to setRangeText, then to a direct value splice (jsdom/old engines).\n _applyEdit(edit) {\n const ta = this._textarea;\n ta.setSelectionRange(edit.from, edit.to);\n let nativeInput = false;\n if (this._tryExecInsert(edit.text)) {\n nativeInput = true;\n } else if (typeof ta.setRangeText === 'function') {\n ta.setRangeText(edit.text, edit.from, edit.to, 'end');\n } else {\n ta.value = ta.value.slice(0, edit.from) + edit.text + ta.value.slice(edit.to);\n }\n if (edit.selectionStart != null) {\n const end = edit.selectionEnd == null ? edit.selectionStart : edit.selectionEnd;\n ta.setSelectionRange(edit.selectionStart, end);\n }\n if (nativeInput) {\n // execCommand already dispatched 'input' (repaint + emit); just fix caret.\n this._updateActiveLine();\n } else {\n this._handleInput();\n }\n }\n\n _tryExecInsert(text) {\n try {\n return (\n typeof document !== 'undefined' &&\n typeof document.execCommand === 'function' &&\n document.execCommand('insertText', false, text)\n );\n } catch {\n return false;\n }\n }\n\n _handleCopy() {\n if (this._destroyed || typeof navigator === 'undefined' || !navigator.clipboard) return;\n navigator.clipboard.writeText(this._textarea.value).then(\n () => this._flashCopied(),\n () => {},\n );\n }\n\n _flashCopied() {\n if (!this._copyBtn) return;\n this._copyBtn.classList.add('is-copied');\n this._copyBtn.textContent = 'Copied';\n if (this._copyTimer) clearTimeout(this._copyTimer);\n this._copyTimer = setTimeout(() => {\n this._copyTimer = 0;\n if (this._destroyed || !this._copyBtn) return;\n this._copyBtn.classList.remove('is-copied');\n this._copyBtn.textContent = 'Copy';\n }, 1200);\n }\n\n // \u2500\u2500 public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n getValue() {\n return this._textarea ? this._textarea.value : this._lastValue;\n }\n\n setValue(next, options) {\n const silent = !!(options && options.silent);\n const v = next == null ? '' : String(next);\n if (!this._textarea) {\n this._lastValue = v;\n return this;\n }\n if (v === this._textarea.value) return this;\n this._textarea.value = v;\n if (silent) this._lastValue = v;\n this._repaint();\n this._syncScroll();\n if (!silent) this._emitChangeIfChanged();\n return this;\n }\n\n getSelection() {\n const ta = this._textarea;\n if (!ta) return { start: 0, end: 0, text: '' };\n return {\n start: ta.selectionStart,\n end: ta.selectionEnd,\n text: ta.value.slice(ta.selectionStart, ta.selectionEnd),\n };\n }\n\n setSelection(start, end) {\n if (!this._textarea) return this;\n const e = end == null ? start : end;\n this._textarea.setSelectionRange(start, e);\n this._updateActiveLine();\n return this;\n }\n\n insertText(text) {\n if (!this._textarea) return this;\n const ta = this._textarea;\n const str = String(text);\n this._applyEdit({\n from: ta.selectionStart,\n to: ta.selectionEnd,\n text: str,\n selectionStart: ta.selectionStart + str.length,\n });\n return this;\n }\n\n setLanguage(language) {\n this._opts.language = language || 'plaintext';\n if (this._textarea) this._repaint();\n return this;\n }\n\n setReadOnly(readOnly) {\n this._opts.readOnly = !!readOnly;\n if (this._textarea) this._textarea.readOnly = !!readOnly;\n if (this.element) this.element.classList.toggle('is-readonly', !!readOnly);\n return this;\n }\n\n setTabSize(tabSize) {\n const n = Number(tabSize) || DEFAULT_TAB_SIZE;\n this._opts.tabSize = n;\n if (this._textarea) this._textarea.style.tabSize = String(n);\n if (this._pre) this._pre.style.tabSize = String(n);\n if (this.element) this.element.style.setProperty('--vd-code-editor-tab-size', String(n));\n return this;\n }\n\n setPlaceholder(text) {\n this._opts.placeholder = text || '';\n if (this._textarea) this._textarea.placeholder = text || '';\n return this;\n }\n\n setAutoClose(autoClose) {\n this._opts.autoClose = !!autoClose;\n return this;\n }\n\n focus() {\n if (this._textarea) this._textarea.focus();\n return this;\n }\n\n blur() {\n if (this._textarea) this._textarea.blur();\n return this;\n }\n\n on(name, handler) {\n if (!this._listeners[name]) this._listeners[name] = [];\n this._listeners[name].push(handler);\n return this;\n }\n\n off(name, handler) {\n const list = this._listeners[name];\n if (!list) return this;\n const i = list.indexOf(handler);\n if (i !== -1) list.splice(i, 1);\n return this;\n }\n\n _emit(name, payload) {\n const list = this._listeners[name];\n if (!list) return;\n for (let i = 0; i < list.length; i++) list[i](payload);\n }\n\n destroy() {\n if (this._destroyed) return;\n this._destroyed = true;\n if (this._raf) CAF(this._raf);\n if (this._copyTimer) clearTimeout(this._copyTimer);\n if (this._ro) {\n this._ro.disconnect();\n this._ro = null;\n }\n for (let i = 0; i < this._domListeners.length; i++) {\n const [target, type, handler] = this._domListeners[i];\n target.removeEventListener(type, handler);\n }\n this._domListeners = [];\n if (this.element) {\n const nodes = [this._activeLine, this._pre, this._gutter, this._textarea, this._copyBtn];\n for (let i = 0; i < nodes.length; i++) {\n const n = nodes[i];\n if (n && n.parentNode === this.element) this.element.removeChild(n);\n }\n this.element.classList.remove(\n 'vd-code-editor',\n 'is-wrap',\n 'is-readonly',\n 'has-gutter',\n 'is-focused',\n );\n }\n this._listeners = Object.create(null);\n this._textarea = null;\n this._pre = null;\n this._code = null;\n this._gutter = null;\n this._gutterLines = null;\n this._activeLine = null;\n this._copyBtn = null;\n }\n}\n\nexport { tokenize, highlight, LANGUAGES };\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Vue 3 bindings for @vanduo-oss/vd3-cbun/code-editor \u2014 the primary export.\n *\n * import { VdCodeEditor } from '@vanduo-oss/vd3-cbun/code-editor';\n * <VdCodeEditor v-model=\"code\" language=\"javascript\" @change=\"onChange\" />\n *\n * The editor core stays framework-agnostic in ./core.js. SSR-safe: the editor is\n * created on mount (client) into a plain container the server can pre-render.\n */\nimport { defineComponent, h, ref, onMounted, onBeforeUnmount, watch } from 'vue';\nimport { VdCodeEditor as VdCodeEditorCore } from './core.js';\n\nexport const VdCodeEditor = defineComponent({\n name: 'VdCodeEditor',\n props: {\n /** Editor contents (v-model). */\n modelValue: { type: String, default: '' },\n /** Syntax language id or alias (e.g. `js`, `python`, `plaintext`). */\n language: { type: String, default: 'plaintext' },\n /** Render as a non-editable viewer (copy still works). */\n readOnly: { type: Boolean, default: false },\n /** Show the line-number gutter (ignored in wrap mode). */\n lineNumbers: { type: Boolean, default: true },\n /** Indent width, in spaces. */\n tabSize: { type: Number, default: 2 },\n /** Empty-state placeholder text. */\n placeholder: { type: String, default: '' },\n /** Native `maxlength` cap on the content. */\n maxLength: { type: Number, default: undefined },\n /** Soft-wrap long lines (disables the gutter + active-line). */\n wrap: { type: Boolean, default: false },\n /** Auto-close brackets/quotes and step over closers. */\n autoClose: { type: Boolean, default: true },\n /** Highlight the caret's line (ignored in wrap mode). */\n highlightActiveLine: { type: Boolean, default: true },\n /** Skip highlighting above this many characters (perf guard). */\n maxHighlightLength: { type: Number, default: 100000 },\n /** Native spellcheck on the textarea. */\n spellcheck: { type: Boolean, default: false },\n /** Show the copy-to-clipboard button (when the clipboard API exists). */\n copy: { type: Boolean, default: true },\n /** Accessible label for the textarea. */\n ariaLabel: { type: String, default: 'Code editor' },\n },\n emits: ['update:modelValue', 'change', 'focus', 'blur', 'ready'],\n setup(props, { emit, expose }) {\n const el = ref(null);\n let instance = null;\n\n const create = () => {\n instance = new VdCodeEditorCore({\n element: el.value,\n value: props.modelValue,\n language: props.language,\n readOnly: props.readOnly,\n lineNumbers: props.lineNumbers,\n tabSize: props.tabSize,\n placeholder: props.placeholder,\n maxLength: props.maxLength,\n wrap: props.wrap,\n autoClose: props.autoClose,\n highlightActiveLine: props.highlightActiveLine,\n maxHighlightLength: props.maxHighlightLength,\n spellcheck: props.spellcheck,\n copy: props.copy,\n ariaLabel: props.ariaLabel,\n });\n instance.on('change', (payload) => {\n emit('update:modelValue', payload.value);\n emit('change', payload.value);\n });\n instance.on('focus', (e) => emit('focus', e));\n instance.on('blur', (e) => emit('blur', e));\n emit('ready', instance);\n };\n\n const teardown = () => {\n if (instance) {\n instance.destroy();\n instance = null;\n }\n };\n\n onMounted(() => {\n if (typeof window === 'undefined' || !el.value) return;\n create();\n });\n\n // v-model: push external changes in without echoing a change back out.\n watch(\n () => props.modelValue,\n (next) => {\n if (instance && next !== instance.getValue()) instance.setValue(next, { silent: true });\n },\n );\n\n // Cheap props apply live.\n watch(\n () => props.language,\n (v) => instance && instance.setLanguage(v),\n );\n watch(\n () => props.readOnly,\n (v) => instance && instance.setReadOnly(v),\n );\n watch(\n () => props.tabSize,\n (v) => instance && instance.setTabSize(v),\n );\n watch(\n () => props.placeholder,\n (v) => instance && instance.setPlaceholder(v),\n );\n watch(\n () => props.autoClose,\n (v) => instance && instance.setAutoClose(v),\n );\n\n // Structural props recreate the editor (mirrors the flowchart wrapper).\n watch(\n () => [\n props.lineNumbers,\n props.wrap,\n props.highlightActiveLine,\n props.spellcheck,\n props.maxLength,\n props.maxHighlightLength,\n props.copy,\n props.ariaLabel,\n ],\n () => {\n if (!instance) return;\n teardown();\n create();\n },\n );\n\n onBeforeUnmount(teardown);\n\n expose({\n getInstance: () => instance,\n focus: () => instance && instance.focus(),\n blur: () => instance && instance.blur(),\n getValue: () => (instance ? instance.getValue() : props.modelValue),\n setValue: (value) => instance && instance.setValue(value),\n getSelection: () => (instance ? instance.getSelection() : { start: 0, end: 0, text: '' }),\n setSelection: (start, end) => instance && instance.setSelection(start, end),\n insertText: (text) => instance && instance.insertText(text),\n getContainer: () => el.value,\n });\n\n return () => h('div', { ref: el, class: 'vd-code-editor' });\n },\n});\n", "// The shared, ReDoS-safe tokenizer engine.\n//\n// Every language tokenizer is an ordered list of rules `{ type, re }` (or\n// `{ expand, re }`), where each `re` is a STICKY (`y`) regex. `scan()` tries the\n// rules at the current index; the first whose regex matches (consuming >=1 char)\n// wins. Any run of characters no rule matches becomes a single `plain` token.\n//\n// Because every rule is anchored at `lastIndex` and consumes at least one\n// character, scanning is linear in the input length \u2014 there is no cross-position\n// backtracking. Rule regexes must themselves avoid nested unbounded quantifiers\n// (no `(a+)+`) so a single rule can never backtrack catastrophically either.\n\n/**\n * Tokenize `source` with the ordered `rules`. Returns `{ type, value }[]`.\n * Guarantee: `tokens.map((t) => t.value).join('') === source` (lossless).\n */\nexport function scan(source, rules) {\n const tokens = [];\n const n = source.length;\n let i = 0;\n let plainStart = -1;\n\n const flushPlain = (end) => {\n if (plainStart !== -1 && end > plainStart) {\n tokens.push({ type: 'plain', value: source.slice(plainStart, end) });\n }\n plainStart = -1;\n };\n\n while (i < n) {\n let matched = false;\n for (let r = 0; r < rules.length; r++) {\n const rule = rules[r];\n rule.re.lastIndex = i;\n const m = rule.re.exec(source);\n if (m && m[0].length > 0) {\n flushPlain(i);\n const value = m[0];\n if (rule.expand) {\n const sub = rule.expand(value);\n for (let k = 0; k < sub.length; k++) tokens.push(sub[k]);\n } else {\n tokens.push({ type: rule.type, value });\n }\n i += value.length;\n matched = true;\n break;\n }\n }\n if (!matched) {\n if (plainStart === -1) plainStart = i;\n i++;\n }\n }\n flushPlain(n);\n return coalesce(tokens);\n}\n\n/**\n * Merge adjacent tokens of the same type into one, cutting the DOM node count.\n * Lossless \u2014 values are concatenated in order.\n */\nexport function coalesce(tokens) {\n if (tokens.length < 2) return tokens;\n const out = [{ type: tokens[0].type, value: tokens[0].value }];\n for (let i = 1; i < tokens.length; i++) {\n const cur = tokens[i];\n const prev = out[out.length - 1];\n if (cur.type === prev.type) prev.value += cur.value;\n else out.push({ type: cur.type, value: cur.value });\n }\n return out;\n}\n\n/**\n * Build a sticky, word-boundaried alternation from a list of identifier words\n * (all `[A-Za-z0-9_]`, so no escaping needed). Longer words first so the\n * alternation is order-independent even without relying on `\\b`.\n */\nexport function wordRegex(words, flags) {\n const sorted = [...words].sort((a, b) => b.length - a.length);\n return new RegExp('(?:' + sorted.join('|') + ')\\\\b', (flags || '') + 'y');\n}\n", "// JavaScript / TypeScript tokenizer. One rule set, parameterized by keyword\n// list: TypeScript is JavaScript plus a superset of type-level keywords.\n\nimport { scan, wordRegex } from './scanner.js';\n\nconst JS_KEYWORDS = [\n 'break',\n 'case',\n 'catch',\n 'class',\n 'const',\n 'continue',\n 'debugger',\n 'default',\n 'delete',\n 'do',\n 'else',\n 'export',\n 'extends',\n 'finally',\n 'for',\n 'function',\n 'if',\n 'import',\n 'in',\n 'instanceof',\n 'new',\n 'return',\n 'super',\n 'switch',\n 'this',\n 'throw',\n 'try',\n 'typeof',\n 'var',\n 'void',\n 'while',\n 'with',\n 'yield',\n 'async',\n 'await',\n 'let',\n 'static',\n 'get',\n 'set',\n 'of',\n 'as',\n 'from',\n];\n\nconst TS_KEYWORDS = [\n ...JS_KEYWORDS,\n 'interface',\n 'type',\n 'enum',\n 'implements',\n 'declare',\n 'namespace',\n 'readonly',\n 'satisfies',\n 'abstract',\n 'public',\n 'private',\n 'protected',\n 'keyof',\n 'infer',\n 'is',\n 'asserts',\n 'override',\n 'module',\n 'string',\n 'number',\n 'boolean',\n 'object',\n 'symbol',\n 'bigint',\n 'any',\n 'unknown',\n 'never',\n];\n\nconst BUILTINS = [\n 'console',\n 'window',\n 'document',\n 'globalThis',\n 'Math',\n 'JSON',\n 'Object',\n 'Array',\n 'String',\n 'Number',\n 'Boolean',\n 'Symbol',\n 'Promise',\n 'Map',\n 'Set',\n 'WeakMap',\n 'WeakSet',\n 'Date',\n 'RegExp',\n 'Error',\n 'Function',\n 'parseInt',\n 'parseFloat',\n 'isNaN',\n 'isFinite',\n 'require',\n 'module',\n 'exports',\n 'process',\n 'NaN',\n 'Infinity',\n];\n\nfunction makeRules(keywords) {\n return [\n { type: 'comment', re: /\\/\\/[^\\n]*/y },\n { type: 'comment', re: /\\/\\*[\\s\\S]*?(?:\\*\\/|$)/y }, // unterminated -> comment to EOF\n { type: 'string', re: /\"(?:[^\"\\\\\\n]|\\\\.)*\"?/y },\n { type: 'string', re: /'(?:[^'\\\\\\n]|\\\\.)*'?/y },\n { type: 'string', re: /`(?:[^`\\\\]|\\\\.)*`?/y },\n {\n type: 'number',\n re: /0[xX][\\da-fA-F_]+n?|0[bB][01_]+n?|0[oO][0-7_]+n?|(?:\\d[\\d_]*\\.?[\\d_]*|\\.\\d[\\d_]*)(?:[eE][+-]?\\d+)?n?/y,\n },\n { type: 'keyword', re: wordRegex(keywords) },\n { type: 'boolean', re: /(?:true|false)\\b/y },\n { type: 'null', re: /(?:null|undefined)\\b/y },\n { type: 'builtin', re: wordRegex(BUILTINS) },\n { type: 'function', re: /[A-Za-z_$][\\w$]*(?=\\s*\\()/y },\n { type: 'plain', re: /[A-Za-z_$][\\w$]*/y },\n { type: 'operator', re: /\\.{3}|=>|[+\\-*/%=<>!&|^~?]+/y },\n { type: 'punctuation', re: /[{}()[\\];,.:]/y },\n ];\n}\n\nconst JS_RULES = makeRules(JS_KEYWORDS);\nconst TS_RULES = makeRules(TS_KEYWORDS);\n\nexport function tokenizeJavaScript(source) {\n return scan(source, JS_RULES);\n}\n\nexport function tokenizeTypeScript(source) {\n return scan(source, TS_RULES);\n}\n", "// HTML / XML tokenizer. Full tags are matched as one unit, then expanded into\n// tag-name / attribute / value sub-tokens so the tag name and attributes color\n// independently without the scanner needing any \"inside a tag\" state.\n\nimport { scan } from './scanner.js';\n\n// Split a matched tag (e.g. `<div class=\"x\" id='y'>`) into sub-tokens whose\n// values concatenate back to the input exactly (lossless).\nfunction expandTag(value) {\n const out = [];\n const open = /^<\\/?/.exec(value)[0];\n out.push({ type: 'punctuation', value: open });\n let rest = value.slice(open.length);\n\n const name = /^[a-zA-Z][\\w:-]*/.exec(rest);\n if (name) {\n out.push({ type: 'tag', value: name[0] });\n rest = rest.slice(name[0].length);\n }\n\n if (rest) {\n const inner = scan(rest, [\n { type: 'string', re: /\"[^\"]*\"?|'[^']*'?/y },\n { type: 'operator', re: /=/y },\n { type: 'punctuation', re: /\\/?>/y },\n { type: 'attribute', re: /[a-zA-Z_:@][\\w:.-]*/y },\n ]);\n for (let i = 0; i < inner.length; i++) out.push(inner[i]);\n }\n return out;\n}\n\n// The tag name (`[\\w:-]*`) and each attribute are separated by required\n// whitespace (`\\s+`), so the name run and the attribute run never overlap \u2014\n// which keeps the match linear (no catastrophic backtracking) even on an\n// unterminated tag like `<` + a very long identifier.\nconst RULES = [\n { type: 'comment', re: /<!--[\\s\\S]*?-->/y },\n { type: 'meta', re: /<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/y },\n { type: 'meta', re: /<!DOCTYPE[^>]*>/iy },\n {\n expand: expandTag,\n re: /<\\/?[a-zA-Z][\\w:-]*(?:\\s+[^\\s/>\"'=]+(?:\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s>]+))?)*\\s*\\/?>/y,\n },\n { expand: expandTag, re: /<\\/?[a-zA-Z][\\w:-]*/y },\n { type: 'meta', re: /&[a-zA-Z][a-zA-Z0-9]*;|&#\\d+;|&#x[0-9a-fA-F]+;/y },\n];\n\nexport function tokenizeHtml(source) {\n return scan(source, RULES);\n}\n", "// CSS tokenizer. A flat, stateless scan: comments, strings, at-rules, hex\n// colors, numbers+units, `!important`, property names (before a colon),\n// function names (before a paren), punctuation, and combinators.\n\nimport { scan } from './scanner.js';\n\nconst RULES = [\n { type: 'comment', re: /\\/\\*[\\s\\S]*?(?:\\*\\/|$)/y }, // unterminated -> comment to EOF\n { type: 'string', re: /\"(?:[^\"\\\\\\n]|\\\\.)*\"?|'(?:[^'\\\\\\n]|\\\\.)*'?/y },\n { type: 'meta', re: /@[a-zA-Z-]+/y },\n { type: 'keyword', re: /!important\\b/y },\n { type: 'number', re: /#[0-9a-fA-F]{3,8}\\b/y },\n { type: 'number', re: /-?(?:\\d*\\.\\d+|\\d+)(?:%|[a-zA-Z]{1,4})?/y },\n { type: 'property', re: /[-a-zA-Z]+(?=\\s*:)/y },\n { type: 'function', re: /[-a-zA-Z][\\w-]*(?=\\()/y },\n { type: 'punctuation', re: /[{}()[\\];:,]/y },\n { type: 'operator', re: /[>+~*]/y },\n // Catch-all: consume an identifier/dash run (or whitespace) in one match so\n // the greedy property/function look-ahead rules run once per run, not once\n // per character (keeps scanning linear).\n { type: 'plain', re: /[-\\w$]+|\\s+/y },\n];\n\nexport function tokenizeCss(source) {\n return scan(source, RULES);\n}\n", "// JSON tokenizer. Object keys (a string immediately before a colon) color as\n// `property`; all other strings as `string`.\n\nimport { scan } from './scanner.js';\n\nconst RULES = [\n { type: 'property', re: /\"(?:[^\"\\\\]|\\\\.)*\"(?=\\s*:)/y },\n { type: 'string', re: /\"(?:[^\"\\\\]|\\\\.)*\"?/y },\n { type: 'number', re: /-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/y },\n { type: 'boolean', re: /\\b(?:true|false)\\b/y },\n { type: 'null', re: /\\bnull\\b/y },\n { type: 'punctuation', re: /[{}[\\]:,]/y },\n];\n\nexport function tokenizeJson(source) {\n return scan(source, RULES);\n}\n", "// Markdown tokenizer. Line-oriented constructs use the `m` (multiline) + `y`\n// (sticky) flags together, so an anchored `^` rule only fires at a line start.\n\nimport { scan } from './scanner.js';\n\nconst RULES = [\n { type: 'string', re: /```[\\s\\S]*?```|~~~[\\s\\S]*?~~~|`[^`\\n]*`/y },\n { type: 'keyword', re: /^ {0,3}#{1,6} [^\\n]*/my },\n { type: 'comment', re: /^ {0,3}>[^\\n]*/my },\n { type: 'punctuation', re: /^ {0,3}(?:[-*+]|\\d+\\.)\\s/my },\n { type: 'meta', re: /^ {0,3}(?:-{3,}|\\*{3,}|_{3,})\\s*$/my },\n { type: 'function', re: /!?\\[[^\\][\\n]*\\]\\([^()\\n]*\\)/y },\n { type: 'operator', re: /\\*\\*[^\\n]*?\\*\\*|__[^\\n]*?__/y },\n { type: 'meta', re: /\\*[^*\\n]+?\\*|_[^_\\n]+?_/y },\n];\n\nexport function tokenizeMarkdown(source) {\n return scan(source, RULES);\n}\n", "// Shell / Bash tokenizer. Variables (`$VAR`, `${...}`) are matched before the\n// `#` comment rule can fire, so `${#arr}` stays a variable.\n\nimport { scan, wordRegex } from './scanner.js';\n\nconst KEYWORDS = [\n 'if',\n 'then',\n 'elif',\n 'else',\n 'fi',\n 'for',\n 'while',\n 'until',\n 'do',\n 'done',\n 'case',\n 'esac',\n 'function',\n 'in',\n 'select',\n 'return',\n 'break',\n 'continue',\n 'local',\n 'export',\n 'readonly',\n 'declare',\n 'typeset',\n 'set',\n 'unset',\n 'shift',\n 'exit',\n 'source',\n 'alias',\n];\n\nconst BUILTINS = [\n 'echo',\n 'printf',\n 'read',\n 'cd',\n 'pwd',\n 'ls',\n 'cat',\n 'grep',\n 'sed',\n 'awk',\n 'cut',\n 'sort',\n 'uniq',\n 'head',\n 'tail',\n 'find',\n 'xargs',\n 'curl',\n 'wget',\n 'git',\n 'npm',\n 'pnpm',\n 'yarn',\n 'node',\n 'python',\n 'pip',\n 'docker',\n 'kubectl',\n 'make',\n 'chmod',\n 'chown',\n 'mkdir',\n 'rmdir',\n 'rm',\n 'cp',\n 'mv',\n 'touch',\n 'test',\n 'sudo',\n 'env',\n 'which',\n 'kill',\n 'ps',\n 'tar',\n 'ssh',\n];\n\nconst RULES = [\n { type: 'comment', re: /#[^\\n]*/y },\n { type: 'string', re: /\"(?:[^\"\\\\]|\\\\.)*\"?/y },\n { type: 'string', re: /'[^']*'?/y },\n { type: 'variable', re: /\\$\\{[^}\\n]*\\}?|\\$[A-Za-z_]\\w*|\\$[@*#?$!0-9-]/y },\n { type: 'keyword', re: wordRegex(KEYWORDS) },\n { type: 'builtin', re: wordRegex(BUILTINS) },\n { type: 'attribute', re: /(?:^|\\s)-{1,2}[A-Za-z][\\w-]*/y },\n { type: 'number', re: /\\b\\d+\\b/y },\n { type: 'operator', re: /\\|\\||&&|[|&;<>]+/y },\n { type: 'punctuation', re: /[(){}[\\]]/y },\n];\n\nexport function tokenizeShell(source) {\n return scan(source, RULES);\n}\n", "// Python tokenizer. Triple-quoted and prefixed (r/b/f/u) strings are matched as\n// whole strings; f-string interpolation is not sub-highlighted in v1.\n\nimport { scan, wordRegex } from './scanner.js';\n\nconst KEYWORDS = [\n 'def',\n 'class',\n 'return',\n 'if',\n 'elif',\n 'else',\n 'for',\n 'while',\n 'break',\n 'continue',\n 'pass',\n 'import',\n 'from',\n 'as',\n 'with',\n 'try',\n 'except',\n 'finally',\n 'raise',\n 'yield',\n 'lambda',\n 'global',\n 'nonlocal',\n 'del',\n 'assert',\n 'async',\n 'await',\n 'in',\n 'is',\n 'not',\n 'and',\n 'or',\n 'match',\n 'case',\n];\n\nconst BUILTINS = [\n 'print',\n 'len',\n 'range',\n 'int',\n 'float',\n 'str',\n 'list',\n 'dict',\n 'set',\n 'tuple',\n 'bool',\n 'bytes',\n 'type',\n 'isinstance',\n 'issubclass',\n 'super',\n 'open',\n 'enumerate',\n 'zip',\n 'map',\n 'filter',\n 'sorted',\n 'reversed',\n 'sum',\n 'min',\n 'max',\n 'abs',\n 'round',\n 'input',\n 'repr',\n 'format',\n 'object',\n 'self',\n 'cls',\n 'Exception',\n 'ValueError',\n 'TypeError',\n 'KeyError',\n 'IndexError',\n 'AttributeError',\n 'RuntimeError',\n];\n\nconst RULES = [\n { type: 'comment', re: /#[^\\n]*/y },\n {\n type: 'string',\n re: /[rRbBfFuU]{0,2}(?:\"\"\"[\\s\\S]*?\"\"\"|'''[\\s\\S]*?'''|\"(?:[^\"\\\\\\n]|\\\\.)*\"?|'(?:[^'\\\\\\n]|\\\\.)*'?)/y,\n },\n { type: 'meta', re: /@[A-Za-z_]\\w*/y },\n { type: 'keyword', re: wordRegex(KEYWORDS) },\n { type: 'boolean', re: /\\b(?:True|False)\\b/y },\n { type: 'null', re: /\\bNone\\b/y },\n { type: 'builtin', re: wordRegex(BUILTINS) },\n { type: 'function', re: /[A-Za-z_]\\w*(?=\\s*\\()/y },\n {\n type: 'number',\n re: /\\b0[xXoObB][0-9a-fA-F_]+\\b|\\b\\d[\\d_]*(?:\\.\\d[\\d_]*)?(?:[eE][+-]?\\d+)?[jJ]?\\b/y,\n },\n { type: 'operator', re: /:=|[+\\-*/%=<>!&|^~@]+/y },\n { type: 'punctuation', re: /[()[\\]{}:;,.]/y },\n // Catch-all: consume an identifier run (or whitespace) in one match so the\n // greedy function look-ahead rule runs once per run, not once per character.\n { type: 'plain', re: /\\w+|\\s+/y },\n];\n\nexport function tokenizePython(source) {\n return scan(source, RULES);\n}\n", "// Tokenizer registry + the public `tokenize()` entry point.\n//\n// Each language module is a pure `(source) => Token[]` function built on the\n// shared linear scanner. `tokenize()` resolves aliases, dispatches to the right\n// tokenizer, and falls back to a single `plain` token for unknown languages \u2014\n// it never throws.\n\nimport { tokenizeJavaScript, tokenizeTypeScript } from './javascript.js';\nimport { tokenizeHtml } from './html.js';\nimport { tokenizeCss } from './css.js';\nimport { tokenizeJson } from './json.js';\nimport { tokenizeMarkdown } from './markdown.js';\nimport { tokenizeShell } from './shell.js';\nimport { tokenizePython } from './python.js';\n\nconst TOKENIZERS = {\n javascript: tokenizeJavaScript,\n typescript: tokenizeTypeScript,\n html: tokenizeHtml,\n css: tokenizeCss,\n json: tokenizeJson,\n markdown: tokenizeMarkdown,\n shell: tokenizeShell,\n python: tokenizePython,\n};\n\n/** Canonical language ids the editor understands (`plaintext` = no highlight). */\nexport const LANGUAGES = Object.freeze([\n 'plaintext',\n 'javascript',\n 'typescript',\n 'html',\n 'css',\n 'json',\n 'markdown',\n 'shell',\n 'python',\n]);\n\n/** Common aliases mapped to canonical ids. */\nexport const ALIASES = Object.freeze({\n js: 'javascript',\n jsx: 'javascript',\n mjs: 'javascript',\n cjs: 'javascript',\n ts: 'typescript',\n tsx: 'typescript',\n htm: 'html',\n xml: 'html',\n vue: 'html',\n svg: 'html',\n sh: 'shell',\n bash: 'shell',\n zsh: 'shell',\n shellscript: 'shell',\n py: 'python',\n python3: 'python',\n md: 'markdown',\n mkd: 'markdown',\n json5: 'json',\n jsonc: 'json',\n text: 'plaintext',\n txt: 'plaintext',\n plain: 'plaintext',\n});\n\n/** Resolve a language id or alias to its canonical id. */\nexport function resolveLanguage(language) {\n const id = String(language || 'plaintext').toLowerCase();\n return ALIASES[id] || id;\n}\n\n/** The tokenizer function for a language, or `null` when none is registered. */\nexport function getTokenizer(language) {\n return TOKENIZERS[resolveLanguage(language)] || null;\n}\n\n/**\n * Tokenize `source` for `language`. Returns `{ type, value }[]`; the token\n * values always concatenate back to `source` exactly (lossless).\n */\nexport function tokenize(source, language) {\n if (!source) return [];\n const tokenizer = getTokenizer(language);\n if (!tokenizer) return [{ type: 'plain', value: source }];\n return tokenizer(source);\n}\n", "// Highlight rendering. Two paths, both escaping-safe:\n// - renderTokensToHtml / highlight \u2192 an escaped HTML STRING (node tests, SSR).\n// - renderTokensToDom \u2192 a DOM DocumentFragment built with createElement /\n// createTextNode. This is the RUNTIME path; untrusted source text only ever\n// reaches `textContent`, so `innerHTML` is never assigned and markup\n// injection is structurally impossible.\n\nimport { tokenize } from './tokenizer/index.js';\n\nconst ESCAPE_RE = /[&<>\"']/g;\nconst ESCAPE_MAP = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;',\n};\n\n/** Escape the five HTML metacharacters. */\nexport function escapeHtml(str) {\n return String(str).replace(ESCAPE_RE, (ch) => ESCAPE_MAP[ch]);\n}\n\n/** Render tokens to an escaped HTML string of `<span class=\"vd-tk-*\">` wrappers. */\nexport function renderTokensToHtml(tokens) {\n let html = '';\n for (let i = 0; i < tokens.length; i++) {\n const t = tokens[i];\n if (t.type === 'plain') {\n html += escapeHtml(t.value);\n } else {\n html += '<span class=\"vd-tk-' + t.type + '\">' + escapeHtml(t.value) + '</span>';\n }\n }\n return html;\n}\n\n/**\n * Tokenize + render to an escaped HTML string. A trailing newline is appended\n * when the source ends in one, so a `<pre>` layer (which collapses a single\n * trailing newline) keeps the same line count as the textarea it sits under.\n */\nexport function highlight(source, language) {\n const html = renderTokensToHtml(tokenize(source, language));\n return source.endsWith('\\n') || source === '' ? html + '\\n' : html;\n}\n\n/**\n * Build a DocumentFragment of token nodes using `doc` (an injected `document`,\n * for jsdom/SSR testability). Plain tokens become text nodes; typed tokens\n * become `<span class=\"vd-tk-*\">` with the text set via `textContent`.\n */\nexport function renderTokensToDom(tokens, doc) {\n const frag = doc.createDocumentFragment();\n for (let i = 0; i < tokens.length; i++) {\n const t = tokens[i];\n if (t.type === 'plain') {\n frag.appendChild(doc.createTextNode(t.value));\n } else {\n const span = doc.createElement('span');\n span.className = 'vd-tk-' + t.type;\n span.textContent = t.value;\n frag.appendChild(span);\n }\n }\n return frag;\n}\n", "// Shared, DOM-free constants for the code editor. Pure data and predicates \u2014\n// safe to import from node tests and from both the core and the tokenizers.\n\n/** Default indent width, in spaces. */\nexport const DEFAULT_TAB_SIZE = 2;\n\n// Above this many characters, highlighting is skipped (the editor renders one\n// escaped plain-text node) so very large documents stay responsive.\nexport const MAX_HIGHLIGHT_LENGTH = 100000;\n\n/** Characters that auto-close to the mapped closer when typed. */\nexport const AUTO_CLOSE_PAIRS = Object.freeze({\n '(': ')',\n '[': ']',\n '{': '}',\n '\"': '\"',\n \"'\": \"'\",\n '`': '`',\n});\n\n/** Opening characters that trigger auto-close. */\nexport const OPENERS = Object.freeze(Object.keys(AUTO_CLOSE_PAIRS));\n\n/** Closing characters (brackets + quotes) the caret can skip over. */\nexport const CLOSERS = Object.freeze([')', ']', '}', '\"', \"'\", '`']);\n\n/** True when `ch` is an auto-closing opener. */\nexport function isOpener(ch) {\n return Object.prototype.hasOwnProperty.call(AUTO_CLOSE_PAIRS, ch);\n}\n\n/** The closer mapped to `ch`, or `undefined`. */\nexport function closerFor(ch) {\n return AUTO_CLOSE_PAIRS[ch];\n}\n\n/** True when `open`/`close` form an auto-close pair. */\nexport function isMatchingPair(open, close) {\n return AUTO_CLOSE_PAIRS[open] === close;\n}\n", "// Pure keymap transactions. Each function takes the current textarea value and\n// selection and returns an EDIT \u2014 `{ from, to, text, selectionStart,\n// selectionEnd }` describing a replacement of `value[from..to]` with `text` plus\n// the resulting caret \u2014 or `null` to let the browser handle the key natively.\n// No DOM access, so every branch is unit-testable in plain node.\n\nimport { AUTO_CLOSE_PAIRS, CLOSERS, closerFor, isMatchingPair } from './constants.js';\n\nconst CLOSER_SET = new Set(CLOSERS);\nconst WORD = /[\\w$]/;\n\n/** Enter: copy the current line's indent, add a level after an opener, and\n * split an empty pair onto its own line. */\nexport function indentOnEnter(value, start, end, unit) {\n const lineStart = value.lastIndexOf('\\n', start - 1) + 1;\n const leading = /^[ \\t]*/.exec(value.slice(lineStart, start))[0];\n const prev = value[start - 1];\n const next = value[end];\n const opens = prev === '{' || prev === '[' || prev === '(';\n\n if (opens && isMatchingPair(prev, next)) {\n const inner = leading + unit;\n const text = '\\n' + inner + '\\n' + leading;\n const caret = start + 1 + inner.length;\n return { from: start, to: end, text, selectionStart: caret, selectionEnd: caret };\n }\n\n const indent = opens ? leading + unit : leading;\n const text = '\\n' + indent;\n const caret = start + text.length;\n return { from: start, to: end, text, selectionStart: caret, selectionEnd: caret };\n}\n\n/** Tab: insert one indent unit, or indent every line of a multi-line selection. */\nexport function handleTab(value, start, end, unit) {\n if (start !== end && value.slice(start, end).indexOf('\\n') !== -1) {\n const from = value.lastIndexOf('\\n', start - 1) + 1;\n const block = value.slice(from, end);\n const indented = block.replace(/^/gm, unit);\n const added = indented.length - block.length;\n return {\n from,\n to: end,\n text: indented,\n selectionStart: start + unit.length,\n selectionEnd: end + added,\n };\n }\n return {\n from: start,\n to: end,\n text: unit,\n selectionStart: start + unit.length,\n selectionEnd: start + unit.length,\n };\n}\n\n/** Shift-Tab: remove up to one indent unit from the start of each selected line. */\nexport function handleShiftTab(value, start, end, unit) {\n const from = value.lastIndexOf('\\n', start - 1) + 1;\n const size = unit.length || 1;\n const lines = value.slice(from, end).split('\\n');\n let firstRemoved = 0;\n let totalRemoved = 0;\n const dedented = lines\n .map((line, idx) => {\n let remove = 0;\n while (remove < size && line[remove] === ' ') remove++;\n if (remove === 0 && line[0] === '\\t') remove = 1;\n if (idx === 0) firstRemoved = remove;\n totalRemoved += remove;\n return line.slice(remove);\n })\n .join('\\n');\n return {\n from,\n to: end,\n text: dedented,\n selectionStart: Math.max(from, start - firstRemoved),\n selectionEnd: Math.max(from, end - totalRemoved),\n };\n}\n\n/** Typing an opener/quote: wrap a selection, or insert the matching closer. */\nexport function autoClosePair(char, value, start, end) {\n const closer = closerFor(char);\n if (!closer) return null;\n\n if (start !== end) {\n return {\n from: start,\n to: end,\n text: char + value.slice(start, end) + closer,\n selectionStart: start + 1,\n selectionEnd: end + 1,\n };\n }\n\n const nextChar = value[start];\n if (char === closer) {\n // Quote: skip auto-close next to a word char (apostrophes, mid-word typing).\n if (nextChar && WORD.test(nextChar)) return null;\n const prevChar = value[start - 1];\n if (prevChar && WORD.test(prevChar)) return null;\n } else if (nextChar && WORD.test(nextChar)) {\n return null;\n }\n\n return {\n from: start,\n to: end,\n text: char + closer,\n selectionStart: start + 1,\n selectionEnd: start + 1,\n };\n}\n\n/** Typing a closer when the next char is that same closer: step over it. */\nexport function skipOverCloser(char, value, start, end) {\n if (start !== end || !CLOSER_SET.has(char)) return null;\n if (value[start] === char) {\n return { caretOnly: true, selectionStart: start + 1, selectionEnd: start + 1 };\n }\n return null;\n}\n\n/** Backspace between an empty auto-pair (`()`, `\"\"`, \u2026): delete both sides. */\nexport function handleBackspacePair(value, start, end) {\n if (start !== end || start === 0) return null;\n const prev = value[start - 1];\n const next = value[start];\n if (AUTO_CLOSE_PAIRS[prev] && AUTO_CLOSE_PAIRS[prev] === next) {\n return {\n from: start - 1,\n to: start + 1,\n text: '',\n selectionStart: start - 1,\n selectionEnd: start - 1,\n };\n }\n return null;\n}\n", "// Framework-agnostic core for the code editor.\n//\n// The editing model is a native <textarea> rendered transparently over a <pre>\n// highlight layer: the browser owns caret, selection, IME, clipboard, and\n// undo/redo, while a homegrown tokenizer repaints the highlight beneath it. The\n// core builds its own DOM, keeps the two layers scroll- and glyph-aligned,\n// applies a small keymap (indent / tab / auto-close) through the native undo\n// stack, and paints only via DOM nodes \u2014 never `innerHTML`. It imports no `vue`.\n\nimport { tokenize, LANGUAGES } from './tokenizer/index.js';\nimport { renderTokensToDom, highlight } from './highlight.js';\nimport {\n indentOnEnter,\n handleTab,\n handleShiftTab,\n autoClosePair,\n skipOverCloser,\n handleBackspacePair,\n} from './editing.js';\nimport { DEFAULT_TAB_SIZE, MAX_HIGHLIGHT_LENGTH } from './constants.js';\n\n/** Current component version (mirrored in component-versions.json). */\nexport const VD_CODE_EDITOR_VERSION = '1.0.1';\n\nconst DEFAULTS = {\n value: '',\n language: 'plaintext',\n readOnly: false,\n lineNumbers: true,\n tabSize: DEFAULT_TAB_SIZE,\n placeholder: '',\n maxLength: undefined,\n wrap: false,\n autoClose: true,\n highlightActiveLine: true,\n maxHighlightLength: MAX_HIGHLIGHT_LENGTH,\n spellcheck: false,\n ariaLabel: 'Code editor',\n copy: true,\n};\n\n// Scheduler that degrades gracefully when rAF is absent (SSR/jsdom). Bound to\n// `window` so browsers never throw \"Illegal invocation\".\nconst RAF =\n typeof window !== 'undefined' && window.requestAnimationFrame\n ? window.requestAnimationFrame.bind(window)\n : (cb) => setTimeout(cb, 16);\nconst CAF =\n typeof window !== 'undefined' && window.cancelAnimationFrame\n ? window.cancelAnimationFrame.bind(window)\n : clearTimeout;\n\nfunction resolveElement(element) {\n if (!element) return null;\n if (typeof element === 'string') {\n return typeof document !== 'undefined' ? document.querySelector(element) : null;\n }\n return element;\n}\n\nfunction countNewlines(str, end) {\n let n = 0;\n const limit = end == null ? str.length : end;\n for (let i = 0; i < limit; i++) {\n if (str.charCodeAt(i) === 10) n++;\n }\n return n;\n}\n\nexport class VdCodeEditor {\n constructor(options = {}) {\n this._opts = Object.assign({}, DEFAULTS, options);\n this._listeners = Object.create(null);\n this._domListeners = [];\n this._raf = 0;\n this._ro = null;\n this._copyTimer = 0;\n this._destroyed = false;\n this._lineHeight = 21;\n this._paddingTop = 0;\n this._gutterCount = -1;\n this._lastValue = this._opts.value == null ? '' : String(this._opts.value);\n\n this.element = resolveElement(options.element);\n if (this.element) this._mount();\n }\n\n // \u2500\u2500 mounting \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n _mount() {\n const el = this.element;\n const doc = el.ownerDocument;\n const opts = this._opts;\n const showGutter = opts.lineNumbers && !opts.wrap;\n const showActiveLine = opts.highlightActiveLine && !opts.wrap;\n\n el.classList.add('vd-code-editor');\n el.classList.toggle('is-wrap', !!opts.wrap);\n el.classList.toggle('is-readonly', !!opts.readOnly);\n el.classList.toggle('has-gutter', showGutter);\n el.style.setProperty('--vd-code-editor-tab-size', String(opts.tabSize));\n\n // Active-line band (bottom layer).\n if (showActiveLine) {\n this._activeLine = doc.createElement('div');\n this._activeLine.className = 'vd-code-editor-active-line';\n this._activeLine.setAttribute('aria-hidden', 'true');\n el.appendChild(this._activeLine);\n }\n\n // Highlight layer.\n this._pre = doc.createElement('pre');\n this._pre.className = 'vd-code-editor-highlight';\n this._pre.setAttribute('aria-hidden', 'true');\n this._code = doc.createElement('code');\n this._code.className = 'vd-code-editor-code';\n this._pre.appendChild(this._code);\n el.appendChild(this._pre);\n\n // Gutter (over the band's left edge; opaque).\n if (showGutter) {\n this._gutter = doc.createElement('div');\n this._gutter.className = 'vd-code-editor-gutter';\n this._gutter.setAttribute('aria-hidden', 'true');\n this._gutterLines = doc.createElement('div');\n this._gutterLines.className = 'vd-code-editor-gutter-lines';\n this._gutter.appendChild(this._gutterLines);\n el.appendChild(this._gutter);\n }\n\n // Editable surface (top layer).\n const ta = doc.createElement('textarea');\n ta.className = 'vd-code-editor-input';\n ta.value = this._lastValue;\n ta.spellcheck = !!opts.spellcheck;\n ta.wrap = opts.wrap ? 'soft' : 'off';\n ta.setAttribute('autocomplete', 'off');\n ta.setAttribute('autocapitalize', 'off');\n ta.setAttribute('autocorrect', 'off');\n ta.setAttribute('aria-label', opts.ariaLabel || 'Code editor');\n ta.setAttribute('aria-multiline', 'true');\n if (opts.readOnly) ta.readOnly = true;\n if (opts.placeholder) ta.placeholder = opts.placeholder;\n if (opts.maxLength != null) ta.maxLength = opts.maxLength;\n ta.style.tabSize = String(opts.tabSize);\n this._pre.style.tabSize = String(opts.tabSize);\n this._textarea = ta;\n el.appendChild(ta);\n\n // Copy control (only when enabled and the clipboard API exists).\n if (opts.copy && typeof navigator !== 'undefined' && navigator.clipboard) {\n const btn = doc.createElement('button');\n btn.type = 'button';\n btn.className = 'vd-code-editor-copy';\n btn.setAttribute('aria-label', 'Copy code');\n btn.textContent = 'Copy';\n this._copyBtn = btn;\n el.appendChild(btn);\n }\n\n this._attach();\n this._measure();\n this._repaint();\n this._syncScroll();\n }\n\n _attach() {\n const ta = this._textarea;\n this._listen(ta, 'input', () => this._handleInput());\n this._listen(ta, 'scroll', () => this._syncScroll());\n this._listen(ta, 'keydown', (e) => this._handleKeydown(e));\n this._listen(ta, 'focus', (e) => this._handleFocus(e));\n this._listen(ta, 'blur', (e) => this._handleBlur(e));\n this._listen(ta, 'click', () => this._updateActiveLine());\n this._listen(ta, 'keyup', () => this._updateActiveLine());\n this._listen(ta, 'select', () => this._updateActiveLine());\n if (this._copyBtn) this._listen(this._copyBtn, 'click', () => this._handleCopy());\n\n if (typeof ResizeObserver === 'function') {\n this._ro = new ResizeObserver(() => {\n this._measure();\n this._syncScroll();\n });\n this._ro.observe(this.element);\n }\n\n // Re-measure once web fonts settle (FOUT would shift line metrics).\n const fonts = this.element.ownerDocument.fonts;\n if (fonts && fonts.ready && typeof fonts.ready.then === 'function') {\n fonts.ready.then(() => {\n if (this._destroyed) return;\n this._measure();\n this._syncScroll();\n });\n }\n }\n\n _listen(target, type, handler) {\n target.addEventListener(type, handler);\n this._domListeners.push([target, type, handler]);\n }\n\n // \u2500\u2500 rendering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n _measure() {\n if (typeof getComputedStyle !== 'function') return;\n const cs = getComputedStyle(this._textarea);\n const lh = parseFloat(cs.lineHeight);\n if (Number.isFinite(lh) && lh > 0) this._lineHeight = lh;\n const pt = parseFloat(cs.paddingTop);\n this._paddingTop = Number.isFinite(pt) ? pt : 0;\n }\n\n _scheduleRepaint() {\n if (this._raf || this._destroyed) return;\n this._raf = RAF(() => {\n this._raf = 0;\n if (!this._destroyed) this._repaint();\n });\n }\n\n _repaint() {\n const value = this._textarea.value;\n const doc = this.element.ownerDocument;\n const trailing = value.endsWith('\\n') || value === '';\n\n if (value.length > this._opts.maxHighlightLength) {\n this._code.classList.add('is-plain');\n this._code.replaceChildren(doc.createTextNode(trailing ? value + '\\n' : value));\n } else {\n this._code.classList.remove('is-plain');\n const frag = renderTokensToDom(tokenize(value, this._opts.language), doc);\n if (trailing) frag.appendChild(doc.createTextNode('\\n'));\n this._code.replaceChildren(frag);\n }\n this._updateGutter(value);\n }\n\n _updateGutter(value) {\n if (!this._gutterLines) return;\n const lines = countNewlines(value) + 1;\n if (lines === this._gutterCount) return;\n this._gutterCount = lines;\n this.element.style.setProperty(\n '--vd-code-editor-gutter-digits',\n String(Math.max(2, String(lines).length)),\n );\n let text = '1';\n for (let i = 2; i <= lines; i++) text += '\\n' + i;\n this._gutterLines.textContent = text;\n }\n\n _syncScroll() {\n const ta = this._textarea;\n if (!ta) return;\n const st = ta.scrollTop;\n if (this._pre) {\n this._pre.scrollTop = st;\n this._pre.scrollLeft = ta.scrollLeft;\n }\n if (this._gutterLines) {\n this._gutterLines.style.transform = 'translateY(' + -st + 'px)';\n }\n this._updateActiveLine();\n }\n\n _updateActiveLine() {\n if (!this._activeLine) return;\n const ta = this._textarea;\n const line = countNewlines(ta.value, ta.selectionStart || 0);\n const top = this._paddingTop + line * this._lineHeight - ta.scrollTop;\n this._activeLine.style.height = this._lineHeight + 'px';\n this._activeLine.style.transform = 'translateY(' + top + 'px)';\n }\n\n // \u2500\u2500 input + keymap \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n _handleInput() {\n this._scheduleRepaint();\n this._syncScroll();\n this._emitChangeIfChanged();\n }\n\n _emitChangeIfChanged() {\n const v = this._textarea.value;\n if (v === this._lastValue) return;\n this._lastValue = v;\n this._emit('change', { value: v });\n }\n\n _handleFocus(e) {\n this.element.classList.add('is-focused');\n this._emit('focus', e);\n }\n\n _handleBlur(e) {\n this.element.classList.remove('is-focused');\n this._emit('blur', e);\n }\n\n _handleKeydown(e) {\n if (this._opts.readOnly || e.isComposing) return;\n if (e.ctrlKey || e.metaKey || e.altKey) return;\n\n const ta = this._textarea;\n const value = ta.value;\n const s = ta.selectionStart;\n const en = ta.selectionEnd;\n const unit = ' '.repeat(this._opts.tabSize);\n\n if (e.key === 'Enter') {\n e.preventDefault();\n this._applyEdit(indentOnEnter(value, s, en, unit));\n return;\n }\n if (e.key === 'Tab') {\n e.preventDefault();\n this._applyEdit(\n e.shiftKey ? handleShiftTab(value, s, en, unit) : handleTab(value, s, en, unit),\n );\n return;\n }\n if (e.key === 'Backspace') {\n const edit = handleBackspacePair(value, s, en);\n if (edit) {\n e.preventDefault();\n this._applyEdit(edit);\n }\n return;\n }\n if (e.key.length === 1 && this._opts.autoClose) {\n const skip = skipOverCloser(e.key, value, s, en);\n if (skip) {\n e.preventDefault();\n ta.setSelectionRange(skip.selectionStart, skip.selectionEnd);\n this._updateActiveLine();\n return;\n }\n const auto = autoClosePair(e.key, value, s, en);\n if (auto) {\n e.preventDefault();\n this._applyEdit(auto);\n }\n }\n }\n\n // Apply an edit, preferring execCommand so the native undo stack is preserved;\n // fall back to setRangeText, then to a direct value splice (jsdom/old engines).\n _applyEdit(edit) {\n const ta = this._textarea;\n ta.setSelectionRange(edit.from, edit.to);\n let nativeInput = false;\n if (this._tryExecInsert(edit.text)) {\n nativeInput = true;\n } else if (typeof ta.setRangeText === 'function') {\n ta.setRangeText(edit.text, edit.from, edit.to, 'end');\n } else {\n ta.value = ta.value.slice(0, edit.from) + edit.text + ta.value.slice(edit.to);\n }\n if (edit.selectionStart != null) {\n const end = edit.selectionEnd == null ? edit.selectionStart : edit.selectionEnd;\n ta.setSelectionRange(edit.selectionStart, end);\n }\n if (nativeInput) {\n // execCommand already dispatched 'input' (repaint + emit); just fix caret.\n this._updateActiveLine();\n } else {\n this._handleInput();\n }\n }\n\n _tryExecInsert(text) {\n try {\n return (\n typeof document !== 'undefined' &&\n typeof document.execCommand === 'function' &&\n document.execCommand('insertText', false, text)\n );\n } catch {\n return false;\n }\n }\n\n _handleCopy() {\n if (this._destroyed || typeof navigator === 'undefined' || !navigator.clipboard) return;\n navigator.clipboard.writeText(this._textarea.value).then(\n () => this._flashCopied(),\n () => {},\n );\n }\n\n _flashCopied() {\n if (!this._copyBtn) return;\n this._copyBtn.classList.add('is-copied');\n this._copyBtn.textContent = 'Copied';\n if (this._copyTimer) clearTimeout(this._copyTimer);\n this._copyTimer = setTimeout(() => {\n this._copyTimer = 0;\n if (this._destroyed || !this._copyBtn) return;\n this._copyBtn.classList.remove('is-copied');\n this._copyBtn.textContent = 'Copy';\n }, 1200);\n }\n\n // \u2500\u2500 public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n getValue() {\n return this._textarea ? this._textarea.value : this._lastValue;\n }\n\n setValue(next, options) {\n const silent = !!(options && options.silent);\n const v = next == null ? '' : String(next);\n if (!this._textarea) {\n this._lastValue = v;\n return this;\n }\n if (v === this._textarea.value) return this;\n this._textarea.value = v;\n if (silent) this._lastValue = v;\n this._repaint();\n this._syncScroll();\n if (!silent) this._emitChangeIfChanged();\n return this;\n }\n\n getSelection() {\n const ta = this._textarea;\n if (!ta) return { start: 0, end: 0, text: '' };\n return {\n start: ta.selectionStart,\n end: ta.selectionEnd,\n text: ta.value.slice(ta.selectionStart, ta.selectionEnd),\n };\n }\n\n setSelection(start, end) {\n if (!this._textarea) return this;\n const e = end == null ? start : end;\n this._textarea.setSelectionRange(start, e);\n this._updateActiveLine();\n return this;\n }\n\n insertText(text) {\n if (!this._textarea) return this;\n const ta = this._textarea;\n const str = String(text);\n this._applyEdit({\n from: ta.selectionStart,\n to: ta.selectionEnd,\n text: str,\n selectionStart: ta.selectionStart + str.length,\n });\n return this;\n }\n\n setLanguage(language) {\n this._opts.language = language || 'plaintext';\n if (this._textarea) this._repaint();\n return this;\n }\n\n setReadOnly(readOnly) {\n this._opts.readOnly = !!readOnly;\n if (this._textarea) this._textarea.readOnly = !!readOnly;\n if (this.element) this.element.classList.toggle('is-readonly', !!readOnly);\n return this;\n }\n\n setTabSize(tabSize) {\n const n = Number(tabSize) || DEFAULT_TAB_SIZE;\n this._opts.tabSize = n;\n if (this._textarea) this._textarea.style.tabSize = String(n);\n if (this._pre) this._pre.style.tabSize = String(n);\n if (this.element) this.element.style.setProperty('--vd-code-editor-tab-size', String(n));\n return this;\n }\n\n setPlaceholder(text) {\n this._opts.placeholder = text || '';\n if (this._textarea) this._textarea.placeholder = text || '';\n return this;\n }\n\n setAutoClose(autoClose) {\n this._opts.autoClose = !!autoClose;\n return this;\n }\n\n focus() {\n if (this._textarea) this._textarea.focus();\n return this;\n }\n\n blur() {\n if (this._textarea) this._textarea.blur();\n return this;\n }\n\n on(name, handler) {\n if (!this._listeners[name]) this._listeners[name] = [];\n this._listeners[name].push(handler);\n return this;\n }\n\n off(name, handler) {\n const list = this._listeners[name];\n if (!list) return this;\n const i = list.indexOf(handler);\n if (i !== -1) list.splice(i, 1);\n return this;\n }\n\n _emit(name, payload) {\n const list = this._listeners[name];\n if (!list) return;\n for (let i = 0; i < list.length; i++) list[i](payload);\n }\n\n destroy() {\n if (this._destroyed) return;\n this._destroyed = true;\n if (this._raf) CAF(this._raf);\n if (this._copyTimer) clearTimeout(this._copyTimer);\n if (this._ro) {\n this._ro.disconnect();\n this._ro = null;\n }\n for (let i = 0; i < this._domListeners.length; i++) {\n const [target, type, handler] = this._domListeners[i];\n target.removeEventListener(type, handler);\n }\n this._domListeners = [];\n if (this.element) {\n const nodes = [this._activeLine, this._pre, this._gutter, this._textarea, this._copyBtn];\n for (let i = 0; i < nodes.length; i++) {\n const n = nodes[i];\n if (n && n.parentNode === this.element) this.element.removeChild(n);\n }\n this.element.classList.remove(\n 'vd-code-editor',\n 'is-wrap',\n 'is-readonly',\n 'has-gutter',\n 'is-focused',\n );\n }\n this._listeners = Object.create(null);\n this._textarea = null;\n this._pre = null;\n this._code = null;\n this._gutter = null;\n this._gutterLines = null;\n this._activeLine = null;\n this._copyBtn = null;\n }\n}\n\nexport { tokenize, highlight, LANGUAGES };\n"],
5
+ "mappings": "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",
6
6
  "names": ["RULES", "RULES", "RULES", "BUILTINS", "RULES", "KEYWORDS", "BUILTINS", "RULES", "text", "caret", "VdCodeEditor"]
7
7
  }
@@ -1,7 +1,9 @@
1
- // Type definitions for the framework-agnostic draw tool core.
2
- // Hand-written to mirror the runtime in ./core.js + ./shapes.js. Self-contained
3
- // (the shipped .d.ts trio is index/core/vue no shapes.d.ts), so every draw
4
- // type and constant is declared here.
1
+ // Type definitions for the framework-agnostic draw tool core (src/draw/core.js).
2
+ // core.js exports only `class VdDraw`; the shared draw types are hand-authored
3
+ // here for the whole component to consume. The four public constants
4
+ // (VD_DRAW_VERSION, DRAW_TOOLS, DRAW_SHAPE_TYPES, BRUSH_PRESETS) live in
5
+ // shapes.js and are declared in the sibling ./shapes.d.ts, matching the runtime
6
+ // module boundary (index.js re-exports them from './shapes.js').
5
7
 
6
8
  export type DrawTool =
7
9
  'select' | 'hand' | 'draw' | 'eraser' | 'rectangle' | 'ellipse' | 'line' | 'text' | 'sticky';
@@ -242,8 +244,3 @@ export class VdDraw {
242
244
  render(flags?: { scene?: boolean; overlay?: boolean }): void;
243
245
  destroy(): void;
244
246
  }
245
-
246
- export const VD_DRAW_VERSION: string;
247
- export const DRAW_TOOLS: readonly DrawTool[];
248
- export const DRAW_SHAPE_TYPES: readonly DrawShapeType[];
249
- export const BRUSH_PRESETS: Readonly<Record<BrushName, BrushPreset>>;
@@ -112,6 +112,8 @@ var MIN_SCALE = 0.2;
112
112
  var MAX_SCALE = 4;
113
113
  var DEFAULT_GRID_SIZE = 20;
114
114
  var DEFAULT_STROKE_WIDTH = 2;
115
+ var MAX_SHAPES = 1e4;
116
+ var MAX_POINTS_PER_SHAPE = 1e5;
115
117
  var idCounter = 0;
116
118
  function createId(prefix = "sh") {
117
119
  idCounter += 1;
@@ -370,7 +372,9 @@ function coerceNumber(value, fallback = 0) {
370
372
  function coercePoints(raw) {
371
373
  if (!Array.isArray(raw)) return [];
372
374
  const pts = [];
373
- for (const p of raw) {
375
+ const limit = Math.min(raw.length, MAX_POINTS_PER_SHAPE);
376
+ for (let i = 0; i < limit; i += 1) {
377
+ const p = raw[i];
374
378
  if (Array.isArray(p) && p.length >= 2 && Number.isFinite(Number(p[0])) && Number.isFinite(Number(p[1]))) {
375
379
  const pt = [round(Number(p[0])), round(Number(p[1]))];
376
380
  if (p.length >= 3 && Number.isFinite(Number(p[2]))) pt.push(clamp(Number(p[2]), 0, 1));
@@ -459,8 +463,9 @@ function normalizeDocument(data) {
459
463
  const usedIds = /* @__PURE__ */ new Set();
460
464
  const rawShapes = Array.isArray(raw.shapes) ? raw.shapes : [];
461
465
  const shapes = [];
462
- for (const rawShape of rawShapes) {
463
- const shape = normalizeShape(rawShape, usedIds);
466
+ const shapeLimit = Math.min(rawShapes.length, MAX_SHAPES);
467
+ for (let i = 0; i < shapeLimit; i += 1) {
468
+ const shape = normalizeShape(rawShapes[i], usedIds);
464
469
  if (shape) shapes.push(shape);
465
470
  }
466
471
  const groupCounts = /* @__PURE__ */ new Map();
@@ -1443,7 +1448,11 @@ var VdDraw = class {
1443
1448
  _recordHistory(reason, targetKey) {
1444
1449
  if (!this.historyEnabled || this.isApplyingHistory) return;
1445
1450
  const snapshot = this.toJSON();
1446
- const coalesce = COALESCE_REASONS.has(reason) && reason === this.lastReason && targetKey != null && targetKey === this.lastTargetKey && this.historyIndex >= 0;
1451
+ const coalesce = COALESCE_REASONS.has(reason) && reason === this.lastReason && targetKey != null && targetKey === this.lastTargetKey && this.historyIndex >= 0 && // Only coalesce onto the TOP of the stack. Without this guard a
1452
+ // coalescing edit made right after an undo overwrites an earlier
1453
+ // (non-top) snapshot, corrupting the redo branch and losing base state.
1454
+ // Mirrors the flowchart core's canCoalesce guard.
1455
+ this.historyIndex === this.history.length - 1;
1447
1456
  if (coalesce) {
1448
1457
  this.history[this.historyIndex] = snapshot;
1449
1458
  } else {