@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.
- package/README.md +67 -0
- package/dist/index.cjs +2485 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.mjs +9638 -0
- package/dist/index.mjs.map +1 -0
- package/dist/types/__tests__/setup.d.ts +1 -0
- package/dist/types/__tests__/test-utils.d.ts +26 -0
- package/dist/types/button/Button.d.ts +56 -0
- package/dist/types/button/Button.style.d.ts +69 -0
- package/dist/types/button/IconButton.d.ts +47 -0
- package/dist/types/button/IconButton.style.d.ts +32 -0
- package/dist/types/button/__tests__/Button.test.d.ts +14 -0
- package/dist/types/button/__tests__/IconButton.test.d.ts +1 -0
- package/dist/types/button/index.d.ts +4 -0
- package/dist/types/button/tokens.d.ts +4 -0
- package/dist/types/checkbox/Checkbox.d.ts +42 -0
- package/dist/types/checkbox/Checkbox.style.d.ts +9 -0
- package/dist/types/checkbox/CheckboxButton.d.ts +52 -0
- package/dist/types/checkbox/CheckboxButton.style.d.ts +26 -0
- package/dist/types/checkbox/__tests__/Checkbox.test.d.ts +4 -0
- package/dist/types/checkbox/__tests__/CheckboxButton.test.d.ts +4 -0
- package/dist/types/checkbox/index.d.ts +7 -0
- package/dist/types/checkbox/tokens.d.ts +3 -0
- package/dist/types/collapse/Collapse.d.ts +50 -0
- package/dist/types/collapse/Collapse.style.d.ts +153 -0
- package/dist/types/collapse/CollapseItem.d.ts +46 -0
- package/dist/types/collapse/__tests__/Collapse.test.d.ts +14 -0
- package/dist/types/collapse/index.d.ts +4 -0
- package/dist/types/collapse/tokens.d.ts +3 -0
- package/dist/types/index.d.ts +18 -0
- package/dist/types/input/Input.d.ts +73 -0
- package/dist/types/input/Input.style.d.ts +96 -0
- package/dist/types/input/__tests__/Input.test.d.ts +17 -0
- package/dist/types/input/index.d.ts +2 -0
- package/dist/types/input/tokens.d.ts +3 -0
- package/dist/types/menu/Menu.d.ts +37 -0
- package/dist/types/menu/Menu.style.d.ts +122 -0
- package/dist/types/menu/MenuFooter.d.ts +32 -0
- package/dist/types/menu/MenuGroup.d.ts +26 -0
- package/dist/types/menu/MenuHeader.d.ts +32 -0
- package/dist/types/menu/MenuItem.d.ts +40 -0
- package/dist/types/menu/SubMenuItem.d.ts +26 -0
- package/dist/types/menu/SubMenuPopover.d.ts +29 -0
- package/dist/types/menu/__tests__/Menu.test.d.ts +1 -0
- package/dist/types/menu/index.d.ts +13 -0
- package/dist/types/menu/tokens.d.ts +3 -0
- package/dist/types/numberInput/NumberInput.d.ts +59 -0
- package/dist/types/numberInput/NumberInput.style.d.ts +44 -0
- package/dist/types/numberInput/__tests__/NumberInput.test.d.ts +1 -0
- package/dist/types/numberInput/index.d.ts +2 -0
- package/dist/types/numberInput/tokens.d.ts +3 -0
- package/dist/types/progress/Progress.d.ts +64 -0
- package/dist/types/progress/Progress.style.d.ts +117 -0
- package/dist/types/progress/__tests__/Progress.test.d.ts +1 -0
- package/dist/types/progress/index.d.ts +3 -0
- package/dist/types/radio/Radio.d.ts +9 -0
- package/dist/types/radio/Radio.style.d.ts +36 -0
- package/dist/types/radio/__tests__/Radio.test.d.ts +13 -0
- package/dist/types/radio/index.d.ts +2 -0
- package/dist/types/radio/tokens.d.ts +3 -0
- package/dist/types/select/ListBox.d.ts +11 -0
- package/dist/types/select/Popover.d.ts +10 -0
- package/dist/types/select/Select.d.ts +140 -0
- package/dist/types/select/Select.style.d.ts +73 -0
- package/dist/types/select/__tests__/Select.test.d.ts +1 -0
- package/dist/types/select/index.d.ts +3 -0
- package/dist/types/select/tokens.d.ts +3 -0
- package/dist/types/skeleton/Skeleton.d.ts +23 -0
- package/dist/types/skeleton/Skeleton.style.d.ts +32 -0
- package/dist/types/skeleton/index.d.ts +3 -0
- package/dist/types/skeleton/tokens.d.ts +3 -0
- package/dist/types/stepper/Step.d.ts +24 -0
- package/dist/types/stepper/Stepper.d.ts +20 -0
- package/dist/types/stepper/Stepper.style.d.ts +57 -0
- package/dist/types/stepper/index.d.ts +3 -0
- package/dist/types/stepper/tokens.d.ts +3 -0
- package/dist/types/switch/Switch.d.ts +68 -0
- package/dist/types/switch/Switch.style.d.ts +100 -0
- package/dist/types/switch/__tests__/Switch.test.d.ts +14 -0
- package/dist/types/switch/index.d.ts +6 -0
- package/dist/types/switch/tokens.d.ts +3 -0
- package/dist/types/table/Table.d.ts +88 -0
- package/dist/types/table/Table.style.d.ts +97 -0
- package/dist/types/table/index.d.ts +2 -0
- package/dist/types/tag/Tag.d.ts +80 -0
- package/dist/types/tag/Tag.style.d.ts +83 -0
- package/dist/types/tag/__tests__/Tag.test.d.ts +14 -0
- package/dist/types/tag/index.d.ts +2 -0
- package/dist/types/tag/tokens.d.ts +3 -0
- package/dist/types/theme.d.ts +14 -0
- package/dist/types/types/component-tokens.types.d.ts +765 -0
- package/dist/types/types/theme-utils.d.ts +20 -0
- package/dist/types/upload/Upload.d.ts +80 -0
- package/dist/types/upload/Upload.style.d.ts +158 -0
- package/dist/types/upload/__tests__/Upload.test.d.ts +16 -0
- package/dist/types/upload/index.d.ts +3 -0
- package/package.json +73 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import '@testing-library/jest-dom/vitest';
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 测试工具函数
|
|
3
|
+
* 提供通用的测试辅助方法和自定义渲染函数
|
|
4
|
+
*/
|
|
5
|
+
import type { RenderOptions, RenderResult } from '@testing-library/react';
|
|
6
|
+
import type { ReactElement } from 'react';
|
|
7
|
+
interface CustomRenderOptions extends Omit<RenderOptions, 'wrapper'> {
|
|
8
|
+
/** 是否包裹主题 Provider,默认为 true */
|
|
9
|
+
withTheme?: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* 自定义渲染函数
|
|
13
|
+
* 自动包裹 Theme Provider,符合组件实际使用场景
|
|
14
|
+
*/
|
|
15
|
+
export declare function render(ui: ReactElement, options?: CustomRenderOptions): RenderResult;
|
|
16
|
+
/**
|
|
17
|
+
* 等待动画完成
|
|
18
|
+
* @param ms 等待时间(毫秒)
|
|
19
|
+
*/
|
|
20
|
+
export declare const waitForAnimation: (ms?: number) => Promise<unknown>;
|
|
21
|
+
/**
|
|
22
|
+
* 模拟键盘事件
|
|
23
|
+
*/
|
|
24
|
+
export declare const createKeyboardEvent: (key: string, options?: {}) => KeyboardEvent;
|
|
25
|
+
export { screen, within, waitFor, fireEvent } from '@testing-library/react';
|
|
26
|
+
export { default as userEvent } from '@testing-library/user-event';
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Button 按钮组件
|
|
3
|
+
*
|
|
4
|
+
* 基于 react-aria 实现无障碍访问的按钮组件
|
|
5
|
+
* 完全符合 Figma 设计稿规范
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```tsx
|
|
9
|
+
* <Button variant="primary" size="md">
|
|
10
|
+
* 按钮文字
|
|
11
|
+
* </Button>
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
import type { ReactNode } from 'react';
|
|
15
|
+
import type { AriaButtonProps } from 'react-aria';
|
|
16
|
+
import { type ButtonVariant, type ButtonSize } from './Button.style';
|
|
17
|
+
export declare const VARIANTS: readonly ["primary", "secondary", "text", "danger", "gradient"];
|
|
18
|
+
export declare const SIZES: readonly ["sm", "md", "lg"];
|
|
19
|
+
export type ButtonProps = Omit<AriaButtonProps, 'elementType'> & {
|
|
20
|
+
/** 按钮类型:主按钮、次按钮、文本按钮、危险按钮 */
|
|
21
|
+
variant?: ButtonVariant;
|
|
22
|
+
/** 按钮尺寸:小号(24px)、标准(32px)、大号(40px) */
|
|
23
|
+
size?: ButtonSize;
|
|
24
|
+
/** 前置图标 */
|
|
25
|
+
icon?: ReactNode;
|
|
26
|
+
/** 加载状态 */
|
|
27
|
+
loading?: boolean;
|
|
28
|
+
/** 全宽按钮 */
|
|
29
|
+
fullWidth?: boolean;
|
|
30
|
+
/** 自定义类名 */
|
|
31
|
+
className?: string;
|
|
32
|
+
/** 子元素 */
|
|
33
|
+
children?: ReactNode;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Button 按钮组件
|
|
37
|
+
*
|
|
38
|
+
* 基于 Figma 设计规范实现的按钮组件,支持多种变体和尺寸
|
|
39
|
+
* 使用 react-aria 保证无障碍访问性
|
|
40
|
+
*/
|
|
41
|
+
export declare const Button: import("react").ForwardRefExoticComponent<Omit<AriaButtonProps<"button">, "elementType"> & {
|
|
42
|
+
/** 按钮类型:主按钮、次按钮、文本按钮、危险按钮 */
|
|
43
|
+
variant?: ButtonVariant;
|
|
44
|
+
/** 按钮尺寸:小号(24px)、标准(32px)、大号(40px) */
|
|
45
|
+
size?: ButtonSize;
|
|
46
|
+
/** 前置图标 */
|
|
47
|
+
icon?: ReactNode;
|
|
48
|
+
/** 加载状态 */
|
|
49
|
+
loading?: boolean;
|
|
50
|
+
/** 全宽按钮 */
|
|
51
|
+
fullWidth?: boolean;
|
|
52
|
+
/** 自定义类名 */
|
|
53
|
+
className?: string;
|
|
54
|
+
/** 子元素 */
|
|
55
|
+
children?: ReactNode;
|
|
56
|
+
} & import("react").RefAttributes<HTMLButtonElement>>;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Button 按钮样式
|
|
3
|
+
*
|
|
4
|
+
* 基于三层 Token 体系:
|
|
5
|
+
* - Tier 1 (Global): 全局基础值
|
|
6
|
+
* - Tier 2 (Semantic): 语义化映射
|
|
7
|
+
* - Tier 3 (Component): 组件专用 Token
|
|
8
|
+
*
|
|
9
|
+
* 完全还原 Figma 设计稿规范
|
|
10
|
+
*/
|
|
11
|
+
export declare const buttonVariants: readonly ["primary", "secondary", "text", "danger", "gradient"];
|
|
12
|
+
export declare const buttonSizes: readonly ["sm", "md", "lg"];
|
|
13
|
+
export type ButtonVariant = (typeof buttonVariants)[number];
|
|
14
|
+
export type ButtonSize = (typeof buttonSizes)[number];
|
|
15
|
+
/**
|
|
16
|
+
* Button 根元素
|
|
17
|
+
*
|
|
18
|
+
* 特性:
|
|
19
|
+
* - 基于三层 Token 设计
|
|
20
|
+
* - 完整的交互状态(hover, active, focus, disabled)
|
|
21
|
+
* - 支持加载状态
|
|
22
|
+
* - 支持全宽模式
|
|
23
|
+
*/
|
|
24
|
+
export declare const ButtonRoot: import("@emotion/styled").StyledComponent<{
|
|
25
|
+
theme?: import("@emotion/react").Theme;
|
|
26
|
+
as?: React.ElementType;
|
|
27
|
+
} & {
|
|
28
|
+
variant: ButtonVariant;
|
|
29
|
+
size: ButtonSize;
|
|
30
|
+
fullWidth: boolean;
|
|
31
|
+
isPressed: boolean;
|
|
32
|
+
isDisabled: boolean;
|
|
33
|
+
isLoading: boolean;
|
|
34
|
+
}, import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, {}>;
|
|
35
|
+
/**
|
|
36
|
+
* 按钮内容容器
|
|
37
|
+
*
|
|
38
|
+
* 用于布局图标和文本
|
|
39
|
+
*/
|
|
40
|
+
export declare const ButtonContent: import("@emotion/styled").StyledComponent<{
|
|
41
|
+
theme?: import("@emotion/react").Theme;
|
|
42
|
+
as?: React.ElementType;
|
|
43
|
+
}, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, {}>;
|
|
44
|
+
/**
|
|
45
|
+
* 图标包装器
|
|
46
|
+
*
|
|
47
|
+
* 特性:
|
|
48
|
+
* - 在加载状态下淡出
|
|
49
|
+
* - 保持布局稳定
|
|
50
|
+
*/
|
|
51
|
+
export declare const IconWrapper: import("@emotion/styled").StyledComponent<{
|
|
52
|
+
theme?: import("@emotion/react").Theme;
|
|
53
|
+
as?: React.ElementType;
|
|
54
|
+
} & {
|
|
55
|
+
isLoading: boolean;
|
|
56
|
+
}, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, {}>;
|
|
57
|
+
/**
|
|
58
|
+
* 按钮文本标签
|
|
59
|
+
*
|
|
60
|
+
* 特性:
|
|
61
|
+
* - 在加载状态下淡出
|
|
62
|
+
* - 保持文本居中
|
|
63
|
+
*/
|
|
64
|
+
export declare const Label: import("@emotion/styled").StyledComponent<{
|
|
65
|
+
theme?: import("@emotion/react").Theme;
|
|
66
|
+
as?: React.ElementType;
|
|
67
|
+
} & {
|
|
68
|
+
isLoading: boolean;
|
|
69
|
+
}, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, {}>;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IconButton 图标按钮组件
|
|
3
|
+
*
|
|
4
|
+
* 适用于仅展示图标的高频交互,支持多种外观与语义色彩
|
|
5
|
+
*/
|
|
6
|
+
import type { ReactNode } from 'react';
|
|
7
|
+
import type { AriaButtonProps } from 'react-aria';
|
|
8
|
+
import { type IconButtonAppearance, type IconButtonTone, type IconButtonSize } from './IconButton.style';
|
|
9
|
+
export declare const ICON_BUTTON_APPEARANCES: readonly ["solid", "outline", "ghost"];
|
|
10
|
+
export declare const ICON_BUTTON_TONES: readonly ["primary", "neutral", "danger"];
|
|
11
|
+
export declare const ICON_BUTTON_SIZES: readonly ["sm", "md", "lg"];
|
|
12
|
+
export type IconButtonProps = Omit<AriaButtonProps, 'elementType' | 'children'> & {
|
|
13
|
+
/** 图标按钮的视觉外观:实心、描边、幽灵 */
|
|
14
|
+
appearance?: IconButtonAppearance;
|
|
15
|
+
/** 语义色彩:主题、自然、危险 */
|
|
16
|
+
tone?: IconButtonTone;
|
|
17
|
+
/** 尺寸:24px / 32px / 40px */
|
|
18
|
+
size?: IconButtonSize;
|
|
19
|
+
/** 需要展示的图标 */
|
|
20
|
+
icon: ReactNode;
|
|
21
|
+
/** 提供屏幕阅读器可见文本(会以 VisuallyHidden 的形式注入) */
|
|
22
|
+
label?: ReactNode;
|
|
23
|
+
/** 加载状态 */
|
|
24
|
+
loading?: boolean;
|
|
25
|
+
/** 自定义加载状态的无障碍文本 */
|
|
26
|
+
loadingLabel?: string;
|
|
27
|
+
/** 自定义类名 */
|
|
28
|
+
className?: string;
|
|
29
|
+
};
|
|
30
|
+
export declare const IconButton: import("react").ForwardRefExoticComponent<Omit<AriaButtonProps<"button">, "elementType" | "children"> & {
|
|
31
|
+
/** 图标按钮的视觉外观:实心、描边、幽灵 */
|
|
32
|
+
appearance?: IconButtonAppearance;
|
|
33
|
+
/** 语义色彩:主题、自然、危险 */
|
|
34
|
+
tone?: IconButtonTone;
|
|
35
|
+
/** 尺寸:24px / 32px / 40px */
|
|
36
|
+
size?: IconButtonSize;
|
|
37
|
+
/** 需要展示的图标 */
|
|
38
|
+
icon: ReactNode;
|
|
39
|
+
/** 提供屏幕阅读器可见文本(会以 VisuallyHidden 的形式注入) */
|
|
40
|
+
label?: ReactNode;
|
|
41
|
+
/** 加载状态 */
|
|
42
|
+
loading?: boolean;
|
|
43
|
+
/** 自定义加载状态的无障碍文本 */
|
|
44
|
+
loadingLabel?: string;
|
|
45
|
+
/** 自定义类名 */
|
|
46
|
+
className?: string;
|
|
47
|
+
} & import("react").RefAttributes<HTMLButtonElement>>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IconButton 图标按钮样式
|
|
3
|
+
*
|
|
4
|
+
* 依赖三层 Token 体系,并对尺寸/变体进行语义化封装
|
|
5
|
+
*/
|
|
6
|
+
export declare const iconButtonAppearances: readonly ["solid", "outline", "ghost"];
|
|
7
|
+
export declare const iconButtonTones: readonly ["primary", "neutral", "danger"];
|
|
8
|
+
export declare const iconButtonSizes: readonly ["sm", "md", "lg"];
|
|
9
|
+
export type IconButtonAppearance = (typeof iconButtonAppearances)[number];
|
|
10
|
+
export type IconButtonTone = (typeof iconButtonTones)[number];
|
|
11
|
+
export type IconButtonSize = (typeof iconButtonSizes)[number];
|
|
12
|
+
export declare const IconButtonRoot: import("@emotion/styled").StyledComponent<{
|
|
13
|
+
theme?: import("@emotion/react").Theme;
|
|
14
|
+
as?: React.ElementType;
|
|
15
|
+
} & {
|
|
16
|
+
appearance: IconButtonAppearance;
|
|
17
|
+
tone: IconButtonTone;
|
|
18
|
+
size: IconButtonSize;
|
|
19
|
+
isPressed: boolean;
|
|
20
|
+
isDisabled: boolean;
|
|
21
|
+
isLoading: boolean;
|
|
22
|
+
}, import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, {}>;
|
|
23
|
+
export declare const IconSlot: import("@emotion/styled").StyledComponent<{
|
|
24
|
+
theme?: import("@emotion/react").Theme;
|
|
25
|
+
as?: React.ElementType;
|
|
26
|
+
} & {
|
|
27
|
+
isHidden: boolean;
|
|
28
|
+
}, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, {}>;
|
|
29
|
+
export declare const LoadingSpinner: import("@emotion/styled").StyledComponent<{
|
|
30
|
+
theme?: import("@emotion/react").Theme;
|
|
31
|
+
as?: React.ElementType;
|
|
32
|
+
}, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, {}>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { Button, VARIANTS as BUTTON_VARIANTS, SIZES as BUTTON_SIZES } from './Button';
|
|
2
|
+
export type { ButtonProps } from './Button';
|
|
3
|
+
export { IconButton, ICON_BUTTON_APPEARANCES, ICON_BUTTON_TONES, ICON_BUTTON_SIZES, } from './IconButton';
|
|
4
|
+
export type { IconButtonProps } from './IconButton';
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { TokenGenerator } from '../types/theme-utils';
|
|
2
|
+
import { ButtonTokens, IconButtonTokens } from '../types/component-tokens.types';
|
|
3
|
+
export declare const getButtonTokens: TokenGenerator<ButtonTokens>;
|
|
4
|
+
export declare const getIconButtonTokens: TokenGenerator<IconButtonTokens>;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checkbox 组件
|
|
3
|
+
* 基于 Figma 设计稿 1:1 还原
|
|
4
|
+
*/
|
|
5
|
+
/** @jsxImportSource @emotion/react */
|
|
6
|
+
import React from 'react';
|
|
7
|
+
export interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type' | 'size' | 'onChange'> {
|
|
8
|
+
/**
|
|
9
|
+
* 是否选中
|
|
10
|
+
*/
|
|
11
|
+
checked?: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* 默认是否选中(非受控)
|
|
14
|
+
*/
|
|
15
|
+
defaultChecked?: boolean;
|
|
16
|
+
/**
|
|
17
|
+
* 半选状态(用于全选场景)
|
|
18
|
+
*/
|
|
19
|
+
indeterminate?: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* 是否禁用
|
|
22
|
+
*/
|
|
23
|
+
disabled?: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* 标签文字
|
|
26
|
+
*/
|
|
27
|
+
label?: React.ReactNode;
|
|
28
|
+
/**
|
|
29
|
+
* 值改变回调
|
|
30
|
+
*/
|
|
31
|
+
onChange?: (checked: boolean, event: React.ChangeEvent<HTMLInputElement>) => void;
|
|
32
|
+
/**
|
|
33
|
+
* 自定义类名
|
|
34
|
+
*/
|
|
35
|
+
className?: string;
|
|
36
|
+
/**
|
|
37
|
+
* 自定义样式
|
|
38
|
+
*/
|
|
39
|
+
style?: React.CSSProperties;
|
|
40
|
+
}
|
|
41
|
+
export declare const Checkbox: React.ForwardRefExoticComponent<CheckboxProps & React.RefAttributes<HTMLInputElement>>;
|
|
42
|
+
export default Checkbox;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checkbox 组件样式
|
|
3
|
+
* 基于 Emotion + Theme Token
|
|
4
|
+
*/
|
|
5
|
+
import type { Theme } from '@kingsoft-ai/theme';
|
|
6
|
+
export declare const checkboxContainer: import("@emotion/react").SerializedStyles;
|
|
7
|
+
export declare const checkboxControl: (theme: Theme) => import("@emotion/react").SerializedStyles;
|
|
8
|
+
export declare const checkboxIcon: (theme: Theme) => import("@emotion/react").SerializedStyles;
|
|
9
|
+
export declare const checkboxLabel: (theme: Theme) => import("@emotion/react").SerializedStyles;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CheckboxButton 组件 - 按钮风格的 Checkbox
|
|
3
|
+
*
|
|
4
|
+
* 特性:
|
|
5
|
+
* - 按钮样式的 checkbox 外观
|
|
6
|
+
* - 右下角显示勾选标记
|
|
7
|
+
* - 支持受控/非受控模式
|
|
8
|
+
*/
|
|
9
|
+
/** @jsxImportSource @emotion/react */
|
|
10
|
+
import React from 'react';
|
|
11
|
+
import type { CheckboxButtonSize } from './CheckboxButton.style';
|
|
12
|
+
export interface CheckboxButtonProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type' | 'size' | 'onChange' | 'indeterminate'> {
|
|
13
|
+
/**
|
|
14
|
+
* 是否选中
|
|
15
|
+
*/
|
|
16
|
+
checked?: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* 默认是否选中(非受控)
|
|
19
|
+
*/
|
|
20
|
+
defaultChecked?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* 是否禁用
|
|
23
|
+
*/
|
|
24
|
+
disabled?: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* 标签文字(必填)
|
|
27
|
+
*/
|
|
28
|
+
label: React.ReactNode;
|
|
29
|
+
/**
|
|
30
|
+
* 值改变回调
|
|
31
|
+
*/
|
|
32
|
+
onChange?: (checked: boolean, event: React.ChangeEvent<HTMLInputElement>) => void;
|
|
33
|
+
/**
|
|
34
|
+
* 尺寸
|
|
35
|
+
*/
|
|
36
|
+
size?: CheckboxButtonSize;
|
|
37
|
+
/**
|
|
38
|
+
* 自定义类名
|
|
39
|
+
*/
|
|
40
|
+
className?: string;
|
|
41
|
+
/**
|
|
42
|
+
* 自定义样式
|
|
43
|
+
*/
|
|
44
|
+
style?: React.CSSProperties;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* CheckboxButton - 按钮风格的复选框组件
|
|
48
|
+
*
|
|
49
|
+
* 按照设计稿,呈现为按钮样式,右下角带勾选标记
|
|
50
|
+
*/
|
|
51
|
+
export declare const CheckboxButton: React.ForwardRefExoticComponent<CheckboxButtonProps & React.RefAttributes<HTMLInputElement>>;
|
|
52
|
+
export default CheckboxButton;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CheckboxButton 组件样式
|
|
3
|
+
* 基于 Emotion + Theme Token
|
|
4
|
+
*
|
|
5
|
+
* 设计规范:
|
|
6
|
+
* - 按钮样式的 checkbox
|
|
7
|
+
* - 右下角勾选标记
|
|
8
|
+
* - 完整的交互状态
|
|
9
|
+
*/
|
|
10
|
+
import type { Theme } from '@kingsoft-ai/theme';
|
|
11
|
+
export type CheckboxButtonSize = 'sm' | 'md' | 'lg';
|
|
12
|
+
interface CheckboxButtonSizeConfig {
|
|
13
|
+
paddingX: number;
|
|
14
|
+
paddingY: number;
|
|
15
|
+
gap: number;
|
|
16
|
+
minHeight: number;
|
|
17
|
+
fontSize: number;
|
|
18
|
+
lineHeight: number;
|
|
19
|
+
checkmarkSize: number;
|
|
20
|
+
checkmarkIcon: number;
|
|
21
|
+
}
|
|
22
|
+
export declare const checkboxButtonSizeTokens: Record<CheckboxButtonSize, CheckboxButtonSizeConfig>;
|
|
23
|
+
export declare const checkboxButtonContainer: import("@emotion/react").SerializedStyles;
|
|
24
|
+
export declare const checkboxButtonWrapper: (theme: Theme, size?: CheckboxButtonSize) => import("@emotion/react").SerializedStyles;
|
|
25
|
+
export declare const checkboxButtonCheckmark: (theme: Theme, size?: CheckboxButtonSize) => import("@emotion/react").SerializedStyles;
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Collapse 折叠面板组件
|
|
3
|
+
*
|
|
4
|
+
* 可以折叠/展开的内容区域
|
|
5
|
+
* 支持手风琴模式(同时只能展开一个)和普通模式(可同时展开多个)
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```tsx
|
|
9
|
+
* // 非受控模式
|
|
10
|
+
* <Collapse defaultActiveKey={['1']}>
|
|
11
|
+
* <CollapseItem itemKey="1" title="标题1">内容1</CollapseItem>
|
|
12
|
+
* <CollapseItem itemKey="2" title="标题2">内容2</CollapseItem>
|
|
13
|
+
* </Collapse>
|
|
14
|
+
*
|
|
15
|
+
* // 受控模式 + 手风琴
|
|
16
|
+
* <Collapse
|
|
17
|
+
* activeKey={activeKey}
|
|
18
|
+
* onChange={setActiveKey}
|
|
19
|
+
* accordion
|
|
20
|
+
* >
|
|
21
|
+
* <CollapseItem itemKey="1" title="标题1">内容1</CollapseItem>
|
|
22
|
+
* <CollapseItem itemKey="2" title="标题2">内容2</CollapseItem>
|
|
23
|
+
* </Collapse>
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
import type { ReactNode } from 'react';
|
|
27
|
+
export interface CollapseProps {
|
|
28
|
+
/** 当前激活的面板(受控) */
|
|
29
|
+
activeKey?: string | number | (string | number)[];
|
|
30
|
+
/** 默认激活的面板(非受控) */
|
|
31
|
+
defaultActiveKey?: string | number | (string | number)[];
|
|
32
|
+
/** 手风琴模式,每次只能展开一个面板 */
|
|
33
|
+
accordion?: boolean;
|
|
34
|
+
/** 展开/收起回调 */
|
|
35
|
+
onChange?: (activeKey: string | number | (string | number)[]) => void;
|
|
36
|
+
/** 子元素(CollapseItem) */
|
|
37
|
+
children?: ReactNode;
|
|
38
|
+
/** 自定义类名 */
|
|
39
|
+
className?: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Collapse 折叠面板
|
|
43
|
+
*
|
|
44
|
+
* 特性:
|
|
45
|
+
* - 支持受控和非受控模式
|
|
46
|
+
* - 支持手风琴模式(accordion)
|
|
47
|
+
* - 平滑的展开/收起动画
|
|
48
|
+
* - 完整的键盘导航和无障碍支持
|
|
49
|
+
*/
|
|
50
|
+
export declare const Collapse: import("react").ForwardRefExoticComponent<CollapseProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Collapse 折叠面板样式
|
|
3
|
+
*
|
|
4
|
+
* 基于三层 Token 体系:
|
|
5
|
+
* - Tier 1 (Global): 全局基础值
|
|
6
|
+
* - Tier 2 (Semantic): 语义化映射
|
|
7
|
+
* - Tier 3 (Component): 组件专用 Token
|
|
8
|
+
*
|
|
9
|
+
* 完全还原 Figma 设计稿规范
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* 箭头旋转动画(展开)
|
|
13
|
+
*/
|
|
14
|
+
export declare const rotateArrowDown: {
|
|
15
|
+
name: string;
|
|
16
|
+
styles: string;
|
|
17
|
+
anim: 1;
|
|
18
|
+
toString: () => string;
|
|
19
|
+
} & string;
|
|
20
|
+
/**
|
|
21
|
+
* 箭头旋转动画(收起)
|
|
22
|
+
*/
|
|
23
|
+
export declare const rotateArrowUp: {
|
|
24
|
+
name: string;
|
|
25
|
+
styles: string;
|
|
26
|
+
anim: 1;
|
|
27
|
+
toString: () => string;
|
|
28
|
+
} & string;
|
|
29
|
+
/**
|
|
30
|
+
* Collapse 根容器
|
|
31
|
+
*
|
|
32
|
+
* 特性:
|
|
33
|
+
* - 完整的边框和圆角
|
|
34
|
+
* - 使用 Tier 3 组件层 Token
|
|
35
|
+
*/
|
|
36
|
+
export declare const CollapseRoot: import("@emotion/styled").StyledComponent<{
|
|
37
|
+
theme?: import("@emotion/react").Theme;
|
|
38
|
+
as?: React.ElementType;
|
|
39
|
+
}, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
|
|
40
|
+
/**
|
|
41
|
+
* CollapseItem 容器
|
|
42
|
+
*
|
|
43
|
+
* 特性:
|
|
44
|
+
* - 包含标题栏和内容区
|
|
45
|
+
* - 底部边框作为分隔线
|
|
46
|
+
*/
|
|
47
|
+
export declare const CollapseItemWrapper: import("@emotion/styled").StyledComponent<{
|
|
48
|
+
theme?: import("@emotion/react").Theme;
|
|
49
|
+
as?: React.ElementType;
|
|
50
|
+
} & {
|
|
51
|
+
isLast?: boolean;
|
|
52
|
+
}, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
|
|
53
|
+
/**
|
|
54
|
+
* 折叠面板标题栏
|
|
55
|
+
*
|
|
56
|
+
* 特性:
|
|
57
|
+
* - 可点击区域
|
|
58
|
+
* - hover 状态背景色变化
|
|
59
|
+
* - 支持键盘导航
|
|
60
|
+
* - 完整的无障碍支持
|
|
61
|
+
*/
|
|
62
|
+
export declare const CollapseHeader: import("@emotion/styled").StyledComponent<{
|
|
63
|
+
theme?: import("@emotion/react").Theme;
|
|
64
|
+
as?: React.ElementType;
|
|
65
|
+
} & {
|
|
66
|
+
isExpanded: boolean;
|
|
67
|
+
isDisabled?: boolean;
|
|
68
|
+
}, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
|
|
69
|
+
/**
|
|
70
|
+
* 箭头图标容器
|
|
71
|
+
*
|
|
72
|
+
* 特性:
|
|
73
|
+
* - 平滑的旋转动画
|
|
74
|
+
* - 展开时旋转 90 度(从右箭头变为下箭头)
|
|
75
|
+
*/
|
|
76
|
+
export declare const ArrowWrapper: import("@emotion/styled").StyledComponent<{
|
|
77
|
+
theme?: import("@emotion/react").Theme;
|
|
78
|
+
as?: React.ElementType;
|
|
79
|
+
} & {
|
|
80
|
+
isExpanded: boolean;
|
|
81
|
+
}, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
|
|
82
|
+
/**
|
|
83
|
+
* 标题内容区
|
|
84
|
+
*
|
|
85
|
+
* 特性:
|
|
86
|
+
* - 弹性布局,支持多行换行
|
|
87
|
+
* - 可容纳自定义内容
|
|
88
|
+
*/
|
|
89
|
+
export declare const TitleWrapper: import("@emotion/styled").StyledComponent<{
|
|
90
|
+
theme?: import("@emotion/react").Theme;
|
|
91
|
+
as?: React.ElementType;
|
|
92
|
+
}, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
|
|
93
|
+
/**
|
|
94
|
+
* 标题文本
|
|
95
|
+
*
|
|
96
|
+
* 特性:
|
|
97
|
+
* - 使用 Tier 3 文字颜色 Token
|
|
98
|
+
* - 支持多行文本
|
|
99
|
+
*/
|
|
100
|
+
export declare const TitleText: import("@emotion/styled").StyledComponent<{
|
|
101
|
+
theme?: import("@emotion/react").Theme;
|
|
102
|
+
as?: React.ElementType;
|
|
103
|
+
}, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLParagraphElement>, HTMLParagraphElement>, {}>;
|
|
104
|
+
/**
|
|
105
|
+
* 右侧后缀内容区
|
|
106
|
+
*
|
|
107
|
+
* 特性:
|
|
108
|
+
* - 固定在右侧
|
|
109
|
+
* - 支持图标、按钮等自定义内容
|
|
110
|
+
*/
|
|
111
|
+
export declare const SuffixWrapper: import("@emotion/styled").StyledComponent<{
|
|
112
|
+
theme?: import("@emotion/react").Theme;
|
|
113
|
+
as?: React.ElementType;
|
|
114
|
+
}, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
|
|
115
|
+
/**
|
|
116
|
+
* 折叠内容外层容器
|
|
117
|
+
*
|
|
118
|
+
* 特性:
|
|
119
|
+
* - 控制高度和 overflow
|
|
120
|
+
* - 平滑的高度过渡动画
|
|
121
|
+
*/
|
|
122
|
+
export declare const CollapseContentWrapper: import("@emotion/styled").StyledComponent<{
|
|
123
|
+
theme?: import("@emotion/react").Theme;
|
|
124
|
+
as?: React.ElementType;
|
|
125
|
+
} & {
|
|
126
|
+
isExpanded: boolean;
|
|
127
|
+
contentHeight: number;
|
|
128
|
+
}, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
|
|
129
|
+
/**
|
|
130
|
+
* 折叠内容内层容器
|
|
131
|
+
*
|
|
132
|
+
* 特性:
|
|
133
|
+
* - 实际内容区域
|
|
134
|
+
* - 内边距
|
|
135
|
+
* - 淡入淡出动画
|
|
136
|
+
*/
|
|
137
|
+
export declare const CollapseContentInner: import("@emotion/styled").StyledComponent<{
|
|
138
|
+
theme?: import("@emotion/react").Theme;
|
|
139
|
+
as?: React.ElementType;
|
|
140
|
+
} & {
|
|
141
|
+
isExpanded: boolean;
|
|
142
|
+
}, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
|
|
143
|
+
/**
|
|
144
|
+
* 折叠内容文本区域
|
|
145
|
+
*
|
|
146
|
+
* 特性:
|
|
147
|
+
* - 使用 Tier 3 文字颜色 Token
|
|
148
|
+
* - 支持富文本内容
|
|
149
|
+
*/
|
|
150
|
+
export declare const ContentText: import("@emotion/styled").StyledComponent<{
|
|
151
|
+
theme?: import("@emotion/react").Theme;
|
|
152
|
+
as?: React.ElementType;
|
|
153
|
+
}, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CollapseItem 折叠面板项组件
|
|
3
|
+
*
|
|
4
|
+
* 单个可折叠的面板项,支持自定义标题、内容和后缀
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```tsx
|
|
8
|
+
* <CollapseItem
|
|
9
|
+
* title="折叠面板"
|
|
10
|
+
* suffix={<Tag>Red</Tag>}
|
|
11
|
+
* >
|
|
12
|
+
* 这是折叠面板的内容
|
|
13
|
+
* </CollapseItem>
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
import type { ReactNode } from 'react';
|
|
17
|
+
export interface CollapseItemProps {
|
|
18
|
+
/** 面板唯一标识 */
|
|
19
|
+
itemKey: string | number;
|
|
20
|
+
/** 标题内容(可以是字符串或自定义 ReactNode) */
|
|
21
|
+
title?: ReactNode;
|
|
22
|
+
/** 面板内容 */
|
|
23
|
+
children?: ReactNode;
|
|
24
|
+
/** 右侧后缀内容(如标签、图标等) */
|
|
25
|
+
suffix?: ReactNode;
|
|
26
|
+
/** 是否展开(受控) */
|
|
27
|
+
expanded?: boolean;
|
|
28
|
+
/** 是否禁用 */
|
|
29
|
+
disabled?: boolean;
|
|
30
|
+
/** 是否是最后一项(控制底部边框) */
|
|
31
|
+
last?: boolean;
|
|
32
|
+
/** 展开/收起回调 */
|
|
33
|
+
onChange?: (itemKey: string | number, expanded: boolean) => void;
|
|
34
|
+
/** 自定义类名 */
|
|
35
|
+
className?: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* CollapseItem 折叠面板项
|
|
39
|
+
*
|
|
40
|
+
* 特性:
|
|
41
|
+
* - 平滑的展开/收起动画
|
|
42
|
+
* - 支持自定义标题和后缀
|
|
43
|
+
* - 完整的键盘导航支持
|
|
44
|
+
* - 自适应内容高度
|
|
45
|
+
*/
|
|
46
|
+
export declare const CollapseItem: import("react").ForwardRefExoticComponent<CollapseItemProps & import("react").RefAttributes<HTMLDivElement>>;
|