plugin-ui-for-kzt 0.0.2

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 (38) hide show
  1. package/README.md +83 -0
  2. package/dist/index.js +31 -0
  3. package/dist/types/components/Toaster/timer.d.ts +12 -0
  4. package/dist/types/index.d.ts +11 -0
  5. package/dist/types/plugins/modalPlugin.d.ts +16 -0
  6. package/dist/types/plugins/toasterPlugin.d.ts +26 -0
  7. package/dist/types/store/modal.d.ts +11 -0
  8. package/dist/types/types/index.d.ts +4 -0
  9. package/package.json +46 -0
  10. package/public/close-icon.svg +3 -0
  11. package/public/error-icon.svg +5 -0
  12. package/public/success-icon.svg +4 -0
  13. package/shims-vue.d.ts +5 -0
  14. package/src/components/AboutPage/AboutPage.vue +1 -0
  15. package/src/components/DataTable/DataTable.vue +169 -0
  16. package/src/components/DataTable/README.md +57 -0
  17. package/src/components/Modal/Modal.vue +149 -0
  18. package/src/components/Modal/README.md +47 -0
  19. package/src/components/Spinner/README.md +35 -0
  20. package/src/components/Spinner/Spinner.vue +59 -0
  21. package/src/components/Toaster/README.md +69 -0
  22. package/src/components/Toaster/Toaster.vue +235 -0
  23. package/src/components/Toaster/timer.ts +45 -0
  24. package/src/components/Tooltip/README.md +37 -0
  25. package/src/components/Tooltip/Tooltip.vue +96 -0
  26. package/src/components/icons/CloseIcon.vue +5 -0
  27. package/src/components/icons/ErrorIcon.vue +7 -0
  28. package/src/components/icons/InfoIcon.vue +7 -0
  29. package/src/components/icons/SuccessIcon.vue +6 -0
  30. package/src/components/icons/WarningIcon.vue +7 -0
  31. package/src/index.ts +27 -0
  32. package/src/plugins/modalPlugin.ts +81 -0
  33. package/src/plugins/toasterPlugin.ts +179 -0
  34. package/src/store/modal.ts +22 -0
  35. package/src/styles/index.scss +3 -0
  36. package/src/types/index.ts +4 -0
  37. package/tsconfig.json +31 -0
  38. package/webpack.config.js +56 -0
@@ -0,0 +1,47 @@
1
+ # Modal Window Plugin
2
+
3
+ Этот плагин для модальных окон позволяет отображать пользователю различные статусы проекта: **success**, **info**, **warning** и **error**.
4
+
5
+ ## Описание
6
+
7
+ Модальное окно используется для информирования пользователя о статусах или событиях в проекте. В зависимости от переданного параметра `name`, модальное окно автоматически изменяет свой тип и стиль.
8
+
9
+ ## Вызов модального окна
10
+
11
+ Модальное окно можно открыть и закрыть с помощью следующих команд:
12
+
13
+ - **Открыть модальное окно:** `$modal.open`
14
+ - **Закрыть модальное окно:** `$modal.close`
15
+
16
+ ## Параметры
17
+
18
+ При вызове модального окна необходимо передать два параметра:
19
+
20
+ 1. **name** (`string`)
21
+ - Принимает любое строковое значение.
22
+ - **Особенность:** В плагине реализован слушатель для параметра `name`, который меняет тип модального окна в зависимости от переданного значения (см. ниже описание типов).
23
+
24
+ 2. **options** (`{ title: string; message: string; }`)
25
+ - **title:** Заголовок модального окна.
26
+ - **message:** Сообщение или основной текст, который будет отображён внутри модального окна.
27
+
28
+ ## Типы модальных окон
29
+
30
+ В зависимости от значения параметра `name` модальное окно может принимать следующие типы:
31
+
32
+ - **success**8
33
+ - **info**
34
+ - **warning**
35
+ - **error**
36
+
37
+ ## Пример использования
38
+
39
+ ```javascript
40
+ // Пример открытия модального окна с типом "success"
41
+ $modal.open('success', {
42
+ title: 'Операция выполнена успешно',
43
+ message: 'Ваш запрос был успешно обработан.'
44
+ });
45
+
46
+ // Пример закрытия модального окна
47
+ $modal.close();
@@ -0,0 +1,35 @@
1
+ # Документация компонента Spinner
2
+
3
+ ## Обзор
4
+ Компонент `Spinner` используется для отображения индикатора загрузки. Он поддерживает кастомизацию размеров, цвета и толщины границ.
5
+
6
+ ## Свойства (Props)
7
+
8
+ - `show` (булево) – определяет, отображать ли спиннер. Обязательное свойство.
9
+ - `size` (строка, необязательно) – задаёт размер спиннера (ширину и высоту). Например, `'40px'`.
10
+ - `color` (строка, необязательно) – определяет основной цвет границы спиннера.
11
+ - `thickness` (строка, необязательно) – задаёт толщину границы спиннера.
12
+
13
+ ## Вычисляемые свойства (Computed)
14
+
15
+ ### `spinnerStyle`
16
+ Возвращает объект со стилями для спиннера:
17
+
18
+ - `width` и `height` – задают размер спиннера.
19
+ - `borderWidth` – регулирует толщину границы.
20
+ - `borderStyle` – устанавливает стиль границы (всегда `solid`).
21
+ - `borderColor` – определяет цвет границы, оставляя прозрачные части.
22
+ - `borderRadius` – устанавливает форму круга.
23
+
24
+ ## Использование
25
+
26
+ ```vue
27
+ <Spinner :show="true" size="50px" color="#3498db" thickness="5px" />
28
+ ```
29
+
30
+ ## Функциональность
31
+
32
+ - Отображает или скрывает индикатор загрузки в зависимости от `show`.
33
+ - Позволяет изменять размер, цвет и толщину границы.
34
+ - Использует `computed` для динамического применения стилей.
35
+
@@ -0,0 +1,59 @@
1
+ <template>
2
+ <div v-if="show" class="spinner-overlay">
3
+ <div class="spinner" :style="spinnerStyle"></div>
4
+ </div>
5
+ </template>
6
+
7
+ <script setup lang="ts">
8
+ import { defineProps, computed } from 'vue'
9
+
10
+ interface SpinnerProps {
11
+ show: boolean
12
+ size?: string
13
+ color?: string
14
+ thickness?: string
15
+ }
16
+
17
+ const props = defineProps<SpinnerProps>()
18
+
19
+ // computed properties
20
+ const spinnerStyle = computed(() => ({
21
+ width: props.size,
22
+ height: props.size,
23
+ borderWidth: props.thickness,
24
+ borderStyle: 'solid',
25
+ borderColor: `${props.color} transparent transparent transparent`,
26
+ borderRadius: '50%'
27
+ }))
28
+ </script>
29
+
30
+ <style scoped lang="scss">
31
+ .spinner-overlay {
32
+ position: fixed;
33
+ top: 0;
34
+ left: 0;
35
+ width: 100%;
36
+ height: 100%;
37
+ background-color: rgba(255, 255, 255, 0.7);
38
+ display: flex;
39
+ align-items: center;
40
+ justify-content: center;
41
+ z-index: 9999;
42
+ }
43
+
44
+ .spinner {
45
+ border: var(--spinner-thickness, 4px) solid transparent;
46
+ border-top: var(--spinner-thickness, 4px) solid var(--spinner-color, #4285f4);
47
+ border-radius: 50%;
48
+ animation: spin 1s linear infinite;
49
+ }
50
+
51
+ @keyframes spin {
52
+ 0% {
53
+ transform: rotate(0deg);
54
+ }
55
+ 100% {
56
+ transform: rotate(360deg);
57
+ }
58
+ }
59
+ </style>
@@ -0,0 +1,69 @@
1
+ # Документация компонента Toaster
2
+
3
+ ## Обзор
4
+ Компонент `Toaster` предназначен для отображения уведомлений на экране. Он поддерживает разные типы сообщений, настраиваемые позиции и функцию автоматического скрытия.
5
+
6
+ ## Свойства (Props)
7
+
8
+ - `message` (строка) – текст сообщения, отображаемый в уведомлении.
9
+ - `type` (success, error, info, warning) – определяет тип сообщения, который влияет на его внешний вид. По умолчанию `success`.
10
+ - `position` (top-left, top-right, bottom-left, bottom-right) – задаёт расположение уведомления на экране. По умолчанию `top-right`.
11
+ - `dismissible` (булево) – определяет, можно ли закрыть уведомление вручную. По умолчанию `true`.
12
+ - `onDismiss` (функция) – вызывается при закрытии уведомления.
13
+ - `onClick` (функция, необязательная) – вызывается при клике на уведомление.
14
+ - `pauseOnHover` (булево) – при наведении мыши приостанавливает таймер скрытия. По умолчанию `true`.
15
+ - `duration` (число) – продолжительность показа в миллисекундах. Если `0`, то уведомление не исчезает автоматически. По умолчанию `5000`.
16
+ - `onHeightUpdate` (функция) – вызывается при изменении высоты уведомления.
17
+
18
+ ## События
19
+
20
+ - `onDismiss` – срабатывает при закрытии уведомления.
21
+ - `onClick` – срабатывает при клике на уведомление.
22
+ - `onHeightUpdate` – вызывается при изменении высоты уведомления.
23
+
24
+ ## Использование
25
+
26
+ ```vue
27
+ <script setup>
28
+ import { useToast } from "modal-plugin-nikitas/plugins/toasterPlugin";
29
+
30
+ const toast = useToast();
31
+
32
+ const showSuccessToast = () => {
33
+ toast?.success("Toast on top", {
34
+ position: "top-left",
35
+ duration: 4000,
36
+ pauseOnHover: false,
37
+ });
38
+ };
39
+ </script>
40
+ ```
41
+
42
+ ## Стилизация
43
+ Компонент применяет разные стили в зависимости от переданных свойств `type` и `position`.
44
+
45
+ - `.toast__item--success` – зелёный фон для успешных сообщений.
46
+ - `.toast__item--error` – красный фон для ошибок.
47
+ - `.toast__item--info` – синий фон для информационных сообщений.
48
+ - `.toast__item--warning` – оранжевый фон для предупреждений.
49
+ - `.toast__item--top-left`, `.toast__item--top-right`, `.toast__item--bottom-left`, `.toast__item--bottom-right` – стили позиционирования.
50
+
51
+ ### Анимации
52
+ - `.toast--fade-in-down` – анимация появления для уведомлений сверху.
53
+ - `.toast--fade-in-up` – анимация появления для уведомлений снизу.
54
+ - `.toast--fade-out` – анимация исчезновения.
55
+
56
+ ## Жизненный цикл
57
+ - **onMounted** – запускает таймер автоудаления и регистрирует наблюдателя за изменением размера.
58
+ - **onUnmounted** – очищает таймер и отключает наблюдателя за изменением размера.
59
+
60
+ ## Методы
61
+
62
+ ### `startTimer()`
63
+ Запускает таймер автоматического скрытия, если `duration` больше 0.
64
+
65
+ ### `toggleTimer(state: boolean)`
66
+ Приостанавливает или возобновляет таймер при наведении курсора.
67
+
68
+ ### `dismissToast()`
69
+ Закрывает уведомление вручную и вызывает `onDismiss`.
@@ -0,0 +1,235 @@
1
+ <template>
2
+ <Transition
3
+ :enter-active-class="transition.enter"
4
+ :leave-active-class="transition.leave"
5
+ >
6
+ <div
7
+ v-if="isActive"
8
+ ref="toastRef"
9
+ class="toast__item"
10
+ :class="[`toast__item--${type}`, `toast__item--${position}`]"
11
+ @mouseover="toggleTimer(true)"
12
+ @mouseleave="toggleTimer(false)"
13
+ >
14
+ <div class="v-toast__icon"></div>
15
+ <p class="v-toast__text" v-html="message"></p>
16
+ <button v-if="dismissible" class="toast__close" @click="dismissToast">
17
+ ×
18
+ </button>
19
+ </div>
20
+ </Transition>
21
+ </template>
22
+
23
+ <script setup lang="ts">
24
+ import { ref, computed, onMounted, onUnmounted, nextTick } from "vue";
25
+ import Timer from "./timer";
26
+
27
+ interface IProps {
28
+ message: string;
29
+ type: "success" | "error" | "info" | "warning";
30
+ position: "top-left" | "top-right" | "bottom-left" | "bottom-right";
31
+ dismissible: boolean;
32
+ onDismiss: () => void;
33
+ onClick?: () => void;
34
+ pauseOnHover: boolean;
35
+ duration: number;
36
+ onHeightUpdate?: (height: number) => void;
37
+ }
38
+
39
+ const props = withDefaults(defineProps<IProps>(), {
40
+ message: "",
41
+ type: "success",
42
+ position: "top-right",
43
+ dismissible: true,
44
+ pauseOnHover: true,
45
+ duration: 5000,
46
+ onDismiss: () => {},
47
+ onClick: () => {},
48
+ onHeightUpdate: () => {},
49
+ });
50
+
51
+ const isActive = ref<boolean>(true);
52
+ const toastRef = ref<HTMLElement | null>(null);
53
+ let timer: Timer | null = null;
54
+ let resizeObserver: ResizeObserver | null = null;
55
+
56
+ const transition = computed(() => {
57
+ return ["top-left", "top-right"].includes(props.position)
58
+ ? { enter: "toast--fade-in-down", leave: "toast--fade-out" }
59
+ : { enter: "toast--fade-in-up", leave: "toast--fade-out" };
60
+ });
61
+
62
+ const updateHeight = async () => {
63
+ await nextTick();
64
+ if (toastRef.value) {
65
+ const height = toastRef.value.offsetHeight;
66
+ props.onHeightUpdate(height);
67
+ }
68
+ };
69
+
70
+ onMounted(async () => {
71
+ startTimer();
72
+ await updateHeight();
73
+
74
+ if (toastRef.value) {
75
+ resizeObserver = new ResizeObserver(async () => {
76
+ await updateHeight();
77
+ });
78
+ resizeObserver.observe(toastRef.value);
79
+ }
80
+ });
81
+
82
+ onUnmounted(() => {
83
+ if (timer) {
84
+ timer.clear();
85
+ }
86
+ if (resizeObserver) {
87
+ resizeObserver.disconnect();
88
+ }
89
+ });
90
+
91
+ const startTimer = () => {
92
+ if (props.duration > 0) {
93
+ timer = new Timer(() => {
94
+ dismissToast();
95
+ }, props.duration);
96
+ timer.resume();
97
+ }
98
+ };
99
+
100
+ const toggleTimer = (state: boolean) => {
101
+ if (props.pauseOnHover && timer) {
102
+ state ? timer.pause() : timer.resume();
103
+ }
104
+ };
105
+
106
+ const dismissToast = () => {
107
+ if (isActive.value) {
108
+ isActive.value = false;
109
+ if (timer) {
110
+ timer.clear();
111
+ }
112
+ props.onDismiss();
113
+ }
114
+ };
115
+
116
+ // const whenClicked = () => {
117
+ // props.onClick();
118
+ // };
119
+ </script>
120
+
121
+ <style scoped lang="scss">
122
+ .toast__item--top-left {
123
+ top: 10px;
124
+ left: 10px;
125
+ align-items: flex-start;
126
+ }
127
+
128
+ .toast__item--top-right {
129
+ top: 10px;
130
+ right: 10px;
131
+ align-items: flex-end;
132
+ }
133
+
134
+ .toast__item--bottom-left {
135
+ bottom: 10px;
136
+ left: 10px;
137
+ align-items: flex-start;
138
+ }
139
+
140
+ .toast__item--bottom-right {
141
+ bottom: 10px;
142
+ right: 10px;
143
+ align-items: flex-end;
144
+ }
145
+
146
+ .toast__item {
147
+ width: 300px;
148
+ padding: 15px;
149
+ position: fixed;
150
+ z-index: 9999;
151
+ border-radius: 8px;
152
+ display: flex;
153
+ align-items: center;
154
+ box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
155
+ background-color: white;
156
+ font-weight: 500;
157
+ color: #333;
158
+ pointer-events: auto;
159
+ transition: all 0.3s ease-in-out;
160
+ }
161
+
162
+ .toast__item--success {
163
+ background-color: #4caf50;
164
+ color: #fff;
165
+ }
166
+
167
+ .toast__item--error {
168
+ background-color: #f44336;
169
+ color: #fff;
170
+ }
171
+
172
+ .toast__item--info {
173
+ background-color: #2196f3;
174
+ color: #fff;
175
+ }
176
+
177
+ .toast__item--warning {
178
+ background-color: #ff9800;
179
+ color: #fff;
180
+ }
181
+
182
+ .toast__close {
183
+ position: absolute;
184
+ top: 10px;
185
+ right: 10px;
186
+ background: none;
187
+ border: none;
188
+ font-size: 18px;
189
+ cursor: pointer;
190
+ color: #fff;
191
+ }
192
+
193
+ .toast--fade-in-down {
194
+ animation: fadeInDown 0.3s ease-out;
195
+ }
196
+
197
+ .toast--fade-in-up {
198
+ animation: fadeInUp 0.3s ease-out;
199
+ }
200
+
201
+ .toast--fade-out {
202
+ animation: fadeOut 0.3s ease-in forwards;
203
+ }
204
+
205
+ @keyframes fadeInDown {
206
+ from {
207
+ opacity: 0;
208
+ transform: translateY(-10px);
209
+ }
210
+ to {
211
+ opacity: 1;
212
+ transform: translateY(0);
213
+ }
214
+ }
215
+
216
+ @keyframes fadeInUp {
217
+ from {
218
+ opacity: 0;
219
+ transform: translateY(10px);
220
+ }
221
+ to {
222
+ opacity: 1;
223
+ transform: translateY(0);
224
+ }
225
+ }
226
+
227
+ @keyframes fadeOut {
228
+ from {
229
+ opacity: 1;
230
+ }
231
+ to {
232
+ opacity: 0;
233
+ }
234
+ }
235
+ </style>
@@ -0,0 +1,45 @@
1
+ class Timer {
2
+ private timerId: number | null = null;
3
+ private start: number = 0;
4
+ private remaining: number;
5
+ private callback: () => void;
6
+
7
+ constructor(callback: () => void, delay: number) {
8
+ this.callback = callback;
9
+ this.remaining = delay;
10
+ this.resume();
11
+ }
12
+
13
+ pause(): void {
14
+ if (this.timerId !== null) {
15
+ window.clearTimeout(this.timerId);
16
+ this.remaining -= Date.now() - this.start;
17
+ this.timerId = null;
18
+ }
19
+ }
20
+
21
+ resume(): void {
22
+ if (this.timerId === null && this.remaining > 0) {
23
+ this.start = Date.now();
24
+ this.timerId = window.setTimeout(() => {
25
+ this.callback();
26
+ this.timerId = null;
27
+ }, this.remaining);
28
+ }
29
+ }
30
+
31
+ clear(): void {
32
+ if (this.timerId !== null) {
33
+ window.clearTimeout(this.timerId);
34
+ this.timerId = null;
35
+ }
36
+ }
37
+
38
+ reset(delay: number): void {
39
+ this.clear();
40
+ this.remaining = delay;
41
+ this.resume();
42
+ }
43
+ }
44
+
45
+ export default Timer;
@@ -0,0 +1,37 @@
1
+ # Документация компонента Tooltip
2
+
3
+ ## Обзор
4
+ Компонент `Tooltip` используется для отображения всплывающих подсказок при наведении курсора на элемент. Позволяет настраивать положение и ширину подсказки.
5
+
6
+ ## Свойства (Props)
7
+
8
+ - `content` (строка) – текст всплывающей подсказки. По умолчанию пустая строка.
9
+ - `position` (строка, необязательно) – определяет расположение подсказки. Возможные значения: `top`, `bottom`, `left`, `right`. По умолчанию `top`.
10
+ - `width` (строка, необязательно) – задаёт ширину подсказки. По умолчанию `200px`.
11
+
12
+ ## Состояния (States)
13
+
14
+ - `isVisible` (булево) – управляет отображением подсказки.
15
+
16
+ ## Методы
17
+
18
+ ### `showTooltip()`
19
+ Активирует отображение подсказки при наведении курсора.
20
+
21
+ ### `hideTooltip()`
22
+ Скрывает подсказку при уходе курсора.
23
+
24
+ ## Использование
25
+
26
+ ```vue
27
+ <Tooltip content="Подсказка" position="right" width="150px">
28
+ <button>Наведи курсор</button>
29
+ </Tooltip>
30
+ ```
31
+
32
+ ## Функциональность
33
+
34
+ - Отображает подсказку при наведении и скрывает при уходе курсора.
35
+ - Позволяет изменять положение подсказки.
36
+ - Настраивает ширину содержимого всплывающего окна.
37
+
@@ -0,0 +1,96 @@
1
+ <template>
2
+ <div
3
+ class="tooltip-container"
4
+ @mouseenter="showTooltip"
5
+ @mouseleave="hideTooltip"
6
+ >
7
+ <slot />
8
+
9
+ <div v-if="isVisible" class="tooltip" :class="props.position">
10
+ {{ props.content }}
11
+ </div>
12
+ </div>
13
+ </template>
14
+
15
+ <script setup lang="ts">
16
+ import { ref } from "vue";
17
+
18
+ interface TooltipProps {
19
+ content: string;
20
+ position?: "top" | "bottom" | "left" | "right";
21
+ width?: string;
22
+ }
23
+
24
+ const props = withDefaults(defineProps<TooltipProps>(), {
25
+ content: "",
26
+ position: "top",
27
+ width: "200px",
28
+ });
29
+
30
+ // states
31
+ const isVisible = ref<boolean>(false);
32
+
33
+ // functions
34
+ const showTooltip = (): void => {
35
+ isVisible.value = true;
36
+ }
37
+ const hideTooltip = (): void => {
38
+ isVisible.value = false;
39
+ }
40
+ </script>
41
+
42
+ <style scoped lang="scss">
43
+ .tooltip-container {
44
+ display: inline-block;
45
+ position: relative;
46
+ }
47
+
48
+ .tooltip {
49
+ position: absolute;
50
+ padding: 8px 12px;
51
+ background-color: #333;
52
+ color: #fff;
53
+ border-radius: 4px;
54
+ font-size: 14px;
55
+ line-height: 1.2;
56
+ white-space: normal;
57
+ z-index: 999;
58
+ width: v-bind(width);
59
+ opacity: 0;
60
+ animation: fadeIn 0.2s forwards ease;
61
+ }
62
+
63
+ @keyframes fadeIn {
64
+ to {
65
+ opacity: 1;
66
+ }
67
+ }
68
+
69
+ .tooltip.top {
70
+ bottom: 100%;
71
+ left: 50%;
72
+ transform: translateX(-50%);
73
+ margin-bottom: 8px;
74
+ }
75
+
76
+ .tooltip.bottom {
77
+ top: 100%;
78
+ left: 50%;
79
+ transform: translateX(-50%);
80
+ margin-top: 8px;
81
+ }
82
+
83
+ .tooltip.left {
84
+ top: 50%;
85
+ right: 100%;
86
+ transform: translateY(-50%);
87
+ margin-right: 8px;
88
+ }
89
+
90
+ .tooltip.right {
91
+ top: 50%;
92
+ left: 100%;
93
+ transform: translateY(-50%);
94
+ margin-left: 8px;
95
+ }
96
+ </style>
@@ -0,0 +1,5 @@
1
+ <template>
2
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
3
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M15.7592 1.51746C16.0803 1.17049 16.0803 0.607198 15.7592 0.260228C15.3311 -0.0867426 14.796 -0.0867426 14.4749 0.260228L7.94649 6.74237L1.52508 0.260228C1.09699 -0.0867426 0.561873 -0.0867426 0.240803 0.260228C-0.0802676 0.607198 -0.0802676 1.17049 0.240803 1.51746L6.76923 7.9996L0.240803 14.4828C-0.0802676 14.8298 -0.0802676 15.392 0.240803 15.739C0.561873 16.087 1.09699 16.087 1.52508 15.739L7.94649 9.25683L14.4749 15.739C14.796 16.087 15.3311 16.087 15.7592 15.739C16.0803 15.392 16.0803 14.8298 15.7592 14.4828L9.23077 7.9996L15.7592 1.51746Z" fill="white"/>
4
+ </svg>
5
+ </template>
@@ -0,0 +1,7 @@
1
+ <template>
2
+ <svg width="45" height="40" viewBox="0 0 45 40" fill="none" xmlns="http://www.w3.org/2000/svg">
3
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M42.8186 36.4103L23.3834 2.5641C22.9908 1.88034 22.0092 1.88034 21.6166 2.5641L2.1814 36.4103C1.78877 37.094 2.27955 37.9487 3.06481 37.9487H41.9352C42.7205 37.9487 43.2112 37.094 42.8186 36.4103ZM25.1503 1.53846C23.9724 -0.512819 21.0276 -0.512822 19.8498 1.53846L0.414562 35.3846C-0.763329 37.4359 0.709031 40 3.06481 40H41.9352C44.291 40 45.7633 37.4359 44.5854 35.3846L25.1503 1.53846Z" fill="white"/>
4
+ <rect x="21.6213" y="10.2565" width="2.04017" height="17.4359" rx="1.02008" fill="white"/>
5
+ <ellipse cx="22.712" cy="32.3076" rx="1.53012" ry="1.53846" fill="white"/>
6
+ </svg>
7
+ </template>
@@ -0,0 +1,7 @@
1
+ <template>
2
+ <svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
3
+ <circle cx="24" cy="24" r="22.5" stroke="white" stroke-width="3"/>
4
+ <rect x="22" y="18" width="4" height="20" rx="2" fill="white"/>
5
+ <circle cx="24" cy="12" r="2" fill="white"/>
6
+ </svg>
7
+ </template>
@@ -0,0 +1,6 @@
1
+ <template>
2
+ <svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
3
+ <circle cx="24" cy="24" r="22.5" stroke="white" stroke-width="3"/>
4
+ <path d="M35.04 14.4L19.86 33.6L12.96 24.8728" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
5
+ </svg>
6
+ </template>
@@ -0,0 +1,7 @@
1
+ <template>
2
+ <svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
3
+ <circle cx="24" cy="24" r="22.5" stroke="white" stroke-width="3"/>
4
+ <path d="M20.6759 13.9425C20.3227 11.8821 21.9096 10 24 10C26.0904 10 27.6773 11.8821 27.3241 13.9425L24.668 29.4368C24.6122 29.7622 24.3301 30 24 30C23.6699 30 23.3878 29.7622 23.332 29.4368L20.6759 13.9425Z" fill="white"/>
5
+ <circle cx="24" cy="36" r="2" fill="white"/>
6
+ </svg>
7
+ </template>