@salutejs/plasma-new-hope 0.141.0-canary.1421.10719019658.0 → 0.141.0-canary.1422.10737462879.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (137) hide show
  1. package/cjs/components/Combobox/ComboboxNew/Combobox.js +6 -4
  2. package/cjs/components/Combobox/ComboboxNew/Combobox.js.map +1 -1
  3. package/cjs/components/Combobox/ComboboxOld/Combobox.js +15 -8
  4. package/cjs/components/Combobox/ComboboxOld/Combobox.js.map +1 -1
  5. package/cjs/components/TextArea/TextArea.js +1 -2
  6. package/cjs/components/TextArea/TextArea.js.map +1 -1
  7. package/cjs/components/TextField/TextField.js +12 -7
  8. package/cjs/components/TextField/TextField.js.map +1 -1
  9. package/emotion/cjs/components/Combobox/Combobox.template-doc.mdx +344 -0
  10. package/emotion/cjs/components/Combobox/ComboboxNew/Combobox.js +6 -4
  11. package/emotion/cjs/components/Combobox/ComboboxOld/Combobox.js +15 -8
  12. package/emotion/cjs/components/TextArea/TextArea.js +2 -3
  13. package/emotion/cjs/components/TextField/TextField.js +13 -8
  14. package/emotion/cjs/examples/plasma_b2c/components/Combobox/Combobox.config.js +39 -0
  15. package/{styled-components/cjs/examples/plasma_b2c/components/Combobox/ComboboxNew → emotion/cjs/examples/plasma_b2c/components/Combobox}/Combobox.js +2 -2
  16. package/emotion/{es/examples/plasma_b2c/components/Combobox/ComboboxNew → cjs/examples/plasma_b2c/components/Combobox}/Combobox.stories.tsx +5 -3
  17. package/emotion/cjs/examples/plasma_b2c/components/Combobox/Legacy/Combobox.config.js +25 -0
  18. package/emotion/cjs/examples/plasma_b2c/components/Combobox/{ComboboxOld → Legacy}/Combobox.stories.tsx +18 -16
  19. package/emotion/cjs/examples/plasma_web/components/Combobox/Combobox.config.js +39 -0
  20. package/emotion/cjs/examples/{plasma_b2c/components/Combobox/ComboboxNew → plasma_web/components/Combobox}/Combobox.js +2 -2
  21. package/emotion/cjs/examples/plasma_web/components/Combobox/{ComboboxNew/Combobox.stories.tsx → Combobox.stories.tsx} +5 -3
  22. package/emotion/cjs/examples/plasma_web/components/Combobox/Legacy/Combobox.config.js +25 -0
  23. package/emotion/{es/examples/plasma_b2c/components/Combobox/ComboboxOld → cjs/examples/plasma_web/components/Combobox/Legacy}/Combobox.stories.tsx +18 -16
  24. package/emotion/es/components/Combobox/Combobox.template-doc.mdx +344 -0
  25. package/emotion/es/components/Combobox/ComboboxNew/Combobox.js +6 -4
  26. package/emotion/es/components/Combobox/ComboboxOld/Combobox.js +15 -8
  27. package/emotion/es/components/TextArea/TextArea.js +2 -3
  28. package/emotion/es/components/TextField/TextField.js +13 -8
  29. package/emotion/es/examples/plasma_b2c/components/Combobox/Combobox.config.js +33 -0
  30. package/emotion/es/examples/plasma_b2c/components/Combobox/{ComboboxNew/Combobox.js → Combobox.js} +2 -2
  31. package/emotion/{cjs/examples/plasma_b2c/components/Combobox/ComboboxNew → es/examples/plasma_b2c/components/Combobox}/Combobox.stories.tsx +5 -3
  32. package/emotion/es/examples/plasma_b2c/components/Combobox/Legacy/Combobox.config.js +19 -0
  33. package/emotion/es/examples/{plasma_web/components/Combobox/ComboboxOld → plasma_b2c/components/Combobox/Legacy}/Combobox.stories.tsx +18 -16
  34. package/emotion/es/examples/plasma_web/components/Combobox/Combobox.config.js +33 -0
  35. package/emotion/es/examples/plasma_web/components/Combobox/{ComboboxNew/Combobox.js → Combobox.js} +2 -2
  36. package/emotion/es/examples/plasma_web/components/Combobox/{ComboboxNew/Combobox.stories.tsx → Combobox.stories.tsx} +5 -3
  37. package/emotion/es/examples/plasma_web/components/Combobox/Legacy/Combobox.config.js +19 -0
  38. package/emotion/{cjs/examples/plasma_web/components/Combobox/ComboboxOld → es/examples/plasma_web/components/Combobox/Legacy}/Combobox.stories.tsx +18 -16
  39. package/es/components/Combobox/ComboboxNew/Combobox.js +6 -4
  40. package/es/components/Combobox/ComboboxNew/Combobox.js.map +1 -1
  41. package/es/components/Combobox/ComboboxOld/Combobox.js +15 -8
  42. package/es/components/Combobox/ComboboxOld/Combobox.js.map +1 -1
  43. package/es/components/TextArea/TextArea.js +1 -2
  44. package/es/components/TextArea/TextArea.js.map +1 -1
  45. package/es/components/TextField/TextField.js +12 -7
  46. package/es/components/TextField/TextField.js.map +1 -1
  47. package/package.json +4 -5
  48. package/styled-components/cjs/components/Combobox/Combobox.template-doc.mdx +344 -0
  49. package/styled-components/cjs/components/Combobox/ComboboxNew/Combobox.js +6 -4
  50. package/styled-components/cjs/components/Combobox/ComboboxOld/Combobox.js +15 -8
  51. package/styled-components/cjs/components/TextArea/TextArea.js +1 -2
  52. package/styled-components/cjs/components/TextField/TextField.js +12 -7
  53. package/styled-components/cjs/examples/plasma_b2c/components/Combobox/Combobox.config.js +39 -0
  54. package/{emotion/cjs/examples/plasma_web/components/Combobox/ComboboxNew → styled-components/cjs/examples/plasma_b2c/components/Combobox}/Combobox.js +2 -2
  55. package/styled-components/cjs/examples/plasma_b2c/components/Combobox/Combobox.stories.tsx +368 -0
  56. package/styled-components/cjs/examples/plasma_b2c/components/Combobox/{ComboboxOld → Legacy}/Combobox.config.js +1 -1
  57. package/styled-components/cjs/examples/plasma_b2c/components/Combobox/Legacy/Combobox.stories.tsx +256 -0
  58. package/styled-components/cjs/examples/{plasma_b2c/components/Combobox/ComboboxNew → plasma_web/components/Combobox}/Combobox.config.js +1 -1
  59. package/styled-components/cjs/examples/plasma_web/components/Combobox/{ComboboxNew/Combobox.js → Combobox.js} +2 -2
  60. package/styled-components/cjs/examples/plasma_web/components/Combobox/Combobox.stories.tsx +368 -0
  61. package/styled-components/cjs/examples/plasma_web/components/Combobox/{ComboboxOld → Legacy}/Combobox.config.js +1 -1
  62. package/styled-components/cjs/examples/plasma_web/components/Combobox/Legacy/Combobox.stories.tsx +256 -0
  63. package/styled-components/es/components/Combobox/Combobox.template-doc.mdx +344 -0
  64. package/styled-components/es/components/Combobox/ComboboxNew/Combobox.js +6 -4
  65. package/styled-components/es/components/Combobox/ComboboxOld/Combobox.js +15 -8
  66. package/styled-components/es/components/TextArea/TextArea.js +1 -2
  67. package/styled-components/es/components/TextField/TextField.js +12 -7
  68. package/styled-components/es/examples/plasma_b2c/components/Combobox/Combobox.config.js +33 -0
  69. package/styled-components/es/examples/plasma_b2c/components/Combobox/{ComboboxNew/Combobox.js → Combobox.js} +2 -2
  70. package/styled-components/es/examples/plasma_b2c/components/Combobox/Combobox.stories.tsx +368 -0
  71. package/styled-components/es/examples/plasma_b2c/components/Combobox/{ComboboxOld → Legacy}/Combobox.config.js +1 -1
  72. package/styled-components/es/examples/plasma_b2c/components/Combobox/Legacy/Combobox.stories.tsx +256 -0
  73. package/styled-components/es/examples/plasma_web/components/Combobox/{ComboboxNew/Combobox.config.js → Combobox.config.js} +1 -1
  74. package/styled-components/es/examples/plasma_web/components/Combobox/{ComboboxNew/Combobox.js → Combobox.js} +2 -2
  75. package/styled-components/es/examples/plasma_web/components/Combobox/Combobox.stories.tsx +368 -0
  76. package/styled-components/es/examples/plasma_web/components/Combobox/{ComboboxOld → Legacy}/Combobox.config.js +1 -1
  77. package/styled-components/es/examples/plasma_web/components/Combobox/Legacy/Combobox.stories.tsx +256 -0
  78. package/types/components/Combobox/ComboboxNew/Combobox.d.ts.map +1 -1
  79. package/types/components/Combobox/ComboboxNew/Combobox.types.d.ts +7 -1
  80. package/types/components/Combobox/ComboboxNew/Combobox.types.d.ts.map +1 -1
  81. package/types/components/Combobox/ComboboxOld/Combobox.d.ts.map +1 -1
  82. package/types/components/Combobox/ComboboxOld/Combobox.types.d.ts +6 -0
  83. package/types/components/Combobox/ComboboxOld/Combobox.types.d.ts.map +1 -1
  84. package/types/components/TextArea/TextArea.d.ts.map +1 -1
  85. package/types/components/TextField/TextField.d.ts.map +1 -1
  86. package/types/examples/plasma_b2c/components/Combobox/Combobox.config.d.ts.map +1 -0
  87. package/types/examples/plasma_b2c/components/Combobox/{ComboboxNew/Combobox.d.ts → Combobox.d.ts} +3 -3
  88. package/types/examples/plasma_b2c/components/Combobox/Combobox.d.ts.map +1 -0
  89. package/types/examples/plasma_b2c/components/Combobox/{ComboboxOld → Legacy}/Combobox.config.d.ts.map +1 -1
  90. package/types/examples/plasma_b2c/components/Combobox/Legacy/Combobox.d.ts.map +1 -0
  91. package/types/examples/plasma_web/components/Combobox/Combobox.config.d.ts.map +1 -0
  92. package/types/examples/plasma_web/components/Combobox/{ComboboxNew/Combobox.d.ts → Combobox.d.ts} +3 -3
  93. package/types/examples/plasma_web/components/Combobox/Combobox.d.ts.map +1 -0
  94. package/types/examples/plasma_web/components/Combobox/{ComboboxOld → Legacy}/Combobox.config.d.ts.map +1 -1
  95. package/types/examples/plasma_web/components/Combobox/Legacy/Combobox.d.ts.map +1 -0
  96. package/emotion/cjs/examples/plasma_b2c/components/Combobox/ComboboxNew/Combobox.config.js +0 -39
  97. package/emotion/cjs/examples/plasma_b2c/components/Combobox/ComboboxOld/Combobox.config.js +0 -25
  98. package/emotion/cjs/examples/plasma_b2c/components/Form/Form.stories.tsx +0 -106
  99. package/emotion/cjs/examples/plasma_web/components/Combobox/ComboboxNew/Combobox.config.js +0 -39
  100. package/emotion/cjs/examples/plasma_web/components/Combobox/ComboboxOld/Combobox.config.js +0 -25
  101. package/emotion/es/examples/plasma_b2c/components/Combobox/ComboboxNew/Combobox.config.js +0 -33
  102. package/emotion/es/examples/plasma_b2c/components/Combobox/ComboboxOld/Combobox.config.js +0 -19
  103. package/emotion/es/examples/plasma_b2c/components/Form/Form.stories.tsx +0 -106
  104. package/emotion/es/examples/plasma_web/components/Combobox/ComboboxNew/Combobox.config.js +0 -33
  105. package/emotion/es/examples/plasma_web/components/Combobox/ComboboxOld/Combobox.config.js +0 -19
  106. package/styled-components/cjs/examples/plasma_b2c/components/Combobox/ComboboxNew/Combobox.stories.tsx +0 -366
  107. package/styled-components/cjs/examples/plasma_b2c/components/Combobox/ComboboxOld/Combobox.stories.tsx +0 -254
  108. package/styled-components/cjs/examples/plasma_b2c/components/Form/Form.stories.tsx +0 -106
  109. package/styled-components/cjs/examples/plasma_web/components/Combobox/ComboboxNew/Combobox.config.js +0 -39
  110. package/styled-components/cjs/examples/plasma_web/components/Combobox/ComboboxNew/Combobox.stories.tsx +0 -366
  111. package/styled-components/cjs/examples/plasma_web/components/Combobox/ComboboxOld/Combobox.stories.tsx +0 -254
  112. package/styled-components/es/examples/plasma_b2c/components/Combobox/ComboboxNew/Combobox.config.js +0 -33
  113. package/styled-components/es/examples/plasma_b2c/components/Combobox/ComboboxNew/Combobox.stories.tsx +0 -366
  114. package/styled-components/es/examples/plasma_b2c/components/Combobox/ComboboxOld/Combobox.stories.tsx +0 -254
  115. package/styled-components/es/examples/plasma_b2c/components/Form/Form.stories.tsx +0 -106
  116. package/styled-components/es/examples/plasma_web/components/Combobox/ComboboxNew/Combobox.stories.tsx +0 -366
  117. package/styled-components/es/examples/plasma_web/components/Combobox/ComboboxOld/Combobox.stories.tsx +0 -254
  118. package/types/examples/plasma_b2c/components/Combobox/ComboboxNew/Combobox.config.d.ts.map +0 -1
  119. package/types/examples/plasma_b2c/components/Combobox/ComboboxNew/Combobox.d.ts.map +0 -1
  120. package/types/examples/plasma_b2c/components/Combobox/ComboboxOld/Combobox.d.ts.map +0 -1
  121. package/types/examples/plasma_web/components/Combobox/ComboboxNew/Combobox.config.d.ts.map +0 -1
  122. package/types/examples/plasma_web/components/Combobox/ComboboxNew/Combobox.d.ts.map +0 -1
  123. package/types/examples/plasma_web/components/Combobox/ComboboxOld/Combobox.d.ts.map +0 -1
  124. /package/emotion/cjs/examples/plasma_b2c/components/Combobox/{ComboboxOld → Legacy}/Combobox.js +0 -0
  125. /package/emotion/cjs/examples/plasma_web/components/Combobox/{ComboboxOld → Legacy}/Combobox.js +0 -0
  126. /package/emotion/es/examples/plasma_b2c/components/Combobox/{ComboboxOld → Legacy}/Combobox.js +0 -0
  127. /package/emotion/es/examples/plasma_web/components/Combobox/{ComboboxOld → Legacy}/Combobox.js +0 -0
  128. /package/styled-components/cjs/examples/plasma_b2c/components/Combobox/{ComboboxOld → Legacy}/Combobox.js +0 -0
  129. /package/styled-components/cjs/examples/plasma_web/components/Combobox/{ComboboxOld → Legacy}/Combobox.js +0 -0
  130. /package/styled-components/es/examples/plasma_b2c/components/Combobox/{ComboboxOld → Legacy}/Combobox.js +0 -0
  131. /package/styled-components/es/examples/plasma_web/components/Combobox/{ComboboxOld → Legacy}/Combobox.js +0 -0
  132. /package/types/examples/plasma_b2c/components/Combobox/{ComboboxNew/Combobox.config.d.ts → Combobox.config.d.ts} +0 -0
  133. /package/types/examples/plasma_b2c/components/Combobox/{ComboboxOld → Legacy}/Combobox.config.d.ts +0 -0
  134. /package/types/examples/plasma_b2c/components/Combobox/{ComboboxOld → Legacy}/Combobox.d.ts +0 -0
  135. /package/types/examples/plasma_web/components/Combobox/{ComboboxNew/Combobox.config.d.ts → Combobox.config.d.ts} +0 -0
  136. /package/types/examples/plasma_web/components/Combobox/{ComboboxOld → Legacy}/Combobox.config.d.ts +0 -0
  137. /package/types/examples/plasma_web/components/Combobox/{ComboboxOld → Legacy}/Combobox.d.ts +0 -0
@@ -0,0 +1,256 @@
1
+ import React, { useState } from 'react';
2
+ import type { ComponentProps } from 'react';
3
+ import type { Meta, StoryObj } from '@storybook/react';
4
+ import { action } from '@storybook/addon-actions';
5
+
6
+ import { mergeConfig } from '../../../../../engines';
7
+ import { Checkbox } from '../../Checkbox/Checkbox';
8
+ import { comboboxOldConfig } from '../../../../../components/Combobox';
9
+ import { WithTheme, argTypesFromConfig } from '../../../../_helpers';
10
+ import { IconDone } from '../../../../../components/_Icon';
11
+
12
+ import { Combobox, ComboboxDivider, ComboboxItem } from './Combobox';
13
+ import { config } from './Combobox.config';
14
+
15
+ const placements: Array<string> = ['top', 'bottom', 'right', 'left', 'auto'];
16
+ const enumerations: Array<string> = ['comma', 'chip'];
17
+
18
+ type ComboboxPrimitiveValue = string | number | boolean;
19
+
20
+ type StorySelectPropsCustom = {
21
+ skidding?: number;
22
+ distance?: number;
23
+ };
24
+
25
+ type StorySelectProps = ComponentProps<typeof Combobox> & StorySelectPropsCustom;
26
+
27
+ const meta: Meta<StorySelectProps> = {
28
+ title: 'plasma_web/Combobox',
29
+ decorators: [WithTheme],
30
+ component: Combobox,
31
+ argTypes: {
32
+ placement: {
33
+ options: placements,
34
+ control: {
35
+ type: 'select',
36
+ },
37
+ },
38
+ enumerationType: {
39
+ options: enumerations,
40
+ control: {
41
+ type: 'select',
42
+ },
43
+ },
44
+ ...argTypesFromConfig(mergeConfig(comboboxOldConfig, config)),
45
+ },
46
+ args: {
47
+ usePortal: false,
48
+ disabled: false,
49
+ readOnly: false,
50
+ label: 'Label',
51
+ placeholder: 'Placeholder',
52
+ enumerationType: 'comma',
53
+ size: 'm',
54
+ view: 'default',
55
+ placement: 'bottom',
56
+ },
57
+ };
58
+
59
+ export default meta;
60
+
61
+ const onChangeAction = action('onChange');
62
+
63
+ const iconDoneToSelectSizeMap: Record<string, 'xs' | 's'> = {
64
+ xs: 'xs',
65
+ s: 's',
66
+ m: 's',
67
+ l: 's',
68
+ };
69
+
70
+ const checkboxToSelectSizeMap: Record<string, 's' | 'm'> = {
71
+ xs: 's',
72
+ s: 'm',
73
+ m: 'm',
74
+ l: 'm',
75
+ };
76
+
77
+ const getSelectItems = (slug: string, elemCount: number) =>
78
+ [...Array(elemCount).keys()].map((num) => ({
79
+ value: `${slug}_${num}`,
80
+ child: `${slug} ${num}`,
81
+ }));
82
+
83
+ const SingleDemo = (args: StorySelectProps) => {
84
+ const { usePortal, placement, label, placeholder, readOnly, disabled, size = 'm', view } = args;
85
+
86
+ const [value, setValue] = useState<ComboboxPrimitiveValue | undefined>('item_0');
87
+
88
+ const onChangeValue = (newValue?: ComboboxPrimitiveValue) => {
89
+ setValue(newValue);
90
+ onChangeAction(newValue);
91
+ };
92
+
93
+ return (
94
+ <div style={{ width: '50%', margin: '3rem 0' }}>
95
+ <h4>Combobox с единичным выбором</h4>
96
+ <Combobox
97
+ frame="theme-root"
98
+ usePortal={usePortal}
99
+ valueType="single"
100
+ value={value}
101
+ placement={placement}
102
+ label={label}
103
+ placeholder={placeholder}
104
+ size={size}
105
+ view={view}
106
+ disabled={disabled}
107
+ readOnly={readOnly}
108
+ onChangeValue={onChangeValue}
109
+ >
110
+ <ComboboxItem value={undefined} text="Clear" />
111
+ {getSelectItems('item', 6).map((item) => (
112
+ <ComboboxItem
113
+ key={item.value}
114
+ contentLeft={
115
+ item.value === value ? (
116
+ <IconDone size={iconDoneToSelectSizeMap[size]} color="inherit" />
117
+ ) : undefined
118
+ }
119
+ value={item.value}
120
+ text={item.child}
121
+ />
122
+ ))}
123
+ </Combobox>
124
+ </div>
125
+ );
126
+ };
127
+
128
+ const MultipleDemo = (args: StorySelectProps) => {
129
+ const { usePortal, placement, label, placeholder, readOnly, disabled, enumerationType, size = 'm', view } = args;
130
+
131
+ const [value, setValue] = useState<Array<ComboboxPrimitiveValue> | undefined>(['item_2', 'item_3']);
132
+
133
+ const onChangeValue = (newValue?: Array<ComboboxPrimitiveValue>) => {
134
+ setValue(newValue);
135
+ onChangeAction(newValue);
136
+ };
137
+
138
+ return (
139
+ <div style={{ width: '50%', marginBottom: '3rem' }}>
140
+ <h4>Combobox с множественным выбором</h4>
141
+ <Combobox
142
+ frame="theme-root"
143
+ usePortal={usePortal}
144
+ valueType="multiple"
145
+ enumerationType={enumerationType}
146
+ value={value}
147
+ placement={placement}
148
+ label={label}
149
+ placeholder={placeholder}
150
+ size={size}
151
+ view={view}
152
+ disabled={disabled}
153
+ readOnly={readOnly}
154
+ onChangeValue={onChangeValue}
155
+ >
156
+ <ComboboxItem value={undefined} text="Clear" />
157
+ {getSelectItems('item', 6).map((item) => (
158
+ <ComboboxItem
159
+ key={item.value}
160
+ contentLeft={<Checkbox size={checkboxToSelectSizeMap[size]} />}
161
+ value={item.value}
162
+ text={item.child}
163
+ />
164
+ ))}
165
+ </Combobox>
166
+ </div>
167
+ );
168
+ };
169
+
170
+ const AddCustomItemDemo = (args: StorySelectProps) => {
171
+ const { usePortal, placement, label, placeholder, readOnly, disabled, size = 'm', view } = args;
172
+
173
+ const [opened, setOpened] = useState(false);
174
+ const [items, setItems] = useState(getSelectItems('item', 1));
175
+ const [value, setValue] = useState<ComboboxPrimitiveValue | undefined>('item_0');
176
+
177
+ const onChangeValue = (newValue?: ComboboxPrimitiveValue) => {
178
+ setValue(newValue);
179
+ onChangeAction(newValue);
180
+ };
181
+
182
+ const onToggle = (openValue: boolean) => setOpened(openValue);
183
+
184
+ const onKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {
185
+ const { code } = event;
186
+
187
+ if (code === 'Enter') {
188
+ const newValue = (event.target as HTMLInputElement).value;
189
+ const newItems = [...items];
190
+
191
+ if (newItems.find((item) => item.child === newValue)) {
192
+ return;
193
+ }
194
+
195
+ newItems.push({
196
+ value: `${newValue}_`,
197
+ child: (newValue || '').toString(),
198
+ });
199
+
200
+ setOpened(false);
201
+ setItems(newItems);
202
+ }
203
+ };
204
+
205
+ const filterFunction = () => true;
206
+
207
+ return (
208
+ <div style={{ width: '50%' }}>
209
+ <h4>Combobox с добавлением пользовательского элемента</h4>
210
+ <Combobox
211
+ frame="theme-root"
212
+ usePortal={usePortal}
213
+ valueType="single"
214
+ value={value}
215
+ placement={placement}
216
+ label={label}
217
+ placeholder={placeholder}
218
+ size={size}
219
+ view={view}
220
+ disabled={disabled}
221
+ readOnly={readOnly}
222
+ opened={opened}
223
+ onToggle={onToggle}
224
+ onChangeValue={onChangeValue}
225
+ onKeyDown={onKeyDown}
226
+ filterFunction={filterFunction}
227
+ >
228
+ <ComboboxItem value={undefined} text="Clear" />
229
+ <ComboboxDivider />
230
+ {items.map((item) => (
231
+ <ComboboxItem
232
+ key={item.value}
233
+ contentLeft={
234
+ item.value === value ? (
235
+ <IconDone size={iconDoneToSelectSizeMap[size]} color="inherit" />
236
+ ) : undefined
237
+ }
238
+ value={item.value}
239
+ text={item.child}
240
+ />
241
+ ))}
242
+ </Combobox>
243
+ </div>
244
+ );
245
+ };
246
+
247
+ export const Legacy: StoryObj<StorySelectProps> = {
248
+ render: (args) => (
249
+ <>
250
+ <h3>Combobox на композиционной архитектуре (deprecated)</h3>
251
+ <SingleDemo {...args} />
252
+ <MultipleDemo {...args} />
253
+ <AddCustomItemDemo {...args} />
254
+ </>
255
+ ),
256
+ };
@@ -0,0 +1,344 @@
1
+ ---
2
+ id: combobox
3
+ title: Combobox
4
+ ---
5
+
6
+ import { PropsTable, Description, StorybookLink } from '@site/src/components';
7
+ import Tabs from '@theme/Tabs';
8
+ import TabItem from '@theme/TabItem';
9
+
10
+ # Combobox
11
+
12
+ <Description name="Combobox" />
13
+ <PropsTable name="Combobox" />
14
+
15
+ ## Использование
16
+ Обязательным параметром является только `items`. Внутри items может быть такой же вложенный массив items. Формат следующий:
17
+
18
+ ```tsx
19
+ type Items = Array<{
20
+ /**
21
+ * Значение у item
22
+ */
23
+ value: string;
24
+ /**
25
+ * Метка-подпись к item
26
+ */
27
+ label: string;
28
+ /**
29
+ * Список дочерних items.
30
+ */
31
+ items?: Array<ItemOption>;
32
+ /**
33
+ * Item не активен
34
+ */
35
+ disabled?: boolean;
36
+ /**
37
+ * Слот для контента слева
38
+ */
39
+ contentLeft?: ReactNode;
40
+ /**
41
+ * Слот для контента справа
42
+ */
43
+ contentRight?: ReactNode;
44
+ }>;
45
+ ```
46
+
47
+ Тип выбора комбобокса - одиночный или множественный зависит от типа `value` и `onChange`. В одиночном value - `string`, в множественном - `Array<string>`.\
48
+
49
+
50
+ ## Примеры
51
+
52
+ <Tabs>
53
+ <TabItem value="single" label="Single" default>
54
+ ```tsx live
55
+ import React from 'react';
56
+ import { Combobox } from '@salutejs/{{ package }}';
57
+
58
+ export function App() {
59
+ const [value, setValue] = useState('');
60
+
61
+ const items = [
62
+ {
63
+ value: 'north_america',
64
+ label: 'Северная Америка',
65
+ },
66
+ {
67
+ value: 'south_america',
68
+ label: 'Южная Америка',
69
+ items: [
70
+ {
71
+ value: 'brazil',
72
+ label: 'Бразилия',
73
+ },
74
+ {
75
+ value: 'argentina',
76
+ label: 'Аргентина',
77
+ },
78
+ ],
79
+ },
80
+ ];
81
+
82
+ return (
83
+ <div style=\{{ display: 'flex', gap: '30px', height: '300px' }}>
84
+ <div style=\{{width: '300px'}}>
85
+ <Combobox
86
+ items={items}
87
+ value={value}
88
+ onChange={setValue}
89
+ placeholder="Placeholder"
90
+ label="Label"
91
+ helperText="Helper text"
92
+ />
93
+ </div>
94
+ </div>
95
+ );
96
+ }
97
+ ```
98
+ </TabItem>
99
+ <TabItem value="multiple" label="Multiple">
100
+ ```tsx live
101
+ import React from 'react';
102
+ import { Combobox } from '@salutejs/{{ package }}';
103
+
104
+ export function App() {
105
+ const [value, setValue] = useState([]);
106
+
107
+ const items = [
108
+ {
109
+ value: 'north_america',
110
+ label: 'Северная Америка',
111
+ },
112
+ {
113
+ value: 'south_america',
114
+ label: 'Южная Америка',
115
+ items: [
116
+ {
117
+ value: 'brazil',
118
+ label: 'Бразилия',
119
+ },
120
+ {
121
+ value: 'argentina',
122
+ label: 'Аргентина',
123
+ },
124
+ ],
125
+ },
126
+ ];
127
+
128
+ return (
129
+ <div style=\{{ display: 'flex', gap: '30px', height: '300px' }}>
130
+ <div style=\{{width: '300px'}}>
131
+ <Combobox
132
+ multiple
133
+ items={items}
134
+ value={value}
135
+ onChange={setValue}
136
+ placeholder="Placeholder"
137
+ label="Label"
138
+ helperText="Helper text"
139
+ />
140
+ </div>
141
+ </div>
142
+ );
143
+ }
144
+ ```
145
+ </TabItem>
146
+ <TabItem value="predefined" label="Predefined">
147
+ Есть возможность задать значения по дефолту (главное, чтобы они находились в `items`). Также можно управлять состоянием снаружи селекта.
148
+
149
+ ```tsx live
150
+ import React from 'react';
151
+ import { Combobox, Button } from '@salutejs/{{ package }}';
152
+
153
+ export function App() {
154
+ const [multipleValue, setMultipleValue] = useState(['brazil', 'north_america']);
155
+
156
+ const items = [
157
+ {
158
+ value: 'north_america',
159
+ label: 'Северная Америка',
160
+ },
161
+ {
162
+ value: 'south_america',
163
+ label: 'Южная Америка',
164
+ items: [
165
+ {
166
+ value: 'brazil',
167
+ label: 'Бразилия',
168
+ },
169
+ {
170
+ value: 'argentina',
171
+ label: 'Аргентина',
172
+ },
173
+ ],
174
+ },
175
+ ];
176
+
177
+ return (
178
+ <div style=\{{ display: 'flex', gap: '30px', height: '300px' }}>
179
+ <div style=\{{width: '300px'}}>
180
+ <Combobox
181
+ multiple
182
+ items={items}
183
+ value={multipleValue}
184
+ onChange={setMultipleValue}
185
+ placeholder="Placeholder"
186
+ label="Label"
187
+ helperText="Helper text"
188
+ />
189
+ </div>
190
+
191
+ <Button onClick={() => setMultipleValue([])}>Очистить</Button>
192
+ </div>
193
+ );
194
+ }
195
+ ```
196
+ </TabItem>
197
+ <TabItem value="portal" label="Portal">
198
+ Иногда возникает необходимость вынесения выпадающего списка на уровни выше в DOM. К примеру, когда у родительского блока имеется скролл, и список будет обрезаться, чего хотелось бы избежать.\
199
+ Для такой реализации имеется пропс `portal`, который принимает либо `ref` либо `id` html-тега.\
200
+ Также нужно прокинуть проп `listWidth`, чтобы явно задать ширину списку. Если этого не сделать, то будет взята ширина 100% от блока, на который ведет ссылка портала.
201
+
202
+ ```tsx live
203
+ import React, { useRef } from 'react';
204
+ import { Combobox } from '@salutejs/{{ package }}';
205
+
206
+ export function App() {
207
+ const [value, setValue] = useState('');
208
+
209
+ const items = [
210
+ {
211
+ value: 'north_america',
212
+ label: 'Северная Америка',
213
+ },
214
+ {
215
+ value: 'south_america',
216
+ label: 'Южная Америка',
217
+ items: [
218
+ {
219
+ value: 'brazil',
220
+ label: 'Бразилия',
221
+ },
222
+ {
223
+ value: 'argentina',
224
+ label: 'Аргентина',
225
+ },
226
+ ],
227
+ },
228
+ ];
229
+
230
+ const ref = useRef(null)
231
+
232
+ return (
233
+ <div style=\{{ height: '300px' }} ref={ref}>
234
+ <div style=\{{width: '300px'}}>
235
+ <Combobox
236
+ items={items}
237
+ value={value}
238
+ onChange={setValue}
239
+ placeholder="Placeholder"
240
+ label="Label"
241
+ helperText="Helper text"
242
+ portal={ref}
243
+ listWidth="300px"
244
+ />
245
+ </div>
246
+ </div>
247
+ );
248
+ }
249
+ ```
250
+ </TabItem>
251
+ <TabItem value="uncontrolled" label="Uncontrolled">
252
+ `value` и `onChange` - опциональные параметры. Если вы хотите `uncontrolled` вариант компонента - их пробрасывать необязательно.
253
+
254
+ ```tsx live
255
+ import React from 'react';
256
+ import { Combobox } from '@salutejs/{{ package }}';
257
+
258
+ export function App() {
259
+ const items = [
260
+ {
261
+ value: 'north_america',
262
+ label: 'Северная Америка',
263
+ },
264
+ {
265
+ value: 'south_america',
266
+ label: 'Южная Америка',
267
+ items: [
268
+ {
269
+ value: 'brazil',
270
+ label: 'Бразилия',
271
+ },
272
+ {
273
+ value: 'argentina',
274
+ label: 'Аргентина',
275
+ },
276
+ ],
277
+ },
278
+ ];
279
+
280
+ return (
281
+ <div style=\{{ height: '300px' }}>
282
+ <div style=\{{width: '300px'}}>
283
+ <Combobox
284
+ items={items}
285
+ placeholder="Placeholder"
286
+ label="Label"
287
+ helperText="Helper text"
288
+ />
289
+ </div>
290
+ </div>
291
+ );
292
+ }
293
+ ```
294
+ </TabItem>
295
+ <TabItem value="alwaysOpened" label="Always opened">
296
+ Свойство alwaysOpened позволяет отображать Combobox всегда открытым. При этом closeAfterSelect игнорируется.
297
+
298
+ ```tsx live
299
+ import React from 'react';
300
+ import { Combobox } from '@salutejs/{{ package }}';
301
+
302
+ export function App() {
303
+ const items = [
304
+ {
305
+ value: 'north_america',
306
+ label: 'Северная Америка',
307
+ },
308
+ {
309
+ value: 'south_america',
310
+ label: 'Южная Америка',
311
+ items: [
312
+ {
313
+ value: 'brazil',
314
+ label: 'Бразилия',
315
+ },
316
+ {
317
+ value: 'argentina',
318
+ label: 'Аргентина',
319
+ },
320
+ ],
321
+ },
322
+ ];
323
+
324
+ return (
325
+ <div style=\{{ height: '300px' }}>
326
+ <div style=\{{width: '300px'}}>
327
+ <Combobox
328
+ items={items}
329
+ placeholder="Placeholder"
330
+ label="Label"
331
+ helperText="Helper text"
332
+ alwaysOpened
333
+ />
334
+ </div>
335
+ </div>
336
+ );
337
+ }
338
+ ```
339
+ </TabItem>
340
+ </Tabs>
341
+
342
+ ## Клавиатурная навигация
343
+
344
+ Данный компонент соответствует требования W3C: [Combobox](https://www.w3.org/WAI/ARIA/apg/patterns/combobox/) и частично [TreeView](https://www.w3.org/WAI/ARIA/apg/patterns/treeview/).
@@ -1,4 +1,4 @@
1
- var _excluded = ["multiple", "value", "onChange", "isTargetAmount", "items", "placement", "label", "placeholder", "helperText", "contentLeft", "textBefore", "textAfter", "variant", "listOverflow", "listHeight", "listWidth", "portal", "renderItem", "view", "size", "labelPlacement", "readOnly", "disabled", "filter", "closeAfterSelect"];
1
+ var _excluded = ["multiple", "value", "onChange", "isTargetAmount", "items", "placement", "label", "placeholder", "helperText", "contentLeft", "textBefore", "textAfter", "variant", "listOverflow", "listHeight", "listWidth", "portal", "renderItem", "view", "size", "labelPlacement", "readOnly", "disabled", "alwaysOpened", "filter", "closeAfterSelect"];
2
2
  function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
3
3
  function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
4
4
  function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
@@ -58,6 +58,8 @@ export var comboboxRoot = function comboboxRoot(Root) {
58
58
  readOnly = _props$readOnly === void 0 ? false : _props$readOnly,
59
59
  _props$disabled = props.disabled,
60
60
  disabled = _props$disabled === void 0 ? false : _props$disabled,
61
+ _props$alwaysOpened = props.alwaysOpened,
62
+ alwaysOpened = _props$alwaysOpened === void 0 ? false : _props$alwaysOpened,
61
63
  filter = props.filter,
62
64
  outerCloseAfterSelect = props.closeAfterSelect,
63
65
  rest = _objectWithoutProperties(props, _excluded);
@@ -107,7 +109,7 @@ export var comboboxRoot = function comboboxRoot(Root) {
107
109
  _useState6 = _slicedToArray(_useState5, 2),
108
110
  checked = _useState6[0],
109
111
  setChecked = _useState6[1];
110
- var isCurrentListOpen = Boolean(path[0]);
112
+ var isCurrentListOpen = alwaysOpened || Boolean(path[0]);
111
113
  var activeDescendantItemValue = ((_getItemByFocused = getItemByFocused(focusedPath, focusedToValueMap)) === null || _getItemByFocused === void 0 ? void 0 : _getItemByFocused.value) || '';
112
114
  var withArrowInverse = isCurrentListOpen ? classes.arrowInverse : undefined;
113
115
  var closeAfterSelect = outerCloseAfterSelect !== null && outerCloseAfterSelect !== void 0 ? outerCloseAfterSelect : !multiple;
@@ -217,7 +219,7 @@ export var comboboxRoot = function comboboxRoot(Root) {
217
219
  newValues.push(item.value);
218
220
  }
219
221
  });
220
- if (closeAfterSelect) {
222
+ if (!alwaysOpened && closeAfterSelect) {
221
223
  dispatchPath({
222
224
  type: 'reset'
223
225
  });
@@ -262,7 +264,7 @@ export var comboboxRoot = function comboboxRoot(Root) {
262
264
  updateSingleAncestors(item, checkedCopy, 'dot');
263
265
  }
264
266
  setTextValue(isCurrentChecked ? '' : item.label);
265
- if (closeAfterSelect) {
267
+ if (!alwaysOpened && closeAfterSelect) {
266
268
  dispatchPath({
267
269
  type: 'reset'
268
270
  });