@troychaplin/component2block 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 (52) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +160 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +89 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/config.d.ts +38 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +256 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/generators/content-scss.d.ts +3 -0
  12. package/dist/generators/content-scss.d.ts.map +1 -0
  13. package/dist/generators/content-scss.js +207 -0
  14. package/dist/generators/content-scss.js.map +1 -0
  15. package/dist/generators/fluid.d.ts +7 -0
  16. package/dist/generators/fluid.d.ts.map +1 -0
  17. package/dist/generators/fluid.js +31 -0
  18. package/dist/generators/fluid.js.map +1 -0
  19. package/dist/generators/fonts-css.d.ts +3 -0
  20. package/dist/generators/fonts-css.d.ts.map +1 -0
  21. package/dist/generators/fonts-css.js +33 -0
  22. package/dist/generators/fonts-css.js.map +1 -0
  23. package/dist/generators/integrate-php.d.ts +2 -0
  24. package/dist/generators/integrate-php.d.ts.map +1 -0
  25. package/dist/generators/integrate-php.js +9 -0
  26. package/dist/generators/integrate-php.js.map +1 -0
  27. package/dist/generators/theme-json.d.ts +3 -0
  28. package/dist/generators/theme-json.d.ts.map +1 -0
  29. package/dist/generators/theme-json.js +245 -0
  30. package/dist/generators/theme-json.js.map +1 -0
  31. package/dist/generators/tokens-css.d.ts +3 -0
  32. package/dist/generators/tokens-css.d.ts.map +1 -0
  33. package/dist/generators/tokens-css.js +32 -0
  34. package/dist/generators/tokens-css.js.map +1 -0
  35. package/dist/generators/tokens-wp-css.d.ts +3 -0
  36. package/dist/generators/tokens-wp-css.d.ts.map +1 -0
  37. package/dist/generators/tokens-wp-css.js +37 -0
  38. package/dist/generators/tokens-wp-css.js.map +1 -0
  39. package/dist/index.d.ts +16 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +50 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/preset.d.ts +13 -0
  44. package/dist/preset.d.ts.map +1 -0
  45. package/dist/preset.js +31 -0
  46. package/dist/preset.js.map +1 -0
  47. package/dist/types.d.ts +166 -0
  48. package/dist/types.d.ts.map +1 -0
  49. package/dist/types.js +123 -0
  50. package/dist/types.js.map +1 -0
  51. package/package.json +58 -0
  52. package/templates/integrate.php.tpl +133 -0
@@ -0,0 +1,207 @@
1
+ import { camelToKebab } from '../types.js';
2
+ import { resolveForScss, ensureFontStyle } from '../config.js';
3
+ /** Property output order for consistent generated CSS */
4
+ const PROPERTY_ORDER = ['fontFamily', 'fontSize', 'fontStyle', 'fontWeight', 'lineHeight'];
5
+ /** Padding sides in output order */
6
+ const PADDING_SIDES = ['top', 'right', 'bottom', 'left'];
7
+ export function generateContentScss(config) {
8
+ if (!config.baseStyles)
9
+ return null;
10
+ const lines = [
11
+ '/* Auto-generated by component2block — do not edit manually */',
12
+ '',
13
+ ];
14
+ const { baseStyles, prefix, tokens } = config;
15
+ const hasBodyTypography = !!baseStyles.body;
16
+ const hasSpacingPadding = !!baseStyles.spacing?.padding;
17
+ const hasBlockGap = !!baseStyles.spacing?.blockGap;
18
+ // Body — wraps in body { } for typography, root padding variables, and/or block gap
19
+ if (hasBodyTypography || hasSpacingPadding || hasBlockGap) {
20
+ lines.push('body {');
21
+ // Typography declarations
22
+ if (baseStyles.body) {
23
+ appendDeclarations(lines, baseStyles.body, prefix, tokens, ' ');
24
+ }
25
+ // Root padding CSS custom properties
26
+ if (baseStyles.spacing?.padding) {
27
+ appendRootPaddingVars(lines, baseStyles.spacing.padding, prefix, tokens);
28
+ }
29
+ // Block gap CSS custom property
30
+ if (baseStyles.spacing?.blockGap) {
31
+ appendBlockGapVar(lines, baseStyles.spacing, prefix, tokens);
32
+ }
33
+ lines.push('}');
34
+ }
35
+ // Block gap layout utility rules
36
+ if (hasBlockGap) {
37
+ appendBlockGapRules(lines, prefix);
38
+ }
39
+ // Layout constraint rules (contentSize / wideSize)
40
+ appendLayoutConstraintRules(lines, prefix, tokens);
41
+ // Global padding + alignfull rules
42
+ if (hasSpacingPadding) {
43
+ lines.push('');
44
+ lines.push('.has-global-padding {');
45
+ lines.push(` padding-right: var(--${prefix}--root-padding-right);`);
46
+ lines.push(` padding-left: var(--${prefix}--root-padding-left);`);
47
+ lines.push('}');
48
+ lines.push('');
49
+ lines.push('.has-global-padding > .alignfull {');
50
+ lines.push(' max-width: none;');
51
+ lines.push(` margin-right: calc(var(--${prefix}--root-padding-right) * -1);`);
52
+ lines.push(` margin-left: calc(var(--${prefix}--root-padding-left) * -1);`);
53
+ lines.push('}');
54
+ lines.push('');
55
+ lines.push('.has-global-padding > .alignfull > .has-global-padding {');
56
+ lines.push(` padding-right: var(--${prefix}--root-padding-right);`);
57
+ lines.push(` padding-left: var(--${prefix}--root-padding-left);`);
58
+ lines.push('}');
59
+ }
60
+ // Heading group — :where(h1, h2, h3, h4, h5, h6) { ... }
61
+ if (baseStyles.heading) {
62
+ lines.push('');
63
+ lines.push(':where(h1, h2, h3, h4, h5, h6) {');
64
+ appendDeclarations(lines, baseStyles.heading, prefix, tokens, ' ');
65
+ lines.push('}');
66
+ }
67
+ // Individual headings — :where(hN) { ... }
68
+ const headingLevels = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];
69
+ for (const level of headingLevels) {
70
+ const def = baseStyles[level];
71
+ if (!def)
72
+ continue;
73
+ lines.push('');
74
+ lines.push(`:where(${level}) {`);
75
+ appendDeclarations(lines, ensureFontStyle(def), prefix, tokens, ' ');
76
+ lines.push('}');
77
+ }
78
+ // Caption — :where(figcaption) { ... }
79
+ if (baseStyles.caption) {
80
+ lines.push('');
81
+ lines.push(':where(figcaption) {');
82
+ appendDeclarations(lines, baseStyles.caption, prefix, tokens, ' ');
83
+ lines.push('}');
84
+ }
85
+ // Button — :where(button) { ... }
86
+ if (baseStyles.button) {
87
+ lines.push('');
88
+ lines.push(':where(button) {');
89
+ appendDeclarations(lines, baseStyles.button, prefix, tokens, ' ');
90
+ lines.push('}');
91
+ }
92
+ // Link — :where(a) { ... } and :where(a:hover) { ... }
93
+ if (baseStyles.link) {
94
+ lines.push('');
95
+ lines.push(':where(a) {');
96
+ appendDeclarations(lines, baseStyles.link, prefix, tokens, ' ');
97
+ lines.push('}');
98
+ if (baseStyles.link.hoverColor !== undefined) {
99
+ const resolvedHoverColor = resolveForScss(baseStyles.link.hoverColor, prefix, tokens, 'colorPalette');
100
+ lines.push('');
101
+ lines.push(':where(a:hover) {');
102
+ lines.push(` color: ${resolvedHoverColor};`);
103
+ lines.push('}');
104
+ }
105
+ }
106
+ lines.push('');
107
+ return lines.join('\n');
108
+ }
109
+ /**
110
+ * Append CSS declarations for a base style element definition.
111
+ * Handles typography properties (camelCase → kebab-case) and
112
+ * color properties (color → color, background → background-color).
113
+ */
114
+ function appendDeclarations(lines, def, prefix, tokens, indent) {
115
+ // Typography declarations
116
+ for (const prop of PROPERTY_ORDER) {
117
+ const value = def[prop];
118
+ if (value === undefined)
119
+ continue;
120
+ const cssProperty = camelToKebab(prop);
121
+ const resolvedValue = resolveForScss(value, prefix, tokens);
122
+ lines.push(`${indent}${cssProperty}: ${resolvedValue};`);
123
+ }
124
+ // Color declarations
125
+ if (def.color !== undefined) {
126
+ const resolvedValue = resolveForScss(def.color, prefix, tokens, 'colorPalette');
127
+ lines.push(`${indent}color: ${resolvedValue};`);
128
+ }
129
+ if (def.background !== undefined) {
130
+ const resolvedValue = resolveForScss(def.background, prefix, tokens, 'colorPalette');
131
+ lines.push(`${indent}background-color: ${resolvedValue};`);
132
+ }
133
+ }
134
+ /**
135
+ * Append root padding CSS custom properties inside the body block.
136
+ * Only defined sides are output. Uses 'spacing' as preferred category
137
+ * to resolve ambiguous keys like "large" that exist in both spacing and fontSize.
138
+ */
139
+ function appendRootPaddingVars(lines, padding, prefix, tokens) {
140
+ for (const side of PADDING_SIDES) {
141
+ const value = padding[side];
142
+ if (value === undefined)
143
+ continue;
144
+ const resolvedValue = resolveForScss(value, prefix, tokens, 'spacing');
145
+ lines.push(` --${prefix}--root-padding-${side}: ${resolvedValue};`);
146
+ }
147
+ }
148
+ /**
149
+ * Append block gap CSS custom property inside the body block.
150
+ * Resolves token references using 'spacing' as preferred category.
151
+ */
152
+ function appendBlockGapVar(lines, spacing, prefix, tokens) {
153
+ if (!spacing.blockGap)
154
+ return;
155
+ const resolvedValue = resolveForScss(spacing.blockGap, prefix, tokens, 'spacing');
156
+ lines.push(` --${prefix}--root-block-gap: ${resolvedValue};`);
157
+ }
158
+ /**
159
+ * Append layout utility rules that mirror WordPress block gap behavior.
160
+ * Uses the root block gap CSS custom property set in appendBlockGapVar.
161
+ *
162
+ * - Constrained/flow layouts: margin-block-start on children
163
+ * - Flex/grid layouts: gap on the container
164
+ */
165
+ function appendBlockGapRules(lines, prefix) {
166
+ lines.push('');
167
+ lines.push(`:where(.is-layout-constrained) > * + * {`);
168
+ lines.push(` margin-block-start: var(--${prefix}--root-block-gap);`);
169
+ lines.push('}');
170
+ lines.push('');
171
+ lines.push(`:where(.is-layout-flex) {`);
172
+ lines.push(` gap: var(--${prefix}--root-block-gap);`);
173
+ lines.push('}');
174
+ lines.push('');
175
+ lines.push(`:where(.is-layout-grid) {`);
176
+ lines.push(` gap: var(--${prefix}--root-block-gap);`);
177
+ lines.push('}');
178
+ }
179
+ /**
180
+ * Append layout constraint rules that mirror WordPress constrained layout behavior.
181
+ * Default children are constrained to contentSize, .alignwide overrides to wideSize.
182
+ * Uses the same selectors and !important as WordPress for identical behavior.
183
+ */
184
+ function appendLayoutConstraintRules(lines, prefix, tokens) {
185
+ const layoutTokens = tokens.layout;
186
+ if (!layoutTokens)
187
+ return;
188
+ const hasContentSize = 'contentSize' in layoutTokens;
189
+ const hasWideSize = 'wideSize' in layoutTokens;
190
+ if (hasContentSize) {
191
+ lines.push('');
192
+ lines.push(`.is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)) {`);
193
+ lines.push(` max-width: var(--${prefix}--layout-content-size);`);
194
+ lines.push(` margin-left: auto !important;`);
195
+ lines.push(` margin-right: auto !important;`);
196
+ lines.push('}');
197
+ }
198
+ if (hasWideSize) {
199
+ lines.push('');
200
+ lines.push(`.is-layout-constrained > .alignwide {`);
201
+ lines.push(` max-width: var(--${prefix}--layout-wide-size);`);
202
+ lines.push(` margin-left: auto !important;`);
203
+ lines.push(` margin-right: auto !important;`);
204
+ lines.push('}');
205
+ }
206
+ }
207
+ //# sourceMappingURL=content-scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-scss.js","sourceRoot":"","sources":["../../src/generators/content-scss.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { TokenEntry } from '../types.js';
2
+ /**
3
+ * Build a clamp() value matching WordPress's fluid typography formula.
4
+ * clamp(min, min + (maxNum - minNum) * ((100vw - 320px) / 1280), max)
5
+ */
6
+ export declare function buildFluidClamp(entry: TokenEntry): string | null;
7
+ //# sourceMappingURL=fluid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fluid.d.ts","sourceRoot":"","sources":["../../src/generators/fluid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAiB9C;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAYhE"}
@@ -0,0 +1,31 @@
1
+ /** WordPress fluid typography defaults */
2
+ const FLUID_MIN_VIEWPORT = 320;
3
+ const FLUID_MAX_VIEWPORT = 1600;
4
+ const FLUID_VIEWPORT_RANGE = FLUID_MAX_VIEWPORT - FLUID_MIN_VIEWPORT;
5
+ /**
6
+ * Parse a CSS length value into its numeric part and unit.
7
+ * e.g. "1.125rem" → { num: 1.125, unit: "rem" }
8
+ */
9
+ function parseLength(value) {
10
+ const match = value.match(/^([0-9.]+)(rem|em|px)$/);
11
+ if (!match)
12
+ return null;
13
+ return { num: parseFloat(match[1]), unit: match[2] };
14
+ }
15
+ /**
16
+ * Build a clamp() value matching WordPress's fluid typography formula.
17
+ * clamp(min, min + (maxNum - minNum) * ((100vw - 320px) / 1280), max)
18
+ */
19
+ export function buildFluidClamp(entry) {
20
+ if (!entry.fluid)
21
+ return null;
22
+ const min = parseLength(entry.fluid.min);
23
+ const max = parseLength(entry.fluid.max);
24
+ if (!min || !max || min.unit !== max.unit)
25
+ return null;
26
+ const range = max.num - min.num;
27
+ // Round to avoid floating point noise
28
+ const rangeRounded = Math.round(range * 10000) / 10000;
29
+ return `clamp(${entry.fluid.min}, ${entry.fluid.min} + ((${rangeRounded}) * ((100vw - ${FLUID_MIN_VIEWPORT}px) / ${FLUID_VIEWPORT_RANGE})), ${entry.fluid.max})`;
30
+ }
31
+ //# sourceMappingURL=fluid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fluid.js","sourceRoot":"","sources":["../../src/generators/fluid.ts"],"names":[],"mappings":"AAEA,0CAA0C;AAC1C,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAChC,MAAM,oBAAoB,GAAG,kBAAkB,GAAG,kBAAkB,CAAC;AAErE;;;GAGG;AACH,SAAS,WAAW,CAAC,KAAa;IAChC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACpD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,EAAE,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACvD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAAiB;IAC/C,IAAI,CAAC,KAAK,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAE9B,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvD,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IAChC,sCAAsC;IACtC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC;IAEvD,OAAO,SAAS,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,QAAQ,YAAY,iBAAiB,kBAAkB,SAAS,oBAAoB,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;AACnK,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { C2bConfig } from '../types.js';
2
+ export declare function generateFontsCss(config: C2bConfig): string | null;
3
+ //# sourceMappingURL=fonts-css.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fonts-css.d.ts","sourceRoot":"","sources":["../../src/generators/fonts-css.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAc7C,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAyBjE"}
@@ -0,0 +1,33 @@
1
+ const FORMAT_MAP = {
2
+ '.woff2': 'woff2',
3
+ '.woff': 'woff',
4
+ '.ttf': 'truetype',
5
+ '.otf': 'opentype',
6
+ };
7
+ function inferFormat(filename) {
8
+ const ext = filename.slice(filename.lastIndexOf('.'));
9
+ return FORMAT_MAP[ext] ?? 'woff2';
10
+ }
11
+ export function generateFontsCss(config) {
12
+ const group = config.tokens.fontFamily;
13
+ if (!group)
14
+ return null;
15
+ const blocks = [];
16
+ for (const entry of Object.values(group)) {
17
+ if (!entry.fontFace || !entry.name || !entry.slug)
18
+ continue;
19
+ for (const face of entry.fontFace) {
20
+ const format = inferFormat(face.src);
21
+ blocks.push(`@font-face {\n` +
22
+ ` font-family: '${entry.name}';\n` +
23
+ ` font-style: ${face.style};\n` +
24
+ ` font-weight: ${face.weight};\n` +
25
+ ` src: url('/fonts/${entry.slug}/${face.src}') format('${format}');\n` +
26
+ `}`);
27
+ }
28
+ }
29
+ if (blocks.length === 0)
30
+ return null;
31
+ return `/* Auto-generated by component2block — do not edit manually */\n\n${blocks.join('\n\n')}\n`;
32
+ }
33
+ //# sourceMappingURL=fonts-css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fonts-css.js","sourceRoot":"","sources":["../../src/generators/fonts-css.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAA2B;IACzC,QAAQ,EAAE,OAAO;IACjB,OAAO,EAAE,MAAM;IACf,MAAM,EAAE,UAAU;IAClB,MAAM,EAAE,UAAU;CACnB,CAAC;AAEF,SAAS,WAAW,CAAC,QAAgB;IACnC,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IACtD,OAAO,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC;IACvC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI;YAAE,SAAS;QAE5D,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrC,MAAM,CAAC,IAAI,CACT,gBAAgB;gBAChB,mBAAmB,KAAK,CAAC,IAAI,MAAM;gBACnC,iBAAiB,IAAI,CAAC,KAAK,KAAK;gBAChC,kBAAkB,IAAI,CAAC,MAAM,KAAK;gBAClC,sBAAsB,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,cAAc,MAAM,OAAO;gBACvE,GAAG,CACJ,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAErC,OAAO,qEAAqE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;AACtG,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function generateIntegratePhp(): string;
2
+ //# sourceMappingURL=integrate-php.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integrate-php.d.ts","sourceRoot":"","sources":["../../src/generators/integrate-php.ts"],"names":[],"mappings":"AAOA,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C"}
@@ -0,0 +1,9 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { resolve, dirname } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ const __dirname = dirname(fileURLToPath(import.meta.url));
5
+ const TEMPLATE_PATH = resolve(__dirname, '../../templates/integrate.php.tpl');
6
+ export function generateIntegratePhp() {
7
+ return readFileSync(TEMPLATE_PATH, 'utf-8');
8
+ }
9
+ //# sourceMappingURL=integrate-php.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integrate-php.js","sourceRoot":"","sources":["../../src/generators/integrate-php.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,EAAE,mCAAmC,CAAC,CAAC;AAE9E,MAAM,UAAU,oBAAoB;IAClC,OAAO,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { C2bConfig } from '../types.js';
2
+ export declare function generateThemeJson(config: C2bConfig): string;
3
+ //# sourceMappingURL=theme-json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-json.d.ts","sourceRoot":"","sources":["../../src/generators/theme-json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAoE,MAAM,aAAa,CAAC;AAO/G,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAgG3D"}
@@ -0,0 +1,245 @@
1
+ import { CATEGORY_REGISTRY, CATEGORY_ORDER } from '../types.js';
2
+ import { resolveForThemeJson, ensureFontStyle } from '../config.js';
3
+ export function generateThemeJson(config) {
4
+ const settings = {};
5
+ const custom = {};
6
+ // Note: We intentionally do NOT set default*: false flags (defaultPalette,
7
+ // defaultGradients, defaultSpacingSizes, etc.) because the library's theme.json
8
+ // is injected at the wp_theme_json_data_default layer. Setting these to false
9
+ // hides the library's own presets since WordPress treats them as defaults.
10
+ // Themes that want to hide WordPress core presets should set these flags in
11
+ // their own theme.json (layer 3), where they won't affect the library.
12
+ // When locked (wpThemeable: false), disable custom color/gradient/duotone
13
+ // creation in the Site Editor. Users can only pick from the defined presets.
14
+ // integrate.php enforces this at the theme layer so themes can't override it.
15
+ // Placed before the category loop so these flags appear first in settings.color.
16
+ if (!config.wpThemeable) {
17
+ settings.color = {
18
+ custom: false,
19
+ customDuotone: false,
20
+ customGradient: false,
21
+ };
22
+ }
23
+ for (const category of CATEGORY_ORDER) {
24
+ const group = config.tokens[category];
25
+ if (!group)
26
+ continue;
27
+ const def = CATEGORY_REGISTRY[category];
28
+ // Excluded categories (zIndex) — skip entirely
29
+ if (def.exclude)
30
+ continue;
31
+ // Direct-map categories (layout) — map token keys directly to a settings object
32
+ // Layout keys are expected in camelCase (e.g. "contentSize", "wideSize")
33
+ if (def.directMap && def.themeJson) {
34
+ const obj = {};
35
+ for (const [key, entry] of Object.entries(group)) {
36
+ obj[key] = entry.value;
37
+ }
38
+ if (Object.keys(obj).length > 0) {
39
+ setNestedValue(settings, def.themeJson.path, obj);
40
+ }
41
+ continue;
42
+ }
43
+ // Preset categories (color, spacing, etc.) — build arrays from named tokens
44
+ if (def.themeJson) {
45
+ const presets = buildNamedEntries(group, def.themeJson.valueKey);
46
+ if (presets.length > 0) {
47
+ setNestedValue(settings, def.themeJson.path, presets);
48
+ }
49
+ }
50
+ // Custom categories — tokens without name+slug (or all tokens if custom-only)
51
+ if (def.custom) {
52
+ const values = {};
53
+ for (const [tokenKey, entry] of Object.entries(group)) {
54
+ // If category has both themeJson and custom (like shadow),
55
+ // only put tokens WITHOUT name+slug into custom
56
+ if (def.themeJson && entry.name && entry.slug)
57
+ continue;
58
+ values[tokenKey] = entry.value;
59
+ }
60
+ if (Object.keys(values).length > 0) {
61
+ custom[def.custom] = values;
62
+ }
63
+ }
64
+ }
65
+ // When custom font sizes are defined, enable fluid typography
66
+ if (config.tokens.fontSize) {
67
+ if (!settings.typography)
68
+ settings.typography = {};
69
+ settings.typography.fluid = true;
70
+ }
71
+ // Merge custom values into settings
72
+ if (Object.keys(custom).length > 0) {
73
+ settings.custom = custom;
74
+ }
75
+ settings.useRootPaddingAwareAlignments = true;
76
+ const themeJson = {
77
+ $schema: 'https://schemas.wp.org/trunk/theme.json',
78
+ version: 3,
79
+ settings,
80
+ };
81
+ // Build styles block from baseStyles config
82
+ if (config.baseStyles) {
83
+ const styles = buildStylesBlock(config.baseStyles, config.tokens);
84
+ if (styles) {
85
+ themeJson.styles = styles;
86
+ }
87
+ }
88
+ return JSON.stringify(themeJson, null, 2) + '\n';
89
+ }
90
+ /**
91
+ * Build an array of preset objects from tokens that have name + slug.
92
+ */
93
+ function buildNamedEntries(group, valueKey) {
94
+ const entries = [];
95
+ for (const entry of Object.values(group)) {
96
+ if (entry.name && entry.slug) {
97
+ const obj = {
98
+ slug: entry.slug,
99
+ [valueKey]: entry.value,
100
+ name: entry.name,
101
+ };
102
+ if (entry.fluid) {
103
+ obj.fluid = entry.fluid;
104
+ }
105
+ if (entry.fontFace && entry.fontFace.length > 0) {
106
+ obj.fontFace = entry.fontFace.map(face => ({
107
+ fontFamily: entry.name,
108
+ fontStyle: face.style,
109
+ fontWeight: face.weight,
110
+ src: [`file:./assets/fonts/${entry.slug}/${face.src}`],
111
+ }));
112
+ }
113
+ entries.push(obj);
114
+ }
115
+ }
116
+ return entries;
117
+ }
118
+ /**
119
+ * Set a value at a dot-separated path in a nested object.
120
+ * e.g. setNestedValue(obj, "color.palette", [...]) → obj.color.palette = [...]
121
+ */
122
+ function setNestedValue(obj, path, value) {
123
+ const parts = path.split('.');
124
+ let current = obj;
125
+ for (let i = 0; i < parts.length - 1; i++) {
126
+ if (!current[parts[i]])
127
+ current[parts[i]] = {};
128
+ current = current[parts[i]];
129
+ }
130
+ current[parts[parts.length - 1]] = value;
131
+ }
132
+ /**
133
+ * Build the theme.json styles block from baseStyles config.
134
+ */
135
+ function buildStylesBlock(baseStyles, tokens) {
136
+ const styles = {};
137
+ // Body typography → styles.typography
138
+ if (baseStyles.body) {
139
+ const bodyTypo = buildTypographyObject(baseStyles.body, tokens);
140
+ if (Object.keys(bodyTypo).length > 0) {
141
+ styles.typography = bodyTypo;
142
+ }
143
+ }
144
+ // Body color → styles.color
145
+ if (baseStyles.body) {
146
+ const bodyColor = buildColorObject(baseStyles.body, tokens);
147
+ if (Object.keys(bodyColor).length > 0) {
148
+ styles.color = bodyColor;
149
+ }
150
+ }
151
+ // Spacing → styles.spacing (prefer spacing category for ambiguous keys)
152
+ if (baseStyles.spacing?.blockGap || baseStyles.spacing?.padding) {
153
+ const spacingBlock = {};
154
+ if (baseStyles.spacing.blockGap) {
155
+ spacingBlock.blockGap = resolveForThemeJson(baseStyles.spacing.blockGap, tokens, 'spacing');
156
+ }
157
+ if (baseStyles.spacing.padding) {
158
+ const padding = {};
159
+ for (const [side, value] of Object.entries(baseStyles.spacing.padding)) {
160
+ if (value !== undefined) {
161
+ padding[side] = resolveForThemeJson(value, tokens, 'spacing');
162
+ }
163
+ }
164
+ if (Object.keys(padding).length > 0) {
165
+ spacingBlock.padding = padding;
166
+ }
167
+ }
168
+ if (Object.keys(spacingBlock).length > 0) {
169
+ styles.spacing = spacingBlock;
170
+ }
171
+ }
172
+ // Elements → styles.elements
173
+ const elements = {};
174
+ const elementKeys = ['heading', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'caption', 'button', 'link'];
175
+ for (const element of elementKeys) {
176
+ const def = baseStyles[element];
177
+ if (!def)
178
+ continue;
179
+ // Individual headings get fontStyle: normal default
180
+ const isIndividualHeading = /^h[1-6]$/.test(element);
181
+ const withDefaults = isIndividualHeading ? ensureFontStyle(def) : def;
182
+ const elementObj = {};
183
+ const typo = buildTypographyObject(withDefaults, tokens);
184
+ if (Object.keys(typo).length > 0) {
185
+ elementObj.typography = typo;
186
+ }
187
+ const color = buildColorObject(withDefaults, tokens);
188
+ if (Object.keys(color).length > 0) {
189
+ elementObj.color = color;
190
+ }
191
+ // Link :hover pseudo-class
192
+ if (element === 'link' && def.hoverColor !== undefined) {
193
+ const hoverColor = {
194
+ text: resolveForThemeJson(def.hoverColor, tokens, 'colorPalette'),
195
+ };
196
+ elementObj[':hover'] = { color: hoverColor };
197
+ }
198
+ if (Object.keys(elementObj).length > 0) {
199
+ elements[element] = elementObj;
200
+ }
201
+ }
202
+ if (Object.keys(elements).length > 0) {
203
+ styles.elements = elements;
204
+ }
205
+ return Object.keys(styles).length > 0 ? styles : null;
206
+ }
207
+ /**
208
+ * Build a theme.json typography object from a BaseStyleElementDef.
209
+ * Values are resolved through resolveForThemeJson.
210
+ */
211
+ function buildTypographyObject(def, tokens) {
212
+ const result = {};
213
+ if (def.fontFamily !== undefined) {
214
+ result.fontFamily = resolveForThemeJson(def.fontFamily, tokens);
215
+ }
216
+ if (def.fontSize !== undefined) {
217
+ result.fontSize = resolveForThemeJson(def.fontSize, tokens);
218
+ }
219
+ if (def.fontStyle !== undefined) {
220
+ result.fontStyle = def.fontStyle;
221
+ }
222
+ if (def.fontWeight !== undefined) {
223
+ result.fontWeight = def.fontWeight;
224
+ }
225
+ if (def.lineHeight !== undefined) {
226
+ result.lineHeight = def.lineHeight;
227
+ }
228
+ return result;
229
+ }
230
+ /**
231
+ * Build a theme.json color object from a BaseStyleElementDef.
232
+ * Maps color → text and background → background.
233
+ * Values are resolved through resolveForThemeJson with 'colorPalette' preference.
234
+ */
235
+ function buildColorObject(def, tokens) {
236
+ const result = {};
237
+ if (def.color !== undefined) {
238
+ result.text = resolveForThemeJson(def.color, tokens, 'colorPalette');
239
+ }
240
+ if (def.background !== undefined) {
241
+ result.background = resolveForThemeJson(def.background, tokens, 'colorPalette');
242
+ }
243
+ return result;
244
+ }
245
+ //# sourceMappingURL=theme-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-json.js","sourceRoot":"","sources":["../../src/generators/theme-json.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { C2bConfig } from '../types.js';
2
+ export declare function generateTokensCss(config: C2bConfig): string;
3
+ //# sourceMappingURL=tokens-css.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens-css.d.ts","sourceRoot":"","sources":["../../src/generators/tokens-css.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI7C,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAmC3D"}
@@ -0,0 +1,32 @@
1
+ import { CATEGORY_REGISTRY, CATEGORY_ORDER, camelToKebab } from '../types.js';
2
+ import { buildFluidClamp } from './fluid.js';
3
+ export function generateTokensCss(config) {
4
+ const lines = [
5
+ '/* Auto-generated by component2block — do not edit manually */',
6
+ '',
7
+ ':root {',
8
+ ];
9
+ let firstCategory = true;
10
+ for (const category of CATEGORY_ORDER) {
11
+ const group = config.tokens[category];
12
+ if (!group)
13
+ continue;
14
+ const def = CATEGORY_REGISTRY[category];
15
+ if (!firstCategory) {
16
+ lines.push('');
17
+ }
18
+ firstCategory = false;
19
+ lines.push(` /* ${def.label} */`);
20
+ for (const [key, entry] of Object.entries(group)) {
21
+ // Layout keys are camelCase in config but kebab-case in CSS variables
22
+ const cssKey = def.directMap ? camelToKebab(key) : key;
23
+ const varName = `--${config.prefix}--${def.cssSegment}-${cssKey}`;
24
+ const clampValue = entry.fluid ? buildFluidClamp(entry) : null;
25
+ lines.push(` ${varName}: ${clampValue ?? entry.value};`);
26
+ }
27
+ }
28
+ lines.push('}');
29
+ lines.push('');
30
+ return lines.join('\n');
31
+ }
32
+ //# sourceMappingURL=tokens-css.js.map