vgapp 1.5.7 → 1.5.8
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.
- package/app/langs/en/buttons.json +17 -17
- package/app/langs/en/messages.json +36 -36
- package/app/langs/ru/buttons.json +17 -17
- package/app/langs/ru/messages.json +1 -1
- package/app/modules/vgalert/js/vgalert.js +7 -7
- package/app/modules/vgalert/scss/_variables.scss +16 -16
- package/app/modules/vgcollapse/scss/_variables.scss +7 -7
- package/app/modules/vgcollapse/scss/vgcollapse.scss +5 -5
- package/app/modules/vgdropdown/scss/_variables.scss +14 -14
- package/app/modules/vgdropdown/scss/vgdropdown.scss +5 -5
- package/app/modules/vgfilepreview/js/i18n.js +56 -56
- package/app/modules/vgfilepreview/js/renderers/image-modal.js +145 -145
- package/app/modules/vgfilepreview/js/renderers/image.js +92 -92
- package/app/modules/vgfilepreview/js/renderers/index.js +19 -19
- package/app/modules/vgfilepreview/js/renderers/office-modal.js +168 -168
- package/app/modules/vgfilepreview/js/renderers/office.js +79 -79
- package/app/modules/vgfilepreview/js/renderers/pdf-modal.js +260 -260
- package/app/modules/vgfilepreview/js/renderers/pdf.js +76 -76
- package/app/modules/vgfilepreview/js/renderers/playlist.js +71 -71
- package/app/modules/vgfilepreview/js/renderers/text-modal.js +343 -343
- package/app/modules/vgfilepreview/js/renderers/text.js +83 -83
- package/app/modules/vgfilepreview/js/renderers/zip-modal.js +522 -522
- package/app/modules/vgfilepreview/js/renderers/zip.js +89 -89
- package/app/modules/vgfilepreview/readme.md +68 -68
- package/app/modules/vgfiles/js/base.js +198 -198
- package/app/modules/vgfiles/js/droppable.js +17 -17
- package/app/modules/vgfiles/js/render.js +153 -153
- package/app/modules/vgfiles/js/sortable.js +52 -52
- package/app/modules/vgfiles/js/vgfiles.js +43 -43
- package/app/modules/vgfiles/readme.md +123 -123
- package/app/modules/vgfiles/scss/_mixins.scss +13 -13
- package/app/modules/vgfiles/scss/_variables.scss +10 -10
- package/app/modules/vgfiles/scss/vgfiles.scss +28 -28
- package/app/modules/vgformsender/js/hideshowpass.js +22 -22
- package/app/modules/vgformsender/readme.md +1 -1
- package/app/modules/vgformsender/scss/_variables.scss +5 -5
- package/app/modules/vgformsender/scss/vgformsender.scss +42 -42
- package/app/modules/vglawcookie/js/vglawcookie.js +19 -19
- package/app/modules/vglawcookie/scss/_variables.scss +13 -13
- package/app/modules/vglawcookie/scss/vglawcookie.scss +5 -5
- package/app/modules/vgmodal/js/vgmodal.interaction.js +216 -216
- package/app/modules/vgmodal/js/vgmodal.js +9 -9
- package/app/modules/vgmodal/js/vgmodal.minimized.js +227 -227
- package/app/modules/vgmodal/scss/_variables.scss +17 -17
- package/app/modules/vgmodal/scss/vgmodal.scss +77 -77
- package/app/modules/vgnav/js/vgnav.js +62 -62
- package/app/modules/vgnav/scss/_breakpoints.scss +36 -36
- package/app/modules/vgnav/scss/_hamburger.scss +5 -5
- package/app/modules/vgnav/scss/_placement.scss +5 -5
- package/app/modules/vgnav/scss/_toggle.scss +5 -5
- package/app/modules/vgnav/scss/_variables.scss +26 -26
- package/app/modules/vgnav/scss/vgnav.scss +41 -41
- package/app/modules/vgnestable/README.md +39 -39
- package/app/modules/vgrangeslider/js/skins.js +8 -8
- package/app/modules/vgrangeslider/js/vgrangeslider.js +29 -29
- package/app/modules/vgrangeslider/scss/_variables.scss +55 -55
- package/app/modules/vgrangeslider/scss/vgrangeslider.scss +239 -239
- package/app/modules/vgrollup/js/vgrollup.js +15 -15
- package/app/modules/vgrollup/scss/_variables.scss +15 -15
- package/app/modules/vgrollup/scss/vgrollup.scss +6 -6
- package/app/modules/vgselect/js/handlers.js +6 -6
- package/app/modules/vgselect/js/vgselect.js +167 -123
- package/app/modules/vgselect/readme.md +11 -11
- package/app/modules/vgselect/scss/_variables.scss +51 -51
- package/app/modules/vgselect/scss/vgselect.scss +1 -1
- package/app/modules/vgsidebar/js/vgsidebar.js +21 -21
- package/app/modules/vgsidebar/scss/_variables.scss +10 -10
- package/app/modules/vgsidebar/scss/vgsidebar.scss +5 -5
- package/app/modules/vgspy/js/vgspy.js +43 -43
- package/app/modules/vgtable/js/_filters.js +10 -6
- package/app/modules/vgtable/js/_options.js +16 -16
- package/app/modules/vgtable/js/_pagination.js +118 -118
- package/app/modules/vgtable/js/_responsive.js +79 -79
- package/app/modules/vgtable/js/_sticky-header.js +349 -280
- package/app/modules/vgtable/js/vgtable.js +98 -98
- package/app/modules/vgtable/scss/_sorting.scss +6 -6
- package/app/modules/vgtable/scss/_sticky-header.scss +31 -31
- package/app/modules/vgtable/scss/_variables.scss +6 -4
- package/app/modules/vgtable/scss/vgtable.scss +8 -4
- package/app/modules/vgtabs/js/vgtabs.js +91 -91
- package/app/modules/vgtabs/scss/_variables.scss +23 -23
- package/app/modules/vgtabs/scss/vgtabs.scss +5 -5
- package/app/modules/vgtoast/js/vgtoast.js +4 -4
- package/app/modules/vgtoast/scss/_variables.scss +13 -13
- package/app/modules/vgtoast/scss/vgtoast.scss +5 -5
- package/app/modules/vgtooltip/js/vgtooltip.js +127 -127
- package/app/modules/vgtooltip/scss/_variables.scss +10 -10
- package/app/modules/vgtooltip/scss/vgtooltip.scss +5 -5
- package/app/utils/js/components/audio-metadata.js +240 -240
- package/app/utils/js/components/backdrop.js +116 -116
- package/app/utils/js/components/file-icon.js +7 -7
- package/app/utils/js/components/file-preview.js +304 -304
- package/app/utils/js/components/responsive.js +165 -165
- package/app/utils/js/components/sanitize.js +150 -150
- package/app/utils/js/components/video-metadata.js +140 -140
- package/app/utils/scss/_backdrop.scss +5 -5
- package/app/utils/scss/_theme-default.scss +12 -12
- package/app/utils/scss/_theme.scss +7 -7
- package/app/utils/scss/default.scss +9 -9
- package/app/utils/scss/functions.scss +21 -21
- package/app/utils/scss/index.scss +4 -4
- package/app/utils/scss/mixin.scss +16 -16
- package/app/utils/scss/variables.scss +147 -147
- package/build/vgapp.css +1 -1
- package/build/vgapp.css.map +1 -1
- package/build/vgapp.js +1 -1
- package/build/vgapp.js.map +1 -1
- package/index.js +7 -7
- package/package.json +1 -1
|
@@ -1,123 +1,123 @@
|
|
|
1
|
-
# VGFiles
|
|
2
|
-
|
|
3
|
-
`VGFiles` — модуль загрузки и управления файлами с поддержкой локального режима и AJAX.
|
|
4
|
-
|
|
5
|
-
## Новые фичи
|
|
6
|
-
|
|
7
|
-
- Поддержка `replace` для single-mode (`limits.count = 1`): новый файл заменяет предыдущий без накопления.
|
|
8
|
-
- Переименование входящих файлов через `rename: true | (file, index) => string`.
|
|
9
|
-
- `smartdrop`: глобальная подсветка dropzone, если на экране только одна видимая зона дропа.
|
|
10
|
-
- Расширенный lifecycle для внешних файлов из `data-file`: парсинг `customData`, `src/image`, бинарных метаданных.
|
|
11
|
-
- Интеграция с `VGFilePreview` в info-списке (`ui.nameOnly: true`) для inline-аудио, скачивания и предпросмотра по клику.
|
|
12
|
-
- Авто-обогащение аудиофайлов метаданными (title/cover) через `extractAudioMetadata`.
|
|
13
|
-
- Гибкие confirm-хуки для удаления (`removes.single.confirm`, `removes.all.confirm`) с контрактом `accepted/data`.
|
|
14
|
-
- Повторная загрузка упавших файлов через `data-vg-reload="file"` и кнопки retry.
|
|
15
|
-
- Проброс `customData` файла в `data-*` атрибуты элементов списка.
|
|
16
|
-
|
|
17
|
-
## Базовые возможности
|
|
18
|
-
|
|
19
|
-
- Выбор файлов через `<input type="file">` и drag&drop.
|
|
20
|
-
- Лимиты: количество, размер файла, общий размер, MIME-типы.
|
|
21
|
-
- Режимы загрузки: `sequential` и `parallel`.
|
|
22
|
-
- Автоматическая/ручная инициализация.
|
|
23
|
-
- Сортировка загруженных файлов с сохранением порядка на сервере.
|
|
24
|
-
- Удаление одного файла и очистка всего списка.
|
|
25
|
-
|
|
26
|
-
## Инициализация
|
|
27
|
-
|
|
28
|
-
```js
|
|
29
|
-
const files = new VGFiles(document.querySelector('.vg-files'), {
|
|
30
|
-
ajax: true,
|
|
31
|
-
smartdrop: true,
|
|
32
|
-
rename: true,
|
|
33
|
-
replace: true,
|
|
34
|
-
uploads: {
|
|
35
|
-
route: '/api/upload',
|
|
36
|
-
mode: 'sequential'
|
|
37
|
-
},
|
|
38
|
-
limits: {
|
|
39
|
-
count: 10,
|
|
40
|
-
sizes: 5,
|
|
41
|
-
total: 50
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
## Ключевые параметры
|
|
47
|
-
|
|
48
|
-
- `allowed` — разрешить drag-drop режим и особенности drop-зоны.
|
|
49
|
-
- `ajax` — включить серверную загрузку.
|
|
50
|
-
- `replace` (`default: true`) — замена файла в single-mode.
|
|
51
|
-
- `rename` (`default: false`) — переименование файлов до добавления в список.
|
|
52
|
-
- `smartdrop` (`default: false`) — глобальная логика подсказки drop-зоны.
|
|
53
|
-
- `prepend` (`default: true`) — добавление новых файлов в начало.
|
|
54
|
-
- `uploads.mode` — `'sequential' | 'parallel'`.
|
|
55
|
-
- `uploads.maxParallel`, `uploads.maxConcurrent`, `uploads.retryAttempts`, `uploads.retryDelay`.
|
|
56
|
-
- `removes.single.confirm`, `removes.all.confirm` — кастомные confirm-обработчики.
|
|
57
|
-
- `sortable.enabled`, `sortable.route`, `sortable.handle`, `sortable.lists`.
|
|
58
|
-
|
|
59
|
-
## Внешние (уже загруженные) файлы
|
|
60
|
-
|
|
61
|
-
Модуль может стартовать с предзаполненным списком через `data-file` в `<li>`.
|
|
62
|
-
|
|
63
|
-
Поддерживаемые поля объекта:
|
|
64
|
-
|
|
65
|
-
- `id`, `name`, `size`, `type`, `src` (обязательный набор для валидного внешнего файла)
|
|
66
|
-
- `image` (опционально)
|
|
67
|
-
- `lastModified` / `last-modified` (опционально)
|
|
68
|
-
- любые дополнительные поля -> попадают в `customData`
|
|
69
|
-
|
|
70
|
-
`customData` дальше пробрасывается в `data-*` атрибуты элементов файла и может использоваться в шаблонах/интеграциях.
|
|
71
|
-
|
|
72
|
-
## AJAX-события и callbacks
|
|
73
|
-
|
|
74
|
-
DOM-события:
|
|
75
|
-
|
|
76
|
-
- `vg.files.change`
|
|
77
|
-
- `vg.files.upload.start`
|
|
78
|
-
- `vg.files.upload.progress`
|
|
79
|
-
- `vg.files.upload.complete`
|
|
80
|
-
- `vg.files.upload.error`
|
|
81
|
-
- `vg.files.upload.allComplete`
|
|
82
|
-
- `vg.files.remove`
|
|
83
|
-
- `vg.files.reload`
|
|
84
|
-
|
|
85
|
-
Callbacks (`params.callbacks`):
|
|
86
|
-
|
|
87
|
-
- `onInit`
|
|
88
|
-
- `onChange` (`{ files, input, inputFiles }`)
|
|
89
|
-
- `onUploadStart`
|
|
90
|
-
- `onUploadProgress`
|
|
91
|
-
- `onUploadComplete`
|
|
92
|
-
- `onUploadError`
|
|
93
|
-
- `onUploadAllComplete`
|
|
94
|
-
- `onRemoveFile`
|
|
95
|
-
- `onClear`
|
|
96
|
-
- `onReload`
|
|
97
|
-
|
|
98
|
-
## Удаление с кастомным confirm
|
|
99
|
-
|
|
100
|
-
Если передан `removes.single.confirm` или `removes.all.confirm`, модуль вызывает вашу функцию вместо стандартного `VGAlert`.
|
|
101
|
-
|
|
102
|
-
Контракт результата:
|
|
103
|
-
|
|
104
|
-
- `true` или `{ accepted: true }` — подтвердить.
|
|
105
|
-
- `false` или `{ accepted: false }` — отменить.
|
|
106
|
-
- `{ accepted: true, data }` — подтвердить и использовать готовый ответ удаления (без дополнительного AJAX-запроса).
|
|
107
|
-
|
|
108
|
-
## Статусы файлов
|
|
109
|
-
|
|
110
|
-
- `pending` — ожидает загрузки.
|
|
111
|
-
- `loading` — идет загрузка.
|
|
112
|
-
- `completed` — успешно загружен.
|
|
113
|
-
- `failing` — ошибка загрузки (доступен reload).
|
|
114
|
-
|
|
115
|
-
## Методы API
|
|
116
|
-
|
|
117
|
-
- `upload(file)`
|
|
118
|
-
- `uploadAll(files)`
|
|
119
|
-
- `reload(button)`
|
|
120
|
-
- `removeFile(button)`
|
|
121
|
-
- `clear(resetInput, uiOnly)`
|
|
122
|
-
- `dispose()`
|
|
123
|
-
|
|
1
|
+
# VGFiles
|
|
2
|
+
|
|
3
|
+
`VGFiles` — модуль загрузки и управления файлами с поддержкой локального режима и AJAX.
|
|
4
|
+
|
|
5
|
+
## Новые фичи
|
|
6
|
+
|
|
7
|
+
- Поддержка `replace` для single-mode (`limits.count = 1`): новый файл заменяет предыдущий без накопления.
|
|
8
|
+
- Переименование входящих файлов через `rename: true | (file, index) => string`.
|
|
9
|
+
- `smartdrop`: глобальная подсветка dropzone, если на экране только одна видимая зона дропа.
|
|
10
|
+
- Расширенный lifecycle для внешних файлов из `data-file`: парсинг `customData`, `src/image`, бинарных метаданных.
|
|
11
|
+
- Интеграция с `VGFilePreview` в info-списке (`ui.nameOnly: true`) для inline-аудио, скачивания и предпросмотра по клику.
|
|
12
|
+
- Авто-обогащение аудиофайлов метаданными (title/cover) через `extractAudioMetadata`.
|
|
13
|
+
- Гибкие confirm-хуки для удаления (`removes.single.confirm`, `removes.all.confirm`) с контрактом `accepted/data`.
|
|
14
|
+
- Повторная загрузка упавших файлов через `data-vg-reload="file"` и кнопки retry.
|
|
15
|
+
- Проброс `customData` файла в `data-*` атрибуты элементов списка.
|
|
16
|
+
|
|
17
|
+
## Базовые возможности
|
|
18
|
+
|
|
19
|
+
- Выбор файлов через `<input type="file">` и drag&drop.
|
|
20
|
+
- Лимиты: количество, размер файла, общий размер, MIME-типы.
|
|
21
|
+
- Режимы загрузки: `sequential` и `parallel`.
|
|
22
|
+
- Автоматическая/ручная инициализация.
|
|
23
|
+
- Сортировка загруженных файлов с сохранением порядка на сервере.
|
|
24
|
+
- Удаление одного файла и очистка всего списка.
|
|
25
|
+
|
|
26
|
+
## Инициализация
|
|
27
|
+
|
|
28
|
+
```js
|
|
29
|
+
const files = new VGFiles(document.querySelector('.vg-files'), {
|
|
30
|
+
ajax: true,
|
|
31
|
+
smartdrop: true,
|
|
32
|
+
rename: true,
|
|
33
|
+
replace: true,
|
|
34
|
+
uploads: {
|
|
35
|
+
route: '/api/upload',
|
|
36
|
+
mode: 'sequential'
|
|
37
|
+
},
|
|
38
|
+
limits: {
|
|
39
|
+
count: 10,
|
|
40
|
+
sizes: 5,
|
|
41
|
+
total: 50
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Ключевые параметры
|
|
47
|
+
|
|
48
|
+
- `allowed` — разрешить drag-drop режим и особенности drop-зоны.
|
|
49
|
+
- `ajax` — включить серверную загрузку.
|
|
50
|
+
- `replace` (`default: true`) — замена файла в single-mode.
|
|
51
|
+
- `rename` (`default: false`) — переименование файлов до добавления в список.
|
|
52
|
+
- `smartdrop` (`default: false`) — глобальная логика подсказки drop-зоны.
|
|
53
|
+
- `prepend` (`default: true`) — добавление новых файлов в начало.
|
|
54
|
+
- `uploads.mode` — `'sequential' | 'parallel'`.
|
|
55
|
+
- `uploads.maxParallel`, `uploads.maxConcurrent`, `uploads.retryAttempts`, `uploads.retryDelay`.
|
|
56
|
+
- `removes.single.confirm`, `removes.all.confirm` — кастомные confirm-обработчики.
|
|
57
|
+
- `sortable.enabled`, `sortable.route`, `sortable.handle`, `sortable.lists`.
|
|
58
|
+
|
|
59
|
+
## Внешние (уже загруженные) файлы
|
|
60
|
+
|
|
61
|
+
Модуль может стартовать с предзаполненным списком через `data-file` в `<li>`.
|
|
62
|
+
|
|
63
|
+
Поддерживаемые поля объекта:
|
|
64
|
+
|
|
65
|
+
- `id`, `name`, `size`, `type`, `src` (обязательный набор для валидного внешнего файла)
|
|
66
|
+
- `image` (опционально)
|
|
67
|
+
- `lastModified` / `last-modified` (опционально)
|
|
68
|
+
- любые дополнительные поля -> попадают в `customData`
|
|
69
|
+
|
|
70
|
+
`customData` дальше пробрасывается в `data-*` атрибуты элементов файла и может использоваться в шаблонах/интеграциях.
|
|
71
|
+
|
|
72
|
+
## AJAX-события и callbacks
|
|
73
|
+
|
|
74
|
+
DOM-события:
|
|
75
|
+
|
|
76
|
+
- `vg.files.change`
|
|
77
|
+
- `vg.files.upload.start`
|
|
78
|
+
- `vg.files.upload.progress`
|
|
79
|
+
- `vg.files.upload.complete`
|
|
80
|
+
- `vg.files.upload.error`
|
|
81
|
+
- `vg.files.upload.allComplete`
|
|
82
|
+
- `vg.files.remove`
|
|
83
|
+
- `vg.files.reload`
|
|
84
|
+
|
|
85
|
+
Callbacks (`params.callbacks`):
|
|
86
|
+
|
|
87
|
+
- `onInit`
|
|
88
|
+
- `onChange` (`{ files, input, inputFiles }`)
|
|
89
|
+
- `onUploadStart`
|
|
90
|
+
- `onUploadProgress`
|
|
91
|
+
- `onUploadComplete`
|
|
92
|
+
- `onUploadError`
|
|
93
|
+
- `onUploadAllComplete`
|
|
94
|
+
- `onRemoveFile`
|
|
95
|
+
- `onClear`
|
|
96
|
+
- `onReload`
|
|
97
|
+
|
|
98
|
+
## Удаление с кастомным confirm
|
|
99
|
+
|
|
100
|
+
Если передан `removes.single.confirm` или `removes.all.confirm`, модуль вызывает вашу функцию вместо стандартного `VGAlert`.
|
|
101
|
+
|
|
102
|
+
Контракт результата:
|
|
103
|
+
|
|
104
|
+
- `true` или `{ accepted: true }` — подтвердить.
|
|
105
|
+
- `false` или `{ accepted: false }` — отменить.
|
|
106
|
+
- `{ accepted: true, data }` — подтвердить и использовать готовый ответ удаления (без дополнительного AJAX-запроса).
|
|
107
|
+
|
|
108
|
+
## Статусы файлов
|
|
109
|
+
|
|
110
|
+
- `pending` — ожидает загрузки.
|
|
111
|
+
- `loading` — идет загрузка.
|
|
112
|
+
- `completed` — успешно загружен.
|
|
113
|
+
- `failing` — ошибка загрузки (доступен reload).
|
|
114
|
+
|
|
115
|
+
## Методы API
|
|
116
|
+
|
|
117
|
+
- `upload(file)`
|
|
118
|
+
- `uploadAll(files)`
|
|
119
|
+
- `reload(button)`
|
|
120
|
+
- `removeFile(button)`
|
|
121
|
+
- `clear(resetInput, uiOnly)`
|
|
122
|
+
- `dispose()`
|
|
123
|
+
|
|
@@ -23,19 +23,19 @@
|
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
@mixin vgfiles-state() {
|
|
27
|
-
&.hide-custom-buttons-on-upload-state {
|
|
28
|
-
&.pending,
|
|
29
|
-
&.loading,
|
|
30
|
-
&.failing {
|
|
31
|
-
.file-actions,
|
|
32
|
-
.file-custom > :not(.file-remove):not(.file-info) {
|
|
33
|
-
display: none;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
&.pending {
|
|
26
|
+
@mixin vgfiles-state() {
|
|
27
|
+
&.hide-custom-buttons-on-upload-state {
|
|
28
|
+
&.pending,
|
|
29
|
+
&.loading,
|
|
30
|
+
&.failing {
|
|
31
|
+
.file-actions,
|
|
32
|
+
.file-custom > :not(.file-remove):not(.file-info) {
|
|
33
|
+
display: none;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
&.pending {
|
|
39
39
|
> * {
|
|
40
40
|
opacity: .32;
|
|
41
41
|
pointer-events: none;
|
|
@@ -9,16 +9,16 @@ $files-map: (
|
|
|
9
9
|
label-padding: 8px 24px,
|
|
10
10
|
label-padding-icon: 8px 16px,
|
|
11
11
|
|
|
12
|
-
// errors
|
|
13
|
-
errors-padding-y: 10px,
|
|
14
|
-
errors-padding-x: 12px,
|
|
15
|
-
errors-font-size: 16px,
|
|
16
|
-
errors-gap: 4px,
|
|
17
|
-
errors-margin-bottom: 8px,
|
|
18
|
-
errors-bg: var(--vg-danger-subtle-bg, rgba(255, 42, 44, .06)),
|
|
19
|
-
errors-border-color: var(--vg-danger-color, var(--vg-danger, #ff2a2c)),
|
|
20
|
-
errors-border-width: 3px,
|
|
21
|
-
errors-border-radius: 6px,
|
|
12
|
+
// errors
|
|
13
|
+
errors-padding-y: 10px,
|
|
14
|
+
errors-padding-x: 12px,
|
|
15
|
+
errors-font-size: 16px,
|
|
16
|
+
errors-gap: 4px,
|
|
17
|
+
errors-margin-bottom: 8px,
|
|
18
|
+
errors-bg: var(--vg-danger-subtle-bg, rgba(255, 42, 44, .06)),
|
|
19
|
+
errors-border-color: var(--vg-danger-color, var(--vg-danger, #ff2a2c)),
|
|
20
|
+
errors-border-width: 3px,
|
|
21
|
+
errors-border-radius: 6px,
|
|
22
22
|
|
|
23
23
|
// drop zone
|
|
24
24
|
drop-bg: var(--vg-secondary-bg, #{vg.$surface-muted-bg}),
|
|
@@ -61,18 +61,18 @@
|
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
-
&-errors {
|
|
65
|
-
display: grid;
|
|
66
|
-
gap: var(--vg-files-errors-gap);
|
|
67
|
-
padding: var(--vg-files-errors-padding-y) var(--vg-files-errors-padding-x);
|
|
68
|
-
margin-bottom: var(--vg-files-errors-margin-bottom);
|
|
69
|
-
border-left: var(--vg-files-errors-border-width) solid var(--vg-files-errors-border-color);
|
|
70
|
-
border-radius: var(--vg-files-errors-border-radius);
|
|
71
|
-
background: var(--vg-files-errors-bg);
|
|
72
|
-
|
|
73
|
-
span {
|
|
74
|
-
font-size: var(--vg-files-errors-font-size);
|
|
75
|
-
color: var(--vg-danger-color, var(--vg-danger, #ff2a2c));
|
|
64
|
+
&-errors {
|
|
65
|
+
display: grid;
|
|
66
|
+
gap: var(--vg-files-errors-gap);
|
|
67
|
+
padding: var(--vg-files-errors-padding-y) var(--vg-files-errors-padding-x);
|
|
68
|
+
margin-bottom: var(--vg-files-errors-margin-bottom);
|
|
69
|
+
border-left: var(--vg-files-errors-border-width) solid var(--vg-files-errors-border-color);
|
|
70
|
+
border-radius: var(--vg-files-errors-border-radius);
|
|
71
|
+
background: var(--vg-files-errors-bg);
|
|
72
|
+
|
|
73
|
+
span {
|
|
74
|
+
font-size: var(--vg-files-errors-font-size);
|
|
75
|
+
color: var(--vg-danger-color, var(--vg-danger, #ff2a2c));
|
|
76
76
|
display: block;
|
|
77
77
|
overflow: hidden;
|
|
78
78
|
text-overflow: ellipsis;
|
|
@@ -523,18 +523,18 @@
|
|
|
523
523
|
}
|
|
524
524
|
}
|
|
525
525
|
|
|
526
|
-
.file-failing-actions {
|
|
526
|
+
.file-failing-actions {
|
|
527
527
|
display: inline-flex;
|
|
528
528
|
align-items: center;
|
|
529
529
|
gap: var(--vg-files-info-failing-actions-gap);
|
|
530
|
-
}
|
|
531
|
-
|
|
532
|
-
&-info--list {
|
|
533
|
-
.file.validation-error {
|
|
534
|
-
box-shadow: inset 0 0 0 2px var(--vg-danger-color, var(--vg-danger, #ff2a2c));
|
|
535
|
-
}
|
|
536
|
-
|
|
537
|
-
.file.failing {
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
&-info--list {
|
|
533
|
+
.file.validation-error {
|
|
534
|
+
box-shadow: inset 0 0 0 2px var(--vg-danger-color, var(--vg-danger, #ff2a2c));
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
.file.failing {
|
|
538
538
|
.file-remove {
|
|
539
539
|
margin-left: var(--vg-files-info-failing-actions-margin-start);
|
|
540
540
|
}
|
|
@@ -644,7 +644,7 @@
|
|
|
644
644
|
}
|
|
645
645
|
}
|
|
646
646
|
|
|
647
|
-
&--list {
|
|
647
|
+
&--list {
|
|
648
648
|
display: flex;
|
|
649
649
|
align-items: center;
|
|
650
650
|
gap: var(--vg-files-drop-list-gap);
|
|
@@ -656,7 +656,7 @@
|
|
|
656
656
|
border-radius: var(--vg-files-drop-radius);
|
|
657
657
|
overflow: hidden;
|
|
658
658
|
|
|
659
|
-
.file {
|
|
659
|
+
.file {
|
|
660
660
|
--vg-button-color: var(--vg-text-color, var(--vg-body-color, #000000));
|
|
661
661
|
border-radius: var(--vg-files-drop-file-radius);
|
|
662
662
|
position: relative;
|
|
@@ -665,11 +665,11 @@
|
|
|
665
665
|
height: var(--vg-files-drop-file-height);
|
|
666
666
|
|
|
667
667
|
@include files.vgfiles-sortable();
|
|
668
|
-
@include files.vgfiles-state();
|
|
669
|
-
|
|
670
|
-
&.validation-error {
|
|
671
|
-
box-shadow: inset 0 0 0 2px var(--vg-danger-color, var(--vg-danger, #ff2a2c));
|
|
672
|
-
}
|
|
668
|
+
@include files.vgfiles-state();
|
|
669
|
+
|
|
670
|
+
&.validation-error {
|
|
671
|
+
box-shadow: inset 0 0 0 2px var(--vg-danger-color, var(--vg-danger, #ff2a2c));
|
|
672
|
+
}
|
|
673
673
|
|
|
674
674
|
.file-image {
|
|
675
675
|
width: 100%;
|
|
@@ -12,18 +12,18 @@ const NAME = 'hideshowpass';
|
|
|
12
12
|
const NAME_KEY = 'vg.hideshowpass';
|
|
13
13
|
const SELECTOR_DATA_TOGGLE= '[data-vg-toggle="pass"]';
|
|
14
14
|
|
|
15
|
-
const CLASS_NAME_SHOW = 'show';
|
|
16
|
-
const CLASS_NAME_FOCUS_OFFSET = 'vg-form-sender--content-pass-focus-offset';
|
|
15
|
+
const CLASS_NAME_SHOW = 'show';
|
|
16
|
+
const CLASS_NAME_FOCUS_OFFSET = 'vg-form-sender--content-pass-focus-offset';
|
|
17
17
|
|
|
18
18
|
const EVENT_KEY_CLICK_DATA_API = `click.${NAME_KEY}.data.api`;
|
|
19
19
|
|
|
20
20
|
class VGHideShowPass extends BaseModule{
|
|
21
|
-
constructor(el, params = {}) {
|
|
22
|
-
super(el, params);
|
|
23
|
-
|
|
24
|
-
this._params = this._getParams(el, mergeDeepObject({
|
|
25
|
-
parentClass: 'vg-form-sender--content-pass'
|
|
26
|
-
}, params));
|
|
21
|
+
constructor(el, params = {}) {
|
|
22
|
+
super(el, params);
|
|
23
|
+
|
|
24
|
+
this._params = this._getParams(el, mergeDeepObject({
|
|
25
|
+
parentClass: 'vg-form-sender--content-pass'
|
|
26
|
+
}, params));
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
static get NAME() {
|
|
@@ -63,19 +63,19 @@ class VGHideShowPass extends BaseModule{
|
|
|
63
63
|
instance.build(false);
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
-
build(isShow = false) {
|
|
67
|
-
let classes = this._params.classes.join(' '), elm = '';
|
|
68
|
-
const HTML = Html('string');
|
|
69
|
-
if (this._element.parentElement && this._params.parentClass) {
|
|
70
|
-
this._element.parentElement.classList.add(this._params.parentClass);
|
|
71
|
-
this._element.parentElement.classList.toggle(
|
|
72
|
-
CLASS_NAME_FOCUS_OFFSET,
|
|
73
|
-
this._params.focus === true
|
|
74
|
-
);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
if (!isShow) {
|
|
78
|
-
elm = HTML.component('eye', {class: classes});
|
|
66
|
+
build(isShow = false) {
|
|
67
|
+
let classes = this._params.classes.join(' '), elm = '';
|
|
68
|
+
const HTML = Html('string');
|
|
69
|
+
if (this._element.parentElement && this._params.parentClass) {
|
|
70
|
+
this._element.parentElement.classList.add(this._params.parentClass);
|
|
71
|
+
this._element.parentElement.classList.toggle(
|
|
72
|
+
CLASS_NAME_FOCUS_OFFSET,
|
|
73
|
+
this._params.focus === true
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (!isShow) {
|
|
78
|
+
elm = HTML.component('eye', {class: classes});
|
|
79
79
|
} else {
|
|
80
80
|
elm = HTML.component('eye', {class: classes, type: 'hide'});
|
|
81
81
|
}
|
|
@@ -105,4 +105,4 @@ EventHandler.on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, functi
|
|
|
105
105
|
instance.toggle(this);
|
|
106
106
|
});
|
|
107
107
|
|
|
108
|
-
export default VGHideShowPass
|
|
108
|
+
export default VGHideShowPass
|
|
@@ -78,7 +78,7 @@ VGFormSender.init(document.getElementById('contactForm'), {
|
|
|
78
78
|
| `response.enabled` | `boolean` | `false` | Нативная обработка ответа (без AJAX) |
|
|
79
79
|
| `submit` | `boolean` | `false` | Отправлять нативно (без AJAX) |
|
|
80
80
|
| `fields` | `Array` | `[]` | Доп. данные для отправки |
|
|
81
|
-
| `pass.focus` | `boolean` | `false` | Увеличивать правый отступ поля и сдвигать иконку глаза при фокусе |
|
|
81
|
+
| `pass.focus` | `boolean` | `false` | Увеличивать правый отступ поля и сдвигать иконку глаза при фокусе |
|
|
82
82
|
| `alert.enabled` | `boolean` | `true` | Показывать уведомления |
|
|
83
83
|
| `alert.type` | `'modal' \| 'collapse'` | `'modal'` | Тип уведомления |
|
|
84
84
|
| `alert.errors` | `boolean` | `true` | Показывать детали ошибок |
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
@use "../../../utils/scss" as vg;
|
|
2
|
-
|
|
3
|
-
$form-sender-map: (
|
|
4
|
-
'eye-color': var(--vg-text-color, #{vg.$color})
|
|
5
|
-
) !default;
|
|
1
|
+
@use "../../../utils/scss" as vg;
|
|
2
|
+
|
|
3
|
+
$form-sender-map: (
|
|
4
|
+
'eye-color': var(--vg-text-color, #{vg.$color})
|
|
5
|
+
) !default;
|
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
*--------------------------------------------------------------------------
|
|
7
7
|
**/
|
|
8
8
|
|
|
9
|
-
@forward "variables";
|
|
10
|
-
@use "../../../utils/scss" as vg;
|
|
11
|
-
@use "variables" as vars;
|
|
9
|
+
@forward "variables";
|
|
10
|
+
@use "../../../utils/scss" as vg;
|
|
11
|
+
@use "variables" as vars;
|
|
12
12
|
|
|
13
13
|
.vg-form-sender {
|
|
14
|
-
@include vg.mix-vars('form-sender', vars.$form-sender-map);
|
|
14
|
+
@include vg.mix-vars('form-sender', vars.$form-sender-map);
|
|
15
15
|
|
|
16
16
|
&-modal {
|
|
17
17
|
.vg-modal-content {
|
|
@@ -19,21 +19,21 @@
|
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
&--content {
|
|
23
|
-
position: relative;
|
|
24
|
-
|
|
25
|
-
&-pass-focus-offset {
|
|
26
|
-
&:focus-within {
|
|
27
|
-
input {
|
|
28
|
-
padding-right: 5rem;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
.vg-form-sender--hide-show-pass {
|
|
32
|
-
right: 44px;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
}
|
|
22
|
+
&--content {
|
|
23
|
+
position: relative;
|
|
24
|
+
|
|
25
|
+
&-pass-focus-offset {
|
|
26
|
+
&:focus-within {
|
|
27
|
+
input {
|
|
28
|
+
padding-right: 5rem;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.vg-form-sender--hide-show-pass {
|
|
32
|
+
right: 44px;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
37
|
|
|
38
38
|
&--hide-show-pass {
|
|
39
39
|
position: absolute;
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
width: 22px;
|
|
43
43
|
height: 22px;
|
|
44
44
|
cursor: pointer;
|
|
45
|
-
transition: vg.$transition-base;
|
|
45
|
+
transition: vg.$transition-base;
|
|
46
46
|
|
|
47
47
|
svg {
|
|
48
48
|
path {
|
|
@@ -51,35 +51,35 @@
|
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
&.was-validated {
|
|
55
|
-
.vg-form-sender--hide-show-pass {
|
|
56
|
-
right: 34px;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
.vg-form-sender--content-pass-focus-offset {
|
|
60
|
-
&:focus-within {
|
|
61
|
-
input {
|
|
62
|
-
padding-right: 6.25rem;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
.vg-form-sender--hide-show-pass {
|
|
66
|
-
right: 64px;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
54
|
+
&.was-validated {
|
|
55
|
+
.vg-form-sender--hide-show-pass {
|
|
56
|
+
right: 34px;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.vg-form-sender--content-pass-focus-offset {
|
|
60
|
+
&:focus-within {
|
|
61
|
+
input {
|
|
62
|
+
padding-right: 6.25rem;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.vg-form-sender--hide-show-pass {
|
|
66
|
+
right: 64px;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
72
|
|
|
73
73
|
.vg-form-sender-alert {
|
|
74
|
-
@include vg.mix-alert-color-mode($class: vg-form-sender-alert);
|
|
74
|
+
@include vg.mix-alert-color-mode($class: vg-form-sender-alert);
|
|
75
75
|
background-color: var(--vg-form-sender-alert-background-color);
|
|
76
76
|
border: 1px solid var(--vg-form-sender-alert-border-color) ;
|
|
77
|
-
border-radius: var(--vg-border-radius, #{vg.$border-radius});
|
|
77
|
+
border-radius: var(--vg-border-radius, #{vg.$border-radius});
|
|
78
78
|
|
|
79
79
|
.vg-btn-close {
|
|
80
80
|
svg {
|
|
81
81
|
path {
|
|
82
|
-
fill: var(--vg-form-sender-alert-close);
|
|
82
|
+
fill: var(--vg-form-sender-alert-close);
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
85
|
}
|
|
@@ -125,4 +125,4 @@
|
|
|
125
125
|
.vg-form-sender-alert-content--text {
|
|
126
126
|
font-size: 1.25rem;
|
|
127
127
|
color: var(--vg-form-sender-alert-color);
|
|
128
|
-
}
|
|
128
|
+
}
|
|
@@ -146,15 +146,15 @@ class VGLawCookie extends BaseModule {
|
|
|
146
146
|
}
|
|
147
147
|
|
|
148
148
|
/**
|
|
149
|
-
* Сбрасывает согласие, не затрагивая остальные данные хранилища
|
|
150
|
-
*/
|
|
151
|
-
static reset() {
|
|
152
|
-
const { name } = VGLawCookie.getDefaultParams().cookie;
|
|
153
|
-
|
|
154
|
-
Cookies.remove(name);
|
|
155
|
-
localStorage.removeItem(name);
|
|
156
|
-
location.reload();
|
|
157
|
-
}
|
|
149
|
+
* Сбрасывает согласие, не затрагивая остальные данные хранилища
|
|
150
|
+
*/
|
|
151
|
+
static reset() {
|
|
152
|
+
const { name } = VGLawCookie.getDefaultParams().cookie;
|
|
153
|
+
|
|
154
|
+
Cookies.remove(name);
|
|
155
|
+
localStorage.removeItem(name);
|
|
156
|
+
location.reload();
|
|
157
|
+
}
|
|
158
158
|
|
|
159
159
|
/**
|
|
160
160
|
* Возвращает дефолтные параметры (для доступа без инстанса)
|
|
@@ -165,13 +165,13 @@ class VGLawCookie extends BaseModule {
|
|
|
165
165
|
}, {});
|
|
166
166
|
}
|
|
167
167
|
|
|
168
|
-
dispose() {
|
|
169
|
-
const { name } = this._params.cookie;
|
|
170
|
-
|
|
171
|
-
Cookies.remove(name);
|
|
172
|
-
localStorage.removeItem(name);
|
|
173
|
-
super.dispose();
|
|
174
|
-
}
|
|
168
|
+
dispose() {
|
|
169
|
+
const { name } = this._params.cookie;
|
|
170
|
+
|
|
171
|
+
Cookies.remove(name);
|
|
172
|
+
localStorage.removeItem(name);
|
|
173
|
+
super.dispose();
|
|
174
|
+
}
|
|
175
175
|
|
|
176
176
|
/**
|
|
177
177
|
* Инициализация модуля
|
|
@@ -216,7 +216,7 @@ EventHandler.on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE_CLEAR,
|
|
|
216
216
|
|
|
217
217
|
const instance = VGLawCookie.getOrCreateInstance(element);
|
|
218
218
|
instance.dispose();
|
|
219
|
-
VGLawCookie.reset(); // Сброс согласия
|
|
220
|
-
});
|
|
219
|
+
VGLawCookie.reset(); // Сброс согласия
|
|
220
|
+
});
|
|
221
221
|
|
|
222
|
-
export default VGLawCookie;
|
|
222
|
+
export default VGLawCookie;
|