@samva/markup 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/AGENTS.md +17 -0
  2. package/dist/{ast-63I-VLQx.d.ts → ast-BLybiDxp.d.ts} +34 -60
  3. package/dist/ast.d.ts +2 -2
  4. package/dist/ast.js +4 -52
  5. package/dist/catalog-Db0UcCTg.d.ts +356 -0
  6. package/dist/{checks-DXuERO4B.js → checks-CmmITP6j.js} +14 -14
  7. package/dist/checks.d.ts +1 -1
  8. package/dist/checks.js +1 -1
  9. package/dist/classes.d.ts +1 -1
  10. package/dist/compile-sms.d.ts +3 -3
  11. package/dist/compile-whatsapp.d.ts +5 -5
  12. package/dist/compile-whatsapp.js +3 -3
  13. package/dist/compile.d.ts +5 -5
  14. package/dist/compile.js +5 -5
  15. package/dist/compiler.d.ts +4 -4
  16. package/dist/compiler.js +6 -6
  17. package/dist/components.d.ts +4 -4
  18. package/dist/conditionals.js +3 -3
  19. package/dist/corpus-CM7rKX41.d.ts +106 -0
  20. package/dist/{css-ar2lU3NC.d.ts → css-DoNc7CiC.d.ts} +4 -5
  21. package/dist/diagnostics-CqepLcpI.d.ts +47 -0
  22. package/dist/diagnostics-eFM9A_TU.d.ts +46 -0
  23. package/dist/diagnostics.d.ts +2 -2
  24. package/dist/diagnostics.js +15 -29
  25. package/dist/{elements-DtwKlFVH.d.ts → elements-ChJULZlh.d.ts} +40 -161
  26. package/dist/email/components.d.ts +1 -1
  27. package/dist/email/diagnostics.d.ts +1 -1
  28. package/dist/email/diagnostics.js +8 -43
  29. package/dist/email/elements.d.ts +1 -1
  30. package/dist/email/html.d.ts +2 -2
  31. package/dist/email/html.js +9 -9
  32. package/dist/email/jsx-dev-runtime.d.ts +3 -21
  33. package/dist/email/jsx-runtime.d.ts +1 -1
  34. package/dist/email/jsx-runtime.js +29 -3
  35. package/dist/email/render.d.ts +4 -4
  36. package/dist/email/render.js +1 -1
  37. package/dist/email/selection.d.ts +20 -31
  38. package/dist/email/selection.js +1 -53
  39. package/dist/email/source-edit.d.ts +1 -1
  40. package/dist/email/source-edit.js +2 -2
  41. package/dist/email/stylesheets.d.ts +1 -1
  42. package/dist/email/text.d.ts +1 -1
  43. package/dist/email/text.js +3 -3
  44. package/dist/emit.d.ts +2 -2
  45. package/dist/emit.js +5 -5
  46. package/dist/guards-eV1qLbf2.js +9 -0
  47. package/dist/{input-schema-BIfzI63B.d.ts → input-schema-7dPFVvNE.d.ts} +2 -2
  48. package/dist/input-schema-zjkgrXn2.js +455 -0
  49. package/dist/input-schema.d.ts +1 -1
  50. package/dist/input-schema.js +1 -169
  51. package/dist/interpolate.d.ts +9 -12
  52. package/dist/interpolate.js +1 -19
  53. package/dist/jsx-dev-runtime.d.ts +2 -2
  54. package/dist/{jsx-runtime-C5k_Zq0A.d.ts → jsx-runtime-BI4gI19E.d.ts} +3 -3
  55. package/dist/jsx-runtime.d.ts +1 -1
  56. package/dist/jsx-runtime.js +3 -3
  57. package/dist/model.d.ts +18 -33
  58. package/dist/model.js +4 -17
  59. package/dist/ops.d.ts +78 -172
  60. package/dist/ops.js +51 -117
  61. package/dist/{parser-CGBS73Gz.d.ts → parser-b_Kp5MT6.d.ts} +5 -5
  62. package/dist/parser.d.ts +1 -1
  63. package/dist/parser.js +8 -8
  64. package/dist/{predicate-G2SeSvoN.d.ts → predicate-Bmvgw7Ao.d.ts} +4 -4
  65. package/dist/{predicate-CvkzT-a2.js → predicate-DwXzmqIY.js} +11 -11
  66. package/dist/predicate.d.ts +1 -1
  67. package/dist/predicate.js +1 -1
  68. package/dist/presets/category-mapping.d.ts +1 -1
  69. package/dist/presets/corpus.d.ts +1 -1
  70. package/dist/presets/corpus.js +87 -140
  71. package/dist/presets/public-gallery.d.ts +106 -130
  72. package/dist/presets/public-gallery.js +131 -209
  73. package/dist/presets/public-handoff.d.ts +4 -4
  74. package/dist/presets/public-handoff.js +13 -11
  75. package/dist/presets/public-preview-artifacts.d.ts +5 -5
  76. package/dist/presets/public-preview-artifacts.js +9 -9
  77. package/dist/presets/public-preview.d.ts +0 -4
  78. package/dist/presets/public-preview.js +37 -362
  79. package/dist/presets/showcase.d.ts +2 -0
  80. package/dist/presets/showcase.js +627 -0
  81. package/dist/presets/sources.d.ts +1 -1
  82. package/dist/presets/sources.js +5767 -2023
  83. package/dist/presets.d.ts +2 -384
  84. package/dist/presets.js +299 -765
  85. package/dist/printer.d.ts +1 -1
  86. package/dist/{render-ykQhtMs_.js → render-T6IFPnP4.js} +12 -12
  87. package/dist/render-template.d.ts +7 -7
  88. package/dist/render-template.js +6 -6
  89. package/dist/showcase-dvJMn-Lo.d.ts +456 -0
  90. package/dist/{source-locations-BCJQnIfU.d.ts → source-locations-D6Te6Gy1.d.ts} +4 -26
  91. package/dist/source-locations.d.ts +2 -2
  92. package/dist/source-locations.js +3 -26
  93. package/dist/{template-Dy5yOPyp.d.ts → template-G-QPcfmn.d.ts} +4 -4
  94. package/dist/template.d.ts +1 -1
  95. package/dist/template.js +3 -3
  96. package/dist/theme-css.d.ts +3 -3
  97. package/dist/theme-css.js +3 -3
  98. package/dist/tsx-source-instrumentation.d.ts +1 -3
  99. package/dist/tsx-source-instrumentation.js +6 -6
  100. package/dist/tsx-tracer.d.ts +7 -11
  101. package/dist/tsx-tracer.js +164 -164
  102. package/dist/{variables-if1VrV34.d.ts → variables-BnKs1iqb.d.ts} +2 -2
  103. package/dist/variables.d.ts +1 -1
  104. package/dist/variables.js +4 -4
  105. package/package.json +8 -3
  106. package/dist/corpus-qrUD5O6r.d.ts +0 -254
  107. package/dist/diagnostics-Djd9ckLg.d.ts +0 -90
  108. package/dist/diagnostics-oveE-laV.d.ts +0 -79
package/dist/printer.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { w as SmlDocument } from "./ast-63I-VLQx.js";
1
+ import { b as SmlDocument } from "./ast-BLybiDxp.js";
2
2
  //#region src/printer.d.ts
3
3
  declare const printSml: (document: SmlDocument) => string;
4
4
  //#endregion
@@ -1,10 +1,10 @@
1
+ import { n as isObject } from "./guards-eV1qLbf2.js";
1
2
  import { EmailNode, drainEmailDiagnostics } from "./email/jsx-runtime.js";
2
3
  import { declarationValue, kebab, serializeEmailHtml } from "./email/html.js";
3
4
  import { PREHEADER_ATTRIBUTE, preheaderNode } from "./email/components.js";
4
5
  import { EmailCompileError, hasBlockingDiagnostic } from "./email/diagnostics.js";
5
6
  import { snapshotStylesheets } from "./email/stylesheets.js";
6
7
  import { deriveEmailText } from "./email/text.js";
7
- import { Predicate } from "effect";
8
8
  //#region src/email/css-values.ts
9
9
  /** Expand `var(--x, fallback)` against the collected custom properties. */
10
10
  const resolveVariables = (value, variables, depth = 0) => {
@@ -276,7 +276,7 @@ const compareRank = (left, right) => {
276
276
  const outranks = (left, right) => compareRank(left, right) >= 0;
277
277
  /** An authored `style` object becomes declarations with the same normalization the serializer uses. */
278
278
  const inlineDeclarations = (style) => {
279
- if (!Predicate.isObject(style) || Array.isArray(style)) return [];
279
+ if (!isObject(style) || Array.isArray(style)) return [];
280
280
  const output = [];
281
281
  for (const [property, value] of Object.entries(style)) {
282
282
  if (value === void 0 || value === null) continue;
@@ -344,7 +344,7 @@ const applyStylesheet = (root, sheet, options = {}) => {
344
344
  const visitChildren = (children, ancestry, variables, writing) => {
345
345
  const previous = [];
346
346
  const visit = (nodes) => nodes.map((child) => {
347
- if (child._tag === "Element") {
347
+ if (child.type === "Element") {
348
348
  const result = applyTo(child, {
349
349
  element: child,
350
350
  parent: ancestry,
@@ -353,7 +353,7 @@ const applyStylesheet = (root, sheet, options = {}) => {
353
353
  previous.push(child);
354
354
  return result;
355
355
  }
356
- if (child._tag === "Fragment") return EmailNode.Fragment({ children: visit(child.children) });
356
+ if (child.type === "Fragment") return EmailNode.Fragment({ children: visit(child.children) });
357
357
  return child;
358
358
  });
359
359
  return visit(children);
@@ -419,11 +419,11 @@ const applyStylesheet = (root, sheet, options = {}) => {
419
419
  children: visitChildren(element.children, ancestry, variables, writing)
420
420
  });
421
421
  };
422
- const tree = root._tag === "Element" ? applyTo(root, {
422
+ const tree = root.type === "Element" ? applyTo(root, {
423
423
  element: root,
424
424
  parent: void 0,
425
425
  previous: []
426
- }, sheet.variables, horizontalWriting) : root._tag === "Fragment" ? EmailNode.Fragment({ children: visitChildren(root.children, void 0, sheet.variables, horizontalWriting) }) : root;
426
+ }, sheet.variables, horizontalWriting) : root.type === "Fragment" ? EmailNode.Fragment({ children: visitChildren(root.children, void 0, sheet.variables, horizontalWriting) }) : root;
427
427
  for (const [name, origins] of unmatched) diagnostics.push({
428
428
  code: "unmatched-class",
429
429
  severity: "warning",
@@ -457,7 +457,7 @@ const compileEmail = (node, options = {}) => {
457
457
  };
458
458
  /** The preview text already present in the tree, from `<Email preheader>`. */
459
459
  const declaredPreheader = (node) => {
460
- switch (node._tag) {
460
+ switch (node.type) {
461
461
  case "Text":
462
462
  case "Raw": return;
463
463
  case "Fragment": return node.children.reduce((found, child) => found ?? declaredPreheader(child), void 0);
@@ -471,14 +471,14 @@ const declaredPreheader = (node) => {
471
471
  /** Put the hidden preview block first inside `<body>`, or first overall when there is no shell. */
472
472
  const withPreheader = (node, text) => {
473
473
  const insert = (current) => {
474
- if (current._tag === "Fragment") {
474
+ if (current.type === "Fragment") {
475
475
  for (const [index, child] of current.children.entries()) {
476
476
  const replaced = insert(child);
477
477
  if (replaced !== void 0) return EmailNode.Fragment({ children: current.children.with(index, replaced) });
478
478
  }
479
479
  return;
480
480
  }
481
- if (current._tag !== "Element") return void 0;
481
+ if (current.type !== "Element") return void 0;
482
482
  if (current.tag === "body") return EmailNode.Element({
483
483
  ...current,
484
484
  children: [preheaderNode(text), ...current.children]
@@ -496,14 +496,14 @@ const withPreheader = (node, text) => {
496
496
  /** Put the retained rules in a `<style>` at the end of `<head>`. */
497
497
  const withHeadCss = (node, css) => {
498
498
  const insert = (current) => {
499
- if (current._tag === "Fragment") {
499
+ if (current.type === "Fragment") {
500
500
  for (const [index, child] of current.children.entries()) {
501
501
  const replaced = insert(child);
502
502
  if (replaced !== void 0) return EmailNode.Fragment({ children: current.children.with(index, replaced) });
503
503
  }
504
504
  return;
505
505
  }
506
- if (current._tag !== "Element") return void 0;
506
+ if (current.type !== "Element") return void 0;
507
507
  if (current.tag === "head") return EmailNode.Element({
508
508
  ...current,
509
509
  children: [...current.children, EmailNode.Element({
@@ -589,4 +589,4 @@ const renderEmailWith = (stylesheet, template, data, options) => {
589
589
  //#endregion
590
590
  export { applyStylesheet as a, downlevelMediaQuery as c, renderHeadCss as d, resolveVariables as f, renderEmail as i, finalizeValue as l, bindStylesheets as n, classListOf as o, compileEmail as r, matchesSelector as s, EMAIL_DOCTYPE as t, foldCalc as u };
591
591
 
592
- //# sourceMappingURL=render-ykQhtMs_.js.map
592
+ //# sourceMappingURL=render-T6IFPnP4.js.map
@@ -1,9 +1,9 @@
1
- import { o as SmlParseError } from "./diagnostics-oveE-laV.js";
2
- import { w as SmlDocument } from "./ast-63I-VLQx.js";
3
- import { c as UnboundTemplateSourceLocations } from "./source-locations-BCJQnIfU.js";
4
- import { a as VariableKind, l as Variables } from "./variables-if1VrV34.js";
5
- import { a as JsxResult } from "./jsx-runtime-C5k_Zq0A.js";
6
- import { Result } from "effect";
1
+ import { i as SmlParseError } from "./diagnostics-CqepLcpI.js";
2
+ import { b as SmlDocument } from "./ast-BLybiDxp.js";
3
+ import { s as UnboundTemplateSourceLocations } from "./source-locations-D6Te6Gy1.js";
4
+ import { a as VariableKind, l as Variables } from "./variables-BnKs1iqb.js";
5
+ import { a as JsxResult } from "./jsx-runtime-BI4gI19E.js";
6
+ import { Result } from "better-result";
7
7
  //#region src/render-template.d.ts
8
8
  /**
9
9
  * A template is a named function of the recording proxy returning the draft
@@ -39,7 +39,7 @@ interface RenderedTemplate {
39
39
  * that is a programmer error in the user's build, so it propagates rather than
40
40
  * becoming a diagnostic.
41
41
  */
42
- declare const renderTemplate: <T extends Record<string, unknown>>(template: Template<T>) => Result.Result<RenderedTemplate, SmlParseError>;
42
+ declare const renderTemplate: <T extends Record<string, unknown>>(template: Template<T>) => Result<RenderedTemplate, SmlParseError>;
43
43
  //#endregion
44
44
  export { RenderedTemplate, Template, TemplateVariable, renderTemplate };
45
45
  //# sourceMappingURL=render-template.d.ts.map
@@ -1,10 +1,10 @@
1
1
  import { mapJsxSourceLocations } from "./source-locations.js";
2
- import { i as parsePredicate, n as collectPredicateVariables } from "./predicate-CvkzT-a2.js";
2
+ import { i as parsePredicate, n as collectPredicateVariables } from "./predicate-DwXzmqIY.js";
3
3
  import { isRootTag } from "./ast.js";
4
4
  import { createVariablesProxy } from "./variables.js";
5
5
  import { parseSml } from "./parser.js";
6
6
  import { printSml } from "./printer.js";
7
- import { Result } from "effect";
7
+ import { Result } from "better-result";
8
8
  //#region src/render-template.ts
9
9
  /**
10
10
  * Runs a template function and returns its canonical document, source, and
@@ -23,9 +23,9 @@ const renderTemplate = (template) => {
23
23
  root
24
24
  });
25
25
  const parsed = parseSml(source);
26
- if (Result.isFailure(parsed)) return Result.fail(parsed.failure);
27
- const document = parsed.success;
28
- return Result.succeed({
26
+ if (Result.isError(parsed)) return Result.err(parsed.error);
27
+ const document = parsed.value;
28
+ return Result.ok({
29
29
  document,
30
30
  source,
31
31
  variables: collectVariableSchema(document, recorder),
@@ -52,7 +52,7 @@ const collectVariableSchema = (document, recorder) => {
52
52
  if (attribute.value.kind !== "string") continue;
53
53
  if (node.tag === "If" && attribute.name === "test") {
54
54
  const parsed = parsePredicate(attribute.value.value, 0);
55
- if (Result.isSuccess(parsed)) for (const name of collectPredicateVariables(parsed.success)) (insideIf ? conditional : unconditional).add(name);
55
+ if (Result.isOk(parsed)) for (const name of collectPredicateVariables(parsed.value)) (insideIf ? conditional : unconditional).add(name);
56
56
  continue;
57
57
  }
58
58
  for (const match of attribute.value.value.matchAll(INTERPOLATION_PATTERN)) {
@@ -0,0 +1,456 @@
1
+ import { r as PresetCategory } from "./catalog-Db0UcCTg.js";
2
+ //#region presets/showcase.d.ts
3
+ /**
4
+ * The showcase projects: presets authored as complete editable projects under
5
+ * `examples/email-showcase` rather than as the single module `packages/markup/presets/<id>.tsx`.
6
+ *
7
+ * This registry is the one place a showcase project is declared. Codegen reads it to bundle the
8
+ * project's files, the corpus reads it for provenance and canonical source paths, and
9
+ * `showcase.test.ts` fails when an entry here is missing from the catalog, the public gallery or
10
+ * the previews — so a project cannot be half-registered.
11
+ */
12
+ /** How a showcase project's design came about, and what a public surface must say about it. */
13
+ type ShowcaseProvenance = {
14
+ readonly kind: "owned";
15
+ } | {
16
+ readonly kind: "brand-recreation";
17
+ /** The brand whose own email is recreated, named on every public surface. */
18
+ readonly brand: string;
19
+ /** What that brand's email does, in the customer's words. */
20
+ readonly subject: string;
21
+ readonly reviewedNote: string;
22
+ };
23
+ interface ShowcaseProject {
24
+ /** The preset id, matching its catalog row and its entry file's stem. */
25
+ readonly id: string;
26
+ /** The project's TSX entry, relative to the showcase root. */
27
+ readonly entryPath: `emails/${string}.tsx`;
28
+ /** Every other file that travels with the entry: stylesheet, assets, retained notices. */
29
+ readonly files: ReadonlyArray<string>;
30
+ readonly provenance: ShowcaseProvenance;
31
+ /** Must equal the catalog row's category. */
32
+ readonly category: PresetCategory;
33
+ /** Must equal the public gallery entry's slug. */
34
+ readonly gallerySlug: string;
35
+ /** Stable ISO-8601 timestamp recorded on the corpus entry. */
36
+ readonly recordedAt: string;
37
+ }
38
+ /** Repository-relative root of the showcase project, used to build canonical source paths. */
39
+ declare const SHOWCASE_ROOT = "examples/email-showcase";
40
+ declare const showcaseProjects: readonly [{
41
+ readonly id: "data-sharing-review";
42
+ readonly entryPath: "emails/data-sharing-review.tsx";
43
+ readonly files: readonly ["emails/data-sharing-review.css", "emails/assets/data-sharing-review-connection.png", "emails/assets/data-sharing-review-wordmark.png"];
44
+ readonly provenance: {
45
+ readonly kind: "owned";
46
+ };
47
+ readonly category: "transactional";
48
+ readonly gallerySlug: "data-sharing-review";
49
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
50
+ }, {
51
+ readonly id: "editorial-newsletter";
52
+ readonly entryPath: "emails/editorial-newsletter.tsx";
53
+ readonly files: readonly ["emails/editorial-newsletter.css", "emails/assets/editorial-newsletter-author.png", "emails/assets/editorial-newsletter-hero.png", "emails/assets/editorial-newsletter-sponsor.png", "emails/assets/editorial-newsletter-wordmark.png"];
54
+ readonly provenance: {
55
+ readonly kind: "owned";
56
+ };
57
+ readonly category: "digest";
58
+ readonly gallerySlug: "editorial-newsletter";
59
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
60
+ }, {
61
+ readonly id: "email-verification";
62
+ readonly entryPath: "emails/email-verification.tsx";
63
+ readonly files: readonly ["emails/email-verification.css", "emails/assets/email-verification-badge.png", "emails/assets/email-verification-wordmark.png"];
64
+ readonly provenance: {
65
+ readonly kind: "owned";
66
+ };
67
+ readonly category: "transactional";
68
+ readonly gallerySlug: "email-verification";
69
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
70
+ }, {
71
+ readonly id: "events-roundup";
72
+ readonly entryPath: "emails/events-roundup.tsx";
73
+ readonly files: readonly ["emails/events-roundup.css", "emails/assets/events-roundup-spotlight.png", "emails/assets/events-roundup-tile-five.png", "emails/assets/events-roundup-tile-four.png", "emails/assets/events-roundup-tile-one.png", "emails/assets/events-roundup-tile-six.png", "emails/assets/events-roundup-tile-three.png", "emails/assets/events-roundup-tile-two.png", "emails/assets/events-roundup-wordmark.png"];
74
+ readonly provenance: {
75
+ readonly kind: "owned";
76
+ };
77
+ readonly category: "digest";
78
+ readonly gallerySlug: "events-roundup";
79
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
80
+ }, {
81
+ readonly id: "feature-release-roundup";
82
+ readonly entryPath: "emails/feature-release-roundup.tsx";
83
+ readonly files: readonly ["emails/feature-release-roundup.css", "emails/assets/feature-release-roundup-release-activity.png", "emails/assets/feature-release-roundup-release-branching.png", "emails/assets/feature-release-roundup-release-keys.png", "emails/assets/feature-release-roundup-release-nodes.png", "emails/assets/feature-release-roundup-release-regions.png", "emails/assets/feature-release-roundup-wordmark.png"];
84
+ readonly provenance: {
85
+ readonly kind: "owned";
86
+ };
87
+ readonly category: "marketing";
88
+ readonly gallerySlug: "feature-release-roundup";
89
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
90
+ }, {
91
+ readonly id: "feedback-request";
92
+ readonly entryPath: "emails/feedback-request.tsx";
93
+ readonly files: readonly ["emails/feedback-request.css", "emails/assets/feedback-request-avatar.png", "emails/assets/feedback-request-wordmark.png"];
94
+ readonly provenance: {
95
+ readonly kind: "owned";
96
+ };
97
+ readonly category: "lifecycle";
98
+ readonly gallerySlug: "feedback-request";
99
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
100
+ }, {
101
+ readonly id: "flash-getaway-offer";
102
+ readonly entryPath: "emails/flash-getaway-offer.tsx";
103
+ readonly files: readonly ["emails/flash-getaway-offer.css", "emails/assets/flash-getaway-offer-banner.png", "emails/assets/flash-getaway-offer-city-harbour.png", "emails/assets/flash-getaway-offer-desert-canyon.png", "emails/assets/flash-getaway-offer-reef-bay.png", "emails/assets/flash-getaway-offer-snow-ridge.png", "emails/assets/flash-getaway-offer-wordmark.png"];
104
+ readonly provenance: {
105
+ readonly kind: "owned";
106
+ };
107
+ readonly category: "marketing";
108
+ readonly gallerySlug: "flash-getaway-offer";
109
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
110
+ }, {
111
+ readonly id: "industry-news-digest";
112
+ readonly entryPath: "emails/industry-news-digest.tsx";
113
+ readonly files: readonly ["emails/industry-news-digest.css", "emails/assets/industry-news-digest-lead.png", "emails/assets/industry-news-digest-sponsor.png", "emails/assets/industry-news-digest-wordmark.png"];
114
+ readonly provenance: {
115
+ readonly kind: "owned";
116
+ };
117
+ readonly category: "digest";
118
+ readonly gallerySlug: "industry-news-digest";
119
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
120
+ }, {
121
+ readonly id: "rewards-milestone";
122
+ readonly entryPath: "emails/rewards-milestone.tsx";
123
+ readonly files: readonly ["emails/assets/rewards-milestone-banner.png", "emails/assets/rewards-milestone-tier-amber.png", "emails/assets/rewards-milestone-tier-brass.png", "emails/assets/rewards-milestone-tier-copper.png", "emails/assets/rewards-milestone-tier-slate.png", "emails/assets/rewards-milestone-wordmark.png", "emails/rewards-milestone.css"];
124
+ readonly provenance: {
125
+ readonly kind: "owned";
126
+ };
127
+ readonly category: "marketing";
128
+ readonly gallerySlug: "rewards-milestone";
129
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
130
+ }, {
131
+ readonly id: "member-referral-offer";
132
+ readonly entryPath: "emails/member-referral-offer.tsx";
133
+ readonly files: readonly ["emails/assets/member-referral-offer-hero.png", "emails/assets/member-referral-offer-step-earn.png", "emails/assets/member-referral-offer-step-join.png", "emails/assets/member-referral-offer-step-share.png", "emails/assets/member-referral-offer-wordmark.png", "emails/member-referral-offer.css"];
134
+ readonly provenance: {
135
+ readonly kind: "owned";
136
+ };
137
+ readonly category: "marketing";
138
+ readonly gallerySlug: "member-referral-offer";
139
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
140
+ }, {
141
+ readonly id: "catalog-sale-newsletter";
142
+ readonly entryPath: "emails/catalog-sale-newsletter.tsx";
143
+ readonly files: readonly ["emails/assets/catalog-sale-newsletter-banner.png", "emails/assets/catalog-sale-newsletter-item-blanket.png", "emails/assets/catalog-sale-newsletter-item-crate.png", "emails/assets/catalog-sale-newsletter-item-kettle.png", "emails/assets/catalog-sale-newsletter-item-lantern.png", "emails/assets/catalog-sale-newsletter-wordmark.png", "emails/catalog-sale-newsletter.css"];
144
+ readonly provenance: {
145
+ readonly kind: "owned";
146
+ };
147
+ readonly category: "marketing";
148
+ readonly gallerySlug: "catalog-sale-newsletter";
149
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
150
+ }, {
151
+ readonly id: "event-invite";
152
+ readonly entryPath: "emails/event-invite.tsx";
153
+ readonly files: readonly ["emails/assets/event-invite-hero.png", "emails/assets/event-invite-wordmark.png", "emails/event-invite.css"];
154
+ readonly provenance: {
155
+ readonly kind: "owned";
156
+ };
157
+ readonly category: "marketing";
158
+ readonly gallerySlug: "event-invite";
159
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
160
+ }, {
161
+ readonly id: "limited-time-savings";
162
+ readonly entryPath: "emails/limited-time-savings.tsx";
163
+ readonly files: readonly ["emails/assets/limited-time-savings-banner.png", "emails/assets/limited-time-savings-wordmark.png", "emails/limited-time-savings.css"];
164
+ readonly provenance: {
165
+ readonly kind: "owned";
166
+ };
167
+ readonly category: "marketing";
168
+ readonly gallerySlug: "limited-time-savings";
169
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
170
+ }, {
171
+ readonly id: "membership-promo";
172
+ readonly entryPath: "emails/membership-promo.tsx";
173
+ readonly files: readonly ["emails/assets/membership-promo-hero.png", "emails/assets/membership-promo-tier-cellar.png", "emails/assets/membership-promo-tier-market.png", "emails/assets/membership-promo-tier-pantry.png", "emails/assets/membership-promo-wordmark.png", "emails/membership-promo.css"];
174
+ readonly provenance: {
175
+ readonly kind: "owned";
176
+ };
177
+ readonly category: "marketing";
178
+ readonly gallerySlug: "membership-promotion";
179
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
180
+ }, {
181
+ readonly id: "announcement";
182
+ readonly entryPath: "emails/announcement.tsx";
183
+ readonly files: readonly ["emails/announcement.css", "emails/assets/announcement-hero.png", "emails/assets/announcement-wordmark.png"];
184
+ readonly provenance: {
185
+ readonly kind: "owned";
186
+ };
187
+ readonly category: "marketing";
188
+ readonly gallerySlug: "feature-announcement";
189
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
190
+ }, {
191
+ readonly id: "linear-login-code";
192
+ readonly entryPath: "emails/linear-login-code.tsx";
193
+ readonly files: readonly ["emails/linear-login-code.css", "README.md", "emails/assets/linear-logo.png"];
194
+ readonly provenance: {
195
+ readonly kind: "brand-recreation";
196
+ readonly brand: "Linear";
197
+ readonly subject: "login code";
198
+ readonly reviewedNote: "Reviewed recreation of Linear's login code email, its canonical project assets, and its brand attribution.";
199
+ };
200
+ readonly category: "transactional";
201
+ readonly gallerySlug: "linear-login-code";
202
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
203
+ }, {
204
+ readonly id: "membership-benefits-promo";
205
+ readonly entryPath: "emails/membership-benefits-promo.tsx";
206
+ readonly files: readonly ["emails/membership-benefits-promo.css", "emails/assets/membership-benefits-promo-icon-concierge.png", "emails/assets/membership-benefits-promo-icon-lounge.png", "emails/assets/membership-benefits-promo-icon-shield.png", "emails/assets/membership-benefits-promo-icon-suitcase.png", "emails/assets/membership-benefits-promo-icon-table.png", "emails/assets/membership-benefits-promo-icon-ticket.png", "emails/assets/membership-benefits-promo-panel.png", "emails/assets/membership-benefits-promo-wordmark.png"];
207
+ readonly provenance: {
208
+ readonly kind: "owned";
209
+ };
210
+ readonly category: "marketing";
211
+ readonly gallerySlug: "membership-benefits-promo";
212
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
213
+ }, {
214
+ readonly id: "notification";
215
+ readonly entryPath: "emails/notification.tsx";
216
+ readonly files: readonly ["emails/notification.css", "emails/assets/notification-avatar-one.png", "emails/assets/notification-avatar-three.png", "emails/assets/notification-avatar-two.png", "emails/assets/notification-wordmark.png"];
217
+ readonly provenance: {
218
+ readonly kind: "owned";
219
+ };
220
+ readonly category: "transactional";
221
+ readonly gallerySlug: "activity-notification";
222
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
223
+ }, {
224
+ readonly id: "onboarding-step";
225
+ readonly entryPath: "emails/onboarding-step.tsx";
226
+ readonly files: readonly ["emails/onboarding-step.css", "emails/assets/onboarding-step-illustration.png", "emails/assets/onboarding-step-wordmark.png"];
227
+ readonly provenance: {
228
+ readonly kind: "owned";
229
+ };
230
+ readonly category: "lifecycle";
231
+ readonly gallerySlug: "onboarding-step";
232
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
233
+ }, {
234
+ readonly id: "order-receipt";
235
+ readonly entryPath: "emails/order-receipt.tsx";
236
+ readonly files: readonly ["emails/order-receipt.css", "emails/assets/order-receipt-candles.png", "emails/assets/order-receipt-mug.png", "emails/assets/order-receipt-napkins.png", "emails/assets/order-receipt-throw.png", "emails/assets/order-receipt-wordmark.png"];
237
+ readonly provenance: {
238
+ readonly kind: "owned";
239
+ };
240
+ readonly category: "transactional";
241
+ readonly gallerySlug: "order-receipt";
242
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
243
+ }, {
244
+ readonly id: "otp";
245
+ readonly entryPath: "emails/otp.tsx";
246
+ readonly files: readonly ["emails/otp.css", "emails/assets/otp-wordmark.png"];
247
+ readonly provenance: {
248
+ readonly kind: "owned";
249
+ };
250
+ readonly category: "transactional";
251
+ readonly gallerySlug: "one-time-passcode";
252
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
253
+ }, {
254
+ readonly id: "password-reset";
255
+ readonly entryPath: "emails/password-reset.tsx";
256
+ readonly files: readonly ["emails/password-reset.css", "emails/assets/password-reset-lock.png", "emails/assets/password-reset-wordmark.png"];
257
+ readonly provenance: {
258
+ readonly kind: "owned";
259
+ };
260
+ readonly category: "transactional";
261
+ readonly gallerySlug: "password-reset";
262
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
263
+ }, {
264
+ readonly id: "payment-failed";
265
+ readonly entryPath: "emails/payment-failed.tsx";
266
+ readonly files: readonly ["emails/payment-failed.css", "emails/assets/payment-failed-bowls.png", "emails/assets/payment-failed-kettle.png", "emails/assets/payment-failed-tray.png", "emails/assets/payment-failed-wordmark.png"];
267
+ readonly provenance: {
268
+ readonly kind: "owned";
269
+ };
270
+ readonly category: "transactional";
271
+ readonly gallerySlug: "payment-failed";
272
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
273
+ }, {
274
+ readonly id: "product-digest";
275
+ readonly entryPath: "emails/product-digest.tsx";
276
+ readonly files: readonly ["emails/product-digest.css", "emails/assets/product-digest-podcast.png", "emails/assets/product-digest-wordmark.png"];
277
+ readonly provenance: {
278
+ readonly kind: "owned";
279
+ };
280
+ readonly category: "digest";
281
+ readonly gallerySlug: "product-digest";
282
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
283
+ }, {
284
+ readonly id: "product-launch-promo";
285
+ readonly entryPath: "emails/product-launch-promo.tsx";
286
+ readonly files: readonly ["emails/product-launch-promo.css", "emails/assets/oakline-hero.png", "emails/assets/oakline-wordmark.png", "emails/assets/product-chair.png", "emails/assets/product-lamp.png", "emails/assets/product-mirror.png", "emails/assets/product-stool.png", "emails/assets/product-throw.png", "emails/assets/product-vase.png"];
287
+ readonly provenance: {
288
+ readonly kind: "owned";
289
+ };
290
+ readonly category: "marketing";
291
+ readonly gallerySlug: "product-launch-promotion";
292
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
293
+ }, {
294
+ readonly id: "product-newsletter";
295
+ readonly entryPath: "emails/product-newsletter.tsx";
296
+ readonly files: readonly ["emails/product-newsletter.css", "emails/assets/newsletter-lead.png", "emails/assets/newsletter-story-five.png", "emails/assets/newsletter-story-four.png", "emails/assets/newsletter-story-one.png", "emails/assets/newsletter-story-three.png", "emails/assets/newsletter-story-two.png", "emails/assets/newsletter-wordmark.png"];
297
+ readonly provenance: {
298
+ readonly kind: "owned";
299
+ };
300
+ readonly category: "digest";
301
+ readonly gallerySlug: "product-newsletter";
302
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
303
+ }, {
304
+ readonly id: "product-onboarding-tour";
305
+ readonly entryPath: "emails/product-onboarding-tour.tsx";
306
+ readonly files: readonly ["emails/product-onboarding-tour.css", "emails/assets/product-onboarding-tour-feature-alerts.png", "emails/assets/product-onboarding-tour-feature-digest.png", "emails/assets/product-onboarding-tour-feature-questions.png", "emails/assets/product-onboarding-tour-read-alerts.png", "emails/assets/product-onboarding-tour-read-metrics.png", "emails/assets/product-onboarding-tour-wordmark.png"];
307
+ readonly provenance: {
308
+ readonly kind: "owned";
309
+ };
310
+ readonly category: "lifecycle";
311
+ readonly gallerySlug: "product-onboarding-tour";
312
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
313
+ }, {
314
+ readonly id: "product-updates-roundup";
315
+ readonly entryPath: "emails/product-updates-roundup.tsx";
316
+ readonly files: readonly ["emails/product-updates-roundup.css", "emails/assets/product-updates-roundup-access-matrix.png", "emails/assets/product-updates-roundup-import-pipeline.png", "emails/assets/product-updates-roundup-query-timeline.png", "emails/assets/product-updates-roundup-status-board.png", "emails/assets/product-updates-roundup-usage-chart.png", "emails/assets/product-updates-roundup-webhook-retry.png", "emails/assets/product-updates-roundup-wordmark.png"];
317
+ readonly provenance: {
318
+ readonly kind: "owned";
319
+ };
320
+ readonly category: "marketing";
321
+ readonly gallerySlug: "product-updates-roundup";
322
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
323
+ }, {
324
+ readonly id: "season-clearance-promo";
325
+ readonly entryPath: "emails/season-clearance-promo.tsx";
326
+ readonly files: readonly ["emails/season-clearance-promo.css", "emails/assets/season-clearance-promo-banner.png", "emails/assets/season-clearance-promo-cushions.png", "emails/assets/season-clearance-promo-planter.png", "emails/assets/season-clearance-promo-secondary.png", "emails/assets/season-clearance-promo-side-table.png", "emails/assets/season-clearance-promo-wall-clock.png", "emails/assets/season-clearance-promo-wordmark.png"];
327
+ readonly provenance: {
328
+ readonly kind: "owned";
329
+ };
330
+ readonly category: "marketing";
331
+ readonly gallerySlug: "season-clearance-promo";
332
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
333
+ }, {
334
+ readonly id: "seasonal-sale-flyer";
335
+ readonly entryPath: "emails/seasonal-sale-flyer.tsx";
336
+ readonly files: readonly ["emails/seasonal-sale-flyer.css", "emails/assets/seasonal-sale-flyer-bedding.png", "emails/assets/seasonal-sale-flyer-cookware.png", "emails/assets/seasonal-sale-flyer-hero.png", "emails/assets/seasonal-sale-flyer-lighting.png", "emails/assets/seasonal-sale-flyer-outdoor.png", "emails/assets/seasonal-sale-flyer-storage.png", "emails/assets/seasonal-sale-flyer-tableware.png", "emails/assets/seasonal-sale-flyer-wordmark.png"];
337
+ readonly provenance: {
338
+ readonly kind: "owned";
339
+ };
340
+ readonly category: "marketing";
341
+ readonly gallerySlug: "seasonal-sale-flyer";
342
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
343
+ }, {
344
+ readonly id: "setup-checklist";
345
+ readonly entryPath: "emails/setup-checklist.tsx";
346
+ readonly files: readonly ["emails/setup-checklist.css", "emails/assets/setup-checklist-step-invite.png", "emails/assets/setup-checklist-step-publish.png", "emails/assets/setup-checklist-step-source.png", "emails/assets/setup-checklist-wordmark.png"];
347
+ readonly provenance: {
348
+ readonly kind: "owned";
349
+ };
350
+ readonly category: "lifecycle";
351
+ readonly gallerySlug: "setup-checklist";
352
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
353
+ }, {
354
+ readonly id: "shipping-update";
355
+ readonly entryPath: "emails/shipping-update.tsx";
356
+ readonly files: readonly ["emails/shipping-update.css", "emails/assets/shipping-update-runner.png", "emails/assets/shipping-update-teapot.png", "emails/assets/shipping-update-tumblers.png", "emails/assets/shipping-update-wordmark.png"];
357
+ readonly provenance: {
358
+ readonly kind: "owned";
359
+ };
360
+ readonly category: "transactional";
361
+ readonly gallerySlug: "shipping-update";
362
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
363
+ }, {
364
+ readonly id: "team-invite";
365
+ readonly entryPath: "emails/team-invite.tsx";
366
+ readonly files: readonly ["emails/team-invite.css", "emails/assets/team-invite-inviter.png", "emails/assets/team-invite-teammate-one.png", "emails/assets/team-invite-teammate-three.png", "emails/assets/team-invite-teammate-two.png", "emails/assets/team-invite-wordmark.png"];
367
+ readonly provenance: {
368
+ readonly kind: "owned";
369
+ };
370
+ readonly category: "transactional";
371
+ readonly gallerySlug: "team-invite";
372
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
373
+ }, {
374
+ readonly id: "travel-rewards-promo";
375
+ readonly entryPath: "emails/travel-rewards-promo.tsx";
376
+ readonly files: readonly ["emails/travel-rewards-promo.css", "emails/assets/travel-rewards-promo-hero.png", "emails/assets/travel-rewards-promo-partner-dining.png", "emails/assets/travel-rewards-promo-partner-drives.png", "emails/assets/travel-rewards-promo-partner-lounges.png", "emails/assets/travel-rewards-promo-partner-stays.png", "emails/assets/travel-rewards-promo-wordmark.png"];
377
+ readonly provenance: {
378
+ readonly kind: "owned";
379
+ };
380
+ readonly category: "marketing";
381
+ readonly gallerySlug: "travel-rewards-promo";
382
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
383
+ }, {
384
+ readonly id: "trial-ending";
385
+ readonly entryPath: "emails/trial-ending.tsx";
386
+ readonly files: readonly ["emails/trial-ending.css", "emails/assets/trial-ending-countdown.png", "emails/assets/trial-ending-wordmark.png"];
387
+ readonly provenance: {
388
+ readonly kind: "owned";
389
+ };
390
+ readonly category: "lifecycle";
391
+ readonly gallerySlug: "trial-ending";
392
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
393
+ }, {
394
+ readonly id: "vercel-invitation";
395
+ readonly entryPath: "emails/vercel-invitation.tsx";
396
+ readonly files: readonly ["emails/vercel-invitation.css", "README.md", "emails/assets/vercel-arrow.png", "emails/assets/vercel-logo.png", "emails/assets/vercel-team.png", "emails/assets/vercel-user.png"];
397
+ readonly provenance: {
398
+ readonly kind: "brand-recreation";
399
+ readonly brand: "Vercel";
400
+ readonly subject: "team invitation";
401
+ readonly reviewedNote: "Reviewed recreation of Vercel's team invitation email, its canonical project assets, and its brand attribution.";
402
+ };
403
+ readonly category: "transactional";
404
+ readonly gallerySlug: "vercel-team-invitation";
405
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
406
+ }, {
407
+ readonly id: "weekly-deals-circular";
408
+ readonly entryPath: "emails/weekly-deals-circular.tsx";
409
+ readonly files: readonly ["emails/weekly-deals-circular.css", "emails/assets/weekly-deals-circular-banner.png", "emails/assets/weekly-deals-circular-basket.png", "emails/assets/weekly-deals-circular-board.png", "emails/assets/weekly-deals-circular-bowls.png", "emails/assets/weekly-deals-circular-duvet.png", "emails/assets/weekly-deals-circular-kettle.png", "emails/assets/weekly-deals-circular-rug.png", "emails/assets/weekly-deals-circular-wordmark.png"];
410
+ readonly provenance: {
411
+ readonly kind: "owned";
412
+ };
413
+ readonly category: "marketing";
414
+ readonly gallerySlug: "weekly-deals-circular";
415
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
416
+ }, {
417
+ readonly id: "welcome";
418
+ readonly entryPath: "emails/welcome.tsx";
419
+ readonly files: readonly ["emails/welcome.css", "emails/assets/welcome-hero.png", "emails/assets/welcome-wordmark.png"];
420
+ readonly provenance: {
421
+ readonly kind: "owned";
422
+ };
423
+ readonly category: "transactional";
424
+ readonly gallerySlug: "welcome-email";
425
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
426
+ }, {
427
+ readonly id: "win-back";
428
+ readonly entryPath: "emails/win-back.tsx";
429
+ readonly files: readonly ["emails/win-back.css", "emails/assets/win-back-update-alerts.png", "emails/assets/win-back-update-exports.png", "emails/assets/win-back-update-mobile.png", "emails/assets/win-back-update-speed.png", "emails/assets/win-back-update-workspaces.png", "emails/assets/win-back-wordmark.png"];
430
+ readonly provenance: {
431
+ readonly kind: "owned";
432
+ };
433
+ readonly category: "lifecycle";
434
+ readonly gallerySlug: "win-back";
435
+ readonly recordedAt: "2026-09-08T00:00:00.000Z";
436
+ }];
437
+ type ShowcaseProjectId = (typeof showcaseProjects)[number]["id"];
438
+ type BrandRecreationShowcaseId = Extract<(typeof showcaseProjects)[number], {
439
+ readonly provenance: {
440
+ readonly kind: "brand-recreation";
441
+ };
442
+ }>["id"];
443
+ type OwnedShowcaseId = Extract<(typeof showcaseProjects)[number], {
444
+ readonly provenance: {
445
+ readonly kind: "owned";
446
+ };
447
+ }>["id"];
448
+ declare const isShowcaseProjectId: (id: string) => id is ShowcaseProjectId;
449
+ declare const showcaseProject: (id: string) => ShowcaseProject | undefined;
450
+ /** Repository-relative path of a showcase project's TSX entry. */
451
+ declare const showcaseSourcePath: (project: ShowcaseProject) => string;
452
+ /** Every file the project bundles, entry first in sorted order — the shape codegen writes. */
453
+ declare const showcaseProjectPaths: (project: ShowcaseProject) => ReadonlyArray<string>;
454
+ //#endregion
455
+ export { ShowcaseProjectId as a, showcaseProject as c, showcaseSourcePath as d, ShowcaseProject as i, showcaseProjectPaths as l, OwnedShowcaseId as n, ShowcaseProvenance as o, SHOWCASE_ROOT as r, isShowcaseProjectId as s, BrandRecreationShowcaseId as t, showcaseProjects as u };
456
+ //# sourceMappingURL=showcase-dvJMn-Lo.d.ts.map