@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.
- package/LICENSE +21 -0
- package/README.md +160 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +89 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +38 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +256 -0
- package/dist/config.js.map +1 -0
- package/dist/generators/content-scss.d.ts +3 -0
- package/dist/generators/content-scss.d.ts.map +1 -0
- package/dist/generators/content-scss.js +207 -0
- package/dist/generators/content-scss.js.map +1 -0
- package/dist/generators/fluid.d.ts +7 -0
- package/dist/generators/fluid.d.ts.map +1 -0
- package/dist/generators/fluid.js +31 -0
- package/dist/generators/fluid.js.map +1 -0
- package/dist/generators/fonts-css.d.ts +3 -0
- package/dist/generators/fonts-css.d.ts.map +1 -0
- package/dist/generators/fonts-css.js +33 -0
- package/dist/generators/fonts-css.js.map +1 -0
- package/dist/generators/integrate-php.d.ts +2 -0
- package/dist/generators/integrate-php.d.ts.map +1 -0
- package/dist/generators/integrate-php.js +9 -0
- package/dist/generators/integrate-php.js.map +1 -0
- package/dist/generators/theme-json.d.ts +3 -0
- package/dist/generators/theme-json.d.ts.map +1 -0
- package/dist/generators/theme-json.js +245 -0
- package/dist/generators/theme-json.js.map +1 -0
- package/dist/generators/tokens-css.d.ts +3 -0
- package/dist/generators/tokens-css.d.ts.map +1 -0
- package/dist/generators/tokens-css.js +32 -0
- package/dist/generators/tokens-css.js.map +1 -0
- package/dist/generators/tokens-wp-css.d.ts +3 -0
- package/dist/generators/tokens-wp-css.d.ts.map +1 -0
- package/dist/generators/tokens-wp-css.js +37 -0
- package/dist/generators/tokens-wp-css.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/dist/preset.d.ts +13 -0
- package/dist/preset.d.ts.map +1 -0
- package/dist/preset.js +31 -0
- package/dist/preset.js.map +1 -0
- package/dist/types.d.ts +166 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +123 -0
- package/dist/types.js.map +1 -0
- package/package.json +58 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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
|