@sobree/core 0.1.15 → 0.1.17
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/dist/createSobree.d.ts +9 -0
- package/dist/doc/builders/index.d.ts +1 -0
- package/dist/doc/builders/numbering.d.ts +19 -0
- package/dist/editor/index.d.ts +33 -2
- package/dist/editor/internal/mutations.d.ts +15 -2
- package/dist/editor/numbering.d.ts +14 -0
- package/dist/editor/sections.d.ts +15 -0
- package/dist/editor/styles.d.ts +16 -0
- package/dist/editor/types.d.ts +34 -1
- package/dist/headless.d.ts +18 -2
- package/dist/index.css +1 -1
- package/dist/index.js +2086 -1864
- package/dist/index.js.map +1 -1
- package/dist/sobree.d.ts +5 -0
- package/package.json +1 -1
package/dist/createSobree.d.ts
CHANGED
|
@@ -72,6 +72,13 @@ export interface CreateSobreeOptions {
|
|
|
72
72
|
* after a deploy). Forwarded to `SobreeOptions.versionBadge`.
|
|
73
73
|
*/
|
|
74
74
|
versionBadge?: boolean;
|
|
75
|
+
/**
|
|
76
|
+
* Show hidden text (`<w:vanish/>`) from the start. Off by default
|
|
77
|
+
* (print-faithful — matches Word/LibreOffice). Toggle at runtime with
|
|
78
|
+
* the returned `setShowHiddenText`. Forwarded to
|
|
79
|
+
* `SobreeOptions.showHiddenText`.
|
|
80
|
+
*/
|
|
81
|
+
showHiddenText?: boolean;
|
|
75
82
|
}
|
|
76
83
|
/**
|
|
77
84
|
* The editor handle returned by `createSobree()`. Proxies the most-used
|
|
@@ -103,6 +110,8 @@ export interface SobreeHandle {
|
|
|
103
110
|
}>;
|
|
104
111
|
getDocument(): SobreeDocument;
|
|
105
112
|
setDocument(doc: SobreeDocument): void;
|
|
113
|
+
/** Show or hide hidden text (`<w:vanish/>`). Off by default. */
|
|
114
|
+
setShowHiddenText(show: boolean): void;
|
|
106
115
|
/** Replace the document with one parsed from a Markdown string (seed-quality). */
|
|
107
116
|
loadMarkdown(md: string): void;
|
|
108
117
|
/** Load a `.docx` file. Resolves with any import warnings. */
|
|
@@ -23,3 +23,4 @@ export { heading, paragraph, sectionBreak } from './block';
|
|
|
23
23
|
export { columnBreak, commentRef, emphasis, field, footnoteRef, hyperlink, image, type ImageOptions, pageBreak, softBreak, strong, tab, text, } from './inline';
|
|
24
24
|
export { type CellProperties, type TableOptions, table, tableCell, tableRow } from './table';
|
|
25
25
|
export { type NamedStyleOptions, namedStyle } from './style';
|
|
26
|
+
export { type NumberingLevelOptions, bulletDefinition, numberingDefinition, numberingLevel, orderedDefinition, } from './numbering';
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { NumberingDefinition, NumberingLevel, ParagraphIndent, RunProperties } from '../types';
|
|
2
|
+
export interface NumberingLevelOptions {
|
|
3
|
+
restart?: number;
|
|
4
|
+
paragraphIndent?: ParagraphIndent;
|
|
5
|
+
/** Run properties for the marker glyph/number itself. */
|
|
6
|
+
runDefaults?: RunProperties;
|
|
7
|
+
}
|
|
8
|
+
/** One indent level of a list. `format` is `bullet` / `decimal` /
|
|
9
|
+
* `lowerRoman` / `upperLetter` / …; `text` is the marker template
|
|
10
|
+
* (`%1.`, `(%1)`, or a literal bullet glyph). */
|
|
11
|
+
export declare function numberingLevel(level: number, format: string, text: string, options?: NumberingLevelOptions): NumberingLevel;
|
|
12
|
+
/** A numbering definition: a `numId` (referenced from paragraphs) plus its
|
|
13
|
+
* level formats. */
|
|
14
|
+
export declare function numberingDefinition(numId: number, levels: NumberingLevel[]): NumberingDefinition;
|
|
15
|
+
/** A bullet list of `levels` levels (default 3), cycling • ◦ ▪. */
|
|
16
|
+
export declare function bulletDefinition(numId: number, levels?: number): NumberingDefinition;
|
|
17
|
+
/** An ordered list of `levels` levels (default 3), each `%1.` decimal,
|
|
18
|
+
* restarting at the level above. */
|
|
19
|
+
export declare function orderedDefinition(numId: number, levels?: number): NumberingDefinition;
|
package/dist/editor/index.d.ts
CHANGED
|
@@ -6,14 +6,17 @@ import { EmbedFontFaces, EmbedFontOptions } from '../fonts';
|
|
|
6
6
|
import { History } from '../history';
|
|
7
7
|
import { BlockRegistry } from './internal/blockRegistry';
|
|
8
8
|
import { countBlocks } from './internal/positionMap';
|
|
9
|
+
import { EditorNumbering } from './numbering';
|
|
10
|
+
import { EditorSections } from './sections';
|
|
9
11
|
import { EditorSelection } from './selection';
|
|
12
|
+
import { EditorStyles } from './styles';
|
|
10
13
|
import { EditorTable } from './table';
|
|
11
|
-
import { ApiRangeType, BlockInfo, ChangePayload, CommandBus, CommandDefinition, CommandSnapshot, EditorEvent, EditorEventPayload, EditorOptions, KeyDownPayload, OutlineItem, ParagraphPropertiesPatch, RevisionSpan, SelectionPayload, TrackChangesState, Unsubscribe, WrapTag } from './types';
|
|
14
|
+
import { ApiRangeType, BlockInfo, ChangePayload, CommandBus, CommandDefinition, CommandSnapshot, EditorEvent, EditorEventPayload, EditorOptions, KeyDownPayload, NamedStylePatch, OutlineItem, ParagraphPropertiesPatch, RevisionSpan, SectionPropertiesPatch, SelectionPayload, TrackChangesState, Unsubscribe, WrapTag } from './types';
|
|
12
15
|
import * as Y from "yjs";
|
|
13
16
|
export { EditorCommands } from './commands';
|
|
14
17
|
export { EditorSelection } from './selection';
|
|
15
18
|
export type { BlockRef, EditError, EditResult, InlinePosition, Selection };
|
|
16
|
-
export type { ApiRangeType, BlockInfo, ChangePayload, CommandBus, CommandDefinition, CommandSnapshot, EditorEvent, EditorEventPayload, EditorOptions, KeyDownPayload, OutlineItem, ParagraphPropertiesPatch, RevisionSpan, SelectionPayload, TrackChangesState, Unsubscribe, WrapTag, };
|
|
19
|
+
export type { ApiRangeType, BlockInfo, ChangePayload, CommandBus, CommandDefinition, CommandSnapshot, EditorEvent, EditorEventPayload, EditorOptions, KeyDownPayload, NamedStylePatch, OutlineItem, ParagraphPropertiesPatch, RevisionSpan, SectionPropertiesPatch, SelectionPayload, TrackChangesState, Unsubscribe, WrapTag, };
|
|
17
20
|
export type { CellRef, InsertAt, InsertColumnOpts, InsertRowOpts, MergeCellsOpts, } from './types';
|
|
18
21
|
export { runsLength } from '../doc/runs';
|
|
19
22
|
export type { RunPropertiesPatch };
|
|
@@ -42,6 +45,27 @@ export declare class Editor {
|
|
|
42
45
|
* and inherits optimistic-lock checking via `replaceBlock`.
|
|
43
46
|
*/
|
|
44
47
|
readonly table: EditorTable;
|
|
48
|
+
/**
|
|
49
|
+
* Section-level edit operations — page size / margins, columns,
|
|
50
|
+
* header/footer references, vertical alignment. Grouped here (rather
|
|
51
|
+
* than as flat `Editor` methods) so the facade stays thin as the
|
|
52
|
+
* edit-op surface grows. Every method returns an `EditResult`.
|
|
53
|
+
*/
|
|
54
|
+
readonly sections: EditorSections;
|
|
55
|
+
/**
|
|
56
|
+
* Named-style edit operations — define / update / remove the style
|
|
57
|
+
* definitions content resolves through. Applying a `styleId` to content
|
|
58
|
+
* is `applyBlockProperties` / `applyRunProperties`; this manages the
|
|
59
|
+
* definitions themselves. Every method returns an `EditResult`.
|
|
60
|
+
*/
|
|
61
|
+
readonly styles: EditorStyles;
|
|
62
|
+
/**
|
|
63
|
+
* Numbering / list-definition edit operations — define / update / remove
|
|
64
|
+
* the list formats paragraphs reference by `numId`. Pointing a paragraph
|
|
65
|
+
* at a list is `applyBlockProperties`; this manages the definitions.
|
|
66
|
+
* Every method returns an `EditResult`.
|
|
67
|
+
*/
|
|
68
|
+
readonly numbering: EditorNumbering;
|
|
45
69
|
/**
|
|
46
70
|
* Named-command registry — the coordination point between plugins.
|
|
47
71
|
* Plugins register commands on attach and unregister on detach;
|
|
@@ -188,6 +212,13 @@ export declare class Editor {
|
|
|
188
212
|
* throw away properties the renderer doesn't surface.
|
|
189
213
|
*/
|
|
190
214
|
getDocument(): SobreeDocument;
|
|
215
|
+
/**
|
|
216
|
+
* Show or hide hidden text (`<w:vanish/>`). Off by default (print-
|
|
217
|
+
* faithful). A pure class flip on the editor root — no re-render, no
|
|
218
|
+
* document change; hidden runs stay in the DOM either way. When shown
|
|
219
|
+
* they get a muted dotted underline and become editable.
|
|
220
|
+
*/
|
|
221
|
+
setShowHiddenText(show: boolean): void;
|
|
191
222
|
/** Replace the document. Fires `change` synchronously. */
|
|
192
223
|
setDocument(doc: SobreeDocument): void;
|
|
193
224
|
/**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { RunPropertiesPatch } from '../../doc/runs';
|
|
2
|
-
import { Block, ParagraphProperties, RunProperties, SectionProperties, SobreeDocument } from '../../doc/types';
|
|
3
|
-
import { ParagraphPropertiesPatch, WrapTag } from '../types';
|
|
2
|
+
import { Block, NamedStyle, ParagraphProperties, RunProperties, SectionProperties, SobreeDocument } from '../../doc/types';
|
|
3
|
+
import { NamedStylePatch, ParagraphPropertiesPatch, SectionPropertiesPatch, WrapTag } from '../types';
|
|
4
4
|
/**
|
|
5
5
|
* One registry-level operation produced by a mutation. The caller
|
|
6
6
|
* applies these to the BlockRegistry after committing the new doc:
|
|
@@ -49,6 +49,19 @@ export declare function mergeSectionsAcross(sections: readonly SectionProperties
|
|
|
49
49
|
* overwrites.
|
|
50
50
|
*/
|
|
51
51
|
export declare function mergeParagraphProps(prev: ParagraphProperties, patch: ParagraphPropertiesPatch): ParagraphProperties;
|
|
52
|
+
/**
|
|
53
|
+
* Merge a {@link SectionPropertiesPatch} onto existing section properties.
|
|
54
|
+
* `pageSize` / `pageMargins` are FIELD-merged (a partial stays valid); the
|
|
55
|
+
* other fields replace wholesale. For the optional fields (`columns`,
|
|
56
|
+
* `titlePage`, `type`, `vAlign`) an explicit `undefined` clears them, while
|
|
57
|
+
* the required `headerRefs` / `footerRefs` only replace when present.
|
|
58
|
+
*/
|
|
59
|
+
export declare function mergeSectionProps(prev: SectionProperties, patch: SectionPropertiesPatch): SectionProperties;
|
|
60
|
+
/** Merge a {@link NamedStylePatch} onto an existing style. Each present
|
|
61
|
+
* field replaces the style's field wholesale; an explicit `undefined`
|
|
62
|
+
* clears an OPTIONAL field. The required `type` / `displayName` are never
|
|
63
|
+
* cleared (an undefined for them is ignored). */
|
|
64
|
+
export declare function mergeNamedStyle(prev: NamedStyle, patch: NamedStylePatch): NamedStyle;
|
|
52
65
|
/**
|
|
53
66
|
* Map a semantic "wrap" tag to the run-property patch that achieves it.
|
|
54
67
|
* Same mapping the browser editor uses for toolbar buttons.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { EditResult } from '../doc/api';
|
|
2
|
+
import { NumberingDefinition, NumberingLevel } from '../doc/types';
|
|
3
|
+
import { EditorContext } from './context';
|
|
4
|
+
export declare class EditorNumbering {
|
|
5
|
+
private readonly ctx;
|
|
6
|
+
constructor(ctx: EditorContext);
|
|
7
|
+
/** Add a new numbering definition. Fails if `def.numId` already exists. */
|
|
8
|
+
define(def: NumberingDefinition): EditResult<void>;
|
|
9
|
+
/** Replace the levels of the definition with `numId`. Fails if missing. */
|
|
10
|
+
update(numId: number, levels: NumberingLevel[]): EditResult<void>;
|
|
11
|
+
/** Remove the definition with `numId`. Fails if missing. Paragraphs that
|
|
12
|
+
* still reference it render without a marker. */
|
|
13
|
+
remove(numId: number): EditResult<void>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { EditResult } from '../doc/api';
|
|
2
|
+
import { EditorContext } from './context';
|
|
3
|
+
import { SectionPropertiesPatch } from './types';
|
|
4
|
+
export declare class EditorSections {
|
|
5
|
+
private readonly ctx;
|
|
6
|
+
constructor(ctx: EditorContext);
|
|
7
|
+
/**
|
|
8
|
+
* Merge a patch into the section at `index`: page size / margins,
|
|
9
|
+
* columns, header/footer refs, vertical alignment. `pageSize` /
|
|
10
|
+
* `pageMargins` are field-merged (a partial stays valid); other fields
|
|
11
|
+
* replace wholesale, and an explicit `undefined` clears an optional one.
|
|
12
|
+
* Re-renders page geometry; undo-integrated.
|
|
13
|
+
*/
|
|
14
|
+
setProperties(index: number, patch: SectionPropertiesPatch): EditResult<void>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { EditResult } from '../doc/api';
|
|
2
|
+
import { NamedStyle } from '../doc/types';
|
|
3
|
+
import { EditorContext } from './context';
|
|
4
|
+
import { NamedStylePatch } from './types';
|
|
5
|
+
export declare class EditorStyles {
|
|
6
|
+
private readonly ctx;
|
|
7
|
+
constructor(ctx: EditorContext);
|
|
8
|
+
/** Add a new style. Fails if a style with the same `id` already exists
|
|
9
|
+
* (use {@link update} to change one). */
|
|
10
|
+
define(style: NamedStyle): EditResult<void>;
|
|
11
|
+
/** Merge a patch into the style with `id`. Fails if no such style. */
|
|
12
|
+
update(id: string, patch: NamedStylePatch): EditResult<void>;
|
|
13
|
+
/** Remove the style with `id`. Fails if no such style. Content that
|
|
14
|
+
* still references it falls back to the cascade's defaults. */
|
|
15
|
+
remove(id: string): EditResult<void>;
|
|
16
|
+
}
|
package/dist/editor/types.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { BlobStore } from '../blob';
|
|
2
2
|
import { Range as ApiRange, BlockRef, EditResult, InlinePosition, Selection } from '../doc/api';
|
|
3
3
|
import { RunPropertiesPatch } from '../doc/runs';
|
|
4
|
-
import { Block, ParagraphAlignment, ParagraphProperties, SobreeDocument } from '../doc/types';
|
|
4
|
+
import { Block, HeaderFooterRef, NamedStyle, PageMargins, PageSize, ParagraphAlignment, ParagraphProperties, SectionColumns, SectionProperties, SobreeDocument } from '../doc/types';
|
|
5
5
|
/**
|
|
6
6
|
* Editor-surface types — the public type vocabulary of the `Editor`
|
|
7
7
|
* façade (events, payloads, command bus, options, tracked-change spans).
|
|
@@ -121,6 +121,32 @@ export interface OutlineItem {
|
|
|
121
121
|
export type ParagraphPropertiesPatch = {
|
|
122
122
|
[K in keyof ParagraphProperties]?: ParagraphProperties[K] | undefined;
|
|
123
123
|
};
|
|
124
|
+
/**
|
|
125
|
+
* Patch for a section's properties (page geometry, columns, header/footer
|
|
126
|
+
* refs, vertical alignment). `pageSize` / `pageMargins` are FIELD-merged
|
|
127
|
+
* into the existing values (so a partial — e.g. just `orientation` or
|
|
128
|
+
* `topTwips` — stays valid); every other field REPLACES wholesale, and an
|
|
129
|
+
* explicit `undefined` on an optional field clears it.
|
|
130
|
+
*/
|
|
131
|
+
export interface SectionPropertiesPatch {
|
|
132
|
+
pageSize?: Partial<PageSize>;
|
|
133
|
+
pageMargins?: Partial<PageMargins>;
|
|
134
|
+
columns?: SectionColumns | undefined;
|
|
135
|
+
headerRefs?: HeaderFooterRef[];
|
|
136
|
+
footerRefs?: HeaderFooterRef[];
|
|
137
|
+
titlePage?: boolean | undefined;
|
|
138
|
+
type?: SectionProperties["type"];
|
|
139
|
+
vAlign?: SectionProperties["vAlign"];
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Patch for an existing named style (everything except its `id`). Each
|
|
143
|
+
* present field replaces the style's corresponding field wholesale; an
|
|
144
|
+
* explicit `undefined` clears an optional one. The required `type` /
|
|
145
|
+
* `displayName` are never cleared.
|
|
146
|
+
*/
|
|
147
|
+
export type NamedStylePatch = {
|
|
148
|
+
[K in keyof Omit<NamedStyle, "id">]?: NamedStyle[K] | undefined;
|
|
149
|
+
};
|
|
124
150
|
export type WrapTag = "sup" | "sub" | "strong" | "em" | "u" | "s" | "mark";
|
|
125
151
|
/** The slice of selection state plugins read (see {@link EditorLike}). */
|
|
126
152
|
export interface EditorSelectionLike {
|
|
@@ -247,6 +273,13 @@ export interface CommandBus {
|
|
|
247
273
|
export interface EditorOptions {
|
|
248
274
|
initialDocument?: SobreeDocument;
|
|
249
275
|
changeDebounceMs?: number;
|
|
276
|
+
/**
|
|
277
|
+
* Show hidden text (`<w:vanish/>`) from the start. Default `false` —
|
|
278
|
+
* hidden text is not shown (print-faithful, matching Word/LibreOffice).
|
|
279
|
+
* Toggle at runtime with `setShowHiddenText`. When shown, hidden runs
|
|
280
|
+
* get a muted dotted underline so they can be read and edited.
|
|
281
|
+
*/
|
|
282
|
+
showHiddenText?: boolean;
|
|
250
283
|
/**
|
|
251
284
|
* Elements whose children are editable blocks, in document order. Called
|
|
252
285
|
* fresh each time — the list can grow/shrink (e.g. during pagination).
|
package/dist/headless.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { BlobCache, BlobStore } from './blob';
|
|
2
2
|
import { BlockRef, EditError, EditResult, Selection } from './doc/api';
|
|
3
|
-
import { Block, ParagraphAlignment, ParagraphProperties, SobreeDocument } from './doc/types';
|
|
4
|
-
import { ParagraphPropertiesPatch, BlockInfo, CommandBus, OutlineItem } from './editor';
|
|
3
|
+
import { Block, NamedStyle, NumberingDefinition, NumberingLevel, ParagraphAlignment, ParagraphProperties, SobreeDocument } from './doc/types';
|
|
4
|
+
import { ParagraphPropertiesPatch, BlockInfo, CommandBus, NamedStylePatch, OutlineItem, SectionPropertiesPatch } from './editor';
|
|
5
5
|
import { History } from './history';
|
|
6
6
|
/**
|
|
7
7
|
* HeadlessSobree — a no-DOM Sobree peer for LLM agents, automation,
|
|
@@ -148,6 +148,22 @@ export declare class HeadlessSobree {
|
|
|
148
148
|
deleteBlock(target: BlockRef): EditResult<void>;
|
|
149
149
|
/** Merge a patch into each target paragraph's properties. */
|
|
150
150
|
applyBlockProperties(targets: BlockRef[], patch: ParagraphPropertiesPatch): EditResult<void>;
|
|
151
|
+
/** Merge a patch into a section's properties (page geometry, columns,
|
|
152
|
+
* header/footer refs, vertical alignment). `sectionIndex` is the
|
|
153
|
+
* section's position in the document's `sections` array. */
|
|
154
|
+
applySectionProperties(sectionIndex: number, patch: SectionPropertiesPatch): EditResult<void>;
|
|
155
|
+
/** Add a new named style. Fails if `style.id` already exists. */
|
|
156
|
+
defineStyle(style: NamedStyle): EditResult<void>;
|
|
157
|
+
/** Merge a patch into the style with `id`. Fails if no such style. */
|
|
158
|
+
updateStyle(id: string, patch: NamedStylePatch): EditResult<void>;
|
|
159
|
+
/** Remove the style with `id`. Fails if no such style. */
|
|
160
|
+
removeStyle(id: string): EditResult<void>;
|
|
161
|
+
/** Add a new numbering definition. Fails if `def.numId` already exists. */
|
|
162
|
+
defineNumbering(def: NumberingDefinition): EditResult<void>;
|
|
163
|
+
/** Replace the levels of the definition with `numId`. Fails if missing. */
|
|
164
|
+
updateNumbering(numId: number, levels: NumberingLevel[]): EditResult<void>;
|
|
165
|
+
/** Remove the definition with `numId`. Fails if missing. */
|
|
166
|
+
removeNumbering(numId: number): EditResult<void>;
|
|
151
167
|
on<E extends HeadlessEvent>(event: E, cb: (payload: HeadlessChangePayload) => void): HeadlessUnsubscribe;
|
|
152
168
|
destroy(): void;
|
|
153
169
|
private allBlockIds;
|
package/dist/index.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.sobree-viewport{position:relative;overflow:hidden;overscroll-behavior:contain;touch-action:none;background:#ececee}.sobree-viewport__stage{position:absolute;top:0;left:0;transform-origin:0 0}.sobree-viewport__stage.is-gesturing,.sobree-viewport__stage.is-animating{will-change:transform}.sobree-viewport__stage.is-animating{transition:transform .32s cubic-bezier(.2,.7,.2,1)}.sobree-viewport__slot{display:block}.sobree-editor{position:relative;outline:none}.sobree-editor>:first-child{margin-top:0}.sobree-editor p,.sobree-editor h1,.sobree-editor h2,.sobree-editor h3,.sobree-editor h4,.sobree-editor h5,.sobree-editor h6,.sobree-editor ul,.sobree-editor ol,.sobree-editor li,.sobree-editor blockquote,.sobree-editor pre{margin:0;padding:0}.sobree-editor ul,.sobree-editor ol{padding-left:1.5em}.sobree-editor li.sobree-li-continuation{list-style-type:none}.sobree-editor li.sobree-li-continuation::marker{content:""}.sobree-editor .sobree-fragment-continued{text-align-last:justify}.sobree-editor .sobree-footnote-ref a{color:inherit;text-decoration:none}.sobree-editor .sobree-footnote-ref a:hover{text-decoration:underline}.sobree-editor .sobree-footnotes{margin-top:2em;padding-top:.5em;border-top:1pt solid currentColor;font-size:.85em}.sobree-editor .sobree-footnotes__list{padding-left:1.5em}.sobree-editor .sobree-footnotes__item{margin:.25em 0}.sobree-editor ins.sobree-revision-ins{text-decoration:underline}.sobree-editor del.sobree-revision-del{text-decoration:line-through}.sobree-editor .sobree-revision-format{text-decoration:underline dashed var(--sobree-format-revision-color, currentColor);text-underline-offset:3px}.sobree-editor [data-block-revision=ins]:after,.sobree-editor [data-block-revision=del]:after{content:" ¶";color:var(--sobree-block-revision-color, currentColor);opacity:.65;font-weight:600;-webkit-user-select:none;user-select:none}.sobree-editor [data-block-revision=del]:after{text-decoration:line-through}.sobree-editor .sobree-comment-range{background:var(--sobree-comment-range-bg, rgba(255, 217, 0, .25));border-bottom:1px dotted var(--sobree-comment-range-border, rgba(180, 130, 0, .5))}.sobree-editor .sobree-comment-ref{display:inline;font-size:.85em;margin:0 .1em}.sobree-editor .sobree-comment-ref a{color:inherit;text-decoration:none}.sobree-editor .sobree-comment-ref a:hover{filter:brightness(.7)}.sobree-editor h1,.sobree-editor h2,.sobree-editor h3,.sobree-editor h4,.sobree-editor h5,.sobree-editor h6{font-size:inherit;font-weight:inherit}.sobree-editor table{border-collapse:collapse;width:100%;position:relative}.sobree-editor th,.sobree-editor td{border:none;padding:0 .08in;vertical-align:top;transition:border-color .12s ease}.sobree-editor .sobree-section-break{display:flex;align-items:center;gap:8px;margin:8px 0;color:var(--fg-subtle, #7c7764);font-size:11px;letter-spacing:.04em;text-transform:uppercase;-webkit-user-select:none;user-select:none}.sobree-editor .sobree-section-break--continuous{visibility:hidden;height:0;margin:0;padding:0;border:none;overflow:hidden;font-size:0;line-height:0}.sobree-editor .sobree-section-break:before,.sobree-editor .sobree-section-break:after{content:"";flex:1;border-top:1px dashed var(--border, #dedbd0)}.sobree-editor .sobree-section-break__label{flex:none;padding:0 6px;background:var(--bg-elevated, #fff)}.sobree-editor .sobree-textbox-frame p{line-height:1.2}.sobree-editor .paper-content p,.sobree-editor .paper-content li,.sobree-editor .paper-header p,.sobree-editor .paper-header li,.sobree-editor .paper-footer p,.sobree-editor .paper-footer li,.sobree-editor .sobree-textbox-frame p{white-space:pre-wrap}.sobree-editor .sobree-section-trailer-empty{height:0;line-height:0;font-size:0;margin:0;padding:0;overflow:hidden}.sobree-editor .sobree-textbox-frame--placeholder{border:1px solid var(--border, #c8c4b8)}.sobree-editor .sobree-textbox-frame--placeholder.sobree-textbox-frame--filled{border:none;z-index:-1}.sobree-editor img.is-selected{outline:2px solid var(--sobree-primary, #d4521f);outline-offset:2px}.sobree-image-resize-handle{position:absolute;width:16px;height:16px;background:var(--sobree-primary, #d4521f);border:2px solid #fff;border-radius:3px;cursor:nwse-resize;z-index:1000;-webkit-user-select:none;user-select:none}.paper-stack{display:flex;flex-direction:column;padding:48px;gap:28px;outline:none}.paper-row{display:flex;flex-direction:row;align-items:flex-start;gap:24px}.paper{position:relative;background:#fff;border:1px solid rgba(0,0,0,.3);box-shadow:0 1px 2px #00000014,0 18px 60px #0000001f;padding-top:var(--margin-top, 25mm);padding-right:var(--margin-right, 20mm);padding-bottom:var(--margin-bottom, 25mm);padding-left:var(--margin-left, 20mm);overflow:hidden;flex:none}.paper-header,.paper-footer{position:absolute;left:var(--margin-left, 20mm);right:var(--margin-right, 20mm);font-size:10pt;color:#555;white-space:pre-wrap}.paper-header{top:0;min-height:var(--margin-top, 25mm);padding-top:var(--header-offset-mm, 12.7mm);padding-bottom:4mm;border-bottom:1px dashed transparent}.paper-footer{bottom:0;min-height:var(--margin-bottom, 25mm);padding-top:4mm;text-align:center;border-top:1px dashed transparent}.paper-anchors{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;isolation:isolate;z-index:1}.paper-anchors.is-empty{display:none}.paper-anchors-behind{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;isolation:isolate;z-index:0}.paper-anchors-behind.is-empty{display:none}.paper-zone-anchors{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;isolation:isolate;z-index:2}.paper-zone-anchors.is-empty{display:none}.paper-anchor{position:absolute;box-sizing:border-box;overflow:hidden}.paper-header>p,.paper-footer>p,.paper-header>ul,.paper-header>ol,.paper-footer>ul,.paper-footer>ol{margin:0}.paper-footnotes{position:absolute;left:var(--margin-left, 20mm);right:var(--margin-right, 20mm);bottom:var(--margin-bottom, 25mm);font-size:.85em;padding-top:.5em;border-top:1pt solid currentColor;background:#fffffff5;z-index:1;max-height:40%;overflow:hidden}.paper-footnotes.is-empty{display:none}.paper-comments{flex:0 0 70mm;max-width:70mm;font-size:.85em;padding:0 .5em;align-self:stretch;overflow-y:auto}.paper-comments.is-empty{display:none}.paper-footnotes .sobree-footnotes__list{margin:0;padding-left:1.5em}.paper-footnotes .sobree-footnotes__item{margin:.25em 0}.paper-content a{color:inherit;text-decoration:none}.paper-content{position:relative;height:100%;min-height:100px;display:flow-root}.paper-content td p:not([style*=line-height]),.paper-content td li:not([style*=line-height]),.paper-content th p:not([style*=line-height]),.paper-content th li:not([style*=line-height]){line-height:1}.paper-content td p:not([style*=margin]),.paper-content th p:not([style*=margin]){margin:0}.paper-content .sobree-hang>li{list-style:none}.paper-content .sobree-hang>li:before{display:inline-block;box-sizing:border-box;width:var(--sobree-list-hang, 0);margin-left:calc(-1 * var(--sobree-list-hang, 0));white-space:nowrap;color:var(--sobree-marker-color, currentColor);font-family:var(--sobree-marker-font, inherit);font-size:var(--sobree-marker-size, inherit)}.paper-content .sobree-hang.lst-bullet>li:before{content:var(--sobree-bullet, "•")}.paper-content .sobree-hang.lst-decimal>li:before{content:var(--mk-pre, "") counter(list-item,decimal) var(--mk-suf, ".")}.paper-content .sobree-hang.lst-decimal-zero>li:before{content:var(--mk-pre, "") counter(list-item,decimal-leading-zero) var(--mk-suf, ".")}.paper-content .sobree-hang.lst-lower-latin>li:before{content:var(--mk-pre, "") counter(list-item,lower-latin) var(--mk-suf, ".")}.paper-content .sobree-hang.lst-upper-latin>li:before{content:var(--mk-pre, "") counter(list-item,upper-latin) var(--mk-suf, ".")}.paper-content .sobree-hang.lst-lower-roman>li:before{content:var(--mk-pre, "") counter(list-item,lower-roman) var(--mk-suf, ".")}.paper-content .sobree-hang.lst-upper-roman>li:before{content:var(--mk-pre, "") counter(list-item,upper-roman) var(--mk-suf, ".")}.paper-content .sobree-tab-spread{display:flex;justify-content:space-between;align-items:baseline;gap:1em;white-space:nowrap}.paper-content .sobree-tab-spread .sobree-tab-spread__before,.paper-content .sobree-tab-spread .sobree-tab-spread__after{white-space:pre-wrap;min-width:0}.paper-content table.sobree-table-bordered td,.paper-content table.sobree-table-bordered th{padding:0 4px}.paper-content .sobree-cols-unequal{display:flex;align-items:flex-start}.paper-content .sobree-cols-unequal .sobree-col{flex:0 0 auto}.paper-stack .paper-content,.paper-stack .paper-header,.paper-stack .paper-footer{transition:opacity .2s ease}.paper-stack.is-zone-editing .paper-content,.paper-stack.is-zone-editing .paper-header,.paper-stack.is-zone-editing .paper-footer{opacity:.2}.paper-stack.is-zone-editing .paper-header[contenteditable=true],.paper-stack.is-zone-editing .paper-footer[contenteditable=true]{opacity:1}.paper-header[contenteditable=true],.paper-footer[contenteditable=true]{outline:2px dotted var(--primary, #c96f22);outline-offset:4px;background:var(--primary-soft, #fdf6ee);color:var(--fg-strong, #14130f);border-radius:2px}
|
|
1
|
+
.sobree-viewport{position:relative;overflow:hidden;overscroll-behavior:contain;touch-action:none;background:#ececee}.sobree-viewport__stage{position:absolute;top:0;left:0;transform-origin:0 0}.sobree-viewport__stage.is-gesturing,.sobree-viewport__stage.is-animating{will-change:transform}.sobree-viewport__stage.is-animating{transition:transform .32s cubic-bezier(.2,.7,.2,1)}.sobree-viewport__slot{display:block}.sobree-editor{position:relative;outline:none}.sobree-editor>:first-child{margin-top:0}.sobree-editor p,.sobree-editor h1,.sobree-editor h2,.sobree-editor h3,.sobree-editor h4,.sobree-editor h5,.sobree-editor h6,.sobree-editor ul,.sobree-editor ol,.sobree-editor li,.sobree-editor blockquote,.sobree-editor pre{margin:0;padding:0}.sobree-editor ul,.sobree-editor ol{padding-left:1.5em}.sobree-editor li.sobree-li-continuation{list-style-type:none}.sobree-editor li.sobree-li-continuation::marker{content:""}.sobree-editor .sobree-fragment-continued{text-align-last:justify}.sobree-editor .sobree-footnote-ref a{color:inherit;text-decoration:none}.sobree-editor .sobree-footnote-ref a:hover{text-decoration:underline}.sobree-editor .sobree-footnotes{margin-top:2em;padding-top:.5em;border-top:1pt solid currentColor;font-size:.85em}.sobree-editor .sobree-footnotes__list{padding-left:1.5em}.sobree-editor .sobree-footnotes__item{margin:.25em 0}.sobree-editor ins.sobree-revision-ins{text-decoration:underline}.sobree-editor del.sobree-revision-del{text-decoration:line-through}.sobree-editor .sobree-revision-format{text-decoration:underline dashed var(--sobree-format-revision-color, currentColor);text-underline-offset:3px}.sobree-editor [data-block-revision=ins]:after,.sobree-editor [data-block-revision=del]:after{content:" ¶";color:var(--sobree-block-revision-color, currentColor);opacity:.65;font-weight:600;-webkit-user-select:none;user-select:none}.sobree-editor [data-block-revision=del]:after{text-decoration:line-through}.sobree-editor .sobree-comment-range{background:var(--sobree-comment-range-bg, rgba(255, 217, 0, .25));border-bottom:1px dotted var(--sobree-comment-range-border, rgba(180, 130, 0, .5))}.sobree-editor .sobree-comment-ref{display:inline;font-size:.85em;margin:0 .1em}.sobree-editor .sobree-comment-ref a{color:inherit;text-decoration:none}.sobree-editor .sobree-comment-ref a:hover{filter:brightness(.7)}.sobree-editor h1,.sobree-editor h2,.sobree-editor h3,.sobree-editor h4,.sobree-editor h5,.sobree-editor h6{font-size:inherit;font-weight:inherit}.sobree-editor table{border-collapse:collapse;width:100%;position:relative}.sobree-editor th,.sobree-editor td{border:none;padding:0 .08in;vertical-align:top;transition:border-color .12s ease}.sobree-editor .sobree-section-break{display:flex;align-items:center;gap:8px;margin:8px 0;color:var(--fg-subtle, #7c7764);font-size:11px;letter-spacing:.04em;text-transform:uppercase;-webkit-user-select:none;user-select:none}.sobree-editor .sobree-section-break--continuous{visibility:hidden;height:0;margin:0;padding:0;border:none;overflow:hidden;font-size:0;line-height:0}.sobree-editor .sobree-section-break:before,.sobree-editor .sobree-section-break:after{content:"";flex:1;border-top:1px dashed var(--border, #dedbd0)}.sobree-editor .sobree-section-break__label{flex:none;padding:0 6px;background:var(--bg-elevated, #fff)}.sobree-editor .sobree-textbox-frame p{line-height:1.2}.sobree-editor .paper-content p,.sobree-editor .paper-content li,.sobree-editor .paper-header p,.sobree-editor .paper-header li,.sobree-editor .paper-footer p,.sobree-editor .paper-footer li,.sobree-editor .sobree-textbox-frame p{white-space:pre-wrap}.sobree-editor .sobree-section-trailer-empty{height:0;line-height:0;font-size:0;margin:0;padding:0;overflow:hidden}.sobree-editor .sobree-textbox-frame--placeholder{border:1px solid var(--border, #c8c4b8)}.sobree-editor .sobree-textbox-frame--placeholder.sobree-textbox-frame--filled{border:none;z-index:-1}.sobree-editor img.is-selected{outline:2px solid var(--sobree-primary, #d4521f);outline-offset:2px}.sobree-image-resize-handle{position:absolute;width:16px;height:16px;background:var(--sobree-primary, #d4521f);border:2px solid #fff;border-radius:3px;cursor:nwse-resize;z-index:1000;-webkit-user-select:none;user-select:none}.paper-stack{display:flex;flex-direction:column;padding:48px;gap:28px;outline:none}.paper-row{display:flex;flex-direction:row;align-items:flex-start;gap:24px}.paper{position:relative;background:#fff;border:1px solid rgba(0,0,0,.3);box-shadow:0 1px 2px #00000014,0 18px 60px #0000001f;padding-top:var(--margin-top, 25mm);padding-right:var(--margin-right, 20mm);padding-bottom:var(--margin-bottom, 25mm);padding-left:var(--margin-left, 20mm);overflow:hidden;flex:none}.paper-header,.paper-footer{position:absolute;left:var(--margin-left, 20mm);right:var(--margin-right, 20mm);font-size:10pt;color:#555;white-space:pre-wrap}.paper-header{top:0;min-height:var(--margin-top, 25mm);padding-top:var(--header-offset-mm, 12.7mm);padding-bottom:4mm;border-bottom:1px dashed transparent}.paper-footer{bottom:0;min-height:var(--margin-bottom, 25mm);padding-top:4mm;text-align:center;border-top:1px dashed transparent}.paper-anchors{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;isolation:isolate;z-index:1}.paper-anchors.is-empty{display:none}.paper-anchors-behind{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;isolation:isolate;z-index:0}.paper-anchors-behind.is-empty{display:none}.paper-zone-anchors{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;isolation:isolate;z-index:2}.paper-zone-anchors.is-empty{display:none}.paper-anchor{position:absolute;box-sizing:border-box;overflow:hidden}.paper-header>p,.paper-footer>p,.paper-header>ul,.paper-header>ol,.paper-footer>ul,.paper-footer>ol{margin:0}.paper-footnotes{position:absolute;left:var(--margin-left, 20mm);right:var(--margin-right, 20mm);bottom:var(--margin-bottom, 25mm);font-size:.85em;padding-top:.5em;border-top:1pt solid currentColor;background:#fffffff5;z-index:1;max-height:40%;overflow:hidden}.paper-footnotes.is-empty{display:none}.paper-comments{flex:0 0 70mm;max-width:70mm;font-size:.85em;padding:0 .5em;align-self:stretch;overflow-y:auto}.paper-comments.is-empty{display:none}.paper-footnotes .sobree-footnotes__list{margin:0;padding-left:1.5em}.paper-footnotes .sobree-footnotes__item{margin:.25em 0}.paper-content a{color:inherit;text-decoration:none}.paper-content{position:relative;height:100%;min-height:100px;display:flow-root}.paper-content td p:not([style*=line-height]),.paper-content td li:not([style*=line-height]),.paper-content th p:not([style*=line-height]),.paper-content th li:not([style*=line-height]){line-height:1}.paper-content td p:not([style*=margin]),.paper-content th p:not([style*=margin]){margin:0}.paper-content .sobree-hang>li{list-style:none}.paper-content .sobree-hang>li:before{display:inline-block;box-sizing:border-box;width:var(--sobree-list-hang, 0);margin-left:calc(-1 * var(--sobree-list-hang, 0));white-space:nowrap;color:var(--sobree-marker-color, currentColor);font-family:var(--sobree-marker-font, inherit);font-size:var(--sobree-marker-size, inherit)}.paper-content .sobree-hang.lst-bullet>li:before{content:var(--sobree-bullet, "•")}.paper-content .sobree-hang.lst-decimal>li:before{content:var(--mk-pre, "") counter(list-item,decimal) var(--mk-suf, ".")}.paper-content .sobree-hang.lst-decimal-zero>li:before{content:var(--mk-pre, "") counter(list-item,decimal-leading-zero) var(--mk-suf, ".")}.paper-content .sobree-hang.lst-lower-latin>li:before{content:var(--mk-pre, "") counter(list-item,lower-latin) var(--mk-suf, ".")}.paper-content .sobree-hang.lst-upper-latin>li:before{content:var(--mk-pre, "") counter(list-item,upper-latin) var(--mk-suf, ".")}.paper-content .sobree-hang.lst-lower-roman>li:before{content:var(--mk-pre, "") counter(list-item,lower-roman) var(--mk-suf, ".")}.paper-content .sobree-hang.lst-upper-roman>li:before{content:var(--mk-pre, "") counter(list-item,upper-roman) var(--mk-suf, ".")}.paper-content .sobree-tab-spread{display:flex;justify-content:space-between;align-items:baseline;gap:1em;white-space:nowrap}.paper-content .sobree-tab-spread .sobree-tab-spread__before,.paper-content .sobree-tab-spread .sobree-tab-spread__after{white-space:pre-wrap;min-width:0}.sobree-hidden{display:none}.sobree-show-hidden .sobree-hidden{display:inline;color:#9ca3af;text-decoration:underline dotted}.paper-content table.sobree-table-bordered td,.paper-content table.sobree-table-bordered th{padding:0 4px}.paper-content .sobree-cols-unequal{display:flex;align-items:flex-start}.paper-content .sobree-cols-unequal .sobree-col{flex:0 0 auto}.paper-stack .paper-content,.paper-stack .paper-header,.paper-stack .paper-footer{transition:opacity .2s ease}.paper-stack.is-zone-editing .paper-content,.paper-stack.is-zone-editing .paper-header,.paper-stack.is-zone-editing .paper-footer{opacity:.2}.paper-stack.is-zone-editing .paper-header[contenteditable=true],.paper-stack.is-zone-editing .paper-footer[contenteditable=true]{opacity:1}.paper-header[contenteditable=true],.paper-footer[contenteditable=true]{outline:2px dotted var(--primary, #c96f22);outline-offset:4px;background:var(--primary-soft, #fdf6ee);color:var(--fg-strong, #14130f);border-radius:2px}
|