@kouji-ui/core 0.8.5 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,31 +8,36 @@
8
8
  kouji type system.
9
9
 
10
10
  The five attribute directives (`kjLead`, `kjMuted`, `kjCode`,
11
- `kjBlockquote`, `kjTruncate`) reflect `data-tone` /
12
- `data-truncate` host attributes; the rules below key off those
11
+ `kjBlockquote`, `kjTruncate`) reflect `data-kj-tone` /
12
+ `data-kj-truncate` host attributes; the rules below key off those
13
13
  attributes so the same styling applies whether the consumer
14
- used the directive, hand-typed `data-tone="muted"` on a span,
15
- or wrapped a subtree in `.kj-prose`.
16
-
17
- Tokens read from the kouji theme layer:
18
- --kj-bg-body / surface / elevated ......... background scale
19
- --kj-fg-default ........................... primary text
20
- --kj-fg-muted ............................. secondary text (≥ 7:1)
21
- --kj-border-default / muted ............... separators / rules
22
- --kj-color-link ........................... anchor colour
23
- --kj-color-link-visited ................... visited anchor
14
+ used the directive, hand-typed `data-kj-tone="muted"` on a span,
15
+ or wrapped a subtree in `.kj-prose`. The bare `data-tone` /
16
+ `data-truncate` spellings are supported alongside the prefixed ones,
17
+ not a deprecation window: an attribute hand-typed in consumer markup
18
+ has no compiler to migrate it, so both selectors stay.
19
+
20
+ Tokens read from @kouji-ui/themes (base.css / density.css / themes):
21
+ --kj-bg-surface ........................... code + pre background
22
+ --kj-fg-default / --kj-fg-muted ........... primary / secondary text
23
+ --kj-fg-primary / --kj-fg-accent .......... anchor / visited anchor
24
+ --kj-border-default / --kj-border-muted ... rules, table borders
24
25
  --kj-font-sans / --kj-font-mono / --kj-font-display
25
- --kj-font-size-xs / sm / md / lg / xl / 2xl / 3xl / 4xl
26
- --kj-line-height-tight / snug / normal / relaxed / loose
27
- --kj-radius-sm / md
28
- --kj-prose-max-width ...................... opt-out for CJK
26
+ --kj-text-sm / base / lg / xl / 2xl / 3xl / 4xl (density.css ramp,
27
+ so [data-kj-density] applies)
28
+ --kj-line-height-tight / snug / normal / relaxed / loose (base.css)
29
+ --kj-radius-field / --kj-radius-box ....... inline code / pre corners
30
+ --kj-prose-max-width ...................... measure cap (base.css; set
31
+ `none` or a wider value for CJK)
32
+ Literal fallbacks mirror the density-1 values so the sheet still renders
33
+ when the themes package is not registered.
29
34
  ───────────────────────────────────────────────────────────── */
30
35
 
31
36
  @layer kj.prose {
32
37
  .kj-prose {
33
38
  color: var(--kj-fg-default);
34
39
  font-family: var(--kj-font-sans);
35
- font-size: var(--kj-font-size-md, 1rem);
40
+ font-size: var(--kj-text-base, 1rem);
36
41
  line-height: var(--kj-line-height-relaxed, 1.7);
37
42
  max-width: var(--kj-prose-max-width, 65ch);
38
43
  text-align: start;
@@ -67,29 +72,29 @@
67
72
  }
68
73
 
69
74
  .kj-prose h1 {
70
- font-size: var(--kj-font-size-4xl, 2.25rem);
75
+ font-size: var(--kj-text-4xl, 2.5rem);
71
76
  font-weight: 700;
72
- line-height: var(--kj-line-height-tight, 1.1);
77
+ line-height: var(--kj-line-height-tight, 1.2);
73
78
  }
74
79
 
75
80
  .kj-prose h2 {
76
- font-size: var(--kj-font-size-3xl, 1.875rem);
81
+ font-size: var(--kj-text-3xl, 2rem);
77
82
  }
78
83
 
79
84
  .kj-prose h3 {
80
- font-size: var(--kj-font-size-2xl, 1.5rem);
85
+ font-size: var(--kj-text-2xl, 1.5rem);
81
86
  }
82
87
 
83
88
  .kj-prose h4 {
84
- font-size: var(--kj-font-size-xl, 1.25rem);
89
+ font-size: var(--kj-text-xl, 1.25rem);
85
90
  }
86
91
 
87
92
  .kj-prose h5 {
88
- font-size: var(--kj-font-size-lg, 1.125rem);
93
+ font-size: var(--kj-text-lg, 1.125rem);
89
94
  }
90
95
 
91
96
  .kj-prose h6 {
92
- font-size: var(--kj-font-size-md, 1rem);
97
+ font-size: var(--kj-text-base, 1rem);
93
98
  text-transform: uppercase;
94
99
  letter-spacing: 0.04em;
95
100
  }
@@ -160,7 +165,7 @@
160
165
  /* ── Code (inline + block) ───────────────────────────────── */
161
166
  .kj-prose code {
162
167
  background-color: var(--kj-bg-surface, transparent);
163
- border-radius: var(--kj-radius-sm, 4px);
168
+ border-radius: var(--kj-radius-field, 4px);
164
169
  font-family: var(--kj-font-mono);
165
170
  font-size: 0.9em;
166
171
  padding-block: 0.1em;
@@ -169,7 +174,7 @@
169
174
 
170
175
  .kj-prose pre {
171
176
  background-color: var(--kj-bg-surface, transparent);
172
- border-radius: var(--kj-radius-md, 6px);
177
+ border-radius: var(--kj-radius-box, 6px);
173
178
  color: var(--kj-fg-default);
174
179
  font-family: var(--kj-font-mono);
175
180
  line-height: var(--kj-line-height-snug, 1.45);
@@ -199,7 +204,7 @@
199
204
 
200
205
  .kj-prose figcaption {
201
206
  color: var(--kj-fg-muted, var(--kj-fg-default));
202
- font-size: var(--kj-font-size-sm, 0.875rem);
207
+ font-size: var(--kj-text-sm, 0.875rem);
203
208
  margin-block-start: 0.5em;
204
209
  text-align: center;
205
210
  }
@@ -207,7 +212,7 @@
207
212
  /* ── Tables ──────────────────────────────────────────────── */
208
213
  .kj-prose table {
209
214
  border-collapse: collapse;
210
- font-size: var(--kj-font-size-sm, 0.9em);
215
+ font-size: var(--kj-text-sm, 0.875rem);
211
216
  width: 100%;
212
217
  }
213
218
 
@@ -239,41 +244,46 @@
239
244
 
240
245
  /* ── Size modifiers ──────────────────────────────────────── */
241
246
  .kj-prose-sm {
242
- font-size: var(--kj-font-size-sm, 0.875rem);
247
+ font-size: var(--kj-text-sm, 0.875rem);
243
248
  line-height: var(--kj-line-height-normal, 1.6);
244
249
  }
245
250
 
246
251
  .kj-prose-lg {
247
- font-size: var(--kj-font-size-lg, 1.125rem);
252
+ font-size: var(--kj-text-lg, 1.125rem);
248
253
  line-height: var(--kj-line-height-loose, 1.8);
249
254
  }
250
255
  }
251
256
 
252
257
  /* ──────────────────────────────────────────────────────────────
253
- Tone reflections — applied by directives via `[data-tone]`,
254
- readable in or out of a `.kj-prose` container.
258
+ Tone reflections — applied by directives via `[data-kj-tone]`
259
+ (`[data-tone]` is the supported bare spelling), readable in or out of
260
+ a `.kj-prose` container.
255
261
  ────────────────────────────────────────────────────────────── */
256
262
 
257
263
  @layer kj.tone {
264
+ [data-kj-tone='lead'],
258
265
  [data-tone='lead'] {
259
266
  color: var(--kj-fg-muted, var(--kj-fg-default));
260
- font-size: var(--kj-font-size-lg, 1.125rem);
267
+ font-size: var(--kj-text-lg, 1.125rem);
261
268
  line-height: var(--kj-line-height-relaxed, 1.7);
262
269
  }
263
270
 
271
+ [data-kj-tone='muted'],
264
272
  [data-tone='muted'] {
265
273
  color: var(--kj-fg-muted, var(--kj-fg-default));
266
274
  }
267
275
 
276
+ [data-kj-tone='code'],
268
277
  [data-tone='code'] {
269
278
  background-color: var(--kj-bg-surface, transparent);
270
- border-radius: var(--kj-radius-sm, 4px);
279
+ border-radius: var(--kj-radius-field, 4px);
271
280
  font-family: var(--kj-font-mono);
272
281
  font-size: 0.9em;
273
282
  padding-block: 0.1em;
274
283
  padding-inline: 0.35em;
275
284
  }
276
285
 
286
+ [data-kj-tone='blockquote'],
277
287
  [data-tone='blockquote'] {
278
288
  border-inline-start: 4px solid var(--kj-border-muted, currentColor);
279
289
  color: var(--kj-fg-muted, var(--kj-fg-default));
@@ -284,11 +294,13 @@
284
294
  }
285
295
 
286
296
  /* ──────────────────────────────────────────────────────────────
287
- Truncate — single-line ellipsis (data-truncate="1") and
288
- multi-line clamp (data-truncate="2"+).
297
+ Truncate — single-line ellipsis (data-kj-truncate="1") and
298
+ multi-line clamp (data-kj-truncate="2"+). `data-truncate` is the
299
+ supported bare spelling.
289
300
  ────────────────────────────────────────────────────────────── */
290
301
 
291
302
  @layer kj.truncate {
303
+ [data-kj-truncate='1'],
292
304
  [data-truncate='1'] {
293
305
  overflow: hidden;
294
306
  text-overflow: ellipsis;
@@ -299,14 +311,15 @@
299
311
  Chromium 133+ but doesn't ship in every WebKit-based engine yet, so
300
312
  enumerate the common counts (2..6) explicitly — covers card / list
301
313
  description copy without needing engine fallback gymnastics. */
314
+ [data-kj-truncate]:not([data-kj-truncate='1']),
302
315
  [data-truncate]:not([data-truncate='1']) {
303
316
  display: -webkit-box;
304
317
  -webkit-box-orient: vertical;
305
318
  overflow: hidden;
306
319
  }
307
- [data-truncate='2'] { -webkit-line-clamp: 2; line-clamp: 2; }
308
- [data-truncate='3'] { -webkit-line-clamp: 3; line-clamp: 3; }
309
- [data-truncate='4'] { -webkit-line-clamp: 4; line-clamp: 4; }
310
- [data-truncate='5'] { -webkit-line-clamp: 5; line-clamp: 5; }
311
- [data-truncate='6'] { -webkit-line-clamp: 6; line-clamp: 6; }
320
+ [data-kj-truncate='2'], [data-truncate='2'] { -webkit-line-clamp: 2; line-clamp: 2; }
321
+ [data-kj-truncate='3'], [data-truncate='3'] { -webkit-line-clamp: 3; line-clamp: 3; }
322
+ [data-kj-truncate='4'], [data-truncate='4'] { -webkit-line-clamp: 4; line-clamp: 4; }
323
+ [data-kj-truncate='5'], [data-truncate='5'] { -webkit-line-clamp: 5; line-clamp: 5; }
324
+ [data-kj-truncate='6'], [data-truncate='6'] { -webkit-line-clamp: 6; line-clamp: 6; }
312
325
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"kouji-ui-core-engine-CKMr0aiZ.mjs","sources":["../../../packages/core/src/rich-text/engine.ts"],"sourcesContent":["/**\n * Browser-only orchestration layer around Lexical.\n *\n * Loaded exclusively via a dynamic `import()` from {@link KjRichTextEditor}\n * inside `afterNextRender`, so its eager imports never execute during SSR. It\n * statically imports only the **base** editing packages (core `lexical`,\n * `@lexical/rich-text` for `registerRichText`, `@lexical/selection`,\n * `@lexical/html`). Everything else (lists, code, history, markdown, links) is\n * loaded lazily and per-feature via each feature's `load()`.\n *\n * State is derived package-agnostically (by `node.getType()` + duck-typed\n * methods) so the engine never imports a feature's package to read state.\n */\nimport {\n createEditor,\n $getRoot,\n $getSelection,\n $isRangeSelection,\n $insertNodes,\n $createParagraphNode,\n FORMAT_TEXT_COMMAND,\n UNDO_COMMAND,\n REDO_COMMAND,\n CAN_UNDO_COMMAND,\n CAN_REDO_COMMAND,\n KEY_DOWN_COMMAND,\n COMMAND_PRIORITY_LOW,\n COMMAND_PRIORITY_HIGH,\n type ElementNode,\n type Klass,\n type LexicalEditor,\n type LexicalNode,\n type NodeKey,\n type SerializedEditorState,\n type EditorThemeClasses,\n} from 'lexical';\nimport { registerRichText } from '@lexical/rich-text';\nimport { $setBlocksType } from '@lexical/selection';\nimport { $generateHtmlFromNodes, $generateNodesFromDOM } from '@lexical/html';\nimport type { KjRichTextContext, KjRichTextFeature, KjRteShortcut } from './feature';\nimport type { KjDecoratorMountAdapter, KjMountedComponent } from './rich-text.context';\nimport type { KjBlockType, KjRichTextState, KjTextFormat } from './rich-text-editor.types';\n\n/** CSS classes applied to editor nodes; styled by the components layer. */\nconst THEME: EditorThemeClasses = {\n paragraph: 'kj-rte-paragraph',\n heading: { h1: 'kj-rte-h1', h2: 'kj-rte-h2', h3: 'kj-rte-h3' },\n quote: 'kj-rte-quote',\n list: { ul: 'kj-rte-ul', ol: 'kj-rte-ol', listitem: 'kj-rte-li' },\n link: 'kj-rte-link',\n code: 'kj-rte-code-block',\n text: {\n bold: 'kj-rte-bold',\n italic: 'kj-rte-italic',\n underline: 'kj-rte-underline',\n strikethrough: 'kj-rte-strikethrough',\n code: 'kj-rte-code',\n },\n};\n\nconst INLINE_FORMATS: readonly KjTextFormat[] = [\n 'bold',\n 'italic',\n 'underline',\n 'strikethrough',\n 'code',\n];\n\n/** Configuration for {@link createRichTextEngine}. */\nexport interface RichTextEngineConfig {\n /** Initial content as an HTML string. */\n initialHtml?: string;\n /** Active features (built-in editing lives in features too). */\n features?: readonly KjRichTextFeature[];\n /** Lexical namespace (diagnostics only). */\n namespace?: string;\n /** Adapter used to mount Angular components for decorator nodes. */\n mount?: KjDecoratorMountAdapter;\n /** Called when a feature requests an overlay. */\n onOverlayOpen?(id: string, data: unknown): void;\n /** Called when a feature closes the overlay. */\n onOverlayClose?(): void;\n /** Called to announce a message to assistive technology. */\n onAnnounce?(message: string): void;\n}\n\n/** Callbacks the engine invokes to push state/value changes to the directive. */\nexport interface RichTextEngineCallbacks {\n onState(state: KjRichTextState): void;\n onValue(value: { html: string; text: string; json: SerializedEditorState }): void;\n}\n\n/**\n * Create and mount a Lexical editor on `root`, loading each feature's packages,\n * collecting their nodes **before** `createEditor`, then registering behaviour.\n * Async because feature package loading is awaited.\n */\nexport async function createRichTextEngine(\n root: HTMLElement,\n config: RichTextEngineConfig,\n callbacks: RichTextEngineCallbacks,\n): Promise<RichTextEngine> {\n const features = config.features ?? [];\n\n // Per-feature lazy package loading. Disabling a feature ⇒ its package never\n // loads. Loaded in parallel; a failure is isolated to its feature.\n await Promise.all(\n features.map(async (feature) => {\n try {\n await feature.load?.();\n } catch (error) {\n console.error(`[KjRichTextEditor] feature \"${feature.name}\" load() failed`, error);\n }\n }),\n );\n\n // Collect nodes from all features (now that their packages are loaded).\n const nodeSet = new Set<Klass<LexicalNode>>();\n for (const feature of features) {\n try {\n for (const node of feature.nodes?.() ?? []) nodeSet.add(node);\n } catch (error) {\n console.error(`[KjRichTextEditor] feature \"${feature.name}\" nodes() failed`, error);\n }\n }\n\n const editor = createEditor({\n namespace: config.namespace ?? 'kj-rich-text',\n editable: true,\n theme: THEME,\n nodes: [...nodeSet],\n onError: (error: Error) => console.error('[KjRichTextEditor]', error),\n });\n\n editor.setRootElement(root);\n const engine = new RichTextEngine(editor, callbacks, config);\n engine.init(features);\n return engine;\n}\n\n/** Handle around a mounted Lexical editor. Command methods are no-ops if destroyed. */\nexport class RichTextEngine {\n private teardowns: Array<() => void> = [];\n private canUndo = false;\n private canRedo = false;\n private destroyed = false;\n private readonly decoratorRegistry = new Map<string, unknown>();\n private readonly mounted = new Map<NodeKey, KjMountedComponent>();\n /** Shared, live context handed to features. */\n readonly context: KjRichTextContext;\n\n constructor(\n readonly editor: LexicalEditor,\n private readonly callbacks: RichTextEngineCallbacks,\n private readonly config: RichTextEngineConfig,\n ) {\n const context: Omit<KjRichTextContext, 'state'> = {\n editor,\n update: (fn: () => void) => this.update(fn),\n read: (fn) => editor.getEditorState().read(fn),\n toggleInlineFormat: (format) => this.toggleFormat(format),\n setBlock: (create) => this.setBlock(create),\n setParagraph: () => this.setBlock(() => $createParagraphNode()),\n insertNodes: (create) => this.update(() => $insertNodes(create())),\n dispatch: (command, payload) => {\n editor.dispatchCommand(command, payload);\n this.flush();\n },\n registerCommand: (command, listener, priority) =>\n editor.registerCommand(command, listener, priority),\n registerNodeTransform: (klass, listener) => editor.registerNodeTransform(klass, listener),\n registerShortcut: (shortcut, run) => this.registerShortcut(shortcut, run),\n undo: () => this.undo(),\n redo: () => this.redo(),\n focus: () => this.focus(),\n openOverlay: (id, data) => this.config.onOverlayOpen?.(id, data),\n closeOverlay: () => this.config.onOverlayClose?.(),\n announce: (message) => this.config.onAnnounce?.(message),\n };\n // `state` is a live getter (reflects the current selection each read).\n Object.defineProperty(context, 'state', {\n get: () => this.readState(),\n enumerable: true,\n });\n this.context = context as KjRichTextContext;\n }\n\n /** @internal Register base editing, feature behaviour, listeners, decorators, seed content. */\n init(features: readonly KjRichTextFeature[]): void {\n // Base: rich-text editing (selection, formatting commands, paste, Enter).\n this.teardowns.push(registerRichText(this.editor));\n\n for (const feature of features) {\n try {\n const teardown = feature.setup?.(this.context);\n if (teardown) this.teardowns.push(teardown);\n } catch (error) {\n console.error(`[KjRichTextEditor] feature \"${feature.name}\" setup failed`, error);\n }\n // Decorator components declared via createKjDecoratorNode-based features.\n for (const registration of feature.decorators ?? []) {\n this.decoratorRegistry.set(registration.nodeType, registration.component);\n }\n }\n\n if (this.config.mount && this.decoratorRegistry.size > 0) {\n this.teardowns.push(\n this.editor.registerDecoratorListener((decorators: Record<NodeKey, unknown>) =>\n this.reconcileDecorators(decorators),\n ),\n );\n }\n\n this.teardowns.push(\n this.editor.registerCommand(\n CAN_UNDO_COMMAND,\n (payload: boolean) => {\n this.canUndo = payload;\n this.emitState();\n return false;\n },\n COMMAND_PRIORITY_LOW,\n ),\n );\n this.teardowns.push(\n this.editor.registerCommand(\n CAN_REDO_COMMAND,\n (payload: boolean) => {\n this.canRedo = payload;\n this.emitState();\n return false;\n },\n COMMAND_PRIORITY_LOW,\n ),\n );\n\n this.teardowns.push(\n this.editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n const html = $generateHtmlFromNodes(this.editor, null);\n const text = $getRoot().getTextContent();\n this.callbacks.onValue({ html, text, json: editorState.toJSON() });\n });\n this.emitState();\n }),\n );\n\n if (this.config.initialHtml) {\n this.setHtml(this.config.initialHtml);\n } else {\n this.emitState();\n }\n }\n\n // -- reactive state (package-agnostic) -----------------------------------\n\n private emitState(): void {\n if (this.destroyed) return;\n this.callbacks.onState(this.readState());\n }\n\n private readState(): KjRichTextState {\n const activeFormats = new Set<KjTextFormat>();\n let blockType: KjBlockType = 'paragraph';\n let isLink = false;\n let empty = true;\n\n this.editor.getEditorState().read(() => {\n const root = $getRoot();\n empty = root.getTextContent().length === 0;\n\n const selection = $getSelection();\n if (!$isRangeSelection(selection)) return;\n\n for (const format of INLINE_FORMATS) {\n if (selection.hasFormat(format)) activeFormats.add(format);\n }\n\n const anchorNode = selection.anchor.getNode();\n const element =\n anchorNode.getKey() === 'root' ? anchorNode : anchorNode.getTopLevelElementOrThrow();\n blockType = elementBlockType(element);\n\n // Duck-typed link detection (no @lexical/link import).\n isLink = selection.getNodes().some((node) => isLinkNode(node) || isLinkNode(node.getParent()));\n });\n\n return { activeFormats, blockType, canUndo: this.canUndo, canRedo: this.canRedo, isLink, empty };\n }\n\n private reconcileDecorators(decorators: Record<NodeKey, unknown>): void {\n if (!this.config.mount) return;\n const liveKeys = new Set<NodeKey>(Object.keys(decorators) as NodeKey[]);\n for (const [key, mounted] of this.mounted) {\n if (!liveKeys.has(key)) {\n mounted.destroy();\n this.mounted.delete(key);\n }\n }\n for (const key of liveKeys) {\n if (this.mounted.has(key)) continue;\n const node = decorators[key] as { getType?: () => string } | undefined;\n const type = node?.getType?.();\n const component = type ? this.decoratorRegistry.get(type) : undefined;\n if (!component) continue;\n const hostEl = this.editor.getElementByKey(key);\n if (!hostEl) continue;\n const mounted = this.config.mount.mount(component, node);\n hostEl.appendChild(mounted.element);\n this.mounted.set(key, mounted);\n }\n }\n\n // -- command mechanics ---------------------------------------------------\n\n private flush(): void {\n this.editor.update(() => {}, { discrete: true });\n }\n\n private update(fn: () => void): void {\n if (this.destroyed) return;\n this.editor.update(fn, { discrete: true });\n }\n\n private toggleFormat(format: KjTextFormat): void {\n if (this.destroyed) return;\n this.editor.dispatchCommand(FORMAT_TEXT_COMMAND, format);\n this.flush();\n }\n\n private setBlock(create: () => LexicalNode): void {\n this.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n // Block factories always return ElementNodes; the public ctx type is the\n // broader LexicalNode for ergonomics.\n $setBlocksType(selection, create as () => ElementNode);\n }\n });\n }\n\n private registerShortcut(shortcut: KjRteShortcut, run: () => void): () => void {\n const parts = shortcut.toLowerCase().split('+');\n const key = parts[parts.length - 1];\n const needMod = parts.includes('mod');\n const needShift = parts.includes('shift');\n const needAlt = parts.includes('alt');\n return this.editor.registerCommand(\n KEY_DOWN_COMMAND,\n (event: KeyboardEvent) => {\n const mod = event.ctrlKey || event.metaKey;\n if (\n event.key.toLowerCase() === key &&\n needMod === mod &&\n needShift === event.shiftKey &&\n needAlt === event.altKey\n ) {\n event.preventDefault();\n run();\n return true;\n }\n return false;\n },\n COMMAND_PRIORITY_HIGH,\n );\n }\n\n undo(): void {\n if (this.destroyed) return;\n this.editor.dispatchCommand(UNDO_COMMAND, undefined);\n this.flush();\n }\n\n redo(): void {\n if (this.destroyed) return;\n this.editor.dispatchCommand(REDO_COMMAND, undefined);\n this.flush();\n }\n\n focus(): void {\n if (this.destroyed) return;\n this.editor.focus();\n }\n\n clear(): void {\n if (this.destroyed) return;\n this.update(() => {\n const root = $getRoot();\n root.clear();\n root.append($createParagraphNode());\n });\n }\n\n setEditable(editable: boolean): void {\n if (this.destroyed) return;\n this.editor.setEditable(editable);\n }\n\n // -- value I/O -----------------------------------------------------------\n\n getHtml(): string {\n let html = '';\n this.editor.getEditorState().read(() => {\n html = $generateHtmlFromNodes(this.editor, null);\n });\n return html;\n }\n\n setHtml(html: string): void {\n if (this.destroyed) return;\n this.update(() => {\n const root = $getRoot();\n root.clear();\n if (!html) {\n root.append($createParagraphNode());\n return;\n }\n // $generateNodesFromDOM only produces nodes for registered (active) types,\n // so deserialization automatically respects the active feature/node set.\n const dom = new DOMParser().parseFromString(html, 'text/html');\n const nodes = $generateNodesFromDOM(this.editor, dom);\n root.select();\n $insertNodes(nodes);\n if (root.getChildrenSize() === 0) root.append($createParagraphNode());\n });\n }\n\n getJson(): SerializedEditorState {\n return this.editor.getEditorState().toJSON();\n }\n\n setJson(json: SerializedEditorState): void {\n if (this.destroyed) return;\n this.editor.setEditorState(this.editor.parseEditorState(json));\n this.flush();\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n for (const mounted of this.mounted.values()) {\n try {\n mounted.destroy();\n } catch {\n // ignore\n }\n }\n this.mounted.clear();\n for (const teardown of this.teardowns.reverse()) {\n try {\n teardown();\n } catch {\n // ignore teardown errors\n }\n }\n this.teardowns = [];\n this.editor.setRootElement(null);\n }\n}\n\n/** Map a top-level element node to a {@link KjBlockType} via its type string. */\nfunction elementBlockType(element: LexicalNode): KjBlockType {\n const el = element as unknown as {\n getType(): string;\n getTag?(): string;\n getListType?(): string;\n };\n switch (el.getType()) {\n case 'heading': {\n const tag = el.getTag?.();\n return tag === 'h1' || tag === 'h2' || tag === 'h3' ? tag : 'paragraph';\n }\n case 'quote':\n return 'quote';\n case 'code':\n return 'code';\n case 'list':\n return el.getListType?.() === 'number' ? 'number' : 'bullet';\n default:\n return 'paragraph';\n }\n}\n\n/** Duck-typed link-node check (avoids importing `@lexical/link`). */\nfunction isLinkNode(node: LexicalNode | null | undefined): boolean {\n return !!node && (node as unknown as { getType(): string }).getType() === 'link';\n}\n"],"names":[],"mappings":"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"}