@cdx-ui/components 0.2.3 → 0.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +24 -0
- package/README.md +2 -0
- package/coverage.svg +1 -1
- package/docs/components/accordion/content.md +538 -0
- package/docs/components/alert/content.md +203 -0
- package/docs/components/alert-dialog/content.md +319 -0
- package/docs/components/avatar/content.md +368 -0
- package/docs/components/avatar/design.md +202 -0
- package/docs/components/badge/content.md +225 -0
- package/docs/components/bottom-sheet/content.md +353 -0
- package/docs/components/bottom-sheet/design.md +249 -0
- package/docs/components/box/content.md +141 -0
- package/docs/components/breadcrumbs/content.md +169 -0
- package/docs/components/button/content.md +398 -0
- package/docs/components/button/design.md +258 -0
- package/docs/components/calendar/content.md +137 -0
- package/docs/components/card/content.md +283 -0
- package/docs/components/carousel/content.md +417 -0
- package/docs/components/checkbox/content.md +236 -0
- package/docs/components/checkbox/design.md +214 -0
- package/docs/components/chip/content.md +439 -0
- package/docs/components/chip/design.md +418 -0
- package/docs/components/color-area/content.md +84 -0
- package/docs/components/color-field/content.md +132 -0
- package/docs/components/color-picker/content.md +209 -0
- package/docs/components/color-slider/content.md +118 -0
- package/docs/components/color-swatch/content.md +62 -0
- package/docs/components/color-swatch-picker/content.md +124 -0
- package/docs/components/content.md +98 -0
- package/docs/components/currency-input/content.md +205 -0
- package/docs/components/data-grid/content.md +521 -0
- package/docs/components/date-field/content.md +147 -0
- package/docs/components/date-picker/content.md +360 -0
- package/docs/components/date-range-picker/content.md +301 -0
- package/docs/components/date-time-field/content.md +157 -0
- package/docs/components/date-time-list/content.md +105 -0
- package/docs/components/date-time-picker/content.md +272 -0
- package/docs/components/dialog/content.md +436 -0
- package/docs/components/dialog/design.md +192 -0
- package/docs/components/divider/content.md +112 -0
- package/docs/components/drawer/content.md +428 -0
- package/docs/components/field/content.md +277 -0
- package/docs/components/form/content.md +62 -0
- package/docs/components/full-screen-dialog/content.md +881 -0
- package/docs/components/heading/content.md +55 -0
- package/docs/components/icon/content.md +190 -0
- package/docs/components/icon-button/content.md +200 -0
- package/docs/components/icon-button/design.md +165 -0
- package/docs/components/image/content.md +104 -0
- package/docs/components/input/content.md +346 -0
- package/docs/components/input/design.md +389 -0
- package/docs/components/insurance-disclosure/content.md +103 -0
- package/docs/components/link/content.md +180 -0
- package/docs/components/link/design.md +160 -0
- package/docs/components/list-item/content.md +695 -0
- package/docs/components/menu/content.md +1254 -0
- package/docs/components/month-calendar/content.md +84 -0
- package/docs/components/month-picker/content.md +273 -0
- package/docs/components/otp-input/content.md +327 -0
- package/docs/components/progress-bar/content.md +87 -0
- package/docs/components/progress-circle/content.md +176 -0
- package/docs/components/progress-segmented/content.md +119 -0
- package/docs/components/quick-action-button/content.md +154 -0
- package/docs/components/quick-action-button/design.md +170 -0
- package/docs/components/radio/content.md +224 -0
- package/docs/components/range-calendar/content.md +123 -0
- package/docs/components/reorderable-list/content.md +311 -0
- package/docs/components/scoped-theme/content.md +47 -0
- package/docs/components/scroll-shadow/content.md +693 -0
- package/docs/components/select/content.md +473 -0
- package/docs/components/select/design.md +301 -0
- package/docs/components/skeleton/content.md +104 -0
- package/docs/components/slider/content.md +423 -0
- package/docs/components/stack/content.md +161 -0
- package/docs/components/switch/content.md +150 -0
- package/docs/components/switch/design.md +208 -0
- package/docs/components/table/content.md +548 -0
- package/docs/components/table-pagination/content.md +177 -0
- package/docs/components/tabs/content.md +297 -0
- package/docs/components/text/content.md +142 -0
- package/docs/components/textarea/content.md +222 -0
- package/docs/components/tile/content.md +702 -0
- package/docs/components/toast/content.md +456 -0
- package/docs/components/toggle-button/content.md +505 -0
- package/docs/components/tooltip/content.md +350 -0
- package/docs/components/virtualized-list/content.md +250 -0
- package/docs/foundations/content.md +9 -0
- package/docs/foundations/expressions/icons/content.md +19 -0
- package/docs/foundations/styles/tokens/all-tokens/content.md +192 -0
- package/docs/foundations/styles/tokens/what-are-tokens/content.md +33 -0
- package/docs/foundations/styles/tokens/what-are-tokens/design.md +33 -0
- package/docs/getting-started/content.md +4 -0
- package/docs/getting-started/designers/content.md +13 -0
- package/docs/getting-started/designers/design.md +13 -0
- package/docs/getting-started/developers/accessibility/content.md +31 -0
- package/docs/getting-started/developers/content.md +612 -0
- package/docs/getting-started/developers/styling/content.md +195 -0
- package/docs/llms.txt +195 -0
- package/docs/patterns/account-management/content.md +75 -0
- package/docs/patterns/authentication/content.md +50 -0
- package/docs/patterns/content.md +10 -0
- package/docs/patterns/dashboard/content.md +34 -0
- package/docs/patterns/empty-states/content.md +32 -0
- package/docs/patterns/forms/content.md +108 -0
- package/docs/patterns/onboarding/content.md +69 -0
- package/docs/patterns/payments/content.md +35 -0
- package/docs/patterns/settings/content.md +72 -0
- package/docs/resources/content.md +9 -0
- package/docs/resources/figma-libraries/content.md +42 -0
- package/docs/resources/release-notes/0.0.1-beta.118/content.md +27 -0
- package/docs/resources/release-notes/0.0.1-beta.122/content.md +21 -0
- package/docs/resources/release-notes/0.0.1-beta.124/content.md +16 -0
- package/docs/resources/release-notes/0.0.1-beta.126/content.md +10 -0
- package/docs/resources/release-notes/0.0.1-beta.127/content.md +14 -0
- package/docs/resources/release-notes/0.0.1-beta.128/content.md +9 -0
- package/docs/resources/release-notes/0.0.1-beta.129/content.md +18 -0
- package/docs/resources/release-notes/0.0.1-beta.130/content.md +18 -0
- package/docs/resources/release-notes/0.0.1-beta.133/content.md +7 -0
- package/docs/resources/release-notes/0.0.1-beta.134/content.md +17 -0
- package/docs/resources/release-notes/0.0.1-beta.136/content.md +7 -0
- package/docs/resources/release-notes/0.0.1-beta.137/content.md +10 -0
- package/docs/resources/release-notes/0.0.1-beta.138/content.md +7 -0
- package/docs/resources/release-notes/0.0.1-beta.139/content.md +13 -0
- package/docs/resources/release-notes/0.0.1-beta.140/content.md +26 -0
- package/docs/resources/release-notes/0.0.1-beta.141/content.md +63 -0
- package/docs/resources/release-notes/0.0.1-beta.142/content.md +7 -0
- package/docs/resources/release-notes/0.0.1-beta.143/content.md +12 -0
- package/docs/resources/release-notes/0.0.1-beta.144/content.md +7 -0
- package/docs/resources/release-notes/0.0.1-beta.145/content.md +7 -0
- package/docs/resources/release-notes/0.0.1-beta.147/content.md +10 -0
- package/docs/resources/release-notes/0.0.1-beta.149/content.md +10 -0
- package/docs/resources/release-notes/0.0.1-beta.150/content.md +13 -0
- package/docs/resources/release-notes/0.0.1-beta.152/content.md +7 -0
- package/docs/resources/release-notes/0.0.1-beta.154/content.md +15 -0
- package/docs/resources/release-notes/0.0.1-beta.156/content.md +7 -0
- package/docs/resources/release-notes/0.0.1-beta.158/content.md +9 -0
- package/docs/resources/release-notes/0.0.1-beta.159/content.md +11 -0
- package/docs/resources/release-notes/0.0.1-beta.160/content.md +7 -0
- package/docs/resources/release-notes/0.0.1-beta.161/content.md +7 -0
- package/docs/resources/release-notes/0.0.1-beta.163/content.md +7 -0
- package/docs/resources/release-notes/0.0.1-beta.164/content.md +9 -0
- package/docs/resources/release-notes/0.0.1-beta.166/content.md +17 -0
- package/docs/resources/release-notes/0.0.1-beta.167/content.md +7 -0
- package/docs/resources/release-notes/0.0.1-beta.168/content.md +7 -0
- package/docs/resources/release-notes/0.0.1-beta.169/content.md +7 -0
- package/docs/resources/release-notes/0.0.1-beta.171/content.md +16 -0
- package/docs/resources/release-notes/0.0.1-beta.172/content.md +24 -0
- package/docs/resources/release-notes/0.0.1-beta.173/content.md +15 -0
- package/docs/resources/release-notes/0.0.1-beta.174/content.md +7 -0
- package/docs/resources/release-notes/0.0.1-beta.176/content.md +32 -0
- package/docs/resources/release-notes/0.0.1-beta.179/content.md +11 -0
- package/docs/resources/release-notes/0.0.1-beta.182/content.md +13 -0
- package/docs/resources/release-notes/0.0.1-beta.185/content.md +7 -0
- package/docs/resources/release-notes/0.0.1-beta.187/content.md +27 -0
- package/docs/resources/release-notes/0.1.1/content.md +23 -0
- package/docs/resources/release-notes/0.1.2/content.md +7 -0
- package/docs/resources/release-notes/0.1.4/content.md +19 -0
- package/docs/resources/release-notes/0.1.5/content.md +7 -0
- package/docs/resources/release-notes/0.1.6/content.md +7 -0
- package/docs/resources/release-notes/0.2.0/content.md +31 -0
- package/docs/resources/release-notes/0.2.1/content.md +17 -0
- package/docs/resources/release-notes/0.2.2/content.md +11 -0
- package/docs/resources/release-notes/0.2.3/content.md +15 -0
- package/docs/resources/release-notes/0.2.4/content.md +17 -0
- package/docs/resources/release-notes/content.md +65 -0
- package/lib/commonjs/components/Box/Box.js +9 -1
- package/lib/commonjs/components/Box/Box.js.map +1 -1
- package/lib/commonjs/components/Breadcrumbs/index.js +28 -3
- package/lib/commonjs/components/Breadcrumbs/index.js.map +1 -1
- package/lib/commonjs/components/Breadcrumbs/styles.js +27 -0
- package/lib/commonjs/components/Breadcrumbs/styles.js.map +1 -1
- package/lib/commonjs/components/DateTimeList/index.js +11 -26
- package/lib/commonjs/components/DateTimeList/index.js.map +1 -1
- package/lib/commonjs/components/DateTimeList/styles.js +2 -12
- package/lib/commonjs/components/DateTimeList/styles.js.map +1 -1
- package/lib/commonjs/components/ListItem/index.js.map +1 -1
- package/lib/commonjs/components/ListItem/styles.js +2 -1
- package/lib/commonjs/components/ListItem/styles.js.map +1 -1
- package/lib/commonjs/components/Menu/index.js +11 -5
- package/lib/commonjs/components/Menu/index.js.map +1 -1
- package/lib/commonjs/components/ScrollShadow/gradient.js +29 -0
- package/lib/commonjs/components/ScrollShadow/gradient.js.map +1 -0
- package/lib/commonjs/components/ScrollShadow/index.js +171 -44
- package/lib/commonjs/components/ScrollShadow/index.js.map +1 -1
- package/lib/commonjs/components/ScrollShadow/styles.js +58 -14
- package/lib/commonjs/components/ScrollShadow/styles.js.map +1 -1
- package/lib/commonjs/components/ScrollShadow/useComposedScrollHandler.js +63 -0
- package/lib/commonjs/components/ScrollShadow/useComposedScrollHandler.js.map +1 -0
- package/lib/commonjs/components/ScrollShadow/useScrollShadow.js +48 -8
- package/lib/commonjs/components/ScrollShadow/useScrollShadow.js.map +1 -1
- package/lib/commonjs/components/Stack/HStack.js +6 -2
- package/lib/commonjs/components/Stack/HStack.js.map +1 -1
- package/lib/commonjs/components/Stack/VStack.js +6 -2
- package/lib/commonjs/components/Stack/VStack.js.map +1 -1
- package/lib/commonjs/components/Tabs/index.js +16 -23
- package/lib/commonjs/components/Tabs/index.js.map +1 -1
- package/lib/commonjs/components/Tabs/styles.js +1 -10
- package/lib/commonjs/components/Tabs/styles.js.map +1 -1
- package/lib/commonjs/figma/ListItem.SectionHeader.figma.js +20 -5
- package/lib/commonjs/figma/ListItem.SectionHeader.figma.js.map +1 -1
- package/lib/commonjs/index.js +10 -10
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/components/Box/Box.js +9 -1
- package/lib/module/components/Box/Box.js.map +1 -1
- package/lib/module/components/Breadcrumbs/index.js +29 -4
- package/lib/module/components/Breadcrumbs/index.js.map +1 -1
- package/lib/module/components/Breadcrumbs/styles.js +26 -0
- package/lib/module/components/Breadcrumbs/styles.js.map +1 -1
- package/lib/module/components/DateTimeList/index.js +12 -27
- package/lib/module/components/DateTimeList/index.js.map +1 -1
- package/lib/module/components/DateTimeList/styles.js +1 -11
- package/lib/module/components/DateTimeList/styles.js.map +1 -1
- package/lib/module/components/ListItem/index.js.map +1 -1
- package/lib/module/components/ListItem/styles.js +2 -1
- package/lib/module/components/ListItem/styles.js.map +1 -1
- package/lib/module/components/Menu/index.js +11 -5
- package/lib/module/components/Menu/index.js.map +1 -1
- package/lib/module/components/ScrollShadow/gradient.js +24 -0
- package/lib/module/components/ScrollShadow/gradient.js.map +1 -0
- package/lib/module/components/ScrollShadow/index.js +170 -48
- package/lib/module/components/ScrollShadow/index.js.map +1 -1
- package/lib/module/components/ScrollShadow/styles.js +57 -13
- package/lib/module/components/ScrollShadow/styles.js.map +1 -1
- package/lib/module/components/ScrollShadow/useComposedScrollHandler.js +57 -0
- package/lib/module/components/ScrollShadow/useComposedScrollHandler.js.map +1 -0
- package/lib/module/components/ScrollShadow/useScrollShadow.js +46 -8
- package/lib/module/components/ScrollShadow/useScrollShadow.js.map +1 -1
- package/lib/module/components/Stack/HStack.js +6 -2
- package/lib/module/components/Stack/HStack.js.map +1 -1
- package/lib/module/components/Stack/VStack.js +6 -2
- package/lib/module/components/Stack/VStack.js.map +1 -1
- package/lib/module/components/Tabs/index.js +17 -24
- package/lib/module/components/Tabs/index.js.map +1 -1
- package/lib/module/components/Tabs/styles.js +0 -9
- package/lib/module/components/Tabs/styles.js.map +1 -1
- package/lib/module/figma/ListItem.SectionHeader.figma.js +20 -5
- package/lib/module/figma/ListItem.SectionHeader.figma.js.map +1 -1
- package/lib/module/index.js +6 -1
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/animation/hooks/usePopupDialogContentAnimation.d.ts +2 -2
- package/lib/typescript/animation/hooks/usePopupOverlayAnimation.d.ts +2 -2
- package/lib/typescript/components/Box/Box.d.ts +4 -0
- package/lib/typescript/components/Box/Box.d.ts.map +1 -1
- package/lib/typescript/components/Breadcrumbs/index.d.ts +3 -1
- package/lib/typescript/components/Breadcrumbs/index.d.ts.map +1 -1
- package/lib/typescript/components/Breadcrumbs/styles.d.ts +2 -0
- package/lib/typescript/components/Breadcrumbs/styles.d.ts.map +1 -1
- package/lib/typescript/components/DateTimeList/index.d.ts.map +1 -1
- package/lib/typescript/components/DateTimeList/styles.d.ts +1 -4
- package/lib/typescript/components/DateTimeList/styles.d.ts.map +1 -1
- package/lib/typescript/components/ListItem/index.d.ts +5 -4
- package/lib/typescript/components/ListItem/index.d.ts.map +1 -1
- package/lib/typescript/components/ListItem/styles.d.ts +1 -1
- package/lib/typescript/components/ListItem/styles.d.ts.map +1 -1
- package/lib/typescript/components/Menu/index.d.ts.map +1 -1
- package/lib/typescript/components/ScrollShadow/gradient.d.ts +7 -0
- package/lib/typescript/components/ScrollShadow/gradient.d.ts.map +1 -0
- package/lib/typescript/components/ScrollShadow/index.d.ts +57 -15
- package/lib/typescript/components/ScrollShadow/index.d.ts.map +1 -1
- package/lib/typescript/components/ScrollShadow/styles.d.ts +8 -2
- package/lib/typescript/components/ScrollShadow/styles.d.ts.map +1 -1
- package/lib/typescript/components/ScrollShadow/useComposedScrollHandler.d.ts +13 -0
- package/lib/typescript/components/ScrollShadow/useComposedScrollHandler.d.ts.map +1 -0
- package/lib/typescript/components/ScrollShadow/useScrollShadow.d.ts +15 -2
- package/lib/typescript/components/ScrollShadow/useScrollShadow.d.ts.map +1 -1
- package/lib/typescript/components/Stack/HStack.d.ts +3 -2
- package/lib/typescript/components/Stack/HStack.d.ts.map +1 -1
- package/lib/typescript/components/Stack/VStack.d.ts +3 -2
- package/lib/typescript/components/Stack/VStack.d.ts.map +1 -1
- package/lib/typescript/components/Tabs/index.d.ts.map +1 -1
- package/lib/typescript/components/Tabs/styles.d.ts +0 -7
- package/lib/typescript/components/Tabs/styles.d.ts.map +1 -1
- package/lib/typescript/components/Toast/animation.d.ts +3 -3
- package/lib/typescript/components/Toast/animation.d.ts.map +1 -1
- package/lib/typescript/figma/ListItem.SectionHeader.figma.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +6 -1
- package/lib/typescript/index.d.ts.map +1 -1
- package/package.json +11 -9
- package/src/components/Box/Box.tsx +18 -4
- package/src/components/Breadcrumbs/index.tsx +28 -4
- package/src/components/Breadcrumbs/styles.ts +30 -0
- package/src/components/DateTimeList/index.tsx +13 -26
- package/src/components/DateTimeList/styles.ts +1 -10
- package/src/components/ListItem/index.tsx +5 -4
- package/src/components/ListItem/styles.ts +1 -0
- package/src/components/Menu/index.tsx +11 -8
- package/src/components/ScrollShadow/gradient.ts +48 -0
- package/src/components/ScrollShadow/index.tsx +300 -69
- package/src/components/ScrollShadow/styles.ts +45 -28
- package/src/components/ScrollShadow/useComposedScrollHandler.ts +58 -0
- package/src/components/ScrollShadow/useScrollShadow.ts +72 -10
- package/src/components/Stack/HStack.tsx +8 -4
- package/src/components/Stack/VStack.tsx +8 -4
- package/src/components/Tabs/index.tsx +25 -35
- package/src/components/Tabs/styles.ts +0 -9
- package/src/index.ts +8 -1
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
# Select — Design (https://design.candescent.com/docs/components/select)
|
|
2
|
+
|
|
3
|
+
## Usage
|
|
4
|
+
|
|
5
|
+
**Example**
|
|
6
|
+
|
|
7
|
+
**Common alternative names**: Dropdown, selector, selection menu
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## **Anatomy**
|
|
12
|
+
|
|
13
|
+
Select is an input field, similar to the Input Field component. However, the Select field contains a Menu component that is hidden until the user clicks to open it.
|
|
14
|
+
|
|
15
|
+
1. **Label**: Text describing what the input field is asking for.
|
|
16
|
+
2. **Value**: The currently selected value.
|
|
17
|
+
3. **Helper text**: An optional line of assistive text attached to the bottom of the field.
|
|
18
|
+
4. **Dropdown indicator**: Icon indicating that the field has a menu of options. Icon is flipped when the menu is open.
|
|
19
|
+
5. **Menu**: The list of options available to select from.
|
|
20
|
+
6. **Selected option**: The currently selected option, highlighted in the menu.
|
|
21
|
+
|
|
22
|
+
### **Size**
|
|
23
|
+
|
|
24
|
+
Select fields are available in 2 sizes: **Default** and **Small**. These sizes give you flexibility when building layouts, but a consistent size should be used for all input fields on the same page.
|
|
25
|
+
|
|
26
|
+
- **size: default**
|
|
27
|
+
|
|
28
|
+
The default size and the most commonly used size. Has a height of 44px when used without helper text.
|
|
29
|
+
|
|
30
|
+
### **Required**
|
|
31
|
+
|
|
32
|
+
A select field can be designated as a required input. The user will be required to make a selection before continuing or submitting the form.
|
|
33
|
+
|
|
34
|
+
- **required: true**
|
|
35
|
+
|
|
36
|
+
An asterisk is displayed next to the label. It is not part of the label text.
|
|
37
|
+
|
|
38
|
+
### **Helper text**
|
|
39
|
+
|
|
40
|
+
Helper text is an optional line of assistive text attached to the bottom of an input field. It can provide critical information, instructions, acceptance criteria, or other important information that will help users complete the input. It can also be used to provide an explanation when the field is in an error state.
|
|
41
|
+
|
|
42
|
+
- **Show Helper Text?: true**
|
|
43
|
+
|
|
44
|
+
A line of small text is shown below the field. This variant increases the field height.
|
|
45
|
+
|
|
46
|
+
### **Hidden label**
|
|
47
|
+
|
|
48
|
+
When absolutely necessary, the label of a select field can be hidden. There are very, very few places where hiding the field’s label is recommended, so avoid using this variant whenever possible.
|
|
49
|
+
|
|
50
|
+
- **Show Label?: false**
|
|
51
|
+
|
|
52
|
+
The field label is hidden.
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
**Usage**
|
|
57
|
+
|
|
58
|
+
### **When to use**
|
|
59
|
+
|
|
60
|
+
> [!TIP]
|
|
61
|
+
>
|
|
62
|
+
> **When the user needs to choose one option from a finite list**
|
|
63
|
+
>
|
|
64
|
+
> - ex: Select a state in a shipping address form
|
|
65
|
+
> - ex: Select an account to use in a money transfer form
|
|
66
|
+
> - ex: Select a sorting option when viewing a list of transactions
|
|
67
|
+
|
|
68
|
+
> [!TIP]
|
|
69
|
+
>
|
|
70
|
+
> **When the user may choose multiple options from a finite list**
|
|
71
|
+
>
|
|
72
|
+
> - ex: Select a few transaction categories to filter by when viewing a list of transactions
|
|
73
|
+
> - ex: Select multiple family members when assigning authorized users of a credit card
|
|
74
|
+
|
|
75
|
+
> [!TIP]
|
|
76
|
+
>
|
|
77
|
+
> **When the list of options is easy to navigate without search functionality**
|
|
78
|
+
>
|
|
79
|
+
> - ex: When selecting a state in a shipping address form, the user is generally familiar with the options, and they are typically sorted alphabetically.
|
|
80
|
+
> - ex. When selecting an account in a money transfer form, the user is familiar with all of their accounts.
|
|
81
|
+
|
|
82
|
+
> [!TIP]
|
|
83
|
+
>
|
|
84
|
+
> **To reduce the potential for errors in form data**
|
|
85
|
+
>
|
|
86
|
+
> - ex: Selecting a state from a menu avoids users having to spell the name of the state correctly
|
|
87
|
+
> - ex: Selecting an account from a menu avoids users having to remember their exact account name or account number
|
|
88
|
+
|
|
89
|
+
### **When not to use**
|
|
90
|
+
|
|
91
|
+
> [!CAUTION]
|
|
92
|
+
>
|
|
93
|
+
> **Large, undefined, or unique data sets**
|
|
94
|
+
>
|
|
95
|
+
> - ex: ZIP code in a shipping address form
|
|
96
|
+
> - ex: Dollar amount in a money transfer form
|
|
97
|
+
> - Instead, consider a [Input Field](https://design.candescent.com/docs/components/input/content.md) or Autocomplete.
|
|
98
|
+
|
|
99
|
+
> [!CAUTION]
|
|
100
|
+
>
|
|
101
|
+
> **For long lists of options that should have a search functionality**
|
|
102
|
+
>
|
|
103
|
+
> - ex: Select your favorite movie from a list of the top 100 highest-grossing movies
|
|
104
|
+
> - ex: Select a recipient from your contacts to send a text message
|
|
105
|
+
|
|
106
|
+
### **Select field vs. radio buttons**
|
|
107
|
+
|
|
108
|
+
When there are 5 or less options to choose from, a select field and a Form Control with radio buttons are mostly interchangeable. Use your best judgement to choose which component is best for your form’s layout and context.
|
|
109
|
+
|
|
110
|
+
- **Do:** Choose a select field over a Form Control when it will help maintain a consistent look and flow in the form.
|
|
111
|
+
- **Caution:** Avoid using a Form Control if it will disrupt the flow or consistent look of the form.
|
|
112
|
+
|
|
113
|
+
### **Layout and placement**
|
|
114
|
+
|
|
115
|
+
Select fields are typically found on forms. When placing the component, make sure it is appropriately spaced from other form fields to prevent confusion. It should be placed in a location that does not block other important information on the page when the field is active and the menu has dropped down.
|
|
116
|
+
|
|
117
|
+
When using a select field in a form, please see the Form Pattern for additional guidance about layout and placement.
|
|
118
|
+
|
|
119
|
+
### **Using helper text**
|
|
120
|
+
|
|
121
|
+
Helper text is an optional line of assistive text attached to the bottom of an input. It can provide instructions, acceptance criteria, or other important information that will help the user make a selection.
|
|
122
|
+
|
|
123
|
+
#### **When to use helper text**
|
|
124
|
+
|
|
125
|
+
Helper text should only be used when necessary. Too much helper text will clutter the screen, and may overload the user. Use these guidelines to decide if helper text would be beneficial for your select field:
|
|
126
|
+
|
|
127
|
+
- Will most users need additional information to understand what the input is asking for?
|
|
128
|
+
- Will most users need an explanation of what their selection represents?
|
|
129
|
+
- Will users want to know why, how, or where their response will be used? Will they hesitate to answer without that info?
|
|
130
|
+
|
|
131
|
+
Addressing these needs will help the user complete the input more quickly and with less errors.
|
|
132
|
+
|
|
133
|
+
- **Do:** Include helper text when the user needs additional info to understand exactly what the input is asking for.
|
|
134
|
+
- **Do:** Include helper text when the user needs additional info to understand how their response will be used.
|
|
135
|
+
|
|
136
|
+
#### **When not to use helper text**
|
|
137
|
+
|
|
138
|
+
Do not use helper text in place of a label, or to indicate that the input is required.
|
|
139
|
+
|
|
140
|
+
- **Don't:** Don’t use helper text to indicate that an input is required.
|
|
141
|
+
- **Don't:** Don’t use helper text in place of an input label.
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## **Behavior**
|
|
146
|
+
|
|
147
|
+
### **Interaction states**
|
|
148
|
+
|
|
149
|
+
The default state of a select field is clickable. The appearance of the field will respond as the user interacts with it.
|
|
150
|
+
|
|
151
|
+
- **Resting**
|
|
152
|
+
|
|
153
|
+
Default state. User is not interacting with the select field, and the menu is not open.
|
|
154
|
+
- **Hover**
|
|
155
|
+
|
|
156
|
+
When the user’s cursor is hovering over the Select field.
|
|
157
|
+
- **Focus**
|
|
158
|
+
|
|
159
|
+
When a keyboard user is focused on the select field using tab navigation controls.
|
|
160
|
+
- **open: true**
|
|
161
|
+
|
|
162
|
+
When the select field’s menu is open, showing the selectable options. In this state, the user can select an option from the menu.
|
|
163
|
+
|
|
164
|
+
### **Disabled**
|
|
165
|
+
|
|
166
|
+
The select field can be disabled, which prevents the user from clicking on or interacting with the field in any way, including editing the current value. Using disabled fields can cause accessibility issues, so avoid using this state wherever possible.
|
|
167
|
+
|
|
168
|
+
In this state, the user cannot interact with the field or change its current value. The background color and the value appear greyed out.
|
|
169
|
+
|
|
170
|
+
### **Read only**
|
|
171
|
+
|
|
172
|
+
The select component can be set to read only mode, which prevents the user from changing the value of the field. Unlike the disabled state, the user can still interact with this field through hover and keyboard focus, allowing screen readers to read out the current value of the field.
|
|
173
|
+
|
|
174
|
+
In this state, the user cannot open the menu or edit the value of the field. However, the value remains fully visible, and the user can hover over or focus on the field.
|
|
175
|
+
|
|
176
|
+
### **Error state**
|
|
177
|
+
|
|
178
|
+
When the user doesn’t select an option for a required Select field, the Select component should collapse, the helper text should show an error message, and the input field should highlight red. The display of new helper text pushes down the content below.
|
|
179
|
+
|
|
180
|
+
When the user selects an invalid option or otherwise makes a mistake.
|
|
181
|
+
|
|
182
|
+
#### **Showing error helper text**
|
|
183
|
+
|
|
184
|
+
Helper text is **required** when the input is in an error state. If the input already had helper text before the error state, the helper text should change. If no helper text was present before the error, the error helper text should push down any content below the field.
|
|
185
|
+
|
|
186
|
+
See the Writing error helper text section for details on how error helper text should be phrased.
|
|
187
|
+
|
|
188
|
+
### **Selection states**
|
|
189
|
+
|
|
190
|
+
The select field is empty when no value is selected, and filled when a value is selected. A default value can be filled in if desired.
|
|
191
|
+
|
|
192
|
+
- **Show Value?: false (default)**
|
|
193
|
+
|
|
194
|
+
No value is currently selected. The field is empty and no item in the menu is selected.
|
|
195
|
+
- **Show Value?: true**
|
|
196
|
+
|
|
197
|
+
A value is currently selected. The value is shown in the field and selected in the menu.
|
|
198
|
+
|
|
199
|
+
### **Menu opening**
|
|
200
|
+
|
|
201
|
+
The menu within the select component should be collapsed by default. The menu can be opened by clicking inside the field, or by shifting the focus to the field using tab navigation and pressing `Space`.
|
|
202
|
+
|
|
203
|
+
- **behavior\_menu\_01-ex**
|
|
204
|
+
- **behavior\_menu\_02-ex**
|
|
205
|
+
|
|
206
|
+
When the menu is open, it appears on top of any other UI elements. If the field has no value selected, the first option in the list is in focus and highlighted when the menu opens. If a value is selected, that value will be in focus and highlighted.
|
|
207
|
+
|
|
208
|
+
### **Selecting an option**
|
|
209
|
+
|
|
210
|
+
Once the menu is open, the user can select an option by clicking on it. Additionally, the user can use the arrow keys to move up and down in the menu, and select an option by pressing enter. Once an option is selected, the menu is closed.
|
|
211
|
+
|
|
212
|
+
- **behavior\_selecting\_01-ex**
|
|
213
|
+
- **behavior\_selecting\_02-ex**
|
|
214
|
+
|
|
215
|
+
Additionally, when the user clicks outside of the Select component or hits the `Esc` key, the menu closes.
|
|
216
|
+
|
|
217
|
+
_behavior\_selecting\_03-ex_
|
|
218
|
+
|
|
219
|
+
## Content
|
|
220
|
+
|
|
221
|
+
## **Label**
|
|
222
|
+
|
|
223
|
+
Every input field in a form should have a corresponding label that helps the user understand what the input means. Labels should clearly and concisely describe the value or response requested from the user.
|
|
224
|
+
|
|
225
|
+
Use these guidelines when writing labels:
|
|
226
|
+
|
|
227
|
+
- Use between 1 to 3 words when possible
|
|
228
|
+
- Labels should be written in sentence case (aside from proper nouns)
|
|
229
|
+
- Don’t include a colon (:) after the label
|
|
230
|
+
|
|
231
|
+
* **Do:** Do use clear and concise labels.
|
|
232
|
+
* **Don't:** Don’t be ambiguous.
|
|
233
|
+
|
|
234
|
+
## **Number of options**
|
|
235
|
+
|
|
236
|
+
Keep the number of options reasonable and easy to navigate. If you have 8 or fewer options, the Select component is a good choice. A Select is able to contain a large number of options, but scrolling through a long list can be overwhelming for users.
|
|
237
|
+
|
|
238
|
+
If you have more than 8 options, consider using an Autocomplete instead, since the user is able to use the keyboard to search the list for options. If using an Autocomplete is not appropriate, do not display more than 8 options at a time in the Select’s menu to help prevent cognitive overload.
|
|
239
|
+
|
|
240
|
+
- **Do:** Do display 8 or fewer options at once. If more than 8 are available, consider an autocomplete before providing a scroll bar.
|
|
241
|
+
- **Don't:** Don’t display more than 8 options at a time. Consider using the Autocomplete component or rethink the content.
|
|
242
|
+
|
|
243
|
+
## **Sorting options**
|
|
244
|
+
|
|
245
|
+
The sort order in which the options are displayed can be set to a desired configuration, depending on the content within the Select and your product’s needs. Consider your use case when determining how each Select should be sorted.
|
|
246
|
+
|
|
247
|
+
Below are some common sorting methods, with examples.
|
|
248
|
+
|
|
249
|
+
### **Numerically**
|
|
250
|
+
|
|
251
|
+
- **Ascending**: 1, 2, 3, …
|
|
252
|
+
- **Descending**: 100, 99, 98, …
|
|
253
|
+
|
|
254
|
+
### **Alphabetically**
|
|
255
|
+
|
|
256
|
+
- **Ascending**: Apples, Bananas, Carrots, Dates, Eggs, Flour, …
|
|
257
|
+
- **Descending**: Zucchini, Yogurt, Watermelon, Vinegar, Tomatoes, Spinach, …
|
|
258
|
+
|
|
259
|
+
### **Lexicographically**
|
|
260
|
+
|
|
261
|
+
Lexicographic sorting is like the dictionary. When sorting text, words are first sorted by their first letter, then by their second, and so on. When sorting numbers, it compares them digit by digit in the same way. In the below examples, 1001 and 10 come after before 201 and 2 (respectively) because 1 is less than 2.
|
|
262
|
+
|
|
263
|
+
- Stock keeping units: SKU-1001, SKU-1002, SKU-101, SKU-201, SKU-3005
|
|
264
|
+
- Item quantities or pack sizes: 1, 10, 2, 24, 3, 39, etc.
|
|
265
|
+
|
|
266
|
+
### **By relevance**
|
|
267
|
+
|
|
268
|
+
- Recently ordered items
|
|
269
|
+
- Recent transactions
|
|
270
|
+
- Favorited menu item
|
|
271
|
+
- Nearest store
|
|
272
|
+
|
|
273
|
+
### **By popularity**
|
|
274
|
+
|
|
275
|
+
- Trending restaurants or dishes
|
|
276
|
+
- Products based on sales data
|
|
277
|
+
- Popular dishes
|
|
278
|
+
- Frequently used recipient names and account numbers
|
|
279
|
+
|
|
280
|
+
**Helper text**
|
|
281
|
+
|
|
282
|
+
Helper text should be short and concise, and only provide information that is crucial to helping the user complete the form. Use these guidelines when writing helper text:
|
|
283
|
+
|
|
284
|
+
- Aim for 1 line of text
|
|
285
|
+
- Longer helper text should wrap to the next line, and not go too far past the longest option label
|
|
286
|
+
- Helper text should be written in sentence case (aside from proper nouns)
|
|
287
|
+
|
|
288
|
+
* **Do:** When writing helper text, aim for a single line of text. If the text must be longer, it should wrap down to a second line.
|
|
289
|
+
* **Don't:** Helper text should not be longer than the input area. Wrap longer text down to a second line.
|
|
290
|
+
|
|
291
|
+
### **Error helper text**
|
|
292
|
+
|
|
293
|
+
Helper text must always be included when the input is an an error state. The combination of the icon, red color, and text must help the user understand:
|
|
294
|
+
|
|
295
|
+
1. The field has an error
|
|
296
|
+
2. What the error is
|
|
297
|
+
3. How the user can correct their input and resolve the error
|
|
298
|
+
|
|
299
|
+
- **Do:** This example concisely tells the user that there is an error, what the error is, and what they can do to resolve it.
|
|
300
|
+
- **Caution:** Avoid vague explanations. This example tells the user that there is an error, but is not specific enough about why the value is invalid.
|
|
301
|
+
- **Don't:** Don’t write unnecessarily long helper text. This example meets all the criteria listed above, but it is too long.
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# Skeleton (https://design.candescent.com/docs/components/skeleton)
|
|
2
|
+
|
|
3
|
+
Resources: [Figma](https://www.figma.com/design/0lEVMVlLj8ZS4fgItr3pmd/%E2%AD%90-Forge-DS--Components?node-id=11476-16576), [Storybook](https://victorious-wave-0daadf00f.6.azurestaticapps.net/?path=/story/feedback-skeleton--default)
|
|
4
|
+
|
|
5
|
+
A loading placeholder with no intrinsic dimensions — size and shape come entirely from `className`. Pulses opacity via Reanimated.
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
import { Skeleton } from '@cdx-ui/components';
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Basic
|
|
12
|
+
|
|
13
|
+
```tsx
|
|
14
|
+
import { Skeleton } from '@cdx-ui/components';
|
|
15
|
+
|
|
16
|
+
export default function SkeletonBasicDemo() {
|
|
17
|
+
return <Skeleton className="h-5 w-50" />;
|
|
18
|
+
}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Text lines
|
|
22
|
+
|
|
23
|
+
Staggered widths suggest a block of body copy.
|
|
24
|
+
|
|
25
|
+
```tsx
|
|
26
|
+
import { Box, Skeleton } from '@cdx-ui/components';
|
|
27
|
+
|
|
28
|
+
export default function SkeletonTextLinesDemo() {
|
|
29
|
+
return (
|
|
30
|
+
<Box className="w-70 gap-2">
|
|
31
|
+
<Skeleton className="h-4 w-full" />
|
|
32
|
+
<Skeleton className="h-4 w-4/5" />
|
|
33
|
+
<Skeleton className="h-4 w-3/5" />
|
|
34
|
+
</Box>
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Avatar
|
|
40
|
+
|
|
41
|
+
Circular placeholder with name lines.
|
|
42
|
+
|
|
43
|
+
```tsx
|
|
44
|
+
import { HStack, Skeleton, VStack } from '@cdx-ui/components';
|
|
45
|
+
|
|
46
|
+
export default function SkeletonAvatarDemo() {
|
|
47
|
+
return (
|
|
48
|
+
<HStack space="md" className="items-center">
|
|
49
|
+
<Skeleton className="h-10 w-10 rounded-full" />
|
|
50
|
+
<VStack space="sm">
|
|
51
|
+
<Skeleton className="h-3.5 w-30" />
|
|
52
|
+
<Skeleton className="h-3 w-20" />
|
|
53
|
+
</VStack>
|
|
54
|
+
</HStack>
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Card
|
|
60
|
+
|
|
61
|
+
Skeleton placeholders composed inside `Card`.
|
|
62
|
+
|
|
63
|
+
```tsx
|
|
64
|
+
import { Card, HStack, Skeleton, VStack } from '@cdx-ui/components';
|
|
65
|
+
|
|
66
|
+
export default function SkeletonCardDemo() {
|
|
67
|
+
return (
|
|
68
|
+
<Card className="w-full max-w-md">
|
|
69
|
+
<Card.Header>
|
|
70
|
+
<HStack space="md" className="items-center">
|
|
71
|
+
<Skeleton className="h-12 w-12 rounded-full" />
|
|
72
|
+
<VStack space="sm" className="flex-1">
|
|
73
|
+
<Skeleton className="h-3.5 w-3/5" />
|
|
74
|
+
<Skeleton className="h-3 w-2/5" />
|
|
75
|
+
</VStack>
|
|
76
|
+
</HStack>
|
|
77
|
+
</Card.Header>
|
|
78
|
+
<Card.Content className="gap-3">
|
|
79
|
+
<Skeleton className="h-3.5 w-full" />
|
|
80
|
+
<Skeleton className="h-3.5 w-9/10" />
|
|
81
|
+
<Skeleton className="h-3.5 w-7/10" />
|
|
82
|
+
</Card.Content>
|
|
83
|
+
<Card.Footer>
|
|
84
|
+
{/* TODO(forge-ui): Skeleton has no button shape that follows the theme's button radius; using the default radius. */}
|
|
85
|
+
<Skeleton className="h-11 w-full" />
|
|
86
|
+
</Card.Footer>
|
|
87
|
+
</Card>
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## API
|
|
93
|
+
|
|
94
|
+
### Skeleton
|
|
95
|
+
|
|
96
|
+
`duration` is the half-cycle length in milliseconds (opacity `1` → `0.35`); a full pulse is approximately `duration × 2`. The ref targets `Animated.View` from `react-native-reanimated`.
|
|
97
|
+
|
|
98
|
+
| Prop | Type | Default | Description |
|
|
99
|
+
| --- | --- | --- | --- |
|
|
100
|
+
| `className?` | `string` | — | Size and shape classes for the placeholder, such as `h-4 w-32 rounded-md`. |
|
|
101
|
+
| `children?` | `React.ReactNode` | — | Optional content to render inside the placeholder. |
|
|
102
|
+
| `duration?` | `number` | `1000` | Half-cycle of the opacity pulse (`1` → `0.35`) in milliseconds. A full pulse takes `duration × 2`. |
|
|
103
|
+
|
|
104
|
+
Inherits all [`ViewProps`](https://reactnative.dev/docs/view#props).
|