@samva/markup 0.1.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 (124) hide show
  1. package/AGENTS.md +8 -0
  2. package/LICENSE +21 -0
  3. package/README.md +41 -0
  4. package/dist/ast-DAhnAvQN.d.ts +120 -0
  5. package/dist/ast.d.ts +2 -0
  6. package/dist/ast.js +159 -0
  7. package/dist/ast.js.map +1 -0
  8. package/dist/candidate.d.ts +29 -0
  9. package/dist/candidate.js +88 -0
  10. package/dist/candidate.js.map +1 -0
  11. package/dist/checks-CW0nFj5n.js +58922 -0
  12. package/dist/checks-CW0nFj5n.js.map +1 -0
  13. package/dist/checks.d.ts +26 -0
  14. package/dist/checks.js +2 -0
  15. package/dist/classes.d.ts +27 -0
  16. package/dist/classes.js +184 -0
  17. package/dist/classes.js.map +1 -0
  18. package/dist/compile-sms.d.ts +28 -0
  19. package/dist/compile-sms.js +44 -0
  20. package/dist/compile-sms.js.map +1 -0
  21. package/dist/compile-whatsapp.d.ts +56 -0
  22. package/dist/compile-whatsapp.js +186 -0
  23. package/dist/compile-whatsapp.js.map +1 -0
  24. package/dist/compile.d.ts +93 -0
  25. package/dist/compile.js +938 -0
  26. package/dist/compile.js.map +1 -0
  27. package/dist/components.d.ts +289 -0
  28. package/dist/components.js +106 -0
  29. package/dist/components.js.map +1 -0
  30. package/dist/conditionals.d.ts +10 -0
  31. package/dist/conditionals.js +42 -0
  32. package/dist/conditionals.js.map +1 -0
  33. package/dist/diagnostics-oveE-laV.d.ts +79 -0
  34. package/dist/diagnostics.d.ts +2 -0
  35. package/dist/diagnostics.js +62 -0
  36. package/dist/diagnostics.js.map +1 -0
  37. package/dist/emit.d.ts +50 -0
  38. package/dist/emit.js +151 -0
  39. package/dist/emit.js.map +1 -0
  40. package/dist/footer.d.ts +66 -0
  41. package/dist/footer.js +90 -0
  42. package/dist/footer.js.map +1 -0
  43. package/dist/interpolate.d.ts +27 -0
  44. package/dist/interpolate.js +61 -0
  45. package/dist/interpolate.js.map +1 -0
  46. package/dist/jsx-dev-runtime.d.ts +10 -0
  47. package/dist/jsx-dev-runtime.js +7 -0
  48. package/dist/jsx-dev-runtime.js.map +1 -0
  49. package/dist/jsx-runtime-fSxcvlx4.d.ts +57 -0
  50. package/dist/jsx-runtime.d.ts +2 -0
  51. package/dist/jsx-runtime.js +102 -0
  52. package/dist/jsx-runtime.js.map +1 -0
  53. package/dist/lexer.d.ts +60 -0
  54. package/dist/lexer.js +269 -0
  55. package/dist/lexer.js.map +1 -0
  56. package/dist/model.d.ts +39 -0
  57. package/dist/model.js +90 -0
  58. package/dist/model.js.map +1 -0
  59. package/dist/ops.d.ts +208 -0
  60. package/dist/ops.js +546 -0
  61. package/dist/ops.js.map +1 -0
  62. package/dist/parser-yzjUOGhc.d.ts +387 -0
  63. package/dist/parser.d.ts +2 -0
  64. package/dist/parser.js +821 -0
  65. package/dist/parser.js.map +1 -0
  66. package/dist/predicate-DTtVtLK7.d.ts +49 -0
  67. package/dist/predicate.d.ts +2 -0
  68. package/dist/predicate.js +417 -0
  69. package/dist/predicate.js.map +1 -0
  70. package/dist/presets/category-mapping.d.ts +13 -0
  71. package/dist/presets/category-mapping.js +49 -0
  72. package/dist/presets/category-mapping.js.map +1 -0
  73. package/dist/presets/public-gallery.d.ts +490 -0
  74. package/dist/presets/public-gallery.js +563 -0
  75. package/dist/presets/public-gallery.js.map +1 -0
  76. package/dist/presets/public-handoff.d.ts +68 -0
  77. package/dist/presets/public-handoff.js +105 -0
  78. package/dist/presets/public-handoff.js.map +1 -0
  79. package/dist/presets/public-preview-artifacts.d.ts +41 -0
  80. package/dist/presets/public-preview-artifacts.js +109 -0
  81. package/dist/presets/public-preview-artifacts.js.map +1 -0
  82. package/dist/presets/public-preview.d.ts +1168 -0
  83. package/dist/presets/public-preview.js +1158 -0
  84. package/dist/presets/public-preview.js.map +1 -0
  85. package/dist/presets/sources.d.ts +7 -0
  86. package/dist/presets/sources.js +54 -0
  87. package/dist/presets/sources.js.map +1 -0
  88. package/dist/presets.d.ts +350 -0
  89. package/dist/presets.js +1251 -0
  90. package/dist/presets.js.map +1 -0
  91. package/dist/printer.d.ts +6 -0
  92. package/dist/printer.js +122 -0
  93. package/dist/printer.js.map +1 -0
  94. package/dist/registry.d.ts +42 -0
  95. package/dist/registry.js +646 -0
  96. package/dist/registry.js.map +1 -0
  97. package/dist/render-template.d.ts +42 -0
  98. package/dist/render-template.js +74 -0
  99. package/dist/render-template.js.map +1 -0
  100. package/dist/sms-segments-y4FpPilJ.d.ts +13 -0
  101. package/dist/sms-segments.d.ts +2 -0
  102. package/dist/sms-segments.js +46 -0
  103. package/dist/sms-segments.js.map +1 -0
  104. package/dist/theme-6ApjjiBo.d.ts +116 -0
  105. package/dist/theme-css.d.ts +24 -0
  106. package/dist/theme-css.js +509 -0
  107. package/dist/theme-css.js.map +1 -0
  108. package/dist/theme.d.ts +2 -0
  109. package/dist/theme.js +95 -0
  110. package/dist/theme.js.map +1 -0
  111. package/dist/tokens.d.ts +6 -0
  112. package/dist/tokens.js +417 -0
  113. package/dist/tokens.js.map +1 -0
  114. package/dist/variables-3NGLpNTB.d.ts +77 -0
  115. package/dist/variables.d.ts +2 -0
  116. package/dist/variables.js +141 -0
  117. package/dist/variables.js.map +1 -0
  118. package/dist/version-BITr58kk.js +96 -0
  119. package/dist/version-BITr58kk.js.map +1 -0
  120. package/generated/sml-agent-contract.json +917 -0
  121. package/generated/sml-email-agent-contract.json +790 -0
  122. package/generated/sml-email-language-reference.md +160 -0
  123. package/generated/sml-language-reference.md +220 -0
  124. package/package.json +203 -0
@@ -0,0 +1,105 @@
1
+ import { collectVariableReferences } from "../ast.js";
2
+ import { parseSml } from "../parser.js";
3
+ import { compileSource } from "../compile.js";
4
+ import { RECOMMENDED_THEME, presetCatalog } from "../presets.js";
5
+ import { publicTemplates, templateCollections } from "./public-gallery.js";
6
+ import { Result } from "effect";
7
+ //#region presets/public-handoff.ts
8
+ const SLUG = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
9
+ const ISO_TIMESTAMP = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/;
10
+ const sortedUnique = (values) => [...new Set(values)].sort();
11
+ const sameStrings = (left, right) => JSON.stringify(sortedUnique(left)) === JSON.stringify(sortedUnique(right));
12
+ const nonEmpty = (value) => value.trim().length > 0;
13
+ const issue = (artifactId, code, message) => ({
14
+ artifactId,
15
+ code,
16
+ message
17
+ });
18
+ /**
19
+ * Validates explicitly supplied, owner-approved artifacts without filesystem,
20
+ * network, persistence, or discovery. Successful output is a projection for
21
+ * the existing preset, public-gallery, preview, and editorial contracts; this
22
+ * function never registers or publishes it.
23
+ */
24
+ const validatePublicTemplateHandoff = (artifacts) => {
25
+ const issues = [];
26
+ const existingIds = new Set(presetCatalog.map((preset) => preset.id));
27
+ const existingSlugs = new Set(publicTemplates.map((template) => template.slug));
28
+ const suppliedIds = /* @__PURE__ */ new Set();
29
+ const suppliedSlugs = /* @__PURE__ */ new Set();
30
+ const allKnownIds = /* @__PURE__ */ new Set([...publicTemplates.map((template) => template.presetId), ...artifacts.map((artifact) => artifact.preset.id)]);
31
+ const knownCollections = new Set(templateCollections.map((collection) => collection.id));
32
+ for (const artifact of artifacts) {
33
+ const id = artifact.preset.id;
34
+ 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"));
35
+ if (!SLUG.test(id) || !SLUG.test(artifact.gallery.slug)) issues.push(issue(id, "identity", "preset id and canonical slug must be lowercase kebab-case"));
36
+ if (existingIds.has(id) || suppliedIds.has(id)) issues.push(issue(id, "duplicate-id", `preset id "${id}" is already present`));
37
+ 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`));
38
+ suppliedIds.add(id);
39
+ suppliedSlugs.add(artifact.gallery.slug);
40
+ const compiled = compileSource(artifact.preset.source, { theme: { overrides: [RECOMMENDED_THEME] } });
41
+ if (Result.isFailure(compiled)) issues.push(issue(id, "source", compiled.failure.message));
42
+ else if (artifact.preset.channel !== "email" || compiled.success.channel !== "email") issues.push(issue(id, "channel", "public template source must compile as email"));
43
+ const parsed = parseSml(artifact.preset.source);
44
+ if (Result.isSuccess(parsed)) {
45
+ const sourceVariables = [...collectVariableReferences(parsed.success)];
46
+ if (!sameStrings(artifact.preset.variables, sourceVariables)) issues.push(issue(id, "variables", "declared variables must exactly match source references"));
47
+ }
48
+ const sampleVariables = Object.keys(artifact.preview.sampleData);
49
+ if (!sameStrings(sampleVariables, artifact.preset.variables)) issues.push(issue(id, "sample-data", "sample data must cover every declared variable exactly"));
50
+ if (Object.values(artifact.preview.sampleData).some((value) => !nonEmpty(value))) issues.push(issue(id, "sample-data", "sample data values must be non-empty"));
51
+ const assetVariables = artifact.preview.assets.map((asset) => asset.variable);
52
+ if (new Set(assetVariables).size !== assetVariables.length) issues.push(issue(id, "assets", "asset variable references must be unique"));
53
+ for (const asset of artifact.preview.assets) {
54
+ const value = artifact.preview.sampleData[asset.variable];
55
+ const url = value === void 0 ? null : URL.parse(value);
56
+ if (!artifact.preset.variables.includes(asset.variable)) issues.push(issue(id, "assets", `asset "${asset.variable}" is not a declared preset variable`));
57
+ if (url === null || url.protocol !== "https:") issues.push(issue(id, "assets", `asset "${asset.variable}" must reference a valid HTTPS sample URL`));
58
+ }
59
+ const metadata = artifact.publicMetadata;
60
+ const metadataStrings = [
61
+ artifact.preset.name,
62
+ artifact.preset.description,
63
+ artifact.preview.subject,
64
+ artifact.preview.preheader,
65
+ metadata.cardTitle,
66
+ metadata.cardDescription,
67
+ metadata.seo.title,
68
+ metadata.seo.description,
69
+ ...metadata.guidance,
70
+ ...Object.values(metadata.variableDescriptions)
71
+ ];
72
+ if (metadata.guidance.length === 0 || metadataStrings.some((value) => !nonEmpty(value))) issues.push(issue(id, "public-metadata", "public metadata fields must be non-empty"));
73
+ if (!sameStrings(Object.keys(metadata.variableDescriptions), artifact.preset.variables)) issues.push(issue(id, "public-metadata", "variable descriptions must cover every declared variable exactly"));
74
+ if (new Set(artifact.gallery.collections).size !== artifact.gallery.collections.length) issues.push(issue(id, "reference", "collection references must be unique"));
75
+ for (const collectionId of artifact.gallery.collections) if (!knownCollections.has(collectionId)) issues.push(issue(id, "reference", `collection "${collectionId}" is invalid`));
76
+ if (new Set(artifact.gallery.relatedTemplates).size !== artifact.gallery.relatedTemplates.length) issues.push(issue(id, "reference", "related template references must be unique"));
77
+ for (const relatedId of artifact.gallery.relatedTemplates) if (relatedId === id || !allKnownIds.has(relatedId)) issues.push(issue(id, "reference", `related template "${relatedId}" is invalid`));
78
+ }
79
+ if (issues.length > 0) return Result.fail(issues);
80
+ return Result.succeed(artifacts.map((artifact) => ({
81
+ approval: {
82
+ ...artifact.approval,
83
+ state: "approved"
84
+ },
85
+ preset: {
86
+ id: artifact.preset.id,
87
+ channel: artifact.preset.channel,
88
+ category: artifact.preset.category,
89
+ name: artifact.preset.name,
90
+ description: artifact.preset.description,
91
+ variables: artifact.preset.variables
92
+ },
93
+ source: artifact.preset.source,
94
+ gallery: {
95
+ ...artifact.gallery,
96
+ path: `/templates/${artifact.gallery.slug}`
97
+ },
98
+ preview: artifact.preview,
99
+ publicMetadata: artifact.publicMetadata
100
+ })));
101
+ };
102
+ //#endregion
103
+ export { validatePublicTemplateHandoff };
104
+
105
+ //# sourceMappingURL=public-handoff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-handoff.js","names":[],"sources":["../../presets/public-handoff.ts"],"sourcesContent":["import { Result } from \"effect\";\n\nimport { collectVariableReferences, type Channel } from \"../src/ast\";\nimport { compileSource } from \"../src/compile\";\nimport { parseSml } from \"../src/parser\";\nimport { presetCatalog, RECOMMENDED_THEME, type PresetCategory } from \"./catalog\";\nimport {\n publicTemplates,\n templateCollections,\n type TemplateCollectionId,\n type TemplateUseCase,\n} from \"./public-gallery\";\nimport type { PublicTemplatePreview } from \"./public-preview\";\n\nexport interface ApprovedPublicTemplateArtifact {\n readonly approval: {\n readonly state: \"draft\" | \"approved\" | \"rejected\";\n readonly approvedBy: string;\n /** Stable ISO-8601 timestamp supplied by the owner. */\n readonly approvedAt: string;\n };\n readonly preset: {\n readonly id: string;\n readonly channel: Channel;\n readonly category: PresetCategory;\n readonly name: string;\n readonly description: string;\n readonly variables: ReadonlyArray<string>;\n readonly source: string;\n };\n readonly gallery: {\n readonly slug: string;\n readonly useCase: TemplateUseCase;\n readonly collections: ReadonlyArray<TemplateCollectionId>;\n readonly relatedTemplates: ReadonlyArray<string>;\n };\n readonly preview: PublicTemplatePreview;\n readonly publicMetadata: {\n readonly cardTitle: string;\n readonly cardDescription: string;\n readonly guidance: ReadonlyArray<string>;\n readonly variableDescriptions: Readonly<Record<string, string>>;\n readonly seo: { readonly title: string; readonly description: string };\n };\n}\n\nexport interface ValidatedPublicTemplateArtifact {\n readonly preset: Omit<ApprovedPublicTemplateArtifact[\"preset\"], \"source\">;\n readonly source: string;\n readonly gallery: ApprovedPublicTemplateArtifact[\"gallery\"] & {\n readonly path: `/templates/${string}`;\n };\n readonly preview: ApprovedPublicTemplateArtifact[\"preview\"];\n readonly publicMetadata: ApprovedPublicTemplateArtifact[\"publicMetadata\"];\n readonly approval: ApprovedPublicTemplateArtifact[\"approval\"] & { readonly state: \"approved\" };\n}\n\nexport type PublicHandoffIssueCode =\n | \"approval\"\n | \"identity\"\n | \"duplicate-id\"\n | \"duplicate-slug\"\n | \"source\"\n | \"channel\"\n | \"variables\"\n | \"sample-data\"\n | \"assets\"\n | \"public-metadata\"\n | \"reference\";\n\nexport interface PublicHandoffIssue {\n readonly artifactId: string;\n readonly code: PublicHandoffIssueCode;\n readonly message: string;\n}\n\nconst SLUG = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\nconst ISO_TIMESTAMP = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{3})?Z$/;\n\nconst sortedUnique = (values: ReadonlyArray<string>): ReadonlyArray<string> =>\n [...new Set(values)].sort();\n\nconst sameStrings = (left: ReadonlyArray<string>, right: ReadonlyArray<string>): boolean =>\n JSON.stringify(sortedUnique(left)) === JSON.stringify(sortedUnique(right));\n\nconst nonEmpty = (value: string): boolean => value.trim().length > 0;\n\nconst issue = (\n artifactId: string,\n code: PublicHandoffIssueCode,\n message: string,\n): PublicHandoffIssue => ({ artifactId, code, message });\n\n/**\n * Validates explicitly supplied, owner-approved artifacts without filesystem,\n * network, persistence, or discovery. Successful output is a projection for\n * the existing preset, public-gallery, preview, and editorial contracts; this\n * function never registers or publishes it.\n */\nexport const validatePublicTemplateHandoff = (\n artifacts: ReadonlyArray<ApprovedPublicTemplateArtifact>,\n): Result.Result<\n ReadonlyArray<ValidatedPublicTemplateArtifact>,\n ReadonlyArray<PublicHandoffIssue>\n> => {\n const issues: Array<PublicHandoffIssue> = [];\n const existingIds = new Set<string>(presetCatalog.map((preset) => preset.id));\n const existingSlugs = new Set<string>(publicTemplates.map((template) => template.slug));\n const suppliedIds = new Set<string>();\n const suppliedSlugs = new Set<string>();\n const allKnownIds = new Set<string>([\n ...publicTemplates.map((template) => template.presetId),\n ...artifacts.map((artifact) => artifact.preset.id),\n ]);\n const knownCollections = new Set<string>(templateCollections.map((collection) => collection.id));\n\n for (const artifact of artifacts) {\n const id = artifact.preset.id;\n\n if (\n artifact.approval.state !== \"approved\" ||\n !nonEmpty(artifact.approval.approvedBy) ||\n !ISO_TIMESTAMP.test(artifact.approval.approvedAt)\n ) {\n issues.push(\n issue(id, \"approval\", \"owner approval and an ISO-8601 approval timestamp are required\"),\n );\n }\n\n if (!SLUG.test(id) || !SLUG.test(artifact.gallery.slug)) {\n issues.push(\n issue(id, \"identity\", \"preset id and canonical slug must be lowercase kebab-case\"),\n );\n }\n if (existingIds.has(id) || suppliedIds.has(id)) {\n issues.push(issue(id, \"duplicate-id\", `preset id \"${id}\" is already present`));\n }\n if (existingSlugs.has(artifact.gallery.slug) || suppliedSlugs.has(artifact.gallery.slug)) {\n issues.push(\n issue(id, \"duplicate-slug\", `canonical slug \"${artifact.gallery.slug}\" is already present`),\n );\n }\n suppliedIds.add(id);\n suppliedSlugs.add(artifact.gallery.slug);\n\n const compiled = compileSource(artifact.preset.source, {\n theme: { overrides: [RECOMMENDED_THEME] },\n });\n if (Result.isFailure(compiled)) {\n issues.push(issue(id, \"source\", compiled.failure.message));\n } else if (artifact.preset.channel !== \"email\" || compiled.success.channel !== \"email\") {\n issues.push(issue(id, \"channel\", \"public template source must compile as email\"));\n }\n\n const parsed = parseSml(artifact.preset.source);\n if (Result.isSuccess(parsed)) {\n const sourceVariables = [...collectVariableReferences(parsed.success)];\n if (!sameStrings(artifact.preset.variables, sourceVariables)) {\n issues.push(\n issue(id, \"variables\", \"declared variables must exactly match source references\"),\n );\n }\n }\n\n const sampleVariables = Object.keys(artifact.preview.sampleData);\n if (!sameStrings(sampleVariables, artifact.preset.variables)) {\n issues.push(\n issue(id, \"sample-data\", \"sample data must cover every declared variable exactly\"),\n );\n }\n if (Object.values(artifact.preview.sampleData).some((value) => !nonEmpty(value))) {\n issues.push(issue(id, \"sample-data\", \"sample data values must be non-empty\"));\n }\n\n const assetVariables = artifact.preview.assets.map((asset) => asset.variable);\n if (new Set(assetVariables).size !== assetVariables.length) {\n issues.push(issue(id, \"assets\", \"asset variable references must be unique\"));\n }\n for (const asset of artifact.preview.assets) {\n const value = artifact.preview.sampleData[asset.variable];\n const url = value === undefined ? null : URL.parse(value);\n if (!artifact.preset.variables.includes(asset.variable)) {\n issues.push(\n issue(id, \"assets\", `asset \"${asset.variable}\" is not a declared preset variable`),\n );\n }\n if (url === null || url.protocol !== \"https:\") {\n issues.push(\n issue(id, \"assets\", `asset \"${asset.variable}\" must reference a valid HTTPS sample URL`),\n );\n }\n }\n\n const metadata = artifact.publicMetadata;\n const metadataStrings = [\n artifact.preset.name,\n artifact.preset.description,\n artifact.preview.subject,\n artifact.preview.preheader,\n metadata.cardTitle,\n metadata.cardDescription,\n metadata.seo.title,\n metadata.seo.description,\n ...metadata.guidance,\n ...Object.values(metadata.variableDescriptions),\n ];\n if (metadata.guidance.length === 0 || metadataStrings.some((value) => !nonEmpty(value))) {\n issues.push(issue(id, \"public-metadata\", \"public metadata fields must be non-empty\"));\n }\n if (!sameStrings(Object.keys(metadata.variableDescriptions), artifact.preset.variables)) {\n issues.push(\n issue(\n id,\n \"public-metadata\",\n \"variable descriptions must cover every declared variable exactly\",\n ),\n );\n }\n\n if (new Set(artifact.gallery.collections).size !== artifact.gallery.collections.length) {\n issues.push(issue(id, \"reference\", \"collection references must be unique\"));\n }\n for (const collectionId of artifact.gallery.collections) {\n if (!knownCollections.has(collectionId)) {\n issues.push(issue(id, \"reference\", `collection \"${collectionId}\" is invalid`));\n }\n }\n if (\n new Set(artifact.gallery.relatedTemplates).size !== artifact.gallery.relatedTemplates.length\n ) {\n issues.push(issue(id, \"reference\", \"related template references must be unique\"));\n }\n for (const relatedId of artifact.gallery.relatedTemplates) {\n if (relatedId === id || !allKnownIds.has(relatedId)) {\n issues.push(issue(id, \"reference\", `related template \"${relatedId}\" is invalid`));\n }\n }\n }\n\n if (issues.length > 0) return Result.fail(issues);\n\n return Result.succeed(\n artifacts.map((artifact) => ({\n approval: { ...artifact.approval, state: \"approved\" },\n preset: {\n id: artifact.preset.id,\n channel: artifact.preset.channel,\n category: artifact.preset.category,\n name: artifact.preset.name,\n description: artifact.preset.description,\n variables: artifact.preset.variables,\n },\n source: artifact.preset.source,\n gallery: {\n ...artifact.gallery,\n path: `/templates/${artifact.gallery.slug}`,\n },\n preview: artifact.preview,\n publicMetadata: artifact.publicMetadata,\n })),\n );\n};\n"],"mappings":";;;;;;;AA4EA,MAAM,OAAO;AACb,MAAM,gBAAgB;AAEtB,MAAM,gBAAgB,WACpB,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK;AAE5B,MAAM,eAAe,MAA6B,UAChD,KAAK,UAAU,aAAa,IAAI,CAAC,MAAM,KAAK,UAAU,aAAa,KAAK,CAAC;AAE3E,MAAM,YAAY,UAA2B,MAAM,KAAK,CAAC,CAAC,SAAS;AAEnE,MAAM,SACJ,YACA,MACA,aACwB;CAAE;CAAY;CAAM;AAAQ;;;;;;;AAQtD,MAAa,iCACX,cAIG;CACH,MAAM,SAAoC,CAAC;CAC3C,MAAM,cAAc,IAAI,IAAY,cAAc,KAAK,WAAW,OAAO,EAAE,CAAC;CAC5E,MAAM,gBAAgB,IAAI,IAAY,gBAAgB,KAAK,aAAa,SAAS,IAAI,CAAC;CACtF,MAAM,8BAAc,IAAI,IAAY;CACpC,MAAM,gCAAgB,IAAI,IAAY;CACtC,MAAM,8BAAc,IAAI,IAAY,CAClC,GAAG,gBAAgB,KAAK,aAAa,SAAS,QAAQ,GACtD,GAAG,UAAU,KAAK,aAAa,SAAS,OAAO,EAAE,CACnD,CAAC;CACD,MAAM,mBAAmB,IAAI,IAAY,oBAAoB,KAAK,eAAe,WAAW,EAAE,CAAC;CAE/F,KAAK,MAAM,YAAY,WAAW;EAChC,MAAM,KAAK,SAAS,OAAO;EAE3B,IACE,SAAS,SAAS,UAAU,cAC5B,CAAC,SAAS,SAAS,SAAS,UAAU,KACtC,CAAC,cAAc,KAAK,SAAS,SAAS,UAAU,GAEhD,OAAO,KACL,MAAM,IAAI,YAAY,gEAAgE,CACxF;EAGF,IAAI,CAAC,KAAK,KAAK,EAAE,KAAK,CAAC,KAAK,KAAK,SAAS,QAAQ,IAAI,GACpD,OAAO,KACL,MAAM,IAAI,YAAY,2DAA2D,CACnF;EAEF,IAAI,YAAY,IAAI,EAAE,KAAK,YAAY,IAAI,EAAE,GAC3C,OAAO,KAAK,MAAM,IAAI,gBAAgB,cAAc,GAAG,qBAAqB,CAAC;EAE/E,IAAI,cAAc,IAAI,SAAS,QAAQ,IAAI,KAAK,cAAc,IAAI,SAAS,QAAQ,IAAI,GACrF,OAAO,KACL,MAAM,IAAI,kBAAkB,mBAAmB,SAAS,QAAQ,KAAK,qBAAqB,CAC5F;EAEF,YAAY,IAAI,EAAE;EAClB,cAAc,IAAI,SAAS,QAAQ,IAAI;EAEvC,MAAM,WAAW,cAAc,SAAS,OAAO,QAAQ,EACrD,OAAO,EAAE,WAAW,CAAC,iBAAiB,EAAE,EAC1C,CAAC;EACD,IAAI,OAAO,UAAU,QAAQ,GAC3B,OAAO,KAAK,MAAM,IAAI,UAAU,SAAS,QAAQ,OAAO,CAAC;OACpD,IAAI,SAAS,OAAO,YAAY,WAAW,SAAS,QAAQ,YAAY,SAC7E,OAAO,KAAK,MAAM,IAAI,WAAW,8CAA8C,CAAC;EAGlF,MAAM,SAAS,SAAS,SAAS,OAAO,MAAM;EAC9C,IAAI,OAAO,UAAU,MAAM,GAAG;GAC5B,MAAM,kBAAkB,CAAC,GAAG,0BAA0B,OAAO,OAAO,CAAC;GACrE,IAAI,CAAC,YAAY,SAAS,OAAO,WAAW,eAAe,GACzD,OAAO,KACL,MAAM,IAAI,aAAa,yDAAyD,CAClF;EAEJ;EAEA,MAAM,kBAAkB,OAAO,KAAK,SAAS,QAAQ,UAAU;EAC/D,IAAI,CAAC,YAAY,iBAAiB,SAAS,OAAO,SAAS,GACzD,OAAO,KACL,MAAM,IAAI,eAAe,wDAAwD,CACnF;EAEF,IAAI,OAAO,OAAO,SAAS,QAAQ,UAAU,CAAC,CAAC,MAAM,UAAU,CAAC,SAAS,KAAK,CAAC,GAC7E,OAAO,KAAK,MAAM,IAAI,eAAe,sCAAsC,CAAC;EAG9E,MAAM,iBAAiB,SAAS,QAAQ,OAAO,KAAK,UAAU,MAAM,QAAQ;EAC5E,IAAI,IAAI,IAAI,cAAc,CAAC,CAAC,SAAS,eAAe,QAClD,OAAO,KAAK,MAAM,IAAI,UAAU,0CAA0C,CAAC;EAE7E,KAAK,MAAM,SAAS,SAAS,QAAQ,QAAQ;GAC3C,MAAM,QAAQ,SAAS,QAAQ,WAAW,MAAM;GAChD,MAAM,MAAM,UAAU,KAAA,IAAY,OAAO,IAAI,MAAM,KAAK;GACxD,IAAI,CAAC,SAAS,OAAO,UAAU,SAAS,MAAM,QAAQ,GACpD,OAAO,KACL,MAAM,IAAI,UAAU,UAAU,MAAM,SAAS,oCAAoC,CACnF;GAEF,IAAI,QAAQ,QAAQ,IAAI,aAAa,UACnC,OAAO,KACL,MAAM,IAAI,UAAU,UAAU,MAAM,SAAS,0CAA0C,CACzF;EAEJ;EAEA,MAAM,WAAW,SAAS;EAC1B,MAAM,kBAAkB;GACtB,SAAS,OAAO;GAChB,SAAS,OAAO;GAChB,SAAS,QAAQ;GACjB,SAAS,QAAQ;GACjB,SAAS;GACT,SAAS;GACT,SAAS,IAAI;GACb,SAAS,IAAI;GACb,GAAG,SAAS;GACZ,GAAG,OAAO,OAAO,SAAS,oBAAoB;EAChD;EACA,IAAI,SAAS,SAAS,WAAW,KAAK,gBAAgB,MAAM,UAAU,CAAC,SAAS,KAAK,CAAC,GACpF,OAAO,KAAK,MAAM,IAAI,mBAAmB,0CAA0C,CAAC;EAEtF,IAAI,CAAC,YAAY,OAAO,KAAK,SAAS,oBAAoB,GAAG,SAAS,OAAO,SAAS,GACpF,OAAO,KACL,MACE,IACA,mBACA,kEACF,CACF;EAGF,IAAI,IAAI,IAAI,SAAS,QAAQ,WAAW,CAAC,CAAC,SAAS,SAAS,QAAQ,YAAY,QAC9E,OAAO,KAAK,MAAM,IAAI,aAAa,sCAAsC,CAAC;EAE5E,KAAK,MAAM,gBAAgB,SAAS,QAAQ,aAC1C,IAAI,CAAC,iBAAiB,IAAI,YAAY,GACpC,OAAO,KAAK,MAAM,IAAI,aAAa,eAAe,aAAa,aAAa,CAAC;EAGjF,IACE,IAAI,IAAI,SAAS,QAAQ,gBAAgB,CAAC,CAAC,SAAS,SAAS,QAAQ,iBAAiB,QAEtF,OAAO,KAAK,MAAM,IAAI,aAAa,4CAA4C,CAAC;EAElF,KAAK,MAAM,aAAa,SAAS,QAAQ,kBACvC,IAAI,cAAc,MAAM,CAAC,YAAY,IAAI,SAAS,GAChD,OAAO,KAAK,MAAM,IAAI,aAAa,qBAAqB,UAAU,aAAa,CAAC;CAGtF;CAEA,IAAI,OAAO,SAAS,GAAG,OAAO,OAAO,KAAK,MAAM;CAEhD,OAAO,OAAO,QACZ,UAAU,KAAK,cAAc;EAC3B,UAAU;GAAE,GAAG,SAAS;GAAU,OAAO;EAAW;EACpD,QAAQ;GACN,IAAI,SAAS,OAAO;GACpB,SAAS,SAAS,OAAO;GACzB,UAAU,SAAS,OAAO;GAC1B,MAAM,SAAS,OAAO;GACtB,aAAa,SAAS,OAAO;GAC7B,WAAW,SAAS,OAAO;EAC7B;EACA,QAAQ,SAAS,OAAO;EACxB,SAAS;GACP,GAAG,SAAS;GACZ,MAAM,cAAc,SAAS,QAAQ;EACvC;EACA,SAAS,SAAS;EAClB,gBAAgB,SAAS;CAC3B,EAAE,CACJ;AACF"}
@@ -0,0 +1,41 @@
1
+ import { EmailPresetId } from "../presets.js";
2
+ import { PublicTemplate } from "./public-gallery.js";
3
+ import { PreviewQuality } from "./public-preview.js";
4
+ import { Result } from "effect";
5
+ //#region presets/public-preview-artifacts.d.ts
6
+ type PreviewSurface = "card" | "detail" | "og";
7
+ type PreviewViewport = "desktop" | "mobile";
8
+ type PreviewColorScheme = "light" | "dark";
9
+ interface PublicTemplateRenderInput {
10
+ readonly name: `${string}.${PreviewSurface}.${PreviewViewport}.${PreviewColorScheme}.html`;
11
+ readonly surface: PreviewSurface;
12
+ readonly viewport: PreviewViewport;
13
+ readonly colorScheme: PreviewColorScheme;
14
+ readonly width: number;
15
+ readonly height: number;
16
+ readonly html: string;
17
+ }
18
+ interface PublicTemplatePreviewArtifact {
19
+ readonly presetId: EmailPresetId;
20
+ readonly slug: string;
21
+ readonly subject: string;
22
+ readonly preheader: string;
23
+ readonly quality: PreviewQuality;
24
+ readonly source: string;
25
+ readonly html: string;
26
+ readonly assets: ReadonlyArray<string>;
27
+ readonly renders: ReadonlyArray<PublicTemplateRenderInput>;
28
+ }
29
+ interface PreviewArtifactBuildIssue {
30
+ readonly presetId: EmailPresetId;
31
+ readonly message: string;
32
+ }
33
+ /** Build one static preview artifact without loading the editor runtime or performing I/O. */
34
+ declare const buildPublicTemplatePreviewArtifact: (template: PublicTemplate) => Result.Result<PublicTemplatePreviewArtifact, PreviewArtifactBuildIssue>;
35
+ /** Build only the requested canonical subset, preserving manifest order and aggregated failures. */
36
+ declare const buildPublicTemplatePreviewArtifactsFor: (templates: ReadonlyArray<PublicTemplate>) => Result.Result<ReadonlyArray<PublicTemplatePreviewArtifact>, ReadonlyArray<PreviewArtifactBuildIssue>>;
37
+ /** Build the complete canonical public gallery. */
38
+ declare const buildPublicTemplatePreviewArtifacts: () => Result.Result<readonly PublicTemplatePreviewArtifact[], readonly PreviewArtifactBuildIssue[]>;
39
+ //#endregion
40
+ export { PreviewArtifactBuildIssue, PreviewColorScheme, PreviewSurface, PreviewViewport, PublicTemplatePreviewArtifact, PublicTemplateRenderInput, buildPublicTemplatePreviewArtifact, buildPublicTemplatePreviewArtifacts, buildPublicTemplatePreviewArtifactsFor };
41
+ //# sourceMappingURL=public-preview-artifacts.d.ts.map
@@ -0,0 +1,109 @@
1
+ import { interpolate } from "../interpolate.js";
2
+ import { compileSource } from "../compile.js";
3
+ import { RECOMMENDED_THEME, presetCatalog } from "../presets.js";
4
+ import { publicTemplates } from "./public-gallery.js";
5
+ import { publicTemplatePreviews } from "./public-preview.js";
6
+ import { presetSource } from "./sources.js";
7
+ import { Result } from "effect";
8
+ //#region presets/public-preview-artifacts.ts
9
+ const renderFrames = [
10
+ {
11
+ surface: "card",
12
+ viewport: "desktop",
13
+ width: 600,
14
+ height: 760
15
+ },
16
+ {
17
+ surface: "card",
18
+ viewport: "mobile",
19
+ width: 390,
20
+ height: 680
21
+ },
22
+ {
23
+ surface: "detail",
24
+ viewport: "desktop",
25
+ width: 720,
26
+ height: 900
27
+ },
28
+ {
29
+ surface: "detail",
30
+ viewport: "mobile",
31
+ width: 390,
32
+ height: 844
33
+ },
34
+ {
35
+ surface: "og",
36
+ viewport: "desktop",
37
+ width: 1200,
38
+ height: 630
39
+ }
40
+ ];
41
+ const renderInputs = (slug, html) => renderFrames.flatMap((frame) => ["light", "dark"].map((colorScheme) => ({
42
+ ...frame,
43
+ colorScheme,
44
+ name: `${slug}.${frame.surface}.${frame.viewport}.${colorScheme}.html`,
45
+ html
46
+ })));
47
+ /** Build one static preview artifact without loading the editor runtime or performing I/O. */
48
+ const buildPublicTemplatePreviewArtifact = (template) => {
49
+ const source = presetSource(template.presetId);
50
+ const preset = presetCatalog.find((entry) => entry.id === template.presetId);
51
+ const preview = publicTemplatePreviews[template.presetId];
52
+ if (source === void 0 || preset === void 0) return Result.fail({
53
+ presetId: template.presetId,
54
+ message: "canonical preset source is missing"
55
+ });
56
+ const compiled = compileSource(source, { theme: { overrides: [RECOMMENDED_THEME] } });
57
+ if (Result.isFailure(compiled) || compiled.success.channel !== "email") return Result.fail({
58
+ presetId: template.presetId,
59
+ message: "canonical preset did not compile as email"
60
+ });
61
+ const variableSchema = preset.variables.map((name) => ({
62
+ name,
63
+ type: "string",
64
+ required: true
65
+ }));
66
+ const rendered = interpolate(compiled.success.html, preview.sampleData, variableSchema);
67
+ if (rendered.missing.size > 0) return Result.fail({
68
+ presetId: template.presetId,
69
+ message: `sample data is missing: ${[...rendered.missing].sort().join(", ")}`
70
+ });
71
+ const sampleData = preview.sampleData;
72
+ const assets = [];
73
+ for (const asset of preview.assets) {
74
+ const value = sampleData[asset.variable];
75
+ if (value === void 0) return Result.fail({
76
+ presetId: template.presetId,
77
+ message: `sample data is missing asset: ${asset.variable}`
78
+ });
79
+ assets.push(value);
80
+ }
81
+ return Result.succeed({
82
+ presetId: template.presetId,
83
+ slug: template.slug,
84
+ subject: preview.subject,
85
+ preheader: preview.preheader,
86
+ quality: preview.quality,
87
+ source,
88
+ html: rendered.rendered,
89
+ assets,
90
+ renders: renderInputs(template.slug, rendered.rendered)
91
+ });
92
+ };
93
+ /** Build only the requested canonical subset, preserving manifest order and aggregated failures. */
94
+ const buildPublicTemplatePreviewArtifactsFor = (templates) => {
95
+ const artifacts = [];
96
+ const issues = [];
97
+ for (const template of templates) {
98
+ const artifact = buildPublicTemplatePreviewArtifact(template);
99
+ if (Result.isSuccess(artifact)) artifacts.push(artifact.success);
100
+ else issues.push(artifact.failure);
101
+ }
102
+ return issues.length > 0 ? Result.fail(issues) : Result.succeed(artifacts);
103
+ };
104
+ /** Build the complete canonical public gallery. */
105
+ const buildPublicTemplatePreviewArtifacts = () => buildPublicTemplatePreviewArtifactsFor(publicTemplates);
106
+ //#endregion
107
+ export { buildPublicTemplatePreviewArtifact, buildPublicTemplatePreviewArtifacts, buildPublicTemplatePreviewArtifactsFor };
108
+
109
+ //# sourceMappingURL=public-preview-artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-preview-artifacts.js","names":[],"sources":["../../presets/public-preview-artifacts.ts"],"sourcesContent":["import { Result } from \"effect\";\n\nimport { compileSource } from \"../src/compile\";\nimport { interpolate, type DocumentVariable } from \"../src/interpolate\";\nimport { presetCatalog, RECOMMENDED_THEME, type EmailPresetId } from \"./catalog\";\nimport { publicTemplates, type PublicTemplate } from \"./public-gallery\";\nimport { publicTemplatePreviews, type PreviewQuality } from \"./public-preview\";\nimport { presetSource } from \"./sources.gen\";\n\nexport type PreviewSurface = \"card\" | \"detail\" | \"og\";\nexport type PreviewViewport = \"desktop\" | \"mobile\";\nexport type PreviewColorScheme = \"light\" | \"dark\";\n\nexport interface PublicTemplateRenderInput {\n readonly name: `${string}.${PreviewSurface}.${PreviewViewport}.${PreviewColorScheme}.html`;\n readonly surface: PreviewSurface;\n readonly viewport: PreviewViewport;\n readonly colorScheme: PreviewColorScheme;\n readonly width: number;\n readonly height: number;\n readonly html: string;\n}\n\nexport interface PublicTemplatePreviewArtifact {\n readonly presetId: EmailPresetId;\n readonly slug: string;\n readonly subject: string;\n readonly preheader: string;\n readonly quality: PreviewQuality;\n readonly source: string;\n readonly html: string;\n readonly assets: ReadonlyArray<string>;\n readonly renders: ReadonlyArray<PublicTemplateRenderInput>;\n}\n\nexport interface PreviewArtifactBuildIssue {\n readonly presetId: EmailPresetId;\n readonly message: string;\n}\n\nconst renderFrames = [\n { surface: \"card\", viewport: \"desktop\", width: 600, height: 760 },\n { surface: \"card\", viewport: \"mobile\", width: 390, height: 680 },\n { surface: \"detail\", viewport: \"desktop\", width: 720, height: 900 },\n { surface: \"detail\", viewport: \"mobile\", width: 390, height: 844 },\n { surface: \"og\", viewport: \"desktop\", width: 1200, height: 630 },\n] as const satisfies ReadonlyArray<{\n readonly surface: PreviewSurface;\n readonly viewport: PreviewViewport;\n readonly width: number;\n readonly height: number;\n}>;\n\nconst renderInputs = (slug: string, html: string): ReadonlyArray<PublicTemplateRenderInput> =>\n renderFrames.flatMap((frame) =>\n ([\"light\", \"dark\"] as const).map((colorScheme) => ({\n ...frame,\n colorScheme,\n name: `${slug}.${frame.surface}.${frame.viewport}.${colorScheme}.html`,\n html,\n })),\n );\n\n/** Build one static preview artifact without loading the editor runtime or performing I/O. */\nexport const buildPublicTemplatePreviewArtifact = (\n template: PublicTemplate,\n): Result.Result<PublicTemplatePreviewArtifact, PreviewArtifactBuildIssue> => {\n const source = presetSource(template.presetId);\n const preset = presetCatalog.find((entry) => entry.id === template.presetId);\n const preview = publicTemplatePreviews[template.presetId];\n if (source === undefined || preset === undefined) {\n return Result.fail({\n presetId: template.presetId,\n message: \"canonical preset source is missing\",\n });\n }\n\n const compiled = compileSource(source, { theme: { overrides: [RECOMMENDED_THEME] } });\n if (Result.isFailure(compiled) || compiled.success.channel !== \"email\") {\n return Result.fail({\n presetId: template.presetId,\n message: \"canonical preset did not compile as email\",\n });\n }\n\n const variableSchema: ReadonlyArray<DocumentVariable> = preset.variables.map((name) => ({\n name,\n type: \"string\",\n required: true,\n }));\n const rendered = interpolate(compiled.success.html, preview.sampleData, variableSchema);\n if (rendered.missing.size > 0) {\n return Result.fail({\n presetId: template.presetId,\n message: `sample data is missing: ${[...rendered.missing].sort().join(\", \")}`,\n });\n }\n\n const sampleData: Readonly<Record<string, string>> = preview.sampleData;\n const assets: Array<string> = [];\n for (const asset of preview.assets) {\n const value = sampleData[asset.variable];\n if (value === undefined) {\n return Result.fail({\n presetId: template.presetId,\n message: `sample data is missing asset: ${asset.variable}`,\n });\n }\n assets.push(value);\n }\n return Result.succeed({\n presetId: template.presetId,\n slug: template.slug,\n subject: preview.subject,\n preheader: preview.preheader,\n quality: preview.quality,\n source,\n html: rendered.rendered,\n assets,\n renders: renderInputs(template.slug, rendered.rendered),\n });\n};\n\n/** Build only the requested canonical subset, preserving manifest order and aggregated failures. */\nexport const buildPublicTemplatePreviewArtifactsFor = (\n templates: ReadonlyArray<PublicTemplate>,\n): Result.Result<\n ReadonlyArray<PublicTemplatePreviewArtifact>,\n ReadonlyArray<PreviewArtifactBuildIssue>\n> => {\n const artifacts: Array<PublicTemplatePreviewArtifact> = [];\n const issues: Array<PreviewArtifactBuildIssue> = [];\n\n for (const template of templates) {\n const artifact = buildPublicTemplatePreviewArtifact(template);\n if (Result.isSuccess(artifact)) artifacts.push(artifact.success);\n else issues.push(artifact.failure);\n }\n\n return issues.length > 0 ? Result.fail(issues) : Result.succeed(artifacts);\n};\n\n/** Build the complete canonical public gallery. */\nexport const buildPublicTemplatePreviewArtifacts = () =>\n buildPublicTemplatePreviewArtifactsFor(publicTemplates);\n"],"mappings":";;;;;;;;AAwCA,MAAM,eAAe;CACnB;EAAE,SAAS;EAAQ,UAAU;EAAW,OAAO;EAAK,QAAQ;CAAI;CAChE;EAAE,SAAS;EAAQ,UAAU;EAAU,OAAO;EAAK,QAAQ;CAAI;CAC/D;EAAE,SAAS;EAAU,UAAU;EAAW,OAAO;EAAK,QAAQ;CAAI;CAClE;EAAE,SAAS;EAAU,UAAU;EAAU,OAAO;EAAK,QAAQ;CAAI;CACjE;EAAE,SAAS;EAAM,UAAU;EAAW,OAAO;EAAM,QAAQ;CAAI;AACjE;AAOA,MAAM,gBAAgB,MAAc,SAClC,aAAa,SAAS,UACnB,CAAC,SAAS,MAAM,CAAC,CAAW,KAAK,iBAAiB;CACjD,GAAG;CACH;CACA,MAAM,GAAG,KAAK,GAAG,MAAM,QAAQ,GAAG,MAAM,SAAS,GAAG,YAAY;CAChE;AACF,EAAE,CACJ;;AAGF,MAAa,sCACX,aAC4E;CAC5E,MAAM,SAAS,aAAa,SAAS,QAAQ;CAC7C,MAAM,SAAS,cAAc,MAAM,UAAU,MAAM,OAAO,SAAS,QAAQ;CAC3E,MAAM,UAAU,uBAAuB,SAAS;CAChD,IAAI,WAAW,KAAA,KAAa,WAAW,KAAA,GACrC,OAAO,OAAO,KAAK;EACjB,UAAU,SAAS;EACnB,SAAS;CACX,CAAC;CAGH,MAAM,WAAW,cAAc,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAC,iBAAiB,EAAE,EAAE,CAAC;CACpF,IAAI,OAAO,UAAU,QAAQ,KAAK,SAAS,QAAQ,YAAY,SAC7D,OAAO,OAAO,KAAK;EACjB,UAAU,SAAS;EACnB,SAAS;CACX,CAAC;CAGH,MAAM,iBAAkD,OAAO,UAAU,KAAK,UAAU;EACtF;EACA,MAAM;EACN,UAAU;CACZ,EAAE;CACF,MAAM,WAAW,YAAY,SAAS,QAAQ,MAAM,QAAQ,YAAY,cAAc;CACtF,IAAI,SAAS,QAAQ,OAAO,GAC1B,OAAO,OAAO,KAAK;EACjB,UAAU,SAAS;EACnB,SAAS,2BAA2B,CAAC,GAAG,SAAS,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI;CAC5E,CAAC;CAGH,MAAM,aAA+C,QAAQ;CAC7D,MAAM,SAAwB,CAAC;CAC/B,KAAK,MAAM,SAAS,QAAQ,QAAQ;EAClC,MAAM,QAAQ,WAAW,MAAM;EAC/B,IAAI,UAAU,KAAA,GACZ,OAAO,OAAO,KAAK;GACjB,UAAU,SAAS;GACnB,SAAS,iCAAiC,MAAM;EAClD,CAAC;EAEH,OAAO,KAAK,KAAK;CACnB;CACA,OAAO,OAAO,QAAQ;EACpB,UAAU,SAAS;EACnB,MAAM,SAAS;EACf,SAAS,QAAQ;EACjB,WAAW,QAAQ;EACnB,SAAS,QAAQ;EACjB;EACA,MAAM,SAAS;EACf;EACA,SAAS,aAAa,SAAS,MAAM,SAAS,QAAQ;CACxD,CAAC;AACH;;AAGA,MAAa,0CACX,cAIG;CACH,MAAM,YAAkD,CAAC;CACzD,MAAM,SAA2C,CAAC;CAElD,KAAK,MAAM,YAAY,WAAW;EAChC,MAAM,WAAW,mCAAmC,QAAQ;EAC5D,IAAI,OAAO,UAAU,QAAQ,GAAG,UAAU,KAAK,SAAS,OAAO;OAC1D,OAAO,KAAK,SAAS,OAAO;CACnC;CAEA,OAAO,OAAO,SAAS,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,QAAQ,SAAS;AAC3E;;AAGA,MAAa,4CACX,uCAAuC,eAAe"}