@stylewx/theme 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.
@@ -0,0 +1,20 @@
1
+ /**
2
+ * 主题 token 系统。
3
+ * block 声明里的值可用 `{{tokenPath}}` 引用 tokens 中的设计变量,例如 `{{primaryColor}}`、
4
+ * `{{spacing.block}}`。编译 / 校验时统一解析。
5
+ */
6
+ import type { ThemeTokens } from './schema.js';
7
+ /** 允许被 `{{...}}` 引用的 token 路径。 */
8
+ export declare const TOKEN_PATHS: readonly ["primaryColor", "textColor", "fontSize", "lineHeight", "fontFamily", "spacing.block"];
9
+ export type TokenPath = (typeof TOKEN_PATHS)[number];
10
+ /** 从 tokens 中取一个路径的值,返回字符串或 undefined(不存在 / 非字符串)。 */
11
+ export declare function getTokenValue(path: string, tokens: ThemeTokens): string | undefined;
12
+ /**
13
+ * 把字符串中的 `{{tokenPath}}` 引用替换为对应的 token 值。
14
+ * 未匹配到的 token 替换为空字符串(便于上游校验发现非法引用)。
15
+ * 无法被识别的非 token 文本原样保留。
16
+ */
17
+ export declare function resolveTokenReferences(value: string, tokens: ThemeTokens): string;
18
+ /** 判断一个字符串中是否包含 token 引用。 */
19
+ export declare function hasTokenReferences(value: string): boolean;
20
+ //# sourceMappingURL=tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC9C,kCAAkC;AAClC,eAAO,MAAM,WAAW,iGAOd,CAAA;AAEV,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;AAEpD,sDAAsD;AACtD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAUnF;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,WAAW,GAClB,MAAM,CAMR;AAED,6BAA6B;AAC7B,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEzD"}
package/dist/tokens.js ADDED
@@ -0,0 +1,46 @@
1
+ /**
2
+ * 主题 token 系统。
3
+ * block 声明里的值可用 `{{tokenPath}}` 引用 tokens 中的设计变量,例如 `{{primaryColor}}`、
4
+ * `{{spacing.block}}`。编译 / 校验时统一解析。
5
+ */
6
+ /** 允许被 `{{...}}` 引用的 token 路径。 */
7
+ export const TOKEN_PATHS = [
8
+ 'primaryColor',
9
+ 'textColor',
10
+ 'fontSize',
11
+ 'lineHeight',
12
+ 'fontFamily',
13
+ 'spacing.block',
14
+ ];
15
+ /** 从 tokens 中取一个路径的值,返回字符串或 undefined(不存在 / 非字符串)。 */
16
+ export function getTokenValue(path, tokens) {
17
+ const parts = path.split('.');
18
+ let cur = tokens;
19
+ for (const part of parts) {
20
+ if (cur === null || cur === undefined || typeof cur !== 'object')
21
+ return undefined;
22
+ cur = cur[part];
23
+ }
24
+ if (typeof cur === 'string')
25
+ return cur;
26
+ if (typeof cur === 'number')
27
+ return String(cur);
28
+ return undefined;
29
+ }
30
+ /**
31
+ * 把字符串中的 `{{tokenPath}}` 引用替换为对应的 token 值。
32
+ * 未匹配到的 token 替换为空字符串(便于上游校验发现非法引用)。
33
+ * 无法被识别的非 token 文本原样保留。
34
+ */
35
+ export function resolveTokenReferences(value, tokens) {
36
+ const tokenRegex = /\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g;
37
+ return value.replace(tokenRegex, (full, path) => {
38
+ const resolved = getTokenValue(path, tokens);
39
+ return resolved ?? '';
40
+ });
41
+ }
42
+ /** 判断一个字符串中是否包含 token 引用。 */
43
+ export function hasTokenReferences(value) {
44
+ return /\{\{\s*[a-zA-Z0-9_.]+\s*\}\}/.test(value);
45
+ }
46
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,kCAAkC;AAClC,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,cAAc;IACd,WAAW;IACX,UAAU;IACV,YAAY;IACZ,YAAY;IACZ,eAAe;CACP,CAAA;AAIV,sDAAsD;AACtD,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,MAAmB;IAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC7B,IAAI,GAAG,GAAY,MAAM,CAAA;IACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAA;QAClF,GAAG,GAAI,GAA+B,CAAC,IAAI,CAAC,CAAA;IAC9C,CAAC;IACD,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAA;IACvC,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAA;IAC/C,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAAa,EACb,MAAmB;IAEnB,MAAM,UAAU,GAAG,iCAAiC,CAAA;IACpD,OAAO,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAY,EAAE,EAAE;QACtD,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QAC5C,OAAO,QAAQ,IAAI,EAAE,CAAA;IACvB,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,6BAA6B;AAC7B,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,OAAO,8BAA8B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AACnD,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { Theme } from './schema.js';
2
+ export interface ThemeIssue {
3
+ path: string;
4
+ message: string;
5
+ }
6
+ export interface ThemeValidationResult {
7
+ ok: boolean;
8
+ theme?: Theme;
9
+ issues: ThemeIssue[];
10
+ }
11
+ /**
12
+ * 校验一个未知输入是否为合法、微信兼容的主题。
13
+ * 返回结构化结果:ok 为 true 时给出通过校验后的 theme。
14
+ */
15
+ export declare function validateTheme(input: unknown): ThemeValidationResult;
16
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAExC,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,OAAO,CAAA;IACX,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,MAAM,EAAE,UAAU,EAAE,CAAA;CACrB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,qBAAqB,CAUnE"}
@@ -0,0 +1,17 @@
1
+ import { themeSchema } from './schema.js';
2
+ /**
3
+ * 校验一个未知输入是否为合法、微信兼容的主题。
4
+ * 返回结构化结果:ok 为 true 时给出通过校验后的 theme。
5
+ */
6
+ export function validateTheme(input) {
7
+ const result = themeSchema.safeParse(input);
8
+ if (result.success) {
9
+ return { ok: true, theme: result.data, issues: [] };
10
+ }
11
+ const issues = result.error.issues.map((issue) => ({
12
+ path: issue.path.join('.') || '(root)',
13
+ message: issue.message,
14
+ }));
15
+ return { ok: false, issues };
16
+ }
17
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAczC;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IAC3C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;IACrD,CAAC;IACD,MAAM,MAAM,GAAiB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC/D,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ;QACtC,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC,CAAC,CAAA;IACH,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;AAC9B,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * WeMD 主题移植(自动生成自 tenngoxars/WeMD 的 CSS 主题)。
3
+ * 已转换为 stylewx 的结构化 Theme(tokens + blocks),只保留微信白名单内属性。
4
+ * 样式为近似的「视觉迁移」:无法 1:1 还原 WeMD 的 class/flex/box-shadow 等微信会过滤的特性。
5
+ */
6
+ import type { Theme } from './schema.js';
7
+ export declare const WEMD_THEMES: Theme[];
8
+ //# sourceMappingURL=wemd-presets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wemd-presets.d.ts","sourceRoot":"","sources":["../src/wemd-presets.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAExC,eAAO,MAAM,WAAW,EAAE,KAAK,EA+zE9B,CAAA"}