@codeauradev/ngx-wind-editor 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,120 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="AutoImportSettings">
4
- <option name="autoReloadType" value="SELECTIVE" />
5
- </component>
6
- <component name="ChangeListManager">
7
- <list default="true" id="dddd179b-1b8b-4c78-9e6c-2af59aa46f63" name="Changes" comment="" />
8
- <option name="SHOW_DIALOG" value="false" />
9
- <option name="HIGHLIGHT_CONFLICTS" value="true" />
10
- <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
11
- <option name="LAST_RESOLUTION" value="IGNORE" />
12
- </component>
13
- <component name="EmbeddingIndexingInfo">
14
- <option name="cachedIndexableFilesCount" value="14" />
15
- </component>
16
- <component name="McpProjectServerCommands">
17
- <commands />
18
- <urls />
19
- </component>
20
- <component name="NextEditCompletionFeaturesState">
21
- <decayedCancelled>
22
- <entry key="MS100" value="1.0001115886368703" />
23
- <entry key="MS500" value="1.1948794499459696" />
24
- <entry key="S2" value="2.1869433799188776" />
25
- <entry key="S5" value="2.9825256379321456" />
26
- <entry key="S10" value="3.41812528727204" />
27
- <entry key="S30" value="3.786387362660663" />
28
- <entry key="S60" value="3.8904843964087816" />
29
- <entry key="M2" value="3.9445442044642562" />
30
- <entry key="M5" value="3.977647438695401" />
31
- <entry key="M10" value="3.988795115094321" />
32
- <entry key="M15" value="3.992523703040572" />
33
- <entry key="M30" value="3.9962586603670154" />
34
- <entry key="H1" value="3.998128531586192" />
35
- <entry key="H2" value="3.999064066042545" />
36
- <entry key="H4" value="3.9995319830709763" />
37
- <entry key="D1" value="3.9999219902398804" />
38
- <entry key="W1" value="3.999988855578615" />
39
- </decayedCancelled>
40
- <decayedSelected>
41
- <entry key="MS100" value="0.0" />
42
- <entry key="MS500" value="0.0" />
43
- <entry key="S2" value="0.0" />
44
- <entry key="S5" value="0.0" />
45
- <entry key="S10" value="0.0" />
46
- <entry key="S30" value="0.0" />
47
- <entry key="S60" value="0.0" />
48
- <entry key="M2" value="0.0" />
49
- <entry key="M5" value="0.0" />
50
- <entry key="M10" value="0.0" />
51
- <entry key="M15" value="0.0" />
52
- <entry key="M30" value="0.0" />
53
- <entry key="H1" value="0.0" />
54
- <entry key="H2" value="0.0" />
55
- <entry key="H4" value="0.0" />
56
- <entry key="D1" value="0.0" />
57
- <entry key="W1" value="0.0" />
58
- </decayedSelected>
59
- <decayedShown>
60
- <entry key="MS100" value="0.9202903328756359" />
61
- <entry key="MS500" value="1.1748831837532834" />
62
- <entry key="S2" value="2.1187503324718144" />
63
- <entry key="S5" value="2.8806834430249055" />
64
- <entry key="S10" value="3.3375501941549914" />
65
- <entry key="S30" value="3.7497962118056876" />
66
- <entry key="S60" value="3.870711561646617" />
67
- <entry key="M2" value="3.93426591538041" />
68
- <entry key="M5" value="3.9734390453964807" />
69
- <entry key="M10" value="3.9866744803524328" />
70
- <entry key="M15" value="3.9911062742677355" />
71
- <entry key="M30" value="3.9955481049777206" />
72
- <entry key="H1" value="3.9977727927268436" />
73
- <entry key="H2" value="3.99888608120727" />
74
- <entry key="H4" value="3.9994429617876244" />
75
- <entry key="D1" value="3.9999071493489797" />
76
- <entry key="W1" value="3.999986735353115" />
77
- </decayedShown>
78
- </component>
79
- <component name="ProjectColorInfo"><![CDATA[{
80
- "customColor": "467ffe29",
81
- "associatedIndex": 8,
82
- "fromUser": false
83
- }]]></component>
84
- <component name="ProjectId" id="3LkGtLtMlVrCxbh24OvdaS4qmTr" />
85
- <component name="ProjectViewState">
86
- <option name="hideEmptyMiddlePackages" value="true" />
87
- <option name="showLibraryContents" value="true" />
88
- </component>
89
- <component name="PropertiesComponent"><![CDATA[{
90
- "keyToString": {
91
- "ModuleVcsDetector.initialDetectionPerformed": "true",
92
- "RunOnceActivity.MCP Project settings loaded": "true",
93
- "RunOnceActivity.ShowReadmeOnStart": "true",
94
- "RunOnceActivity.typescript.service.memoryLimit.init": "true",
95
- "codeWithMe.voiceChat.enabledByDefault": "false",
96
- "node.js.detected.package.eslint": "true",
97
- "node.js.detected.package.tslint": "true",
98
- "node.js.selected.package.eslint": "(autodetect)",
99
- "node.js.selected.package.tslint": "(autodetect)",
100
- "nodejs_package_manager_path": "npm",
101
- "settings.editor.selected.configurable": "preferences.lookFeel",
102
- "ts.external.directory.path": "/Users/caseycolvell/Herd/ngx-wind-editor/node_modules/typescript/lib"
103
- }
104
- }]]></component>
105
- <component name="TaskManager">
106
- <task active="true" id="Default" summary="Default task">
107
- <changelist id="dddd179b-1b8b-4c78-9e6c-2af59aa46f63" name="Changes" comment="" />
108
- <created>1792612006340</created>
109
- <option name="number" value="Default" />
110
- <option name="presentableId" value="Default" />
111
- <updated>1792612006340</updated>
112
- <workItem from="1792612008984" duration="755000" />
113
- <workItem from="1793990867474" duration="1465000" />
114
- </task>
115
- <servers />
116
- </component>
117
- <component name="TypeScriptGeneratedFilesManager">
118
- <option name="version" value="3" />
119
- </component>
120
- </project>
package/dist/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 ngx-wind-editor contributors
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
package/dist/README.md DELETED
@@ -1,90 +0,0 @@
1
- # @codeauradev/ngx-wind-editor
2
-
3
- WYSIWYG HTML editor for Angular 22. The chrome is Tailwind CSS v4, and it follows a `dark` class on an ancestor for dark mode.
4
-
5
- ```html
6
- <wind-editor [(html)]="html" placeholder="Write something…" />
7
- ```
8
-
9
- ```ts
10
- import { Component, signal } from '@angular/core';
11
- import { WindEditor } from '@codeauradev/ngx-wind-editor';
12
-
13
- @Component({
14
- selector: 'app-note',
15
- imports: [WindEditor],
16
- template: `<wind-editor [(html)]="html" />`,
17
- })
18
- export class Note {
19
- readonly html = signal('<p>Start writing.</p>');
20
- }
21
- ```
22
-
23
- `[(html)]` is the serialized document.
24
-
25
- ## Install
26
-
27
- ```bash
28
- npm install @codeauradev/ngx-wind-editor
29
- ```
30
-
31
- Peer: `@angular/core` `^22`. Tailwind CSS v4 is optional and styles the toolbar.
32
-
33
- ```css
34
- @import "tailwindcss";
35
- @source "../node_modules/@codeauradev/ngx-wind-editor";
36
- @custom-variant dark (&:where(.dark, .dark *));
37
- ```
38
-
39
- `@source` lets Tailwind see the utility classes in the component. Document typography and the placeholder ship in the component stylesheet, so the page still reads if you skip Tailwind. Put `class="dark"` on an ancestor to switch the document to dark.
40
-
41
- ## Toolbar
42
-
43
- `toolbar` picks which buttons appear. A preset name, or a list of ids in the order you want:
44
-
45
- ```html
46
- <wind-editor [(html)]="html" toolbar="writing" />
47
- <wind-editor [(html)]="html" [toolbar]="['bold', 'italic', 'link', 'bullet']" />
48
- ```
49
-
50
- | Preset | Buttons |
51
- | --- | --- |
52
- | `full` | Every button. This is the default. |
53
- | `writing` | Paragraph, headings, bold, italic, link, lists, quote, undo, redo |
54
- | `basic` | Bold, italic, underline, strike, link, lists, undo, redo |
55
- | `minimal` | Bold, italic, link |
56
-
57
- Ids: `paragraph`, `h1`, `h2`, `bold`, `italic`, `underline`, `strike`, `code`, `link`, `bullet`, `ordered`, `quote`, `codeblock`, `rule`, `image`, `clear`, `undo`, `redo`, `source`. Unknown ids are ignored. `[showToolbar]="false"` hides the bar entirely.
58
-
59
- `/` at the start of an empty block opens the block menu. Arrow keys move, Enter applies, Escape cancels. In a code block, Enter inserts a newline and Ctrl/Cmd+Enter starts a paragraph under it.
60
-
61
- | Shortcut | Action |
62
- | --- | --- |
63
- | Mod+B / I / U / E | Bold, italic, underline, inline code |
64
- | Mod+Shift+X | Strikethrough |
65
- | Mod+K | Link |
66
- | Mod+Z / Mod+Shift+Z | Undo / redo |
67
-
68
- Mod is Cmd on macOS and Ctrl elsewhere.
69
-
70
- ## HTML
71
-
72
- The editor reads and writes a fixed subset: `p`, `h1`–`h3`, `blockquote`, `ul`, `ol`, `li`, `pre`, `code`, `strong`, `em`, `u`, `s`, `a`, `br`, `hr`, `img`. `javascript:` URLs are dropped. Lists are flat.
73
-
74
- Set the model and the editor replaces its document. Edits write back.
75
-
76
- ## Readonly
77
-
78
- ```html
79
- <wind-editor [html]="published" [readonly]="true" [showToolbar]="false" />
80
- ```
81
-
82
- ## Build this package
83
-
84
- ```bash
85
- npm install
86
- npm test
87
- npm run build
88
- ```
89
-
90
- Publish `dist/`. It is an Angular Package Format build (partial compilation).
@@ -1 +0,0 @@
1
- {"version":3,"file":"codeauradev-ngx-wind-editor.mjs","names":[],"sources":["../../src/catalog.ts","../../src/delta.ts","../../src/html.ts","../../src/types.ts","../../src/session.ts","../../src/toolbar.ts","../../src/surface.ts","../../src/wind-icon.ts","../../src/wind-editor.ts"],"sourcesContent":["import type { SlashChoice } from './session';\n\nexport interface SlashItem {\n id: SlashChoice;\n label: string;\n hint: string;\n keys: string;\n}\n\nexport const SLASH_ITEMS: readonly SlashItem[] = [\n { id: 'paragraph', label: 'Text', hint: 'Plain paragraph', keys: 'p text paragraph' },\n { id: 'h1', label: 'Heading 1', hint: 'Large title', keys: 'h1 heading title' },\n { id: 'h2', label: 'Heading 2', hint: 'Section', keys: 'h2 heading' },\n { id: 'h3', label: 'Heading 3', hint: 'Subsection', keys: 'h3 heading' },\n { id: 'bullet', label: 'Bullet list', hint: 'Unordered', keys: 'ul list bullet' },\n { id: 'ordered', label: 'Numbered list', hint: 'Ordered', keys: 'ol list number' },\n { id: 'quote', label: 'Quote', hint: 'Blockquote', keys: 'quote blockquote' },\n { id: 'code', label: 'Code', hint: 'Monospace block', keys: 'code pre' },\n { id: 'rule', label: 'Divider', hint: 'Horizontal rule', keys: 'hr rule divider line' },\n { id: 'image', label: 'Image', hint: 'From a URL', keys: 'img image picture' },\n];\n\nexport function filterSlash(query: string): SlashItem[] {\n const needle = query.trim().toLowerCase();\n if (!needle) return [...SLASH_ITEMS];\n return SLASH_ITEMS.filter((item) => `${item.label} ${item.keys}`.toLowerCase().includes(needle));\n}\n","import type { Delta, DeltaOp, TextAttrs } from './types';\n\nconst MARK_KEYS = ['bold', 'italic', 'underline', 'strike', 'code', 'href'] as const;\n\nexport function packAttrs(attrs: TextAttrs | null | undefined): TextAttrs | undefined {\n if (!attrs) return undefined;\n const out: TextAttrs = {};\n if (attrs.bold) out.bold = true;\n if (attrs.italic) out.italic = true;\n if (attrs.underline) out.underline = true;\n if (attrs.strike) out.strike = true;\n if (attrs.code) out.code = true;\n if (typeof attrs.href === 'string' && attrs.href.length > 0) out.href = attrs.href;\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nexport function attrsEqual(a: TextAttrs | undefined, b: TextAttrs | undefined): boolean {\n const left = packAttrs(a) ?? {};\n const right = packAttrs(b) ?? {};\n return MARK_KEYS.every((key) => left[key] === right[key]);\n}\n\nexport function mergeDelta(delta: Delta): Delta {\n const out: Delta = [];\n for (const op of delta) {\n if (!op.insert) continue;\n const prev = out[out.length - 1];\n if (prev && attrsEqual(prev.attributes, op.attributes)) prev.insert += op.insert;\n else out.push({ insert: op.insert, attributes: packAttrs(op.attributes) });\n }\n return out;\n}\n\nexport function deltaLength(delta: Delta): number {\n return delta.reduce((sum, op) => sum + op.insert.length, 0);\n}\n\nexport function deltaToText(delta: Delta): string {\n return delta.map((op) => op.insert).join('');\n}\n\nexport function sliceDelta(delta: Delta, start: number, end: number): Delta {\n const out: DeltaOp[] = [];\n let pos = 0;\n for (const op of delta) {\n const len = op.insert.length;\n const from = Math.max(start, pos);\n const to = Math.min(end, pos + len);\n if (to > from) {\n out.push({ insert: op.insert.slice(from - pos, to - pos), attributes: packAttrs(op.attributes) });\n }\n pos += len;\n }\n return out;\n}\n\n/** Attributes that apply to a caret sitting at `index` (the character before it). */\nexport function attrsAt(delta: Delta, index: number): TextAttrs {\n if (index <= 0 || delta.length === 0) return {};\n let pos = 0;\n for (const op of delta) {\n const len = op.insert.length;\n if (index <= pos + len) return { ...(packAttrs(op.attributes) ?? {}) };\n pos += len;\n }\n return { ...(packAttrs(delta[delta.length - 1]?.attributes) ?? {}) };\n}\n\nexport function commonEdges(prev: string, next: string): { start: number; prevEnd: number; nextEnd: number } {\n let start = 0;\n const limit = Math.min(prev.length, next.length);\n while (start < limit && prev[start] === next[start]) start += 1;\n let prevEnd = prev.length;\n let nextEnd = next.length;\n while (prevEnd > start && nextEnd > start && prev[prevEnd - 1] === next[nextEnd - 1]) {\n prevEnd -= 1;\n nextEnd -= 1;\n }\n return { start, prevEnd, nextEnd };\n}\n\ninterface GraphemePart {\n index: number;\n segment: string;\n}\n\ninterface GraphemeSegmenter {\n segment(input: string): Iterable<GraphemePart>;\n}\n\n/** Local shape so the build does not depend on the ES2022 Intl lib. */\nfunction graphemeSegmenter(): GraphemeSegmenter | null {\n const intl = Intl as typeof Intl & {\n Segmenter?: new (locales?: string, options?: { granularity?: 'grapheme' }) => GraphemeSegmenter;\n };\n if (typeof intl.Segmenter !== 'function') return null;\n return new intl.Segmenter(undefined, { granularity: 'grapheme' });\n}\n\nexport function graphemeBefore(text: string, offset: number): number {\n if (offset <= 0) return 0;\n const segmenter = graphemeSegmenter();\n if (!segmenter) return offset - 1;\n let last = 0;\n for (const part of segmenter.segment(text.slice(0, offset))) last = part.index;\n return last;\n}\n\nexport function graphemeAfter(text: string, offset: number): number {\n if (offset >= text.length) return text.length;\n const segmenter = graphemeSegmenter();\n if (!segmenter) return offset + 1;\n const part = segmenter.segment(text.slice(offset))[Symbol.iterator]().next().value;\n return offset + (part?.segment.length ?? 1);\n}\n","import { deltaToText, mergeDelta, packAttrs } from './delta';\nimport type { BlockData, BlockType, Delta, TextAttrs } from './types';\n\nconst VOID = new Set(['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'source', 'track', 'wbr']);\n\ntype Token =\n | { kind: 'text'; value: string }\n | { kind: 'open'; name: string; attrs: Record<string, string> }\n | { kind: 'close'; name: string };\n\nexport function safeUrl(value: string): string | null {\n const trimmed = value.trim();\n if (!trimmed) return null;\n if (trimmed.startsWith('/') || trimmed.startsWith('#') || trimmed.startsWith('./') || trimmed.startsWith('../')) {\n return trimmed;\n }\n try {\n const url = new URL(trimmed, 'https://example.com');\n if (url.protocol === 'http:' || url.protocol === 'https:' || url.protocol === 'mailto:' || url.protocol === 'tel:') {\n return trimmed;\n }\n } catch {\n return null;\n }\n return null;\n}\n\nfunction escapeText(value: string): string {\n return value.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n}\n\nfunction escapeAttr(value: string): string {\n return escapeText(value).replace(/\"/g, '\"');\n}\n\nfunction decodeEntity(body: string): string {\n const named: Record<string, string> = { amp: '&', lt: '<', gt: '>', quot: '\"', apos: \"'\", nbsp: '\\u00a0' };\n if (named[body]) return named[body];\n if (body.startsWith('#x') || body.startsWith('#X')) {\n const code = Number.parseInt(body.slice(2), 16);\n return Number.isFinite(code) ? String.fromCodePoint(code) : `&${body};`;\n }\n if (body.startsWith('#')) {\n const code = Number.parseInt(body.slice(1), 10);\n return Number.isFinite(code) ? String.fromCodePoint(code) : `&${body};`;\n }\n return `&${body};`;\n}\n\nfunction decode(value: string): string {\n return value.replace(/&(#x?[0-9a-fA-F]+|[a-zA-Z]+);/g, (_, body: string) => decodeEntity(body));\n}\n\nfunction tokenize(html: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n while (i < html.length) {\n if (html[i] !== '<') {\n const next = html.indexOf('<', i);\n const raw = html.slice(i, next === -1 ? html.length : next);\n tokens.push({ kind: 'text', value: decode(raw) });\n i = next === -1 ? html.length : next;\n continue;\n }\n const next = html[i + 1];\n if (!next || !/[a-zA-Z/!?]/.test(next)) {\n tokens.push({ kind: 'text', value: '<' });\n i += 1;\n continue;\n }\n if (html.startsWith('<!--', i)) {\n const end = html.indexOf('-->', i + 4);\n i = end === -1 ? html.length : end + 3;\n continue;\n }\n const end = html.indexOf('>', i + 1);\n if (end === -1) {\n tokens.push({ kind: 'text', value: html.slice(i) });\n break;\n }\n const raw = html.slice(i + 1, end).trim();\n i = end + 1;\n if (!raw) continue;\n if (raw.startsWith('/')) {\n tokens.push({ kind: 'close', name: raw.slice(1).trim().split(/\\s+/)[0]?.toLowerCase() ?? '' });\n continue;\n }\n if (raw.startsWith('!') || raw.startsWith('?')) continue;\n const self = raw.endsWith('/');\n const body = self ? raw.slice(0, -1).trim() : raw;\n const name = body.split(/\\s+/)[0]?.toLowerCase() ?? '';\n const attrs: Record<string, string> = {};\n const attrRe = /([^\\s=/>]+)(?:\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\s\"'>]+)))?/g;\n let match: RegExpExecArray | null;\n const rest = body.slice(name.length);\n while ((match = attrRe.exec(rest))) {\n const key = match[1]?.toLowerCase();\n if (!key) continue;\n attrs[key] = decode(match[2] ?? match[3] ?? match[4] ?? '');\n }\n tokens.push({ kind: 'open', name, attrs });\n if (self || VOID.has(name)) tokens.push({ kind: 'close', name });\n }\n return tokens;\n}\n\ninterface Draft {\n type: BlockType;\n level: number;\n src: string;\n alt: string;\n delta: Delta;\n}\n\nfunction pushText(draft: Draft, value: string, attrs: TextAttrs): void {\n if (!value) return;\n draft.delta.push({ insert: value, attributes: packAttrs(attrs) });\n}\n\nfunction finish(blocks: BlockData[], draft: Draft | null): Draft | null {\n if (!draft) return null;\n let delta = mergeDelta(draft.delta);\n if (draft.type !== 'code') {\n const text = deltaToText(delta).replace(/\\u00a0/g, ' ');\n if (text.trim() === '' && !text.includes('\\n')) delta = [];\n else if (delta.length === 1 && delta[0] && !delta[0].attributes) {\n const trimmed = delta[0].insert.replace(/^[ \\t]+|[ \\t]+$/g, '');\n delta = trimmed ? [{ insert: trimmed }] : [];\n }\n }\n blocks.push({\n id: '',\n type: draft.type,\n level: draft.type === 'heading' ? draft.level : 0,\n src: draft.src,\n alt: draft.alt,\n delta: draft.type === 'rule' || draft.type === 'image' ? [] : delta,\n });\n return null;\n}\n\nexport function parseHtml(html: string): BlockData[] {\n const tokens = tokenize(html);\n const blocks: BlockData[] = [];\n const marks: Array<{ tag: string; attrs: TextAttrs }> = [];\n const lists: Array<'bullet' | 'ordered'> = [];\n let quote = 0;\n let pre = 0;\n let ignore = 0;\n let draft: Draft | null = null;\n\n const attrs = (): TextAttrs => marks.reduce<TextAttrs>((acc, mark) => ({ ...acc, ...mark.attrs }), {});\n const popTag = (tag: string) => {\n for (let index = marks.length - 1; index >= 0; index -= 1) {\n if (marks[index]?.tag === tag) {\n marks.splice(index, 1);\n return;\n }\n }\n };\n\n const start = (type: BlockType, extra?: Partial<Draft>) => {\n draft = finish(blocks, draft);\n draft = { type, level: extra?.level ?? (type === 'heading' ? 1 : 0), src: extra?.src ?? '', alt: extra?.alt ?? '', delta: [] };\n };\n\n for (const token of tokens) {\n if (token.kind === 'text') {\n if (ignore) continue;\n if (pre) {\n if (!draft) start('code');\n pushText(draft!, token.value.replace(/^\\n/, ''), {});\n continue;\n }\n const collapsed = token.value.replace(/\\u00a0/g, ' ').replace(/[ \\t\\r\\n]+/g, ' ');\n if (!draft) {\n if (!collapsed.trim()) continue;\n const type = quote > 0 ? 'blockquote' : (lists.at(-1) ?? 'paragraph');\n start(type);\n }\n if (!draft) continue;\n pushText(draft, collapsed, attrs());\n continue;\n }\n if (token.kind === 'close') {\n const name = token.name;\n if (name === 'script' || name === 'style') ignore = Math.max(0, ignore - 1);\n if (name === 'strong' || name === 'b') popTag(name);\n if (name === 'em' || name === 'i') popTag(name);\n if (name === 'u') popTag(name);\n if (name === 's' || name === 'strike' || name === 'del') popTag(name);\n if (name === 'code' && pre === 0) popTag('code');\n if (name === 'a') popTag('a');\n if (name === 'ul' || name === 'ol') lists.pop();\n if (name === 'blockquote') quote = Math.max(0, quote - 1);\n if (name === 'pre') {\n pre = Math.max(0, pre - 1);\n draft = finish(blocks, draft);\n }\n if (['p', 'div', 'li', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'blockquote'].includes(name) && pre === 0) {\n draft = finish(blocks, draft);\n }\n continue;\n }\n\n const name = token.name;\n if (name === 'script' || name === 'style') {\n ignore += 1;\n continue;\n }\n if (ignore) continue;\n if (name === 'strong' || name === 'b') marks.push({ tag: name, attrs: { bold: true } });\n else if (name === 'em' || name === 'i') marks.push({ tag: name, attrs: { italic: true } });\n else if (name === 'u') marks.push({ tag: 'u', attrs: { underline: true } });\n else if (name === 's' || name === 'strike' || name === 'del') marks.push({ tag: name, attrs: { strike: true } });\n else if (name === 'code' && pre === 0) marks.push({ tag: 'code', attrs: { code: true } });\n else if (name === 'a') {\n const href = safeUrl(token.attrs['href'] ?? '');\n if (href) marks.push({ tag: 'a', attrs: { href } });\n } else if (name === 'br') {\n if (!draft) start(quote > 0 ? 'blockquote' : (lists.at(-1) ?? 'paragraph'));\n if (draft && deltaToText(draft.delta).length > 0) pushText(draft, '\\n', attrs());\n } else if (name === 'hr') {\n draft = finish(blocks, draft);\n blocks.push({ id: '', type: 'rule', level: 0, src: '', alt: '', delta: [] });\n } else if (name === 'img') {\n const src = safeUrl(token.attrs['src'] ?? '');\n if (src) {\n draft = finish(blocks, draft);\n blocks.push({ id: '', type: 'image', level: 0, src, alt: token.attrs['alt'] ?? '', delta: [] });\n }\n } else if (name === 'ul') {\n draft = finish(blocks, draft);\n lists.push('bullet');\n } else if (name === 'ol') {\n draft = finish(blocks, draft);\n lists.push('ordered');\n } else if (name === 'blockquote') {\n draft = finish(blocks, draft);\n quote += 1;\n } else if (name === 'pre') {\n draft = finish(blocks, draft);\n pre += 1;\n start('code');\n } else if (/^h[1-6]$/.test(name)) {\n start('heading', { level: Math.min(3, Number(name[1])) });\n } else if (name === 'li') {\n start(lists.at(-1) ?? 'bullet');\n } else if (name === 'p' || name === 'div') {\n if (pre > 0) continue;\n if (draft && deltaToText(draft.delta).length > 0) draft = finish(blocks, draft);\n if (!draft) start(quote > 0 ? 'blockquote' : (lists.at(-1) ?? 'paragraph'));\n }\n }\n finish(blocks, draft);\n return blocks;\n}\n\nfunction inlineHtml(delta: Delta, pre: boolean): string {\n let html = '';\n for (const op of mergeDelta(delta)) {\n let piece = escapeText(op.insert);\n if (!pre) piece = piece.replace(/\\n/g, '<br>');\n const attrs = op.attributes ?? {};\n if (attrs.code) piece = `<code>${piece}</code>`;\n if (attrs.strike) piece = `<s>${piece}</s>`;\n if (attrs.underline) piece = `<u>${piece}</u>`;\n if (attrs.italic) piece = `<em>${piece}</em>`;\n if (attrs.bold) piece = `<strong>${piece}</strong>`;\n if (attrs.href) piece = `<a href=\"${escapeAttr(attrs.href)}\">${piece}</a>`;\n html += piece;\n }\n return html;\n}\n\nfunction blockHtml(block: BlockData): string {\n if (block.type === 'rule') return '<hr>';\n if (block.type === 'image') {\n const alt = block.alt ? ` alt=\"${escapeAttr(block.alt)}\"` : '';\n return `<img src=\"${escapeAttr(block.src)}\"${alt}>`;\n }\n if (block.type === 'code') return `<pre><code>${inlineHtml(block.delta, true)}</code></pre>`;\n const inner = inlineHtml(block.delta, false);\n if (block.type === 'heading') return `<h${Math.min(3, Math.max(1, block.level || 1))}>${inner}</h${Math.min(3, Math.max(1, block.level || 1))}>`;\n if (block.type === 'blockquote') return `<blockquote>${inner}</blockquote>`;\n if (block.type === 'bullet' || block.type === 'ordered') return `<li>${inner}</li>`;\n return `<p>${inner}</p>`;\n}\n\nexport function serializeBlocks(blocks: BlockData[]): string {\n let html = '';\n let i = 0;\n while (i < blocks.length) {\n const block = blocks[i];\n if (!block) break;\n if (block.type === 'bullet' || block.type === 'ordered') {\n const tag = block.type === 'bullet' ? 'ul' : 'ol';\n html += `<${tag}>`;\n while (i < blocks.length && blocks[i]?.type === block.type) {\n html += blockHtml(blocks[i] as BlockData);\n i += 1;\n }\n html += `</${tag}>`;\n continue;\n }\n html += blockHtml(block);\n i += 1;\n }\n return html;\n}\n\nexport function plainText(blocks: BlockData[]): string {\n return blocks\n .map((block) => {\n if (block.type === 'rule') return '';\n if (block.type === 'image') return block.alt || block.src;\n return deltaToText(block.delta);\n })\n .filter((line, index, all) => line.length > 0 || all.length === 1)\n .join('\\n');\n}\n\nexport function countWords(text: string): number {\n const trimmed = text.trim();\n if (!trimmed) return 0;\n return trimmed.split(/\\s+/).length;\n}\n","export const BLOCK_TYPES = [\n 'paragraph',\n 'heading',\n 'blockquote',\n 'code',\n 'bullet',\n 'ordered',\n 'rule',\n 'image',\n] as const;\n\nexport type BlockType = (typeof BLOCK_TYPES)[number];\n\nexport const MARKS = ['bold', 'italic', 'underline', 'strike', 'code'] as const;\n\nexport type MarkName = (typeof MARKS)[number];\n\nexport interface TextAttrs {\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strike?: boolean;\n code?: boolean;\n href?: string;\n}\n\nexport interface DeltaOp {\n insert: string;\n attributes?: TextAttrs;\n}\n\nexport type Delta = DeltaOp[];\n\nexport interface BlockData {\n id: string;\n type: BlockType;\n level: number;\n src: string;\n alt: string;\n delta: Delta;\n}\n\nexport interface Point {\n blockId: string;\n offset: number;\n}\n\nexport interface Selection {\n anchor: Point;\n head: Point;\n}\n\nexport interface EditorSnapshot {\n html: string;\n text: string;\n words: number;\n characters: number;\n blockType: BlockType;\n level: number;\n marks: TextAttrs;\n href: string | null;\n canUndo: boolean;\n canRedo: boolean;\n slash: string | null;\n}\n\nexport function isBlockType(value: unknown): value is BlockType {\n return typeof value === 'string' && (BLOCK_TYPES as readonly string[]).includes(value);\n}\n","import * as Y from 'yjs';\nimport { attrsAt, commonEdges, deltaLength, deltaToText, graphemeAfter, graphemeBefore, mergeDelta, packAttrs, sliceDelta } from './delta';\nimport { countWords, parseHtml, plainText, serializeBlocks } from './html';\nimport type { BlockData, BlockType, Delta, MarkName, Point, Selection, TextAttrs } from './types';\nimport { isBlockType } from './types';\n\nconst BLOCKS = 'blocks';\n\nexport interface LocatedBlock {\n map: Y.Map<unknown>;\n index: number;\n id: string;\n type: BlockType;\n level: number;\n text: Y.Text | null;\n}\n\nexport type SlashChoice =\n | 'paragraph'\n | 'h1'\n | 'h2'\n | 'h3'\n | 'bullet'\n | 'ordered'\n | 'quote'\n | 'code'\n | 'rule'\n | 'image';\n\nlet idSeq = 0;\n\nfunction nextId(): string {\n idSeq += 1;\n const rand = Math.random().toString(36).slice(2, 8);\n return `b${idSeq.toString(36)}${rand}`;\n}\n\nexport function blocksOf(doc: Y.Doc): Y.Array<Y.Map<unknown>> {\n return doc.getArray<Y.Map<unknown>>(BLOCKS);\n}\n\nexport function makeBlock(type: BlockType, fields?: { level?: number; src?: string; alt?: string; delta?: Delta }): Y.Map<unknown> {\n const map = new Y.Map<unknown>();\n map.set('id', nextId());\n map.set('type', type);\n if (type === 'heading') map.set('level', fields?.level ?? 1);\n if (type === 'image') {\n map.set('src', fields?.src ?? '');\n map.set('alt', fields?.alt ?? '');\n }\n if (type !== 'rule' && type !== 'image') {\n const text = new Y.Text();\n if (fields?.delta?.length) writeDelta(text, fields.delta, 0);\n map.set('text', text);\n }\n return map;\n}\n\nfunction writeDelta(text: Y.Text, delta: Delta, at: number): void {\n let index = at;\n for (const op of delta) {\n if (!op.insert) continue;\n text.insert(index, op.insert, packAttrs(op.attributes));\n index += op.insert.length;\n }\n}\n\nexport function readDelta(text: Y.Text): Delta {\n const ops: Delta = [];\n for (const op of text.toDelta()) {\n if (typeof op.insert !== 'string' || op.insert.length === 0) continue;\n ops.push({ insert: op.insert, attributes: packAttrs(op.attributes as TextAttrs | undefined) });\n }\n return mergeDelta(ops);\n}\n\nfunction readMap(map: Y.Map<unknown>, index: number): LocatedBlock {\n const rawType = map.get('type');\n const type: BlockType = isBlockType(rawType) ? rawType : 'paragraph';\n const text = map.get('text');\n return {\n map,\n index,\n id: String(map.get('id') ?? ''),\n type,\n level: Number(map.get('level') ?? 1) || 1,\n text: text instanceof Y.Text ? text : null,\n };\n}\n\nexport function readBlocks(doc: Y.Doc): BlockData[] {\n const blocks = blocksOf(doc);\n const out: BlockData[] = [];\n for (let i = 0; i < blocks.length; i += 1) {\n const map = blocks.get(i);\n const loc = readMap(map, i);\n out.push({\n id: loc.id,\n type: loc.type,\n level: loc.type === 'heading' ? loc.level : 0,\n src: String(map.get('src') ?? ''),\n alt: String(map.get('alt') ?? ''),\n delta: loc.text ? readDelta(loc.text) : [],\n });\n }\n return out;\n}\n\nfunction locate(doc: Y.Doc, id: string): LocatedBlock | null {\n const blocks = blocksOf(doc);\n for (let i = 0; i < blocks.length; i += 1) {\n const loc = readMap(blocks.get(i), i);\n if (loc.id === id) return loc;\n }\n return null;\n}\n\nfunction locateAt(doc: Y.Doc, index: number): LocatedBlock | null {\n const blocks = blocksOf(doc);\n if (index < 0 || index >= blocks.length) return null;\n return readMap(blocks.get(index), index);\n}\n\nfunction cloneSelection(selection: Selection): Selection {\n return {\n anchor: { ...selection.anchor },\n head: { ...selection.head },\n };\n}\n\nfunction collapsed(blockId: string, offset: number): Selection {\n return { anchor: { blockId, offset }, head: { blockId, offset } };\n}\n\ninterface Bounds {\n start: Point;\n end: Point;\n startIndex: number;\n endIndex: number;\n}\n\nfunction boundsOf(doc: Y.Doc, selection: Selection): Bounds | null {\n const anchor = locate(doc, selection.anchor.blockId);\n const head = locate(doc, selection.head.blockId);\n if (!anchor || !head) return null;\n const anchorFirst = anchor.index < head.index || (anchor.index === head.index && selection.anchor.offset <= selection.head.offset);\n const start = anchorFirst ? selection.anchor : selection.head;\n const end = anchorFirst ? selection.head : selection.anchor;\n return {\n start,\n end,\n startIndex: anchorFirst ? anchor.index : head.index,\n endIndex: anchorFirst ? head.index : anchor.index,\n };\n}\n\nfunction hasRange(doc: Y.Doc, selection: Selection): boolean {\n const bounds = boundsOf(doc, selection);\n if (!bounds) return false;\n return bounds.start.blockId !== bounds.end.blockId || bounds.start.offset !== bounds.end.offset;\n}\n\nexport interface SessionSnapshot {\n blockType: BlockType;\n level: number;\n marks: TextAttrs;\n href: string | null;\n slash: string | null;\n canUndo: boolean;\n canRedo: boolean;\n}\n\nexport class WindSession {\n readonly doc: Y.Doc;\n readonly origin: object = {};\n selection: Selection;\n private stored: TextAttrs | null = null;\n private pendingBefore: Selection | null = null;\n private readonly undoManager: Y.UndoManager;\n private readonly listeners = new Set<(structural: boolean) => void>();\n\n constructor(doc: Y.Doc) {\n this.doc = doc;\n const blocks = blocksOf(doc);\n if (blocks.length === 0) {\n doc.transact(() => {\n if (blocksOf(doc).length === 0) blocksOf(doc).insert(0, [makeBlock('paragraph')]);\n }, 'seed');\n }\n const first = locateAt(doc, 0);\n this.selection = collapsed(first?.id ?? '', 0);\n this.undoManager = new Y.UndoManager(blocksOf(doc), {\n trackedOrigins: new Set([this.origin]),\n captureTimeout: 500,\n });\n this.undoManager.on('stack-item-added', (event) => {\n const item = event.stackItem;\n item.meta.set('before', this.pendingBefore);\n item.meta.set('after', cloneSelection(this.selection));\n });\n this.undoManager.on('stack-item-popped', (event) => {\n const item = event.stackItem;\n const stored = event.type === 'undo' ? item.meta.get('before') : item.meta.get('after');\n if (isSelection(stored)) this.selection = cloneSelection(stored);\n this.stored = null;\n this.clampSelection();\n this.emit(true);\n });\n blocksOf(doc).observeDeep((_events, transaction) => {\n if (transaction.origin === this.origin) return;\n this.clampSelection();\n this.stored = null;\n this.emit(true);\n });\n }\n\n onChange(listener: (structural: boolean) => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n get html(): string {\n return serializeBlocks(readBlocks(this.doc));\n }\n\n get text(): string {\n return plainText(readBlocks(this.doc));\n }\n\n get words(): number {\n return countWords(this.text);\n }\n\n get canUndo(): boolean {\n return this.undoManager.undoStack.length > 0;\n }\n\n get canRedo(): boolean {\n return this.undoManager.redoStack.length > 0;\n }\n\n undo(): void {\n this.undoManager.undo();\n }\n\n redo(): void {\n this.undoManager.redo();\n }\n\n select(selection: Selection): void {\n this.selection = cloneSelection(selection);\n this.stored = null;\n this.clampSelection();\n this.emit(false);\n }\n\n focusPoint(blockId: string, offset: number): void {\n this.select(collapsed(blockId, offset));\n }\n\n insertText(value: string): void {\n if (!value) return;\n this.transact(() => {\n if (hasRange(this.doc, this.selection)) this.deleteRange();\n const loc = this.current();\n if (!loc) return;\n if (!loc.text) {\n const created = makeBlock('paragraph');\n const text = created.get('text') as Y.Text;\n text.insert(0, value, packAttrs(this.typingAttrs(null, 0)));\n blocksOf(this.doc).insert(loc.index + 1, [created]);\n this.selection = collapsed(String(created.get('id')), value.length);\n return;\n }\n const attrs = this.typingAttrs(loc.text, this.selection.head.offset);\n loc.text.insert(this.selection.head.offset, value, packAttrs(attrs));\n this.selection = collapsed(loc.id, this.selection.head.offset + value.length);\n });\n }\n\n deleteBackward(): void {\n this.transact(() => {\n if (hasRange(this.doc, this.selection)) {\n this.deleteRange();\n return;\n }\n const loc = this.current();\n if (!loc) return;\n if (!loc.text) {\n blocksOf(this.doc).delete(loc.index, 1);\n this.ensureBlock();\n const next = locateAt(this.doc, Math.min(loc.index, blocksOf(this.doc).length - 1));\n if (next) this.selection = collapsed(next.id, 0);\n return;\n }\n const offset = this.selection.head.offset;\n if (offset > 0) {\n const text = loc.text.toString();\n const from = graphemeBefore(text, offset);\n loc.text.delete(from, offset - from);\n this.selection = collapsed(loc.id, from);\n return;\n }\n if ((loc.type === 'bullet' || loc.type === 'ordered') && loc.text.length === 0) {\n loc.map.set('type', 'paragraph');\n return;\n }\n if (loc.type !== 'paragraph' && loc.type !== 'bullet' && loc.type !== 'ordered' && loc.index === 0) {\n loc.map.set('type', 'paragraph');\n loc.map.delete('level');\n return;\n }\n const prev = locateAt(this.doc, loc.index - 1);\n if (!prev) return;\n if (!prev.text) {\n blocksOf(this.doc).delete(prev.index, 1);\n this.selection = collapsed(loc.id, 0);\n return;\n }\n if (!loc.text.length && (loc.type === 'bullet' || loc.type === 'ordered' || loc.type === 'heading' || loc.type === 'code' || loc.type === 'blockquote')) {\n loc.map.set('type', 'paragraph');\n return;\n }\n const join = prev.text.length;\n writeDelta(prev.text, readDelta(loc.text), join);\n blocksOf(this.doc).delete(loc.index, 1);\n this.selection = collapsed(prev.id, join);\n });\n }\n\n deleteForward(): void {\n this.transact(() => {\n if (hasRange(this.doc, this.selection)) {\n this.deleteRange();\n return;\n }\n const loc = this.current();\n if (!loc?.text) {\n if (loc) this.deleteBackward();\n return;\n }\n const offset = this.selection.head.offset;\n const text = loc.text.toString();\n if (offset < text.length) {\n const to = graphemeAfter(text, offset);\n loc.text.delete(offset, to - offset);\n this.selection = collapsed(loc.id, offset);\n return;\n }\n const next = locateAt(this.doc, loc.index + 1);\n if (!next) return;\n if (!next.text) {\n blocksOf(this.doc).delete(next.index, 1);\n return;\n }\n writeDelta(loc.text, readDelta(next.text), loc.text.length);\n blocksOf(this.doc).delete(next.index, 1);\n this.selection = collapsed(loc.id, offset);\n });\n }\n\n split(mode: 'enter' | 'hard' | 'exit'): void {\n this.transact(() => {\n if (hasRange(this.doc, this.selection)) this.deleteRange();\n const loc = this.current();\n if (!loc) return;\n if (!loc.text) {\n const created = makeBlock('paragraph');\n blocksOf(this.doc).insert(loc.index + 1, [created]);\n this.selection = collapsed(String(created.get('id')), 0);\n return;\n }\n if (mode === 'hard' || (mode === 'enter' && loc.type === 'code')) {\n const attrs = this.typingAttrs(loc.text, this.selection.head.offset);\n loc.text.insert(this.selection.head.offset, '\\n', packAttrs(attrs));\n this.selection = collapsed(loc.id, this.selection.head.offset + 1);\n return;\n }\n if (mode === 'exit' || (loc.type === 'code' && mode === 'enter')) {\n const created = makeBlock('paragraph');\n blocksOf(this.doc).insert(loc.index + 1, [created]);\n this.selection = collapsed(String(created.get('id')), 0);\n return;\n }\n if ((loc.type === 'bullet' || loc.type === 'ordered') && loc.text.length === 0) {\n loc.map.set('type', 'paragraph');\n this.selection = collapsed(loc.id, 0);\n return;\n }\n const offset = this.selection.head.offset;\n const delta = readDelta(loc.text);\n const right = sliceDelta(delta, offset, deltaLength(delta));\n if (offset < loc.text.length) loc.text.delete(offset, loc.text.length - offset);\n const nextType: BlockType = loc.type === 'heading' ? 'paragraph' : loc.type;\n const created = makeBlock(nextType, { level: loc.level, delta: right });\n blocksOf(this.doc).insert(loc.index + 1, [created]);\n this.selection = collapsed(String(created.get('id')), 0);\n this.stored = null;\n });\n }\n\n toggleMark(mark: MarkName): void {\n this.transact(() => {\n if (!hasRange(this.doc, this.selection)) {\n const current = this.effectiveMarks();\n this.stored = { ...current, [mark]: !current[mark] };\n if (!this.stored[mark]) delete this.stored[mark];\n return;\n }\n const enable = !this.rangeHas(mark);\n this.formatRange({ [mark]: enable ? true : null });\n this.stored = null;\n });\n }\n\n setLink(href: string | null): void {\n const safe = href ? href : null;\n this.transact(() => {\n if (!hasRange(this.doc, this.selection)) {\n const current = this.effectiveMarks();\n this.stored = { ...current };\n if (safe) this.stored.href = safe;\n else delete this.stored.href;\n return;\n }\n this.formatRange({ href: safe });\n this.stored = null;\n });\n }\n\n clearMarks(): void {\n this.transact(() => {\n if (!hasRange(this.doc, this.selection)) {\n this.stored = {};\n return;\n }\n this.formatRange({ bold: null, italic: null, underline: null, strike: null, code: null, href: null });\n this.stored = null;\n });\n }\n\n setBlockType(type: BlockType, level = 1): void {\n this.transact(() => {\n for (const loc of this.selectedBlocks()) {\n if (!loc.text && type !== 'rule' && type !== 'image') {\n const text = new Y.Text();\n loc.map.set('text', text);\n }\n loc.map.set('type', type);\n if (type === 'heading') loc.map.set('level', level);\n else loc.map.delete('level');\n if (type === 'rule' || type === 'image') loc.map.delete('text');\n }\n });\n }\n\n insertDivider(): void {\n this.transact(() => {\n if (hasRange(this.doc, this.selection)) this.deleteRange();\n const loc = this.current();\n if (!loc) return;\n const empty = !!loc.text && loc.text.length === 0;\n const rule = makeBlock('rule');\n const para = makeBlock('paragraph');\n if (empty) {\n blocksOf(this.doc).delete(loc.index, 1);\n blocksOf(this.doc).insert(loc.index, [rule, para]);\n this.selection = collapsed(String(para.get('id')), 0);\n return;\n }\n blocksOf(this.doc).insert(loc.index + 1, [rule, para]);\n this.selection = collapsed(String(para.get('id')), 0);\n });\n }\n\n insertImage(src: string, alt = ''): void {\n this.transact(() => {\n this.consumeSlash();\n const loc = this.current();\n if (!loc) return;\n const image = makeBlock('image', { src, alt });\n const para = makeBlock('paragraph');\n const empty = !!loc.text && loc.text.length === 0;\n if (empty) {\n blocksOf(this.doc).delete(loc.index, 1);\n blocksOf(this.doc).insert(loc.index, [image, para]);\n } else {\n blocksOf(this.doc).insert(loc.index + 1, [image, para]);\n }\n this.selection = collapsed(String(para.get('id')), 0);\n });\n }\n\n applySlash(choice: SlashChoice): 'image' | 'applied' {\n if (choice === 'image') {\n this.transact(() => this.consumeSlash());\n return 'image';\n }\n this.transact(() => {\n this.consumeSlash();\n if (choice === 'rule') {\n const loc = this.current();\n if (loc?.text && loc.text.length === 0) {\n const rule = makeBlock('rule');\n const para = makeBlock('paragraph');\n blocksOf(this.doc).delete(loc.index, 1);\n blocksOf(this.doc).insert(loc.index, [rule, para]);\n this.selection = collapsed(String(para.get('id')), 0);\n }\n return;\n }\n const type: BlockType =\n choice === 'h1' || choice === 'h2' || choice === 'h3'\n ? 'heading'\n : choice === 'quote'\n ? 'blockquote'\n : choice === 'paragraph'\n ? 'paragraph'\n : choice;\n const level = choice === 'h1' ? 1 : choice === 'h2' ? 2 : choice === 'h3' ? 3 : 1;\n const loc = this.current();\n if (!loc) return;\n loc.map.set('type', type);\n if (type === 'heading') loc.map.set('level', level);\n else loc.map.delete('level');\n });\n return 'applied';\n }\n\n paste(html: string | null, plain: string | null): void {\n const parsed = html?.trim() ? parseHtml(html) : [];\n if (parsed.length === 1 && parsed[0] && parsed[0].type === 'paragraph') {\n this.transact(() => {\n if (hasRange(this.doc, this.selection)) this.deleteRange();\n const loc = this.ensureText();\n if (!loc?.text) return;\n writeDelta(loc.text, parsed[0].delta, this.selection.head.offset);\n this.selection = collapsed(loc.id, this.selection.head.offset + deltaLength(parsed[0].delta));\n });\n return;\n }\n if (parsed.length > 0) {\n this.insertParsed(parsed);\n return;\n }\n if (!plain) return;\n const lines = plain.replace(/\\r\\n/g, '\\n').split('\\n');\n this.transact(() => {\n if (hasRange(this.doc, this.selection)) this.deleteRange();\n const loc = this.ensureText();\n if (!loc?.text) return;\n loc.text.insert(this.selection.head.offset, lines[0] ?? '', packAttrs(this.typingAttrs(loc.text, this.selection.head.offset)));\n let offset = this.selection.head.offset + (lines[0]?.length ?? 0);\n this.selection = collapsed(loc.id, offset);\n if (lines.length === 1) return;\n const rest = lines.slice(1).map((line) => makeBlock('paragraph', { delta: line ? [{ insert: line }] : [] }));\n const right = sliceDelta(readDelta(loc.text), offset, loc.text.length);\n if (offset < loc.text.length) loc.text.delete(offset, loc.text.length - offset);\n const tail = makeBlock(loc.type === 'heading' ? 'paragraph' : loc.type, { level: loc.level, delta: right });\n blocksOf(this.doc).insert(loc.index + 1, [...rest, tail]);\n const last = rest[rest.length - 1];\n this.selection = collapsed(String(last?.get('id') ?? loc.id), deltaLength(last ? readDelta(last.get('text') as Y.Text) : []));\n });\n }\n\n replaceHtml(html: string): void {\n const parsed = parseHtml(html);\n const blocks = parsed.length > 0 ? parsed : [{ id: '', type: 'paragraph' as const, level: 0, src: '', alt: '', delta: [] }];\n this.doc.transact(() => {\n const list = blocksOf(this.doc);\n if (list.length > 0) list.delete(0, list.length);\n list.insert(0, blocks.map((block) => makeBlock(block.type, block)));\n }, this.origin);\n this.undoManager.clear();\n const first = locateAt(this.doc, 0);\n this.selection = collapsed(first?.id ?? '', 0);\n this.stored = null;\n this.emit(true);\n }\n\n reconcileText(blockId: string, next: string): void {\n const loc = locate(this.doc, blockId);\n if (!loc?.text) return;\n const prev = loc.text.toString();\n if (prev === next) return;\n const edges = commonEdges(prev, next);\n const attrs = attrsAt(readDelta(loc.text), edges.start);\n this.transact(() => {\n const again = locate(this.doc, blockId);\n if (!again?.text) return;\n if (edges.prevEnd > edges.start) again.text.delete(edges.start, edges.prevEnd - edges.start);\n const insert = next.slice(edges.start, edges.nextEnd);\n if (insert) again.text.insert(edges.start, insert, packAttrs(this.stored ?? attrs));\n this.selection = collapsed(blockId, edges.start + insert.length);\n });\n }\n\n snapshot(): SessionSnapshot {\n const loc = this.current();\n const marks = this.toolbarMarks();\n return {\n blockType: loc?.type ?? 'paragraph',\n level: loc?.type === 'heading' ? loc.level : 0,\n marks,\n href: marks.href ?? null,\n slash: this.slashQuery(),\n canUndo: this.canUndo,\n canRedo: this.canRedo,\n };\n }\n\n dismissSlash(): void {\n this.transact(() => this.consumeSlash());\n }\n\n private slashQuery(): string | null {\n if (hasRange(this.doc, this.selection)) return null;\n const loc = this.current();\n if (!loc?.text) return null;\n const text = loc.text.toString();\n if (!/^\\/[a-zA-Z0-9]*$/.test(text)) return null;\n if (this.selection.head.offset !== text.length) return null;\n return text.slice(1);\n }\n\n private consumeSlash(): void {\n const loc = this.current();\n if (!loc?.text) return;\n const text = loc.text.toString();\n if (/^\\/[a-zA-Z0-9]*$/.test(text)) {\n loc.text.delete(0, text.length);\n this.selection = collapsed(loc.id, 0);\n }\n }\n\n private typingAttrs(text: Y.Text | null, offset: number): TextAttrs {\n if (this.stored) return { ...this.stored };\n if (!text) return {};\n return attrsAt(readDelta(text), offset);\n }\n\n private effectiveMarks(): TextAttrs {\n const loc = this.current();\n return this.typingAttrs(loc?.text ?? null, this.selection.head.offset);\n }\n\n private toolbarMarks(): TextAttrs {\n if (!hasRange(this.doc, this.selection)) return this.effectiveMarks();\n const marks: TextAttrs = { bold: true, italic: true, underline: true, strike: true, code: true };\n let href: string | null | undefined;\n let any = false;\n for (const slice of this.iterRange()) {\n any = true;\n for (const op of slice.delta) {\n const attrs = op.attributes ?? {};\n if (!attrs.bold) marks.bold = false;\n if (!attrs.italic) marks.italic = false;\n if (!attrs.underline) marks.underline = false;\n if (!attrs.strike) marks.strike = false;\n if (!attrs.code) marks.code = false;\n const link = attrs.href ?? null;\n if (href === undefined) href = link;\n else if (href !== link) href = null;\n }\n }\n if (!any) return {};\n if (href) marks.href = href;\n return marks;\n }\n\n private rangeHas(mark: MarkName): boolean {\n let any = false;\n for (const slice of this.iterRange()) {\n for (const op of slice.delta) {\n any = true;\n if (!op.attributes?.[mark]) return false;\n }\n }\n return any;\n }\n\n private formatRange(attrs: Record<string, unknown>): void {\n for (const slice of this.iterRange()) {\n if (slice.delta.length === 0) continue;\n const loc = locate(this.doc, slice.id);\n if (!loc?.text) continue;\n const length = deltaLength(slice.delta);\n if (length > 0) loc.text.format(slice.from, length, attrs);\n }\n }\n\n private iterRange(): Array<{ id: string; from: number; delta: Delta }> {\n const bounds = boundsOf(this.doc, this.selection);\n if (!bounds) return [];\n const out: Array<{ id: string; from: number; delta: Delta }> = [];\n for (let index = bounds.startIndex; index <= bounds.endIndex; index += 1) {\n const loc = locateAt(this.doc, index);\n if (!loc?.text) continue;\n const delta = readDelta(loc.text);\n const from = index === bounds.startIndex ? bounds.start.offset : 0;\n const to = index === bounds.endIndex ? bounds.end.offset : loc.text.length;\n out.push({ id: loc.id, from, delta: sliceDelta(delta, from, to) });\n }\n return out;\n }\n\n private deleteRange(): void {\n const bounds = boundsOf(this.doc, this.selection);\n if (!bounds) return;\n if (bounds.startIndex === bounds.endIndex) {\n const loc = locateAt(this.doc, bounds.startIndex);\n if (!loc) return;\n if (!loc.text) {\n blocksOf(this.doc).delete(loc.index, 1);\n this.ensureBlock();\n const next = locateAt(this.doc, Math.min(loc.index, blocksOf(this.doc).length - 1));\n if (next) this.selection = collapsed(next.id, 0);\n return;\n }\n loc.text.delete(bounds.start.offset, bounds.end.offset - bounds.start.offset);\n this.selection = collapsed(loc.id, bounds.start.offset);\n return;\n }\n const start = locateAt(this.doc, bounds.startIndex);\n const end = locateAt(this.doc, bounds.endIndex);\n if (!start || !end) return;\n const endSurvives = !!end.text && bounds.end.offset < end.text.length;\n if (end.text && bounds.end.offset > 0) end.text.delete(0, Math.min(bounds.end.offset, end.text.length));\n const startSurvives = !!start.text;\n if (start.text && bounds.start.offset < start.text.length) {\n start.text.delete(bounds.start.offset, start.text.length - bounds.start.offset);\n }\n const from = startSurvives ? start.index + 1 : start.index;\n const to = endSurvives ? end.index - 1 : end.index;\n if (to >= from) blocksOf(this.doc).delete(from, to - from + 1);\n const startNow = locate(this.doc, start.id);\n const endNow = locate(this.doc, end.id);\n if (startNow?.text && endNow?.text && startNow.id !== endNow.id) {\n const join = startNow.text.length;\n writeDelta(startNow.text, readDelta(endNow.text), join);\n blocksOf(this.doc).delete(endNow.index, 1);\n this.selection = collapsed(startNow.id, join);\n return;\n }\n this.ensureBlock();\n if (startNow) this.selection = collapsed(startNow.id, Math.min(bounds.start.offset, startNow.text?.length ?? 0));\n else {\n const fallback = locateAt(this.doc, Math.min(from, blocksOf(this.doc).length - 1));\n if (fallback) this.selection = collapsed(fallback.id, 0);\n }\n }\n\n private insertParsed(parsed: BlockData[]): void {\n this.transact(() => {\n if (hasRange(this.doc, this.selection)) this.deleteRange();\n const loc = this.current() ?? locateAt(this.doc, 0);\n if (!loc) return;\n const maps = parsed.map((block) => makeBlock(block.type, block));\n if (loc.text && loc.text.length === 0) {\n blocksOf(this.doc).delete(loc.index, 1);\n blocksOf(this.doc).insert(loc.index, maps);\n } else {\n blocksOf(this.doc).insert(loc.index + 1, maps);\n }\n const last = maps[maps.length - 1];\n const text = last?.get('text');\n const offset = text instanceof Y.Text ? text.length : 0;\n this.selection = collapsed(String(last?.get('id') ?? loc.id), offset);\n });\n }\n\n private selectedBlocks(): LocatedBlock[] {\n const bounds = boundsOf(this.doc, this.selection);\n if (!bounds) return [];\n const out: LocatedBlock[] = [];\n for (let index = bounds.startIndex; index <= bounds.endIndex; index += 1) {\n const loc = locateAt(this.doc, index);\n if (loc) out.push(loc);\n }\n return out;\n }\n\n private ensureText(): LocatedBlock | null {\n const loc = this.current();\n if (!loc) return null;\n if (loc.text) return loc;\n const created = makeBlock('paragraph');\n blocksOf(this.doc).insert(loc.index + 1, [created]);\n const next = locate(this.doc, String(created.get('id')));\n if (next) this.selection = collapsed(next.id, 0);\n return next;\n }\n\n private ensureBlock(): void {\n if (blocksOf(this.doc).length === 0) blocksOf(this.doc).insert(0, [makeBlock('paragraph')]);\n }\n\n private current(): LocatedBlock | null {\n return locate(this.doc, this.selection.head.blockId) ?? locateAt(this.doc, 0);\n }\n\n private clampSelection(): void {\n const blocks = blocksOf(this.doc);\n if (blocks.length === 0) return;\n const clampPoint = (point: Point): Point => {\n const loc = locate(this.doc, point.blockId);\n if (!loc) {\n const first = locateAt(this.doc, 0);\n return { blockId: first?.id ?? '', offset: 0 };\n }\n const max = loc.text?.length ?? 0;\n return { blockId: loc.id, offset: Math.max(0, Math.min(point.offset, max)) };\n };\n this.selection = { anchor: clampPoint(this.selection.anchor), head: clampPoint(this.selection.head) };\n }\n\n private transact(fn: () => void): void {\n this.pendingBefore = cloneSelection(this.selection);\n this.doc.transact(fn, this.origin);\n this.clampSelection();\n this.emit(true);\n }\n\n private emit(structural: boolean): void {\n for (const listener of this.listeners) listener(structural);\n }\n}\n\nfunction isSelection(value: unknown): value is Selection {\n if (!value || typeof value !== 'object') return false;\n const selection = value as Selection;\n return !!selection.anchor && !!selection.head && typeof selection.anchor.blockId === 'string' && typeof selection.head.offset === 'number';\n}\n\nexport function loadHtml(doc: Y.Doc, html: string, origin: unknown = 'seed'): void {\n const parsed = parseHtml(html);\n const blocks = parsed.length > 0 ? parsed : [{ id: '', type: 'paragraph' as const, level: 0, src: '', alt: '', delta: [] }];\n doc.transact(() => {\n const list = blocksOf(doc);\n if (list.length > 0) list.delete(0, list.length);\n list.insert(0, blocks.map((block) => makeBlock(block.type, block)));\n }, origin);\n}\n","export const WIND_TOOLS = [\n 'paragraph',\n 'h1',\n 'h2',\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n 'code',\n 'link',\n 'bullet',\n 'ordered',\n 'quote',\n 'codeblock',\n 'rule',\n 'image',\n 'clear',\n 'undo',\n 'redo',\n 'source',\n] as const;\n\nexport type WindTool = (typeof WIND_TOOLS)[number];\n\nexport type WindToolbarPreset = 'full' | 'writing' | 'basic' | 'minimal';\n\nexport const WIND_TOOLBAR_PRESETS: Record<WindToolbarPreset, readonly WindTool[]> = {\n full: WIND_TOOLS,\n writing: ['paragraph', 'h1', 'h2', 'bold', 'italic', 'link', 'bullet', 'ordered', 'quote', 'undo', 'redo'],\n basic: ['bold', 'italic', 'underline', 'strike', 'link', 'bullet', 'ordered', 'undo', 'redo'],\n minimal: ['bold', 'italic', 'link'],\n};\n\nconst KNOWN = new Set<string>(WIND_TOOLS);\n\nexport function isWindTool(value: string): value is WindTool {\n return KNOWN.has(value);\n}\n\nexport function isToolbarPreset(value: string): value is WindToolbarPreset {\n return value === 'full' || value === 'writing' || value === 'basic' || value === 'minimal';\n}\n\n/** A preset name, or an explicit list. Unknown ids are dropped. List order is the button order. */\nexport function resolveToolbar(value?: WindToolbarPreset | readonly string[] | null): WindTool[] {\n if (value == null) return [...WIND_TOOLS];\n if (typeof value === 'string') return [...(isToolbarPreset(value) ? WIND_TOOLBAR_PRESETS[value] : WIND_TOOLS)];\n const picked: WindTool[] = [];\n for (const id of value) {\n if (isWindTool(id) && !picked.includes(id)) picked.push(id);\n }\n return picked;\n}\n","import * as Y from 'yjs';\nimport { deltaToText } from './delta';\nimport { safeUrl } from './html';\nimport { loadHtml, readBlocks, WindSession } from './session';\nimport type { SlashChoice } from './session';\nimport type { BlockData, BlockType, Delta, EditorSnapshot, MarkName, Point, Selection } from './types';\n\nexport interface SlashPoint {\n top: number;\n left: number;\n}\n\nexport interface SurfaceChange extends EditorSnapshot {\n slashRect: SlashPoint | null;\n}\n\nexport type WindCommand =\n | { type: 'mark'; mark: MarkName }\n | { type: 'link'; href: string | null }\n | { type: 'clear' }\n | { type: 'block'; block: BlockType; level?: number }\n | { type: 'divider' }\n | { type: 'image'; src: string; alt?: string }\n | { type: 'undo' }\n | { type: 'redo' }\n | { type: 'slash'; choice: SlashChoice };\n\nexport interface WindMount {\n destroy(): void;\n focus(): void;\n exec(command: WindCommand): void;\n setReadonly(readonly: boolean): void;\n setPlaceholder(value: string): void;\n setHtml(html: string): void;\n getHtml(): string;\n session: WindSession;\n}\n\nexport interface SurfaceOptions {\n html?: string;\n placeholder?: string;\n readonly?: boolean;\n onChange?: (change: SurfaceChange) => void;\n /** Return true to swallow the key (slash menu, for example). */\n interceptKey?: (event: KeyboardEvent) => boolean;\n onLink?: () => void;\n}\n\ninterface DomPoint {\n node: Node;\n offset: number;\n}\n\nexport function mountWindSurface(host: HTMLElement, options: SurfaceOptions): WindMount {\n const doc = new Y.Doc();\n if (options.html) loadHtml(doc, options.html);\n const session = new WindSession(doc);\n const frame = host;\n frame.classList.add('wind-frame');\n const docEl = document.createElement('div');\n docEl.className = 'wind-doc';\n docEl.setAttribute('role', 'textbox');\n docEl.setAttribute('aria-multiline', 'true');\n docEl.setAttribute('aria-label', 'Document');\n docEl.spellcheck = true;\n frame.replaceChildren(docEl);\n\n let placeholder = options.placeholder ?? 'Write something…';\n let readonly = options.readonly ?? false;\n let silent = 0;\n let composing = false;\n let pending = false;\n let destroyed = false;\n\n const applyEditable = () => {\n docEl.contentEditable = readonly ? 'false' : 'true';\n frame.classList.toggle('is-readonly', readonly);\n };\n applyEditable();\n\n const focused = () => docEl === document.activeElement || docEl.contains(document.activeElement);\n\n const blockEl = (id: string) => docEl.querySelector<HTMLElement>(`[data-id=\"${CSS.escape(id)}\"]`);\n\n const pointToDom = (point: Point): DomPoint | null => {\n const el = blockEl(point.blockId);\n if (!el) return null;\n if (el.dataset['atomic'] === 'true') return { node: el, offset: 0 };\n const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT);\n let left = point.offset;\n let last: Text | null = null;\n while (walker.nextNode()) {\n const text = walker.currentNode as Text;\n last = text;\n if (left <= text.length) return { node: text, offset: left };\n left -= text.length;\n }\n if (last) return { node: last, offset: last.length };\n return { node: el, offset: 0 };\n };\n\n const pointFromNode = (node: Node, offset: number): Point | null => {\n const element = node.nodeType === Node.ELEMENT_NODE ? (node as HTMLElement) : node.parentElement;\n const block = element?.closest<HTMLElement>('[data-id]');\n if (!block || !docEl.contains(block)) return null;\n const blockId = block.dataset['id'] ?? '';\n if (block.dataset['atomic'] === 'true') return { blockId, offset: 0 };\n const range = document.createRange();\n range.selectNodeContents(block);\n try {\n range.setEnd(node, offset);\n } catch {\n return { blockId, offset: 0 };\n }\n return { blockId, offset: range.toString().length };\n };\n\n const readSelection = (): Selection | null => {\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return null;\n if (!sel.anchorNode || !docEl.contains(sel.anchorNode)) return null;\n const anchor = pointFromNode(sel.anchorNode, sel.anchorOffset);\n const headNode = sel.focusNode ?? sel.anchorNode;\n const head = pointFromNode(headNode, sel.focusOffset);\n if (!anchor || !head) return null;\n return { anchor, head };\n };\n\n const samePoint = (a: Point, b: Point) => a.blockId === b.blockId && a.offset === b.offset;\n const sameSelection = (a: Selection, b: Selection) => samePoint(a.anchor, b.anchor) && samePoint(a.head, b.head);\n\n const applySelection = (selection: Selection) => {\n const anchor = pointToDom(selection.anchor);\n const head = pointToDom(selection.head);\n if (!anchor || !head) return;\n const sel = document.getSelection();\n if (!sel) return;\n silent += 1;\n try {\n sel.setBaseAndExtent(anchor.node, anchor.offset, head.node, head.offset);\n } catch {\n /* The node may have been removed mid-update. */\n }\n queueMicrotask(() => {\n silent = Math.max(0, silent - 1);\n });\n };\n\n const fillInline = (el: HTMLElement, delta: Delta) => {\n el.replaceChildren();\n if (deltaToText(delta).length === 0) {\n el.append(document.createElement('br'));\n return;\n }\n for (const op of delta) {\n let node: Node = document.createTextNode(op.insert);\n const attrs = op.attributes ?? {};\n const wrap = (tag: string, child: Node) => {\n const wrapped = document.createElement(tag);\n wrapped.append(child);\n return wrapped;\n };\n if (attrs.code) node = wrap('code', node);\n if (attrs.strike) node = wrap('s', node);\n if (attrs.underline) node = wrap('u', node);\n if (attrs.italic) node = wrap('em', node);\n if (attrs.bold) node = wrap('strong', node);\n if (attrs.href) {\n const href = safeUrl(attrs.href);\n if (href) {\n const link = document.createElement('a');\n link.href = href;\n link.rel = 'noopener noreferrer';\n link.append(node);\n node = link;\n }\n }\n el.append(node);\n }\n };\n\n const bind = (el: HTMLElement, block: BlockData) => {\n el.dataset['id'] = block.id;\n el.dataset['type'] = block.type;\n };\n\n const draw = () => {\n const blocks = readBlocks(session.doc);\n const fragment = document.createDocumentFragment();\n let index = 0;\n while (index < blocks.length) {\n const block = blocks[index];\n if (!block) break;\n if (block.type === 'bullet' || block.type === 'ordered') {\n const list = document.createElement(block.type === 'bullet' ? 'ul' : 'ol');\n while (index < blocks.length && blocks[index]?.type === block.type) {\n const item = blocks[index] as BlockData;\n const li = document.createElement('li');\n bind(li, item);\n fillInline(li, item.delta);\n list.append(li);\n index += 1;\n }\n fragment.append(list);\n continue;\n }\n if (block.type === 'image') {\n const figure = document.createElement('figure');\n bind(figure, block);\n figure.dataset['atomic'] = 'true';\n figure.contentEditable = 'false';\n const image = document.createElement('img');\n const src = safeUrl(block.src);\n if (src) image.src = src;\n image.alt = block.alt;\n image.draggable = false;\n figure.append(image);\n fragment.append(figure);\n index += 1;\n continue;\n }\n if (block.type === 'rule') {\n const rule = document.createElement('hr');\n bind(rule, block);\n rule.dataset['atomic'] = 'true';\n fragment.append(rule);\n index += 1;\n continue;\n }\n const tag = block.type === 'heading' ? `h${Math.min(3, Math.max(1, block.level || 1))}` : block.type === 'blockquote' ? 'blockquote' : block.type === 'code' ? 'pre' : 'p';\n const el = document.createElement(tag);\n bind(el, block);\n if (block.type === 'code') {\n const code = document.createElement('code');\n fillInline(code, block.delta);\n el.append(code);\n } else {\n fillInline(el, block.delta);\n }\n if (block.type === 'paragraph' && deltaToText(block.delta).length === 0) el.dataset['placeholder'] = placeholder;\n fragment.append(el);\n index += 1;\n }\n const empty = blocks.length === 1 && blocks[0]?.type === 'paragraph' && deltaToText(blocks[0].delta).length === 0;\n docEl.dataset['empty'] = empty ? 'true' : 'false';\n docEl.replaceChildren(fragment);\n const head = blockEl(session.selection.head.blockId);\n if (head?.dataset['atomic'] === 'true') head.classList.add('is-selected');\n if (focused()) applySelection(session.selection);\n };\n\n const slashRect = (): SlashPoint | null => {\n if (session.snapshot().slash === null) return null;\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0 || !sel.anchorNode || !docEl.contains(sel.anchorNode)) return null;\n const rect = sel.getRangeAt(0).getBoundingClientRect();\n return { top: rect.bottom + 6, left: Math.max(8, rect.left) };\n };\n\n const publish = () => {\n const snap = session.snapshot();\n const blocks = readBlocks(session.doc);\n const text = blocks\n .map((block) => (block.type === 'image' ? block.alt || block.src : block.type === 'rule' ? '' : deltaToText(block.delta)))\n .join('\\n');\n const words = text.trim() ? text.trim().split(/\\s+/).length : 0;\n options.onChange?.({\n html: session.html,\n text,\n words,\n characters: text.replace(/\\s/g, '').length,\n slashRect: slashRect(),\n ...snap,\n });\n };\n\n const redraw = (structural: boolean) => {\n if (destroyed) return;\n if (composing && structural) {\n pending = true;\n publish();\n return;\n }\n if (structural) draw();\n publish();\n };\n\n const unsession = session.onChange(redraw);\n\n const reconcileDom = () => {\n const elements = [...docEl.querySelectorAll<HTMLElement>('[data-id]')];\n const model = readBlocks(session.doc);\n if (elements.length !== model.length || model.some((block) => !elements.some((el) => el.dataset['id'] === block.id))) {\n session.replaceHtml(docEl.innerHTML);\n return;\n }\n for (const el of elements) {\n const id = el.dataset['id'];\n if (!id || el.dataset['atomic'] === 'true') continue;\n session.reconcileText(id, el.textContent ?? '');\n }\n };\n\n docEl.addEventListener('beforeinput', (event) => {\n if (readonly) {\n event.preventDefault();\n return;\n }\n if (composing) return;\n const input = event as InputEvent;\n const type = input.inputType;\n if (type === 'insertText') {\n event.preventDefault();\n session.insertText(input.data ?? '');\n } else if (type === 'insertParagraph') {\n event.preventDefault();\n session.split('enter');\n } else if (type === 'insertLineBreak') {\n event.preventDefault();\n session.split('hard');\n } else if (type === 'deleteContentBackward') {\n event.preventDefault();\n session.deleteBackward();\n } else if (type === 'deleteContentForward') {\n event.preventDefault();\n session.deleteForward();\n } else if (type === 'insertFromPaste' || type === 'insertFromDrop') {\n event.preventDefault();\n const html = input.dataTransfer?.getData('text/html') || null;\n const text = input.dataTransfer?.getData('text/plain') || input.data || null;\n session.paste(html, text);\n } else if (type === 'historyUndo') {\n event.preventDefault();\n session.undo();\n } else if (type === 'historyRedo') {\n event.preventDefault();\n session.redo();\n } else if (type === 'formatBold') {\n event.preventDefault();\n session.toggleMark('bold');\n } else if (type === 'formatItalic') {\n event.preventDefault();\n session.toggleMark('italic');\n } else if (type === 'formatUnderline') {\n event.preventDefault();\n session.toggleMark('underline');\n } else if (type === 'formatStrikeThrough') {\n event.preventDefault();\n session.toggleMark('strike');\n } else if (type.startsWith('delete')) {\n event.preventDefault();\n session.deleteBackward();\n }\n });\n\n docEl.addEventListener('input', () => {\n if (composing || silent > 0) return;\n reconcileDom();\n });\n\n docEl.addEventListener('compositionstart', () => {\n composing = true;\n });\n docEl.addEventListener('compositionend', () => {\n composing = false;\n const sel = readSelection();\n if (sel) {\n const el = blockEl(sel.head.blockId);\n if (el && el.dataset['atomic'] !== 'true') session.reconcileText(sel.head.blockId, el.textContent ?? '');\n }\n if (pending) {\n pending = false;\n draw();\n }\n publish();\n });\n\n const onSelectionChange = () => {\n if (silent > 0 || composing || !focused()) return;\n const next = readSelection();\n if (!next || sameSelection(next, session.selection)) return;\n session.select(next);\n };\n document.addEventListener('selectionchange', onSelectionChange);\n\n docEl.addEventListener('keydown', (event) => {\n if (options.interceptKey?.(event)) return;\n if (readonly) return;\n const meta = event.metaKey || event.ctrlKey;\n const key = event.key.toLowerCase();\n if (meta && key === 'b') {\n event.preventDefault();\n session.toggleMark('bold');\n } else if (meta && key === 'i') {\n event.preventDefault();\n session.toggleMark('italic');\n } else if (meta && key === 'u') {\n event.preventDefault();\n session.toggleMark('underline');\n } else if (meta && key === 'e') {\n event.preventDefault();\n session.toggleMark('code');\n } else if (meta && event.shiftKey && (key === 's' || key === 'x')) {\n event.preventDefault();\n session.toggleMark('strike');\n } else if (meta && key === 'k') {\n event.preventDefault();\n options.onLink?.();\n } else if (meta && key === 'z') {\n event.preventDefault();\n if (event.shiftKey) session.redo();\n else session.undo();\n } else if (meta && key === 'y') {\n event.preventDefault();\n session.redo();\n } else if (event.key === 'Enter' && meta) {\n event.preventDefault();\n session.split('exit');\n } else if (event.key === 'Tab') {\n event.preventDefault();\n session.insertText(' ');\n }\n });\n\n docEl.addEventListener('mousedown', (event) => {\n const target = event.target instanceof Element ? event.target : null;\n const atomic = target?.closest<HTMLElement>('[data-atomic]');\n if (!atomic || !docEl.contains(atomic)) return;\n event.preventDefault();\n const id = atomic.dataset['id'];\n if (!id) return;\n docEl.focus();\n session.focusPoint(id, 0);\n draw();\n });\n\n docEl.addEventListener('click', (event) => {\n const target = event.target instanceof Element ? event.target : null;\n const link = target?.closest('a');\n if (!link || !docEl.contains(link)) return;\n if (!event.metaKey && !event.ctrlKey) event.preventDefault();\n });\n\n docEl.addEventListener('cut', (event) => {\n const sel = document.getSelection();\n if (!sel || sel.isCollapsed || !sel.anchorNode || !docEl.contains(sel.anchorNode)) return;\n event.preventDefault();\n const range = sel.getRangeAt(0);\n const holder = document.createElement('div');\n holder.append(range.cloneContents());\n event.clipboardData?.setData('text/plain', range.toString());\n event.clipboardData?.setData('text/html', holder.innerHTML);\n session.deleteBackward();\n });\n\n draw();\n publish();\n\n return {\n session,\n destroy() {\n destroyed = true;\n document.removeEventListener('selectionchange', onSelectionChange);\n unsession();\n frame.replaceChildren();\n },\n focus() {\n docEl.focus();\n },\n exec(command) {\n if (readonly && command.type !== 'undo' && command.type !== 'redo') return;\n if (command.type === 'mark') session.toggleMark(command.mark);\n else if (command.type === 'link') session.setLink(command.href);\n else if (command.type === 'clear') session.clearMarks();\n else if (command.type === 'block') session.setBlockType(command.block, command.level ?? 1);\n else if (command.type === 'divider') session.insertDivider();\n else if (command.type === 'image') session.insertImage(command.src, command.alt ?? '');\n else if (command.type === 'undo') session.undo();\n else if (command.type === 'redo') session.redo();\n else if (command.type === 'slash') session.applySlash(command.choice);\n if (!readonly) docEl.focus();\n },\n setReadonly(value) {\n readonly = value;\n applyEditable();\n },\n setPlaceholder(value) {\n placeholder = value;\n draw();\n },\n setHtml(html) {\n if (html === session.html) return;\n session.replaceHtml(html);\n },\n getHtml() {\n return session.html;\n },\n };\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n@Component({\n selector: 'wind-icon',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n @switch (name()) {\n @case ('bold') { <path d=\"M6 4h8a4 4 0 0 1 0 8H6z\" /><path d=\"M6 12h9a4 4 0 0 1 0 8H6z\" /> }\n @case ('italic') { <line x1=\"19\" y1=\"4\" x2=\"10\" y2=\"4\" /><line x1=\"14\" y1=\"20\" x2=\"5\" y2=\"20\" /><line x1=\"15\" y1=\"4\" x2=\"9\" y2=\"20\" /> }\n @case ('underline') { <path d=\"M6 4v6a6 6 0 0 0 12 0V4\" /><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"20\" /> }\n @case ('strike') { <path d=\"M16 5c-.5-1.5-2-2.5-4-2.5-2.5 0-4 1.5-4 3.5 0 4 8 2 8 6 0 2-1.8 3.5-4.2 3.5-2.2 0-3.8-1.2-4.3-3\" /><line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" /> }\n @case ('code') { <path d=\"m8 8-4 4 4 4\" /><path d=\"m16 8 4 4-4 4\" /> }\n @case ('link') { <path d=\"M10 13a5 5 0 0 0 7.5.5l2-2a5 5 0 0 0-7.1-7.1l-1.1 1.1\" /><path d=\"M14 11a5 5 0 0 0-7.5-.5l-2 2a5 5 0 0 0 7.1 7.1l1.1-1.1\" /> }\n @case ('list') { <line x1=\"9\" y1=\"6\" x2=\"20\" y2=\"6\" /><line x1=\"9\" y1=\"12\" x2=\"20\" y2=\"12\" /><line x1=\"9\" y1=\"18\" x2=\"20\" y2=\"18\" /><circle cx=\"5\" cy=\"6\" r=\"1\" fill=\"currentColor\" stroke=\"none\" /><circle cx=\"5\" cy=\"12\" r=\"1\" fill=\"currentColor\" stroke=\"none\" /><circle cx=\"5\" cy=\"18\" r=\"1\" fill=\"currentColor\" stroke=\"none\" /> }\n @case ('ordered') { <line x1=\"10\" y1=\"6\" x2=\"21\" y2=\"6\" /><line x1=\"10\" y1=\"12\" x2=\"21\" y2=\"12\" /><line x1=\"10\" y1=\"18\" x2=\"21\" y2=\"18\" /><path d=\"M4 6h1v4\" /><path d=\"M4 10h2\" /><path d=\"M6 18H4c0-1 2-2 2-3s-1-1.5-2-1\" /> }\n @case ('quote') { <path d=\"M8 7H5a2 2 0 0 0-2 2v3h5V7z\" /><path d=\"M17 7h-3a2 2 0 0 0-2 2v3h5V7z\" /><path d=\"M8 12v2a3 3 0 0 1-3 3\" /><path d=\"M17 12v2a3 3 0 0 1-3 3\" /> }\n @case ('block') { <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" /><path d=\"m9 9-2 3 2 3\" /><path d=\"m15 9 2 3-2 3\" /> }\n @case ('rule') { <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" /> }\n @case ('image') { <rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\" /><circle cx=\"8.5\" cy=\"10\" r=\"1.5\" /><path d=\"m21 16-5-4-9 8\" /> }\n @case ('undo') { <path d=\"M3 7v6h6\" /><path d=\"M21 17a9 9 0 0 0-15-6.7L3 13\" /> }\n @case ('redo') { <path d=\"M21 7v6h-6\" /><path d=\"M3 17a9 9 0 0 1 15-6.7L21 13\" /> }\n @case ('clear') { <path d=\"M4 7h16\" /><path d=\"M9 7V5h6v2\" /><path d=\"m8 7 1 12h6l1-12\" /> }\n @case ('source') { <path d=\"M8 6 3 12l5 6\" /><path d=\"m16 6 5 6-5 6\" /><path d=\"m14 4-4 16\" /> }\n }\n </svg>\n `,\n styles: [':host{display:inline-flex} svg{width:1rem;height:1rem;display:block}'],\n})\nexport class WindIcon {\n readonly name = input.required<string>();\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n ViewEncapsulation,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n model,\n signal,\n viewChild,\n} from '@angular/core';\nimport { filterSlash } from './catalog';\nimport type { SlashItem } from './catalog';\nimport { mountWindSurface } from './surface';\nimport type { SurfaceChange, WindMount } from './surface';\nimport type { MarkName } from './types';\nimport { resolveToolbar } from './toolbar';\nimport type { WindTool, WindToolbarPreset } from './toolbar';\nimport { WindIcon } from './wind-icon';\n\ninterface Tool {\n id: WindTool;\n label: string;\n icon: string;\n}\n\nconst TOOLS: Tool[] = [\n { id: 'paragraph', label: 'Text', icon: 'block' },\n { id: 'h1', label: 'Heading 1', icon: 'block' },\n { id: 'h2', label: 'Heading 2', icon: 'block' },\n { id: 'bold', label: 'Bold', icon: 'bold' },\n { id: 'italic', label: 'Italic', icon: 'italic' },\n { id: 'underline', label: 'Underline', icon: 'underline' },\n { id: 'strike', label: 'Strikethrough', icon: 'strike' },\n { id: 'code', label: 'Inline code', icon: 'code' },\n { id: 'link', label: 'Link', icon: 'link' },\n { id: 'bullet', label: 'Bullet list', icon: 'list' },\n { id: 'ordered', label: 'Numbered list', icon: 'ordered' },\n { id: 'quote', label: 'Quote', icon: 'quote' },\n { id: 'codeblock', label: 'Code block', icon: 'block' },\n { id: 'rule', label: 'Divider', icon: 'rule' },\n { id: 'image', label: 'Image', icon: 'image' },\n { id: 'clear', label: 'Clear formatting', icon: 'clear' },\n { id: 'undo', label: 'Undo', icon: 'undo' },\n { id: 'redo', label: 'Redo', icon: 'redo' },\n { id: 'source', label: 'HTML', icon: 'source' },\n];\n\n@Component({\n selector: 'wind-editor',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [WindIcon],\n styleUrl: './styles/ngx-wind-editor.css',\n host: { class: 'wind-editor block min-w-0' },\n template: `\n <div class=\"rounded-xl border border-stone-200 bg-white text-stone-900 shadow-sm dark:border-stone-800 dark:bg-stone-950 dark:text-stone-100\">\n @if (showToolbar() && tools().length > 0) {\n <div class=\"flex gap-0.5 overflow-x-auto border-b border-stone-200 px-1.5 py-1.5 dark:border-stone-800\" role=\"toolbar\" aria-label=\"Formatting\">\n @for (tool of tools(); track tool.id) {\n <button\n type=\"button\"\n class=\"inline-flex h-9 shrink-0 items-center justify-center gap-1 rounded-md px-2 text-sm text-stone-600 hover:bg-stone-100 disabled:opacity-40 aria-pressed:bg-teal-700 aria-pressed:text-white dark:text-stone-300 dark:hover:bg-stone-900 dark:aria-pressed:bg-teal-600\"\n [attr.aria-label]=\"tool.label\"\n [attr.title]=\"tool.label\"\n [attr.aria-pressed]=\"pressed(tool.id)\"\n [disabled]=\"disabled(tool.id)\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"run(tool.id)\"\n >\n @if (tool.id === 'paragraph' || tool.id === 'h1' || tool.id === 'h2') {\n <span class=\"px-0.5 text-xs font-semibold tracking-wide\">{{ tool.id === 'paragraph' ? 'P' : tool.id.toUpperCase() }}</span>\n } @else {\n <wind-icon [name]=\"tool.icon\" />\n }\n </button>\n }\n </div>\n }\n\n @if (linkOpen()) {\n <form class=\"flex flex-wrap items-center gap-2 border-b border-stone-200 px-3 py-2 dark:border-stone-800\" (submit)=\"applyLink($event)\">\n <label class=\"sr-only\" for=\"wind-link\">Link URL</label>\n <input\n id=\"wind-link\"\n class=\"h-9 min-w-0 flex-1 rounded-md border border-stone-300 bg-white px-2 text-sm outline-none focus:border-teal-700 dark:border-stone-700 dark:bg-stone-900\"\n [value]=\"linkDraft()\"\n placeholder=\"https://\"\n (input)=\"onDraft($event, 'link')\"\n />\n <button type=\"submit\" class=\"h-9 rounded-md bg-teal-700 px-3 text-sm font-medium text-white\">Apply</button>\n <button type=\"button\" class=\"h-9 rounded-md px-2 text-sm text-stone-600 dark:text-stone-300\" (click)=\"clearLink()\">Remove</button>\n </form>\n }\n\n @if (imageOpen()) {\n <form class=\"flex flex-wrap items-center gap-2 border-b border-stone-200 px-3 py-2 dark:border-stone-800\" (submit)=\"applyImage($event)\">\n <input class=\"h-9 min-w-0 flex-1 rounded-md border border-stone-300 bg-white px-2 text-sm outline-none focus:border-teal-700 dark:border-stone-700 dark:bg-stone-900\" [value]=\"imageSrc()\" placeholder=\"Image URL\" (input)=\"onDraft($event, 'src')\" />\n <input class=\"h-9 w-36 rounded-md border border-stone-300 bg-white px-2 text-sm outline-none focus:border-teal-700 dark:border-stone-700 dark:bg-stone-900\" [value]=\"imageAlt()\" placeholder=\"Alt text\" (input)=\"onDraft($event, 'alt')\" />\n <button type=\"submit\" class=\"h-9 rounded-md bg-teal-700 px-3 text-sm font-medium text-white\">Insert</button>\n </form>\n }\n\n <div class=\"relative min-h-48\" #surface></div>\n\n @if (slashItems().length > 0 && change()?.slashRect; as rect) {\n <ul\n class=\"fixed z-30 max-h-64 w-56 overflow-auto rounded-lg border border-stone-200 bg-white py-1 shadow-lg dark:border-stone-700 dark:bg-stone-900\"\n role=\"listbox\"\n [style.top.px]=\"rect.top\"\n [style.left.px]=\"rect.left\"\n >\n @for (item of slashItems(); track item.id; let index = $index) {\n <li>\n <button\n type=\"button\"\n class=\"flex w-full items-baseline justify-between gap-3 px-3 py-1.5 text-left text-sm hover:bg-stone-100 dark:hover:bg-stone-800\"\n [class.bg-teal-700]=\"index === slashIndex()\"\n [class.text-white]=\"index === slashIndex()\"\n role=\"option\"\n [attr.aria-selected]=\"index === slashIndex()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"pickSlash(item)\"\n >\n <span>{{ item.label }}</span>\n <span class=\"text-xs opacity-70\">{{ item.hint }}</span>\n </button>\n </li>\n }\n </ul>\n }\n\n <footer class=\"flex items-center justify-between gap-3 border-t border-stone-200 px-3 py-1.5 text-xs text-stone-500 dark:border-stone-800 dark:text-stone-400\">\n <span>{{ change()?.words ?? 0 }} words</span>\n <span class=\"text-stone-400\">/ for blocks</span>\n </footer>\n\n @if (sourceOpen()) {\n <div class=\"border-t border-stone-200 p-3 dark:border-stone-800\">\n <textarea\n class=\"h-40 w-full resize-y rounded-md border border-stone-300 bg-stone-50 p-2 font-mono text-xs outline-none focus:border-teal-700 dark:border-stone-700 dark:bg-stone-900\"\n [value]=\"sourceDraft()\"\n spellcheck=\"false\"\n aria-label=\"HTML source\"\n (input)=\"onDraft($event, 'source')\"\n ></textarea>\n <button type=\"button\" class=\"mt-2 h-9 rounded-md bg-stone-900 px-3 text-sm text-white dark:bg-stone-100 dark:text-stone-900\" (click)=\"applySource()\">Apply HTML</button>\n </div>\n }\n </div>\n `,\n})\nexport class WindEditor {\n readonly html = model('');\n readonly placeholder = input('Write something…');\n readonly readOnly = input(false, { alias: 'readonly' });\n readonly showToolbar = input(true);\n /** Preset name, or the buttons to show, in order. */\n readonly toolbar = input<WindToolbarPreset | readonly WindTool[]>('full');\n\n protected readonly tools = computed(() => {\n const byId = new Map(TOOLS.map((tool) => [tool.id, tool]));\n return resolveToolbar(this.toolbar()).flatMap((id) => {\n const tool = byId.get(id);\n return tool ? [tool] : [];\n });\n });\n protected readonly change = signal<SurfaceChange | null>(null);\n protected readonly linkOpen = signal(false);\n protected readonly linkDraft = signal('');\n protected readonly imageOpen = signal(false);\n protected readonly imageSrc = signal('');\n protected readonly imageAlt = signal('');\n protected readonly sourceOpen = signal(false);\n protected readonly sourceDraft = signal('');\n protected readonly slashIndex = signal(0);\n\n protected readonly slashItems = computed(() => {\n const query = this.change()?.slash;\n return query === null || query === undefined ? [] : filterSlash(query);\n });\n\n private readonly surfaceRef = viewChild<ElementRef<HTMLElement>>('surface');\n private readonly destroyRef = inject(DestroyRef);\n private handle: WindMount | null = null;\n private echo = '';\n\n constructor() {\n afterNextRender(() => this.attach());\n effect(() => {\n const value = this.placeholder();\n this.handle?.setPlaceholder(value);\n });\n effect(() => {\n this.handle?.setReadonly(this.readOnly());\n });\n effect(() => {\n const html = this.html();\n if (html !== this.echo) this.handle?.setHtml(html);\n });\n effect(() => {\n this.slashItems();\n this.slashIndex.set(0);\n });\n this.destroyRef.onDestroy(() => this.handle?.destroy());\n }\n\n protected pressed(id: string): boolean {\n const snap = this.change();\n if (!snap) return false;\n if (id === 'bold' || id === 'italic' || id === 'underline' || id === 'strike' || id === 'code') return !!snap.marks[id];\n if (id === 'link') return !!snap.href;\n if (id === 'paragraph') return snap.blockType === 'paragraph';\n if (id === 'h1') return snap.blockType === 'heading' && snap.level === 1;\n if (id === 'h2') return snap.blockType === 'heading' && snap.level === 2;\n if (id === 'bullet' || id === 'ordered' || id === 'quote') {\n const type = id === 'quote' ? 'blockquote' : id;\n return snap.blockType === type;\n }\n if (id === 'codeblock') return snap.blockType === 'code';\n if (id === 'source') return this.sourceOpen();\n return false;\n }\n\n protected disabled(id: string): boolean {\n if (this.readOnly() && id !== 'source') return true;\n const snap = this.change();\n if (id === 'undo') return !snap?.canUndo;\n if (id === 'redo') return !snap?.canRedo;\n return false;\n }\n\n protected run(id: string): void {\n const handle = this.handle;\n if (!handle) return;\n if (id === 'bold' || id === 'italic' || id === 'underline' || id === 'strike' || id === 'code') {\n handle.exec({ type: 'mark', mark: id as MarkName });\n } else if (id === 'paragraph') handle.exec({ type: 'block', block: 'paragraph' });\n else if (id === 'h1') handle.exec({ type: 'block', block: 'heading', level: 1 });\n else if (id === 'h2') handle.exec({ type: 'block', block: 'heading', level: 2 });\n else if (id === 'bullet' || id === 'ordered') handle.exec({ type: 'block', block: id });\n else if (id === 'quote') handle.exec({ type: 'block', block: 'blockquote' });\n else if (id === 'codeblock') handle.exec({ type: 'block', block: 'code' });\n else if (id === 'rule') handle.exec({ type: 'divider' });\n else if (id === 'clear') handle.exec({ type: 'clear' });\n else if (id === 'undo') handle.exec({ type: 'undo' });\n else if (id === 'redo') handle.exec({ type: 'redo' });\n else if (id === 'link') {\n this.linkDraft.set(this.change()?.href ?? '');\n this.linkOpen.update((open) => !open);\n } else if (id === 'image') this.imageOpen.update((open) => !open);\n else if (id === 'source') {\n this.sourceDraft.set(this.change()?.html ?? this.html());\n this.sourceOpen.update((open) => !open);\n }\n }\n\n protected pickSlash(item: SlashItem): void {\n if (item.id === 'image') {\n this.handle?.exec({ type: 'slash', choice: 'image' });\n this.imageOpen.set(true);\n return;\n }\n this.handle?.exec({ type: 'slash', choice: item.id });\n }\n\n protected applyLink(event: Event): void {\n event.preventDefault();\n this.handle?.exec({ type: 'link', href: this.linkDraft().trim() || null });\n this.linkOpen.set(false);\n }\n\n protected clearLink(): void {\n this.handle?.exec({ type: 'link', href: null });\n this.linkOpen.set(false);\n }\n\n protected applyImage(event: Event): void {\n event.preventDefault();\n const src = this.imageSrc().trim();\n if (!src) return;\n this.handle?.exec({ type: 'image', src, alt: this.imageAlt().trim() });\n this.imageOpen.set(false);\n this.imageSrc.set('');\n this.imageAlt.set('');\n }\n\n protected applySource(): void {\n this.echo = this.sourceDraft();\n this.html.set(this.echo);\n this.handle?.setHtml(this.echo);\n this.sourceOpen.set(false);\n }\n\n protected onDraft(event: Event, field: 'link' | 'src' | 'alt' | 'source'): void {\n const value = event.target instanceof HTMLInputElement || event.target instanceof HTMLTextAreaElement ? event.target.value : '';\n if (field === 'link') this.linkDraft.set(value);\n else if (field === 'src') this.imageSrc.set(value);\n else if (field === 'alt') this.imageAlt.set(value);\n else this.sourceDraft.set(value);\n }\n\n private attach(): void {\n const element = this.surfaceRef()?.nativeElement;\n if (!element || this.handle) return;\n this.handle = mountWindSurface(element, {\n html: this.html() || undefined,\n placeholder: this.placeholder(),\n readonly: this.readOnly(),\n onChange: (change) => {\n this.change.set(change);\n if (change.html !== this.html()) {\n this.echo = change.html;\n this.html.set(change.html);\n }\n },\n onLink: () => {\n this.linkDraft.set(this.change()?.href ?? '');\n this.linkOpen.set(true);\n },\n interceptKey: (event) => this.onKey(event),\n });\n this.echo = this.handle.getHtml();\n if (this.echo !== this.html()) this.html.set(this.echo);\n }\n\n private onKey(event: KeyboardEvent): boolean {\n const items = this.slashItems();\n if (items.length === 0) return false;\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n this.slashIndex.update((index) => (index + 1) % items.length);\n return true;\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n this.slashIndex.update((index) => (index - 1 + items.length) % items.length);\n return true;\n }\n if (event.key === 'Enter' || event.key === 'Tab') {\n event.preventDefault();\n const item = items[this.slashIndex()] ?? items[0];\n if (item) this.pickSlash(item);\n return true;\n }\n if (event.key === 'Escape') {\n event.preventDefault();\n this.handle?.session.dismissSlash();\n return true;\n }\n return false;\n }\n}\n"],"mappings":"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"}