@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.
@@ -0,0 +1 @@
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(options?: FocusOptions): 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(options) {\n docEl.focus(options);\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 output,\n signal,\n viewChild,\n} from '@angular/core';\nimport type { FormValueControl, ValidationError } from '@angular/forms/signals';\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: {\n class: 'wind-editor',\n '(focusout)': 'onFocusOut($event)',\n '[class.is-invalid]': 'invalid()',\n '[class.is-disabled]': 'disabled()',\n '[attr.aria-invalid]': 'invalid() || null',\n '[attr.aria-required]': 'required() || null',\n '[attr.aria-disabled]': 'disabled() || null',\n },\n template: `\n <div class=\"wind-shell\">\n @if (showToolbar() && tools().length > 0) {\n <div class=\"wind-toolbar\" role=\"toolbar\" aria-label=\"Formatting\">\n @for (tool of tools(); track tool.id) {\n <button\n type=\"button\"\n class=\"wind-tool\"\n [attr.aria-label]=\"tool.label\"\n [attr.title]=\"tool.label\"\n [attr.aria-pressed]=\"pressed(tool.id)\"\n [disabled]=\"toolDisabled(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=\"wind-tool-label\">{{ 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=\"wind-pop\" (submit)=\"applyLink($event)\">\n <label class=\"wind-sr\" for=\"wind-link\">Link URL</label>\n <input\n id=\"wind-link\"\n class=\"wind-field\"\n [value]=\"linkDraft()\"\n placeholder=\"https://\"\n (input)=\"onDraft($event, 'link')\"\n />\n <button type=\"submit\" class=\"wind-primary\">Apply</button>\n <button type=\"button\" class=\"wind-quiet\" (click)=\"clearLink()\">Remove</button>\n </form>\n }\n\n @if (imageOpen()) {\n <form class=\"wind-pop\" (submit)=\"applyImage($event)\">\n <input class=\"wind-field\" [value]=\"imageSrc()\" placeholder=\"Image URL\" (input)=\"onDraft($event, 'src')\" />\n <input class=\"wind-field wind-field-short\" [value]=\"imageAlt()\" placeholder=\"Alt text\" (input)=\"onDraft($event, 'alt')\" />\n <button type=\"submit\" class=\"wind-primary\">Insert</button>\n </form>\n }\n\n <div class=\"wind-surface\" #surface></div>\n\n @if (slashItems().length > 0 && change()?.slashRect; as rect) {\n <ul\n class=\"wind-menu\"\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=\"wind-option\"\n [class.is-active]=\"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=\"wind-option-hint\">{{ item.hint }}</span>\n </button>\n </li>\n }\n </ul>\n }\n\n <footer class=\"wind-meta\">\n <span>{{ change()?.words ?? 0 }} words</span>\n <span class=\"wind-meta-hint\">/ for blocks</span>\n </footer>\n\n @if (invalid() && errorText()) {\n <p class=\"wind-error\" role=\"alert\">{{ errorText() }}</p>\n }\n\n @if (sourceOpen()) {\n <div class=\"wind-source\">\n <textarea\n class=\"wind-source-input\"\n [value]=\"sourceDraft()\"\n spellcheck=\"false\"\n aria-label=\"HTML source\"\n (input)=\"onDraft($event, 'source')\"\n ></textarea>\n <button type=\"button\" class=\"wind-primary\" (click)=\"applySource()\">Apply HTML</button>\n </div>\n }\n </div>\n `,\n})\nexport class WindEditor implements FormValueControl<string> {\n /** Signal forms bind this model. `[formField]` requires the public name `value`. */\n readonly value = model('');\n /** Same document as `value`, so existing `[(html)]` bindings keep working. */\n readonly html = model('');\n readonly placeholder = input('Write something…');\n readonly readonly = input(false);\n readonly disabled = input(false);\n readonly invalid = input(false);\n readonly required = input(false);\n readonly touched = input(false);\n readonly errors = input<readonly ValidationError.WithOptionalFieldTree[]>([]);\n readonly touch = output<void>();\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 errorText = computed(() =>\n this.errors()\n .map((error) => error.message || error.kind)\n .filter((message) => message.length > 0)\n .join(' '),\n );\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 next = this.html();\n if (next !== this.value()) this.value.set(next);\n });\n effect(() => {\n const next = this.value();\n if (next !== this.html()) this.html.set(next);\n });\n effect(() => {\n const value = this.placeholder();\n this.handle?.setPlaceholder(value);\n });\n effect(() => {\n this.handle?.setReadonly(this.readonly() || this.disabled());\n });\n effect(() => {\n const html = this.value();\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 toolDisabled(id: string): boolean {\n if ((this.readonly() || this.disabled()) && 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.value());\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.value.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.value() || undefined,\n placeholder: this.placeholder(),\n readonly: this.readonly() || this.disabled(),\n onChange: (change) => {\n this.change.set(change);\n if (change.html !== this.value()) {\n this.echo = change.html;\n this.value.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.value()) this.value.set(this.echo);\n }\n\n /** Signal forms calls this when the bound field should take focus. */\n focus(options?: FocusOptions): void {\n this.handle?.focus(options);\n }\n\n protected onFocusOut(event: FocusEvent): void {\n const next = event.relatedTarget;\n if (next instanceof Node && event.currentTarget instanceof Node && event.currentTarget.contains(next)) return;\n this.touch.emit();\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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"}