@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.
- package/AGENTS.md +17 -0
- package/dist/{ast-63I-VLQx.d.ts → ast-BLybiDxp.d.ts} +34 -60
- package/dist/ast.d.ts +2 -2
- package/dist/ast.js +4 -52
- package/dist/catalog-Db0UcCTg.d.ts +356 -0
- package/dist/{checks-DXuERO4B.js → checks-CmmITP6j.js} +14 -14
- package/dist/checks.d.ts +1 -1
- package/dist/checks.js +1 -1
- package/dist/classes.d.ts +1 -1
- package/dist/compile-sms.d.ts +3 -3
- package/dist/compile-whatsapp.d.ts +5 -5
- package/dist/compile-whatsapp.js +3 -3
- package/dist/compile.d.ts +5 -5
- package/dist/compile.js +5 -5
- package/dist/compiler.d.ts +4 -4
- package/dist/compiler.js +6 -6
- package/dist/components.d.ts +4 -4
- package/dist/conditionals.js +3 -3
- package/dist/corpus-CM7rKX41.d.ts +106 -0
- package/dist/{css-ar2lU3NC.d.ts → css-DoNc7CiC.d.ts} +4 -5
- package/dist/diagnostics-CqepLcpI.d.ts +47 -0
- package/dist/diagnostics-eFM9A_TU.d.ts +46 -0
- package/dist/diagnostics.d.ts +2 -2
- package/dist/diagnostics.js +15 -29
- package/dist/{elements-DtwKlFVH.d.ts → elements-ChJULZlh.d.ts} +40 -161
- package/dist/email/components.d.ts +1 -1
- package/dist/email/diagnostics.d.ts +1 -1
- package/dist/email/diagnostics.js +8 -43
- package/dist/email/elements.d.ts +1 -1
- package/dist/email/html.d.ts +2 -2
- package/dist/email/html.js +9 -9
- package/dist/email/jsx-dev-runtime.d.ts +3 -21
- package/dist/email/jsx-runtime.d.ts +1 -1
- package/dist/email/jsx-runtime.js +29 -3
- package/dist/email/render.d.ts +4 -4
- package/dist/email/render.js +1 -1
- package/dist/email/selection.d.ts +20 -31
- package/dist/email/selection.js +1 -53
- package/dist/email/source-edit.d.ts +1 -1
- package/dist/email/source-edit.js +2 -2
- package/dist/email/stylesheets.d.ts +1 -1
- package/dist/email/text.d.ts +1 -1
- package/dist/email/text.js +3 -3
- package/dist/emit.d.ts +2 -2
- package/dist/emit.js +5 -5
- package/dist/guards-eV1qLbf2.js +9 -0
- package/dist/{input-schema-BIfzI63B.d.ts → input-schema-7dPFVvNE.d.ts} +2 -2
- package/dist/input-schema-zjkgrXn2.js +455 -0
- package/dist/input-schema.d.ts +1 -1
- package/dist/input-schema.js +1 -169
- package/dist/interpolate.d.ts +9 -12
- package/dist/interpolate.js +1 -19
- package/dist/jsx-dev-runtime.d.ts +2 -2
- package/dist/{jsx-runtime-C5k_Zq0A.d.ts → jsx-runtime-BI4gI19E.d.ts} +3 -3
- package/dist/jsx-runtime.d.ts +1 -1
- package/dist/jsx-runtime.js +3 -3
- package/dist/model.d.ts +18 -33
- package/dist/model.js +4 -17
- package/dist/ops.d.ts +78 -172
- package/dist/ops.js +51 -117
- package/dist/{parser-CGBS73Gz.d.ts → parser-b_Kp5MT6.d.ts} +5 -5
- package/dist/parser.d.ts +1 -1
- package/dist/parser.js +8 -8
- package/dist/{predicate-G2SeSvoN.d.ts → predicate-Bmvgw7Ao.d.ts} +4 -4
- package/dist/{predicate-CvkzT-a2.js → predicate-DwXzmqIY.js} +11 -11
- package/dist/predicate.d.ts +1 -1
- package/dist/predicate.js +1 -1
- package/dist/presets/category-mapping.d.ts +1 -1
- package/dist/presets/corpus.d.ts +1 -1
- package/dist/presets/corpus.js +87 -140
- package/dist/presets/public-gallery.d.ts +106 -130
- package/dist/presets/public-gallery.js +131 -209
- package/dist/presets/public-handoff.d.ts +4 -4
- package/dist/presets/public-handoff.js +13 -11
- package/dist/presets/public-preview-artifacts.d.ts +5 -5
- package/dist/presets/public-preview-artifacts.js +9 -9
- package/dist/presets/public-preview.d.ts +0 -4
- package/dist/presets/public-preview.js +37 -362
- package/dist/presets/showcase.d.ts +2 -0
- package/dist/presets/showcase.js +627 -0
- package/dist/presets/sources.d.ts +1 -1
- package/dist/presets/sources.js +5767 -2023
- package/dist/presets.d.ts +2 -384
- package/dist/presets.js +299 -765
- package/dist/printer.d.ts +1 -1
- package/dist/{render-ykQhtMs_.js → render-T6IFPnP4.js} +12 -12
- package/dist/render-template.d.ts +7 -7
- package/dist/render-template.js +6 -6
- package/dist/showcase-dvJMn-Lo.d.ts +456 -0
- package/dist/{source-locations-BCJQnIfU.d.ts → source-locations-D6Te6Gy1.d.ts} +4 -26
- package/dist/source-locations.d.ts +2 -2
- package/dist/source-locations.js +3 -26
- package/dist/{template-Dy5yOPyp.d.ts → template-G-QPcfmn.d.ts} +4 -4
- package/dist/template.d.ts +1 -1
- package/dist/template.js +3 -3
- package/dist/theme-css.d.ts +3 -3
- package/dist/theme-css.js +3 -3
- package/dist/tsx-source-instrumentation.d.ts +1 -3
- package/dist/tsx-source-instrumentation.js +6 -6
- package/dist/tsx-tracer.d.ts +7 -11
- package/dist/tsx-tracer.js +164 -164
- package/dist/{variables-if1VrV34.d.ts → variables-BnKs1iqb.d.ts} +2 -2
- package/dist/variables.d.ts +1 -1
- package/dist/variables.js +4 -4
- package/package.json +8 -3
- package/dist/corpus-qrUD5O6r.d.ts +0 -254
- package/dist/diagnostics-Djd9ckLg.d.ts +0 -90
- package/dist/diagnostics-oveE-laV.d.ts +0 -79
package/dist/printer.d.ts
CHANGED
|
@@ -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 (!
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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-
|
|
592
|
+
//# sourceMappingURL=render-T6IFPnP4.js.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { a as VariableKind, l as Variables } from "./variables-
|
|
5
|
-
import { a as JsxResult } from "./jsx-runtime-
|
|
6
|
-
import { Result } from "
|
|
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
|
|
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
|
package/dist/render-template.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { mapJsxSourceLocations } from "./source-locations.js";
|
|
2
|
-
import { i as parsePredicate, n as collectPredicateVariables } from "./predicate-
|
|
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 "
|
|
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.
|
|
27
|
-
const document = parsed.
|
|
28
|
-
return Result.
|
|
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.
|
|
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
|