vgapp 0.0.1

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 (48) hide show
  1. package/.gitattributes +1 -0
  2. package/CHANGELOG.md +0 -0
  3. package/LICENSE +21 -0
  4. package/README.md +1 -0
  5. package/app/modules/base-module.js +97 -0
  6. package/app/modules/module-fn.js +119 -0
  7. package/app/modules/vgcollapse/js/vgcollapse.js +219 -0
  8. package/app/modules/vgdropdown/js/vgdropdown.js +279 -0
  9. package/app/modules/vgdropdown/scss/_variables.scss +9 -0
  10. package/app/modules/vgdropdown/scss/vgdropdown.scss +41 -0
  11. package/app/modules/vgformsender/js/vgformsender.js +400 -0
  12. package/app/modules/vgformsender/scss/vgformsender.scss +19 -0
  13. package/app/modules/vgmodal/js/vgmodal.js +346 -0
  14. package/app/modules/vgmodal/scss/_variables.scss +25 -0
  15. package/app/modules/vgmodal/scss/vgmodal.scss +111 -0
  16. package/app/modules/vgnav/js/vgnav.js +498 -0
  17. package/app/modules/vgnav/scss/_breakpoints.scss +127 -0
  18. package/app/modules/vgnav/scss/_hamburger.scss +62 -0
  19. package/app/modules/vgnav/scss/_placement.scss +70 -0
  20. package/app/modules/vgnav/scss/_toggle.scss +20 -0
  21. package/app/modules/vgnav/scss/_variables.scss +68 -0
  22. package/app/modules/vgnav/scss/vgnav.scss +150 -0
  23. package/app/modules/vgsidebar/js/vgsidebar.js +165 -0
  24. package/app/modules/vgsidebar/scss/_variables.scss +19 -0
  25. package/app/modules/vgsidebar/scss/vgsidebar.scss +90 -0
  26. package/app/utils/js/components/backdrop.js +54 -0
  27. package/app/utils/js/components/overflow.js +28 -0
  28. package/app/utils/js/components/params.js +44 -0
  29. package/app/utils/js/components/placement.js +59 -0
  30. package/app/utils/js/components/responsive.js +83 -0
  31. package/app/utils/js/components/scrollbar.js +114 -0
  32. package/app/utils/js/dom/data.js +51 -0
  33. package/app/utils/js/dom/event.js +331 -0
  34. package/app/utils/js/dom/manipulator.js +62 -0
  35. package/app/utils/js/dom/selectors.js +65 -0
  36. package/app/utils/js/functions.js +272 -0
  37. package/app/utils/scss/animate.scss +4074 -0
  38. package/app/utils/scss/default.scss +277 -0
  39. package/app/utils/scss/functions.scss +3 -0
  40. package/app/utils/scss/mixin.scss +11 -0
  41. package/app/utils/scss/variables.scss +80 -0
  42. package/build/vgapp.css +4538 -0
  43. package/build/vgapp.css.map +1 -0
  44. package/build/vgapp.js +3230 -0
  45. package/build/vgapp.js.map +1 -0
  46. package/index.js +29 -0
  47. package/package.json +43 -0
  48. package/webpack.config.js +63 -0
@@ -0,0 +1,70 @@
1
+ &.vg-nav-horizontal {
2
+ .vg-nav-wrapper {
3
+ flex-direction: row;
4
+
5
+ .dropdown {
6
+ > ul {
7
+ &.left, .left {
8
+ left: 0;
9
+ }
10
+
11
+ &.right, .right {
12
+ right: 0;
13
+ }
14
+
15
+ .dropdown {
16
+ ul.left {
17
+ left: 100%;
18
+ }
19
+
20
+ ul.right {
21
+ right: 100%;
22
+ }
23
+ }
24
+ }
25
+ }
26
+ }
27
+ }
28
+
29
+ &.vg-nav-vertical {
30
+ .vg-nav-wrapper {
31
+ flex-direction: column;
32
+
33
+ .dropdown {
34
+ > ul {
35
+ top: 100%;
36
+
37
+ &.left, .left {
38
+ left: 100%;
39
+ }
40
+
41
+ &.right, .right {
42
+ right: 100%;
43
+ }
44
+
45
+ &.fade {
46
+ top: 0;
47
+ }
48
+ }
49
+
50
+ &.show {
51
+ > ul {
52
+ top: 0;
53
+ }
54
+ }
55
+ }
56
+
57
+ .dropdown-mega {
58
+ position: relative;
59
+
60
+ .dropdown-mega-container {
61
+ left: 100%;
62
+ top: 100%;
63
+
64
+ &.fade {
65
+ top: 0;
66
+ }
67
+ }
68
+ }
69
+ }
70
+ }
@@ -0,0 +1,20 @@
1
+ .toggle {
2
+ transition: var(--vg-nav-transition);
3
+ transform: rotate(0);
4
+
5
+ span {
6
+ &.default {
7
+ border-top: .3em solid;
8
+ border-right: .3em solid transparent;
9
+ border-bottom: 0;
10
+ border-left: .3em solid transparent;
11
+ width: 0;
12
+ height: 0;
13
+ transition: var(--vg-nav-transition);
14
+ transform: rotate(0);
15
+ display: inline-block;
16
+ margin-left: .355em;
17
+ vertical-align: .255em;
18
+ }
19
+ }
20
+ }
@@ -0,0 +1,68 @@
1
+ $nav-map: (
2
+ transition: all .2s ease-in-out,
3
+ );
4
+
5
+ $grid-breakpoints: (
6
+ xs: 576px,
7
+ sm: 768px,
8
+ md: 992px,
9
+ lg: 1200px,
10
+ xl: 1400px,
11
+ xxl: 1600px,
12
+ xxxl: 1800px
13
+ );
14
+
15
+ $nav-item-map: (
16
+ margin: 0,
17
+ padding: 23px 25px,
18
+ font-size: 1rem,
19
+ font-weight: 400,
20
+ line-height: 1.4,
21
+ color: #212529,
22
+ decoration: none,
23
+ display: inline-block,
24
+ border: none,
25
+ border-radius: 0,
26
+ white-space: nowrap,
27
+ position: relative,
28
+ );
29
+
30
+ $hamburger-map: (
31
+ height: 27px,
32
+ line-width: 35px,
33
+ line-color: #333333,
34
+ line-height: 3px,
35
+ line-indent-top: 7px
36
+ );
37
+
38
+ $nav-drop-map: (
39
+ z-index: 10,
40
+ transition: map-get($nav-map, transition),
41
+ width: 200px,
42
+ border-color: $border-color,
43
+ border-radius: 0,
44
+ padding: 0,
45
+ bg: $bg-color
46
+ );
47
+
48
+ $nav-drop-mega-map: (
49
+ width: 100%,
50
+ min-height: 300px,
51
+ bg: $bg-color,
52
+ border-color: $border-color,
53
+ border-radius: 0,
54
+ padding: 1rem,
55
+ z-index: 10,
56
+ transition: map-get($nav-map, transition),
57
+ );
58
+
59
+ $nav-drop-item-map: (
60
+ padding: .75rem 1rem,
61
+ border-color: transparent,
62
+ border-color-hover: transparent,
63
+ bg: transparent,
64
+ bg-hover: transparent,
65
+ color: inherit,
66
+ color-hover: inherit,
67
+ transition: map-get($nav-map, transition),
68
+ );
@@ -0,0 +1,150 @@
1
+ /**
2
+ *--------------------------------------------------------------------------
3
+ * Модуль: VGNav
4
+ * Автор: Vegas DEV
5
+ * Лицензия: смотри LICENSE
6
+ *--------------------------------------------------------------------------
7
+ **/
8
+
9
+ @import "../../../utils/scss/functions";
10
+ @import "../../../utils/scss/mixin";
11
+ @import "../../../utils/scss/variables";
12
+ @import "variables";
13
+ @import "breakpoints";
14
+
15
+ .vg-nav {
16
+ @include mix-vars('nav', $nav-map);
17
+ @include mix-vars('nav-item', $nav-item-map);
18
+ @include mix-vars('nav-drop', $nav-drop-map);
19
+ @include mix-vars('nav-drop-mega', $nav-drop-mega-map);
20
+ @include mix-vars('nav-drop-item', $nav-drop-item-map);
21
+ @include mix-vars('nav-hamburger', $hamburger-map);
22
+
23
+ .vg-nav-wrapper {
24
+ display: flex;
25
+ padding: 0;
26
+ margin: 0;
27
+ position: relative;
28
+
29
+ > li {
30
+ list-style: none;
31
+ margin: var(--vg-nav-item-margin);
32
+
33
+ > a {
34
+ white-space: var(--vg-nav-item-white-space);
35
+ position: var(--vg-nav-item-position);
36
+ display: var(--vg-nav-item-display);
37
+ padding: var(--vg-nav-item-padding);
38
+ font-size: var(--vg-nav-item-font-size);
39
+ font-weight: var(--vg-nav-item-font-weight);
40
+ line-height: var(--vg-nav-item-line-height);
41
+ color: var(--vg-nav-item-color);
42
+ text-decoration: var(--vg-nav-item-decoration);
43
+ border: var(--vg-nav-item-border);
44
+ border-radius: var(--vg-nav-item-border-radius);
45
+ }
46
+
47
+ /** set toggle **/
48
+ @import "toggle";
49
+ }
50
+
51
+ .dropdown {
52
+ .dropdown-content {
53
+ transition: var(--vg-nav-drop-transition);
54
+ list-style: none;
55
+ z-index: var(--vg-nav-drop-z-index);
56
+ position: absolute;
57
+ top: 120%;
58
+ opacity: 0;
59
+ visibility: hidden;
60
+ width: var(--vg-nav-drop-width);
61
+ padding: var(--vg-nav-drop-padding);
62
+ border: 1px solid var(--vg-nav-drop-border-color);
63
+ border-radius: var(--vg-nav-drop-border-radius);
64
+ background-color: var(--vg-nav-drop-bg);
65
+
66
+ &:not(.show) {
67
+ display: none;
68
+ }
69
+
70
+ &.fade {
71
+ visibility: visible;
72
+ opacity: 1;
73
+ top: 100%;
74
+ }
75
+
76
+ .dropdown-content {
77
+ &.fade {
78
+ top: 0;
79
+ }
80
+ }
81
+
82
+ li {
83
+ a {
84
+ display: block;
85
+ padding: var(--vg-nav-drop-item-padding);
86
+ border-top: 1px solid var(--vg-nav-drop-item-border-color);
87
+ background-color: var(--vg-nav-drop-item-bg);
88
+ transition: var(--vg-nav-drop-item-transition);
89
+ color: var(--vg-nav-drop-item-color);
90
+
91
+ &:hover {
92
+ background-color: var(--vg-nav-drop-item-bg-hover);
93
+ color: var(--vg-nav-drop-item-color-hover);
94
+ border-color: var(--vg-nav-drop-item-border-color-hover);
95
+ }
96
+ }
97
+
98
+ &:first-child {
99
+ a {
100
+ border-top: none;
101
+ }
102
+ }
103
+ }
104
+ }
105
+
106
+ &.dropdown-mega {
107
+ position: static;
108
+
109
+ .dropdown-content {
110
+ transition: var(--vg-nav-drop-mega-transition);
111
+ position: absolute;
112
+ left: 0;
113
+ width: var(--vg-nav-drop-mega-width);
114
+ min-height: var(--vg-nav-drop-mega-min-height);
115
+ padding: var(--vg-nav-drop-mega-padding);
116
+ border: 1px solid var(--vg-nav-drop-mega-border-color);
117
+ border-radius: var(--vg-nav-drop-mega-border-radius);
118
+ background-color: var(--vg-nav-drop-mega-bg);
119
+ z-index: var(--vg-nav-drop-z-index);
120
+
121
+ &:not(.show) {
122
+ display: none;
123
+ }
124
+ }
125
+ }
126
+ }
127
+ }
128
+
129
+ /** set placement **/
130
+ @import "placement";
131
+
132
+ /** set hamburger **/
133
+ @import "hamburger";
134
+
135
+ &:not(.vg-nav-expand) {
136
+ @each $breakpoint in map-keys($grid-breakpoints) {
137
+ @include media-breakpoint-down($breakpoint, $grid-breakpoints) {
138
+ &.vg-nav-#{$breakpoint} {
139
+ .vg-nav-hamburger {
140
+ display: flex;
141
+ }
142
+
143
+ > .vg-nav-wrapper {
144
+ display: none;
145
+ }
146
+ }
147
+ }
148
+ }
149
+ }
150
+ }
@@ -0,0 +1,165 @@
1
+ import BaseModule from "../../base-module";
2
+ import {isDisabled, isVisible, mergeDeepObject} from "../../../utils/js/functions";
3
+ import EventHandler from "../../../utils/js/dom/event";
4
+ import {dismissTrigger} from "../../module-fn";
5
+ import Selectors from "../../../utils/js/dom/selectors";
6
+ import Backdrop from "../../../utils/js/components/backdrop";
7
+ import Overflow from "../../../utils/js/components/overflow";
8
+
9
+ /**
10
+ * Constants
11
+ */
12
+ const NAME = 'sidebar';
13
+ const NAME_KEY = 'vg.sidebar';
14
+ const CLASS_NAME_SHOW = 'show';
15
+ const SELECTOR_DATA_TOGGLE= '[data-vg-toggle="sidebar"]'
16
+
17
+ const EVENT_KEY_HIDE = `${NAME_KEY}.hide`;
18
+ const EVENT_KEY_HIDDEN = `${NAME_KEY}.hidden`;
19
+ const EVENT_KEY_SHOW = `${NAME_KEY}.show`;
20
+ const EVENT_KEY_SHOWN = `${NAME_KEY}.shown`;
21
+
22
+ const EVENT_KEY_KEYDOWN_DISMISS = `keydown.dismiss.${NAME_KEY}`;
23
+ const EVENT_KEY_HIDE_PREVENTED = `hidePrevented.${NAME_KEY}`;
24
+ const EVENT_KEY_CLICK_DATA_API = `click.${NAME_KEY}.data.api`;
25
+
26
+ class VGSidebar extends BaseModule {
27
+ constructor(element, params = {}) {
28
+ super(element, params);
29
+
30
+ this._params = this._getParams(element, mergeDeepObject({
31
+ backdrop: true,
32
+ overflow: true,
33
+ keyboard: true,
34
+ ajax: {
35
+ route: '',
36
+ target: '',
37
+ method: 'get'
38
+ }
39
+ }, params));
40
+
41
+ this._addEventListeners();
42
+ this._dismissElement();
43
+ }
44
+
45
+ static get NAME() {
46
+ return NAME;
47
+ }
48
+
49
+ static get NAME_KEY() {
50
+ return NAME_KEY
51
+ }
52
+
53
+ toggle(relatedTarget) {
54
+ return !this._isShown() ? this.show(relatedTarget) : this.hide();
55
+ }
56
+
57
+ show(relatedTarget) {
58
+ const _this = this;
59
+ if (isDisabled(_this._element)) return;
60
+
61
+ this._route();
62
+
63
+ const showEvent = EventHandler.trigger(this._element, EVENT_KEY_SHOW, { relatedTarget })
64
+ if (showEvent.defaultPrevented) return;
65
+
66
+ if (_this._params.backdrop) {
67
+ Backdrop.show();
68
+ }
69
+
70
+ if (_this._params.overflow) {
71
+ Overflow.append();
72
+ }
73
+
74
+ _this._element.classList.add(CLASS_NAME_SHOW);
75
+
76
+ const completeCallBack = () => {
77
+ EventHandler.on(Selectors.find('.vg-backdrop'), 'mousedown.vg.backdrop', function () {
78
+ _this.hide();
79
+ });
80
+
81
+ EventHandler.trigger(this._element, EVENT_KEY_SHOWN, { relatedTarget });
82
+ }
83
+ this._queueCallback(completeCallBack, this._element, true, 50)
84
+ }
85
+
86
+ hide() {
87
+ const _this = this;
88
+ if (isDisabled(_this._element)) return;
89
+
90
+ const hideEvent = EventHandler.trigger(this._element, EVENT_KEY_HIDE);
91
+ if (hideEvent.defaultPrevented) return;
92
+
93
+ if (_this._params.backdrop) {
94
+ Backdrop.hide(function () {
95
+ if (_this._params.overflow) {
96
+ Overflow.destroy();
97
+ }
98
+ });
99
+ }
100
+
101
+ if (_this._params.overflow) {
102
+ Overflow.destroy();
103
+ }
104
+
105
+ _this._element.setAttribute('aria-expanded', false);
106
+ _this._element.classList.remove(CLASS_NAME_SHOW);
107
+
108
+ const completeCallback = () => EventHandler.trigger(this._element, EVENT_KEY_HIDDEN);
109
+ this._queueCallback(completeCallback, this._element, true);
110
+ }
111
+
112
+ dispose() {
113
+ super.dispose();
114
+ }
115
+
116
+ _isShown() {
117
+ return this._element.classList.contains(CLASS_NAME_SHOW);
118
+ }
119
+
120
+ _addEventListeners() {
121
+ EventHandler.on(document, EVENT_KEY_KEYDOWN_DISMISS, event => {
122
+ if (event.key !== 'Escape') return;
123
+
124
+ if (this._params.keyboard) {
125
+ this.hide();
126
+ return;
127
+ }
128
+
129
+ EventHandler.trigger(this._element, EVENT_KEY_HIDE_PREVENTED)
130
+ });
131
+ }
132
+ }
133
+
134
+ dismissTrigger(VGSidebar);
135
+
136
+ /**
137
+ * Data API implementation
138
+ */
139
+ EventHandler.on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
140
+ const target = Selectors.getElementFromSelector(this);
141
+
142
+ if (['A', 'AREA'].includes(this.tagName)) {
143
+ event.preventDefault()
144
+ }
145
+
146
+ if (isDisabled(this)) {
147
+ return
148
+ }
149
+
150
+ this.setAttribute('aria-expanded', true);
151
+ EventHandler.one(target, EVENT_KEY_HIDDEN, () => {
152
+ if (isVisible(this)) this.focus();
153
+ this.setAttribute('aria-expanded', false);
154
+ })
155
+
156
+ const alreadyOpen = Selectors.find('.vg-sidebar.show')
157
+ if (alreadyOpen && alreadyOpen !== target) {
158
+ VGSidebar.getInstance(alreadyOpen).hide()
159
+ }
160
+
161
+ const data = VGSidebar.getOrCreateInstance(target)
162
+ data.toggle(this);
163
+ });
164
+
165
+ export default VGSidebar;
@@ -0,0 +1,19 @@
1
+ $sidebar-map: (
2
+ horizontal: (
3
+ width: 400px,
4
+ height: 100vh,
5
+ ),
6
+ vertical: (
7
+ width: 100vw,
8
+ height: 30vh,
9
+ ),
10
+ bg-color: $bg-color,
11
+ color: $color,
12
+ box-shadow: $box-shadow,
13
+ header-height: 60px,
14
+ footer-height: 70px,
15
+ padding: 1rem,
16
+ border: 1px solid #{$border-color},
17
+ z-index: $sidebar-index,
18
+ transition: $transition-base,
19
+ );
@@ -0,0 +1,90 @@
1
+ /**
2
+ *--------------------------------------------------------------------------
3
+ * Модуль: VGSidebar
4
+ * Автор: Vegas DEV
5
+ * Лицензия: смотри LICENSE
6
+ *--------------------------------------------------------------------------
7
+ **/
8
+
9
+ @import "../../../utils/scss/functions";
10
+ @import "../../../utils/scss/mixin";
11
+ @import "../../../utils/scss/variables";
12
+ @import "variables";
13
+
14
+ .vg-sidebar {
15
+ @include mix-vars('sidebar', $sidebar-map);
16
+ position: fixed;
17
+ width: auto;
18
+ height: auto;
19
+ transition: var(--vg-sidebar-transition);
20
+ z-index: var(--vg-sidebar-z-index);
21
+ background: var(--vg-sidebar-bg-color);
22
+ color: var(--vg-sidebar-color);
23
+ box-shadow: var(--vg-sidebar-box-shadow);
24
+
25
+ &.left, &.right {
26
+ width: var(--vg-sidebar-horizontal-width);
27
+ height: var(--vg-sidebar-horizontal-height);
28
+ top: 0;
29
+ }
30
+
31
+ &.left {
32
+ left: -105%;
33
+
34
+ &.show {
35
+ left: 0;
36
+ }
37
+ }
38
+
39
+ &.right {
40
+ right: -105%;
41
+
42
+ &.show {
43
+ right: 0;
44
+ }
45
+ }
46
+
47
+ &.top, &.bottom {
48
+ height: var(--vg-sidebar-vertical-height);
49
+ width: var(--vg-sidebar-vertical-width);
50
+ left: 0;
51
+ }
52
+
53
+ &.top {
54
+ top: -105%;
55
+
56
+ &.show {
57
+ top: 0;
58
+ }
59
+ }
60
+
61
+ &.bottom {
62
+ bottom: -105%;
63
+
64
+ &.show {
65
+ bottom: 0;
66
+ }
67
+ }
68
+
69
+ &-header {
70
+ height: var(--vg-sidebar-header-height);
71
+ z-index: 10;
72
+ position: relative;
73
+ display: flex;
74
+ align-items: center;
75
+ padding: var(--vg-sidebar-padding);
76
+ border-bottom: var(--vg-sidebar-border);
77
+ }
78
+
79
+ &-body {
80
+ height: calc(100% - var(--vg-sidebar-header-height) - var(--vg-sidebar-footer-height));
81
+ overflow-y: auto;
82
+ padding: var(--vg-sidebar-padding);
83
+ }
84
+
85
+ &-footer {
86
+ height: var(--vg-sidebar-footer-height);
87
+ padding: var(--vg-sidebar-padding);
88
+ border-top: var(--vg-sidebar-border);
89
+ }
90
+ }
@@ -0,0 +1,54 @@
1
+ import {execute} from "../functions";
2
+ import Selectors from "../dom/selectors";
3
+ import EventHandler from "../dom/event";
4
+ import Overflow from "./overflow";
5
+
6
+ const NAME = 'backdrop'
7
+ const CLASS_NAME = 'vg-backdrop'
8
+ const CLASS_NAME_FADE = 'fade'
9
+ const EVENT_MOUSEDOWN = `mousedown.vg.${NAME}`
10
+
11
+ class Backdrop {
12
+ static show(callback) {
13
+ Backdrop._append()
14
+ execute(callback);
15
+ }
16
+
17
+ static hide(callback) {
18
+ Backdrop._destroy();
19
+ execute(callback);
20
+ }
21
+
22
+ static _append() {
23
+ if (Selectors.find('.' + CLASS_NAME)) {
24
+ return false;
25
+ }
26
+
27
+ let backdrop = document.createElement('div');
28
+ backdrop.classList.add(CLASS_NAME);
29
+
30
+ document.body.append(backdrop);
31
+
32
+ setTimeout(() => {
33
+ backdrop.classList.add(CLASS_NAME_FADE)
34
+ }, 50);
35
+
36
+ EventHandler.on(backdrop, EVENT_MOUSEDOWN, () => {
37
+ Backdrop.hide()
38
+ Overflow.destroy();
39
+ });
40
+ }
41
+
42
+ static _destroy() {
43
+ let element = Selectors.find('.' + CLASS_NAME);
44
+ if (!element) return;
45
+
46
+ element.classList.remove(CLASS_NAME_FADE);
47
+
48
+ setTimeout(() => {
49
+ element.remove();
50
+ }, 500);
51
+ }
52
+ }
53
+
54
+ export default Backdrop;
@@ -0,0 +1,28 @@
1
+ import {Manipulator} from "../dom/manipulator";
2
+
3
+ /**
4
+ * Класс Overflow
5
+ * Запрещает скроллинг и убирает его, компенсируя отступом
6
+ */
7
+
8
+ class Overflow {
9
+ static append() {
10
+ document.body.style.paddingRight = getWidth() + 'px';
11
+ document.body.style.overflow = 'hidden';
12
+
13
+ function getWidth() {
14
+ const documentWidth = document.documentElement.clientWidth
15
+ return Math.abs(window.innerWidth - documentWidth)
16
+ }
17
+ }
18
+
19
+ static destroy() {
20
+ document.body.style.overflow = '';
21
+ document.body.style.paddingRight = '';
22
+
23
+ let styles = Manipulator.get(document.body, 'style');
24
+ if (!styles) Manipulator.remove(document.body, 'style');
25
+ }
26
+ }
27
+
28
+ export default Overflow;
@@ -0,0 +1,44 @@
1
+ import {isElement, mergeDeepObject, normalizeData} from "../functions";
2
+ import {Manipulator} from "../dom/manipulator";
3
+
4
+ class Params {
5
+ constructor(params, element = null) {
6
+ this._params = this.merge(params, element);
7
+ }
8
+
9
+ get() {
10
+ return this._params;
11
+ }
12
+
13
+ fromElement(element) {
14
+ return isElement(element) ? Manipulator.get(element) : {};
15
+ }
16
+
17
+ merge(params, element) {
18
+ let mParams = mergeDeepObject(params, this.fromElement(element));
19
+
20
+ for (let key in mParams) {
21
+ if (key.indexOf('-') !== -1) {
22
+ let keys = key.split('-'),
23
+ value = normalizeData(mParams[key]);
24
+
25
+ if (keys[0] in mParams) {
26
+ if (keys[1] in mParams[keys[0]]) {
27
+ mParams[keys[0]][keys[1]] = value;
28
+ }
29
+ }
30
+
31
+ delete mParams[key];
32
+ }
33
+ }
34
+
35
+ if ('params' in mParams) {
36
+ mParams = mergeDeepObject(mParams, mParams.params);
37
+ delete mParams.params;
38
+ }
39
+
40
+ return mParams;
41
+ }
42
+ }
43
+
44
+ export default Params;