@kaizen/components 0.0.0-canary-v2-20250901045936 → 0.0.0-canary-alpha-release-20250918043833
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/alpha/README.md +28 -0
- package/alpha/package.json +5 -0
- package/dist/cjs/alpha.cjs +1 -0
- package/dist/cjs/src/Modal/GenericModal/GenericModal.cjs +33 -65
- package/dist/cjs/src/Modal/GenericModal/GenericModal.module.scss.cjs +1 -3
- package/dist/cjs/src/Notification/InlineNotification/InlineNotification.cjs +1 -1
- package/dist/cjs/src/__alpha__/SingleSelect/SingleSelect.cjs +35 -74
- package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/ComboBox/ComboBox.cjs +105 -0
- package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/ComboBox/ComboBox.module.css.cjs +11 -0
- package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/ComboBoxTrigger/ComboBoxTrigger.cjs +112 -0
- package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/ComboBoxTrigger/ComboBoxTrigger.module.css.cjs +16 -0
- package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/List/List.cjs +35 -10
- package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/ListItem/ListItem.cjs +61 -8
- package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/ListItem/ListItem.module.css.cjs +10 -1
- package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/ListSection/ListSection.cjs +38 -9
- package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/ListSection/ListSection.module.css.cjs +4 -1
- package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/Popover/Popover.cjs +60 -30
- package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/Popover/Popover.module.css.cjs +2 -1
- package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/Popover/utils/usePopoverPositioning.cjs +2 -1
- package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/Popover/utils/usePositioningStyles.cjs +4 -2
- package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/Select/Select.cjs +87 -0
- package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/Select/Select.module.css.cjs +11 -0
- package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/SelectTrigger/SelectTrigger.cjs +52 -0
- package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/SelectTrigger/SelectTrigger.module.css.cjs +13 -0
- package/dist/esm/alpha.mjs +1 -1
- package/dist/esm/src/Modal/GenericModal/GenericModal.mjs +34 -65
- package/dist/esm/src/Modal/GenericModal/GenericModal.module.scss.mjs +1 -3
- package/dist/esm/src/Notification/InlineNotification/InlineNotification.mjs +1 -1
- package/dist/esm/src/__alpha__/SingleSelect/SingleSelect.mjs +39 -73
- package/dist/esm/src/__alpha__/SingleSelect/subcomponents/ComboBox/ComboBox.mjs +96 -0
- package/dist/esm/src/__alpha__/SingleSelect/subcomponents/ComboBox/ComboBox.module.css.mjs +9 -0
- package/dist/esm/src/__alpha__/SingleSelect/subcomponents/ComboBoxTrigger/ComboBoxTrigger.mjs +103 -0
- package/dist/esm/src/__alpha__/SingleSelect/subcomponents/ComboBoxTrigger/ComboBoxTrigger.module.css.mjs +14 -0
- package/dist/esm/src/__alpha__/SingleSelect/subcomponents/List/List.mjs +37 -14
- package/dist/esm/src/__alpha__/SingleSelect/subcomponents/ListItem/ListItem.mjs +63 -13
- package/dist/esm/src/__alpha__/SingleSelect/subcomponents/ListItem/ListItem.module.css.mjs +10 -1
- package/dist/esm/src/__alpha__/SingleSelect/subcomponents/ListSection/ListSection.mjs +41 -15
- package/dist/esm/src/__alpha__/SingleSelect/subcomponents/ListSection/ListSection.module.css.mjs +4 -1
- package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Popover/Popover.mjs +69 -43
- package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Popover/Popover.module.css.mjs +2 -1
- package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Popover/utils/usePopoverPositioning.mjs +2 -1
- package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Popover/utils/usePositioningStyles.mjs +4 -2
- package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Select/Select.mjs +78 -0
- package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Select/Select.module.css.mjs +9 -0
- package/dist/esm/src/__alpha__/SingleSelect/subcomponents/SelectTrigger/SelectTrigger.mjs +43 -0
- package/dist/esm/src/__alpha__/SingleSelect/subcomponents/SelectTrigger/SelectTrigger.module.css.mjs +11 -0
- package/dist/styles.css +385 -21
- package/dist/types/__alpha__/SingleSelect/SingleSelect.d.ts +14 -19
- package/dist/types/__alpha__/SingleSelect/_docs/mockData.d.ts +3 -0
- package/dist/types/__alpha__/SingleSelect/context/SingleSelectContext.d.ts +15 -7
- package/dist/types/__alpha__/SingleSelect/subcomponents/ComboBox/ComboBox.d.ts +2 -0
- package/dist/types/__alpha__/SingleSelect/subcomponents/ComboBox/index.d.ts +1 -0
- package/dist/types/__alpha__/SingleSelect/subcomponents/ComboBoxTrigger/ComboBoxTrigger.d.ts +2 -0
- package/dist/types/__alpha__/SingleSelect/subcomponents/ComboBoxTrigger/index.d.ts +1 -0
- package/dist/types/__alpha__/SingleSelect/subcomponents/List/List.d.ts +2 -7
- package/dist/types/__alpha__/SingleSelect/subcomponents/ListItem/ListItem.d.ts +2 -7
- package/dist/types/__alpha__/SingleSelect/subcomponents/ListSection/ListSection.d.ts +2 -9
- package/dist/types/__alpha__/SingleSelect/subcomponents/Popover/Popover.d.ts +3 -6
- package/dist/types/__alpha__/SingleSelect/subcomponents/Popover/utils/index.d.ts +1 -0
- package/dist/types/__alpha__/SingleSelect/subcomponents/Popover/utils/usePopoverPositioning.d.ts +1 -0
- package/dist/types/__alpha__/SingleSelect/subcomponents/Popover/utils/usePositioningStyles.d.ts +1 -0
- package/dist/types/__alpha__/SingleSelect/subcomponents/Select/Select.d.ts +2 -0
- package/dist/types/__alpha__/SingleSelect/subcomponents/Select/index.d.ts +1 -0
- package/dist/types/__alpha__/SingleSelect/subcomponents/SelectTrigger/SelectTrigger.d.ts +2 -0
- package/dist/types/__alpha__/SingleSelect/subcomponents/SelectTrigger/index.d.ts +1 -0
- package/dist/types/__alpha__/SingleSelect/subcomponents/index.d.ts +4 -1
- package/dist/types/__alpha__/SingleSelect/types.d.ts +68 -11
- package/locales/en.json +9 -1
- package/package.json +10 -3
- package/src/Modal/GenericModal/GenericModal.spec.tsx +1 -1
- package/src/Modal/GenericModal/GenericModal.tsx +38 -70
- package/src/Notification/InlineNotification/InlineNotification.tsx +1 -1
- package/src/RichTextEditor/RichTextEditor/RichTextEditor.spec.stories.tsx +10 -3
- package/src/__alpha__/SingleSelect/SingleSelect.tsx +35 -88
- package/src/__alpha__/SingleSelect/_docs/SingleSelect.mdx +96 -6
- package/src/__alpha__/SingleSelect/_docs/SingleSelect.spec.stories.tsx +22 -24
- package/src/__alpha__/SingleSelect/_docs/SingleSelect.stickersheet.stories.tsx +389 -33
- package/src/__alpha__/SingleSelect/_docs/SingleSelect.stories.tsx +41 -22
- package/src/__alpha__/SingleSelect/_docs/mockData.ts +20 -14
- package/src/__alpha__/SingleSelect/context/SingleSelectContext.tsx +18 -7
- package/src/__alpha__/SingleSelect/subcomponents/ComboBox/ComboBox.module.css +35 -0
- package/src/__alpha__/SingleSelect/subcomponents/ComboBox/ComboBox.tsx +106 -0
- package/src/__alpha__/SingleSelect/subcomponents/ComboBox/index.ts +1 -0
- package/src/__alpha__/SingleSelect/subcomponents/ComboBoxTrigger/ComboBoxTrigger.module.css +130 -0
- package/src/__alpha__/SingleSelect/subcomponents/ComboBoxTrigger/ComboBoxTrigger.tsx +121 -0
- package/src/__alpha__/SingleSelect/subcomponents/ComboBoxTrigger/index.ts +1 -0
- package/src/__alpha__/SingleSelect/subcomponents/List/List.module.css +5 -0
- package/src/__alpha__/SingleSelect/subcomponents/List/List.tsx +36 -13
- package/src/__alpha__/SingleSelect/subcomponents/ListItem/ListItem.module.css +84 -3
- package/src/__alpha__/SingleSelect/subcomponents/ListItem/ListItem.tsx +67 -11
- package/src/__alpha__/SingleSelect/subcomponents/ListSection/ListSection.module.css +20 -5
- package/src/__alpha__/SingleSelect/subcomponents/ListSection/ListSection.tsx +46 -19
- package/src/__alpha__/SingleSelect/subcomponents/Popover/Popover.module.css +7 -5
- package/src/__alpha__/SingleSelect/subcomponents/Popover/Popover.tsx +90 -37
- package/src/__alpha__/SingleSelect/subcomponents/Popover/utils/index.ts +1 -0
- package/src/__alpha__/SingleSelect/subcomponents/Popover/utils/usePopoverPositioning.ts +2 -2
- package/src/__alpha__/SingleSelect/subcomponents/Popover/utils/usePositioningStyles.ts +9 -8
- package/src/__alpha__/SingleSelect/subcomponents/Select/Select.module.css +35 -0
- package/src/__alpha__/SingleSelect/subcomponents/Select/Select.tsx +84 -0
- package/src/__alpha__/SingleSelect/subcomponents/Select/index.ts +1 -0
- package/src/__alpha__/SingleSelect/subcomponents/SelectTrigger/SelectTrigger.module.css +77 -0
- package/src/__alpha__/SingleSelect/subcomponents/SelectTrigger/SelectTrigger.tsx +52 -0
- package/src/__alpha__/SingleSelect/subcomponents/SelectTrigger/index.ts +1 -0
- package/src/__alpha__/SingleSelect/subcomponents/index.ts +4 -1
- package/src/__alpha__/SingleSelect/types.ts +94 -14
- package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/Trigger/Trigger.cjs +0 -57
- package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/Trigger/Trigger.module.css.cjs +0 -6
- package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Trigger/Trigger.mjs +0 -49
- package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Trigger/Trigger.module.css.mjs +0 -4
- package/dist/types/__alpha__/SingleSelect/subcomponents/Trigger/Trigger.d.ts +0 -2
- package/dist/types/__alpha__/SingleSelect/subcomponents/Trigger/index.d.ts +0 -1
- package/src/__alpha__/SingleSelect/subcomponents/Trigger/Trigger.module.css +0 -19
- package/src/__alpha__/SingleSelect/subcomponents/Trigger/Trigger.tsx +0 -35
- package/src/__alpha__/SingleSelect/subcomponents/Trigger/index.ts +0 -1
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { Canvas, Controls, DocsStory, Meta } from '@storybook/blocks'
|
|
2
2
|
import { ResourceLinks, KAIOInstallation, AlphaNotice } from '~storybook/components'
|
|
3
|
-
import
|
|
3
|
+
import { Playground } from './SingleSelect.stories'
|
|
4
|
+
import { SingleSelect } from '../index'
|
|
4
5
|
|
|
5
|
-
<Meta
|
|
6
|
+
<Meta title="Components/SingleSelect/SingleSelect (alpha)" component={SingleSelect} />
|
|
6
7
|
|
|
7
8
|
# SingleSelect
|
|
8
9
|
|
|
9
10
|
<ResourceLinks
|
|
10
11
|
sourceCode="https://github.com/cultureamp/kaizen-design-system/tree/main/packages/components/src/__alpha__/SingleSelect"
|
|
11
|
-
figma=""
|
|
12
|
+
figma="https://www.figma.com/design/umhYV8q0yC4qwbCOIfJDY5/-Alpha--Select?node-id=2122-15597&t=EgUdLXABrcuWMIay-0"
|
|
12
13
|
designGuidelines=""
|
|
13
14
|
/>
|
|
14
15
|
|
|
@@ -16,15 +17,104 @@ import * as SingleSelectStories from './SingleSelect.stories'
|
|
|
16
17
|
|
|
17
18
|
<KAIOInstallation exportNames="SingleSelect" isAlpha />
|
|
18
19
|
|
|
20
|
+
## Alpha notice
|
|
21
|
+
|
|
22
|
+
This component is currently in **alpha** and not yet fully feature-complete. The following capabilities are planned or in progress:
|
|
23
|
+
|
|
24
|
+
- Form validation and integration with form libraries
|
|
25
|
+
- Support for passing a custom defaultFilter function from React Aria
|
|
26
|
+
- Full support for asynchronous list loading and dynamic items
|
|
27
|
+
- Ability to use the component in a fully controlled manner (selectedKey, inputValue, etc.)
|
|
28
|
+
- Forwarding refs to the appropriate internal elements
|
|
29
|
+
- Enhanced composability beyond the provided Item and Section components
|
|
30
|
+
|
|
31
|
+
We welcome feedback as we continue to improve the component.
|
|
32
|
+
|
|
19
33
|
## Overview
|
|
20
34
|
|
|
21
|
-
SingleSelect component
|
|
35
|
+
The `SingleSelect` component allows users to select a single item from a dropdown list. It can be configured as a **Select** or **Combobox**. A Select provides a predefined list of options, while a Combobox adds a filterable input to help users find an option quickly.
|
|
22
36
|
|
|
23
|
-
<Canvas of={
|
|
24
|
-
<Controls of={
|
|
37
|
+
<Canvas of={Playground} />
|
|
38
|
+
<Controls of={Playground} />
|
|
25
39
|
|
|
26
40
|
## API
|
|
27
41
|
|
|
42
|
+
## Combobox vs. Select
|
|
43
|
+
|
|
44
|
+
The `SingleSelect` component supports two different behaviors:
|
|
45
|
+
|
|
46
|
+
- **Select**: A classic dropdown menu where the user can only select from a predefined list of options. It's ideal for short, fixed lists.
|
|
47
|
+
- **Combobox**: An input field combined with a dropdown. The user can either type to filter the options or click to open the full list. This is best for long lists or when quick searching is a priority.
|
|
48
|
+
|
|
49
|
+
To use the Combobox behavior, simply add the `isComboBox` prop.
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
// Select
|
|
53
|
+
<SingleSelect label="Select an item">
|
|
54
|
+
<SingleSelect.Item key="1">Item 1</SingleSelect.Item>
|
|
55
|
+
<SingleSelect.Item key="2">Item 2</SingleSelect.Item>
|
|
56
|
+
</SingleSelect>
|
|
57
|
+
|
|
58
|
+
// Combobox
|
|
59
|
+
<SingleSelect label="Select an item" isComboBox>
|
|
60
|
+
<SingleSelect.Item key="1">Item 1</SingleSelect.Item>
|
|
61
|
+
<SingleSelect.Item key="2">Item 2</SingleSelect.Item>
|
|
62
|
+
</SingleSelect>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Filtering
|
|
66
|
+
|
|
67
|
+
Children as static elements (leaves)
|
|
68
|
+
|
|
69
|
+
```tsx
|
|
70
|
+
<SingleSelect label="Choose a coffee" isComboBox items={coffeeItems}>
|
|
71
|
+
{(item) => <SingleSelect.Item key={item.key}>{item.label}</SingleSelect.Item>}
|
|
72
|
+
</SingleSelect>
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Children as a render function + `items` prop
|
|
76
|
+
|
|
77
|
+
```tsx
|
|
78
|
+
const [filterText, setFilterText] = useState('')
|
|
79
|
+
|
|
80
|
+
<SingleSelect
|
|
81
|
+
label="Choose a coffee"
|
|
82
|
+
isComboBox
|
|
83
|
+
items={coffeeItems.filter((item) => item.label.toLowerCase().includes(filterText.toLowerCase()))}
|
|
84
|
+
onInputChange={setFilterText}
|
|
85
|
+
>
|
|
86
|
+
{(item) => <SingleSelect.Item key={item.key} textValue={item.label}>{item.label}</SingleSelect.Item>}
|
|
87
|
+
</SingleSelect>
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Flexible Rendering of items
|
|
91
|
+
|
|
92
|
+
The SingleSelect.Item component is flexible and can accommodate a wide variety of content beyond simple text labels. You can render avatars, icons, or any custom React nodes within an item, while still preserving accessibility by providing the textValue prop.
|
|
93
|
+
|
|
94
|
+
```tsx
|
|
95
|
+
<SingleSelect label="Coffee" isComboBox description="Avatar and inline">
|
|
96
|
+
{singleMockItems.map((item) => (
|
|
97
|
+
<SingleSelect.Item key={item.key} textValue={item.label} className="flex items-center gap-3">
|
|
98
|
+
<Avatar fullName="Senior Popsicle" size="small" />
|
|
99
|
+
|
|
100
|
+
<Text variant="body" className="flex-shrink-0 whitespace-nowrap mr-2">
|
|
101
|
+
{item.label}
|
|
102
|
+
</Text>
|
|
103
|
+
|
|
104
|
+
<Text variant="body" className="truncate">
|
|
105
|
+
Supporting text
|
|
106
|
+
</Text>
|
|
107
|
+
</SingleSelect.Item>
|
|
108
|
+
))}
|
|
109
|
+
</SingleSelect>
|
|
110
|
+
```
|
|
111
|
+
|
|
28
112
|
## Positioning and z-index Management
|
|
29
113
|
|
|
30
114
|
The SingleSelect component leverages the native Popover API to manage its dropdown functionality. By using popover instead of custom portal logic, the component takes full advantage of CSS layers, ensuring dropdowns appear above other content without manual z-index management.
|
|
115
|
+
|
|
116
|
+
## Known issues
|
|
117
|
+
|
|
118
|
+
### Accessibility
|
|
119
|
+
|
|
120
|
+
Using the default SingleSelect component without combobox, there is a known accessibility issue for keyboard navigation when the component is used as the last focusable element on the page. After the list is opened pressing Tab should close the list, instead Tab brings the user to a unqiue state where they cannot use the escape key to close the list. Instead the user will have to navigate either forward of back again using the Tab key.
|
|
@@ -17,16 +17,9 @@ export default meta
|
|
|
17
17
|
type Story = StoryObj<typeof meta>
|
|
18
18
|
|
|
19
19
|
const args = {
|
|
20
|
+
label: 'Choose a coffee',
|
|
20
21
|
items: singleMockItems,
|
|
21
|
-
children: (
|
|
22
|
-
<SingleSelect.List>
|
|
23
|
-
{singleMockItems.map((item) => (
|
|
24
|
-
<SingleSelect.ListItem key={item.value} id={item.value}>
|
|
25
|
-
{item.label}
|
|
26
|
-
</SingleSelect.ListItem>
|
|
27
|
-
))}
|
|
28
|
-
</SingleSelect.List>
|
|
29
|
-
),
|
|
22
|
+
children: (item: any) => <SingleSelect.Item key={item.key}>{item.label}</SingleSelect.Item>,
|
|
30
23
|
}
|
|
31
24
|
|
|
32
25
|
export const RendersButton: Story = {
|
|
@@ -60,21 +53,6 @@ export const ClosesPopoverOnSelect: Story = {
|
|
|
60
53
|
},
|
|
61
54
|
}
|
|
62
55
|
|
|
63
|
-
export const KeyboardNavigation: Story = {
|
|
64
|
-
args,
|
|
65
|
-
play: async () => {
|
|
66
|
-
const trigger = screen.getByRole('button')
|
|
67
|
-
trigger.focus()
|
|
68
|
-
await userEvent.keyboard('{Enter}')
|
|
69
|
-
await waitFor(() => expect(trigger).toHaveAttribute('aria-expanded', 'true'))
|
|
70
|
-
const options = await screen.findAllByRole('option')
|
|
71
|
-
await userEvent.keyboard('{ArrowDown}')
|
|
72
|
-
expect(options[1]).toHaveAttribute('data-focused', 'true')
|
|
73
|
-
await userEvent.keyboard('{ArrowUp}')
|
|
74
|
-
expect(options[0]).toHaveAttribute('data-focused', 'true')
|
|
75
|
-
},
|
|
76
|
-
}
|
|
77
|
-
|
|
78
56
|
export const KeyboardSelectsItem: Story = {
|
|
79
57
|
args,
|
|
80
58
|
play: async () => {
|
|
@@ -98,3 +76,23 @@ export const KeyboardEscapeClosesPopover: Story = {
|
|
|
98
76
|
await waitFor(() => expect(trigger).toHaveAttribute('aria-expanded', 'false'))
|
|
99
77
|
},
|
|
100
78
|
}
|
|
79
|
+
|
|
80
|
+
export const XButtonClearsSelection: Story = {
|
|
81
|
+
args: { ...args, isComboBox: true },
|
|
82
|
+
play: async () => {
|
|
83
|
+
const input = screen.getByRole('combobox')
|
|
84
|
+
|
|
85
|
+
await userEvent.type(input, 'short')
|
|
86
|
+
const options = await screen.findAllByRole('option')
|
|
87
|
+
await userEvent.click(options[0])
|
|
88
|
+
|
|
89
|
+
const clearButton = await screen.findByRole('button', {
|
|
90
|
+
name: 'Clear Choose a coffee selection',
|
|
91
|
+
})
|
|
92
|
+
await waitFor(() => expect(clearButton).toBeVisible())
|
|
93
|
+
await userEvent.click(clearButton)
|
|
94
|
+
await waitFor(() => {
|
|
95
|
+
expect(input).toHaveValue('')
|
|
96
|
+
})
|
|
97
|
+
},
|
|
98
|
+
}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import React from 'react'
|
|
2
2
|
import { type Meta } from '@storybook/react'
|
|
3
|
+
import { Avatar } from '~components/Avatar'
|
|
4
|
+
import { Icon } from '~components/Icon'
|
|
5
|
+
import { Text } from '~components/Text'
|
|
3
6
|
import { StickerSheet, type StickerSheetStory } from '~storybook/components/StickerSheet'
|
|
4
7
|
import { SingleSelect } from '../index'
|
|
5
8
|
import { groupedMockItems, singleMockItems } from './mockData'
|
|
@@ -14,31 +17,395 @@ export default {
|
|
|
14
17
|
|
|
15
18
|
const StickerSheetTemplate: StickerSheetStory = {
|
|
16
19
|
render: ({ isReversed }) => {
|
|
20
|
+
const [filterText, setFilterText] = React.useState('')
|
|
17
21
|
return (
|
|
18
|
-
<StickerSheet isReversed={isReversed} title="SingleSelect" headers={['
|
|
22
|
+
<StickerSheet isReversed={isReversed} title="SingleSelect" headers={['Combobox', 'Select']}>
|
|
19
23
|
<StickerSheet.Row>
|
|
20
|
-
<SingleSelect
|
|
21
|
-
|
|
22
|
-
{
|
|
23
|
-
|
|
24
|
+
<SingleSelect label="Coffee" isComboBox description="Default">
|
|
25
|
+
{singleMockItems.map((item) => (
|
|
26
|
+
<SingleSelect.Item key={item.key}>{item.label}</SingleSelect.Item>
|
|
27
|
+
))}
|
|
28
|
+
</SingleSelect>
|
|
29
|
+
|
|
30
|
+
<SingleSelect label="Coffee" description="Default">
|
|
31
|
+
{singleMockItems.map((item) => (
|
|
32
|
+
<SingleSelect.Item key={item.key}>{item.label}</SingleSelect.Item>
|
|
33
|
+
))}
|
|
34
|
+
</SingleSelect>
|
|
35
|
+
|
|
36
|
+
<SingleSelect
|
|
37
|
+
label="Coffee"
|
|
38
|
+
isComboBox
|
|
39
|
+
description="Manual filter"
|
|
40
|
+
items={singleMockItems.filter((item) =>
|
|
41
|
+
item.label.toLowerCase().includes(filterText.toLowerCase()),
|
|
42
|
+
)}
|
|
43
|
+
onInputChange={setFilterText}
|
|
44
|
+
>
|
|
45
|
+
{(item) => (
|
|
46
|
+
<SingleSelect.Item key={item.key} textValue={item.label}>
|
|
47
|
+
{item.label}
|
|
48
|
+
</SingleSelect.Item>
|
|
49
|
+
)}
|
|
50
|
+
</SingleSelect>
|
|
51
|
+
|
|
52
|
+
<SingleSelect label="Coffee" description="Render function" items={singleMockItems}>
|
|
53
|
+
{(item) => (
|
|
54
|
+
<SingleSelect.Item key={item.key} textValue={item.label}>
|
|
55
|
+
{item.label}
|
|
56
|
+
</SingleSelect.Item>
|
|
57
|
+
)}
|
|
58
|
+
</SingleSelect>
|
|
59
|
+
</StickerSheet.Row>
|
|
60
|
+
|
|
61
|
+
<StickerSheet.Row>
|
|
62
|
+
<SingleSelect label="Pick a colour" isComboBox description="Grouped">
|
|
63
|
+
{groupedMockItems.map((section) => (
|
|
64
|
+
<SingleSelect.Section key={section.label} title={section.label}>
|
|
65
|
+
{section.options.map((item) => (
|
|
66
|
+
<SingleSelect.Item key={item.key}>{item.label}</SingleSelect.Item>
|
|
67
|
+
))}
|
|
68
|
+
</SingleSelect.Section>
|
|
69
|
+
))}
|
|
70
|
+
</SingleSelect>
|
|
71
|
+
|
|
72
|
+
<SingleSelect label="Pick a colour" description="Grouped">
|
|
73
|
+
{groupedMockItems.map((section) => (
|
|
74
|
+
<SingleSelect.Section key={section.label} title={section.label}>
|
|
75
|
+
{section.options.map((item) => (
|
|
76
|
+
<SingleSelect.Item key={item.key}>{item.label}</SingleSelect.Item>
|
|
77
|
+
))}
|
|
78
|
+
</SingleSelect.Section>
|
|
79
|
+
))}
|
|
80
|
+
</SingleSelect>
|
|
81
|
+
</StickerSheet.Row>
|
|
82
|
+
|
|
83
|
+
<StickerSheet.Row>
|
|
84
|
+
<SingleSelect label="Pick a colour" isComboBox description="Label hidden" labelHidden>
|
|
85
|
+
{groupedMockItems.map((section) => (
|
|
86
|
+
<SingleSelect.Section key={section.label} title={section.label}>
|
|
87
|
+
{section.options.map((item) => (
|
|
88
|
+
<SingleSelect.Item key={item.key}>{item.label}</SingleSelect.Item>
|
|
89
|
+
))}
|
|
90
|
+
</SingleSelect.Section>
|
|
91
|
+
))}
|
|
92
|
+
</SingleSelect>
|
|
93
|
+
|
|
94
|
+
<SingleSelect label="Pick a colour" description="Label hidden" labelHidden>
|
|
95
|
+
{groupedMockItems.map((section) => (
|
|
96
|
+
<SingleSelect.Section key={section.label} title={section.label}>
|
|
97
|
+
{section.options.map((item) => (
|
|
98
|
+
<SingleSelect.Item key={item.key}>{item.label}</SingleSelect.Item>
|
|
99
|
+
))}
|
|
100
|
+
</SingleSelect.Section>
|
|
101
|
+
))}
|
|
102
|
+
</SingleSelect>
|
|
103
|
+
</StickerSheet.Row>
|
|
104
|
+
|
|
105
|
+
<StickerSheet.Row>
|
|
106
|
+
<SingleSelect label="Coffee" isComboBox description="inline" labelPosition="side">
|
|
107
|
+
{singleMockItems.map((item) => (
|
|
108
|
+
<SingleSelect.Item key={item.key}>{item.label}</SingleSelect.Item>
|
|
109
|
+
))}
|
|
110
|
+
</SingleSelect>
|
|
111
|
+
|
|
112
|
+
<SingleSelect label="Coffee" description="inline" labelPosition="side">
|
|
113
|
+
{singleMockItems.map((item) => (
|
|
114
|
+
<SingleSelect.Item key={item.key}>{item.label}</SingleSelect.Item>
|
|
115
|
+
))}
|
|
116
|
+
</SingleSelect>
|
|
117
|
+
</StickerSheet.Row>
|
|
118
|
+
|
|
119
|
+
<StickerSheet.Row>
|
|
120
|
+
<SingleSelect
|
|
121
|
+
label="Coffee"
|
|
122
|
+
isComboBox
|
|
123
|
+
isDisabled
|
|
124
|
+
description="disabled"
|
|
125
|
+
defaultSelectedKey={'magic'}
|
|
126
|
+
>
|
|
127
|
+
{singleMockItems.map((item) => (
|
|
128
|
+
<SingleSelect.Item key={item.key}>{item.label}</SingleSelect.Item>
|
|
129
|
+
))}
|
|
130
|
+
</SingleSelect>
|
|
131
|
+
|
|
132
|
+
<SingleSelect
|
|
133
|
+
label="Coffee"
|
|
134
|
+
isDisabled
|
|
135
|
+
description="disabled"
|
|
136
|
+
defaultSelectedKey={'magic'}
|
|
137
|
+
>
|
|
138
|
+
{singleMockItems.map((item) => (
|
|
139
|
+
<SingleSelect.Item key={item.key}>{item.label}</SingleSelect.Item>
|
|
140
|
+
))}
|
|
141
|
+
</SingleSelect>
|
|
142
|
+
</StickerSheet.Row>
|
|
143
|
+
|
|
144
|
+
<StickerSheet.Row>
|
|
145
|
+
<SingleSelect
|
|
146
|
+
label="Coffee"
|
|
147
|
+
isComboBox
|
|
148
|
+
isReadOnly
|
|
149
|
+
description="read only"
|
|
150
|
+
defaultSelectedKey={'magic'}
|
|
151
|
+
>
|
|
152
|
+
{singleMockItems.map((item) => (
|
|
153
|
+
<SingleSelect.Item key={item.key}>{item.label}</SingleSelect.Item>
|
|
154
|
+
))}
|
|
155
|
+
</SingleSelect>
|
|
156
|
+
|
|
157
|
+
<SingleSelect
|
|
158
|
+
label="Coffee"
|
|
159
|
+
isReadOnly
|
|
160
|
+
description="read only"
|
|
161
|
+
defaultSelectedKey={'magic'}
|
|
162
|
+
>
|
|
163
|
+
{singleMockItems.map((item) => (
|
|
164
|
+
<SingleSelect.Item key={item.key}>{item.label}</SingleSelect.Item>
|
|
165
|
+
))}
|
|
166
|
+
</SingleSelect>
|
|
167
|
+
</StickerSheet.Row>
|
|
168
|
+
|
|
169
|
+
<StickerSheet.Row>
|
|
170
|
+
<SingleSelect label="Coffee" isComboBox variant="secondary" description="secondary">
|
|
171
|
+
{singleMockItems.map((item) => (
|
|
172
|
+
<SingleSelect.Item key={item.key}>{item.label}</SingleSelect.Item>
|
|
173
|
+
))}
|
|
174
|
+
</SingleSelect>
|
|
175
|
+
|
|
176
|
+
<SingleSelect label="Coffee" variant="secondary" description="secondary">
|
|
177
|
+
{singleMockItems.map((item) => (
|
|
178
|
+
<SingleSelect.Item key={item.key}>{item.label}</SingleSelect.Item>
|
|
179
|
+
))}
|
|
180
|
+
</SingleSelect>
|
|
181
|
+
</StickerSheet.Row>
|
|
182
|
+
|
|
183
|
+
<StickerSheet.Row>
|
|
184
|
+
<SingleSelect label="Coffee" isComboBox size="small" description="small">
|
|
185
|
+
{singleMockItems.map((item) => (
|
|
186
|
+
<SingleSelect.Item key={item.key}>{item.label}</SingleSelect.Item>
|
|
187
|
+
))}
|
|
188
|
+
</SingleSelect>
|
|
189
|
+
|
|
190
|
+
<SingleSelect label="Coffee" size="small" description="small">
|
|
191
|
+
{singleMockItems.map((item) => (
|
|
192
|
+
<SingleSelect.Item key={item.key}>{item.label}</SingleSelect.Item>
|
|
193
|
+
))}
|
|
194
|
+
</SingleSelect>
|
|
195
|
+
</StickerSheet.Row>
|
|
196
|
+
|
|
197
|
+
<StickerSheet.Row>
|
|
198
|
+
<SingleSelect label="Coffee" isComboBox size="medium" description="medium">
|
|
199
|
+
{singleMockItems.map((item) => (
|
|
200
|
+
<SingleSelect.Item key={item.key}>{item.label}</SingleSelect.Item>
|
|
201
|
+
))}
|
|
202
|
+
</SingleSelect>
|
|
203
|
+
|
|
204
|
+
<SingleSelect label="Coffee" size="medium" description="medium">
|
|
205
|
+
{singleMockItems.map((item) => (
|
|
206
|
+
<SingleSelect.Item key={item.key}>{item.label}</SingleSelect.Item>
|
|
207
|
+
))}
|
|
208
|
+
</SingleSelect>
|
|
209
|
+
</StickerSheet.Row>
|
|
210
|
+
|
|
211
|
+
<StickerSheet.Row>
|
|
212
|
+
<SingleSelect label="Coffee" isComboBox size="large" description="large">
|
|
213
|
+
{singleMockItems.map((item) => (
|
|
214
|
+
<SingleSelect.Item key={item.key}>{item.label}</SingleSelect.Item>
|
|
215
|
+
))}
|
|
216
|
+
</SingleSelect>
|
|
217
|
+
|
|
218
|
+
<SingleSelect label="Coffee" size="large" description="large">
|
|
219
|
+
{singleMockItems.map((item) => (
|
|
220
|
+
<SingleSelect.Item key={item.key}>{item.label}</SingleSelect.Item>
|
|
221
|
+
))}
|
|
222
|
+
</SingleSelect>
|
|
223
|
+
</StickerSheet.Row>
|
|
224
|
+
|
|
225
|
+
<StickerSheet.Row>
|
|
226
|
+
<SingleSelect
|
|
227
|
+
label="Coffee"
|
|
228
|
+
isComboBox
|
|
229
|
+
description="Disabled items"
|
|
230
|
+
disabledKeys={['magic', 'flat-white']}
|
|
231
|
+
>
|
|
232
|
+
{singleMockItems.map((item) => (
|
|
233
|
+
<SingleSelect.Item key={item.key}>{item.label}</SingleSelect.Item>
|
|
234
|
+
))}
|
|
235
|
+
</SingleSelect>
|
|
236
|
+
|
|
237
|
+
<SingleSelect
|
|
238
|
+
label="Coffee"
|
|
239
|
+
description="Disabled items"
|
|
240
|
+
disabledKeys={['magic', 'flat-white']}
|
|
241
|
+
>
|
|
242
|
+
{singleMockItems.map((item) => (
|
|
243
|
+
<SingleSelect.Item key={item.key}>{item.label}</SingleSelect.Item>
|
|
244
|
+
))}
|
|
245
|
+
</SingleSelect>
|
|
246
|
+
</StickerSheet.Row>
|
|
247
|
+
|
|
248
|
+
<StickerSheet.Row>
|
|
249
|
+
<SingleSelect label="Coffee" isComboBox description="Checked items">
|
|
250
|
+
{singleMockItems.map((item) => (
|
|
251
|
+
<SingleSelect.Item selectedIcon="check" key={item.key}>
|
|
252
|
+
{item.label}
|
|
253
|
+
</SingleSelect.Item>
|
|
254
|
+
))}
|
|
255
|
+
</SingleSelect>
|
|
256
|
+
|
|
257
|
+
<SingleSelect label="Coffee" description="Radio items">
|
|
258
|
+
{singleMockItems.map((item) => (
|
|
259
|
+
<SingleSelect.Item selectedIcon="radio" key={item.key}>
|
|
260
|
+
{item.label}
|
|
261
|
+
</SingleSelect.Item>
|
|
262
|
+
))}
|
|
263
|
+
</SingleSelect>
|
|
264
|
+
</StickerSheet.Row>
|
|
265
|
+
|
|
266
|
+
<StickerSheet.Row>
|
|
267
|
+
<SingleSelect label="Coffee" isComboBox description="Radio items start">
|
|
268
|
+
{singleMockItems.map((item) => (
|
|
269
|
+
<SingleSelect.Item selectedIcon="radio" selectedPosition="start" key={item.key}>
|
|
270
|
+
{item.label}
|
|
271
|
+
</SingleSelect.Item>
|
|
272
|
+
))}
|
|
273
|
+
</SingleSelect>
|
|
274
|
+
|
|
275
|
+
<SingleSelect label="Coffee" description="Check items start">
|
|
276
|
+
{singleMockItems.map((item) => (
|
|
277
|
+
<SingleSelect.Item selectedIcon="check" selectedPosition="start" key={item.key}>
|
|
278
|
+
{item.label}
|
|
279
|
+
</SingleSelect.Item>
|
|
280
|
+
))}
|
|
281
|
+
</SingleSelect>
|
|
282
|
+
</StickerSheet.Row>
|
|
283
|
+
|
|
284
|
+
<StickerSheet.Row>
|
|
285
|
+
<SingleSelect label="Coffee" isComboBox description="Icon at start inline text">
|
|
286
|
+
{singleMockItems.map((item) => (
|
|
287
|
+
<SingleSelect.Item
|
|
288
|
+
key={item.key}
|
|
289
|
+
textValue={item.label}
|
|
290
|
+
className="flex flex-row items-center"
|
|
291
|
+
>
|
|
292
|
+
<Icon name="favorite" isPresentational />
|
|
293
|
+
<span style={{ paddingRight: 12 }} />
|
|
294
|
+
<Text
|
|
295
|
+
variant="body"
|
|
296
|
+
style={{
|
|
297
|
+
whiteSpace: 'nowrap',
|
|
298
|
+
minWidth: 0,
|
|
299
|
+
overflow: 'hidden',
|
|
300
|
+
textOverflow: 'ellipsis',
|
|
301
|
+
marginRight: 8,
|
|
302
|
+
flexShrink: 0,
|
|
303
|
+
}}
|
|
304
|
+
>
|
|
24
305
|
{item.label}
|
|
25
|
-
</
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
306
|
+
</Text>
|
|
307
|
+
<Text
|
|
308
|
+
variant="body"
|
|
309
|
+
style={{
|
|
310
|
+
whiteSpace: 'nowrap',
|
|
311
|
+
overflow: 'hidden',
|
|
312
|
+
textOverflow: 'ellipsis',
|
|
313
|
+
minWidth: 0,
|
|
314
|
+
flexShrink: 20,
|
|
315
|
+
}}
|
|
316
|
+
>
|
|
317
|
+
Supporting text
|
|
318
|
+
</Text>
|
|
319
|
+
</SingleSelect.Item>
|
|
320
|
+
))}
|
|
321
|
+
</SingleSelect>
|
|
322
|
+
|
|
323
|
+
<SingleSelect label="Coffee" description="Radio and multiline">
|
|
324
|
+
{singleMockItems.map((item) => (
|
|
325
|
+
<SingleSelect.Item
|
|
326
|
+
selectedIcon="radio"
|
|
327
|
+
key={item.key}
|
|
328
|
+
textValue={item.label}
|
|
329
|
+
className="flex flex-col"
|
|
330
|
+
>
|
|
331
|
+
<Text
|
|
332
|
+
variant="body"
|
|
333
|
+
style={{
|
|
334
|
+
whiteSpace: 'nowrap',
|
|
335
|
+
flexShrink: 0,
|
|
336
|
+
}}
|
|
337
|
+
>
|
|
338
|
+
{item.label}
|
|
339
|
+
</Text>
|
|
340
|
+
<Text
|
|
341
|
+
variant="body"
|
|
342
|
+
style={{
|
|
343
|
+
whiteSpace: 'nowrap',
|
|
344
|
+
overflow: 'hidden',
|
|
345
|
+
textOverflow: 'ellipsis',
|
|
346
|
+
display: 'block',
|
|
347
|
+
}}
|
|
348
|
+
>
|
|
349
|
+
Supporting text
|
|
350
|
+
</Text>
|
|
351
|
+
</SingleSelect.Item>
|
|
352
|
+
))}
|
|
353
|
+
</SingleSelect>
|
|
354
|
+
</StickerSheet.Row>
|
|
355
|
+
|
|
356
|
+
<StickerSheet.Row>
|
|
357
|
+
<SingleSelect label="Coffee" isComboBox description="Avatar and inline">
|
|
358
|
+
{singleMockItems.map((item) => (
|
|
359
|
+
<SingleSelect.Item
|
|
360
|
+
key={item.key}
|
|
361
|
+
textValue={item.label}
|
|
362
|
+
className="flex flex-row items-center"
|
|
363
|
+
>
|
|
364
|
+
<div style={{ flexShrink: 0 }}>
|
|
365
|
+
<Avatar fullName="Senior Popsicle" size="small" />
|
|
366
|
+
</div>
|
|
367
|
+
<span style={{ paddingRight: 12 }} />
|
|
368
|
+
<Text
|
|
369
|
+
variant="body"
|
|
370
|
+
style={{
|
|
371
|
+
whiteSpace: 'nowrap',
|
|
372
|
+
flexShrink: 0,
|
|
373
|
+
marginRight: 8,
|
|
374
|
+
}}
|
|
375
|
+
>
|
|
376
|
+
{item.label}
|
|
377
|
+
</Text>
|
|
378
|
+
|
|
379
|
+
<Text
|
|
380
|
+
variant="body"
|
|
381
|
+
style={{
|
|
382
|
+
whiteSpace: 'nowrap',
|
|
383
|
+
overflow: 'hidden',
|
|
384
|
+
textOverflow: 'ellipsis',
|
|
385
|
+
display: 'block',
|
|
386
|
+
}}
|
|
387
|
+
>
|
|
388
|
+
Supporting text
|
|
389
|
+
</Text>
|
|
390
|
+
</SingleSelect.Item>
|
|
391
|
+
))}
|
|
392
|
+
</SingleSelect>
|
|
393
|
+
|
|
394
|
+
<SingleSelect label="Coffee" description="Avatar and multiline text">
|
|
395
|
+
{singleMockItems.map((item) => (
|
|
396
|
+
<SingleSelect.Item
|
|
397
|
+
key={item.key}
|
|
398
|
+
textValue={item.label}
|
|
399
|
+
className="flex flex-row items-center gap-12"
|
|
400
|
+
>
|
|
401
|
+
<Avatar fullName="Senior Popsicle" size="medium" />
|
|
402
|
+
|
|
403
|
+
<div style={{ display: 'flex', flexDirection: 'column' }}>
|
|
404
|
+
{item.label}
|
|
405
|
+
<Text variant="body">Supporting text</Text>
|
|
406
|
+
</div>
|
|
407
|
+
</SingleSelect.Item>
|
|
408
|
+
))}
|
|
42
409
|
</SingleSelect>
|
|
43
410
|
</StickerSheet.Row>
|
|
44
411
|
</StickerSheet>
|
|
@@ -61,17 +428,6 @@ export const StickerSheetDefault: StickerSheetStory = {
|
|
|
61
428
|
name: 'Sticker Sheet (Default)',
|
|
62
429
|
}
|
|
63
430
|
|
|
64
|
-
export const StickerSheetReversed: StickerSheetStory = {
|
|
65
|
-
...StickerSheetTemplate,
|
|
66
|
-
name: 'Sticker Sheet (Reversed)',
|
|
67
|
-
parameters: {
|
|
68
|
-
/** @note: Only required if template has parameters, otherwise this spread can be removed */
|
|
69
|
-
...StickerSheetTemplate.parameters,
|
|
70
|
-
backgrounds: { default: 'Purple 700' },
|
|
71
|
-
},
|
|
72
|
-
args: { isReversed: true },
|
|
73
|
-
}
|
|
74
|
-
|
|
75
431
|
export const StickerSheetRTL: StickerSheetStory = {
|
|
76
432
|
...StickerSheetTemplate,
|
|
77
433
|
name: 'Sticker Sheet (RTL)',
|