@salutejs/plasma-new-hope 0.67.0-canary.1148.8443817650.0 → 0.67.0-canary.1148.8449317874.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. package/cjs/components/Cell/Cell.js +3 -0
  2. package/cjs/components/Cell/Cell.js.map +1 -1
  3. package/cjs/components/Cell/Cell.tokens.js +2 -3
  4. package/cjs/components/Cell/Cell.tokens.js.map +1 -1
  5. package/es/components/Cell/Cell.js +3 -0
  6. package/es/components/Cell/Cell.js.map +1 -1
  7. package/es/components/Cell/Cell.tokens.js +2 -3
  8. package/es/components/Cell/Cell.tokens.js.map +1 -1
  9. package/package.json +2 -2
  10. package/styled-components/cjs/components/Avatar/Avatar.template-doc.mdx +97 -0
  11. package/styled-components/cjs/components/AvatarGroup/AvatarGroup.template-doc.mdx +29 -0
  12. package/styled-components/cjs/components/Badge/Badge.template-doc.mdx +131 -0
  13. package/styled-components/cjs/components/Button/Button.template-doc.mdx +162 -0
  14. package/styled-components/cjs/components/ButtonGroup/ButtonGroup.template-doc.mdx +123 -0
  15. package/styled-components/cjs/components/Calendar/Calendar.template-doc.mdx +208 -0
  16. package/styled-components/cjs/components/Cell/Cell.js +3 -0
  17. package/styled-components/cjs/components/Cell/Cell.tokens.js +2 -3
  18. package/styled-components/cjs/components/Checkbox/Checkbox.template-doc.mdx +44 -0
  19. package/styled-components/cjs/components/Chip/Chip.template-doc.mdx +90 -0
  20. package/styled-components/cjs/components/Combobox/Combobox.template-doc.mdx +237 -0
  21. package/styled-components/cjs/components/Counter/Counter.template-doc.mdx +76 -0
  22. package/styled-components/cjs/components/Drawer/Drawer.template-doc.mdx +170 -0
  23. package/styled-components/cjs/components/Dropdown/Dropdown.template-doc.mdx +80 -0
  24. package/styled-components/cjs/components/Grid/Grid.template-doc.mdx +142 -0
  25. package/styled-components/cjs/components/Image/Image.template-doc.mdx +26 -0
  26. package/styled-components/cjs/components/Indicator/Indicator.template-doc.mdx +76 -0
  27. package/styled-components/cjs/components/Link/Link.template-doc.mdx +23 -0
  28. package/styled-components/cjs/components/Modal/Modal.template-doc.mdx +56 -0
  29. package/styled-components/cjs/components/Notification/Notification.template-doc.mdx +59 -0
  30. package/styled-components/cjs/components/Overlay/Overlay.template-doc.mdx +10 -0
  31. package/styled-components/cjs/components/Popover/Popover.template-doc.mdx +72 -0
  32. package/styled-components/cjs/components/Popup/Popup.template-doc.mdx +209 -0
  33. package/styled-components/cjs/components/Radiobox/Radiobox.template-doc.mdx +38 -0
  34. package/styled-components/cjs/components/Segment/Segment.template-doc.mdx +61 -0
  35. package/styled-components/cjs/components/Select/Select.template-doc.mdx +115 -0
  36. package/styled-components/cjs/components/Skeleton/Skeleton.template-doc.mdx +103 -0
  37. package/styled-components/cjs/components/Spinner/Spinner.template-doc.mdx +21 -0
  38. package/styled-components/cjs/components/Switch/Switch.template-doc.mdx +24 -0
  39. package/styled-components/cjs/components/Tabs/Tabs.template-doc.mdx +94 -0
  40. package/styled-components/cjs/components/TextArea/TextArea.template-doc.mdx +88 -0
  41. package/styled-components/cjs/components/TextField/TextField.template-doc.mdx +112 -0
  42. package/styled-components/cjs/components/Toast/Toast.template-doc.mdx +153 -0
  43. package/styled-components/cjs/components/Tooltip/Tooltip.template-doc.mdx +30 -0
  44. package/styled-components/cjs/components/Typography/Typography.template-doc.mdx +127 -0
  45. package/styled-components/cjs/examples/plasma_b2c/components/Cell/Cell.config.js +5 -5
  46. package/styled-components/cjs/examples/plasma_b2c/components/Cell/Cell.stories.tsx +16 -19
  47. package/styled-components/cjs/examples/plasma_web/components/Cell/Cell.config.js +5 -5
  48. package/styled-components/cjs/examples/plasma_web/components/Cell/Cell.stories.tsx +16 -19
  49. package/styled-components/es/components/Avatar/Avatar.template-doc.mdx +97 -0
  50. package/styled-components/es/components/AvatarGroup/AvatarGroup.template-doc.mdx +29 -0
  51. package/styled-components/es/components/Badge/Badge.template-doc.mdx +131 -0
  52. package/styled-components/es/components/Button/Button.template-doc.mdx +162 -0
  53. package/styled-components/es/components/ButtonGroup/ButtonGroup.template-doc.mdx +123 -0
  54. package/styled-components/es/components/Calendar/Calendar.template-doc.mdx +208 -0
  55. package/styled-components/es/components/Cell/Cell.js +3 -0
  56. package/styled-components/es/components/Cell/Cell.tokens.js +2 -3
  57. package/styled-components/es/components/Checkbox/Checkbox.template-doc.mdx +44 -0
  58. package/styled-components/es/components/Chip/Chip.template-doc.mdx +90 -0
  59. package/styled-components/es/components/Combobox/Combobox.template-doc.mdx +237 -0
  60. package/styled-components/es/components/Counter/Counter.template-doc.mdx +76 -0
  61. package/styled-components/es/components/Drawer/Drawer.template-doc.mdx +170 -0
  62. package/styled-components/es/components/Dropdown/Dropdown.template-doc.mdx +80 -0
  63. package/styled-components/es/components/Grid/Grid.template-doc.mdx +142 -0
  64. package/styled-components/es/components/Image/Image.template-doc.mdx +26 -0
  65. package/styled-components/es/components/Indicator/Indicator.template-doc.mdx +76 -0
  66. package/styled-components/es/components/Link/Link.template-doc.mdx +23 -0
  67. package/styled-components/es/components/Modal/Modal.template-doc.mdx +56 -0
  68. package/styled-components/es/components/Notification/Notification.template-doc.mdx +59 -0
  69. package/styled-components/es/components/Overlay/Overlay.template-doc.mdx +10 -0
  70. package/styled-components/es/components/Popover/Popover.template-doc.mdx +72 -0
  71. package/styled-components/es/components/Popup/Popup.template-doc.mdx +209 -0
  72. package/styled-components/es/components/Radiobox/Radiobox.template-doc.mdx +38 -0
  73. package/styled-components/es/components/Segment/Segment.template-doc.mdx +61 -0
  74. package/styled-components/es/components/Select/Select.template-doc.mdx +115 -0
  75. package/styled-components/es/components/Skeleton/Skeleton.template-doc.mdx +103 -0
  76. package/styled-components/es/components/Spinner/Spinner.template-doc.mdx +21 -0
  77. package/styled-components/es/components/Switch/Switch.template-doc.mdx +24 -0
  78. package/styled-components/es/components/Tabs/Tabs.template-doc.mdx +94 -0
  79. package/styled-components/es/components/TextArea/TextArea.template-doc.mdx +88 -0
  80. package/styled-components/es/components/TextField/TextField.template-doc.mdx +112 -0
  81. package/styled-components/es/components/Toast/Toast.template-doc.mdx +153 -0
  82. package/styled-components/es/components/Tooltip/Tooltip.template-doc.mdx +30 -0
  83. package/styled-components/es/components/Typography/Typography.template-doc.mdx +127 -0
  84. package/styled-components/es/examples/plasma_b2c/components/Cell/Cell.config.js +5 -5
  85. package/styled-components/es/examples/plasma_b2c/components/Cell/Cell.stories.tsx +16 -19
  86. package/styled-components/es/examples/plasma_web/components/Cell/Cell.config.js +5 -5
  87. package/styled-components/es/examples/plasma_web/components/Cell/Cell.stories.tsx +16 -19
  88. package/types/components/Cell/Cell.d.ts +4 -2
  89. package/types/components/Cell/Cell.d.ts.map +1 -1
  90. package/types/components/Cell/Cell.tokens.d.ts +0 -1
  91. package/types/components/Cell/Cell.tokens.d.ts.map +1 -1
  92. package/types/components/Cell/Cell.types.d.ts +5 -2
  93. package/types/components/Cell/Cell.types.d.ts.map +1 -1
  94. package/types/examples/plasma_b2c/components/Cell/Cell.d.ts +2 -1
  95. package/types/examples/plasma_b2c/components/Cell/Cell.d.ts.map +1 -1
  96. package/types/examples/plasma_web/components/Cell/Cell.d.ts +2 -1
  97. package/types/examples/plasma_web/components/Cell/Cell.d.ts.map +1 -1
@@ -0,0 +1,237 @@
1
+ ---
2
+ id: combobox
3
+ title: Combobox
4
+ ---
5
+
6
+ import { PropsTable, Description } from '@site/src/components';
7
+
8
+ # Combobox
9
+ Компонент, отвечающий за выпадающий список с возможностью фильтрации элементов и их выбора.
10
+ Доступен в двух режимах: единичный и множественный выбор.
11
+
12
+ ## Combobox
13
+ <Description name="Combobox" />
14
+ <PropsTable name="Combobox" exclude={['css', 'focused']} />
15
+
16
+ ## Использование
17
+ Компонент `Combobox` должен содержать компоненты из следующего списка: `ComboboxDivider`, `ComboboxFooter`, `ComboboxGroup`, `ComboboxHeader`, `ComboboxItem`.
18
+ Для управления режимом, необходимо установить свойство `valueType = 'single'` для единичного выбора и `valueType='multiple'` для множественного.
19
+ Так же для выбора отображения множественного режима свойство `enumerationType = 'comma'` для перечисления выбранных значений через запятую,
20
+ и `enumerationType = 'chip'` для перечисления выбранных значений с помощью компонента `Chip`.
21
+
22
+ ## Клавиатурная навигация
23
+
24
+ Данный компонент может полностью управляться с помощью клавиатуры, используя следующие клавиши:
25
+ - `Tab` - переход на таргет (инпут)
26
+ - `Shift` + `tab` - выход с него (теряем фокус)
27
+ - `Стрелка вверх` / `стрелка вниз` - открыть выпадающий список и переместиться на первый элемент
28
+ - `Стрелка вверх` / `стрелка вниз` ходим по элементам с зацикливанием
29
+ - `Enter` - выбираем элемент, закрываем выпадающий список и переходим фокусом снова на таргет (инпут)
30
+ - Если мы ходим по селекту и нажимаем `Tab` - выпадающий список закрывается и теряем фокус
31
+ - Если мы ходим по селекту и нажимаем `Escape` - выпадающий список закрывается и фокусом остаёмся на таргете
32
+ - В мультиселекте то же самое кроме закрытия выпадающего списка при выборе элемента
33
+ - Когда находимся на первом чипе, нажимаем `стрелку влево` / `стрелку вправо` - переходим по чипам
34
+ - Когда оказываемся на последнем чипе и нажимаем `стрелку вправо` - переходим на таргет (инпут)
35
+ - Когда находимся на таргете (инпуте) и нажимаем `Backspace` - удаляется последний чип
36
+ - Когда находимся на таргете (инпуте) и нажимаем `стрелку влево` - переходим на последний чип
37
+ - Нажимаем `Backspace` - удаляем выбранный чип и переходим на предыдущий
38
+ - Если удалили последний чип, то фокусируемся на таргете
39
+ - Если находимся в выборе элемента из выпадающего списка и нажимаем `стрелку влево` / `стрелку вправо` - попадаем на самый последний чип
40
+ - Если находимся в режиме выбора элемента и нажимаем `стрелку вниз` / `стрелку вверх` находясь на последнем / первом элементе, то перескакиваем в начало / в конец
41
+ - Если находимся в режиме выбора элемента и нажимаем любую клавишу **кроме** `стрелки вниз` / `вверх` / `влево` / `вправо` / `Escape` / `Tab` / `Enter`, то переходим на таргет (инпут) и вводим значения
42
+ - Ввод значение в таргет (инпут) приводит к фильтрации элементов в выпадающем списке. Если значение не соответствует ни одному элементу, то отобразится сообщение "Элементы не найдены"
43
+
44
+ ### Single
45
+
46
+ ```tsx live
47
+ import React from 'react';
48
+ import { Combobox, ComboboxItem } from '@salutejs/{{ package }}';
49
+ import { IconDone } from '@salutejs/plasma-icons';
50
+
51
+ export function App() {
52
+ const [value, setValue] = React.useState(undefined);
53
+ const handleOnChange = React.useCallback((newValue) => {
54
+ setValue(newValue);
55
+ }, []);
56
+
57
+ return (
58
+ <div>
59
+ <Combobox value={value} onChangeValue={handleOnChange} frame="document" usePortal placeholder="Placeholder">
60
+ <ComboboxItem value={undefined} text="Clear" />
61
+ <ComboboxItem
62
+ value="item_0"
63
+ text="item 0"
64
+ contentLeft={"item_0" === value ? <IconDone size="s" color="inherit" /> : undefined}
65
+ />
66
+ <ComboboxItem
67
+ value="item_1"
68
+ text="item 1"
69
+ contentLeft={"item_1" === value ? <IconDone size="s" color="inherit" /> : undefined}
70
+ />
71
+ <ComboboxItem
72
+ value="extra_item_0"
73
+ text="extra item 0"
74
+ contentLeft={"extra_item_0" === value ? <IconDone size="s" color="inherit" /> : undefined}
75
+ />
76
+ <ComboboxItem
77
+ value="extra_item_1"
78
+ text="extra item 1"
79
+ contentLeft={"extra_item_1" === value ? <IconDone size="s" color="inherit" /> : undefined}
80
+ />
81
+ <ComboboxItem
82
+ value="extra_item_2"
83
+ text="extra item 2"
84
+ contentLeft={"extra_item_2" === value ? <IconDone size="s" color="inherit" /> : undefined}
85
+ />
86
+ </Combobox>
87
+ </div>
88
+ );
89
+ }
90
+ ```
91
+
92
+ ### Multiple
93
+
94
+ ```tsx live
95
+ import React from 'react';
96
+ import { Combobox, ComboboxItem, Checkbox } from '@salutejs/{{ package }}';
97
+
98
+ export function App() {
99
+ const [value, setValue] = React.useState(['item_0']);
100
+ const handleOnChange = React.useCallback((newValue) => {
101
+ setValue(newValue);
102
+ }, []);
103
+
104
+ return (
105
+ <div>
106
+ <Combobox
107
+ value={value}
108
+ onChangeValue={handleOnChange}
109
+ frame="document"
110
+ usePortal
111
+ valueType="multiple"
112
+ enumerationType="chip"
113
+ label="Label">
114
+ <ComboboxItem value={undefined} text="Clear" />
115
+ <ComboboxItem
116
+ value="item_0"
117
+ text="item 0"
118
+ contentLeft={Checkbox}
119
+ />
120
+ <ComboboxItem
121
+ value="item_1"
122
+ text="item 1"
123
+ contentLeft={Checkbox}
124
+ />
125
+ <ComboboxItem
126
+ value="extra_item_0"
127
+ text="extra item 0"
128
+ contentLeft={Checkbox}
129
+ />
130
+ <ComboboxItem
131
+ value="extra_item_1"
132
+ text="extra item 1"
133
+ contentLeft={Checkbox}
134
+ />
135
+ <ComboboxItem
136
+ value="extra_item_2"
137
+ text="extra item 2"
138
+ contentLeft={Checkbox}
139
+ />
140
+ </Combobox>
141
+ </div>
142
+ );
143
+ }
144
+ ```
145
+
146
+ ## Примеры
147
+
148
+ ### Размер Combobox
149
+ Размер `Combobox` задается с помощью свойства `size`.
150
+ Возможные значения свойства: `"l"`, `"m"`, `"s"` или `"xs"`, а также соответствующие размеры компонент `Checkbox` и `IconDone`:
151
+
152
+ Для иконок верно такое соответствие размеров (`Icon = Combobox`):
153
+ - xs = xs,
154
+ - s = s,
155
+ - m = s,
156
+ - l = s,
157
+
158
+ Для `Checkbox` / `Radiobox` верно такое соответствие размеров (`Checkbox / Radiobox = Combobox`):
159
+ - xs = s,
160
+ - s = m,
161
+ - m = m,
162
+ - l = m,
163
+
164
+ ```tsx live
165
+ import React from 'react';
166
+ import { Combobox } from '@salutejs/{{ package }}';
167
+
168
+ export function App() {
169
+ return (
170
+ <div style=\{{flexDirection: 'column'}}>
171
+ <Combobox usePortal frame="document" label="Label" size="xs" />
172
+ <Combobox usePortal frame="document" label="Label" size="s" />
173
+ <Combobox usePortal frame="document" label="Label" size="m" />
174
+ <Combobox usePortal frame="document" label="Label" size="l" />
175
+ </div>
176
+ );
177
+ }
178
+ ```
179
+
180
+ ### Применение пользовательского фильтра
181
+ `Combobox` поддерживает возможность создавать собственные правила для фильтрации списка элементов с помощью функции колбэка `filterFunction`,
182
+ которая срабатывает на каждый элемент и если возвращает `true`, то элемент рендерится, иначе нет.
183
+
184
+ ```tsx live
185
+ import React from 'react';
186
+ import { Combobox } from '@salutejs/{{ package }}';
187
+
188
+ export function App() {
189
+ const [value, setValue] = React.useState(['item_0']);
190
+ const handleOnChange = React.useCallback((newValue) => {
191
+ setValue(newValue);
192
+ }, []);
193
+
194
+ const customFilterFunction = React.useCallback((childText, filterValue) => {
195
+ return childText.startWith(filterValue);
196
+ }, []);
197
+
198
+ return (
199
+ <div style=\{{flexDirection: 'column'}}>
200
+ <Combobox
201
+ value={value}
202
+ onChangeValue={handleOnChange}
203
+ frame="document"
204
+ usePortal
205
+ valueType="multiple"
206
+ label="Label">
207
+ <ComboboxItem value={undefined} text="Clear" />
208
+ <ComboboxItem
209
+ value="item_0"
210
+ text="item 0"
211
+ contentLeft={Checkbox}
212
+ />
213
+ <ComboboxItem
214
+ value="item_1"
215
+ text="item 1"
216
+ contentLeft={Checkbox}
217
+ />
218
+ <ComboboxItem
219
+ value="extra_item_0"
220
+ text="extra item 0"
221
+ contentLeft={Checkbox}
222
+ />
223
+ <ComboboxItem
224
+ value="extra_item_1"
225
+ text="extra item 1"
226
+ contentLeft={Checkbox}
227
+ />
228
+ <ComboboxItem
229
+ value="extra_item_2"
230
+ text="extra item 2"
231
+ contentLeft={Checkbox}
232
+ />
233
+ </Combobox>
234
+ </div>
235
+ );
236
+ }
237
+ ```
@@ -0,0 +1,76 @@
1
+ ---
2
+ id: counter
3
+ title: Counter
4
+ ---
5
+
6
+ import { PropsTable, Description } from '@site/src/components';
7
+
8
+ # Counter
9
+ <Description name="Counter" />
10
+ <PropsTable name="Counter" exclude={['css']} />
11
+
12
+ ## Примеры
13
+
14
+ ### Максимальное значение числового бейджа
15
+ Задается с помощью свойства `maxCount`.
16
+
17
+ ```tsx live
18
+ import React from 'react';
19
+ import { Counter } from '@salutejs/{{ package }}';
20
+
21
+ export function App() {
22
+ return (
23
+ <div>
24
+ <Counter count={10} maxCount={9} />
25
+ <Counter count={100} maxCount={99} />
26
+ </div>
27
+ );
28
+ }
29
+ ```
30
+
31
+ ### Размер числового бейджа
32
+ Размер задается с помощью свойства `size`. Возможные значения свойства: `"xs"` или `"xxs"`.
33
+
34
+ ```tsx live
35
+ import React from 'react';
36
+ import { Counter } from '@salutejs/{{ package }}';
37
+
38
+ export function App() {
39
+ return (
40
+ <div>
41
+ <Counter count={10} size="xs" />
42
+ <Counter count={10} size="xxs" />
43
+ </div>
44
+ );
45
+ }
46
+ ```
47
+
48
+ ### Вид числового бейджа
49
+ Вид задается с помощью свойства `view`. Возможные значения свойства `view`:
50
+
51
+ + `"primary"` – основной бейдж;
52
+ + `"accent"` – бейдж акцентного цвета;
53
+ + `"positive"` – успешное завершение;
54
+ + `"warning"` – предупреждение;
55
+ + `"negative"` – ошибка;
56
+ + `"dark"` – темный бэйдж;
57
+ + `"light"` – светлый бэйдж.
58
+
59
+ ```tsx live
60
+ import React from 'react';
61
+ import { Counter } from '@salutejs/{{ package }}';
62
+
63
+ export function App() {
64
+ return (
65
+ <div>
66
+ <Counter count={10} view="primary" />
67
+ <Counter count={10} view="accent" />
68
+ <Counter count={10} view="positive" />
69
+ <Counter count={10} view="warning" />
70
+ <Counter count={10} view="negative" />
71
+ <Counter count={10} view="dark" />
72
+ <Counter count={10} view="light" />
73
+ </div>
74
+ );
75
+ }
76
+ ```
@@ -0,0 +1,170 @@
1
+ ---
2
+ id: drawer
3
+ title: Drawer
4
+ ---
5
+
6
+ import { PropsTable, Description } from '@site/src/components';
7
+
8
+ # Drawer
9
+ <Description name="Drawer" />
10
+ <PropsTable name="Drawer" />
11
+
12
+ ### Использование
13
+
14
+ Перед использованием убедитесь, что `PopupProvider` подключен.
15
+
16
+ ```tsx title="index.ts"
17
+ import ReactDOM from 'react-dom';
18
+ import { PopupProvider } from '@salutejs/{{ package }}';
19
+
20
+ import { App } from './App';
21
+
22
+ ReactDOM.render(
23
+ <PopupProvider>
24
+ <App />
25
+ </PopupProvider>,
26
+ document.getElementById('root')
27
+ );
28
+ ```
29
+
30
+ ### Отображения Drawer
31
+
32
+ Drawer можно использовать как и на всем окне, так и в отдельном фрейме - свойство `frame`.
33
+ Также это свойство поддерживает передачу id элемента, в котором будет использоваться компонент.
34
+ Само позиционирование можно указать с помощью свойства `placement`(left - по умолчанию, right, top, bottom),
35
+ а также определить отступы от точки с помощью `offset`.
36
+
37
+ У компонента Drawer есть 2 режима отображения:
38
+ модальный - добавляет при этом подложку(`overlay`), а также блокирует скролл и фокус;
39
+ немодальный - нет подложки, скролл и фокус не заблокированы.
40
+
41
+ ```tsx live
42
+ import React, { useRef } from 'react';
43
+ import { IconDone } from '@salutejs/plasma-icons';
44
+ import { surfaceSolidSecondary } from '@salutejs/{{ theme }}';
45
+
46
+ import { SSRProvider, H3, Button, Drawer, DrawerHeader, DrawerContent, DrawerFooter, PopupProvider } from '@salutejs/{{ package }}';
47
+
48
+ export function App() {
49
+ const [isOpenA, setIsOpenA] = React.useState(false);
50
+ const [isOpenB, setIsOpenB] = React.useState(false);
51
+
52
+ const ref = useRef();
53
+
54
+ return (
55
+ <SSRProvider>
56
+ <PopupProvider>
57
+ <div style=\{{height: "500px"}}>
58
+ <div style=\{{ display: "flex", flexDirection: "column" }}>
59
+ <Button
60
+ text="Открыть в document"
61
+ onClick={() => setIsOpenA(true)}
62
+ style=\{{
63
+ marginTop: "1rem",
64
+ width: "15rem"
65
+ }}
66
+ />
67
+ <Button
68
+ text="Открыть во Frame"
69
+ onClick={() => setIsOpenB(true)}
70
+ style=\{{
71
+ marginTop: "1rem",
72
+ width: "15rem"
73
+ }}
74
+ />
75
+ </div>
76
+ <Drawer
77
+ id="drawerA"
78
+ isOpen={isOpenA}
79
+ onClose={() => setIsOpenA(false)}
80
+ placement="right"
81
+ withBlur={false}
82
+ closeOnEsc={true}
83
+ closeOnOverlayClick={true}
84
+ asModal={true}
85
+ width="25vw"
86
+ height="100vh"
87
+ >
88
+ <DrawerHeader
89
+ hasClose={true}
90
+ closePlacement="right"
91
+ actions={(
92
+ <Button size="s" view="clear" style=\{{
93
+ position: "relative",
94
+ width: "1.5rem",
95
+ height: "1.5rem"
96
+ }}>
97
+ <IconDone size="s" />
98
+ </Button>
99
+ )}
100
+ onClose={() => setIsOpenA(false)}
101
+ >
102
+ <H3>Header</H3>
103
+ </DrawerHeader>
104
+
105
+ <DrawerContent>Content</DrawerContent>
106
+
107
+ <DrawerFooter>
108
+ <H3>Footer</H3>
109
+ </DrawerFooter>
110
+ </Drawer>
111
+ <div
112
+ ref={ref}
113
+ style=\{{
114
+ marginTop: "1rem",
115
+ width: "400px",
116
+ height: "500px",
117
+ background: surfaceSolidSecondary,
118
+ position: "absolute",
119
+
120
+ display: "flex",
121
+ alignItems: "flex-start",
122
+ justifyContent: "center",
123
+ padding: "1rem",
124
+
125
+ bottom: 0,
126
+ right: 0
127
+ }}
128
+ >
129
+ <>Frame</>
130
+ </div>
131
+
132
+ <Drawer
133
+ id="drawerB"
134
+ isOpen={isOpenB}
135
+ onClose={() => setIsOpenB(false)}
136
+ placement="right"
137
+ asModal={false}
138
+ frame={ref}
139
+ width="250px"
140
+ height="100%"
141
+ >
142
+ <DrawerHeader
143
+ hasClose={true}
144
+ closePlacement="right"
145
+ actions={(
146
+ <Button size="s" view="clear" style=\{{
147
+ position: "relative",
148
+ width: "1.5rem",
149
+ height: "1.5rem"
150
+ }}>
151
+ <IconDone size="s" />
152
+ </Button>
153
+ )}
154
+ onClose={() => setIsOpenB(false)}
155
+ >
156
+ <H3>Header</H3>
157
+ </DrawerHeader>
158
+
159
+ <DrawerContent>Content</DrawerContent>
160
+
161
+ <DrawerFooter>
162
+ <H3>Footer</H3>
163
+ </DrawerFooter>
164
+ </Drawer>
165
+ </div>
166
+ </PopupProvider>
167
+ </SSRProvider>
168
+ );
169
+ }
170
+ ```
@@ -0,0 +1,80 @@
1
+ ---
2
+ id: dropdown
3
+ title: Dropdown
4
+ ---
5
+
6
+ import { PropsTable, Description } from '@site/src/components';
7
+
8
+ # Dropdown
9
+ Набор компонентов для создания выпадающих списков.
10
+
11
+ <Description name="Dropdown" />
12
+ <PropsTable name="Dropdown" exclude={['css']} />
13
+
14
+ # DropdownItem
15
+
16
+ <Description name="DropdownItem" />
17
+ <PropsTable name="DropdownItem" exclude={['css']} />
18
+
19
+ ## Использование
20
+
21
+ ```tsx live
22
+ import React, { useState } from 'react';
23
+ import { Dropdown, DropdownItem } from '@salutejs/{{ package }}';
24
+ import { surfaceSolidSecondary } from '@salutejs/{{ theme }}';
25
+
26
+ export function App() {
27
+ const [selected, setSelected] = useState('');
28
+ const [isOpen, setIsOpen] = useState(false);
29
+
30
+ const handleSelect = (value: string, text: string) => {
31
+ setSelected(value);
32
+ setIsOpen(false);
33
+ };
34
+
35
+ const getDropdownItems = (slug: string, elemCount: number) =>
36
+ [...Array(elemCount).keys()].map((num) => ({
37
+ value: `${slug}_${num}`,
38
+ child: `${slug} ${num}`,
39
+ }));
40
+
41
+ return (
42
+ <div style=\{{height: "400px", background: surfaceSolidSecondary, padding: "1rem" }}>
43
+ <Dropdown
44
+ target={<Button>Target</Button>}
45
+ isOpen={isOpen}
46
+ onToggle={() => {
47
+ setIsOpen(!isOpen);
48
+ }}
49
+ offset={[10, 15]}
50
+ view="primary"
51
+ size="m"
52
+ placement="right"
53
+ trigger="click"
54
+ closeOnOverlayClick={false}
55
+ closeOnEsc
56
+ isFocusTrapped
57
+ >
58
+ {getDropdownItems('item', 6).map((item) => (
59
+ <DropdownItem
60
+ key={item.value}
61
+ isSelected={Boolean(item.value === selected)}
62
+ onSelect={() => handleSelect(item.value, item.child)}
63
+ value={item.value}
64
+ >
65
+ {item.child}
66
+ </DropdownItem>
67
+ ))}
68
+ <DropdownItem
69
+ isSelected={selected === 'disabled'}
70
+ onSelect={() => handleSelect('disabled', 'disabled')}
71
+ value="disabled"
72
+ disabled
73
+ >
74
+ disabled
75
+ </DropdownItem>
76
+ </Dropdown>
77
+ </div>
78
+ );
79
+ }
80
+ ```