@q1travel/design-system 0.26.0 → 0.27.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.
- package/.agents/skills/product-design/exemplars/README.md +1 -1
- package/.agents/skills/product-design/references/glossary.md +1 -1
- package/contracts/button-api-compatibility.md +11 -11
- package/contracts/context-contrast-migration.md +3 -6
- package/contracts/design.dark.md +21 -2
- package/contracts/design.md +21 -2
- package/contracts/implementation-map.md +2 -2
- package/contracts/overlay-foundation.md +4 -4
- package/contracts/overlay-shadow-migration.md +5 -19
- package/contracts/pagination-migration.md +3 -3
- package/contracts/status-chip-badge-migration.md +3 -3
- package/contracts/table-migration.md +4 -4
- package/contracts/token-naming.md +40 -3
- package/dist-pkg/design-system.d.ts +92 -14
- package/dist-pkg/design-system.js +6936 -6497
- package/dist-pkg/style.css +730 -83
- package/dist-pkg/tokens.css +38 -0
- package/package.json +3 -3
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AnchorHTMLAttributes } from 'react';
|
|
2
|
+
import { AriaRole } from 'react';
|
|
2
3
|
import { ButtonHTMLAttributes } from 'react';
|
|
3
4
|
import { ComponentProps } from 'react';
|
|
4
5
|
import { ComponentPropsWithoutRef } from 'react';
|
|
@@ -47,6 +48,29 @@ export declare interface AuthCardProps {
|
|
|
47
48
|
|
|
48
49
|
export declare function Avatar({ title, src, letter, glyph, placeholder, icon, iconColor, size, className }: AvatarProps): JSX.Element;
|
|
49
50
|
|
|
51
|
+
export declare function AvatarButton({ label, src, children, size, href, onClick, editIndicator, className, ref, ...rest }: AvatarButtonProps): JSX.Element;
|
|
52
|
+
|
|
53
|
+
export declare type AvatarButtonProps = {
|
|
54
|
+
/** 可访问名,必填,如「更换组织图标」。 */
|
|
55
|
+
label: string;
|
|
56
|
+
/** 图块图片;与 children 二选一,同时提供时以 src 为准。 */
|
|
57
|
+
src?: string;
|
|
58
|
+
/** 图块内容(字母、图标或 Avatar)。 */
|
|
59
|
+
children?: ReactNode;
|
|
60
|
+
/** 图块边长像素;缺省 32。 */
|
|
61
|
+
size?: number;
|
|
62
|
+
/** 提供时渲染为链接。 */
|
|
63
|
+
href?: string;
|
|
64
|
+
onClick?: MouseEventHandler<HTMLAnchorElement | HTMLButtonElement>;
|
|
65
|
+
/** 悬停 / 焦点时显示铅笔徽标;缺省 true。 */
|
|
66
|
+
editIndicator?: boolean;
|
|
67
|
+
className?: string;
|
|
68
|
+
role?: AriaRole;
|
|
69
|
+
tabIndex?: number;
|
|
70
|
+
ref?: Ref<HTMLAnchorElement | HTMLButtonElement>;
|
|
71
|
+
[dataAttribute: `data-${string}`]: string | number | boolean | null | undefined;
|
|
72
|
+
};
|
|
73
|
+
|
|
50
74
|
export declare function AvatarGroup({ members, label, size, limit, overlap, reverse, className, }: {
|
|
51
75
|
members: AvatarMember[];
|
|
52
76
|
/** 可选整组名;传入则套 role=group 作整组增强,不传则默认逐个头像标注(读屏念每个成员名)。 */
|
|
@@ -749,6 +773,15 @@ export declare type ContextSwitcherAction = {
|
|
|
749
773
|
textValue: string;
|
|
750
774
|
icon?: ReactNode;
|
|
751
775
|
disabled?: boolean;
|
|
776
|
+
/** 单层子菜单;带 children 的动作本身不触发回调,只有叶子触发。 */
|
|
777
|
+
children?: ContextSwitcherAction[];
|
|
778
|
+
};
|
|
779
|
+
|
|
780
|
+
export declare type ContextSwitcherAvatarAction = {
|
|
781
|
+
/** 可访问名,如「更换组织图标」。 */
|
|
782
|
+
label: string;
|
|
783
|
+
href?: string;
|
|
784
|
+
onSelect?: () => void;
|
|
752
785
|
};
|
|
753
786
|
|
|
754
787
|
export declare type ContextSwitcherCurrent = {
|
|
@@ -774,6 +807,11 @@ export declare type ContextSwitcherGroup = {
|
|
|
774
807
|
divider?: boolean;
|
|
775
808
|
};
|
|
776
809
|
|
|
810
|
+
export declare type ContextSwitcherHeader = ContextSwitcherCurrent & {
|
|
811
|
+
/** 提供时头部头像渲染为可编辑的 AvatarButton,并成为头部第一个菜单项。 */
|
|
812
|
+
avatarAction?: ContextSwitcherAvatarAction;
|
|
813
|
+
};
|
|
814
|
+
|
|
777
815
|
export declare type ContextSwitcherItem = {
|
|
778
816
|
id: string;
|
|
779
817
|
label: ReactNode;
|
|
@@ -784,12 +822,19 @@ export declare type ContextSwitcherItem = {
|
|
|
784
822
|
disabled?: boolean;
|
|
785
823
|
depth?: 0 | 1;
|
|
786
824
|
kind?: 'context' | 'action';
|
|
825
|
+
/** 行尾附注(如计数),仅视觉呈现;读屏文本由 metaLabel 提供。 */
|
|
826
|
+
meta?: ReactNode;
|
|
827
|
+
/** meta 的可读文本,并入该项的 aria-describedby。 */
|
|
828
|
+
metaLabel?: string;
|
|
829
|
+
/** 仅 kind 为 action 时可用:单层子菜单,叶子项通过 onFooterAction 通知。 */
|
|
830
|
+
children?: ContextSwitcherAction[];
|
|
787
831
|
};
|
|
788
832
|
|
|
789
833
|
export declare type ContextSwitcherPresentation = {
|
|
790
834
|
type?: 'grouped';
|
|
791
835
|
} | {
|
|
792
836
|
type: 'stacked';
|
|
837
|
+
nesting?: 'indent' | 'flush';
|
|
793
838
|
} | {
|
|
794
839
|
type: 'drilldown';
|
|
795
840
|
primaryGroupId: string;
|
|
@@ -806,7 +851,7 @@ export declare type ContextSwitcherProps = {
|
|
|
806
851
|
pendingId?: string;
|
|
807
852
|
errorMessage?: ReactNode;
|
|
808
853
|
footerActions?: ContextSwitcherAction[];
|
|
809
|
-
header?:
|
|
854
|
+
header?: ContextSwitcherHeader;
|
|
810
855
|
headerActions?: ContextSwitcherAction[];
|
|
811
856
|
onFooterAction?: (action: ContextSwitcherAction) => void;
|
|
812
857
|
label?: string;
|
|
@@ -990,6 +1035,14 @@ declare type FieldBareProps = {
|
|
|
990
1035
|
error?: never;
|
|
991
1036
|
};
|
|
992
1037
|
|
|
1038
|
+
export declare type FieldLabelHintProps = {
|
|
1039
|
+
label: string;
|
|
1040
|
+
labelHint?: ReactNode;
|
|
1041
|
+
} | {
|
|
1042
|
+
label?: never;
|
|
1043
|
+
labelHint?: never;
|
|
1044
|
+
};
|
|
1045
|
+
|
|
993
1046
|
export declare type FieldLabelVisibilityProps = {
|
|
994
1047
|
label: string;
|
|
995
1048
|
labelHidden?: boolean;
|
|
@@ -1081,9 +1134,11 @@ export declare type FilterOptionPanelProps = {
|
|
|
1081
1134
|
onQueryChange?: (query: string) => void;
|
|
1082
1135
|
};
|
|
1083
1136
|
|
|
1084
|
-
export declare function FormField({ controlId, label, labelHidden, description, error, wide, children, }: {
|
|
1137
|
+
export declare function FormField({ controlId, label, labelHidden, labelHint, description, error, wide, children, }: {
|
|
1085
1138
|
controlId: string;
|
|
1086
1139
|
label?: string;
|
|
1140
|
+
/** 规则释义/字段注解:渲染为标签旁的 InfoTip,不在字段下占位;标签隐藏时不渲染。 */
|
|
1141
|
+
labelHint?: ReactNode;
|
|
1087
1142
|
description?: string;
|
|
1088
1143
|
error?: string;
|
|
1089
1144
|
wide?: boolean;
|
|
@@ -1157,7 +1212,16 @@ export declare type IconButtonProps = IconButtonAccessibleName & IconButtonBaseP
|
|
|
1157
1212
|
ref?: Ref<HTMLButtonElement>;
|
|
1158
1213
|
};
|
|
1159
1214
|
|
|
1160
|
-
export declare function
|
|
1215
|
+
export declare function InfoTip({ label, content }: InfoTipProps): JSX.Element;
|
|
1216
|
+
|
|
1217
|
+
export declare type InfoTipProps = {
|
|
1218
|
+
/** 被说明对象的名称;可访问名为「{label}说明」。 */
|
|
1219
|
+
label: string;
|
|
1220
|
+
/** 说明内容:一句规则释义或字段注解。 */
|
|
1221
|
+
content: ReactNode;
|
|
1222
|
+
};
|
|
1223
|
+
|
|
1224
|
+
export declare function Input({ id, label, labelHidden, labelHint, description, error, invalid, errorId, ref, prefix, suffix, prefixStyling, suffixStyling, rounded, wide, size, className, revealable, revealed, onRevealedChange, revealLabel, hideLabel, disabled, ...rest }: {
|
|
1161
1225
|
/** 可选:未传时内部 useId 兜底(对齐 Combobox);显式传入时行为同 0.3.0。 */
|
|
1162
1226
|
id?: string;
|
|
1163
1227
|
/** 置 aria-invalid 的业务校验态,不渲染文案;与壳模式 error 并轨(invalid || Boolean(error))。 */
|
|
@@ -1194,9 +1258,9 @@ export declare function Input({ id, label, labelHidden, description, error, inva
|
|
|
1194
1258
|
rounded?: boolean;
|
|
1195
1259
|
wide?: boolean;
|
|
1196
1260
|
size?: FieldSize;
|
|
1197
|
-
} & (FieldShellProps | FieldBareProps) & FieldLabelVisibilityProps & Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'size' | 'prefix'>): JSX.Element;
|
|
1261
|
+
} & (FieldShellProps | FieldBareProps) & FieldLabelVisibilityProps & FieldLabelHintProps & Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'size' | 'prefix'>): JSX.Element;
|
|
1198
1262
|
|
|
1199
|
-
export declare function InputOTP({ id, name, value, onValueChange, disabled, readOnly, required, invalid, errorId, size, separator, ref, label, labelHidden, description, error, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, 'aria-describedby': describedBy, }: InputOTPProps): JSX.Element;
|
|
1263
|
+
export declare function InputOTP({ id, name, value, onValueChange, disabled, readOnly, required, invalid, errorId, size, separator, ref, label, labelHidden, labelHint, description, error, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, 'aria-describedby': describedBy, }: InputOTPProps): JSX.Element;
|
|
1200
1264
|
|
|
1201
1265
|
export declare type InputOTPProps = {
|
|
1202
1266
|
id?: string;
|
|
@@ -1214,7 +1278,7 @@ export declare type InputOTPProps = {
|
|
|
1214
1278
|
separator?: boolean;
|
|
1215
1279
|
ref?: Ref<HTMLInputElement>;
|
|
1216
1280
|
'aria-describedby'?: string;
|
|
1217
|
-
} & FieldLabelVisibilityProps & ((FieldShellProps & {
|
|
1281
|
+
} & FieldLabelVisibilityProps & FieldLabelHintProps & ((FieldShellProps & {
|
|
1218
1282
|
'aria-label'?: never;
|
|
1219
1283
|
'aria-labelledby'?: never;
|
|
1220
1284
|
}) | (FieldBareProps & ({
|
|
@@ -1267,9 +1331,10 @@ export declare type KnownTotalPaginationProps = PaginationCommonProps & ({
|
|
|
1267
1331
|
showPageNumbers?: boolean;
|
|
1268
1332
|
});
|
|
1269
1333
|
|
|
1270
|
-
export declare function Label({ htmlFor, required, children, }: {
|
|
1334
|
+
export declare function Label({ htmlFor, required, hint, children, }: {
|
|
1271
1335
|
htmlFor?: string;
|
|
1272
1336
|
required?: boolean;
|
|
1337
|
+
hint?: ReactNode;
|
|
1273
1338
|
children: string;
|
|
1274
1339
|
}): JSX.Element;
|
|
1275
1340
|
|
|
@@ -1331,7 +1396,7 @@ declare type MentionQuery = (query: string, options: {
|
|
|
1331
1396
|
signal: AbortSignal;
|
|
1332
1397
|
}) => Promise<ComposerMention[]>;
|
|
1333
1398
|
|
|
1334
|
-
export declare function Menu({ label, entries, withChevron, align, triggerContent, size }: {
|
|
1399
|
+
export declare function Menu({ label, entries, withChevron, align, triggerContent, prefix, size }: {
|
|
1335
1400
|
label: string;
|
|
1336
1401
|
/** 文字触发器尺寸,默认 md;图标触发器保留原尺寸。 */
|
|
1337
1402
|
size?: ButtonSize;
|
|
@@ -1340,6 +1405,8 @@ export declare function Menu({ label, entries, withChevron, align, triggerConten
|
|
|
1340
1405
|
align?: 'start' | 'end';
|
|
1341
1406
|
/** 自定义触发器内容(如纯图标);label 始终作为可访问名称的兜底,图标-only 时经 aria-label 暴露。 */
|
|
1342
1407
|
triggerContent?: ReactNode;
|
|
1408
|
+
/** 文字触发器的前置图标,与 Button 的 prefix 一致;仍按文字触发器的尺寸与内边距渲染,传了 triggerContent 时忽略。 */
|
|
1409
|
+
prefix?: ReactNode;
|
|
1343
1410
|
}): JSX.Element;
|
|
1344
1411
|
|
|
1345
1412
|
export declare type MenuEntry = (MenuItemBase & {
|
|
@@ -1788,6 +1855,14 @@ export declare function RangeField(props: CalendarSelectionProps & {
|
|
|
1788
1855
|
today?: Date;
|
|
1789
1856
|
/** 显式启用本地 24 小时时间编辑;默认仅选择日期。 */
|
|
1790
1857
|
withTime?: boolean;
|
|
1858
|
+
/** 透传到触发器按钮,供外部 `<label htmlFor>` 关联或表单定位。 */
|
|
1859
|
+
id?: string;
|
|
1860
|
+
/** 触发器的可访问名称;未提供时读出触发器上的可见文字。 */
|
|
1861
|
+
'aria-label'?: string;
|
|
1862
|
+
/** 用页面上已有元素命名触发器。 */
|
|
1863
|
+
'aria-labelledby'?: string;
|
|
1864
|
+
/** 禁用触发器与清除操作,弹层不可打开。 */
|
|
1865
|
+
disabled?: boolean;
|
|
1791
1866
|
}): JSX.Element;
|
|
1792
1867
|
|
|
1793
1868
|
export declare function RangeInputs(props: (CalendarSelectionProps | {
|
|
@@ -1904,7 +1979,7 @@ export declare type SearchInputProps = {
|
|
|
1904
1979
|
ref?: Ref<HTMLInputElement>;
|
|
1905
1980
|
} & Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'aria-label' | 'defaultValue' | 'id' | 'onChange' | 'ref' | 'type' | 'value'>;
|
|
1906
1981
|
|
|
1907
|
-
export declare function Select({ id, label, labelHidden, description, error, ref, wide, size, prefix, suffix, className, children, value, defaultValue, multiple, 'aria-describedby': ariaDescribedBy, 'aria-invalid': ariaInvalid, ...rest }: {
|
|
1982
|
+
export declare function Select({ id, label, labelHidden, labelHint, description, error, ref, wide, size, prefix, suffix, className, children, value, defaultValue, multiple, 'aria-describedby': ariaDescribedBy, 'aria-invalid': ariaInvalid, ...rest }: {
|
|
1908
1983
|
id: string;
|
|
1909
1984
|
label?: string;
|
|
1910
1985
|
description?: string;
|
|
@@ -1923,7 +1998,7 @@ export declare function Select({ id, label, labelHidden, description, error, ref
|
|
|
1923
1998
|
defaultValue?: string | number;
|
|
1924
1999
|
/** Select 是单选字段;多值选择使用 MultiSelect。 */
|
|
1925
2000
|
multiple?: never;
|
|
1926
|
-
} & FieldLabelVisibilityProps & Omit<SelectHTMLAttributes<HTMLSelectElement>, 'id' | 'children' | 'size' | 'prefix' | 'multiple' | 'value' | 'defaultValue'>): JSX.Element;
|
|
2001
|
+
} & FieldLabelVisibilityProps & FieldLabelHintProps & Omit<SelectHTMLAttributes<HTMLSelectElement>, 'id' | 'children' | 'size' | 'prefix' | 'multiple' | 'value' | 'defaultValue'>): JSX.Element;
|
|
1927
2002
|
|
|
1928
2003
|
export declare function Separator({ orientation, decorative, className, }: {
|
|
1929
2004
|
orientation?: SeparatorOrientation;
|
|
@@ -2123,7 +2198,10 @@ export declare type SwitchOption = {
|
|
|
2123
2198
|
export declare type TabItem = {
|
|
2124
2199
|
id: string;
|
|
2125
2200
|
label: string;
|
|
2126
|
-
|
|
2201
|
+
/** 组件内面板内容;省略且未给 panelId 时不渲染面板。 */
|
|
2202
|
+
content?: ReactNode;
|
|
2203
|
+
/** 页面内由您自己渲染的区块 id;提供时 aria-controls 指向它,组件不再渲染自带面板。 */
|
|
2204
|
+
panelId?: string;
|
|
2127
2205
|
icon?: ReactNode;
|
|
2128
2206
|
disabled?: boolean;
|
|
2129
2207
|
/** 禁用原因;在 tablist 下方常显,并通过 aria-describedby 与禁用标签关联。 */
|
|
@@ -2208,13 +2286,13 @@ export declare type TableSortDirection = 'asc' | 'desc';
|
|
|
2208
2286
|
export declare function Tabs({ tabs, ariaLabel, variant, value, defaultValue, onValueChange, }: {
|
|
2209
2287
|
tabs: TabItem[];
|
|
2210
2288
|
ariaLabel: string;
|
|
2211
|
-
variant?: 'default' | 'secondary';
|
|
2289
|
+
variant?: 'default' | 'secondary' | 'line';
|
|
2212
2290
|
value?: string;
|
|
2213
2291
|
defaultValue?: string;
|
|
2214
2292
|
onValueChange?: (id: string) => void;
|
|
2215
2293
|
}): JSX.Element | null;
|
|
2216
2294
|
|
|
2217
|
-
export declare function Textarea({ id, label, labelHidden, description, error, invalid, errorId, ref, wide, size, className, maxLength, onInput, ...rest }: TextareaProps): JSX.Element;
|
|
2295
|
+
export declare function Textarea({ id, label, labelHidden, labelHint, description, error, invalid, errorId, ref, wide, size, className, maxLength, onInput, ...rest }: TextareaProps): JSX.Element;
|
|
2218
2296
|
|
|
2219
2297
|
/** Textarea 的完整 props。消费方包一层时用它标注,无需知道内部由哪几块组合而成。 */
|
|
2220
2298
|
export declare type TextareaProps = {
|
|
@@ -2228,7 +2306,7 @@ export declare type TextareaProps = {
|
|
|
2228
2306
|
ref?: Ref<HTMLTextAreaElement>;
|
|
2229
2307
|
wide?: boolean;
|
|
2230
2308
|
size?: FieldSize;
|
|
2231
|
-
} & (FieldShellProps | FieldBareProps) & FieldLabelVisibilityProps & Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'id'>;
|
|
2309
|
+
} & (FieldShellProps | FieldBareProps) & FieldLabelVisibilityProps & FieldLabelHintProps & Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'id'>;
|
|
2232
2310
|
|
|
2233
2311
|
export declare function TextWithCopyButton({ text, copyValue, successMessage, size, }: {
|
|
2234
2312
|
text: string;
|