@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.
- package/README.md +22 -5
- package/fesm2022/{kouji-ui-core-engine-CKMr0aiZ.mjs → kouji-ui-core-engine-0iesVdIt.mjs} +32 -8
- package/fesm2022/kouji-ui-core-engine-0iesVdIt.mjs.map +1 -0
- package/fesm2022/kouji-ui-core.mjs +9422 -3121
- package/fesm2022/kouji-ui-core.mjs.map +1 -1
- package/icon/icon.css +27 -25
- package/overlay/overlay.css +9 -1
- package/package.json +14 -11
- package/styles.css +32 -0
- package/types/kouji-ui-core.d.ts +5012 -937
- package/typography/prose.css +54 -41
- package/fesm2022/kouji-ui-core-engine-CKMr0aiZ.mjs.map +0 -1
package/typography/prose.css
CHANGED
|
@@ -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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
--kj-
|
|
22
|
-
--kj-
|
|
23
|
-
--kj-
|
|
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-
|
|
26
|
-
|
|
27
|
-
--kj-
|
|
28
|
-
--kj-
|
|
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-
|
|
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-
|
|
75
|
+
font-size: var(--kj-text-4xl, 2.5rem);
|
|
71
76
|
font-weight: 700;
|
|
72
|
-
line-height: var(--kj-line-height-tight, 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-
|
|
81
|
+
font-size: var(--kj-text-3xl, 2rem);
|
|
77
82
|
}
|
|
78
83
|
|
|
79
84
|
.kj-prose h3 {
|
|
80
|
-
font-size: var(--kj-
|
|
85
|
+
font-size: var(--kj-text-2xl, 1.5rem);
|
|
81
86
|
}
|
|
82
87
|
|
|
83
88
|
.kj-prose h4 {
|
|
84
|
-
font-size: var(--kj-
|
|
89
|
+
font-size: var(--kj-text-xl, 1.25rem);
|
|
85
90
|
}
|
|
86
91
|
|
|
87
92
|
.kj-prose h5 {
|
|
88
|
-
font-size: var(--kj-
|
|
93
|
+
font-size: var(--kj-text-lg, 1.125rem);
|
|
89
94
|
}
|
|
90
95
|
|
|
91
96
|
.kj-prose h6 {
|
|
92
|
-
font-size: var(--kj-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
|
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-
|
|
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-
|
|
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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"}
|