@kaizen/components 2.0.0 → 2.0.2

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 (107) 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/Notification/InlineNotification/InlineNotification.cjs +1 -1
  5. package/dist/cjs/src/__alpha__/SingleSelect/SingleSelect.cjs +35 -74
  6. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/ComboBox/ComboBox.cjs +105 -0
  7. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/ComboBox/ComboBox.module.css.cjs +11 -0
  8. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/ComboBoxTrigger/ComboBoxTrigger.cjs +112 -0
  9. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/ComboBoxTrigger/ComboBoxTrigger.module.css.cjs +16 -0
  10. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/List/List.cjs +35 -10
  11. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/ListItem/ListItem.cjs +61 -8
  12. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/ListItem/ListItem.module.css.cjs +10 -1
  13. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/ListSection/ListSection.cjs +38 -9
  14. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/ListSection/ListSection.module.css.cjs +4 -1
  15. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/Popover/Popover.cjs +60 -30
  16. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/Popover/Popover.module.css.cjs +2 -1
  17. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/Popover/utils/usePopoverPositioning.cjs +2 -1
  18. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/Popover/utils/usePositioningStyles.cjs +4 -2
  19. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/Select/Select.cjs +87 -0
  20. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/Select/Select.module.css.cjs +11 -0
  21. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/SelectTrigger/SelectTrigger.cjs +52 -0
  22. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/SelectTrigger/SelectTrigger.module.css.cjs +13 -0
  23. package/dist/esm/alpha.mjs +1 -1
  24. package/dist/esm/src/Notification/InlineNotification/InlineNotification.mjs +1 -1
  25. package/dist/esm/src/__alpha__/SingleSelect/SingleSelect.mjs +39 -73
  26. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/ComboBox/ComboBox.mjs +96 -0
  27. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/ComboBox/ComboBox.module.css.mjs +9 -0
  28. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/ComboBoxTrigger/ComboBoxTrigger.mjs +103 -0
  29. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/ComboBoxTrigger/ComboBoxTrigger.module.css.mjs +14 -0
  30. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/List/List.mjs +37 -14
  31. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/ListItem/ListItem.mjs +63 -13
  32. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/ListItem/ListItem.module.css.mjs +10 -1
  33. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/ListSection/ListSection.mjs +41 -15
  34. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/ListSection/ListSection.module.css.mjs +4 -1
  35. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Popover/Popover.mjs +69 -43
  36. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Popover/Popover.module.css.mjs +2 -1
  37. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Popover/utils/usePopoverPositioning.mjs +2 -1
  38. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Popover/utils/usePositioningStyles.mjs +4 -2
  39. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Select/Select.mjs +78 -0
  40. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Select/Select.module.css.mjs +9 -0
  41. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/SelectTrigger/SelectTrigger.mjs +43 -0
  42. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/SelectTrigger/SelectTrigger.module.css.mjs +11 -0
  43. package/dist/styles.css +443 -79
  44. package/dist/types/__alpha__/SingleSelect/SingleSelect.d.ts +14 -19
  45. package/dist/types/__alpha__/SingleSelect/_docs/mockData.d.ts +3 -0
  46. package/dist/types/__alpha__/SingleSelect/context/SingleSelectContext.d.ts +15 -7
  47. package/dist/types/__alpha__/SingleSelect/subcomponents/ComboBox/ComboBox.d.ts +2 -0
  48. package/dist/types/__alpha__/SingleSelect/subcomponents/ComboBox/index.d.ts +1 -0
  49. package/dist/types/__alpha__/SingleSelect/subcomponents/ComboBoxTrigger/ComboBoxTrigger.d.ts +2 -0
  50. package/dist/types/__alpha__/SingleSelect/subcomponents/ComboBoxTrigger/index.d.ts +1 -0
  51. package/dist/types/__alpha__/SingleSelect/subcomponents/List/List.d.ts +2 -7
  52. package/dist/types/__alpha__/SingleSelect/subcomponents/ListItem/ListItem.d.ts +2 -7
  53. package/dist/types/__alpha__/SingleSelect/subcomponents/ListSection/ListSection.d.ts +2 -9
  54. package/dist/types/__alpha__/SingleSelect/subcomponents/Popover/Popover.d.ts +3 -6
  55. package/dist/types/__alpha__/SingleSelect/subcomponents/Popover/utils/index.d.ts +1 -0
  56. package/dist/types/__alpha__/SingleSelect/subcomponents/Popover/utils/usePopoverPositioning.d.ts +1 -0
  57. package/dist/types/__alpha__/SingleSelect/subcomponents/Popover/utils/usePositioningStyles.d.ts +1 -0
  58. package/dist/types/__alpha__/SingleSelect/subcomponents/Select/Select.d.ts +2 -0
  59. package/dist/types/__alpha__/SingleSelect/subcomponents/Select/index.d.ts +1 -0
  60. package/dist/types/__alpha__/SingleSelect/subcomponents/SelectTrigger/SelectTrigger.d.ts +2 -0
  61. package/dist/types/__alpha__/SingleSelect/subcomponents/SelectTrigger/index.d.ts +1 -0
  62. package/dist/types/__alpha__/SingleSelect/subcomponents/index.d.ts +4 -1
  63. package/dist/types/__alpha__/SingleSelect/types.d.ts +68 -11
  64. package/locales/en.json +9 -1
  65. package/package.json +9 -2
  66. package/src/Notification/InlineNotification/InlineNotification.tsx +1 -1
  67. package/src/__alpha__/SingleSelect/SingleSelect.tsx +35 -88
  68. package/src/__alpha__/SingleSelect/_docs/SingleSelect.mdx +96 -6
  69. package/src/__alpha__/SingleSelect/_docs/SingleSelect.spec.stories.tsx +22 -24
  70. package/src/__alpha__/SingleSelect/_docs/SingleSelect.stickersheet.stories.tsx +389 -33
  71. package/src/__alpha__/SingleSelect/_docs/SingleSelect.stories.tsx +41 -22
  72. package/src/__alpha__/SingleSelect/_docs/mockData.ts +20 -14
  73. package/src/__alpha__/SingleSelect/context/SingleSelectContext.tsx +18 -7
  74. package/src/__alpha__/SingleSelect/subcomponents/ComboBox/ComboBox.module.css +35 -0
  75. package/src/__alpha__/SingleSelect/subcomponents/ComboBox/ComboBox.tsx +106 -0
  76. package/src/__alpha__/SingleSelect/subcomponents/ComboBox/index.ts +1 -0
  77. package/src/__alpha__/SingleSelect/subcomponents/ComboBoxTrigger/ComboBoxTrigger.module.css +130 -0
  78. package/src/__alpha__/SingleSelect/subcomponents/ComboBoxTrigger/ComboBoxTrigger.tsx +121 -0
  79. package/src/__alpha__/SingleSelect/subcomponents/ComboBoxTrigger/index.ts +1 -0
  80. package/src/__alpha__/SingleSelect/subcomponents/List/List.module.css +5 -0
  81. package/src/__alpha__/SingleSelect/subcomponents/List/List.tsx +36 -13
  82. package/src/__alpha__/SingleSelect/subcomponents/ListItem/ListItem.module.css +84 -3
  83. package/src/__alpha__/SingleSelect/subcomponents/ListItem/ListItem.tsx +67 -11
  84. package/src/__alpha__/SingleSelect/subcomponents/ListSection/ListSection.module.css +20 -5
  85. package/src/__alpha__/SingleSelect/subcomponents/ListSection/ListSection.tsx +46 -19
  86. package/src/__alpha__/SingleSelect/subcomponents/Popover/Popover.module.css +7 -5
  87. package/src/__alpha__/SingleSelect/subcomponents/Popover/Popover.tsx +90 -37
  88. package/src/__alpha__/SingleSelect/subcomponents/Popover/utils/index.ts +1 -0
  89. package/src/__alpha__/SingleSelect/subcomponents/Popover/utils/usePopoverPositioning.ts +2 -2
  90. package/src/__alpha__/SingleSelect/subcomponents/Popover/utils/usePositioningStyles.ts +9 -8
  91. package/src/__alpha__/SingleSelect/subcomponents/Select/Select.module.css +35 -0
  92. package/src/__alpha__/SingleSelect/subcomponents/Select/Select.tsx +84 -0
  93. package/src/__alpha__/SingleSelect/subcomponents/Select/index.ts +1 -0
  94. package/src/__alpha__/SingleSelect/subcomponents/SelectTrigger/SelectTrigger.module.css +77 -0
  95. package/src/__alpha__/SingleSelect/subcomponents/SelectTrigger/SelectTrigger.tsx +52 -0
  96. package/src/__alpha__/SingleSelect/subcomponents/SelectTrigger/index.ts +1 -0
  97. package/src/__alpha__/SingleSelect/subcomponents/index.ts +4 -1
  98. package/src/__alpha__/SingleSelect/types.ts +94 -14
  99. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/Trigger/Trigger.cjs +0 -57
  100. package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/Trigger/Trigger.module.css.cjs +0 -6
  101. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Trigger/Trigger.mjs +0 -49
  102. package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Trigger/Trigger.module.css.mjs +0 -4
  103. package/dist/types/__alpha__/SingleSelect/subcomponents/Trigger/Trigger.d.ts +0 -2
  104. package/dist/types/__alpha__/SingleSelect/subcomponents/Trigger/index.d.ts +0 -1
  105. package/src/__alpha__/SingleSelect/subcomponents/Trigger/Trigger.module.css +0 -19
  106. package/src/__alpha__/SingleSelect/subcomponents/Trigger/Trigger.tsx +0 -35
  107. package/src/__alpha__/SingleSelect/subcomponents/Trigger/index.ts +0 -1
@@ -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)',
@@ -1,23 +1,12 @@
1
1
  import React from 'react'
2
2
  import { type Meta, type StoryObj } from '@storybook/react'
3
3
  import { SingleSelect } from '../index'
4
+ import { type SelectItem, type SingleSelectProps } from '../types'
4
5
  import { singleMockItems } from './mockData'
5
6
 
6
- const meta = {
7
+ const meta: Meta = {
7
8
  title: 'Components/SingleSelect/SingleSelect (alpha)',
8
9
  component: SingleSelect,
9
- args: {
10
- items: singleMockItems,
11
- children: (
12
- <SingleSelect.List>
13
- {singleMockItems.map((item) => (
14
- <SingleSelect.ListItem key={item.value} id={item.value}>
15
- {item.label}
16
- </SingleSelect.ListItem>
17
- ))}
18
- </SingleSelect.List>
19
- ),
20
- },
21
10
  decorators: [
22
11
  (Story) => (
23
12
  <div className="h-200 justify-center items-center position-relative flex">
@@ -25,18 +14,48 @@ const meta = {
25
14
  </div>
26
15
  ),
27
16
  ],
28
- } satisfies Meta<typeof SingleSelect>
17
+ argTypes: {
18
+ label: { control: 'text', description: 'The label for the select/combobox input' },
19
+ labelHidden: { control: 'boolean', description: 'Visually hide the label' },
20
+ labelPosition: {
21
+ control: { type: 'radio' },
22
+ options: ['top', 'side'],
23
+ description: 'Position of the label relative to the input',
24
+ },
25
+ variant: {
26
+ control: { type: 'radio' },
27
+ options: ['primary', 'secondary'],
28
+ description: 'Visual variant',
29
+ },
30
+ size: {
31
+ control: { type: 'radio' },
32
+ options: ['small', 'medium', 'large'],
33
+ description: 'Size of the input',
34
+ },
35
+ isReadOnly: { control: 'boolean', description: 'Whether the input is read-only' },
36
+ isDisabled: { control: 'boolean', description: 'Whether the input is disabled' },
37
+ isComboBox: {
38
+ control: 'boolean',
39
+ description: 'Whether to render as a combobox (filterable input) or select',
40
+ },
41
+ items: { control: 'object', description: 'List of options to display' },
42
+ },
43
+ }
29
44
 
30
45
  export default meta
31
46
 
32
- type Story = StoryObj<typeof meta>
33
-
34
- export const Playground: Story = {
47
+ export const Playground: StoryObj<SingleSelectProps<SelectItem>> = {
48
+ args: {
49
+ label: 'Choose an item',
50
+ isComboBox: false,
51
+ items: singleMockItems,
52
+ },
53
+ render: (args: SingleSelectProps<SelectItem>) => (
54
+ <SingleSelect {...args}>
55
+ {(item) => <SingleSelect.Item key={item.key}>{item.label}</SingleSelect.Item>}
56
+ </SingleSelect>
57
+ ),
35
58
  parameters: {
36
- docs: {
37
- canvas: {
38
- sourceState: 'shown',
39
- },
40
- },
59
+ docs: { canvas: { sourceState: 'shown' } },
41
60
  },
42
61
  }
@@ -1,29 +1,35 @@
1
1
  export const singleMockItems = [
2
- { label: 'Short black', value: 'short-black' },
3
- { label: 'Long black', value: 'long-black' },
4
- { label: 'Batch brew', value: 'batch-brew' },
5
- { label: 'Latte', value: 'latte' },
6
- { label: 'Flat white', value: 'flat-white' },
7
- { label: 'Mocha', value: 'mocha' },
8
- { label: 'Cappuccino', value: 'cappuccino' },
9
- { label: 'Magic', value: 'magic' },
2
+ {
3
+ key: 'short-black',
4
+ label: 'Short black',
5
+ value: 'short-black',
6
+ },
7
+ { key: 'long-black', label: 'Long black', value: 'long-black' },
8
+ { key: 'batch-brew', label: 'Batch brew', value: 'batch-brew' },
9
+ { key: 'latte', label: 'Latte', value: 'latte' },
10
+ { key: 'flat-white', label: 'Flat white', value: 'flat-white' },
11
+ { key: 'mocha', label: 'Mocha', value: 'mocha' },
12
+ { key: 'cappuccino', label: 'Cappuccino', value: 'cappuccino' },
13
+ { key: 'magic', label: 'Magic', value: 'magic' },
10
14
  ]
11
15
 
12
16
  export const groupedMockItems = [
13
17
  {
18
+ type: 'section',
14
19
  label: 'Colours',
15
20
  options: [
16
- { label: 'Blue', value: 'blue' },
17
- { label: 'Red', value: 'red' },
18
- { label: 'Green', value: 'green' },
21
+ { key: 'blue', label: 'Blue', value: 'blue' },
22
+ { key: 'red', label: 'Red', value: 'red' },
23
+ { key: 'green', label: 'Green', value: 'green' },
19
24
  ],
20
25
  },
21
26
  {
27
+ type: 'section',
22
28
  label: 'Flavours',
23
29
  options: [
24
- { label: 'Vanilla', value: 'vanilla' },
25
- { label: 'Chocolate', value: 'chocolate' },
26
- { label: 'Strawberry', value: 'strawberry' },
30
+ { key: 'vanilla', label: 'Vanilla', value: 'vanilla' },
31
+ { key: 'chocolate', label: 'Chocolate', value: 'chocolate' },
32
+ { key: 'strawberry', label: 'Strawberry', value: 'strawberry' },
27
33
  ],
28
34
  },
29
35
  ]
@@ -1,15 +1,26 @@
1
1
  import { createContext, useContext } from 'react'
2
- import { type Key } from '@react-types/shared'
3
- import { type SelectItem, type SelectSection } from '../types'
2
+ import { type ComboBoxState } from '@react-stately/combobox'
3
+ import { type SelectState } from '@react-stately/select'
4
4
 
5
- type SingleSelectContextType = {
6
- isOpen: boolean
7
- setOpen: (open: boolean) => void
8
- selectedKey: Key | null
9
- items: (SelectItem | SelectSection)[]
5
+ type BaseSingleSelectContextType = {
10
6
  anchorName: string
7
+ isDisabled: boolean
8
+ isReadOnly: boolean
9
+ secondary: boolean
10
+ size?: 'small' | 'medium' | 'large'
11
+ fieldLabel: React.ReactNode
11
12
  }
12
13
 
14
+ type SingleSelectContextType =
15
+ | (BaseSingleSelectContextType & {
16
+ state: ComboBoxState<object>
17
+ isComboBox: true
18
+ })
19
+ | (BaseSingleSelectContextType & {
20
+ state: SelectState<object>
21
+ isComboBox: false
22
+ })
23
+
13
24
  export const SingleSelectContext = createContext<SingleSelectContextType | undefined>(undefined)
14
25
 
15
26
  export const useSingleSelectContext = (): SingleSelectContextType => {
@@ -0,0 +1,35 @@
1
+ @layer kz-components {
2
+ .topLabel {
3
+ display: flex;
4
+ flex-direction: column;
5
+ align-items: flex-start;
6
+ }
7
+
8
+ .sideLabel {
9
+ display: grid;
10
+ grid-template-columns: auto 1fr;
11
+ grid-template-rows: auto auto;
12
+ gap: var(--spacing-4) var(--spacing-6);
13
+ align-items: center;
14
+ }
15
+
16
+ .label {
17
+ grid-column: 1;
18
+ grid-row: 1;
19
+ }
20
+
21
+ .labelTop {
22
+ margin-bottom: var(--spacing-6);
23
+ }
24
+
25
+ .comboBoxTrigger {
26
+ grid-column: 2;
27
+ grid-row: 1;
28
+ width: 100%;
29
+ }
30
+
31
+ .description {
32
+ grid-column: 2;
33
+ grid-row: 2;
34
+ }
35
+ }