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,76 @@
1
+ # SStatus
2
+
3
+ Текстовый статус (как правило с иконкой).
4
+
5
+ <SToggle title="В чем отличие от аналогов?">
6
+ <p>В отличие от популярных библиотек компонентов для Vue3:</p>
7
+ <ol>
8
+ <li>Привязка к FontAwesome, который бесплатен и оптимально решает задачи иконок для стартапов.</li>
9
+ <li>Привязка к <a href="/pages/welcome/basics/colors.html">стандартым цветам</a> проекта, упрощает семантику до минимальных настроек и унифицирует цвета.</li>
10
+ </ol>
11
+ </SToggle>
12
+
13
+ ## Базовый пример
14
+
15
+ ```vue
16
+ <template>
17
+ <SStatus color="green" icon="check">Работает</SStatus>
18
+ <SStatus color="red-dark" icon="triangle-exclamation">Остановлен</SStatus>
19
+ <SStatus color="text-light" icon="pause">Не запущен</SStatus>
20
+ </template>
21
+
22
+ <script setup>
23
+ import { SStatus } from 'startup-ui'
24
+ </script>
25
+ ```
26
+
27
+ ## Различные цвета
28
+
29
+ Помимо иконок можно кастомизировать цвет статуса по стандартной палитре цветов:
30
+
31
+ ```vue
32
+ <template>
33
+ <SStatus color="text" icon="check">text</SStatus>
34
+ <SStatus color="text-light" icon="check">text-light</SStatus>
35
+ <SStatus color="primary" icon="check">primary</SStatus>
36
+ <SStatus color="primary-dark" icon="check">primary-dark</SStatus>
37
+ <SStatus color="primary-darkest" icon="check">primary-darkest</SStatus>
38
+ <SStatus color="red" icon="check">red</SStatus>
39
+ <SStatus color="red-dark" icon="check">red-dark</SStatus>
40
+ <SStatus color="yellow" icon="check">yellow</SStatus>
41
+ <SStatus color="yellow-dark" icon="check">yellow-dark</SStatus>
42
+ <SStatus color="green" icon="check">green</SStatus>
43
+ <SStatus color="green-dark" icon="check">green-dark</SStatus>
44
+ </template>
45
+
46
+ <script setup>
47
+ import { SStatus } from 'startup-ui'
48
+ </script>
49
+ ```
50
+
51
+ ## Интерфейс компонента
52
+
53
+ ### Свойства (Props)
54
+
55
+ | Название | Тип | По умолчанию | Описание |
56
+ |----------|-----|--------------|----------|
57
+ | color | string | undefined | Цвет текста и иконки из стандартной палитре: `text`, `text-light`, `primary`, `primary-dark`, `primary-darkest`, `red`, `red-dark`, `yellow`, `yellow-dark`, `green`, `green-dark` и др. |
58
+ | icon | string \| string[] | undefined | Имя иконки FontAwesome (например, `'check'`, `'triangle-exclamation'`). |
59
+
60
+ ### Слоты (Slots)
61
+
62
+ | Название | Описание |
63
+ |----------|----------|
64
+ | default | Текстовое содержимое, отображаемое рядом с иконкой. |
65
+
66
+ <style lang="scss">
67
+ .row {
68
+ display: flex;
69
+ flex-wrap: wrap;
70
+ margin-bottom: 10px;
71
+
72
+ .s-status {
73
+ flex-basis: 150px;
74
+ }
75
+ }
76
+ </style>
@@ -0,0 +1,70 @@
1
+ # STag
2
+
3
+ Тег (может также использоваться как отображение статуса).
4
+
5
+ <SToggle title="В чем отличие от аналогов?">
6
+ <p>В отличие от популярных библиотек компонентов для Vue3:</p>
7
+ <ol>
8
+ <li>Привязка к <a href="/pages/welcome/basics/colors.html">стандартым цветам</a> проекта, упрощает семантику до минимальных настроек и унифицирует цвета.</li>
9
+ </ol>
10
+ </SToggle>
11
+
12
+ ## Базовый пример
13
+
14
+ ```vue
15
+ <template>
16
+ <STag>Новый</STag>
17
+ </template>
18
+
19
+ <script setup>
20
+ import { STag } from 'startup-ui'
21
+ </script>
22
+ ```
23
+
24
+ ## Различные цвета
25
+
26
+ Атрибутом `color` можно передать значение цвета из палитры цветов:
27
+
28
+ ```vue
29
+ <template>
30
+ <STag color="gray">gray</STag>
31
+ <STag color="primary">primary</STag>
32
+ <STag color="primary-dark">primary-dark</STag>
33
+ <STag color="primary-darkest">primary-darkest</STag>
34
+ <STag color="primary-light">primary-light</STag>
35
+ <STag color="primary-lightest">primary-lightest</STag>
36
+
37
+ <STag color="red">red</STag>
38
+ <STag color="red-dark">red-dark</STag>
39
+ <STag color="red-light">red-light</STag>
40
+ <STag color="red-lightest">red-lightest</STag>
41
+
42
+ <STag color="yellow">yellow</STag>
43
+ <STag color="yellow-dark">yellow-dark</STag>
44
+ <STag color="yellow-light">yellow-light</STag>
45
+ <STag color="yellow-lightest">yellow-lightest</STag>
46
+
47
+ <STag color="green">green</STag>
48
+ <STag color="green-dark">green-dark</STag>
49
+ <STag color="green-light">green-light</STag>
50
+ <STag color="green-lightest">green-lightest</STag>
51
+ </template>
52
+
53
+ <script setup>
54
+ import { STag } from 'startup-ui'
55
+ </script>
56
+ ```
57
+
58
+ ## Интерфейс компонента
59
+
60
+ ### Свойства (Props)
61
+
62
+ | Название | Тип | По умолчанию | Описание |
63
+ |----------|-----|--------------|----------|
64
+ | color | string | `'gray'` | Цвет фона и текста. Поддерживает значения из палитры: `gray`, `primary`, `primary-dark`, `primary-darkest`, `primary-light`, `primary-lightest`, `red`, `red-dark`, `red-light`, `red-lightest`, `yellow`, `yellow-dark`, `yellow-light`, `yellow-lightest`, `green`, `green-dark`, `green-light`, `green-lightest`. |
65
+
66
+ ### Слоты (Slots)
67
+
68
+ | Название | Описание |
69
+ |----------|----------|
70
+ | default | Текстовое содержимое или HTML внутри тега. |
@@ -0,0 +1,47 @@
1
+ # STimeline
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
+ <STimeline :items="items">
17
+ <template #item="{ item }">
18
+ <strong>{{ item.last_visit_diff }} назад</strong> {{ item.username }} остановил переходы
19
+ </template>
20
+ </STimeline>
21
+ </template>
22
+ <script setup>
23
+ const items = [
24
+ { id: 1, last_visit_diff: '2 д. 6 ч', username: 'Иванов' },
25
+ { id: 2, last_visit_diff: '4 д. 2 ч', username: 'Петров' },
26
+ { id: 3, last_visit_diff: '22 д. 1 ч', username: 'Сидоров' }
27
+ ]
28
+ </script>
29
+ ```
30
+
31
+ ## Интерфейс компонента
32
+
33
+ ### Свойства (Props)
34
+
35
+ | Название | Тип | По умолчанию | Описание |
36
+ |----------|-----|--------------|----------|
37
+ | items | `Array` | `undefined` | Обязательный массив объектов данных для итерации по таймлайну. |
38
+
39
+ ### Слоты (Slots)
40
+
41
+ | Название | Привязки | Описание |
42
+ |----------|----------|----------|
43
+ | item | `{ item: Object, index: number }` | Слот для отображения содержимого рядом с маркером таймлайна для каждого элемента. |
44
+
45
+ <script setup lang="ts">
46
+ import SToggle from '../../../../packages/startup-ui/src/components/SToggle.vue';
47
+ </script>
@@ -0,0 +1,120 @@
1
+ # SToggleGroup > SToggle
2
+
3
+ Открывающийся-закрывающийся блок.
4
+
5
+ ## Базовый пример
6
+
7
+ ```vue
8
+ <template>
9
+ <SToggle title="Какие есть гарантии результата?">
10
+ <p><strong>Результат до оплаты.</strong> После регистрации и стартовых действий ты получаешь стартовый депозит, на котором сможешь сделать быстрый тест и получить первые результаты.</p>
11
+ </SToggle>
12
+ </template>
13
+
14
+ <script setup>
15
+ import { SToggle } from 'startup-ui'
16
+ </script>
17
+ ```
18
+
19
+ ## Первоначально открытое состояние
20
+
21
+ ```vue
22
+ <template>
23
+ <SToggle title="Какие есть гарантии результата?" opened>
24
+ <p><strong>Результат до оплаты.</strong> После регистрации и стартовых действий ты получаешь стартовый депозит, на котором сможешь сделать быстрый тест и получить первые результаты.</p>
25
+ </SToggle>
26
+ </template>
27
+
28
+ <script setup>
29
+ import { SToggle } from 'startup-ui'
30
+ </script>
31
+ ```
32
+
33
+ ## Кастомный заголовок
34
+
35
+ Когда просто текста не достаточно, используем слот:
36
+
37
+ ```vue
38
+ <SToggle>
39
+ <template #title>Обратите внимание&nbsp;<STag color="primary-darkest">1</STag></template>
40
+ При пополнении счета банковской картой вы получаете бонус в размере 10 000 рублей.
41
+ </SToggle>
42
+ ```
43
+
44
+ ## Несколько блоков (аккордеон)
45
+
46
+ ```vue
47
+ <template>
48
+ <SToggleGroup>
49
+ <SToggle title="Сколько это будет занимать времени">5 минут в день. Базовая настройка и запуск обычно занимает от 5 до 30 минут.</SToggle>
50
+ <SToggle title="Гарантии результата">Результат до оплаты. После регистрации и стартовых действий ты получаешь стартовый депозит, на котором сможешь сделать быстрый тест и получить первые результаты. И это лучше любых гарантий!</SToggle>
51
+ </SToggleGroup>
52
+ </template>
53
+
54
+ <script setup>
55
+ import { SToggleGroup, SToggle } from 'startup-ui'
56
+ </script>
57
+ ```
58
+
59
+ По умолчанию будет давать открыть не более одного тоггла (остальные будет закрывать). Если нужно открыть несколько, то добавляем multiple:
60
+
61
+ ```vue
62
+ <template>
63
+ <SToggleGroup multiple>
64
+ <SToggle title="Сколько это будет занимать времени">5 минут в день. Базовая настройка и запуск обычно занимает от 5 до 30 минут.</SToggle>
65
+ <SToggle title="Гарантии результата">Результат до оплаты. После регистрации и стартовых действий ты получаешь стартовый депозит, на котором сможешь сделать быстрый тест и получить первые результаты. И это лучше любых гарантий!</SToggle>
66
+ </SToggleGroup>
67
+ </template>
68
+
69
+ <script setup>
70
+ import { SToggleGroup, SToggle } from 'startup-ui'
71
+ </script>
72
+ ```
73
+
74
+ ## Цвета
75
+
76
+ Атрибут `color` позволяет менять фоновый стиль заголовка `SToggle`.
77
+
78
+ ```vue
79
+ <template>
80
+ <SToggle title="Стандартный (bg)" color="bg">Контент...</SToggle>
81
+ <SToggle title="Основной (primary)" color="primary">Контент...</SToggle>
82
+ <SToggle title="Зеленый (green)" color="green">Контент...</SToggle>
83
+ <SToggle title="Красный (red)" color="red">Контент...</SToggle>
84
+ </template>
85
+
86
+ <script setup>
87
+ import { SToggle } from 'startup-ui'
88
+ </script>
89
+ ```
90
+
91
+ ## Интерфейс компонента SToggleGroup
92
+
93
+ ### Свойства (Props)
94
+
95
+ | Название | Тип | По умолчанию | Описание |
96
+ |----------|-----|--------------|----------|
97
+ | multiple | boolean | false | Если `true`, позволяет одновременно открывать несколько блоков внутри группы. |
98
+
99
+ ## Интерфейс компонента SToggle
100
+
101
+ ### Свойства (Props)
102
+
103
+ | Название | Тип | По умолчанию | Описание |
104
+ |----------|-----|--------------|----------|
105
+ | title | string | undefined | Текст заголовка. |
106
+ | opened | boolean | false | Если `true`, блок открыт по умолчанию. |
107
+ | color | `'bg'` \| `'primary'` \| `'red'` \| `'green'` | `'bg'` | Цветовая схема заголовка. |
108
+
109
+ ### Слоты (Slots)
110
+
111
+ | Название | Описание |
112
+ |----------|----------|
113
+ | title | Кастомное содержимое для заголовка (переопределяет проп `title`). |
114
+ | default | Основное содержимое, которое раскрывается при клике. |
115
+
116
+ <style lang="scss">
117
+ .s-toggle {
118
+ color: var(--s-text);
119
+ }
120
+ </style>
@@ -0,0 +1,88 @@
1
+ # STooltip
2
+
3
+ Иконка вопроса со всплывающей подсказкой.
4
+
5
+ <SToggle title="В чем отличие от аналогов?">
6
+ <p>В отличие от популярных библиотек компонентов для Vue3:</p>
7
+ <ol>
8
+ <li>Текст подсказки в слоте, так что там можно размещать HTML-контент и ссылки на расширенную информацию.</li>
9
+ <li>Событийная логика сделана так, что мышку можно перевести с иконки на текст подсказки и кликнуть по ссылке, которая в ней.</li>
10
+ </ol>
11
+ </SToggle>
12
+
13
+ ## Базовый пример
14
+
15
+ ```vue
16
+ <template>
17
+ <p>
18
+ Показы <STooltip>Кол-во показов поискового сниппета. Данные из вебмастера за последний день, когда они есть для запроса</STooltip>
19
+ </p>
20
+ </template>
21
+
22
+ <script setup>
23
+ import { STooltip } from 'startup-ui'
24
+ </script>
25
+ ```
26
+
27
+ ## Фиксированное положение
28
+
29
+ По умолчанию положение подсказки выбирается исходя из того, где эта подсказка уместится на экране. Но если нужно указать положение явно, можно использовать атрибут `at`:
30
+
31
+ ```vue
32
+ <template>
33
+ <div>Сверху <STooltip at="top">Подсказка сверху</STooltip></div>
34
+ <div>Справа <STooltip at="right">Подсказка справа</STooltip></div>
35
+ <div>Снизу <STooltip at="bottom">Подсказка снизу</STooltip></div>
36
+ <div>Слева <STooltip at="left">Подсказка слева</STooltip></div>
37
+ </template>
38
+
39
+ <script setup>
40
+ import { STooltip } from 'startup-ui'
41
+ </script>
42
+ ```
43
+
44
+ ## Кастомная иконка
45
+
46
+ Если нужна другая иконка, то её можно заменить атрибутом icon:
47
+
48
+ ```vue
49
+ <template>
50
+ <div>Подсказка с другой иконкой <STooltip icon="circle-info">Используем иконку circle-info</STooltip></div>
51
+ </template>
52
+
53
+ <script setup>
54
+ import { STooltip } from 'startup-ui'
55
+ </script>
56
+ ```
57
+
58
+ Если нужна совсем нестандартная иконка/область наведения, то можно использовать слот icon:
59
+
60
+ ```vue
61
+ <STooltip>
62
+ <template #icon>❓</template>
63
+ Используем в качестве иконки эмодзи
64
+ </STooltip>
65
+ ```
66
+
67
+ ## Интерфейс компонента
68
+
69
+ ### Свойства (Props)
70
+
71
+ | Название | Тип | По умолчанию | Описание |
72
+ |----------|-----|--------------|----------|
73
+ | at | `'top'` \| `'bottom'` \| `'right'` \| `'left'` \| `null` | `null` | Принудительно задает положение подсказки. По умолчанию рассчитывается автоматически. |
74
+ | icon | string \| string[] | `'circle-question'` | Имя иконки FontAwesome для триггера подсказки. |
75
+
76
+ ### Слоты (Slots)
77
+
78
+ | Название | Описание |
79
+ |----------|----------|
80
+ | default | Содержимое внутри пузыря подсказки. Поддерживает HTML. |
81
+ | icon | Переопределяет стандартную иконку FontAwesome. Позволяет разместить эмодзи, текст или кастомные элементы. |
82
+
83
+ <style lang="scss" scoped>
84
+ .s-tooltip {
85
+ font-family: 'Open Sans', sans-serif;
86
+ font-weight: 700;
87
+ }
88
+ </style>
@@ -0,0 +1,61 @@
1
+ # SCanvas + SFooter
2
+
3
+ Общий шаблон страницы.
4
+
5
+ ## Базовый пример
6
+
7
+ ```vue
8
+ <SCanvas>
9
+ <template #header>
10
+ Шапка
11
+ </template>
12
+ <template #subheader>
13
+ Второй блок шапки
14
+ </template>
15
+ <template #sidebar>
16
+ Боковой блок страницы
17
+ </template>
18
+ <template #content>
19
+ Основной контент страницы
20
+ </template>
21
+ </SCanvas>
22
+ <SFooter>
23
+ <div>&copy; suhar.ru, 2025. Все права защищены</div>
24
+ </SFooter>
25
+ ```
26
+
27
+ ## Утилиты SFooter
28
+
29
+ У компонента `SFooter` нет собственных свойств, но его CSS включает класс `.s-footer-h`, специально созданный для центрирования контента с максимальной шириной (`1200px`):
30
+
31
+ ```vue
32
+ <template>
33
+ <SFooter>
34
+ <div class="s-footer-h">
35
+ <!-- Контент будет центрирован с max-width и отступами (gap) -->
36
+ <div>Колонка 1</div>
37
+ <div>Колонка 2</div>
38
+ </div>
39
+ </SFooter>
40
+ </template>
41
+ ```
42
+
43
+ ## Интерфейс компонента SCanvas
44
+
45
+ ### Слоты (Slots)
46
+
47
+ | Название | Описание |
48
+ |----------|----------|
49
+ | header | Самая верхняя навигационная панель. Элементы с классом `.right` будут выровнены по правому краю на десктопе. |
50
+ | subheader | Вторичная шапка под основной. Часто используется для хлебных крошек или подзаголовка. |
51
+ | sidebar | Левая боковая панель навигации. На мобильных устройствах по умолчанию скрыта и доступна через бургер-меню. |
52
+ | content | Основная область для контента страницы. Занимает оставшееся пространство рядом с сайдбаром. |
53
+ | default | Рендерится между подшапкой и блоками `sidebar`/`content`. Часто используется для плашек (alerts) на всю ширину или для размещения `SFooter` в низу интерфейса. |
54
+
55
+ ## Интерфейс компонента SFooter
56
+
57
+ ### Слоты (Slots)
58
+
59
+ | Название | Описание |
60
+ |----------|----------|
61
+ | default | Содержимое подвала (футера). |
@@ -0,0 +1,88 @@
1
+ # SMenu
2
+
3
+ Горизонтальное меню с выпадающими подменю. Подходит для шапки (`header`) и подшапки (`subheader`) — объединяет в одном компоненте плоскую навигацию и дропдауны.
4
+
5
+ Меню рассчитано на тёмную полосу (как `subheader`), поэтому в примерах ниже оно обёрнуто в контейнер с фоном `--s-bg-subheader`.
6
+
7
+ ## Базовый пример
8
+
9
+ Пункт с массивом `children` раскрывает выпадающее подменю при наведении. Активный пункт отмечается «уголком».
10
+
11
+ ```vue
12
+ <template>
13
+ <div style="background: var(--s-bg-subheader); color: var(--s-white); padding: 0 1rem; border-radius: var(--s-border-radius)">
14
+ <SMenu :items="items" />
15
+ </div>
16
+ </template>
17
+
18
+ <script setup>
19
+ import { SMenu } from 'startup-ui'
20
+
21
+ const items = [
22
+ { label: 'Главная', url: '/', active: true },
23
+ { label: 'Проекты', url: '/projects' },
24
+ { label: 'Помощь', url: '/help' },
25
+ {
26
+ label: 'Аккаунт',
27
+ children: [
28
+ { label: 'Профиль', url: '/profile' },
29
+ { label: 'Настройки', url: '/settings' },
30
+ { label: 'Выйти', url: '/logout', method: 'post' },
31
+ ],
32
+ },
33
+ ]
34
+ </script>
35
+ ```
36
+
37
+ ## Иконки, счётчики и аватары
38
+
39
+ У пунктов могут быть иконки (`icon`), числовые бейджи (`counter`) и круглые аватары (`avatar`). Иконки берутся из FontAwesome — см. [«Иконки»](/pages/welcome/basics/icons).
40
+
41
+ ```vue
42
+ <template>
43
+ <div style="background: var(--s-bg-subheader); color: var(--s-white); padding: 0 1rem; border-radius: var(--s-border-radius)">
44
+ <SMenu :items="items" />
45
+ </div>
46
+ </template>
47
+
48
+ <script setup>
49
+ import { SMenu } from 'startup-ui'
50
+
51
+ const items = [
52
+ { label: 'Профиль', url: '/profile', icon: 'user' },
53
+ { label: 'Сообщения', url: '/messages', icon: 'envelope', counter: 5 },
54
+ { label: 'Внешний сайт', url: 'https://startup-ui.ru' },
55
+ { label: 'Иван Иванов', url: '/account', avatar: '/nature.jpg' },
56
+ ]
57
+ </script>
58
+ ```
59
+
60
+ Внешние ссылки (абсолютный URL на другой домен) открываются в новой вкладке; локальные ссылки используют SPA-навигацию, если при подключении плагина передан `link`-компонент (напр. Inertia `Link`) — см. [«Установка»](/pages/welcome/basics/installing).
61
+
62
+ ## Интерфейс компонента
63
+
64
+ ### Свойства (Props)
65
+
66
+ | Название | Тип | По умолчанию | Описание |
67
+ |----------|-----|--------------|----------|
68
+ | items | `SMenuItem[]` | `[]` | Пункты меню. |
69
+
70
+ ### Объект пункта (SMenuItem)
71
+
72
+ | Поле | Тип | Описание |
73
+ |------|-----|----------|
74
+ | label | string | Текст пункта. |
75
+ | url | string | Ссылка. Внешние URL открываются в новой вкладке. |
76
+ | icon | string \| string[] | Имя иконки FontAwesome (если не задан `avatar`). |
77
+ | avatar | string | URL картинки-аватара (круглая, вместо иконки). |
78
+ | counter | string \| number | Бейдж со счётчиком (напр. число непрочитанного). |
79
+ | active | boolean | Подсветить как активный (жирный + «уголок» снизу). |
80
+ | method | string | HTTP-метод для ссылки (напр. `'post'` для пункта «Выйти»). |
81
+ | class | string | Дополнительный класс на пункт. |
82
+ | children | `SMenuItem[]` | Вложенные пункты — раскрываются выпадающим подменю при наведении. |
83
+
84
+ ### Слоты (Slots)
85
+
86
+ | Название | Описание |
87
+ |----------|----------|
88
+ | default | Произвольный контент в конце меню (после всех пунктов). |
@@ -0,0 +1,113 @@
1
+ # SVerticalMenu
2
+
3
+ Боковое меню.
4
+
5
+ <SToggle title="В чем отличие от аналогов?">
6
+ <p>В отличие от популярных библиотек компонентов для Vue3:</p>
7
+ <ol>
8
+ <li>Может сохранять набор раскрытых элементов в localStorage одним простым атрибутом.</li>
9
+ </ol>
10
+ </SToggle>
11
+
12
+ ## Базовый пример
13
+
14
+ ```vue
15
+ <template>
16
+ <SVerticalMenu :links="menuLinks" />
17
+ </template>
18
+
19
+ <script setup>
20
+ const menuLinks = [
21
+ {
22
+ id: 34,
23
+ title: 'Мануал',
24
+ label: 'Мануал',
25
+ type: 'section',
26
+ children: [
27
+ { id: 6, label: 'Быстрый запуск', url: '/docs/quick-start/' },
28
+ { id: 30, label: 'Тарифы', url: '/docs/plans/' }
29
+ ]
30
+ },
31
+ {
32
+ id: 8,
33
+ title: 'Кейсы',
34
+ label: 'Кейсы',
35
+ type: 'section',
36
+ children: [
37
+ { id: 9, label: 'Кейс №1: Ландшафтный дизайн', url: '/docs/case1/' }
38
+ ]
39
+ }
40
+ ]
41
+ </script>
42
+ ```
43
+
44
+ Где menuLinks — это массив в формате `[{label, url, active, ?type, ?className, ?children}, ...]`
45
+
46
+ ## Раскрытые элементы
47
+
48
+ Чтобы нужные элементы были раскрыты сразу, мы передаем массив их ID в атрибуте <strong>expanded-keys</strong>:
49
+
50
+ ```vue
51
+ <template>
52
+ <SVerticalMenu :links="menuLinks" :expanded-keys="[34]" />
53
+ </template>
54
+
55
+ <script setup>
56
+ const menuLinks = [ { id: 34, title: 'Мануал', label: 'Мануал', type: 'section', active: false, isPublished: true, children: [ { id: 6, title: 'Быстрый запуск проекта в ПфПульте', label: 'Быстрый запуск', type: 'article', active: false, url: '/docs/quick-start/', isPublished: true }, { id: 30, title: 'Тарифы ПфПульта', label: 'Тарифы', type: 'article', active: false, url: '/docs/plans/', isPublished: true }, { id: 31, title: 'Как подключить вебмастер', label: 'Как подключить вебмастер', type: 'article', active: false, url: '/docs/webmaster-integration/', isPublished: true }, { id: 32, title: 'Как получать лидов', label: 'Как получать лидов', type: 'article', active: false, url: '/docs/get-leads/', isPublished: true } ] }, { id: 8, title: 'Кейсы', label: 'Кейсы', type: 'section', active: false, isPublished: true, children: [ { id: 9, title: 'Кейс №1: Ландшафтный дизайн, Москва и область', label: 'Кейс №1: Ландшафтный дизайн', type: 'article', active: false, url: '/docs/case1/', isPublished: true } ] } ]
57
+ </script>
58
+ ```
59
+
60
+ ## Запоминание раскрытых элементов
61
+
62
+ Во всякого рода документациях
63
+
64
+ Когда мы добавляем атрибут <strong>store-expanded-keys-to</strong>, раскрытые элементы сохраняются в localStorage. Теперь, если обновить страницу, раскрытые элементы сохранятся.
65
+
66
+ ```vue
67
+ <template>
68
+ <SVerticalMenu :links="menuLinks" store-expanded-keys-to="opened-pages" />
69
+ </template>
70
+
71
+ <script setup>
72
+ const menuLinks = [ { id: 34, title: 'Мануал', label: 'Мануал', type: 'section', active: false, isPublished: true, children: [ { id: 6, title: 'Быстрый запуск проекта в ПфПульте', label: 'Быстрый запуск', type: 'article', active: false, url: '/docs/quick-start/', isPublished: true }, { id: 30, title: 'Тарифы ПфПульта', label: 'Тарифы', type: 'article', active: false, url: '/docs/plans/', isPublished: true }, { id: 31, title: 'Как подключить вебмастер', label: 'Как подключить вебмастер', type: 'article', active: false, url: '/docs/webmaster-integration/', isPublished: true }, { id: 32, title: 'Как получать лидов', label: 'Как получать лидов', type: 'article', active: false, url: '/docs/get-leads/', isPublished: true } ] }, { id: 8, title: 'Кейсы', label: 'Кейсы', type: 'section', active: false, isPublished: true, children: [ { id: 9, title: 'Кейс №1: Ландшафтный дизайн, Москва и область', label: 'Кейс №1: Ландшафтный дизайн', type: 'article', active: false, url: '/docs/case1/', isPublished: true } ] } ]
73
+ </script>
74
+ ```
75
+
76
+ ## Интерфейс компонента SVerticalMenu
77
+
78
+ ### Свойства (Props)
79
+
80
+ | Название | Тип | По умолчанию | Описание |
81
+ |----------|-----|--------------|----------|
82
+ | links | `SVerticalMenuLink[]` | `[]` | Массив навигационных ссылок с поддержкой вложенности. |
83
+ | expandedKeys | `(string \| number)[]` | `[]` | Массив ID элементов, которые должны быть раскрыты по умолчанию. |
84
+ | storeExpandedKeysTo | string | `undefined` | Ключ в localStorage для сохранения состояния раскрытых элементов. |
85
+
86
+ ### Слоты (Slots)
87
+
88
+ | Название | Описание |
89
+ |----------|----------|
90
+ | default | По умолчанию слоты отсутствуют, меню генерируется автоматически по пропсу `links`. |
91
+
92
+ ## Интерфейс объекта SVerticalMenuLink
93
+
94
+ | Свойство | Тип | Описание |
95
+ |----------|-----|----------|
96
+ | id | string \| number | **Обязательное.** Уникальный идентификатор пункта меню (нужен для логики открытия/закрытия). |
97
+ | label | string | **Обязательное.** Текст пункта меню. |
98
+ | url | string | URL для перехода. Если указан — рендерится ссылкой (зарегистрированный `Link`, напр. Inertia; иначе обычный `<a>`). Если нет — используется как папка для дочерних элементов. |
99
+ | active | boolean | Если `true`, пункт визуально помечается как активный. |
100
+ | type | string | Может быть `'section'` для заголовка раздела (жирнее и с отступами). |
101
+ | isPublished | boolean | Если `false`, пункт затеняется и появляется иконка перечеркнутого глаза (чтобы показать, что раздел скрыт на сайте). |
102
+ | className | string | Дополнительные CSS классы пункта. |
103
+ | children | `SVerticalMenuLink[]` | Вложенный массив дочерних пунктов. |
104
+
105
+ <script setup lang="ts">
106
+ import SToggle from '../../../../packages/startup-ui/src/components/SToggle.vue';
107
+ </script>
108
+
109
+ <style lang="scss">
110
+ .vp-doc a.s-verticalmenu-label {
111
+ text-decoration: none;
112
+ }
113
+ </style>