@samva/markup 0.8.0 → 0.9.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 (171) hide show
  1. package/AGENTS.md +90 -37
  2. package/README.md +188 -52
  3. package/dist/assets-C5duwTya.d.ts +40 -0
  4. package/dist/{brand-DcoVkh_S.d.ts → brand-B-0bN_Ir.d.ts} +2 -2
  5. package/dist/{render-vAv_4r9v.js → cascade-t6kxlgEI.js} +93 -280
  6. package/dist/channel-edit.d.ts +121 -0
  7. package/dist/channel-edit.js +609 -0
  8. package/dist/channel-specs-B6M_HlaV.js +29 -0
  9. package/dist/channel-specs-C2feJwuP.d.ts +13 -0
  10. package/dist/compatibility-DbISoFIq.js +589 -0
  11. package/dist/compiler.d.ts +10 -257
  12. package/dist/compiler.js +10 -730
  13. package/dist/{css-CS2jLID6.d.ts → css-BVQKICKC.d.ts} +3 -3
  14. package/dist/diagnostic-codes.d.ts +403 -0
  15. package/dist/diagnostic-codes.js +399 -0
  16. package/dist/{diagnostics-BMYtBCQk.d.ts → diagnostics-B-Gym34R.d.ts} +8 -4
  17. package/dist/diagnostics.d.ts +31 -2
  18. package/dist/diagnostics.js +1 -19
  19. package/dist/{elements-BzjjnoCS.d.ts → elements-cqldpaJt.d.ts} +3 -3
  20. package/dist/email/assets.d.ts +2 -40
  21. package/dist/email/brand-footer.d.ts +2 -2
  22. package/dist/email/brand-footer.js +4 -3
  23. package/dist/email/brand.d.ts +1 -1
  24. package/dist/email/brand.js +1 -1
  25. package/dist/email/components.d.ts +21 -10
  26. package/dist/email/components.js +46 -11
  27. package/dist/email/diagnostics.d.ts +2 -2
  28. package/dist/email/diagnostics.js +2 -1
  29. package/dist/email/elements.d.ts +1 -1
  30. package/dist/email/html.d.ts +2 -2
  31. package/dist/email/html.js +45 -2
  32. package/dist/email/jsx-dev-runtime.d.ts +2 -2
  33. package/dist/email/jsx-runtime.d.ts +1 -1
  34. package/dist/email/render.d.ts +8 -18
  35. package/dist/email/render.js +163 -3
  36. package/dist/email/text.d.ts +1 -1
  37. package/dist/fmt.d.ts +32 -0
  38. package/dist/fmt.js +174 -0
  39. package/dist/{html-Bl9BAdqc.d.ts → html-BJepOwZ4.d.ts} +19 -5
  40. package/dist/index.d.ts +2 -0
  41. package/dist/index.js +2 -0
  42. package/dist/ir-aaqNE987.d.ts +252 -0
  43. package/dist/ir.d.ts +2 -0
  44. package/dist/ir.js +7 -0
  45. package/dist/preview-Ekdg1dXG.d.ts +100 -0
  46. package/dist/preview.d.ts +2 -0
  47. package/dist/preview.js +160 -0
  48. package/dist/profile-BH-OtdDA.js +3670 -0
  49. package/dist/render-ir.d.ts +19 -0
  50. package/dist/render-ir.js +826 -0
  51. package/dist/sms-segments.d.ts +13 -2
  52. package/dist/sms.d.ts +16 -0
  53. package/dist/sms.js +12 -0
  54. package/dist/{email/source-edit.d.ts → source-edit.d.ts} +55 -6
  55. package/dist/source-edit.js +343 -0
  56. package/dist/source-locations-C8wCsiAy.d.ts +23 -0
  57. package/dist/source-locations.d.ts +2 -2
  58. package/dist/source-locations.js +3 -89
  59. package/dist/static.d.ts +57 -0
  60. package/dist/static.js +69 -0
  61. package/dist/tailwind-CMYpZf1v.js +614 -0
  62. package/dist/template-_QE_rQND.d.ts +65 -0
  63. package/dist/template.d.ts +2 -2
  64. package/dist/template.js +15 -10
  65. package/dist/theme-css.d.ts +1 -1
  66. package/dist/theme-imports-lvBw3AD1.js +109 -0
  67. package/dist/transform-Ct2OMkFN.d.ts +153 -0
  68. package/dist/whatsapp.d.ts +57 -0
  69. package/dist/whatsapp.js +22 -0
  70. package/generated/contract.json +1782 -0
  71. package/generated/reference.md +353 -0
  72. package/package.json +41 -151
  73. package/skills/sml/SKILL.md +123 -0
  74. package/dist/ast-BrDtApwS.d.ts +0 -107
  75. package/dist/ast.d.ts +0 -2
  76. package/dist/ast.js +0 -124
  77. package/dist/candidate.d.ts +0 -29
  78. package/dist/candidate.js +0 -88
  79. package/dist/catalog-CKuOooB8.d.ts +0 -354
  80. package/dist/checks-D73Xizbw.js +0 -59366
  81. package/dist/checks.d.ts +0 -33
  82. package/dist/checks.js +0 -2
  83. package/dist/classes.d.ts +0 -26
  84. package/dist/classes.js +0 -184
  85. package/dist/compile-sms.d.ts +0 -28
  86. package/dist/compile-sms.js +0 -44
  87. package/dist/compile-whatsapp.d.ts +0 -56
  88. package/dist/compile-whatsapp.js +0 -186
  89. package/dist/compile.d.ts +0 -18
  90. package/dist/compile.js +0 -29
  91. package/dist/components.d.ts +0 -289
  92. package/dist/components.js +0 -106
  93. package/dist/conditionals.d.ts +0 -10
  94. package/dist/conditionals.js +0 -74
  95. package/dist/corpus-CPPfgAHN.d.ts +0 -106
  96. package/dist/diagnostics-OcQKQYSY.d.ts +0 -49
  97. package/dist/email/selection.d.ts +0 -2
  98. package/dist/email/selection.js +0 -91
  99. package/dist/email/source-edit.js +0 -185
  100. package/dist/email/stylesheets.d.ts +0 -15
  101. package/dist/email/stylesheets.js +0 -48
  102. package/dist/emit.d.ts +0 -51
  103. package/dist/emit.js +0 -151
  104. package/dist/interpolate.d.ts +0 -24
  105. package/dist/interpolate.js +0 -43
  106. package/dist/jsx-dev-runtime.d.ts +0 -11
  107. package/dist/jsx-dev-runtime.js +0 -15
  108. package/dist/jsx-runtime-I-1nCtl2.d.ts +0 -57
  109. package/dist/jsx-runtime.d.ts +0 -2
  110. package/dist/jsx-runtime.js +0 -121
  111. package/dist/lexer.d.ts +0 -60
  112. package/dist/lexer.js +0 -281
  113. package/dist/model.d.ts +0 -24
  114. package/dist/model.js +0 -77
  115. package/dist/ops-BvwqHl7V.js +0 -630
  116. package/dist/ops.d.ts +0 -114
  117. package/dist/ops.js +0 -2
  118. package/dist/parser-t29cHLVL.d.ts +0 -396
  119. package/dist/parser.d.ts +0 -2
  120. package/dist/parser.js +0 -859
  121. package/dist/predicate-BI6uRRM-.js +0 -549
  122. package/dist/predicate-M-05Nd7R.d.ts +0 -56
  123. package/dist/predicate.d.ts +0 -2
  124. package/dist/predicate.js +0 -2
  125. package/dist/printer.d.ts +0 -6
  126. package/dist/printer.js +0 -122
  127. package/dist/registry-Dcp6QEK_.d.ts +0 -73
  128. package/dist/registry.d.ts +0 -2
  129. package/dist/registry.js +0 -646
  130. package/dist/render-template.d.ts +0 -45
  131. package/dist/render-template.js +0 -76
  132. package/dist/selection-CCArx9lU.d.ts +0 -91
  133. package/dist/showcase-egkusQBf.d.ts +0 -415
  134. package/dist/sms-segments-y4FpPilJ.d.ts +0 -13
  135. package/dist/source-locations-DrCM82Ym.d.ts +0 -67
  136. package/dist/starters/category-mapping.d.ts +0 -13
  137. package/dist/starters/category-mapping.js +0 -49
  138. package/dist/starters/corpus.d.ts +0 -2
  139. package/dist/starters/corpus.js +0 -194
  140. package/dist/starters/library.d.ts +0 -18
  141. package/dist/starters/library.js +0 -692
  142. package/dist/starters/public-gallery.d.ts +0 -266
  143. package/dist/starters/public-gallery.js +0 -916
  144. package/dist/starters/public-handoff.d.ts +0 -164
  145. package/dist/starters/public-handoff.js +0 -361
  146. package/dist/starters/public-preview-artifacts.d.ts +0 -43
  147. package/dist/starters/public-preview-artifacts.js +0 -104
  148. package/dist/starters/public-preview.d.ts +0 -61
  149. package/dist/starters/public-preview.js +0 -83
  150. package/dist/starters/showcase.d.ts +0 -2
  151. package/dist/starters/showcase.js +0 -335
  152. package/dist/starters/sources.d.ts +0 -45
  153. package/dist/starters/sources.js +0 -7762
  154. package/dist/starters/theme.d.ts +0 -45
  155. package/dist/starters/theme.js +0 -77
  156. package/dist/starters.d.ts +0 -2
  157. package/dist/starters.js +0 -874
  158. package/dist/tailwind-BYq7Lo6u.js +0 -727
  159. package/dist/template-DWftqh4x.d.ts +0 -60
  160. package/dist/tsx-source-instrumentation.d.ts +0 -30
  161. package/dist/tsx-source-instrumentation.js +0 -115
  162. package/dist/tsx-tracer.d.ts +0 -112
  163. package/dist/tsx-tracer.js +0 -985
  164. package/dist/variables-J_L3qxRa.d.ts +0 -77
  165. package/dist/variables.d.ts +0 -2
  166. package/dist/variables.js +0 -141
  167. package/dist/version-BITr58kk.js +0 -96
  168. package/generated/sml-agent-contract.json +0 -709
  169. package/generated/sml-email-agent-contract.json +0 -615
  170. package/generated/sml-email-language-reference.md +0 -94
  171. 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 };