@kingsoft-ai/design 0.1.9

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 (97) hide show
  1. package/README.md +67 -0
  2. package/dist/index.cjs +2485 -0
  3. package/dist/index.cjs.map +1 -0
  4. package/dist/index.mjs +9638 -0
  5. package/dist/index.mjs.map +1 -0
  6. package/dist/types/__tests__/setup.d.ts +1 -0
  7. package/dist/types/__tests__/test-utils.d.ts +26 -0
  8. package/dist/types/button/Button.d.ts +56 -0
  9. package/dist/types/button/Button.style.d.ts +69 -0
  10. package/dist/types/button/IconButton.d.ts +47 -0
  11. package/dist/types/button/IconButton.style.d.ts +32 -0
  12. package/dist/types/button/__tests__/Button.test.d.ts +14 -0
  13. package/dist/types/button/__tests__/IconButton.test.d.ts +1 -0
  14. package/dist/types/button/index.d.ts +4 -0
  15. package/dist/types/button/tokens.d.ts +4 -0
  16. package/dist/types/checkbox/Checkbox.d.ts +42 -0
  17. package/dist/types/checkbox/Checkbox.style.d.ts +9 -0
  18. package/dist/types/checkbox/CheckboxButton.d.ts +52 -0
  19. package/dist/types/checkbox/CheckboxButton.style.d.ts +26 -0
  20. package/dist/types/checkbox/__tests__/Checkbox.test.d.ts +4 -0
  21. package/dist/types/checkbox/__tests__/CheckboxButton.test.d.ts +4 -0
  22. package/dist/types/checkbox/index.d.ts +7 -0
  23. package/dist/types/checkbox/tokens.d.ts +3 -0
  24. package/dist/types/collapse/Collapse.d.ts +50 -0
  25. package/dist/types/collapse/Collapse.style.d.ts +153 -0
  26. package/dist/types/collapse/CollapseItem.d.ts +46 -0
  27. package/dist/types/collapse/__tests__/Collapse.test.d.ts +14 -0
  28. package/dist/types/collapse/index.d.ts +4 -0
  29. package/dist/types/collapse/tokens.d.ts +3 -0
  30. package/dist/types/index.d.ts +18 -0
  31. package/dist/types/input/Input.d.ts +73 -0
  32. package/dist/types/input/Input.style.d.ts +96 -0
  33. package/dist/types/input/__tests__/Input.test.d.ts +17 -0
  34. package/dist/types/input/index.d.ts +2 -0
  35. package/dist/types/input/tokens.d.ts +3 -0
  36. package/dist/types/menu/Menu.d.ts +37 -0
  37. package/dist/types/menu/Menu.style.d.ts +122 -0
  38. package/dist/types/menu/MenuFooter.d.ts +32 -0
  39. package/dist/types/menu/MenuGroup.d.ts +26 -0
  40. package/dist/types/menu/MenuHeader.d.ts +32 -0
  41. package/dist/types/menu/MenuItem.d.ts +40 -0
  42. package/dist/types/menu/SubMenuItem.d.ts +26 -0
  43. package/dist/types/menu/SubMenuPopover.d.ts +29 -0
  44. package/dist/types/menu/__tests__/Menu.test.d.ts +1 -0
  45. package/dist/types/menu/index.d.ts +13 -0
  46. package/dist/types/menu/tokens.d.ts +3 -0
  47. package/dist/types/numberInput/NumberInput.d.ts +59 -0
  48. package/dist/types/numberInput/NumberInput.style.d.ts +44 -0
  49. package/dist/types/numberInput/__tests__/NumberInput.test.d.ts +1 -0
  50. package/dist/types/numberInput/index.d.ts +2 -0
  51. package/dist/types/numberInput/tokens.d.ts +3 -0
  52. package/dist/types/progress/Progress.d.ts +64 -0
  53. package/dist/types/progress/Progress.style.d.ts +117 -0
  54. package/dist/types/progress/__tests__/Progress.test.d.ts +1 -0
  55. package/dist/types/progress/index.d.ts +3 -0
  56. package/dist/types/radio/Radio.d.ts +9 -0
  57. package/dist/types/radio/Radio.style.d.ts +36 -0
  58. package/dist/types/radio/__tests__/Radio.test.d.ts +13 -0
  59. package/dist/types/radio/index.d.ts +2 -0
  60. package/dist/types/radio/tokens.d.ts +3 -0
  61. package/dist/types/select/ListBox.d.ts +11 -0
  62. package/dist/types/select/Popover.d.ts +10 -0
  63. package/dist/types/select/Select.d.ts +140 -0
  64. package/dist/types/select/Select.style.d.ts +73 -0
  65. package/dist/types/select/__tests__/Select.test.d.ts +1 -0
  66. package/dist/types/select/index.d.ts +3 -0
  67. package/dist/types/select/tokens.d.ts +3 -0
  68. package/dist/types/skeleton/Skeleton.d.ts +23 -0
  69. package/dist/types/skeleton/Skeleton.style.d.ts +32 -0
  70. package/dist/types/skeleton/index.d.ts +3 -0
  71. package/dist/types/skeleton/tokens.d.ts +3 -0
  72. package/dist/types/stepper/Step.d.ts +24 -0
  73. package/dist/types/stepper/Stepper.d.ts +20 -0
  74. package/dist/types/stepper/Stepper.style.d.ts +57 -0
  75. package/dist/types/stepper/index.d.ts +3 -0
  76. package/dist/types/stepper/tokens.d.ts +3 -0
  77. package/dist/types/switch/Switch.d.ts +68 -0
  78. package/dist/types/switch/Switch.style.d.ts +100 -0
  79. package/dist/types/switch/__tests__/Switch.test.d.ts +14 -0
  80. package/dist/types/switch/index.d.ts +6 -0
  81. package/dist/types/switch/tokens.d.ts +3 -0
  82. package/dist/types/table/Table.d.ts +88 -0
  83. package/dist/types/table/Table.style.d.ts +97 -0
  84. package/dist/types/table/index.d.ts +2 -0
  85. package/dist/types/tag/Tag.d.ts +80 -0
  86. package/dist/types/tag/Tag.style.d.ts +83 -0
  87. package/dist/types/tag/__tests__/Tag.test.d.ts +14 -0
  88. package/dist/types/tag/index.d.ts +2 -0
  89. package/dist/types/tag/tokens.d.ts +3 -0
  90. package/dist/types/theme.d.ts +14 -0
  91. package/dist/types/types/component-tokens.types.d.ts +765 -0
  92. package/dist/types/types/theme-utils.d.ts +20 -0
  93. package/dist/types/upload/Upload.d.ts +80 -0
  94. package/dist/types/upload/Upload.style.d.ts +158 -0
  95. package/dist/types/upload/__tests__/Upload.test.d.ts +16 -0
  96. package/dist/types/upload/index.d.ts +3 -0
  97. package/package.json +73 -0
@@ -0,0 +1,20 @@
1
+ import type { GlobalColors, GlobalSpacing, GlobalRadii, GlobalTypography, GlobalShadows, GlobalGradients, SemanticColors, SemanticSpacing, SemanticBorderRadius, SemanticTypography, SemanticShadows } from '@kingsoft-ai/theme';
2
+ export interface ThemeContext {
3
+ mode: 'light' | 'dark';
4
+ global: {
5
+ colors: GlobalColors;
6
+ spacing: GlobalSpacing;
7
+ radii: GlobalRadii;
8
+ typography: GlobalTypography;
9
+ shadows: GlobalShadows;
10
+ gradients: GlobalGradients;
11
+ };
12
+ semantic: {
13
+ colors: SemanticColors;
14
+ spacing: SemanticSpacing;
15
+ borderRadius: SemanticBorderRadius;
16
+ typography: SemanticTypography;
17
+ shadows: SemanticShadows;
18
+ };
19
+ }
20
+ export type TokenGenerator<T> = (context: ThemeContext) => T;
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Upload 上传组件
3
+ *
4
+ * 基于 react-aria 实现无障碍访问的上传组件
5
+ * 完全符合 Figma 设计稿规范
6
+ *
7
+ * @example
8
+ * ```tsx
9
+ * <Upload
10
+ * accept=".xls,.xlsx"
11
+ * maxSize={5 * 1024 * 1024}
12
+ * onChange={(files) => console.log(files)}
13
+ * />
14
+ * ```
15
+ */
16
+ import { type ReactNode } from 'react';
17
+ import { type UploadStatus } from './Upload.style';
18
+ export declare const STATUSES: readonly ["idle", "uploading", "success", "error"];
19
+ export interface UploadFile {
20
+ /** 文件唯一标识 */
21
+ uid: string;
22
+ /** 文件名 */
23
+ name: string;
24
+ /** 文件对象 */
25
+ file?: File;
26
+ /** 上传状态 */
27
+ status: UploadStatus;
28
+ /** 上传进度 (0-100) */
29
+ percent?: number;
30
+ /** 错误信息 */
31
+ error?: string;
32
+ }
33
+ export type UploadProps = {
34
+ /** 接受的文件类型 */
35
+ accept?: string;
36
+ /** 是否支持多选 */
37
+ multiple?: boolean;
38
+ /** 最大文件大小(字节) */
39
+ maxSize?: number;
40
+ /** 最大文件数量 */
41
+ maxCount?: number;
42
+ /** 是否禁用 */
43
+ disabled?: boolean;
44
+ /** 文件列表 */
45
+ fileList?: UploadFile[];
46
+ /** 默认文件列表 */
47
+ defaultFileList?: UploadFile[];
48
+ /** 文件变化回调 */
49
+ onChange?: (fileList: UploadFile[]) => void;
50
+ /** 文件上传前的钩子 */
51
+ beforeUpload?: (file: File) => boolean | Promise<boolean>;
52
+ /** 自定义上传逻辑 */
53
+ customRequest?: (options: {
54
+ file: File;
55
+ onProgress: (percent: number) => void;
56
+ onSuccess: () => void;
57
+ onError: (error: Error) => void;
58
+ }) => void;
59
+ /** 主要提示文本 */
60
+ mainText?: ReactNode;
61
+ /** 次要提示文本 */
62
+ secondaryText?: ReactNode;
63
+ /** 文件类型提示 */
64
+ fileTypeHint?: ReactNode;
65
+ /** 下载模板文本 */
66
+ downloadTemplateText?: ReactNode;
67
+ /** 下载模板回调 */
68
+ onDownloadTemplate?: () => void;
69
+ /** 自定义类名 */
70
+ className?: string;
71
+ /** 自定义上传图标 */
72
+ icon?: ReactNode;
73
+ };
74
+ /**
75
+ * Upload 上传组件
76
+ *
77
+ * 基于 Figma 设计规范实现的上传组件,支持拖拽上传和点击上传
78
+ * 使用 react-aria 保证无障碍访问性
79
+ */
80
+ export declare const Upload: import("react").ForwardRefExoticComponent<UploadProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Upload 上传组件样式
3
+ *
4
+ * 基于三层 Token 体系:
5
+ * - Tier 1 (Global): 全局基础值
6
+ * - Tier 2 (Semantic): 语义化映射
7
+ * - Tier 3 (Component): 组件专用 Token
8
+ *
9
+ * 完全还原 Figma 设计稿规范
10
+ */
11
+ export declare const uploadStatuses: readonly ["idle", "uploading", "success", "error"];
12
+ export type UploadStatus = (typeof uploadStatuses)[number];
13
+ /**
14
+ * 上传区域容器
15
+ */
16
+ export declare const UploadRoot: import("@emotion/styled").StyledComponent<{
17
+ theme?: import("@emotion/react").Theme;
18
+ as?: React.ElementType;
19
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
20
+ /**
21
+ * 拖拽区域
22
+ */
23
+ export declare const UploadDropzone: import("@emotion/styled").StyledComponent<{
24
+ theme?: import("@emotion/react").Theme;
25
+ as?: React.ElementType;
26
+ } & {
27
+ isDragActive: boolean;
28
+ isDisabled: boolean;
29
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
30
+ /**
31
+ * 上传图标容器
32
+ */
33
+ export declare const UploadIconWrapper: import("@emotion/styled").StyledComponent<{
34
+ theme?: import("@emotion/react").Theme;
35
+ as?: React.ElementType;
36
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
37
+ /**
38
+ * 上传提示文本容器
39
+ */
40
+ export declare const UploadTextWrapper: import("@emotion/styled").StyledComponent<{
41
+ theme?: import("@emotion/react").Theme;
42
+ as?: React.ElementType;
43
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
44
+ /**
45
+ * 主要提示文本
46
+ */
47
+ export declare const UploadMainText: import("@emotion/styled").StyledComponent<{
48
+ theme?: import("@emotion/react").Theme;
49
+ as?: React.ElementType;
50
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
51
+ /**
52
+ * 次要提示文本
53
+ */
54
+ export declare const UploadSecondaryText: import("@emotion/styled").StyledComponent<{
55
+ theme?: import("@emotion/react").Theme;
56
+ as?: React.ElementType;
57
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLParagraphElement>, HTMLParagraphElement>, {}>;
58
+ /**
59
+ * 链接文本
60
+ */
61
+ export declare const UploadLink: import("@emotion/styled").StyledComponent<{
62
+ theme?: import("@emotion/react").Theme;
63
+ as?: React.ElementType;
64
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, {}>;
65
+ /**
66
+ * 文件列表容器
67
+ */
68
+ export declare const FileList: import("@emotion/styled").StyledComponent<{
69
+ theme?: import("@emotion/react").Theme;
70
+ as?: React.ElementType;
71
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
72
+ /**
73
+ * 文件项容器
74
+ */
75
+ export declare const FileItem: import("@emotion/styled").StyledComponent<{
76
+ theme?: import("@emotion/react").Theme;
77
+ as?: React.ElementType;
78
+ } & {
79
+ status: UploadStatus;
80
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
81
+ /**
82
+ * 文件信息行
83
+ */
84
+ export declare const FileInfoRow: import("@emotion/styled").StyledComponent<{
85
+ theme?: import("@emotion/react").Theme;
86
+ as?: React.ElementType;
87
+ } & {
88
+ status: UploadStatus;
89
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
90
+ /**
91
+ * 文件图标
92
+ */
93
+ export declare const FileIcon: import("@emotion/styled").StyledComponent<{
94
+ theme?: import("@emotion/react").Theme;
95
+ as?: React.ElementType;
96
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, {}>;
97
+ /**
98
+ * 文件名
99
+ */
100
+ export declare const FileName: import("@emotion/styled").StyledComponent<{
101
+ theme?: import("@emotion/react").Theme;
102
+ as?: React.ElementType;
103
+ } & {
104
+ status: UploadStatus;
105
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
106
+ /**
107
+ * 状态图标
108
+ */
109
+ export declare const StatusIcon: import("@emotion/styled").StyledComponent<{
110
+ theme?: import("@emotion/react").Theme;
111
+ as?: React.ElementType;
112
+ } & {
113
+ status: UploadStatus;
114
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, {}>;
115
+ /**
116
+ * 删除按钮
117
+ */
118
+ export declare const DeleteButton: import("@emotion/styled").StyledComponent<{
119
+ theme?: import("@emotion/react").Theme;
120
+ as?: React.ElementType;
121
+ }, import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, {}>;
122
+ /**
123
+ * 进度条容器
124
+ */
125
+ export declare const ProgressWrapper: import("@emotion/styled").StyledComponent<{
126
+ theme?: import("@emotion/react").Theme;
127
+ as?: React.ElementType;
128
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
129
+ /**
130
+ * 进度条轨道
131
+ */
132
+ export declare const ProgressTrack: import("@emotion/styled").StyledComponent<{
133
+ theme?: import("@emotion/react").Theme;
134
+ as?: React.ElementType;
135
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
136
+ /**
137
+ * 进度条填充
138
+ */
139
+ export declare const ProgressBar: import("@emotion/styled").StyledComponent<{
140
+ theme?: import("@emotion/react").Theme;
141
+ as?: React.ElementType;
142
+ } & {
143
+ percent: number;
144
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
145
+ /**
146
+ * 进度百分比文本
147
+ */
148
+ export declare const ProgressText: import("@emotion/styled").StyledComponent<{
149
+ theme?: import("@emotion/react").Theme;
150
+ as?: React.ElementType;
151
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, {}>;
152
+ /**
153
+ * 隐藏的文件输入框
154
+ */
155
+ export declare const HiddenInput: import("@emotion/styled").StyledComponent<{
156
+ theme?: import("@emotion/react").Theme;
157
+ as?: React.ElementType;
158
+ }, import("react").DetailedHTMLProps<import("react").InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>, {}>;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Upload 组件测试
3
+ *
4
+ * 测试覆盖:
5
+ * - 基础渲染
6
+ * - 点击上传
7
+ * - 拖拽上传
8
+ * - 文件列表展示
9
+ * - 上传状态
10
+ * - 删除文件
11
+ * - 禁用状态
12
+ * - 文件验证
13
+ * - 无障碍性
14
+ * - ref 转发
15
+ */
16
+ export {};
@@ -0,0 +1,3 @@
1
+ export { Upload, STATUSES as UPLOAD_STATUSES } from './Upload';
2
+ export type { UploadProps, UploadFile } from './Upload';
3
+ export type { UploadStatus } from './Upload.style';
package/package.json ADDED
@@ -0,0 +1,73 @@
1
+ {
2
+ "name": "@kingsoft-ai/design",
3
+ "version": "0.1.9",
4
+ "type": "module",
5
+ "main": "dist/index.cjs",
6
+ "module": "dist/index.mjs",
7
+ "types": "dist/types/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.mjs",
11
+ "require": "./dist/index.cjs",
12
+ "types": "./dist/types/index.d.ts"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "publishConfig": {
19
+ "registry": "https://registry.npmjs.org/",
20
+ "access": "public"
21
+ },
22
+ "dependencies": {
23
+ "@react-stately/collections": "^3.12.8",
24
+ "@react-stately/list": "^3.13.1",
25
+ "@react-stately/select": "^3.8.0",
26
+ "@react-types/shared": "^3.32.1",
27
+ "@kingsoft-ai/icons": "^0.1.4",
28
+ "@kingsoft-ai/theme": "^0.1.5"
29
+ },
30
+ "peerDependencies": {
31
+ "@emotion/react": ">=11",
32
+ "@emotion/styled": ">=11",
33
+ "react": ">=18",
34
+ "react-aria": ">=3",
35
+ "react-dom": ">=18"
36
+ },
37
+ "devDependencies": {
38
+ "@emotion/react": "^11.13.3",
39
+ "@emotion/styled": "^11.13.3",
40
+ "@react-aria/button": "^3.14.2",
41
+ "@react-aria/focus": "^3.21.2",
42
+ "@react-aria/interactions": "^3.25.6",
43
+ "@react-aria/utils": "^3.26.0",
44
+ "@react-stately/toggle": "^3.9.0",
45
+ "@react-types/checkbox": "^3.9.0",
46
+ "@testing-library/jest-dom": "^6.6.3",
47
+ "@testing-library/react": "^16.1.0",
48
+ "@testing-library/user-event": "^14.5.2",
49
+ "@types/react": "^19.1.13",
50
+ "@vitejs/plugin-react": "^5.0.3",
51
+ "@vitest/coverage-v8": "^2.1.8",
52
+ "@vitest/ui": "^2.1.8",
53
+ "babel-plugin-react-compiler": "^19.1.0-rc.3",
54
+ "jsdom": "^25.0.1",
55
+ "react": "^19.1.1",
56
+ "react-aria": "^3.44.0",
57
+ "react-dom": "^19.1.1",
58
+ "rimraf": "^6.0.1",
59
+ "typescript": "~5.8.3",
60
+ "vite": "^5.4.10",
61
+ "vitest": "^2.1.8"
62
+ },
63
+ "scripts": {
64
+ "build:lib": "tsc -p tsconfig.json && vite build",
65
+ "dev": "tsc -p tsconfig.json --watch & vite build --watch",
66
+ "prepare:lib": "npm run clean && npm run build:lib",
67
+ "clean": "rimraf dist",
68
+ "test": "vitest",
69
+ "test:ui": "vitest --ui",
70
+ "test:run": "vitest run",
71
+ "test:coverage": "vitest run --coverage"
72
+ }
73
+ }