@h-k-dev/angular-email-editor 0.0.6 → 0.0.8

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.
@@ -1,9 +1,10 @@
1
1
  import { Schema, NodeSpec, MarkSpec, ParseRule, TagParseRule, Node, DOMParser, Mark, MarkType, NodeType, ResolvedPos } from 'prosemirror-model';
2
- import { Command, EditorState, Plugin, PluginKey, Transaction } from 'prosemirror-state';
2
+ import { Command, EditorState, Plugin, PluginKey, Selection, SelectionBookmark, Transaction } from 'prosemirror-state';
3
3
  import { InputRule } from 'prosemirror-inputrules';
4
4
  import * as _h_k_dev_angular_email_editor from '@h-k-dev/angular-email-editor';
5
5
  import { AddressRules } from '@h-k-dev/angular-email-editor/address';
6
- import { EditorView } from 'prosemirror-view';
6
+ import { EditorView, DecorationSet } from 'prosemirror-view';
7
+ import { Mappable } from 'prosemirror-transform';
7
8
  import { FontSize } from '@h-k-dev/angular-email-editor/fonts';
8
9
  export * from '@h-k-dev/angular-email-editor/fonts';
9
10
  import * as i0 from '@angular/core';
@@ -889,9 +890,23 @@ declare function relativeLuminance(hex: string): number;
889
890
  declare function contrastRatio(a: string, b: string): number;
890
891
  /** Whether a color reads against both the light and the dark reference. */
891
892
  declare function passesDualContrast(hex: string): boolean;
893
+ /**
894
+ * The dark surfaces the dark variants are held to: Apple Mail's reading pane
895
+ * and Outlook's (new Outlook for Windows, Outlook.com) — the clients that
896
+ * read the email's own dark-mode styles (dark-mode.ts). AA (4.5:1) for a
897
+ * colour on each, and AAA (7:1) for the body's black on each.
898
+ */
899
+ declare const DARK_MODE_SURFACES: readonly string[];
892
900
  interface PaletteColor {
893
901
  name: string;
894
902
  value: string;
903
+ /** What the colour turns into where a client reads the email's dark-mode
904
+ styles (Apple Mail, Outlook): the same hue, lit for a dark page — a
905
+ text colour reads on {@link DARK_MODE_SURFACES} and on every fill's
906
+ dark variant, a fill goes dark under its paired text's dark variant.
907
+ None, and the colour stays as it is in dark mode too (white text, the
908
+ black fill). */
909
+ dark?: string;
895
910
  /** Offered although it fails its palette's rule — and why. The palette
896
911
  tests hold every other swatch to the rule, and this one to failing it,
897
912
  so an exception is always a decision on record, never an accident. */
@@ -932,6 +947,9 @@ declare const FILL_TEXT_COLOR_RGB = "rgb(32, 33, 36)";
932
947
  /** The text colour a dark fill carries: white — the mirror of
933
948
  {@link FILL_TEXT_COLOR}, for the same two dark-mode reasons. */
934
949
  declare const FILL_TEXT_COLOR_LIGHT = "#ffffff";
950
+ /** A `#rgb`, `#rrggbb` or CSSOM `rgb()` / `rgba()` colour as `#rrggbb`, or
951
+ null for anything else (a keyword, a function this does not read). */
952
+ declare function cssColorToHex(raw: string): string | null;
935
953
  /** The text a fill is paired with: white on a dark fill, near-black on
936
954
  anything else (a colour this cannot read included). */
937
955
  declare function fillTextColor(background: string): string;
@@ -948,6 +966,11 @@ declare function passesDualBackground(hex: string): boolean;
948
966
  * passing {@link passesDualBackground} — proven by test. Shared by every
949
967
  * background affordance (text highlight, table cells, column panels) so fills
950
968
  * read the same everywhere and survive inversion. Black carries white text.
969
+ *
970
+ * Each pale fill has a dark variant (dark-mode.ts): the same hue at about
971
+ * the luminance of a dark client's page, so its paired text's variant reads
972
+ * on it at AAA and every text colour's variant at AA. Black has none: white
973
+ * on it already reads on a dark page.
951
974
  */
952
975
  declare const emailBackgroundPalette: PaletteColor[];
953
976
  /**
@@ -955,13 +978,96 @@ declare const emailBackgroundPalette: PaletteColor[];
955
978
  * — proven by test, not by promise. This is what a color picker should offer
956
979
  * instead of an arbitrary hex input.
957
980
  *
958
- * Black and white are the two exceptions (no neutral near either end passes:
959
- * the band runs from #616161 to #949494), offered because a writer needs
960
- * them — black to take coloured text back to plain, white for text on a dark
961
- * fill.
981
+ * Every colour reads at AA (4.5:1) on white and on every pale fill, and so
982
+ * does its inversion on black (Gmail's dark mode). Its dark variant reads at
983
+ * AA on {@link DARK_MODE_SURFACES} and on every fill's dark variant — what
984
+ * Apple Mail and Outlook show, where the email's dark-mode styles are read
985
+ * (dark-mode.ts). The tones are each hue's lightest that holds on the
986
+ * palest-but-one fill; the variants are the same hue, lit just enough.
987
+ *
988
+ * Black and white are the two exceptions to the mid-tone rule (no neutral
989
+ * near either end passes: the band runs from #616161 to #949494), offered
990
+ * because a writer needs them — black to take coloured text back to plain,
991
+ * white for text on a dark fill. Black is the body's text, so it is held to
992
+ * AAA (7:1) in both modes.
962
993
  */
963
994
  declare const emailTextPalette: PaletteColor[];
964
995
 
996
+ /**
997
+ * Dark mode, written into the email: the palette's own dark variants
998
+ * ({@link PaletteColor.dark}) for the clients that read an email's dark-mode
999
+ * styles, so a curated colour reads at AA there too — which no single value
1000
+ * can do on a white page and a dark one at once (dual-contrast.ts).
1001
+ *
1002
+ * - **Apple Mail** (macOS, iOS) and **new Outlook / Outlook.com**: the
1003
+ * document says it is drawn for both schemes (`color-scheme: light dark`),
1004
+ * and each palette colour it carries takes its variant — through
1005
+ * `@media (prefers-color-scheme: dark)` for Apple, `[data-ogsc]` /
1006
+ * `[data-ogsb]` for Outlook, which marks a message it darkens that way.
1007
+ * - **Gmail** and **classic Outlook for Windows** read neither and invert
1008
+ * the colours themselves; the light values are chosen to read after that
1009
+ * inversion, and the rules sit in a `<style>` of their own, so a client
1010
+ * that throws the block away keeps every other rule.
1011
+ *
1012
+ * Only the palette's colours move, and only where the move reads: a fill
1013
+ * goes dark when nothing in it wears a colour outside the palette (dark text
1014
+ * on it would vanish), and a text colour lights up when no background over
1015
+ * it stays light. A colour typed into the HTML source is the author's own,
1016
+ * as everywhere (principle 9) — it stays, and so does what holds it.
1017
+ *
1018
+ * The canonical HTML never carries any of this: {@link markDarkMode} works
1019
+ * on the email document only (`emailDocument`), and the editor shows the
1020
+ * same rendering through {@link darkModeEditorCss} — one set of selectors,
1021
+ * so the two cannot drift.
1022
+ */
1023
+
1024
+ /** The colours that move in dark mode — each one's `dark` variant. */
1025
+ interface DarkModePalette {
1026
+ readonly text: readonly PaletteColor[];
1027
+ readonly background: readonly PaletteColor[];
1028
+ }
1029
+ /** The library's palette, both sides. */
1030
+ declare const emailDarkModePalette: DarkModePalette;
1031
+ /** The class a text colour's element wears in the email: `aee-dt-c5221f`. */
1032
+ declare const DARK_TEXT_CLASS = "aee-dt-";
1033
+ /** The class a fill's element wears in the email: `aee-db-fce8e6`. */
1034
+ declare const DARK_FILL_CLASS = "aee-db-";
1035
+ /** What a document says to be drawn in both schemes: Apple Mail then reads
1036
+ its dark-mode rules (and leaves its own recolouring be). */
1037
+ declare const COLOR_SCHEME_META: string;
1038
+ /** The same, for the stylesheet. */
1039
+ declare const COLOR_SCHEME_RULE = ":root { color-scheme: light dark; supported-color-schemes: light dark; }";
1040
+ interface DarkModeMarking {
1041
+ /** The HTML with each moving colour's element wearing its class — the
1042
+ input itself, byte for byte, when nothing moves. */
1043
+ readonly html: string;
1044
+ /** The rules for the classes used: Apple's media query and Outlook's
1045
+ markers. Empty when nothing moves. */
1046
+ readonly css: string;
1047
+ }
1048
+ /**
1049
+ * Marks the palette's colours in an email body for dark mode: a fill that
1050
+ * goes dark wears `aee-db-<hex>`, a text colour that lights up wears
1051
+ * `aee-dt-<hex>`, and `css` holds the rules for exactly those classes.
1052
+ *
1053
+ * A fill goes dark when it is the palette's, nothing in it (itself
1054
+ * included) wears a colour outside the palette, and every background round
1055
+ * it goes dark too. A text colour lights up when it is the palette's and
1056
+ * every background over it (its own included) goes dark — so lit text never
1057
+ * stands on a light fill, nor dark text on a dark one.
1058
+ */
1059
+ declare function markDarkMode(html: string, palette?: DarkModePalette): DarkModeMarking;
1060
+ /**
1061
+ * The same dark rendering for the editor's own surface: every rule of
1062
+ * {@link markDarkMode}, as a stylesheet over the live text under `scope`
1063
+ * (the editor root while it shows dark) — the editor's markup is never
1064
+ * touched. Each colour hands its variant over in a custom property; two
1065
+ * rules then apply them where the email's classes would go.
1066
+ *
1067
+ * darkModeEditorCss(palette, '.paper[data-color-scheme="dark"] > .aee-editor')
1068
+ */
1069
+ declare function darkModeEditorCss(scope: string, palette?: DarkModePalette): string;
1070
+
965
1071
  /**
966
1072
  * The client-support data module (M3): a curated, versioned subset of what
967
1073
  * caniemail documents about our floor clients. Pure data + lookups — the
@@ -1013,13 +1119,18 @@ declare function emailSizeBudget(html: string): SizeBudget;
1013
1119
  type RenderingClient = 'apple-mail' | 'gmail' | 'outlook-desktop';
1014
1120
  declare const RENDERING_CLIENTS: readonly RenderingClient[];
1015
1121
  interface ClientRenderingOptions {
1016
- /** Draw the client's dark mode: Gmail's forced inversion, Apple Mail's
1017
- and Outlook's own dark surfaces. */
1122
+ /** Draw the client's dark mode: Apple Mail's dark surface under the
1123
+ email's own dark-mode rules, Gmail's and classic Outlook's forced
1124
+ inversion. */
1018
1125
  dark?: boolean;
1019
1126
  /** The reading pane: a phone draws the message edge to edge (iOS Mail,
1020
1127
  the Gmail app), a desktop pane keeps a margin round it. Default
1021
1128
  desktop. */
1022
1129
  pane?: 'phone' | 'desktop';
1130
+ /** The palette a fragment's dark variants come from — what
1131
+ `emailDocument` sends it with (dark-mode.ts); the library's by
1132
+ default, `false` for none. A whole document is drawn as it is. */
1133
+ darkMode?: DarkModePalette | false;
1023
1134
  }
1024
1135
  /**
1025
1136
  * The email as a client would draw it — a simulation, in a browser, of what
@@ -1029,12 +1140,15 @@ interface ClientRenderingOptions {
1029
1140
  * put in, and the client's own surface (its default face, size and colours)
1030
1141
  * is laid underneath. The result is a whole document for a sandboxed frame.
1031
1142
  *
1032
- * - **Apple Mail** reads it all: the document as it is, on Apple's surface.
1143
+ * - **Apple Mail** reads it all: the document as it is, on Apple's surface;
1144
+ * in dark mode its `prefers-color-scheme: dark` rules apply, so a
1145
+ * fragment's palette colours take their dark variants (dark-mode.ts).
1033
1146
  * - **Gmail** drops the comments, the form controls (a hamburger's
1034
1147
  * checkbox and label), every `<style>` rule whose selector it cannot
1035
1148
  * match (pseudo-classes, attribute selectors, sibling combinators), and
1036
1149
  * the declarations the data marks as ignored there (position, flex and
1037
- * grid, transforms, animation). Its dark mode inverts the colours.
1150
+ * grid, transforms, animation). It reads no `prefers-color-scheme`,
1151
+ * and its dark mode inverts the colours.
1038
1152
  * - **Outlook on Windows** reads what the Word engine reads: the
1039
1153
  * conditional comments meant for it are opened (`[if mso]`, `[if mso |
1040
1154
  * IE]`, `[if gte mso 9]`) and the parts kept from it are taken out
@@ -1044,12 +1158,22 @@ interface ClientRenderingOptions {
1044
1158
  * shadows, and the rest), and an `inline-block` block stacks. VML is left
1045
1159
  * standing — a browser draws none of it, so a picture behind text shows
1046
1160
  * as the colour beneath, which is what an Outlook without VML shows too.
1161
+ * Its dark mode (classic Outlook; the new one is Outlook.com's) recolours
1162
+ * the message itself, as Gmail's does, onto its own dark surface.
1047
1163
  *
1048
1164
  * Takes a fragment (the editor's canonical HTML) or a whole document (an
1049
1165
  * import as it was pasted): a document keeps its head — its `<style>`,
1050
- * subject to the client — with the client's surface laid before it.
1166
+ * subject to the client — with the client's surface laid before it. A
1167
+ * fragment is drawn as `emailDocument` sends it: its dark-mode classes
1168
+ * and rules put in. Outlook.com's markers (`[data-ogsc]`) are set by none
1169
+ * of the three, so their rules never apply here.
1051
1170
  */
1052
1171
  declare function renderForClient(html: string, client: RenderingClient, options?: ClientRenderingOptions): string;
1172
+ /** `prefers-color-scheme` answered for the frame: `dark` true where the
1173
+ client is drawn dark and reads the query (Apple Mail), false everywhere
1174
+ else — a client that reads no such query never matches it, whatever
1175
+ the viewer's own scheme. */
1176
+ declare function resolveColorScheme(css: string, dark: boolean): string;
1053
1177
  /** Gmail keeps a rule whose selector it can match — elements, classes,
1054
1178
  ids, descendants — and drops one with a pseudo-class, an attribute
1055
1179
  selector or a sibling combinator; media queries it keeps. */
@@ -1064,6 +1188,19 @@ declare function dropMediaQueries(css: string): string;
1064
1188
  * `1. `, links keep their URL, images fall back to their alt text.
1065
1189
  */
1066
1190
  declare function emailPlainText(html: string): string;
1191
+ /**
1192
+ * Text as a plain-text message's document — the way back from
1193
+ * {@link emailPlainText}: one email line (`<div>`) per line of text, an
1194
+ * empty line as `<div><br></div>`, every character escaped. What an editor
1195
+ * on `plainTextExtensions` takes when a message turns to plain text:
1196
+ *
1197
+ * ```ts
1198
+ * editor.setContent(plainTextHTML(emailPlainText(html)));
1199
+ * ```
1200
+ *
1201
+ * and `emailPlainText` reads it back as the same lines.
1202
+ */
1203
+ declare function plainTextHTML(text: string): string;
1067
1204
 
1068
1205
  interface EmailDocumentOptions {
1069
1206
  /** The body's language (`en`, `ja`, `de`, …) — screen readers pick their
@@ -1080,6 +1217,11 @@ interface EmailDocumentOptions {
1080
1217
  /** The inbox snippet shown next to the subject. Without it the client
1081
1218
  takes the first text it finds — often an image's alt or a greeting. */
1082
1219
  previewText?: string;
1220
+ /** The colours that take a dark variant where a client reads the
1221
+ email's dark-mode styles (dark-mode.ts) — the library's palette by
1222
+ default; a host with its own palette passes it. `false` leaves dark
1223
+ mode to the client: no `color-scheme`, no variants. */
1224
+ darkMode?: DarkModePalette | false;
1083
1225
  }
1084
1226
  /**
1085
1227
  * The body's head and shell: the fixes every mail client needs, none of which
@@ -1102,6 +1244,12 @@ interface EmailDocumentOptions {
1102
1244
  * keeps the cap — narrower, still whole — and loses nothing else, which is
1103
1245
  * the same rule the canonical HTML already keeps.
1104
1246
  *
1247
+ * Dark mode is the other enhancement (dark-mode.ts): the document says it
1248
+ * is drawn for both schemes, and the palette's colours in it wear a class
1249
+ * that their dark variant hangs on, in a `<style>` of its own — a client
1250
+ * that reads none of it (Gmail, classic Outlook) inverts the light colours,
1251
+ * which are chosen to read inverted.
1252
+ *
1105
1253
  * The result is for the transport, not for the editor: parse and
1106
1254
  * `emailPlainText` take the fragment `serializeToHTML` returns (the preview
1107
1255
  * text would otherwise read as body text).
@@ -1435,6 +1583,21 @@ declare const richTextExtensions: Extension[];
1435
1583
  * paragraph margins as double spacing) and empty lines as `<div><br></div>`.
1436
1584
  */
1437
1585
  declare const emailExtensions: Extension[];
1586
+ /**
1587
+ * Plain text — a mail client's plain-text mode: the message as lines and
1588
+ * nothing else. No marks, no blocks, no images, no tokens in the schema, so
1589
+ * neither a shortcut (Mod-B has nothing to toggle) nor a paste (HTML is
1590
+ * read down to its text) can bring formatting in. Lines are the email
1591
+ * kit's `<div>` lines, Shift-Enter a `<br>` inside one, so what the editor
1592
+ * publishes is still email HTML — `emailPlainText` reads it back as exactly
1593
+ * the text written, the `text/plain` a plain-text message sends. The
1594
+ * quoted history is kept beside it, as in the email kit.
1595
+ *
1596
+ * A host switches a message between the two by mounting a new editor on
1597
+ * the other kit (a schema is fixed for an editor's life) with the content
1598
+ * carried over: `plainTextHTML(emailPlainText(html))` on the way in.
1599
+ */
1600
+ declare const plainTextExtensions: Extension[];
1438
1601
  /**
1439
1602
  * The parallel source-editor kit: the document is HTML source text, one
1440
1603
  * `codeLine` per line, with highlighting, linting and formatting instead of
@@ -1740,14 +1903,32 @@ declare const MergeTag: _h_k_dev_angular_email_editor.MarkExtension;
1740
1903
  */
1741
1904
  declare function mergeTagFields(doc: Node): string[];
1742
1905
 
1906
+ /** The levels the schema knows. No h5 or h6: an imported one is a plain
1907
+ line, and `##### ` stays the text it is. */
1908
+ declare const HEADING_LEVELS: readonly [1, 2, 3, 4];
1743
1909
  /** The ledger's conservative scale: reads at 320px and on a desktop alike. */
1744
1910
  declare const HEADING_SIZES: Record<number, number>;
1745
- /** A heading's canonical inline style. No margins — lines carry none
1746
- (principle 3), spacing is an empty line; no `line-height` — Outlook
1747
- substitutes its own (the client-support module says so) and our output
1748
- stays lint-clean. Incoming heading styles never survive: the scale is the
1749
- schema's, not the author's. */
1750
- declare const headingStyle: (level: number) => string;
1911
+ /** The space above a heading, by level: its size less {@link HEADING_SPACE_BELOW}. */
1912
+ declare const HEADING_SPACE_ABOVE: Record<number, number>;
1913
+ /** The space below every heading. */
1914
+ declare const HEADING_SPACE_BELOW = 4;
1915
+ /**
1916
+ * A heading's canonical inline style. A heading sits nearer the words it
1917
+ * opens than the words before it (proximity): a margin above, a small one
1918
+ * below — an exception to principle 3, with a list's (lists.ts). Positive px
1919
+ * margins render in Gmail, Outlook's Word engine and Apple Mail alike
1920
+ * (caniemail, 2026-09). Body lines carry none, so two margins meet only
1921
+ * between headings and lists, where a browser collapses the pair and Word
1922
+ * may add it: the space below is one constant 4px, and the space above is
1923
+ * the size less it, so heading after heading Outlook's worst case lands on
1924
+ * the size itself (24/20/18/16), never more than 4px off. A
1925
+ * **layout** heading — a band's title, a column's — sits flush: `margin: 0`,
1926
+ * spacing left to the layout around it. No `line-height` — Outlook
1927
+ * substitutes its own (the client-support module says so) and our output
1928
+ * stays lint-clean. Incoming heading styles never survive: the scale is the
1929
+ * schema's, not the author's.
1930
+ */
1931
+ declare const headingStyle: (level: number, layout?: boolean) => string;
1751
1932
  declare const Heading: _h_k_dev_angular_email_editor.NodeExtension;
1752
1933
 
1753
1934
  /** The ledger's answer to reply chains whose margins stack until text is one
@@ -2201,6 +2382,167 @@ declare const IN_SELECTION_CLASS = "aee-atom--in-selection";
2201
2382
  */
2202
2383
  declare const InlineAtomSelection: _h_k_dev_angular_email_editor.FunctionalExtension;
2203
2384
 
2385
+ /** The class every block of a {@link BlockSelection} wears — the wash the
2386
+ app paints over it, since the selection itself draws nothing. */
2387
+ declare const BLOCK_SELECTED_CLASS = "aee-block--selected";
2388
+ /** The class the blocks of a {@link BlockSelection} just let go of wear, for
2389
+ as long as an animation the app gives it runs — the wash fading out
2390
+ instead of vanishing. Gone once the animation ends, at once with none. */
2391
+ declare const BLOCK_RELEASING_CLASS = "aee-block--releasing";
2392
+ /**
2393
+ * Whole top-level blocks selected as blocks — Notion's block selection: the
2394
+ * marquee's ({@link createBlockMarquee}) and the second `Mod-a`'s.
2395
+ *
2396
+ * Its ends are seams between top-level blocks (depth 0), so it always holds
2397
+ * whole blocks, one or more, in a run: an email is one column of them, and
2398
+ * a box dragged down it covers a run. A columns block or a table is one
2399
+ * block — selected whole, never cell by cell (that is `CellSelection`).
2400
+ *
2401
+ * It copies, cuts, deletes and is pasted over as the blocks (ProseMirror's
2402
+ * own handling, through its range), and draws nothing itself: `visible` is
2403
+ * false, so the browser's highlight is hidden, and every block in it wears
2404
+ * {@link BLOCK_SELECTED_CLASS} for the app to paint (see {@link SelectedBlocks}).
2405
+ */
2406
+ declare class BlockSelection extends Selection {
2407
+ /** The blocks from `anchorBlock` to `headBlock`, both the positions where
2408
+ a top-level block starts; the head is the end Shift-arrows move. */
2409
+ static create(doc: Node, anchorBlock: number, headBlock?: number): BlockSelection;
2410
+ /** Every block of the document. */
2411
+ static all(doc: Node): BlockSelection;
2412
+ constructor($anchor: ResolvedPos, $head: ResolvedPos);
2413
+ /** The selected blocks, top to bottom. */
2414
+ get blocks(): {
2415
+ node: Node;
2416
+ pos: number;
2417
+ }[];
2418
+ /** The first block's index and the last's among the document's blocks. */
2419
+ get indices(): {
2420
+ first: number;
2421
+ last: number;
2422
+ };
2423
+ /** The block at the head's end: the one Shift-arrows grow or shrink from. */
2424
+ get headIndex(): number;
2425
+ /** The block at the anchor's end, which stays while Shift-arrows move. */
2426
+ get anchorIndex(): number;
2427
+ map(doc: Node, mapping: Mappable): Selection;
2428
+ eq(other: Selection): boolean;
2429
+ toJSON(): {
2430
+ type: string;
2431
+ anchor: number;
2432
+ head: number;
2433
+ };
2434
+ static fromJSON(doc: Node, json: {
2435
+ anchor: unknown;
2436
+ head: unknown;
2437
+ }): BlockSelection;
2438
+ getBookmark(): SelectionBookmark;
2439
+ }
2440
+ /**
2441
+ * Lets a block selection go — the caret at the head's end of its block, as
2442
+ * Escape leaves it, but not scrolled to: the press that let go is elsewhere.
2443
+ * Whether the view holds one or not, nothing else changes; `true` if it did.
2444
+ */
2445
+ declare function releaseBlockSelection(view: EditorView): boolean;
2446
+ /**
2447
+ * What a {@link BlockSelection} does once there is one: every block in it
2448
+ * lit ({@link BLOCK_SELECTED_CLASS}), and Notion's keys — ArrowUp / ArrowDown
2449
+ * walk to the block above or below, Shift-ArrowUp / -Down grow or shrink the
2450
+ * run, ArrowLeft / ArrowRight leave to the caret at its start or end, Enter
2451
+ * and Escape to the caret in the head's block, Backspace / Delete remove the
2452
+ * blocks; a second `Mod-a` selects every block. Typing does nothing; a
2453
+ * paste replaces the blocks.
2454
+ *
2455
+ * The next press anywhere lets the blocks go, as Notion's do — in the editor
2456
+ * the press is ProseMirror's (or the marquee's) and replaces the selection
2457
+ * itself; outside it, a press that takes focus from the editor (another
2458
+ * field, a title bar, the page) leaves the caret at the head's block
2459
+ * ({@link releaseBlockSelection}). A control that keeps the editor focused —
2460
+ * a formatting toolbar acting on the selection — keeps the blocks. However
2461
+ * they go, the blocks let go wear {@link BLOCK_RELEASING_CLASS} while the
2462
+ * app's fade runs, so the wash eases out rather than vanishing.
2463
+ *
2464
+ * In the kits: the selection is reachable by keyboard alone. The pointer's
2465
+ * way in, the marquee, is the host's to opt into ({@link createBlockMarquee}),
2466
+ * since it needs a surface around the editor to start from.
2467
+ */
2468
+ declare const SelectedBlocks: _h_k_dev_angular_email_editor.FunctionalExtension;
2469
+
2470
+ /** The class of the box a drag draws — the host paints it, in the same wash
2471
+ as the blocks it lights ({@link BLOCK_SELECTED_CLASS}). */
2472
+ declare const BLOCK_MARQUEE_CLASS = "aee-marquee";
2473
+ interface BlockMarqueeOptions {
2474
+ /**
2475
+ * Where a press may start the box: the margin around the editor, and the
2476
+ * editor's own room between and below its blocks. The editor's parent
2477
+ * element, by default — the composer's scrolling paper. Only the blocks
2478
+ * the box covers *inside* the surface's viewport are selected, and held
2479
+ * near its scroller's edge the drag scrolls it.
2480
+ */
2481
+ surface?: (view: EditorView) => HTMLElement;
2482
+ /**
2483
+ * What the box is drawn in, once the press has started it — any ancestor
2484
+ * of the surface, or the surface itself (the default). Notion's way: the
2485
+ * drag can only start in the editor's room, but the box follows the
2486
+ * pointer anywhere on the canvas — over a header, the fields above the
2487
+ * text, a side bar — while it still selects only the editor's blocks. The
2488
+ * pointer is clipped to the canvas's viewport.
2489
+ *
2490
+ * The box is absolutely positioned against its containing block, so give
2491
+ * the canvas a `position`; its `overflow` clips the box. The box wears the
2492
+ * editor's `color-scheme`, wherever it is drawn, so its wash is the one
2493
+ * the blocks it lights wear.
2494
+ */
2495
+ canvas?: (view: EditorView) => HTMLElement;
2496
+ /** How far, in px, a press moves before it is a box and not a click.
2497
+ 4, by default: a hand at rest still moves a pixel or two. */
2498
+ threshold?: number;
2499
+ }
2500
+ /**
2501
+ * Notion's marquee: a drag from the empty room around the text draws a box,
2502
+ * and every top-level block it touches is selected — a {@link BlockSelection},
2503
+ * lit block by block in the box's own wash. Opt-in, with
2504
+ * {@link SelectedBlocks} in the kit (which this needs for the keys and the
2505
+ * lit blocks).
2506
+ *
2507
+ * **Where it starts.** A press on the surface outside the editor (its
2508
+ * margin), or on the editor's own box between and below its blocks — never
2509
+ * on a block: a press on text is the text's, and a drag across lines stays a
2510
+ * text selection, as email users expect. Nor on a control of the surface's,
2511
+ * a scrollbar, or with a modifier held. The press is kept from the browser
2512
+ * and ProseMirror alike (no caret jump, no native selection), so a press
2513
+ * released in place is placed here: the caret at the nearest spot in the
2514
+ * text, as a click in the margin of a page puts it in Google Docs.
2515
+ *
2516
+ * **While it drags.** The box is a `div` ({@link BLOCK_MARQUEE_CLASS}) in the
2517
+ * canvas — the surface, unless the host gives a larger one — against the
2518
+ * pointer, clipped to the canvas's viewport, so it may reach over whatever
2519
+ * frames the editor; held near the scroller's edge (or past it) it scrolls,
2520
+ * and the box keeps its origin in the content. Each move hit-tests the
2521
+ * top-level blocks' boxes (the one measured thing — a box drawn by a pointer
2522
+ * has no other geometry) against what the box covers of the surface, and
2523
+ * selects the run it touches; touching none, the selection the press found
2524
+ * comes back. Only blocks are ever selected, wherever the box reaches.
2525
+ * Escape cancels the drag.
2526
+ */
2527
+ declare const createBlockMarquee: (options?: BlockMarqueeOptions) => FunctionalExtension;
2528
+ /**
2529
+ * Starts the editor's marquee from a press anywhere else — a start point of
2530
+ * the host's own: the room beside a page's text column, the empty room round
2531
+ * a form — as Notion lets a drag start in a page's margins. The host decides
2532
+ * the press is one (its own empty room, not a control); from there it is the
2533
+ * surface's gesture in every way: the box on the canvas, the blocks it
2534
+ * covers of the surface, the scroll, Escape. Released in place it puts no
2535
+ * caret on a line (only the editor's own room does) — it only lets selected
2536
+ * blocks go, as any press outside the editor does.
2537
+ *
2538
+ * Call it from the start point's `mousedown`. It returns whether the box
2539
+ * started (and then took the press: `preventDefault`); `false` without
2540
+ * {@link createBlockMarquee} in the editor, while one is already drawn, in a
2541
+ * read-only editor, and for a press that is not a plain primary one (another
2542
+ * button, a double click, a modifier held).
2543
+ */
2544
+ declare function beginBlockMarquee(view: EditorView, event: MouseEvent): boolean;
2545
+
2204
2546
  /**
2205
2547
  * Email data tables: a real `<table>` (the most client-compatible layout there
2206
2548
  * is), driven by **prosemirror-tables** — the same model Tiptap and friends
@@ -2576,15 +2918,31 @@ declare const findListDepth: ($from: ResolvedPos) => number | null;
2576
2918
  * or converts the list in place when it is of the other flavour.
2577
2919
  */
2578
2920
  declare const toggleList: (listType: NodeType, itemType: NodeType) => Command;
2921
+ /**
2922
+ * The layout list's toggle: wraps the selection in a layout list, makes the
2923
+ * list it is in one (either flavour, kept flush), or lifts out of it when it
2924
+ * is one already.
2925
+ */
2926
+ declare const toggleLayoutList: (listType: NodeType, itemType: NodeType) => Command;
2579
2927
  /**
2580
2928
  * Tiptap-inspired helper: Intercepts the default splitListItem transaction
2581
2929
  * and ensures marks (bold, italic, etc.) are carried over to the new list item.
2582
2930
  */
2583
2931
  declare const splitListItemKeepMarks: (itemType: NodeType) => Command;
2584
- /** The ledger's answer to the 40px-per-level default indent that eats a
2585
- third of a phone screen: a small explicit indent, no margins (lines carry
2586
- none). Nested lists compound 24px per level, readable at 320px. */
2587
- declare const LIST_STYLE = "margin: 0px; padding-left: 24px;";
2932
+ /** The space above and below a list: Gmail's own. */
2933
+ declare const LIST_SPACE = 12;
2934
+ /**
2935
+ * A list's canonical inline style. The indent is the ledger's answer to the
2936
+ * 40px-per-level default that eats a third of a phone screen: 24px, nested
2937
+ * lists compounding it, readable at 320px. A list keeps 12px above and below
2938
+ * — Gmail's spacing, the margins the schema writes besides a heading's
2939
+ * (positive px margins render in Gmail, Outlook's Word engine and Apple Mail
2940
+ * alike; where one meets a heading's or another list's, Outlook may add the
2941
+ * two, up to 12px past what a browser shows). A **layout** list sits flush,
2942
+ * `margin: 0`, spacing left to the layout around it — and so does every
2943
+ * nested list, which belongs to its item's line (see {@link listRepair}).
2944
+ */
2945
+ declare const listStyle: (layout?: boolean) => string;
2588
2946
  declare const ListItem: _h_k_dev_angular_email_editor.NodeExtension;
2589
2947
  declare const BulletList: _h_k_dev_angular_email_editor.NodeExtension;
2590
2948
  declare const OrderedList: _h_k_dev_angular_email_editor.NodeExtension;
@@ -3907,6 +4265,127 @@ interface SendIntentOptions {
3907
4265
  */
3908
4266
  declare const createSendIntent: (options: SendIntentOptions) => FunctionalExtension;
3909
4267
 
4268
+ /**
4269
+ * What an empty line is, as the placeholder words it — Notion's blocks that
4270
+ * carry words of their own, read from where the line stands:
4271
+ * - `'heading'` — a heading, any level.
4272
+ * - `'quote'` — a line directly in a blockquote.
4273
+ * - `'bulletList'` / `'orderedList'` — a list item's own line (its first).
4274
+ * - `'tableCell'` — a table cell.
4275
+ * - `'line'` — any other line: a paragraph, a column's, a section's.
4276
+ */
4277
+ type PlaceholderKind = 'line' | 'heading' | 'quote' | 'bulletList' | 'orderedList' | 'tableCell';
4278
+ /** An empty line the placeholder may speak on — what a function-form
4279
+ {@link PlaceholderText} is asked with. */
4280
+ interface PlaceholderLine {
4281
+ /** The empty textblock: a paragraph, a heading, a list item's line. */
4282
+ node: Node;
4283
+ /** Its position in the document. */
4284
+ pos: number;
4285
+ /** What it is — see {@link PlaceholderKind}. */
4286
+ kind: PlaceholderKind;
4287
+ /** Whether it is the whole document's only line — the body is empty. */
4288
+ docEmpty: boolean;
4289
+ state: EditorState;
4290
+ }
4291
+ /**
4292
+ * The words by what is empty, Notion's set. A block kind's words show on
4293
+ * every empty block of that kind, focused or not — an empty heading still
4294
+ * reads as a heading; `line` is the hint under the caret. A kind left out
4295
+ * (`undefined`) is a plain line and takes the hint; `''` leaves it bare.
4296
+ */
4297
+ interface PlaceholderWords {
4298
+ /** A plain line under the caret: Notion's "Type '/' for commands". */
4299
+ line?: string;
4300
+ /** The whole body while it is empty. Default {@link line}. */
4301
+ empty?: string;
4302
+ /** A heading — one string for every level, or one per level (index 0 is
4303
+ level 1; a level past the end takes the last). */
4304
+ heading?: string | readonly string[];
4305
+ /** A line in a quote: Notion's "Empty quote". */
4306
+ quote?: string;
4307
+ /** A bulleted list item: Notion's "List". */
4308
+ bulletList?: string;
4309
+ /** A numbered list item: Notion's "List". */
4310
+ orderedList?: string;
4311
+ /** A table cell — Notion's cells say nothing, so `''` follows it. */
4312
+ tableCell?: string;
4313
+ /** An image with no file yet: Notion's "Add an image". The frame keeps
4314
+ its own words without it. */
4315
+ image?: string;
4316
+ }
4317
+ /**
4318
+ * The words on an empty line:
4319
+ * - a string — the hint under the caret, the same words everywhere: what a
4320
+ * host's template hands in through its translate pipe.
4321
+ * - {@link PlaceholderWords} — words by kind, Notion's way. Build it once per
4322
+ * language (a `computed`), never per line.
4323
+ * - a function of the line — anything else; asked for each empty line when
4324
+ * it changes. Its words on a block kind show always, on a plain line under
4325
+ * the caret; `null` or `''` leaves the line bare.
4326
+ */
4327
+ type PlaceholderText = string | PlaceholderWords | ((line: PlaceholderLine) => string | null | undefined);
4328
+ interface PlaceholderOptions {
4329
+ /** The words — see {@link PlaceholderText}. Replaced later with the
4330
+ `setPlaceholder` command, which is how a host follows a language
4331
+ switch. Default none: the editor shows nothing until it is given words. */
4332
+ text?: PlaceholderText;
4333
+ /**
4334
+ * Which plain empty lines show the hint, while the editor is editable:
4335
+ * - `'caret'` (default) — the one the caret is on, while the editor has
4336
+ * focus: Notion's. Moving on hides it.
4337
+ * - `'all'` — every empty line, focused or not.
4338
+ *
4339
+ * A block kind with words of its own shows them either way, and an empty
4340
+ * body shows its words on its one line, focused or not: the field says
4341
+ * what it is for, as a textarea's placeholder does.
4342
+ */
4343
+ show?: 'caret' | 'all';
4344
+ }
4345
+ interface PlaceholderState {
4346
+ text: PlaceholderText | undefined;
4347
+ /** What shows without the caret: block kinds, every line under `'all'`,
4348
+ an empty body, image frames. Kept across transactions and redone only
4349
+ where the document changed — the caret's hint is added per draw. */
4350
+ set: DecorationSet;
4351
+ }
4352
+ declare const placeholderKey: PluginKey<PlaceholderState>;
4353
+ /** Replaces the placeholder's words — every empty line redraws at once.
4354
+ Nothing enters the undo history. */
4355
+ declare const setPlaceholder: (text: PlaceholderText | undefined) => Command;
4356
+ /**
4357
+ * A placeholder on empty lines, Notion's way: the line the caret is on says
4358
+ * what can be done there ("Type / for commands") and the hint goes as soon as
4359
+ * a character is typed or the caret moves on, while an empty block of a kind
4360
+ * says what it is ("Heading 1", "List", "Empty quote") wherever the caret is.
4361
+ * Nothing of it is in the document — a node decoration puts a class and the
4362
+ * words on the line:
4363
+ *
4364
+ * <div class="aee-placeholder" data-placeholder="Type / for commands">
4365
+ *
4366
+ * and the host's stylesheet paints them (`content: attr(data-placeholder)`),
4367
+ * so the look stays the host's. An empty body is also marked with
4368
+ * `aee-placeholder-doc`, and the editable element carries the words as
4369
+ * `aria-placeholder`, so a screen reader hears what the field is for. An
4370
+ * image waiting for its file gets its words through a node decoration whose
4371
+ * spec carries `placeholder`, which the image's node view puts in its frame.
4372
+ *
4373
+ * The words are the host's, in its language — the library words nothing.
4374
+ * Hand them in as {@link PlaceholderOptions.text} and replace them with the
4375
+ * `setPlaceholder` command whenever they change:
4376
+ *
4377
+ * effect(() => editor.commands.setPlaceholder(this.placeholders()));
4378
+ *
4379
+ * Typing costs only the lines it touched: the decorations live in the
4380
+ * plugin's state, mapped through each change and redone where it landed;
4381
+ * new words redo them once.
4382
+ *
4383
+ * Code lines never show it: an empty line of source is just that. Neither
4384
+ * does a read-only editor (an image frame keeps its words), nor the line
4385
+ * mid-composition (an IME's text is not in the document yet).
4386
+ */
4387
+ declare const createPlaceholder: (options?: PlaceholderOptions) => FunctionalExtension;
4388
+
3910
4389
  /**
3911
4390
  * Fills the document's placeholders in with their values — the step a CRM
3912
4391
  * runs before a templated mail goes out ("Platzhalter einsetzen").
@@ -4051,5 +4530,5 @@ declare class InlineImages extends InlineImageStore {
4051
4530
  static ɵprov: i0.ɵɵInjectableDeclaration<any>;
4052
4531
  }
4053
4532
 
4054
- export { AUTHORED_ATTR, AUTHORED_SPEC_KEY, AUTHORED_STYLE_DEFAULTS_KEY, AuthoredEnter, BLOCKQUOTE_STYLE, BLOCK_MENU_FOCUS_KEY, BUTTON_FILL, BUTTON_STYLE, BaseKeymap, Blockquote, Bold, BulletList, Button, CARET_ROOM, CLIENT_LABELS, COLUMN_STARTING_LINES, COMMENT_TAG, CONTENT_ATTRS, CSS_SUPPORT, ClearFormatting, CodeLine, CodeLineIndent, Column, ColumnResize, Columns, ColumnsResize, DOCUMENT_CLASS, DOCUMENT_TAGS, DUAL_BACKGROUND_MIN_RATIO, DUAL_CONTRAST_DARK, DUAL_CONTRAST_LIGHT, DUAL_CONTRAST_MIN_RATIO, Divider, Document$1 as Document, DocumentStyles, EMAIL_ATTRIBUTES, EMAIL_CSS_PROPERTIES, EMAIL_SAFE_STYLE_PROPERTIES, EMAIL_SAFE_TAGS, EMAIL_TAGS, EMAIL_TAG_ATTRIBUTES, EmailParagraph, FILE_CHOOSER_POINTER_WAIT, FILL_TEXT_COLOR, FILL_TEXT_COLOR_LIGHT, FILL_TEXT_COLOR_RGB, FOLD_WIDTH, FORMAT_WIDTH, GMAIL_CLIP_BYTES, GUIDES_ACTIVE_CLASS, GUIDES_PEEK_CLASS, GUIDES_PEEK_DELAY_MS, Gapcursor, HEADING_SIZES, HardBreak, Heading, History, HtmlComment, HtmlCommentInline, HtmlElement, HtmlInline, HtmlLanguage, HtmlRaw, HtmlTextElement, HtmlVoid, HtmlVoidBlock, IMPORT_VIEWPORT_WIDTH, INDENT_MAX, INDENT_STEP, INLINE_TAGS, INLINE_VOID_TAGS, IN_SELECTION_CLASS, Image, InlineAtomSelection, InlineImageStore, InlineImages, Italic, LIST_STYLE, LayoutGuides, Link, ListItem, MAX_COLUMNS, MAX_IMAGE_WIDTH, MAX_MERGE_TAG_LENGTH, MAX_UNBROKEN_RUN, MIN_COLUMN_CAP, MIN_COLUMN_PCT, MIN_FONT_SIZE, MIN_IMAGE_WIDTH, MIN_TABLE_PCT, MJML_WORLDLY_HTML, MergeTag, NoTextDrag, OrderedList, PARSE_SCOPE_KEY, PLACEHOLDER_WIDTH, Paragraph, PasteHygiene, QuotedHistory, REFUSED_TAGS, RENDERING_CLIENTS, SECTION_CONTENT_MAX, SECTION_INSET, SECTION_PADDING, STACK_CLASS, STACK_RULE, Section, SplitKeepingMarks, TABLE_BLOCK_SPACING, TABLE_BORDER_COLOR, TABLE_CELL_PADDING, TABLE_SECTION_TAGS, TYPING_REST, Table, TableCell, TableRow, Text, TextStyle, UNSET_BUTTON_HREF, Underline, VOID_TAGS, acceptProposal, addColumn, addColumnAtEnd, addRowAtEnd, analyzeAngularExpression, angularDialect, angularRequiredFields, appendColumn, applyAuthoredAttributes, applyEmailVocabulary, attributeString, authoredAttribute, authoredMarkupOf, authoredViewAttributes, bareButtons, buttonStyle, canonicalHead, canonicalMergeTagInner, canonicalRender, caretCellPos, caretInsideMergeTag, claimedImageFiles, clearCells, clientList, columnCaps, columnWidths, completionContextAt, containerStyle, contrastRatio, correctStoredMistakes, createAngularExpressions, createBlockMenu, createBubbleMenu, createButtonEdit, createContentProposal, createContentStream, createDOMParser, createEditor, createHtmlAutocomplete, createHtmlLanguage, createImageDrag, createInlineImages, createMergeTagResolution, createOffsetMapper, createQuotedHistory, createSchema, createSendIntent, createSourceMarks, createSuggestionMenu, createTableHandles, declarationProperty, declaredBackground, decodeDataUrl, defaultBubbleShouldShow, defineExtension, defineMark, defineNode, deleteColumns, deleteFullySelected, discardProposal, distributePadding, docText, dropDeadOfficeClasses, dropHidden, dropMediaQueries, dropZeroSizedWhitespace, duplicateColumn, duplicateRow, editQuotedHistory, effectiveWidths, emailBackgroundPalette, emailDocument, emailExtensions, emailPlainText, emailSizeBudget, emailTextPalette, embedsAsLinks, entitySpans, escapeAttribute, escapeText, expressionDialect, expressionDialectKey, extensionActions, extensionSuggestions, fillTextColor, filledPlaceholderAttrs, filterEmailStyle, findColumnContext, findColumnsContext, findCssIssues, findListDepth, findSectionContext, findTableContext, fitImageWidth, foldHTML, formatHTML, formatPct, forwardDocument, forwardQuote, hasBlockChildren, hasDocumentEnvelope, headingStyle, holdsBlock, holdsColumn, hrefProblem, htmlSourceExtensions, imageDropTarget, importLoss, importedDocument, inheritTextStyles, inheritedMarkup, inlineBootstrapTableBorders, inlineImageCids, inlineImageRegistry, inlineImagesKey, inlineStyles, insertHTML, insertMergeTag, isActionEnabled, isBlock, isBlockLevel, isBlockish, isBooleanAttribute, isEmailAttribute, isEmailCssProperty, isEmailTag, isFillTextColor, isInlineAtom, isMarkActive, isMergeTagExpression, isMergeTagPath, isNodeActive, isPadded, isProposing, isQuotedHistoryFolded, isSafeColor, isSafeFontFamily, isSafeFontSize, isSafeUrl, isSectionImageUrl, isStreaming, italicStarInputRegex, italicStarPasteRegex, italicUnderscoreInputRegex, italicUnderscorePasteRegex, keepGmailRules, layoutBlockAt, linkClickPlugin, linkPastePlugin, linkRangeAt, lintHTML, lowerInlinesAroundBlocks, markAttrsOf, markStackingColumns, marksAcrossBreak, materializeComments, measureMenuPlacement, mediaMatches, mergeTagAt, mergeTagExpressions, mergeTagFields, mergeTagRanges, mergeTagResolutionPending, moveColumn, moveRow, normalizeCommentText, normalizeCss, normalizeHref, normalizeMergeTagText, noteOwnWidths, openFileChooser, openTag, openTags, outlookColumns, paddingOf, pagedSource, parseAngularExpression, parseDocument, parseFontFamily, parseFontSize, parseHTML, parsePadding, parseRules, parseTextTransform, passesDualBackground, passesDualContrast, preserveExtensions, preservedAttributes, promoteInlineImages, promoteMergeTags, proposalRange, proposeContent, quotedHistory, readEnvelope, readImageFile, realizeComments, relativeLuminance, removeColumn, removeLastColumn, removeQuotedHistory, renderForClient, renderedPath, repairLinkSchemes, repairTables, replaceHTML, replyDocument, replyEnvelope, replyQuote, reviseProposal, rewriteInlineImageSources, richTextExtensions, ruleForScope, ruleScope, sanitizePastedHTML, scanHTML, scanMergeTags, scopeOf, scopedDocumentCss, selectColumn, selectRow, selectedButton, selectedImage, selectedImageAlt, selectedMarkAtom, selectionInsideMergeTag, serializeDocument, serializeToHTML, setCellBackground, setColumnBackground, setColumnBoundary, setColumnsBoundary, setQuotedHistory, setSectionBackground, setSectionImage, setTableBox, setTableWidth, soleInlineAtom, splitDeclarations, splitListItemKeepMarks, starInputRegex, starPasteRegex, stopProposal, streamContent, streamedRange, streamingRange, suggestionSectionTitles, tableStyle, textOffsetAt, textRegions, toEmailSafeColor, toInboundMessage, toggleList, trimInlineBoxes, underscoreInputRegex, underscorePasteRegex, unwrapLayoutTables, unwrapOfficeParagraphMarks, verbatimElement, videoPage, watchMenuScroll, withAttribute, withAuthoredMarkup, withQuoted, withQuotedHistory, withStyleDeclaration, withoutAttribute, withoutStyleDeclaration };
4055
- export type { AngularExpressionsOptions, AngularNode, AttributePairs, AuthoredElement, AuthoredMarkup, AutocompleteItem, AutocompleteOptions, AutocompleteState, BlockMenuOptions, BlockMenuState, BubbleMenuOptions, BubbleMenuState, ButtonEditOptions, ButtonEditTarget, CellAlignment, CellVerticalAlignment, ClientRenderingOptions, CommandFactory, CompletionContext, ComposeSeedLabels, ComposeSeedOptions, ContentProposalOptions, ContentProposalState, ContentStreamOptions, ContentStreamRange, ContentStreamReveal, ContentStreamRun, ContentStreamState, ContentStreamWriter, CssSupportIssue, DocumentEnvelope, Editor, EditorAction, EditorOptions, EmailClient, EmailDocumentOptions, ExpressionDiagnostic, ExpressionDialect, ExpressionIssue, Extension, ExtensionContext, FunctionalExtension, HrefProblem, HtmlDiagnostic, HtmlLanguageOptions, HtmlScan, HtmlTag, HtmlToken, HtmlTokenType, ImageAttrs, ImageDragOptions, ImageDropTarget, ImportLoss, InboundMessage, InlineAtomAt, InlineImage, InlineImageRegistry, InlineImageStoreOptions, LayoutBlock, LayoutBlockType, LinkAttrs, LinkRange, ListedSuggestion, MarkExtension, MenuAnchor, MenuPlacement, MenuScroll, MenuScrollApi, MergeTagRange, MergeTagResolutionOptions, MergeTagResolutionReport, NodeExtension, PagedSourceOptions, PaletteColor, ParagraphAlignment, ParseMode, ParseOptions, ParsedAddressLike, ParsedEmailLike, PromotedInlineImages, QuotedHistoryLabel, QuotedHistoryLabels, QuotedHistoryOptions, RenderingClient, ReplyEnvelope, ReplyEnvelopeOptions, ReplyKind, RuleScope, SendIntent, SendIntentOptions, SizeBudget, SourceMarksOptions, SourceOptions, StreamContentOptions, SuggestionAllowProps, SuggestionCommandItem, SuggestionFrom, SuggestionGroup, SuggestionItem, SuggestionItemLabel, SuggestionMenuOptions, SuggestionMenuState, SuggestionPage, SuggestionPageRequest, SuggestionRect, SuggestionRequest, SuggestionSource, SuggestionTrigger, TableHandleTarget, TableHandlesOptions, TableKind, TextTransform };
4533
+ export { AUTHORED_ATTR, AUTHORED_SPEC_KEY, AUTHORED_STYLE_DEFAULTS_KEY, AuthoredEnter, BLOCKQUOTE_STYLE, BLOCK_MARQUEE_CLASS, BLOCK_MENU_FOCUS_KEY, BLOCK_RELEASING_CLASS, BLOCK_SELECTED_CLASS, BUTTON_FILL, BUTTON_STYLE, BaseKeymap, BlockSelection, Blockquote, Bold, BulletList, Button, CARET_ROOM, CLIENT_LABELS, COLOR_SCHEME_META, COLOR_SCHEME_RULE, COLUMN_STARTING_LINES, COMMENT_TAG, CONTENT_ATTRS, CSS_SUPPORT, ClearFormatting, CodeLine, CodeLineIndent, Column, ColumnResize, Columns, ColumnsResize, DARK_FILL_CLASS, DARK_MODE_SURFACES, DARK_TEXT_CLASS, DOCUMENT_CLASS, DOCUMENT_TAGS, DUAL_BACKGROUND_MIN_RATIO, DUAL_CONTRAST_DARK, DUAL_CONTRAST_LIGHT, DUAL_CONTRAST_MIN_RATIO, Divider, Document$1 as Document, DocumentStyles, EMAIL_ATTRIBUTES, EMAIL_CSS_PROPERTIES, EMAIL_SAFE_STYLE_PROPERTIES, EMAIL_SAFE_TAGS, EMAIL_TAGS, EMAIL_TAG_ATTRIBUTES, EmailParagraph, FILE_CHOOSER_POINTER_WAIT, FILL_TEXT_COLOR, FILL_TEXT_COLOR_LIGHT, FILL_TEXT_COLOR_RGB, FOLD_WIDTH, FORMAT_WIDTH, GMAIL_CLIP_BYTES, GUIDES_ACTIVE_CLASS, GUIDES_PEEK_CLASS, GUIDES_PEEK_DELAY_MS, Gapcursor, HEADING_LEVELS, HEADING_SIZES, HEADING_SPACE_ABOVE, HEADING_SPACE_BELOW, HardBreak, Heading, History, HtmlComment, HtmlCommentInline, HtmlElement, HtmlInline, HtmlLanguage, HtmlRaw, HtmlTextElement, HtmlVoid, HtmlVoidBlock, IMPORT_VIEWPORT_WIDTH, INDENT_MAX, INDENT_STEP, INLINE_TAGS, INLINE_VOID_TAGS, IN_SELECTION_CLASS, Image, InlineAtomSelection, InlineImageStore, InlineImages, Italic, LIST_SPACE, LayoutGuides, Link, ListItem, MAX_COLUMNS, MAX_IMAGE_WIDTH, MAX_MERGE_TAG_LENGTH, MAX_UNBROKEN_RUN, MIN_COLUMN_CAP, MIN_COLUMN_PCT, MIN_FONT_SIZE, MIN_IMAGE_WIDTH, MIN_TABLE_PCT, MJML_WORLDLY_HTML, MergeTag, NoTextDrag, OrderedList, PARSE_SCOPE_KEY, PLACEHOLDER_WIDTH, Paragraph, PasteHygiene, QuotedHistory, REFUSED_TAGS, RENDERING_CLIENTS, SECTION_CONTENT_MAX, SECTION_INSET, SECTION_PADDING, STACK_CLASS, STACK_RULE, Section, SelectedBlocks, SplitKeepingMarks, TABLE_BLOCK_SPACING, TABLE_BORDER_COLOR, TABLE_CELL_PADDING, TABLE_SECTION_TAGS, TYPING_REST, Table, TableCell, TableRow, Text, TextStyle, UNSET_BUTTON_HREF, Underline, VOID_TAGS, acceptProposal, addColumn, addColumnAtEnd, addRowAtEnd, analyzeAngularExpression, angularDialect, angularRequiredFields, appendColumn, applyAuthoredAttributes, applyEmailVocabulary, attributeString, authoredAttribute, authoredMarkupOf, authoredViewAttributes, bareButtons, beginBlockMarquee, buttonStyle, canonicalHead, canonicalMergeTagInner, canonicalRender, caretCellPos, caretInsideMergeTag, claimedImageFiles, clearCells, clientList, columnCaps, columnWidths, completionContextAt, containerStyle, contrastRatio, correctStoredMistakes, createAngularExpressions, createBlockMarquee, createBlockMenu, createBubbleMenu, createButtonEdit, createContentProposal, createContentStream, createDOMParser, createEditor, createHtmlAutocomplete, createHtmlLanguage, createImageDrag, createInlineImages, createMergeTagResolution, createOffsetMapper, createPlaceholder, createQuotedHistory, createSchema, createSendIntent, createSourceMarks, createSuggestionMenu, createTableHandles, cssColorToHex, darkModeEditorCss, declarationProperty, declaredBackground, decodeDataUrl, defaultBubbleShouldShow, defineExtension, defineMark, defineNode, deleteColumns, deleteFullySelected, discardProposal, distributePadding, docText, dropDeadOfficeClasses, dropHidden, dropMediaQueries, dropZeroSizedWhitespace, duplicateColumn, duplicateRow, editQuotedHistory, effectiveWidths, emailBackgroundPalette, emailDarkModePalette, emailDocument, emailExtensions, emailPlainText, emailSizeBudget, emailTextPalette, embedsAsLinks, entitySpans, escapeAttribute, escapeText, expressionDialect, expressionDialectKey, extensionActions, extensionSuggestions, fillTextColor, filledPlaceholderAttrs, filterEmailStyle, findColumnContext, findColumnsContext, findCssIssues, findListDepth, findSectionContext, findTableContext, fitImageWidth, foldHTML, formatHTML, formatPct, forwardDocument, forwardQuote, hasBlockChildren, hasDocumentEnvelope, headingStyle, holdsBlock, holdsColumn, hrefProblem, htmlSourceExtensions, imageDropTarget, importLoss, importedDocument, inheritTextStyles, inheritedMarkup, inlineBootstrapTableBorders, inlineImageCids, inlineImageRegistry, inlineImagesKey, inlineStyles, insertHTML, insertMergeTag, isActionEnabled, isBlock, isBlockLevel, isBlockish, isBooleanAttribute, isEmailAttribute, isEmailCssProperty, isEmailTag, isFillTextColor, isInlineAtom, isMarkActive, isMergeTagExpression, isMergeTagPath, isNodeActive, isPadded, isProposing, isQuotedHistoryFolded, isSafeColor, isSafeFontFamily, isSafeFontSize, isSafeUrl, isSectionImageUrl, isStreaming, italicStarInputRegex, italicStarPasteRegex, italicUnderscoreInputRegex, italicUnderscorePasteRegex, keepGmailRules, layoutBlockAt, linkClickPlugin, linkPastePlugin, linkRangeAt, lintHTML, listStyle, lowerInlinesAroundBlocks, markAttrsOf, markDarkMode, markStackingColumns, marksAcrossBreak, materializeComments, measureMenuPlacement, mediaMatches, mergeTagAt, mergeTagExpressions, mergeTagFields, mergeTagRanges, mergeTagResolutionPending, moveColumn, moveRow, normalizeCommentText, normalizeCss, normalizeHref, normalizeMergeTagText, noteOwnWidths, openFileChooser, openTag, openTags, outlookColumns, paddingOf, pagedSource, parseAngularExpression, parseDocument, parseFontFamily, parseFontSize, parseHTML, parsePadding, parseRules, parseTextTransform, passesDualBackground, passesDualContrast, placeholderKey, plainTextExtensions, plainTextHTML, preserveExtensions, preservedAttributes, promoteInlineImages, promoteMergeTags, proposalRange, proposeContent, quotedHistory, readEnvelope, readImageFile, realizeComments, relativeLuminance, releaseBlockSelection, removeColumn, removeLastColumn, removeQuotedHistory, renderForClient, renderedPath, repairLinkSchemes, repairTables, replaceHTML, replyDocument, replyEnvelope, replyQuote, resolveColorScheme, reviseProposal, rewriteInlineImageSources, richTextExtensions, ruleForScope, ruleScope, sanitizePastedHTML, scanHTML, scanMergeTags, scopeOf, scopedDocumentCss, selectColumn, selectRow, selectedButton, selectedImage, selectedImageAlt, selectedMarkAtom, selectionInsideMergeTag, serializeDocument, serializeToHTML, setCellBackground, setColumnBackground, setColumnBoundary, setColumnsBoundary, setPlaceholder, setQuotedHistory, setSectionBackground, setSectionImage, setTableBox, setTableWidth, soleInlineAtom, splitDeclarations, splitListItemKeepMarks, starInputRegex, starPasteRegex, stopProposal, streamContent, streamedRange, streamingRange, suggestionSectionTitles, tableStyle, textOffsetAt, textRegions, toEmailSafeColor, toInboundMessage, toggleLayoutList, toggleList, trimInlineBoxes, underscoreInputRegex, underscorePasteRegex, unwrapLayoutTables, unwrapOfficeParagraphMarks, verbatimElement, videoPage, watchMenuScroll, withAttribute, withAuthoredMarkup, withQuoted, withQuotedHistory, withStyleDeclaration, withoutAttribute, withoutStyleDeclaration };
4534
+ export type { AngularExpressionsOptions, AngularNode, AttributePairs, AuthoredElement, AuthoredMarkup, AutocompleteItem, AutocompleteOptions, AutocompleteState, BlockMarqueeOptions, BlockMenuOptions, BlockMenuState, BubbleMenuOptions, BubbleMenuState, ButtonEditOptions, ButtonEditTarget, CellAlignment, CellVerticalAlignment, ClientRenderingOptions, CommandFactory, CompletionContext, ComposeSeedLabels, ComposeSeedOptions, ContentProposalOptions, ContentProposalState, ContentStreamOptions, ContentStreamRange, ContentStreamReveal, ContentStreamRun, ContentStreamState, ContentStreamWriter, CssSupportIssue, DarkModeMarking, DarkModePalette, DocumentEnvelope, Editor, EditorAction, EditorOptions, EmailClient, EmailDocumentOptions, ExpressionDiagnostic, ExpressionDialect, ExpressionIssue, Extension, ExtensionContext, FunctionalExtension, HrefProblem, HtmlDiagnostic, HtmlLanguageOptions, HtmlScan, HtmlTag, HtmlToken, HtmlTokenType, ImageAttrs, ImageDragOptions, ImageDropTarget, ImportLoss, InboundMessage, InlineAtomAt, InlineImage, InlineImageRegistry, InlineImageStoreOptions, LayoutBlock, LayoutBlockType, LinkAttrs, LinkRange, ListedSuggestion, MarkExtension, MenuAnchor, MenuPlacement, MenuScroll, MenuScrollApi, MergeTagRange, MergeTagResolutionOptions, MergeTagResolutionReport, NodeExtension, PagedSourceOptions, PaletteColor, ParagraphAlignment, ParseMode, ParseOptions, ParsedAddressLike, ParsedEmailLike, PlaceholderKind, PlaceholderLine, PlaceholderOptions, PlaceholderText, PlaceholderWords, PromotedInlineImages, QuotedHistoryLabel, QuotedHistoryLabels, QuotedHistoryOptions, RenderingClient, ReplyEnvelope, ReplyEnvelopeOptions, ReplyKind, RuleScope, SendIntent, SendIntentOptions, SizeBudget, SourceMarksOptions, SourceOptions, StreamContentOptions, SuggestionAllowProps, SuggestionCommandItem, SuggestionFrom, SuggestionGroup, SuggestionItem, SuggestionItemLabel, SuggestionMenuOptions, SuggestionMenuState, SuggestionPage, SuggestionPageRequest, SuggestionRect, SuggestionRequest, SuggestionSource, SuggestionTrigger, TableHandleTarget, TableHandlesOptions, TableKind, TextTransform };