@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.
Files changed (114) hide show
  1. package/alpha/README.md +28 -0
  2. package/alpha/package.json +5 -0
  3. package/dist/cjs/alpha.cjs +1 -0
  4. package/dist/cjs/src/Modal/GenericModal/GenericModal.cjs +33 -65
  5. package/dist/cjs/src/Modal/GenericModal/GenericModal.module.scss.cjs +1 -3
  6. package/dist/cjs/src/Notification/InlineNotification/InlineNotification.cjs +1 -1
  7. package/dist/cjs/src/__alpha__/SingleSelect/SingleSelect.cjs +35 -74
  8. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/ComboBox/ComboBox.cjs +105 -0
  9. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/ComboBox/ComboBox.module.css.cjs +11 -0
  10. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/ComboBoxTrigger/ComboBoxTrigger.cjs +112 -0
  11. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/ComboBoxTrigger/ComboBoxTrigger.module.css.cjs +16 -0
  12. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/List/List.cjs +35 -10
  13. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/ListItem/ListItem.cjs +61 -8
  14. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/ListItem/ListItem.module.css.cjs +10 -1
  15. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/ListSection/ListSection.cjs +38 -9
  16. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/ListSection/ListSection.module.css.cjs +4 -1
  17. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/Popover/Popover.cjs +60 -30
  18. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/Popover/Popover.module.css.cjs +2 -1
  19. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/Popover/utils/usePopoverPositioning.cjs +2 -1
  20. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/Popover/utils/usePositioningStyles.cjs +4 -2
  21. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/Select/Select.cjs +87 -0
  22. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/Select/Select.module.css.cjs +11 -0
  23. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/SelectTrigger/SelectTrigger.cjs +52 -0
  24. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/SelectTrigger/SelectTrigger.module.css.cjs +13 -0
  25. package/dist/esm/alpha.mjs +1 -1
  26. package/dist/esm/src/Modal/GenericModal/GenericModal.mjs +34 -65
  27. package/dist/esm/src/Modal/GenericModal/GenericModal.module.scss.mjs +1 -3
  28. package/dist/esm/src/Notification/InlineNotification/InlineNotification.mjs +1 -1
  29. package/dist/esm/src/__alpha__/SingleSelect/SingleSelect.mjs +39 -73
  30. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/ComboBox/ComboBox.mjs +96 -0
  31. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/ComboBox/ComboBox.module.css.mjs +9 -0
  32. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/ComboBoxTrigger/ComboBoxTrigger.mjs +103 -0
  33. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/ComboBoxTrigger/ComboBoxTrigger.module.css.mjs +14 -0
  34. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/List/List.mjs +37 -14
  35. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/ListItem/ListItem.mjs +63 -13
  36. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/ListItem/ListItem.module.css.mjs +10 -1
  37. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/ListSection/ListSection.mjs +41 -15
  38. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/ListSection/ListSection.module.css.mjs +4 -1
  39. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Popover/Popover.mjs +69 -43
  40. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Popover/Popover.module.css.mjs +2 -1
  41. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Popover/utils/usePopoverPositioning.mjs +2 -1
  42. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Popover/utils/usePositioningStyles.mjs +4 -2
  43. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Select/Select.mjs +78 -0
  44. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Select/Select.module.css.mjs +9 -0
  45. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/SelectTrigger/SelectTrigger.mjs +43 -0
  46. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/SelectTrigger/SelectTrigger.module.css.mjs +11 -0
  47. package/dist/styles.css +385 -21
  48. package/dist/types/__alpha__/SingleSelect/SingleSelect.d.ts +14 -19
  49. package/dist/types/__alpha__/SingleSelect/_docs/mockData.d.ts +3 -0
  50. package/dist/types/__alpha__/SingleSelect/context/SingleSelectContext.d.ts +15 -7
  51. package/dist/types/__alpha__/SingleSelect/subcomponents/ComboBox/ComboBox.d.ts +2 -0
  52. package/dist/types/__alpha__/SingleSelect/subcomponents/ComboBox/index.d.ts +1 -0
  53. package/dist/types/__alpha__/SingleSelect/subcomponents/ComboBoxTrigger/ComboBoxTrigger.d.ts +2 -0
  54. package/dist/types/__alpha__/SingleSelect/subcomponents/ComboBoxTrigger/index.d.ts +1 -0
  55. package/dist/types/__alpha__/SingleSelect/subcomponents/List/List.d.ts +2 -7
  56. package/dist/types/__alpha__/SingleSelect/subcomponents/ListItem/ListItem.d.ts +2 -7
  57. package/dist/types/__alpha__/SingleSelect/subcomponents/ListSection/ListSection.d.ts +2 -9
  58. package/dist/types/__alpha__/SingleSelect/subcomponents/Popover/Popover.d.ts +3 -6
  59. package/dist/types/__alpha__/SingleSelect/subcomponents/Popover/utils/index.d.ts +1 -0
  60. package/dist/types/__alpha__/SingleSelect/subcomponents/Popover/utils/usePopoverPositioning.d.ts +1 -0
  61. package/dist/types/__alpha__/SingleSelect/subcomponents/Popover/utils/usePositioningStyles.d.ts +1 -0
  62. package/dist/types/__alpha__/SingleSelect/subcomponents/Select/Select.d.ts +2 -0
  63. package/dist/types/__alpha__/SingleSelect/subcomponents/Select/index.d.ts +1 -0
  64. package/dist/types/__alpha__/SingleSelect/subcomponents/SelectTrigger/SelectTrigger.d.ts +2 -0
  65. package/dist/types/__alpha__/SingleSelect/subcomponents/SelectTrigger/index.d.ts +1 -0
  66. package/dist/types/__alpha__/SingleSelect/subcomponents/index.d.ts +4 -1
  67. package/dist/types/__alpha__/SingleSelect/types.d.ts +68 -11
  68. package/locales/en.json +9 -1
  69. package/package.json +10 -3
  70. package/src/Modal/GenericModal/GenericModal.spec.tsx +1 -1
  71. package/src/Modal/GenericModal/GenericModal.tsx +38 -70
  72. package/src/Notification/InlineNotification/InlineNotification.tsx +1 -1
  73. package/src/RichTextEditor/RichTextEditor/RichTextEditor.spec.stories.tsx +10 -3
  74. package/src/__alpha__/SingleSelect/SingleSelect.tsx +35 -88
  75. package/src/__alpha__/SingleSelect/_docs/SingleSelect.mdx +96 -6
  76. package/src/__alpha__/SingleSelect/_docs/SingleSelect.spec.stories.tsx +22 -24
  77. package/src/__alpha__/SingleSelect/_docs/SingleSelect.stickersheet.stories.tsx +389 -33
  78. package/src/__alpha__/SingleSelect/_docs/SingleSelect.stories.tsx +41 -22
  79. package/src/__alpha__/SingleSelect/_docs/mockData.ts +20 -14
  80. package/src/__alpha__/SingleSelect/context/SingleSelectContext.tsx +18 -7
  81. package/src/__alpha__/SingleSelect/subcomponents/ComboBox/ComboBox.module.css +35 -0
  82. package/src/__alpha__/SingleSelect/subcomponents/ComboBox/ComboBox.tsx +106 -0
  83. package/src/__alpha__/SingleSelect/subcomponents/ComboBox/index.ts +1 -0
  84. package/src/__alpha__/SingleSelect/subcomponents/ComboBoxTrigger/ComboBoxTrigger.module.css +130 -0
  85. package/src/__alpha__/SingleSelect/subcomponents/ComboBoxTrigger/ComboBoxTrigger.tsx +121 -0
  86. package/src/__alpha__/SingleSelect/subcomponents/ComboBoxTrigger/index.ts +1 -0
  87. package/src/__alpha__/SingleSelect/subcomponents/List/List.module.css +5 -0
  88. package/src/__alpha__/SingleSelect/subcomponents/List/List.tsx +36 -13
  89. package/src/__alpha__/SingleSelect/subcomponents/ListItem/ListItem.module.css +84 -3
  90. package/src/__alpha__/SingleSelect/subcomponents/ListItem/ListItem.tsx +67 -11
  91. package/src/__alpha__/SingleSelect/subcomponents/ListSection/ListSection.module.css +20 -5
  92. package/src/__alpha__/SingleSelect/subcomponents/ListSection/ListSection.tsx +46 -19
  93. package/src/__alpha__/SingleSelect/subcomponents/Popover/Popover.module.css +7 -5
  94. package/src/__alpha__/SingleSelect/subcomponents/Popover/Popover.tsx +90 -37
  95. package/src/__alpha__/SingleSelect/subcomponents/Popover/utils/index.ts +1 -0
  96. package/src/__alpha__/SingleSelect/subcomponents/Popover/utils/usePopoverPositioning.ts +2 -2
  97. package/src/__alpha__/SingleSelect/subcomponents/Popover/utils/usePositioningStyles.ts +9 -8
  98. package/src/__alpha__/SingleSelect/subcomponents/Select/Select.module.css +35 -0
  99. package/src/__alpha__/SingleSelect/subcomponents/Select/Select.tsx +84 -0
  100. package/src/__alpha__/SingleSelect/subcomponents/Select/index.ts +1 -0
  101. package/src/__alpha__/SingleSelect/subcomponents/SelectTrigger/SelectTrigger.module.css +77 -0
  102. package/src/__alpha__/SingleSelect/subcomponents/SelectTrigger/SelectTrigger.tsx +52 -0
  103. package/src/__alpha__/SingleSelect/subcomponents/SelectTrigger/index.ts +1 -0
  104. package/src/__alpha__/SingleSelect/subcomponents/index.ts +4 -1
  105. package/src/__alpha__/SingleSelect/types.ts +94 -14
  106. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/Trigger/Trigger.cjs +0 -57
  107. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/Trigger/Trigger.module.css.cjs +0 -6
  108. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Trigger/Trigger.mjs +0 -49
  109. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Trigger/Trigger.module.css.mjs +0 -4
  110. package/dist/types/__alpha__/SingleSelect/subcomponents/Trigger/Trigger.d.ts +0 -2
  111. package/dist/types/__alpha__/SingleSelect/subcomponents/Trigger/index.d.ts +0 -1
  112. package/src/__alpha__/SingleSelect/subcomponents/Trigger/Trigger.module.css +0 -19
  113. package/src/__alpha__/SingleSelect/subcomponents/Trigger/Trigger.tsx +0 -35
  114. 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 * as SingleSelectStories from './SingleSelect.stories'
3
+ import { Playground } from './SingleSelect.stories'
4
+ import { SingleSelect } from '../index'
4
5
 
5
- <Meta of={SingleSelectStories} />
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 that handles selecting items from a dropdown, can be either filterable or not.
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={SingleSelectStories.Playground} />
24
- <Controls of={SingleSelectStories.Playground} />
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={['Items', 'Grouped']}>
22
+ <StickerSheet isReversed={isReversed} title="SingleSelect" headers={['Combobox', 'Select']}>
19
23
  <StickerSheet.Row>
20
- <SingleSelect items={singleMockItems}>
21
- <SingleSelect.List>
22
- {singleMockItems.map((item) => (
23
- <SingleSelect.ListItem key={item.value} id={item.value}>
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
- </SingleSelect.ListItem>
26
- ))}
27
- </SingleSelect.List>
28
- </SingleSelect>
29
-
30
- <SingleSelect items={groupedMockItems}>
31
- <SingleSelect.List>
32
- {groupedMockItems.map((section) => (
33
- <SingleSelect.ListSection name={section.label} key={section.label}>
34
- {section.options.map((item) => (
35
- <SingleSelect.ListItem key={item.value} id={item.value}>
36
- {item.label}
37
- </SingleSelect.ListItem>
38
- ))}
39
- </SingleSelect.ListSection>
40
- ))}
41
- </SingleSelect.List>
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)',