ionbase-ui 0.76.0 → 0.81.1
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/dist/components/Card.d.ts +61 -0
- package/dist/components/Card.d.ts.map +1 -0
- package/dist/components/Card.js +37 -0
- package/dist/components/Card.js.map +1 -0
- package/dist/components/CommandPalette.d.ts +76 -0
- package/dist/components/CommandPalette.d.ts.map +1 -0
- package/dist/components/CommandPalette.js +194 -0
- package/dist/components/CommandPalette.js.map +1 -0
- package/dist/components/DateField.d.ts +14 -0
- package/dist/components/DateField.d.ts.map +1 -1
- package/dist/components/DateField.js +1 -1
- package/dist/components/DateField.js.map +1 -1
- package/dist/components/DatePicker.d.ts +1 -1
- package/dist/components/DatePicker.d.ts.map +1 -1
- package/dist/components/DatePicker.js +14 -6
- package/dist/components/DatePicker.js.map +1 -1
- package/dist/components/DateRangePicker.d.ts +1 -1
- package/dist/components/DateRangePicker.d.ts.map +1 -1
- package/dist/components/DateRangePicker.js +14 -6
- package/dist/components/DateRangePicker.js.map +1 -1
- package/dist/components/Kbd.d.ts +45 -0
- package/dist/components/Kbd.d.ts.map +1 -0
- package/dist/components/Kbd.js +45 -0
- package/dist/components/Kbd.js.map +1 -0
- package/dist/components/Table.d.ts +18 -0
- package/dist/components/Table.d.ts.map +1 -1
- package/dist/components/Table.js +14 -3
- package/dist/components/Table.js.map +1 -1
- package/dist/components/TagGroup.d.ts +51 -0
- package/dist/components/TagGroup.d.ts.map +1 -0
- package/dist/components/TagGroup.js +84 -0
- package/dist/components/TagGroup.js.map +1 -0
- package/dist/components/TimeField.d.ts +72 -0
- package/dist/components/TimeField.d.ts.map +1 -0
- package/dist/components/TimeField.js +102 -0
- package/dist/components/TimeField.js.map +1 -0
- package/dist/components/index.d.ts +14 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +6 -0
- package/dist/components/index.js.map +1 -1
- package/dist/components/iso-time.d.ts +23 -0
- package/dist/components/iso-time.d.ts.map +1 -0
- package/dist/components/iso-time.js +34 -0
- package/dist/components/iso-time.js.map +1 -0
- package/dist/components/shortcut.d.ts +19 -0
- package/dist/components/shortcut.d.ts.map +1 -0
- package/dist/components/shortcut.js +122 -0
- package/dist/components/shortcut.js.map +1 -0
- package/dist/components/use-table-sort.d.ts +38 -0
- package/dist/components/use-table-sort.d.ts.map +1 -0
- package/dist/components/use-table-sort.js +33 -0
- package/dist/components/use-table-sort.js.map +1 -0
- package/dist/figma-descriptions.json +103 -68
- package/dist/figma-map.json +343 -2
- package/dist/meta/Card.json +153 -0
- package/dist/meta/Checkbox.json +2 -2
- package/dist/meta/CommandPalette.json +178 -0
- package/dist/meta/DatePicker.json +5 -4
- package/dist/meta/DateRangePicker.json +3 -2
- package/dist/meta/Kbd.json +97 -0
- package/dist/meta/Radio.json +2 -2
- package/dist/meta/RadioGroup.json +2 -2
- package/dist/meta/Table.json +4 -1
- package/dist/meta/TableBody.json +3 -0
- package/dist/meta/TableCell.json +49 -5
- package/dist/meta/TableHead.json +3 -0
- package/dist/meta/TableRow.json +3 -0
- package/dist/meta/Tag.json +54 -0
- package/dist/meta/TagGroup.json +211 -0
- package/dist/meta/TimeField.json +224 -0
- package/dist/meta/Toggle.json +2 -2
- package/dist/meta/components.json +1014 -38
- package/dist/meta/contrast.json +1133 -6
- package/dist/meta/index.json +86 -12
- package/dist/meta/patterns/DataTable.json +27 -3
- package/dist/meta/patterns/PageShell.json +15 -2
- package/dist/meta/patterns/index.json +7 -3
- package/dist/styles/agent-activity.css +4 -2
- package/dist/styles/approval-gate.css +4 -3
- package/dist/styles/card.css +75 -0
- package/dist/styles/citation.css +4 -2
- package/dist/styles/command-palette.css +250 -0
- package/dist/styles/confidence-indicator.css +2 -2
- package/dist/styles/index.css +5 -0
- package/dist/styles/kbd.css +47 -0
- package/dist/styles/streaming-text.css +3 -2
- package/dist/styles/table.css +51 -0
- package/dist/styles/tag-group.css +172 -0
- package/dist/styles/time-field.css +31 -0
- package/llms.txt +2 -2
- package/package.json +1 -1
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"package": "ionbase-ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.81.1",
|
|
4
4
|
"generated": "by scripts/build-meta.mjs — do not edit; intent lives in meta/*.json",
|
|
5
5
|
"hooks": [
|
|
6
6
|
"useAgentRun",
|
|
7
|
+
"useTableSort",
|
|
7
8
|
"useToast"
|
|
8
9
|
],
|
|
9
10
|
"helpers": [
|
|
@@ -2665,6 +2666,159 @@
|
|
|
2665
2666
|
"other": 0
|
|
2666
2667
|
}
|
|
2667
2668
|
},
|
|
2669
|
+
"Card": {
|
|
2670
|
+
"name": "Card",
|
|
2671
|
+
"source": "src/components/Card.tsx",
|
|
2672
|
+
"propsType": "CardProps",
|
|
2673
|
+
"description": "Card — a bordered surface that groups one part of a page.\n\nPromoted from the demo app, where the same surface was hand-written as\n`.demo-panel` in nine screens: a settings group, a chart panel, a runs log,\nthe danger zone. For a feature row with media use FullCard; for one\nheadline figure use StatTile.\n\nTHE TITLE DECIDES THE ELEMENT\n\nA titled card is a `<section aria-labelledby>` — a named region, so a\nscreen reader user can jump between cards the way a sighted one scans\nthem. An untitled card is a `<div>`: a `<section>` with no name is not a\nlandmark at all, and pretending otherwise only adds noise.\n\nNo `'use client'`: `useId` resolves on the server, and nothing here is\ninteractive. Interactive parts arrive through `action` and `children`.",
|
|
2674
|
+
"import": "import { Card } from 'ionbase-ui';",
|
|
2675
|
+
"status": "stable",
|
|
2676
|
+
"since": "0.77.0",
|
|
2677
|
+
"summary": "A bordered surface that groups one part of a page, with an optional title row. A titled card is a named region; an untitled one is a plain surface.",
|
|
2678
|
+
"useWhen": [
|
|
2679
|
+
"a page is several distinct groups — settings sections, dashboard panels, a log beside a chart",
|
|
2680
|
+
"a group needs a title, a one-line description or a single action like \"All runs\"",
|
|
2681
|
+
"a loading placeholder needs the same frame as the content it stands in for"
|
|
2682
|
+
],
|
|
2683
|
+
"useInstead": [
|
|
2684
|
+
{
|
|
2685
|
+
"when": "it is a feature row with a headline, text and a media panel",
|
|
2686
|
+
"use": "FullCard"
|
|
2687
|
+
},
|
|
2688
|
+
{
|
|
2689
|
+
"when": "it is one headline figure and how it moved",
|
|
2690
|
+
"use": "StatTile"
|
|
2691
|
+
},
|
|
2692
|
+
{
|
|
2693
|
+
"when": "the content is a list of settings, each with a label and a control",
|
|
2694
|
+
"use": "SettingRow"
|
|
2695
|
+
},
|
|
2696
|
+
{
|
|
2697
|
+
"when": "the message needs the user's attention now rather than a place on the page",
|
|
2698
|
+
"use": "Alert"
|
|
2699
|
+
}
|
|
2700
|
+
],
|
|
2701
|
+
"composition": {
|
|
2702
|
+
"note": "The title row is built from props — `title`, `description`, `action` — so every card lays it out the same way. The body is `children`, spaced 12 apart by the card's grid.",
|
|
2703
|
+
"example": "<Card title=\"Recent runs\" action={<Link variant=\"standalone\" href=\"/runs\">All runs</Link>}><Table aria-label=\"Recent runs\">…</Table></Card>"
|
|
2704
|
+
},
|
|
2705
|
+
"variants": {
|
|
2706
|
+
"intent": {
|
|
2707
|
+
"default": {
|
|
2708
|
+
"use": "every card that is not a danger zone"
|
|
2709
|
+
},
|
|
2710
|
+
"danger": {
|
|
2711
|
+
"use": "a card of irreversible actions — delete the workspace, transfer ownership. The rule turns red; the title must still say what is at stake"
|
|
2712
|
+
}
|
|
2713
|
+
}
|
|
2714
|
+
},
|
|
2715
|
+
"a11y": {
|
|
2716
|
+
"guarantees": [
|
|
2717
|
+
"a titled card renders a <section> named by its heading, so it is a landmark a screen reader can jump to",
|
|
2718
|
+
"an untitled card renders a <div>, never an unnamed <section>",
|
|
2719
|
+
"the danger intent is a border colour only, so the meaning stays in the words"
|
|
2720
|
+
],
|
|
2721
|
+
"requires": [
|
|
2722
|
+
"the right `headingLevel` for where the card sits in the page outline",
|
|
2723
|
+
"`isRegion={false}` when the card's only content is a landmark named by the same words, such as a Table labelled by the card's title"
|
|
2724
|
+
],
|
|
2725
|
+
"notes": [
|
|
2726
|
+
"`headingLevel` takes 2-6 and defaults to 2. It is a number rather than a variant because it is an outline decision, not a visual one: the title looks the same at every level.",
|
|
2727
|
+
"`description` renders only under a `title`. An untitled card has no title row to put it in."
|
|
2728
|
+
]
|
|
2729
|
+
},
|
|
2730
|
+
"antiPatterns": [
|
|
2731
|
+
{
|
|
2732
|
+
"dont": "a heading passed in `children` instead of `title`",
|
|
2733
|
+
"why": "the card does not become a named region, and the title row loses its layout for `description` and `action`"
|
|
2734
|
+
},
|
|
2735
|
+
{
|
|
2736
|
+
"dont": "several buttons in `action`",
|
|
2737
|
+
"why": "the title row wraps and the card reads as a toolbar; `action` is for one control — put the rest in the body"
|
|
2738
|
+
},
|
|
2739
|
+
{
|
|
2740
|
+
"dont": "relying on `intent=\"danger\"` alone to warn",
|
|
2741
|
+
"why": "a red border is not read aloud and is easy to miss; the title and the button labels must say what cannot be undone"
|
|
2742
|
+
},
|
|
2743
|
+
{
|
|
2744
|
+
"dont": "cards nested inside cards",
|
|
2745
|
+
"why": "border inside border reads as a mistake; group the inner content with a heading or a Divider instead"
|
|
2746
|
+
}
|
|
2747
|
+
],
|
|
2748
|
+
"stylesheet": "src/styles/card.css",
|
|
2749
|
+
"tokens": [
|
|
2750
|
+
"--border-error-subtle",
|
|
2751
|
+
"--border-subtle",
|
|
2752
|
+
"--border-width-default",
|
|
2753
|
+
"--font-family-sans",
|
|
2754
|
+
"--font-weight-semibold",
|
|
2755
|
+
"--radius-lg",
|
|
2756
|
+
"--spacing-12",
|
|
2757
|
+
"--spacing-16",
|
|
2758
|
+
"--spacing-2",
|
|
2759
|
+
"--spacing-8",
|
|
2760
|
+
"--surface-default",
|
|
2761
|
+
"--text-default",
|
|
2762
|
+
"--text-secondary",
|
|
2763
|
+
"--type-body-sm",
|
|
2764
|
+
"--type-body-sm-line-height",
|
|
2765
|
+
"--type-h6",
|
|
2766
|
+
"--type-h6-line-height"
|
|
2767
|
+
],
|
|
2768
|
+
"props": {
|
|
2769
|
+
"title": {
|
|
2770
|
+
"type": "React.ReactNode",
|
|
2771
|
+
"required": false,
|
|
2772
|
+
"origin": "own",
|
|
2773
|
+
"description": "The card's heading. With a title the card is a `<section>` named by it;\nwithout one it is a plain surface — a `<div>`, for skeletons and for\ncontent that already has its own heading."
|
|
2774
|
+
},
|
|
2775
|
+
"headingLevel": {
|
|
2776
|
+
"type": "CardHeadingLevel | undefined",
|
|
2777
|
+
"required": false,
|
|
2778
|
+
"origin": "own",
|
|
2779
|
+
"description": "Heading element for the title. Defaults to `h2`: most cards are the\nfirst level of section under the page's `h1`. The outline is the page's\ndecision, so it is a prop, not a constant."
|
|
2780
|
+
},
|
|
2781
|
+
"description": {
|
|
2782
|
+
"type": "React.ReactNode",
|
|
2783
|
+
"required": false,
|
|
2784
|
+
"origin": "own",
|
|
2785
|
+
"description": "One line under the title — what the card holds or when changes apply."
|
|
2786
|
+
},
|
|
2787
|
+
"action": {
|
|
2788
|
+
"type": "React.ReactNode",
|
|
2789
|
+
"required": false,
|
|
2790
|
+
"origin": "own",
|
|
2791
|
+
"description": "One control at the end of the title row: a standalone Link (\"All runs\")\nor a small Button. More than one belongs in the body."
|
|
2792
|
+
},
|
|
2793
|
+
"intent": {
|
|
2794
|
+
"type": "CardIntent | undefined",
|
|
2795
|
+
"required": false,
|
|
2796
|
+
"origin": "own",
|
|
2797
|
+
"description": "`danger` for a card of irreversible actions — the danger zone.",
|
|
2798
|
+
"values": [
|
|
2799
|
+
"default",
|
|
2800
|
+
"danger"
|
|
2801
|
+
]
|
|
2802
|
+
},
|
|
2803
|
+
"isRegion": {
|
|
2804
|
+
"type": "boolean | undefined",
|
|
2805
|
+
"required": false,
|
|
2806
|
+
"origin": "own",
|
|
2807
|
+
"description": "Whether a titled card is a landmark. Defaults to `true`. Set `false`\nwhen the card's only content is itself a landmark named by the same\nwords — a Table's scroll region — or the page gets two regions with one\nname. The heading still renders; only the `<section>` becomes a `<div>`."
|
|
2808
|
+
},
|
|
2809
|
+
"children": {
|
|
2810
|
+
"type": "React.ReactNode",
|
|
2811
|
+
"required": false,
|
|
2812
|
+
"origin": "own"
|
|
2813
|
+
}
|
|
2814
|
+
},
|
|
2815
|
+
"propCounts": {
|
|
2816
|
+
"own": 7,
|
|
2817
|
+
"aria": 0,
|
|
2818
|
+
"dom": 276,
|
|
2819
|
+
"other": 0
|
|
2820
|
+
}
|
|
2821
|
+
},
|
|
2668
2822
|
"ChartLegend": {
|
|
2669
2823
|
"name": "ChartLegend",
|
|
2670
2824
|
"source": "src/components/Chart.tsx",
|
|
@@ -3076,8 +3230,8 @@
|
|
|
3076
3230
|
"description": "Matches the Figma `Color` variant: Brand, Neutral, Danger.",
|
|
3077
3231
|
"values": [
|
|
3078
3232
|
"neutral",
|
|
3079
|
-
"
|
|
3080
|
-
"
|
|
3233
|
+
"danger",
|
|
3234
|
+
"brand"
|
|
3081
3235
|
],
|
|
3082
3236
|
"default": "brand"
|
|
3083
3237
|
},
|
|
@@ -3676,6 +3830,184 @@
|
|
|
3676
3830
|
"other": 0
|
|
3677
3831
|
}
|
|
3678
3832
|
},
|
|
3833
|
+
"CommandPalette": {
|
|
3834
|
+
"name": "CommandPalette",
|
|
3835
|
+
"source": "src/components/CommandPalette.tsx",
|
|
3836
|
+
"propsType": "CommandPaletteProps",
|
|
3837
|
+
"description": "CommandPalette — every action in the product, one search away.\n\n⌘K (Ctrl+K elsewhere) opens it from anywhere; typing filters; Enter runs.\nMount it once, near the root, and hand it every command the product has.\n\nWHY NOT A MODAL WITH A COMBOBOX IN IT\n\nA Combobox's list is a popover that opens and closes on its own rules, and\nit SELECTS a value that stays selected. A palette's list is always open and\neach row is RUN, once, and the palette goes away. The ARIA shape is the same\n— a combobox driving a listbox through `aria-activedescendant` — so this\nuses it, without the parts of Combobox that exist for choosing a value.\n\nNOT A NAVIGATION MENU\n\nEverything in the palette must also be reachable without it. It is a faster\nroute for people who know what they want, and a shortcut nobody told you\nabout is not a route at all.",
|
|
3838
|
+
"import": "import { CommandPalette } from 'ionbase-ui';",
|
|
3839
|
+
"status": "stable",
|
|
3840
|
+
"since": "0.81.0",
|
|
3841
|
+
"summary": "A searchable list of every command in the product, opened with ⌘K / Ctrl+K from anywhere, that runs the chosen command and closes.",
|
|
3842
|
+
"useWhen": [
|
|
3843
|
+
"the product has more actions and destinations than its navigation shows at once",
|
|
3844
|
+
"people who use it daily want to reach anything without the pointer",
|
|
3845
|
+
"mounted once, near the root, with every command the product has"
|
|
3846
|
+
],
|
|
3847
|
+
"useInstead": [
|
|
3848
|
+
{
|
|
3849
|
+
"when": "the user picks a value that stays chosen — an assignee, a country",
|
|
3850
|
+
"use": "Combobox",
|
|
3851
|
+
"why": "a combobox selects and keeps a value in a form; a palette runs a command once and goes away"
|
|
3852
|
+
},
|
|
3853
|
+
{
|
|
3854
|
+
"when": "a few actions belong to one object — a row's Edit, Duplicate, Delete",
|
|
3855
|
+
"use": "Menu",
|
|
3856
|
+
"why": "those actions belong beside the thing they act on, where people look for them"
|
|
3857
|
+
},
|
|
3858
|
+
{
|
|
3859
|
+
"when": "the search is over records — agents, runs — shown as a page of results",
|
|
3860
|
+
"use": "Input",
|
|
3861
|
+
"why": "a filtered table is a page with its own URL, and a palette is gone the moment it is used"
|
|
3862
|
+
}
|
|
3863
|
+
],
|
|
3864
|
+
"a11y": {
|
|
3865
|
+
"role": "dialog",
|
|
3866
|
+
"guarantees": [
|
|
3867
|
+
"a modal dialog named by `label`: focus is trapped, the page behind is hidden from assistive tech, Escape and a scrim click close it, and focus returns to what had it",
|
|
3868
|
+
"focus stays in the search field, a combobox whose always-open listbox is driven by aria-activedescendant — typing and choosing never compete for focus",
|
|
3869
|
+
"sections are role=group, named by their heading",
|
|
3870
|
+
"disabled commands are listed with aria-disabled, skipped by the arrow keys, and do nothing on click",
|
|
3871
|
+
"the number of matches is announced through a polite live region as the query changes",
|
|
3872
|
+
"`onAction` runs after the palette has closed and handed focus back, so an action that moves focus keeps it",
|
|
3873
|
+
"shortcut hints are read as key names — \"Command Shift N\" — not as symbols"
|
|
3874
|
+
],
|
|
3875
|
+
"requires": [
|
|
3876
|
+
"every command also reachable without the palette — it is a faster route, never the only one",
|
|
3877
|
+
"a visible way to open it for people who do not know the shortcut, such as a header button showing the keys"
|
|
3878
|
+
]
|
|
3879
|
+
},
|
|
3880
|
+
"antiPatterns": [
|
|
3881
|
+
{
|
|
3882
|
+
"dont": "showing a `shortcut` on a command without binding that shortcut yourself",
|
|
3883
|
+
"why": "the palette displays a command's shortcut and does not listen for it; a hint for a key that does nothing is worse than no hint"
|
|
3884
|
+
},
|
|
3885
|
+
{
|
|
3886
|
+
"dont": "moving focus from inside a command's handler by running it before closing, or wrapping onAction to close the palette first",
|
|
3887
|
+
"why": "onAction already runs after close. While the dialog is mounted its focus scope pulls focus back to the search field"
|
|
3888
|
+
},
|
|
3889
|
+
{
|
|
3890
|
+
"dont": "rendering <CommandPalette> only when a state flag is true",
|
|
3891
|
+
"do": "mount it always and drive `isOpen`, or let it open itself on the shortcut",
|
|
3892
|
+
"why": "unmounted, it cannot listen for ⌘K"
|
|
3893
|
+
},
|
|
3894
|
+
{
|
|
3895
|
+
"dont": "labels that are nouns — \"Agents\", \"Dark mode\"",
|
|
3896
|
+
"do": "start with a verb — \"Go to Agents\", \"Switch to dark theme\"",
|
|
3897
|
+
"why": "a row says what pressing Enter will do; a noun leaves the reader guessing whether it opens, toggles or deletes"
|
|
3898
|
+
},
|
|
3899
|
+
{
|
|
3900
|
+
"dont": "two palettes on one page, or a second listener for ⌘K",
|
|
3901
|
+
"why": "both toggle on the same key press and cancel each other out"
|
|
3902
|
+
}
|
|
3903
|
+
],
|
|
3904
|
+
"slots": {
|
|
3905
|
+
"emptyLabel": {
|
|
3906
|
+
"expects": "what to show when nothing matches"
|
|
3907
|
+
}
|
|
3908
|
+
},
|
|
3909
|
+
"stylesheet": "src/styles/command-palette.css",
|
|
3910
|
+
"tokens": [
|
|
3911
|
+
"--border-subtle",
|
|
3912
|
+
"--border-width-default",
|
|
3913
|
+
"--border-width-thick",
|
|
3914
|
+
"--font-family-sans",
|
|
3915
|
+
"--font-weight-medium",
|
|
3916
|
+
"--icon-disabled",
|
|
3917
|
+
"--icon-secondary",
|
|
3918
|
+
"--icon-size-md",
|
|
3919
|
+
"--icon-size-sm",
|
|
3920
|
+
"--ion-shadow-shadow-xl",
|
|
3921
|
+
"--radius-sm",
|
|
3922
|
+
"--radius-xl",
|
|
3923
|
+
"--spacing-12",
|
|
3924
|
+
"--spacing-16",
|
|
3925
|
+
"--spacing-2",
|
|
3926
|
+
"--spacing-32",
|
|
3927
|
+
"--spacing-4",
|
|
3928
|
+
"--spacing-40",
|
|
3929
|
+
"--spacing-48",
|
|
3930
|
+
"--spacing-8",
|
|
3931
|
+
"--spacing-96",
|
|
3932
|
+
"--surface-hover",
|
|
3933
|
+
"--surface-overlay",
|
|
3934
|
+
"--surface-scrim",
|
|
3935
|
+
"--text-default",
|
|
3936
|
+
"--text-disabled",
|
|
3937
|
+
"--text-tertiary",
|
|
3938
|
+
"--type-body",
|
|
3939
|
+
"--type-body-lg",
|
|
3940
|
+
"--type-body-lg-line-height",
|
|
3941
|
+
"--type-body-line-height",
|
|
3942
|
+
"--type-body-sm",
|
|
3943
|
+
"--type-body-sm-line-height",
|
|
3944
|
+
"--type-caption",
|
|
3945
|
+
"--type-caption-line-height"
|
|
3946
|
+
],
|
|
3947
|
+
"props": {
|
|
3948
|
+
"commands": {
|
|
3949
|
+
"type": "readonly CommandPaletteItem[]",
|
|
3950
|
+
"required": true,
|
|
3951
|
+
"origin": "own",
|
|
3952
|
+
"description": "Every command. Filtering happens here, against what is typed."
|
|
3953
|
+
},
|
|
3954
|
+
"onAction": {
|
|
3955
|
+
"type": "(id: string) => void",
|
|
3956
|
+
"required": true,
|
|
3957
|
+
"origin": "own",
|
|
3958
|
+
"description": "Runs the chosen command. Called AFTER the palette has closed and handed\nfocus back, so an action that moves focus — to a search field, into a\nform — keeps it."
|
|
3959
|
+
},
|
|
3960
|
+
"isOpen": {
|
|
3961
|
+
"type": "boolean | undefined",
|
|
3962
|
+
"required": false,
|
|
3963
|
+
"origin": "own"
|
|
3964
|
+
},
|
|
3965
|
+
"defaultOpen": {
|
|
3966
|
+
"type": "boolean | undefined",
|
|
3967
|
+
"required": false,
|
|
3968
|
+
"origin": "own"
|
|
3969
|
+
},
|
|
3970
|
+
"onOpenChange": {
|
|
3971
|
+
"type": "((isOpen: boolean) => void) | undefined",
|
|
3972
|
+
"required": false,
|
|
3973
|
+
"origin": "own"
|
|
3974
|
+
},
|
|
3975
|
+
"openShortcut": {
|
|
3976
|
+
"type": "string | null | undefined",
|
|
3977
|
+
"required": false,
|
|
3978
|
+
"origin": "own",
|
|
3979
|
+
"description": "The shortcut that opens it from anywhere on the page, and closes it again.\nDefaults to `mod+k` — ⌘K on a Mac, Ctrl+K elsewhere. `null` turns it off,\nfor a page that opens the palette some other way."
|
|
3980
|
+
},
|
|
3981
|
+
"label": {
|
|
3982
|
+
"type": "string | undefined",
|
|
3983
|
+
"required": false,
|
|
3984
|
+
"origin": "own",
|
|
3985
|
+
"description": "Names the dialog and the search field."
|
|
3986
|
+
},
|
|
3987
|
+
"placeholder": {
|
|
3988
|
+
"type": "string | undefined",
|
|
3989
|
+
"required": false,
|
|
3990
|
+
"origin": "own"
|
|
3991
|
+
},
|
|
3992
|
+
"emptyLabel": {
|
|
3993
|
+
"type": "React.ReactNode",
|
|
3994
|
+
"required": false,
|
|
3995
|
+
"origin": "own",
|
|
3996
|
+
"description": "Shown in place of the list when nothing matches."
|
|
3997
|
+
},
|
|
3998
|
+
"className": {
|
|
3999
|
+
"type": "string | undefined",
|
|
4000
|
+
"required": false,
|
|
4001
|
+
"origin": "own"
|
|
4002
|
+
}
|
|
4003
|
+
},
|
|
4004
|
+
"propCounts": {
|
|
4005
|
+
"own": 10,
|
|
4006
|
+
"aria": 0,
|
|
4007
|
+
"dom": 0,
|
|
4008
|
+
"other": 0
|
|
4009
|
+
}
|
|
4010
|
+
},
|
|
3679
4011
|
"ConfidenceIndicator": {
|
|
3680
4012
|
"name": "ConfidenceIndicator",
|
|
3681
4013
|
"source": "src/components/ConfidenceIndicator.tsx",
|
|
@@ -3822,8 +4154,8 @@
|
|
|
3822
4154
|
},
|
|
3823
4155
|
{
|
|
3824
4156
|
"when": "a time of day is part of the value",
|
|
3825
|
-
"use": "
|
|
3826
|
-
"why": "this picker is fixed to day granularity; a
|
|
4157
|
+
"use": "TimeField",
|
|
4158
|
+
"why": "this picker is fixed to day granularity; put a TimeField beside it — the two share one box and one set of states"
|
|
3827
4159
|
}
|
|
3828
4160
|
],
|
|
3829
4161
|
"variants": {
|
|
@@ -3849,7 +4181,8 @@
|
|
|
3849
4181
|
"every day cell carries the full date as its accessible name in the reader's own language, so the narrow weekday headers are never load-bearing",
|
|
3850
4182
|
"unavailable and disabled days are distinguished visually and in the accessible name, not by colour alone",
|
|
3851
4183
|
"today is marked with a dot rather than a ring, so it cannot be mistaken for a second selected day",
|
|
3852
|
-
"the selected fill and the segment focus box are redeclared under forced-colors, where background-color is discarded"
|
|
4184
|
+
"the selected fill and the segment focus box are redeclared under forced-colors, where background-color is discarded",
|
|
4185
|
+
"a typed date outside `minValue`/`maxValue` turns the field invalid and names the bound in the reader's own format, without `isInvalid` — the value is kept, not silently clamped"
|
|
3853
4186
|
],
|
|
3854
4187
|
"requires": [
|
|
3855
4188
|
"`label`, or an `aria-label` when no visible label is rendered",
|
|
@@ -3957,7 +4290,7 @@
|
|
|
3957
4290
|
"type": "React.ReactNode",
|
|
3958
4291
|
"required": false,
|
|
3959
4292
|
"origin": "own",
|
|
3960
|
-
"description": "Replaces the helper text
|
|
4293
|
+
"description": "Replaces the helper text while the field is invalid — `isInvalid`, or its own bounds check."
|
|
3961
4294
|
},
|
|
3962
4295
|
"isInvalid": {
|
|
3963
4296
|
"type": "boolean | undefined",
|
|
@@ -4112,7 +4445,8 @@
|
|
|
4112
4445
|
"preset rows are buttons in a labelled group carrying aria-pressed, so 'which shortcut is active' is answerable without seeing the tint",
|
|
4113
4446
|
"the selected preset is marked by weight as well as by background, so it does not rely on colour alone",
|
|
4114
4447
|
"range endpoints and the band between them keep their fill under forced-colors, where background-color is otherwise discarded",
|
|
4115
|
-
"the rail stacks above the grids below 32rem rather than being hidden, because shortcuts matter most on the device where dragging across two months is worst"
|
|
4448
|
+
"the rail stacks above the grids below 32rem rather than being hidden, because shortcuts matter most on the device where dragging across two months is worst",
|
|
4449
|
+
"a typed date outside `minValue`/`maxValue`, or an end before the start, turns the field invalid with React Aria's localized message, without `isInvalid` — the value is kept, not silently clamped"
|
|
4116
4450
|
],
|
|
4117
4451
|
"requires": [
|
|
4118
4452
|
"`label`, or an `aria-label` when no visible label is rendered",
|
|
@@ -4213,7 +4547,7 @@
|
|
|
4213
4547
|
"type": "React.ReactNode",
|
|
4214
4548
|
"required": false,
|
|
4215
4549
|
"origin": "own",
|
|
4216
|
-
"description": "Replaces the helper text
|
|
4550
|
+
"description": "Replaces the helper text while the field is invalid — `isInvalid`, or its own bounds check."
|
|
4217
4551
|
},
|
|
4218
4552
|
"isInvalid": {
|
|
4219
4553
|
"type": "boolean | undefined",
|
|
@@ -6131,30 +6465,127 @@
|
|
|
6131
6465
|
"other": 0
|
|
6132
6466
|
}
|
|
6133
6467
|
},
|
|
6134
|
-
"
|
|
6135
|
-
"name": "
|
|
6136
|
-
"source": "src/components/
|
|
6137
|
-
"propsType": "
|
|
6138
|
-
"description": "
|
|
6139
|
-
"import": "import {
|
|
6468
|
+
"Kbd": {
|
|
6469
|
+
"name": "Kbd",
|
|
6470
|
+
"source": "src/components/Kbd.tsx",
|
|
6471
|
+
"propsType": "KbdProps",
|
|
6472
|
+
"description": "Kbd — a key, or a keyboard shortcut, as printed on the keyboard.\n\n`<kbd>` is the element HTML has for this, and a combination is a `<kbd>` of\n`<kbd>`s — the spec's own shape for \"press these together\".\n\nWHAT A SCREEN READER HEARS\n\nThe symbols do not survive being read aloud: VoiceOver says \"⌘\" as \"place of\ninterest sign\" in some voices and \"⇧\" as \"upwards white arrow\". So a\nshortcut's drawn keys are hidden and a visually hidden copy spells them out\n— \"Command K\", \"Control Shift P\".",
|
|
6473
|
+
"import": "import { Kbd } from 'ionbase-ui';",
|
|
6140
6474
|
"status": "stable",
|
|
6141
|
-
"
|
|
6475
|
+
"since": "0.81.0",
|
|
6476
|
+
"summary": "A key, or a keyboard shortcut, drawn as keycaps in the reader's platform's own symbols and read aloud by name.",
|
|
6142
6477
|
"useWhen": [
|
|
6143
|
-
"
|
|
6144
|
-
"
|
|
6478
|
+
"telling people a shortcut exists — beside a button, in a tooltip, in a command palette row",
|
|
6479
|
+
"instructions that name a key: \"press Esc to cancel\""
|
|
6145
6480
|
],
|
|
6146
6481
|
"useInstead": [
|
|
6147
6482
|
{
|
|
6148
|
-
"when": "the
|
|
6149
|
-
"use": "
|
|
6150
|
-
"why": "
|
|
6151
|
-
},
|
|
6152
|
-
{
|
|
6153
|
-
"when": "it is a primary navigation destination in a header or sidebar",
|
|
6154
|
-
"use": "NavItem"
|
|
6483
|
+
"when": "the text is code, a file name or a value",
|
|
6484
|
+
"use": "render it directly",
|
|
6485
|
+
"why": "Kbd means keys to press; `<code>` is the element for code"
|
|
6155
6486
|
}
|
|
6156
6487
|
],
|
|
6157
|
-
"
|
|
6488
|
+
"a11y": {
|
|
6489
|
+
"guarantees": [
|
|
6490
|
+
"a combination is a <kbd> of <kbd>s, the HTML spec's shape for keys pressed together",
|
|
6491
|
+
"the drawn symbols are hidden and a visually hidden copy spells the keys out — \"Command K\", \"Control Shift P\" — because ⌘ and ⇧ are read as symbol names or not at all",
|
|
6492
|
+
"`mod` resolves to ⌘ on Apple platforms and Ctrl elsewhere; server rendering shows Ctrl and corrects after hydration without a mismatch"
|
|
6493
|
+
],
|
|
6494
|
+
"requires": [
|
|
6495
|
+
"the shortcut to be bound somewhere — Kbd shows a key, it does not listen for one"
|
|
6496
|
+
]
|
|
6497
|
+
},
|
|
6498
|
+
"antiPatterns": [
|
|
6499
|
+
{
|
|
6500
|
+
"dont": "writing `ctrl+k` or `cmd+k` for the platform's command key",
|
|
6501
|
+
"do": "write `mod+k`",
|
|
6502
|
+
"why": "`ctrl` shows a Mac user a key they do not press for it; `cmd` shows everyone else a key they do not have"
|
|
6503
|
+
},
|
|
6504
|
+
{
|
|
6505
|
+
"dont": "children like \"⌘K\" or \"Ctrl+K\"",
|
|
6506
|
+
"do": "`shortcut=\"mod+k\"`",
|
|
6507
|
+
"why": "hand-typed symbols are wrong on the other platform and are read aloud as symbol names"
|
|
6508
|
+
},
|
|
6509
|
+
{
|
|
6510
|
+
"dont": "setting `platform`",
|
|
6511
|
+
"why": "it overrides detection, so half the readers see the other platform's keys; it exists for docs that compare the two"
|
|
6512
|
+
}
|
|
6513
|
+
],
|
|
6514
|
+
"stylesheet": "src/styles/kbd.css",
|
|
6515
|
+
"tokens": [
|
|
6516
|
+
"--border-default",
|
|
6517
|
+
"--border-width-default",
|
|
6518
|
+
"--font-family-sans",
|
|
6519
|
+
"--font-weight-medium",
|
|
6520
|
+
"--radius-xs",
|
|
6521
|
+
"--spacing-2",
|
|
6522
|
+
"--spacing-20",
|
|
6523
|
+
"--spacing-4",
|
|
6524
|
+
"--surface-subtle",
|
|
6525
|
+
"--text-secondary",
|
|
6526
|
+
"--type-caption",
|
|
6527
|
+
"--type-caption-line-height"
|
|
6528
|
+
],
|
|
6529
|
+
"props": {
|
|
6530
|
+
"shortcut": {
|
|
6531
|
+
"type": "string | undefined",
|
|
6532
|
+
"required": false,
|
|
6533
|
+
"origin": "own",
|
|
6534
|
+
"description": "A whole shortcut, `+`-joined: `mod+k`, `mod+shift+p`, `esc`. `mod` is ⌘\non a Mac and Ctrl elsewhere, so write `mod` rather than guessing. Drawn as\none key per part, in the platform's order."
|
|
6535
|
+
},
|
|
6536
|
+
"children": {
|
|
6537
|
+
"type": "React.ReactNode",
|
|
6538
|
+
"required": false,
|
|
6539
|
+
"origin": "own",
|
|
6540
|
+
"description": "One key, as printed: `K`, `Esc`, `/`. Use `shortcut` for a combination."
|
|
6541
|
+
},
|
|
6542
|
+
"platform": {
|
|
6543
|
+
"type": "KbdPlatform | undefined",
|
|
6544
|
+
"required": false,
|
|
6545
|
+
"origin": "own",
|
|
6546
|
+
"description": "Leave it out: the reader's platform is detected. Set it only to show a\nspecific platform's keys — a docs page comparing the two.",
|
|
6547
|
+
"values": [
|
|
6548
|
+
"mac",
|
|
6549
|
+
"other"
|
|
6550
|
+
]
|
|
6551
|
+
},
|
|
6552
|
+
"className": {
|
|
6553
|
+
"type": "string | undefined",
|
|
6554
|
+
"required": false,
|
|
6555
|
+
"origin": "own"
|
|
6556
|
+
}
|
|
6557
|
+
},
|
|
6558
|
+
"propCounts": {
|
|
6559
|
+
"own": 4,
|
|
6560
|
+
"aria": 0,
|
|
6561
|
+
"dom": 0,
|
|
6562
|
+
"other": 0
|
|
6563
|
+
}
|
|
6564
|
+
},
|
|
6565
|
+
"Link": {
|
|
6566
|
+
"name": "Link",
|
|
6567
|
+
"source": "src/components/Link.tsx",
|
|
6568
|
+
"propsType": "LinkProps",
|
|
6569
|
+
"description": "Link — Figma `Link` (774:1516).\n\nRenders an `<a>` when given an `href` and a `<button>` otherwise, the same\njudgment `NavItem` makes: the element follows what the caller is actually\nbuilding rather than a separate `as` prop. A link that does not navigate is\na button, and shipping one as an anchor breaks middle-click, \"open in new\ntab\" and the screen-reader announcement all at once.\n\nNO SIZE PROP, DELIBERATELY. A link is an inline element and inherits its\ntype from the text around it — `font-size: inherit` in the stylesheet, and\nicons sized in `em` so they scale with it. Figma has to draw its variants at\nsome concrete size (16/24, `type/body`), but that is one sample of an\ninheriting element, not a specification. Do not add a size ladder to match\nthe drawing.",
|
|
6570
|
+
"import": "import { Link } from 'ionbase-ui';",
|
|
6571
|
+
"status": "stable",
|
|
6572
|
+
"summary": "Navigation to somewhere else. Renders an <a> when given `href`, a <button> otherwise.",
|
|
6573
|
+
"useWhen": [
|
|
6574
|
+
"the interaction takes the user to a different page, view or resource",
|
|
6575
|
+
"the destination should support middle-click, open-in-new-tab and copy-link"
|
|
6576
|
+
],
|
|
6577
|
+
"useInstead": [
|
|
6578
|
+
{
|
|
6579
|
+
"when": "the interaction changes something rather than going somewhere",
|
|
6580
|
+
"use": "Button",
|
|
6581
|
+
"why": "a link that does not navigate breaks middle-click, open-in-new-tab and the screen-reader announcement all at once"
|
|
6582
|
+
},
|
|
6583
|
+
{
|
|
6584
|
+
"when": "it is a primary navigation destination in a header or sidebar",
|
|
6585
|
+
"use": "NavItem"
|
|
6586
|
+
}
|
|
6587
|
+
],
|
|
6588
|
+
"variants": {
|
|
6158
6589
|
"variant": {
|
|
6159
6590
|
"inline": {
|
|
6160
6591
|
"use": "the default — a link inside a paragraph. Underlined in every state, because a link in body copy must not rely on colour alone (WCAG 1.4.1)"
|
|
@@ -9108,8 +9539,8 @@
|
|
|
9108
9539
|
"origin": "own",
|
|
9109
9540
|
"values": [
|
|
9110
9541
|
"neutral",
|
|
9111
|
-
"
|
|
9112
|
-
"
|
|
9542
|
+
"danger",
|
|
9543
|
+
"brand"
|
|
9113
9544
|
]
|
|
9114
9545
|
},
|
|
9115
9546
|
"isDisabled": {
|
|
@@ -9318,8 +9749,8 @@
|
|
|
9318
9749
|
"origin": "own",
|
|
9319
9750
|
"values": [
|
|
9320
9751
|
"neutral",
|
|
9321
|
-
"
|
|
9322
|
-
"
|
|
9752
|
+
"danger",
|
|
9753
|
+
"brand"
|
|
9323
9754
|
]
|
|
9324
9755
|
},
|
|
9325
9756
|
"isDisabled": {
|
|
@@ -11588,6 +12019,7 @@
|
|
|
11588
12019
|
"--font-family-sans",
|
|
11589
12020
|
"--font-weight-medium",
|
|
11590
12021
|
"--font-weight-regular",
|
|
12022
|
+
"--icon-default",
|
|
11591
12023
|
"--icon-interactive",
|
|
11592
12024
|
"--icon-secondary",
|
|
11593
12025
|
"--icon-size-sm",
|
|
@@ -11595,6 +12027,8 @@
|
|
|
11595
12027
|
"--ion-duration-base",
|
|
11596
12028
|
"--ion-ease-out",
|
|
11597
12029
|
"--radius-md",
|
|
12030
|
+
"--radius-xs",
|
|
12031
|
+
"--ring-focus",
|
|
11598
12032
|
"--spacing-16",
|
|
11599
12033
|
"--spacing-20",
|
|
11600
12034
|
"--spacing-6",
|
|
@@ -11616,8 +12050,8 @@
|
|
|
11616
12050
|
"origin": "own",
|
|
11617
12051
|
"description": "Matches Figma's `Density` variant on `Table Cell` / `Table Row`.",
|
|
11618
12052
|
"values": [
|
|
11619
|
-
"compact",
|
|
11620
12053
|
"default",
|
|
12054
|
+
"compact",
|
|
11621
12055
|
"relaxed"
|
|
11622
12056
|
]
|
|
11623
12057
|
},
|
|
@@ -11685,6 +12119,7 @@
|
|
|
11685
12119
|
"--font-family-sans",
|
|
11686
12120
|
"--font-weight-medium",
|
|
11687
12121
|
"--font-weight-regular",
|
|
12122
|
+
"--icon-default",
|
|
11688
12123
|
"--icon-interactive",
|
|
11689
12124
|
"--icon-secondary",
|
|
11690
12125
|
"--icon-size-sm",
|
|
@@ -11692,6 +12127,8 @@
|
|
|
11692
12127
|
"--ion-duration-base",
|
|
11693
12128
|
"--ion-ease-out",
|
|
11694
12129
|
"--radius-md",
|
|
12130
|
+
"--radius-xs",
|
|
12131
|
+
"--ring-focus",
|
|
11695
12132
|
"--spacing-16",
|
|
11696
12133
|
"--spacing-20",
|
|
11697
12134
|
"--spacing-6",
|
|
@@ -11765,6 +12202,17 @@
|
|
|
11765
12202
|
"link": {
|
|
11766
12203
|
"use": "recolours the content to `text/link` / `icon/primary` for a cell whose content navigates"
|
|
11767
12204
|
}
|
|
12205
|
+
},
|
|
12206
|
+
"sortDirection": {
|
|
12207
|
+
"ascending": {
|
|
12208
|
+
"use": "the column the rows are sorted by, smallest or earliest first"
|
|
12209
|
+
},
|
|
12210
|
+
"descending": {
|
|
12211
|
+
"use": "the column the rows are sorted by, largest or newest first"
|
|
12212
|
+
},
|
|
12213
|
+
"none": {
|
|
12214
|
+
"use": "a column that can be sorted but is not the current sort — it shows the neutral indicator"
|
|
12215
|
+
}
|
|
11768
12216
|
}
|
|
11769
12217
|
},
|
|
11770
12218
|
"slots": {
|
|
@@ -11783,10 +12231,15 @@
|
|
|
11783
12231
|
"a11y": {
|
|
11784
12232
|
"guarantees": [
|
|
11785
12233
|
"`scope` is inferred when omitted — `col` in TableHead, `row` in TableBody — and can be set explicitly when the inference is wrong",
|
|
11786
|
-
"`header` decides the element directly rather than a `type` prop that could disagree with where the cell sits"
|
|
12234
|
+
"`header` decides the element directly rather than a `type` prop that could disagree with where the cell sits",
|
|
12235
|
+
"a sortable header renders a real <button> inside the <th>, so it is focusable and answers Enter and Space, and the header keeps its column-header role",
|
|
12236
|
+
"`aria-sort` is set on the sorted header only, never `none` on the rest"
|
|
11787
12237
|
],
|
|
11788
12238
|
"requires": [
|
|
11789
12239
|
"`scope=\"col\"` on header cells — inferred inside TableHead, but explicit for a header rendered outside it"
|
|
12240
|
+
],
|
|
12241
|
+
"notes": [
|
|
12242
|
+
"`useTableSort` returns `sortDirection` and `onSort` for each column. The table never reorders rows itself: they may be one page of a server's thousands."
|
|
11790
12243
|
]
|
|
11791
12244
|
},
|
|
11792
12245
|
"antiPatterns": [
|
|
@@ -11801,6 +12254,14 @@
|
|
|
11801
12254
|
{
|
|
11802
12255
|
"dont": "`showDivider` on every cell",
|
|
11803
12256
|
"why": "it is a column rule, not a row rule — on every cell it becomes a grid"
|
|
12257
|
+
},
|
|
12258
|
+
{
|
|
12259
|
+
"dont": "`onSort` on a header without `sortDirection`",
|
|
12260
|
+
"why": "the cell stays plain text, so nothing can be clicked; `sortDirection` is what makes it a sort control — pass `none` for an unsorted column"
|
|
12261
|
+
},
|
|
12262
|
+
{
|
|
12263
|
+
"dont": "`trailingIcon` on a sortable header",
|
|
12264
|
+
"why": "the sort indicator takes the trailing slot; the icon is not rendered"
|
|
11804
12265
|
}
|
|
11805
12266
|
],
|
|
11806
12267
|
"stylesheet": "src/styles/table.css",
|
|
@@ -11812,6 +12273,7 @@
|
|
|
11812
12273
|
"--font-family-sans",
|
|
11813
12274
|
"--font-weight-medium",
|
|
11814
12275
|
"--font-weight-regular",
|
|
12276
|
+
"--icon-default",
|
|
11815
12277
|
"--icon-interactive",
|
|
11816
12278
|
"--icon-secondary",
|
|
11817
12279
|
"--icon-size-sm",
|
|
@@ -11819,6 +12281,8 @@
|
|
|
11819
12281
|
"--ion-duration-base",
|
|
11820
12282
|
"--ion-ease-out",
|
|
11821
12283
|
"--radius-md",
|
|
12284
|
+
"--radius-xs",
|
|
12285
|
+
"--ring-focus",
|
|
11822
12286
|
"--spacing-16",
|
|
11823
12287
|
"--spacing-20",
|
|
11824
12288
|
"--spacing-6",
|
|
@@ -11863,13 +12327,13 @@
|
|
|
11863
12327
|
]
|
|
11864
12328
|
},
|
|
11865
12329
|
"variant": {
|
|
11866
|
-
"type": "\"
|
|
12330
|
+
"type": "\"default\" | \"link\" | undefined",
|
|
11867
12331
|
"required": false,
|
|
11868
12332
|
"origin": "own",
|
|
11869
12333
|
"description": "Figma's `Type=Link` — recolours the content to `text/link` /\n`icon/primary` rather than the body defaults.",
|
|
11870
12334
|
"values": [
|
|
11871
|
-
"
|
|
11872
|
-
"
|
|
12335
|
+
"default",
|
|
12336
|
+
"link"
|
|
11873
12337
|
]
|
|
11874
12338
|
},
|
|
11875
12339
|
"showDivider": {
|
|
@@ -11889,6 +12353,23 @@
|
|
|
11889
12353
|
"required": false,
|
|
11890
12354
|
"origin": "own"
|
|
11891
12355
|
},
|
|
12356
|
+
"sortDirection": {
|
|
12357
|
+
"type": "TableSortDirection | undefined",
|
|
12358
|
+
"required": false,
|
|
12359
|
+
"origin": "own",
|
|
12360
|
+
"description": "Makes a header cell a sort control. Set it on every sortable column:\n`ascending` or `descending` on the one the rows are sorted by, `none` on\nthe rest. Header cells only — ignored on a body cell. `useTableSort`\nreturns this and `onSort` for each column.",
|
|
12361
|
+
"values": [
|
|
12362
|
+
"none",
|
|
12363
|
+
"ascending",
|
|
12364
|
+
"descending"
|
|
12365
|
+
]
|
|
12366
|
+
},
|
|
12367
|
+
"onSort": {
|
|
12368
|
+
"type": "(() => void) | undefined",
|
|
12369
|
+
"required": false,
|
|
12370
|
+
"origin": "own",
|
|
12371
|
+
"description": "Called when the header is activated. The table does not reorder rows:\nsorting is the caller's, since only it knows whether the data is local\nor paged from a server."
|
|
12372
|
+
},
|
|
11892
12373
|
"children": {
|
|
11893
12374
|
"type": "React.ReactNode",
|
|
11894
12375
|
"required": false,
|
|
@@ -11896,7 +12377,7 @@
|
|
|
11896
12377
|
}
|
|
11897
12378
|
},
|
|
11898
12379
|
"propCounts": {
|
|
11899
|
-
"own":
|
|
12380
|
+
"own": 10,
|
|
11900
12381
|
"aria": 0,
|
|
11901
12382
|
"dom": 284,
|
|
11902
12383
|
"other": 0
|
|
@@ -11955,6 +12436,7 @@
|
|
|
11955
12436
|
"--font-family-sans",
|
|
11956
12437
|
"--font-weight-medium",
|
|
11957
12438
|
"--font-weight-regular",
|
|
12439
|
+
"--icon-default",
|
|
11958
12440
|
"--icon-interactive",
|
|
11959
12441
|
"--icon-secondary",
|
|
11960
12442
|
"--icon-size-sm",
|
|
@@ -11962,6 +12444,8 @@
|
|
|
11962
12444
|
"--ion-duration-base",
|
|
11963
12445
|
"--ion-ease-out",
|
|
11964
12446
|
"--radius-md",
|
|
12447
|
+
"--radius-xs",
|
|
12448
|
+
"--ring-focus",
|
|
11965
12449
|
"--spacing-16",
|
|
11966
12450
|
"--spacing-20",
|
|
11967
12451
|
"--spacing-6",
|
|
@@ -12044,6 +12528,7 @@
|
|
|
12044
12528
|
"--font-family-sans",
|
|
12045
12529
|
"--font-weight-medium",
|
|
12046
12530
|
"--font-weight-regular",
|
|
12531
|
+
"--icon-default",
|
|
12047
12532
|
"--icon-interactive",
|
|
12048
12533
|
"--icon-secondary",
|
|
12049
12534
|
"--icon-size-sm",
|
|
@@ -12051,6 +12536,8 @@
|
|
|
12051
12536
|
"--ion-duration-base",
|
|
12052
12537
|
"--ion-ease-out",
|
|
12053
12538
|
"--radius-md",
|
|
12539
|
+
"--radius-xs",
|
|
12540
|
+
"--ring-focus",
|
|
12054
12541
|
"--spacing-16",
|
|
12055
12542
|
"--spacing-20",
|
|
12056
12543
|
"--spacing-6",
|
|
@@ -12361,6 +12848,271 @@
|
|
|
12361
12848
|
"other": 4
|
|
12362
12849
|
}
|
|
12363
12850
|
},
|
|
12851
|
+
"Tag": {
|
|
12852
|
+
"name": "Tag",
|
|
12853
|
+
"source": "../../node_modules/.pnpm/react-stately@3.48.0_react@19.2.8/node_modules/react-stately/dist/types/src/collections/Item.d.ts",
|
|
12854
|
+
"propsType": null,
|
|
12855
|
+
"import": "import { Tag } from 'ionbase-ui';",
|
|
12856
|
+
"status": "stable",
|
|
12857
|
+
"since": "0.79.0",
|
|
12858
|
+
"summary": "One tag in a TagGroup. Re-exported from react-stately's collection Item — `key` identifies it, children are its label.",
|
|
12859
|
+
"useWhen": [
|
|
12860
|
+
"a child of TagGroup — it is not usable anywhere else"
|
|
12861
|
+
],
|
|
12862
|
+
"useInstead": [
|
|
12863
|
+
{
|
|
12864
|
+
"when": "it is a status label on its own",
|
|
12865
|
+
"use": "Badge"
|
|
12866
|
+
}
|
|
12867
|
+
],
|
|
12868
|
+
"composition": {
|
|
12869
|
+
"order": [
|
|
12870
|
+
"TagGroup",
|
|
12871
|
+
"Tag"
|
|
12872
|
+
],
|
|
12873
|
+
"note": "A collection item, not a rendered component: TagGroup reads it to build the collection, so it never appears in the DOM itself. That is why it exposes no props of its own here — `key` and `textValue` are the collection's API.",
|
|
12874
|
+
"example": "<Tag key=\"team:finance\">Team: Finance</Tag>"
|
|
12875
|
+
},
|
|
12876
|
+
"a11y": {
|
|
12877
|
+
"guarantees": [
|
|
12878
|
+
"the row, cell and remove-button roles and names are supplied by TagGroup, not by this element"
|
|
12879
|
+
],
|
|
12880
|
+
"requires": [
|
|
12881
|
+
"a stable `key` — it is what `onRemove` hands back",
|
|
12882
|
+
"`textValue` when the label is not plain text, so type-ahead and the remove button's name have words to use"
|
|
12883
|
+
]
|
|
12884
|
+
},
|
|
12885
|
+
"antiPatterns": [
|
|
12886
|
+
{
|
|
12887
|
+
"dont": "array indexes as keys in a list that shrinks",
|
|
12888
|
+
"why": "removing the first tag renumbers the rest, and the next removal drops the wrong one"
|
|
12889
|
+
},
|
|
12890
|
+
{
|
|
12891
|
+
"dont": "wrapping Tag in a <div> or a fragment inside TagGroup",
|
|
12892
|
+
"why": "TagGroup reads the collection from its direct children; a wrapper makes the tag invisible to it"
|
|
12893
|
+
}
|
|
12894
|
+
],
|
|
12895
|
+
"stylesheet": null,
|
|
12896
|
+
"tokens": [],
|
|
12897
|
+
"props": {},
|
|
12898
|
+
"propCounts": {
|
|
12899
|
+
"own": 0,
|
|
12900
|
+
"aria": 0,
|
|
12901
|
+
"dom": 0,
|
|
12902
|
+
"other": 0
|
|
12903
|
+
}
|
|
12904
|
+
},
|
|
12905
|
+
"TagGroup": {
|
|
12906
|
+
"name": "TagGroup",
|
|
12907
|
+
"source": "src/components/TagGroup.tsx",
|
|
12908
|
+
"propsType": "TagGroupProps",
|
|
12909
|
+
"description": "TagGroup — labels a person applied and can take away: active filters, the\nlabels on a record, the recipients of a message.\n\nNOT A BADGE\n\nA Badge reports a state the system decided — Failing, Paid. A Tag is a\nchoice someone made, which is why it is removable and why it is neutral:\ncolouring tags by intent would make \"Status: Failing\" as a filter look like\nthe agent is failing.\n\nWHAT REACT ARIA GIVES IT\n\n`useTagGroup` makes the group one tab stop with arrow keys between tags, a\nremove button per tag named \"Remove <tag>\", and Delete / Backspace to remove\nthe focused one. When a tag goes, focus moves to its neighbour. The one case\nReact Aria leaves open is the last tag: focus would fall to <body>, so the\ngroup takes it instead and reads out `emptyLabel`.\n\nNo selection: a chip that toggles on and off is a SegmentedControl or a\nCheckbox, which already say \"selected\" the way a screen reader expects.",
|
|
12910
|
+
"import": "import { TagGroup } from 'ionbase-ui';",
|
|
12911
|
+
"status": "stable",
|
|
12912
|
+
"since": "0.79.0",
|
|
12913
|
+
"summary": "Labels a person applied and can take away: active filters, the labels on a record, recipients. Neutral and removable, unlike Badge.",
|
|
12914
|
+
"useWhen": [
|
|
12915
|
+
"showing which filters are applied, each removable on its own",
|
|
12916
|
+
"the labels or categories someone attached to a record",
|
|
12917
|
+
"a set of chosen values — recipients, assignees — shown after they are picked"
|
|
12918
|
+
],
|
|
12919
|
+
"useInstead": [
|
|
12920
|
+
{
|
|
12921
|
+
"when": "it is a status the system reports — Failing, Paid, Draft",
|
|
12922
|
+
"use": "Badge"
|
|
12923
|
+
},
|
|
12924
|
+
{
|
|
12925
|
+
"when": "the chips toggle on and off rather than being removed",
|
|
12926
|
+
"use": "SegmentedControl"
|
|
12927
|
+
},
|
|
12928
|
+
{
|
|
12929
|
+
"when": "several options can be switched on at once from a fixed list",
|
|
12930
|
+
"use": "Checkbox"
|
|
12931
|
+
}
|
|
12932
|
+
],
|
|
12933
|
+
"composition": {
|
|
12934
|
+
"order": [
|
|
12935
|
+
"TagGroup",
|
|
12936
|
+
"Tag"
|
|
12937
|
+
],
|
|
12938
|
+
"note": "Tag is react-stately's collection Item: `key` identifies it and is what `onRemove` hands back, children are its label. Pass `items` and a render function for a list that changes.",
|
|
12939
|
+
"example": "<TagGroup label=\"Active filters\" onRemove={(keys) => drop(keys)}><Tag key=\"status\">Status: Failing</Tag><Tag key=\"team\">Team: Finance</Tag></TagGroup>"
|
|
12940
|
+
},
|
|
12941
|
+
"variants": {
|
|
12942
|
+
"size": {
|
|
12943
|
+
"sm": {
|
|
12944
|
+
"use": "the default — filter rows, table toolbars, dense record headers"
|
|
12945
|
+
},
|
|
12946
|
+
"md": {
|
|
12947
|
+
"use": "a group that is the main content of its area, or sits beside md controls"
|
|
12948
|
+
}
|
|
12949
|
+
}
|
|
12950
|
+
},
|
|
12951
|
+
"a11y": {
|
|
12952
|
+
"guarantees": [
|
|
12953
|
+
"the group is one tab stop; arrow keys move between tags",
|
|
12954
|
+
"each remove button is named \"Remove\" plus the tag's label, so a screen reader hears which one",
|
|
12955
|
+
"Delete or Backspace on a focused tag removes it, and focus moves to its neighbour",
|
|
12956
|
+
"removing the last tag moves focus to the group, which reads `emptyLabel`, instead of dropping it to the page"
|
|
12957
|
+
],
|
|
12958
|
+
"requires": [
|
|
12959
|
+
"a `label` or `aria-label` — it names the group, so \"Remove Finance\" is heard as a filter being removed",
|
|
12960
|
+
"`textValue` on a Tag whose children are not plain text",
|
|
12961
|
+
"`onRemove` to drop the keys from your own list; the group removes nothing itself"
|
|
12962
|
+
],
|
|
12963
|
+
"notes": [
|
|
12964
|
+
"No selection. A chip that toggles is a SegmentedControl or a Checkbox, which already announce \"selected\" the way screen readers expect."
|
|
12965
|
+
]
|
|
12966
|
+
},
|
|
12967
|
+
"antiPatterns": [
|
|
12968
|
+
{
|
|
12969
|
+
"dont": "using a TagGroup for statuses",
|
|
12970
|
+
"why": "tags are neutral and removable; a status is neither — use Badge"
|
|
12971
|
+
},
|
|
12972
|
+
{
|
|
12973
|
+
"dont": "`onRemove` that does not remove the tag",
|
|
12974
|
+
"why": "the button says \"Remove\", focus moves on, and the tag is still there — the one thing the control promised did not happen"
|
|
12975
|
+
},
|
|
12976
|
+
{
|
|
12977
|
+
"dont": "a filter row with no way to clear everything at once",
|
|
12978
|
+
"why": "removing six filters one by one is six targets; pair the group with a \"Clear filters\" Button"
|
|
12979
|
+
}
|
|
12980
|
+
],
|
|
12981
|
+
"stylesheet": "src/styles/tag-group.css",
|
|
12982
|
+
"tokens": [
|
|
12983
|
+
"--border-disabled",
|
|
12984
|
+
"--border-subtle",
|
|
12985
|
+
"--border-width-default",
|
|
12986
|
+
"--border-width-thick",
|
|
12987
|
+
"--font-family-sans",
|
|
12988
|
+
"--font-weight-medium",
|
|
12989
|
+
"--icon-default",
|
|
12990
|
+
"--icon-disabled",
|
|
12991
|
+
"--icon-secondary",
|
|
12992
|
+
"--icon-size-2xs",
|
|
12993
|
+
"--ion-duration-base",
|
|
12994
|
+
"--ion-ease-out",
|
|
12995
|
+
"--radius-md",
|
|
12996
|
+
"--radius-sm",
|
|
12997
|
+
"--radius-xs",
|
|
12998
|
+
"--ring-focus",
|
|
12999
|
+
"--spacing-12",
|
|
13000
|
+
"--spacing-16",
|
|
13001
|
+
"--spacing-20",
|
|
13002
|
+
"--spacing-24",
|
|
13003
|
+
"--spacing-32",
|
|
13004
|
+
"--spacing-4",
|
|
13005
|
+
"--spacing-6",
|
|
13006
|
+
"--spacing-8",
|
|
13007
|
+
"--surface-disabled",
|
|
13008
|
+
"--surface-hover",
|
|
13009
|
+
"--surface-subtle",
|
|
13010
|
+
"--text-default",
|
|
13011
|
+
"--text-disabled",
|
|
13012
|
+
"--text-secondary",
|
|
13013
|
+
"--text-tertiary",
|
|
13014
|
+
"--type-body",
|
|
13015
|
+
"--type-body-line-height",
|
|
13016
|
+
"--type-body-sm",
|
|
13017
|
+
"--type-body-sm-line-height"
|
|
13018
|
+
],
|
|
13019
|
+
"props": {
|
|
13020
|
+
"onRemove": {
|
|
13021
|
+
"type": "((keys: Set<Key>) => void) | undefined",
|
|
13022
|
+
"required": false,
|
|
13023
|
+
"origin": "own",
|
|
13024
|
+
"description": "Called with the keys of the tags to remove — from a tag's × button, or\nDelete / Backspace on a focused tag. Pass it and every tag shows a remove\nbutton; leave it out and the tags are read-only labels. The group does\nnot remove anything itself: drop the keys from your own list."
|
|
13025
|
+
},
|
|
13026
|
+
"size": {
|
|
13027
|
+
"type": "TagGroupSize | undefined",
|
|
13028
|
+
"required": false,
|
|
13029
|
+
"origin": "own",
|
|
13030
|
+
"description": "Figma's `Size`. Set once here, so every tag in a group matches.",
|
|
13031
|
+
"values": [
|
|
13032
|
+
"sm",
|
|
13033
|
+
"md"
|
|
13034
|
+
],
|
|
13035
|
+
"default": "sm"
|
|
13036
|
+
},
|
|
13037
|
+
"emptyLabel": {
|
|
13038
|
+
"type": "React.ReactNode",
|
|
13039
|
+
"required": false,
|
|
13040
|
+
"origin": "own",
|
|
13041
|
+
"description": "Shown in place of the tags when there are none — \"No filters applied\".\nWithout it an empty group renders nothing but its label."
|
|
13042
|
+
},
|
|
13043
|
+
"className": {
|
|
13044
|
+
"type": "string | undefined",
|
|
13045
|
+
"required": false,
|
|
13046
|
+
"origin": "own"
|
|
13047
|
+
},
|
|
13048
|
+
"id": {
|
|
13049
|
+
"type": "string | undefined",
|
|
13050
|
+
"required": false,
|
|
13051
|
+
"origin": "aria",
|
|
13052
|
+
"description": "The element's unique identifier. See\n[MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/id)."
|
|
13053
|
+
},
|
|
13054
|
+
"aria-describedby": {
|
|
13055
|
+
"type": "string | undefined",
|
|
13056
|
+
"required": false,
|
|
13057
|
+
"origin": "aria",
|
|
13058
|
+
"description": "Identifies the element (or elements) that describes the object."
|
|
13059
|
+
},
|
|
13060
|
+
"aria-details": {
|
|
13061
|
+
"type": "string | undefined",
|
|
13062
|
+
"required": false,
|
|
13063
|
+
"origin": "aria",
|
|
13064
|
+
"description": "Identifies the element (or elements) that provide a detailed, extended description for the\nobject."
|
|
13065
|
+
},
|
|
13066
|
+
"aria-label": {
|
|
13067
|
+
"type": "string | undefined",
|
|
13068
|
+
"required": false,
|
|
13069
|
+
"origin": "aria",
|
|
13070
|
+
"description": "Defines a string value that labels the current element."
|
|
13071
|
+
},
|
|
13072
|
+
"aria-labelledby": {
|
|
13073
|
+
"type": "string | undefined",
|
|
13074
|
+
"required": false,
|
|
13075
|
+
"origin": "aria",
|
|
13076
|
+
"description": "Identifies the element (or elements) that labels the current element."
|
|
13077
|
+
},
|
|
13078
|
+
"children": {
|
|
13079
|
+
"type": "CollectionChildren<T>",
|
|
13080
|
+
"required": true,
|
|
13081
|
+
"origin": "aria",
|
|
13082
|
+
"description": "The contents of the collection."
|
|
13083
|
+
},
|
|
13084
|
+
"description": {
|
|
13085
|
+
"type": "ReactNode",
|
|
13086
|
+
"required": false,
|
|
13087
|
+
"origin": "aria",
|
|
13088
|
+
"description": "A description for the field. Provides a hint such as specific requirements for what to choose."
|
|
13089
|
+
},
|
|
13090
|
+
"label": {
|
|
13091
|
+
"type": "ReactNode",
|
|
13092
|
+
"required": false,
|
|
13093
|
+
"origin": "aria",
|
|
13094
|
+
"description": "The content to display as the label."
|
|
13095
|
+
},
|
|
13096
|
+
"items": {
|
|
13097
|
+
"type": "Iterable<T> | undefined",
|
|
13098
|
+
"required": false,
|
|
13099
|
+
"origin": "aria",
|
|
13100
|
+
"description": "Item objects in the collection."
|
|
13101
|
+
},
|
|
13102
|
+
"disabledKeys": {
|
|
13103
|
+
"type": "Iterable<Key> | undefined",
|
|
13104
|
+
"required": false,
|
|
13105
|
+
"origin": "aria",
|
|
13106
|
+
"description": "The item keys that are disabled. These items cannot be selected, focused, or otherwise\ninteracted with."
|
|
13107
|
+
}
|
|
13108
|
+
},
|
|
13109
|
+
"propCounts": {
|
|
13110
|
+
"own": 4,
|
|
13111
|
+
"aria": 10,
|
|
13112
|
+
"dom": 0,
|
|
13113
|
+
"other": 0
|
|
13114
|
+
}
|
|
13115
|
+
},
|
|
12364
13116
|
"Textarea": {
|
|
12365
13117
|
"name": "Textarea",
|
|
12366
13118
|
"source": "src/components/Textarea.tsx",
|
|
@@ -12881,6 +13633,230 @@
|
|
|
12881
13633
|
"other": 0
|
|
12882
13634
|
}
|
|
12883
13635
|
},
|
|
13636
|
+
"TimeField": {
|
|
13637
|
+
"name": "TimeField",
|
|
13638
|
+
"source": "src/components/TimeField.tsx",
|
|
13639
|
+
"propsType": "TimeFieldProps",
|
|
13640
|
+
"description": "TimeField — a time of day, typed into segments.\n\nDatePicker's text half, for times: hour, minute and, where the locale uses\none, AM/PM — each a spinbutton that takes digits or arrow keys. The order,\nthe separator and the 12 or 24-hour clock come from the reader's locale, so\n\"2:30 PM\" and \"14:30\" are the same field and the same value.\n\nWHY NOT A TEXT INPUT OR `<input type=\"time\">`\n\nFree text means guessing whether \"2:30\" is afternoon. The native control\ncannot be styled to match the other fields, and Safari's has no picker at\nall. Segments cannot hold a time that does not exist, and every browser\ndraws them the same.\n\nNo dropdown of times. A list of 96 quarter-hours is slower to scan than two\ndigits are to type, and it makes 09:07 impossible. Where only a few times\nare allowed, that is a Select, not a TimeField.",
|
|
13641
|
+
"import": "import { TimeField } from 'ionbase-ui';",
|
|
13642
|
+
"status": "stable",
|
|
13643
|
+
"since": "0.80.0",
|
|
13644
|
+
"summary": "A time of day typed into hour, minute and AM/PM segments in the reader's own format, taking and returning a 24-hour HH:MM string.",
|
|
13645
|
+
"useWhen": [
|
|
13646
|
+
"the user sets a time of day — a schedule, a reminder, the start of a window",
|
|
13647
|
+
"any minute is allowed, so a list of choices would be long or would leave times out",
|
|
13648
|
+
"beside a DatePicker when the value is a date and a time; the two sit side by side and share one box"
|
|
13649
|
+
],
|
|
13650
|
+
"useInstead": [
|
|
13651
|
+
{
|
|
13652
|
+
"when": "only a handful of times are allowed — delivery slots, office hours",
|
|
13653
|
+
"use": "Select",
|
|
13654
|
+
"why": "picking from four slots is a choice from a list, and a field that accepts any minute invites times the product will refuse"
|
|
13655
|
+
},
|
|
13656
|
+
{
|
|
13657
|
+
"when": "the value is a duration — 30 minutes, 2 hours",
|
|
13658
|
+
"use": "NumberInput",
|
|
13659
|
+
"why": "a duration is an amount, not a time of day; 02:00 as a length reads as two in the morning"
|
|
13660
|
+
},
|
|
13661
|
+
{
|
|
13662
|
+
"when": "the value is a calendar date",
|
|
13663
|
+
"use": "DatePicker"
|
|
13664
|
+
}
|
|
13665
|
+
],
|
|
13666
|
+
"variants": {
|
|
13667
|
+
"size": {
|
|
13668
|
+
"sm": {
|
|
13669
|
+
"use": "dense forms, table filters"
|
|
13670
|
+
},
|
|
13671
|
+
"md": {
|
|
13672
|
+
"use": "the default"
|
|
13673
|
+
},
|
|
13674
|
+
"lg": {
|
|
13675
|
+
"use": "prominent single-field forms"
|
|
13676
|
+
}
|
|
13677
|
+
},
|
|
13678
|
+
"granularity": {
|
|
13679
|
+
"hour": {
|
|
13680
|
+
"use": "on-the-hour schedules — the minute segment is not shown"
|
|
13681
|
+
},
|
|
13682
|
+
"minute": {
|
|
13683
|
+
"use": "the default — almost every time of day a person sets"
|
|
13684
|
+
},
|
|
13685
|
+
"second": {
|
|
13686
|
+
"use": "logs and precise triggers; the value becomes HH:MM:SS"
|
|
13687
|
+
}
|
|
13688
|
+
}
|
|
13689
|
+
},
|
|
13690
|
+
"a11y": {
|
|
13691
|
+
"guarantees": [
|
|
13692
|
+
"each segment is a spinbutton that announces its own name, value and bounds — 'hour, 2, minimum 1, maximum 12' — and takes digits or arrow keys",
|
|
13693
|
+
"each editable segment is its own tab stop, like DatePicker and the native time input; the separator is not",
|
|
13694
|
+
"the 12 or 24-hour clock, the separator and the AM/PM wording come from the reader's locale, so '2:30 PM' and '14:30' are the same field and the same value",
|
|
13695
|
+
"the segments sit in one labelled group, so the name is announced once on entry",
|
|
13696
|
+
"a time that does not exist cannot be typed",
|
|
13697
|
+
"a time outside `minValue`/`maxValue` turns the field invalid and names the bound in the reader's own format, without `isInvalid` — the value is kept, not silently clamped"
|
|
13698
|
+
],
|
|
13699
|
+
"requires": [
|
|
13700
|
+
"`label`, or `aria-label` when no visible label is rendered",
|
|
13701
|
+
"a `description` saying which timezone the time is in, whenever the reader could be in a different one from the thing being scheduled"
|
|
13702
|
+
],
|
|
13703
|
+
"notes": [
|
|
13704
|
+
"`value` is a wall-clock time with no date and no zone. Keep the timezone as its own field or setting; a time pinned to a `Date` drifts an hour at every daylight-saving change.",
|
|
13705
|
+
"The clock icon is decorative. There is no dropdown of times: two digits are faster to type than 96 quarter-hours are to scan, and a list makes 09:07 impossible."
|
|
13706
|
+
]
|
|
13707
|
+
},
|
|
13708
|
+
"antiPatterns": [
|
|
13709
|
+
{
|
|
13710
|
+
"dont": "passing a Date, a timestamp or a locale-formatted string such as \"2:30 PM\" as `value`",
|
|
13711
|
+
"why": "the value is 24-hour HH:MM. A malformed value throws with the prop name rather than rendering an empty field"
|
|
13712
|
+
},
|
|
13713
|
+
{
|
|
13714
|
+
"dont": "forcing `hourCycle={12}` for everyone",
|
|
13715
|
+
"why": "a reader whose locale uses 24 hours has to translate every value, which is the misreading the segments exist to prevent. Leave it to the locale"
|
|
13716
|
+
},
|
|
13717
|
+
{
|
|
13718
|
+
"dont": "a schedule time with no timezone anywhere on the form",
|
|
13719
|
+
"why": "\"09:00\" is nine o'clock somewhere; if the reader and the workspace are in different zones, they will each assume their own"
|
|
13720
|
+
},
|
|
13721
|
+
{
|
|
13722
|
+
"dont": "using `minValue` and `maxValue` for a window that crosses midnight",
|
|
13723
|
+
"why": "22:00 to 02:00 has a minimum later than its maximum, so every time is refused; validate the window yourself and set `isInvalid`"
|
|
13724
|
+
}
|
|
13725
|
+
],
|
|
13726
|
+
"stylesheet": "src/styles/time-field.css",
|
|
13727
|
+
"tokens": [],
|
|
13728
|
+
"props": {
|
|
13729
|
+
"label": {
|
|
13730
|
+
"type": "React.ReactNode",
|
|
13731
|
+
"required": false,
|
|
13732
|
+
"origin": "own",
|
|
13733
|
+
"description": "Field label. Required for a usable control — see `a11y.requires`."
|
|
13734
|
+
},
|
|
13735
|
+
"aria-label": {
|
|
13736
|
+
"type": "string | undefined",
|
|
13737
|
+
"required": false,
|
|
13738
|
+
"origin": "own",
|
|
13739
|
+
"description": "Names the field when there is no visible `label`."
|
|
13740
|
+
},
|
|
13741
|
+
"description": {
|
|
13742
|
+
"type": "React.ReactNode",
|
|
13743
|
+
"required": false,
|
|
13744
|
+
"origin": "own",
|
|
13745
|
+
"description": "Helper text below the field — \"In the workspace's timezone\"."
|
|
13746
|
+
},
|
|
13747
|
+
"errorMessage": {
|
|
13748
|
+
"type": "React.ReactNode",
|
|
13749
|
+
"required": false,
|
|
13750
|
+
"origin": "own",
|
|
13751
|
+
"description": "Replaces the helper text while the field is invalid — `isInvalid`, or its own bounds check."
|
|
13752
|
+
},
|
|
13753
|
+
"isInvalid": {
|
|
13754
|
+
"type": "boolean | undefined",
|
|
13755
|
+
"required": false,
|
|
13756
|
+
"origin": "own"
|
|
13757
|
+
},
|
|
13758
|
+
"isDisabled": {
|
|
13759
|
+
"type": "boolean | undefined",
|
|
13760
|
+
"required": false,
|
|
13761
|
+
"origin": "own"
|
|
13762
|
+
},
|
|
13763
|
+
"isReadOnly": {
|
|
13764
|
+
"type": "boolean | undefined",
|
|
13765
|
+
"required": false,
|
|
13766
|
+
"origin": "own"
|
|
13767
|
+
},
|
|
13768
|
+
"isRequired": {
|
|
13769
|
+
"type": "boolean | undefined",
|
|
13770
|
+
"required": false,
|
|
13771
|
+
"origin": "own"
|
|
13772
|
+
},
|
|
13773
|
+
"size": {
|
|
13774
|
+
"type": "TimeFieldSize | undefined",
|
|
13775
|
+
"required": false,
|
|
13776
|
+
"origin": "own",
|
|
13777
|
+
"description": "Matches Input's `Size` variant: Small, Medium, Large.",
|
|
13778
|
+
"values": [
|
|
13779
|
+
"sm",
|
|
13780
|
+
"md",
|
|
13781
|
+
"lg"
|
|
13782
|
+
]
|
|
13783
|
+
},
|
|
13784
|
+
"value": {
|
|
13785
|
+
"type": "string | null | undefined",
|
|
13786
|
+
"required": false,
|
|
13787
|
+
"origin": "own",
|
|
13788
|
+
"description": "The time as `HH:MM` (or `HH:MM:SS`), 24-hour, whatever the reader sees.\n`null` means no time is chosen. A wall-clock reading — no date, no\ntimezone. A malformed value throws rather than rendering an empty field."
|
|
13789
|
+
},
|
|
13790
|
+
"defaultValue": {
|
|
13791
|
+
"type": "string | undefined",
|
|
13792
|
+
"required": false,
|
|
13793
|
+
"origin": "own",
|
|
13794
|
+
"description": "The initial time, for an uncontrolled field."
|
|
13795
|
+
},
|
|
13796
|
+
"onChange": {
|
|
13797
|
+
"type": "((value: IsoTime | null) => void) | undefined",
|
|
13798
|
+
"required": false,
|
|
13799
|
+
"origin": "own",
|
|
13800
|
+
"description": "Fires with `HH:MM` (`HH:MM:SS` at second granularity), or `null` when cleared."
|
|
13801
|
+
},
|
|
13802
|
+
"minValue": {
|
|
13803
|
+
"type": "string | undefined",
|
|
13804
|
+
"required": false,
|
|
13805
|
+
"origin": "own",
|
|
13806
|
+
"description": "Earliest allowed time, `HH:MM`. Later is not wrapped past midnight."
|
|
13807
|
+
},
|
|
13808
|
+
"maxValue": {
|
|
13809
|
+
"type": "string | undefined",
|
|
13810
|
+
"required": false,
|
|
13811
|
+
"origin": "own",
|
|
13812
|
+
"description": "Latest allowed time, `HH:MM`."
|
|
13813
|
+
},
|
|
13814
|
+
"granularity": {
|
|
13815
|
+
"type": "TimeFieldGranularity | undefined",
|
|
13816
|
+
"required": false,
|
|
13817
|
+
"origin": "own",
|
|
13818
|
+
"description": "Defaults to `minute`. `second` adds a seconds segment and value.",
|
|
13819
|
+
"values": [
|
|
13820
|
+
"hour",
|
|
13821
|
+
"minute",
|
|
13822
|
+
"second"
|
|
13823
|
+
]
|
|
13824
|
+
},
|
|
13825
|
+
"hourCycle": {
|
|
13826
|
+
"type": "12 | 24 | undefined",
|
|
13827
|
+
"required": false,
|
|
13828
|
+
"origin": "own",
|
|
13829
|
+
"description": "12 or 24-hour display. Leave it out: the reader's locale already knows,\nand forcing 12-hour on a 24-hour reader is the misreading this field\nexists to prevent. The value is 24-hour either way."
|
|
13830
|
+
},
|
|
13831
|
+
"name": {
|
|
13832
|
+
"type": "string | undefined",
|
|
13833
|
+
"required": false,
|
|
13834
|
+
"origin": "own",
|
|
13835
|
+
"description": "Posts the value under this name, for an uncontrolled form."
|
|
13836
|
+
},
|
|
13837
|
+
"className": {
|
|
13838
|
+
"type": "string | undefined",
|
|
13839
|
+
"required": false,
|
|
13840
|
+
"origin": "own"
|
|
13841
|
+
},
|
|
13842
|
+
"wrapperClassName": {
|
|
13843
|
+
"type": "string | undefined",
|
|
13844
|
+
"required": false,
|
|
13845
|
+
"origin": "own"
|
|
13846
|
+
},
|
|
13847
|
+
"id": {
|
|
13848
|
+
"type": "string | undefined",
|
|
13849
|
+
"required": false,
|
|
13850
|
+
"origin": "own"
|
|
13851
|
+
}
|
|
13852
|
+
},
|
|
13853
|
+
"propCounts": {
|
|
13854
|
+
"own": 20,
|
|
13855
|
+
"aria": 0,
|
|
13856
|
+
"dom": 0,
|
|
13857
|
+
"other": 0
|
|
13858
|
+
}
|
|
13859
|
+
},
|
|
12884
13860
|
"Toast": {
|
|
12885
13861
|
"name": "Toast",
|
|
12886
13862
|
"source": "src/components/Toast.tsx",
|
|
@@ -13357,8 +14333,8 @@
|
|
|
13357
14333
|
"description": "Matches the Figma `Color` variant: Brand, Neutral, Danger.",
|
|
13358
14334
|
"values": [
|
|
13359
14335
|
"neutral",
|
|
13360
|
-
"
|
|
13361
|
-
"
|
|
14336
|
+
"danger",
|
|
14337
|
+
"brand"
|
|
13362
14338
|
],
|
|
13363
14339
|
"default": "brand"
|
|
13364
14340
|
},
|