@hyper-elements/react 0.3.0 → 0.3.1

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.
@@ -30,10 +30,52 @@ interface Node {
30
30
  /** A string is text, where the parent takes text. */
31
31
  type Child = Node | string;
32
32
 
33
+ /**
34
+ * The email clients Elements checks an Email for. Four were captured showing Elements 0.3.0 emails they weren't tuned
35
+ * on (unlayer/email-renderer), which says how closely each is measured; what's known of the rest is from caniemail's
36
+ * tables (caniemail.com, MIT), which test the CSS and HTML each client keeps. Either way a problem is said at its own
37
+ * severity; only one Elements assumes, unchecked, is a note.
38
+ */
39
+
40
+ type EmailClient = "outlook" | "outlook-com" | "outlook-mac" | "outlook-app" | "gmail" | "gmail-app" | "gmail-app-other" | "apple-mail" | "yahoo" | "aol" | "samsung-email" | "thunderbird" | "protonmail" | "fastmail" | "hey" | "gmx" | "web-de" | "orange" | "sfr" | "laposte" | "free-fr" | "t-online-de" | "mail-ru" | "ionos" | "wp-pl" | "rainloop";
41
+ interface EmailClientMeasurement {
42
+ /** The Elements version whose emails were captured. */
43
+ elements: string;
44
+ /** The client captured. */
45
+ against: string;
46
+ /** When (an ISO date). */
47
+ captured: string;
48
+ /** Of the words in emails it wasn't tuned on, the share a model of the client draws within 4px of the client. */
49
+ wordsWithin4px: number;
50
+ /** Of neighbouring word pairs, the share on the same line, or on different lines, in both. */
51
+ lineBreaks: number;
52
+ }
53
+ interface EmailClientInfo {
54
+ name: string;
55
+ /** The widths it shows an email at, where it's been measured. */
56
+ widths: {
57
+ desktop?: number;
58
+ phone?: number;
59
+ };
60
+ /** Whether its dark mode was measured. */
61
+ dark: boolean;
62
+ /** Whether its model is an approximation (words placed within 4px well short of all of them). */
63
+ approximate: boolean;
64
+ /** Its captures; null where what's known of it is caniemail's. */
65
+ measured: EmailClientMeasurement | null;
66
+ }
67
+ declare const EMAIL_CLIENTS: Readonly<Record<EmailClient, EmailClientInfo>>;
68
+ /**
69
+ * What's checked when no clients are named: the ones most email is read in (the four captured, the Gmail and Outlook
70
+ * apps, Outlook for Mac, Yahoo, AOL and Samsung Email). The others only when named.
71
+ */
72
+ declare const DEFAULT_EMAIL_CLIENTS: readonly EmailClient[];
73
+
33
74
  /**
34
75
  * What validation, resolution and conversion found: one list, each entry
35
76
  * naming the node (by id where it has one) and the path to the value.
36
77
  */
78
+
37
79
  type Severity = "error" | "warning" | "info";
38
80
  interface Diagnostic {
39
81
  /** Stable, for tools to match on: "prop/unknown", "layout/overflow", … */
@@ -44,8 +86,14 @@ interface Diagnostic {
44
86
  path: string;
45
87
  /** The node's id, once it has one. */
46
88
  nodeId?: string;
89
+ /** The email clients it's about; absent: every email, never left out by `emailClients`. */
90
+ clients?: EmailClient[];
91
+ /** What to change. */
92
+ fix?: string;
93
+ /** Where to see it: for a problem known from caniemail's tables, its page there. */
94
+ see?: string;
47
95
  }
48
- /** One line per diagnostic, for error messages and logs. */
96
+ /** One line per diagnostic, for error messages and logs: with the email clients it's about, what to change and how to see it, where it says. */
49
97
  declare function formatDiagnostics(diagnostics: readonly Diagnostic[]): string;
50
98
  /** Thrown where a template with errors can't be rendered (`validate()` lists the problems without throwing). */
51
99
  declare class ElementsError extends Error {
@@ -78,6 +126,8 @@ interface Kind<In = unknown, Out extends Json = Json> {
78
126
  /** What it accepts, in words (for messages and descriptions). */
79
127
  readonly accepts: string;
80
128
  parse(input: unknown): Parsed<Out>;
129
+ /** Whether a value it parsed sets nothing (`breakpoints={{}}`): the prop is then left out, as if not given. */
130
+ empty?(value: Out): boolean;
81
131
  jsonSchema(): JsonSchema;
82
132
  /** Type only: what it accepts as input. */
83
133
  readonly __in?: In;
@@ -196,11 +246,20 @@ type LinkValue = string | {
196
246
  type Category = "root" | "section" | "layout" | "block" | "inline" | "shape";
197
247
  /** The outputs Elements renders. */
198
248
  type Target = "email" | "web" | "print" | "pdf" | "image";
249
+ /** The roots a template can have: each decides the output (`render()` writes an Email's HTML, a Page's, …). */
250
+ type RootName = "Email" | "Page" | "Document" | "Canvas";
251
+ /** What a style is about, for the guide and `describeComponents()`: the group it's listed in. */
252
+ type StyleGroup = "Layout" | "Size" | "Position" | "Spacing" | "Typography" | "Background" | "Border" | "Effects";
199
253
  interface PropSpec<K extends Kind<any, any> = Kind<any, any>, R extends boolean = boolean> {
200
254
  kind: K;
201
255
  required?: R;
202
256
  label: string;
203
257
  description?: string;
258
+ /**
259
+ * The roots it may be given under (default: every root its component goes in). Under another root it's a
260
+ * `prop/not-supported` error naming these.
261
+ */
262
+ roots?: readonly RootName[];
204
263
  /** Used where the prop isn't given (not written into the document). */
205
264
  default?: OutputOf<K>;
206
265
  /** Editors may change it (default true). */
@@ -215,17 +274,20 @@ type SupportByTarget = Partial<Record<Target, Support | readonly Support[]>>;
215
274
  * real classic Outlook for Windows; caniemail's client tables
216
275
  * (caniemail.com); the output's writer itself, which turns it into markup the
217
276
  * output shows (checked in Chromium, for email with and without <style>, and
218
- * against a model of Outlook's layout built from those captures); CSS written
219
- * as is, which browsers show as asked; or assumed, not yet checked.
277
+ * against a model of Outlook's layout built from those captures); captures of
278
+ * Gmail, Outlook.com or Apple Mail; CSS written as is, which browsers show as
279
+ * asked; or assumed, not yet checked.
220
280
  */
221
- type SupportSource = "outlook-captures" | "caniemail" | "writer" | "css" | "assumed";
281
+ type SupportSource = "outlook-captures" | "gmail-captures" | "outlook-com-captures" | "apple-mail-captures" | "caniemail" | "writer" | "css" | "assumed";
222
282
  /**
223
283
  * How an output shows a style or prop, or some of its values (`values`, or
224
284
  * `when` the value, on a node with such props, is such): as asked (`full`); as asked but in classic
225
285
  * Outlook, which shows something else (`outlook`, email only: what it shows);
226
286
  * not quite as asked anywhere it's shown (`partial`: what it shows); or not at
227
287
  * all (`none`: what it does instead). Read by the support pass every output
228
- * runs: `outlook` and `partial` are notes, `none` a warning.
288
+ * runs: `outlook` and `partial` are notes, `none` a warning, whether the email
289
+ * clients it names were captured or are from caniemail's tables; one `assumed`
290
+ * is only ever a note.
229
291
  */
230
292
  type Support = {
231
293
  level: "full";
@@ -238,6 +300,12 @@ type Support = {
238
300
  props: Record<string, Json>;
239
301
  }) => boolean;
240
302
  source: SupportSource;
303
+ /** For email, the clients it's about (`outlook`: classic Outlook); absent, every email client. */
304
+ clients?: readonly EmailClient[];
305
+ /** caniemail's feature the clients are from (its slug), checked against its tables (test/caniemail.test.ts). */
306
+ feature?: string;
307
+ /** What to change. */
308
+ fix?: string;
241
309
  };
242
310
  interface StyleSpec<K extends Kind<any, any> = Kind<any, any>> {
243
311
  kind: K;
@@ -247,6 +315,13 @@ interface StyleSpec<K extends Kind<any, any> = Kind<any, any>> {
247
315
  inherited?: boolean;
248
316
  /** May be overridden on phones (`mobile`). */
249
317
  mobile?: boolean;
318
+ /**
319
+ * The roots it may be set under (default: every root its component goes in). Under another root it's a
320
+ * `style/not-supported` error naming these, in `style` and in its condition blocks alike.
321
+ */
322
+ roots?: readonly RootName[];
323
+ /** The group it's listed in; default: the group of its name (`STYLE_GROUP_OF`), as a style's name is CSS's. */
324
+ group?: StyleGroup;
250
325
  editable?: boolean;
251
326
  /** How each output shows it: required for every output its component renders to (a test checks). */
252
327
  support?: SupportByTarget;
@@ -287,7 +362,11 @@ type EditorGroup = {
287
362
  title: string;
288
363
  composite: CompositeEditor;
289
364
  };
290
- interface ComponentDefinition<P extends PropSpecs = PropSpecs, S extends StyleSpecs = StyleSpecs> {
365
+ /**
366
+ * A component's definition. `H` is its hover styles' keys: a definition made with `defineComponent()` keeps the list it
367
+ * gives (none: `readonly []`), so the types of its `style.hover` can be exactly those; the default is any of its styles.
368
+ */
369
+ interface ComponentDefinition<P extends PropSpecs = PropSpecs, S extends StyleSpecs = StyleSpecs, H extends readonly (keyof S & string)[] = readonly (keyof S & string)[]> {
291
370
  type: string;
292
371
  label: string;
293
372
  description: string;
@@ -306,7 +385,12 @@ interface ComponentDefinition<P extends PropSpecs = PropSpecs, S extends StyleSp
306
385
  }>;
307
386
  };
308
387
  /** Style keys that may be set for `hover`. */
309
- hover?: readonly (keyof S & string)[];
388
+ hover?: H;
389
+ /**
390
+ * Styles a condition takes on this component that an output doesn't show under it, by condition, style and
391
+ * output (a Page root's phone font size): reported when the template is expanded, before a Grid is arranged.
392
+ */
393
+ conditionSupport?: Partial<Record<"mobile" | "hover", Partial<Record<keyof S & string, SupportByTarget>>>>;
310
394
  children: ChildrenRule;
311
395
  /**
312
396
  * How wide it is where nothing sets its width: `stretch` fills its parent's
@@ -323,6 +407,16 @@ interface ComponentDefinition<P extends PropSpecs = PropSpecs, S extends StyleSp
323
407
  arrange?: (node: Node) => Node;
324
408
  /** Where it renders; a target left out is a diagnostic. */
325
409
  targets: Partial<Record<Target, TargetSupport>>;
410
+ /**
411
+ * The roots it may go in, of those whose output it renders to (default: every one whose children reach it). Under
412
+ * another such root it's the `notAllowed` error, by default `component/not-supported` naming these; under a root
413
+ * whose output it doesn't render to, it's `target/unsupported`, as for any component.
414
+ */
415
+ roots?: readonly RootName[];
416
+ notAllowed?: {
417
+ code: string;
418
+ message: (root: string) => string;
419
+ };
326
420
  /** Why a target it doesn't render can't, and what to do instead (in the diagnostic). */
327
421
  unsupported?: Partial<Record<Target, string>>;
328
422
  editor?: {
@@ -480,8 +574,11 @@ declare const Email$1: ComponentDefinition<{
480
574
  inherited: true;
481
575
  support: {
482
576
  email: {
483
- level: "full";
577
+ level: "outlook";
578
+ values: number[];
579
+ shows: string;
484
580
  source: "caniemail";
581
+ feature: string;
485
582
  };
486
583
  web: {
487
584
  level: "full";
@@ -559,8 +656,11 @@ declare const Email$1: ComponentDefinition<{
559
656
  inherited: true;
560
657
  support: {
561
658
  email: {
562
- level: "full";
563
- source: "assumed";
659
+ level: "outlook";
660
+ values: string[];
661
+ shows: string;
662
+ source: "caniemail";
663
+ feature: string;
564
664
  };
565
665
  web: {
566
666
  level: "full";
@@ -568,7 +668,7 @@ declare const Email$1: ComponentDefinition<{
568
668
  };
569
669
  };
570
670
  };
571
- }>;
671
+ }, readonly []>;
572
672
  declare const Page$1: ComponentDefinition<{
573
673
  readonly title: PropSpec<Kind<string, string>, false> & {
574
674
  default: undefined;
@@ -588,6 +688,15 @@ declare const Page$1: ComponentDefinition<{
588
688
  readonly description: PropSpec<Kind<string, string>, boolean> & {
589
689
  default: any;
590
690
  };
691
+ readonly breakpoints: PropSpec<Kind<{
692
+ mobile?: number;
693
+ }, {
694
+ mobile?: number;
695
+ } & {
696
+ [key: string]: Json;
697
+ }>, boolean> & {
698
+ default: any;
699
+ };
591
700
  }, {
592
701
  gap: {
593
702
  kind: Kind<LengthInput<"px">, number>;
@@ -687,8 +796,11 @@ declare const Page$1: ComponentDefinition<{
687
796
  inherited: true;
688
797
  support: {
689
798
  email: {
690
- level: "full";
799
+ level: "outlook";
800
+ values: number[];
801
+ shows: string;
691
802
  source: "caniemail";
803
+ feature: string;
692
804
  };
693
805
  web: {
694
806
  level: "full";
@@ -766,8 +878,11 @@ declare const Page$1: ComponentDefinition<{
766
878
  inherited: true;
767
879
  support: {
768
880
  email: {
769
- level: "full";
770
- source: "assumed";
881
+ level: "outlook";
882
+ values: string[];
883
+ shows: string;
884
+ source: "caniemail";
885
+ feature: string;
771
886
  };
772
887
  web: {
773
888
  level: "full";
@@ -775,7 +890,7 @@ declare const Page$1: ComponentDefinition<{
775
890
  };
776
891
  };
777
892
  };
778
- }>;
893
+ }, readonly []>;
779
894
  declare const Section$1: ComponentDefinition<{}, {
780
895
  readonly gap: {
781
896
  kind: Kind<LengthInput<"px">, number>;
@@ -904,8 +1019,11 @@ declare const Section$1: ComponentDefinition<{}, {
904
1019
  inherited: true;
905
1020
  support: {
906
1021
  email: {
907
- level: "full";
1022
+ level: "outlook";
1023
+ values: number[];
1024
+ shows: string;
908
1025
  source: "caniemail";
1026
+ feature: string;
909
1027
  };
910
1028
  web: {
911
1029
  level: "full";
@@ -983,8 +1101,11 @@ declare const Section$1: ComponentDefinition<{}, {
983
1101
  inherited: true;
984
1102
  support: {
985
1103
  email: {
986
- level: "full";
987
- source: "assumed";
1104
+ level: "outlook";
1105
+ values: string[];
1106
+ shows: string;
1107
+ source: "caniemail";
1108
+ feature: string;
988
1109
  };
989
1110
  web: {
990
1111
  level: "full";
@@ -992,7 +1113,7 @@ declare const Section$1: ComponentDefinition<{}, {
992
1113
  };
993
1114
  };
994
1115
  };
995
- }>;
1116
+ }, readonly []>;
996
1117
  declare const Row$1: ComponentDefinition<{
997
1118
  readonly dir: PropSpec<Kind<"ltr" | "rtl" | "auto", "ltr" | "rtl" | "auto">, false> & {
998
1119
  default: undefined;
@@ -1183,11 +1304,19 @@ declare const Row$1: ComponentDefinition<{
1183
1304
  kind: Kind<RadiusInput, Radius>;
1184
1305
  label: string;
1185
1306
  support: {
1186
- email: {
1307
+ email: ({
1187
1308
  level: "outlook";
1188
1309
  shows: string;
1189
1310
  source: "caniemail";
1190
- };
1311
+ feature: string;
1312
+ clients?: undefined;
1313
+ } | {
1314
+ level: "partial";
1315
+ shows: string;
1316
+ source: "caniemail";
1317
+ feature: string;
1318
+ clients: ("gmx" | "web-de" | "orange")[];
1319
+ })[];
1191
1320
  web: {
1192
1321
  level: "full";
1193
1322
  source: SupportSource;
@@ -1263,8 +1392,11 @@ declare const Row$1: ComponentDefinition<{
1263
1392
  inherited: true;
1264
1393
  support: {
1265
1394
  email: {
1266
- level: "full";
1395
+ level: "outlook";
1396
+ values: number[];
1397
+ shows: string;
1267
1398
  source: "caniemail";
1399
+ feature: string;
1268
1400
  };
1269
1401
  web: {
1270
1402
  level: "full";
@@ -1342,8 +1474,11 @@ declare const Row$1: ComponentDefinition<{
1342
1474
  inherited: true;
1343
1475
  support: {
1344
1476
  email: {
1345
- level: "full";
1346
- source: "assumed";
1477
+ level: "outlook";
1478
+ values: string[];
1479
+ shows: string;
1480
+ source: "caniemail";
1481
+ feature: string;
1347
1482
  };
1348
1483
  web: {
1349
1484
  level: "full";
@@ -1351,7 +1486,7 @@ declare const Row$1: ComponentDefinition<{
1351
1486
  };
1352
1487
  };
1353
1488
  };
1354
- }>;
1489
+ }, readonly []>;
1355
1490
  declare const Column$1: ComponentDefinition<{}, {
1356
1491
  readonly flex: {
1357
1492
  kind: Kind<number | "none", number | "none">;
@@ -1519,11 +1654,19 @@ declare const Column$1: ComponentDefinition<{}, {
1519
1654
  kind: Kind<RadiusInput, Radius>;
1520
1655
  label: string;
1521
1656
  support: {
1522
- email: {
1657
+ email: ({
1523
1658
  level: "outlook";
1524
1659
  shows: string;
1525
1660
  source: "caniemail";
1526
- };
1661
+ feature: string;
1662
+ clients?: undefined;
1663
+ } | {
1664
+ level: "partial";
1665
+ shows: string;
1666
+ source: "caniemail";
1667
+ feature: string;
1668
+ clients: ("gmx" | "web-de" | "orange")[];
1669
+ })[];
1527
1670
  web: {
1528
1671
  level: "full";
1529
1672
  source: SupportSource;
@@ -1599,8 +1742,11 @@ declare const Column$1: ComponentDefinition<{}, {
1599
1742
  inherited: true;
1600
1743
  support: {
1601
1744
  email: {
1602
- level: "full";
1745
+ level: "outlook";
1746
+ values: number[];
1747
+ shows: string;
1603
1748
  source: "caniemail";
1749
+ feature: string;
1604
1750
  };
1605
1751
  web: {
1606
1752
  level: "full";
@@ -1678,8 +1824,11 @@ declare const Column$1: ComponentDefinition<{}, {
1678
1824
  inherited: true;
1679
1825
  support: {
1680
1826
  email: {
1681
- level: "full";
1682
- source: "assumed";
1827
+ level: "outlook";
1828
+ values: string[];
1829
+ shows: string;
1830
+ source: "caniemail";
1831
+ feature: string;
1683
1832
  };
1684
1833
  web: {
1685
1834
  level: "full";
@@ -1687,7 +1836,7 @@ declare const Column$1: ComponentDefinition<{}, {
1687
1836
  };
1688
1837
  };
1689
1838
  };
1690
- }>;
1839
+ }, readonly []>;
1691
1840
  declare const Text$1: ComponentDefinition<{
1692
1841
  dir: PropSpec<Kind<"ltr" | "rtl" | "auto", "ltr" | "rtl" | "auto">, false> & {
1693
1842
  default: undefined;
@@ -1786,11 +1935,19 @@ declare const Text$1: ComponentDefinition<{
1786
1935
  kind: Kind<RadiusInput, Radius>;
1787
1936
  label: string;
1788
1937
  support: {
1789
- email: {
1938
+ email: ({
1790
1939
  level: "outlook";
1791
1940
  shows: string;
1792
1941
  source: "caniemail";
1793
- };
1942
+ feature: string;
1943
+ clients?: undefined;
1944
+ } | {
1945
+ level: "partial";
1946
+ shows: string;
1947
+ source: "caniemail";
1948
+ feature: string;
1949
+ clients: ("gmx" | "web-de" | "orange")[];
1950
+ })[];
1794
1951
  web: {
1795
1952
  level: "full";
1796
1953
  source: SupportSource;
@@ -1849,8 +2006,11 @@ declare const Text$1: ComponentDefinition<{
1849
2006
  inherited: true;
1850
2007
  support: {
1851
2008
  email: {
1852
- level: "full";
2009
+ level: "outlook";
2010
+ values: number[];
2011
+ shows: string;
1853
2012
  source: "caniemail";
2013
+ feature: string;
1854
2014
  };
1855
2015
  web: {
1856
2016
  level: "full";
@@ -1928,8 +2088,11 @@ declare const Text$1: ComponentDefinition<{
1928
2088
  inherited: true;
1929
2089
  support: {
1930
2090
  email: {
1931
- level: "full";
1932
- source: "assumed";
2091
+ level: "outlook";
2092
+ values: string[];
2093
+ shows: string;
2094
+ source: "caniemail";
2095
+ feature: string;
1933
2096
  };
1934
2097
  web: {
1935
2098
  level: "full";
@@ -1942,8 +2105,12 @@ declare const Text$1: ComponentDefinition<{
1942
2105
  label: string;
1943
2106
  support: {
1944
2107
  email: {
1945
- level: "full";
2108
+ level: "partial";
2109
+ values: string[];
2110
+ shows: string;
1946
2111
  source: "caniemail";
2112
+ feature: string;
2113
+ clients: ("gmail-app-other" | "protonmail" | "orange" | "sfr")[];
1947
2114
  };
1948
2115
  web: {
1949
2116
  level: "full";
@@ -1951,7 +2118,7 @@ declare const Text$1: ComponentDefinition<{
1951
2118
  };
1952
2119
  };
1953
2120
  };
1954
- }>;
2121
+ }, readonly []>;
1955
2122
  declare const Heading$1: ComponentDefinition<{
1956
2123
  readonly dir: PropSpec<Kind<"ltr" | "rtl" | "auto", "ltr" | "rtl" | "auto">, false> & {
1957
2124
  default: undefined;
@@ -2053,11 +2220,19 @@ declare const Heading$1: ComponentDefinition<{
2053
2220
  kind: Kind<RadiusInput, Radius>;
2054
2221
  label: string;
2055
2222
  support: {
2056
- email: {
2223
+ email: ({
2057
2224
  level: "outlook";
2058
2225
  shows: string;
2059
2226
  source: "caniemail";
2060
- };
2227
+ feature: string;
2228
+ clients?: undefined;
2229
+ } | {
2230
+ level: "partial";
2231
+ shows: string;
2232
+ source: "caniemail";
2233
+ feature: string;
2234
+ clients: ("gmx" | "web-de" | "orange")[];
2235
+ })[];
2061
2236
  web: {
2062
2237
  level: "full";
2063
2238
  source: SupportSource;
@@ -2116,8 +2291,11 @@ declare const Heading$1: ComponentDefinition<{
2116
2291
  inherited: true;
2117
2292
  support: {
2118
2293
  email: {
2119
- level: "full";
2294
+ level: "outlook";
2295
+ values: number[];
2296
+ shows: string;
2120
2297
  source: "caniemail";
2298
+ feature: string;
2121
2299
  };
2122
2300
  web: {
2123
2301
  level: "full";
@@ -2195,8 +2373,11 @@ declare const Heading$1: ComponentDefinition<{
2195
2373
  inherited: true;
2196
2374
  support: {
2197
2375
  email: {
2198
- level: "full";
2199
- source: "assumed";
2376
+ level: "outlook";
2377
+ values: string[];
2378
+ shows: string;
2379
+ source: "caniemail";
2380
+ feature: string;
2200
2381
  };
2201
2382
  web: {
2202
2383
  level: "full";
@@ -2209,8 +2390,12 @@ declare const Heading$1: ComponentDefinition<{
2209
2390
  label: string;
2210
2391
  support: {
2211
2392
  email: {
2212
- level: "full";
2393
+ level: "partial";
2394
+ values: string[];
2395
+ shows: string;
2213
2396
  source: "caniemail";
2397
+ feature: string;
2398
+ clients: ("gmail-app-other" | "protonmail" | "orange" | "sfr")[];
2214
2399
  };
2215
2400
  web: {
2216
2401
  level: "full";
@@ -2218,7 +2403,7 @@ declare const Heading$1: ComponentDefinition<{
2218
2403
  };
2219
2404
  };
2220
2405
  };
2221
- }>;
2406
+ }, readonly []>;
2222
2407
  declare const Span$1: ComponentDefinition<{}, {
2223
2408
  readonly verticalAlign: {
2224
2409
  readonly kind: Kind<"sub" | "baseline" | "super", "sub" | "baseline" | "super">;
@@ -2282,8 +2467,11 @@ declare const Span$1: ComponentDefinition<{}, {
2282
2467
  inherited: true;
2283
2468
  support: {
2284
2469
  email: {
2285
- level: "full";
2470
+ level: "outlook";
2471
+ values: number[];
2472
+ shows: string;
2286
2473
  source: "caniemail";
2474
+ feature: string;
2287
2475
  };
2288
2476
  web: {
2289
2477
  level: "full";
@@ -2345,8 +2533,11 @@ declare const Span$1: ComponentDefinition<{}, {
2345
2533
  inherited: true;
2346
2534
  support: {
2347
2535
  email: {
2348
- level: "full";
2349
- source: "assumed";
2536
+ level: "outlook";
2537
+ values: string[];
2538
+ shows: string;
2539
+ source: "caniemail";
2540
+ feature: string;
2350
2541
  };
2351
2542
  web: {
2352
2543
  level: "full";
@@ -2359,8 +2550,12 @@ declare const Span$1: ComponentDefinition<{}, {
2359
2550
  label: string;
2360
2551
  support: {
2361
2552
  email: {
2362
- level: "full";
2553
+ level: "partial";
2554
+ values: string[];
2555
+ shows: string;
2363
2556
  source: "caniemail";
2557
+ feature: string;
2558
+ clients: ("gmail-app-other" | "protonmail" | "orange" | "sfr")[];
2364
2559
  };
2365
2560
  web: {
2366
2561
  level: "full";
@@ -2368,7 +2563,7 @@ declare const Span$1: ComponentDefinition<{}, {
2368
2563
  };
2369
2564
  };
2370
2565
  };
2371
- }>;
2566
+ }, readonly []>;
2372
2567
  declare const Link$1: ComponentDefinition<{
2373
2568
  readonly href: PropSpec<Kind<LinkInput, LinkValue>, true> & {
2374
2569
  default: any;
@@ -2448,8 +2643,11 @@ declare const Link$1: ComponentDefinition<{
2448
2643
  inherited: true;
2449
2644
  support: {
2450
2645
  email: {
2451
- level: "full";
2646
+ level: "outlook";
2647
+ values: number[];
2648
+ shows: string;
2452
2649
  source: "caniemail";
2650
+ feature: string;
2453
2651
  };
2454
2652
  web: {
2455
2653
  level: "full";
@@ -2511,8 +2709,11 @@ declare const Link$1: ComponentDefinition<{
2511
2709
  inherited: true;
2512
2710
  support: {
2513
2711
  email: {
2514
- level: "full";
2515
- source: "assumed";
2712
+ level: "outlook";
2713
+ values: string[];
2714
+ shows: string;
2715
+ source: "caniemail";
2716
+ feature: string;
2516
2717
  };
2517
2718
  web: {
2518
2719
  level: "full";
@@ -2525,8 +2726,12 @@ declare const Link$1: ComponentDefinition<{
2525
2726
  label: string;
2526
2727
  support: {
2527
2728
  email: {
2528
- level: "full";
2729
+ level: "partial";
2730
+ values: string[];
2731
+ shows: string;
2529
2732
  source: "caniemail";
2733
+ feature: string;
2734
+ clients: ("gmail-app-other" | "protonmail" | "orange" | "sfr")[];
2530
2735
  };
2531
2736
  web: {
2532
2737
  level: "full";
@@ -2534,7 +2739,7 @@ declare const Link$1: ComponentDefinition<{
2534
2739
  };
2535
2740
  };
2536
2741
  };
2537
- }>;
2742
+ }, readonly ["color", "textDecoration", "backgroundColor"]>;
2538
2743
  declare const Button$1: ComponentDefinition<{
2539
2744
  readonly href: PropSpec<Kind<LinkInput, LinkValue>, true> & {
2540
2745
  default: any;
@@ -2668,11 +2873,19 @@ declare const Button$1: ComponentDefinition<{
2668
2873
  kind: Kind<RadiusInput, Radius>;
2669
2874
  label: string;
2670
2875
  support: {
2671
- email: {
2876
+ email: ({
2672
2877
  level: "outlook";
2673
2878
  shows: string;
2674
2879
  source: "caniemail";
2675
- };
2880
+ feature: string;
2881
+ clients?: undefined;
2882
+ } | {
2883
+ level: "partial";
2884
+ shows: string;
2885
+ source: "caniemail";
2886
+ feature: string;
2887
+ clients: ("gmx" | "web-de" | "orange")[];
2888
+ })[];
2676
2889
  web: {
2677
2890
  level: "full";
2678
2891
  source: SupportSource;
@@ -2731,8 +2944,11 @@ declare const Button$1: ComponentDefinition<{
2731
2944
  inherited: true;
2732
2945
  support: {
2733
2946
  email: {
2734
- level: "full";
2947
+ level: "outlook";
2948
+ values: number[];
2949
+ shows: string;
2735
2950
  source: "caniemail";
2951
+ feature: string;
2736
2952
  };
2737
2953
  web: {
2738
2954
  level: "full";
@@ -2810,8 +3026,11 @@ declare const Button$1: ComponentDefinition<{
2810
3026
  inherited: true;
2811
3027
  support: {
2812
3028
  email: {
2813
- level: "full";
2814
- source: "assumed";
3029
+ level: "outlook";
3030
+ values: string[];
3031
+ shows: string;
3032
+ source: "caniemail";
3033
+ feature: string;
2815
3034
  };
2816
3035
  web: {
2817
3036
  level: "full";
@@ -2824,8 +3043,12 @@ declare const Button$1: ComponentDefinition<{
2824
3043
  label: string;
2825
3044
  support: {
2826
3045
  email: {
2827
- level: "full";
3046
+ level: "partial";
3047
+ values: string[];
3048
+ shows: string;
2828
3049
  source: "caniemail";
3050
+ feature: string;
3051
+ clients: ("gmail-app-other" | "protonmail" | "orange" | "sfr")[];
2829
3052
  };
2830
3053
  web: {
2831
3054
  level: "full";
@@ -2833,7 +3056,7 @@ declare const Button$1: ComponentDefinition<{
2833
3056
  };
2834
3057
  };
2835
3058
  };
2836
- }>;
3059
+ }, readonly ["color", "backgroundColor"]>;
2837
3060
  declare const Image$1: ComponentDefinition<{
2838
3061
  readonly src: PropSpec<Kind<AssetInput, Asset>, true> & {
2839
3062
  default: any;
@@ -2948,18 +3171,26 @@ declare const Image$1: ComponentDefinition<{
2948
3171
  kind: Kind<RadiusInput, Radius>;
2949
3172
  label: string;
2950
3173
  support: {
2951
- email: {
3174
+ email: ({
2952
3175
  level: "outlook";
2953
3176
  shows: string;
2954
3177
  source: "caniemail";
2955
- };
3178
+ feature: string;
3179
+ clients?: undefined;
3180
+ } | {
3181
+ level: "partial";
3182
+ shows: string;
3183
+ source: "caniemail";
3184
+ feature: string;
3185
+ clients: ("gmx" | "web-de" | "orange")[];
3186
+ })[];
2956
3187
  web: {
2957
3188
  level: "full";
2958
3189
  source: SupportSource;
2959
3190
  };
2960
3191
  };
2961
3192
  };
2962
- }>;
3193
+ }, readonly []>;
2963
3194
  declare const Divider$1: ComponentDefinition<{}, {
2964
3195
  readonly borderTop: {
2965
3196
  readonly kind: Kind<string | BorderSideInput, BorderSide>;
@@ -2997,13 +3228,13 @@ declare const Divider$1: ComponentDefinition<{}, {
2997
3228
  readonly web: Support;
2998
3229
  };
2999
3230
  };
3000
- }>;
3001
- declare const LineBreak$1: ComponentDefinition<{}, {}>;
3231
+ }, readonly []>;
3232
+ declare const LineBreak$1: ComponentDefinition<{}, {}, readonly []>;
3002
3233
  declare const MergeTag$1: ComponentDefinition<{
3003
3234
  readonly name: PropSpec<Kind<string, string>, true> & {
3004
3235
  default: any;
3005
3236
  };
3006
- }, {}>;
3237
+ }, {}, readonly []>;
3007
3238
  declare const List$1: ComponentDefinition<{
3008
3239
  readonly type: PropSpec<Kind<"number" | "bullet", "number" | "bullet">, boolean> & {
3009
3240
  default: "bullet";
@@ -3178,8 +3409,11 @@ declare const List$1: ComponentDefinition<{
3178
3409
  inherited: true;
3179
3410
  support: {
3180
3411
  email: {
3181
- level: "full";
3412
+ level: "outlook";
3413
+ values: number[];
3414
+ shows: string;
3182
3415
  source: "caniemail";
3416
+ feature: string;
3183
3417
  };
3184
3418
  web: {
3185
3419
  level: "full";
@@ -3257,8 +3491,11 @@ declare const List$1: ComponentDefinition<{
3257
3491
  inherited: true;
3258
3492
  support: {
3259
3493
  email: {
3260
- level: "full";
3261
- source: "assumed";
3494
+ level: "outlook";
3495
+ values: string[];
3496
+ shows: string;
3497
+ source: "caniemail";
3498
+ feature: string;
3262
3499
  };
3263
3500
  web: {
3264
3501
  level: "full";
@@ -3266,7 +3503,7 @@ declare const List$1: ComponentDefinition<{
3266
3503
  };
3267
3504
  };
3268
3505
  };
3269
- }>;
3506
+ }, readonly []>;
3270
3507
  declare const ListItem$1: ComponentDefinition<{
3271
3508
  dir: PropSpec<Kind<"ltr" | "rtl" | "auto", "ltr" | "rtl" | "auto">, false> & {
3272
3509
  default: undefined;
@@ -3324,8 +3561,11 @@ declare const ListItem$1: ComponentDefinition<{
3324
3561
  inherited: true;
3325
3562
  support: {
3326
3563
  email: {
3327
- level: "full";
3564
+ level: "outlook";
3565
+ values: number[];
3566
+ shows: string;
3328
3567
  source: "caniemail";
3568
+ feature: string;
3329
3569
  };
3330
3570
  web: {
3331
3571
  level: "full";
@@ -3403,8 +3643,11 @@ declare const ListItem$1: ComponentDefinition<{
3403
3643
  inherited: true;
3404
3644
  support: {
3405
3645
  email: {
3406
- level: "full";
3407
- source: "assumed";
3646
+ level: "outlook";
3647
+ values: string[];
3648
+ shows: string;
3649
+ source: "caniemail";
3650
+ feature: string;
3408
3651
  };
3409
3652
  web: {
3410
3653
  level: "full";
@@ -3417,8 +3660,12 @@ declare const ListItem$1: ComponentDefinition<{
3417
3660
  label: string;
3418
3661
  support: {
3419
3662
  email: {
3420
- level: "full";
3663
+ level: "partial";
3664
+ values: string[];
3665
+ shows: string;
3421
3666
  source: "caniemail";
3667
+ feature: string;
3668
+ clients: ("gmail-app-other" | "protonmail" | "orange" | "sfr")[];
3422
3669
  };
3423
3670
  web: {
3424
3671
  level: "full";
@@ -3426,7 +3673,7 @@ declare const ListItem$1: ComponentDefinition<{
3426
3673
  };
3427
3674
  };
3428
3675
  };
3429
- }, "color" | "fontFamily" | "fontWeight" | "lineHeight" | "fontSize" | "fontStyle" | "letterSpacing" | "textAlign" | "textTransform" | "textDecoration">>;
3676
+ }, "color" | "fontFamily" | "fontWeight" | "lineHeight" | "fontSize" | "fontStyle" | "letterSpacing" | "textAlign" | "textTransform" | "textDecoration">, readonly []>;
3430
3677
  declare const Table$1: ComponentDefinition<{}, {
3431
3678
  readonly flex: {
3432
3679
  kind: Kind<number | "none", number | "none">;
@@ -3589,8 +3836,11 @@ declare const Table$1: ComponentDefinition<{}, {
3589
3836
  inherited: true;
3590
3837
  support: {
3591
3838
  email: {
3592
- level: "full";
3839
+ level: "outlook";
3840
+ values: number[];
3841
+ shows: string;
3593
3842
  source: "caniemail";
3843
+ feature: string;
3594
3844
  };
3595
3845
  web: {
3596
3846
  level: "full";
@@ -3668,8 +3918,11 @@ declare const Table$1: ComponentDefinition<{}, {
3668
3918
  inherited: true;
3669
3919
  support: {
3670
3920
  email: {
3671
- level: "full";
3672
- source: "assumed";
3921
+ level: "outlook";
3922
+ values: string[];
3923
+ shows: string;
3924
+ source: "caniemail";
3925
+ feature: string;
3673
3926
  };
3674
3927
  web: {
3675
3928
  level: "full";
@@ -3677,7 +3930,7 @@ declare const Table$1: ComponentDefinition<{}, {
3677
3930
  };
3678
3931
  };
3679
3932
  };
3680
- }>;
3933
+ }, readonly []>;
3681
3934
  declare const TableRow$1: ComponentDefinition<{
3682
3935
  readonly header: PropSpec<Kind<boolean, boolean>, boolean> & {
3683
3936
  default: false;
@@ -3750,8 +4003,11 @@ declare const TableRow$1: ComponentDefinition<{
3750
4003
  inherited: true;
3751
4004
  support: {
3752
4005
  email: {
3753
- level: "full";
4006
+ level: "outlook";
4007
+ values: number[];
4008
+ shows: string;
3754
4009
  source: "caniemail";
4010
+ feature: string;
3755
4011
  };
3756
4012
  web: {
3757
4013
  level: "full";
@@ -3845,8 +4101,11 @@ declare const TableRow$1: ComponentDefinition<{
3845
4101
  inherited: true;
3846
4102
  support: {
3847
4103
  email: {
3848
- level: "full";
3849
- source: "assumed";
4104
+ level: "outlook";
4105
+ values: string[];
4106
+ shows: string;
4107
+ source: "caniemail";
4108
+ feature: string;
3850
4109
  };
3851
4110
  web: {
3852
4111
  level: "full";
@@ -3854,7 +4113,7 @@ declare const TableRow$1: ComponentDefinition<{
3854
4113
  };
3855
4114
  };
3856
4115
  };
3857
- }>;
4116
+ }, readonly []>;
3858
4117
  declare const TableCell$1: ComponentDefinition<{
3859
4118
  readonly dir: PropSpec<Kind<"ltr" | "rtl" | "auto", "ltr" | "rtl" | "auto">, false> & {
3860
4119
  default: undefined;
@@ -3982,8 +4241,11 @@ declare const TableCell$1: ComponentDefinition<{
3982
4241
  inherited: true;
3983
4242
  support: {
3984
4243
  email: {
3985
- level: "full";
4244
+ level: "outlook";
4245
+ values: number[];
4246
+ shows: string;
3986
4247
  source: "caniemail";
4248
+ feature: string;
3987
4249
  };
3988
4250
  web: {
3989
4251
  level: "full";
@@ -4061,8 +4323,11 @@ declare const TableCell$1: ComponentDefinition<{
4061
4323
  inherited: true;
4062
4324
  support: {
4063
4325
  email: {
4064
- level: "full";
4065
- source: "assumed";
4326
+ level: "outlook";
4327
+ values: string[];
4328
+ shows: string;
4329
+ source: "caniemail";
4330
+ feature: string;
4066
4331
  };
4067
4332
  web: {
4068
4333
  level: "full";
@@ -4075,8 +4340,12 @@ declare const TableCell$1: ComponentDefinition<{
4075
4340
  label: string;
4076
4341
  support: {
4077
4342
  email: {
4078
- level: "full";
4343
+ level: "partial";
4344
+ values: string[];
4345
+ shows: string;
4079
4346
  source: "caniemail";
4347
+ feature: string;
4348
+ clients: ("gmail-app-other" | "protonmail" | "orange" | "sfr")[];
4080
4349
  };
4081
4350
  web: {
4082
4351
  level: "full";
@@ -4084,7 +4353,7 @@ declare const TableCell$1: ComponentDefinition<{
4084
4353
  };
4085
4354
  };
4086
4355
  };
4087
- }>;
4356
+ }, readonly []>;
4088
4357
  declare const Video$1: ComponentDefinition<{
4089
4358
  readonly src: PropSpec<Kind<string, string>, true> & {
4090
4359
  default: any;
@@ -4141,7 +4410,7 @@ declare const Video$1: ComponentDefinition<{
4141
4410
  };
4142
4411
  };
4143
4412
  };
4144
- }>;
4413
+ }, readonly []>;
4145
4414
  /**
4146
4415
  * Markup no component says (the builder's HTML block), written as it is. A PDF and an image can't draw markup: they
4147
4416
  * draw its plain text, and say so.
@@ -4153,7 +4422,7 @@ declare const Html$1: ComponentDefinition<{
4153
4422
  readonly text: PropSpec<Kind<string, string>, boolean> & {
4154
4423
  default: any;
4155
4424
  };
4156
- }, {}>;
4425
+ }, {}, readonly []>;
4157
4426
 
4158
4427
  declare const Social$1: ComponentDefinition<{
4159
4428
  readonly icons: PropSpec<Kind<{
@@ -4200,7 +4469,7 @@ declare const Social$1: ComponentDefinition<{
4200
4469
  readonly description: "Where the icons sit across the line.";
4201
4470
  readonly support: Partial<Record<Target, Support | readonly Support[]>>;
4202
4471
  };
4203
- }>;
4472
+ }, readonly []>;
4204
4473
  declare const Menu$1: ComponentDefinition<{
4205
4474
  readonly items: PropSpec<Kind<{
4206
4475
  readonly text: string;
@@ -4286,8 +4555,11 @@ declare const Menu$1: ComponentDefinition<{
4286
4555
  inherited: true;
4287
4556
  support: {
4288
4557
  email: {
4289
- level: "full";
4558
+ level: "outlook";
4559
+ values: number[];
4560
+ shows: string;
4290
4561
  source: "caniemail";
4562
+ feature: string;
4291
4563
  };
4292
4564
  web: {
4293
4565
  level: "full";
@@ -4350,8 +4622,11 @@ declare const Menu$1: ComponentDefinition<{
4350
4622
  inherited: true;
4351
4623
  support: {
4352
4624
  email: {
4353
- level: "full";
4354
- source: "assumed";
4625
+ level: "outlook";
4626
+ values: string[];
4627
+ shows: string;
4628
+ source: "caniemail";
4629
+ feature: string;
4355
4630
  };
4356
4631
  web: {
4357
4632
  level: "full";
@@ -4359,7 +4634,7 @@ declare const Menu$1: ComponentDefinition<{
4359
4634
  };
4360
4635
  };
4361
4636
  };
4362
- }>;
4637
+ }, readonly []>;
4363
4638
 
4364
4639
  declare const Grid$1: ComponentDefinition<{
4365
4640
  readonly columns: PropSpec<Kind<number, number>, boolean> & {
@@ -4537,11 +4812,19 @@ declare const Grid$1: ComponentDefinition<{
4537
4812
  kind: Kind<RadiusInput, Radius>;
4538
4813
  label: string;
4539
4814
  support: {
4540
- email: {
4815
+ email: ({
4541
4816
  level: "outlook";
4542
4817
  shows: string;
4543
4818
  source: "caniemail";
4544
- };
4819
+ feature: string;
4820
+ clients?: undefined;
4821
+ } | {
4822
+ level: "partial";
4823
+ shows: string;
4824
+ source: "caniemail";
4825
+ feature: string;
4826
+ clients: ("gmx" | "web-de" | "orange")[];
4827
+ })[];
4545
4828
  web: {
4546
4829
  level: "full";
4547
4830
  source: SupportSource;
@@ -4617,8 +4900,11 @@ declare const Grid$1: ComponentDefinition<{
4617
4900
  inherited: true;
4618
4901
  support: {
4619
4902
  email: {
4620
- level: "full";
4903
+ level: "outlook";
4904
+ values: number[];
4905
+ shows: string;
4621
4906
  source: "caniemail";
4907
+ feature: string;
4622
4908
  };
4623
4909
  web: {
4624
4910
  level: "full";
@@ -4696,8 +4982,11 @@ declare const Grid$1: ComponentDefinition<{
4696
4982
  inherited: true;
4697
4983
  support: {
4698
4984
  email: {
4699
- level: "full";
4700
- source: "assumed";
4985
+ level: "outlook";
4986
+ values: string[];
4987
+ shows: string;
4988
+ source: "caniemail";
4989
+ feature: string;
4701
4990
  };
4702
4991
  web: {
4703
4992
  level: "full";
@@ -4705,7 +4994,7 @@ declare const Grid$1: ComponentDefinition<{
4705
4994
  };
4706
4995
  };
4707
4996
  };
4708
- }>;
4997
+ }, readonly []>;
4709
4998
  /**
4710
4999
  * A Layer's children over each other, each in its whole box (as CSS grid places children in one cell): an image with
4711
5000
  * words on it. On a page any children go; an email draws one shape of it, an Image as wide as the Layer with one child
@@ -4845,11 +5134,19 @@ declare const Layer$1: ComponentDefinition<{}, {
4845
5134
  kind: Kind<RadiusInput, Radius>;
4846
5135
  label: string;
4847
5136
  support: {
4848
- email: {
5137
+ email: ({
4849
5138
  level: "outlook";
4850
5139
  shows: string;
4851
5140
  source: "caniemail";
4852
- };
5141
+ feature: string;
5142
+ clients?: undefined;
5143
+ } | {
5144
+ level: "partial";
5145
+ shows: string;
5146
+ source: "caniemail";
5147
+ feature: string;
5148
+ clients: ("gmx" | "web-de" | "orange")[];
5149
+ })[];
4853
5150
  web: {
4854
5151
  level: "full";
4855
5152
  source: SupportSource;
@@ -4908,8 +5205,11 @@ declare const Layer$1: ComponentDefinition<{}, {
4908
5205
  inherited: true;
4909
5206
  support: {
4910
5207
  email: {
4911
- level: "full";
5208
+ level: "outlook";
5209
+ values: number[];
5210
+ shows: string;
4912
5211
  source: "caniemail";
5212
+ feature: string;
4913
5213
  };
4914
5214
  web: {
4915
5215
  level: "full";
@@ -4987,8 +5287,11 @@ declare const Layer$1: ComponentDefinition<{}, {
4987
5287
  inherited: true;
4988
5288
  support: {
4989
5289
  email: {
4990
- level: "full";
4991
- source: "assumed";
5290
+ level: "outlook";
5291
+ values: string[];
5292
+ shows: string;
5293
+ source: "caniemail";
5294
+ feature: string;
4992
5295
  };
4993
5296
  web: {
4994
5297
  level: "full";
@@ -4996,7 +5299,7 @@ declare const Layer$1: ComponentDefinition<{}, {
4996
5299
  };
4997
5300
  };
4998
5301
  };
4999
- }>;
5302
+ }, readonly []>;
5000
5303
  declare const Document$1: ComponentDefinition<{
5001
5304
  readonly title: PropSpec<Kind<string, string>, false> & {
5002
5305
  default: undefined;
@@ -5123,8 +5426,11 @@ declare const Document$1: ComponentDefinition<{
5123
5426
  inherited: true;
5124
5427
  support: {
5125
5428
  email: {
5126
- level: "full";
5429
+ level: "outlook";
5430
+ values: number[];
5431
+ shows: string;
5127
5432
  source: "caniemail";
5433
+ feature: string;
5128
5434
  };
5129
5435
  web: {
5130
5436
  level: "full";
@@ -5202,8 +5508,11 @@ declare const Document$1: ComponentDefinition<{
5202
5508
  inherited: true;
5203
5509
  support: {
5204
5510
  email: {
5205
- level: "full";
5206
- source: "assumed";
5511
+ level: "outlook";
5512
+ values: string[];
5513
+ shows: string;
5514
+ source: "caniemail";
5515
+ feature: string;
5207
5516
  };
5208
5517
  web: {
5209
5518
  level: "full";
@@ -5211,7 +5520,7 @@ declare const Document$1: ComponentDefinition<{
5211
5520
  };
5212
5521
  };
5213
5522
  };
5214
- }>;
5523
+ }, readonly []>;
5215
5524
  declare const DocumentPage: ComponentDefinition<{}, {
5216
5525
  gap: {
5217
5526
  kind: Kind<LengthInput<"px">, number>;
@@ -5311,8 +5620,11 @@ declare const DocumentPage: ComponentDefinition<{}, {
5311
5620
  inherited: true;
5312
5621
  support: {
5313
5622
  email: {
5314
- level: "full";
5623
+ level: "outlook";
5624
+ values: number[];
5625
+ shows: string;
5315
5626
  source: "caniemail";
5627
+ feature: string;
5316
5628
  };
5317
5629
  web: {
5318
5630
  level: "full";
@@ -5390,8 +5702,11 @@ declare const DocumentPage: ComponentDefinition<{}, {
5390
5702
  inherited: true;
5391
5703
  support: {
5392
5704
  email: {
5393
- level: "full";
5394
- source: "assumed";
5705
+ level: "outlook";
5706
+ values: string[];
5707
+ shows: string;
5708
+ source: "caniemail";
5709
+ feature: string;
5395
5710
  };
5396
5711
  web: {
5397
5712
  level: "full";
@@ -5399,8 +5714,8 @@ declare const DocumentPage: ComponentDefinition<{}, {
5399
5714
  };
5400
5715
  };
5401
5716
  };
5402
- }>;
5403
- declare const PageBreak$1: ComponentDefinition<{}, {}>;
5717
+ }, readonly []>;
5718
+ declare const PageBreak$1: ComponentDefinition<{}, {}, readonly []>;
5404
5719
  declare const PageHeader$1: ComponentDefinition<{}, {
5405
5720
  gap: {
5406
5721
  kind: Kind<LengthInput<"px">, number>;
@@ -5529,8 +5844,11 @@ declare const PageHeader$1: ComponentDefinition<{}, {
5529
5844
  inherited: true;
5530
5845
  support: {
5531
5846
  email: {
5532
- level: "full";
5847
+ level: "outlook";
5848
+ values: number[];
5849
+ shows: string;
5533
5850
  source: "caniemail";
5851
+ feature: string;
5534
5852
  };
5535
5853
  web: {
5536
5854
  level: "full";
@@ -5608,8 +5926,11 @@ declare const PageHeader$1: ComponentDefinition<{}, {
5608
5926
  inherited: true;
5609
5927
  support: {
5610
5928
  email: {
5611
- level: "full";
5612
- source: "assumed";
5929
+ level: "outlook";
5930
+ values: string[];
5931
+ shows: string;
5932
+ source: "caniemail";
5933
+ feature: string;
5613
5934
  };
5614
5935
  web: {
5615
5936
  level: "full";
@@ -5617,7 +5938,7 @@ declare const PageHeader$1: ComponentDefinition<{}, {
5617
5938
  };
5618
5939
  };
5619
5940
  };
5620
- }>;
5941
+ }, readonly []>;
5621
5942
  declare const PageFooter$1: ComponentDefinition<{}, {
5622
5943
  gap: {
5623
5944
  kind: Kind<LengthInput<"px">, number>;
@@ -5746,8 +6067,11 @@ declare const PageFooter$1: ComponentDefinition<{}, {
5746
6067
  inherited: true;
5747
6068
  support: {
5748
6069
  email: {
5749
- level: "full";
6070
+ level: "outlook";
6071
+ values: number[];
6072
+ shows: string;
5750
6073
  source: "caniemail";
6074
+ feature: string;
5751
6075
  };
5752
6076
  web: {
5753
6077
  level: "full";
@@ -5825,8 +6149,11 @@ declare const PageFooter$1: ComponentDefinition<{}, {
5825
6149
  inherited: true;
5826
6150
  support: {
5827
6151
  email: {
5828
- level: "full";
5829
- source: "assumed";
6152
+ level: "outlook";
6153
+ values: string[];
6154
+ shows: string;
6155
+ source: "caniemail";
6156
+ feature: string;
5830
6157
  };
5831
6158
  web: {
5832
6159
  level: "full";
@@ -5834,12 +6161,12 @@ declare const PageFooter$1: ComponentDefinition<{}, {
5834
6161
  };
5835
6162
  };
5836
6163
  };
5837
- }>;
6164
+ }, readonly []>;
5838
6165
  declare const PageNumber$1: ComponentDefinition<{
5839
6166
  readonly total: PropSpec<Kind<boolean, boolean>, boolean> & {
5840
6167
  default: false;
5841
6168
  };
5842
- }, {}>;
6169
+ }, {}, readonly []>;
5843
6170
 
5844
6171
  declare const Canvas$1: ComponentDefinition<{
5845
6172
  readonly title: PropSpec<Kind<string, string>, false> & {
@@ -5989,8 +6316,11 @@ declare const Canvas$1: ComponentDefinition<{
5989
6316
  inherited: true;
5990
6317
  support: {
5991
6318
  email: {
5992
- level: "full";
6319
+ level: "outlook";
6320
+ values: number[];
6321
+ shows: string;
5993
6322
  source: "caniemail";
6323
+ feature: string;
5994
6324
  };
5995
6325
  web: {
5996
6326
  level: "full";
@@ -6068,8 +6398,11 @@ declare const Canvas$1: ComponentDefinition<{
6068
6398
  inherited: true;
6069
6399
  support: {
6070
6400
  email: {
6071
- level: "full";
6072
- source: "assumed";
6401
+ level: "outlook";
6402
+ values: string[];
6403
+ shows: string;
6404
+ source: "caniemail";
6405
+ feature: string;
6073
6406
  };
6074
6407
  web: {
6075
6408
  level: "full";
@@ -6077,7 +6410,7 @@ declare const Canvas$1: ComponentDefinition<{
6077
6410
  };
6078
6411
  };
6079
6412
  };
6080
- }>;
6413
+ }, readonly []>;
6081
6414
  declare const Svg$1: ComponentDefinition<{
6082
6415
  readonly width: PropSpec<Kind<number, number>, true> & {
6083
6416
  default: undefined;
@@ -6155,18 +6488,26 @@ declare const Svg$1: ComponentDefinition<{
6155
6488
  kind: Kind<RadiusInput, Radius>;
6156
6489
  label: string;
6157
6490
  support: {
6158
- email: {
6491
+ email: ({
6159
6492
  level: "outlook";
6160
6493
  shows: string;
6161
6494
  source: "caniemail";
6162
- };
6495
+ feature: string;
6496
+ clients?: undefined;
6497
+ } | {
6498
+ level: "partial";
6499
+ shows: string;
6500
+ source: "caniemail";
6501
+ feature: string;
6502
+ clients: ("gmx" | "web-de" | "orange")[];
6503
+ })[];
6163
6504
  web: {
6164
6505
  level: "full";
6165
6506
  source: SupportSource;
6166
6507
  };
6167
6508
  };
6168
6509
  };
6169
- }>;
6510
+ }, readonly []>;
6170
6511
  declare const Rect$1: ComponentDefinition<{
6171
6512
  readonly x: PropSpec<Kind<number, number>, false> & {
6172
6513
  default: 0;
@@ -6214,7 +6555,7 @@ declare const Rect$1: ComponentDefinition<{
6214
6555
  web: Support;
6215
6556
  };
6216
6557
  };
6217
- }>;
6558
+ }, readonly []>;
6218
6559
  declare const Circle$1: ComponentDefinition<{
6219
6560
  readonly cx: PropSpec<Kind<number, number>, false> & {
6220
6561
  default: 0;
@@ -6256,7 +6597,7 @@ declare const Circle$1: ComponentDefinition<{
6256
6597
  web: Support;
6257
6598
  };
6258
6599
  };
6259
- }>;
6600
+ }, readonly []>;
6260
6601
  declare const Ellipse$1: ComponentDefinition<{
6261
6602
  readonly cx: PropSpec<Kind<number, number>, false> & {
6262
6603
  default: 0;
@@ -6301,7 +6642,7 @@ declare const Ellipse$1: ComponentDefinition<{
6301
6642
  web: Support;
6302
6643
  };
6303
6644
  };
6304
- }>;
6645
+ }, readonly []>;
6305
6646
  declare const Line$1: ComponentDefinition<{
6306
6647
  readonly x1: PropSpec<Kind<number, number>, false> & {
6307
6648
  default: 0;
@@ -6346,7 +6687,7 @@ declare const Line$1: ComponentDefinition<{
6346
6687
  web: Support;
6347
6688
  };
6348
6689
  };
6349
- }>;
6690
+ }, readonly []>;
6350
6691
  declare const Polygon$1: ComponentDefinition<{
6351
6692
  readonly points: PropSpec<Kind<string, string>, true> & {
6352
6693
  default: any;
@@ -6382,7 +6723,7 @@ declare const Polygon$1: ComponentDefinition<{
6382
6723
  web: Support;
6383
6724
  };
6384
6725
  };
6385
- }>;
6726
+ }, readonly []>;
6386
6727
  declare const Path$1: ComponentDefinition<{
6387
6728
  readonly d: PropSpec<Kind<string, string>, true> & {
6388
6729
  default: any;
@@ -6418,7 +6759,7 @@ declare const Path$1: ComponentDefinition<{
6418
6759
  web: Support;
6419
6760
  };
6420
6761
  };
6421
- }>;
6762
+ }, readonly []>;
6422
6763
  /** Props that always have a value: required ones, and ones with a default (see `prop`). */
6423
6764
  type RequiredOrDefaulted<P extends PropSpecs> = {
6424
6765
  [K in keyof P]: Exclude<P[K]["required"], undefined> extends true ? K : [P[K]["default"]] extends [undefined] ? never : K;
@@ -6437,6 +6778,8 @@ interface ExpandContext {
6437
6778
  style: Record<string, Json>;
6438
6779
  /** Whether the template has phones (an Email or a Page): what's hidden on phones is only hidden there. */
6439
6780
  responsive: boolean;
6781
+ /** A problem found while expanding that doesn't stop it (a warning or a note), said once at the expansion's place. */
6782
+ report(diagnostic: Diagnostic): void;
6440
6783
  }
6441
6784
  interface CustomDefinition<P extends PropSpecs = PropSpecs> extends ComponentDefinition<P, typeof placementStyle> {
6442
6785
  custom: true;
@@ -6507,12 +6850,35 @@ interface ResolvedNode {
6507
6850
  }
6508
6851
 
6509
6852
  /**
6510
- * What the email components get: one props object per node, with
6511
- * what every component needs worked out (its styles, its phone text styles, its
6512
- * text), and `render()` for its children, so components don't import each
6513
- * other.
6853
+ * Where each block of an Email is in its HTML, for render()'s `blockMap`: a tool that previews the email (marking each
6854
+ * block, then reading where each one is drawn) finds the template path of what it draws.
6855
+ *
6856
+ * While the email is written, each node's markup gets a mark just after the tag name of its outermost element (the
6857
+ * first one every client but classic Outlook reads, else the first in Outlook's own markup): two Unicode
6858
+ * noncharacters around the node's number. Once it's written the marks are taken out, so the HTML is the same bytes as
6859
+ * without them, and where each one was is its block's offset. A template whose own text holds those noncharacters
6860
+ * would be misread: it's written again with another pair.
6514
6861
  */
6515
6862
 
6863
+ /** The format of render()'s `blocks`, kept by hand: raised only when the format changes (not the package's version). */
6864
+ declare const BLOCK_MAP_VERSION = 1;
6865
+ interface BlockMapEntry {
6866
+ /** The block's place in the template (`root.children[2]`), as diagnostics give it. */
6867
+ path: string;
6868
+ /** Its `id`, where it has one. */
6869
+ nodeId?: string;
6870
+ /** The UTF-8 byte offset in `html` just after its outermost element's tag name (`<table`, `<div`). */
6871
+ offset: number;
6872
+ }
6873
+ interface BlockMap {
6874
+ /** `BLOCK_MAP_VERSION`. */
6875
+ version: number;
6876
+ /** What `offset` counts: bytes of the HTML in UTF-8. */
6877
+ unit: "utf8";
6878
+ /** Each block written as an element, in the order of their offsets (blocks at one offset: the outer first). */
6879
+ entries: BlockMapEntry[];
6880
+ }
6881
+
6516
6882
  interface EmailOptions {
6517
6883
  /** How a merge tag is written (default `{{name}}`): into the HTML as it is, the name in it escaped. */
6518
6884
  mergeTag?: (name: string) => string;
@@ -6535,9 +6901,23 @@ interface PageOptions {
6535
6901
  classPrefix?: string;
6536
6902
  }
6537
6903
 
6538
- interface RenderOptions extends PageOptions, EmailOptions {
6904
+ interface EmailClientsOption {
6905
+ /**
6906
+ * For an Email, the email clients to report problems for (default: `DEFAULT_EMAIL_CLIENTS`, the ones most email is
6907
+ * read in: classic Outlook, Outlook.com, Outlook for Mac, the Outlook and Gmail apps, Gmail, Apple Mail, Yahoo, AOL
6908
+ * and Samsung Email). A problem about other clients is left out; `[]` leaves out every email client problem, not the
6909
+ * problems of the email itself.
6910
+ */
6911
+ emailClients?: readonly EmailClient[];
6912
+ }
6913
+ interface RenderOptions extends PageOptions, EmailOptions, EmailClientsOption {
6539
6914
  /** The HTML indented, for reading it; for sending, the compact HTML (white space may change how some email clients show it). */
6540
6915
  pretty?: boolean;
6916
+ /**
6917
+ * For tools that preview an Email: also return `blocks`, where each block is in `html` (its template path and the
6918
+ * UTF-8 byte offset just after its outermost element's tag name). The HTML is the same either way. Not with `pretty`.
6919
+ */
6920
+ blockMap?: boolean;
6541
6921
  }
6542
6922
  interface RenderResult {
6543
6923
  /** The whole document, from `<!DOCTYPE html>`. */
@@ -6550,6 +6930,8 @@ interface RenderResult {
6550
6930
  bodyStyle: string;
6551
6931
  /** Warnings and notes (errors are thrown). */
6552
6932
  diagnostics: Diagnostic[];
6933
+ /** With `blockMap`, for an Email: where each block is in `html`. */
6934
+ blocks?: BlockMap;
6553
6935
  }
6554
6936
 
6555
6937
  /**
@@ -6558,26 +6940,41 @@ interface RenderResult {
6558
6940
  */
6559
6941
 
6560
6942
  /** The props of a primitive: its semantic props, plus its style, phone and hover styles, and children. */
6561
- type PrimitiveProps<D> = D extends ComponentDefinition<infer P, infer S> ? PropsInput<P> & Extras<StyleInput<S>> : never;
6943
+ type PrimitiveProps<D> = D extends ComponentDefinition<infer P, infer S, any> ? PropsInput<P> & Extras<StyleInput<S>, ConditionStyles<D>> : never;
6944
+ /** The styles that may be set on phones: those whose definition says `mobile: true`. */
6945
+ type MobileKeys<S extends StyleSpecs> = {
6946
+ [K in keyof S]-?: S[K] extends {
6947
+ mobile: true;
6948
+ } ? K : never;
6949
+ }[keyof S];
6950
+ /** A condition's block of the styles `K`; where it takes none, nothing can be set in it. */
6951
+ type Block<S extends StyleSpecs, K> = [K] extends [never] ? never : {
6952
+ [Q in K & keyof S]?: InputOf<S[Q]["kind"]>;
6953
+ };
6954
+ /**
6955
+ * A component's condition blocks in `style`: `mobile` with the styles it takes on phones, `hover` with its hover
6956
+ * styles (from its definition's list). Where a component takes none, the block is `never`: no value but `undefined`.
6957
+ */
6958
+ type ConditionStyles<D> = D extends ComponentDefinition<any, infer S, infer H> ? {
6959
+ mobile?: Block<S, MobileKeys<S>>;
6960
+ hover?: Block<S, H[number]>;
6961
+ } : never;
6562
6962
  /** What every primitive takes beside its own props. */
6563
- interface Extras<Style> {
6963
+ interface Extras<Style, Conditions> {
6564
6964
  /** Stable id; one is assigned in document order when it's left out. */
6565
6965
  id?: string;
6566
- style?: Style;
6567
- /** Style on phones (in an Email or Page). */
6568
- mobile?: Style;
6569
- /** Style while the pointer is over it, where the component has one. */
6570
- hover?: Style;
6966
+ /** Its style, and inside it its styles on phones (`mobile`) and on hover (`hover`), where it takes them. */
6967
+ style?: Style & Conditions;
6571
6968
  hidden?: {
6572
6969
  mobile?: boolean;
6573
6970
  desktop?: boolean;
6574
6971
  };
6575
6972
  children?: React.ReactNode;
6576
6973
  }
6577
- type StyleOf<D> = D extends ComponentDefinition<any, infer S> ? {
6974
+ type StyleOf<D> = D extends ComponentDefinition<any, infer S, any> ? {
6578
6975
  [K in keyof S]?: InputOf<S[K]["kind"]>;
6579
6976
  } : never;
6580
- type PropsOf<D, Style> = D extends ComponentDefinition<infer P, any> ? PropsInput<P> & Extras<Style> : never;
6977
+ type PropsOf<D, Style> = D extends ComponentDefinition<infer P, any, any> ? PropsInput<P> & Extras<Style, ConditionStyles<D>> : never;
6581
6978
  declare const Email: React.FC<EmailProps>;
6582
6979
  declare const Page: React.FC<PageProps>;
6583
6980
  declare const Section: React.FC<SectionProps>;
@@ -6865,6 +7262,8 @@ declare function component<const P extends PropSpecs>(spec: ComponentSpec<P>): C
6865
7262
  * template has errors (see `validate()`).
6866
7263
  */
6867
7264
  declare function render(element: React.ReactElement, options?: RenderOptions): Promise<RenderResult>;
7265
+ /** `validate()`'s and `prepare()`'s options: `emailClients`, the email clients to report an Email's problems for. */
7266
+ type ValidateOptions = EmailClientsOption;
6868
7267
  interface ValidationResult {
6869
7268
  /** No errors (there may be warnings and notes). */
6870
7269
  valid: boolean;
@@ -6878,9 +7277,10 @@ interface ValidationResult {
6878
7277
  * own checks, layout, and what the output can't do as asked (`email/…`).
6879
7278
  * Warnings and notes leave it valid. Only what needs the written output is
6880
7279
  * left to `render()`: an email's size against Gmail's limits (`email/size`,
6881
- * `email/style-size`).
7280
+ * `email/style-size`). An Email's problems with email clients name them
7281
+ * (`clients`), with what to change (`fix`); `emailClients` picks the clients.
6882
7282
  */
6883
- declare function validate(element: React.ReactElement): ValidationResult;
7283
+ declare function validate(element: React.ReactElement, options?: ValidateOptions): ValidationResult;
6884
7284
  /**
6885
7285
  * A template laid out, as text: each block on a line under what holds it, with its width on desktop and what it
6886
7286
  * shows (a heading's words, a link's URL, an image's alt text), and whether a Row stacks on phones. To check a
@@ -6893,10 +7293,10 @@ declare function outline(element: React.ReactElement): string;
6893
7293
  * errors. The tree is the writers' input, not a format to store: it changes with Elements, and `layout` says which
6894
7294
  * format it's in (a writer refuses one it doesn't read).
6895
7295
  */
6896
- declare function prepare(element: React.ReactElement): {
7296
+ declare function prepare(element: React.ReactElement, options?: ValidateOptions): {
6897
7297
  root: ResolvedNode | null;
6898
7298
  diagnostics: Diagnostic[];
6899
7299
  layout: number;
6900
7300
  };
6901
7301
 
6902
- export { Button, type ButtonProps, Canvas, type CanvasProps, Circle, type CircleProps, Column, type ColumnProps, type ComponentSpec, type CustomComponent, type CustomProps, type Diagnostic, Divider, type DividerProps, Document, type DocumentPageProps, type DocumentProps, ElementsError, Ellipse, type EllipseProps, Email, type EmailProps, Grid, type GridProps, Heading, type HeadingProps, Html, type HtmlProps, Image, type ImageProps, Layer, type LayerProps, Line, LineBreak, type LineBreakProps, type LineProps, Link, type LinkProps, List, ListItem, type ListItemProps, type ListProps, Menu, type MenuProps, MergeTag, type MergeTagProps, Page, PageBreak, type PageBreakProps, PageFooter, type PageFooterProps, PageHeader, type PageHeaderProps, PageNumber, type PageNumberProps, type PageProps, type ParagraphProps, Path, type PathProps, Polygon, type PolygonProps, type PrimitiveProps, Rect, type RectProps, type RenderOptions, type RenderResult, type ResolvedNode, Row, type RowProps, Section, type SectionProps, type Severity, Social, type SocialProps, Span, type SpanProps, Svg, type SvgProps, Table, TableCell, type TableCellProps, type TableProps, TableRow, type TableRowProps, Text, type TextProps, type ValidationResult, Video, type VideoProps, component, formatDiagnostics, outline, prepare, prop, render, validate };
7302
+ export { BLOCK_MAP_VERSION, type BlockMap, type BlockMapEntry, Button, type ButtonProps, Canvas, type CanvasProps, Circle, type CircleProps, Column, type ColumnProps, type ComponentSpec, type CustomComponent, type CustomProps, DEFAULT_EMAIL_CLIENTS, type Diagnostic, Divider, type DividerProps, Document, type DocumentPageProps, type DocumentProps, EMAIL_CLIENTS, ElementsError, Ellipse, type EllipseProps, Email, type EmailClient, type EmailClientInfo, type EmailClientMeasurement, type EmailProps, Grid, type GridProps, Heading, type HeadingProps, Html, type HtmlProps, Image, type ImageProps, Layer, type LayerProps, Line, LineBreak, type LineBreakProps, type LineProps, Link, type LinkProps, List, ListItem, type ListItemProps, type ListProps, Menu, type MenuProps, MergeTag, type MergeTagProps, Page, PageBreak, type PageBreakProps, PageFooter, type PageFooterProps, PageHeader, type PageHeaderProps, PageNumber, type PageNumberProps, type PageProps, type ParagraphProps, Path, type PathProps, Polygon, type PolygonProps, type PrimitiveProps, Rect, type RectProps, type RenderOptions, type RenderResult, type ResolvedNode, Row, type RowProps, Section, type SectionProps, type Severity, Social, type SocialProps, Span, type SpanProps, Svg, type SvgProps, Table, TableCell, type TableCellProps, type TableProps, TableRow, type TableRowProps, Text, type TextProps, type ValidateOptions, type ValidationResult, Video, type VideoProps, component, formatDiagnostics, outline, prepare, prop, render, validate };