@clay-design-system/email 0.2.4 → 0.3.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 (195) hide show
  1. package/MIGRATION.md +31 -0
  2. package/README.md +7 -0
  3. package/dist/build/catalog.d.ts +0 -1
  4. package/dist/generated/email-tokens.d.ts +0 -1
  5. package/dist/generated/email-tokens.js +0 -1
  6. package/dist/index.d.ts +1 -2
  7. package/dist/index.js +0 -1
  8. package/package.json +14 -5
  9. package/dist/build/asset-scoring.d.ts +0 -48
  10. package/dist/build/asset-scoring.d.ts.map +0 -1
  11. package/dist/build/asset-scoring.js +0 -58
  12. package/dist/build/asset-scoring.js.map +0 -1
  13. package/dist/build/braze-transform.d.ts +0 -20
  14. package/dist/build/braze-transform.d.ts.map +0 -1
  15. package/dist/build/braze-transform.js +0 -26
  16. package/dist/build/braze-transform.js.map +0 -1
  17. package/dist/build/catalog.d.ts.map +0 -1
  18. package/dist/build/catalog.js +0 -3
  19. package/dist/build/catalog.js.map +0 -1
  20. package/dist/build/cloudinary-env.d.ts +0 -15
  21. package/dist/build/cloudinary-env.d.ts.map +0 -1
  22. package/dist/build/cloudinary-env.js +0 -36
  23. package/dist/build/cloudinary-env.js.map +0 -1
  24. package/dist/build/cloudinary-manifest.d.ts +0 -33
  25. package/dist/build/cloudinary-manifest.d.ts.map +0 -1
  26. package/dist/build/cloudinary-manifest.js +0 -36
  27. package/dist/build/cloudinary-manifest.js.map +0 -1
  28. package/dist/build/compile.d.ts +0 -11
  29. package/dist/build/compile.d.ts.map +0 -1
  30. package/dist/build/compile.js +0 -234
  31. package/dist/build/compile.js.map +0 -1
  32. package/dist/build/email-config.d.ts +0 -26
  33. package/dist/build/email-config.d.ts.map +0 -1
  34. package/dist/build/email-config.js +0 -17
  35. package/dist/build/email-config.js.map +0 -1
  36. package/dist/build/email-list.d.ts +0 -6
  37. package/dist/build/email-list.d.ts.map +0 -1
  38. package/dist/build/email-list.js +0 -17
  39. package/dist/build/email-list.js.map +0 -1
  40. package/dist/build/email-tree.d.ts +0 -23
  41. package/dist/build/email-tree.d.ts.map +0 -1
  42. package/dist/build/email-tree.js +0 -46
  43. package/dist/build/email-tree.js.map +0 -1
  44. package/dist/build/export-braze.d.ts +0 -22
  45. package/dist/build/export-braze.d.ts.map +0 -1
  46. package/dist/build/export-braze.js +0 -92
  47. package/dist/build/export-braze.js.map +0 -1
  48. package/dist/build/generate-stock-library-map.d.ts +0 -13
  49. package/dist/build/generate-stock-library-map.d.ts.map +0 -1
  50. package/dist/build/generate-stock-library-map.js +0 -202
  51. package/dist/build/generate-stock-library-map.js.map +0 -1
  52. package/dist/build/icon-registry-map.d.ts +0 -34
  53. package/dist/build/icon-registry-map.d.ts.map +0 -1
  54. package/dist/build/icon-registry-map.js +0 -44
  55. package/dist/build/icon-registry-map.js.map +0 -1
  56. package/dist/build/import-examples.d.ts +0 -14
  57. package/dist/build/import-examples.d.ts.map +0 -1
  58. package/dist/build/import-examples.js +0 -65
  59. package/dist/build/import-examples.js.map +0 -1
  60. package/dist/build/persona-character-map.d.ts +0 -32
  61. package/dist/build/persona-character-map.d.ts.map +0 -1
  62. package/dist/build/persona-character-map.js +0 -90
  63. package/dist/build/persona-character-map.js.map +0 -1
  64. package/dist/build/placeholder.d.ts +0 -79
  65. package/dist/build/placeholder.d.ts.map +0 -1
  66. package/dist/build/placeholder.js +0 -148
  67. package/dist/build/placeholder.js.map +0 -1
  68. package/dist/build/stock-library-map.d.ts +0 -57
  69. package/dist/build/stock-library-map.d.ts.map +0 -1
  70. package/dist/build/stock-library-map.js +0 -1261
  71. package/dist/build/stock-library-map.js.map +0 -1
  72. package/dist/build/upload-assets.d.ts +0 -20
  73. package/dist/build/upload-assets.d.ts.map +0 -1
  74. package/dist/build/upload-assets.js +0 -153
  75. package/dist/build/upload-assets.js.map +0 -1
  76. package/dist/build/upload-library-assets.d.ts +0 -21
  77. package/dist/build/upload-library-assets.d.ts.map +0 -1
  78. package/dist/build/upload-library-assets.js +0 -182
  79. package/dist/build/upload-library-assets.js.map +0 -1
  80. package/dist/build/visual-resolver.d.ts +0 -87
  81. package/dist/build/visual-resolver.d.ts.map +0 -1
  82. package/dist/build/visual-resolver.js +0 -439
  83. package/dist/build/visual-resolver.js.map +0 -1
  84. package/dist/examples/manifest.d.ts +0 -21
  85. package/dist/examples/manifest.d.ts.map +0 -1
  86. package/dist/examples/manifest.js +0 -84
  87. package/dist/examples/manifest.js.map +0 -1
  88. package/dist/exports/contact-sales/Images/Contact_sales_Image_16f4175c-d08c-43f6-9d4c-a0606383271d.png +0 -0
  89. package/dist/exports/contact-sales/Images/Contact_sales_Image_659b3091-1da9-40c2-86b0-04250982e529.png +0 -0
  90. package/dist/exports/contact-sales/Images/Contact_sales_Image_79c651f4-5f0f-4a7f-8354-1f6f95ae86d9.png +0 -0
  91. package/dist/exports/contact-sales/index.braze.html +0 -837
  92. package/dist/exports/contact-sales/index.html +0 -837
  93. package/dist/exports/event-confirmation/Images/Confirmation_Image_11938de2-4161-4ae8-8969-90ea0d8b45cb.png +0 -0
  94. package/dist/exports/event-confirmation/Images/Confirmation_Image_3c52e81f-5d4f-452c-bad1-0471a27598f1.png +0 -0
  95. package/dist/exports/event-confirmation/Images/Confirmation_Image_3ec1fec8-bf46-4068-8835-633567a715f9.png +0 -0
  96. package/dist/exports/event-confirmation/Images/Confirmation_Image_c4980c01-c270-4384-a56c-0bae74814cf9.png +0 -0
  97. package/dist/exports/event-confirmation/Images/Confirmation_Image_cde93e8c-0f96-434d-acaf-1b86503c66f0.png +0 -0
  98. package/dist/exports/event-confirmation/index.braze.html +0 -1055
  99. package/dist/exports/event-confirmation/index.html +0 -1055
  100. package/dist/exports/legal-update/Images/v2_Image_07bbcc13-0ab8-46e4-ab94-98f215f85f69.png +0 -0
  101. package/dist/exports/legal-update/Images/v2_Image_34394d50-acdf-4375-b254-eef1f84aaacb.png +0 -0
  102. package/dist/exports/legal-update/Images/v2_Image_4a25f2bd-6270-439b-86c5-4a968a1b104f.png +0 -0
  103. package/dist/exports/legal-update/Images/v2_Image_7e8e814f-3112-4d8c-af5b-4f4616d84d9c.png +0 -0
  104. package/dist/exports/legal-update/Images/v2_Image_b24a04c8-4af0-42a1-be0f-cd3f66595e47.png +0 -0
  105. package/dist/exports/legal-update/Images/v2_Image_b709b9fb-836e-4c20-82e5-a9cb9d702392.png +0 -0
  106. package/dist/exports/legal-update/Images/v2_Image_ed7b924b-35e6-4536-be0c-92ddc8a34fc2.png +0 -0
  107. package/dist/exports/legal-update/index.braze.html +0 -1731
  108. package/dist/exports/legal-update/index.html +0 -1731
  109. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_09be22f6-1f30-4c58-bf33-1df0494b8fc2.png +0 -0
  110. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_2dfb595e-6fe2-4e6e-a73a-942a085b38ab.png +0 -0
  111. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_544c971b-b4b5-4c89-a25a-8f0d92644009.png +0 -0
  112. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_5b6a9576-1c33-40c5-81e3-637514fb6c78.png +0 -0
  113. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_680c6193-793a-4a24-8288-4bb4046f4f5e.png +0 -0
  114. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_75818ba9-026a-45d7-91e4-f992d4ee7690.png +0 -0
  115. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_785f18e6-816d-44d1-8efb-ecc82510b540.png +0 -0
  116. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_8bf9141d-9d63-4601-9e81-5c9d726e17f8.png +0 -0
  117. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_9097d6e0-65d0-4237-9661-963751812786.png +0 -0
  118. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_a4ef2f53-2eaf-438a-bfef-61455ac0915e.png +0 -0
  119. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_b7748f87-a7b7-4a91-981a-16567683e4b4.png +0 -0
  120. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_bc9830a4-2911-4768-808a-32cbbc39215e.png +0 -0
  121. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_ef0e8e92-9075-43a9-991f-09a77ef6d6d4.png +0 -0
  122. package/dist/exports/newsletter/index.braze.html +0 -125
  123. package/dist/exports/newsletter/index.html +0 -125
  124. package/dist/exports/newsletter-ai-june-july/Images/newsletter-ai-blocks.png +0 -0
  125. package/dist/exports/newsletter-ai-june-july/Images/newsletter-ai-hero-mcp.png +0 -0
  126. package/dist/exports/newsletter-ai-june-july/Images/newsletter-ai-magic.png +0 -0
  127. package/dist/exports/newsletter-ai-june-july/Images/newsletter-ai-mcp.png +0 -0
  128. package/dist/exports/newsletter-ai-june-july/Images/newsletter-ai-portfolio.png +0 -0
  129. package/dist/exports/newsletter-ai-june-july/index.braze.html +0 -1640
  130. package/dist/exports/newsletter-ai-june-july/index.html +0 -1640
  131. package/dist/exports/survey/Images/EmailLove_Image_3b6f4a6f-7f5f-418b-be71-9371b25c20ce.png +0 -0
  132. package/dist/exports/survey/Images/EmailLove_Image_f659c728-2401-485d-8d90-98c962d28c0c.png +0 -0
  133. package/dist/exports/survey/index.braze.html +0 -515
  134. package/dist/exports/survey/index.html +0 -515
  135. package/dist/exports/trial-01-welcome/Images/tp1_-_welcome_Before_115ccc58-a47f-4eca-a1f2-c0d86e1e1cf4.png +0 -0
  136. package/dist/exports/trial-01-welcome/Images/tp1_-_welcome_Before_aec4d0d3-6057-4b8a-8d8f-46fbd024f182.png +0 -0
  137. package/dist/exports/trial-01-welcome/Images/tp1_-_welcome_Before_d139966a-6051-4383-bf8f-1e5138e1b030.png +0 -0
  138. package/dist/exports/trial-01-welcome/Images/tp1_-_welcome_Image_080fa361-a3f2-4593-9ac0-03cf3a7972ff.png +0 -0
  139. package/dist/exports/trial-01-welcome/Images/tp1_-_welcome_Image_5ebade34-8f1d-4c2c-9d27-5f9e843ce502.png +0 -0
  140. package/dist/exports/trial-01-welcome/Images/tp1_-_welcome_Image_aa5e4144-9ec8-4525-b01e-077d72f0bab6.png +0 -0
  141. package/dist/exports/trial-01-welcome/index.braze.html +0 -941
  142. package/dist/exports/trial-01-welcome/index.html +0 -941
  143. package/dist/exports/trial-02/Images/tp2_Image_5b0d9bc4-2e38-4252-8f20-d9f27d471c21.png +0 -0
  144. package/dist/exports/trial-02/Images/tp2_Image_b3f77c7c-cc8e-4db8-a5d9-072f4f621e72.png +0 -0
  145. package/dist/exports/trial-02/Images/tp2_Image_cafd1a17-1915-47cd-80f2-1c2d0b133cfe.png +0 -0
  146. package/dist/exports/trial-02/index.braze.html +0 -923
  147. package/dist/exports/trial-02/index.html +0 -923
  148. package/dist/exports/trial-03/Images/tp3_Image_1b96630c-fc4d-4aec-91fb-3c1d4d8544b3.png +0 -0
  149. package/dist/exports/trial-03/Images/tp3_Image_58f3a342-2193-4b5c-b30a-96f7f3338dd8.png +0 -0
  150. package/dist/exports/trial-03/Images/tp3_Image_6c4f307a-bac2-40e7-b4f1-9aa623c9eb8e.png +0 -0
  151. package/dist/exports/trial-03/Images/tp3_Image_848917ce-3f89-4538-a826-558b21f5fea7.png +0 -0
  152. package/dist/exports/trial-03/Images/tp3_Image_aae8410f-556f-4fb9-88f9-f276d75bafd2.png +0 -0
  153. package/dist/exports/trial-03/Images/tp3_Image_b4d5be39-509e-4f22-9601-dd070e4c6561.png +0 -0
  154. package/dist/exports/trial-03/index.braze.html +0 -1129
  155. package/dist/exports/trial-03/index.html +0 -1129
  156. package/dist/exports/trial-04/Images/tp4_Image_03bd5a56-25e3-4dcc-bef5-143bf12312d5.png +0 -0
  157. package/dist/exports/trial-04/Images/tp4_Image_0facbfca-b735-4199-a0d9-05a59341a1e3.gif +0 -0
  158. package/dist/exports/trial-04/Images/tp4_Image_171cee5f-cd3d-42f0-a180-995893d3742a.png +0 -0
  159. package/dist/exports/trial-04/Images/tp4_Image_3509d89d-1825-4817-8c1e-130fa294d0e1.png +0 -0
  160. package/dist/exports/trial-04/Images/tp4_Image_763a0f40-2985-4140-859b-ddd34f20a520.png +0 -0
  161. package/dist/exports/trial-04/Images/tp4_Image_cc2db4f5-b41d-45d7-a798-7a79e7b8d4d8.png +0 -0
  162. package/dist/exports/trial-04/index.braze.html +0 -885
  163. package/dist/exports/trial-04/index.html +0 -885
  164. package/dist/exports/trial-05/Images/tp5_Image_0248a517-5c60-4e84-ad1c-449dcf4f6a64.png +0 -0
  165. package/dist/exports/trial-05/Images/tp5_Image_4c1a2d5a-47d3-4801-bb3a-01c22decc108.png +0 -0
  166. package/dist/exports/trial-05/Images/tp5_Image_63ae77e7-cec7-4b4a-91e0-603b5a80929f.png +0 -0
  167. package/dist/exports/trial-05/Images/tp5_Image_7aa43530-6707-4308-ab0e-e4c38fc1b77d.png +0 -0
  168. package/dist/exports/trial-05/Images/tp5_Image_7efe5b6d-b360-4179-bee1-72908ba569bc.png +0 -0
  169. package/dist/exports/trial-05/Images/tp5_Image_b142bd84-c40a-4a29-b9d5-715b52fdd937.png +0 -0
  170. package/dist/exports/trial-05/Images/tp5_Image_c0c896ea-5b68-4f58-9e27-cdb4a1f1b438.png +0 -0
  171. package/dist/exports/trial-05/index.braze.html +0 -1023
  172. package/dist/exports/trial-05/index.html +0 -1023
  173. package/dist/exports/trial-06/Images/tp6_Image_2267a268-8a80-4e0d-8813-d4c75dbab6f2.png +0 -0
  174. package/dist/exports/trial-06/Images/tp6_Image_637a97b7-837e-478d-8ed1-6e8c2739fdc7.png +0 -0
  175. package/dist/exports/trial-06/Images/tp6_Image_a78df270-ad6f-41e6-8822-ba8ec38313a3.png +0 -0
  176. package/dist/exports/trial-06/index.braze.html +0 -773
  177. package/dist/exports/trial-06/index.html +0 -773
  178. package/dist/exports/winback/Images/_managers_Image_4587ac22-460c-487a-bc37-9dbc487e95a4.png +0 -0
  179. package/dist/exports/winback/Images/_managers_Image_8a77ec2c-ed49-480d-a1a1-7a38abad232a.png +0 -0
  180. package/dist/exports/winback/Images/_managers_Image_bb643775-8a2f-4e28-9dfb-6d1838c3561f.png +0 -0
  181. package/dist/exports/winback/Images/_managers_Image_f7d1bca5-0fcb-4d4c-abcd-40ce2d453b07.png +0 -0
  182. package/dist/exports/winback/index.braze.html +0 -605
  183. package/dist/exports/winback/index.html +0 -605
  184. package/dist/generated/email-tokens.d.ts.map +0 -1
  185. package/dist/generated/email-tokens.js.map +0 -1
  186. package/dist/index.d.ts.map +0 -1
  187. package/dist/index.js.map +0 -1
  188. package/dist/tokens/build-email-assets.d.ts +0 -19
  189. package/dist/tokens/build-email-assets.d.ts.map +0 -1
  190. package/dist/tokens/build-email-assets.js +0 -186
  191. package/dist/tokens/build-email-assets.js.map +0 -1
  192. package/dist/tokens/build-email-tokens.d.ts +0 -17
  193. package/dist/tokens/build-email-tokens.d.ts.map +0 -1
  194. package/dist/tokens/build-email-tokens.js +0 -229
  195. package/dist/tokens/build-email-tokens.js.map +0 -1
@@ -1,439 +0,0 @@
1
- /**
2
- * Visual-brief resolver (OPEN-QUESTIONS.md M3 + D6/D8/D21; BRIEF-HANDOVER.md §3).
3
- *
4
- * Takes the 4-field per-slot visual brief (slot / intent / source / assetRef) and resolves each
5
- * slot to exactly one of three outcomes, per the priority order already documented in
6
- * skills/email-assets/SKILL.md Process step 2 — this module executes those already-decided rules
7
- * in code instead of leaving them as prose a human has to walk by hand:
8
- *
9
- * - 'resolved' — a real asset: AgentVisual (tier 1, mandatory for a standalone agent
10
- * portrait), a shared logo or local campaign asset (tier 3), a hosted match
11
- * from the Cloudinary stock library (tier 5 — D5.6, board item Clay
12
- * Lifecycle D5; product-ui/abstract only, see that branch below for why not
13
- * logo), or a match against the ~600-icon Clay registry (tier 6 — D6, board
14
- * item Clay Lifecycle D6; `icon` source only).
15
- * - 'placeholder' — a LEGITIMATE gap: a composite agent+UI scene (tier 2 — no dedicated
16
- * library yet, see knowledge/hero-pipeline.md) or anything else tier 3/5/6
17
- * didn't find (tier 4).
18
- * - 'gap' — NOT legitimate: a standalone agent portrait naming an agent the repo's
19
- * AgentVisual library doesn't have, or a must-use:<file> the brief names
20
- * that doesn't actually exist anywhere. email-assets/SKILL.md is explicit
21
- * that a placeholder is never an acceptable substitute for either of these —
22
- * they need a human decision, not a silent swap.
23
- *
24
- * Every slot gets exactly one of the three statuses above — never nothing. That's the literal
25
- * "no silent gaps" contract from OPEN-QUESTIONS.md M3's "Done when".
26
- *
27
- * Usage: tsx src/build/visual-resolver.ts --brief=<path-to-visual-brief.json>
28
- */
29
- import { existsSync, readdirSync, readFileSync } from 'node:fs';
30
- import { basename, dirname, join, resolve } from 'node:path';
31
- import { fileURLToPath, pathToFileURL } from 'node:url';
32
- import { SHAPE_ACCEPTABLE_RATIOS } from './asset-scoring';
33
- import { assetsDir } from './email-tree';
34
- import { findIconByName, findIconEntry } from './icon-registry-map';
35
- import { findPersonaEntry } from './persona-character-map';
36
- import { findStockLibraryEntry, STOCK_LIBRARY } from './stock-library-map';
37
- const __dirname = dirname(fileURLToPath(import.meta.url));
38
- /** Cross-package: the repo's one real agent-portrait library lives under packages/react. */
39
- const AGENTS_IMAGES_DIR = resolve(__dirname, '../../../../packages/react/src/visuals/agents/images');
40
- /** Cross-package: the repo's one real Clay icon registry (~600 icons, source SVGs). */
41
- const ICONS_SVG_DIR = resolve(__dirname, '../../../../packages/react/src/icons/svg');
42
- const SHARED_LOOKUP_DIRS = ['logos', 'icons', 'integrations', 'placeholders'];
43
- // A standalone portrait slot names ONLY the agent — the moment the intent also describes UI
44
- // elements around it, it's a composite scene (tier 2), which AgentVisual does not cover.
45
- const COMPOSITE_SIGNAL_WORDS = [
46
- 'board',
47
- 'table',
48
- 'dashboard',
49
- 'screen',
50
- 'chip',
51
- 'notification',
52
- 'panel',
53
- 'ui',
54
- 'interface',
55
- 'mockup',
56
- 'widget',
57
- 'app',
58
- 'automation',
59
- 'workflow',
60
- 'column',
61
- 'item',
62
- 'pulse',
63
- ];
64
- /**
65
- * Word-boundary match, not substring — a naive .includes('board') false-positives on
66
- * "onboarding", and .includes('din') false-positives on "onboarding" too (the "din" in
67
- * "onboar-DIN-g"). Every fuzzy text match in this module goes through this.
68
- */
69
- function containsWord(haystackLower, word) {
70
- const escaped = word.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
71
- return new RegExp(`\\b${escaped}\\b`).test(haystackLower);
72
- }
73
- function isCompositeIntent(intent) {
74
- const lower = intent.toLowerCase();
75
- return COMPOSITE_SIGNAL_WORDS.some((word) => containsWord(lower, word));
76
- }
77
- /**
78
- * A slot's rough layout shape — derived automatically from the slot spec, never hand-authored in
79
- * a brief. `slot` is formatted "<section/touchpoint> → <field label>" (e.g. "product-ui-hero →
80
- * Image", "tp1a-library → hero image"), so a keyword search over it catches both a literal
81
- * section-component name and a free-text touchpoint field label. Passed to findStockLibraryEntry
82
- * as a stage-2 tie-breaker only (see stock-library-map.ts) — it never gates a match on its own.
83
- */
84
- export function deriveSlotShape(spec) {
85
- if (spec.source === 'icon')
86
- return 'icon';
87
- const lower = spec.slot.toLowerCase();
88
- if (containsWord(lower, 'banner'))
89
- return 'banner';
90
- if (containsWord(lower, 'hero'))
91
- return 'hero';
92
- if (containsWord(lower, 'card'))
93
- return 'card';
94
- return 'unknown';
95
- }
96
- /** Mirrors packages/react/src/visuals/agents/index.ts's own slugify — same source files, same rule. */
97
- function slugifyAgentFile(fileName) {
98
- return fileName
99
- .replace(/\.png$/i, '')
100
- .trim()
101
- .toLowerCase()
102
- .replace(/[^a-z0-9]+/g, '-')
103
- .replace(/^-+|-+$/g, '');
104
- }
105
- /** slug → filename, read straight off disk (Node-safe — the real registry is Vite-glob-only). */
106
- function loadAgentSlugs() {
107
- const map = new Map();
108
- if (!existsSync(AGENTS_IMAGES_DIR))
109
- return map;
110
- for (const file of readdirSync(AGENTS_IMAGES_DIR)) {
111
- if (!file.toLowerCase().endsWith('.png'))
112
- continue;
113
- map.set(slugifyAgentFile(file), file);
114
- }
115
- return map;
116
- }
117
- const agentSlugs = loadAgentSlugs();
118
- function parseAgentAssetRef(assetRef) {
119
- if (!assetRef)
120
- return undefined;
121
- const m = assetRef.match(/agentImageMap:\s*(.+)/i);
122
- return (m ? m[1] : assetRef).trim();
123
- }
124
- /**
125
- * assetRef (exact slug, or slugifiable name) first; else a single unambiguous character name in
126
- * intent; else a persona/feature name (assetRef or intent) resolved via persona-character-map.ts
127
- * — only when that persona's real character actually has an AgentVisual illustration.
128
- */
129
- function resolveAgentSlug(assetRef, intent) {
130
- const ref = parseAgentAssetRef(assetRef);
131
- if (ref) {
132
- const direct = agentSlugs.get(ref.toLowerCase());
133
- if (direct)
134
- return { slug: ref.toLowerCase(), file: direct, confidence: 'assetRef' };
135
- const slugged = slugifyAgentFile(`${ref}.png`);
136
- const bySlug = agentSlugs.get(slugged);
137
- if (bySlug)
138
- return { slug: slugged, file: bySlug, confidence: 'assetRef' };
139
- }
140
- const lowerIntent = intent.toLowerCase();
141
- const candidates = [];
142
- for (const [slug, file] of agentSlugs) {
143
- const displayName = file.replace(/\.png$/i, '').toLowerCase();
144
- if (containsWord(lowerIntent, displayName))
145
- candidates.push({ slug, file, confidence: 'fuzzy' });
146
- }
147
- if (candidates.length === 1)
148
- return candidates[0];
149
- const persona = (ref ? findPersonaEntry(ref) : null) ?? findPersonaEntry(intent);
150
- if (persona?.agentSlug) {
151
- const file = agentSlugs.get(persona.agentSlug);
152
- if (file)
153
- return { slug: persona.agentSlug, file, confidence: 'persona-map' };
154
- }
155
- return null;
156
- }
157
- /** Fuzzy local-folder match: assetRef filename first, else a single unambiguous filename-in-intent match. */
158
- function findLocalMatch(dir, assetRef, intent) {
159
- if (!existsSync(dir))
160
- return null;
161
- const files = readdirSync(dir).filter((f) => !f.startsWith('.'));
162
- if (assetRef) {
163
- const wanted = basename(assetRef).toLowerCase();
164
- const exact = files.find((f) => f.toLowerCase() === wanted);
165
- if (exact)
166
- return join(dir, exact);
167
- const wantedStem = wanted.replace(/\.[a-z0-9]+$/i, '');
168
- const byStem = files.find((f) => f.toLowerCase().startsWith(wantedStem));
169
- if (byStem)
170
- return join(dir, byStem);
171
- }
172
- const lowerIntent = intent.toLowerCase();
173
- const scored = files
174
- .map((f) => ({ f, stem: f.replace(/\.[a-z0-9]+$/i, '').toLowerCase().replace(/[-_]/g, ' ') }))
175
- .filter(({ stem }) => stem.length > 2 && containsWord(lowerIntent, stem));
176
- return scored.length === 1 ? join(dir, scored[0].f) : null;
177
- }
178
- /** Exact-only match for must-use:<file> — an explicit filename should never resolve fuzzily. */
179
- function findExactFile(dir, filename) {
180
- if (!existsSync(dir))
181
- return null;
182
- const wanted = basename(filename).toLowerCase();
183
- const files = readdirSync(dir);
184
- const exact = files.find((f) => f.toLowerCase() === wanted);
185
- if (exact)
186
- return join(dir, exact);
187
- const wantedStem = wanted.replace(/\.[a-z0-9]+$/i, '');
188
- const byStem = files.find((f) => f.toLowerCase().replace(/\.[a-z0-9]+$/i, '') === wantedStem);
189
- return byStem ? join(dir, byStem) : null;
190
- }
191
- /**
192
- * Tier 5 by name (K10 EM-6): a brief that already knows the stock image names it in `assetRef` —
193
- * `stock: <slug>`, `asset/<slug>`, the bare slug, the entry name, its file name or its Cloudinary URL.
194
- * An exact key wins. A partial slug (`ai-work-management-hero` also prefixes `…-hero-alt`) or a
195
- * name shared by several entries is a tie, broken deterministically — never by catalogue order:
196
- * 1. more of the entry's tags named in `intent`, 2. aspect fits the slot shape, 3. shorter slug,
197
- * 4. slug A→Z.
198
- * No entry matches the ref → null, and the resolver falls back to the intent search.
199
- */
200
- export function findStockEntryByRef(assetRef, intent, shape) {
201
- const raw = assetRef
202
- .trim()
203
- .replace(/^(?:stock(?:[- ]?library)?|stocklibrary|stock_library)\s*:\s*/i, '')
204
- .trim();
205
- if (!raw)
206
- return null;
207
- const ref = basename(raw.replace(/^asset\//i, ''))
208
- .replace(/\.(png|jpe?g|gif|webp)$/i, '')
209
- .toLowerCase();
210
- const slugOf = (s) => s.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
211
- const exact = STOCK_LIBRARY.filter((e) => e.slug === ref || e.localFile.toLowerCase().replace(/\.[a-z0-9]+$/i, '') === ref || basename(e.cloudinaryUrl).toLowerCase().replace(/\.[a-z0-9]+$/i, '') === ref);
212
- const pool = exact.length ? exact : STOCK_LIBRARY.filter((e) => slugOf(e.name) === slugOf(raw) || e.slug.startsWith(`${slugOf(ref)}-`));
213
- if (!pool.length)
214
- return null;
215
- const lower = intent.toLowerCase();
216
- const fits = SHAPE_ACCEPTABLE_RATIOS[shape];
217
- const ranked = [...pool].sort((a, b) => {
218
- const ta = a.tags.filter((t) => containsWord(lower, t)).length;
219
- const tb = b.tags.filter((t) => containsWord(lower, t)).length;
220
- if (ta !== tb)
221
- return tb - ta;
222
- const fa = fits.has(a.aspectRatioLabel) ? 1 : 0;
223
- const fb = fits.has(b.aspectRatioLabel) ? 1 : 0;
224
- if (fa !== fb)
225
- return fb - fa;
226
- if (a.slug.length !== b.slug.length)
227
- return a.slug.length - b.slug.length;
228
- return a.slug < b.slug ? -1 : a.slug > b.slug ? 1 : 0;
229
- });
230
- return { entry: ranked[0], via: pool.length === 1 ? 'exact' : 'tie-break', candidates: ranked.map((e) => e.slug) };
231
- }
232
- /** How to turn a placeholder spec into a labelled, approved-tint PNG (K10 EM-2, placeholder.ts). */
233
- function placeholderCommand(intent, campaign) {
234
- const label = intent.replace(/"/g, "'").slice(0, 120);
235
- return `pnpm --filter @clay-design-system/email email:placeholder -- --label="${label}" --size=<width>x<height> --out=<abs>/packages/email/src/assets/${campaign}/<name>.png`;
236
- }
237
- function pickPlaceholderSvg() {
238
- const preferred = join(assetsDir, 'placeholders', 'placeholder-560x315.svg');
239
- if (existsSync(preferred))
240
- return preferred;
241
- const dir = join(assetsDir, 'placeholders');
242
- const files = existsSync(dir) ? readdirSync(dir) : [];
243
- return files.length ? join(dir, files[0]) : '';
244
- }
245
- /** Resolve one visual-brief slot. `campaign` scopes tier-3 local-folder lookups. */
246
- export function resolveVisualSlot(spec, campaign) {
247
- const { slot, intent, source, assetRef } = spec;
248
- if (source === 'agent-portrait') {
249
- if (isCompositeIntent(intent)) {
250
- return {
251
- slot,
252
- status: 'placeholder',
253
- tier: 2,
254
- placeholderSvg: pickPlaceholderSvg(),
255
- placeholderComment: `[PLACEHOLDER: composite agent+UI scene — ${intent}. No dedicated library yet; see knowledge/hero-pipeline.md for the Hero pipeline fallback.]`,
256
- placeholderCommand: placeholderCommand(intent, campaign),
257
- detail: 'Classified as composite (intent mentions UI/product elements) — tier 1 AgentVisual only covers standalone portraits. Tier 2 (Hero pipeline) has no ready library yet, so placeholder is legitimate per email-assets/SKILL.md.',
258
- };
259
- }
260
- const match = resolveAgentSlug(assetRef, intent);
261
- if (match) {
262
- const via = match.confidence === 'assetRef'
263
- ? 'from assetRef'
264
- : match.confidence === 'persona-map'
265
- ? 'via persona-character-map.ts'
266
- : 'fuzzy-matched from intent';
267
- return {
268
- slot,
269
- status: 'resolved',
270
- tier: 1,
271
- assetPath: join(AGENTS_IMAGES_DIR, match.file),
272
- detail: `Standalone agent portrait resolved to AgentVisual slug "${match.slug}" (${via} — mandatory tier, no placeholder allowed for this case).`,
273
- };
274
- }
275
- const persona = (assetRef ? findPersonaEntry(assetRef) : null) ?? findPersonaEntry(intent);
276
- if (persona && !persona.agentSlug) {
277
- return {
278
- slot,
279
- status: 'gap',
280
- tier: 1,
281
- gapReason: 'known-persona-no-bank-character',
282
- detail: `"${persona.persona}"'s real character is ${persona.character} (${persona.source}), but ${persona.character} has no illustration in packages/react/src/visuals/agents yet. Per campaign-brief/references/agents-catalog.md rule 4, never substitute a different bank character — this needs either a new AgentVisual illustration for ${persona.character}, or a Figma-sourced composite asset (email-assets/SKILL.md tier 2/3), not a silent swap to an unrelated character.`,
283
- };
284
- }
285
- return {
286
- slot,
287
- status: 'gap',
288
- tier: 1,
289
- gapReason: 'standalone-agent-not-in-library',
290
- detail: `Standalone agent portrait requested (intent: "${intent}", assetRef: ${assetRef ?? '(none)'}) but no matching character was found in agentImageMap, and no known persona/feature name matched persona-character-map.ts either. This is a genuine gap, not a placeholder-legitimate case — email-assets/SKILL.md is explicit that placeholder is never legitimate here. Either the brief needs a real character slug, or this should be reclassified (e.g. a feature/persona name with no character asset yet).`,
291
- };
292
- }
293
- if (source === 'logo') {
294
- const shared = findLocalMatch(join(assetsDir, 'logos'), assetRef, intent);
295
- if (shared)
296
- return { slot, status: 'resolved', tier: 3, assetPath: shared, detail: 'Matched a shared email logo asset.' };
297
- const local = findLocalMatch(join(assetsDir, campaign), assetRef, intent);
298
- if (local)
299
- return { slot, status: 'resolved', tier: 3, assetPath: local, detail: 'Matched a campaign-local logo asset.' };
300
- return {
301
- slot,
302
- status: 'placeholder',
303
- tier: 4,
304
- placeholderSvg: pickPlaceholderSvg(),
305
- placeholderComment: `[PLACEHOLDER: logo — ${intent}. No repo-hosted customer/integration logo registry exists yet for email.]`,
306
- placeholderCommand: placeholderCommand(intent, campaign),
307
- detail: 'No shared or campaign-local logo file matched. Legitimate placeholder — no repo-hosted registry for arbitrary customer/integration logos yet (email-assets/SKILL.md tier 4).',
308
- };
309
- }
310
- if (source === 'product-ui' || source === 'abstract') {
311
- const local = findLocalMatch(join(assetsDir, campaign), assetRef, intent);
312
- if (local)
313
- return { slot, status: 'resolved', tier: 3, assetPath: local, detail: `Matched a campaign-local ${source} asset.` };
314
- // Tier 5 — the Cloudinary stock library (D5.5/D5.6). Deliberately not checked for `logo`:
315
- // every entry in stock-library-map.ts is a marketing hero/card illustration (dashboards,
316
- // agent-feature cards, exchanges), not an actual brand/product logo — wiring it into the
317
- // logo branch would only add a chance of a wrong match for zero real coverage gain.
318
- // EM-6: a brief that names the stock image (`assetRef`) gets that image — before the intent search.
319
- const byRef = assetRef ? findStockEntryByRef(assetRef, intent, deriveSlotShape(spec)) : null;
320
- if (byRef) {
321
- const tie = byRef.via === 'tie-break' ? ` (assetRef matched ${byRef.candidates.length} entries: ${byRef.candidates.join(', ')}; tie broken by intent tags → aspect fit → shorter slug → A→Z)` : '';
322
- return {
323
- slot,
324
- status: 'resolved',
325
- tier: 5,
326
- assetPath: byRef.entry.cloudinaryUrl,
327
- detail: `Matched stock-library entry "${byRef.entry.slug}" from assetRef "${assetRef}"${tie} — already hosted, no upload step needed.`,
328
- };
329
- }
330
- const stockMatch = findStockLibraryEntry({ intent, shape: deriveSlotShape(spec), campaign });
331
- if (stockMatch) {
332
- const { entry, disambiguatedBy } = stockMatch;
333
- const disambiguationNote = disambiguatedBy.length ? ` (disambiguated by: ${disambiguatedBy.join(', ')})` : '';
334
- return {
335
- slot,
336
- status: 'resolved',
337
- tier: 5,
338
- assetPath: entry.cloudinaryUrl,
339
- detail: `Matched stock-library entry "${entry.slug}" (tags: ${entry.tags.join(', ')})${disambiguationNote} — already hosted, no upload step needed.`,
340
- };
341
- }
342
- return {
343
- slot,
344
- status: 'placeholder',
345
- tier: 4,
346
- placeholderSvg: pickPlaceholderSvg(),
347
- placeholderComment: `[PLACEHOLDER: ${source} — ${intent}. Generation prompt: "${intent}".]`,
348
- placeholderCommand: placeholderCommand(intent, campaign),
349
- detail: `No campaign-local asset${assetRef ? ` or stock-library entry for assetRef "${assetRef}"` : ''} and no unambiguous stock-library match. Legitimate placeholder — ${source === 'product-ui' ? 'no repo-hosted product-screenshot library exists yet' : 'abstract art has no registry'} beyond the stock library (email-assets/SKILL.md tier 4).`,
350
- };
351
- }
352
- if (source === 'icon') {
353
- const exact = assetRef ? findIconByName(assetRef) : null;
354
- const fuzzy = exact ? null : findIconEntry(intent);
355
- const match = exact ?? fuzzy?.entry ?? null;
356
- const disambiguatedBy = fuzzy?.disambiguatedBy ?? [];
357
- if (match) {
358
- const svgPath = join(ICONS_SVG_DIR, `${match.name}.svg`);
359
- if (existsSync(svgPath)) {
360
- const disambiguationNote = disambiguatedBy.length ? ` (disambiguated by: ${disambiguatedBy.join(', ')})` : '';
361
- return {
362
- slot,
363
- status: 'resolved',
364
- tier: 6,
365
- assetPath: svgPath,
366
- detail: exact
367
- ? `Matched Clay icon "${match.name}" via exact assetRef, from the ~600-icon registry (packages/react/src/icons).`
368
- : `Matched Clay icon "${match.name}" (tags: ${match.tags.join(', ')})${disambiguationNote} from the ~600-icon registry (packages/react/src/icons).`,
369
- };
370
- }
371
- }
372
- return {
373
- slot,
374
- status: 'placeholder',
375
- tier: 4,
376
- placeholderSvg: pickPlaceholderSvg(),
377
- placeholderComment: `[PLACEHOLDER: icon — ${intent}. No matching icon in the Clay registry.]`,
378
- placeholderCommand: placeholderCommand(intent, campaign),
379
- detail: 'No icon in the ~600-icon Clay registry (packages/react/src/icons) matched by exact name or an unambiguous tag. Legitimate placeholder — not every requested icon concept exists in the registry (email-assets/SKILL.md tier 4).',
380
- };
381
- }
382
- if (source.startsWith('must-use:')) {
383
- const wanted = source.slice('must-use:'.length).trim() || assetRef || '';
384
- const searchDirs = [join(assetsDir, campaign), ...SHARED_LOOKUP_DIRS.map((d) => join(assetsDir, d)), assetsDir];
385
- for (const dir of searchDirs) {
386
- const found = wanted && findExactFile(dir, wanted);
387
- if (found)
388
- return { slot, status: 'resolved', tier: 3, assetPath: found, detail: `must-use file "${wanted}" found.` };
389
- }
390
- return {
391
- slot,
392
- status: 'gap',
393
- tier: 3,
394
- gapReason: 'must-use-file-not-found',
395
- detail: `Brief explicitly named "${wanted}" via must-use, but no matching file exists under src/assets/ (campaign-local, logos, icons, integrations, placeholders, or the flat assets root). This is a genuine gap, not placeholder-legitimate — a named must-use asset that doesn't exist needs a human fix (typo, or the file hasn't been supplied yet), not a silent swap to a generic placeholder.`,
396
- };
397
- }
398
- return {
399
- slot,
400
- status: 'gap',
401
- tier: 4,
402
- gapReason: 'unrecognized-source',
403
- detail: `Unrecognized source "${source}" — expected one of agent-portrait | product-ui | logo | abstract | must-use:<file> (BRIEF-HANDOVER.md §3).`,
404
- };
405
- }
406
- const STATUS_ICON = { resolved: '✓', placeholder: '◻', gap: '✗' };
407
- function formatResolution(r) {
408
- const label = r.status === 'resolved' ? r.assetPath : r.status === 'placeholder' ? r.placeholderComment : `GAP (${r.gapReason})`;
409
- const make = r.placeholderCommand ? `\n render it: ${r.placeholderCommand}` : '';
410
- return ` ${STATUS_ICON[r.status]} ${r.slot}\n ${label}\n ${r.detail}${make}`;
411
- }
412
- async function main() {
413
- const briefArg = process.argv.find((a) => a.startsWith('--brief='));
414
- if (!briefArg) {
415
- console.error('Usage: tsx src/build/visual-resolver.ts --brief=<path-to-visual-brief.json>');
416
- process.exitCode = 1;
417
- return;
418
- }
419
- const briefPath = resolve(briefArg.slice('--brief='.length));
420
- const brief = JSON.parse(readFileSync(briefPath, 'utf-8'));
421
- const results = brief.slots.map((spec) => resolveVisualSlot(spec, brief.campaign));
422
- console.log(`\nVisual brief resolution — ${brief.campaign} (${results.length} slots)\n`);
423
- for (const r of results)
424
- console.log(formatResolution(r) + '\n');
425
- const resolved = results.filter((r) => r.status === 'resolved').length;
426
- const placeholders = results.filter((r) => r.status === 'placeholder').length;
427
- const gaps = results.filter((r) => r.status === 'gap').length;
428
- console.log(`${resolved} resolved, ${placeholders} placeholder, ${gaps} gap`);
429
- if (gaps > 0)
430
- process.exitCode = 1;
431
- }
432
- const isMain = process.argv[1] !== undefined && import.meta.url === pathToFileURL(process.argv[1]).href;
433
- if (isMain) {
434
- main().catch((err) => {
435
- console.error(err.message);
436
- process.exit(1);
437
- });
438
- }
439
- //# sourceMappingURL=visual-resolver.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"visual-resolver.js","sourceRoot":"","sources":["../../src/build/visual-resolver.ts"],"names":[],"mappings":"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"}
@@ -1,21 +0,0 @@
1
- /**
2
- * Metadata for the real Email Love → Braze export examples in this folder.
3
- *
4
- * The HTML files (`<slug>/index.html`) and their `Images/` folders are imported, untouched, from
5
- * finished Email Love exports via `src/build/import-examples.ts`. They are reference artifacts of
6
- * the output we ship to Braze — not built from the DS MJML pipeline. Edit this file to relabel or
7
- * recategorize; run the importer to refresh the HTML/images.
8
- */
9
- export type ExampleCategory = 'Onboarding' | 'Lifecycle' | 'Newsletter' | 'Transactional' | 'Sales';
10
- export interface EmailExample {
11
- /** Folder name under `src/examples/` and the served static path segment. */
12
- slug: string;
13
- /** Human title shown in Storybook. */
14
- title: string;
15
- category: ExampleCategory;
16
- /** One-line description of the email's purpose. */
17
- description: string;
18
- }
19
- /** Ordered for display: onboarding series first, then the standalone lifecycle/other emails. */
20
- export declare const EXAMPLES: EmailExample[];
21
- //# sourceMappingURL=manifest.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/examples/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,eAAe,GACvB,YAAY,GACZ,WAAW,GACX,YAAY,GACZ,eAAe,GACf,OAAO,CAAA;AAEX,MAAM,WAAW,YAAY;IAC3B,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAA;IACZ,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,eAAe,CAAA;IACzB,mDAAmD;IACnD,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,gGAAgG;AAChG,eAAO,MAAM,QAAQ,EAAE,YAAY,EAyElC,CAAA"}
@@ -1,84 +0,0 @@
1
- /**
2
- * Metadata for the real Email Love → Braze export examples in this folder.
3
- *
4
- * The HTML files (`<slug>/index.html`) and their `Images/` folders are imported, untouched, from
5
- * finished Email Love exports via `src/build/import-examples.ts`. They are reference artifacts of
6
- * the output we ship to Braze — not built from the DS MJML pipeline. Edit this file to relabel or
7
- * recategorize; run the importer to refresh the HTML/images.
8
- */
9
- /** Ordered for display: onboarding series first, then the standalone lifecycle/other emails. */
10
- export const EXAMPLES = [
11
- {
12
- slug: 'trial-01-welcome',
13
- title: 'Trial · 1 · Welcome',
14
- category: 'Onboarding',
15
- description: 'First email of the trial nurture sequence — welcome and first-step CTA.',
16
- },
17
- {
18
- slug: 'trial-02',
19
- title: 'Trial · 2',
20
- category: 'Onboarding',
21
- description: 'Second trial-nurture touch — feature education and activation prompt.',
22
- },
23
- {
24
- slug: 'trial-03',
25
- title: 'Trial · 3',
26
- category: 'Onboarding',
27
- description: 'Mid-trial nurture — deeper feature highlights with supporting imagery.',
28
- },
29
- {
30
- slug: 'trial-04',
31
- title: 'Trial · 4',
32
- category: 'Onboarding',
33
- description: 'Trial nurture with an animated (GIF) product moment.',
34
- },
35
- {
36
- slug: 'trial-05',
37
- title: 'Trial · 5',
38
- category: 'Onboarding',
39
- description: 'Late-trial nurture — value recap and conversion push.',
40
- },
41
- {
42
- slug: 'trial-06',
43
- title: 'Trial · 6',
44
- category: 'Onboarding',
45
- description: 'Final trial-sequence email — last conversion nudge before trial ends.',
46
- },
47
- {
48
- slug: 'winback',
49
- title: 'Win-back',
50
- category: 'Lifecycle',
51
- description: 'Re-engagement email aimed at lapsed rev-ops users.',
52
- },
53
- {
54
- slug: 'survey',
55
- title: 'Feedback Survey',
56
- category: 'Lifecycle',
57
- description: 'Short feedback / survey request with a single clear CTA.',
58
- },
59
- {
60
- slug: 'newsletter',
61
- title: 'Product Newsletter',
62
- category: 'Newsletter',
63
- description: 'Multi-story status-update newsletter with several feature highlights.',
64
- },
65
- {
66
- slug: 'contact-sales',
67
- title: 'Contact Sales',
68
- category: 'Sales',
69
- description: 'Sales-assist email inviting the reader to book time with the sales team.',
70
- },
71
- {
72
- slug: 'event-confirmation',
73
- title: 'Event Confirmation',
74
- category: 'Transactional',
75
- description: 'Registration confirmation with event details and a calendar CTA.',
76
- },
77
- {
78
- slug: 'legal-update',
79
- title: 'Legal Update',
80
- category: 'Transactional',
81
- description: 'Policy / terms update notice — text-forward, minimal imagery.',
82
- },
83
- ];
84
- //# sourceMappingURL=manifest.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/examples/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAmBH,gGAAgG;AAChG,MAAM,CAAC,MAAM,QAAQ,GAAmB;IACtC;QACE,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE,qBAAqB;QAC5B,QAAQ,EAAE,YAAY;QACtB,WAAW,EAAE,yEAAyE;KACvF;IACD;QACE,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,WAAW;QAClB,QAAQ,EAAE,YAAY;QACtB,WAAW,EAAE,uEAAuE;KACrF;IACD;QACE,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,WAAW;QAClB,QAAQ,EAAE,YAAY;QACtB,WAAW,EAAE,wEAAwE;KACtF;IACD;QACE,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,WAAW;QAClB,QAAQ,EAAE,YAAY;QACtB,WAAW,EAAE,sDAAsD;KACpE;IACD;QACE,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,WAAW;QAClB,QAAQ,EAAE,YAAY;QACtB,WAAW,EAAE,uDAAuD;KACrE;IACD;QACE,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,WAAW;QAClB,QAAQ,EAAE,YAAY;QACtB,WAAW,EAAE,uEAAuE;KACrF;IACD;QACE,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,UAAU;QACjB,QAAQ,EAAE,WAAW;QACrB,WAAW,EAAE,oDAAoD;KAClE;IACD;QACE,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,iBAAiB;QACxB,QAAQ,EAAE,WAAW;QACrB,WAAW,EAAE,0DAA0D;KACxE;IACD;QACE,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,oBAAoB;QAC3B,QAAQ,EAAE,YAAY;QACtB,WAAW,EAAE,uEAAuE;KACrF;IACD;QACE,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,eAAe;QACtB,QAAQ,EAAE,OAAO;QACjB,WAAW,EAAE,0EAA0E;KACxF;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,KAAK,EAAE,oBAAoB;QAC3B,QAAQ,EAAE,eAAe;QACzB,WAAW,EAAE,kEAAkE;KAChF;IACD;QACE,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,cAAc;QACrB,QAAQ,EAAE,eAAe;QACzB,WAAW,EAAE,+DAA+D;KAC7E;CACF,CAAA"}