superdoc 2.24.0-next.1 → 2.24.0-next.11

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 (68) hide show
  1. package/dist/chunks/{create-super-doc-ui-DFNXiKvQ.es.js → create-super-doc-ui-8UTu16Lw.es.js} +229 -82
  2. package/dist/chunks/{create-super-doc-ui-D_FbXpOQ.cjs → create-super-doc-ui-bTFGKVRb.cjs} +229 -82
  3. package/dist/collaboration-upgrade-engine.cjs +1 -1
  4. package/dist/collaboration-upgrade-engine.es.js +1 -1
  5. package/dist/document-api/src/authorities/authorities.types.d.ts +2 -0
  6. package/dist/document-api/src/bookmarks/bookmarks.types.d.ts +1 -0
  7. package/dist/document-api/src/capabilities/html-markdown-support.d.ts +2 -4
  8. package/dist/document-api/src/captions/captions.types.d.ts +1 -0
  9. package/dist/document-api/src/citations/citations.types.d.ts +2 -0
  10. package/dist/document-api/src/content-controls/content-controls.types.d.ts +1 -0
  11. package/dist/document-api/src/contract/command-catalog.d.ts +1 -1
  12. package/dist/document-api/src/contract/operation-definitions.d.ts +34 -6
  13. package/dist/document-api/src/cross-refs/cross-refs.types.d.ts +1 -0
  14. package/dist/document-api/src/fields/fields.types.d.ts +1 -0
  15. package/dist/document-api/src/footnotes/footnotes.types.d.ts +2 -0
  16. package/dist/document-api/src/get/get.d.ts +2 -1
  17. package/dist/document-api/src/hyperlinks/hyperlinks.types.d.ts +1 -0
  18. package/dist/document-api/src/images/images.types.d.ts +2 -0
  19. package/dist/document-api/src/index/index.types.d.ts +2 -0
  20. package/dist/document-api/src/index.d.ts +15 -12
  21. package/dist/document-api/src/inline-semantics/token-sets.d.ts +11 -0
  22. package/dist/document-api/src/insert/insert.d.ts +7 -1
  23. package/dist/document-api/src/lists/lists.types.d.ts +10 -0
  24. package/dist/document-api/src/paragraphs/paragraphs.types.d.ts +3 -0
  25. package/dist/document-api/src/receipt-bridge.d.ts +1 -0
  26. package/dist/document-api/src/replace/replace.d.ts +31 -4
  27. package/dist/document-api/src/sections/sections.types.d.ts +4 -1
  28. package/dist/document-api/src/selection/selection.d.ts +9 -2
  29. package/dist/document-api/src/selection/selection.types.d.ts +57 -8
  30. package/dist/document-api/src/styles/apply.d.ts +5 -0
  31. package/dist/document-api/src/styles/catalog.d.ts +40 -19
  32. package/dist/document-api/src/styles/create.d.ts +160 -0
  33. package/dist/document-api/src/styles/index.d.ts +8 -4
  34. package/dist/document-api/src/styles/registry.d.ts +34 -2
  35. package/dist/document-api/src/styles/schema.d.ts +24 -5
  36. package/dist/document-api/src/styles/theme.d.ts +32 -0
  37. package/dist/document-api/src/styles/validation.d.ts +11 -2
  38. package/dist/document-api/src/templates/apply.d.ts +13 -15
  39. package/dist/document-api/src/toc/toc.types.d.ts +3 -0
  40. package/dist/document-api/src/types/blocks.types.d.ts +6 -1
  41. package/dist/document-api/src/types/create.types.d.ts +3 -1
  42. package/dist/document-api/src/types/fragment.d.ts +3 -0
  43. package/dist/document-api/src/types/mutation-plan.types.d.ts +4 -0
  44. package/dist/document-api/src/types/query-match.types.d.ts +43 -5
  45. package/dist/document-api/src/types/receipt.d.ts +8 -0
  46. package/dist/document-api/src/types/sd-contract.d.ts +2 -0
  47. package/dist/document-api/src/types/sd-props.d.ts +54 -14
  48. package/dist/document-api/src/types/sd-styles.d.ts +58 -3
  49. package/dist/document-api/src/types/table-operations.types.d.ts +2 -0
  50. package/dist/document-api/src/write/write.d.ts +4 -2
  51. package/dist/public/ui-react.cjs +1 -1
  52. package/dist/public/ui-react.es.js +1 -1
  53. package/dist/public/ui-vue.cjs +1 -1
  54. package/dist/public/ui-vue.es.js +1 -1
  55. package/dist/public/ui.cjs +1 -1
  56. package/dist/public/ui.es.js +1 -1
  57. package/dist/style.css +87 -87
  58. package/dist/style.layered.css +87 -87
  59. package/dist/superdoc/src/core/editor-runtime/v2/v2-session-shortcut-routes.d.ts +2 -0
  60. package/dist/superdoc/src/public/ui/types.d.ts +22 -0
  61. package/dist/superdoc/src/public/ui.d.cts +4 -0
  62. package/dist/superdoc/src/public/ui.d.ts +1 -1
  63. package/dist/superdoc.cjs +110 -49
  64. package/dist/superdoc.es.js +110 -49
  65. package/dist-cdn/style.layered.css +1 -1
  66. package/dist-cdn/superdoc.min.css +1 -1
  67. package/dist-cdn/superdoc.min.js +42 -42
  68. package/package.json +2 -2
@@ -1,6 +1,7 @@
1
1
  import { ReceiptFailure } from '../types/receipt.js';
2
2
  import { StylesChannel } from './registry.js';
3
3
  import { StylesGetCatalogInput, StylesGetCatalogResult } from './catalog.js';
4
+ import { StylesGetThemeInput, StylesGetThemeResult } from './theme.js';
4
5
  /** Tri-state for OOXML boolean style properties. */
5
6
  export type StylesBooleanState = 'on' | 'off' | 'inherit';
6
7
  export type StylesNumberState = number | 'inherit';
@@ -123,6 +124,8 @@ export interface StylesAdapter {
123
124
  apply(input: StylesApplyInput, options: NormalizedStylesApplyOptions): StylesApplyReceipt;
124
125
  /** Read the normalized style catalogue. See `styles/catalog.ts`. */
125
126
  getCatalog?(input?: StylesGetCatalogInput): StylesGetCatalogResult;
127
+ /** Read the document theme. See `styles/theme.ts`. */
128
+ getTheme?(input?: StylesGetThemeInput): StylesGetThemeResult;
126
129
  }
127
130
  export interface NormalizedStylesApplyOptions {
128
131
  dryRun: boolean;
@@ -134,6 +137,8 @@ export interface StylesApi {
134
137
  apply(input: StylesApplyInput, options?: StylesApplyOptions): StylesApplyReceipt;
135
138
  /** Read the normalized style catalogue for discovery and quick-gallery UI. */
136
139
  getCatalog(input?: StylesGetCatalogInput): StylesGetCatalogResult;
140
+ /** Read the document theme: colors, fonts and color mapping. */
141
+ getTheme(input?: StylesGetThemeInput): StylesGetThemeResult;
137
142
  }
138
143
  /**
139
144
  * Executes `styles.apply` using the provided adapter.
@@ -1,22 +1,4 @@
1
- /**
2
- * `styles.getCatalog`: read-only style catalogue projection.
3
- *
4
- * The catalogue is the stable, normalized, editor-neutral view of the styles
5
- * available in a document. It is the SDK / CLI / MCP / custom-UI integration
6
- * point for style discovery, and the source the built-in toolbar and the
7
- * future Styles pane consume.
8
- *
9
- * This module owns only the public contract types, input validation, and the
10
- * execution entry point. The runtime projection is produced by the v2 adapter
11
- * (which compiles a Word style model from package parts and calls the shared
12
- * style-model projector); the raw style-engine shapes never reach this public
13
- * surface.
14
- *
15
- * `DocumentInfo.styles` is a usage summary and intentionally stays separate
16
- * from this available-style catalogue.
17
- *
18
- * Engine-agnostic: no ProseMirror, Yjs, or converter imports.
19
- */
1
+ import { SDThemeColorName, SDThemeFontRef } from '../types/sd-props.js';
20
2
  /** Catalogue view selector. `inUse` lists styles referenced by document content. */
21
3
  export type StyleCatalogView = 'quickGallery' | 'recommended' | 'currentDocument' | 'all' | 'inUse';
22
4
  /** Normalized style kind. `linked` is a deduplicated paragraph/character pair. */
@@ -60,10 +42,47 @@ export interface StyleCatalogItemUsage {
60
42
  tableCount?: number;
61
43
  numberingCount?: number;
62
44
  }
45
+ /**
46
+ * Where a preview font came from. `theme` names the theme font slot it was
47
+ * resolved from; `fallback: true` means the document has no usable theme and
48
+ * the value is the default Office theme's.
49
+ */
50
+ export type StyleCatalogPreviewFontSource = {
51
+ origin: 'literal';
52
+ } | {
53
+ origin: 'theme';
54
+ themeFont: SDThemeFontRef;
55
+ fallback?: true;
56
+ };
57
+ /**
58
+ * Where a preview color came from. `theme` names the theme color and the
59
+ * tint/shade bytes (0-255) applied to it, as in `SDColorRef`.
60
+ */
61
+ export type StyleCatalogPreviewColorSource = {
62
+ origin: 'literal';
63
+ } | {
64
+ origin: 'theme';
65
+ themeColor: SDThemeColorName;
66
+ tint?: number;
67
+ shade?: number;
68
+ fallback?: true;
69
+ }
70
+ /** The document sets no color (Word's automatic color); the value is the black text renders with. */
71
+ | {
72
+ origin: 'default';
73
+ };
74
+ /** Origin of the theme-capable preview tokens. A token without a source is absent from `css`. */
75
+ export interface StyleCatalogPreviewSources {
76
+ fontFamily?: StyleCatalogPreviewFontSource;
77
+ color?: StyleCatalogPreviewColorSource;
78
+ }
63
79
  /** Optional resolved preview tokens. Present when `includePreview` is requested. */
64
80
  export interface StyleCatalogItemPreview {
65
81
  available: boolean;
82
+ /** UI-safe CSS tokens. Theme fonts and colors are already resolved. */
66
83
  css?: Record<string, string | number>;
84
+ /** Whether `css.fontFamily` and `css.color` came from the theme or were set directly. */
85
+ sources?: StyleCatalogPreviewSources;
67
86
  unsupportedReason?: string;
68
87
  }
69
88
  /** One normalized style. Linked paragraph/character pairs are deduplicated. */
@@ -108,6 +127,8 @@ export interface StyleCatalogDiagnostic {
108
127
  export interface StyleCatalogSourceStatus {
109
128
  styles: StyleSourcePartStatus;
110
129
  settings: StyleSourcePartStatus;
130
+ /** The theme part that theme-backed preview fonts and colors resolve against. */
131
+ theme?: StyleSourcePartStatus;
111
132
  usage: StyleCatalogUsageStatus;
112
133
  preview: StyleCatalogPreviewStatus;
113
134
  view: StyleCatalogViewStatus;
@@ -0,0 +1,160 @@
1
+ import { ReceiptFailure } from '../types/receipt.js';
2
+ import { SDHighlightColor } from '../types/sd-props.js';
3
+ import { StylesParagraphPatch, StylesRunPatch, StylesStateMap } from './apply.js';
4
+ /**
5
+ * Run properties of a named style.
6
+ *
7
+ * A superset of {@link StylesRunPatch}: the four properties Word forbids in
8
+ * `w:docDefaults` and allows on a `w:style` are reachable here and nowhere
9
+ * else. `rtl` in particular is the property that makes a run right-to-left, so
10
+ * without it no right-to-left style could be authored through this API.
11
+ */
12
+ export interface StyleRunPatch extends StylesRunPatch {
13
+ /** `w:cs` — treat the run as complex-script. */
14
+ cs?: boolean;
15
+ /** `w:rtl` — right-to-left run. */
16
+ rtl?: boolean;
17
+ /** `w:oMath` — the run is part of an equation. */
18
+ oMath?: boolean;
19
+ /** `w:highlight` — one of the closed `ST_HighlightColor` tokens. */
20
+ highlight?: SDHighlightColor;
21
+ }
22
+ /** What to do when a style with this `id`, or this `name`, already exists. */
23
+ export type StyleConflictPolicy = 'fail' | 'replace';
24
+ interface StylesCreateCommon {
25
+ /** `w:styleId`. Named `id` to match {@link StyleCatalogItem.id} on read. */
26
+ id: string;
27
+ /** `w:name`. */
28
+ name: string;
29
+ /** `w:basedOn`. `null` states "based on nothing" explicitly. */
30
+ basedOn?: string | null;
31
+ /** `w:aliases`, one entry per alias. */
32
+ aliases?: string[];
33
+ /** `w:uiPriority`. Named `priority` to match the catalogue on read. */
34
+ priority?: number | null;
35
+ /** `w:qFormat` — offer the style in Word's quick gallery. */
36
+ qFormat?: boolean;
37
+ /** `w:hidden`. */
38
+ hidden?: boolean;
39
+ /** `w:semiHidden`. */
40
+ semiHidden?: boolean;
41
+ /** `w:unhideWhenUsed`. */
42
+ unhideWhenUsed?: boolean;
43
+ /** `w:locked`. */
44
+ locked?: boolean;
45
+ /**
46
+ * `w:customStyle`. Defaults to `true`, which is what a style authored
47
+ * through this API is. Setting it `false` on a style whose name is not a
48
+ * built-in makes Word treat the name as one and re-label or hide the style.
49
+ */
50
+ custom?: boolean;
51
+ /** Defaults to `'fail'`. */
52
+ conflictPolicy?: StyleConflictPolicy;
53
+ }
54
+ export interface StylesCreateParagraphInput extends StylesCreateCommon {
55
+ type: 'paragraph';
56
+ /** `w:next`. May name the style being created. */
57
+ next?: string | null;
58
+ /** `w:style/w:pPr`. */
59
+ paragraph?: StylesParagraphPatch;
60
+ /** `w:style/w:rPr`. */
61
+ run?: StyleRunPatch;
62
+ }
63
+ export interface StylesCreateCharacterInput extends StylesCreateCommon {
64
+ type: 'character';
65
+ /** A character style has no following-paragraph style. */
66
+ next?: never;
67
+ /** A character style has no paragraph properties. */
68
+ paragraph?: never;
69
+ /** `w:style/w:rPr`. */
70
+ run?: StyleRunPatch;
71
+ }
72
+ export type StylesCreateInput = StylesCreateParagraphInput | StylesCreateCharacterInput;
73
+ export interface StylesCreateOptions {
74
+ dryRun?: boolean;
75
+ expectedRevision?: string;
76
+ }
77
+ export interface NormalizedStylesCreateOptions {
78
+ dryRun: boolean;
79
+ expectedRevision: string | undefined;
80
+ }
81
+ export interface StylesCreateResolution {
82
+ scope: 'style';
83
+ id: string;
84
+ type: 'paragraph' | 'character';
85
+ xmlPart: string;
86
+ /**
87
+ * Literal, not `string`: `styles.apply` pins its two paths in the published
88
+ * schema and exports them as constants for the adapter to bind to. Without
89
+ * the narrowing an adapter could report the more specific
90
+ * `w:styles/w:style[@w:styleId='X']`, type-check, and then fail the schema.
91
+ */
92
+ xmlPath: typeof STYLE_XML_PATH;
93
+ }
94
+ /** The `w:style` element path. Predicate-free, like `XML_PATH_BY_CHANNEL`. */
95
+ export declare const STYLE_XML_PATH = "w:styles/w:style";
96
+ /**
97
+ * Per-channel state, unlike {@link StylesApplyReceipt}'s flat map.
98
+ *
99
+ * `styles.apply` can be flat because `resolution.channel` says which channel
100
+ * the map describes. One `w:style` carries both at once, and `snapToGrid`,
101
+ * `shading` and `borders` exist on both — `borders` with genuinely different
102
+ * shapes (`w:bdr`, one border, against `w:pBdr`, six edges). Folded together
103
+ * they would be indistinguishable.
104
+ */
105
+ export interface StyleChannelState {
106
+ paragraph: StylesStateMap | null;
107
+ run: StylesStateMap | null;
108
+ }
109
+ export interface StylesCreateReceiptSuccess {
110
+ success: true;
111
+ /** `false` when the definition already matched the input. */
112
+ changed: boolean;
113
+ /**
114
+ * `false` when an existing style was redefined under `conflictPolicy:
115
+ * 'replace'`. `created: true` implies `changed: true`. Under `dryRun` it
116
+ * describes what the call would have done.
117
+ *
118
+ * `ReceiptSuccess.inserted` / `updated` are deliberately not used: they take
119
+ * `EntityAddress`, and a style definition is not addressable as a document
120
+ * entity.
121
+ */
122
+ created: boolean;
123
+ resolution: StylesCreateResolution;
124
+ dryRun: boolean;
125
+ /** `null` when the style did not exist. */
126
+ before: StyleChannelState | null;
127
+ after: StyleChannelState;
128
+ }
129
+ export interface StylesCreateReceiptFailure {
130
+ success: false;
131
+ failure: ReceiptFailure;
132
+ }
133
+ export type StylesCreateReceipt = StylesCreateReceiptSuccess | StylesCreateReceiptFailure;
134
+ export interface StylesCreateAdapter {
135
+ create(input: StylesCreateInput, options: NormalizedStylesCreateOptions): StylesCreateReceipt;
136
+ }
137
+ export interface StylesCreateApi {
138
+ create(input: StylesCreateInput, options?: StylesCreateOptions): StylesCreateReceipt;
139
+ }
140
+ /**
141
+ * Validates the shape of `styles.create` input.
142
+ *
143
+ * Deliberately shallow on identifiers: `id` is checked for "non-empty string"
144
+ * and nothing more, exactly as `styles.paragraph.setStyleRef` checks the same
145
+ * field. `w:styleId` is an `ST_String`, real documents carry ids with spaces,
146
+ * and a stricter rule here would mean `setStyleRef` could apply a style that
147
+ * `styles.create` cannot express.
148
+ */
149
+ export declare function validateStylesCreateInput(input: unknown): asserts input is StylesCreateInput;
150
+ export declare function validateStylesCreateOptions(options: unknown): void;
151
+ /**
152
+ * Executes `styles.create` using the provided adapter.
153
+ *
154
+ * Fails closed when the host engine has no `create` hook, the same way
155
+ * `executeStylesGetCatalog` does for its optional catalogue hook — input is
156
+ * validated first, so a malformed call is reported as malformed rather than as
157
+ * an unavailable capability.
158
+ */
159
+ export declare function executeStylesCreate(adapter: Partial<StylesCreateAdapter> | null | undefined, input: StylesCreateInput, options?: StylesCreateOptions): StylesCreateReceipt;
160
+ export {};
@@ -3,12 +3,16 @@
3
3
  *
4
4
  * Public surface only: internal validation/schema helpers are not exposed.
5
5
  */
6
- export type { ValueSchema, StylesChannel, MergeStrategy, PropertyDefinition } from './registry.js';
7
- export { PROPERTY_REGISTRY, ALLOWED_KEYS_BY_CHANNEL, EXCLUDED_KEYS, XML_PATH_BY_CHANNEL, getPropertyDefinition, ST_VERTICAL_ALIGN_RUN, ST_EM, ST_TEXT_ALIGNMENT, ST_TEXT_DIRECTION, ST_TEXTBOX_TIGHT_WRAP, ST_TEXT_TRANSFORM, ST_JUSTIFICATION, } from './registry.js';
6
+ export type { ValueSchema, StylesChannel, StylesScope, MergeStrategy, PropertyDefinition } from './registry.js';
7
+ export { PROPERTY_REGISTRY, ALLOWED_KEYS_BY_CHANNEL, EXCLUDED_KEYS, STYLE_EXCLUDED_KEYS, EXCLUDED_KEYS_BY_SCOPE, SCOPE_LABEL, XML_PATH_BY_CHANNEL, getPropertyDefinition, ST_VERTICAL_ALIGN_RUN, ST_EM, ST_TEXT_ALIGNMENT, ST_TEXT_DIRECTION, ST_TEXTBOX_TIGHT_WRAP, ST_TEXT_TRANSFORM, ST_JUSTIFICATION, } from './registry.js';
8
8
  export { toJsonSchema, buildPatchSchema, buildStateSchema } from './schema.js';
9
9
  export type { StylesBooleanState, StylesNumberState, StylesEnumState, StylesObjectState, StylesArrayState, StylesRunPatch, StylesParagraphPatch, StylesTargetResolution, StylesApplyRunInput, StylesApplyParagraphInput, StylesApplyInput, StylesApplyOptions, StylesStateMap, StylesApplyReceiptSuccess, StylesApplyReceiptFailure, StylesApplyReceipt, StylesAdapter, NormalizedStylesApplyOptions, StylesApi, } from './apply.js';
10
10
  export { executeStylesApply } from './apply.js';
11
- export type { StyleCatalogView, StyleCatalogItemType, StyleCatalogFilterType, StyleProvenance, StyleCatalogDiagnosticSeverity, StyleSourcePartStatus, StyleCatalogUsageStatus, StyleCatalogPreviewStatus, StyleCatalogViewStatus, StyleCatalogItemVisibility, StyleCatalogItemUsage, StyleCatalogItemPreview, StyleCatalogItem, StyleCatalogDefaults, StyleCatalogDiagnostic, StyleCatalogSourceStatus, StylesGetCatalogInput, StylesGetCatalogResult, StylesGetCatalogAdapter, } from './catalog.js';
11
+ export type { StyleRunPatch, StyleConflictPolicy, StyleChannelState, StylesCreateParagraphInput, StylesCreateCharacterInput, StylesCreateInput, StylesCreateOptions, NormalizedStylesCreateOptions, StylesCreateResolution, StylesCreateReceiptSuccess, StylesCreateReceiptFailure, StylesCreateReceipt, StylesCreateAdapter, StylesCreateApi, } from './create.js';
12
+ export { STYLE_XML_PATH, executeStylesCreate, validateStylesCreateInput, validateStylesCreateOptions, } from './create.js';
13
+ export type { StyleCatalogView, StyleCatalogItemType, StyleCatalogFilterType, StyleProvenance, StyleCatalogDiagnosticSeverity, StyleSourcePartStatus, StyleCatalogUsageStatus, StyleCatalogPreviewStatus, StyleCatalogViewStatus, StyleCatalogItemVisibility, StyleCatalogItemUsage, StyleCatalogItemPreview, StyleCatalogPreviewFontSource, StyleCatalogPreviewColorSource, StyleCatalogPreviewSources, StyleCatalogItem, StyleCatalogDefaults, StyleCatalogDiagnostic, StyleCatalogSourceStatus, StylesGetCatalogInput, StylesGetCatalogResult, StylesGetCatalogAdapter, } from './catalog.js';
12
14
  export { STYLE_CATALOG_VIEWS, STYLE_CATALOG_FILTER_TYPES, executeStylesGetCatalog, validateStylesGetCatalogInput, } from './catalog.js';
15
+ export type { StylesGetThemeInput, StylesThemeSourceStatus, StylesGetThemeResult, StylesGetThemeAdapter, } from './theme.js';
16
+ export { executeStylesGetTheme, validateStylesGetThemeInput } from './theme.js';
13
17
  export type { PatchKeyClassification } from './validation.js';
14
- export { validateValue, classifyPatchKey } from './validation.js';
18
+ export { validateValue, classifyPatchKey, validatePatchObject } from './validation.js';
@@ -1,4 +1,4 @@
1
- import { ST_UNDERLINE_VALUES } from '../inline-semantics/token-sets.js';
1
+ import { ST_HIGHLIGHT_VALUES, ST_UNDERLINE_VALUES } from '../inline-semantics/token-sets.js';
2
2
  export declare const ST_VERTICAL_ALIGN_RUN: readonly ["superscript", "subscript", "baseline"];
3
3
  export declare const ST_EM: readonly ["none", "dot", "comma", "circle", "sesame"];
4
4
  export declare const ST_TEXT_ALIGNMENT: readonly ["top", "center", "baseline", "bottom", "auto"];
@@ -6,7 +6,7 @@ export declare const ST_TEXT_DIRECTION: readonly ["lrTb", "tbRl", "btLr", "lrTbV
6
6
  export declare const ST_TEXTBOX_TIGHT_WRAP: readonly ["none", "allLines", "firstAndLastLine", "firstLineOnly", "lastLineOnly"];
7
7
  export declare const ST_TEXT_TRANSFORM: readonly ["uppercase", "none"];
8
8
  export declare const ST_JUSTIFICATION: readonly ["left", "center", "right", "justify", "distribute"];
9
- export { ST_UNDERLINE_VALUES };
9
+ export { ST_HIGHLIGHT_VALUES, ST_UNDERLINE_VALUES };
10
10
  /** Recursive schema AST describing the shape of a property value. */
11
11
  export type ValueSchema = {
12
12
  kind: 'boolean';
@@ -41,3 +41,35 @@ export declare const ALLOWED_KEYS_BY_CHANNEL: Record<StylesChannel, Set<string>>
41
41
  export declare function getPropertyDefinition(key: string, channel: StylesChannel): PropertyDefinition | undefined;
42
42
  export declare const EXCLUDED_KEYS: Record<StylesChannel, Map<string, string>>;
43
43
  export declare const XML_PATH_BY_CHANNEL: Record<StylesChannel, string>;
44
+ /**
45
+ * Where in `word/styles.xml` a patch is being written.
46
+ *
47
+ * The exclusion list is a property of the *destination*, not of the property:
48
+ * `w:rtl` is disallowed in `w:docDefaults` and perfectly legal on a named
49
+ * `w:style`. Before this split, `EXCLUDED_KEYS` was the docDefaults list and
50
+ * the only list, so every caller inherited a restriction that only one of
51
+ * them was subject to.
52
+ *
53
+ * `docDefaults` is unchanged and remains what `styles.apply` uses.
54
+ */
55
+ export type StylesScope = 'docDefaults' | 'style';
56
+ /**
57
+ * Keys excluded from a named `w:style`.
58
+ *
59
+ * Narrower than the docDefaults list on the run channel by exactly the four
60
+ * properties the style model reads back off a `w:style` (see the registry
61
+ * entries). `w:rPrChange` stays out because it is a revision-tracking wrapper
62
+ * around document content, and `w:rStyle` because the style model does not
63
+ * carry it on `StyleDefinition.runProperties`.
64
+ *
65
+ * The paragraph channel is unchanged: every key it excludes — `w:cnfStyle`,
66
+ * `w:divId`, `w:pPrChange`, `w:pStyle`, `w:pPr/w:rPr`, `w:sectPr` — is as
67
+ * out of place inside `w:style/w:pPr` as it is inside docDefaults. Run
68
+ * properties on a style live in `w:style/w:rPr`, which is the `run` channel
69
+ * here, not in `w:pPr/w:rPr`.
70
+ */
71
+ export declare const STYLE_EXCLUDED_KEYS: Record<StylesChannel, Map<string, string>>;
72
+ /** Exclusion lists by destination. Defaults everywhere are `docDefaults`. */
73
+ export declare const EXCLUDED_KEYS_BY_SCOPE: Record<StylesScope, Record<StylesChannel, Map<string, string>>>;
74
+ /** Human-readable destination, for validation messages. */
75
+ export declare const SCOPE_LABEL: Record<StylesScope, string>;
@@ -1,9 +1,28 @@
1
- import { ValueSchema, StylesChannel } from './registry.js';
1
+ import { ValueSchema, StylesChannel, StylesScope } from './registry.js';
2
2
  type JsonSchema = Record<string, unknown>;
3
3
  /** Converts a ValueSchema AST node to a JSON Schema object. */
4
4
  export declare function toJsonSchema(schema: ValueSchema): JsonSchema;
5
- /** Builds a JSON Schema for the patch object of a given channel. */
6
- export declare function buildPatchSchema(channel: StylesChannel): JsonSchema;
7
- /** Builds a JSON Schema for the before/after state map covering all registry keys. */
8
- export declare function buildStateSchema(): JsonSchema;
5
+ /**
6
+ * Builds a JSON Schema for the patch object of a given channel and scope.
7
+ *
8
+ * The scope filter is what keeps the published `styles.apply` schema honest:
9
+ * the registry now carries run properties that only a named style accepts, and
10
+ * a schema that advertised them on `docDefaults` would describe an input the
11
+ * validator rejects.
12
+ */
13
+ export declare function buildPatchSchema(channel: StylesChannel, scope?: StylesScope): JsonSchema;
14
+ /**
15
+ * Builds a JSON Schema for the before/after state map of a given scope.
16
+ *
17
+ * Scoped for the same reason `buildPatchSchema` is: a receipt cannot report
18
+ * state for a property the scope does not accept, and advertising one both
19
+ * misleads a contract-driven caller and loosens receipt validation, since these
20
+ * objects carry `additionalProperties: false`.
21
+ *
22
+ * `channel` narrows it further, for a receipt that reports the two channels
23
+ * separately. Omitted, both fold into one map — correct only where something
24
+ * else in the receipt says which channel it describes, as `styles.apply`'s
25
+ * `resolution.channel` does.
26
+ */
27
+ export declare function buildStateSchema(scope?: StylesScope, channel?: StylesChannel): JsonSchema;
9
28
  export {};
@@ -0,0 +1,32 @@
1
+ import { SDTheme } from '../types/sd-styles.js';
2
+ import { StyleCatalogDiagnostic, StyleSourcePartStatus } from './catalog.js';
3
+ /** `styles.getTheme` takes no options. */
4
+ export type StylesGetThemeInput = Record<string, never>;
5
+ /**
6
+ * Status of the package parts the theme is read from. A `missing` or
7
+ * `malformed` theme part still yields a theme: the default Office theme,
8
+ * labeled `source: 'fallback'`.
9
+ */
10
+ export interface StylesThemeSourceStatus {
11
+ theme: StyleSourcePartStatus;
12
+ /** `word/settings.xml`, which carries `w:clrSchemeMapping`. */
13
+ settings: StyleSourcePartStatus;
14
+ }
15
+ export interface StylesGetThemeResult {
16
+ /** Always present. `source` says whether it is the document's own theme or the Office fallback. */
17
+ theme: SDTheme & {
18
+ source: 'document' | 'fallback';
19
+ };
20
+ sourceStatus: StylesThemeSourceStatus;
21
+ diagnostics: StyleCatalogDiagnostic[];
22
+ }
23
+ export interface StylesGetThemeAdapter {
24
+ getTheme(input?: StylesGetThemeInput): StylesGetThemeResult;
25
+ }
26
+ /** Validates `styles.getTheme` input. `undefined` and `{}` are the only valid calls. */
27
+ export declare function validateStylesGetThemeInput(input?: StylesGetThemeInput): void;
28
+ /**
29
+ * Executes `styles.getTheme` using the provided adapter.
30
+ * Validates input, then delegates to the adapter.
31
+ */
32
+ export declare function executeStylesGetTheme(adapter: Partial<StylesGetThemeAdapter> | null | undefined, input?: StylesGetThemeInput): StylesGetThemeResult;
@@ -1,4 +1,4 @@
1
- import { ValueSchema, StylesChannel } from './registry.js';
1
+ import { ValueSchema, StylesChannel, StylesScope } from './registry.js';
2
2
  /**
3
3
  * Validates a value against a ValueSchema AST node.
4
4
  *
@@ -35,4 +35,13 @@ export type PatchKeyClassification = {
35
35
  * nesting conditionals across excluded-key maps, allowed-key sets, and
36
36
  * cross-channel lookups.
37
37
  */
38
- export declare function classifyPatchKey(key: string, channel: StylesChannel): PatchKeyClassification;
38
+ export declare function classifyPatchKey(key: string, channel: StylesChannel, scope?: StylesScope): PatchKeyClassification;
39
+ /**
40
+ * Validates the keys and values of a patch object against one channel.
41
+ *
42
+ * Shared by `styles.apply` (scope `docDefaults`) and `styles.create` (scope
43
+ * `style`); `field` names the caller's own input path so the error points at
44
+ * `patch` or at `run` / `paragraph` rather than at whichever one happened to
45
+ * write this code.
46
+ */
47
+ export declare function validatePatchObject(patch: Record<string, unknown>, channel: StylesChannel, scope: StylesScope, field: string): void;
@@ -3,19 +3,17 @@
3
3
  *
4
4
  * Adopts a source DOCX's template **style system and reusable template assets**
5
5
  * onto the currently open document while preserving the open document's
6
- * body/story content (`word/document.xml` is never replaced). This is template
7
- * adoption, not a blind substrate transplant. The adoption semantics are:
6
+ * body/story content. Source body content is never copied; `word/document.xml`
7
+ * is rewritten only to adopt section defaults. The adoption semantics are:
8
8
  *
9
9
  * - `styles`: source-authoritative overlap. For a `styleId` defined in both
10
10
  * documents the source definition wins **in place** under the original id
11
11
  * (no `*-tmpl` rename). The source `w:docDefaults` and `w:latentStyles`
12
- * singletons replace the target's. Source-only styles are imported; target-only
13
- * styles still required by preserved content are retained.
14
- * - `numbering`: reconciled as a dependency graph (not a flat append / blind
15
- * replace). The `w:num`/`w:abstractNum` graph required by imported
16
- * numbering-bearing styles is imported, colliding ids are remapped
17
- * deterministically, and references are rewritten coherently in both
18
- * `numbering.xml` and `styles.xml`.
12
+ * singletons replace the target's. Source-only styles are imported; all
13
+ * target-only styles are retained.
14
+ * - `numbering`: every source `w:abstractNum`/`w:num` is appended. Colliding
15
+ * ids are remapped deterministically, and imported styles are rewritten to
16
+ * the remapped ids. Re-applying the same source appends the definitions again.
19
17
  * - `settings`: bounded reconciliation — layout/style-affecting settings (e.g.
20
18
  * default tab stop) are adopted; identity/workflow settings (`rsid*`, `docId`,
21
19
  * protection/revision state, `attachedTemplate`) are preserved.
@@ -24,7 +22,8 @@
24
22
  * imported as reusable template assets (even ones the page-1 governing
25
23
  * section does not reference), together with their `.rels` and transitive
26
24
  * media closure; colliding part names / relationship ids / media names are
27
- * reallocated and references rewritten consistently.
25
+ * reallocated and references rewritten consistently. Re-applying the same
26
+ * source imports the parts again under new names.
28
27
  * - `sectionDefaults`: the source `w:sectPr` that governs page 1 is adopted as
29
28
  * the current document's active/final section-default model. On multi-section
30
29
  * targets, its header/footer visibility model (`headerReference`,
@@ -32,11 +31,10 @@
32
31
  * sections without overwriting their own page geometry. Intermediate / later
33
32
  * source sections are not imported.
34
33
  *
35
- * Selected non-body package sidecars (`customXml`, `docProps/custom.xml`,
36
- * comments, notes, people, keymap customizations, and `settings.xml.rels`) are
37
- * imported when present so reconstructed content can reuse the source package
38
- * substrate faithfully. Source body content, glossary, signatures, embeddings,
39
- * and body media remain out of scope and are reported, never applied.
34
+ * Other source parts are never applied. `customXml` is reported as an
35
+ * out-of-scope skipped scope. `customXml`, `docProps`, comments, notes, people,
36
+ * glossary, signatures, embeddings, and body media are reported in
37
+ * `unsupportedItems`.
40
38
  *
41
39
  * Engine-agnostic contract + execution entry point. No ProseMirror/converter imports.
42
40
  */
@@ -116,6 +116,7 @@ export interface TocRemoveInput {
116
116
  }
117
117
  export interface TocMutationSuccess {
118
118
  success: true;
119
+ appliedChangeMode?: 'direct' | 'tracked';
119
120
  toc: TocAddress;
120
121
  }
121
122
  export interface TocMutationFailure {
@@ -147,6 +148,7 @@ export interface CreateTableOfContentsInput {
147
148
  }
148
149
  export interface CreateTableOfContentsSuccess {
149
150
  success: true;
151
+ appliedChangeMode?: 'direct' | 'tracked';
150
152
  toc: TocAddress;
151
153
  }
152
154
  export interface CreateTableOfContentsFailure {
@@ -238,6 +240,7 @@ export interface TocEntryDomain {
238
240
  export type TocListEntriesResult = DiscoveryOutput<TocEntryDomain>;
239
241
  export interface TocEntryMutationSuccess {
240
242
  success: true;
243
+ appliedChangeMode?: 'direct' | 'tracked';
241
244
  entry: TocEntryAddress;
242
245
  }
243
246
  export interface TocEntryMutationFailure {
@@ -1,5 +1,5 @@
1
1
  import { BlockNodeType, BlockNodeAddress, DeletableBlockNodeAddress } from './base.js';
2
- import { AffectedRef, AffectedRefRemapping, Receipt, ReceiptFailure, ReceiptInsert, TextRangeShift } from './receipt.js';
2
+ import { AffectedRef, AffectedRefRemapping, Receipt, ReceiptFailure, ReceiptInsert, ReceiptSuccess, TextRangeShift } from './receipt.js';
3
3
  import { StoryLocator } from './story.types.js';
4
4
  import { ParagraphNumbering } from './paragraph.types.js';
5
5
  import { SDProjectionReviewMode } from './content-projection.js';
@@ -117,6 +117,7 @@ export interface BlocksDeleteInput {
117
117
  }
118
118
  export interface BlocksDeleteResult {
119
119
  success: true;
120
+ appliedChangeMode?: ReceiptSuccess['appliedChangeMode'];
120
121
  deleted: DeletableBlockNodeAddress;
121
122
  deletedBlock?: DeletedBlockSummary;
122
123
  trackedChangeRefs?: ReceiptInsert[];
@@ -145,6 +146,7 @@ export interface BlocksSplitInput {
145
146
  }
146
147
  export interface BlocksSplitSuccessResult {
147
148
  success: true;
149
+ appliedChangeMode?: ReceiptSuccess['appliedChangeMode'];
148
150
  /** Address of the new paragraph created by the split (the tail). */
149
151
  inserted: BlockNodeAddress;
150
152
  /**
@@ -173,6 +175,7 @@ export interface BlocksMergeInput {
173
175
  }
174
176
  export interface BlocksMergeSuccessResult {
175
177
  success: true;
178
+ appliedChangeMode?: ReceiptSuccess['appliedChangeMode'];
176
179
  /** Address of the paragraph that was removed (the second paragraph). */
177
180
  removed: BlockNodeAddress;
178
181
  /**
@@ -208,6 +211,7 @@ export interface BlocksMoveInput {
208
211
  }
209
212
  export interface BlocksMoveSuccessResult {
210
213
  success: true;
214
+ appliedChangeMode?: ReceiptSuccess['appliedChangeMode'];
211
215
  /** Same `source` paragraph, now relocated. */
212
216
  moved: BlockNodeAddress;
213
217
  remappedRefs?: AffectedRefRemapping[];
@@ -229,6 +233,7 @@ export type BlocksMoveResult = BlocksMoveSuccessResult | BlocksMoveFailureResult
229
233
  export type { Receipt };
230
234
  export interface BlocksDeleteRangeResult {
231
235
  success: true;
236
+ appliedChangeMode?: ReceiptSuccess['appliedChangeMode'];
232
237
  deletedCount: number;
233
238
  deletedBlocks: DeletedBlockSummary[];
234
239
  revision: {
@@ -1,7 +1,7 @@
1
1
  import { TextAddress } from './address.js';
2
2
  import { BlockNodeAddress } from './base.js';
3
3
  import { ResolvedHandle } from './discovery.js';
4
- import { ReceiptFailure, ReceiptInsert } from './receipt.js';
4
+ import { ReceiptFailure, ReceiptInsert, ReceiptSuccess } from './receipt.js';
5
5
  import { StoryLocator } from './story.types.js';
6
6
  export type ParagraphCreateLocation = {
7
7
  kind: 'documentStart';
@@ -29,6 +29,7 @@ export interface CreateParagraphInput {
29
29
  }
30
30
  export interface CreateParagraphSuccessResult {
31
31
  success: true;
32
+ appliedChangeMode?: ReceiptSuccess['appliedChangeMode'];
32
33
  paragraph: BlockNodeAddress;
33
34
  insertionPoint: TextAddress;
34
35
  trackedChangeRefs?: ReceiptInsert[];
@@ -95,6 +96,7 @@ export interface CreateHeadingInput {
95
96
  }
96
97
  export interface CreateHeadingSuccessResult {
97
98
  success: true;
99
+ appliedChangeMode?: ReceiptSuccess['appliedChangeMode'];
98
100
  heading: BlockNodeAddress;
99
101
  insertionPoint: TextAddress;
100
102
  trackedChangeRefs?: ReceiptInsert[];
@@ -2,6 +2,7 @@ import { SDContentNode } from './sd-nodes.js';
2
2
  import { SDStyles, SDDocDefaults, SDTheme } from './sd-styles.js';
3
3
  import { SDNumberingCatalog, SDSection, SDReferenceCatalogs, SDAnnotations } from './sd-sections.js';
4
4
  import { SDDocumentMeta } from './sd-props.js';
5
+ import { SDDiagnostic } from './sd-contract.js';
5
6
  /** Structural content payload for insert and replace operations. */
6
7
  export type SDFragment = SDContentNode | SDContentNode[];
7
8
  export interface SDDocument {
@@ -15,6 +16,8 @@ export interface SDDocument {
15
16
  referenceCatalogs?: SDReferenceCatalogs;
16
17
  annotations?: SDAnnotations;
17
18
  metadata?: SDDocumentMeta;
19
+ /** Missing, malformed or fallback package parts, and read options not honored yet. */
20
+ diagnostics?: SDDiagnostic[];
18
21
  }
19
22
  export declare const SD_CONTENT_NODE_KINDS: readonly ["paragraph", "heading", "list", "table", "toc", "index", "bibliography", "tableOfAuthorities", "break", "horizontalRule", "sectionBreak", "sectPr", "image", "drawing", "sdt", "customXml", "altChunk", "math", "field"];
20
23
  export type SDContentNodeKind = (typeof SD_CONTENT_NODE_KINDS)[number];
@@ -233,6 +233,8 @@ export type StructuralStepData = {
233
233
  export type StepOutcomeData = TextStepData | AssertStepData | DomainStepData | TableStepData | StructuralStepData;
234
234
  export type StepOutcome = {
235
235
  stepId: string;
236
+ /** Effective mode when all committed requests in this step used the same mode. */
237
+ appliedChangeMode?: ChangeMode;
236
238
  op: string;
237
239
  effect: StepEffect;
238
240
  matchCount: number;
@@ -241,6 +243,8 @@ export type StepOutcome = {
241
243
  };
242
244
  export type PlanReceipt = {
243
245
  success: true;
246
+ /** Effective mode when every committed step used the same mode. */
247
+ appliedChangeMode?: ChangeMode;
244
248
  revision: {
245
249
  before: string;
246
250
  after: string;