@trustbaseai/shop-ui 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 (75) hide show
  1. package/README.md +191 -0
  2. package/dist/base.d.ts +79 -0
  3. package/dist/base.d.ts.map +1 -0
  4. package/dist/base.js +149 -0
  5. package/dist/base.js.map +1 -0
  6. package/dist/components/account-panel.d.ts +44 -0
  7. package/dist/components/account-panel.d.ts.map +1 -0
  8. package/dist/components/account-panel.js +144 -0
  9. package/dist/components/account-panel.js.map +1 -0
  10. package/dist/components/goods-detail.d.ts +58 -0
  11. package/dist/components/goods-detail.d.ts.map +1 -0
  12. package/dist/components/goods-detail.js +232 -0
  13. package/dist/components/goods-detail.js.map +1 -0
  14. package/dist/components/goods-list.d.ts +43 -0
  15. package/dist/components/goods-list.d.ts.map +1 -0
  16. package/dist/components/goods-list.js +104 -0
  17. package/dist/components/goods-list.js.map +1 -0
  18. package/dist/components/order-form.d.ts +87 -0
  19. package/dist/components/order-form.d.ts.map +1 -0
  20. package/dist/components/order-form.js +222 -0
  21. package/dist/components/order-form.js.map +1 -0
  22. package/dist/esm/base.d.ts +79 -0
  23. package/dist/esm/base.d.ts.map +1 -0
  24. package/dist/esm/base.js +143 -0
  25. package/dist/esm/base.js.map +1 -0
  26. package/dist/esm/components/account-panel.d.ts +44 -0
  27. package/dist/esm/components/account-panel.d.ts.map +1 -0
  28. package/dist/esm/components/account-panel.js +140 -0
  29. package/dist/esm/components/account-panel.js.map +1 -0
  30. package/dist/esm/components/goods-detail.d.ts +58 -0
  31. package/dist/esm/components/goods-detail.d.ts.map +1 -0
  32. package/dist/esm/components/goods-detail.js +228 -0
  33. package/dist/esm/components/goods-detail.js.map +1 -0
  34. package/dist/esm/components/goods-list.d.ts +43 -0
  35. package/dist/esm/components/goods-list.d.ts.map +1 -0
  36. package/dist/esm/components/goods-list.js +100 -0
  37. package/dist/esm/components/goods-list.js.map +1 -0
  38. package/dist/esm/components/order-form.d.ts +87 -0
  39. package/dist/esm/components/order-form.d.ts.map +1 -0
  40. package/dist/esm/components/order-form.js +218 -0
  41. package/dist/esm/components/order-form.js.map +1 -0
  42. package/dist/esm/format.d.ts +39 -0
  43. package/dist/esm/format.d.ts.map +1 -0
  44. package/dist/esm/format.js +74 -0
  45. package/dist/esm/format.js.map +1 -0
  46. package/dist/esm/index.d.ts +44 -0
  47. package/dist/esm/index.d.ts.map +1 -0
  48. package/dist/esm/index.js +44 -0
  49. package/dist/esm/index.js.map +1 -0
  50. package/dist/esm/package.json +3 -0
  51. package/dist/esm/register.d.ts +33 -0
  52. package/dist/esm/register.d.ts.map +1 -0
  53. package/dist/esm/register.js +44 -0
  54. package/dist/esm/register.js.map +1 -0
  55. package/dist/esm/tokens.d.ts +124 -0
  56. package/dist/esm/tokens.d.ts.map +1 -0
  57. package/dist/esm/tokens.js +184 -0
  58. package/dist/esm/tokens.js.map +1 -0
  59. package/dist/format.d.ts +39 -0
  60. package/dist/format.d.ts.map +1 -0
  61. package/dist/format.js +84 -0
  62. package/dist/format.js.map +1 -0
  63. package/dist/index.d.ts +44 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +84 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/register.d.ts +33 -0
  68. package/dist/register.d.ts.map +1 -0
  69. package/dist/register.js +49 -0
  70. package/dist/register.js.map +1 -0
  71. package/dist/tokens.d.ts +124 -0
  72. package/dist/tokens.d.ts.map +1 -0
  73. package/dist/tokens.js +188 -0
  74. package/dist/tokens.js.map +1 -0
  75. package/package.json +40 -0
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ /**
3
+ * 注册四个自定义元素。
4
+ *
5
+ * 单独一个入口(`@trustbase/shop-ui/register`)的原因:**注册是有副作用的一步**
6
+ * (`customElements.define`),而组件类本身可以安全地被 import(SSR / 测试 / 只取类型)。
7
+ * 宿主想控制注册时机(例如等 tokens 主题就绪、或只想注册用到的那几个)时,
8
+ * 引 `index` 而不调 `registerShopUi()` 即可。
9
+ *
10
+ * `registerShopUi()` 是**幂等**的:重复调用不会抛 `already defined`。
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.TbElement = exports.SHOP_UI_ELEMENTS = void 0;
14
+ exports.registerShopUi = registerShopUi;
15
+ exports.shopUiElementNames = shopUiElementNames;
16
+ const account_panel_js_1 = require("./components/account-panel.js");
17
+ const goods_detail_js_1 = require("./components/goods-detail.js");
18
+ const goods_list_js_1 = require("./components/goods-list.js");
19
+ const order_form_js_1 = require("./components/order-form.js");
20
+ const base_js_1 = require("./base.js");
21
+ Object.defineProperty(exports, "TbElement", { enumerable: true, get: function () { return base_js_1.TbElement; } });
22
+ /** 元素名 → 组件类(元素名是**冻结的契约**:改名字等于破坏宿主的 HTML) */
23
+ exports.SHOP_UI_ELEMENTS = Object.freeze({
24
+ 'tb-goods-list': goods_list_js_1.TbGoodsList,
25
+ 'tb-goods-detail': goods_detail_js_1.TbGoodsDetail,
26
+ 'tb-order-form': order_form_js_1.TbOrderForm,
27
+ 'tb-account-panel': account_panel_js_1.TbAccountPanel,
28
+ });
29
+ /**
30
+ * 注册全部自定义元素(浏览器环境)。
31
+ * 在 Node/SSR 里调用是**安全空操作**(没有 `customElements` 就直接返回),
32
+ * 这样宿主可以无脑在最外层调一次。
33
+ */
34
+ function registerShopUi() {
35
+ const registry = globalThis
36
+ .customElements;
37
+ if (registry === undefined)
38
+ return;
39
+ for (const [tag, ctor] of Object.entries(exports.SHOP_UI_ELEMENTS)) {
40
+ if (registry.get(tag) === undefined) {
41
+ registry.define(tag, ctor);
42
+ }
43
+ }
44
+ }
45
+ /** 已注册的元素名清单(宿主做能力探测/文档用) */
46
+ function shopUiElementNames() {
47
+ return Object.keys(exports.SHOP_UI_ELEMENTS);
48
+ }
49
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AAuBH,wCASC;AAGD,gDAEC;AAnCD,oEAA+D;AAC/D,kEAA6D;AAC7D,8DAAyD;AACzD,8DAAyD;AACzD,uCAAsC;AAiC7B,0FAjCA,mBAAS,OAiCA;AA/BlB,+CAA+C;AAClC,QAAA,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC;IAC5C,eAAe,EAAE,2BAAW;IAC5B,iBAAiB,EAAE,+BAAa;IAChC,eAAe,EAAE,2BAAW;IAC5B,kBAAkB,EAAE,iCAAc;CACnC,CAAC,CAAC;AAIH;;;;GAIG;AACH,SAAgB,cAAc;IAC5B,MAAM,QAAQ,GAAuC,UAAyD;SAC3G,cAAc,CAAC;IAClB,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO;IACnC,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,wBAAgB,CAAC,EAAE,CAAC;QAC3D,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YACpC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,IAA2C,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;AACH,CAAC;AAED,6BAA6B;AAC7B,SAAgB,kBAAkB;IAChC,OAAO,MAAM,CAAC,IAAI,CAAC,wBAAgB,CAAgB,CAAC;AACtD,CAAC"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Design tokens —— 本包**唯一允许出现视觉字面量的地方**。
3
+ *
4
+ * ## 出处
5
+ *
6
+ * 《TrustBase-设计风格规范-2026-09-22》§1「视觉 tokens(只允许用这些值,禁止魔法值)」:
7
+ *
8
+ * | 类别 | 规范要求 | 本文件对应 |
9
+ * |---|---|---|
10
+ * | 主色 | 1 个(默认 `#1D1D1F` 文字 / `#FFFFFF` 底 / `#F5F5F7` 分区底) | `color.text/background/surface` |
11
+ * | 强调色 | 1 个,只用于主操作与选中态(如 `#C4633C`) | `color.accent` |
12
+ * | 语义色 | 成功/警告/错误各 1 个,**只用于状态**不做装饰 | `color.success/warning/danger` |
13
+ * | 灰阶 | ≤ 5 级(`1D1D1F / 6E6E73 / 8E8E93 / C7C7CC / E5E5EA`) | `gray` |
14
+ * | 字号 | ≤ 5 级:34 / 22 / 17 / 15 / 13(正文 17,次要 15,注释 13) | `fontSize` |
15
+ * | 字重 | 只用 400 / 600 | `fontWeight` |
16
+ * | 行高 | 固定 1.5(标题 1.2) | `lineHeight` |
17
+ * | 圆角 | 只用 3 种:卡片 16 / 控件 10 / 小标签 6 | `radius` |
18
+ * | 间距 | 8pt 栅格:4 / 8 / 12 / 16 / 24 / 32 / 48 | `space` |
19
+ * | 描边或阴影 | **二选一,绝不叠加**;阴影只用一层极淡 | `border.width` / `shadow.card` |
20
+ * | 动效 | ≤ 200ms,`ease-out`,只用于状态变化 | `motion` |
21
+ *
22
+ * ## 落地方式(规范 §1「tokens 必须是代码里的唯一来源」)
23
+ *
24
+ * - `TOKENS` 是**扁平的 CSS 变量表**(`--tb-*` → 值),组件样式只能写 `var(--tb-*)`。
25
+ * - 每个组件把 tokens 注入自己的 shadow root(`:host{...}`),所以组件是**自带主题**的,
26
+ * 不依赖宿主页面先引一份全局 CSS。
27
+ * - `test/tokens.test.ts` 逐条断言上表的数字;`test/styles.test.ts` 断言组件样式里
28
+ * **没有** `#hex` / `rgb()` / `13px` / `200ms` 这类字面量,且用到的变量都已定义。
29
+ *
30
+ * ⚠️ 规范里没写死的两处(本文件是唯一来源,改这里就是改全套界面):
31
+ * 1. **语义色具体色值**(规范只要求"各 1 个、只用于状态")—— v0 取值见 `color.success/warning/danger`;
32
+ * 2. **描边宽度 1px**(规范说了"描边或阴影二选一",没给宽度)。
33
+ */
34
+ /** 灰阶(**恰好 5 级**,值与规范逐一相同;多一级就会被 tokens 测试拦下) */
35
+ export declare const gray: {
36
+ readonly 900: "#1D1D1F";
37
+ readonly 700: "#6E6E73";
38
+ readonly 500: "#8E8E93";
39
+ readonly 300: "#C7C7CC";
40
+ readonly 100: "#E5E5EA";
41
+ };
42
+ /** 颜色:1 主色系 + 1 强调色 + 3 语义色 */
43
+ export declare const color: {
44
+ readonly text: "#1D1D1F";
45
+ readonly textSecondary: "#6E6E73";
46
+ readonly textTertiary: "#8E8E93";
47
+ readonly border: "#C7C7CC";
48
+ readonly divider: "#E5E5EA";
49
+ readonly background: "#FFFFFF";
50
+ readonly surface: "#F5F5F7";
51
+ readonly accent: "#C4633C";
52
+ readonly onAccent: "#FFFFFF";
53
+ readonly success: "#1D8A5B";
54
+ readonly warning: "#B26A00";
55
+ readonly danger: "#C0392B";
56
+ };
57
+ /** 字号(**恰好 5 级**:标题 34 / 段落标题 22 / 正文 17 / 次要 15 / 注释 13) */
58
+ export declare const fontSize: {
59
+ readonly title: "34px";
60
+ readonly heading: "22px";
61
+ readonly body: "17px";
62
+ readonly secondary: "15px";
63
+ readonly caption: "13px";
64
+ };
65
+ /** 字重(只用两级) */
66
+ export declare const fontWeight: {
67
+ readonly regular: "400";
68
+ readonly semibold: "600";
69
+ };
70
+ /** 行高(固定 1.5,标题 1.2) */
71
+ export declare const lineHeight: {
72
+ readonly title: "1.2";
73
+ readonly body: "1.5";
74
+ };
75
+ /** 圆角(**只用 3 种**) */
76
+ export declare const radius: {
77
+ readonly card: "16px";
78
+ readonly control: "10px";
79
+ readonly tag: "6px";
80
+ };
81
+ /** 间距(8pt 栅格 + 4 的半步) */
82
+ export declare const space: {
83
+ readonly xxs: "4px";
84
+ readonly xs: "8px";
85
+ readonly sm: "12px";
86
+ readonly md: "16px";
87
+ readonly lg: "24px";
88
+ readonly xl: "32px";
89
+ readonly xxl: "48px";
90
+ };
91
+ /** 描边(与阴影**二选一**,不叠加) */
92
+ export declare const border: {
93
+ readonly width: "1px";
94
+ };
95
+ /** 阴影(只有一层,极淡) */
96
+ export declare const shadow: {
97
+ readonly card: "0 2px 8px rgba(0,0,0,.06)";
98
+ };
99
+ /** 动效(≤200ms,ease-out,只用于状态变化) */
100
+ export declare const motion: {
101
+ readonly fast: "120ms";
102
+ readonly base: "200ms";
103
+ readonly easing: "ease-out";
104
+ };
105
+ /** 字体(规范未指定字体族;数字与金额走等宽,见规范 §2.5) */
106
+ export declare const font: {
107
+ readonly family: "-apple-system, BlinkMacSystemFont, \"Segoe UI\", \"PingFang SC\", \"Noto Sans SC\", sans-serif";
108
+ readonly mono: "ui-monospace, SFMono-Regular, Menlo, Consolas, monospace";
109
+ };
110
+ /**
111
+ * 扁平 CSS 变量表(`--tb-*` → 值)。**唯一来源**:组件只允许引用这里的键。
112
+ */
113
+ export declare const TOKENS: Readonly<Record<string, string>>;
114
+ /**
115
+ * tokens → CSS 文本。默认选择器 `:root`(宿主页面全局引一次);
116
+ * 组件内用 `tokensCss(':host')` 注入自己的 shadow root(组件自带主题,互不依赖)。
117
+ */
118
+ export declare function tokensCss(selector?: string): string;
119
+ /** tokens 的 `:root` 版本(宿主页面想在自己的壳层样式里用同一套变量时引它) */
120
+ export declare const TOKENS_CSS: string;
121
+ /** 组件 shadow root 用的 tokens(`:host` + 基础排版重置) */ export declare const HOST_STYLE: string;
122
+ /** 数字与金额用等宽字体(规范 §2.5:数字与金额右对齐、等宽、永远带单位) */
123
+ export declare const AMOUNT_STYLE = "font-family:var(--tb-font-mono);font-variant-numeric:tabular-nums;";
124
+ //# sourceMappingURL=tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,iDAAiD;AACjD,eAAO,MAAM,IAAI;;;;;;CAMP,CAAC;AAEX,+BAA+B;AAC/B,eAAO,MAAM,KAAK;;;;;;;;;;;;;CAaR,CAAC;AAEX,6DAA6D;AAC7D,eAAO,MAAM,QAAQ;;;;;;CAMX,CAAC;AAEX,eAAe;AACf,eAAO,MAAM,UAAU;;;CAGb,CAAC;AAEX,wBAAwB;AACxB,eAAO,MAAM,UAAU;;;CAGb,CAAC;AAEX,qBAAqB;AACrB,eAAO,MAAM,MAAM;;;;CAIT,CAAC;AAEX,yBAAyB;AACzB,eAAO,MAAM,KAAK;;;;;;;;CAQR,CAAC;AAEX,yBAAyB;AACzB,eAAO,MAAM,MAAM;;CAET,CAAC;AAEX,kBAAkB;AAClB,eAAO,MAAM,MAAM;;CAET,CAAC;AAEX,kCAAkC;AAClC,eAAO,MAAM,MAAM;;;;CAIT,CAAC;AAEX,qCAAqC;AACrC,eAAO,MAAM,IAAI;;;CAGP,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAiDlD,CAAC;AAEH;;;GAGG;AACH,wBAAgB,SAAS,CAAC,QAAQ,SAAU,GAAG,MAAM,CAKpD;AAED,mDAAmD;AACnD,eAAO,MAAM,UAAU,QAAqB,CAAC;AAE7C,iDAAiD,CAAA,eAAO,MAAM,UAAU,QAW9D,CAAC;AAEX,4CAA4C;AAC5C,eAAO,MAAM,YAAY,uEAAuE,CAAC"}
package/dist/tokens.js ADDED
@@ -0,0 +1,188 @@
1
+ "use strict";
2
+ /**
3
+ * Design tokens —— 本包**唯一允许出现视觉字面量的地方**。
4
+ *
5
+ * ## 出处
6
+ *
7
+ * 《TrustBase-设计风格规范-2026-09-22》§1「视觉 tokens(只允许用这些值,禁止魔法值)」:
8
+ *
9
+ * | 类别 | 规范要求 | 本文件对应 |
10
+ * |---|---|---|
11
+ * | 主色 | 1 个(默认 `#1D1D1F` 文字 / `#FFFFFF` 底 / `#F5F5F7` 分区底) | `color.text/background/surface` |
12
+ * | 强调色 | 1 个,只用于主操作与选中态(如 `#C4633C`) | `color.accent` |
13
+ * | 语义色 | 成功/警告/错误各 1 个,**只用于状态**不做装饰 | `color.success/warning/danger` |
14
+ * | 灰阶 | ≤ 5 级(`1D1D1F / 6E6E73 / 8E8E93 / C7C7CC / E5E5EA`) | `gray` |
15
+ * | 字号 | ≤ 5 级:34 / 22 / 17 / 15 / 13(正文 17,次要 15,注释 13) | `fontSize` |
16
+ * | 字重 | 只用 400 / 600 | `fontWeight` |
17
+ * | 行高 | 固定 1.5(标题 1.2) | `lineHeight` |
18
+ * | 圆角 | 只用 3 种:卡片 16 / 控件 10 / 小标签 6 | `radius` |
19
+ * | 间距 | 8pt 栅格:4 / 8 / 12 / 16 / 24 / 32 / 48 | `space` |
20
+ * | 描边或阴影 | **二选一,绝不叠加**;阴影只用一层极淡 | `border.width` / `shadow.card` |
21
+ * | 动效 | ≤ 200ms,`ease-out`,只用于状态变化 | `motion` |
22
+ *
23
+ * ## 落地方式(规范 §1「tokens 必须是代码里的唯一来源」)
24
+ *
25
+ * - `TOKENS` 是**扁平的 CSS 变量表**(`--tb-*` → 值),组件样式只能写 `var(--tb-*)`。
26
+ * - 每个组件把 tokens 注入自己的 shadow root(`:host{...}`),所以组件是**自带主题**的,
27
+ * 不依赖宿主页面先引一份全局 CSS。
28
+ * - `test/tokens.test.ts` 逐条断言上表的数字;`test/styles.test.ts` 断言组件样式里
29
+ * **没有** `#hex` / `rgb()` / `13px` / `200ms` 这类字面量,且用到的变量都已定义。
30
+ *
31
+ * ⚠️ 规范里没写死的两处(本文件是唯一来源,改这里就是改全套界面):
32
+ * 1. **语义色具体色值**(规范只要求"各 1 个、只用于状态")—— v0 取值见 `color.success/warning/danger`;
33
+ * 2. **描边宽度 1px**(规范说了"描边或阴影二选一",没给宽度)。
34
+ */
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.AMOUNT_STYLE = exports.HOST_STYLE = exports.TOKENS_CSS = exports.TOKENS = exports.font = exports.motion = exports.shadow = exports.border = exports.space = exports.radius = exports.lineHeight = exports.fontWeight = exports.fontSize = exports.color = exports.gray = void 0;
37
+ exports.tokensCss = tokensCss;
38
+ /** 灰阶(**恰好 5 级**,值与规范逐一相同;多一级就会被 tokens 测试拦下) */
39
+ exports.gray = {
40
+ 900: '#1D1D1F',
41
+ 700: '#6E6E73',
42
+ 500: '#8E8E93',
43
+ 300: '#C7C7CC',
44
+ 100: '#E5E5EA',
45
+ };
46
+ /** 颜色:1 主色系 + 1 强调色 + 3 语义色 */
47
+ exports.color = {
48
+ text: exports.gray[900],
49
+ textSecondary: exports.gray[700],
50
+ textTertiary: exports.gray[500],
51
+ border: exports.gray[300],
52
+ divider: exports.gray[100],
53
+ background: '#FFFFFF',
54
+ surface: '#F5F5F7',
55
+ accent: '#C4633C',
56
+ onAccent: '#FFFFFF',
57
+ success: '#1D8A5B',
58
+ warning: '#B26A00',
59
+ danger: '#C0392B',
60
+ };
61
+ /** 字号(**恰好 5 级**:标题 34 / 段落标题 22 / 正文 17 / 次要 15 / 注释 13) */
62
+ exports.fontSize = {
63
+ title: '34px',
64
+ heading: '22px',
65
+ body: '17px',
66
+ secondary: '15px',
67
+ caption: '13px',
68
+ };
69
+ /** 字重(只用两级) */
70
+ exports.fontWeight = {
71
+ regular: '400',
72
+ semibold: '600',
73
+ };
74
+ /** 行高(固定 1.5,标题 1.2) */
75
+ exports.lineHeight = {
76
+ title: '1.2',
77
+ body: '1.5',
78
+ };
79
+ /** 圆角(**只用 3 种**) */
80
+ exports.radius = {
81
+ card: '16px',
82
+ control: '10px',
83
+ tag: '6px',
84
+ };
85
+ /** 间距(8pt 栅格 + 4 的半步) */
86
+ exports.space = {
87
+ xxs: '4px',
88
+ xs: '8px',
89
+ sm: '12px',
90
+ md: '16px',
91
+ lg: '24px',
92
+ xl: '32px',
93
+ xxl: '48px',
94
+ };
95
+ /** 描边(与阴影**二选一**,不叠加) */
96
+ exports.border = {
97
+ width: '1px',
98
+ };
99
+ /** 阴影(只有一层,极淡) */
100
+ exports.shadow = {
101
+ card: '0 2px 8px rgba(0,0,0,.06)',
102
+ };
103
+ /** 动效(≤200ms,ease-out,只用于状态变化) */
104
+ exports.motion = {
105
+ fast: '120ms',
106
+ base: '200ms',
107
+ easing: 'ease-out',
108
+ };
109
+ /** 字体(规范未指定字体族;数字与金额走等宽,见规范 §2.5) */
110
+ exports.font = {
111
+ family: '-apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Noto Sans SC", sans-serif',
112
+ mono: 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',
113
+ };
114
+ /**
115
+ * 扁平 CSS 变量表(`--tb-*` → 值)。**唯一来源**:组件只允许引用这里的键。
116
+ */
117
+ exports.TOKENS = Object.freeze({
118
+ '--tb-gray-900': exports.gray[900],
119
+ '--tb-gray-700': exports.gray[700],
120
+ '--tb-gray-500': exports.gray[500],
121
+ '--tb-gray-300': exports.gray[300],
122
+ '--tb-gray-100': exports.gray[100],
123
+ '--tb-color-text': exports.color.text,
124
+ '--tb-color-text-secondary': exports.color.textSecondary,
125
+ '--tb-color-text-tertiary': exports.color.textTertiary,
126
+ '--tb-color-border': exports.color.border,
127
+ '--tb-color-divider': exports.color.divider,
128
+ '--tb-color-background': exports.color.background,
129
+ '--tb-color-surface': exports.color.surface,
130
+ '--tb-color-accent': exports.color.accent,
131
+ '--tb-color-on-accent': exports.color.onAccent,
132
+ '--tb-color-success': exports.color.success,
133
+ '--tb-color-warning': exports.color.warning,
134
+ '--tb-color-danger': exports.color.danger,
135
+ '--tb-font-family': exports.font.family,
136
+ '--tb-font-mono': exports.font.mono,
137
+ '--tb-font-size-title': exports.fontSize.title,
138
+ '--tb-font-size-heading': exports.fontSize.heading,
139
+ '--tb-font-size-body': exports.fontSize.body,
140
+ '--tb-font-size-secondary': exports.fontSize.secondary,
141
+ '--tb-font-size-caption': exports.fontSize.caption,
142
+ '--tb-font-weight-regular': exports.fontWeight.regular,
143
+ '--tb-font-weight-semibold': exports.fontWeight.semibold,
144
+ '--tb-line-height-title': exports.lineHeight.title,
145
+ '--tb-line-height-body': exports.lineHeight.body,
146
+ '--tb-radius-card': exports.radius.card,
147
+ '--tb-radius-control': exports.radius.control,
148
+ '--tb-radius-tag': exports.radius.tag,
149
+ '--tb-space-xxs': exports.space.xxs,
150
+ '--tb-space-xs': exports.space.xs,
151
+ '--tb-space-sm': exports.space.sm,
152
+ '--tb-space-md': exports.space.md,
153
+ '--tb-space-lg': exports.space.lg,
154
+ '--tb-space-xl': exports.space.xl,
155
+ '--tb-space-xxl': exports.space.xxl,
156
+ '--tb-border-width': exports.border.width,
157
+ '--tb-shadow-card': exports.shadow.card,
158
+ '--tb-motion-fast': exports.motion.fast,
159
+ '--tb-motion-base': exports.motion.base,
160
+ '--tb-motion-easing': exports.motion.easing,
161
+ });
162
+ /**
163
+ * tokens → CSS 文本。默认选择器 `:root`(宿主页面全局引一次);
164
+ * 组件内用 `tokensCss(':host')` 注入自己的 shadow root(组件自带主题,互不依赖)。
165
+ */
166
+ function tokensCss(selector = ':root') {
167
+ const declarations = Object.entries(exports.TOKENS)
168
+ .map(([name, value]) => `${name}:${value};`)
169
+ .join('');
170
+ return `${selector}{${declarations}}`;
171
+ }
172
+ /** tokens 的 `:root` 版本(宿主页面想在自己的壳层样式里用同一套变量时引它) */
173
+ exports.TOKENS_CSS = tokensCss(':root');
174
+ /** 组件 shadow root 用的 tokens(`:host` + 基础排版重置) */ exports.HOST_STYLE = [
175
+ tokensCss(':host'),
176
+ ':host{display:block;color:var(--tb-color-text);background:var(--tb-color-background);',
177
+ 'font-family:var(--tb-font-family);font-size:var(--tb-font-size-body);',
178
+ 'line-height:var(--tb-line-height-body);font-weight:var(--tb-font-weight-regular);',
179
+ '-webkit-font-smoothing:antialiased;}',
180
+ '*,*::before,*::after{box-sizing:border-box;}',
181
+ 'button{font:inherit;color:inherit;cursor:pointer;}',
182
+ 'input,textarea,select{font:inherit;color:inherit;}',
183
+ 'ul{margin:0;padding:0;list-style:none;}',
184
+ 'p{margin:0;}',
185
+ ].join('');
186
+ /** 数字与金额用等宽字体(规范 §2.5:数字与金额右对齐、等宽、永远带单位) */
187
+ exports.AMOUNT_STYLE = 'font-family:var(--tb-font-mono);font-variant-numeric:tabular-nums;';
188
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@trustbaseai/shop-ui",
3
+ "version": "0.1.0",
4
+ "description": "TrustBase 店铺界面组件(框架无关 Web Components):商品列表 / 商品详情与规格选择 / 下单表单 / 我的账户;样式只引用 design tokens,零运行时依赖,不持私钥不签名",
5
+ "license": "MIT",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "files": [
9
+ "dist",
10
+ "README.md"
11
+ ],
12
+ "sideEffects": [
13
+ "./dist/register.js",
14
+ "./src/register.ts"
15
+ ],
16
+ "engines": {
17
+ "node": ">=20"
18
+ },
19
+ "publishConfig": {
20
+ "access": "public"
21
+ },
22
+ "keywords": [
23
+ "trustbase",
24
+ "shop",
25
+ "web-components",
26
+ "custom-elements",
27
+ "design-tokens",
28
+ "pwa"
29
+ ],
30
+ "scripts": {
31
+ "build": "tsc -p tsconfig.build.json && tsc -p tsconfig.build.esm.json && node tools/write-esm-package.cjs",
32
+ "test": "jest",
33
+ "typecheck": "tsc -p tsconfig.json --noEmit",
34
+ "serve:demo": "node tools/serve-demo.cjs",
35
+ "clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\""
36
+ },
37
+ "devDependencies": {
38
+ "jest-environment-jsdom": "^30.5.2"
39
+ }
40
+ }