@samva/markup 0.8.0 → 0.10.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 (172) hide show
  1. package/AGENTS.md +107 -46
  2. package/CHANGELOG.md +345 -0
  3. package/README.md +188 -52
  4. package/dist/{brand-DcoVkh_S.d.ts → assets-BIsyMQ92.d.ts} +41 -11
  5. package/dist/{email/brand.js → brand-C0MKTwmX.js} +64 -4
  6. package/dist/{theme-css.d.ts → brand.d.ts} +12 -3
  7. package/dist/brand.js +4 -0
  8. package/dist/channel-specs-C2feJwuP.d.ts +13 -0
  9. package/dist/compiler.d.ts +88 -115
  10. package/dist/compiler.js +750 -171
  11. package/dist/components-BZCqegS8.js +1864 -0
  12. package/dist/diagnostic-model-DJtqbETd.js +38 -0
  13. package/dist/{diagnostics-OcQKQYSY.d.ts → diagnostic-model-DxthUZBT.d.ts} +3 -21
  14. package/dist/{diagnostics-BMYtBCQk.d.ts → diagnostics-B-Gym34R.d.ts} +8 -4
  15. package/dist/{email/diagnostics.js → diagnostics-CnKFefKz.js} +4 -3
  16. package/dist/diagnostics.d.ts +410 -2
  17. package/dist/diagnostics.js +402 -52
  18. package/dist/edit.d.ts +234 -0
  19. package/dist/edit.js +947 -0
  20. package/dist/email/jsx-dev-runtime.d.ts +2 -2
  21. package/dist/email/jsx-dev-runtime.js +1 -2
  22. package/dist/email/jsx-runtime.d.ts +1 -1
  23. package/dist/email/jsx-runtime.js +1 -85
  24. package/dist/{email/components.d.ts → email.d.ts} +22 -11
  25. package/dist/email.js +2 -0
  26. package/dist/fmt.d.ts +32 -0
  27. package/dist/fmt.js +174 -0
  28. package/dist/index.d.ts +2 -0
  29. package/dist/index.js +2 -0
  30. package/dist/{render-vAv_4r9v.js → ir-CLhlklKV.js} +96 -279
  31. package/dist/jsx-runtime-CBlexoeR.js +98 -0
  32. package/dist/{elements-BzjjnoCS.d.ts → jsx-runtime-ylIOnaSf.d.ts} +76 -76
  33. package/dist/profile-pWGtWZXF.js +3803 -0
  34. package/dist/render-BPonDpCl.d.ts +539 -0
  35. package/dist/render-BQmfh94k.js +257 -0
  36. package/dist/render.d.ts +35 -0
  37. package/dist/render.js +49 -0
  38. package/dist/sms.d.ts +16 -0
  39. package/dist/sms.js +12 -0
  40. package/dist/source-locations-C8wCsiAy.d.ts +23 -0
  41. package/dist/template-DMPwxMSq.d.ts +65 -0
  42. package/dist/template-zLUjcwfF.js +42 -0
  43. package/dist/{theme-css-hFqcPSar.js → theme-css-JtRCm1fb.js} +2 -2
  44. package/dist/whatsapp.d.ts +57 -0
  45. package/dist/whatsapp.js +22 -0
  46. package/generated/contract.json +1788 -0
  47. package/generated/reference.md +360 -0
  48. package/package.json +46 -239
  49. package/samva-brand.d.ts +4 -4
  50. package/skills/sml/SKILL.md +123 -0
  51. package/dist/ast-BrDtApwS.d.ts +0 -107
  52. package/dist/ast.d.ts +0 -2
  53. package/dist/ast.js +0 -124
  54. package/dist/candidate.d.ts +0 -29
  55. package/dist/candidate.js +0 -88
  56. package/dist/catalog-CKuOooB8.d.ts +0 -354
  57. package/dist/checks-D73Xizbw.js +0 -59366
  58. package/dist/checks.d.ts +0 -33
  59. package/dist/checks.js +0 -2
  60. package/dist/classes.d.ts +0 -26
  61. package/dist/classes.js +0 -184
  62. package/dist/compile-sms.d.ts +0 -28
  63. package/dist/compile-sms.js +0 -44
  64. package/dist/compile-whatsapp.d.ts +0 -56
  65. package/dist/compile-whatsapp.js +0 -186
  66. package/dist/compile.d.ts +0 -18
  67. package/dist/compile.js +0 -29
  68. package/dist/components.d.ts +0 -289
  69. package/dist/components.js +0 -106
  70. package/dist/conditionals.d.ts +0 -10
  71. package/dist/conditionals.js +0 -74
  72. package/dist/corpus-CPPfgAHN.d.ts +0 -106
  73. package/dist/css-CS2jLID6.d.ts +0 -109
  74. package/dist/email/assets.d.ts +0 -40
  75. package/dist/email/assets.js +0 -63
  76. package/dist/email/brand-footer.d.ts +0 -34
  77. package/dist/email/brand-footer.js +0 -62
  78. package/dist/email/brand.d.ts +0 -2
  79. package/dist/email/components.js +0 -240
  80. package/dist/email/diagnostics.d.ts +0 -2
  81. package/dist/email/elements.d.ts +0 -2
  82. package/dist/email/elements.js +0 -299
  83. package/dist/email/html.d.ts +0 -2
  84. package/dist/email/html.js +0 -278
  85. package/dist/email/render.d.ts +0 -50
  86. package/dist/email/render.js +0 -3
  87. package/dist/email/selection.d.ts +0 -2
  88. package/dist/email/selection.js +0 -91
  89. package/dist/email/source-edit.d.ts +0 -67
  90. package/dist/email/source-edit.js +0 -185
  91. package/dist/email/stylesheets.d.ts +0 -15
  92. package/dist/email/stylesheets.js +0 -48
  93. package/dist/email/text.d.ts +0 -7
  94. package/dist/email/text.js +0 -100
  95. package/dist/emit.d.ts +0 -51
  96. package/dist/emit.js +0 -151
  97. package/dist/html-Bl9BAdqc.d.ts +0 -42
  98. package/dist/interpolate.d.ts +0 -24
  99. package/dist/interpolate.js +0 -43
  100. package/dist/jsx-dev-runtime.d.ts +0 -11
  101. package/dist/jsx-dev-runtime.js +0 -15
  102. package/dist/jsx-runtime-I-1nCtl2.d.ts +0 -57
  103. package/dist/jsx-runtime.d.ts +0 -2
  104. package/dist/jsx-runtime.js +0 -121
  105. package/dist/lexer.d.ts +0 -60
  106. package/dist/lexer.js +0 -281
  107. package/dist/model.d.ts +0 -24
  108. package/dist/model.js +0 -77
  109. package/dist/ops-BvwqHl7V.js +0 -630
  110. package/dist/ops.d.ts +0 -114
  111. package/dist/ops.js +0 -2
  112. package/dist/parser-t29cHLVL.d.ts +0 -396
  113. package/dist/parser.d.ts +0 -2
  114. package/dist/parser.js +0 -859
  115. package/dist/predicate-BI6uRRM-.js +0 -549
  116. package/dist/predicate-M-05Nd7R.d.ts +0 -56
  117. package/dist/predicate.d.ts +0 -2
  118. package/dist/predicate.js +0 -2
  119. package/dist/printer.d.ts +0 -6
  120. package/dist/printer.js +0 -122
  121. package/dist/registry-Dcp6QEK_.d.ts +0 -73
  122. package/dist/registry.d.ts +0 -2
  123. package/dist/registry.js +0 -646
  124. package/dist/render-template.d.ts +0 -45
  125. package/dist/render-template.js +0 -76
  126. package/dist/selection-CCArx9lU.d.ts +0 -91
  127. package/dist/showcase-egkusQBf.d.ts +0 -415
  128. package/dist/sms-segments-y4FpPilJ.d.ts +0 -13
  129. package/dist/sms-segments.d.ts +0 -2
  130. package/dist/sms-segments.js +0 -46
  131. package/dist/source-locations-DrCM82Ym.d.ts +0 -67
  132. package/dist/source-locations.d.ts +0 -2
  133. package/dist/source-locations.js +0 -102
  134. package/dist/starters/category-mapping.d.ts +0 -13
  135. package/dist/starters/category-mapping.js +0 -49
  136. package/dist/starters/corpus.d.ts +0 -2
  137. package/dist/starters/corpus.js +0 -194
  138. package/dist/starters/library.d.ts +0 -18
  139. package/dist/starters/library.js +0 -692
  140. package/dist/starters/public-gallery.d.ts +0 -266
  141. package/dist/starters/public-gallery.js +0 -916
  142. package/dist/starters/public-handoff.d.ts +0 -164
  143. package/dist/starters/public-handoff.js +0 -361
  144. package/dist/starters/public-preview-artifacts.d.ts +0 -43
  145. package/dist/starters/public-preview-artifacts.js +0 -104
  146. package/dist/starters/public-preview.d.ts +0 -61
  147. package/dist/starters/public-preview.js +0 -83
  148. package/dist/starters/showcase.d.ts +0 -2
  149. package/dist/starters/showcase.js +0 -335
  150. package/dist/starters/sources.d.ts +0 -45
  151. package/dist/starters/sources.js +0 -7762
  152. package/dist/starters/theme.d.ts +0 -45
  153. package/dist/starters/theme.js +0 -77
  154. package/dist/starters.d.ts +0 -2
  155. package/dist/starters.js +0 -874
  156. package/dist/tailwind-BYq7Lo6u.js +0 -727
  157. package/dist/template-DWftqh4x.d.ts +0 -60
  158. package/dist/template.d.ts +0 -2
  159. package/dist/template.js +0 -37
  160. package/dist/theme-css.js +0 -2
  161. package/dist/tsx-source-instrumentation.d.ts +0 -30
  162. package/dist/tsx-source-instrumentation.js +0 -115
  163. package/dist/tsx-tracer.d.ts +0 -112
  164. package/dist/tsx-tracer.js +0 -985
  165. package/dist/variables-J_L3qxRa.d.ts +0 -77
  166. package/dist/variables.d.ts +0 -2
  167. package/dist/variables.js +0 -141
  168. package/dist/version-BITr58kk.js +0 -96
  169. package/generated/sml-agent-contract.json +0 -709
  170. package/generated/sml-email-agent-contract.json +0 -615
  171. package/generated/sml-email-language-reference.md +0 -94
  172. package/generated/sml-language-reference.md +0 -195
package/dist/printer.js DELETED
@@ -1,122 +0,0 @@
1
- //#region src/printer.ts
2
- const MAX_WIDTH = 100;
3
- const INDENT = " ";
4
- const escapeText = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll("{", "&#123;");
5
- const escapeAttribute = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll("\"", "&quot;");
6
- const printAttribute = (attribute) => attribute.value.kind === "number" ? `${attribute.name}={${attribute.value.value}}` : `${attribute.name}="${escapeAttribute(attribute.value.value)}"`;
7
- const printInterpolation = (node) => node.syntax === "curly" ? `{{${node.name}}}` : `\${${node.name}}`;
8
- const printInlineFlow = (children) => {
9
- let result = "";
10
- for (const child of children) if (child.kind === "text") result += escapeText(child.value);
11
- else if (child.kind === "interpolation") result += printInterpolation(child);
12
- else {
13
- const attributes = child.attributes.map((a) => ` ${printAttribute(a)}`).join("");
14
- result += child.children.length === 0 ? `<${child.tag}${attributes} />` : `<${child.tag}${attributes}>${printInlineFlow(child.children)}</${child.tag}>`;
15
- }
16
- return result;
17
- };
18
- const isInlineContainer = (node) => node.tag === "Text" || node.tag === "Heading" || node.tag === "Button" || node.tag === "Subject" || node.tag === "Preview" || node.tag === "ListItem" || node.tag === "a" || node.tag === "strong" || node.tag === "em";
19
- /**
20
- * Splits an inline flow into reflow chunks. Chunk boundaries are exactly the
21
- * spaces in text nodes — the only positions where a line break re-parses to
22
- * the same AST. Everything between two spaces (words, interpolations, whole
23
- * or partial inline elements) glues into one atomic chunk.
24
- */
25
- const chunkInlineFlow = (children) => {
26
- const chunks = [];
27
- let glue = false;
28
- const emit = (text) => {
29
- if (text.length === 0) return;
30
- if (glue && chunks.length > 0) chunks[chunks.length - 1] += text;
31
- else chunks.push(text);
32
- glue = true;
33
- };
34
- const space = () => {
35
- glue = false;
36
- };
37
- const visit = (nodes) => {
38
- for (const child of nodes) if (child.kind === "text") escapeText(child.value).split(" ").forEach((word, index) => {
39
- if (index > 0) space();
40
- emit(word);
41
- });
42
- else if (child.kind === "interpolation") emit(printInterpolation(child));
43
- else {
44
- const attributes = child.attributes.map((a) => ` ${printAttribute(a)}`).join("");
45
- if (child.children.length === 0) emit(`<${child.tag}${attributes} />`);
46
- else {
47
- emit(`<${child.tag}${attributes}>`);
48
- visit(child.children);
49
- emit(`</${child.tag}>`);
50
- }
51
- }
52
- };
53
- visit(children);
54
- return chunks;
55
- };
56
- /** Greedy fill: chunks joined by single spaces, wrapped at MAX_WIDTH. */
57
- const reflowInlineFlow = (children, indent) => {
58
- const chunks = chunkInlineFlow(children);
59
- const lines = [];
60
- let line = null;
61
- for (const chunk of chunks) if (line === null) line = `${indent}${chunk}`;
62
- else if (line.length + 1 + chunk.length <= MAX_WIDTH) line += ` ${chunk}`;
63
- else {
64
- lines.push(line);
65
- line = `${indent}${chunk}`;
66
- }
67
- if (line !== null) lines.push(line);
68
- return lines.join("\n");
69
- };
70
- const printOpenTag = (node, indent, selfClosing) => {
71
- const attributes = node.attributes.map((a) => ` ${printAttribute(a)}`).join("");
72
- const singleLine = `${indent}<${node.tag}${attributes}${selfClosing ? " />" : ">"}`;
73
- if (singleLine.length <= MAX_WIDTH || node.attributes.length === 0) return singleLine;
74
- const lines = [`${indent}<${node.tag}`];
75
- for (const attribute of node.attributes) lines.push(`${indent}${INDENT}${printAttribute(attribute)}`);
76
- lines.push(`${indent}${selfClosing ? "/>" : ">"}`);
77
- return lines.join("\n");
78
- };
79
- /**
80
- * A verbatim flow prints its content byte-preserving: text exactly as stored
81
- * (escaped), interpolations canonical, and <If>/<Else> glued into the flow
82
- * with single-line open tags (whitespace inside a TAG is insignificant, but a
83
- * line break in the FLOW would become content on reparse).
84
- */
85
- const printVerbatimFlow = (children) => {
86
- let result = "";
87
- for (const child of children) if (child.kind === "text") result += escapeText(child.value);
88
- else if (child.kind === "interpolation") result += printInterpolation(child);
89
- else result += printVerbatimElement(child);
90
- return result;
91
- };
92
- const printVerbatimElement = (node) => {
93
- const attributes = node.attributes.map((a) => ` ${printAttribute(a)}`).join("");
94
- return node.children.length === 0 ? `<${node.tag}${attributes} />` : `<${node.tag}${attributes}>${printVerbatimFlow(node.children)}</${node.tag}>`;
95
- };
96
- /** A verbatim container: open tag at its indent, content glued, close tag glued. */
97
- const printVerbatimContainer = (node, indent) => {
98
- if (node.children.length === 0) return printOpenTag(node, indent, true);
99
- const attributes = node.attributes.map((a) => ` ${printAttribute(a)}`).join("");
100
- return `${indent}<${node.tag}${attributes}>${printVerbatimFlow(node.children)}</${node.tag}>`;
101
- };
102
- /** Tags whose content is verbatim. <Button> is verbatim only inside <WhatsApp>. */
103
- const isVerbatimContainer = (node, inWhatsApp) => node.tag === "Sms" || node.tag === "Header" || node.tag === "Body" || node.tag === "Footer" || inWhatsApp && node.tag === "Button";
104
- const printElement = (node, depth, inWhatsApp = false) => {
105
- const indent = INDENT.repeat(depth);
106
- if (isVerbatimContainer(node, inWhatsApp)) return printVerbatimContainer(node, indent);
107
- if (node.children.length === 0) return printOpenTag(node, indent, true);
108
- if (isInlineContainer(node) && !inWhatsApp) {
109
- const flow = printInlineFlow(node.children);
110
- const openTag = printOpenTag(node, indent, false);
111
- const singleLine = `${openTag}${flow}</${node.tag}>`;
112
- if (!openTag.includes("\n") && singleLine.length <= MAX_WIDTH) return singleLine;
113
- return `${openTag}\n${reflowInlineFlow(node.children, indent + INDENT)}\n${indent}</${node.tag}>`;
114
- }
115
- const nextInWhatsApp = inWhatsApp || node.tag === "WhatsApp";
116
- return `${printOpenTag(node, indent, false)}\n${node.children.map((child) => child.kind === "element" ? printElement(child, depth + 1, nextInWhatsApp) : child.kind === "text" ? `${indent}${INDENT}${escapeText(child.value)}` : `${indent}${INDENT}${printInterpolation(child)}`).join("\n")}\n${indent}</${node.tag}>`;
117
- };
118
- const printSml = (document) => `${printElement(document.root, 0)}\n`;
119
- //#endregion
120
- export { printSml };
121
-
122
- //# sourceMappingURL=printer.js.map
@@ -1,73 +0,0 @@
1
- //#region src/theme.d.ts
2
- interface TextToken {
3
- readonly sizePx: number;
4
- readonly lineHeightPx: number;
5
- }
6
- interface UtilityScale {
7
- /** Flattened color names ("red-500", "white", "brand") → 6-digit lowercase hex. */
8
- readonly colors: Readonly<Record<string, string>>;
9
- /**
10
- * Dark counterparts, colors namespace only (dark radius/fonts are not a
11
- * thing). Only tokens with a dark pair appear; a color-family utility that
12
- * resolves a paired token also emits the dark head rule automatically.
13
- */
14
- readonly colorsDark: Readonly<Record<string, string>>;
15
- /** px per spacing unit (`p-4` → 4 × spacingPx). */
16
- readonly spacingPx: number;
17
- /** text-{size} → font-size / line-height px pair. */
18
- readonly text: Readonly<Record<string, TextToken>>;
19
- /** leading-{name} → unitless line-height ratio. */
20
- readonly leading: Readonly<Record<string, number>>;
21
- /** tracking-{name} → letter-spacing em. */
22
- readonly trackingEm: Readonly<Record<string, number>>;
23
- /** rounded-{name} → border-radius px. */
24
- readonly radiusPx: Readonly<Record<string, number>>;
25
- /** font-{name} → font-weight number. */
26
- readonly fontWeights: Readonly<Record<string, number>>;
27
- /** font-{name} → the inline font-family stack, ending in a generic family. */
28
- readonly fontFamilies: Readonly<Record<string, string>>;
29
- /** max-w-{name} → px. */
30
- readonly containerPx: Readonly<Record<string, number>>;
31
- }
32
- //#endregion
33
- //#region src/registry.d.ts
34
- interface Declaration {
35
- readonly property: string;
36
- readonly value: string;
37
- }
38
- interface UtilityFamily {
39
- readonly root: string;
40
- /** Accepts `root` with no value ("border", "rounded", "block"). */
41
- readonly bare?: ReadonlyArray<Declaration> | undefined;
42
- /** Resolve a named value; null = this family does not accept it. */
43
- readonly named?: ((value: string, theme: UtilityScale) => ReadonlyArray<Declaration> | null) | undefined;
44
- /** Resolve an arbitrary `[...]` value; null = malformed for this family. */
45
- readonly arbitrary?: ((value: string, theme: UtilityScale) => ReadonlyArray<Declaration> | null) | undefined;
46
- /** dark: variant is only legal on color families. */
47
- readonly colorFamily?: boolean | undefined;
48
- /**
49
- * Base-variant only: sm:/dark: are rejected. Set on the gradient family —
50
- * its declarations are compiler-internal placeholders that must be combined
51
- * per node, which head rules cannot express.
52
- */
53
- readonly baseOnly?: boolean | undefined;
54
- /** "warn" families compile but surface a lint warning. */
55
- readonly warn?: string | undefined;
56
- readonly description: string;
57
- readonly caniemailSlugs: ReadonlyArray<string>;
58
- }
59
- interface ForbiddenUtility {
60
- /** Exact class or `prefix-` match against the candidate base. */
61
- readonly match: string;
62
- readonly message: string;
63
- }
64
- declare const GRADIENT_DIRECTION_PROPERTY = "-sml-gradient-direction";
65
- declare const GRADIENT_FROM_PROPERTY = "-sml-gradient-from";
66
- declare const GRADIENT_TO_PROPERTY = "-sml-gradient-to";
67
- declare const utilityRegistry: ReadonlyArray<UtilityFamily>;
68
- declare const forbiddenUtilities: ReadonlyArray<ForbiddenUtility>;
69
- /** Every root the resolver may try to split on, longest-match first (candidate.ts). */
70
- declare const registryRoots: ReadonlySet<string>;
71
- //#endregion
72
- export { GRADIENT_TO_PROPERTY as a, registryRoots as c, GRADIENT_FROM_PROPERTY as i, utilityRegistry as l, ForbiddenUtility as n, UtilityFamily as o, GRADIENT_DIRECTION_PROPERTY as r, forbiddenUtilities as s, Declaration as t, UtilityScale as u };
73
- //# sourceMappingURL=registry-Dcp6QEK_.d.ts.map
@@ -1,2 +0,0 @@
1
- import { a as GRADIENT_TO_PROPERTY, c as registryRoots, i as GRADIENT_FROM_PROPERTY, l as utilityRegistry, n as ForbiddenUtility, o as UtilityFamily, r as GRADIENT_DIRECTION_PROPERTY, s as forbiddenUtilities, t as Declaration } from "./registry-Dcp6QEK_.js";
2
- export { Declaration, ForbiddenUtility, GRADIENT_DIRECTION_PROPERTY, GRADIENT_FROM_PROPERTY, GRADIENT_TO_PROPERTY, UtilityFamily, forbiddenUtilities, registryRoots, utilityRegistry };