@inkbrick/react 0.0.0-stage → 0.1.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/FormulaPalette-WFRPRHS5.js +320 -0
- package/dist/FormulaPalette-WFRPRHS5.js.map +1 -0
- package/dist/chunk-TPUX4C45.js +2309 -0
- package/dist/chunk-TPUX4C45.js.map +1 -0
- package/dist/index.d.ts +1431 -0
- package/dist/index.js +4880 -0
- package/dist/index.js.map +1 -0
- package/dist/mathCss-FLPE6QBM.js +361 -0
- package/dist/mathCss-FLPE6QBM.js.map +1 -0
- package/package.json +46 -3
- package/src/block-handle/BlockHandleController.ts +93 -0
- package/src/block-handle/BlockHandleHost.tsx +108 -0
- package/src/block-handle/DefaultBlockHandle.tsx +71 -0
- package/src/block-handle/DefaultBlockMenu.tsx +114 -0
- package/src/block-handle/DropIndicatorHost.tsx +58 -0
- package/src/block-handle/actions.tsx +146 -0
- package/src/block-handle/blockDrag.ts +215 -0
- package/src/block-handle/geometry.ts +64 -0
- package/src/block-handle/gripGesture.ts +108 -0
- package/src/block-handle/types.ts +65 -0
- package/src/block-handle/useBlockDrag.ts +21 -0
- package/src/block-handle/useBlockHandles.ts +125 -0
- package/src/blocks/BlockChildren.tsx +17 -0
- package/src/blocks/BlockProps.ts +5 -0
- package/src/blocks/CalloutBlock.tsx +61 -0
- package/src/blocks/CodeBlock.tsx +96 -0
- package/src/blocks/DividerBlock.tsx +15 -0
- package/src/blocks/Editable.tsx +84 -0
- package/src/blocks/FormulaBlock.tsx +173 -0
- package/src/blocks/HeadingBlock.tsx +22 -0
- package/src/blocks/ImageBlock.tsx +362 -0
- package/src/blocks/ListBlock.tsx +86 -0
- package/src/blocks/NoteBlock.tsx +10 -0
- package/src/blocks/PageBlock.tsx +10 -0
- package/src/blocks/ParagraphBlock.tsx +20 -0
- package/src/blocks/QuoteBlock.tsx +18 -0
- package/src/blocks/UnknownBlockView.tsx +27 -0
- package/src/blocks/defineBlock.ts +49 -0
- package/src/clipboard/html/blocks.ts +379 -0
- package/src/clipboard/html/inline.ts +92 -0
- package/src/clipboard/html/style.ts +92 -0
- package/src/clipboard/html/tags.ts +77 -0
- package/src/clipboard/htmlToFragment.ts +41 -0
- package/src/clipboard/useClipboard.ts +296 -0
- package/src/code/highlight.ts +56 -0
- package/src/code/languages.ts +236 -0
- package/src/code/scan/css.ts +164 -0
- package/src/code/scan/generic.ts +328 -0
- package/src/code/scan/html.ts +129 -0
- package/src/code/scan/markdown.ts +58 -0
- package/src/code/scan/shared.ts +81 -0
- package/src/code/scan/yaml.ts +34 -0
- package/src/code/types.ts +34 -0
- package/src/context/EditorContext.ts +9 -0
- package/src/context/EditorProvider.tsx +172 -0
- package/src/controllers/adapters.tsx +63 -0
- package/src/editing/BlockSelectionController.ts +27 -0
- package/src/editing/CaretController.ts +27 -0
- package/src/editing/EditorView.ts +108 -0
- package/src/editing/ViewportController.ts +63 -0
- package/src/editing/beforeInput.ts +276 -0
- package/src/editing/deleteAtBoundary.ts +16 -0
- package/src/editing/inputActions.ts +109 -0
- package/src/editing/renderCode.ts +69 -0
- package/src/editing/renderInline.ts +144 -0
- package/src/editing/selection.ts +262 -0
- package/src/editing/useEditorInput.ts +223 -0
- package/src/editing/useSelectionState.ts +46 -0
- package/src/formula/FormulaController.ts +51 -0
- package/src/formula/FormulaPalette.tsx +79 -0
- package/src/formula/FormulaPopover.tsx +181 -0
- package/src/formula/LazyFormulaPalette.tsx +42 -0
- package/src/formula/actions.ts +138 -0
- package/src/formula/snippet.ts +70 -0
- package/src/formula/symbols.ts +264 -0
- package/src/hooks/useBlock.ts +21 -0
- package/src/hooks/useBlockController.ts +30 -0
- package/src/hooks/useChildren.ts +16 -0
- package/src/hooks/useDocument.ts +16 -0
- package/src/hooks/useEditor.ts +13 -0
- package/src/hooks/useEditorView.ts +13 -0
- package/src/hooks/useHistory.ts +46 -0
- package/src/hooks/useReadOnly.ts +21 -0
- package/src/hooks/useT.ts +10 -0
- package/src/i18n/en.ts +182 -0
- package/src/i18n/ru.ts +174 -0
- package/src/i18n/translate.ts +77 -0
- package/src/icons/ICONS_LICENSE.md +50 -0
- package/src/icons/Icon.tsx +41 -0
- package/src/icons/lucide.ts +234 -0
- package/src/images/ImageError.ts +39 -0
- package/src/images/UploadTracker.ts +49 -0
- package/src/images/insertImages.ts +142 -0
- package/src/images/types.ts +22 -0
- package/src/images/upload.ts +62 -0
- package/src/index.ts +102 -0
- package/src/keymap/defaultKeymap.ts +189 -0
- package/src/keymap/keymap.ts +42 -0
- package/src/keymap/shortcut.ts +105 -0
- package/src/keymap/types.ts +40 -0
- package/src/math/FormulaView.tsx +62 -0
- package/src/math/mathCss.ts +4 -0
- package/src/math/renderer.ts +198 -0
- package/src/registry/defaultBlockComponents.ts +26 -0
- package/src/registry/resolveBlockComponent.ts +14 -0
- package/src/renderer/BlockRenderer.tsx +63 -0
- package/src/renderer/DocumentRenderer.tsx +33 -0
- package/src/renderer/DocumentView.tsx +94 -0
- package/src/renderer/virtual/VirtualChildList.tsx +355 -0
- package/src/renderer/virtual/estimate.ts +62 -0
- package/src/renderer/virtual/virtualRenderer.tsx +35 -0
- package/src/slash/DefaultSlashMenu.tsx +119 -0
- package/src/slash/SlashMenuController.ts +66 -0
- package/src/slash/SlashMenuHost.tsx +48 -0
- package/src/slash/applySlashItem.ts +57 -0
- package/src/slash/defaultSlashItems.tsx +186 -0
- package/src/slash/filter.ts +29 -0
- package/src/slash/items.ts +30 -0
- package/src/slash/syncSlashMenu.ts +67 -0
- package/src/slash/types.ts +21 -0
- package/src/toolbar/DefaultToolbar.tsx +281 -0
- package/src/toolbar/ToolbarController.ts +100 -0
- package/src/toolbar/ToolbarHost.tsx +81 -0
- package/src/toolbar/formatting.ts +75 -0
- package/src/toolbar/rich.ts +58 -0
- package/src/toolbar/syncToolbar.ts +39 -0
- package/src/toolbar/types.ts +21 -0
- package/src/ui/EditorUIContext.ts +26 -0
- package/src/ui/presentation.ts +24 -0
- package/src/ui/types.ts +70 -0
- package/README.md +0 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/code/languages.ts","../src/code/scan/shared.ts","../src/code/scan/css.ts","../src/code/scan/generic.ts","../src/code/scan/html.ts","../src/code/scan/markdown.ts","../src/code/scan/yaml.ts","../src/code/highlight.ts","../src/i18n/en.ts","../src/i18n/ru.ts","../src/i18n/translate.ts","../src/math/renderer.ts","../src/slash/filter.ts","../src/slash/applySlashItem.ts","../src/editing/selection.ts","../src/slash/items.ts","../src/toolbar/formatting.ts","../src/toolbar/syncToolbar.ts","../src/formula/actions.ts","../src/toolbar/rich.ts","../src/editing/deleteAtBoundary.ts","../src/keymap/defaultKeymap.ts","../src/icons/lucide.ts","../src/icons/Icon.tsx","../src/slash/defaultSlashItems.tsx","../src/ui/EditorUIContext.ts","../src/hooks/useT.ts","../src/formula/snippet.ts"],"sourcesContent":["import type { HighlightTokenType } from './types';\n\nexport interface LanguageDef {\n keywords?: string;\n types?: string;\n builtins?: string;\n constants?: string;\n ignoreCase?: boolean;\n lineComment?: readonly string[];\n /** Строчный комментарий начинается только в начале слова (bash: `#`, но не `$#`). */\n commentAtWordStart?: boolean;\n blockComment?: readonly [string, string];\n strings?: string;\n multiline?: string;\n triple?: boolean;\n stringPrefixes?: boolean;\n stringKeys?: boolean;\n regex?: boolean;\n preprocessor?: boolean;\n rustAttributes?: boolean;\n lifetimes?: boolean;\n at?: boolean;\n dollar?: boolean;\n flags?: boolean;\n macros?: boolean;\n pascalTypes?: boolean;\n declarations?: Readonly<Record<string, HighlightTokenType>>;\n}\n\nconst JS_KEYWORDS =\n 'break case catch class const continue debugger default delete do else enum export extends finally for function if import in instanceof let new of return static super switch this throw try typeof var void while with yield async await from as implements interface package private protected public readonly abstract declare namespace keyof satisfies override';\n\nconst JS_DECLARATIONS = {\n function: 'function',\n class: 'type',\n interface: 'type',\n enum: 'type',\n namespace: 'type',\n} as const;\n\nconst javascript: LanguageDef = {\n keywords: JS_KEYWORDS,\n constants: 'true false null undefined NaN Infinity',\n builtins:\n 'console window document Math JSON Object Array String Number Boolean Promise Map Set WeakMap Date Error RegExp Symbol parseInt parseFloat require module exports process globalThis',\n lineComment: ['//'],\n blockComment: ['/*', '*/'],\n strings: '\\'\"`',\n multiline: '`',\n regex: true,\n at: true,\n pascalTypes: true,\n declarations: JS_DECLARATIONS,\n};\n\nconst typescript: LanguageDef = {\n ...javascript,\n types:\n 'string number boolean any unknown never void object bigint symbol Record Partial Required Readonly Pick Omit Awaited ReturnType',\n};\n\nconst python: LanguageDef = {\n keywords:\n 'and as assert async await break class continue def del elif else except finally for from global if import in is lambda nonlocal not or pass raise return try while with yield match case',\n constants: 'True False None',\n builtins:\n 'print len range int str float bool list dict set tuple type isinstance open enumerate zip map filter sorted sum min max abs any all input super self cls object Exception',\n lineComment: ['#'],\n strings: '\\'\"',\n triple: true,\n stringPrefixes: true,\n at: true,\n pascalTypes: true,\n declarations: { def: 'function', class: 'type' },\n};\n\nconst go: LanguageDef = {\n keywords:\n 'break case chan const continue default defer else fallthrough for func go goto if import interface map package range return select struct switch type var',\n types:\n 'bool byte complex64 complex128 error float32 float64 int int8 int16 int32 int64 rune string uint uint8 uint16 uint32 uint64 uintptr any',\n constants: 'true false nil iota',\n builtins: 'append cap close copy delete len make new panic print println recover',\n lineComment: ['//'],\n blockComment: ['/*', '*/'],\n strings: '\\'\"`',\n multiline: '`',\n pascalTypes: true,\n declarations: { func: 'function', type: 'type' },\n};\n\nconst rust: LanguageDef = {\n keywords:\n 'as async await break const continue crate dyn else enum extern fn for if impl in let loop match mod move mut pub ref return self Self static struct super trait type unsafe use where while',\n types:\n 'i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 bool char str String Vec Option Result Box Rc Arc',\n constants: 'true false None Some Ok Err',\n lineComment: ['//'],\n blockComment: ['/*', '*/'],\n strings: '\"',\n multiline: '\"',\n rustAttributes: true,\n lifetimes: true,\n macros: true,\n pascalTypes: true,\n declarations: { fn: 'function', struct: 'type', enum: 'type', trait: 'type', impl: 'type' },\n};\n\nconst java: LanguageDef = {\n keywords:\n 'abstract assert break case catch class continue default do else enum extends final finally for if implements import instanceof interface native new package private protected public return static strictfp super switch synchronized this throw throws transient try void volatile while var record sealed permits',\n types:\n 'boolean byte char double float int long short String Integer Long Double Boolean Object List Map Set',\n constants: 'true false null',\n lineComment: ['//'],\n blockComment: ['/*', '*/'],\n strings: '\\'\"',\n at: true,\n pascalTypes: true,\n declarations: { class: 'type', interface: 'type', enum: 'type', record: 'type' },\n};\n\nconst C_KEYWORDS =\n 'auto break case const continue default do else enum extern for goto if inline register restrict return sizeof static struct switch typedef union volatile while';\n\nconst c: LanguageDef = {\n keywords: C_KEYWORDS,\n types:\n 'void char short int long float double signed unsigned size_t bool _Bool int8_t int16_t int32_t int64_t uint8_t uint16_t uint32_t uint64_t FILE',\n constants: 'NULL true false EOF',\n lineComment: ['//'],\n blockComment: ['/*', '*/'],\n strings: '\\'\"',\n preprocessor: true,\n declarations: { struct: 'type', enum: 'type', union: 'type' },\n};\n\nconst cpp: LanguageDef = {\n ...c,\n keywords: `${C_KEYWORDS} class namespace template typename public private protected virtual override final new delete this using try catch throw operator constexpr noexcept static_cast dynamic_cast reinterpret_cast const_cast explicit friend mutable decltype`,\n types: `${c.types} string vector map set unique_ptr shared_ptr std`,\n constants: 'NULL nullptr true false EOF',\n pascalTypes: true,\n declarations: { class: 'type', struct: 'type', enum: 'type', namespace: 'type', union: 'type' },\n};\n\nconst bash: LanguageDef = {\n keywords:\n 'if then else elif fi for while until do done case esac in function select time return exit break continue export local readonly declare unset source alias set shift',\n builtins:\n 'echo cd ls pwd cat grep sed awk rm cp mv mkdir touch chmod chown curl wget git npm pnpm yarn node python docker sudo kill ps tar test read printf eval exec trap true false',\n lineComment: ['#'],\n commentAtWordStart: true,\n strings: '\\'\"`',\n multiline: '\\'\"`',\n dollar: true,\n flags: true,\n};\n\nconst sql: LanguageDef = {\n ignoreCase: true,\n keywords:\n 'select from where and or not in is like between exists distinct as join inner left right full outer cross on using group by order having limit offset union all insert into values update set delete create alter drop table index view database schema primary key foreign references unique default check constraint add column case when then else end begin commit rollback transaction with returning asc desc if cascade truncate grant revoke',\n types:\n 'int integer bigint smallint tinyint varchar char text boolean bool date time timestamp datetime numeric decimal float double real serial uuid json jsonb blob',\n constants: 'true false null',\n builtins:\n 'count sum avg min max coalesce now cast length lower upper trim round abs concat substring',\n lineComment: ['--'],\n blockComment: ['/*', '*/'],\n strings: '\\'\"',\n};\n\nconst json: LanguageDef = {\n constants: 'true false null',\n lineComment: ['//'],\n blockComment: ['/*', '*/'],\n strings: '\"',\n stringKeys: true,\n};\n\nconst yaml: LanguageDef = {\n constants: 'true false null yes no on off ~ True False Null',\n lineComment: ['#'],\n commentAtWordStart: true,\n strings: '\\'\"',\n};\n\nexport const LANGUAGES: Readonly<Record<string, LanguageDef>> = {\n javascript,\n typescript,\n python,\n go,\n rust,\n java,\n c,\n cpp,\n bash,\n sql,\n json,\n yaml,\n};\n\nexport const ALIASES: Readonly<Record<string, string>> = {\n js: 'javascript',\n jsx: 'javascript',\n mjs: 'javascript',\n cjs: 'javascript',\n ts: 'typescript',\n tsx: 'typescript',\n py: 'python',\n golang: 'go',\n rs: 'rust',\n sh: 'bash',\n shell: 'bash',\n zsh: 'bash',\n console: 'bash',\n 'c++': 'cpp',\n cc: 'cpp',\n cxx: 'cpp',\n hpp: 'cpp',\n h: 'c',\n jsonc: 'json',\n json5: 'json',\n yml: 'yaml',\n md: 'markdown',\n xml: 'html',\n svg: 'html',\n htm: 'html',\n scss: 'css',\n less: 'css',\n postgres: 'sql',\n postgresql: 'sql',\n mysql: 'sql',\n sqlite: 'sql',\n};\n","import type { HighlightTokenType } from '../types';\n\nexport type Emit = (from: number, to: number, type: HighlightTokenType) => void;\n\nexport const IDENT = /[A-Za-z_$À-][\\w$À-]*/y;\nexport const NUMBER =\n /(?:0[xX][\\da-fA-F_]+|0[bB][01_]+|0[oO][0-7_]+|(?:\\d[\\d_]*(?:\\.[\\d_]+)?|\\.\\d[\\d_]*)(?:[eE][+-]?\\d+)?)[a-zA-Z]*/y;\nexport const CHAR_LITERAL = /'(?:\\\\.|[^'\\\\\\n])'/y;\nexport const LIFETIME = /'[A-Za-z_]\\w*/y;\nexport const STRING_PREFIX = /^[rRbBfFuU]{1,3}$/;\nexport const REGEX_AFTER_WORD = new Set(\n 'return typeof case delete void throw in of new else do yield await'.split(' '),\n);\n\nexport const matchAt = (re: RegExp, code: string, at: number): string | null => {\n re.lastIndex = at;\n\n const match = re.exec(code);\n\n return match ? match[0] : null;\n};\n\nexport const isDigit = (char: string | undefined) =>\n char !== undefined && char >= '0' && char <= '9';\nexport const isSpace = (char: string | undefined) =>\n char === ' ' || char === '\\t' || char === '\\n' || char === '\\r';\n\nexport function lineEnd(code: string, from: number, end: number): number {\n const index = code.indexOf('\\n', from);\n\n return index < 0 || index > end ? end : index;\n}\n\nexport function nextOnLine(code: string, from: number, end: number): number {\n let i = from;\n\n while (i < end && (code[i] === ' ' || code[i] === '\\t')) i++;\n\n return i;\n}\n\nexport function onlyWhitespaceBefore(code: string, at: number, start: number): boolean {\n for (let i = at - 1; i >= start && code[i] !== '\\n'; i--) {\n if (code[i] !== ' ' && code[i] !== '\\t') return false;\n }\n\n return true;\n}\n\nexport function scanString(\n code: string,\n start: number,\n end: number,\n quote: string,\n triple: boolean,\n multiline: boolean,\n): number {\n const closing = quote.repeat(3);\n let i = start + (triple ? 3 : 1);\n\n while (i < end) {\n const char = code[i];\n\n if (char === '\\\\') {\n i += 2;\n continue;\n }\n\n if (triple) {\n if (code.startsWith(closing, i)) return i + 3;\n } else if (char === quote) {\n return i + 1;\n } else if (char === '\\n' && !multiline) {\n return i;\n }\n\n i++;\n }\n\n return end;\n}\n","import { type Emit, isDigit, isSpace, matchAt, nextOnLine, scanString } from './shared';\n\nexport function scanCss(code: string, start: number, end: number, emit: Emit) {\n let i = start;\n let depth = 0;\n let expectProperty = false;\n\n while (i < end) {\n const char = code[i];\n\n if (isSpace(char)) {\n i++;\n continue;\n }\n\n if (code.startsWith('/*', i)) {\n const close = code.indexOf('*/', i + 2);\n const stop = close < 0 || close + 2 > end ? end : close + 2;\n\n emit(i, stop, 'comment');\n i = stop;\n continue;\n }\n\n if (char === '\"' || char === \"'\") {\n const stop = scanString(code, i, end, char, false, false);\n\n emit(i, stop, 'string');\n i = stop;\n continue;\n }\n\n if (char === '{') {\n depth++;\n expectProperty = true;\n i++;\n continue;\n }\n\n if (char === '}') {\n depth = Math.max(0, depth - 1);\n expectProperty = depth > 0;\n i++;\n continue;\n }\n\n if (char === ';') {\n expectProperty = depth > 0;\n i++;\n continue;\n }\n\n if (char === '@') {\n const name = matchAt(/@[\\w-]+/y, code, i);\n\n if (name) {\n emit(i, i + name.length, 'keyword');\n i += name.length;\n continue;\n }\n }\n\n const inValue = depth > 0 && !expectProperty;\n\n if (inValue) {\n const hex = matchAt(/#[\\da-fA-F]{3,8}\\b/y, code, i);\n\n if (hex) {\n emit(i, i + hex.length, 'number');\n i += hex.length;\n continue;\n }\n\n const number = matchAt(/-?(?:\\d+\\.?\\d*|\\.\\d+)(?:%|[a-zA-Z]+)?/y, code, i);\n\n if (number && (isDigit(char) || char === '.' || char === '-')) {\n emit(i, i + number.length, 'number');\n i += number.length;\n continue;\n }\n\n if (code.startsWith('!important', i)) {\n emit(i, i + 10, 'keyword');\n i += 10;\n continue;\n }\n\n const word = matchAt(/[A-Za-z_-][\\w-]*/y, code, i);\n\n if (word) {\n if (code[nextOnLine(code, i + word.length, end)] === '(')\n emit(i, i + word.length, 'function');\n i += word.length;\n continue;\n }\n\n i++;\n continue;\n }\n\n if (depth > 0 && expectProperty) {\n const property = matchAt(/-{0,2}[A-Za-z_][\\w-]*(?=\\s*:(?!:))/y, code, i);\n\n if (property && !isNestedSelector(code, i + property.length, end)) {\n emit(i, i + property.length, 'property');\n i += property.length;\n expectProperty = false;\n continue;\n }\n }\n\n const classOrId = matchAt(/[.#][\\w-]+/y, code, i);\n\n if (classOrId) {\n emit(i, i + classOrId.length, 'function');\n i += classOrId.length;\n continue;\n }\n\n const pseudo = matchAt(/::?[\\w-]+/y, code, i);\n\n if (pseudo) {\n emit(i, i + pseudo.length, 'keyword');\n i += pseudo.length;\n continue;\n }\n\n if (char === '[') {\n const close = code.indexOf(']', i);\n const stop = close < 0 || close >= end ? end : close + 1;\n\n emit(i, stop, 'attribute');\n i = stop;\n continue;\n }\n\n const tag = matchAt(/[A-Za-z][\\w-]*/y, code, i);\n\n if (tag) {\n emit(i, i + tag.length, 'tag');\n i += tag.length;\n continue;\n }\n\n i++;\n }\n}\n\nfunction isNestedSelector(code: string, from: number, end: number): boolean {\n const colon = code.indexOf(':', from);\n\n if (colon < 0 || colon >= end) return false;\n\n const brace = code.indexOf('{', colon);\n const semicolon = code.indexOf(';', colon);\n const newline = code.indexOf('\\n', colon);\n\n return (\n brace >= 0 &&\n brace < end &&\n (semicolon < 0 || brace < semicolon) &&\n (newline < 0 || brace < newline)\n );\n}\n","import type { LanguageDef } from '../languages';\nimport type { HighlightTokenType } from '../types';\nimport {\n CHAR_LITERAL,\n type Emit,\n IDENT,\n LIFETIME,\n NUMBER,\n REGEX_AFTER_WORD,\n STRING_PREFIX,\n isDigit,\n isSpace,\n lineEnd,\n matchAt,\n nextOnLine,\n onlyWhitespaceBefore,\n scanString,\n} from './shared';\n\ninterface WordSets {\n keywords: ReadonlySet<string>;\n types: ReadonlySet<string>;\n builtins: ReadonlySet<string>;\n constants: ReadonlySet<string>;\n}\n\nconst setsCache = new WeakMap<LanguageDef, WordSets>();\n\nfunction wordSets(lang: LanguageDef): WordSets {\n let sets = setsCache.get(lang);\n\n if (!sets) {\n const make = (list = '') =>\n new Set(\n list\n .split(/\\s+/)\n .filter(Boolean)\n .map((word) => (lang.ignoreCase ? word.toLowerCase() : word)),\n );\n\n sets = {\n keywords: make(lang.keywords),\n types: make(lang.types),\n builtins: make(lang.builtins),\n constants: make(lang.constants),\n };\n setsCache.set(lang, sets);\n }\n\n return sets;\n}\n\nfunction classify(\n word: string,\n lang: LanguageDef,\n sets: WordSets,\n followedByCall: boolean,\n previousWord: string,\n): HighlightTokenType | null {\n const key = lang.ignoreCase ? word.toLowerCase() : word;\n const declared = lang.declarations?.[previousWord];\n\n if (declared && !sets.keywords.has(key)) return declared;\n if (sets.keywords.has(key)) return 'keyword';\n if (sets.constants.has(key)) return 'constant';\n if (sets.types.has(key)) return 'type';\n if (sets.builtins.has(key)) return 'builtin';\n if (followedByCall) return 'function';\n if (lang.pascalTypes && /^[A-Z]/.test(word) && /[a-z]/.test(word)) return 'type';\n\n return null;\n}\n\nexport function scanGeneric(\n code: string,\n lang: LanguageDef,\n start: number,\n end: number,\n emit: Emit,\n) {\n const sets = wordSets(lang);\n const quotes = lang.strings ?? '';\n let i = start;\n let previousWord = '';\n /** Последний значимый токен: нужен, чтобы отличить регулярное выражение от деления. */\n let last = '';\n\n while (i < end) {\n const char = code[i];\n\n if (isSpace(char)) {\n i++;\n continue;\n }\n\n const lineMarker = lang.lineComment?.find(\n (marker) =>\n code.startsWith(marker, i) &&\n (!lang.commentAtWordStart || i === start || isSpace(code[i - 1])),\n );\n\n if (lineMarker) {\n const stop = lineEnd(code, i, end);\n\n emit(i, stop, 'comment');\n i = stop;\n previousWord = '';\n continue;\n }\n\n if (lang.blockComment && code.startsWith(lang.blockComment[0], i)) {\n const close = code.indexOf(lang.blockComment[1], i + lang.blockComment[0].length);\n const stop =\n close < 0 || close + lang.blockComment[1].length > end\n ? end\n : close + lang.blockComment[1].length;\n\n emit(i, stop, 'comment');\n i = stop;\n previousWord = '';\n continue;\n }\n\n if (lang.preprocessor && char === '#' && onlyWhitespaceBefore(code, i, start)) {\n const stop = lineEnd(code, i, end);\n\n emit(i, stop, 'meta');\n i = stop;\n previousWord = '';\n continue;\n }\n\n if (\n lang.rustAttributes &&\n char === '#' &&\n (code[i + 1] === '[' || code.startsWith('![', i + 1))\n ) {\n let depth = 0;\n let stop = i;\n\n for (; stop < end; stop++) {\n if (code[stop] === '[') depth++;\n else if (code[stop] === ']' && --depth <= 0) {\n stop++;\n break;\n } else if (code[stop] === '\\n') break;\n }\n\n emit(i, stop, 'meta');\n i = stop;\n previousWord = '';\n continue;\n }\n\n if (lang.lifetimes && char === \"'\") {\n const literal = matchAt(CHAR_LITERAL, code, i);\n\n if (literal) {\n emit(i, i + literal.length, 'string');\n i += literal.length;\n } else {\n const lifetime = matchAt(LIFETIME, code, i);\n\n if (lifetime) emit(i, i + lifetime.length, 'type');\n i += lifetime ? lifetime.length : 1;\n }\n\n previousWord = '';\n last = 'value';\n continue;\n }\n\n if (quotes.includes(char)) {\n const triple = lang.triple === true && code.startsWith(char.repeat(3), i);\n const stop = scanString(\n code,\n i,\n end,\n char,\n triple,\n triple || (lang.multiline ?? '').includes(char),\n );\n let type: HighlightTokenType = 'string';\n\n if (lang.stringKeys && code[nextOnLine(code, stop, end)] === ':') type = 'property';\n\n emit(i, stop, type);\n i = stop;\n previousWord = '';\n last = 'value';\n continue;\n }\n\n if (isDigit(char) || (char === '.' && isDigit(code[i + 1]))) {\n const number = matchAt(NUMBER, code, i) ?? char;\n\n emit(i, i + number.length, 'number');\n i += number.length;\n previousWord = '';\n last = 'value';\n continue;\n }\n\n if (lang.dollar && char === '$') {\n let stop = i + 1;\n\n if (code[stop] === '{') {\n const close = code.indexOf('}', stop);\n\n stop = close < 0 || close >= end ? lineEnd(code, stop, end) : close + 1;\n } else if (/[\\w@?#*!$-]/.test(code[stop] ?? '')) {\n const word = matchAt(/\\w+|[@?#*!$-]/y, code, stop);\n\n stop += word ? word.length : 1;\n }\n\n if (stop > i + 1) emit(i, stop, 'variable');\n i = Math.max(stop, i + 1);\n previousWord = '';\n last = 'value';\n continue;\n }\n\n if (\n lang.flags &&\n char === '-' &&\n (i === start || isSpace(code[i - 1])) &&\n /[A-Za-z-]/.test(code[i + 1] ?? '')\n ) {\n let stop = i + 1;\n\n while (stop < end && !isSpace(code[stop]) && code[stop] !== '=') stop++;\n\n emit(i, stop, 'attribute');\n i = stop;\n previousWord = '';\n continue;\n }\n\n if (lang.at && char === '@') {\n const name = matchAt(/[A-Za-z_]\\w*(?:\\.[A-Za-z_]\\w*)*/y, code, i + 1);\n\n if (name) {\n emit(i, i + 1 + name.length, 'meta');\n i += 1 + name.length;\n previousWord = '';\n continue;\n }\n }\n\n const word = matchAt(IDENT, code, i);\n\n if (word) {\n const stop = i + word.length;\n\n if (\n lang.stringPrefixes &&\n STRING_PREFIX.test(word) &&\n stop < end &&\n quotes.includes(code[stop])\n ) {\n const quote = code[stop];\n const triple = lang.triple === true && code.startsWith(quote.repeat(3), stop);\n\n const close = scanString(code, stop, end, quote, triple, triple);\n\n emit(i, close, 'string');\n i = close;\n previousWord = '';\n last = 'value';\n continue;\n }\n\n if (lang.macros && code[stop] === '!' && code[stop + 1] !== '=') {\n emit(i, stop + 1, 'function');\n i = stop + 1;\n previousWord = '';\n last = 'value';\n continue;\n }\n\n const followedByCall = code[nextOnLine(code, stop, end)] === '(';\n const type = classify(word, lang, sets, followedByCall, previousWord);\n\n if (type) emit(i, stop, type);\n\n previousWord = word;\n last = `word:${word}`;\n i = stop;\n continue;\n }\n\n if (lang.regex && char === '/') {\n const afterWord = last.startsWith('word:') && REGEX_AFTER_WORD.has(last.slice(5));\n const allowed = last === '' || last.length === 1 || afterWord;\n\n if (allowed) {\n let stop = i + 1;\n let inClass = false;\n\n while (stop < end && code[stop] !== '\\n') {\n if (code[stop] === '\\\\') stop++;\n else if (code[stop] === '[') inClass = true;\n else if (code[stop] === ']') inClass = false;\n else if (code[stop] === '/' && !inClass) break;\n\n stop++;\n }\n\n if (code[stop] === '/') {\n stop++;\n\n while (stop < end && /[a-z]/i.test(code[stop])) stop++;\n\n emit(i, stop, 'regex');\n i = stop;\n previousWord = '';\n last = 'value';\n continue;\n }\n }\n }\n\n previousWord = '';\n last = char === ')' || char === ']' || char === '}' ? 'value' : char;\n i++;\n }\n}\n","import { LANGUAGES } from '../languages';\nimport { scanCss } from './css';\nimport { scanGeneric } from './generic';\nimport { type Emit, isSpace, matchAt } from './shared';\n\nconst ENTITY = /&(?:#\\d+|#x[\\da-fA-F]+|[A-Za-z]\\w*);/g;\n\nfunction emitEntities(code: string, from: number, to: number, emit: Emit) {\n ENTITY.lastIndex = from;\n\n for (let match = ENTITY.exec(code); match && match.index < to; match = ENTITY.exec(code)) {\n if (match.index + match[0].length <= to)\n emit(match.index, match.index + match[0].length, 'constant');\n }\n}\n\nexport function scanHtml(code: string, start: number, end: number, emit: Emit) {\n let i = start;\n\n while (i < end) {\n const open = code.indexOf('<', i);\n\n if (open < 0 || open >= end) {\n emitEntities(code, i, end, emit);\n return;\n }\n\n emitEntities(code, i, open, emit);\n\n if (code.startsWith('<!--', open)) {\n const close = code.indexOf('-->', open + 4);\n const stop = close < 0 || close + 3 > end ? end : close + 3;\n\n emit(open, stop, 'comment');\n i = stop;\n continue;\n }\n\n if (code.startsWith('<!', open) || code.startsWith('<?', open)) {\n const close = code.indexOf('>', open);\n const stop = close < 0 || close >= end ? end : close + 1;\n\n emit(open, stop, 'meta');\n i = stop;\n continue;\n }\n\n const name = matchAt(/<\\/?[A-Za-z][\\w:.-]*/y, code, open);\n\n if (!name) {\n i = open + 1;\n continue;\n }\n\n emit(open, open + name.length, 'tag');\n i = open + name.length;\n\n let selfClosing = false;\n\n while (i < end) {\n while (i < end && isSpace(code[i])) i++;\n\n if (code[i] === '>') {\n emit(i, i + 1, 'tag');\n i++;\n break;\n }\n\n if (code.startsWith('/>', i)) {\n emit(i, i + 2, 'tag');\n selfClosing = true;\n i += 2;\n break;\n }\n\n const attribute = matchAt(/[^\\s=<>\"'/]+/y, code, i);\n\n if (!attribute) {\n i++;\n continue;\n }\n\n emit(i, i + attribute.length, 'attribute');\n i += attribute.length;\n\n let after = i;\n\n while (after < end && isSpace(code[after])) after++;\n\n if (code[after] !== '=') continue;\n\n after++;\n\n while (after < end && isSpace(code[after])) after++;\n\n const quote = code[after];\n\n if (quote === '\"' || quote === \"'\") {\n const close = code.indexOf(quote, after + 1);\n const stop = close < 0 || close >= end ? end : close + 1;\n\n emit(after, stop, 'string');\n i = stop;\n } else {\n const value = matchAt(/[^\\s>]+/y, code, after);\n\n if (value) emit(after, after + value.length, 'string');\n i = after + (value ? value.length : 0);\n }\n }\n\n const tag = name.replace(/^<\\/?/, '').toLowerCase();\n\n if (\n !selfClosing &&\n !name.startsWith('</') &&\n (tag === 'script' || tag === 'style') &&\n i < end\n ) {\n const close = code.toLowerCase().indexOf(`</${tag}`, i);\n const stop = close < 0 || close > end ? end : close;\n\n if (tag === 'script') scanGeneric(code, LANGUAGES.javascript, i, stop, emit);\n else scanCss(code, i, stop, emit);\n\n i = stop;\n }\n }\n}\n","import { type Emit, lineEnd } from './shared';\n\nconst MARKDOWN_INLINE = /`[^`\\n]+`|\\*\\*[^*\\n]+\\*\\*|__[^_\\n]+__|\\[[^\\]\\n]*\\]\\([^)\\n]*\\)/g;\n\nexport function scanMarkdown(code: string, start: number, end: number, emit: Emit) {\n let inFence = false;\n let lineStart = start;\n\n while (lineStart <= end) {\n const stop = lineEnd(code, lineStart, end);\n const line = code.slice(lineStart, stop);\n\n if (/^\\s*(```|~~~)/.test(line)) {\n emit(lineStart, stop, 'meta');\n inFence = !inFence;\n } else if (inFence) {\n emit(lineStart, stop, 'string');\n } else if (/^#{1,6}\\s/.test(line)) {\n emit(lineStart, stop, 'keyword');\n } else if (/^\\s*([-*_])(\\s*\\1){2,}\\s*$/.test(line)) {\n emit(lineStart, stop, 'meta');\n } else {\n let offset = 0;\n const marker = /^\\s*(?:>|[-*+]\\s|\\d+[.)]\\s)/.exec(line);\n\n if (marker) {\n const length = marker[0].trimEnd().length;\n\n emit(\n lineStart + marker[0].length - marker[0].trimStart().length,\n lineStart + length,\n 'keyword',\n );\n offset = marker[0].length;\n }\n\n MARKDOWN_INLINE.lastIndex = offset;\n\n for (let match = MARKDOWN_INLINE.exec(line); match; match = MARKDOWN_INLINE.exec(line)) {\n const from = lineStart + match.index;\n const text = match[0];\n\n if (text.startsWith('[')) {\n const split = text.indexOf('](');\n\n emit(from, from + split + 1, 'function');\n emit(from + split + 1, from + text.length, 'string');\n } else {\n emit(from, from + text.length, text.startsWith('`') ? 'string' : 'keyword');\n }\n }\n }\n\n if (stop >= end) break;\n\n lineStart = stop + 1;\n }\n}\n","import { LANGUAGES } from '../languages';\nimport { scanGeneric } from './generic';\nimport { type Emit, lineEnd } from './shared';\n\nconst YAML_KEY = /^(\\s*(?:-\\s+)*)(\"[^\"]*\"|'[^']*'|[^\\s#:'\"[\\]{},&*!|>-][^#:]*?)\\s*:(?=\\s|$)/;\n\nexport function scanYaml(code: string, start: number, end: number, emit: Emit) {\n let lineStart = start;\n\n while (lineStart <= end) {\n const stop = lineEnd(code, lineStart, end);\n const line = code.slice(lineStart, stop);\n\n if (/^(---|\\.\\.\\.)\\s*$/.test(line)) {\n emit(lineStart, stop, 'meta');\n } else {\n const key = YAML_KEY.exec(line);\n let restStart = lineStart;\n\n if (key) {\n const keyFrom = lineStart + key[1].length;\n\n emit(keyFrom, keyFrom + key[2].length, 'property');\n restStart = lineStart + key[0].length;\n }\n\n scanGeneric(code, LANGUAGES.yaml, restStart, stop, emit);\n }\n\n if (stop >= end) break;\n\n lineStart = stop + 1;\n }\n}\n","import { ALIASES, LANGUAGES } from './languages';\nimport { scanCss } from './scan/css';\nimport { scanGeneric } from './scan/generic';\nimport { scanHtml } from './scan/html';\nimport { scanMarkdown } from './scan/markdown';\nimport { type Emit } from './scan/shared';\nimport { scanYaml } from './scan/yaml';\nimport type { CodeHighlighter, HighlightToken } from './types';\n\n/** Длиннее этого текста блок не подсвечивается: подсветка пересчитывается на каждое нажатие клавиши. */\nexport const HIGHLIGHT_LIMIT = 100_000;\n\nexport function normalizeLanguage(language: string): string {\n const name = language.trim().toLowerCase();\n\n return ALIASES[name] ?? name;\n}\n\n/**\n * Встроенный подсветчик: без зависимостей, по правилам для распространённых языков (JavaScript/TypeScript, Python,\n * Go, Rust, Java, C/C++, Bash, SQL, JSON, YAML, HTML/XML, CSS, Markdown). Это не полноценный разбор, а быстрая\n * лексическая раскраска; для точности подключите свой `CodeHighlighter` (Shiki, Prism, highlight.js).\n * Неизвестный язык, `plain` и слишком длинный текст дают пустой список токенов.\n */\nexport const highlightCode: CodeHighlighter = (code, language) => {\n const name = normalizeLanguage(language);\n\n if (code.length === 0 || code.length > HIGHLIGHT_LIMIT) return [];\n\n const tokens: HighlightToken[] = [];\n const emit: Emit = (from, to, type) => {\n if (to > from) tokens.push({ from, to, type });\n };\n\n switch (name) {\n case 'html':\n scanHtml(code, 0, code.length, emit);\n break;\n case 'css':\n scanCss(code, 0, code.length, emit);\n break;\n case 'markdown':\n scanMarkdown(code, 0, code.length, emit);\n break;\n case 'yaml':\n scanYaml(code, 0, code.length, emit);\n break;\n default: {\n const lang = LANGUAGES[name];\n\n if (lang) scanGeneric(code, lang, 0, code.length, emit);\n }\n }\n\n return tokens;\n};\n","/**\n * Английский словарь — эталон: набор его ключей определяет `MessageKey`, а недостающие ключи любого другого\n * словаря берутся отсюда. В строках можно использовать подстановки `{name}`.\n */\nexport const en = {\n 'editor.hint': 'Press / to open the menu',\n 'editor.label': 'Document',\n\n 'block.list.done': 'Done',\n 'block.code.language': 'Code language',\n 'block.code.copy': 'Copy code',\n 'block.code.copied': 'Copied',\n 'block.callout.label': 'Callout style: {tone}. Click to change',\n 'block.callout.change': 'Change style',\n 'block.callout.tone.info': 'info',\n 'block.callout.tone.warning': 'warning',\n 'block.callout.tone.success': 'success',\n 'block.callout.tone.danger': 'danger',\n 'block.unknown.title': 'Unknown block type:',\n 'block.unknown.hint': 'Register a component for it via',\n\n 'image.options': 'Image options',\n 'image.align.left': 'Align left',\n 'image.align.center': 'Align center',\n 'image.align.right': 'Align right',\n 'image.width': 'Image width',\n 'image.alt': 'Alt text',\n 'image.caption.label': 'Caption',\n 'image.caption.placeholder': 'Write a caption…',\n 'image.replace': 'Replace image',\n 'image.url.label': 'Image URL',\n 'image.url.placeholder': 'Paste an image link…',\n 'image.embed': 'Embed',\n 'image.upload': 'Upload',\n 'image.status.uploading': 'Uploading…',\n 'image.status.none': 'No image',\n 'image.status.unsupported': 'This image address is not supported',\n 'image.status.failed': 'The image could not be loaded',\n 'image.status.retry': 'Replace',\n 'image.error.invalidLink': 'Enter a valid http(s) image link',\n 'image.error.unsupportedAddress': 'This image address is not supported',\n 'image.error.type': 'Unsupported image type \"{type}\"',\n 'image.error.size':\n 'The image is larger than {size} KB. Provide \"images.upload\" to store larger images.',\n 'image.error.uploadAddress': 'The upload returned an unsupported image address',\n 'image.error.read': 'Could not read the file',\n 'image.error.generic': 'Could not add the image',\n\n 'formula.source': 'LaTeX formula',\n 'formula.placeholder': 'Type LaTeX, e.g. \\\\frac{a}{b}',\n 'formula.hint': 'Ctrl+Enter to apply, Esc to cancel',\n 'formula.empty': 'Add a formula',\n 'formula.edit': 'Edit formula',\n 'formula.inline.title': 'Inline formula',\n 'formula.apply': 'Apply',\n 'formula.remove': 'Remove formula',\n 'formula.cancel': 'Cancel',\n 'formula.palette.label': 'Math symbols',\n 'formula.palette.functions': 'Functions',\n 'formula.palette.structures': 'Structures',\n 'formula.palette.greek': 'Greek letters',\n 'formula.palette.operators': 'Operators',\n 'formula.palette.relations': 'Relations',\n 'formula.palette.arrows': 'Arrows',\n 'formula.palette.sets': 'Sets and logic',\n\n 'color.black': 'Black',\n 'color.white': 'White',\n 'color.gray': 'Gray',\n 'color.brown': 'Brown',\n 'color.orange': 'Orange',\n 'color.yellow': 'Yellow',\n 'color.green': 'Green',\n 'color.blue': 'Blue',\n 'color.purple': 'Purple',\n 'color.pink': 'Pink',\n 'color.red': 'Red',\n\n 'toolbar.label': 'Text formatting',\n 'toolbar.bold.label': 'Bold',\n 'toolbar.bold.title': 'Bold (Ctrl+B)',\n 'toolbar.italic.label': 'Italic',\n 'toolbar.italic.title': 'Italic (Ctrl+I)',\n 'toolbar.underline.label': 'Underline',\n 'toolbar.underline.title': 'Underline (Ctrl+U)',\n 'toolbar.strike.label': 'Strikethrough',\n 'toolbar.strike.title': 'Strikethrough (Ctrl+Shift+X)',\n 'toolbar.code.label': 'Code',\n 'toolbar.code.title': 'Code (Ctrl+E)',\n 'toolbar.formula.label': 'Formula',\n 'toolbar.formula.title': 'Formula (Ctrl+Shift+M)',\n 'toolbar.color.label': 'Text color',\n 'toolbar.color.title': 'Text color',\n 'toolbar.color.default': 'Default color',\n 'toolbar.highlight.label': 'Highlight color',\n 'toolbar.highlight.title': 'Highlight',\n 'toolbar.highlight.none': 'No highlight',\n 'toolbar.align.left.label': 'Align left',\n 'toolbar.align.left.title': 'Align left (Ctrl+Shift+L)',\n 'toolbar.align.center.label': 'Align center',\n 'toolbar.align.center.title': 'Align center (Ctrl+Shift+E)',\n 'toolbar.align.right.label': 'Align right',\n 'toolbar.align.right.title': 'Align right (Ctrl+Shift+R)',\n 'toolbar.align.justify.label': 'Justify',\n 'toolbar.align.justify.title': 'Justify (Ctrl+Shift+J)',\n 'toolbar.link.label': 'Link',\n 'toolbar.link.title': 'Link (Ctrl+K)',\n 'toolbar.link.url': 'Link URL',\n 'toolbar.link.placeholder': 'Paste a link…',\n 'toolbar.link.apply': 'Apply link',\n 'toolbar.link.remove': 'Remove link',\n\n 'handle.add': 'Add block below',\n 'handle.grip': 'Drag to move, click for options',\n 'menu.label': 'Block options',\n 'menu.duplicate': 'Duplicate',\n 'menu.moveUp': 'Move up',\n 'menu.moveDown': 'Move down',\n 'menu.delete': 'Delete',\n 'menu.turnInto': 'Turn into',\n 'menu.empty': 'No actions',\n\n 'history.undo': 'Undo',\n 'history.redo': 'Redo',\n\n 'slash.label': 'Insert block',\n 'slash.empty': 'No results',\n 'slash.item.text.title': 'Text',\n 'slash.item.text.description': 'Plain paragraph',\n 'slash.item.text.keywords': 'paragraph, p',\n 'slash.item.heading-1.title': 'Heading 1',\n 'slash.item.heading-1.description': 'Large section heading',\n 'slash.item.heading-1.keywords': 'h1, title',\n 'slash.item.heading-2.title': 'Heading 2',\n 'slash.item.heading-2.description': 'Medium section heading',\n 'slash.item.heading-2.keywords': 'h2, subtitle',\n 'slash.item.heading-3.title': 'Heading 3',\n 'slash.item.heading-3.description': 'Small section heading',\n 'slash.item.heading-3.keywords': 'h3',\n 'slash.item.heading-4.title': 'Heading 4',\n 'slash.item.heading-4.description': 'Subsection heading',\n 'slash.item.heading-4.keywords': 'h4',\n 'slash.item.heading-5.title': 'Heading 5',\n 'slash.item.heading-5.description': 'Minor subsection heading',\n 'slash.item.heading-5.keywords': 'h5',\n 'slash.item.heading-6.title': 'Heading 6',\n 'slash.item.heading-6.description': 'Smallest heading',\n 'slash.item.heading-6.keywords': 'h6',\n 'slash.item.bullet-list.title': 'Bulleted list',\n 'slash.item.bullet-list.description': 'Simple bulleted list',\n 'slash.item.bullet-list.keywords': 'ul, unordered, list',\n 'slash.item.numbered-list.title': 'Numbered list',\n 'slash.item.numbered-list.description': 'List with numbering',\n 'slash.item.numbered-list.keywords': 'ol, ordered, list',\n 'slash.item.todo-list.title': 'To-do list',\n 'slash.item.todo-list.description': 'Track tasks with checkboxes',\n 'slash.item.todo-list.keywords': 'todo, task, checkbox, check',\n 'slash.item.quote.title': 'Quote',\n 'slash.item.quote.description': 'Capture a quote',\n 'slash.item.quote.keywords': 'blockquote, citation',\n 'slash.item.code.title': 'Code',\n 'slash.item.code.description': 'Code snippet with monospace font',\n 'slash.item.code.keywords': 'snippet, pre, program',\n 'slash.item.callout.title': 'Callout',\n 'slash.item.callout.description': 'Highlight important information',\n 'slash.item.callout.keywords': 'info, note, warning, tip, alert',\n 'slash.item.image.title': 'Image',\n 'slash.item.image.description': 'Upload or embed an image',\n 'slash.item.image.keywords': 'picture, photo, img, upload',\n 'slash.item.formula.title': 'Formula',\n 'slash.item.formula.description': 'Display a LaTeX formula',\n 'slash.item.formula.keywords': 'math, equation, latex, tex',\n 'slash.item.divider.title': 'Divider',\n 'slash.item.divider.description': 'Visually separate sections',\n 'slash.item.divider.keywords': 'hr, line, separator, rule',\n} as const;\n\nexport type MessageKey = keyof typeof en;\n\nexport type Messages = Readonly<Record<MessageKey, string>>;\n\nexport type PartialMessages = Readonly<Partial<Record<MessageKey, string>>>;\n","import type { Messages } from './en';\n\nexport const ru: Messages = {\n 'editor.hint': 'Нажмите «/», чтобы открыть меню',\n 'editor.label': 'Документ',\n\n 'block.list.done': 'Выполнено',\n 'block.code.language': 'Язык кода',\n 'block.code.copy': 'Копировать код',\n 'block.code.copied': 'Скопировано',\n 'block.callout.label': 'Стиль заметки: {tone}. Нажмите, чтобы изменить',\n 'block.callout.change': 'Изменить стиль',\n 'block.callout.tone.info': 'информация',\n 'block.callout.tone.warning': 'предупреждение',\n 'block.callout.tone.success': 'успех',\n 'block.callout.tone.danger': 'опасность',\n 'block.unknown.title': 'Неизвестный тип блока:',\n 'block.unknown.hint': 'Зарегистрируйте для него компонент через',\n\n 'image.options': 'Параметры изображения',\n 'image.align.left': 'По левому краю',\n 'image.align.center': 'По центру',\n 'image.align.right': 'По правому краю',\n 'image.width': 'Ширина изображения',\n 'image.alt': 'Альтернативный текст',\n 'image.caption.label': 'Подпись',\n 'image.caption.placeholder': 'Добавьте подпись…',\n 'image.replace': 'Заменить изображение',\n 'image.url.label': 'Адрес изображения',\n 'image.url.placeholder': 'Вставьте ссылку на изображение…',\n 'image.embed': 'Вставить',\n 'image.upload': 'Загрузить',\n 'image.status.uploading': 'Загрузка…',\n 'image.status.none': 'Нет изображения',\n 'image.status.unsupported': 'Этот адрес изображения не поддерживается',\n 'image.status.failed': 'Не удалось загрузить изображение',\n 'image.status.retry': 'Заменить',\n 'image.error.invalidLink': 'Введите корректную ссылку на изображение (http или https)',\n 'image.error.unsupportedAddress': 'Этот адрес изображения не поддерживается',\n 'image.error.type': 'Неподдерживаемый тип изображения «{type}»',\n 'image.error.size':\n 'Изображение больше {size} КБ. Чтобы хранить большие изображения, задайте «images.upload».',\n 'image.error.uploadAddress': 'Загрузчик вернул неподдерживаемый адрес изображения',\n 'image.error.read': 'Не удалось прочитать файл',\n 'image.error.generic': 'Не удалось добавить изображение',\n\n 'formula.source': 'Формула LaTeX',\n 'formula.placeholder': 'Введите LaTeX, например \\\\frac{a}{b}',\n 'formula.hint': 'Ctrl+Enter — применить, Esc — отмена',\n 'formula.empty': 'Добавить формулу',\n 'formula.edit': 'Изменить формулу',\n 'formula.inline.title': 'Встроенная формула',\n 'formula.apply': 'Применить',\n 'formula.remove': 'Удалить формулу',\n 'formula.cancel': 'Отмена',\n 'formula.palette.label': 'Математические символы',\n 'formula.palette.functions': 'Функции',\n 'formula.palette.structures': 'Конструкции',\n 'formula.palette.greek': 'Греческие буквы',\n 'formula.palette.operators': 'Операторы',\n 'formula.palette.relations': 'Отношения',\n 'formula.palette.arrows': 'Стрелки',\n 'formula.palette.sets': 'Множества и логика',\n\n 'color.black': 'Чёрный',\n 'color.white': 'Белый',\n 'color.gray': 'Серый',\n 'color.brown': 'Коричневый',\n 'color.orange': 'Оранжевый',\n 'color.yellow': 'Жёлтый',\n 'color.green': 'Зелёный',\n 'color.blue': 'Синий',\n 'color.purple': 'Фиолетовый',\n 'color.pink': 'Розовый',\n 'color.red': 'Красный',\n\n 'toolbar.label': 'Форматирование текста',\n 'toolbar.bold.label': 'Жирный',\n 'toolbar.bold.title': 'Жирный (Ctrl+B)',\n 'toolbar.italic.label': 'Курсив',\n 'toolbar.italic.title': 'Курсив (Ctrl+I)',\n 'toolbar.underline.label': 'Подчёркнутый',\n 'toolbar.underline.title': 'Подчёркнутый (Ctrl+U)',\n 'toolbar.strike.label': 'Зачёркнутый',\n 'toolbar.strike.title': 'Зачёркнутый (Ctrl+Shift+X)',\n 'toolbar.code.label': 'Код',\n 'toolbar.code.title': 'Код (Ctrl+E)',\n 'toolbar.formula.label': 'Формула',\n 'toolbar.formula.title': 'Формула (Ctrl+Shift+M)',\n 'toolbar.color.label': 'Цвет текста',\n 'toolbar.color.title': 'Цвет текста',\n 'toolbar.color.default': 'Цвет по умолчанию',\n 'toolbar.highlight.label': 'Цвет фона',\n 'toolbar.highlight.title': 'Выделение цветом',\n 'toolbar.highlight.none': 'Без выделения',\n 'toolbar.align.left.label': 'По левому краю',\n 'toolbar.align.left.title': 'По левому краю (Ctrl+Shift+L)',\n 'toolbar.align.center.label': 'По центру',\n 'toolbar.align.center.title': 'По центру (Ctrl+Shift+E)',\n 'toolbar.align.right.label': 'По правому краю',\n 'toolbar.align.right.title': 'По правому краю (Ctrl+Shift+R)',\n 'toolbar.align.justify.label': 'По ширине',\n 'toolbar.align.justify.title': 'По ширине (Ctrl+Shift+J)',\n 'toolbar.link.label': 'Ссылка',\n 'toolbar.link.title': 'Ссылка (Ctrl+K)',\n 'toolbar.link.url': 'Адрес ссылки',\n 'toolbar.link.placeholder': 'Вставьте ссылку…',\n 'toolbar.link.apply': 'Применить ссылку',\n 'toolbar.link.remove': 'Удалить ссылку',\n\n 'handle.add': 'Добавить блок ниже',\n 'handle.grip': 'Перетащите, чтобы переместить, или нажмите для параметров',\n 'menu.label': 'Параметры блока',\n 'menu.duplicate': 'Дублировать',\n 'menu.moveUp': 'Переместить вверх',\n 'menu.moveDown': 'Переместить вниз',\n 'menu.delete': 'Удалить',\n 'menu.turnInto': 'Превратить в',\n 'menu.empty': 'Нет действий',\n\n 'history.undo': 'Отменить',\n 'history.redo': 'Повторить',\n\n 'slash.label': 'Вставить блок',\n 'slash.empty': 'Ничего не найдено',\n 'slash.item.text.title': 'Текст',\n 'slash.item.text.description': 'Обычный абзац',\n 'slash.item.text.keywords': 'абзац, параграф, текст, paragraph',\n 'slash.item.heading-1.title': 'Заголовок 1',\n 'slash.item.heading-1.description': 'Крупный заголовок раздела',\n 'slash.item.heading-1.keywords': 'заголовок, h1, title',\n 'slash.item.heading-2.title': 'Заголовок 2',\n 'slash.item.heading-2.description': 'Средний заголовок раздела',\n 'slash.item.heading-2.keywords': 'заголовок, подзаголовок, h2',\n 'slash.item.heading-3.title': 'Заголовок 3',\n 'slash.item.heading-3.description': 'Небольшой заголовок раздела',\n 'slash.item.heading-3.keywords': 'заголовок, h3',\n 'slash.item.heading-4.title': 'Заголовок 4',\n 'slash.item.heading-4.description': 'Заголовок подраздела',\n 'slash.item.heading-4.keywords': 'заголовок, h4',\n 'slash.item.heading-5.title': 'Заголовок 5',\n 'slash.item.heading-5.description': 'Мелкий заголовок подраздела',\n 'slash.item.heading-5.keywords': 'заголовок, h5',\n 'slash.item.heading-6.title': 'Заголовок 6',\n 'slash.item.heading-6.description': 'Самый мелкий заголовок',\n 'slash.item.heading-6.keywords': 'заголовок, h6',\n 'slash.item.bullet-list.title': 'Маркированный список',\n 'slash.item.bullet-list.description': 'Простой список с маркерами',\n 'slash.item.bullet-list.keywords': 'список, маркер, ul, list',\n 'slash.item.numbered-list.title': 'Нумерованный список',\n 'slash.item.numbered-list.description': 'Список с нумерацией',\n 'slash.item.numbered-list.keywords': 'список, нумерация, ol, list',\n 'slash.item.todo-list.title': 'Список задач',\n 'slash.item.todo-list.description': 'Задачи с флажками',\n 'slash.item.todo-list.keywords': 'задачи, чекбокс, флажок, todo, task',\n 'slash.item.quote.title': 'Цитата',\n 'slash.item.quote.description': 'Выделить цитату',\n 'slash.item.quote.keywords': 'цитата, blockquote',\n 'slash.item.code.title': 'Код',\n 'slash.item.code.description': 'Фрагмент кода моноширинным шрифтом',\n 'slash.item.code.keywords': 'код, сниппет, программа, snippet',\n 'slash.item.callout.title': 'Заметка',\n 'slash.item.callout.description': 'Выделить важную информацию',\n 'slash.item.callout.keywords': 'заметка, важно, предупреждение, подсказка, callout, info',\n 'slash.item.image.title': 'Изображение',\n 'slash.item.image.description': 'Загрузить или вставить изображение',\n 'slash.item.image.keywords': 'картинка, фото, изображение, image, img',\n 'slash.item.formula.title': 'Формула',\n 'slash.item.formula.description': 'Формула LaTeX отдельной строкой',\n 'slash.item.formula.keywords': 'формула, математика, уравнение, latex',\n 'slash.item.divider.title': 'Разделитель',\n 'slash.item.divider.description': 'Визуально разделить разделы',\n 'slash.item.divider.keywords': 'линия, разделитель, черта, hr',\n};\n","import { en, type MessageKey, type Messages, type PartialMessages } from './en';\nimport { ru } from './ru';\n\nexport type MessageParams = Readonly<Record<string, string | number>>;\n\nexport type TFunction = (key: MessageKey, params?: MessageParams) => string;\n\nconst registry = new Map<string, PartialMessages>([\n ['en', en],\n ['ru', ru],\n]);\n\n/**\n * Подключает словарь под кодом языка (`'de'`, `'uk'`, `'pt-BR'`). Словарь может быть неполным: недостающие\n * ключи берутся из английского. Повторная регистрация того же кода заменяет словарь (в том числе встроенный).\n */\nexport function registerLocale(code: string, messages: PartialMessages): void {\n registry.set(normalize(code), messages);\n}\n\nexport function getLocales(): string[] {\n return [...registry.keys()];\n}\n\nconst normalize = (code: string) => code.trim().toLowerCase();\n\nfunction lookup(\n code: string,\n locales: Readonly<Record<string, PartialMessages>> | undefined,\n): PartialMessages | undefined {\n const wanted = normalize(code);\n const own = locales\n ? Object.fromEntries(Object.entries(locales).map(([key, value]) => [normalize(key), value]))\n : undefined;\n\n for (const candidate of [wanted, wanted.split('-')[0]]) {\n const found = own?.[candidate] ?? registry.get(candidate);\n\n if (found) return found;\n }\n\n return undefined;\n}\n\nexport interface ResolveMessagesOptions {\n readonly locale?: string;\n readonly locales?: Readonly<Record<string, PartialMessages>>;\n readonly messages?: PartialMessages;\n}\n\nexport function resolveMessages(options: ResolveMessagesOptions = {}): Messages {\n const base = options.locale ? lookup(options.locale, options.locales) : undefined;\n\n return { ...en, ...stripEmpty(base), ...stripEmpty(options.messages) };\n}\n\nfunction stripEmpty(messages: PartialMessages | undefined): PartialMessages {\n if (!messages) return {};\n\n return Object.fromEntries(\n Object.entries(messages).filter(([, value]) => typeof value === 'string'),\n ) as PartialMessages;\n}\n\nexport function interpolate(template: string, params?: MessageParams): string {\n if (!params) return template;\n\n return template.replace(/\\{(\\w+)\\}/g, (match, name: string) =>\n name in params ? String(params[name]) : match,\n );\n}\n\nexport function createTranslator(messages: Messages): TFunction {\n return (key, params) => interpolate(messages[key] ?? en[key], params);\n}\n\nexport const defaultT: TFunction = createTranslator(en);\n","export interface FormulaRenderOptions {\n readonly display: boolean;\n}\n\n/**\n * Рисует формулу в `target`: по коду LaTeX строит DOM (MathML, HTML, SVG…). Может быть асинхронной — например, для\n * подгрузки библиотеки. Если код ошибочен, функция должна бросить исключение: редактор покажет исходный текст и\n * сообщение об ошибке. Встроенный `temmlRenderer` строит MathML; KaTeX подключается так:\n * `(latex, target, { display }) => katex.render(latex, target, { displayMode: display, throwOnError: true })`.\n *\n * Результат вставляется в страницу как есть, поэтому используйте только безопасные режимы библиотек\n * (например, `trust: false`): LaTeX приходит из документа и может быть недоверенным.\n */\nexport type FormulaRenderer = (\n latex: string,\n target: HTMLElement,\n options: FormulaRenderOptions,\n) => void | Promise<void>;\n\ntype TemmlApi = typeof import('temml').default;\n\nlet temml: Promise<TemmlApi> | undefined;\n\n/** Temml (≈ 480 КБ) подгружается при первой формуле: документы без формул её не платят. */\nconst loadTemml = () => (temml ??= import('temml').then((module) => module.default));\n\nexport const temmlRenderer: FormulaRenderer = async (latex, target, { display }) => {\n const api = await loadTemml();\n\n api.render(latex, target, {\n displayMode: display,\n throwOnError: true,\n trust: false,\n strict: false,\n maxExpand: 1000,\n });\n};\n\nlet mathCss: Promise<string> | undefined;\n\nconst loadMathCss = () => (mathCss ??= import('./mathCss').then((module) => module.MATH_CSS));\n\nlet shadowSheet: CSSStyleSheet | null | undefined;\n\nfunction constructableSheet(css: string): CSSStyleSheet | null {\n if (shadowSheet !== undefined) return shadowSheet;\n\n try {\n if (typeof CSSStyleSheet !== 'undefined' && 'replaceSync' in CSSStyleSheet.prototype) {\n shadowSheet = new CSSStyleSheet();\n shadowSheet.replaceSync(css);\n\n return shadowSheet;\n }\n } catch {\n // нет поддержки конструируемых таблиц стилей — ниже используется <style>\n }\n\n return (shadowSheet = null);\n}\n\nconst styled = new WeakSet<Document | ShadowRoot>();\n\nfunction applyMathStyles(scope: Document | ShadowRoot, css: string): void {\n if (typeof ShadowRoot !== 'undefined' && scope instanceof ShadowRoot) {\n const sheet = constructableSheet(css);\n\n if (sheet && Array.isArray(scope.adoptedStyleSheets)) {\n scope.adoptedStyleSheets = [...scope.adoptedStyleSheets, sheet];\n } else {\n const style = globalThis.document.createElement('style');\n\n style.textContent = css;\n scope.appendChild(style);\n }\n\n return;\n }\n\n const doc = scope as Document;\n\n if (doc.head.querySelector('style[data-inkbrick-math]')) return;\n\n const style = doc.createElement('style');\n\n style.setAttribute('data-inkbrick-math', '');\n style.textContent = `@layer inkbrick.math {\\n${css}\\n}`;\n doc.head.appendChild(style);\n}\n\n/**\n * Подключает стили MathML (Temml) к документу или теневому корню встроенной формулы. В документе стили кладутся\n * в слой `inkbrick.math`, поэтому любое ваше правило без слоя сильнее. Стили подгружаются при первом вызове\n * и применяются, как только загрузятся (одновременно с самой формулой).\n */\nexport function ensureMathStyles(scope: Document | ShadowRoot): void {\n if (styled.has(scope)) return;\n\n styled.add(scope);\n void loadMathCss().then((css) => applyMathStyles(scope, css));\n}\n\ntype Rendered = readonly Node[];\n\nconst MAX_CACHE = 500;\nconst caches = new WeakMap<FormulaRenderer, Map<string, Rendered>>();\n\nfunction cacheOf(renderer: FormulaRenderer): Map<string, Rendered> {\n let cache = caches.get(renderer);\n\n if (!cache) caches.set(renderer, (cache = new Map()));\n\n return cache;\n}\n\nexport type FormulaState = 'empty' | 'source' | 'loading' | 'ready' | 'error';\n\nexport interface MountFormulaOptions {\n readonly display: boolean;\n readonly renderer: FormulaRenderer | null;\n readonly onSettled?: (state: 'ready' | 'error', message?: string) => void;\n}\n\n/**\n * Рисует формулу в `target`. Пока идёт расчёт, виден исходный код (`data-state=\"loading\"`); готовый результат кладётся\n * в кэш, поэтому одинаковые формулы (и перерисовка блока на каждое нажатие клавиши) появляются сразу, без мигания.\n * Возвращает функцию отмены: после неё устаревший результат в `target` не попадёт.\n */\nexport function mountFormula(\n target: HTMLElement,\n latex: string,\n { display, renderer, onSettled }: MountFormulaOptions,\n): () => void {\n const source = latex.trim();\n\n if (source === '') {\n target.replaceChildren();\n target.setAttribute('data-state', 'empty');\n\n return () => undefined;\n }\n\n if (!renderer) {\n target.textContent = latex;\n target.setAttribute('data-state', 'source');\n\n return () => undefined;\n }\n\n const key = `${display ? 'd' : 'i'}:${latex}`;\n const cache = cacheOf(renderer);\n const cached = cache.get(key);\n\n if (cached) {\n target.replaceChildren(...cached.map((node) => node.cloneNode(true)));\n target.setAttribute('data-state', 'ready');\n onSettled?.('ready');\n\n return () => undefined;\n }\n\n let cancelled = false;\n\n target.textContent = latex;\n target.setAttribute('data-state', 'loading');\n\n const scratch = globalThis.document.createElement('span');\n\n void (async () => {\n try {\n await renderer(latex, scratch, { display });\n\n if (cancelled) return;\n\n const nodes = [...scratch.childNodes];\n\n if (cache.size >= MAX_CACHE) cache.delete(cache.keys().next().value as string);\n\n cache.set(\n key,\n nodes.map((node) => node.cloneNode(true)),\n );\n target.replaceChildren(...nodes);\n target.setAttribute('data-state', 'ready');\n onSettled?.('ready');\n } catch (error) {\n if (cancelled) return;\n\n target.textContent = latex;\n target.setAttribute('data-state', 'error');\n onSettled?.('error', error instanceof Error ? error.message : String(error));\n }\n })();\n\n return () => {\n cancelled = true;\n };\n}\n","import type { SlashMenuItem } from './types';\n\nfunction score(item: SlashMenuItem, query: string): number {\n const title = item.title.toLowerCase();\n const words = [\n title,\n ...title.split(/\\s+/),\n ...(item.keywords ?? []).map((k) => k.toLowerCase()),\n item.id.toLowerCase(),\n ];\n\n if (title.startsWith(query)) return 4;\n if (words.some((w) => w.startsWith(query))) return 3;\n if (words.some((w) => w.includes(query))) return 1;\n\n return 0;\n}\n\nexport function filterSlashItems(items: readonly SlashMenuItem[], query: string): SlashMenuItem[] {\n const q = query.trim().toLowerCase();\n\n if (q === '') return [...items];\n\n return items\n .map((item, index) => ({ item, index, score: score(item, q) }))\n .filter((entry) => entry.score > 0)\n .sort((a, b) => b.score - a.score || a.index - b.index)\n .map((entry) => entry.item);\n}\n","import { flushSync } from 'react-dom';\n\nimport type { BlockProps } from '@inkbrick/document';\nimport type { CaretResult, Editor } from '@inkbrick/engine';\n\nimport type { EditorView } from '../editing/EditorView';\nimport { readDocSelection } from '../editing/selection';\nimport type { SlashMenuItem } from './types';\n\n/**\n * Применяет пункт меню: удаляет «/запрос» и превращает блок в выбранный тип —\n * одним шагом undo. Если превращение невозможно, текст остаётся нетронутым.\n */\nexport function applySlashItem(editor: Editor, view: EditorView, item: SlashMenuItem): void {\n const state = view.slash.getState();\n\n if (!state.open || !state.blockId) return;\n\n const { blockId, slashOffset } = state;\n const root = view.getRoot();\n const selection = root ? readDocSelection(root) : null;\n const end =\n selection?.collapsed && selection.from.blockId === blockId\n ? selection.from.offset\n : slashOffset + 1 + state.query.length;\n\n view.slash.close();\n\n let caret: CaretResult | undefined;\n\n try {\n flushSync(() => {\n caret = editor.batch(() => {\n editor.dispatch({ type: 'deleteText', payload: { blockId, from: slashOffset, to: end } });\n\n const result = editor.dispatch({\n type: 'convertBlock',\n payload: {\n blockId,\n flavour: item.flavour,\n props: item.props as BlockProps | undefined,\n offset: slashOffset,\n },\n }) as CaretResult | undefined;\n\n if (!result) throw new Error('convert-failed');\n\n return result;\n });\n });\n } catch (error) {\n if (!(error instanceof Error) || error.message !== 'convert-failed') throw error;\n return;\n }\n\n if (caret) view.placeCaret(caret.blockId, caret.offset);\n}\n","export interface DocPoint {\n blockId: string;\n offset: number;\n}\n\nexport interface DocSelection {\n from: DocPoint;\n to: DocPoint;\n collapsed: boolean;\n}\n\nconst EDITABLE = '.editable[data-id]';\n/** Блоки без текста (картинка, разделитель, неизвестный блок) — нередактируемые «острова» со своим id. */\nconst ISLAND = '[data-block-id][contenteditable=\"false\"]';\n\nexport function getOffsetIn(editable: HTMLElement, node: Node, offset: number): number {\n const range = globalThis.document.createRange();\n\n range.selectNodeContents(editable);\n range.setEnd(node, offset);\n\n return range.toString().length;\n}\n\nfunction editableOf(node: Node): HTMLElement | null {\n const element = node.nodeType === Node.ELEMENT_NODE ? (node as Element) : node.parentElement;\n\n return element?.closest<HTMLElement>(EDITABLE) ?? null;\n}\n\nfunction textLength(editable: HTMLElement): number {\n return editable.textContent?.length ?? 0;\n}\n\nfunction leafPoint(el: HTMLElement, where: 'start' | 'end'): DocPoint {\n return el.matches(ISLAND)\n ? { blockId: el.getAttribute('data-block-id')!, offset: 0 }\n : { blockId: el.dataset.id!, offset: where === 'start' ? 0 : textLength(el) };\n}\n\n/**\n * Точка вне текстовых блоков (на контейнере, у маркера списка и т.п.) переводится\n * в ближайшую позицию текста: вперёд — в начало следующего блока, назад — в конец предыдущего.\n */\nfunction resolveContainerPoint(\n root: HTMLElement,\n node: Node,\n offset: number,\n bias: 'forward' | 'backward',\n includeIslands: boolean,\n): DocPoint | null {\n /*\n * Граница непустого выделения может приходиться на блок без текста: иначе картинку или разделитель\n * в начале/конце документа нельзя было бы выделить, скопировать и удалить. Курсор (свёрнутое выделение) —\n * всегда в текст.\n */\n const editables = [\n ...root.querySelectorAll<HTMLElement>(includeIslands ? `${EDITABLE}, ${ISLAND}` : EDITABLE),\n ];\n\n if (editables.length === 0) return null;\n\n const probe = globalThis.document.createRange();\n probe.setStart(node, offset);\n probe.collapse(true);\n\n let previous: HTMLElement | null = null;\n\n for (const editable of editables) {\n if (probe.comparePoint(editable, 0) >= 0) {\n if (bias === 'forward') return leafPoint(editable, 'start');\n break;\n }\n\n previous = editable;\n }\n\n if (bias === 'backward')\n return previous ? leafPoint(previous, 'end') : leafPoint(editables[0], 'start');\n\n return leafPoint(editables[editables.length - 1], 'end');\n}\n\nfunction resolvePoint(\n root: HTMLElement,\n node: Node,\n offset: number,\n bias: 'forward' | 'backward',\n includeIslands: boolean,\n): DocPoint | null {\n const editable = editableOf(node);\n\n if (editable && root.contains(editable)) {\n return { blockId: editable.dataset.id!, offset: getOffsetIn(editable, node, offset) };\n }\n\n return resolveContainerPoint(root, node, offset, bias, includeIslands);\n}\n\nexport function readDocSelection(root: HTMLElement): DocSelection | null {\n const selection = globalThis.getSelection();\n\n if (!selection || selection.rangeCount === 0) return null;\n\n const range = selection.getRangeAt(0);\n\n if (!root.contains(range.commonAncestorContainer)) return null;\n\n const from = resolvePoint(\n root,\n range.startContainer,\n range.startOffset,\n 'forward',\n !range.collapsed,\n );\n let to = range.collapsed\n ? from\n : resolvePoint(root, range.endContainer, range.endOffset, 'backward', true);\n\n if (!from || !to) return null;\n\n // Выделение «всего документа» (Ctrl+A) включает и крайние блоки без текста.\n const remembered = fullSelections.get(root);\n\n if (remembered && !range.collapsed && sameRange(remembered, range)) {\n const leaves = root.querySelectorAll<HTMLElement>(`${EDITABLE}, ${ISLAND}`);\n\n return {\n from: leafPoint(leaves[0], 'start'),\n to: leafPoint(leaves[leaves.length - 1], 'end'),\n collapsed: false,\n };\n }\n\n // Выделение целиком вне текста могло «вывернуться» (from позже to) — считаем его курсором.\n if (\n from.blockId === to.blockId ? from.offset > to.offset : isAfter(root, from.blockId, to.blockId)\n ) {\n to = from;\n }\n\n return {\n from,\n to,\n collapsed: from.blockId === to.blockId && from.offset === to.offset,\n };\n}\n\nfunction isAfter(root: HTMLElement, a: string, b: string): boolean {\n const elementA = root.querySelector(`.editable[data-id=\"${CSS.escape(a)}\"]`);\n const elementB = root.querySelector(`.editable[data-id=\"${CSS.escape(b)}\"]`);\n\n if (!elementA || !elementB) return false;\n\n return !!(elementA.compareDocumentPosition(elementB) & Node.DOCUMENT_POSITION_PRECEDING);\n}\n\nfunction outsideFormula(node: Node, offset: number): { node: Node; offset: number } {\n const host = node.parentElement?.closest('[data-inkbrick-formula]');\n const parent = host?.parentNode;\n\n if (!host || !parent) return { node, offset };\n\n const index = Array.prototype.indexOf.call(parent.childNodes, host) as number;\n\n return { node: parent, offset: offset === 0 ? index : index + 1 };\n}\n\nfunction findPoint(editable: HTMLElement, offset: number): { node: Node; offset: number } | null {\n const walker = globalThis.document.createTreeWalker(editable, NodeFilter.SHOW_TEXT);\n\n let remaining = offset;\n let node = walker.nextNode();\n\n while (node) {\n const length = node.textContent?.length ?? 0;\n\n if (remaining <= length) {\n return outsideFormula(node, remaining);\n }\n\n remaining -= length;\n node = walker.nextNode();\n }\n\n return null;\n}\n\n/**\n * Выделения, которые установил `selectAllText` (по одному на корень). Пока выделение браузера совпадает с запомненным,\n * оно считается выделением всего документа — вместе с блоками без текста в начале и в конце, которые\n * DOM-выделением не охватить: браузер сводит концы выделения к допустимым позициям каретки.\n */\nconst fullSelections = new WeakMap<HTMLElement, Range>();\n\nfunction sameRange(a: Range, b: Range): boolean {\n return (\n a.startContainer === b.startContainer &&\n a.startOffset === b.startOffset &&\n a.endContainer === b.endContainer &&\n a.endOffset === b.endOffset\n );\n}\n\n/**\n * Выделяет весь документ (Ctrl/Cmd+A), включая блоки без текста. Нативный Ctrl+A схлопывается в каретку,\n * если документ начинается с нередактируемого элемента (значок callout, маркер списка), поэтому выделение\n * строим сами. false — в документе нечего выделять.\n */\nexport function selectAllText(root: HTMLElement): boolean {\n const editables = root.querySelectorAll<HTMLElement>(EDITABLE);\n\n if (editables.length === 0) {\n if (!root.querySelector(ISLAND)) return false;\n\n const selection = globalThis.getSelection();\n const range = globalThis.document.createRange();\n\n range.selectNodeContents(root);\n selection?.removeAllRanges();\n selection?.addRange(range);\n return true;\n }\n\n setDomSelection(\n editables[0],\n 0,\n editables[editables.length - 1],\n textLength(editables[editables.length - 1]),\n );\n\n const selection = globalThis.getSelection();\n\n if (selection && selection.rangeCount > 0)\n fullSelections.set(root, selection.getRangeAt(0).cloneRange());\n\n return true;\n}\n\nexport function setDomSelection(\n start: HTMLElement,\n startOffset: number,\n end: HTMLElement = start,\n endOffset: number = startOffset,\n): void {\n const selection = globalThis.getSelection();\n\n if (!selection) return;\n\n const range = globalThis.document.createRange();\n const from = findPoint(start, startOffset);\n const to = start === end && startOffset === endOffset ? from : findPoint(end, endOffset);\n\n if (from) range.setStart(from.node, from.offset);\n else range.setStart(start, 0);\n\n if (to) range.setEnd(to.node, to.offset);\n else range.setEnd(end, 0);\n\n selection.removeAllRanges();\n selection.addRange(range);\n}\n","import type { Editor } from '@inkbrick/engine';\n\nimport { filterSlashItems } from './filter';\nimport type { SlashMenuItem } from './types';\n\nexport function availableSlashItems(\n editor: Editor,\n items: readonly SlashMenuItem[],\n blockId: string,\n): SlashMenuItem[] {\n const block = editor.store.getBlock(blockId);\n const parent = block?.parentId ? editor.store.getBlock(block.parentId) : undefined;\n\n if (!block || !parent) return [];\n\n return items.filter(\n (item) =>\n editor.schema.hasBlock(item.flavour) &&\n editor.schema.validateRelation(parent.flavour, item.flavour),\n );\n}\n\nexport function visibleSlashItems(\n editor: Editor,\n items: readonly SlashMenuItem[],\n blockId: string,\n query: string,\n): SlashMenuItem[] {\n return filterSlashItems(availableSlashItems(editor, items, blockId), query);\n}\n","import { flushSync } from 'react-dom';\n\nimport { normalizeLinkUrl } from '@inkbrick/document';\nimport type { Editor } from '@inkbrick/engine';\n\nimport type { EditorView } from '../editing/EditorView';\nimport type { DocSelection } from '../editing/selection';\n\nconst isSingleBlock = (selection: DocSelection) => selection.from.blockId === selection.to.blockId;\n\nexport function isFormattable(editor: Editor, selection: DocSelection): boolean {\n return !(\n isSingleBlock(selection) &&\n editor.store.getBlock(selection.from.blockId)?.flavour === 'block:code'\n );\n}\n\nexport function toggleFormatInSelection(\n editor: Editor,\n view: EditorView,\n selection: DocSelection,\n format: string,\n): void {\n if (selection.collapsed || !isFormattable(editor, selection)) return;\n\n flushSync(() => {\n if (isSingleBlock(selection)) {\n editor.dispatch({\n type: 'toggleFormat',\n payload: {\n blockId: selection.from.blockId,\n from: selection.from.offset,\n to: selection.to.offset,\n format,\n },\n });\n } else {\n editor.dispatch({\n type: 'toggleFormatRange',\n payload: { from: selection.from, to: selection.to, format },\n });\n }\n });\n\n view.placeSelection(selection.from, selection.to);\n}\n\n/**\n * Ставит или снимает ссылку на выделении. Ввод нормализуется («example.com» → https://example.com);\n * null или пустая строка снимают ссылку. Возвращает false, если адрес небезопасен — документ не меняется.\n */\nexport function setLinkInSelection(\n editor: Editor,\n view: EditorView,\n selection: DocSelection,\n input: string | null,\n): boolean {\n if (selection.collapsed || !isFormattable(editor, selection)) return false;\n\n const remove = input === null || input.trim() === '';\n const link = remove ? undefined : (normalizeLinkUrl(input) ?? null);\n\n if (link === null) return false;\n\n flushSync(() => {\n editor.dispatch({\n type: 'setInlineAttributes',\n payload: { from: selection.from, to: selection.to, attributes: { link } },\n });\n });\n\n view.placeSelection(selection.from, selection.to);\n\n return true;\n}\n","import type { Editor } from '@inkbrick/engine';\n\nimport type { EditorView } from '../editing/EditorView';\nimport { readDocSelection } from '../editing/selection';\nimport { isFormattable } from './formatting';\n\nexport function syncToolbar(editor: Editor, view: EditorView): void {\n const state = view.toolbar.getState();\n\n if (state.linkOpen) return;\n\n const root = view.getRoot();\n const selection = root ? readDocSelection(root) : null;\n const native = globalThis.getSelection();\n\n if (\n view.pointerDown ||\n !selection ||\n selection.collapsed ||\n !isFormattable(editor, selection) ||\n !native ||\n native.rangeCount === 0\n ) {\n view.toolbar.hide();\n return;\n }\n\n const rect = native.getRangeAt(0).getBoundingClientRect();\n\n if (rect.width === 0 && rect.height === 0) {\n view.toolbar.hide();\n return;\n }\n\n view.toolbar.show(selection, editor.formatsAt(selection.from, selection.to), {\n x: rect.left + rect.width / 2,\n y: rect.top,\n });\n}\n","import { flushSync } from 'react-dom';\n\nimport { FORMULA_CHAR, MAX_FORMULA_LENGTH } from '@inkbrick/document';\nimport type { Editor } from '@inkbrick/engine';\n\nimport type { EditorView } from '../editing/EditorView';\nimport { getOffsetIn, readDocSelection } from '../editing/selection';\nimport { isFormattable } from '../toolbar/formatting';\nimport type { FormulaEditorState } from './FormulaController';\n\nfunction anchorOf(rect: DOMRect, fallback: Element | null) {\n const box =\n rect.width === 0 && rect.height === 0 && fallback ? fallback.getBoundingClientRect() : rect;\n\n return { x: box.left + box.width / 2, y: box.bottom, top: box.top };\n}\n\nfunction selectedLatex(editor: Editor, blockId: string, from: number, to: number): string {\n const block = editor.store.getBlock(blockId);\n\n if (!block || from === to) return '';\n\n const text = block.content.map((node) => node.insert).join('');\n\n return text.slice(from, to).split(FORMULA_CHAR).join('').trim();\n}\n\n/**\n * Открывает окошко вставки встроенной формулы на месте выделения (курсора). Выделенный текст становится\n * заготовкой кода. Возвращает false, если вставлять некуда: выделение вне редактора, из нескольких блоков или в коде.\n */\nexport function openInlineFormula(editor: Editor, view: EditorView): boolean {\n const root = view.getRoot();\n const selection = root ? readDocSelection(root) : null;\n\n if (!selection || selection.from.blockId !== selection.to.blockId) return false;\n\n if (!isFormattable(editor, selection)) return false;\n\n const block = editor.store.getBlock(selection.from.blockId);\n\n if (!block || editor.schema.getBlockSchema(block.flavour)?.inline === false) return false;\n\n const native = globalThis.getSelection();\n const rect =\n native && native.rangeCount > 0 ? native.getRangeAt(0).getBoundingClientRect() : new DOMRect();\n const { blockId } = selection.from;\n\n view.toolbar.hide();\n view.formula.open({\n mode: 'insert',\n blockId,\n from: selection.from.offset,\n to: selection.to.offset,\n latex: selectedLatex(editor, blockId, selection.from.offset, selection.to.offset),\n position: anchorOf(rect, view.getElement(blockId) ?? null),\n });\n\n return true;\n}\n\nexport function openFormulaAt(view: EditorView, host: Element): boolean {\n const editable = host.closest<HTMLElement>('.editable[data-id]');\n const blockId = editable?.dataset.id;\n\n if (!editable || !blockId) return false;\n\n const offset = getOffsetIn(editable, host, 0);\n\n view.toolbar.hide();\n view.formula.open({\n mode: 'edit',\n blockId,\n from: offset,\n to: offset + 1,\n latex: host.getAttribute('data-latex') ?? '',\n position: anchorOf(host.getBoundingClientRect(), editable),\n });\n\n return true;\n}\n\n/**\n * Применяет результат окошка: вставляет формулу, меняет код существующей или (пустой код при правке) удаляет её.\n * Курсор ставится сразу после формулы. Возвращает false, если команда отклонена (пустой код при вставке, слишком\n * длинная формула).\n */\nexport function applyInlineFormula(\n editor: Editor,\n view: EditorView,\n state: FormulaEditorState,\n latex: string,\n): boolean {\n const code = latex.trim();\n const { blockId, from, to } = state;\n\n if (code.length > MAX_FORMULA_LENGTH) return false;\n\n if (state.mode === 'insert' && code === '') return false;\n\n flushSync(() => {\n if (state.mode === 'insert') {\n editor.dispatch({ type: 'insertFormula', payload: { blockId, from, to, latex: code } });\n } else if (code === '') {\n editor.dispatch({ type: 'deleteText', payload: { blockId, from, to } });\n } else {\n editor.dispatch({\n type: 'setInlineAttributes',\n payload: {\n from: { blockId, offset: from },\n to: { blockId, offset: to },\n attributes: { formula: code },\n },\n });\n }\n });\n\n view.placeCaret(blockId, state.mode === 'edit' && code === '' ? from : Math.min(from, to) + 1);\n\n return true;\n}\n\n/**\n * Markdown-шорткат: при вводе закрывающего `$` проверяет, не набрано ли `$код$`. Код не должен быть пустым и\n * не должен начинаться или кончаться пробелом (так «$5 и $6» остаётся ценой, а не формулой).\n * `before` — текст блока до курсора; возвращает начало `$` и код формулы.\n */\nexport function matchInlineFormula(before: string): { from: number; latex: string } | null {\n const start = before.lastIndexOf('$');\n\n if (start < 0 || before[start - 1] === '\\\\') return null;\n\n const latex = before.slice(start + 1);\n\n if (latex === '' || /^\\s|\\s$/.test(latex) || latex.includes(FORMULA_CHAR)) return null;\n\n return { from: start, latex };\n}\n","import { flushSync } from 'react-dom';\n\nimport type { Alignment } from '@inkbrick/document';\nimport type { Editor } from '@inkbrick/engine';\n\nimport type { EditorView } from '../editing/EditorView';\nimport type { DocSelection } from '../editing/selection';\nimport { isFormattable } from './formatting';\n\n/**\n * Ставит или снимает цвет текста (`color`) или подсветки (`backgroundColor`) на выделении. Значение — имя цвета\n * палитры; `null` снимает цвет. Возвращает false, если применять не к чему (свёрнутое выделение, код).\n */\nexport function setColorInSelection(\n editor: Editor,\n view: EditorView,\n selection: DocSelection,\n kind: 'color' | 'backgroundColor',\n value: string | null,\n): boolean {\n if (selection.collapsed || !isFormattable(editor, selection)) return false;\n\n const payload = {\n from: selection.from,\n to: selection.to,\n attributes: { [kind]: value ?? undefined },\n };\n\n if (!editor.can('setInlineAttributes', payload)) return false;\n\n flushSync(() => {\n editor.dispatch({ type: 'setInlineAttributes', payload });\n });\n\n view.placeSelection(selection.from, selection.to);\n\n return true;\n}\n\nexport function setAlignInSelection(\n editor: Editor,\n view: EditorView,\n selection: DocSelection,\n align: Alignment,\n): boolean {\n if (!editor.can('setAlign', { from: selection.from, to: selection.to, align })) return false;\n\n flushSync(() => {\n editor.dispatch({\n type: 'setAlign',\n payload: { from: selection.from, to: selection.to, align },\n });\n });\n\n view.placeSelection(selection.from, selection.to);\n\n return true;\n}\n","import type { CaretResult, Editor } from '@inkbrick/engine';\n\n/**\n * Delete в конце блока: склеивает следующий блок с этим. Перед блоком без текста (картинка, разделитель)\n * ничего не делает — так его не удалить случайно.\n */\nexport function deleteForwardAtEnd(editor: Editor, blockId: string): CaretResult | undefined {\n const next = editor.document.getNextSibling(blockId);\n\n if (!next || editor.schema.getBlockSchema(next.flavour)?.inline === false) return undefined;\n\n return editor.dispatch({\n type: 'deleteBackward',\n payload: { blockId: next.id, offset: 0 },\n }) as CaretResult | undefined;\n}\n","import type { CaretResult } from '@inkbrick/engine';\nimport type { Alignment } from '@inkbrick/document';\n\nimport { applySlashItem } from '../slash/applySlashItem';\nimport { visibleSlashItems } from '../slash/items';\nimport { isFormattable } from '../toolbar/formatting';\nimport { syncToolbar } from '../toolbar/syncToolbar';\nimport { selectAllText } from '../editing/selection';\nimport { openInlineFormula } from '../formula/actions';\nimport { setAlignInSelection } from '../toolbar/rich';\nimport { deleteForwardAtEnd } from '../editing/deleteAtBoundary';\nimport type { KeyBinding, KeymapContext } from './types';\n\nconst caretAtEdge =\n (edge: 'start' | 'end') =>\n ({ editor, event, selection }: KeymapContext): boolean => {\n const current = selection();\n\n if (event.isComposing || !current?.collapsed) return false;\n if (edge === 'start') return current.from.offset === 0;\n\n const block = editor.store.getBlock(current.from.blockId);\n\n return !!block && current.from.offset === editor.engine.inline.length(block.content);\n };\n\nconst slashOpen = ({ view }: KeymapContext) => {\n const state = view.slash.getState();\n\n return state.open && state.blockId !== null;\n};\n\nfunction visibleItems({ editor, view, slashItems }: KeymapContext) {\n const state = view.slash.getState();\n\n return visibleSlashItems(editor, slashItems, state.blockId!, state.query);\n}\n\nconst slashMove = (direction: 1 | -1) => (context: KeymapContext) => {\n const visible = visibleItems(context);\n\n if (visible.length === 0) return false;\n\n context.view.slash.move(direction, visible.length);\n};\n\nfunction indent(context: KeymapContext) {\n const { editor, event } = context;\n const selection = context.selection();\n\n if (!selection || selection.from.blockId !== selection.to.blockId) return;\n\n const block = editor.store.getBlock(selection.from.blockId);\n\n if (!block) return;\n\n if (block.flavour === 'block:code') {\n if (!event.shiftKey) context.run(() => context.replaceSelection(selection, ' '));\n return;\n }\n\n context.run(() => {\n context.exec({\n type: event.shiftKey ? 'outdentBlock' : 'indentBlock',\n payload: { blockId: block.id },\n });\n\n return { blockId: block.id, offset: selection.from.offset };\n });\n}\n\nconst toggle = (format: string) => (context: KeymapContext) => context.toggleFormat(format);\n\nconst align = (value: Alignment) => (context: KeymapContext) => {\n const selection = context.selection();\n\n if (!selection || !setAlignInSelection(context.editor, context.view, selection, value))\n return false;\n};\n\n/**\n * Стандартные привязки редактора, в порядке проверки. Свои привязки передаются в `<EditorProvider keymap>`:\n * тот же `id` заменяет стандартную, новый `id` проверяется раньше стандартных.\n */\nexport const defaultKeymap: readonly KeyBinding[] = [\n {\n id: 'slash.next',\n keys: ['ArrowDown', 'Shift-ArrowDown'],\n when: slashOpen,\n run: slashMove(1),\n },\n {\n id: 'slash.previous',\n keys: ['ArrowUp', 'Shift-ArrowUp'],\n when: slashOpen,\n run: slashMove(-1),\n },\n {\n id: 'slash.accept',\n keys: ['Enter', 'Shift-Enter', 'Tab', 'Shift-Tab'],\n when: slashOpen,\n run: (context) => {\n const state = context.view.slash.getState();\n const visible = visibleItems(context);\n const item = visible[Math.min(state.activeIndex, visible.length - 1)];\n\n if (item) {\n applySlashItem(context.editor, context.view, item);\n return;\n }\n\n // Подходящих пунктов нет: меню закрывается, клавиша работает как обычно (например, Tab-отступ).\n context.view.slash.close();\n\n return false;\n },\n },\n {\n id: 'slash.close',\n keys: ['Escape', 'Shift-Escape'],\n when: slashOpen,\n run: ({ view }) => view.slash.close(),\n },\n\n // Выделить всё: нативное поведение ненадёжно для документа, начинающегося с нередактируемого блока.\n { id: 'selectAll', keys: 'Mod-a', run: ({ root }) => selectAllText(root) },\n { id: 'undo', keys: 'Mod-z', run: (context) => context.undo() },\n { id: 'redo', keys: ['Mod-Shift-z', 'Mod-y'], run: (context) => context.redo() },\n {\n id: 'link',\n keys: 'Mod-k',\n run: (context) => {\n const selection = context.selection();\n\n if (!selection || selection.collapsed || !isFormattable(context.editor, selection)) {\n return false;\n }\n\n syncToolbar(context.editor, context.view);\n context.view.toolbar.openLink();\n },\n },\n\n { id: 'format.bold', keys: 'Mod-b', run: toggle('bold') },\n { id: 'format.italic', keys: 'Mod-i', run: toggle('italic') },\n { id: 'format.underline', keys: 'Mod-u', run: toggle('underline') },\n { id: 'format.code', keys: 'Mod-e', run: toggle('code') },\n { id: 'format.strike', keys: 'Mod-Shift-x', run: toggle('strike') },\n\n { id: 'align.left', keys: 'Mod-Shift-l', run: align('left') },\n { id: 'align.center', keys: 'Mod-Shift-e', run: align('center') },\n { id: 'align.right', keys: 'Mod-Shift-r', run: align('right') },\n { id: 'align.justify', keys: 'Mod-Shift-j', run: align('justify') },\n\n {\n id: 'formula.inline',\n keys: 'Mod-Shift-m',\n run: ({ editor, view }) => openInlineFormula(editor, view),\n },\n\n { id: 'indent', keys: ['Tab', 'Shift-Tab'], run: indent },\n\n /*\n * Backspace в начале и Delete в конце блока обрабатываются уже на keydown: Safari не присылает beforeinput,\n * если сам считает, что удалять нечего (пустой блок, соседний блок без текста), и клавиша бы не сработала.\n */\n {\n id: 'delete.blockStart',\n keys: 'Backspace',\n when: caretAtEdge('start'),\n run: (context) => {\n const { blockId } = context.selection()!.from;\n\n context.run(() =>\n context.exec<CaretResult>({ type: 'deleteBackward', payload: { blockId, offset: 0 } }),\n );\n },\n },\n {\n id: 'delete.blockEnd',\n keys: 'Delete',\n when: caretAtEdge('end'),\n run: (context) => {\n const { blockId } = context.selection()!.from;\n\n context.run(() => deleteForwardAtEnd(context.editor, blockId));\n },\n },\n];\n","// Файл сгенерирован из иконок Lucide (https://lucide.dev, лицензия ISC — см. ICONS_LICENSE.md). Не правьте вручную.\nexport type IconShape = readonly [tag: string, attributes: Readonly<Record<string, string>>];\n\nexport const ICON_SHAPES = {\n bold: [['path', { d: 'M6 12h9a4 4 0 010 8H7a1 1 0 01-1-1V5a1 1 0 011-1h7a4 4 0 010 8' }]],\n italic: [\n ['line', { x1: '19', x2: '10', y1: '4', y2: '4' }],\n ['line', { x1: '14', x2: '5', y1: '20', y2: '20' }],\n ['line', { x1: '15', x2: '9', y1: '4', y2: '20' }],\n ],\n underline: [\n ['path', { d: 'M6 4v6a6 6 0 0 0 12 0V4' }],\n ['line', { x1: '4', x2: '20', y1: '20', y2: '20' }],\n ],\n strike: [\n ['path', { d: 'M16 4H9a3 3 0 0 0-2.83 4' }],\n ['path', { d: 'M14 12a4 4 0 0 1 0 8H6' }],\n ['line', { x1: '4', x2: '20', y1: '12', y2: '12' }],\n ],\n code: [\n ['path', { d: 'm18 16 4-4-4-4' }],\n ['path', { d: 'm6 8-4 4 4 4' }],\n ['path', { d: 'm14.5 4-5 16' }],\n ],\n link: [\n ['path', { d: 'M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71' }],\n ['path', { d: 'M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71' }],\n ],\n unlink: [\n [\n 'path',\n {\n d: 'm18.84 12.25 1.72-1.71h-.02a5.004 5.004 0 0 0-.12-7.07 5.006 5.006 0 0 0-6.95 0l-1.72 1.71',\n },\n ],\n [\n 'path',\n { d: 'm5.17 11.75-1.71 1.71a5.004 5.004 0 0 0 .12 7.07 5.006 5.006 0 0 0 6.95 0l1.71-1.71' },\n ],\n ['line', { x1: '8', x2: '8', y1: '2', y2: '5' }],\n ['line', { x1: '2', x2: '5', y1: '8', y2: '8' }],\n ['line', { x1: '16', x2: '16', y1: '19', y2: '22' }],\n ['line', { x1: '19', x2: '22', y1: '16', y2: '16' }],\n ],\n check: [['path', { d: 'M20 6 9 17l-5-5' }]],\n x: [\n ['path', { d: 'M18 6 6 18' }],\n ['path', { d: 'm6 6 12 12' }],\n ],\n plus: [\n ['path', { d: 'M5 12h14' }],\n ['path', { d: 'M12 5v14' }],\n ],\n grip: [\n ['circle', { cx: '9', cy: '12', r: '1' }],\n ['circle', { cx: '9', cy: '5', r: '1' }],\n ['circle', { cx: '9', cy: '19', r: '1' }],\n ['circle', { cx: '15', cy: '12', r: '1' }],\n ['circle', { cx: '15', cy: '5', r: '1' }],\n ['circle', { cx: '15', cy: '19', r: '1' }],\n ],\n trash: [\n ['path', { d: 'M10 11v6' }],\n ['path', { d: 'M14 11v6' }],\n ['path', { d: 'M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6' }],\n ['path', { d: 'M3 6h18' }],\n ['path', { d: 'M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2' }],\n ],\n copy: [\n ['rect', { width: '14', height: '14', x: '8', y: '8', rx: '2', ry: '2' }],\n ['path', { d: 'M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2' }],\n ],\n 'arrow-up': [\n ['path', { d: 'm5 12 7-7 7 7' }],\n ['path', { d: 'M12 19V5' }],\n ],\n 'arrow-down': [\n ['path', { d: 'M12 5v14' }],\n ['path', { d: 'm19 12-7 7-7-7' }],\n ],\n 'chevron-down': [['path', { d: 'm6 9 6 6 6-6' }]],\n text: [\n ['path', { d: 'M13 4v16' }],\n ['path', { d: 'M17 4v16' }],\n ['path', { d: 'M19 4H9.5a4.5 4.5 0 0 0 0 9H13' }],\n ],\n 'heading-1': [\n ['path', { d: 'M4 12h8' }],\n ['path', { d: 'M4 18V6' }],\n ['path', { d: 'M12 18V6' }],\n ['path', { d: 'm17 12 3-2v8' }],\n ],\n 'heading-2': [\n ['path', { d: 'M4 12h8' }],\n ['path', { d: 'M4 18V6' }],\n ['path', { d: 'M12 18V6' }],\n ['path', { d: 'M21 18h-4c0-4 4-3 4-6 0-1.5-2-2.5-4-1' }],\n ],\n 'heading-3': [\n ['path', { d: 'M4 12h8' }],\n ['path', { d: 'M4 18V6' }],\n ['path', { d: 'M12 18V6' }],\n ['path', { d: 'M17.5 10.5c1.7-1 3.5 0 3.5 1.5a2 2 0 0 1-2 2' }],\n ['path', { d: 'M17 17.5c2 1.5 4 .3 4-1.5a2 2 0 0 0-2-2' }],\n ],\n 'heading-4': [\n ['path', { d: 'M12 18V6' }],\n ['path', { d: 'M17 10v3a1 1 0 0 0 1 1h3' }],\n ['path', { d: 'M21 10v8' }],\n ['path', { d: 'M4 12h8' }],\n ['path', { d: 'M4 18V6' }],\n ],\n 'heading-5': [\n ['path', { d: 'M4 12h8' }],\n ['path', { d: 'M4 18V6' }],\n ['path', { d: 'M12 18V6' }],\n ['path', { d: 'M17 13v-3h4' }],\n ['path', { d: 'M17 17.7c.4.2.8.3 1.3.3 1.5 0 2.7-1.1 2.7-2.5S19.8 13 18.3 13H17' }],\n ],\n 'heading-6': [\n ['path', { d: 'M4 12h8' }],\n ['path', { d: 'M4 18V6' }],\n ['path', { d: 'M12 18V6' }],\n ['circle', { cx: '19', cy: '16', r: '2' }],\n ['path', { d: 'M20 10c-2 2-3 3.5-3 6' }],\n ],\n list: [\n ['path', { d: 'M3 5h.01' }],\n ['path', { d: 'M3 12h.01' }],\n ['path', { d: 'M3 19h.01' }],\n ['path', { d: 'M8 5h13' }],\n ['path', { d: 'M8 12h13' }],\n ['path', { d: 'M8 19h13' }],\n ],\n 'list-ordered': [\n ['path', { d: 'M11 5h10' }],\n ['path', { d: 'M11 12h10' }],\n ['path', { d: 'M11 19h10' }],\n ['path', { d: 'M4 4h1v5' }],\n ['path', { d: 'M4 9h2' }],\n ['path', { d: 'M6.5 20H3.4c0-1 2.6-1.925 2.6-3.5a1.5 1.5 0 0 0-2.6-1.02' }],\n ],\n 'list-todo': [\n ['path', { d: 'M13 5h8' }],\n ['path', { d: 'M13 12h8' }],\n ['path', { d: 'M13 19h8' }],\n ['path', { d: 'm3 17 2 2 4-4' }],\n ['path', { d: 'm3 7 2 2 4-4' }],\n ],\n quote: [\n ['path', { d: 'M17 5H3' }],\n ['path', { d: 'M21 12H8' }],\n ['path', { d: 'M21 19H8' }],\n ['path', { d: 'M3 12v7' }],\n ],\n divider: [['path', { d: 'M5 12h14' }]],\n info: [\n ['circle', { cx: '12', cy: '12', r: '10' }],\n ['path', { d: 'M12 16v-4' }],\n ['path', { d: 'M12 8h.01' }],\n ],\n warning: [\n ['path', { d: 'm21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3' }],\n ['path', { d: 'M12 9v4' }],\n ['path', { d: 'M12 17h.01' }],\n ],\n success: [\n ['circle', { cx: '12', cy: '12', r: '10' }],\n ['path', { d: 'm16 9-5.5 5.5L8 12' }],\n ],\n danger: [\n ['path', { d: 'm15 9-6 6' }],\n [\n 'path',\n {\n d: 'M2.586 16.726A2 2 0 0 1 2 15.312V8.688a2 2 0 0 1 .586-1.414l4.688-4.688A2 2 0 0 1 8.688 2h6.624a2 2 0 0 1 1.414.586l4.688 4.688A2 2 0 0 1 22 8.688v6.624a2 2 0 0 1-.586 1.414l-4.688 4.688a2 2 0 0 1-1.414.586H8.688a2 2 0 0 1-1.414-.586z',\n },\n ],\n ['path', { d: 'm9 9 6 6' }],\n ],\n image: [\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2', ry: '2' }],\n ['circle', { cx: '9', cy: '9', r: '2' }],\n ['path', { d: 'm21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21' }],\n ],\n replace: [\n ['path', { d: 'M14 4a1 1 0 0 1 1-1' }],\n ['path', { d: 'M15 10a1 1 0 0 1-1-1' }],\n ['path', { d: 'M21 4a1 1 0 0 0-1-1' }],\n ['path', { d: 'M21 9a1 1 0 0 1-1 1' }],\n ['path', { d: 'm3 7 3 3 3-3' }],\n ['path', { d: 'M6 10V5a2 2 0 0 1 2-2h2' }],\n ['rect', { x: '3', y: '14', width: '7', height: '7', rx: '1' }],\n ],\n 'align-left': [\n ['path', { d: 'M21 5H3' }],\n ['path', { d: 'M15 12H3' }],\n ['path', { d: 'M17 19H3' }],\n ],\n 'align-center': [\n ['path', { d: 'M21 5H3' }],\n ['path', { d: 'M17 12H7' }],\n ['path', { d: 'M19 19H5' }],\n ],\n 'align-right': [\n ['path', { d: 'M21 5H3' }],\n ['path', { d: 'M21 12H9' }],\n ['path', { d: 'M21 19H7' }],\n ],\n 'align-justify': [\n ['path', { d: 'M3 5h18' }],\n ['path', { d: 'M3 12h18' }],\n ['path', { d: 'M3 19h18' }],\n ],\n baseline: [\n ['path', { d: 'M4 20h16' }],\n ['path', { d: 'm6 16 6-12 6 12' }],\n ['path', { d: 'M8 12h8' }],\n ],\n highlighter: [\n ['path', { d: 'm9 11-6 6v3h9l3-3' }],\n ['path', { d: 'm22 12-4.6 4.6a2 2 0 0 1-2.8 0l-5.2-5.2a2 2 0 0 1 0-2.8L14 4' }],\n ],\n sigma: [\n [\n 'path',\n {\n d: 'M18 7V5a1 1 0 0 0-1-1H6.5a.5.5 0 0 0-.4.8l4.5 6a2 2 0 0 1 0 2.4l-4.5 6a.5.5 0 0 0 .4.8H17a1 1 0 0 0 1-1v-2',\n },\n ],\n ],\n} as const satisfies Record<string, readonly IconShape[]>;\n\nexport type IconName = keyof typeof ICON_SHAPES;\n","import type { SVGProps } from 'react';\n\nimport { ICON_SHAPES, type IconName } from './lucide';\n\nexport type { IconName };\n\nexport interface IconProps extends Omit<SVGProps<SVGSVGElement>, 'name' | 'children'> {\n readonly name: IconName;\n}\n\n/**\n * Иконка из набора Lucide (ISC). Рисуется текущим цветом текста; размер задаётся CSS (`--inkbrick-icon-size`\n * или `width`/`height` у `[data-inkbrick-icon]`). Годится и для пользовательских пунктов slash-меню и меню блока.\n */\nexport function Icon({ name, ...props }: IconProps) {\n const shapes = ICON_SHAPES[name];\n\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={16}\n height={16}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n data-inkbrick-icon={name}\n {...props}\n >\n {shapes.map(([tag, attributes], index) => {\n const Shape = tag as 'path';\n\n return <Shape key={index} {...attributes} />;\n })}\n </svg>\n );\n}\n","import { Icon } from '../icons/Icon';\nimport type { TFunction } from '../i18n/translate';\nimport type { MessageKey } from '../i18n/en';\nimport type { SlashMenuItem } from './types';\n\nexport const defaultSlashItems: readonly SlashMenuItem[] = Object.freeze([\n {\n id: 'text',\n title: 'Text',\n description: 'Plain paragraph',\n keywords: ['paragraph', 'p'],\n icon: <Icon name=\"text\" />,\n flavour: 'block:paragraph',\n },\n {\n id: 'heading-1',\n title: 'Heading 1',\n description: 'Large section heading',\n keywords: ['h1', 'title'],\n icon: <Icon name=\"heading-1\" />,\n flavour: 'block:heading',\n props: { level: 1 },\n },\n {\n id: 'heading-2',\n title: 'Heading 2',\n description: 'Medium section heading',\n keywords: ['h2', 'subtitle'],\n icon: <Icon name=\"heading-2\" />,\n flavour: 'block:heading',\n props: { level: 2 },\n },\n {\n id: 'heading-3',\n title: 'Heading 3',\n description: 'Small section heading',\n keywords: ['h3'],\n icon: <Icon name=\"heading-3\" />,\n flavour: 'block:heading',\n props: { level: 3 },\n },\n {\n id: 'heading-4',\n title: 'Heading 4',\n description: 'Subsection heading',\n keywords: ['h4'],\n icon: <Icon name=\"heading-4\" />,\n flavour: 'block:heading',\n props: { level: 4 },\n },\n {\n id: 'heading-5',\n title: 'Heading 5',\n description: 'Minor subsection heading',\n keywords: ['h5'],\n icon: <Icon name=\"heading-5\" />,\n flavour: 'block:heading',\n props: { level: 5 },\n },\n {\n id: 'heading-6',\n title: 'Heading 6',\n description: 'Smallest heading',\n keywords: ['h6'],\n icon: <Icon name=\"heading-6\" />,\n flavour: 'block:heading',\n props: { level: 6 },\n },\n {\n id: 'bullet-list',\n title: 'Bulleted list',\n description: 'Simple bulleted list',\n keywords: ['ul', 'unordered', 'list'],\n icon: <Icon name=\"list\" />,\n flavour: 'block:list',\n props: { type: 'bullet' },\n },\n {\n id: 'numbered-list',\n title: 'Numbered list',\n description: 'List with numbering',\n keywords: ['ol', 'ordered', 'list'],\n icon: <Icon name=\"list-ordered\" />,\n flavour: 'block:list',\n props: { type: 'ordered' },\n },\n {\n id: 'todo-list',\n title: 'To-do list',\n description: 'Track tasks with checkboxes',\n keywords: ['todo', 'task', 'checkbox', 'check'],\n icon: <Icon name=\"list-todo\" />,\n flavour: 'block:list',\n props: { type: 'todo', checked: false },\n },\n {\n id: 'quote',\n title: 'Quote',\n description: 'Capture a quote',\n keywords: ['blockquote', 'citation'],\n icon: <Icon name=\"quote\" />,\n flavour: 'block:quote',\n },\n {\n id: 'code',\n title: 'Code',\n description: 'Code snippet with monospace font',\n keywords: ['snippet', 'pre', 'program'],\n icon: <Icon name=\"code\" />,\n flavour: 'block:code',\n },\n {\n id: 'callout',\n title: 'Callout',\n description: 'Highlight important information',\n keywords: ['info', 'note', 'warning', 'tip', 'alert'],\n icon: <Icon name=\"info\" />,\n flavour: 'block:callout',\n },\n {\n id: 'image',\n title: 'Image',\n description: 'Upload or embed an image',\n keywords: ['picture', 'photo', 'img', 'upload'],\n icon: <Icon name=\"image\" />,\n flavour: 'block:image',\n },\n {\n id: 'formula',\n title: 'Formula',\n description: 'Display a LaTeX formula',\n keywords: ['math', 'equation', 'latex', 'tex'],\n icon: <Icon name=\"sigma\" />,\n flavour: 'block:formula',\n },\n {\n id: 'divider',\n title: 'Divider',\n description: 'Visually separate sections',\n keywords: ['hr', 'line', 'separator', 'rule'],\n icon: <Icon name=\"divider\" />,\n flavour: 'block:divider',\n },\n] satisfies SlashMenuItem[]);\n\nconst messageKey = (id: string, part: 'title' | 'description' | 'keywords') =>\n `slash.item.${id}.${part}` as MessageKey;\n\nconst splitKeywords = (value: string) =>\n value\n .split(',')\n .map((word) => word.trim())\n .filter(Boolean);\n\nexport function localizeSlashItems(t: TFunction): readonly SlashMenuItem[] {\n return defaultSlashItems.map((item) => ({\n ...item,\n title: t(messageKey(item.id, 'title')),\n description: t(messageKey(item.id, 'description')),\n // Английские слова остаются в поиске: «h1», «todo» и т. п. работают на любом языке.\n keywords: [\n ...new Set([...(item.keywords ?? []), ...splitKeywords(t(messageKey(item.id, 'keywords')))]),\n ],\n }));\n}\n\n/**\n * Итоговый список пунктов: `false` — меню выключено; массив — пункты приложения\n * дополняют стандартные (одинаковый id заменяет стандартный пункт).\n */\nexport function resolveSlashItems(\n custom: readonly SlashMenuItem[] | false | undefined,\n t?: TFunction,\n): readonly SlashMenuItem[] {\n if (custom === false) return [];\n\n const defaults = t ? localizeSlashItems(t) : defaultSlashItems;\n\n if (!custom || custom.length === 0) return defaults;\n\n const overrides = new Map(custom.map((item) => [item.id, item]));\n const merged = defaults.map((item) => overrides.get(item.id) ?? item);\n const extra = custom.filter((item) => !defaultSlashItems.some((d) => d.id === item.id));\n\n return [...merged, ...extra];\n}\n","import { createContext, useContext } from 'react';\n\nimport { highlightCode } from '../code/highlight';\nimport { temmlRenderer } from '../math/renderer';\nimport { defaultT } from '../i18n/translate';\nimport { defaultKeymap } from '../keymap/defaultKeymap';\nimport { defaultSlashItems } from '../slash/defaultSlashItems';\nimport type { EditorUIConfig } from './types';\n\nexport const EMPTY_UI_CONFIG: EditorUIConfig = Object.freeze({\n components: Object.freeze({}),\n slots: Object.freeze({}),\n slashItems: defaultSlashItems,\n keymap: defaultKeymap,\n highlighter: highlightCode,\n formulaRenderer: temmlRenderer,\n locale: 'en',\n t: defaultT,\n images: Object.freeze({}),\n});\n\nexport const EditorUIContext = createContext<EditorUIConfig>(EMPTY_UI_CONFIG);\n\nexport function useEditorUI(): EditorUIConfig {\n return useContext(EditorUIContext);\n}\n","import type { TFunction } from '../i18n/translate';\nimport { useEditorUI } from '../ui/EditorUIContext';\n\nexport function useT(): TFunction {\n return useEditorUI().t;\n}\n\nexport function useLocale(): string {\n return useEditorUI().locale;\n}\n","import { useLayoutEffect, useRef, type RefObject } from 'react';\n\n/** Метка места курсора в шаблоне: удаляется при вставке; выделенный текст подставляется на её место. */\nexport const CARET = '⌖';\n\nexport interface SnippetResult {\n readonly value: string;\n readonly caret: number;\n}\n\n/**\n * Вставляет шаблон в текст поля на место выделения `[start, end)`. Выделенный текст подставляется на место метки `⌖`\n * (так `x` + «√» даёт `\\sqrt{x}`), курсор встаёт на метку (после подставленного текста) или в конец шаблона.\n */\nexport function applySnippet(\n value: string,\n start: number,\n end: number,\n snippet: string,\n): SnippetResult {\n const from = Math.max(0, Math.min(start, end, value.length));\n const to = Math.max(from, Math.min(Math.max(start, end), value.length));\n const selected = value.slice(from, to);\n const marker = snippet.indexOf(CARET);\n const body = snippet.split(CARET).join('');\n\n if (marker < 0) {\n return { value: value.slice(0, from) + body + value.slice(to), caret: from + body.length };\n }\n\n const before = snippet.slice(0, marker).split(CARET).join('');\n const after = snippet\n .slice(marker + 1)\n .split(CARET)\n .join('');\n const inserted = before + selected + after;\n\n return {\n value: value.slice(0, from) + inserted + value.slice(to),\n caret: from + before.length + selected.length,\n };\n}\n\nexport function useSnippetInsert(\n field: RefObject<HTMLTextAreaElement | null>,\n value: string,\n setValue: (value: string) => void,\n) {\n const caret = useRef<number | null>(null);\n\n useLayoutEffect(() => {\n const element = field.current;\n\n if (caret.current === null || !element) return;\n\n element.setSelectionRange(caret.current, caret.current);\n caret.current = null;\n }, [field, value]);\n\n return (snippet: string) => {\n const element = field.current;\n const start = element?.selectionStart ?? value.length;\n const end = element?.selectionEnd ?? value.length;\n const result = applySnippet(value, start, end, snippet);\n\n caret.current = result.caret;\n setValue(result.value);\n element?.focus();\n };\n}\n"],"mappings":"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","names":["word","style","selection","flushSync","flushSync","flushSync","flushSync","flushSync","align","jsx"]}
|