@omnific/atelier 0.1.0 → 0.2.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 (46) hide show
  1. package/README.md +10 -1
  2. package/dist/box/Box.d.ts +7 -0
  3. package/dist/box/Box.js +28 -0
  4. package/dist/box/constants.js +8 -0
  5. package/dist/box/index.d.ts +3 -0
  6. package/dist/box/index.js +2 -0
  7. package/dist/box/types.d.ts +48 -0
  8. package/dist/button/Button.js +1 -1
  9. package/dist/button/LoadingIcon.js +1 -1
  10. package/dist/main.d.ts +4 -1
  11. package/dist/main.js +2 -1
  12. package/dist/styles.css +76 -80
  13. package/dist/system/create-system.d.ts +9 -0
  14. package/dist/system/create-system.js +21 -0
  15. package/dist/system/css-vars.d.ts +52 -0
  16. package/dist/system/css-vars.js +112 -0
  17. package/dist/system/default-system.d.ts +7 -0
  18. package/dist/system/default-system.js +9 -0
  19. package/dist/system/defaults/colors.d.ts +181 -0
  20. package/dist/system/defaults/colors.js +68 -0
  21. package/dist/system/defaults/control-heights.d.ts +16 -0
  22. package/dist/system/defaults/control-heights.js +11 -0
  23. package/dist/system/defaults/focus-rings.d.ts +10 -0
  24. package/dist/system/defaults/focus-rings.js +7 -0
  25. package/dist/system/defaults/font-sizes.d.ts +13 -0
  26. package/dist/system/defaults/font-sizes.js +10 -0
  27. package/dist/system/defaults/fonts.d.ts +10 -0
  28. package/dist/system/defaults/fonts.js +7 -0
  29. package/dist/system/defaults/index.d.ts +422 -0
  30. package/dist/system/defaults/index.js +28 -0
  31. package/dist/system/defaults/radii.d.ts +40 -0
  32. package/dist/system/defaults/radii.js +19 -0
  33. package/dist/system/defaults/shadows.d.ts +31 -0
  34. package/dist/system/defaults/shadows.js +16 -0
  35. package/dist/system/defaults/spacing.d.ts +112 -0
  36. package/dist/system/defaults/spacing.js +43 -0
  37. package/dist/system/define-tokens.d.ts +7 -0
  38. package/dist/system/define-tokens.js +7 -0
  39. package/dist/system/index.d.ts +17 -0
  40. package/dist/system/index.js +16 -0
  41. package/dist/system/merge-tokens.d.ts +20 -0
  42. package/dist/system/merge-tokens.js +27 -0
  43. package/dist/system/types.d.ts +73 -0
  44. package/dist/system/use-theme.d.ts +31 -0
  45. package/dist/system/use-theme.js +39 -0
  46. package/package.json +13 -3
@@ -0,0 +1,43 @@
1
+ //#region system/defaults/spacing.ts
2
+ /**
3
+ * 默认间距 scale(对齐 Chakra,值为 px)。
4
+ */
5
+ const spacing = {
6
+ 0: { value: "0" },
7
+ .5: { value: "2px" },
8
+ 1: { value: "4px" },
9
+ 1.5: { value: "6px" },
10
+ 2: { value: "8px" },
11
+ 2.5: { value: "10px" },
12
+ 3: { value: "12px" },
13
+ 3.5: { value: "14px" },
14
+ 4: { value: "16px" },
15
+ 4.5: { value: "18px" },
16
+ 5: { value: "20px" },
17
+ 6: { value: "24px" },
18
+ 7: { value: "28px" },
19
+ 8: { value: "32px" },
20
+ 9: { value: "36px" },
21
+ 10: { value: "40px" },
22
+ 11: { value: "44px" },
23
+ 12: { value: "48px" },
24
+ 14: { value: "56px" },
25
+ 16: { value: "64px" },
26
+ 20: { value: "80px" },
27
+ 24: { value: "96px" },
28
+ 28: { value: "112px" },
29
+ 32: { value: "128px" },
30
+ 36: { value: "144px" },
31
+ 40: { value: "160px" },
32
+ 44: { value: "176px" },
33
+ 48: { value: "192px" },
34
+ 52: { value: "208px" },
35
+ 56: { value: "224px" },
36
+ 60: { value: "240px" },
37
+ 64: { value: "256px" },
38
+ 72: { value: "288px" },
39
+ 80: { value: "320px" },
40
+ 96: { value: "384px" }
41
+ };
42
+ //#endregion
43
+ export { spacing };
@@ -0,0 +1,7 @@
1
+ import { ThemeTokens } from "./types.js";
2
+ //#region system/define-tokens.d.ts
3
+ /**
4
+ * 标注并返回 tokens 对象,保留字面量键供类型推导。
5
+ */
6
+ export declare const defineTokens: <const T extends ThemeTokens>(tokens: T) => T;
7
+ //#endregion
@@ -0,0 +1,7 @@
1
+ //#region system/define-tokens.ts
2
+ /**
3
+ * 标注并返回 tokens 对象,保留字面量键供类型推导。
4
+ */
5
+ const defineTokens = (tokens) => tokens;
6
+ //#endregion
7
+ export { defineTokens };
@@ -0,0 +1,17 @@
1
+ import { SystemContext, ThemeTokens, TokenCategory, TokenCategoryKeys, TokenNode } from "./types.js";
2
+ import { createSystem } from "./create-system.js";
3
+ import { TokenStyleEntry, applyCssVars, styleFromTokens, toCssVarName } from "./css-vars.js";
4
+ import { defaultSystem } from "./default-system.js";
5
+ import { colors } from "./defaults/colors.js";
6
+ import { controlHeights } from "./defaults/control-heights.js";
7
+ import { focusRings } from "./defaults/focus-rings.js";
8
+ import { fontSizes } from "./defaults/font-sizes.js";
9
+ import { fonts } from "./defaults/fonts.js";
10
+ import { radii } from "./defaults/radii.js";
11
+ import { shadows } from "./defaults/shadows.js";
12
+ import { spacing } from "./defaults/spacing.js";
13
+ import { ColorToken, ControlHeightToken, FocusRingToken, FontSizeToken, FontToken, RadiiToken, ShadowToken, SpacingToken, defaultConfig } from "./defaults/index.js";
14
+ import { defineTokens } from "./define-tokens.js";
15
+ import { MergeTokensResult, mergeTokens } from "./merge-tokens.js";
16
+ import { useTheme } from "./use-theme.js";
17
+ export { type ColorToken, type ControlHeightToken, type FocusRingToken, type FontSizeToken, type FontToken, type MergeTokensResult, type RadiiToken, type ShadowToken, type SpacingToken, type SystemContext, type ThemeTokens, type TokenCategory, type TokenCategoryKeys, type TokenNode, type TokenStyleEntry, applyCssVars, colors, controlHeights, createSystem, defaultConfig, defaultSystem, defineTokens, focusRings, fontSizes, fonts, mergeTokens, radii, shadows, spacing, styleFromTokens, toCssVarName, useTheme };
@@ -0,0 +1,16 @@
1
+ import { applyCssVars, styleFromTokens, toCssVarName } from "./css-vars.js";
2
+ import { mergeTokens } from "./merge-tokens.js";
3
+ import { createSystem } from "./create-system.js";
4
+ import { colors } from "./defaults/colors.js";
5
+ import { controlHeights } from "./defaults/control-heights.js";
6
+ import { focusRings } from "./defaults/focus-rings.js";
7
+ import { fontSizes } from "./defaults/font-sizes.js";
8
+ import { fonts } from "./defaults/fonts.js";
9
+ import { radii } from "./defaults/radii.js";
10
+ import { shadows } from "./defaults/shadows.js";
11
+ import { spacing } from "./defaults/spacing.js";
12
+ import { defineTokens } from "./define-tokens.js";
13
+ import { defaultConfig } from "./defaults/index.js";
14
+ import { defaultSystem } from "./default-system.js";
15
+ import { useTheme } from "./use-theme.js";
16
+ export { applyCssVars, colors, controlHeights, createSystem, defaultConfig, defaultSystem, defineTokens, focusRings, fontSizes, fonts, mergeTokens, radii, shadows, spacing, styleFromTokens, toCssVarName, useTheme };
@@ -0,0 +1,20 @@
1
+ import { ThemeTokens } from "./types.js";
2
+ //#region system/merge-tokens.d.ts
3
+ /**
4
+ * 合并 tokens 后的结果,含 CSS 变量表。
5
+ */
6
+ export type MergeTokensResult = {
7
+ /**
8
+ * 合并后的 tokens。
9
+ */
10
+ tokens: ThemeTokens;
11
+ /**
12
+ * 已冻结的 CSS 变量表。
13
+ */
14
+ cssVars: Readonly<Record<string, string>>;
15
+ };
16
+ /**
17
+ * 按传入顺序浅合并 token set,后写入覆盖同名键,并同步生成扁平 `cssVars`。
18
+ */
19
+ export declare const mergeTokens: (...tokenSets: ThemeTokens[]) => MergeTokensResult;
20
+ //#endregion
@@ -0,0 +1,27 @@
1
+ import { toCssVarName } from "./css-vars.js";
2
+ import { hasValue, isNil } from "@omnific/utils";
3
+ //#region system/merge-tokens.ts
4
+ /**
5
+ * 按传入顺序浅合并 token set,后写入覆盖同名键,并同步生成扁平 `cssVars`。
6
+ */
7
+ const mergeTokens = (...tokenSets) => {
8
+ const tokens = {};
9
+ const cssVars = {};
10
+ for (const next of tokenSets) for (const category of Object.keys(next)) {
11
+ const entries = next[category];
12
+ if (isNil(entries)) continue;
13
+ const current = tokens[category];
14
+ if (hasValue(current)) Object.assign(current, entries);
15
+ else tokens[category] = Object.assign({}, entries);
16
+ for (const [key, node] of Object.entries(entries)) {
17
+ if (isNil(node)) continue;
18
+ cssVars[toCssVarName(category, key)] = node.value;
19
+ }
20
+ }
21
+ return {
22
+ tokens,
23
+ cssVars: Object.freeze(cssVars)
24
+ };
25
+ };
26
+ //#endregion
27
+ export { mergeTokens };
@@ -0,0 +1,73 @@
1
+ //#region system/types.d.ts
2
+ /**
3
+ * 单个 token 节点。
4
+ */
5
+ export type TokenNode = {
6
+ /**
7
+ * CSS 值。
8
+ */
9
+ value: string;
10
+ };
11
+ /**
12
+ * 一类 token;键可用 `bg.muted` 这类带点路径段。
13
+ */
14
+ export type TokenCategory = Record<string, TokenNode>;
15
+ /**
16
+ * 从具体 token 分类对象推导可用键的联合类型。
17
+ */
18
+ export type TokenCategoryKeys<T> = keyof T & (string | number);
19
+ /**
20
+ * 主题 tokens。
21
+ */
22
+ export type ThemeTokens = {
23
+ /**
24
+ * 颜色 token。
25
+ */
26
+ colors?: TokenCategory;
27
+ /**
28
+ * 间距 token。
29
+ */
30
+ spacing?: TokenCategory;
31
+ /**
32
+ * 圆角 token。
33
+ */
34
+ radii?: TokenCategory;
35
+ /**
36
+ * 阴影 token。
37
+ */
38
+ shadows?: TokenCategory;
39
+ /**
40
+ * 字体族 token。
41
+ */
42
+ fonts?: TokenCategory;
43
+ /**
44
+ * 字号 token。
45
+ */
46
+ fontSizes?: TokenCategory;
47
+ /**
48
+ * 控件高度 token。
49
+ */
50
+ controlHeights?: TokenCategory;
51
+ /**
52
+ * 焦点环 token。
53
+ */
54
+ focusRings?: TokenCategory;
55
+ };
56
+ /**
57
+ * 精简版 SystemContext;实例只描述运行时主题能力,不携带具体 tokens 泛型。
58
+ */
59
+ export type SystemContext = {
60
+ /**
61
+ * 主题名称;同名 system 在注入时复用同一张 `<style>`。
62
+ */
63
+ name: string;
64
+ /**
65
+ * 合并后的 tokens。
66
+ */
67
+ _config: ThemeTokens;
68
+ /**
69
+ * 已缓存的扁平 CSS 变量表(变量名 → 值)。
70
+ */
71
+ cssVars: Readonly<Record<string, string>>;
72
+ };
73
+ //#endregion
@@ -0,0 +1,31 @@
1
+ import { SystemContext } from "./types.js";
2
+ import { RefObject } from "react";
3
+ //#region system/use-theme.d.ts
4
+ /**
5
+ * 将 `system.cssVars` 运行时注入到 DOM。
6
+ *
7
+ * 返回对象 ref:
8
+ * - 挂到元素上时,给该节点打上 `data-atelier-theme={system.name}`;
9
+ * - 未挂载(`ref.current === null`)时,变量写在 `document.documentElement`(同样打上该属性)。
10
+ *
11
+ * 样式节点统一挂在 `document.head` 下;同一 `system.name` 复用一张 `<style>`,以引用次数管理生命周期。
12
+ * 不使用 inline style / React Context。
13
+ *
14
+ * @example
15
+ * ```tsx
16
+ * const system = createSystem('app', defaultConfig);
17
+ *
18
+ * function App() {
19
+ * const themeRef = useTheme<HTMLDivElement>(system);
20
+ * return <div ref={themeRef}>...</div>;
21
+ * }
22
+ *
23
+ * // 或不挂 ref,自动注册到 documentElement
24
+ * function App() {
25
+ * useTheme(system);
26
+ * return <div>...</div>;
27
+ * }
28
+ * ```
29
+ */
30
+ export declare const useTheme: <TElement extends HTMLElement = HTMLElement>(system: SystemContext) => RefObject<TElement | null>;
31
+ //#endregion
@@ -0,0 +1,39 @@
1
+ import { applyCssVars } from "./css-vars.js";
2
+ import { useLayoutEffect, useRef } from "react";
3
+ //#region system/use-theme.ts
4
+ /**
5
+ * 将 `system.cssVars` 运行时注入到 DOM。
6
+ *
7
+ * 返回对象 ref:
8
+ * - 挂到元素上时,给该节点打上 `data-atelier-theme={system.name}`;
9
+ * - 未挂载(`ref.current === null`)时,变量写在 `document.documentElement`(同样打上该属性)。
10
+ *
11
+ * 样式节点统一挂在 `document.head` 下;同一 `system.name` 复用一张 `<style>`,以引用次数管理生命周期。
12
+ * 不使用 inline style / React Context。
13
+ *
14
+ * @example
15
+ * ```tsx
16
+ * const system = createSystem('app', defaultConfig);
17
+ *
18
+ * function App() {
19
+ * const themeRef = useTheme<HTMLDivElement>(system);
20
+ * return <div ref={themeRef}>...</div>;
21
+ * }
22
+ *
23
+ * // 或不挂 ref,自动注册到 documentElement
24
+ * function App() {
25
+ * useTheme(system);
26
+ * return <div>...</div>;
27
+ * }
28
+ * ```
29
+ */
30
+ const useTheme = (system) => {
31
+ const ref = useRef(null);
32
+ useLayoutEffect(() => {
33
+ const target = ref.current ?? document.documentElement;
34
+ return applyCssVars(system, target);
35
+ }, [system]);
36
+ return ref;
37
+ };
38
+ //#endregion
39
+ export { useTheme };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@omnific/atelier",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "A refined React component library for Omnific",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -27,6 +27,11 @@
27
27
  "import": "./dist/main.js",
28
28
  "default": "./dist/main.js"
29
29
  },
30
+ "./box": {
31
+ "types": "./dist/box/index.d.ts",
32
+ "import": "./dist/box/index.js",
33
+ "default": "./dist/box/index.js"
34
+ },
30
35
  "./button": {
31
36
  "types": "./dist/button/index.d.ts",
32
37
  "import": "./dist/button/index.js",
@@ -37,6 +42,11 @@
37
42
  "import": "./dist/transition/index.js",
38
43
  "default": "./dist/transition/index.js"
39
44
  },
45
+ "./system": {
46
+ "types": "./dist/system/index.d.ts",
47
+ "import": "./dist/system/index.js",
48
+ "default": "./dist/system/index.js"
49
+ },
40
50
  "./styles.css": {
41
51
  "default": "./dist/styles.css"
42
52
  }
@@ -64,10 +74,10 @@
64
74
  "@omnific/tsconfig": "0.2.0",
65
75
  "@types/react": "^19.3.0",
66
76
  "@types/react-dom": "^19.3.0",
67
- "motion": "^13.4.0",
77
+ "motion": "^13.4.4",
68
78
  "react": "^19.3.0",
69
79
  "react-dom": "^19.3.0",
70
- "sass-embedded": "1.104.1"
80
+ "sass-embedded": "1.105.0"
71
81
  },
72
82
  "scripts": {
73
83
  "dev": "pnpm --dir ../.. storybook",