smartrte-react 0.3.3 → 0.3.5

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.
Files changed (87) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +14 -83
  3. package/dist/adapters/canonicalInlineCommandBridge.d.ts +15 -0
  4. package/dist/adapters/canonicalInlineCommandBridge.js +269 -0
  5. package/dist/adapters/canonicalListCommandBridge.d.ts +26 -0
  6. package/dist/adapters/canonicalListCommandBridge.js +430 -0
  7. package/dist/adapters/documentFormats.d.ts +26 -0
  8. package/dist/adapters/documentFormats.js +49 -0
  9. package/dist/adapters/docxFormat.d.ts +5 -0
  10. package/dist/adapters/docxFormat.js +272 -0
  11. package/dist/adapters/domBlockCommandBridge.d.ts +19 -0
  12. package/dist/adapters/domBlockCommandBridge.js +79 -0
  13. package/dist/adapters/domChecklistCommandBridge.d.ts +6 -0
  14. package/dist/adapters/domChecklistCommandBridge.js +33 -0
  15. package/dist/adapters/domCommandBridge.d.ts +19 -0
  16. package/dist/adapters/domCommandBridge.js +33 -0
  17. package/dist/adapters/domInlineAtomCommandBridge.d.ts +14 -0
  18. package/dist/adapters/domInlineAtomCommandBridge.js +101 -0
  19. package/dist/adapters/domInlineImageCommandBridge.d.ts +14 -0
  20. package/dist/adapters/domInlineImageCommandBridge.js +72 -0
  21. package/dist/adapters/domMoveCommandBridge.d.ts +7 -0
  22. package/dist/adapters/domMoveCommandBridge.js +54 -0
  23. package/dist/adapters/domSelectionBridge.d.ts +3 -1
  24. package/dist/adapters/domSelectionBridge.js +96 -44
  25. package/dist/adapters/domSmartDocument.js +158 -16
  26. package/dist/adapters/domTableCommandBridge.d.ts +35 -0
  27. package/dist/adapters/domTableCommandBridge.js +201 -0
  28. package/dist/adapters/legacyListShadowComparator.d.ts +26 -0
  29. package/dist/adapters/legacyListShadowComparator.js +316 -0
  30. package/dist/adapters/pdfFormat.d.ts +23 -0
  31. package/dist/adapters/pdfFormat.js +204 -0
  32. package/dist/adapters/portableDocxAtoms.d.ts +4 -0
  33. package/dist/adapters/portableDocxAtoms.js +58 -0
  34. package/dist/adapters/styledDocxFormat.d.ts +8 -0
  35. package/dist/adapters/styledDocxFormat.js +190 -0
  36. package/dist/builtInFormatDefinitions.d.ts +5 -0
  37. package/dist/builtInFormatDefinitions.js +82 -0
  38. package/dist/canonicalAuthorityFlag.d.ts +32 -0
  39. package/dist/canonicalAuthorityFlag.js +49 -0
  40. package/dist/canonicalClipboardRuntime.d.ts +15 -0
  41. package/dist/canonicalClipboardRuntime.js +76 -0
  42. package/dist/canonicalEditorRuntime.d.ts +77 -0
  43. package/dist/canonicalEditorRuntime.js +274 -0
  44. package/dist/components/CanonicalAuthorityEditor.d.ts +25 -0
  45. package/dist/components/CanonicalAuthorityEditor.js +518 -0
  46. package/dist/components/ClassicEditor.d.ts +13 -3
  47. package/dist/components/ClassicEditor.js +1309 -1159
  48. package/dist/components/ClassicEditorAuthority.d.ts +38 -0
  49. package/dist/components/ClassicEditorAuthority.js +49 -0
  50. package/dist/components/MediaPicker.d.ts +10 -0
  51. package/dist/components/MediaPicker.js +16 -0
  52. package/dist/editorController.d.ts +78 -0
  53. package/dist/editorController.js +298 -0
  54. package/dist/formatFidelity.d.ts +14 -0
  55. package/dist/formatFidelity.js +107 -0
  56. package/dist/formatRuntime.d.ts +50 -0
  57. package/dist/formatRuntime.js +20 -0
  58. package/dist/index.d.ts +24 -0
  59. package/dist/index.js +10 -0
  60. package/dist/mediaProvider.d.ts +39 -0
  61. package/dist/mediaProvider.js +1 -0
  62. package/dist/pluginRuntime.d.ts +68 -0
  63. package/dist/pluginRuntime.js +78 -0
  64. package/dist/standalone/editor.js +722 -495
  65. package/dist/test-harness/atomShadowComparator.d.ts +14 -0
  66. package/dist/test-harness/atomShadowComparator.js +63 -0
  67. package/dist/test-harness/blockShadowComparator.d.ts +30 -0
  68. package/dist/test-harness/blockShadowComparator.js +140 -0
  69. package/dist/test-harness/clipboardShadowComparator.d.ts +12 -0
  70. package/dist/test-harness/clipboardShadowComparator.js +46 -0
  71. package/dist/test-harness/inlineShadowComparator.d.ts +32 -0
  72. package/dist/test-harness/inlineShadowComparator.js +152 -0
  73. package/dist/test-harness/legacyAtomEngine.d.ts +10 -0
  74. package/dist/test-harness/legacyAtomEngine.js +15 -0
  75. package/dist/test-harness/legacyBlockEngine.d.ts +31 -0
  76. package/dist/test-harness/legacyBlockEngine.js +31 -0
  77. package/dist/test-harness/legacyClipboardEngine.d.ts +14 -0
  78. package/dist/test-harness/legacyClipboardEngine.js +67 -0
  79. package/dist/test-harness/legacyInlineEngine.d.ts +19 -0
  80. package/dist/test-harness/legacyInlineEngine.js +49 -0
  81. package/dist/test-harness/legacyTableEngine.d.ts +12 -0
  82. package/dist/test-harness/legacyTableEngine.js +25 -0
  83. package/dist/test-harness/tableShadowComparator.d.ts +29 -0
  84. package/dist/test-harness/tableShadowComparator.js +101 -0
  85. package/dist/theme.d.ts +1 -1
  86. package/dist/theme.js +28 -6
  87. package/package.json +1 -1
@@ -0,0 +1,67 @@
1
+ export function legacyCleanPastedHtml(html, options = {}, ownerDocument = document) {
2
+ const shouldPreserveColors = options.preserveColors ?? false;
3
+ const shouldPreserveDocumentLayout = options.preserveDocumentLayout ?? false;
4
+ const template = ownerDocument.createElement("template");
5
+ template.innerHTML = html
6
+ .replace(/ /gi, " ")
7
+ .replace(/\u00a0/g, " ")
8
+ .replace(/[\u200b\u200c\u200d]/g, "");
9
+ template.content.querySelectorAll("meta, link, style, script").forEach((node) => node.remove());
10
+ const allowedStyleNames = new Set([
11
+ "font-weight", "font-style", "text-decoration", "text-align", "vertical-align",
12
+ "border", "border-top", "border-right", "border-bottom", "border-left",
13
+ "border-collapse", "padding", "padding-top", "padding-right", "padding-bottom",
14
+ "padding-left", "list-style-type", "white-space",
15
+ ]);
16
+ if (options.preserveFontFamily)
17
+ allowedStyleNames.add("font-family");
18
+ if (shouldPreserveColors) {
19
+ allowedStyleNames.add("color");
20
+ allowedStyleNames.add("background");
21
+ allowedStyleNames.add("background-color");
22
+ }
23
+ if (shouldPreserveDocumentLayout) {
24
+ [
25
+ "font-size", "line-height", "margin", "margin-top", "margin-right", "margin-bottom",
26
+ "margin-left", "text-indent", "width", "min-width",
27
+ ].forEach((name) => allowedStyleNames.add(name));
28
+ }
29
+ template.content.querySelectorAll("*").forEach((node) => {
30
+ const className = node.getAttribute("class");
31
+ if (className !== "srte-preserve-colors")
32
+ node.removeAttribute("class");
33
+ node.removeAttribute("id");
34
+ if (!shouldPreserveDocumentLayout) {
35
+ node.removeAttribute("width");
36
+ node.removeAttribute("height");
37
+ }
38
+ const style = node.getAttribute("style");
39
+ if (!style)
40
+ return;
41
+ const safeRules = style
42
+ .split(";")
43
+ .map((rule) => rule.trim())
44
+ .filter(Boolean)
45
+ .filter((rule) => {
46
+ const separator = rule.indexOf(":");
47
+ if (separator === -1)
48
+ return false;
49
+ const name = rule.slice(0, separator).trim().toLowerCase();
50
+ const value = rule.slice(separator + 1).trim().toLowerCase();
51
+ if (!allowedStyleNames.has(name))
52
+ return false;
53
+ if (value.includes("position") || value.includes("expression") || value.includes("javascript:"))
54
+ return false;
55
+ if (name === "white-space" && value !== "pre-wrap")
56
+ return false;
57
+ if ((name === "width" || name === "min-width") && !/^[\d.]+(px|pt|em|rem|%)$/.test(value))
58
+ return false;
59
+ return true;
60
+ });
61
+ if (safeRules.length)
62
+ node.setAttribute("style", safeRules.join("; "));
63
+ else
64
+ node.removeAttribute("style");
65
+ });
66
+ return template.innerHTML;
67
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Test-only Phase 4 snapshot of the legacy inline command engine.
3
+ *
4
+ * This file was created before production inline handlers are removed. It must
5
+ * never be imported by product code. The shadow corpus keeps it so comparison
6
+ * remains possible after ClassicEditor routes exclusively to foundation marks.
7
+ */
8
+ import { type SmartEditorState } from "smartrte-core/legacy";
9
+ export type LegacyInlineToolId = "bold" | "italic" | "underline" | "strike" | "code" | "superscript" | "subscript" | "textColor" | "backgroundColor" | "fontSize" | "fontFamily" | "link";
10
+ export declare const legacyInlineToolIds: readonly LegacyInlineToolId[];
11
+ export interface LegacyInlineResult {
12
+ readonly html: string;
13
+ readonly selection: SmartEditorState["selection"];
14
+ }
15
+ export declare const runLegacyInlineTool: (root: HTMLElement, tool: LegacyInlineToolId, input?: unknown) => LegacyInlineResult | null;
16
+ export declare const runLegacyLinkAction: (root: HTMLElement, action: "apply" | "edit" | "remove", input?: {
17
+ href: string;
18
+ target?: string;
19
+ }) => LegacyInlineResult | null;
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Test-only Phase 4 snapshot of the legacy inline command engine.
3
+ *
4
+ * This file was created before production inline handlers are removed. It must
5
+ * never be imported by product code. The shadow corpus keeps it so comparison
6
+ * remains possible after ClassicEditor routes exclusively to foundation marks.
7
+ */
8
+ import { applyBackgroundColor, applyFontFamily, applyFontSize, applyLink, applyTextColor, applyTransaction, removeLink, toggleBold, toggleInlineCode, toggleItalic, toggleStrike, toggleSubscript, toggleSuperscript, toggleUnderline, updateLink, } from "smartrte-core/legacy";
9
+ import { selectionFromDom } from "../adapters/domSelectionBridge.js";
10
+ import { serializeSmartDocument, smartDocumentFromEditorRoot } from "../adapters/domSmartDocument.js";
11
+ const commands = Object.freeze({
12
+ bold: toggleBold,
13
+ italic: toggleItalic,
14
+ underline: toggleUnderline,
15
+ strike: toggleStrike,
16
+ code: toggleInlineCode,
17
+ superscript: toggleSuperscript,
18
+ subscript: toggleSubscript,
19
+ textColor: applyTextColor,
20
+ backgroundColor: applyBackgroundColor,
21
+ fontSize: applyFontSize,
22
+ fontFamily: applyFontFamily,
23
+ link: applyLink,
24
+ });
25
+ export const legacyInlineToolIds = Object.freeze(Object.keys(commands));
26
+ export const runLegacyInlineTool = (root, tool, input) => {
27
+ const selection = selectionFromDom(root, root.ownerDocument.getSelection());
28
+ if (!selection)
29
+ return null;
30
+ const { document } = smartDocumentFromEditorRoot(root);
31
+ const state = { document, selection };
32
+ const command = commands[tool];
33
+ if (!command.isEnabled(state, input))
34
+ return null;
35
+ const next = applyTransaction(state, command.execute(state, input));
36
+ return { html: serializeSmartDocument(next.document), selection: next.selection };
37
+ };
38
+ export const runLegacyLinkAction = (root, action, input) => {
39
+ const selection = selectionFromDom(root, root.ownerDocument.getSelection());
40
+ if (!selection)
41
+ return null;
42
+ const { document } = smartDocumentFromEditorRoot(root);
43
+ const state = { document, selection };
44
+ const command = action === "remove" ? removeLink : action === "edit" ? updateLink : applyLink;
45
+ if (!command.isEnabled(state, input))
46
+ return null;
47
+ const next = applyTransaction(state, command.execute(state, input));
48
+ return { html: serializeSmartDocument(next.document), selection: next.selection };
49
+ };
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Test-only snapshot of the pre-Phase-6 table engine entry point. Keep this
3
+ * isolated from product imports so shadow comparison remains possible after
4
+ * ClassicEditor switches to the foundation table commands.
5
+ */
6
+ export interface LegacyTableIntent {
7
+ readonly id: string;
8
+ readonly input?: Readonly<Record<string, unknown>>;
9
+ }
10
+ export declare const executeRetainedLegacyTable: (html: string, intent: LegacyTableIntent, ownerDocument?: Document) => string | null;
11
+ /** Retained snapshot for the block-level table insertion command. */
12
+ export declare const executeRetainedLegacyTableInsert: (html: string, rows: number, columns: number, headerRow?: boolean, ownerDocument?: Document) => string | null;
@@ -0,0 +1,25 @@
1
+ import { createSmartEditor, tablePlugin } from "smartrte-core/legacy";
2
+ import { serializeSmartDocument, smartDocumentFromHtml } from "../adapters/domSmartDocument.js";
3
+ export const executeRetainedLegacyTable = (html, intent, ownerDocument = document) => {
4
+ const model = smartDocumentFromHtml(html, ownerDocument);
5
+ if (model.children.length !== 1 || model.children[0].type !== "table")
6
+ return null;
7
+ const editor = createSmartEditor({
8
+ state: { document: model, selection: { type: "node", path: [0] } },
9
+ plugins: [tablePlugin],
10
+ });
11
+ if (!editor.execute(intent.id, { ...(intent.input || {}), tablePath: [0] }))
12
+ return null;
13
+ return serializeSmartDocument(editor.state.document);
14
+ };
15
+ /** Retained snapshot for the block-level table insertion command. */
16
+ export const executeRetainedLegacyTableInsert = (html, rows, columns, headerRow = false, ownerDocument = document) => {
17
+ const model = smartDocumentFromHtml(html, ownerDocument);
18
+ const editor = createSmartEditor({
19
+ state: { document: model, selection: { type: "text", anchor: { path: [0, 0], offset: 0 }, focus: { path: [0, 0], offset: 0 } } },
20
+ plugins: [tablePlugin],
21
+ });
22
+ if (!editor.execute("table.insert", { path: [1], rows, columns, headerRow }))
23
+ return null;
24
+ return serializeSmartDocument(editor.state.document);
25
+ };
@@ -0,0 +1,29 @@
1
+ import { type DomTableCommand } from "../adapters/domTableCommandBridge.js";
2
+ export type TableShadowDivergence = "expected-normalization" | "equivalent-serialization" | "selection-only" | "visual-only" | "semantic" | "data-loss" | "unknown";
3
+ export interface TableShadowResult {
4
+ readonly equivalent: boolean;
5
+ readonly classification?: TableShadowDivergence;
6
+ readonly legacyStructureHash: string;
7
+ readonly canonicalStructureHash: string;
8
+ readonly selectionCompared?: boolean;
9
+ readonly selectionEquivalent?: boolean;
10
+ readonly legacySelectionHash?: string;
11
+ readonly canonicalSelectionHash?: string;
12
+ }
13
+ export declare const compareRetainedAndCanonicalTable: (html: string, command: DomTableCommand) => TableShadowResult;
14
+ /**
15
+ * Compares the retained block-level table insertion command with the
16
+ * canonical insertion path. The insertion caret is a stable semantic point:
17
+ * the first paragraph in the first inserted cell. This is intentionally
18
+ * separate from the cell-editing comparator above, whose old command surface
19
+ * did not expose a selection result.
20
+ */
21
+ export declare const compareRetainedAndCanonicalTableInsert: (html: string, rows?: number, columns?: number, headerRow?: boolean) => TableShadowResult;
22
+ /** Hash-only comparator record. Document text and HTML are deliberately excluded. */
23
+ export declare const tableShadowLogRecord: (scenarioId: string, result: TableShadowResult) => {
24
+ classification?: TableShadowDivergence;
25
+ scenarioId: string;
26
+ equivalent: boolean;
27
+ legacyStructureHash: string;
28
+ canonicalStructureHash: string;
29
+ };
@@ -0,0 +1,101 @@
1
+ import { compareShadowDocuments, foundationSchema, isTextNode, normalizedStructureWithoutIds, parseCanonicalTableHtml } from "smartrte-core/foundation";
2
+ import { executeDomTableCommand, executeDomTableInsert, executeDomTableRemoval } from "../adapters/domTableCommandBridge.js";
3
+ import { executeRetainedLegacyTable, executeRetainedLegacyTableInsert } from "./legacyTableEngine.js";
4
+ const hash = (value) => {
5
+ const input = typeof value === "string" ? value : JSON.stringify(value) ?? String(value);
6
+ let state = 2166136261;
7
+ for (let index = 0; index < input.length; index += 1) {
8
+ state ^= input.charCodeAt(index);
9
+ state = Math.imul(state, 16777619);
10
+ }
11
+ return (state >>> 0).toString(16).padStart(8, "0");
12
+ };
13
+ const documentText = (node) => isTextNode(node) ? node.text : (node.children || []).map(documentText).join("");
14
+ export const compareRetainedAndCanonicalTable = (html, command) => {
15
+ const legacyHtml = executeRetainedLegacyTable(html, command);
16
+ const host = document.createElement("div");
17
+ host.innerHTML = html;
18
+ const canonicalTable = host.querySelector("table");
19
+ if (command.id === "table.remove") {
20
+ const legacyDocument = parseCanonicalTableHtml(legacyHtml || "");
21
+ const removed = canonicalTable instanceof HTMLTableElement && executeDomTableRemoval(canonicalTable);
22
+ const canonicalDocument = parseCanonicalTableHtml(host.innerHTML);
23
+ const legacy = normalizedStructureWithoutIds(legacyDocument, foundationSchema);
24
+ const current = normalizedStructureWithoutIds(canonicalDocument, foundationSchema);
25
+ const equivalent = removed && JSON.stringify(legacy) === JSON.stringify(current);
26
+ return {
27
+ equivalent,
28
+ legacyStructureHash: hash(legacy), canonicalStructureHash: hash(current),
29
+ ...(!equivalent ? { classification: "semantic" } : {}),
30
+ };
31
+ }
32
+ const canonical = canonicalTable instanceof HTMLTableElement ? executeDomTableCommand(canonicalTable, command) : null;
33
+ if (!legacyHtml || !canonical)
34
+ return { equivalent: false, classification: "semantic", legacyStructureHash: hash(legacyHtml), canonicalStructureHash: hash(canonical?.outerHTML) };
35
+ const legacyDocument = parseCanonicalTableHtml(legacyHtml);
36
+ const canonicalDocument = parseCanonicalTableHtml(canonical.outerHTML);
37
+ const legacy = normalizedStructureWithoutIds(legacyDocument, foundationSchema);
38
+ const current = normalizedStructureWithoutIds(canonicalDocument, foundationSchema);
39
+ const equivalent = JSON.stringify(legacy) === JSON.stringify(current);
40
+ const dataLoss = documentText(canonicalDocument) !== documentText(legacyDocument);
41
+ const intentional = command.id === "table.header.row.toggle" || command.id === "table.header.column.toggle" || command.id === "table.header.cell.toggle"
42
+ ? "visual-only" : "expected-normalization";
43
+ return {
44
+ equivalent, legacyStructureHash: hash(legacy), canonicalStructureHash: hash(current),
45
+ ...(!equivalent ? { classification: dataLoss ? "data-loss" : intentional } : {}),
46
+ };
47
+ };
48
+ /**
49
+ * Compares the retained block-level table insertion command with the
50
+ * canonical insertion path. The insertion caret is a stable semantic point:
51
+ * the first paragraph in the first inserted cell. This is intentionally
52
+ * separate from the cell-editing comparator above, whose old command surface
53
+ * did not expose a selection result.
54
+ */
55
+ export const compareRetainedAndCanonicalTableInsert = (html, rows = 2, columns = 2, headerRow = false) => {
56
+ const legacyHtml = executeRetainedLegacyTableInsert(html, rows, columns, headerRow);
57
+ const host = document.createElement("div");
58
+ host.innerHTML = html;
59
+ const canonicalTable = executeDomTableInsert(host, 0, rows, columns, headerRow);
60
+ if (!legacyHtml || !canonicalTable)
61
+ return {
62
+ equivalent: false,
63
+ classification: "semantic",
64
+ legacyStructureHash: hash(legacyHtml),
65
+ canonicalStructureHash: hash(host.innerHTML),
66
+ selectionCompared: true,
67
+ selectionEquivalent: false,
68
+ };
69
+ const legacyDocument = parseCanonicalTableHtml(legacyHtml);
70
+ const canonicalDocument = parseCanonicalTableHtml(host.innerHTML);
71
+ const selection = {
72
+ type: "text",
73
+ anchor: { path: [1, 0, 0, 0], offset: 0 },
74
+ head: { path: [1, 0, 0, 0], offset: 0 },
75
+ };
76
+ const comparison = compareShadowDocuments({
77
+ legacyDocument,
78
+ legacySelection: selection,
79
+ canonicalDocument,
80
+ canonicalSelection: selection,
81
+ schema: foundationSchema,
82
+ });
83
+ const insertionDataLoss = documentText(legacyDocument) !== documentText(canonicalDocument);
84
+ return {
85
+ equivalent: comparison.equivalent,
86
+ ...(!comparison.documentEquivalent
87
+ ? { classification: insertionDataLoss ? "data-loss" : "expected-normalization" }
88
+ : comparison.classification ? { classification: comparison.classification } : {}),
89
+ legacyStructureHash: comparison.legacyStructureHash,
90
+ canonicalStructureHash: comparison.canonicalStructureHash,
91
+ selectionCompared: true,
92
+ selectionEquivalent: comparison.selectionEquivalent,
93
+ legacySelectionHash: comparison.legacySelectionHash,
94
+ canonicalSelectionHash: comparison.canonicalSelectionHash,
95
+ };
96
+ };
97
+ /** Hash-only comparator record. Document text and HTML are deliberately excluded. */
98
+ export const tableShadowLogRecord = (scenarioId, result) => ({
99
+ scenarioId, equivalent: result.equivalent, legacyStructureHash: result.legacyStructureHash,
100
+ canonicalStructureHash: result.canonicalStructureHash, ...(result.classification ? { classification: result.classification } : {}),
101
+ });
package/dist/theme.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  export type SrteTheme = 'light' | 'dark';
2
- export declare const SRTE_DEFAULT_CSS = "\n.srte-editor {\n --srte-background: var(--card, #ffffff);\n --srte-canvas: var(--background, #ffffff);\n --srte-foreground: var(--foreground, #0f172a);\n --srte-muted: var(--muted, #f1f5f9);\n --srte-muted-foreground: var(--muted-foreground, #64748b);\n --srte-ring: var(--ring, #0284c7);\n --srte-radius: var(--radius, 0.625rem);\n --srte-bg: var(--srte-canvas);\n --srte-text: var(--srte-foreground);\n --srte-text-muted: var(--srte-muted-foreground);\n --srte-border: var(--border, #e2e8f0);\n --srte-border-light: var(--srte-border);\n --srte-toolbar-bg: var(--srte-background);\n --srte-input-bg: var(--srte-background);\n --srte-input-text: var(--srte-foreground);\n --srte-input-border: var(--srte-border);\n --srte-modal-backdrop: rgba(0, 0, 0, 0.35);\n --srte-modal-backdrop-filter: blur(2px);\n --srte-modal-bg: #ffffff;\n --srte-modal-text: #000000;\n --srte-menu-bg: var(--srte-background);\n --srte-menu-text: var(--srte-foreground);\n --srte-menu-shadow: 0 8px 24px rgba(0, 0, 0, 0.18);\n --srte-accent: #0284c7;\n --srte-accent-bg: rgba(2, 132, 199, 0.12);\n --srte-danger: #dc2626;\n --srte-primary: #2563eb;\n --srte-surface-subtle: #f3f4f6;\n --srte-on-primary: #ffffff;\n --srte-cancel-bg: #f3f4f6;\n --srte-code-bg: #f6f8fa;\n --srte-code-text: #24292f;\n}\n.srte-editor.srte-dark {\n --srte-background: var(--card, #1e293b);\n --srte-canvas: var(--background, #0f172a);\n --srte-foreground: var(--foreground, #f8fafc);\n --srte-muted: var(--muted, #334155);\n --srte-muted-foreground: var(--muted-foreground, #94a3b8);\n --srte-ring: var(--ring, #38bdf8);\n --srte-bg: var(--srte-canvas);\n --srte-text: var(--srte-foreground);\n --srte-text-muted: var(--srte-muted-foreground);\n --srte-border: var(--border, #334155);\n --srte-border-light: var(--srte-border);\n --srte-toolbar-bg: var(--srte-background);\n --srte-input-bg: var(--srte-background);\n --srte-input-text: var(--srte-foreground);\n --srte-input-border: var(--srte-border);\n --srte-modal-backdrop: rgba(0, 0, 0, 0.22);\n --srte-modal-backdrop-filter: blur(10px) saturate(0.9);\n --srte-modal-bg: #1e293b;\n --srte-modal-text: #e0e0e0;\n --srte-menu-bg: var(--srte-background);\n --srte-menu-text: var(--srte-foreground);\n --srte-menu-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);\n --srte-accent: #38bdf8;\n --srte-accent-bg: rgba(56, 189, 248, 0.16);\n --srte-danger: #ef4444;\n --srte-primary: #3b82f6;\n --srte-surface-subtle: #333333;\n --srte-on-primary: #ffffff;\n --srte-cancel-bg: #333333;\n --srte-code-bg: #111827;\n --srte-code-text: #e5e7eb;\n}\n.srte-editor {\n border-radius: var(--srte-radius);\n font-family: \"IBM Plex Sans\", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n container: srte-editor / inline-size;\n}\n.srte-toolbar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 4px;\n width: 100%;\n min-height: 48px;\n padding: 8px;\n box-sizing: border-box;\n border-bottom: 1px solid var(--srte-border);\n background: var(--srte-background);\n color: var(--srte-foreground);\n position: sticky;\n top: 0;\n z-index: 10;\n}\n.srte-toolbar-group {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n min-width: 0;\n}\n.srte-toolbar-group + .srte-toolbar-group::before {\n content: \"\";\n width: 1px;\n height: 20px;\n margin: 0 5px 0 3px;\n background: var(--srte-border);\n}\n.srte-tool-button,\n.srte-toolbar select {\n height: 32px;\n min-width: 32px;\n box-sizing: border-box;\n border: 1px solid transparent;\n border-radius: 8px;\n background: transparent;\n color: var(--srte-foreground);\n font: 500 13px/1 \"IBM Plex Sans\", ui-sans-serif, system-ui, sans-serif;\n}\n.srte-tool-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 3px;\n padding: 0 7px;\n cursor: pointer;\n}\n.srte-toolbar select {\n max-width: 132px;\n padding: 0 26px 0 9px;\n border-color: var(--srte-border);\n background: var(--srte-input-bg);\n cursor: pointer;\n}\n.srte-tool-button:hover,\n.srte-toolbar select:hover,\n.srte-toolbar-menu[open] > .srte-menu-trigger {\n background: var(--srte-muted);\n border-color: var(--srte-border);\n}\n.srte-tool-button.srte-active,\n.srte-tool-button[aria-pressed=\"true\"] {\n color: var(--srte-primary);\n background: var(--srte-accent-bg);\n border-color: color-mix(in srgb, var(--srte-primary) 35%, transparent);\n}\n.srte-tool-button:focus-visible,\n.srte-toolbar select:focus-visible,\n.srte-menu-item:focus-visible {\n outline: 2px solid var(--srte-ring);\n outline-offset: 1px;\n}\n.srte-tool-button:disabled,\n.srte-menu-item:disabled,\n.srte-toolbar select:disabled {\n cursor: not-allowed;\n opacity: .4;\n}\n.srte-toolbar-menu {\n position: relative;\n}\n.srte-toolbar-menu > summary {\n list-style: none;\n}\n.srte-toolbar-menu > summary::-webkit-details-marker {\n display: none;\n}\n.srte-menu {\n position: absolute;\n top: calc(100% + 6px);\n left: 0;\n z-index: 80;\n min-width: 210px;\n padding: 4px;\n overflow: hidden;\n border: 1px solid var(--srte-border);\n border-radius: 12px;\n background: var(--srte-menu-bg);\n color: var(--srte-menu-text);\n box-shadow: var(--srte-menu-shadow);\n}\n.srte-menu-item {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n height: 36px;\n padding: 0 8px;\n border: 0;\n border-radius: 8px;\n background: transparent;\n color: inherit;\n cursor: pointer;\n font: 500 13px/1 \"IBM Plex Sans\", ui-sans-serif, system-ui, sans-serif;\n text-align: left;\n white-space: nowrap;\n}\n.srte-menu-item:hover {\n background: var(--srte-muted);\n}\n.srte-menu-check {\n margin-left: auto;\n color: var(--srte-primary);\n font-weight: 700;\n}\n.srte-menu-separator {\n height: 1px;\n margin: 4px;\n background: var(--srte-border);\n}\n.srte-mobile-more { display: none; }\n.srte-toolbar .srte-command-proxy { display: none; }\n.srte-split-control {\n display: inline-flex;\n}\n.srte-split-control > .srte-tool-button:first-child {\n border-radius: 8px 0 0 8px;\n}\n.srte-split-control > select {\n width: 27px;\n padding: 0;\n border-radius: 0 8px 8px 0;\n border-left: 0;\n appearance: none;\n -webkit-appearance: none;\n color: transparent;\n background-color: var(--srte-muted);\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m7 10 5 5 5-5'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: center;\n cursor: pointer;\n}\n.srte-editor [contenteditable] ul[data-srte-checklist=\"true\"] > li {\n display: grid;\n grid-template-columns: 1.1em minmax(0, 1fr);\n column-gap: .45em;\n align-items: start;\n padding-left: 0;\n}\n.srte-editor [contenteditable] ul[data-srte-checklist=\"true\"] > li > [data-srte-check] {\n display: inline-flex;\n grid-column: 1;\n grid-row: 1;\n align-items: center;\n justify-content: center;\n width: 1.1em;\n height: 1.6em;\n margin: 0;\n line-height: 1.6;\n vertical-align: top;\n position: relative;\n}\n.srte-editor [contenteditable] ul[data-srte-checklist=\"true\"] > li > [data-srte-check]::before {\n content: \"\";\n width: .9em;\n height: .9em;\n box-sizing: border-box;\n border: 1.5px solid var(--srte-muted-foreground);\n border-radius: 3px;\n background: var(--srte-canvas);\n}\n.srte-editor [contenteditable] ul[data-srte-checklist=\"true\"] > li > [data-srte-check][data-checked=\"true\"]::before {\n border-color: var(--srte-primary);\n background: var(--srte-primary);\n box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--srte-on-primary) 25%, transparent);\n}\n.srte-editor [contenteditable] ul[data-srte-checklist=\"true\"] > li > [data-srte-check][data-checked=\"true\"]::after {\n content: \"\";\n position: absolute;\n width: .42em;\n height: .22em;\n border-left: 1.5px solid var(--srte-on-primary);\n border-bottom: 1.5px solid var(--srte-on-primary);\n transform: translateY(-.08em) rotate(-45deg);\n}\n.srte-editor [contenteditable] ul[data-srte-checklist=\"true\"] > li > :is(p,h1,h2,h3,h4,h5,h6,blockquote,pre) {\n grid-column: 2;\n min-width: 0;\n margin-top: 0;\n}\n.srte-editor [contenteditable] ul[data-srte-checklist=\"true\"] > li > :is(ul,ol) {\n grid-column: 2;\n}\n.srte-editor:focus-within {\n border-color: var(--srte-ring) !important;\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--srte-ring) 18%, transparent);\n}\n@media (max-width: 639px) {\n .srte-toolbar { gap: 3px; padding: 6px; }\n .srte-tool-button, .srte-toolbar select { height: 40px; min-width: 40px; }\n .srte-toolbar-group[data-srte-priority=\"3\"] { display: none; }\n .srte-toolbar-menu[data-srte-priority=\"2\"] { display: none; }\n .srte-mobile-more { display: block; }\n .srte-mobile-more .srte-menu {\n left: auto;\n right: 0;\n width: min(280px, calc(100vw - 16px));\n min-width: 0;\n max-height: min(70dvh, 480px);\n overflow-x: hidden;\n overflow-y: auto;\n overscroll-behavior: contain;\n -webkit-overflow-scrolling: touch;\n }\n .srte-menu-item { height: 40px; }\n}\n@container srte-editor (max-width: 639px) {\n .srte-toolbar { gap: 3px; padding: 6px; }\n .srte-tool-button, .srte-toolbar select { height: 40px; min-width: 40px; }\n .srte-toolbar-group[data-srte-priority=\"3\"],\n .srte-toolbar-menu[data-srte-priority=\"2\"] { display: none; }\n .srte-mobile-more { display: block; }\n .srte-mobile-more .srte-menu {\n left: auto;\n right: 0;\n width: min(280px, calc(100vw - 16px));\n min-width: 0;\n max-height: min(70dvh, 480px);\n overflow-x: hidden;\n overflow-y: auto;\n overscroll-behavior: contain;\n -webkit-overflow-scrolling: touch;\n }\n .srte-menu-item { height: 40px; }\n}\n.srte-editor [contenteditable] blockquote {\n border-left: 4px solid var(--srte-accent);\n margin: 0.75em 0;\n padding: 0.5em 1em;\n background: var(--srte-surface-subtle);\n color: var(--srte-text);\n}\n.srte-editor [contenteditable] p,\n.srte-editor [contenteditable] h1,\n.srte-editor [contenteditable] h2,\n.srte-editor [contenteditable] h3 {\n color: inherit;\n}\n.srte-editor [contenteditable] p {\n display: block;\n margin: 0 0 0.75em;\n font-size: 1em;\n font-weight: 400;\n line-height: 1.6;\n}\n.srte-editor [contenteditable] p[data-srte-caret-boundary=\"true\"] {\n min-height: 1.6em;\n}\n.srte-editor [contenteditable] h1,\n.srte-editor [contenteditable] h2,\n.srte-editor [contenteditable] h3 {\n display: block;\n margin: 0.75em 0 0.4em;\n font-weight: 700;\n line-height: 1.25;\n}\n.srte-editor [contenteditable] h1 {\n font-size: 2em;\n}\n.srte-editor [contenteditable] h2 {\n font-size: 1.5em;\n}\n.srte-editor [contenteditable] h3 {\n font-size: 1.25em;\n}\n.srte-editor [contenteditable] > :first-child {\n margin-top: 0;\n}\n.srte-editor [contenteditable] ul {\n list-style-type: disc;\n list-style-position: outside;\n margin: 0.75em 0;\n padding-left: 1.75em;\n}\n.srte-editor [contenteditable] ol {\n list-style-type: decimal;\n list-style-position: outside;\n margin: 0.75em 0;\n padding-left: 1.75em;\n}\n.srte-editor [contenteditable] li {\n display: list-item;\n margin: 0.25em 0;\n padding-left: 0.25em;\n}\n.srte-editor [contenteditable] li::marker {\n color: currentColor;\n}\n.srte-editor [contenteditable] table {\n width: 100%;\n margin: 0.75em 0;\n border-collapse: collapse;\n}\n.srte-editor [contenteditable] th,\n.srte-editor [contenteditable] td {\n padding: 8px;\n border: 1px solid var(--srte-border);\n vertical-align: top;\n}\n.srte-editor [contenteditable] th {\n background: var(--srte-surface-subtle);\n font-weight: 600;\n text-align: left;\n}\n.srte-editor [contenteditable] td > h1,\n.srte-editor [contenteditable] td > h2,\n.srte-editor [contenteditable] td > h3,\n.srte-editor [contenteditable] th > h1,\n.srte-editor [contenteditable] th > h2,\n.srte-editor [contenteditable] th > h3 {\n margin: 0 0 0.4em;\n overflow-wrap: anywhere;\n}\n.srte-editor [contenteditable] pre {\n display: block;\n margin: 0.75em 0;\n padding: 12px 14px;\n overflow-x: auto;\n border: 1px solid var(--srte-border);\n border-radius: 6px;\n background: var(--srte-code-bg);\n color: var(--srte-code-text);\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", monospace;\n font-size: 0.9em;\n line-height: 1.55;\n white-space: pre-wrap;\n}\n.srte-editor [contenteditable] pre code {\n padding: 0;\n border: 0;\n background: transparent;\n color: inherit;\n font: inherit;\n}\n.srte-editor [contenteditable] code:not(pre code) {\n padding: 0.1em 0.35em;\n border-radius: 3px;\n background: var(--srte-code-bg);\n color: var(--srte-code-text);\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", monospace;\n font-size: 0.9em;\n}\n.srte-editor [contenteditable] a,\n.srte-editor [contenteditable] a:visited {\n color: var(--srte-primary) !important;\n text-decoration: underline !important;\n text-decoration-thickness: 1px !important;\n text-underline-offset: 2px !important;\n cursor: pointer;\n}\n.srte-editor [contenteditable] a:hover {\n color: var(--srte-accent) !important;\n}\n.srte-editor [contenteditable] a:focus-visible {\n outline: 2px solid var(--srte-accent);\n outline-offset: 2px;\n}\n.srte-editor.srte-dark [contenteditable] [style*=\"color\"]:not(td):not(th):not(.srte-preserve-colors):not(.srte-preserve-colors *),\n.srte-editor.srte-dark [contenteditable] [style*=\"background\"]:not(td):not(th):not(.srte-preserve-colors):not(.srte-preserve-colors *) {\n color: var(--srte-text) !important;\n background: transparent !important;\n background-color: transparent !important;\n}\n.srte-editor [contenteditable] sub,\n.srte-editor [contenteditable] sup {\n line-height: 0;\n}\n";
2
+ export declare const SRTE_DEFAULT_CSS = "\n.srte-editor {\n --srte-background: var(--card, #ffffff);\n --srte-canvas: var(--background, #ffffff);\n --srte-foreground: var(--foreground, #0f172a);\n --srte-muted: var(--muted, #f1f5f9);\n --srte-muted-foreground: var(--muted-foreground, #64748b);\n --srte-ring: var(--ring, #0284c7);\n --srte-radius: var(--radius, 0.625rem);\n --srte-bg: var(--srte-canvas);\n --srte-text: var(--srte-foreground);\n --srte-text-muted: var(--srte-muted-foreground);\n --srte-border: var(--border, #e2e8f0);\n --srte-border-light: var(--srte-border);\n --srte-toolbar-bg: var(--srte-background);\n --srte-input-bg: var(--srte-background);\n --srte-input-text: var(--srte-foreground);\n --srte-input-border: var(--srte-border);\n --srte-modal-backdrop: rgba(0, 0, 0, 0.35);\n --srte-modal-backdrop-filter: blur(2px);\n --srte-modal-bg: #ffffff;\n --srte-modal-text: #000000;\n --srte-menu-bg: var(--srte-background);\n --srte-menu-text: var(--srte-foreground);\n --srte-menu-shadow: 0 8px 24px rgba(0, 0, 0, 0.18);\n --srte-accent: #0284c7;\n --srte-accent-bg: rgba(2, 132, 199, 0.12);\n --srte-danger: #dc2626;\n --srte-primary: #2563eb;\n --srte-surface-subtle: #f3f4f6;\n --srte-on-primary: #ffffff;\n --srte-cancel-bg: #f3f4f6;\n --srte-code-bg: #f6f8fa;\n --srte-code-text: #24292f;\n}\n.srte-editor.srte-dark {\n --srte-background: var(--card, #1e293b);\n --srte-canvas: var(--background, #0f172a);\n --srte-foreground: var(--foreground, #f8fafc);\n --srte-muted: var(--muted, #334155);\n --srte-muted-foreground: var(--muted-foreground, #94a3b8);\n --srte-ring: var(--ring, #38bdf8);\n --srte-bg: var(--srte-canvas);\n --srte-text: var(--srte-foreground);\n --srte-text-muted: var(--srte-muted-foreground);\n --srte-border: var(--border, #334155);\n --srte-border-light: var(--srte-border);\n --srte-toolbar-bg: var(--srte-background);\n --srte-input-bg: var(--srte-background);\n --srte-input-text: var(--srte-foreground);\n --srte-input-border: var(--srte-border);\n --srte-modal-backdrop: rgba(0, 0, 0, 0.22);\n --srte-modal-backdrop-filter: blur(10px) saturate(0.9);\n --srte-modal-bg: #1e293b;\n --srte-modal-text: #e0e0e0;\n --srte-menu-bg: var(--srte-background);\n --srte-menu-text: var(--srte-foreground);\n --srte-menu-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);\n --srte-accent: #38bdf8;\n --srte-accent-bg: rgba(56, 189, 248, 0.16);\n --srte-danger: #ef4444;\n --srte-primary: #3b82f6;\n --srte-surface-subtle: #333333;\n --srte-on-primary: #ffffff;\n --srte-cancel-bg: #333333;\n --srte-code-bg: #111827;\n --srte-code-text: #e5e7eb;\n}\n.srte-editor {\n border-radius: var(--srte-radius);\n font-family: \"IBM Plex Sans\", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n container: srte-editor / inline-size;\n}\n.srte-toolbar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 4px;\n width: 100%;\n min-height: 48px;\n padding: 8px;\n box-sizing: border-box;\n border-bottom: 1px solid var(--srte-border);\n background: var(--srte-background);\n color: var(--srte-foreground);\n position: sticky;\n top: 0;\n z-index: 10;\n}\n.srte-toolbar-group {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n min-width: 0;\n}\n.srte-toolbar-group + .srte-toolbar-group::before {\n content: \"\";\n width: 1px;\n height: 20px;\n margin: 0 5px 0 3px;\n background: var(--srte-border);\n}\n.srte-tool-button,\n.srte-toolbar select {\n height: 32px;\n min-width: 32px;\n box-sizing: border-box;\n border: 1px solid transparent;\n border-radius: 8px;\n background: transparent;\n color: var(--srte-foreground);\n font: 500 13px/1 \"IBM Plex Sans\", ui-sans-serif, system-ui, sans-serif;\n}\n.srte-tool-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 3px;\n padding: 0 7px;\n cursor: pointer;\n}\n.srte-toolbar select {\n max-width: 132px;\n padding: 0 26px 0 9px;\n border-color: var(--srte-border);\n background: var(--srte-input-bg);\n cursor: pointer;\n}\n.srte-tool-button:hover,\n.srte-toolbar select:hover,\n.srte-toolbar-menu[open] > .srte-menu-trigger {\n background: var(--srte-muted);\n border-color: var(--srte-border);\n}\n.srte-tool-button.srte-active,\n.srte-tool-button[aria-pressed=\"true\"] {\n color: var(--srte-primary);\n background: var(--srte-accent-bg);\n border-color: color-mix(in srgb, var(--srte-primary) 35%, transparent);\n}\n.srte-tool-button:focus-visible,\n.srte-toolbar select:focus-visible,\n.srte-menu-item:focus-visible {\n outline: 2px solid var(--srte-ring);\n outline-offset: 1px;\n}\n.srte-tool-button:disabled,\n.srte-menu-item:disabled,\n.srte-toolbar select:disabled {\n cursor: not-allowed;\n opacity: .4;\n}\n.srte-toolbar-menu {\n position: relative;\n}\n.srte-toolbar-menu > summary {\n list-style: none;\n}\n.srte-toolbar-menu > summary::-webkit-details-marker {\n display: none;\n}\n.srte-menu {\n position: absolute;\n top: calc(100% + 6px);\n left: 0;\n z-index: 80;\n min-width: 210px;\n padding: 4px;\n overflow: hidden;\n border: 1px solid var(--srte-border);\n border-radius: 12px;\n background: var(--srte-menu-bg);\n color: var(--srte-menu-text);\n box-shadow: var(--srte-menu-shadow);\n}\n.srte-menu-item {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n height: 36px;\n padding: 0 8px;\n border: 0;\n border-radius: 8px;\n background: transparent;\n color: inherit;\n cursor: pointer;\n font: 500 13px/1 \"IBM Plex Sans\", ui-sans-serif, system-ui, sans-serif;\n text-align: left;\n white-space: nowrap;\n}\n.srte-menu-item:hover {\n background: var(--srte-muted);\n}\n.srte-menu-check {\n margin-left: auto;\n color: var(--srte-primary);\n font-weight: 700;\n}\n.srte-menu-separator {\n height: 1px;\n margin: 4px;\n background: var(--srte-border);\n}\n.srte-mobile-more { display: none; }\n.srte-toolbar .srte-command-proxy { display: none; }\n.srte-split-control {\n display: inline-flex;\n}\n.srte-split-control > .srte-tool-button:first-child {\n border-radius: 8px 0 0 8px;\n}\n.srte-split-control > select {\n width: 27px;\n padding: 0;\n border-radius: 0 8px 8px 0;\n border-left: 0;\n appearance: none;\n -webkit-appearance: none;\n color: transparent;\n background-color: var(--srte-muted);\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m7 10 5 5 5-5'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: center;\n cursor: pointer;\n}\n.srte-editor [contenteditable] ul[data-srte-checklist=\"true\"] > li {\n display: grid;\n grid-template-columns: 1.1em minmax(0, 1fr);\n column-gap: .45em;\n align-items: start;\n padding-left: 0;\n}\n.srte-editor [contenteditable] ol[data-srte-list-preset=\"ordered-decimal-paren\"][data-srte-list-depth=\"0\"] > li::marker {\n content: counter(list-item, decimal) \") \";\n}\n.srte-editor [contenteditable] ol[data-srte-list-preset=\"ordered-decimal-paren\"][data-srte-list-depth=\"1\"] > li::marker {\n content: counter(list-item, lower-alpha) \") \";\n}\n.srte-editor [contenteditable] ol[data-srte-list-preset=\"ordered-decimal-paren\"][data-srte-list-depth=\"2\"] > li::marker,\n.srte-editor [contenteditable] ol[data-srte-list-preset=\"ordered-decimal-paren\"][data-srte-list-depth=\"3\"] > li::marker {\n content: counter(list-item, lower-roman) \") \";\n}\n.srte-editor [contenteditable] ol[data-srte-list-preset=\"ordered-outline\"] > li::marker {\n content: counters(list-item, \".\") \". \";\n}\n.srte-editor [contenteditable] ul[data-srte-list-preset=\"bullet-diamond\"][data-srte-list-depth=\"0\"] > li::marker { content: \"\u2756 \"; }\n.srte-editor [contenteditable] ul[data-srte-list-preset=\"bullet-diamond\"][data-srte-list-depth=\"1\"] > li::marker { content: \"\u27A2 \"; }\n.srte-editor [contenteditable] ul[data-srte-list-preset=\"bullet-diamond\"][data-srte-list-depth=\"2\"] > li::marker { content: \"\u25A0 \"; }\n.srte-editor [contenteditable] ul[data-srte-list-preset=\"bullet-square\"][data-srte-list-depth=\"0\"] > li::marker { content: \"\u25A1 \"; }\n.srte-editor [contenteditable] ul[data-srte-list-preset=\"bullet-square\"][data-srte-list-depth=\"1\"] > li::marker { content: \"\u25A3 \"; }\n.srte-editor [contenteditable] ul[data-srte-list-preset=\"bullet-square\"][data-srte-list-depth=\"2\"] > li::marker { content: \"\u25AA \"; }\n.srte-editor [contenteditable] ul[data-srte-list-preset=\"bullet-arrow\"][data-srte-list-depth=\"0\"] > li::marker { content: \"\u279C \"; }\n.srte-editor [contenteditable] ul[data-srte-list-preset=\"bullet-arrow\"][data-srte-list-depth=\"1\"] > li::marker { content: \"\u25C6 \"; }\n.srte-editor [contenteditable] ul[data-srte-list-preset=\"bullet-arrow\"][data-srte-list-depth=\"2\"] > li::marker { content: \"\u25CF \"; }\n.srte-editor [contenteditable] ul[data-srte-list-preset=\"bullet-star\"][data-srte-list-depth=\"0\"] > li::marker { content: \"\u2605 \"; }\n.srte-editor [contenteditable] ul[data-srte-list-preset=\"bullet-star\"][data-srte-list-depth=\"1\"] > li::marker { content: \"\u25CB \"; }\n.srte-editor [contenteditable] ul[data-srte-list-preset=\"bullet-star\"][data-srte-list-depth=\"2\"] > li::marker { content: \"\u25A0 \"; }\n.srte-editor [contenteditable] ul[data-srte-list-preset=\"bullet-arrow-circle\"][data-srte-list-depth=\"0\"] > li::marker { content: \"\u27A2 \"; }\n.srte-editor [contenteditable] ul[data-srte-list-preset=\"bullet-arrow-circle\"][data-srte-list-depth=\"1\"] > li::marker { content: \"\u25CB \"; }\n.srte-editor [contenteditable] ul[data-srte-list-preset=\"bullet-arrow-circle\"][data-srte-list-depth=\"2\"] > li::marker { content: \"\u25A0 \"; }\n.srte-editor [contenteditable] ul[data-srte-checklist=\"true\"] > li > [data-srte-check] {\n display: inline-flex;\n grid-column: 1;\n grid-row: 1;\n align-items: center;\n justify-content: center;\n width: 1.1em;\n height: 1.6em;\n margin: 0;\n line-height: 1.6;\n vertical-align: top;\n position: relative;\n}\n.srte-editor [contenteditable] ul[data-srte-checklist=\"true\"] > li > [data-srte-check]::before {\n content: \"\";\n width: .9em;\n height: .9em;\n box-sizing: border-box;\n border: 1.5px solid var(--srte-muted-foreground);\n border-radius: 3px;\n background: var(--srte-canvas);\n}\n.srte-editor [contenteditable] ul[data-srte-checklist=\"true\"] > li > [data-srte-check][data-checked=\"true\"]::before {\n border-color: var(--srte-primary);\n background: var(--srte-primary);\n box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--srte-on-primary) 25%, transparent);\n}\n.srte-editor [contenteditable] ul[data-srte-checklist=\"true\"] > li > [data-srte-check][data-checked=\"true\"]::after {\n content: \"\";\n position: absolute;\n width: .42em;\n height: .22em;\n border-left: 1.5px solid var(--srte-on-primary);\n border-bottom: 1.5px solid var(--srte-on-primary);\n transform: translateY(-.08em) rotate(-45deg);\n}\n.srte-editor [contenteditable] ul[data-srte-checklist=\"true\"] > li > :is(p,h1,h2,h3,h4,h5,h6,blockquote,pre) {\n grid-column: 2;\n min-width: 0;\n margin-top: 0;\n}\n.srte-editor [contenteditable] ul[data-srte-checklist=\"true\"] > li > :is(ul,ol) {\n grid-column: 2;\n}\n.srte-editor:focus-within {\n border-color: var(--srte-ring) !important;\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--srte-ring) 18%, transparent);\n}\n@media (max-width: 639px) {\n .srte-toolbar { gap: 3px; padding: 6px; }\n .srte-tool-button, .srte-toolbar select { height: 40px; min-width: 40px; }\n .srte-toolbar-group[data-srte-priority=\"3\"] { display: none; }\n .srte-toolbar-menu[data-srte-priority=\"2\"] { display: none; }\n .srte-mobile-more { display: block; }\n .srte-mobile-more .srte-menu {\n left: auto;\n right: 0;\n width: min(280px, calc(100vw - 16px));\n min-width: 0;\n max-height: min(70dvh, 480px);\n overflow-x: hidden;\n overflow-y: auto;\n overscroll-behavior: contain;\n -webkit-overflow-scrolling: touch;\n }\n .srte-menu-item { height: 40px; }\n}\n@container srte-editor (max-width: 639px) {\n .srte-toolbar { gap: 3px; padding: 6px; }\n .srte-tool-button, .srte-toolbar select { height: 40px; min-width: 40px; }\n .srte-toolbar-group[data-srte-priority=\"3\"],\n .srte-toolbar-menu[data-srte-priority=\"2\"] { display: none; }\n .srte-mobile-more { display: block; }\n .srte-mobile-more .srte-menu {\n left: auto;\n right: 0;\n width: min(280px, calc(100vw - 16px));\n min-width: 0;\n max-height: min(70dvh, 480px);\n overflow-x: hidden;\n overflow-y: auto;\n overscroll-behavior: contain;\n -webkit-overflow-scrolling: touch;\n }\n .srte-menu-item { height: 40px; }\n}\n.srte-editor [contenteditable] blockquote {\n border-left: 4px solid var(--srte-accent);\n margin: 0.75em 0;\n padding: 0.5em 1em;\n background: var(--srte-surface-subtle);\n color: var(--srte-text);\n}\n.srte-editor [contenteditable] p,\n.srte-editor [contenteditable] h1,\n.srte-editor [contenteditable] h2,\n.srte-editor [contenteditable] h3 {\n color: inherit;\n}\n.srte-editor [contenteditable] p {\n display: block;\n margin: 0 0 0.75em;\n font-size: 1em;\n font-weight: 400;\n line-height: 1.6;\n}\n.srte-editor [contenteditable] p[data-srte-caret-boundary=\"true\"] {\n min-height: 1.6em;\n}\n.srte-editor [contenteditable] h1,\n.srte-editor [contenteditable] h2,\n.srte-editor [contenteditable] h3 {\n display: block;\n margin: 0.75em 0 0.4em;\n font-weight: 700;\n line-height: 1.25;\n}\n.srte-editor [contenteditable] h1 {\n font-size: 2em;\n}\n.srte-editor [contenteditable] h2 {\n font-size: 1.5em;\n}\n.srte-editor [contenteditable] h3 {\n font-size: 1.25em;\n}\n.srte-editor [contenteditable] > :first-child {\n margin-top: 0;\n}\n.srte-editor [contenteditable] ul {\n list-style-type: disc;\n list-style-position: outside;\n margin: 0.75em 0;\n padding-left: 1.75em;\n}\n.srte-editor [contenteditable] ol {\n list-style-type: decimal;\n list-style-position: outside;\n margin: 0.75em 0;\n padding-left: 1.75em;\n}\n.srte-editor [contenteditable] li {\n display: list-item;\n margin: 0.25em 0;\n padding-left: 0.25em;\n}\n.srte-editor [contenteditable] li::marker {\n color: currentColor;\n}\n.srte-editor [contenteditable] table {\n width: 100%;\n margin: 0.75em 0;\n border-collapse: collapse;\n}\n.srte-editor [contenteditable] th,\n.srte-editor [contenteditable] td {\n padding: 8px;\n border: 1px solid var(--srte-border);\n vertical-align: top;\n}\n.srte-editor [contenteditable] th {\n background: var(--srte-surface-subtle);\n font-weight: 600;\n text-align: left;\n}\n.srte-editor [contenteditable] td > h1,\n.srte-editor [contenteditable] td > h2,\n.srte-editor [contenteditable] td > h3,\n.srte-editor [contenteditable] th > h1,\n.srte-editor [contenteditable] th > h2,\n.srte-editor [contenteditable] th > h3 {\n margin: 0 0 0.4em;\n overflow-wrap: anywhere;\n}\n.srte-editor [contenteditable] pre {\n display: block;\n margin: 0.75em 0;\n padding: 12px 14px;\n overflow-x: auto;\n border: 1px solid var(--srte-border);\n border-radius: 6px;\n background: var(--srte-code-bg);\n color: var(--srte-code-text);\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", monospace;\n font-size: 0.9em;\n line-height: 1.55;\n white-space: pre-wrap;\n}\n.srte-editor [contenteditable] pre code {\n padding: 0;\n border: 0;\n background: transparent;\n color: inherit;\n font: inherit;\n}\n.srte-editor [contenteditable] code:not(pre code) {\n padding: 0.1em 0.35em;\n border-radius: 3px;\n background: var(--srte-code-bg);\n color: var(--srte-code-text);\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", monospace;\n font-size: 0.9em;\n}\n.srte-editor [contenteditable] a,\n.srte-editor [contenteditable] a:visited {\n color: var(--srte-primary) !important;\n text-decoration: underline !important;\n text-decoration-thickness: 1px !important;\n text-underline-offset: 2px !important;\n cursor: pointer;\n}\n.srte-editor [contenteditable] a:hover {\n color: var(--srte-accent) !important;\n}\n.srte-editor [contenteditable] a:focus-visible {\n outline: 2px solid var(--srte-accent);\n outline-offset: 2px;\n}\n.srte-editor [contenteditable] sub,\n.srte-editor [contenteditable] sup {\n line-height: 0;\n}\n";
3
3
  export declare function ensureStyleSheet(): void;
package/dist/theme.js CHANGED
@@ -231,6 +231,34 @@ export const SRTE_DEFAULT_CSS = `
231
231
  align-items: start;
232
232
  padding-left: 0;
233
233
  }
234
+ .srte-editor [contenteditable] ol[data-srte-list-preset="ordered-decimal-paren"][data-srte-list-depth="0"] > li::marker {
235
+ content: counter(list-item, decimal) ") ";
236
+ }
237
+ .srte-editor [contenteditable] ol[data-srte-list-preset="ordered-decimal-paren"][data-srte-list-depth="1"] > li::marker {
238
+ content: counter(list-item, lower-alpha) ") ";
239
+ }
240
+ .srte-editor [contenteditable] ol[data-srte-list-preset="ordered-decimal-paren"][data-srte-list-depth="2"] > li::marker,
241
+ .srte-editor [contenteditable] ol[data-srte-list-preset="ordered-decimal-paren"][data-srte-list-depth="3"] > li::marker {
242
+ content: counter(list-item, lower-roman) ") ";
243
+ }
244
+ .srte-editor [contenteditable] ol[data-srte-list-preset="ordered-outline"] > li::marker {
245
+ content: counters(list-item, ".") ". ";
246
+ }
247
+ .srte-editor [contenteditable] ul[data-srte-list-preset="bullet-diamond"][data-srte-list-depth="0"] > li::marker { content: "❖ "; }
248
+ .srte-editor [contenteditable] ul[data-srte-list-preset="bullet-diamond"][data-srte-list-depth="1"] > li::marker { content: "➢ "; }
249
+ .srte-editor [contenteditable] ul[data-srte-list-preset="bullet-diamond"][data-srte-list-depth="2"] > li::marker { content: "■ "; }
250
+ .srte-editor [contenteditable] ul[data-srte-list-preset="bullet-square"][data-srte-list-depth="0"] > li::marker { content: "□ "; }
251
+ .srte-editor [contenteditable] ul[data-srte-list-preset="bullet-square"][data-srte-list-depth="1"] > li::marker { content: "▣ "; }
252
+ .srte-editor [contenteditable] ul[data-srte-list-preset="bullet-square"][data-srte-list-depth="2"] > li::marker { content: "▪ "; }
253
+ .srte-editor [contenteditable] ul[data-srte-list-preset="bullet-arrow"][data-srte-list-depth="0"] > li::marker { content: "➜ "; }
254
+ .srte-editor [contenteditable] ul[data-srte-list-preset="bullet-arrow"][data-srte-list-depth="1"] > li::marker { content: "◆ "; }
255
+ .srte-editor [contenteditable] ul[data-srte-list-preset="bullet-arrow"][data-srte-list-depth="2"] > li::marker { content: "● "; }
256
+ .srte-editor [contenteditable] ul[data-srte-list-preset="bullet-star"][data-srte-list-depth="0"] > li::marker { content: "★ "; }
257
+ .srte-editor [contenteditable] ul[data-srte-list-preset="bullet-star"][data-srte-list-depth="1"] > li::marker { content: "○ "; }
258
+ .srte-editor [contenteditable] ul[data-srte-list-preset="bullet-star"][data-srte-list-depth="2"] > li::marker { content: "■ "; }
259
+ .srte-editor [contenteditable] ul[data-srte-list-preset="bullet-arrow-circle"][data-srte-list-depth="0"] > li::marker { content: "➢ "; }
260
+ .srte-editor [contenteditable] ul[data-srte-list-preset="bullet-arrow-circle"][data-srte-list-depth="1"] > li::marker { content: "○ "; }
261
+ .srte-editor [contenteditable] ul[data-srte-list-preset="bullet-arrow-circle"][data-srte-list-depth="2"] > li::marker { content: "■ "; }
234
262
  .srte-editor [contenteditable] ul[data-srte-checklist="true"] > li > [data-srte-check] {
235
263
  display: inline-flex;
236
264
  grid-column: 1;
@@ -449,12 +477,6 @@ export const SRTE_DEFAULT_CSS = `
449
477
  outline: 2px solid var(--srte-accent);
450
478
  outline-offset: 2px;
451
479
  }
452
- .srte-editor.srte-dark [contenteditable] [style*="color"]:not(td):not(th):not(.srte-preserve-colors):not(.srte-preserve-colors *),
453
- .srte-editor.srte-dark [contenteditable] [style*="background"]:not(td):not(th):not(.srte-preserve-colors):not(.srte-preserve-colors *) {
454
- color: var(--srte-text) !important;
455
- background: transparent !important;
456
- background-color: transparent !important;
457
- }
458
480
  .srte-editor [contenteditable] sub,
459
481
  .srte-editor [contenteditable] sup {
460
482
  line-height: 0;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "smartrte-react",
3
- "version": "0.3.3",
3
+ "version": "0.3.5",
4
4
  "description": "A powerful, feature-rich Rich Text Editor for React with support for tables, mathematical formulas (LaTeX/KaTeX), and media management",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",