startup-ui 0.12.0 → 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 +33 -586
  9. package/dist/startup-ui.cjs.js.map +1 -1
  10. package/dist/startup-ui.es.js +7109 -8839
  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 +37 -4
  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,240 @@
1
+ # SForm > SFormRow
2
+
3
+ SForm и SFormRow позволяют быстро собирать функциональные формы.
4
+
5
+ <SToggleGroup>
6
+ <SToggle title="В чем отличие от аналогов?">
7
+ <p>В отличие от популярных библиотек компонентов для Vue3:</p>
8
+ <ol>
9
+ <li>Унифицирует и упрощает вспомогательные элементы (напр. подсказки под полями) и часто используемые состояния (напр. заголовки слева) до простых атрибутов. Это обеспечивает одинаковую реализацию разными программистами, избавляет от визуальных отличий, упрощает дальнейшую поддержку и сохраняет взаимозаменяемость между проектами.</li>
10
+ <li>Сразу из коробки связывает форму с InertiaJS-формами и/или Laravel FormRequest-ами, одинаково и аккуратно выводя ошибки валидации</li>
11
+ <li>Минимизируют синтаксис и связанность до одной модели на уровне SForm, что делает код чище, упрощает его написание, чтение и поддержку.</li>
12
+ </ol>
13
+ </SToggle>
14
+ <SToggle title="Что будет ценно улучшить">
15
+ <ol>
16
+ <li>Сразу привязывать лейблы правильным образом к соответствующим input-полям, что обеспечит поддержку <a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA" target="_blank">ARIA</a> — это будет ценно для проектов на европейский рынок, т.к. там это требование законодательства.</li>
17
+ </ol>
18
+ </SToggle>
19
+ </SToggleGroup>
20
+
21
+ ## С формой InertiaJS
22
+
23
+ InertiaJS предлагает [useForm-компонент](https://inertiajs.com/docs/v2/data-props/remembering-state#form-helper), который мы используем по дефолту для всех форм.
24
+
25
+ ```vue
26
+ <template>
27
+ <SForm v-model="form" method="post" action="/users/login">
28
+ <SFormRow title="Логин" name="login">
29
+ <SInput />
30
+ </SFormRow>
31
+ <SFormRow title="Пароль" name="password">
32
+ <SInput type="password" />
33
+ </SFormRow>
34
+ <SButton>Войти</SButton>
35
+ </SForm>
36
+ </template>
37
+
38
+ <script setup>
39
+ import { useForm } from '@inertiajs/vue3';
40
+ import { SForm, SFormRow, SInput, SButton } from 'startup-ui';
41
+
42
+ const form = useForm({
43
+ login: '',
44
+ password: '',
45
+ });
46
+ </script>
47
+ ```
48
+
49
+ Для компонентов внутри `<SFormRow />` не нужно отдельно прописывать модель — она автоматически берется из модели `<SForm />` по имени.
50
+
51
+ Аналогично не нужно как-то обрабатывать loading-состояние и отдельно выводить ошибки валидации — при необходимости этот функционал уже реализован в форме.
52
+
53
+ ## С собственным submit-методом
54
+
55
+ Если по какой-то причине нам нужно вместо атрибутов `method`/`action` задать собственный `submit`-метод, сделать это можно следующим образом:
56
+
57
+ ```vue
58
+ <template>
59
+ <SForm v-model="form" @submit="submit" :errors="errors" :loading="isLoading">
60
+ <SFormRow title="Логин" name="login">
61
+ <SInput />
62
+ </SFormRow>
63
+ <SFormRow title="Пароль" name="password">
64
+ <SInput type="password" />
65
+ </SFormRow>
66
+ <SButton>Войти</SButton>
67
+ </SForm>
68
+ </template>
69
+ <script setup>
70
+ import { ref } from 'vue'
71
+ const isLoading = ref(false)
72
+ const errors = ref({})
73
+ const form = ref({ login: '', password: '' })
74
+
75
+ function submit() {
76
+ isLoading.value = true
77
+ // Your request logic here
78
+ setTimeout(() => (isLoading.value = false), 1500)
79
+ }
80
+ </script>
81
+ ```
82
+
83
+ Так как мы используем собственный метод, то для показа состояния загрузки формы может понадобиться задавать свой набор ошибок `errors`, а также loading-состояние, которое показывает, находится ли сейчас форма в процессе отправки (чтобы избежать повторной отправки по ошибке)
84
+
85
+ ## Подсказки под полями
86
+
87
+ Если под полем нужно выводить подсказку, это делается в `<SFormRow>`:
88
+
89
+ ```vue
90
+ <template>
91
+ <SForm v-model="form">
92
+ <SFormRow title="Логин" name="login" hint="Имя пользователя или email">
93
+ <SInput />
94
+ </SFormRow>
95
+ <SFormRow title="Пароль" name="password">
96
+ <SInput type="password" />
97
+ </SFormRow>
98
+ <SButton>Войти</SButton>
99
+ </SForm>
100
+ </template>
101
+ <script setup>
102
+ import { ref } from 'vue'
103
+ const form = ref({ login: '', password: '' })
104
+ </script>
105
+ ```
106
+
107
+ ## Заголовки слева
108
+
109
+ По умолчанию заголовки выводятся над полями формы, но иногда бывает нужно показать их слева от полей. Сделать это можно с помощью пропса `titles-at-left`. Ширину этих полей можно задать через `titles-width`.
110
+
111
+ ```vue
112
+ <template>
113
+ <SForm v-model="form" titles-at-left :titles-width="80">
114
+ <SFormRow title="Логин" name="login" hint="Имя пользователя или email">
115
+ <SInput />
116
+ </SFormRow>
117
+ <SFormRow title="Пароль" name="password">
118
+ <SInput type="password" />
119
+ </SFormRow>
120
+ <SButton>Войти</SButton>
121
+ </SForm>
122
+ </template>
123
+ <script setup>
124
+ import { ref } from 'vue'
125
+ const form = ref({ login: '', password: '' })
126
+ </script>
127
+ ```
128
+
129
+ ## Установка моделей инпутов напрямую
130
+
131
+ По дефолту `<SFormRow />` привязывает модели вложенных компонентов к соответствующему полю из модели `<SForm />`. Но это делается исключительно для удобства и не является обязательным. Иногда, когда нужно задать модели вручную это возможно сделать напрямую:
132
+
133
+ ```vue
134
+ <template>
135
+ <SForm v-model="form">
136
+ <SFormRow>
137
+ <SSwitch v-model="form.hasAgreement">Согласен с правилами</SSwitch>
138
+ <SSwitch v-model="form.hasNotifications">Согласен получать оповещения</SSwitch>
139
+ </SFormRow>
140
+ </SForm>
141
+ </template>
142
+ <script setup>
143
+ import { ref } from 'vue'
144
+ const form = ref({ hasAgreement: false, hasNotifications: false })
145
+ </script>
146
+ ```
147
+
148
+ ## Вывод ошибок из кастомных ключей
149
+
150
+ Иногда бывает нужно выводить ошибки из кастомных ключей errors-массива (или вложенных путей). Сделать это можно с помощью атрибута `error-key`:
151
+
152
+ ```vue
153
+ <template>
154
+ <SForm v-model="form" :errors="errors" @submit.prevent="submit">
155
+ <SFormRow title="Кол-во заказов" :error-key="['orders.minCount', 'orders.maxCount']">
156
+ <div class="order-formrow">
157
+ <label class="order-formrow-item">
158
+ <span>Минимум</span>
159
+ <SInput v-model="form.minCount" type="number" min="0" style="max-width: 80px;" />
160
+ </label>
161
+ <label class="order-formrow-item">
162
+ <span>Максимум</span>
163
+ <SInput v-model="form.maxCount" type="number" min="0" style="max-width: 80px;" />
164
+ </label>
165
+ </div>
166
+ </SFormRow>
167
+ <SButton>Отправить</SButton>
168
+ </SForm>
169
+ </template>
170
+ <script setup>
171
+ import { ref } from 'vue'
172
+ const errors = ref({})
173
+ const form = ref({ minCount: '', maxCount: '' })
174
+
175
+ function submit() {
176
+ errors.value = {}
177
+ if (!form.value.minCount) errors.value['orders.minCount'] = 'Минимальное количество не может быть меньше 1'
178
+ if (!form.value.maxCount) errors.value['orders.maxCount'] = 'Максимальное количество не может быть меньше 1'
179
+ }
180
+ </script>
181
+ ```
182
+
183
+ Поддерживаются:
184
+ - Пути через точку: `orders.0`
185
+ - Звездочка для всех вложенных ключей: `orders.*`
186
+ - Массивы: `['orders.0', 'orders.1']`
187
+
188
+ ## Интерфейс компонента SForm
189
+
190
+ ### Свойства (Props)
191
+
192
+ | Название | Тип | По умолчанию | Описание |
193
+ |----------|-----|--------------|----------|
194
+ | form | object | - | Объект формы InertiaJS (рекомендуется). |
195
+ | method | string | `'post'` | HTTP-метод: `post`, `put`, `patch`, `delete`, `get`. |
196
+ | action | string | - | URL для отправки формы. |
197
+ | preserveScroll | boolean | `true` | Сохранять ли позицию скролла после отправки. |
198
+ | isDirty | boolean | `false` | Состояние «изменено» (предупреждение при уходе со страницы). |
199
+ | loading | boolean | `undefined` | Состояние загрузки (переопределяет внутреннее состояние формы). |
200
+ | summaryErrors | boolean | `false` | Показывать ли список всех ошибок вверху формы. |
201
+
202
+ ### Слоты (Slots)
203
+
204
+ | Название | Описание |
205
+ |----------|----------|
206
+ | default | Содержимое формы (инпуты, кнопки и т.д.). |
207
+
208
+ ## Интерфейс компонента SFormRow
209
+
210
+ ### Свойства (Props)
211
+
212
+ | Название | Тип | По умолчанию | Описание |
213
+ |----------|-----|--------------|----------|
214
+ | title | string | - | Заголовок (лейбл) поля. |
215
+ | hint | string | - | Текст-подсказка под заголовоком. |
216
+ | error | string \| string[] | - | Текст ошибки или массив ошибок. |
217
+ | errorKey | string | - | Ключ ошибки в объекте `form.errors` (если используется пропс `errorKey`). |
218
+ | required | boolean | `false` | Помечает поле как обязательное (добавляет красную звездочку). |
219
+ | side | boolean | `false` | Располагает заголовок слева от поля (горизонтальный лейаут). |
220
+
221
+ ### Слоты (Slots)
222
+
223
+ | Название | Описание |
224
+ |----------|----------|
225
+ | default | Содержимое строки (обычно компонент ввода — инпут, селект и т.д.). |
226
+ | title | Кастомный заголовок (вместо пропса title). |
227
+ | hint | Кастомная подсказка (вместо пропса hint). |
228
+
229
+ <style lang="scss">
230
+ .order-formrow {
231
+ display: flex;
232
+ flex-direction: row;
233
+ gap: var(--s-base-margin);
234
+ &-item {
235
+ display: flex;
236
+ align-items: center;
237
+ gap: 5px;
238
+ }
239
+ }
240
+ </style>
@@ -0,0 +1,143 @@
1
+ # SHtmlEditor
2
+
3
+ Визуальный HTML-редактор.
4
+
5
+ <SToggleGroup>
6
+ <SToggle title="В чем отличие от аналогов?">
7
+ <p>В отличие от популярных библиотек компонентов для Vue3:</p>
8
+ <ol>
9
+ <li>Сразу используем самый удобный TinyMCE. Все остальные редакторы по юзабилити сильно хуже.</li>
10
+ <li>Поддержка ембеддинга видео из сервиса <a href="https://www.kinescope.com/" target="_blank">Kinescope</a>, который в моменте является наиболее удобной заменой блокируемого YouTube</li>
11
+ </ol>
12
+ </SToggle>
13
+ </SToggleGroup>
14
+
15
+ ## Базовый пример
16
+
17
+ <div class="docs-container">
18
+ <SHtmlEditor v-model="content1" upload-url="/image/upload" />
19
+ </div>
20
+
21
+ ```vue
22
+ <template>
23
+ <SHtmlEditor v-model="content" upload-url="/image/upload" />
24
+ </template>
25
+
26
+ <script setup>
27
+ import { ref } from 'vue';
28
+ import { SHtmlEditor } from 'startup-ui';
29
+
30
+ const content = ref('');
31
+ </script>
32
+ ```
33
+
34
+ ## Плейсхолдер
35
+
36
+ <div class="docs-container">
37
+ <SHtmlEditor v-model="content2" upload-url="/image/upload" placeholder="Введите контент" />
38
+ </div>
39
+
40
+ ```vue
41
+ <template>
42
+ <SHtmlEditor v-model="content" upload-url="/image/upload" placeholder="Введите контент" />
43
+ </template>
44
+
45
+ <script setup>
46
+ import { ref } from 'vue';
47
+ import { SHtmlEditor } from 'startup-ui';
48
+
49
+ const content = ref('');
50
+ </script>
51
+ ```
52
+
53
+ ## Высота редактора
54
+
55
+ По умолчанию высота равна 300px. Изменить её можно пропом `height` — например, увеличить до 500px:
56
+
57
+ <div class="docs-container">
58
+ <SHtmlEditor v-model="content3" upload-url="/image/upload" :height="500" />
59
+ </div>
60
+
61
+ ```vue
62
+ <template>
63
+ <SHtmlEditor v-model="content" upload-url="/image/upload" :height="500" />
64
+ </template>
65
+
66
+ <script setup>
67
+ import { ref } from 'vue';
68
+ import { SHtmlEditor } from 'startup-ui';
69
+
70
+ const content = ref('');
71
+ </script>
72
+ ```
73
+
74
+ ## Расширяемость
75
+
76
+ Конфигурацию TinyMCE можно глубоко переопределить пропом `init` (глубокий merge в дефолты). Поле `setup` композируется с библиотечным (вызывается после него и не затирает обёртку картинок), а `plugins` объединяются с базовыми.
77
+
78
+ ```vue
79
+ <SHtmlEditor
80
+ v-model="content"
81
+ upload-url="/image/upload"
82
+ :plugins="['wordcount']"
83
+ toolbar="blocks | bold italic | link image | fullscreen code"
84
+ :header-offset="60"
85
+ :init="{
86
+ setup(editor) {
87
+ // напр. кастомная кнопка «вставить шаблон ответа техподдержки»
88
+ editor.ui.registry.addButton('reply', {
89
+ text: 'Шаблон',
90
+ onAction: () => editor.insertContent('<p>Здравствуйте! </p>'),
91
+ });
92
+ },
93
+ }"
94
+ @init="onEditorInit"
95
+ />
96
+ ```
97
+
98
+ - `header-offset` (или CSS-переменная `--s-header-height`) задаёт смещение шапки для корректного fullscreen.
99
+ - `content-style` добавляется к базовым стилям контента, `content-css` подключает внешние стили.
100
+ - Локаль интерфейса берётся из словаря (`htmlEditor.language`); язык можно задать и явно через `:init="{ language, language_url }"`.
101
+
102
+ ## Интерфейс компонента
103
+
104
+ ### Свойства (Props)
105
+
106
+ | Название | Тип | По умолчанию | Описание |
107
+ |----------|-----|--------------|----------|
108
+ | v-model | `string` | `undefined` | HTML-содержимое редактора. |
109
+ | upload-url | `string` | `undefined` | URL для загрузки изображений на сервер. |
110
+ | placeholder | `string` | `''` | Текст-заполнитель, когда редактор пуст. |
111
+ | height | `number` | `300` | Высота редактора, px. |
112
+ | media | `boolean` | `false` | Включить плагин медиа (видео-эмбеды). |
113
+ | plugins | `string[]` | `[]` | Доп. плагины TinyMCE (объединяются с базовыми). |
114
+ | toolbar | `string` | (дефолтный) | Переопределение тулбара. |
115
+ | menubar | `string \| boolean` | `false` | Меню-бар TinyMCE. |
116
+ | content-style | `string` | `undefined` | Доп. CSS контента (добавляется к базовому). |
117
+ | content-css | `string \| string[]` | `undefined` | Внешние CSS контента (`content_css`). |
118
+ | header-offset | `number` | `undefined` | Смещение шапки для fullscreen, px. |
119
+ | init | `object` | `undefined` | Глубокий merge в конфигурацию TinyMCE (наивысший приоритет). |
120
+
121
+ ### События (Events)
122
+
123
+ | Название | Параметры | Описание |
124
+ |----------|-----------|----------|
125
+ | changeContent | - | Вызывается при любом изменении содержимого редактора. |
126
+ | init | `editor` | Инстанс TinyMCE готов — для регистрации кастомных плагинов/кнопок. |
127
+
128
+ <script setup>
129
+ import { ref } from 'vue';
130
+ import SToggleGroup from '../../../../packages/startup-ui/src/components/SToggleGroup.vue';
131
+ import SToggle from '../../../../packages/startup-ui/src/components/SToggle.vue';
132
+ import SHtmlEditor from '../../../resources/components/SHtmlEditor.client.vue';
133
+
134
+ const content1 = ref('');
135
+ const content2 = ref('');
136
+ const content3 = ref('');
137
+ const content = ref('');
138
+ </script>
139
+ <style lang="scss">
140
+ .s-htmleditor {
141
+ font-family: var(--s-font-family);
142
+ }
143
+ </style>
@@ -0,0 +1,165 @@
1
+ # SInput
2
+
3
+ Базовые поля ввода.
4
+
5
+ <SToggle title="В чем отличие от аналогов?">
6
+ <p>В отличие от популярных библиотек компонентов для Vue3:</p>
7
+ <ol>
8
+ <li>Исключает опции, которые, как правило, не используются в стартапах (напр. размеры полей), но из-за которых разные программисты реализовывают компонент по-разному. Без лишних опций унифицируется код и внешний вид компонентов, упрощается поддержка и взаимозаменяемость.</li>
9
+ </ol>
10
+ </SToggle>
11
+
12
+ ## Стандартные поля ввода
13
+
14
+ ```vue
15
+ <template>
16
+ <SInput v-model="value" placeholder="Обычный инпут" />
17
+ </template>
18
+ <script setup>
19
+ import { ref } from 'vue'
20
+ const value = ref('')
21
+ </script>
22
+ ```
23
+
24
+ Также поддерживаются стандартные HTML-типы полей:
25
+
26
+ ```vue
27
+ <template>
28
+ <SInput v-model="value1" type="number" placeholder="Номер" />
29
+ <SInput v-model="value2" type="email" placeholder="Email" />
30
+ <SInput v-model="value3" type="password" placeholder="Пароль" />
31
+ </template>
32
+ <script setup>
33
+ import { ref } from 'vue'
34
+ const value1 = ref('')
35
+ const value2 = ref('')
36
+ const value3 = ref('')
37
+ </script>
38
+ ```
39
+
40
+ ## Многострочное поле ввода
41
+
42
+ ```vue
43
+ <template>
44
+ <SInput v-model="value" type="textarea" placeholder="Введите длинный текст..." />
45
+ </template>
46
+ <script setup>
47
+ import { ref } from 'vue'
48
+ const value = ref('')
49
+ </script>
50
+ ```
51
+
52
+ ## Префикс / суффикс
53
+
54
+ Простой текст задаём пропами `prefix` / `suffix`, а для произвольного контента (иконки и т.п.) — одноимёнными слотами:
55
+
56
+ ```vue
57
+ <template>
58
+ <SInput v-model="value1" prefix="$" type="number" placeholder="Префикс" />
59
+ <SInput v-model="value2" type="number" placeholder="Кастомный префикс">
60
+ <template #prefix>
61
+ <FontAwesomeIcon icon="star" />
62
+ </template>
63
+ </SInput>
64
+ <SInput v-model="value3" suffix="₽" type="number" placeholder="Суффикс" />
65
+ <SInput v-model="value4" type="number" placeholder="Кастомный суффикс">
66
+ <template #suffix>
67
+ <STooltip>Подсказка к полю</STooltip>
68
+ </template>
69
+ </SInput>
70
+ </template>
71
+ <script setup>
72
+ import { ref } from 'vue'
73
+ const value1 = ref('')
74
+ const value2 = ref('')
75
+ const value3 = ref('')
76
+ const value4 = ref('')
77
+ </script>
78
+ ```
79
+
80
+ ## Недоступное состояние
81
+
82
+ ```vue
83
+ <template>
84
+ <SInput v-model="value" disabled />
85
+ </template>
86
+ <script setup>
87
+ import { ref } from 'vue'
88
+ const value = ref('Иван Иванов')
89
+ </script>
90
+ ```
91
+
92
+ ## Поле ввода с кнопкой очистки
93
+
94
+ Добавляем атрибут `clearable` — кнопка очистки появляется, когда в поле есть значение:
95
+
96
+ ```vue
97
+ <template>
98
+ <SInput v-model="value" clearable placeholder="Введите текст" />
99
+ </template>
100
+ <script setup>
101
+ import { ref } from 'vue'
102
+ const value = ref('Очисти меня')
103
+ </script>
104
+ ```
105
+
106
+ ## События
107
+
108
+ ```vue
109
+ <template>
110
+ <SInput @change="(newValue) => console.log(newValue)" placeholder="Печатаем и смотрим консоль" style="width: 100%" />
111
+ </template>
112
+
113
+ <script setup>
114
+ import { SInput } from 'startup-ui'
115
+ </script>
116
+ ```
117
+
118
+ ## Кастомные стили для инпута
119
+
120
+ Если нужно задать кастомные стили именно для вложенного инпута, то задаем их через `input-style`:
121
+
122
+ ```vue
123
+ <template>
124
+ <SInput v-model="value" input-style="text-align: center" />
125
+ </template>
126
+ <script setup>
127
+ import { ref } from 'vue'
128
+ const value = ref('По центру')
129
+ </script>
130
+ ```
131
+
132
+ ## Интерфейс компонента
133
+
134
+ ### Свойства (Props)
135
+
136
+ | Название | Тип | По умолчанию | Описание |
137
+ |----------|-----|--------------|----------|
138
+ | modelValue / v-model | `number \| string \| null` | `undefined` | Связанное значение поля ввода. |
139
+ | type | `'text' \| 'string' \| 'number' \| 'email' \| 'password' \| 'textarea'` | `'text'` | Внутренний тип поля. При значении `textarea` отрисовывается многострочное поле. |
140
+ | placeholder | string | `undefined` | Текст-заполнитель, отображаемый, когда поле пустое. |
141
+ | prefix | string | `undefined` | Простой текст для отображения в начале поля. Добавляет класс `.has-prefix` обертке. |
142
+ | suffix | string | `undefined` | Простой текст для отображения в конце поля. Добавляет класс `.has-suffix` обертке. |
143
+ | clearable | boolean | `false` | Показывает кнопку очистки, когда в поле есть значение. |
144
+ | disabled | boolean | `false` | Флаг, отключающий интерактивность поля. |
145
+ | rows | number | `3` | Количество видимых строк текста (применяется только при `type="textarea"`). |
146
+ | inputStyle | `StyleValue` | `undefined` | CSS-стили, передаваемые напрямую внутреннему элементу (`input` или `textarea`). |
147
+
148
+ ### Слоты (Slots)
149
+
150
+ | Название | Описание |
151
+ |----------|----------|
152
+ | prefix | Расширенный контент (например, иконки) перед текстом. Переопределяет проп `prefix`. |
153
+ | suffix | Расширенный контент (например, иконки) после текста. Переопределяет проп `suffix`. |
154
+
155
+ ### События (Events)
156
+
157
+ | Название | Параметры | Описание |
158
+ |----------|-----------|----------|
159
+ | change | `(value: string)` | Срабатывает на нативное событие `@input`. Передает текущее строковое значение. |
160
+
161
+ <style lang="scss">
162
+ .s-input {
163
+ color: var(--s-text);
164
+ }
165
+ </style>