startup-ui 0.11.3 → 1.0.0

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 (123) hide show
  1. package/AGENTS.md +18 -0
  2. package/CHANGELOG.md +39 -0
  3. package/CLAUDE.md +1 -0
  4. package/LICENSE +21 -0
  5. package/README.md +54 -0
  6. package/dist/defaults.css +83 -0
  7. package/dist/index.css +1 -1
  8. package/dist/startup-ui.cjs.js +28 -587
  9. package/dist/startup-ui.cjs.js.map +1 -1
  10. package/dist/startup-ui.es.js +4555 -7451
  11. package/dist/startup-ui.es.js.map +1 -1
  12. package/dist/types/components/SActionIcon.d.ts +2 -1
  13. package/dist/types/components/SActionIcon.d.ts.map +1 -1
  14. package/dist/types/components/SCanvas.d.ts +0 -1
  15. package/dist/types/components/SCanvas.d.ts.map +1 -1
  16. package/dist/types/components/SCheckbox.d.ts.map +1 -1
  17. package/dist/types/components/SCheckboxGroup.d.ts +4 -0
  18. package/dist/types/components/SCheckboxGroup.d.ts.map +1 -1
  19. package/dist/types/components/SColumnSettings.d.ts +4 -4
  20. package/dist/types/components/SColumnSettings.d.ts.map +1 -1
  21. package/dist/types/components/SConfirm/SConfirm.d.ts +2 -0
  22. package/dist/types/components/SConfirm/SConfirm.d.ts.map +1 -1
  23. package/dist/types/components/SCopyText.d.ts.map +1 -1
  24. package/dist/types/components/SDatePicker.d.ts +3 -4
  25. package/dist/types/components/SDatePicker.d.ts.map +1 -1
  26. package/dist/types/components/SDialog.d.ts.map +1 -1
  27. package/dist/types/components/SFilterGroup.d.ts +3 -3
  28. package/dist/types/components/SFilterGroup.d.ts.map +1 -1
  29. package/dist/types/components/SFooter.d.ts.map +1 -1
  30. package/dist/types/components/SForm.d.ts.map +1 -1
  31. package/dist/types/components/SFormRow.d.ts.map +1 -1
  32. package/dist/types/components/SHtmlEditor.d.ts +20 -0
  33. package/dist/types/components/SHtmlEditor.d.ts.map +1 -1
  34. package/dist/types/components/SImagePreview.d.ts.map +1 -1
  35. package/dist/types/components/SInput.d.ts +9 -2
  36. package/dist/types/components/SInput.d.ts.map +1 -1
  37. package/dist/types/components/SMenu.d.ts +39 -0
  38. package/dist/types/components/SMenu.d.ts.map +1 -0
  39. package/dist/types/components/SNote.d.ts.map +1 -1
  40. package/dist/types/components/SPagination.d.ts.map +1 -1
  41. package/dist/types/components/SProgressbar.d.ts.map +1 -1
  42. package/dist/types/components/SRadio.d.ts.map +1 -1
  43. package/dist/types/components/SRadioGroup.d.ts +4 -0
  44. package/dist/types/components/SRadioGroup.d.ts.map +1 -1
  45. package/dist/types/components/SSelect.d.ts +6 -0
  46. package/dist/types/components/SSelect.d.ts.map +1 -1
  47. package/dist/types/components/SStatus.d.ts.map +1 -1
  48. package/dist/types/components/STable.d.ts +4 -4
  49. package/dist/types/components/STable.d.ts.map +1 -1
  50. package/dist/types/components/SToggle.d.ts.map +1 -1
  51. package/dist/types/components/STooltip.d.ts +0 -1
  52. package/dist/types/components/STooltip.d.ts.map +1 -1
  53. package/dist/types/components/STree.d.ts +11 -5
  54. package/dist/types/components/STree.d.ts.map +1 -1
  55. package/dist/types/components/SUpload.d.ts +5 -4
  56. package/dist/types/components/SUpload.d.ts.map +1 -1
  57. package/dist/types/components/SVerticalMenu.d.ts.map +1 -1
  58. package/dist/types/components/htmlEditor/contentStyle.d.ts +9 -0
  59. package/dist/types/components/htmlEditor/contentStyle.d.ts.map +1 -0
  60. package/dist/types/components/icons.d.ts +24 -0
  61. package/dist/types/components/icons.d.ts.map +1 -0
  62. package/dist/types/config.d.ts +49 -0
  63. package/dist/types/config.d.ts.map +1 -0
  64. package/dist/types/global-components.d.ts +3 -6
  65. package/dist/types/global-components.d.ts.map +1 -1
  66. package/dist/types/index.d.ts +12 -2
  67. package/dist/types/index.d.ts.map +1 -1
  68. package/dist/types/locale/index.d.ts +49 -0
  69. package/dist/types/locale/index.d.ts.map +1 -0
  70. package/dist/types/locale/messages/en-US.d.ts +4 -0
  71. package/dist/types/locale/messages/en-US.d.ts.map +1 -0
  72. package/dist/types/locale/messages/en.d.ts +4 -0
  73. package/dist/types/locale/messages/en.d.ts.map +1 -0
  74. package/dist/types/locale/messages/ru.d.ts +4 -0
  75. package/dist/types/locale/messages/ru.d.ts.map +1 -0
  76. package/dist/types/locale/types.d.ts +74 -0
  77. package/dist/types/locale/types.d.ts.map +1 -0
  78. package/dist/types/plugin.d.ts +2 -1
  79. package/dist/types/plugin.d.ts.map +1 -1
  80. package/dist/types/utils/deepMerge.d.ts +9 -0
  81. package/dist/types/utils/deepMerge.d.ts.map +1 -0
  82. package/dist/types/utils/options.d.ts +25 -0
  83. package/dist/types/utils/options.d.ts.map +1 -0
  84. package/llms/components/data/sfilter.md +194 -0
  85. package/llms/components/data/spagination.md +114 -0
  86. package/llms/components/data/stable.md +638 -0
  87. package/llms/components/data/stree.md +213 -0
  88. package/llms/components/forms/scheckbox.md +139 -0
  89. package/llms/components/forms/sdatepicker.md +161 -0
  90. package/llms/components/forms/sform.md +240 -0
  91. package/llms/components/forms/shtmleditor.md +143 -0
  92. package/llms/components/forms/sinput.md +165 -0
  93. package/llms/components/forms/sradio.md +164 -0
  94. package/llms/components/forms/sselect.md +149 -0
  95. package/llms/components/forms/sswitch.md +69 -0
  96. package/llms/components/forms/supload.md +189 -0
  97. package/llms/components/interfaces/sactionbar.md +40 -0
  98. package/llms/components/interfaces/sactionicon.md +126 -0
  99. package/llms/components/interfaces/salert.md +87 -0
  100. package/llms/components/interfaces/sbutton.md +167 -0
  101. package/llms/components/interfaces/scolumnsettings.md +204 -0
  102. package/llms/components/interfaces/sconfirm.md +57 -0
  103. package/llms/components/interfaces/scopytext.md +67 -0
  104. package/llms/components/interfaces/sdashboard.md +130 -0
  105. package/llms/components/interfaces/sdialog.md +158 -0
  106. package/llms/components/interfaces/simagepreview.md +98 -0
  107. package/llms/components/interfaces/snote.md +64 -0
  108. package/llms/components/interfaces/sprogressbar.md +48 -0
  109. package/llms/components/interfaces/sstat.md +79 -0
  110. package/llms/components/interfaces/sstatus.md +76 -0
  111. package/llms/components/interfaces/stag.md +70 -0
  112. package/llms/components/interfaces/stimeline.md +47 -0
  113. package/llms/components/interfaces/stoggle.md +120 -0
  114. package/llms/components/interfaces/stooltip.md +88 -0
  115. package/llms/components/template/scanvas.md +61 -0
  116. package/llms/components/template/smenu.md +88 -0
  117. package/llms/components/template/sverticalmenu.md +113 -0
  118. package/llms/llms.txt +49 -0
  119. package/package.json +56 -21
  120. package/dist/types/components/SDropdownMenu.d.ts +0 -39
  121. package/dist/types/components/SDropdownMenu.d.ts.map +0 -1
  122. package/dist/types/components/SHorizontalMenu.d.ts +0 -33
  123. package/dist/types/components/SHorizontalMenu.d.ts.map +0 -1
@@ -0,0 +1,213 @@
1
+ # STree
2
+
3
+ Дерево элементов.
4
+
5
+ <SToggleGroup>
6
+ <SToggle title="Что будет ценно улучшить?">
7
+ <ol>
8
+ <li>Если сейчас перетаскивать элементы, но ничего не делать по drop-событию, то они не перетаскиваются.</li>
9
+ </ol>
10
+ </SToggle>
11
+ </SToggleGroup>
12
+
13
+ ## Базовый пример
14
+
15
+ ```vue
16
+ <template>
17
+ <STree :data="pages" />
18
+ </template>
19
+ <script setup>
20
+ const pages = [
21
+ { id: 1, label: 'Главная' },
22
+ { id: 2, label: 'Каталог', children: [
23
+ { id: 3, label: 'Электроника' },
24
+ { id: 4, label: 'Одежда' },
25
+ ] },
26
+ { id: 5, label: 'Контакты' },
27
+ ]
28
+ </script>
29
+ ```
30
+
31
+ Где `pages` — это массив вида: `[{id, label, children: [...]}, ...]`
32
+
33
+ ## Выбор элемента
34
+
35
+ Для возможности выбора элемента добавляем атрибут <strong>selectable</strong>
36
+
37
+ ```vue
38
+ <template>
39
+ <STree :data="pages" selectable v-model="value" />
40
+ <p>В модель подставляется ID. Текущее значение: <code>{{ value ?? 'null' }}</code></p>
41
+ </template>
42
+ <script setup>
43
+ import { ref } from 'vue'
44
+ const value = ref(null)
45
+ const pages = [
46
+ { id: 1, label: 'Главная' },
47
+ { id: 2, label: 'Каталог', children: [
48
+ { id: 3, label: 'Электроника' },
49
+ { id: 4, label: 'Одежда' },
50
+ ] },
51
+ { id: 5, label: 'Контакты' },
52
+ ]
53
+ </script>
54
+ ```
55
+
56
+ Также изменения можно отслеживать с помощью change-события:
57
+
58
+ ```vue
59
+ <template>
60
+ <STree :data="pages" selectable @change="(node) => console.log(node)" />
61
+ </template>
62
+ <script setup>
63
+ const pages = [
64
+ { id: 1, label: 'Главная' },
65
+ { id: 2, label: 'Каталог' },
66
+ { id: 5, label: 'Контакты' },
67
+ ]
68
+ </script>
69
+ ```
70
+
71
+ ## Кастомный шаблон элемента
72
+
73
+ ```vue
74
+ <template>
75
+ <STree :data="pages">
76
+ <template #node="{ node }">
77
+ <FontAwesomeIcon :icon="node.icon" v-if="node.icon" /> {{ node.label }}
78
+ </template>
79
+ </STree>
80
+ </template>
81
+ <script setup>
82
+ const pages = [
83
+ { id: 1, label: 'Главная', icon: 'house' },
84
+ { id: 2, label: 'Каталог', icon: 'folder' },
85
+ { id: 5, label: 'Контакты', icon: 'envelope' },
86
+ ]
87
+ </script>
88
+ ```
89
+
90
+ ## Раскрытые корневые элементы
91
+
92
+ Набор раскрытых корневых элементов передаём с помощью атрибута <strong>expanded-keys</strong>
93
+
94
+ ```vue
95
+ <template>
96
+ <STree :data="pages" :expanded-keys="[2]" />
97
+ </template>
98
+ <script setup>
99
+ const pages = [
100
+ { id: 1, label: 'Главная' },
101
+ { id: 2, label: 'Каталог', children: [
102
+ { id: 3, label: 'Электроника' },
103
+ { id: 4, label: 'Одежда' },
104
+ ] },
105
+ { id: 5, label: 'Контакты' },
106
+ ]
107
+ </script>
108
+ ```
109
+
110
+ ## Перетаскивание элементов
111
+
112
+ Для поддержки перетаскивания элементов добавляем атрибут <strong>draggable</strong>
113
+
114
+ ```vue
115
+ <template>
116
+ <STree :data="pages" draggable @drop="onDrop" />
117
+ </template>
118
+ <script setup>
119
+ const pages = [
120
+ { id: 1, label: 'Главная' },
121
+ { id: 2, label: 'Каталог', children: [
122
+ { id: 3, label: 'Электроника' },
123
+ { id: 4, label: 'Одежда' },
124
+ ] },
125
+ { id: 5, label: 'Контакты' },
126
+ ]
127
+
128
+ function onDrop(targetNode, event, dropType) {
129
+ console.log('Dropped on:', targetNode.label, 'Type:', dropType)
130
+ // Your node-reordering logic on the pages array goes here
131
+ }
132
+ </script>
133
+ ```
134
+
135
+ При этом выполняются события:
136
+
137
+ <ul>
138
+ <li><strong>dragstart(node, event)</strong> — при начале перетаскивания;</li>
139
+ <li><strong>drop(targetNode, event, dropType)</strong> — при заверешнии перетаскивания.</li>
140
+ </ul>
141
+
142
+ ## Чек-боксы
143
+
144
+ Для поддержки чек-боксов у элементов добавляем атрибут <strong>checkboxes</strong>
145
+
146
+ ```vue
147
+ <template>
148
+ <STree v-model="selectedPageIds" :data="pages" checkboxes />
149
+ <p>Выбрано: <code>{{ selectedPageIds }}</code></p>
150
+ </template>
151
+ <script setup>
152
+ import { ref } from 'vue'
153
+ const selectedPageIds = ref([])
154
+ const pages = [
155
+ { id: 1, label: 'Главная' },
156
+ { id: 2, label: 'Каталог', children: [
157
+ { id: 3, label: 'Электроника' },
158
+ { id: 4, label: 'Одежда' },
159
+ ] },
160
+ { id: 5, label: 'Контакты' },
161
+ ]
162
+ </script>
163
+ ```
164
+
165
+ Если нужно, чтобы при выборе чек-бокса автоматически выбирались чек-боксы вложенных элементов, добавьте атрибут **select-with-children**:
166
+
167
+ ```vue
168
+ <template>
169
+ <STree v-model="selectedPageIds" :data="pages" checkboxes select-with-children />
170
+ <p>Выбрано: <code>{{ selectedPageIds }}</code></p>
171
+ </template>
172
+ <script setup>
173
+ import { ref } from 'vue'
174
+ const selectedPageIds = ref([])
175
+ const pages = [
176
+ { id: 1, label: 'Главная' },
177
+ { id: 2, label: 'Каталог', children: [
178
+ { id: 3, label: 'Электроника' },
179
+ { id: 4, label: 'Одежда' },
180
+ ] },
181
+ { id: 5, label: 'Контакты' },
182
+ ]
183
+ </script>
184
+ ```
185
+
186
+ ## Интерфейс компонента
187
+
188
+ ### Свойства (Props)
189
+
190
+ | Название | Тип | По умолчанию | Описание |
191
+ |----------|-----|--------------|----------|
192
+ | data | `STreeNode[]` | - | Массив данных дерева. |
193
+ | expandedKeys | `(string \| number)[]` | `[]` | Список ID раскрытых узлов. |
194
+ | draggable | boolean | `false` | Разрешить перетаскивание узлов. |
195
+ | selectable | boolean | `false` | Разрешить выбор одного узла (через клик). |
196
+ | checkboxes | boolean | `false` | Отображать чекбоксы для множественного выбора. |
197
+ | selectWithChildren | boolean | `false` | При выборе родителя выбирать всех его детей. |
198
+ | storeExpandedKeysTo | string | - | Ключ в `localStorage` для сохранения состояния раскрытых узлов. |
199
+ | bordered | boolean | `false` | Добавить границы вокруг ячеек. |
200
+
201
+ ### События (Events)
202
+
203
+ | Название | Параметры | Описание |
204
+ |----------|-----------|----------|
205
+ | dragstart | `(node: STreeNode, event: DragEvent)` | Вызывается при начале перетаскивания узла. |
206
+ | drop | `(targetNode: STreeNode, event: DragEvent, dropType: string \| undefined)` | Вызывается при завершении перетаскивания. |
207
+ | change | `(node: STreeNode)` | Вызывается при смене выбранного узла (если `selectable`). |
208
+
209
+ ### Слоты (Slots)
210
+
211
+ | Название | Параметры | Описание |
212
+ |----------|-----------|----------|
213
+ | node | `{ node: STreeNode }` | Кастомный шаблон для содержимого узла дерева. |
@@ -0,0 +1,139 @@
1
+ # SCheckboxGroup > SCheckbox
2
+
3
+ Одиночная галочка или набор галочек.
4
+
5
+ <SToggleGroup>
6
+ <SToggle title="В чем отличие от аналогов?">
7
+ <p>В отличие от популярных библиотек компонентов для Vue3:</p>
8
+ <ol>
9
+ <li>Сразу идет с кликабельным стандартизированным лейблом в качестве простого атрибута. Это унифицирует код и внешний вид компонентов, упрощается поддержка и взаимозаменяемость.</li>
10
+ <li>Поддерживает три формата передачи опций в группы чекбоксов, что удобно в зависимости от кейса:
11
+ <ol>
12
+ <li><code>&lt;SCheckbox /&gt;</code> — там где опции являются частью дизайна, их можно и удобно хардкодить в шаблон;</li>
13
+ <li><code>{value1: title1, value2: title2}</code> — что удобно для быстрого получения из key-value конфигов, а также из моделей — <code>User::pluck('name', 'id')</code>;</li>
14
+ <li><code>[[value1, title1], [value2, title2]]</code> — что удобно для выгрузки там, где важен порядок. Это минимизирует код в контроллерах, помогая сохранять принцип «тонкого контроллера», которого мы придерживаемся.</li>
15
+ </ol>
16
+ </li>
17
+ <li>Взаимозаменяемость формата опций с другими выбиралками из вариантов. Это позволяет легко заменять SCheckboxGroup на <a href="/pages/components/forms/sselect.html">SSelect</a> или <a href="/pages/components/forms/sradio.html">SRadioGroup</a>, не трогая бэкенд код.</li>
18
+ </ol>
19
+ </SToggle>
20
+ </SToggleGroup>
21
+
22
+ ## Одиночная галочка
23
+
24
+ ```vue
25
+ <template>
26
+ <SCheckbox v-model="isAccepted">Я согласен</SCheckbox>
27
+ </template>
28
+ <script setup>
29
+ import { ref } from 'vue'
30
+ const isAccepted = ref(false)
31
+ </script>
32
+ ```
33
+
34
+ Модель принимает значение true/false.
35
+
36
+ ## Группа галочек
37
+
38
+ ```vue
39
+ <template>
40
+ <SCheckboxGroup v-model="types">
41
+ <SCheckbox value="bug">Ошибка</SCheckbox>
42
+ <SCheckbox value="question">Вопрос</SCheckbox>
43
+ <SCheckbox value="idea">Идея</SCheckbox>
44
+ </SCheckboxGroup>
45
+ <p>В модели будет храниться массив выбранных значений: <code>{{ types }}</code></p>
46
+ </template>
47
+ <script setup>
48
+ import { ref } from 'vue'
49
+ const types = ref([])
50
+ </script>
51
+ ```
52
+
53
+ ## Динамический набор значений
54
+
55
+ В предыдущем примере набор вариантов хардкодился в шаблоне, что удобно, когда набор значений относится к логическому уровню интерфейса. Но когда набор вариантов идет из базы данных или конфига, очень неудобно каждый раз формировать набор элементов через v-for, и вместо этого используем атрибут `options`.
56
+
57
+ ```vue
58
+ <template>
59
+ <SCheckboxGroup v-model="users" :options="userOptions" />
60
+ </template>
61
+ <script setup>
62
+ import { ref } from 'vue'
63
+ const users = ref([])
64
+ const userOptions = { 1: 'Иванов', 2: 'Петров', 3: 'Сидоров' }
65
+ </script>
66
+ ```
67
+
68
+ Где options — это объект вариантов выбора в формате <code>{value1: title1, value2: title2}</code> или массив в формате <code>[[value1, title1], [value2, title2]]</code>
69
+
70
+ ## Вертикальный список галочек
71
+
72
+ Чтобы выводить группу галочек вертикальным списком, добавляем атрибут `vertical`:
73
+
74
+ ```vue
75
+ <template>
76
+ <SCheckboxGroup v-model="users" :options="userOptions" vertical />
77
+ </template>
78
+ <script setup>
79
+ import { ref } from 'vue'
80
+ const users = ref([])
81
+ const userOptions = { 1: 'Иванов', 2: 'Петров', 3: 'Сидоров' }
82
+ </script>
83
+ ```
84
+
85
+ ## Недоступное значение
86
+
87
+ Добавляем атрибут `disabled` значению, которое должно быть недоступно для переключения.
88
+
89
+ ```vue
90
+ <template>
91
+ <SCheckboxGroup v-model="types">
92
+ <SCheckbox value="bug" disabled>Ошибка</SCheckbox>
93
+ <SCheckbox value="question">Вопрос</SCheckbox>
94
+ <SCheckbox value="idea">Идея</SCheckbox>
95
+ </SCheckboxGroup>
96
+ </template>
97
+ <script setup>
98
+ import { ref } from 'vue'
99
+ const types = ref([])
100
+ </script>
101
+ ```
102
+
103
+ ## Интерфейс компонента SCheckboxGroup
104
+
105
+ ### Свойства (Props)
106
+
107
+ | Название | Тип | По умолчанию | Описание |
108
+ |----------|-----|--------------|----------|
109
+ | v-model | `any[]` | `[]` | Массив выбранных значений. |
110
+ | options | Record \| Array | `{}` | Список вариантов (объект или массив пар). |
111
+ | vertical | boolean | `false` | Расположение элементов в колонку. |
112
+
113
+ ### Слоты (Slots)
114
+
115
+ | Название | Описание |
116
+ |----------|----------|
117
+ | default | Содержимое группы (обычно компоненты `SCheckbox`). |
118
+
119
+ ## Интерфейс компонента SCheckbox
120
+
121
+ ### Свойства (Props)
122
+
123
+ | Название | Тип | По умолчанию | Описание |
124
+ |----------|-----|--------------|----------|
125
+ | v-model | any | - | Значение (для одиночного использования). |
126
+ | value | any | `undefined` | Значение элемента (для использования в группе). |
127
+ | disabled | boolean | `false` | Отключает возможность выбора. |
128
+
129
+ ### Слоты (Slots)
130
+
131
+ | Название | Описание |
132
+ |----------|----------|
133
+ | default | Текст лейбла рядом с галочкой. |
134
+
135
+ ### События (Events)
136
+
137
+ | Название | Параметры | Описание |
138
+ |----------|-----------|----------|
139
+ | change | `(value: any)` | Вызывается при изменении состояния. |
@@ -0,0 +1,161 @@
1
+ # SDatePicker
2
+
3
+ Поле выбора даты.
4
+
5
+ <SToggleGroup>
6
+ <SToggle title="В чем отличие от аналогов?">
7
+ <p>В отличие от популярных библиотек компонентов для Vue3:</p>
8
+ <ol>
9
+ <li>Сразу поддерживает на уровне атрибута <a href="#выбор-вариантов-кнопками">кнопки с готовыми наборами значений</a>, которые часто нужны в фильтрах по диапазону дат.</li>
10
+ <li>Сразу из коробки по дефолту заточено под русскоязычную локализацию.</li>
11
+ <li>В отличие от западных библиотек — позволяет выбирать диапазон дат, начиная с более поздней даты. Удобно, когда нужно выбрать несколько последних месяцев.</li>
12
+ </ol>
13
+ </SToggle>
14
+ </SToggleGroup>
15
+
16
+ ## Стандартный пример
17
+
18
+ ```vue
19
+ <template>
20
+ <SDatePicker v-model="value" />
21
+ <p>Текущее значение: <code>{{ value ?? 'null' }}</code></p>
22
+ </template>
23
+
24
+ <script setup>
25
+ import { ref } from 'vue'
26
+
27
+ const value = ref(null)
28
+ </script>
29
+ ```
30
+
31
+ Выбирает значение в формате `YYYY-MM-DD`.
32
+
33
+ ## Минимальное и максимальное значения
34
+
35
+ ```vue
36
+ <template>
37
+ <SDatePicker v-model="value" :min="minDate" :max="maxDate" />
38
+ </template>
39
+
40
+ <script setup>
41
+ import { ref } from 'vue'
42
+
43
+ const value = ref(null)
44
+ const minDate = '2026-06-01'
45
+ const maxDate = '2026-06-30'
46
+ </script>
47
+ ```
48
+
49
+ ## Кастомный формат значения
50
+
51
+ ```vue
52
+ <template>
53
+ <SDatePicker v-model="value" value-format="YYYYMMDD" />
54
+ <p>Текущее значение: <code>{{ value ?? 'null' }}</code></p>
55
+ </template>
56
+ <script setup>
57
+ import { ref } from 'vue'
58
+ const value = ref(null)
59
+ </script>
60
+ ```
61
+
62
+ Независимо от этого атрибуты min/max всегда идут в своём стандартном формате `YYYY-MM-DD`.
63
+
64
+ ## Выбор периода
65
+
66
+ Для выбора периода добавляем атрибут `range`:
67
+
68
+ ```vue
69
+ <template>
70
+ <SDatePicker range v-model="value" value-format="YYYYMMDD" />
71
+ <p>Текущее значение: <code>{{ value ?? 'null' }}</code></p>
72
+ </template>
73
+ <script setup>
74
+ import { ref } from 'vue'
75
+ const value = ref(null)
76
+ </script>
77
+ ```
78
+
79
+ В модель подставляется массив из двух дат в формате, указанном в `value-format`.
80
+
81
+ ## Выбор вариантов кнопками
82
+
83
+ Очень часто в фильтрах по диапазону дат удобно использовать однокликовый выбор предзаданного диапазона. Набор таких диапазонов мы устанавливаем через атрибут `buttons`.
84
+
85
+ ```vue
86
+ <template>
87
+ <SDatePicker range v-model="value" value-format="YYYYMMDD" :buttons="buttons" />
88
+ </template>
89
+ <script setup>
90
+ import { ref } from 'vue'
91
+ const value = ref(null)
92
+ const buttons = {
93
+ '2 недели': '20250901-20250914',
94
+ 'Месяц': '20250815-20250914',
95
+ }
96
+ </script>
97
+ ```
98
+
99
+ Набор доступных кнопок задается в формате <code>{title: value.join('-')}</code>, например: <code>{"2 недели": "20250901-20250914", "Месяц": "20250815-20250914"}</code>
100
+
101
+ Именно в этом формате backend-класс DateInterval возвращает набор доступных кнопок: `(new DateInterval(request()->period))->titles`
102
+
103
+ ## Выбор времени
104
+
105
+ Чтобы выбирать время, добавляем атрибут `with-time`. При этом, выходное значение будет в формате <strong>2025-12-22 12:27</strong>:
106
+
107
+ ```vue
108
+ <template>
109
+ <SDatePicker with-time v-model="value" value-format="YYYYMMDD HH:mm" />
110
+ </template>
111
+ <script setup>
112
+ import { ref } from 'vue'
113
+ const value = ref(null)
114
+ </script>
115
+ ```
116
+
117
+ Часы и минуты — это `SSelect` с фильтрацией, поэтому значение можно как выбрать мышью, так и набрать с клавиатуры. В локалях с 12-часовым форматом (например `en-US`) вместо часов 0–23 показываются часы 1–12 и переключатель AM/PM.
118
+
119
+ ## Очистка значения
120
+
121
+ Атрибут `clearable` добавляет кнопку очистки (×), которая появляется, когда значение выбрано:
122
+
123
+ ```vue
124
+ <template>
125
+ <SDatePicker clearable v-model="value" />
126
+ <p>Текущее значение: <code>{{ value ?? 'null' }}</code></p>
127
+ </template>
128
+ <script setup>
129
+ import { ref } from 'vue'
130
+ const value = ref('2026-06-18')
131
+ </script>
132
+ ```
133
+
134
+ ## Интерфейс компонента
135
+
136
+ ### Свойства (Props)
137
+
138
+ | Название | Тип | По умолчанию | Описание |
139
+ |----------|-----|--------------|----------|
140
+ | v-model | `string \| string[]` | `null` | Выбранное значение (строка для одиночного выбора, массив для диапазона). |
141
+ | range | `boolean` | `false` | Режим выбора периода (диапазона дат). |
142
+ | value-format | `string` | `'YYYY-MM-DD'` | Формат значения в модели. Если `with-time` включен, по умолчанию `'YYYY-MM-DD HH:mm'`. |
143
+ | input-format | `string` | `'DD.MM.YYYY'` | Формат отображения даты в текстовом поле. |
144
+ | min | `string` | `undefined` | Минимально допустимая дата (в формате `YYYY-MM-DD`). |
145
+ | max | `string` | `undefined` | Максимально допустимая дата (в формате `YYYY-MM-DD`). |
146
+ | number-of-months | `number` | `1 \| 2` | Количество отображаемых месяцев в календаре (по умолчанию 2 для `range`, иначе 1). |
147
+ | buttons | `Record<string, string>` | `undefined` | Набор кнопок быстрого выбора диапазона (`{ название: 'date1-date2' }`). |
148
+ | with-time | `boolean` | `false` | Позволяет выбирать время (часы и минуты). Только для одиночного выбора. |
149
+ | clearable | `boolean` | `false` | Показывает кнопку очистки (×), когда значение выбрано. |
150
+ | first-day | `number` | (из локали) | Первый день недели: `0` — воскресенье, `1` — понедельник. |
151
+ | icon | `string \| string[]` | `undefined` | Необязательная FontAwesome-иконка календаря (например `['far', 'calendar']`). По умолчанию используется встроенная SVG-иконка — компонент не требует FontAwesome. |
152
+
153
+ Названия дней недели и месяцев, а также 12/24-часовой формат времени больше не задаются атрибутами per-instance — они берутся из активной локали и переопределяются глобально через параметры локализации (`configureStartupUi`). Подробнее — в разделе [Локализация](/pages/welcome/basics/localization).
154
+
155
+ Иконки (календарь и стрелки переключения месяца) — встроенные SVG, поэтому FontAwesome для `SDatePicker` не обязателен. Дни соседних месяцев в сетке кликабельны. Поддерживается управление с клавиатуры: в фокусе стрелка вниз открывает календарь, стрелки двигают маркер по датам, Enter фиксирует выбор, Esc закрывает.
156
+
157
+ <style lang="scss" scoped>
158
+ .s-datepicker {
159
+ color: var(--s-text);
160
+ }
161
+ </style>