@skopon-cool/form-sdk 0.1.8 → 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.
@@ -0,0 +1,7 @@
1
+ import type { ThemeConfig } from 'antd';
2
+ /**
3
+ * Ant Design 主题映射(与 design/ui/UI规范.md §2.4、§2.5 一致)
4
+ * 品牌主色 hex 仅来自 ./brand-colors.ts
5
+ */
6
+ export declare const antdTheme: ThemeConfig;
7
+ //# sourceMappingURL=antd-theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"antd-theme.d.ts","sourceRoot":"","sources":["../../src/theme/antd-theme.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AAGvC;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,WAqFvB,CAAA"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * 品牌墨绿(Jade)唯一 hex 源
3
+ * CSS 侧通过 Radix --jade-* / 语义变量 --color-* 引用;Ant Design 从此文件同步
4
+ * 规范:front/design/ui/UI规范.md §2.2、§2.5
5
+ */
6
+ export declare const brandColors: {
7
+ readonly jade9: "#29a383";
8
+ readonly jade10: "#26997b";
9
+ readonly jade11: "#208368";
10
+ readonly jade12: "#1d3b31";
11
+ /** 链接、边框、Logo 图形、实心底(与 primarySolid 同色) */
12
+ readonly primary: "#208368";
13
+ /** Primary 实心按钮、Sider 胶囊、发布等 type="primary" */
14
+ readonly primarySolid: "#208368";
15
+ readonly primaryHover: "#26997b";
16
+ readonly primaryActive: "#1d3b31";
17
+ readonly onPrimary: "#ffffff";
18
+ };
19
+ //# sourceMappingURL=brand-colors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand-colors.d.ts","sourceRoot":"","sources":["../../src/theme/brand-colors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,WAAW;;;;;IAKtB,2CAA2C;;IAE3C,+CAA+C;;;;;CAKvC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "0.1.8",
6
+ "version": "0.2.0",
7
7
  "description": "Skopon form rendering SDK (A2UI + form_definition) with submit helpers",
8
8
  "type": "module",
9
9
  "sideEffects": [
@@ -27,9 +27,11 @@
27
27
  "scripts": {
28
28
  "build": "vite build && tsc -p tsconfig.build.json",
29
29
  "test": "vitest run",
30
- "test:watch": "vitest"
30
+ "test:watch": "vitest",
31
+ "prepublishOnly": "npm run build && npm test"
31
32
  },
32
33
  "dependencies": {
34
+ "@radix-ui/colors": "^3.0.0",
33
35
  "dayjs": "^1.11.13",
34
36
  "zod": "^3.24.0"
35
37
  },
@@ -16,6 +16,7 @@ import type { CaseSearchFn } from '../catalog/caseSearchContext'
16
16
  import type { ResumeSearchFn } from '../catalog/resumeSearchContext'
17
17
  import SkoponFormRenderer, { type SkoponFormRendererRef } from './SkoponFormRenderer'
18
18
  import CurlSubmitBlock from './CurlSubmitBlock'
19
+ import SkoponFormProvider from './SkoponFormProvider'
19
20
 
20
21
  function formatSubmitErrorMessage(status: number, body: unknown): string {
21
22
  if (body && typeof body === 'object' && body !== null && 'message' in body) {
@@ -154,21 +155,25 @@ export default function AskUserFormCard({
154
155
 
155
156
  if (loading) {
156
157
  return (
157
- <div className="ask-user-form-card">
158
- <Spin size="small" />
159
- </div>
158
+ <SkoponFormProvider>
159
+ <div className="ask-user-form-card">
160
+ <Spin size="small" />
161
+ </div>
162
+ </SkoponFormProvider>
160
163
  )
161
164
  }
162
165
 
163
166
  if (!payloadDef || renderBlocks.length === 0) {
164
167
  return (
165
- <CurlSubmitBlock
166
- payload={payload}
167
- callbackUrl={callbackUrl}
168
- copyMode="submitFields"
169
- unpublishedFormId={formDisabled && resolvedFormUniqueId ? resolvedFormUniqueId : undefined}
170
- onNotify={onNotify}
171
- />
168
+ <SkoponFormProvider>
169
+ <CurlSubmitBlock
170
+ payload={payload}
171
+ callbackUrl={callbackUrl}
172
+ copyMode="submitFields"
173
+ unpublishedFormId={formDisabled && resolvedFormUniqueId ? resolvedFormUniqueId : undefined}
174
+ onNotify={onNotify}
175
+ />
176
+ </SkoponFormProvider>
172
177
  )
173
178
  }
174
179
 
@@ -210,7 +215,8 @@ export default function AskUserFormCard({
210
215
  }
211
216
 
212
217
  return (
213
- <div className="ask-user-form-card">
218
+ <SkoponFormProvider>
219
+ <div className="ask-user-form-card">
214
220
  {formDisabled && resolvedFormUniqueId ? (
215
221
  <div className="ask-user-form-card-status">
216
222
  <Tooltip title={resolvedFormUniqueId}>
@@ -241,6 +247,7 @@ export default function AskUserFormCard({
241
247
  </Button>
242
248
  </Tooltip>
243
249
  </div>
244
- </div>
250
+ </div>
251
+ </SkoponFormProvider>
245
252
  )
246
253
  }
@@ -7,6 +7,7 @@ import { buildSkoponCatalog } from '../catalog/a2uiCustomCatalog'
7
7
  import { A2uiPreviewModeProvider } from '../catalog/a2uiPreviewContext'
8
8
  import { CaseSearchProvider, type CaseSearchFn } from '../catalog/caseSearchContext'
9
9
  import { ResumeSearchProvider, type ResumeSearchFn } from '../catalog/resumeSearchContext'
10
+ import SkoponFormProvider from './SkoponFormProvider'
10
11
 
11
12
  export interface SkoponA2uiStreamRendererProps {
12
13
  /** 增量追加的 A2UI v0.9 消息 */
@@ -177,10 +178,11 @@ export default function SkoponA2uiStreamRenderer({
177
178
  }
178
179
  }, [messages, surfaceId])
179
180
 
180
- if (surfaces.length === 0) return <>{emptyHint}</>
181
+ if (surfaces.length === 0) return <SkoponFormProvider>{emptyHint}</SkoponFormProvider>
181
182
 
182
183
  return (
183
- <ResumeSearchProvider resumeSearch={resumeSearch}>
184
+ <SkoponFormProvider>
185
+ <ResumeSearchProvider resumeSearch={resumeSearch}>
184
186
  <CaseSearchProvider caseSearch={caseSearch}>
185
187
  <A2uiPreviewModeProvider interactive={interactive}>
186
188
  <div className="a2ui-surface a2ui-container">
@@ -191,5 +193,6 @@ export default function SkoponA2uiStreamRenderer({
191
193
  </A2uiPreviewModeProvider>
192
194
  </CaseSearchProvider>
193
195
  </ResumeSearchProvider>
196
+ </SkoponFormProvider>
194
197
  )
195
198
  }
@@ -0,0 +1,23 @@
1
+ import { ConfigProvider, type ThemeConfig } from 'antd'
2
+ import type { Locale } from 'antd/es/locale'
3
+ import type { ReactNode } from 'react'
4
+ import { antdTheme as skoponAntdTheme } from '../theme/antd-theme'
5
+
6
+ export interface SkoponFormProviderProps {
7
+ children: ReactNode
8
+ locale?: Locale
9
+ /** 默认 Skopon 墨绿主题;传入可覆盖 */
10
+ theme?: ThemeConfig
11
+ }
12
+
13
+ export default function SkoponFormProvider({
14
+ children,
15
+ locale,
16
+ theme,
17
+ }: SkoponFormProviderProps) {
18
+ return (
19
+ <ConfigProvider theme={theme ?? skoponAntdTheme} locale={locale}>
20
+ {children}
21
+ </ConfigProvider>
22
+ )
23
+ }
@@ -17,6 +17,7 @@ import { SKOPON_CATALOG_ID, buildSkoponCatalog } from '../catalog/a2uiCustomCata
17
17
  import { A2uiPreviewModeProvider } from '../catalog/a2uiPreviewContext'
18
18
  import { CaseSearchProvider, type CaseSearchFn } from '../catalog/caseSearchContext'
19
19
  import { ResumeSearchProvider, type ResumeSearchFn } from '../catalog/resumeSearchContext'
20
+ import SkoponFormProvider from './SkoponFormProvider'
20
21
 
21
22
  export interface SkoponFormRendererRef {
22
23
  getValues: (fieldNames?: string[]) => Record<string, unknown>
@@ -104,10 +105,11 @@ const SkoponFormRenderer = forwardRef<SkoponFormRendererRef, SkoponFormRendererP
104
105
  [surfaceId],
105
106
  )
106
107
 
107
- if (surfaces.length === 0) return <>{emptyHint}</>
108
+ if (surfaces.length === 0) return <SkoponFormProvider>{emptyHint}</SkoponFormProvider>
108
109
 
109
110
  return (
110
- <ResumeSearchProvider resumeSearch={resumeSearch}>
111
+ <SkoponFormProvider>
112
+ <ResumeSearchProvider resumeSearch={resumeSearch}>
111
113
  <CaseSearchProvider caseSearch={caseSearch}>
112
114
  <A2uiPreviewModeProvider interactive={interactive}>
113
115
  <div className="a2ui-surface a2ui-container">
@@ -117,7 +119,8 @@ const SkoponFormRenderer = forwardRef<SkoponFormRendererRef, SkoponFormRendererP
117
119
  </div>
118
120
  </A2uiPreviewModeProvider>
119
121
  </CaseSearchProvider>
120
- </ResumeSearchProvider>
122
+ </ResumeSearchProvider>
123
+ </SkoponFormProvider>
121
124
  )
122
125
  },
123
126
  )
package/src/index.ts CHANGED
@@ -80,6 +80,12 @@ export type { AskUserFormCardProps } from './components/AskUserFormCard'
80
80
  export { default as CurlSubmitBlock } from './components/CurlSubmitBlock'
81
81
  export type { CurlSubmitBlockProps } from './components/CurlSubmitBlock'
82
82
 
83
+ export { default as SkoponFormProvider } from './components/SkoponFormProvider'
84
+ export type { SkoponFormProviderProps } from './components/SkoponFormProvider'
85
+
86
+ export { antdTheme as skoponAntdTheme } from './theme/antd-theme'
87
+ export { brandColors as skoponBrandColors } from './theme/brand-colors'
88
+
83
89
 
84
90
  export {
85
91
  ResumeSearchProvider,
@@ -1,3 +1,4 @@
1
+ @import './tokens.css';
1
2
  @import './a2ui-preview.css';
2
3
 
3
4
  /* form-block-preview(与 admin form-tally 预览对齐的子集) */
@@ -0,0 +1,224 @@
1
+ /**
2
+ * VidTempl 设计令牌
3
+ * 基础色阶:@radix-ui/colors(Gray 中性 + Jade 墨绿品牌)
4
+ * 语义变量:供全局 CSS 与自定义组件使用
5
+ */
6
+
7
+ @import '@radix-ui/colors/gray.css';
8
+ @import '@radix-ui/colors/jade.css';
9
+ @import '@radix-ui/colors/green.css';
10
+ @import '@radix-ui/colors/red.css';
11
+ @import '@radix-ui/colors/amber.css';
12
+
13
+ :root,
14
+ .light,
15
+ .light-theme {
16
+ /* —— 品牌色(墨绿 · Radix Jade)—— */
17
+ --brand-1: var(--jade-1);
18
+ --brand-2: var(--jade-2);
19
+ --brand-3: var(--jade-3);
20
+ --brand-4: var(--jade-4);
21
+ --brand-5: var(--jade-5);
22
+ --brand-6: var(--jade-6);
23
+ --brand-7: var(--jade-7);
24
+ --brand-8: var(--jade-8);
25
+ --brand-9: var(--jade-9);
26
+ --brand-10: var(--jade-10);
27
+ --brand-11: var(--jade-11);
28
+ --brand-12: var(--jade-12);
29
+
30
+ /* —— 中性色(Radix Gray)—— */
31
+ --neutral-1: var(--gray-1);
32
+ --neutral-2: var(--gray-2);
33
+ --neutral-3: var(--gray-3);
34
+ --neutral-4: var(--gray-4);
35
+ --neutral-5: var(--gray-5);
36
+ --neutral-6: var(--gray-6);
37
+ --neutral-7: var(--gray-7);
38
+ --neutral-8: var(--gray-8);
39
+ --neutral-9: var(--gray-9);
40
+ --neutral-10: var(--gray-10);
41
+ --neutral-11: var(--gray-11);
42
+ --neutral-12: var(--gray-12);
43
+
44
+ /* —— 功能色 —— */
45
+ --success-9: var(--green-9);
46
+ --success-11: var(--green-11);
47
+ --danger-9: var(--red-9);
48
+ --danger-11: var(--red-11);
49
+ --danger-3: var(--red-3);
50
+ --warning-9: var(--amber-9);
51
+ --warning-11: var(--amber-11);
52
+
53
+ /* —— 语义色(交互设计统一引用)—— */
54
+ --color-primary: var(--brand-11);
55
+ --color-primary-hover: var(--brand-10);
56
+ --color-primary-active: var(--brand-12);
57
+ /* 实心底:与 --color-primary 同为 Jade 11,供按钮 / Sider 等大面积铺色 */
58
+ --color-primary-solid: var(--brand-11);
59
+ --color-primary-subtle: var(--brand-3);
60
+ --color-primary-muted: var(--brand-4);
61
+ --color-on-primary: #ffffff;
62
+
63
+ --color-bg: var(--neutral-1);
64
+ --color-bg-subtle: var(--neutral-2);
65
+ --color-bg-muted: var(--neutral-3);
66
+ --color-surface: #ffffff;
67
+ --color-surface-raised: var(--neutral-2);
68
+
69
+ --color-border: var(--neutral-6);
70
+ --color-border-subtle: var(--neutral-4);
71
+ --color-border-strong: var(--neutral-8);
72
+
73
+ --color-text: var(--neutral-12);
74
+ --color-text-secondary: var(--neutral-11);
75
+ --color-text-muted: var(--neutral-9);
76
+ --color-text-placeholder: var(--neutral-9);
77
+ --color-text-disabled: var(--neutral-8);
78
+
79
+ --color-success: var(--success-9);
80
+ --color-success-text: var(--success-11);
81
+ --color-danger: var(--danger-9);
82
+ --color-danger-text: var(--danger-11);
83
+ --color-danger-subtle: var(--danger-3);
84
+ --color-warning: var(--warning-9);
85
+ --color-warning-text: var(--warning-11);
86
+ --color-warning-solid: var(--amber-9);
87
+ --color-warning-solid-hover: var(--amber-10);
88
+ --color-on-warning: var(--neutral-12);
89
+
90
+ --color-focus-ring: color-mix(in srgb, var(--brand-11) 35%, transparent);
91
+
92
+ /* —— 间距(4px 基准刻度)—— */
93
+ --space-1: 4px;
94
+ --space-2: 8px;
95
+ --space-3: 12px;
96
+ --space-4: 16px;
97
+ --space-5: 24px;
98
+ --space-6: 32px;
99
+ --space-7: 48px;
100
+ --space-8: 64px;
101
+ /* 语义间距 */
102
+ --space-page-x: var(--space-5);
103
+ --space-page-y: var(--space-5);
104
+ --space-section: var(--space-5);
105
+ --space-card: var(--space-4);
106
+ --space-form-item: var(--space-5);
107
+ --space-inline: var(--space-2);
108
+ --space-stack-sm: var(--space-3);
109
+ --space-stack-md: var(--space-4);
110
+ --space-stack-lg: var(--space-5);
111
+
112
+ /* —— 圆角 —— */
113
+ --radius-sm: 4px;
114
+ --radius-md: 8px;
115
+ --radius-lg: 12px;
116
+ /** 胶囊形(按钮):两侧半圆,等效 border-radius: 50% / 9999px */
117
+ --radius-pill: 9999px;
118
+ --radius-button: var(--radius-pill);
119
+
120
+ /* —— 阴影 —— */
121
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.04);
122
+ --shadow-md: 0 2px 8px rgba(0, 0, 0, 0.06);
123
+ --shadow-focus: 0 0 0 2px var(--color-focus-ring);
124
+
125
+ /* —— 字体 —— */
126
+ --font-sans: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
127
+ 'Helvetica Neue', Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei',
128
+ 'Noto Sans SC', sans-serif;
129
+ --font-weight-normal: 400;
130
+ --font-weight-medium: 500;
131
+ --font-weight-semibold: 600;
132
+ --font-size-xs: 11px;
133
+ --font-size-sm: 13px;
134
+ --font-size-base: 14px;
135
+ --font-size-lg: 16px;
136
+ --font-size-xl: 20px;
137
+ --font-size-2xl: 24px;
138
+ --line-height-tight: 1.25;
139
+ --line-height-base: 1.5715;
140
+ --line-height-relaxed: 1.6;
141
+
142
+ /* —— 按钮尺寸 —— */
143
+ --button-height-sm: 28px;
144
+ --button-height-md: 36px;
145
+ --button-height-lg: 40px;
146
+ --button-padding-x-sm: 12px;
147
+ --button-padding-x-md: 16px;
148
+ --button-padding-x-lg: 20px;
149
+ --button-font-size-sm: 13px;
150
+ --button-font-size-md: 14px;
151
+ --button-font-size-lg: 16px;
152
+ --button-icon-sm: 14px;
153
+ --button-icon-md: 16px;
154
+ --button-icon-lg: 18px;
155
+ --button-font-weight: var(--font-weight-semibold);
156
+ --button-icon-stroke-width: 2.5px;
157
+
158
+ /* —— 布局(design/ui/UI规范.md §12)—— */
159
+ /* 列表页不设 max-width;流程编辑 1400px;窄表单 800px */
160
+ --layout-sider-width: 60px;
161
+ --layout-sider-width-expanded: 158px;
162
+ --layout-sider-capsule-radius: calc(var(--layout-sider-width) / 2);
163
+ --layout-sider-inset: var(--space-3);
164
+ --layout-sider-rail-width: calc(var(--layout-sider-width) + 2 * var(--layout-sider-inset));
165
+ --layout-sider-rail-width-expanded: calc(
166
+ var(--layout-sider-width-expanded) + 2 * var(--layout-sider-inset)
167
+ );
168
+ --layout-header-height: 56px;
169
+ --layout-bottom-nav-height: 56px;
170
+ --layout-sider-mobile-inset: var(--layout-sider-inset);
171
+ --layout-sider-mobile-padding-y: var(--layout-sider-padding-y);
172
+ --layout-sider-mobile-padding-x: var(--layout-sider-padding-y);
173
+ --layout-sider-mobile-clearance: calc(
174
+ var(--layout-sider-nav-size) + 2 * var(--layout-sider-mobile-padding-y) +
175
+ var(--layout-sider-mobile-inset) + env(safe-area-inset-bottom, 0px)
176
+ );
177
+ --layout-content-gap: var(--space-section);
178
+ --layout-kpi-min-height: 96px;
179
+ --layout-chart-min-height: 320px;
180
+ --layout-sider-logo-size: 36px;
181
+ --layout-sider-padding-y: var(--space-3);
182
+ --layout-sider-padding-x: 0;
183
+ --layout-sider-gap: var(--space-2);
184
+ /** Logo → 首导航项;退出登录 → 头像(须一致) */
185
+ --layout-sider-logo-gap: var(--space-4);
186
+ --layout-sider-nav-size: 36px;
187
+ /** 展开态 icon 与 label 间距 */
188
+ --layout-sider-icon-label-gap: 10px;
189
+ /** 侧栏未选中导航 / 退出图标不透明度 69%(选中、hover 为 1) */
190
+ --layout-sider-nav-icon-opacity-idle: 0.69;
191
+ --color-nav-bg: var(--color-primary-solid);
192
+ --color-nav-icon: var(--color-on-primary);
193
+ --color-nav-logo-bg: #ffffff;
194
+ --color-nav-logo-icon: var(--color-primary);
195
+
196
+ /* —— 动效 —— */
197
+ --duration-fast: 150ms;
198
+ --duration-normal: 200ms;
199
+ --ease-default: cubic-bezier(0.4, 0, 0.2, 1);
200
+
201
+ /* 断点参考(design/ui/UI规范.md §8.1):640 / 768 / 992 px */
202
+ }
203
+
204
+ @media (max-width: 768px) {
205
+ :root {
206
+ --space-page-x: var(--space-4);
207
+ --space-page-y: var(--space-4);
208
+ --space-section: var(--space-4);
209
+ --space-card: var(--space-3);
210
+ --layout-sider-mobile-inset: var(--space-5);
211
+ --layout-sider-mobile-padding-y: var(--space-3);
212
+ --layout-sider-mobile-padding-x: var(--space-3);
213
+ --layout-sider-mobile-clearance: calc(
214
+ var(--layout-sider-nav-size) + 2 * var(--layout-sider-mobile-padding-y) +
215
+ var(--layout-sider-mobile-inset) + env(safe-area-inset-bottom, 0px)
216
+ );
217
+ --layout-flow-artifact-fab-bottom: calc(
218
+ var(--layout-sider-mobile-clearance) + var(--space-5)
219
+ );
220
+ --layout-flow-artifact-panel-bottom: calc(
221
+ var(--layout-flow-artifact-fab-bottom) + 48px + var(--space-3)
222
+ );
223
+ }
224
+ }
@@ -0,0 +1,93 @@
1
+ import type { ThemeConfig } from 'antd'
2
+ import { brandColors } from './brand-colors'
3
+
4
+ /**
5
+ * Ant Design 主题映射(与 design/ui/UI规范.md §2.4、§2.5 一致)
6
+ * 品牌主色 hex 仅来自 ./brand-colors.ts
7
+ */
8
+ export const antdTheme: ThemeConfig = {
9
+ cssVar: { key: 'vidtempl' },
10
+ token: {
11
+ colorPrimary: brandColors.primarySolid,
12
+ colorPrimaryHover: brandColors.primaryHover,
13
+ colorPrimaryActive: brandColors.primaryActive,
14
+ colorLink: brandColors.primary,
15
+ colorLinkHover: brandColors.primaryHover,
16
+ colorSuccess: brandColors.jade9,
17
+ colorWarning: '#f5a623',
18
+ gold6: '#f5a623',
19
+ gold7: '#e6951a',
20
+ colorError: '#e5484d',
21
+ colorInfo: brandColors.primary,
22
+ colorBgLayout: '#f9f9f9',
23
+ colorBgContainer: '#ffffff',
24
+ colorBgElevated: '#ffffff',
25
+ colorBorder: '#d9d9d9',
26
+ colorBorderSecondary: '#f0f0f0',
27
+ colorText: '#202020',
28
+ colorTextSecondary: '#646464',
29
+ colorTextTertiary: '#8d8d8d',
30
+ colorTextQuaternary: '#bbbbbb',
31
+ borderRadius: 8,
32
+ borderRadiusSM: 4,
33
+ borderRadiusLG: 12,
34
+ fontFamily:
35
+ "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Noto Sans SC', sans-serif",
36
+ fontSize: 14,
37
+ fontSizeLG: 16,
38
+ fontSizeSM: 13,
39
+ fontWeightStrong: 600,
40
+ lineHeight: 1.5715,
41
+ lineHeightLG: 1.5,
42
+ lineHeightSM: 1.5715,
43
+ controlHeight: 36,
44
+ controlHeightLG: 40,
45
+ controlHeightSM: 28,
46
+ paddingContentHorizontal: 16,
47
+ paddingContentHorizontalLG: 20,
48
+ paddingContentHorizontalSM: 12,
49
+ marginLG: 24,
50
+ marginMD: 16,
51
+ marginSM: 12,
52
+ marginXS: 8,
53
+ },
54
+ components: {
55
+ Button: {
56
+ borderRadius: 9999,
57
+ borderRadiusSM: 9999,
58
+ borderRadiusLG: 9999,
59
+ controlHeight: 36,
60
+ controlHeightLG: 40,
61
+ controlHeightSM: 28,
62
+ paddingInline: 16,
63
+ paddingInlineLG: 20,
64
+ paddingInlineSM: 12,
65
+ fontSize: 14,
66
+ fontSizeLG: 16,
67
+ fontSizeSM: 13,
68
+ fontWeight: 600,
69
+ primaryShadow: 'none',
70
+ defaultShadow: 'none',
71
+ dangerShadow: 'none',
72
+ },
73
+ Card: {
74
+ borderRadiusLG: 8,
75
+ },
76
+ Layout: {
77
+ headerBg: '#ffffff',
78
+ bodyBg: '#f9f9f9',
79
+ },
80
+ Tag: {
81
+ defaultBg: '#e6f7ed',
82
+ defaultColor: brandColors.primary,
83
+ fontSizeSM: 13,
84
+ },
85
+ Form: {
86
+ itemMarginBottom: 24,
87
+ },
88
+ Typography: {
89
+ titleMarginBottom: 16,
90
+ titleMarginTop: 0,
91
+ },
92
+ },
93
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * 品牌墨绿(Jade)唯一 hex 源
3
+ * CSS 侧通过 Radix --jade-* / 语义变量 --color-* 引用;Ant Design 从此文件同步
4
+ * 规范:front/design/ui/UI规范.md §2.2、§2.5
5
+ */
6
+ export const brandColors = {
7
+ jade9: '#29a383',
8
+ jade10: '#26997b',
9
+ jade11: '#208368',
10
+ jade12: '#1d3b31',
11
+ /** 链接、边框、Logo 图形、实心底(与 primarySolid 同色) */
12
+ primary: '#208368',
13
+ /** Primary 实心按钮、Sider 胶囊、发布等 type="primary" */
14
+ primarySolid: '#208368',
15
+ primaryHover: '#26997b',
16
+ primaryActive: '#1d3b31',
17
+ onPrimary: '#ffffff',
18
+ } as const