@db-ux/ngx-core-components 1.0.0-test-13b991d
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/README.md +130 -0
- package/components/accordion/accordion.d.ts +31 -0
- package/components/accordion/index.d.ts +1 -0
- package/components/accordion/model.d.ts +41 -0
- package/components/accordion-item/accordion-item.d.ts +29 -0
- package/components/accordion-item/index.d.ts +1 -0
- package/components/accordion-item/model.d.ts +24 -0
- package/components/badge/badge.d.ts +28 -0
- package/components/badge/index.d.ts +1 -0
- package/components/badge/model.d.ts +16 -0
- package/components/brand/brand.d.ts +24 -0
- package/components/brand/index.d.ts +1 -0
- package/components/brand/model.d.ts +10 -0
- package/components/button/button.d.ts +39 -0
- package/components/button/index.d.ts +1 -0
- package/components/button/model.d.ts +52 -0
- package/components/card/card.d.ts +24 -0
- package/components/card/index.d.ts +1 -0
- package/components/card/model.d.ts +18 -0
- package/components/checkbox/checkbox.d.ts +64 -0
- package/components/checkbox/index.d.ts +1 -0
- package/components/checkbox/model.d.ts +10 -0
- package/components/divider/divider.d.ts +22 -0
- package/components/divider/index.d.ts +1 -0
- package/components/divider/model.d.ts +18 -0
- package/components/drawer/drawer.d.ts +34 -0
- package/components/drawer/index.d.ts +1 -0
- package/components/drawer/model.d.ts +41 -0
- package/components/header/MetaNavigation.directive.d.ts +5 -0
- package/components/header/Navigation.directive.d.ts +5 -0
- package/components/header/SecondaryAction.directive.d.ts +5 -0
- package/components/header/header.d.ts +34 -0
- package/components/header/index.d.ts +1 -0
- package/components/header/model.d.ts +44 -0
- package/components/icon/icon.d.ts +22 -0
- package/components/icon/index.d.ts +1 -0
- package/components/icon/model.d.ts +12 -0
- package/components/infotext/index.d.ts +1 -0
- package/components/infotext/infotext.d.ts +24 -0
- package/components/infotext/model.d.ts +5 -0
- package/components/input/index.d.ts +1 -0
- package/components/input/input.d.ts +87 -0
- package/components/input/model.d.ts +39 -0
- package/components/link/index.d.ts +1 -0
- package/components/link/link.d.ts +37 -0
- package/components/link/model.d.ts +24 -0
- package/components/navigation/index.d.ts +1 -0
- package/components/navigation/model.d.ts +5 -0
- package/components/navigation/navigation.d.ts +21 -0
- package/components/navigation-item/NavigationContent.directive.d.ts +5 -0
- package/components/navigation-item/index.d.ts +1 -0
- package/components/navigation-item/model.d.ts +34 -0
- package/components/navigation-item/navigation-item.d.ts +44 -0
- package/components/notification/index.d.ts +1 -0
- package/components/notification/model.d.ts +57 -0
- package/components/notification/notification.d.ts +38 -0
- package/components/page/index.d.ts +1 -0
- package/components/page/model.d.ts +32 -0
- package/components/page/page.d.ts +25 -0
- package/components/popover/index.d.ts +1 -0
- package/components/popover/model.d.ts +18 -0
- package/components/popover/popover.d.ts +33 -0
- package/components/radio/index.d.ts +1 -0
- package/components/radio/model.d.ts +7 -0
- package/components/radio/radio.d.ts +51 -0
- package/components/section/index.d.ts +1 -0
- package/components/section/model.d.ts +5 -0
- package/components/section/section.d.ts +22 -0
- package/components/select/index.d.ts +1 -0
- package/components/select/model.d.ts +43 -0
- package/components/select/select.d.ts +77 -0
- package/components/stack/index.d.ts +1 -0
- package/components/stack/model.d.ts +34 -0
- package/components/stack/stack.d.ts +25 -0
- package/components/switch/index.d.ts +1 -0
- package/components/switch/model.d.ts +12 -0
- package/components/switch/switch.d.ts +55 -0
- package/components/tab-item/index.d.ts +1 -0
- package/components/tab-item/model.d.ts +24 -0
- package/components/tab-item/tab-item.d.ts +44 -0
- package/components/tab-list/index.d.ts +1 -0
- package/components/tab-list/model.d.ts +5 -0
- package/components/tab-list/tab-list.d.ts +20 -0
- package/components/tab-panel/index.d.ts +1 -0
- package/components/tab-panel/model.d.ts +10 -0
- package/components/tab-panel/tab-panel.d.ts +21 -0
- package/components/tabs/index.d.ts +1 -0
- package/components/tabs/model.d.ts +47 -0
- package/components/tabs/tabs.d.ts +42 -0
- package/components/tag/index.d.ts +1 -0
- package/components/tag/model.d.ts +45 -0
- package/components/tag/tag.d.ts +37 -0
- package/components/textarea/index.d.ts +1 -0
- package/components/textarea/model.d.ts +30 -0
- package/components/textarea/textarea.d.ts +79 -0
- package/components/tooltip/index.d.ts +1 -0
- package/components/tooltip/model.d.ts +7 -0
- package/components/tooltip/tooltip.d.ts +32 -0
- package/esm2022/components/accordion/accordion.mjs +196 -0
- package/esm2022/components/accordion/index.mjs +2 -0
- package/esm2022/components/accordion/model.mjs +3 -0
- package/esm2022/components/accordion-item/accordion-item.mjs +136 -0
- package/esm2022/components/accordion-item/index.mjs +2 -0
- package/esm2022/components/accordion-item/model.mjs +2 -0
- package/esm2022/components/badge/badge.mjs +130 -0
- package/esm2022/components/badge/index.mjs +2 -0
- package/esm2022/components/badge/model.mjs +2 -0
- package/esm2022/components/brand/brand.mjs +99 -0
- package/esm2022/components/brand/index.mjs +2 -0
- package/esm2022/components/brand/model.mjs +2 -0
- package/esm2022/components/button/button.mjs +158 -0
- package/esm2022/components/button/index.mjs +2 -0
- package/esm2022/components/button/model.mjs +4 -0
- package/esm2022/components/card/card.mjs +107 -0
- package/esm2022/components/card/index.mjs +2 -0
- package/esm2022/components/card/model.mjs +3 -0
- package/esm2022/components/checkbox/checkbox.mjs +328 -0
- package/esm2022/components/checkbox/index.mjs +2 -0
- package/esm2022/components/checkbox/model.mjs +2 -0
- package/esm2022/components/divider/divider.mjs +93 -0
- package/esm2022/components/divider/index.mjs +2 -0
- package/esm2022/components/divider/model.mjs +3 -0
- package/esm2022/components/drawer/drawer.mjs +218 -0
- package/esm2022/components/drawer/index.mjs +2 -0
- package/esm2022/components/drawer/model.mjs +4 -0
- package/esm2022/components/header/MetaNavigation.directive.mjs +15 -0
- package/esm2022/components/header/Navigation.directive.mjs +15 -0
- package/esm2022/components/header/SecondaryAction.directive.mjs +15 -0
- package/esm2022/components/header/header.mjs +251 -0
- package/esm2022/components/header/index.mjs +2 -0
- package/esm2022/components/header/model.mjs +2 -0
- package/esm2022/components/icon/icon.mjs +100 -0
- package/esm2022/components/icon/index.mjs +2 -0
- package/esm2022/components/icon/model.mjs +3 -0
- package/esm2022/components/infotext/index.mjs +2 -0
- package/esm2022/components/infotext/infotext.mjs +103 -0
- package/esm2022/components/infotext/model.mjs +2 -0
- package/esm2022/components/input/index.mjs +2 -0
- package/esm2022/components/input/input.mjs +421 -0
- package/esm2022/components/input/model.mjs +6 -0
- package/esm2022/components/link/index.mjs +2 -0
- package/esm2022/components/link/link.mjs +152 -0
- package/esm2022/components/link/model.mjs +4 -0
- package/esm2022/components/navigation/index.mjs +2 -0
- package/esm2022/components/navigation/model.mjs +2 -0
- package/esm2022/components/navigation/navigation.mjs +92 -0
- package/esm2022/components/navigation-item/NavigationContent.directive.mjs +15 -0
- package/esm2022/components/navigation-item/index.mjs +2 -0
- package/esm2022/components/navigation-item/model.mjs +2 -0
- package/esm2022/components/navigation-item/navigation-item.mjs +236 -0
- package/esm2022/components/notification/index.mjs +2 -0
- package/esm2022/components/notification/model.mjs +4 -0
- package/esm2022/components/notification/notification.mjs +181 -0
- package/esm2022/components/page/index.mjs +2 -0
- package/esm2022/components/page/model.mjs +3 -0
- package/esm2022/components/page/page.mjs +127 -0
- package/esm2022/components/popover/index.mjs +2 -0
- package/esm2022/components/popover/model.mjs +2 -0
- package/esm2022/components/popover/popover.mjs +189 -0
- package/esm2022/components/radio/index.mjs +2 -0
- package/esm2022/components/radio/model.mjs +2 -0
- package/esm2022/components/radio/radio.mjs +230 -0
- package/esm2022/components/section/index.mjs +2 -0
- package/esm2022/components/section/model.mjs +2 -0
- package/esm2022/components/section/section.mjs +96 -0
- package/esm2022/components/select/index.mjs +2 -0
- package/esm2022/components/select/model.mjs +2 -0
- package/esm2022/components/select/select.mjs +426 -0
- package/esm2022/components/stack/index.mjs +2 -0
- package/esm2022/components/stack/model.mjs +5 -0
- package/esm2022/components/stack/stack.mjs +106 -0
- package/esm2022/components/switch/index.mjs +2 -0
- package/esm2022/components/switch/model.mjs +2 -0
- package/esm2022/components/switch/switch.mjs +237 -0
- package/esm2022/components/tab-item/index.mjs +2 -0
- package/esm2022/components/tab-item/model.mjs +2 -0
- package/esm2022/components/tab-item/tab-item.mjs +195 -0
- package/esm2022/components/tab-list/index.mjs +2 -0
- package/esm2022/components/tab-list/model.mjs +2 -0
- package/esm2022/components/tab-list/tab-list.mjs +84 -0
- package/esm2022/components/tab-panel/index.mjs +2 -0
- package/esm2022/components/tab-panel/model.mjs +2 -0
- package/esm2022/components/tab-panel/tab-panel.mjs +96 -0
- package/esm2022/components/tabs/index.mjs +2 -0
- package/esm2022/components/tabs/model.mjs +3 -0
- package/esm2022/components/tabs/tabs.mjs +322 -0
- package/esm2022/components/tag/index.mjs +2 -0
- package/esm2022/components/tag/model.mjs +2 -0
- package/esm2022/components/tag/tag.mjs +186 -0
- package/esm2022/components/textarea/index.mjs +2 -0
- package/esm2022/components/textarea/model.mjs +3 -0
- package/esm2022/components/textarea/textarea.mjs +363 -0
- package/esm2022/components/tooltip/index.mjs +2 -0
- package/esm2022/components/tooltip/model.mjs +2 -0
- package/esm2022/components/tooltip/tooltip.mjs +149 -0
- package/esm2022/db-ux-ngx-core-components.mjs +5 -0
- package/esm2022/index.mjs +41 -0
- package/esm2022/shared/constants.mjs +94 -0
- package/esm2022/shared/model.mjs +22 -0
- package/esm2022/utils/form-components.mjs +11 -0
- package/esm2022/utils/index.mjs +174 -0
- package/esm2022/utils/navigation.mjs +133 -0
- package/fesm2022/db-ux-ngx-core-components.mjs +6109 -0
- package/fesm2022/db-ux-ngx-core-components.mjs.map +1 -0
- package/index.d.ts +40 -0
- package/package.json +35 -0
- package/shared/constants.d.ts +83 -0
- package/shared/model.d.ts +445 -0
- package/utils/form-components.d.ts +2 -0
- package/utils/index.d.ts +61 -0
- package/utils/navigation.d.ts +32 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
export const uuid = () => {
|
|
2
|
+
if (typeof window !== 'undefined') {
|
|
3
|
+
if (window.crypto?.randomUUID) {
|
|
4
|
+
return window.crypto.randomUUID();
|
|
5
|
+
}
|
|
6
|
+
else if (window.crypto?.getRandomValues) {
|
|
7
|
+
return window.crypto.getRandomValues(new Uint32Array(3)).join('-');
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
return Math.random().toString().substring(2);
|
|
11
|
+
};
|
|
12
|
+
export const addAttributeToChildren = (element, attribute) => {
|
|
13
|
+
const children = element.children;
|
|
14
|
+
Object.values(children).forEach((child) => {
|
|
15
|
+
child.setAttribute(attribute.key, attribute.value);
|
|
16
|
+
if (child.children.length > 0) {
|
|
17
|
+
addAttributeToChildren(child, attribute);
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
export const cls = (...args) => {
|
|
22
|
+
let result = '';
|
|
23
|
+
for (const arg of args) {
|
|
24
|
+
if (arg) {
|
|
25
|
+
if (typeof arg === 'string') {
|
|
26
|
+
result += `${arg} `;
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
for (const key in arg) {
|
|
30
|
+
if (arg[key]) {
|
|
31
|
+
result += `${key} `;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return result.trim();
|
|
38
|
+
};
|
|
39
|
+
const reactHtmlAttributes = ['suppressHydrationWarning', 'suppressContentEditableWarning', 'translate', 'title', 'tabIndex', 'style', 'spellCheck', 'nonce', 'lang', 'hidden', 'draggable', 'dir', 'contextMenu', 'contentEditable', 'autoFocus', 'accessKey', 'is', 'inputMode', 'unselectable', 'security', 'results', 'vocab', 'typeof', 'rev', 'resource', 'rel', 'property', 'inlist', 'datatype', 'content', 'about', 'role', 'radioGroup', 'color'];
|
|
40
|
+
export const filterPassingProps = (props, propsPassingFilter) => Object.keys(props).filter(key => (key.startsWith('data-') || key.startsWith('aria-') || key.startsWith('default') || key.startsWith('auto') || key.startsWith('item') || key.startsWith('on') || reactHtmlAttributes.includes(key)) && !propsPassingFilter.includes(key)).reduce((obj, key) => {
|
|
41
|
+
return {
|
|
42
|
+
...obj,
|
|
43
|
+
[key]: props[key]
|
|
44
|
+
};
|
|
45
|
+
}, {});
|
|
46
|
+
export const getRootProps = (props, rooProps) => {
|
|
47
|
+
return Object.keys(props).filter(key => rooProps.includes(key)).reduce((obj, key) => {
|
|
48
|
+
return {
|
|
49
|
+
...obj,
|
|
50
|
+
[key]: props[key]
|
|
51
|
+
};
|
|
52
|
+
}, {});
|
|
53
|
+
};
|
|
54
|
+
export const visibleInVX = (el) => {
|
|
55
|
+
const { left, right } = el.getBoundingClientRect();
|
|
56
|
+
const { innerWidth } = window;
|
|
57
|
+
return left >= 0 && right <= innerWidth;
|
|
58
|
+
};
|
|
59
|
+
export const visibleInVY = (el) => {
|
|
60
|
+
const { top, bottom } = el.getBoundingClientRect();
|
|
61
|
+
const { innerHeight } = window;
|
|
62
|
+
return top >= 0 && bottom <= innerHeight;
|
|
63
|
+
};
|
|
64
|
+
export const isInView = (el) => {
|
|
65
|
+
const { top, bottom, left, right } = el.getBoundingClientRect();
|
|
66
|
+
const { innerHeight, innerWidth } = window;
|
|
67
|
+
let outTop = top < 0;
|
|
68
|
+
let outBottom = bottom > innerHeight;
|
|
69
|
+
let outLeft = left < 0;
|
|
70
|
+
let outRight = right > innerWidth;
|
|
71
|
+
// We need to check if it was already outside
|
|
72
|
+
const outsideY = el.hasAttribute('data-outside-vy');
|
|
73
|
+
const outsideX = el.hasAttribute('data-outside-vx');
|
|
74
|
+
const parentRect = el?.parentElement?.getBoundingClientRect();
|
|
75
|
+
if (parentRect) {
|
|
76
|
+
if (outsideY) {
|
|
77
|
+
const position = el.getAttribute('data-outside-vy');
|
|
78
|
+
if (position === 'top') {
|
|
79
|
+
outTop = parentRect.top - (bottom - parentRect.bottom) < 0;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
outBottom = parentRect.bottom + (parentRect.top - top) > innerHeight;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (outsideX) {
|
|
86
|
+
const position = el.getAttribute('data-outside-vx');
|
|
87
|
+
if (position === 'left') {
|
|
88
|
+
outLeft = parentRect.left - (right - parentRect.right) < 0;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
outRight = parentRect.right + (parentRect.left - left) > innerWidth;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
outTop,
|
|
97
|
+
outBottom,
|
|
98
|
+
outLeft,
|
|
99
|
+
outRight
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
export const handleDataOutside = (el) => {
|
|
103
|
+
const { outTop, outBottom, outLeft, outRight } = isInView(el);
|
|
104
|
+
let dataOutsidePair = {};
|
|
105
|
+
if (outTop || outBottom) {
|
|
106
|
+
dataOutsidePair = {
|
|
107
|
+
vy: outTop ? 'top' : 'bottom'
|
|
108
|
+
};
|
|
109
|
+
el.setAttribute('data-outside-vy', dataOutsidePair.vy);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
el.removeAttribute('data-outside-vy');
|
|
113
|
+
}
|
|
114
|
+
if (outLeft || outRight) {
|
|
115
|
+
dataOutsidePair = {
|
|
116
|
+
...dataOutsidePair,
|
|
117
|
+
vx: outRight ? 'right' : 'left'
|
|
118
|
+
};
|
|
119
|
+
el.setAttribute('data-outside-vx', dataOutsidePair.vx);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
el.removeAttribute('data-outside-vx');
|
|
123
|
+
}
|
|
124
|
+
return dataOutsidePair;
|
|
125
|
+
};
|
|
126
|
+
export const isArrayOfStrings = (value) => Array.isArray(value) && value.every(item => typeof item === 'string');
|
|
127
|
+
const appleOs = ['Mac', 'iPhone', 'iPad', 'iPod'];
|
|
128
|
+
export const hasVoiceOver = () => typeof window !== 'undefined' && appleOs.some(os => window.navigator.userAgent.includes(os));
|
|
129
|
+
export const delay = (fn, ms) => new Promise(() => setTimeout(fn, ms));
|
|
130
|
+
/**
|
|
131
|
+
* Some frameworks like stencil would not add "true" as value for a prop
|
|
132
|
+
* if it is used in a framework like angular e.g.: [disabled]="myDisabledProp"
|
|
133
|
+
* @param originBool Some boolean to convert to string
|
|
134
|
+
*/
|
|
135
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
136
|
+
export const getBooleanAsString = (originBool) => {
|
|
137
|
+
if (originBool) {
|
|
138
|
+
return String(originBool);
|
|
139
|
+
}
|
|
140
|
+
return originBool;
|
|
141
|
+
};
|
|
142
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
143
|
+
export const getHideProp = (show) => {
|
|
144
|
+
if (show === undefined || show === null) {
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
return getBooleanAsString(!show);
|
|
148
|
+
};
|
|
149
|
+
export const stringPropVisible = (givenString, showString) => {
|
|
150
|
+
if (showString === undefined) {
|
|
151
|
+
return !!givenString;
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
return showString && givenString;
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
export default {
|
|
158
|
+
getRootProps,
|
|
159
|
+
filterPassingProps,
|
|
160
|
+
cls,
|
|
161
|
+
addAttributeToChildren,
|
|
162
|
+
uuid,
|
|
163
|
+
visibleInVX,
|
|
164
|
+
visibleInVY,
|
|
165
|
+
isInView,
|
|
166
|
+
handleDataOutside,
|
|
167
|
+
isArrayOfStrings,
|
|
168
|
+
hasVoiceOver,
|
|
169
|
+
delay,
|
|
170
|
+
getBooleanAsString,
|
|
171
|
+
getHideProp,
|
|
172
|
+
stringPropVisible
|
|
173
|
+
};
|
|
174
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9vdXRwdXQvYW5ndWxhci9zcmMvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLEdBQUcsRUFBRTtJQUN2QixJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsRUFBRSxDQUFDO1FBQ2xDLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQztZQUM5QixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDcEMsQ0FBQzthQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxlQUFlLEVBQUUsQ0FBQztZQUMxQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JFLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9DLENBQUMsQ0FBQztBQUNGLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLENBQUMsT0FBZ0IsRUFBRSxTQUd4RCxFQUFFLEVBQUU7SUFDSCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO0lBQ2xDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBYyxFQUFFLEVBQUU7UUFDakQsS0FBSyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuRCxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzlCLHNCQUFzQixDQUFDLEtBQUssRUFB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LENBQUM7UUFDN0IsT0FBTyxDQUFDLENBQUMsV0FBVyxDQUFDO0lBQ3ZCLENBQUM7U0FBTSxDQUFDO1FBQ04sT0FBTyxVQUFVLElBQUksV0FBVyxDQUFDO0lBQ25DLENBQUM7QUFDSCxDQUFDLENBQUM7QUFDRixlQUFlO0lBQ2IsWUFBWTtJQUNaLGtCQUFrQjtJQUNsQixHQUFHO0lBQ0gsc0JBQXNCO0lBQ3RCLElBQUk7SUFDSixXQUFXO0lBQ1gsV0FBVztJQUNYLFFBQVE7SUFDUixpQkFBaUI7SUFDakIsZ0JBQWdCO0lBQ2hCLFlBQVk7SUFDWixLQUFLO0lBQ0wsa0JBQWtCO0lBQ2xCLFdBQVc7SUFDWCxpQkFBaUI7Q0FDbEIsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCB1dWlkID0gKCkgPT4ge1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAod2luZG93LmNyeXB0bz8ucmFuZG9tVVVJRCkge1xuICAgICAgcmV0dXJuIHdpbmRvdy5jcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgIH0gZWxzZSBpZiAod2luZG93LmNyeXB0bz8uZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgICByZXR1cm4gd2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQzMkFycmF5KDMpKS5qb2luKCctJyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIpO1xufTtcbmV4cG9ydCBjb25zdCBhZGRBdHRyaWJ1dGVUb0NoaWxkcmVuID0gKGVsZW1lbnQ6IEVsZW1lbnQsIGF0dHJpYnV0ZToge1xuICBrZXk6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbn0pID0+IHtcbiAgY29uc3QgY2hpbGRyZW4gPSBlbGVtZW50LmNoaWxkcmVuO1xuICBPYmplY3QudmFsdWVzKGNoaWxkcmVuKS5mb3JFYWNoKChjaGlsZDogRWxlbWVudCkgPT4ge1xuICAgIGNoaWxkLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUua2V5LCBhdHRyaWJ1dGUudmFsdWUpO1xuICAgIGlmIChjaGlsZC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICBhZGRBdHRyaWJ1dGVUb0NoaWxkcmVuKGNoaWxkLCBhdHRyaWJ1dGUpO1xuICAgIH1cbiAgfSk7XG59O1xuZXhwb3J0IHR5cGUgQ2xhc3NOYW1lQXJnID0gc3RyaW5nIHwge1xuICBba2V5OiBzdHJpbmddOiBib29sZWFuIHwgdW5kZWZpbmVkO1xufSB8IHVuZGVmaW5lZDtcbmV4cG9ydCBjb25zdCBjbHMgPSAoLi4uYXJnczogQ2xhc3NOYW1lQXJnW10pID0+IHtcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XG4gICAgaWYgKGFyZykge1xuICAgICAgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJlc3VsdCArPSBgJHthcmd9IGA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBhcmcpIHtcbiAgICAgICAgICBpZiAoYXJnW2tleV0pIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBgJHtrZXl9IGA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQudHJpbSgpO1xufTtcbmNvbnN0IHJlYWN0SHRtbEF0dHJpYnV0ZXMgPSBbJ3N1cHByZXNzSHlkcmF0aW9uV2FybmluZycsICdzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcnLCAndHJhbnNsYXRlJywgJ3RpdGxlJywgJ3RhYkluZGV4JywgJ3N0eWxlJywgJ3NwZWxsQ2hlY2snLCAnbm9uY2UnLCAnbGFuZycsICdoaWRkZW4nLCAnZHJhZ2dhYmxlJywgJ2RpcicsICdjb250ZXh0TWVudScsICdjb250ZW50RWRpdGFibGUnLCAnYXV0b0ZvY3VzJywgJ2FjY2Vzc0tleScsICdpcycsICdpbnB1dE1vZGUnLCAndW5zZWxlY3RhYmxlJywgJ3NlY3VyaXR5JywgJ3Jlc3VsdHMnLCAndm9jYWInLCAndHlwZW9mJywgJ3JldicsICdyZXNvdXJjZScsICdyZWwnLCAncHJvcGVydHknLCAnaW5saXN0JywgJ2RhdGF0eXBlJywgJ2NvbnRlbnQnLCAnYWJvdXQnLCAncm9sZScsICdyYWRpb0dyb3VwJywgJ2NvbG9yJ107XG5leHBvcnQgY29uc3QgZmlsdGVyUGFzc2luZ1Byb3BzID0gKHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgcHJvcHNQYXNzaW5nRmlsdGVyOiBzdHJpbmdbXSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IE9iamVjdC5rZXlzKHByb3BzKS5maWx0ZXIoa2V5ID0+IChrZXkuc3RhcnRzV2l0aCgnZGF0YS0nKSB8fCBrZXkuc3RhcnRzV2l0aCgnYXJpYS0nKSB8fCBrZXkuc3RhcnRzV2l0aCgnZGVmYXVsdCcpIHx8IGtleS5zdGFydHNXaXRoKCdhdXRvJykgfHwga2V5LnN0YXJ0c1dpdGgoJ2l0ZW0nKSB8fCBrZXkuc3RhcnRzV2l0aCgnb24nKSB8fCByZWFjdEh0bWxBdHRyaWJ1dGVzLmluY2x1ZGVzKGtleSkpICYmICFwcm9wc1Bhc3NpbmdGaWx0ZXIuaW5jbHVkZXMoa2V5KSkucmVkdWNlKChvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBrZXk6IHN0cmluZykgPT4ge1xuICByZXR1cm4ge1xuICAgIC4uLm9iaixcbiAgICBba2V5XTogcHJvcHNba2V5XVxuICB9O1xufSwge30pO1xuZXhwb3J0IGNvbnN0IGdldFJvb3RQcm9wcyA9IChwcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHJvb1Byb3BzOiBzdHJpbmdbXSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHByb3BzKS5maWx0ZXIoa2V5ID0+IHJvb1Byb3BzLmluY2x1ZGVzKGtleSkpLnJlZHVjZSgob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwga2V5OiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ub2JqLFxuICAgICAgW2tleV06IHByb3BzW2tleV1cbiAgICB9O1xuICB9LCB7fSk7XG59O1xuZXhwb3J0IGNvbnN0IHZpc2libGVJblZYID0gKGVsOiBFbGVtZW50KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBsZWZ0LFxuICAgIHJpZ2h0XG4gIH0gPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgY29uc3Qge1xuICAgIGlubmVyV2lkdGhcbiAgfSA9IHdpbmRvdztcbiAgcmV0dXJuIGxlZnQgPj0gMCAmJiByaWdodCA8PSBpbm5lcldpZHRoO1xufTtcbmV4cG9ydCBjb25zdCB2aXNpYmxlSW5WWSA9IChlbDogRWxlbWVudCkgPT4ge1xuICBjb25zdCB7XG4gICAgdG9wLFxuICAgIGJvdHRvbVxuICB9ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIGNvbnN0IHtcbiAgICBpbm5lckhlaWdodFxuICB9ID0gd2luZG93O1xuICByZXR1cm4gdG9wID49IDAgJiYgYm90dG9tIDw9IGlubmVySGVpZ2h0O1xufTtcbmV4cG9ydCBjb25zdCBpc0luVmlldyA9IChlbDogRWxlbWVudCkgPT4ge1xuICBjb25zdCB7XG4gICAgdG9wLFxuICAgIGJvdHRvbSxcbiAgICBsZWZ0LFxuICAgIHJpZ2h0XG4gIH0gPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgY29uc3Qge1xuICAgIGlubmVySGVpZ2h0LFxuICAgIGlubmVyV2lkdGhcbiAgfSA9IHdpbmRvdztcbiAgbGV0IG91dFRvcCA9IHRvcCA8IDA7XG4gIGxldCBvdXRCb3R0b20gPSBib3R0b20gPiBpbm5lckhlaWdodDtcbiAgbGV0IG91dExlZnQgPSBsZWZ0IDwgMDtcbiAgbGV0IG91dFJpZ2h0ID0gcmlnaHQgPiBpbm5lcldpZHRoO1xuXG4gIC8vIFdlIG5lZWQgdG8gY2hlY2sgaWYgaXQgd2FzIGFscmVhZHkgb3V0c2lkZVxuICBjb25zdCBvdXRzaWRlWSA9IGVsLmhhc0F0dHJpYnV0ZSgnZGF0YS1vdXRzaWRlLXZ5Jyk7XG4gIGNvbnN0IG91dHNpZGVYID0gZWwuaGFzQXR0cmlidXRlKCdkYXRhLW91dHNpZGUtdngnKTtcbiAgY29uc3QgcGFyZW50UmVjdCA9IGVsPy5wYXJlbnRFbGVtZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgaWYgKHBhcmVudFJlY3QpIHtcbiAgICBpZiAob3V0c2lkZVkpIHtcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gZWwuZ2V0QXR0cmlidXRlKCdkYXRhLW91dHNpZGUtdnknKTtcbiAgICAgIGlmIChwb3NpdGlvbiA9PT0gJ3RvcCcpIHtcbiAgICAgICAgb3V0VG9wID0gcGFyZW50UmVjdC50b3AgLSAoYm90dG9tIC0gcGFyZW50UmVjdC5ib3R0b20pIDwgMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dEJvdHRvbSA9IHBhcmVudFJlY3QuYm90dG9tICsgKHBhcmVudFJlY3QudG9wIC0gdG9wKSA+IGlubmVySGVpZ2h0O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAob3V0c2lkZVgpIHtcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gZWwuZ2V0QXR0cmlidXRlKCdkYXRhLW91dHNpZGUtdngnKTtcbiAgICAgIGlmIChwb3NpdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgIG91dExlZnQgPSBwYXJlbnRSZWN0LmxlZnQgLSAocmlnaHQgLSBwYXJlbnRSZWN0LnJpZ2h0KSA8IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXRSaWdodCA9IHBhcmVudFJlY3QucmlnaHQgKyAocGFyZW50UmVjdC5sZWZ0IC0gbGVmdCkgPiBpbm5lcldpZHRoO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIG91dFRvcCxcbiAgICBvdXRCb3R0b20sXG4gICAgb3V0TGVmdCxcbiAgICBvdXRSaWdodFxuICB9O1xufTtcbmV4cG9ydCBpbnRlcmZhY2UgREJEYXRhT3V0c2lkZVBhaXIge1xuICB2eD86ICdsZWZ0JyB8ICdyaWdodCc7XG4gIHZ5PzogJ3RvcCcgfCAnYm90dG9tJztcbn1cbmV4cG9ydCBjb25zdCBoYW5kbGVEYXRhT3V0c2lkZSA9IChlbDogRWxlbWVudCk6IERCRGF0YU91dHNpZGVQYWlyID0+IHtcbiAgY29uc3Qge1xuICAgIG91dFRvcCxcbiAgICBvdXRCb3R0b20sXG4gICAgb3V0TGVmdCxcbiAgICBvdXRSaWdodFxuICB9ID0gaXNJblZpZXcoZWwpO1xuICBsZXQgZGF0YU91dHNpZGVQYWlyOiBEQkRhdGFPdXRzaWRlUGFpciA9IHt9O1xuICBpZiAob3V0VG9wIHx8IG91dEJvdHRvbSkge1xuICAgIGRhdGFPdXRzaWRlUGFpciA9IHtcbiAgICAgIHZ5OiBvdXRUb3AgPyAndG9wJyA6ICdib3R0b20nXG4gICAgfTtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtb3V0c2lkZS12eScsIGRhdGFPdXRzaWRlUGFpci52eSEpO1xuICB9IGVsc2Uge1xuICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1vdXRzaWRlLXZ5Jyk7XG4gIH1cbiAgaWYgKG91dExlZnQgfHwgb3V0UmlnaHQpIHtcbiAgICBkYXRhT3V0c2lkZVBhaXIgPSB7XG4gICAgICAuLi5kYXRhT3V0c2lkZVBhaXIsXG4gICAgICB2eDogb3V0UmlnaHQgPyAncmlnaHQnIDogJ2xlZnQnXG4gICAgfTtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtb3V0c2lkZS12eCcsIGRhdGFPdXRzaWRlUGFpci52eCEpO1xuICB9IGVsc2Uge1xuICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1vdXRzaWRlLXZ4Jyk7XG4gIH1cbiAgcmV0dXJuIGRhdGFPdXRzaWRlUGFpcjtcbn07XG5leHBvcnQgY29uc3QgaXNBcnJheU9mU3RyaW5ncyA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHN0cmluZ1tdID0+IEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmV2ZXJ5KGl0ZW0gPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKTtcbmNvbnN0IGFwcGxlT3MgPSBbJ01hYycsICdpUGhvbmUnLCAnaVBhZCcsICdpUG9kJ107XG5leHBvcnQgY29uc3QgaGFzVm9pY2VPdmVyID0gKCk6IGJvb2xlYW4gPT4gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgYXBwbGVPcy5zb21lKG9zID0+IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LmluY2x1ZGVzKG9zKSk7XG5leHBvcnQgY29uc3QgZGVsYXkgPSAoZm46ICgpID0+IHZvaWQsIG1zOiBudW1iZXIpID0+IG5ldyBQcm9taXNlKCgpID0+IHNldFRpbWVvdXQoZm4sIG1zKSk7XG5cbi8qKlxuICogU29tZSBmcmFtZXdvcmtzIGxpa2Ugc3RlbmNpbCB3b3VsZCBub3QgYWRkIFwidHJ1ZVwiIGFzIHZhbHVlIGZvciBhIHByb3BcbiAqIGlmIGl0IGlzIHVzZWQgaW4gYSBmcmFtZXdvcmsgbGlrZSBhbmd1bGFyIGUuZy46IFtkaXNhYmxlZF09XCJteURpc2FibGVkUHJvcFwiXG4gKiBAcGFyYW0gb3JpZ2luQm9vbCBTb21lIGJvb2xlYW4gdG8gY29udmVydCB0byBzdHJpbmdcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjb25zdCBnZXRCb29sZWFuQXNTdHJpbmcgPSAob3JpZ2luQm9vbD86IGJvb2xlYW4pOiBhbnkgPT4ge1xuICBpZiAob3JpZ2luQm9vbCkge1xuICAgIHJldHVybiBTdHJpbmcob3JpZ2luQm9vbCk7XG4gIH1cbiAgcmV0dXJuIG9yaWdpbkJvb2w7XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNvbnN0IGdldEhpZGVQcm9wID0gKHNob3c/OiBib29sZWFuKTogYW55ID0+IHtcbiAgaWYgKHNob3cgPT09IHVuZGVmaW5lZCB8fCBzaG93ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gZ2V0Qm9vbGVhbkFzU3RyaW5nKCFzaG93KTtcbn07XG5leHBvcnQgY29uc3Qgc3RyaW5nUHJvcFZpc2libGUgPSAoZ2l2ZW5TdHJpbmc/OiBzdHJpbmcsIHNob3dTdHJpbmc/OiBib29sZWFuKSA9PiB7XG4gIGlmIChzaG93U3RyaW5nID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gISFnaXZlblN0cmluZztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc2hvd1N0cmluZyAmJiBnaXZlblN0cmluZztcbiAgfVxufTtcbmV4cG9ydCBkZWZhdWx0IHtcbiAgZ2V0Um9vdFByb3BzLFxuICBmaWx0ZXJQYXNzaW5nUHJvcHMsXG4gIGNscyxcbiAgYWRkQXR0cmlidXRlVG9DaGlsZHJlbixcbiAgdXVpZCxcbiAgdmlzaWJsZUluVlgsXG4gIHZpc2libGVJblZZLFxuICBpc0luVmlldyxcbiAgaGFuZGxlRGF0YU91dHNpZGUsXG4gIGlzQXJyYXlPZlN0cmluZ3MsXG4gIGhhc1ZvaWNlT3ZlcixcbiAgZGVsYXksXG4gIGdldEJvb2xlYW5Bc1N0cmluZyxcbiAgZ2V0SGlkZVByb3AsXG4gIHN0cmluZ1Byb3BWaXNpYmxlXG59Il19
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { handleDataOutside } from './index';
|
|
2
|
+
export const isEventTargetNavigationItem = (event) => {
|
|
3
|
+
const { target } = event;
|
|
4
|
+
return Boolean(!target?.classList?.contains('db-navigation-item-expand-button') && target?.parentElement?.classList.contains('db-navigation-item'));
|
|
5
|
+
};
|
|
6
|
+
export class NavigationItemSafeTriangle {
|
|
7
|
+
constructor(element, subNavigation) {
|
|
8
|
+
this.parentSubNavigation = null;
|
|
9
|
+
this.initialized = false;
|
|
10
|
+
this.mouseX = 0;
|
|
11
|
+
this.mouseY = 0;
|
|
12
|
+
this.element = element;
|
|
13
|
+
this.subNavigation = subNavigation;
|
|
14
|
+
if (!this.element || !this.subNavigation) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
this.parentSubNavigation = this.element?.closest('.db-sub-navigation');
|
|
18
|
+
/*
|
|
19
|
+
* only initiate if:
|
|
20
|
+
* 1. item is not at root navigation level
|
|
21
|
+
* 2. item is not in the mobile navigation / within db-drawer
|
|
22
|
+
*/
|
|
23
|
+
if (this.parentSubNavigation && !this.element.closest('.db-drawer')) {
|
|
24
|
+
this.init();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
init() {
|
|
28
|
+
const parentElementWidth = this.parentSubNavigation?.getBoundingClientRect().width ?? 0;
|
|
29
|
+
// the triangle has the width of the sub-navigation, current nav-item can be wider.
|
|
30
|
+
// so the width of the triangle must be adapted to a possibly wider nav-item.
|
|
31
|
+
this.element?.style.setProperty('--db-navigation-item-inline-size', `${parentElementWidth}px`);
|
|
32
|
+
this.initialized = true;
|
|
33
|
+
}
|
|
34
|
+
enableFollow() {
|
|
35
|
+
if (!this.initialized || this.triangleData || !this.element || !this.subNavigation) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const dataOutsidePair = handleDataOutside(this.subNavigation);
|
|
39
|
+
const itemRect = this.element.getBoundingClientRect();
|
|
40
|
+
const parentElementWidth = this.parentSubNavigation?.getBoundingClientRect().width ?? 0;
|
|
41
|
+
this.triangleData = {
|
|
42
|
+
itemRect,
|
|
43
|
+
parentElementWidth,
|
|
44
|
+
subNavigationHeight: this.subNavigation.getBoundingClientRect().height,
|
|
45
|
+
padding: (parentElementWidth - itemRect.width) / 2,
|
|
46
|
+
outsideVX: dataOutsidePair.vx,
|
|
47
|
+
outsideVY: dataOutsidePair.vy
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
disableFollow() {
|
|
51
|
+
this.triangleData = undefined;
|
|
52
|
+
}
|
|
53
|
+
getTriangleTipX() {
|
|
54
|
+
if (!this.triangleData)
|
|
55
|
+
return 0;
|
|
56
|
+
if (this.triangleData.outsideVX === 'right') {
|
|
57
|
+
// vertical flipped triangle needs an inverted x pos
|
|
58
|
+
return this.triangleData.itemRect.width - this.mouseX;
|
|
59
|
+
}
|
|
60
|
+
// triangle stops shrinking from 75% x pos
|
|
61
|
+
return Math.min(this.mouseX, this.triangleData.itemRect.width * 0.75);
|
|
62
|
+
}
|
|
63
|
+
getTriangleTipY() {
|
|
64
|
+
if (!this.triangleData)
|
|
65
|
+
return 0;
|
|
66
|
+
// padding must be added to the y pos of the tip so that the y pos matches the cursor
|
|
67
|
+
const mouseYLimited = Math.max(Math.min(this.mouseY, this.triangleData.itemRect.height), 0) + this.triangleData.padding;
|
|
68
|
+
if (this.triangleData.outsideVY === 'bottom') {
|
|
69
|
+
// add offset to tip y pos to match corrected sub-navigation y pos
|
|
70
|
+
return mouseYLimited + (this.triangleData.subNavigationHeight - this.triangleData.padding * 2 - this.triangleData.itemRect.height);
|
|
71
|
+
}
|
|
72
|
+
return mouseYLimited;
|
|
73
|
+
}
|
|
74
|
+
hasMouseEnteredSubNavigation() {
|
|
75
|
+
if (!this.triangleData) {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
const isSubNavigationOnLeftSide = this.triangleData.outsideVX === 'right';
|
|
79
|
+
if (isSubNavigationOnLeftSide && this.mouseX < -1 * this.triangleData.padding) {
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
if (!isSubNavigationOnLeftSide && this.mouseX > this.triangleData.parentElementWidth - this.triangleData.padding) {
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
getTriangleCoordinates(variant) {
|
|
88
|
+
if (!this.triangleData) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (variant === 'fill-gap') {
|
|
92
|
+
const itemHeight = `${this.triangleData.itemRect.height + 2 * this.triangleData.padding}px`;
|
|
93
|
+
const xStart = `${this.triangleData.parentElementWidth - this.triangleData.padding}px`;
|
|
94
|
+
return {
|
|
95
|
+
lb: `${xStart} ${itemHeight}`,
|
|
96
|
+
lt: `${xStart} 0`,
|
|
97
|
+
rt: '100% 0',
|
|
98
|
+
rb: `100% ${itemHeight}`
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
const tipX = this.getTriangleTipX();
|
|
102
|
+
const tipY = this.getTriangleTipY();
|
|
103
|
+
const lb = `${tipX}px ${tipY}px`;
|
|
104
|
+
const lt = `${tipX}px ${tipY}px`;
|
|
105
|
+
return {
|
|
106
|
+
lb,
|
|
107
|
+
lt,
|
|
108
|
+
rt: '100% 0',
|
|
109
|
+
rb: '100% 100%'
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
followByMouseEvent(event) {
|
|
113
|
+
if (!this.initialized || !this.triangleData || !this.element || !this.subNavigation) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
this.mouseX = event.clientX - this.triangleData.itemRect.left;
|
|
117
|
+
this.mouseY = event.clientY - this.triangleData.itemRect.top;
|
|
118
|
+
const isOverSubNavigation = this.hasMouseEnteredSubNavigation();
|
|
119
|
+
const coordinates = this.getTriangleCoordinates(isOverSubNavigation ? 'fill-gap' : 'safe-triangle');
|
|
120
|
+
if (!coordinates) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
this.element.style.setProperty('--db-navigation-item-clip-path', `polygon(${coordinates.lb}, ${coordinates.lt}, ${coordinates.rt}, ${coordinates.rb})`);
|
|
124
|
+
if (isOverSubNavigation) {
|
|
125
|
+
this.triangleData = undefined;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
export default {
|
|
130
|
+
isEventTargetNavigationItem,
|
|
131
|
+
NavigationItemSafeTriangle
|
|
132
|
+
};
|
|
133
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL291dHB1dC9hbmd1bGFyL3NyYy91dGlscy9uYXZpZ2F0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQVM1QyxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxDQUFDLEtBQWMsRUFBVyxFQUFFO0lBQ3JFLE1BQU0sRUFDSixNQUFNLEVBQ1AsR0FBSSxLQUVILENBQUM7SUFDSCxPQUFPLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLGtDQUFrQyxDQUFDLElBQUksTUFBTSxFQUFFLGFBQWEsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQztBQUN0SixDQUFDLENBQUM7QUFDRixNQUFNLE9BQU8sMEJBQTBCO0lBUXJDLFlBQVksT0FBMkIsRUFBRSxhQUE2QjtRQUxyRCx3QkFBbUIsR0FBbUIsSUFBSSxDQUFDO1FBRXBELGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBQzdCLFdBQU0sR0FBVyxDQUFDLENBQUM7UUFDbkIsV0FBTSxHQUFXLENBQUMsQ0FBQztRQUV6QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN6QyxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBRXZFOzs7O1dBSUc7UUFDSCxJQUFJLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDcEUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFDTyxJQUFJO1FBQ1YsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO1FBRXhGLG1GQUFtRjtRQUNuRiw2RUFBNkU7UUFDN0UsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLGtDQUFrQyxFQUFFLEdBQUcsa0JBQWtCLElBQUksQ0FBQyxDQUFDO1FBQy9GLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBQzFCLENBQUM7SUFDTSxZQUFZO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ25GLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxlQUFlLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzlELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUN0RCxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDeEYsSUFBSSxDQUFDLFlBQVksR0FBRztZQUNsQixRQUFRO1lBQ1Isa0JBQWtCO1lBQ2xCLG1CQUFtQixFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxNQUFNO1lBQ3RFLE9BQU8sRUFBRSxDQUFDLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1lBQ2xELFNBQVMsRUFBRSxlQUFlLENBQUMsRUFBRTtZQUM3QixTQUFTLEVBQUUsZUFBZSxDQUFDLEVBQUU7U0FDOUIsQ0FBQztJQUNKLENBQUM7SUFDTSxhQUFhO1FBQ2xCLElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDO0lBQ2hDLENBQUM7SUFDTyxlQUFlO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWTtZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDNUMsb0RBQW9EO1lBQ3BELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDeEQsQ0FBQztRQUVELDBDQUEwQztRQUMxQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUNPLGVBQWU7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZO1lBQUUsT0FBTyxDQUFDLENBQUM7UUFFakMscUZBQXFGO1FBQ3JGLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDO1FBQ3hILElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDN0Msa0VBQWtFO1lBQ2xFLE9BQU8sYUFBYSxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckksQ0FBQztRQUNELE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7SUFDTyw0QkFBNEI7UUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN2QixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxNQUFNLHlCQUF5QixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxLQUFLLE9BQU8sQ0FBQztRQUMxRSxJQUFJLHlCQUF5QixJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM5RSxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxJQUFJLENBQUMseUJBQXlCLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakgsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ08sc0JBQXNCLENBQUMsT0FBcUM7UUFNbEUsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN2QixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksT0FBTyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQzNCLE1BQU0sVUFBVSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sSUFBSSxDQUFDO1lBQzVGLE1BQU0sTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sSUFBSSxDQUFDO1lBQ3ZGLE9BQU87Z0JBQ0wsRUFBRSxFQUFFLEdBQUcsTUFBTSxJQUFJLFVBQVUsRUFBRTtnQkFDN0IsRUFBRSxFQUFFLEdBQUcsTUFBTSxJQUFJO2dCQUNqQixFQUFFLEVBQUUsUUFBUTtnQkFDWixFQUFFLEVBQUUsUUFBUSxVQUFVLEVBQUU7YUFDekIsQ0FBQztRQUNKLENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDcEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sRUFBRSxHQUFHLEdBQUcsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDO1FBQ2pDLE1BQU0sRUFBRSxHQUFHLEdBQUcsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDO1FBQ2pDLE9BQU87WUFDTCxFQUFFO1lBQ0YsRUFBRTtZQUNGLEVBQUUsRUFBRSxRQUFRO1lBQ1osRUFBRSxFQUFFLFdBQVc7U0FDaEIsQ0FBQztJQUNKLENBQUM7SUFDTSxrQkFBa0IsQ0FBQyxLQUFpQjtRQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3BGLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztRQUM5RCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1FBQzdELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7UUFDaEUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3BHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxnQ0FBZ0MsRUFBRSxXQUFXLFdBQVcsQ0FBQyxFQUFFLEtBQUssV0FBVyxDQUFDLEVBQUUsS0FBSyxXQUFXLENBQUMsRUFBRSxLQUFLLFdBQVcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hKLElBQUksbUJBQW1CLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQztRQUNoQyxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBQ0QsZUFBZTtJQUNiLDJCQUEyQjtJQUMzQiwwQkFBMEI7Q0FDM0IsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGhhbmRsZURhdGFPdXRzaWRlIH0gZnJvbSAnLi9pbmRleCc7XG5leHBvcnQgdHlwZSBUcmlhbmdsZURhdGEgPSB7XG4gIGl0ZW1SZWN0OiBET01SZWN0O1xuICBwYXJlbnRFbGVtZW50V2lkdGg6IG51bWJlcjtcbiAgc3ViTmF2aWdhdGlvbkhlaWdodDogbnVtYmVyO1xuICBwYWRkaW5nOiBudW1iZXI7XG4gIG91dHNpZGVWWDogJ2xlZnQnIHwgJ3JpZ2h0JyB8IHVuZGVmaW5lZDtcbiAgb3V0c2lkZVZZOiAndG9wJyB8ICdib3R0b20nIHwgdW5kZWZpbmVkO1xufTtcbmV4cG9ydCBjb25zdCBpc0V2ZW50VGFyZ2V0TmF2aWdhdGlvbkl0ZW0gPSAoZXZlbnQ6IHVua25vd24pOiBib29sZWFuID0+IHtcbiAgY29uc3Qge1xuICAgIHRhcmdldFxuICB9ID0gKGV2ZW50IGFzIHtcbiAgICB0YXJnZXQ6IEhUTUxFbGVtZW50O1xuICB9KTtcbiAgcmV0dXJuIEJvb2xlYW4oIXRhcmdldD8uY2xhc3NMaXN0Py5jb250YWlucygnZGItbmF2aWdhdGlvbi1pdGVtLWV4cGFuZC1idXR0b24nKSAmJiB0YXJnZXQ/LnBhcmVudEVsZW1lbnQ/LmNsYXNzTGlzdC5jb250YWlucygnZGItbmF2aWdhdGlvbi1pdGVtJykpO1xufTtcbmV4cG9ydCBjbGFzcyBOYXZpZ2F0aW9uSXRlbVNhZmVUcmlhbmdsZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHN1Yk5hdmlnYXRpb246IEVsZW1lbnQgfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmVudFN1Yk5hdmlnYXRpb246IEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB0cmlhbmdsZURhdGE/OiBUcmlhbmdsZURhdGE7XG4gIHByaXZhdGUgaW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBtb3VzZVg6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgbW91c2VZOiBudW1iZXIgPSAwO1xuICBjb25zdHJ1Y3RvcihlbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwsIHN1Yk5hdmlnYXRpb246IEVsZW1lbnQgfCBudWxsKSB7XG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLnN1Yk5hdmlnYXRpb24gPSBzdWJOYXZpZ2F0aW9uO1xuICAgIGlmICghdGhpcy5lbGVtZW50IHx8ICF0aGlzLnN1Yk5hdmlnYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wYXJlbnRTdWJOYXZpZ2F0aW9uID0gdGhpcy5lbGVtZW50Py5jbG9zZXN0KCcuZGItc3ViLW5hdmlnYXRpb24nKTtcblxuICAgIC8qXG4gICAgICogb25seSBpbml0aWF0ZSBpZjpcbiAgICAgKiAxLiBpdGVtIGlzIG5vdCBhdCByb290IG5hdmlnYXRpb24gbGV2ZWxcbiAgICAgKiAyLiBpdGVtIGlzIG5vdCBpbiB0aGUgbW9iaWxlIG5hdmlnYXRpb24gLyB3aXRoaW4gZGItZHJhd2VyXG4gICAgICovXG4gICAgaWYgKHRoaXMucGFyZW50U3ViTmF2aWdhdGlvbiAmJiAhdGhpcy5lbGVtZW50LmNsb3Nlc3QoJy5kYi1kcmF3ZXInKSkge1xuICAgICAgdGhpcy5pbml0KCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgaW5pdCgpIHtcbiAgICBjb25zdCBwYXJlbnRFbGVtZW50V2lkdGggPSB0aGlzLnBhcmVudFN1Yk5hdmlnYXRpb24/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoID8/IDA7XG5cbiAgICAvLyB0aGUgdHJpYW5nbGUgaGFzIHRoZSB3aWR0aCBvZiB0aGUgc3ViLW5hdmlnYXRpb24sIGN1cnJlbnQgbmF2LWl0ZW0gY2FuIGJlIHdpZGVyLlxuICAgIC8vIHNvIHRoZSB3aWR0aCBvZiB0aGUgdHJpYW5nbGUgbXVzdCBiZSBhZGFwdGVkIHRvIGEgcG9zc2libHkgd2lkZXIgbmF2LWl0ZW0uXG4gICAgdGhpcy5lbGVtZW50Py5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1kYi1uYXZpZ2F0aW9uLWl0ZW0taW5saW5lLXNpemUnLCBgJHtwYXJlbnRFbGVtZW50V2lkdGh9cHhgKTtcbiAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgZW5hYmxlRm9sbG93KCkge1xuICAgIGlmICghdGhpcy5pbml0aWFsaXplZCB8fCB0aGlzLnRyaWFuZ2xlRGF0YSB8fCAhdGhpcy5lbGVtZW50IHx8ICF0aGlzLnN1Yk5hdmlnYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGF0YU91dHNpZGVQYWlyID0gaGFuZGxlRGF0YU91dHNpZGUodGhpcy5zdWJOYXZpZ2F0aW9uKTtcbiAgICBjb25zdCBpdGVtUmVjdCA9IHRoaXMuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBwYXJlbnRFbGVtZW50V2lkdGggPSB0aGlzLnBhcmVudFN1Yk5hdmlnYXRpb24/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoID8/IDA7XG4gICAgdGhpcy50cmlhbmdsZURhdGEgPSB7XG4gICAgICBpdGVtUmVjdCxcbiAgICAgIHBhcmVudEVsZW1lbnRXaWR0aCxcbiAgICAgIHN1Yk5hdmlnYXRpb25IZWlnaHQ6IHRoaXMuc3ViTmF2aWdhdGlvbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQsXG4gICAgICBwYWRkaW5nOiAocGFyZW50RWxlbWVudFdpZHRoIC0gaXRlbVJlY3Qud2lkdGgpIC8gMixcbiAgICAgIG91dHNpZGVWWDogZGF0YU91dHNpZGVQYWlyLnZ4LFxuICAgICAgb3V0c2lkZVZZOiBkYXRhT3V0c2lkZVBhaXIudnlcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBkaXNhYmxlRm9sbG93KCkge1xuICAgIHRoaXMudHJpYW5nbGVEYXRhID0gdW5kZWZpbmVkO1xuICB9XG4gIHByaXZhdGUgZ2V0VHJpYW5nbGVUaXBYKCk6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLnRyaWFuZ2xlRGF0YSkgcmV0dXJuIDA7XG4gICAgaWYgKHRoaXMudHJpYW5nbGVEYXRhLm91dHNpZGVWWCA9PT0gJ3JpZ2h0Jykge1xuICAgICAgLy8gdmVydGljYWwgZmxpcHBlZCB0cmlhbmdsZSBuZWVkcyBhbiBpbnZlcnRlZCB4IHBvc1xuICAgICAgcmV0dXJuIHRoaXMudHJpYW5nbGVEYXRhLml0ZW1SZWN0LndpZHRoIC0gdGhpcy5tb3VzZVg7XG4gICAgfVxuXG4gICAgLy8gdHJpYW5nbGUgc3RvcHMgc2hyaW5raW5nIGZyb20gNzUlIHggcG9zXG4gICAgcmV0dXJuIE1hdGgubWluKHRoaXMubW91c2VYLCB0aGlzLnRyaWFuZ2xlRGF0YS5pdGVtUmVjdC53aWR0aCAqIDAuNzUpO1xuICB9XG4gIHByaXZhdGUgZ2V0VHJpYW5nbGVUaXBZKCk6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLnRyaWFuZ2xlRGF0YSkgcmV0dXJuIDA7XG5cbiAgICAvLyBwYWRkaW5nIG11c3QgYmUgYWRkZWQgdG8gdGhlIHkgcG9zIG9mIHRoZSB0aXAgc28gdGhhdCB0aGUgeSBwb3MgbWF0Y2hlcyB0aGUgY3Vyc29yXG4gICAgY29uc3QgbW91c2VZTGltaXRlZCA9IE1hdGgubWF4KE1hdGgubWluKHRoaXMubW91c2VZLCB0aGlzLnRyaWFuZ2xlRGF0YS5pdGVtUmVjdC5oZWlnaHQpLCAwKSArIHRoaXMudHJpYW5nbGVEYXRhLnBhZGRpbmc7XG4gICAgaWYgKHRoaXMudHJpYW5nbGVEYXRhLm91dHNpZGVWWSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgIC8vIGFkZCBvZmZzZXQgdG8gdGlwIHkgcG9zIHRvIG1hdGNoIGNvcnJlY3RlZCBzdWItbmF2aWdhdGlvbiB5IHBvc1xuICAgICAgcmV0dXJuIG1vdXNlWUxpbWl0ZWQgKyAodGhpcy50cmlhbmdsZURhdGEuc3ViTmF2aWdhdGlvbkhlaWdodCAtIHRoaXMudHJpYW5nbGVEYXRhLnBhZGRpbmcgKiAyIC0gdGhpcy50cmlhbmdsZURhdGEuaXRlbVJlY3QuaGVpZ2h0KTtcbiAgICB9XG4gICAgcmV0dXJuIG1vdXNlWUxpbWl0ZWQ7XG4gIH1cbiAgcHJpdmF0ZSBoYXNNb3VzZUVudGVyZWRTdWJOYXZpZ2F0aW9uKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy50cmlhbmdsZURhdGEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaXNTdWJOYXZpZ2F0aW9uT25MZWZ0U2lkZSA9IHRoaXMudHJpYW5nbGVEYXRhLm91dHNpZGVWWCA9PT0gJ3JpZ2h0JztcbiAgICBpZiAoaXNTdWJOYXZpZ2F0aW9uT25MZWZ0U2lkZSAmJiB0aGlzLm1vdXNlWCA8IC0xICogdGhpcy50cmlhbmdsZURhdGEucGFkZGluZykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICghaXNTdWJOYXZpZ2F0aW9uT25MZWZ0U2lkZSAmJiB0aGlzLm1vdXNlWCA+IHRoaXMudHJpYW5nbGVEYXRhLnBhcmVudEVsZW1lbnRXaWR0aCAtIHRoaXMudHJpYW5nbGVEYXRhLnBhZGRpbmcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJpdmF0ZSBnZXRUcmlhbmdsZUNvb3JkaW5hdGVzKHZhcmlhbnQ6ICdzYWZlLXRyaWFuZ2xlJyB8ICdmaWxsLWdhcCcpOiB1bmRlZmluZWQgfCB7XG4gICAgbGI6IHN0cmluZztcbiAgICBsdDogc3RyaW5nO1xuICAgIHJ0OiBzdHJpbmc7XG4gICAgcmI6IHN0cmluZztcbiAgfSB7XG4gICAgaWYgKCF0aGlzLnRyaWFuZ2xlRGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodmFyaWFudCA9PT0gJ2ZpbGwtZ2FwJykge1xuICAgICAgY29uc3QgaXRlbUhlaWdodCA9IGAke3RoaXMudHJpYW5nbGVEYXRhLml0ZW1SZWN0LmhlaWdodCArIDIgKiB0aGlzLnRyaWFuZ2xlRGF0YS5wYWRkaW5nfXB4YDtcbiAgICAgIGNvbnN0IHhTdGFydCA9IGAke3RoaXMudHJpYW5nbGVEYXRhLnBhcmVudEVsZW1lbnRXaWR0aCAtIHRoaXMudHJpYW5nbGVEYXRhLnBhZGRpbmd9cHhgO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGI6IGAke3hTdGFydH0gJHtpdGVtSGVpZ2h0fWAsXG4gICAgICAgIGx0OiBgJHt4U3RhcnR9IDBgLFxuICAgICAgICBydDogJzEwMCUgMCcsXG4gICAgICAgIHJiOiBgMTAwJSAke2l0ZW1IZWlnaHR9YFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgdGlwWCA9IHRoaXMuZ2V0VHJpYW5nbGVUaXBYKCk7XG4gICAgY29uc3QgdGlwWSA9IHRoaXMuZ2V0VHJpYW5nbGVUaXBZKCk7XG4gICAgY29uc3QgbGIgPSBgJHt0aXBYfXB4ICR7dGlwWX1weGA7XG4gICAgY29uc3QgbHQgPSBgJHt0aXBYfXB4ICR7dGlwWX1weGA7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxiLFxuICAgICAgbHQsXG4gICAgICBydDogJzEwMCUgMCcsXG4gICAgICByYjogJzEwMCUgMTAwJSdcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBmb2xsb3dCeU1vdXNlRXZlbnQoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWQgfHwgIXRoaXMudHJpYW5nbGVEYXRhIHx8ICF0aGlzLmVsZW1lbnQgfHwgIXRoaXMuc3ViTmF2aWdhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm1vdXNlWCA9IGV2ZW50LmNsaWVudFggLSB0aGlzLnRyaWFuZ2xlRGF0YS5pdGVtUmVjdC5sZWZ0O1xuICAgIHRoaXMubW91c2VZID0gZXZlbnQuY2xpZW50WSAtIHRoaXMudHJpYW5nbGVEYXRhLml0ZW1SZWN0LnRvcDtcbiAgICBjb25zdCBpc092ZXJTdWJOYXZpZ2F0aW9uID0gdGhpcy5oYXNNb3VzZUVudGVyZWRTdWJOYXZpZ2F0aW9uKCk7XG4gICAgY29uc3QgY29vcmRpbmF0ZXMgPSB0aGlzLmdldFRyaWFuZ2xlQ29vcmRpbmF0ZXMoaXNPdmVyU3ViTmF2aWdhdGlvbiA/ICdmaWxsLWdhcCcgOiAnc2FmZS10cmlhbmdsZScpO1xuICAgIGlmICghY29vcmRpbmF0ZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCctLWRiLW5hdmlnYXRpb24taXRlbS1jbGlwLXBhdGgnLCBgcG9seWdvbigke2Nvb3JkaW5hdGVzLmxifSwgJHtjb29yZGluYXRlcy5sdH0sICR7Y29vcmRpbmF0ZXMucnR9LCAke2Nvb3JkaW5hdGVzLnJifSlgKTtcbiAgICBpZiAoaXNPdmVyU3ViTmF2aWdhdGlvbikge1xuICAgICAgdGhpcy50cmlhbmdsZURhdGEgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG59XG5leHBvcnQgZGVmYXVsdCB7XG4gIGlzRXZlbnRUYXJnZXROYXZpZ2F0aW9uSXRlbSxcbiAgTmF2aWdhdGlvbkl0ZW1TYWZlVHJpYW5nbGVcbn0iXX0=
|