@q1travel/design-system 0.23.0 → 0.24.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/contracts/design.dark.md +9 -2
- package/contracts/design.md +11 -4
- package/contracts/implementation-map.md +12 -3
- package/contracts/interface-guidelines.md +3 -3
- package/dist-pkg/design-system.d.ts +77 -22
- package/dist-pkg/design-system.js +4951 -4801
- package/dist-pkg/style.css +78 -8
- package/package.json +2 -2
package/contracts/design.dark.md
CHANGED
|
@@ -442,13 +442,16 @@ These components ship in the package. Compose from this list before writing new
|
|
|
442
442
|
|
|
443
443
|
- Button carries the action. ButtonLink navigates but reads as a button, for a page-level call to action. Link reads as text, inside a sentence. Substituting one for another makes the page read wrong.
|
|
444
444
|
- SplitButton is a primary action with an adjacent menu whose first entry mirrors it. Do not use it to hide unrelated actions behind a chevron.
|
|
445
|
-
- FilterChip opens a consumer-owned filter picker; undefined means unset, other values mean set. Its
|
|
445
|
+
- FilterChip opens a consumer-owned filter picker; undefined means unset, other values mean set. Its default sm 32px pill uses a dashed border-strong outline with CirclePlus when unset, and a solid outline with label, border-token divider, action-text value and ChevronDown when set. The optional leading CircleX clear action is a separate named native button before the picker, with its own Tab stop and shared focus ring.
|
|
446
|
+
- FilterOptionPanel is searchable single-select content inside Popover, usually anchored by FilterChip. It owns initial search focus, named combobox/listbox, active-descendant arrow navigation with disabled skipping, loading/error/retry/empty/no-match states, and label/keywords includes filtering. Callers own selection, closing, business ranking and async queries through controlled query/onQueryChange and an injected filter; Escape dismissal and trigger focus return stay with Popover. It does not provide multiselect or an application footer.
|
|
446
447
|
- IconButton requires an accessible name. An icon-only control without one is not deliverable.
|
|
447
448
|
|
|
448
449
|
**Text fields.** FormField, Label, Input, ClearableInput, SearchInput, InputOTP, Textarea, Select, Fieldset, ErrorMessage.
|
|
449
450
|
|
|
450
451
|
- InputOTP collects a fixed six-digit code in one joined group by default; `separator` explicitly enables 3+3 groups. VerificationCodeInput and VerificationCodeInputProps remain deprecated aliases for one minor version; migrate to InputOTP and InputOTPProps before their removal in the next minor version. The old `/components/verification-code-input` route redirects to `/components/input-otp`.
|
|
451
452
|
- FormField owns the label, help text, and error slot. Do not assemble those three around a bare Input.
|
|
453
|
+
- `labelHidden` defaults to false. For a single inline field already named by context, it visually hides the real associated label through `q1-sr-only` without reserving a label row or gap; description, visible error, and `aria-describedby` remain unchanged. A label is still required; bare mode rejects `labelHidden`. Input’s existing string `hideLabel` still names the password hide action.
|
|
454
|
+
- FormField positions its visually hidden label and empty live status within its own containing block so an overflowing inline row cannot enlarge the page scroll width.
|
|
452
455
|
- Select is for a short, fixed list. Anything searchable, or longer than roughly seven entries, is a Combobox.
|
|
453
456
|
|
|
454
457
|
**Option fields.** ControlOption, Checkbox, Radio, Choicebox, Combobox, MultiSelect, Switch, Toggle, ToggleGroup, Slider, RangeSlider.
|
|
@@ -463,7 +466,7 @@ Static WCAG stroke contrast against canvas/panel (2026-10-07): light neutral 5.3
|
|
|
463
466
|
|
|
464
467
|
|
|
465
468
|
- Toggle represents one on/off setting and reports a requested change immediately. Square Checkbox stages a form change that a submit applies; circle Checkbox marks task completion through the consumer’s change handler. Choosing the wrong one misstates when the change takes effect.
|
|
466
|
-
- Switch selects among mutually exclusive views or modes.
|
|
469
|
+
- Switch selects among mutually exclusive views or modes; its outer sm / md / lg heights are 32 / 40 / 48px on fine pointers, defaulting to md.
|
|
467
470
|
- ToggleGroup uses pressed buttons for single or multiple choices; arrow keys move focus without selecting. Icon-only items require an accessible name. See `implementation-map.md` for selection ownership.
|
|
468
471
|
- RangeSlider is two thumbs over one interval, paired with numeric inputs; Slider is a single value.
|
|
469
472
|
|
|
@@ -619,3 +622,7 @@ Before delivery, confirm each of these. They are observable; none of them is a m
|
|
|
619
622
|
In this repository, `npm run check` is the full gate; a partial run is not a pass. In consuming repositories, run their design and token gates before reporting completion.
|
|
620
623
|
|
|
621
624
|
公开 Foundation 集成:`getOverlayCoordinator` 协调 package 与宿主 overlay 的栈序、inert 与滚动锁;契约见 [Overlay Foundation](./overlay-foundation.md#11-o3-公开-host-协调扩展2026-09-08)。
|
|
625
|
+
|
|
626
|
+
### 单行控件尺寸
|
|
627
|
+
|
|
628
|
+
显式 sm / md / lg 的单行控件与 Button 对齐为 32 / 40 / 48px;使用现有 `--q1-space-8`、`--q1-control-height-default` 与 `--q1-space-2`。SearchInput 与 Menu 文字触发器默认 md,FilterChip 默认 sm32,Switch 外框 sm / md / lg 同高 32 / 40 / 48px,默认 md。Calendar 的 size 只控制网格,触发器使用 fieldSize。空或缺省 label 不创建可见标签行,消费方须提供可访问名称。粗指针最小 44px 命中规则保持现有契约。
|
package/contracts/design.md
CHANGED
|
@@ -436,19 +436,22 @@ These components ship in the package. Compose from this list before writing new
|
|
|
436
436
|
|
|
437
437
|
**Chat messages.** Bubble (incoming/outgoing, optional avatar/name/time, controlled pending/error and retry/actions slots) and MessageScroller (stable keyed items, near-bottom following, streaming growth, prepend anchor preservation, conversationKey reset, named native jump button and separate polite new-message announcements) are public components. They reuse existing tokens and Button; Message and Scroller APIs remain unchanged. Tier B uses native keyboard scrolling and buttons; callers own constrained height, message data, streaming, Markdown, tool cards, history cursors, permissions and network recovery.
|
|
438
438
|
|
|
439
|
-
**Record activity.** Timeline, TimelineItem, TimelineCollapsedGroup, Marker, Message, Mention, Composer, Attachment. Timeline uses chronological ol/li with tone dots or Avatar; TimelineCollapsedGroup uses a native disclosure for consecutive system events; Marker keeps system events quiet and dates centered. Message supports pending/failed and caller actions; Mention renders caller-owned inline member references using action-text and the selected surface. Composer is a textarea combobox with listbox mentions, Enter sends and Shift+Enter inserts a newline; IME composition never sends or picks. Attachment reuses Progress and named removal. Network, permissions and notifications remain caller-owned.
|
|
439
|
+
**Record activity.** Timeline, TimelineItem, TimelineCollapsedGroup, Marker, Message, Mention, Composer, Attachment. Timeline uses chronological ol/li with tone dots or Avatar; TimelineCollapsedGroup uses a native disclosure for consecutive system events; Marker keeps system events quiet and dates centered. Message supports pending/failed and caller actions; Mention renders caller-owned inline member references using action-text and the selected surface. Composer is a textarea combobox with listbox mentions, Enter sends and Shift+Enter inserts a newline; IME composition never sends or picks. Composer also accepts `onMentionQuery(query, {signal})` with 200ms debounce, abort/stale-result rejection, loading/empty/error states and keyboard retry; async lookup takes precedence over static members. Optional `placeholder` and `hint` preserve the input label; member instructions appear only with mention support. Han text may directly precede @, while Unicode word/email interiors do not trigger. Selection inserts text and sets the caret synchronously. Attachment reuses Progress and named removal. Network, permissions and notifications remain caller-owned.
|
|
440
440
|
|
|
441
441
|
**Actions.** Button, ButtonLink, IconButton, SplitButton, LoadMoreButton, ClearButton, CopyButton, FilterChip, Link, Toolbar.
|
|
442
442
|
|
|
443
443
|
- Button carries the action. ButtonLink navigates but reads as a button, for a page-level call to action. Link reads as text, inside a sentence. Substituting one for another makes the page read wrong.
|
|
444
444
|
- SplitButton is a primary action with an adjacent menu whose first entry mirrors it. Do not use it to hide unrelated actions behind a chevron.
|
|
445
|
-
- FilterChip opens a consumer-owned filter picker; undefined means unset, other values mean set. Its
|
|
445
|
+
- FilterChip opens a consumer-owned filter picker; undefined means unset, other values mean set. Its default sm 32px pill uses a dashed border-strong outline with CirclePlus when unset, and a solid outline with label, border-token divider, action-text value and ChevronDown when set. The optional leading CircleX clear action is a separate named native button before the picker, with its own Tab stop and shared focus ring.
|
|
446
|
+
- FilterOptionPanel is searchable single-select content inside Popover, usually anchored by FilterChip. It owns initial search focus, named combobox/listbox, active-descendant arrow navigation with disabled skipping, loading/error/retry/empty/no-match states, and label/keywords includes filtering. Callers own selection, closing, business ranking and async queries through controlled query/onQueryChange and an injected filter; Escape dismissal and trigger focus return stay with Popover. It does not provide multiselect or an application footer.
|
|
446
447
|
- IconButton requires an accessible name. An icon-only control without one is not deliverable.
|
|
447
448
|
|
|
448
449
|
**Text fields.** FormField, Label, Input, ClearableInput, SearchInput, InputOTP, Textarea, Select, Fieldset, ErrorMessage.
|
|
449
450
|
|
|
450
451
|
- InputOTP collects a fixed six-digit code in one joined group by default; `separator` explicitly enables 3+3 groups. VerificationCodeInput and VerificationCodeInputProps remain deprecated aliases for one minor version; migrate to InputOTP and InputOTPProps before their removal in the next minor version. The old `/components/verification-code-input` route redirects to `/components/input-otp`.
|
|
451
452
|
- FormField owns the label, help text, and error slot. Do not assemble those three around a bare Input.
|
|
453
|
+
- `labelHidden` defaults to false. For a single inline field already named by context, it visually hides the real associated label through `q1-sr-only` without reserving a label row or gap; description, visible error, and `aria-describedby` remain unchanged. A label is still required; bare mode rejects `labelHidden`. Input’s existing string `hideLabel` still names the password hide action.
|
|
454
|
+
- FormField positions its visually hidden label and empty live status within its own containing block so an overflowing inline row cannot enlarge the page scroll width.
|
|
452
455
|
- Select is for a short, fixed list. Anything searchable, or longer than roughly seven entries, is a Combobox.
|
|
453
456
|
|
|
454
457
|
**Option fields.** ControlOption, Checkbox, Radio, Choicebox, Combobox, MultiSelect, Switch, Toggle, ToggleGroup, Slider, RangeSlider.
|
|
@@ -463,7 +466,7 @@ Static WCAG stroke contrast against canvas/panel (2026-10-07): light neutral 5.3
|
|
|
463
466
|
|
|
464
467
|
|
|
465
468
|
- Toggle represents one on/off setting and reports a requested change immediately. Square Checkbox stages a form change that a submit applies; circle Checkbox marks task completion through the consumer’s change handler. Choosing the wrong one misstates when the change takes effect.
|
|
466
|
-
- Switch selects among mutually exclusive views or modes.
|
|
469
|
+
- Switch selects among mutually exclusive views or modes; its outer sm / md / lg heights are 32 / 40 / 48px on fine pointers, defaulting to md.
|
|
467
470
|
- ToggleGroup uses pressed buttons for single or multiple choices; arrow keys move focus without selecting. Icon-only items require an accessible name. See `implementation-map.md` for selection ownership.
|
|
468
471
|
- RangeSlider is two thumbs over one interval, paired with numeric inputs; Slider is a single value.
|
|
469
472
|
|
|
@@ -475,7 +478,7 @@ Static WCAG stroke contrast against canvas/panel (2026-10-07): light neutral 5.3
|
|
|
475
478
|
- Popover is a named anchored dialog for interactive content; it supports controlled/default open, four-side collision positioning plus controlled anchorRef placement, menu/listbox role focus, width matching, Escape focus return and outside pointer-down dismissal. Keyboard opening moves focus into content; pointer opening retains trigger focus and Tab enters the panel. It is nonmodal by default; opt-in modal locks the background and traps focus. ensurePopoverRoot exposes the same shared Foundation host for consumer-owned sibling portals; dismissExcludeRefs and nested panels preserve parent dismissal boundaries.
|
|
476
479
|
- Modal blocks and demands an answer. Use it for confirmation, not for a long form; a long form belongs in a Drawer or its own route.
|
|
477
480
|
- DestructiveActionModal is the required shape for irreversible actions. Do not rebuild that confirmation from a plain Modal.
|
|
478
|
-
- Sheet slides in from an edge with a focus trap; opt-in `mobileFullscreen` fills narrow viewports with safe-area padding and no outer inset or radius, while default floating spacing remains unchanged; Drawer is the wider panel form. Menu is anchored and flips on collision; ContextMenu and DotsMenu share its keyboard engine.
|
|
481
|
+
- Sheet slides in from an edge with a focus trap; opt-in `mobileFullscreen` fills narrow viewports with safe-area padding and no outer inset or radius, while default floating spacing remains unchanged; Drawer is the wider panel form. Menu is anchored and flips on collision; ContextMenu and DotsMenu share its keyboard engine. DotsMenu accepts contextual `label` (default 更多操作) for trigger and menu, plus `{type:'separator'}` entries using the shared Menu separator; roving focus and typeahead skip separators and disabled items.
|
|
479
482
|
- Tooltip carries a short label for a control. Anything a reader must read to decide belongs in the page or in a ContextCard.
|
|
480
483
|
|
|
481
484
|
**Data and evidence.** Table, Pagination, DocsPagination, ShowMore, Chart, Gauge, Progress, JsonView, Entity, Description, RelativeTimeCard.
|
|
@@ -619,3 +622,7 @@ Before delivery, confirm each of these. They are observable; none of them is a m
|
|
|
619
622
|
In this repository, `npm run check` is the full gate; a partial run is not a pass. In consuming repositories, run their design and token gates before reporting completion.
|
|
620
623
|
|
|
621
624
|
公开 Foundation 集成:`getOverlayCoordinator` 协调 package 与宿主 overlay 的栈序、inert 与滚动锁;契约见 [Overlay Foundation](./overlay-foundation.md#11-o3-公开-host-协调扩展2026-09-08)。
|
|
625
|
+
|
|
626
|
+
### 单行控件尺寸
|
|
627
|
+
|
|
628
|
+
显式 sm / md / lg 的单行控件与 Button 对齐为 32 / 40 / 48px;使用现有 `--q1-space-8`、`--q1-control-height-default` 与 `--q1-space-2`。SearchInput 与 Menu 文字触发器默认 md,FilterChip 默认 sm32,Switch 外框 sm / md / lg 同高 32 / 40 / 48px,默认 md。Calendar 的 size 只控制网格,触发器使用 fieldSize。空或缺省 label 不创建可见标签行,消费方须提供可访问名称。粗指针最小 44px 命中规则保持现有契约。
|
|
@@ -15,7 +15,8 @@ README owns the repository inventory and generated-file boundary. This file owns
|
|
|
15
15
|
| Mobile full-viewport details | Opt-in Sheet mobileFullscreen | `Sheet` | Existing spacing/radius/surface tokens and safe-area env | Default floating inset and overlay lifecycle preserved | Narrow viewport opt-in removes inset/radius and fills viewport | Existing focus trap, Escape and return focus |
|
|
16
16
|
| Hoverable supplemental information | Read-only member or role preview | `HoverCard`, shared anchored overlay foundation | Panel background, popover shadow, radius, spacing and motion tokens | Fine-pointer hover or keyboard focus; configurable 0ms open / 90ms close; card entry cancels close; Escape dismissal; trigger click preserved | Shared collision positioning and portal; coarse/touch hover ignored | Named native trigger, aria-describedby tooltip, no focus transfer or trap, reduced motion |
|
|
17
17
|
| Anchored interactive content | Consumer-owned inline dialog | `Popover`, `ensurePopoverRoot`, `FilterChip`, shared overlay foundation | Panel background, popover shadow, radius, spacing and motion tokens | Controlled/default open or external anchorRef (FilterChip ref forwards to picker); menu/listbox role focus; nested/excluded targets, focusout and anchor visibility dismissal; retained exit animation | Four-side collision plus auto/fixed placement; preferred-height flip, viewport clamp, matchWidth and ancestor scroll; fixed shared portal | Named dialog, expanded/controls wiring, focus return; opt-in modal trap |
|
|
18
|
-
| Compact dashboard filters | Consumer-owned filter picker | `FilterChip` | `--q1-space-
|
|
18
|
+
| Compact dashboard filters | Consumer-owned filter picker | `FilterChip` | `--q1-space-8` (default sm32), border-strong, text-secondary, action-text, shared focus | Unset dashed CirclePlus; set solid leading CircleX clear, label, divider, value and ChevronDown | Ellipsis bounds long values; shared TouchTarget preserves coarse 44px targets | Sibling native buttons, clear before picker in Tab order, focus returns to picker |
|
|
19
|
+
| Searchable filter choices | Consumer-owned single-select content | `FilterOptionPanel`, `Popover`, `FilterChip` | Existing control, surface, text, radius, spacing and focus tokens | Label/keywords includes or injected filter; controlled query; loading/error/retry/empty/no-match; select callback | Viewport-bound width and scroll list; coarse option height | Named combobox/listbox, initial search focus, aria-activedescendant, disabled skipping; Popover Escape returns to anchor |
|
|
19
20
|
| Compact search and command menu | Fast documentation navigation | `CommandMenu`, `Topbar` search trigger | Surface, border, text, focus tokens | Open, active option, escape close | Dialog width clamps on small screens | `role="dialog"`, `aria-modal`, keyboard navigation |
|
|
20
21
|
| Foundation page rhythm | Scannable reference pages | `PageHeader`, `SpecSection`, `SpecTable` | Heading, copy, border, spacing tokens | None beyond links and focus | Tables scroll horizontally when needed | Semantic headings and tables |
|
|
21
22
|
| Introduction tile grid | Entry points into public groups | `IntroTileGrid`, `IntroTile` | Surface, border, text, spacing tokens | Hover, focus | Two columns on desktop, one column on small screens | Tile is a single link with hidden decorative visual |
|
|
@@ -75,7 +76,7 @@ Command Menu cycles Tab between its search input and sole Esc keycap close butto
|
|
|
75
76
|
commands use text without leading arrows and space-8 + space-1 row height. Multi Select
|
|
76
77
|
options use background-only focus feedback; its bulk text action is compact and neutral,
|
|
77
78
|
with no divider. Coarse-pointer targets retain the existing 44px minimum; the compact
|
|
78
|
-
Command Menu close button uses the shared TouchTarget hit region.
|
|
79
|
+
Command Menu close button uses the shared TouchTarget hit region. DotsMenu accepts contextual `label` (default 更多操作) for trigger and menu, plus `{type:'separator'}` entries using the shared Menu separator; roving focus and typeahead skip separators and disabled items.
|
|
79
80
|
|
|
80
81
|
Context Switcher identifies the current context with a neutral check and regular-weight
|
|
81
82
|
labels, without selected fill or a stronger selected press layer. File Tree starts with
|
|
@@ -99,7 +100,7 @@ does not pull focus from the activated button. Consumers own URL synchronization
|
|
|
99
100
|
|
|
100
101
|
## Record activity (owner approved 2026-10-06)
|
|
101
102
|
|
|
102
|
-
Timeline / TimelineItem (ol/li, 8px token dot or Avatar), Marker (quiet actor/time, date separator), Message (default/pending/failed, caller actions) / Mention (inline action-text on selected surface), Composer (Tier A textarea combobox/listbox, IME guard, Enter send / Shift+Enter newline), Attachment (Progress, retry/remove) are public package components. TimelineCollapsedGroup uses a native disclosure button with aria-expanded and Enter/Space; callers group runs of consecutive system events (docs example uses three or more). Marker unread uses centered action text; caller places and scrolls to the boundary. Message acknowledgements and its caller-owned actions slot display receipt state. Composer commands share the mention combobox/listbox keyboard model and IME guard; known slash commands invoke onCommand instead of onSubmit. Attachment paste/drop passes File[] to onAttach; legacy clicks remain argument-free. Callers own the file picker and object URLs and revoke previews on removal or unmount. Existing tokens only; data, permissions, network and notifications remain caller-owned.
|
|
103
|
+
Timeline / TimelineItem (ol/li, 8px token dot or Avatar), Marker (quiet actor/time, date separator), Message (default/pending/failed, caller actions) / Mention (inline action-text on selected surface), Composer (Tier A textarea combobox/listbox, IME guard, Enter send / Shift+Enter newline), Attachment (Progress, retry/remove) are public package components. TimelineCollapsedGroup uses a native disclosure button with aria-expanded and Enter/Space; callers group runs of consecutive system events (docs example uses three or more). Marker unread uses centered action text; caller places and scrolls to the boundary. Message acknowledgements and its caller-owned actions slot display receipt state. Composer also accepts `onMentionQuery(query, {signal})` with 200ms debounce, abort/stale-result rejection, loading/empty/error states and keyboard retry; async lookup takes precedence over static members. Optional `placeholder` and `hint` preserve the input label; member instructions appear only with mention support. Han text may directly precede @, while Unicode word/email interiors do not trigger. Selection inserts text and sets the caret synchronously. Composer commands share the mention combobox/listbox keyboard model and IME guard; known slash commands invoke onCommand instead of onSubmit. Attachment paste/drop passes File[] to onAttach; legacy clicks remain argument-free. Callers own the file picker and object URLs and revoke previews on removal or unmount. Existing tokens only; data, permissions, network and notifications remain caller-owned.
|
|
103
104
|
Timeline / TimelineItem (ol/li, 8px token dot or Avatar), Marker (quiet actor/time, date separator), Message (default/pending/failed, caller actions) / Mention (inline action-text on selected surface), Composer (Tier A textarea combobox/listbox, IME guard, Enter send / Shift+Enter newline), Attachment (Progress, retry/remove) are public package components. `/patterns/record-activity` composes order facts, Switch, chronological activity and a pinned Composer. Existing tokens only; data, permissions, network and notifications remain caller-owned.
|
|
104
105
|
|
|
105
106
|
## ToggleGroup selection ownership
|
|
@@ -126,3 +127,11 @@ The consumer mapping was checked against q1travel-web origin/main: `src/componen
|
|
|
126
127
|
| conversation switching / new conversation | conversationKey resets follow state, visible anchor and announcement |
|
|
127
128
|
| scroll-to-latest and streaming narration | named jumpLabel button, labelled region, separate polite announcement; caller can pass completed-turn text or empty announcement to silence |
|
|
128
129
|
Keyboard: native viewport Arrow/PageUp/PageDown/Home/End; Tab reaches the viewport and buttons; Enter/Space activates retry or jump. Jump moves focus to the viewport before its button disappears. No custom composite widget keyboard model is introduced.
|
|
130
|
+
|
|
131
|
+
## Hidden field labels
|
|
132
|
+
|
|
133
|
+
Owner approved 2026-10-08: additive `labelHidden?: boolean` (default false) keeps a real associated label through `q1-sr-only` while removing its visual row and gap. Input, Textarea, Select, InputOTP and Checkbox/Radio (including circular Checkbox) expose the shell option; bare mode rejects it. SearchInput and Combobox compositions use `FormField labelHidden`, preserving their existing APIs. Calendar/RangeField does not consume FieldShellProps and retains its existing date-trigger behavior. Errors and descriptions remain visible and connected through `aria-describedby`. Input's existing string `hideLabel` remains the password hide-action copy.
|
|
134
|
+
|
|
135
|
+
`FormField` establishes a relative containing block for hidden labels and empty status regions. Package consumer fixtures enforce label ownership, SSR contracts cover names/messages, and `scripts/lib/check-label-hidden-browser.mjs` checks native labels, visible errors, inline Button alignment and a deterministic 390px scrollable max-content row without page overflow.
|
|
136
|
+
## Control density scale
|
|
137
|
+
Owner approved 2026-10-08: explicitly sized single-line Button, ButtonLink, Input, SearchInput, Select, RangeField trigger, Menu text trigger and FilterChip share sm32 / md40 / lg48 on fine pointers. SearchInput defaults to md and retains native numeric size compatibility; FilterChip defaults to sm32. Menu text triggers default to md40 after the rendered fine-pointer audit confirmed the prior omitted-size trigger measured 38–39px; icon triggers retain their prior behavior. Calendar size remains grid-only; fieldSize controls its trigger. Switch outer sm / md / lg heights align to 32 / 40 / 48px, defaulting to md; coarse-pointer 44px rules remain unchanged. FormField and Select omit empty or absent visible labels; callers supply aria-label, aria-labelledby or a native external label. Select reuses the development-only bare-field accessible-name warning.
|
|
@@ -24,7 +24,7 @@ Adding a clause therefore means answering two questions before the wording: who
|
|
|
24
24
|
- [both] MUST use native links for navigation and native buttons for actions.
|
|
25
25
|
- [both] MUST keep visual and hit targets aligned; controls smaller than 24px need a larger interactive area.
|
|
26
26
|
- [both] MUST keep mobile control targets at least 44px where touch is expected.
|
|
27
|
-
- [both] MUST use `--q1-touch-target-min` (44px) for the shared centered invisible child-span hit region of Button (all sizes, including compact consumer overrides and icon-only), CopyButton, Menu/DotsMenu triggers, Description info/hint buttons, and the independent FilterChip picker/clear buttons only under `(pointer: coarse), (any-pointer: coarse)`. Preserve every existing coarse-pointer visual-size rule. Only axes still below the minimum receive extra hit area; existing 44px targets do not expand outside their visual frame. The region covers the complete border box: canonical Button/CopyButton/Menu/DotsMenu borders are 1px, while Description borders are none. Consumers overriding a control border width must also set its private `--touch-target-border-width` to the actual per-side width (including zero for `border: none`); asymmetric borders need their own hit-region sizing. FilterChip keeps its
|
|
27
|
+
- [both] MUST use `--q1-touch-target-min` (44px) for the shared centered invisible child-span hit region of Button (all sizes, including compact consumer overrides and icon-only), CopyButton, Menu/DotsMenu triggers, Description info/hint buttons, and the independent FilterChip picker/clear buttons only under `(pointer: coarse), (any-pointer: coarse)`. Preserve every existing coarse-pointer visual-size rule. Only axes still below the minimum receive extra hit area; existing 44px targets do not expand outside their visual frame. The region covers the complete border box: canonical Button/CopyButton/Menu/DotsMenu borders are 1px, while Description borders are none. Consumers overriding a control border width must also set its private `--touch-target-border-width` to the actual per-side width (including zero for `border: none`); asymmetric borders need their own hit-region sizing. FilterChip keeps its default sm32 visual height and existing gaps/margins; its picker and clear hit regions must not overlap. Menu item rows use a real `min-height: var(--q1-touch-target-min)` under the same coarse-pointer query so neighboring rows remain independent. Focus rings stay on the visual control; child hit-region events activate that native control without replacing its pseudo-elements or overflow rules.
|
|
28
28
|
- [both] MUST leave enough space for expanded targets: dense neighbors must not overlap each other's visual frames. Consumers must reserve the expansion on each side and avoid clipping ancestors; if this is impossible, regroup controls or use larger visual controls. The shared region cannot infer neighbor gaps or escape control/ancestor clipping; clipped compact controls must use a visual size of at least 44px.
|
|
29
29
|
- [both] SHOULD deliberately depart from Geist's measured 24–32px controls without coarse-pointer enlargement: Apple HIG's 44pt guidance and WCAG 2.5.5 motivate q1travel's 44×44 CSS-pixel mobile usability target; pt and CSS pixels are different units.
|
|
30
30
|
- [both] NEVER disable browser zoom.
|
|
@@ -209,7 +209,7 @@ Theming owns tokens and `color-scheme`; the interaction-contrast rule lives in D
|
|
|
209
209
|
- [both] SHOULD resolve data states in the order loading → error → empty → content.
|
|
210
210
|
- [both] SHOULD give every flow a way forward and a way back (「取消」「返回」), and confirm costly or hard-to-reverse actions before running them.
|
|
211
211
|
|
|
212
|
-
These copy clauses
|
|
212
|
+
These copy clauses keep reader address and empty states consistent with a formal business console: address the reader as 「您」, omit trailing punctuation from empty-state titles, and explain when content will appear in the description.
|
|
213
213
|
|
|
214
214
|
### Component Naming
|
|
215
215
|
|
|
@@ -218,7 +218,7 @@ These copy clauses follow the actual Stripe Chinese Dashboard for reader address
|
|
|
218
218
|
|
|
219
219
|
### Component Documentation Pages
|
|
220
220
|
|
|
221
|
-
Component pages follow one skeleton so a reader who has used one page can find the same thing on every other. The shape
|
|
221
|
+
Component pages follow one skeleton so a reader who has used one page can find the same thing on every other. The shape keeps every page predictable: one sentence says what the component is for, the fixed sections sit in a fixed order, and only the feature sections in the middle vary by component. Shared terms live in `.agents/skills/product-design/references/glossary.md`.
|
|
222
222
|
|
|
223
223
|
- [repo] MUST open each component page with one sentence that says what a reader uses the component for. It names no props, no implementation, and no 「输入…输出…」 pairing.
|
|
224
224
|
- [repo] MUST keep the fixed sections in this order: examples first, then feature sections, then 「API」, then 「使用原则」, then 「可访问性」 where the page has one, then 「另请参阅」 as the last section.
|
|
@@ -426,7 +426,7 @@ declare type CheckboxOnlyProps = {
|
|
|
426
426
|
};
|
|
427
427
|
|
|
428
428
|
/** Checkbox 的完整 props。消费方包一层时用它标注,无需知道内部由哪几块组合而成。 */
|
|
429
|
-
export declare type CheckboxProps = ControlOptionOwnProps & (FieldShellProps | FieldBareProps) & CheckboxOnlyProps & {
|
|
429
|
+
export declare type CheckboxProps = ControlOptionOwnProps & (FieldShellProps | FieldBareProps) & FieldLabelVisibilityProps & CheckboxOnlyProps & {
|
|
430
430
|
/** 圆形仅用于任务与清单完成;表单多选保留默认方形。 */
|
|
431
431
|
shape?: 'square' | 'circle';
|
|
432
432
|
/** 仅圆形生效;业务方自行映射优先级。 */
|
|
@@ -628,7 +628,7 @@ export declare type CommandMenuSection = {
|
|
|
628
628
|
items: CommandMenuItem[];
|
|
629
629
|
};
|
|
630
630
|
|
|
631
|
-
export declare function Composer({ onSubmit, onAttach, attachments, mentions, commands, onCommand, disabled, }: ComposerProps): JSX.Element;
|
|
631
|
+
export declare function Composer({ onSubmit, onAttach, attachments, mentions, onMentionQuery, placeholder, hint, commands, onCommand, disabled, }: ComposerProps): JSX.Element;
|
|
632
632
|
|
|
633
633
|
export declare type ComposerCommand = ComposerMention & {
|
|
634
634
|
keywords?: string[];
|
|
@@ -647,6 +647,9 @@ export declare type ComposerProps = {
|
|
|
647
647
|
onCommand?: (id: string, argumentText: string) => void;
|
|
648
648
|
attachments?: ReactNode;
|
|
649
649
|
mentions?: ComposerMention[];
|
|
650
|
+
onMentionQuery?: MentionQuery;
|
|
651
|
+
placeholder?: string;
|
|
652
|
+
hint?: ReactNode;
|
|
650
653
|
disabled?: boolean;
|
|
651
654
|
};
|
|
652
655
|
|
|
@@ -798,7 +801,7 @@ export declare type ContextSwitcherSearch = {
|
|
|
798
801
|
noResults: ContextSwitcherEmptyState;
|
|
799
802
|
};
|
|
800
803
|
|
|
801
|
-
export declare function ControlOption({ id, label, description, error, indeterminate, ref, type, 'aria-describedby': ariaDescribedBy, 'aria-invalid': ariaInvalid, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, onClick, ...rest }: ControlOptionProps): JSX.Element;
|
|
804
|
+
export declare function ControlOption({ id, label, labelHidden, description, error, indeterminate, ref, type, 'aria-describedby': ariaDescribedBy, 'aria-invalid': ariaInvalid, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, onClick, ...rest }: ControlOptionProps): JSX.Element;
|
|
802
805
|
|
|
803
806
|
declare type ControlOptionNativeInputProps = Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'type'>;
|
|
804
807
|
|
|
@@ -810,7 +813,7 @@ declare type ControlOptionOwnProps = {
|
|
|
810
813
|
};
|
|
811
814
|
|
|
812
815
|
/** ControlOption 的完整 props(Checkbox / Radio 的共同底座,须显式给 type)。 */
|
|
813
|
-
export declare type ControlOptionProps = ControlOptionOwnProps & (FieldShellProps | FieldBareProps) & CheckboxOnlyProps & {
|
|
816
|
+
export declare type ControlOptionProps = ControlOptionOwnProps & (FieldShellProps | FieldBareProps) & FieldLabelVisibilityProps & CheckboxOnlyProps & {
|
|
814
817
|
type: 'checkbox' | 'radio';
|
|
815
818
|
} & ControlOptionNativeInputProps;
|
|
816
819
|
|
|
@@ -868,14 +871,18 @@ export declare type DocsPaginationProps = {
|
|
|
868
871
|
next?: DocsPageLink;
|
|
869
872
|
};
|
|
870
873
|
|
|
871
|
-
export declare function DotsMenu({ entries, size, disabled, align, }: {
|
|
874
|
+
export declare function DotsMenu({ entries, size, disabled, align, label, }: {
|
|
872
875
|
entries: DotsMenuEntry[];
|
|
876
|
+
label?: string;
|
|
873
877
|
size?: 'sm' | 'md' | 'lg';
|
|
874
878
|
disabled?: boolean;
|
|
875
879
|
align?: 'start' | 'end';
|
|
876
880
|
}): JSX.Element;
|
|
877
881
|
|
|
878
882
|
export declare type DotsMenuEntry = {
|
|
883
|
+
type: 'separator';
|
|
884
|
+
} | {
|
|
885
|
+
type?: 'item';
|
|
879
886
|
label: string;
|
|
880
887
|
disabled?: boolean;
|
|
881
888
|
danger?: boolean;
|
|
@@ -967,6 +974,14 @@ declare type FieldBareProps = {
|
|
|
967
974
|
error?: never;
|
|
968
975
|
};
|
|
969
976
|
|
|
977
|
+
export declare type FieldLabelVisibilityProps = {
|
|
978
|
+
label: string;
|
|
979
|
+
labelHidden?: boolean;
|
|
980
|
+
} | {
|
|
981
|
+
label?: never;
|
|
982
|
+
labelHidden?: never;
|
|
983
|
+
};
|
|
984
|
+
|
|
970
985
|
export declare function Fieldset({ title, subtitle, tone, footerStatus, footerAction, disabled, children, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledby, }: {
|
|
971
986
|
title?: string;
|
|
972
987
|
subtitle: string;
|
|
@@ -1006,6 +1021,8 @@ export declare type FileTreeNode = {
|
|
|
1006
1021
|
/** 筛选选择器入口;弹层、筛选值与 expanded 状态归调用方。 */
|
|
1007
1022
|
export declare const FilterChip: ForwardRefExoticComponent< {
|
|
1008
1023
|
label: string;
|
|
1024
|
+
/** 可选同高尺寸;默认 sm(32px)胶囊。 */
|
|
1025
|
+
size?: ButtonSize;
|
|
1009
1026
|
/** undefined 表示未设置;0、空字符串和 null 仍是已设置。 */
|
|
1010
1027
|
value?: ReactNode;
|
|
1011
1028
|
onClear?: () => void;
|
|
@@ -1013,19 +1030,49 @@ onClear?: () => void;
|
|
|
1013
1030
|
|
|
1014
1031
|
export declare type FilterChipProps = {
|
|
1015
1032
|
label: string;
|
|
1033
|
+
/** 可选同高尺寸;默认 sm(32px)胶囊。 */
|
|
1034
|
+
size?: ButtonSize;
|
|
1016
1035
|
/** undefined 表示未设置;0、空字符串和 null 仍是已设置。 */
|
|
1017
1036
|
value?: ReactNode;
|
|
1018
1037
|
onClear?: () => void;
|
|
1019
1038
|
} & Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children' | 'value'>;
|
|
1020
1039
|
|
|
1021
|
-
export declare
|
|
1022
|
-
|
|
1040
|
+
export declare type FilterOption = {
|
|
1041
|
+
value: string;
|
|
1023
1042
|
label: string;
|
|
1024
1043
|
description?: string;
|
|
1044
|
+
keywords?: string[];
|
|
1045
|
+
disabled?: boolean;
|
|
1046
|
+
};
|
|
1047
|
+
|
|
1048
|
+
/** 可搜索单选内容;调用方通过 Popover 管理关闭和入口焦点。每次打开时面板自行把焦点放进搜索框,无需向 Popover 传 initialFocus。 */
|
|
1049
|
+
export declare function FilterOptionPanel({ options, value, onSelect, label, searchPlaceholder, loading, error, onRetry, emptyText, noMatchText, filter, query: controlledQuery, onQueryChange }: FilterOptionPanelProps): JSX.Element;
|
|
1050
|
+
|
|
1051
|
+
export declare type FilterOptionPanelProps = {
|
|
1052
|
+
options: FilterOption[];
|
|
1053
|
+
value?: string;
|
|
1054
|
+
onSelect: (value: string) => void;
|
|
1055
|
+
/** 搜索框与列表的可访问名称。 */
|
|
1056
|
+
label: string;
|
|
1057
|
+
searchPlaceholder?: string;
|
|
1058
|
+
loading?: boolean;
|
|
1059
|
+
error?: ReactNode;
|
|
1060
|
+
onRetry?: () => void;
|
|
1061
|
+
emptyText?: ReactNode;
|
|
1062
|
+
noMatchText?: (query: string) => ReactNode;
|
|
1063
|
+
filter?: (options: FilterOption[], query: string) => FilterOption[];
|
|
1064
|
+
query?: string;
|
|
1065
|
+
onQueryChange?: (query: string) => void;
|
|
1066
|
+
};
|
|
1067
|
+
|
|
1068
|
+
export declare function FormField({ controlId, label, labelHidden, description, error, wide, children, }: {
|
|
1069
|
+
controlId: string;
|
|
1070
|
+
label?: string;
|
|
1071
|
+
description?: string;
|
|
1025
1072
|
error?: string;
|
|
1026
1073
|
wide?: boolean;
|
|
1027
1074
|
children: ReactNode;
|
|
1028
|
-
}): JSX.Element;
|
|
1075
|
+
} & FieldLabelVisibilityProps): JSX.Element;
|
|
1029
1076
|
|
|
1030
1077
|
export declare function Gauge({ value, size, showValue, tone, toneDirection, label, indeterminate, }: {
|
|
1031
1078
|
value?: number;
|
|
@@ -1094,7 +1141,7 @@ export declare type IconButtonProps = IconButtonAccessibleName & IconButtonBaseP
|
|
|
1094
1141
|
ref?: Ref<HTMLButtonElement>;
|
|
1095
1142
|
};
|
|
1096
1143
|
|
|
1097
|
-
export declare function Input({ id, label, description, error, invalid, errorId, ref, prefix, suffix, prefixStyling, suffixStyling, rounded, wide, size, className, revealable, revealed, onRevealedChange, revealLabel, hideLabel, disabled, ...rest }: {
|
|
1144
|
+
export declare function Input({ id, label, labelHidden, description, error, invalid, errorId, ref, prefix, suffix, prefixStyling, suffixStyling, rounded, wide, size, className, revealable, revealed, onRevealedChange, revealLabel, hideLabel, disabled, ...rest }: {
|
|
1098
1145
|
/** 可选:未传时内部 useId 兜底(对齐 Combobox);显式传入时行为同 0.3.0。 */
|
|
1099
1146
|
id?: string;
|
|
1100
1147
|
/** 置 aria-invalid 的业务校验态,不渲染文案;与壳模式 error 并轨(invalid || Boolean(error))。 */
|
|
@@ -1131,9 +1178,9 @@ export declare function Input({ id, label, description, error, invalid, errorId,
|
|
|
1131
1178
|
rounded?: boolean;
|
|
1132
1179
|
wide?: boolean;
|
|
1133
1180
|
size?: FieldSize;
|
|
1134
|
-
} & (FieldShellProps | FieldBareProps) & Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'size' | 'prefix'>): JSX.Element;
|
|
1181
|
+
} & (FieldShellProps | FieldBareProps) & FieldLabelVisibilityProps & Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'size' | 'prefix'>): JSX.Element;
|
|
1135
1182
|
|
|
1136
|
-
export declare function InputOTP({ id, name, value, onValueChange, disabled, readOnly, required, invalid, errorId, size, separator, ref, label, description, error, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, 'aria-describedby': describedBy, }: InputOTPProps): JSX.Element;
|
|
1183
|
+
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;
|
|
1137
1184
|
|
|
1138
1185
|
export declare type InputOTPProps = {
|
|
1139
1186
|
id?: string;
|
|
@@ -1151,7 +1198,7 @@ export declare type InputOTPProps = {
|
|
|
1151
1198
|
separator?: boolean;
|
|
1152
1199
|
ref?: Ref<HTMLInputElement>;
|
|
1153
1200
|
'aria-describedby'?: string;
|
|
1154
|
-
} & ((FieldShellProps & {
|
|
1201
|
+
} & FieldLabelVisibilityProps & ((FieldShellProps & {
|
|
1155
1202
|
'aria-label'?: never;
|
|
1156
1203
|
'aria-labelledby'?: never;
|
|
1157
1204
|
}) | (FieldBareProps & ({
|
|
@@ -1264,8 +1311,14 @@ export declare type MentionProps = {
|
|
|
1264
1311
|
children: ReactNode;
|
|
1265
1312
|
};
|
|
1266
1313
|
|
|
1267
|
-
|
|
1314
|
+
declare type MentionQuery = (query: string, options: {
|
|
1315
|
+
signal: AbortSignal;
|
|
1316
|
+
}) => Promise<ComposerMention[]>;
|
|
1317
|
+
|
|
1318
|
+
export declare function Menu({ label, entries, withChevron, align, triggerContent, size }: {
|
|
1268
1319
|
label: string;
|
|
1320
|
+
/** 文字触发器尺寸,默认 md;图标触发器保留原尺寸。 */
|
|
1321
|
+
size?: ButtonSize;
|
|
1269
1322
|
entries: MenuEntry[];
|
|
1270
1323
|
withChevron?: boolean;
|
|
1271
1324
|
align?: 'start' | 'end';
|
|
@@ -1709,7 +1762,7 @@ export declare function Q1travelSymbol(props: SVGProps<SVGSVGElement>): JSX.Elem
|
|
|
1709
1762
|
export declare function Radio({ ...props }: RadioProps): JSX.Element;
|
|
1710
1763
|
|
|
1711
1764
|
/** Radio 的完整 props。 */
|
|
1712
|
-
export declare type RadioProps = ControlOptionOwnProps & (FieldShellProps | FieldBareProps) & ControlOptionNativeInputProps;
|
|
1765
|
+
export declare type RadioProps = ControlOptionOwnProps & (FieldShellProps | FieldBareProps) & FieldLabelVisibilityProps & ControlOptionNativeInputProps;
|
|
1713
1766
|
|
|
1714
1767
|
export declare function RangeField(props: CalendarSelectionProps & {
|
|
1715
1768
|
layout?: PopoverLayout;
|
|
@@ -1819,10 +1872,12 @@ export declare type SearchDialogTriggerProps = {
|
|
|
1819
1872
|
'aria-controls': string;
|
|
1820
1873
|
};
|
|
1821
1874
|
|
|
1822
|
-
export declare function SearchInput({ id, ariaLabel, value: controlledValue, defaultValue, onValueChange, loading, kbdHint, icon, ref, className, disabled, readOnly, autoComplete, spellCheck, onKeyDown: onInputKeyDown, ...inputProps }: SearchInputProps): JSX.Element;
|
|
1875
|
+
export declare function SearchInput({ id, size, ariaLabel, value: controlledValue, defaultValue, onValueChange, loading, kbdHint, icon, ref, className, disabled, readOnly, autoComplete, spellCheck, onKeyDown: onInputKeyDown, ...inputProps }: SearchInputProps): JSX.Element;
|
|
1823
1876
|
|
|
1824
1877
|
export declare type SearchInputProps = {
|
|
1825
1878
|
id: string;
|
|
1879
|
+
/** 与 Button 同高,默认 md;数字保留原生 input 的字符宽度语义。 */
|
|
1880
|
+
size?: ButtonSize | number;
|
|
1826
1881
|
/** 无可见 label 时的可访问名;与 FormField 或外部 label 组合时留空。 */
|
|
1827
1882
|
ariaLabel?: string;
|
|
1828
1883
|
value?: string;
|
|
@@ -1835,11 +1890,11 @@ export declare type SearchInputProps = {
|
|
|
1835
1890
|
icon?: ReactNode;
|
|
1836
1891
|
/** React 19 ref-as-prop,指向原生 search input。 */
|
|
1837
1892
|
ref?: Ref<HTMLInputElement>;
|
|
1838
|
-
} & Omit<InputHTMLAttributes<HTMLInputElement>, 'aria-label' | 'defaultValue' | 'id' | 'onChange' | 'ref' | 'type' | 'value'>;
|
|
1893
|
+
} & Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'aria-label' | 'defaultValue' | 'id' | 'onChange' | 'ref' | 'type' | 'value'>;
|
|
1839
1894
|
|
|
1840
|
-
export declare function Select({ id, label, description, error, ref, wide, size, prefix, suffix, className, children, value, defaultValue, multiple, 'aria-describedby': ariaDescribedBy, 'aria-invalid': ariaInvalid, ...rest }: {
|
|
1895
|
+
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 }: {
|
|
1841
1896
|
id: string;
|
|
1842
|
-
label
|
|
1897
|
+
label?: string;
|
|
1843
1898
|
description?: string;
|
|
1844
1899
|
error?: string;
|
|
1845
1900
|
/** 指向原生 select(React 19 ref-as-prop),供表单校验后聚焦等场景。 */
|
|
@@ -1847,7 +1902,7 @@ export declare function Select({ id, label, description, error, ref, wide, size,
|
|
|
1847
1902
|
wide?: boolean;
|
|
1848
1903
|
size?: FieldSize;
|
|
1849
1904
|
prefix?: ReactNode;
|
|
1850
|
-
/** 装饰性后缀图标(aria-hidden),渲染在下拉箭头左侧;跟 prefix
|
|
1905
|
+
/** 装饰性后缀图标(aria-hidden),渲染在下拉箭头左侧;跟 prefix 前缀一样不承载信息,可访问名称来自可见 label 或消费方提供的 ARIA / 外部 label。 */
|
|
1851
1906
|
suffix?: ReactNode;
|
|
1852
1907
|
children: ReactNode;
|
|
1853
1908
|
/** Select 只接受单一值;多值选择使用 MultiSelect。 */
|
|
@@ -1856,7 +1911,7 @@ export declare function Select({ id, label, description, error, ref, wide, size,
|
|
|
1856
1911
|
defaultValue?: string | number;
|
|
1857
1912
|
/** Select 是单选字段;多值选择使用 MultiSelect。 */
|
|
1858
1913
|
multiple?: never;
|
|
1859
|
-
} & Omit<SelectHTMLAttributes<HTMLSelectElement>, 'id' | 'children' | 'size' | 'prefix' | 'multiple' | 'value' | 'defaultValue'>): JSX.Element;
|
|
1914
|
+
} & FieldLabelVisibilityProps & Omit<SelectHTMLAttributes<HTMLSelectElement>, 'id' | 'children' | 'size' | 'prefix' | 'multiple' | 'value' | 'defaultValue'>): JSX.Element;
|
|
1860
1915
|
|
|
1861
1916
|
export declare function Separator({ orientation, decorative, className, }: {
|
|
1862
1917
|
orientation?: SeparatorOrientation;
|
|
@@ -2147,7 +2202,7 @@ export declare function Tabs({ tabs, ariaLabel, variant, value, defaultValue, on
|
|
|
2147
2202
|
onValueChange?: (id: string) => void;
|
|
2148
2203
|
}): JSX.Element | null;
|
|
2149
2204
|
|
|
2150
|
-
export declare function Textarea({ id, label, description, error, invalid, errorId, ref, wide, size, className, maxLength, onInput, ...rest }: TextareaProps): JSX.Element;
|
|
2205
|
+
export declare function Textarea({ id, label, labelHidden, description, error, invalid, errorId, ref, wide, size, className, maxLength, onInput, ...rest }: TextareaProps): JSX.Element;
|
|
2151
2206
|
|
|
2152
2207
|
/** Textarea 的完整 props。消费方包一层时用它标注,无需知道内部由哪几块组合而成。 */
|
|
2153
2208
|
export declare type TextareaProps = {
|
|
@@ -2161,7 +2216,7 @@ export declare type TextareaProps = {
|
|
|
2161
2216
|
ref?: Ref<HTMLTextAreaElement>;
|
|
2162
2217
|
wide?: boolean;
|
|
2163
2218
|
size?: FieldSize;
|
|
2164
|
-
} & (FieldShellProps | FieldBareProps) & Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'id'>;
|
|
2219
|
+
} & (FieldShellProps | FieldBareProps) & FieldLabelVisibilityProps & Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'id'>;
|
|
2165
2220
|
|
|
2166
2221
|
export declare function TextWithCopyButton({ text, copyValue, successMessage, size, }: {
|
|
2167
2222
|
text: string;
|