@samva/markup 0.6.0 → 0.8.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 (83) hide show
  1. package/AGENTS.md +94 -47
  2. package/README.md +1 -1
  3. package/dist/brand-DcoVkh_S.d.ts +88 -0
  4. package/dist/{catalog-60eaYC7b.d.ts → catalog-CKuOooB8.d.ts} +13 -15
  5. package/dist/{checks-DBweSIPN.js → checks-D73Xizbw.js} +414 -2
  6. package/dist/checks.js +1 -1
  7. package/dist/classes.d.ts +2 -3
  8. package/dist/compile-sms.d.ts +1 -1
  9. package/dist/compile-whatsapp.d.ts +1 -1
  10. package/dist/compiler.d.ts +62 -45
  11. package/dist/compiler.js +206 -863
  12. package/dist/components.d.ts +2 -2
  13. package/dist/{corpus-BjYMqOoY.d.ts → corpus-CPPfgAHN.d.ts} +14 -14
  14. package/dist/{css-COcFOT1y.d.ts → css-CS2jLID6.d.ts} +28 -2
  15. package/dist/email/assets.d.ts +40 -0
  16. package/dist/email/assets.js +63 -0
  17. package/dist/email/brand-footer.d.ts +34 -0
  18. package/dist/email/brand-footer.js +62 -0
  19. package/dist/email/brand.d.ts +2 -0
  20. package/dist/email/brand.js +148 -0
  21. package/dist/email/html.d.ts +2 -42
  22. package/dist/email/html.js +11 -0
  23. package/dist/email/render.d.ts +12 -5
  24. package/dist/email/render.js +2 -5
  25. package/dist/email/selection.d.ts +2 -91
  26. package/dist/email/stylesheets.d.ts +1 -1
  27. package/dist/email/stylesheets.js +3 -0
  28. package/dist/emit.js +2 -2
  29. package/dist/html-Bl9BAdqc.d.ts +42 -0
  30. package/dist/{ops-2aiiYO7m.js → ops-BvwqHl7V.js} +2 -2
  31. package/dist/ops.js +1 -1
  32. package/dist/{parser-CQcASEyy.d.ts → parser-t29cHLVL.d.ts} +2 -2
  33. package/dist/parser.d.ts +1 -1
  34. package/dist/parser.js +1 -2
  35. package/dist/registry-Dcp6QEK_.d.ts +73 -0
  36. package/dist/registry.d.ts +2 -42
  37. package/dist/{render-aaJBnsXK.js → render-vAv_4r9v.js} +174 -17
  38. package/dist/selection-CCArx9lU.d.ts +91 -0
  39. package/dist/{showcase-DGZAWn4Z.d.ts → showcase-egkusQBf.d.ts} +15 -56
  40. package/dist/{presets → starters}/category-mapping.d.ts +5 -5
  41. package/dist/{presets → starters}/category-mapping.js +5 -5
  42. package/dist/starters/corpus.d.ts +2 -0
  43. package/dist/{presets → starters}/corpus.js +15 -15
  44. package/dist/starters/library.d.ts +18 -0
  45. package/dist/starters/library.js +692 -0
  46. package/dist/{presets → starters}/public-gallery.d.ts +47 -47
  47. package/dist/{presets → starters}/public-gallery.js +92 -92
  48. package/dist/{presets → starters}/public-handoff.d.ts +14 -14
  49. package/dist/{presets → starters}/public-handoff.js +40 -40
  50. package/dist/{presets → starters}/public-preview-artifacts.d.ts +4 -4
  51. package/dist/{presets → starters}/public-preview-artifacts.js +15 -15
  52. package/dist/{presets → starters}/public-preview.d.ts +1 -1
  53. package/dist/{presets → starters}/public-preview.js +3 -3
  54. package/dist/starters/showcase.d.ts +2 -0
  55. package/dist/starters/showcase.js +335 -0
  56. package/dist/starters/sources.d.ts +45 -0
  57. package/dist/{presets → starters}/sources.js +1951 -272
  58. package/dist/starters/theme.d.ts +45 -0
  59. package/dist/starters/theme.js +77 -0
  60. package/dist/starters.d.ts +2 -0
  61. package/dist/{presets.js → starters.js} +4 -11
  62. package/dist/tailwind-BYq7Lo6u.js +727 -0
  63. package/dist/theme-css-hFqcPSar.js +587 -0
  64. package/dist/theme-css.d.ts +56 -15
  65. package/dist/theme-css.js +2 -509
  66. package/dist/tsx-source-instrumentation.d.ts +9 -0
  67. package/dist/tsx-source-instrumentation.js +20 -2
  68. package/dist/tsx-tracer.js +3 -3
  69. package/dist/unsubscribe-link-CoesnQDU.js +26 -0
  70. package/package.json +56 -44
  71. package/samva-brand.d.ts +14 -0
  72. package/dist/footer.d.ts +0 -66
  73. package/dist/footer.js +0 -93
  74. package/dist/presets/corpus.d.ts +0 -2
  75. package/dist/presets/showcase.d.ts +0 -2
  76. package/dist/presets/showcase.js +0 -627
  77. package/dist/presets/sources.d.ts +0 -38
  78. package/dist/presets.d.ts +0 -2
  79. package/dist/theme-6ApjjiBo.d.ts +0 -116
  80. package/dist/theme.d.ts +0 -2
  81. package/dist/theme.js +0 -118
  82. package/dist/tokens.d.ts +0 -6
  83. package/dist/tokens.js +0 -417
@@ -1,10 +1,10 @@
1
1
  import { l as Channel } from "../ast-BrDtApwS.js";
2
- import { r as PresetCategory } from "../catalog-60eaYC7b.js";
2
+ import { r as StarterCategory } from "../catalog-CKuOooB8.js";
3
3
  import { TemplateCollectionId, TemplateUseCase } from "./public-gallery.js";
4
4
  import { PublicTemplatePreview } from "./public-preview.js";
5
- import { PresetProject } from "./sources.js";
5
+ import { StarterProject } from "./sources.js";
6
6
  import { Result } from "better-result";
7
- //#region presets/public-handoff.d.ts
7
+ //#region starters/public-handoff.d.ts
8
8
  /** The brand a clean-room recreation names, and what its email does. */
9
9
  interface TemplateBrandRecreation {
10
10
  readonly brand: string;
@@ -26,15 +26,15 @@ interface ApprovedPublicTemplateArtifact {
26
26
  /** Stable ISO-8601 timestamp supplied by the owner. */
27
27
  readonly approvedAt: string;
28
28
  };
29
- readonly preset: {
29
+ readonly starter: {
30
30
  readonly id: string;
31
31
  readonly channel: Channel;
32
- readonly category: PresetCategory;
32
+ readonly category: StarterCategory;
33
33
  readonly name: string;
34
34
  readonly description: string;
35
35
  readonly variables: ReadonlyArray<string>;
36
36
  readonly source: string;
37
- readonly project?: PresetProject;
37
+ readonly project?: StarterProject;
38
38
  };
39
39
  readonly gallery: {
40
40
  readonly slug: string;
@@ -61,7 +61,7 @@ interface ApprovedPublicTemplateArtifact {
61
61
  */
62
62
  interface TemplateReferencePacket {
63
63
  readonly version: 1;
64
- readonly preset: ApprovedPublicTemplateArtifact["preset"];
64
+ readonly starter: ApprovedPublicTemplateArtifact["starter"];
65
65
  readonly gallery: ApprovedPublicTemplateArtifact["gallery"] & {
66
66
  readonly path: `/templates/${string}`;
67
67
  };
@@ -70,9 +70,9 @@ interface TemplateReferencePacket {
70
70
  readonly provenance: TemplateReferenceProvenance;
71
71
  }
72
72
  interface ValidatedPublicTemplateArtifact {
73
- readonly preset: Omit<ApprovedPublicTemplateArtifact["preset"], "source" | "project">;
73
+ readonly starter: Omit<ApprovedPublicTemplateArtifact["starter"], "source" | "project">;
74
74
  readonly source: string;
75
- readonly project?: PresetProject;
75
+ readonly project?: StarterProject;
76
76
  readonly gallery: ApprovedPublicTemplateArtifact["gallery"] & {
77
77
  readonly path: `/templates/${string}`;
78
78
  };
@@ -97,10 +97,10 @@ declare const PUBLIC_TEMPLATE_PROJECT_FILE_MAX_BYTES: number;
97
97
  declare const PUBLIC_TEMPLATE_PROJECT_MAX_FILES = 64;
98
98
  declare const isSafePublicTemplateProjectPath: (path: string) => boolean;
99
99
  /** Reject traversal, collisions, malformed base64 and oversized authored projects. */
100
- declare const isSafePublicTemplateProject: (project: PresetProject) => boolean;
100
+ declare const isSafePublicTemplateProject: (project: StarterProject) => boolean;
101
101
  /** Digest the complete authored graph independently of caller file ordering. */
102
- declare const publicTemplateProjectDigest: (project: Pick<PresetProject, "entryPath" | "files">) => Promise<string>;
103
- declare const isValidTemplateBrandRecreation: (brandRecreation: TemplateBrandRecreation | undefined, project: PresetProject | undefined) => boolean;
102
+ declare const publicTemplateProjectDigest: (project: Pick<StarterProject, "entryPath" | "files">) => Promise<string>;
103
+ declare const isValidTemplateBrandRecreation: (brandRecreation: TemplateBrandRecreation | undefined, project: StarterProject | undefined) => boolean;
104
104
  /** Static syntax inventory; loops, branches and component expansion are not evaluated. */
105
105
  interface PublicTemplateAuthoredStructure {
106
106
  readonly basis: "authored-jsx";
@@ -133,7 +133,7 @@ declare const isSafePublicTemplateAsset: (value: string) => boolean;
133
133
  declare const toTemplateReferencePacket: (artifact: ApprovedPublicTemplateArtifact) => TemplateReferencePacket;
134
134
  type TemplateReferenceProjection = {
135
135
  readonly kind: "source";
136
- readonly relativePath: "preset.tsx";
136
+ readonly relativePath: "starter.tsx";
137
137
  readonly contents: string;
138
138
  } | {
139
139
  readonly kind: "project-file";
@@ -155,7 +155,7 @@ declare const emitTemplateReferencePacket: (packet: TemplateReferencePacket) =>
155
155
  * verifies schema, fixtures and rendered content before writing projections.
156
156
  * Validates explicitly supplied, owner-approved artifacts without filesystem,
157
157
  * network, persistence, or discovery. Successful output is a projection for
158
- * the existing preset, public-gallery, preview, and editorial contracts; this
158
+ * the existing starter, public-gallery, preview, and editorial contracts; this
159
159
  * function never registers or publishes it.
160
160
  */
161
161
  declare const validatePublicTemplateHandoff: (artifacts: ReadonlyArray<ApprovedPublicTemplateArtifact>) => Result<ReadonlyArray<ValidatedPublicTemplateArtifact>, ReadonlyArray<PublicHandoffIssue>>;
@@ -1,10 +1,10 @@
1
1
  import { n as isObject } from "../guards-eV1qLbf2.js";
2
2
  import { EMAIL_ELEMENTS } from "../email/elements.js";
3
- import { presetCatalog } from "../presets.js";
3
+ import { starterCatalog } from "../starters.js";
4
4
  import { publicTemplates, templateCollections } from "./public-gallery.js";
5
5
  import { Result } from "better-result";
6
6
  import { parse } from "@babel/parser";
7
- //#region presets/public-handoff.ts
7
+ //#region starters/public-handoff.ts
8
8
  const SLUG = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
9
9
  const ISO_TIMESTAMP = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/;
10
10
  const MAX_HTTPS_ASSET_LENGTH = 2048;
@@ -206,7 +206,7 @@ const isSafePublicTemplateAsset = (value) => {
206
206
  /** Normalizes one approved handoff for gallery and future agent consumers. */
207
207
  const toTemplateReferencePacket = (artifact) => ({
208
208
  version: 1,
209
- preset: artifact.preset,
209
+ starter: artifact.starter,
210
210
  gallery: {
211
211
  ...artifact.gallery,
212
212
  path: `/templates/${artifact.gallery.slug}`
@@ -225,8 +225,8 @@ const jsonProjection = (kind, value) => ({
225
225
  * owns no checked-in destination files; callers choose an explicit output dir.
226
226
  */
227
227
  const emitTemplateReferencePacket = (packet) => {
228
- const project = packet.preset.project;
229
- if (project !== void 0 && (!isSafePublicTemplateProject(project) || project.files.find((file) => file.path === project.entryPath)?.content !== packet.preset.source)) throw new Error("Invalid public template project");
228
+ const project = packet.starter.project;
229
+ if (project !== void 0 && (!isSafePublicTemplateProject(project) || project.files.find((file) => file.path === project.entryPath)?.content !== packet.starter.source)) throw new Error("Invalid public template project");
230
230
  if (packet.provenance.source === "brand-recreation" && !isValidTemplateBrandRecreation(packet.provenance.brandRecreation, project)) throw new Error("Invalid public template brand recreation attribution");
231
231
  return [
232
232
  ...project === void 0 ? [] : [jsonProjection("project", {
@@ -240,19 +240,19 @@ const emitTemplateReferencePacket = (packet) => {
240
240
  }))],
241
241
  {
242
242
  kind: "source",
243
- relativePath: "preset.tsx",
244
- contents: packet.preset.source
243
+ relativePath: "starter.tsx",
244
+ contents: packet.starter.source
245
245
  },
246
246
  jsonProjection("catalog", {
247
- id: packet.preset.id,
248
- channel: packet.preset.channel,
249
- category: packet.preset.category,
250
- name: packet.preset.name,
251
- description: packet.preset.description,
252
- variables: packet.preset.variables
247
+ id: packet.starter.id,
248
+ channel: packet.starter.channel,
249
+ category: packet.starter.category,
250
+ name: packet.starter.name,
251
+ description: packet.starter.description,
252
+ variables: packet.starter.variables
253
253
  }),
254
254
  jsonProjection("gallery", {
255
- presetId: packet.preset.id,
255
+ starterId: packet.starter.id,
256
256
  ...packet.gallery,
257
257
  provenance: packet.provenance
258
258
  }),
@@ -271,35 +271,35 @@ const emitTemplateReferencePacket = (packet) => {
271
271
  * verifies schema, fixtures and rendered content before writing projections.
272
272
  * Validates explicitly supplied, owner-approved artifacts without filesystem,
273
273
  * network, persistence, or discovery. Successful output is a projection for
274
- * the existing preset, public-gallery, preview, and editorial contracts; this
274
+ * the existing starter, public-gallery, preview, and editorial contracts; this
275
275
  * function never registers or publishes it.
276
276
  */
277
277
  const validatePublicTemplateHandoff = (artifacts) => {
278
278
  const issues = [];
279
- const existingIds = new Set(presetCatalog.map((preset) => preset.id));
279
+ const existingIds = new Set(starterCatalog.map((starter) => starter.id));
280
280
  const existingSlugs = new Set(publicTemplates.map((template) => template.slug));
281
281
  const suppliedIds = /* @__PURE__ */ new Set();
282
282
  const suppliedSlugs = /* @__PURE__ */ new Set();
283
- const allKnownIds = /* @__PURE__ */ new Set([...publicTemplates.map((template) => template.presetId), ...artifacts.map((artifact) => artifact.preset.id)]);
283
+ const allKnownIds = /* @__PURE__ */ new Set([...publicTemplates.map((template) => template.starterId), ...artifacts.map((artifact) => artifact.starter.id)]);
284
284
  const knownCollections = new Set(templateCollections.map((collection) => collection.id));
285
285
  for (const artifact of artifacts) {
286
- const id = artifact.preset.id;
286
+ const id = artifact.starter.id;
287
287
  if (artifact.approval.state !== "approved" || !nonEmpty(artifact.approval.approvedBy) || !ISO_TIMESTAMP.test(artifact.approval.approvedAt)) issues.push(issue(id, "approval", "owner approval and an ISO-8601 approval timestamp are required"));
288
288
  if (artifact.provenance === void 0 || !isTemplateReferenceProvenanceSource(artifact.provenance.source) || !nonEmpty(artifact.provenance.referenceId) || !ISO_TIMESTAMP.test(artifact.provenance.recordedAt)) issues.push(issue(id, "provenance", "provenance requires a supported source, identifier, and ISO-8601 timestamp"));
289
- if (!SLUG.test(id) || !SLUG.test(artifact.gallery.slug)) issues.push(issue(id, "identity", "preset id and canonical slug must be lowercase kebab-case"));
290
- if (existingIds.has(id) || suppliedIds.has(id)) issues.push(issue(id, "duplicate-id", `preset id "${id}" is already present`));
289
+ if (!SLUG.test(id) || !SLUG.test(artifact.gallery.slug)) issues.push(issue(id, "identity", "starter id and canonical slug must be lowercase kebab-case"));
290
+ if (existingIds.has(id) || suppliedIds.has(id)) issues.push(issue(id, "duplicate-id", `starter id "${id}" is already present`));
291
291
  if (existingSlugs.has(artifact.gallery.slug) || suppliedSlugs.has(artifact.gallery.slug)) issues.push(issue(id, "duplicate-slug", `canonical slug "${artifact.gallery.slug}" is already present`));
292
292
  suppliedIds.add(id);
293
293
  suppliedSlugs.add(artifact.gallery.slug);
294
- const project = artifact.preset.project;
295
- if (project !== void 0 && (!isSafePublicTemplateProject(project) || project.files.find((file) => file.path === project.entryPath)?.content !== artifact.preset.source)) issues.push(issue(id, "source", "project must contain safe bounded unique files and the matching UTF-8 entry source"));
294
+ const project = artifact.starter.project;
295
+ if (project !== void 0 && (!isSafePublicTemplateProject(project) || project.files.find((file) => file.path === project.entryPath)?.content !== artifact.starter.source)) issues.push(issue(id, "source", "project must contain safe bounded unique files and the matching UTF-8 entry source"));
296
296
  if (artifact.provenance?.source === "brand-recreation" && !isValidTemplateBrandRecreation(artifact.provenance.brandRecreation, project)) issues.push(issue(id, "provenance", "brand recreations require a complete project, a referenced brand, and its email subject"));
297
- if (parsePublicTemplateSource(artifact.preset.source) === void 0) issues.push(issue(id, "source", "source must be a bounded TSX module with a default export; execution is verified by the importer"));
298
- if (artifact.preset.channel !== "email") issues.push(issue(id, "channel", "public template source must be an executable email"));
299
- if (new Set(artifact.preset.variables).size !== artifact.preset.variables.length || artifact.preset.variables.some((value) => !nonEmpty(value))) issues.push(issue(id, "variables", "declared input fields must be non-empty and unique"));
300
- const unsupportedFontTokens = unsupportedPublicTemplateFontTokens(artifact.preset.source);
297
+ if (parsePublicTemplateSource(artifact.starter.source) === void 0) issues.push(issue(id, "source", "source must be a bounded TSX module with a default export; execution is verified by the importer"));
298
+ if (artifact.starter.channel !== "email") issues.push(issue(id, "channel", "public template source must be an executable email"));
299
+ if (new Set(artifact.starter.variables).size !== artifact.starter.variables.length || artifact.starter.variables.some((value) => !nonEmpty(value))) issues.push(issue(id, "variables", "declared input fields must be non-empty and unique"));
300
+ const unsupportedFontTokens = unsupportedPublicTemplateFontTokens(artifact.starter.source);
301
301
  if (unsupportedFontTokens.length > 0) issues.push(issue(id, "font-token", `unsupported public font token: ${unsupportedFontTokens.join(", ")}`));
302
- const declaredVariables = new Set(artifact.preset.variables);
302
+ const declaredVariables = new Set(artifact.starter.variables);
303
303
  const undeclaredSample = Object.keys(artifact.preview.sampleData).filter((variable) => !declaredVariables.has(variable));
304
304
  if (undeclaredSample.length > 0) issues.push(issue(id, "sample-data", `sample data supplies undeclared variables: ${sortedUnique(undeclaredSample).join(", ")}`));
305
305
  if (Object.values(artifact.preview.sampleData).some((value) => !nonEmptySample(value))) issues.push(issue(id, "sample-data", "sample data values must be non-empty"));
@@ -307,13 +307,13 @@ const validatePublicTemplateHandoff = (artifacts) => {
307
307
  if (new Set(assetVariables).size !== assetVariables.length) issues.push(issue(id, "assets", "asset variable references must be unique"));
308
308
  for (const asset of artifact.preview.assets) {
309
309
  const value = artifact.preview.sampleData[asset.variable];
310
- if (!artifact.preset.variables.includes(asset.variable)) issues.push(issue(id, "assets", `asset "${asset.variable}" is not a declared preset variable`));
310
+ if (!artifact.starter.variables.includes(asset.variable)) issues.push(issue(id, "assets", `asset "${asset.variable}" is not a declared starter variable`));
311
311
  if (typeof value !== "string" || !isSafePublicTemplateAsset(value)) issues.push(issue(id, "assets", `asset "${asset.variable}" must reference a bounded HTTPS, /templates/assets, or data:image sample URL`));
312
312
  }
313
313
  const metadata = artifact.publicMetadata;
314
314
  const metadataStrings = [
315
- artifact.preset.name,
316
- artifact.preset.description,
315
+ artifact.starter.name,
316
+ artifact.starter.description,
317
317
  artifact.preview.subject,
318
318
  artifact.preview.preheader,
319
319
  metadata.cardTitle,
@@ -324,7 +324,7 @@ const validatePublicTemplateHandoff = (artifacts) => {
324
324
  ...Object.values(metadata.variableDescriptions)
325
325
  ];
326
326
  if (metadata.guidance.length === 0 || metadataStrings.some((value) => !nonEmpty(value))) issues.push(issue(id, "public-metadata", "public metadata fields must be non-empty"));
327
- if (!sameStrings(Object.keys(metadata.variableDescriptions), artifact.preset.variables)) issues.push(issue(id, "public-metadata", "variable descriptions must cover every declared variable exactly"));
327
+ if (!sameStrings(Object.keys(metadata.variableDescriptions), artifact.starter.variables)) issues.push(issue(id, "public-metadata", "variable descriptions must cover every declared variable exactly"));
328
328
  if (new Set(artifact.gallery.collections).size !== artifact.gallery.collections.length) issues.push(issue(id, "reference", "collection references must be unique"));
329
329
  for (const collectionId of artifact.gallery.collections) if (!knownCollections.has(collectionId)) issues.push(issue(id, "reference", `collection "${collectionId}" is invalid`));
330
330
  if (new Set(artifact.gallery.relatedTemplates).size !== artifact.gallery.relatedTemplates.length) issues.push(issue(id, "reference", "related template references must be unique"));
@@ -338,16 +338,16 @@ const validatePublicTemplateHandoff = (artifacts) => {
338
338
  ...artifact.approval,
339
339
  state: "approved"
340
340
  },
341
- preset: {
342
- id: artifact.preset.id,
343
- channel: artifact.preset.channel,
344
- category: artifact.preset.category,
345
- name: artifact.preset.name,
346
- description: artifact.preset.description,
347
- variables: artifact.preset.variables
341
+ starter: {
342
+ id: artifact.starter.id,
343
+ channel: artifact.starter.channel,
344
+ category: artifact.starter.category,
345
+ name: artifact.starter.name,
346
+ description: artifact.starter.description,
347
+ variables: artifact.starter.variables
348
348
  },
349
- source: artifact.preset.source,
350
- ...artifact.preset.project === void 0 ? {} : { project: artifact.preset.project },
349
+ source: artifact.starter.source,
350
+ ...artifact.starter.project === void 0 ? {} : { project: artifact.starter.project },
351
351
  gallery: reference.gallery,
352
352
  preview: artifact.preview,
353
353
  publicMetadata: artifact.publicMetadata,
@@ -1,8 +1,8 @@
1
- import { t as EmailPresetId } from "../catalog-60eaYC7b.js";
1
+ import { t as EmailStarterId } from "../catalog-CKuOooB8.js";
2
2
  import { PublicTemplate } from "./public-gallery.js";
3
3
  import { PreviewQuality } from "./public-preview.js";
4
4
  import { Result } from "better-result";
5
- //#region presets/public-preview-artifacts.d.ts
5
+ //#region starters/public-preview-artifacts.d.ts
6
6
  type PreviewSurface = "card" | "detail" | "og";
7
7
  type PreviewViewport = "desktop" | "mobile";
8
8
  type PreviewColorScheme = "light" | "dark";
@@ -16,7 +16,7 @@ interface PublicTemplateRenderInput {
16
16
  readonly html: string;
17
17
  }
18
18
  interface PublicTemplatePreviewArtifact {
19
- readonly presetId: EmailPresetId;
19
+ readonly starterId: EmailStarterId;
20
20
  readonly slug: string;
21
21
  readonly subject: string;
22
22
  readonly preheader: string;
@@ -29,7 +29,7 @@ interface PublicTemplatePreviewArtifact {
29
29
  readonly renders: ReadonlyArray<PublicTemplateRenderInput>;
30
30
  }
31
31
  interface PreviewArtifactBuildIssue {
32
- readonly presetId: EmailPresetId;
32
+ readonly starterId: EmailStarterId;
33
33
  readonly message: string;
34
34
  }
35
35
  /** Build one static preview artifact without loading the editor runtime or performing I/O. */
@@ -1,10 +1,10 @@
1
- import { presetCatalog } from "../presets.js";
1
+ import { starterCatalog } from "../starters.js";
2
2
  import { registerPublicCorpusEntry } from "./corpus.js";
3
3
  import { publicTemplates } from "./public-gallery.js";
4
- import { presetEmailAssets, presetEmailFixtures, presetModuleSource } from "./sources.js";
4
+ import { starterEmailAssets, starterEmailFixtures, starterModuleSource } from "./sources.js";
5
5
  import { publicTemplatePreviews } from "./public-preview.js";
6
6
  import { Result } from "better-result";
7
- //#region presets/public-preview-artifacts.ts
7
+ //#region starters/public-preview-artifacts.ts
8
8
  const renderFrames = [
9
9
  {
10
10
  surface: "card",
@@ -46,34 +46,34 @@ const renderInputs = (slug, html) => renderFrames.flatMap((frame) => ["light", "
46
46
  /** Build one static preview artifact without loading the editor runtime or performing I/O. */
47
47
  const buildPublicTemplatePreviewArtifact = (template) => {
48
48
  const registration = registerPublicCorpusEntry({
49
- id: template.presetId,
49
+ id: template.starterId,
50
50
  corpus: template.corpus,
51
51
  facets: template.facets
52
52
  });
53
53
  if (Result.isError(registration)) return Result.err({
54
- presetId: template.presetId,
54
+ starterId: template.starterId,
55
55
  message: `public corpus registration failed: ${registration.error.message}`
56
56
  });
57
- const source = presetModuleSource(template.presetId);
58
- const fixture = presetEmailFixtures[template.presetId]?.default;
59
- const preset = presetCatalog.find((entry) => entry.id === template.presetId);
60
- const preview = publicTemplatePreviews[template.presetId];
61
- if (source === void 0 || preset === void 0 || fixture === void 0) return Result.err({
62
- presetId: template.presetId,
63
- message: "canonical preset source is missing"
57
+ const source = starterModuleSource(template.starterId);
58
+ const fixture = starterEmailFixtures[template.starterId]?.default;
59
+ const starter = starterCatalog.find((entry) => entry.id === template.starterId);
60
+ const preview = publicTemplatePreviews[template.starterId];
61
+ if (source === void 0 || starter === void 0 || fixture === void 0) return Result.err({
62
+ starterId: template.starterId,
63
+ message: "canonical starter source is missing"
64
64
  });
65
65
  const sampleData = fixture.input;
66
- const assets = new Set(presetEmailAssets[template.presetId]);
66
+ const assets = new Set(starterEmailAssets[template.starterId]);
67
67
  for (const asset of preview.assets) {
68
68
  const value = sampleData[asset.variable];
69
69
  if (typeof value !== "string") return Result.err({
70
- presetId: template.presetId,
70
+ starterId: template.starterId,
71
71
  message: `sample data is missing a string asset: ${asset.variable}`
72
72
  });
73
73
  assets.add(value);
74
74
  }
75
75
  return Result.ok({
76
- presetId: template.presetId,
76
+ starterId: template.starterId,
77
77
  slug: template.slug,
78
78
  subject: fixture.subject,
79
79
  preheader: fixture.preheader,
@@ -1,4 +1,4 @@
1
- //#region presets/public-preview.d.ts
1
+ //#region starters/public-preview.d.ts
2
2
  type PreviewQuality = "ready" | "asset-free";
3
3
  /** A declared fixture value: JSON, so a template can take a list of stories as well as a string. */
4
4
  type PreviewSampleValue = string | number | boolean | null | ReadonlyArray<PreviewSampleValue> | {
@@ -1,7 +1,7 @@
1
- import { presetEmailFixtures } from "./sources.js";
2
- //#region presets/public-preview.ts
1
+ import { starterEmailFixtures } from "./sources.js";
2
+ //#region starters/public-preview.ts
3
3
  const preview = (id, quality, assets) => {
4
- const fixture = presetEmailFixtures[id]?.default;
4
+ const fixture = starterEmailFixtures[id]?.default;
5
5
  if (fixture === void 0) throw new Error(`Missing generated gallery fixture: ${id}`);
6
6
  return {
7
7
  subject: fixture.subject,
@@ -0,0 +1,2 @@
1
+ import { a as ShowcaseProjectId, c as showcaseProject, i as ShowcaseProject, l as showcaseProjects, n as OwnedShowcaseId, o as ShowcaseProvenance, r as SHOWCASE_ROOT, s as isShowcaseProjectId, t as BrandRecreationShowcaseId, u as showcaseSourcePath } from "../showcase-egkusQBf.js";
2
+ export { BrandRecreationShowcaseId, OwnedShowcaseId, SHOWCASE_ROOT, ShowcaseProject, ShowcaseProjectId, ShowcaseProvenance, isShowcaseProjectId, showcaseProject, showcaseProjects, showcaseSourcePath };