@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.
Files changed (211) hide show
  1. package/README.md +130 -0
  2. package/components/accordion/accordion.d.ts +31 -0
  3. package/components/accordion/index.d.ts +1 -0
  4. package/components/accordion/model.d.ts +41 -0
  5. package/components/accordion-item/accordion-item.d.ts +29 -0
  6. package/components/accordion-item/index.d.ts +1 -0
  7. package/components/accordion-item/model.d.ts +24 -0
  8. package/components/badge/badge.d.ts +28 -0
  9. package/components/badge/index.d.ts +1 -0
  10. package/components/badge/model.d.ts +16 -0
  11. package/components/brand/brand.d.ts +24 -0
  12. package/components/brand/index.d.ts +1 -0
  13. package/components/brand/model.d.ts +10 -0
  14. package/components/button/button.d.ts +39 -0
  15. package/components/button/index.d.ts +1 -0
  16. package/components/button/model.d.ts +52 -0
  17. package/components/card/card.d.ts +24 -0
  18. package/components/card/index.d.ts +1 -0
  19. package/components/card/model.d.ts +18 -0
  20. package/components/checkbox/checkbox.d.ts +64 -0
  21. package/components/checkbox/index.d.ts +1 -0
  22. package/components/checkbox/model.d.ts +10 -0
  23. package/components/divider/divider.d.ts +22 -0
  24. package/components/divider/index.d.ts +1 -0
  25. package/components/divider/model.d.ts +18 -0
  26. package/components/drawer/drawer.d.ts +34 -0
  27. package/components/drawer/index.d.ts +1 -0
  28. package/components/drawer/model.d.ts +41 -0
  29. package/components/header/MetaNavigation.directive.d.ts +5 -0
  30. package/components/header/Navigation.directive.d.ts +5 -0
  31. package/components/header/SecondaryAction.directive.d.ts +5 -0
  32. package/components/header/header.d.ts +34 -0
  33. package/components/header/index.d.ts +1 -0
  34. package/components/header/model.d.ts +44 -0
  35. package/components/icon/icon.d.ts +22 -0
  36. package/components/icon/index.d.ts +1 -0
  37. package/components/icon/model.d.ts +12 -0
  38. package/components/infotext/index.d.ts +1 -0
  39. package/components/infotext/infotext.d.ts +24 -0
  40. package/components/infotext/model.d.ts +5 -0
  41. package/components/input/index.d.ts +1 -0
  42. package/components/input/input.d.ts +87 -0
  43. package/components/input/model.d.ts +39 -0
  44. package/components/link/index.d.ts +1 -0
  45. package/components/link/link.d.ts +37 -0
  46. package/components/link/model.d.ts +24 -0
  47. package/components/navigation/index.d.ts +1 -0
  48. package/components/navigation/model.d.ts +5 -0
  49. package/components/navigation/navigation.d.ts +21 -0
  50. package/components/navigation-item/NavigationContent.directive.d.ts +5 -0
  51. package/components/navigation-item/index.d.ts +1 -0
  52. package/components/navigation-item/model.d.ts +34 -0
  53. package/components/navigation-item/navigation-item.d.ts +44 -0
  54. package/components/notification/index.d.ts +1 -0
  55. package/components/notification/model.d.ts +57 -0
  56. package/components/notification/notification.d.ts +38 -0
  57. package/components/page/index.d.ts +1 -0
  58. package/components/page/model.d.ts +32 -0
  59. package/components/page/page.d.ts +25 -0
  60. package/components/popover/index.d.ts +1 -0
  61. package/components/popover/model.d.ts +18 -0
  62. package/components/popover/popover.d.ts +33 -0
  63. package/components/radio/index.d.ts +1 -0
  64. package/components/radio/model.d.ts +7 -0
  65. package/components/radio/radio.d.ts +51 -0
  66. package/components/section/index.d.ts +1 -0
  67. package/components/section/model.d.ts +5 -0
  68. package/components/section/section.d.ts +22 -0
  69. package/components/select/index.d.ts +1 -0
  70. package/components/select/model.d.ts +43 -0
  71. package/components/select/select.d.ts +77 -0
  72. package/components/stack/index.d.ts +1 -0
  73. package/components/stack/model.d.ts +34 -0
  74. package/components/stack/stack.d.ts +25 -0
  75. package/components/switch/index.d.ts +1 -0
  76. package/components/switch/model.d.ts +12 -0
  77. package/components/switch/switch.d.ts +55 -0
  78. package/components/tab-item/index.d.ts +1 -0
  79. package/components/tab-item/model.d.ts +24 -0
  80. package/components/tab-item/tab-item.d.ts +44 -0
  81. package/components/tab-list/index.d.ts +1 -0
  82. package/components/tab-list/model.d.ts +5 -0
  83. package/components/tab-list/tab-list.d.ts +20 -0
  84. package/components/tab-panel/index.d.ts +1 -0
  85. package/components/tab-panel/model.d.ts +10 -0
  86. package/components/tab-panel/tab-panel.d.ts +21 -0
  87. package/components/tabs/index.d.ts +1 -0
  88. package/components/tabs/model.d.ts +47 -0
  89. package/components/tabs/tabs.d.ts +42 -0
  90. package/components/tag/index.d.ts +1 -0
  91. package/components/tag/model.d.ts +45 -0
  92. package/components/tag/tag.d.ts +37 -0
  93. package/components/textarea/index.d.ts +1 -0
  94. package/components/textarea/model.d.ts +30 -0
  95. package/components/textarea/textarea.d.ts +79 -0
  96. package/components/tooltip/index.d.ts +1 -0
  97. package/components/tooltip/model.d.ts +7 -0
  98. package/components/tooltip/tooltip.d.ts +32 -0
  99. package/esm2022/components/accordion/accordion.mjs +196 -0
  100. package/esm2022/components/accordion/index.mjs +2 -0
  101. package/esm2022/components/accordion/model.mjs +3 -0
  102. package/esm2022/components/accordion-item/accordion-item.mjs +136 -0
  103. package/esm2022/components/accordion-item/index.mjs +2 -0
  104. package/esm2022/components/accordion-item/model.mjs +2 -0
  105. package/esm2022/components/badge/badge.mjs +130 -0
  106. package/esm2022/components/badge/index.mjs +2 -0
  107. package/esm2022/components/badge/model.mjs +2 -0
  108. package/esm2022/components/brand/brand.mjs +99 -0
  109. package/esm2022/components/brand/index.mjs +2 -0
  110. package/esm2022/components/brand/model.mjs +2 -0
  111. package/esm2022/components/button/button.mjs +158 -0
  112. package/esm2022/components/button/index.mjs +2 -0
  113. package/esm2022/components/button/model.mjs +4 -0
  114. package/esm2022/components/card/card.mjs +107 -0
  115. package/esm2022/components/card/index.mjs +2 -0
  116. package/esm2022/components/card/model.mjs +3 -0
  117. package/esm2022/components/checkbox/checkbox.mjs +328 -0
  118. package/esm2022/components/checkbox/index.mjs +2 -0
  119. package/esm2022/components/checkbox/model.mjs +2 -0
  120. package/esm2022/components/divider/divider.mjs +93 -0
  121. package/esm2022/components/divider/index.mjs +2 -0
  122. package/esm2022/components/divider/model.mjs +3 -0
  123. package/esm2022/components/drawer/drawer.mjs +218 -0
  124. package/esm2022/components/drawer/index.mjs +2 -0
  125. package/esm2022/components/drawer/model.mjs +4 -0
  126. package/esm2022/components/header/MetaNavigation.directive.mjs +15 -0
  127. package/esm2022/components/header/Navigation.directive.mjs +15 -0
  128. package/esm2022/components/header/SecondaryAction.directive.mjs +15 -0
  129. package/esm2022/components/header/header.mjs +251 -0
  130. package/esm2022/components/header/index.mjs +2 -0
  131. package/esm2022/components/header/model.mjs +2 -0
  132. package/esm2022/components/icon/icon.mjs +100 -0
  133. package/esm2022/components/icon/index.mjs +2 -0
  134. package/esm2022/components/icon/model.mjs +3 -0
  135. package/esm2022/components/infotext/index.mjs +2 -0
  136. package/esm2022/components/infotext/infotext.mjs +103 -0
  137. package/esm2022/components/infotext/model.mjs +2 -0
  138. package/esm2022/components/input/index.mjs +2 -0
  139. package/esm2022/components/input/input.mjs +421 -0
  140. package/esm2022/components/input/model.mjs +6 -0
  141. package/esm2022/components/link/index.mjs +2 -0
  142. package/esm2022/components/link/link.mjs +152 -0
  143. package/esm2022/components/link/model.mjs +4 -0
  144. package/esm2022/components/navigation/index.mjs +2 -0
  145. package/esm2022/components/navigation/model.mjs +2 -0
  146. package/esm2022/components/navigation/navigation.mjs +92 -0
  147. package/esm2022/components/navigation-item/NavigationContent.directive.mjs +15 -0
  148. package/esm2022/components/navigation-item/index.mjs +2 -0
  149. package/esm2022/components/navigation-item/model.mjs +2 -0
  150. package/esm2022/components/navigation-item/navigation-item.mjs +236 -0
  151. package/esm2022/components/notification/index.mjs +2 -0
  152. package/esm2022/components/notification/model.mjs +4 -0
  153. package/esm2022/components/notification/notification.mjs +181 -0
  154. package/esm2022/components/page/index.mjs +2 -0
  155. package/esm2022/components/page/model.mjs +3 -0
  156. package/esm2022/components/page/page.mjs +127 -0
  157. package/esm2022/components/popover/index.mjs +2 -0
  158. package/esm2022/components/popover/model.mjs +2 -0
  159. package/esm2022/components/popover/popover.mjs +189 -0
  160. package/esm2022/components/radio/index.mjs +2 -0
  161. package/esm2022/components/radio/model.mjs +2 -0
  162. package/esm2022/components/radio/radio.mjs +230 -0
  163. package/esm2022/components/section/index.mjs +2 -0
  164. package/esm2022/components/section/model.mjs +2 -0
  165. package/esm2022/components/section/section.mjs +96 -0
  166. package/esm2022/components/select/index.mjs +2 -0
  167. package/esm2022/components/select/model.mjs +2 -0
  168. package/esm2022/components/select/select.mjs +426 -0
  169. package/esm2022/components/stack/index.mjs +2 -0
  170. package/esm2022/components/stack/model.mjs +5 -0
  171. package/esm2022/components/stack/stack.mjs +106 -0
  172. package/esm2022/components/switch/index.mjs +2 -0
  173. package/esm2022/components/switch/model.mjs +2 -0
  174. package/esm2022/components/switch/switch.mjs +237 -0
  175. package/esm2022/components/tab-item/index.mjs +2 -0
  176. package/esm2022/components/tab-item/model.mjs +2 -0
  177. package/esm2022/components/tab-item/tab-item.mjs +195 -0
  178. package/esm2022/components/tab-list/index.mjs +2 -0
  179. package/esm2022/components/tab-list/model.mjs +2 -0
  180. package/esm2022/components/tab-list/tab-list.mjs +84 -0
  181. package/esm2022/components/tab-panel/index.mjs +2 -0
  182. package/esm2022/components/tab-panel/model.mjs +2 -0
  183. package/esm2022/components/tab-panel/tab-panel.mjs +96 -0
  184. package/esm2022/components/tabs/index.mjs +2 -0
  185. package/esm2022/components/tabs/model.mjs +3 -0
  186. package/esm2022/components/tabs/tabs.mjs +322 -0
  187. package/esm2022/components/tag/index.mjs +2 -0
  188. package/esm2022/components/tag/model.mjs +2 -0
  189. package/esm2022/components/tag/tag.mjs +186 -0
  190. package/esm2022/components/textarea/index.mjs +2 -0
  191. package/esm2022/components/textarea/model.mjs +3 -0
  192. package/esm2022/components/textarea/textarea.mjs +363 -0
  193. package/esm2022/components/tooltip/index.mjs +2 -0
  194. package/esm2022/components/tooltip/model.mjs +2 -0
  195. package/esm2022/components/tooltip/tooltip.mjs +149 -0
  196. package/esm2022/db-ux-ngx-core-components.mjs +5 -0
  197. package/esm2022/index.mjs +41 -0
  198. package/esm2022/shared/constants.mjs +94 -0
  199. package/esm2022/shared/model.mjs +22 -0
  200. package/esm2022/utils/form-components.mjs +11 -0
  201. package/esm2022/utils/index.mjs +174 -0
  202. package/esm2022/utils/navigation.mjs +133 -0
  203. package/fesm2022/db-ux-ngx-core-components.mjs +6109 -0
  204. package/fesm2022/db-ux-ngx-core-components.mjs.map +1 -0
  205. package/index.d.ts +40 -0
  206. package/package.json +35 -0
  207. package/shared/constants.d.ts +83 -0
  208. package/shared/model.d.ts +445 -0
  209. package/utils/form-components.d.ts +2 -0
  210. package/utils/index.d.ts +61 -0
  211. 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL291dHB1dC9hbmd1bGFyL3NyYy91dGlscy9uYXZpZ2F0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQVM1QyxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxDQUFDLEtBQWMsRUFBVyxFQUFFO0lBQ3JFLE1BQU0sRUFDSixNQUFNLEVBQ1AsR0FBSSxLQUVILENBQUM7SUFDSCxPQUFPLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLGtDQUFrQyxDQUFDLElBQUksTUFBTSxFQUFFLGFBQWEsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQztBQUN0SixDQUFDLENBQUM7QUFDRixNQUFNLE9BQU8sMEJBQTBCO0lBUXJDLFlBQVksT0FBMkIsRUFBRSxhQUE2QjtRQUxyRCx3QkFBbUIsR0FBbUIsSUFBSSxDQUFDO1FBRXBELGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBQzdCLFdBQU0sR0FBVyxDQUFDLENBQUM7UUFDbkIsV0FBTSxHQUFXLENBQUMsQ0FBQztRQUV6QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN6QyxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBRXZFOzs7O1dBSUc7UUFDSCxJQUFJLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFlB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Q0FBZ0MsRUFBRSxXQUFXLFdBQVcsQ0FBQyxFQUFFLEtBQUssV0FBVyxDQUFDLEVBQUUsS0FBSyxXQUFXLENBQUMsRUFBRSxLQUFLLFdBQVcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hKLElBQUksbUJBQW1CLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQztRQUNoQyxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBQ0QsZUFBZTtJQUNiLDJCQUEyQjtJQUMzQiwwQkFBMEI7Q0FDM0IsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGhhbmRsZURhdGFPdXRzaWRlIH0gZnJvbSAnLi9pbmRleCc7XG5leHBvcnQgdHlwZSBUcmlhbmdsZURhdGEgPSB7XG4gIGl0ZW1SZWN0OiBET01SZWN0O1xuICBwYXJlbnRFbGVtZW50V2lkdGg6IG51bWJlcjtcbiAgc3ViTmF2aWdhdGlvbkhlaWdodDogbnVtYmVyO1xuICBwYWRkaW5nOiBudW1iZXI7XG4gIG91dHNpZGVWWDogJ2xlZnQnIHwgJ3JpZ2h0JyB8IHVuZGVmaW5lZDtcbiAgb3V0c2lkZVZZOiAndG9wJyB8ICdib3R0b20nIHwgdW5kZWZpbmVkO1xufTtcbmV4cG9ydCBjb25zdCBpc0V2ZW50VGFyZ2V0TmF2aWdhdGlvbkl0ZW0gPSAoZXZlbnQ6IHVua25vd24pOiBib29sZWFuID0+IHtcbiAgY29uc3Qge1xuICAgIHRhcmdldFxuICB9ID0gKGV2ZW50IGFzIHtcbiAgICB0YXJnZXQ6IEhUTUxFbGVtZW50O1xuICB9KTtcbiAgcmV0dXJuIEJvb2xlYW4oIXRhcmdldD8uY2xhc3NMaXN0Py5jb250YWlucygnZGItbmF2aWdhdGlvbi1pdGVtLWV4cGFuZC1idXR0b24nKSAmJiB0YXJnZXQ/LnBhcmVudEVsZW1lbnQ/LmNsYXNzTGlzdC5jb250YWlucygnZGItbmF2aWdhdGlvbi1pdGVtJykpO1xufTtcbmV4cG9ydCBjbGFzcyBOYXZpZ2F0aW9uSXRlbVNhZmVUcmlhbmdsZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHN1Yk5hdmlnYXRpb246IEVsZW1lbnQgfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmVudFN1Yk5hdmlnYXRpb246IEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB0cmlhbmdsZURhdGE/OiBUcmlhbmdsZURhdGE7XG4gIHByaXZhdGUgaW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBtb3VzZVg6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgbW91c2VZOiBudW1iZXIgPSAwO1xuICBjb25zdHJ1Y3RvcihlbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwsIHN1Yk5hdmlnYXRpb246IEVsZW1lbnQgfCBudWxsKSB7XG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLnN1Yk5hdmlnYXRpb24gPSBzdWJOYXZpZ2F0aW9uO1xuICAgIGlmICghdGhpcy5lbGVtZW50IHx8ICF0aGlzLnN1Yk5hdmlnYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wYXJlbnRTdWJOYXZpZ2F0aW9uID0gdGhpcy5lbGVtZW50Py5jbG9zZXN0KCcuZGItc3ViLW5hdmlnYXRpb24nKTtcblxuICAgIC8qXG4gICAgICogb25seSBpbml0aWF0ZSBpZjpcbiAgICAgKiAxLiBpdGVtIGlzIG5vdCBhdCByb290IG5hdmlnYXRpb24gbGV2ZWxcbiAgICAgKiAyLiBpdGVtIGlzIG5vdCBpbiB0aGUgbW9iaWxlIG5hdmlnYXRpb24gLyB3aXRoaW4gZGItZHJhd2VyXG4gICAgICovXG4gICAgaWYgKHRoaXMucGFyZW50U3ViTmF2aWdhdGlvbiAmJiAhdGhpcy5lbGVtZW50LmNsb3Nlc3QoJy5kYi1kcmF3ZXInKSkge1xuICAgICAgdGhpcy5pbml0KCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgaW5pdCgpIHtcbiAgICBjb25zdCBwYXJlbnRFbGVtZW50V2lkdGggPSB0aGlzLnBhcmVudFN1Yk5hdmlnYXRpb24/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoID8/IDA7XG5cbiAgICAvLyB0aGUgdHJpYW5nbGUgaGFzIHRoZSB3aWR0aCBvZiB0aGUgc3ViLW5hdmlnYXRpb24sIGN1cnJlbnQgbmF2LWl0ZW0gY2FuIGJlIHdpZGVyLlxuICAgIC8vIHNvIHRoZSB3aWR0aCBvZiB0aGUgdHJpYW5nbGUgbXVzdCBiZSBhZGFwdGVkIHRvIGEgcG9zc2libHkgd2lkZXIgbmF2LWl0ZW0uXG4gICAgdGhpcy5lbGVtZW50Py5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1kYi1uYXZpZ2F0aW9uLWl0ZW0taW5saW5lLXNpemUnLCBgJHtwYXJlbnRFbGVtZW50V2lkdGh9cHhgKTtcbiAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgZW5hYmxlRm9sbG93KCkge1xuICAgIGlmICghdGhpcy5pbml0aWFsaXplZCB8fCB0aGlzLnRyaWFuZ2xlRGF0YSB8fCAhdGhpcy5lbGVtZW50IHx8ICF0aGlzLnN1Yk5hdmlnYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGF0YU91dHNpZGVQYWlyID0gaGFuZGxlRGF0YU91dHNpZGUodGhpcy5zdWJOYXZpZ2F0aW9uKTtcbiAgICBjb25zdCBpdGVtUmVjdCA9IHRoaXMuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBwYXJlbnRFbGVtZW50V2lkdGggPSB0aGlzLnBhcmVudFN1Yk5hdmlnYXRpb24/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoID8/IDA7XG4gICAgdGhpcy50cmlhbmdsZURhdGEgPSB7XG4gICAgICBpdGVtUmVjdCxcbiAgICAgIHBhcmVudEVsZW1lbnRXaWR0aCxcbiAgICAgIHN1Yk5hdmlnYXRpb25IZWlnaHQ6IHRoaXMuc3ViTmF2aWdhdGlvbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQsXG4gICAgICBwYWRkaW5nOiAocGFyZW50RWxlbWVudFdpZHRoIC0gaXRlbVJlY3Qud2lkdGgpIC8gMixcbiAgICAgIG91dHNpZGVWWDogZGF0YU91dHNpZGVQYWlyLnZ4LFxuICAgICAgb3V0c2lkZVZZOiBkYXRhT3V0c2lkZVBhaXIudnlcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBkaXNhYmxlRm9sbG93KCkge1xuICAgIHRoaXMudHJpYW5nbGVEYXRhID0gdW5kZWZpbmVkO1xuICB9XG4gIHByaXZhdGUgZ2V0VHJpYW5nbGVUaXBYKCk6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLnRyaWFuZ2xlRGF0YSkgcmV0dXJuIDA7XG4gICAgaWYgKHRoaXMudHJpYW5nbGVEYXRhLm91dHNpZGVWWCA9PT0gJ3JpZ2h0Jykge1xuICAgICAgLy8gdmVydGljYWwgZmxpcHBlZCB0cmlhbmdsZSBuZWVkcyBhbiBpbnZlcnRlZCB4IHBvc1xuICAgICAgcmV0dXJuIHRoaXMudHJpYW5nbGVEYXRhLml0ZW1SZWN0LndpZHRoIC0gdGhpcy5tb3VzZVg7XG4gICAgfVxuXG4gICAgLy8gdHJpYW5nbGUgc3RvcHMgc2hyaW5raW5nIGZyb20gNzUlIHggcG9zXG4gICAgcmV0dXJuIE1hdGgubWluKHRoaXMubW91c2VYLCB0aGlzLnRyaWFuZ2xlRGF0YS5pdGVtUmVjdC53aWR0aCAqIDAuNzUpO1xuICB9XG4gIHByaXZhdGUgZ2V0VHJpYW5nbGVUaXBZKCk6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLnRyaWFuZ2xlRGF0YSkgcmV0dXJuIDA7XG5cbiAgICAvLyBwYWRkaW5nIG11c3QgYmUgYWRkZWQgdG8gdGhlIHkgcG9zIG9mIHRoZSB0aXAgc28gdGhhdCB0aGUgeSBwb3MgbWF0Y2hlcyB0aGUgY3Vyc29yXG4gICAgY29uc3QgbW91c2VZTGltaXRlZCA9IE1hdGgubWF4KE1hdGgubWluKHRoaXMubW91c2VZLCB0aGlzLnRyaWFuZ2xlRGF0YS5pdGVtUmVjdC5oZWlnaHQpLCAwKSArIHRoaXMudHJpYW5nbGVEYXRhLnBhZGRpbmc7XG4gICAgaWYgKHRoaXMudHJpYW5nbGVEYXRhLm91dHNpZGVWWSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgIC8vIGFkZCBvZmZzZXQgdG8gdGlwIHkgcG9zIHRvIG1hdGNoIGNvcnJlY3RlZCBzdWItbmF2aWdhdGlvbiB5IHBvc1xuICAgICAgcmV0dXJuIG1vdXNlWUxpbWl0ZWQgKyAodGhpcy50cmlhbmdsZURhdGEuc3ViTmF2aWdhdGlvbkhlaWdodCAtIHRoaXMudHJpYW5nbGVEYXRhLnBhZGRpbmcgKiAyIC0gdGhpcy50cmlhbmdsZURhdGEuaXRlbVJlY3QuaGVpZ2h0KTtcbiAgICB9XG4gICAgcmV0dXJuIG1vdXNlWUxpbWl0ZWQ7XG4gIH1cbiAgcHJpdmF0ZSBoYXNNb3VzZUVudGVyZWRTdWJOYXZpZ2F0aW9uKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy50cmlhbmdsZURhdGEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaXNTdWJOYXZpZ2F0aW9uT25MZWZ0U2lkZSA9IHRoaXMudHJpYW5nbGVEYXRhLm91dHNpZGVWWCA9PT0gJ3JpZ2h0JztcbiAgICBpZiAoaXNTdWJOYXZpZ2F0aW9uT25MZWZ0U2lkZSAmJiB0aGlzLm1vdXNlWCA8IC0xICogdGhpcy50cmlhbmdsZURhdGEucGFkZGluZykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICghaXNTdWJOYXZpZ2F0aW9uT25MZWZ0U2lkZSAmJiB0aGlzLm1vdXNlWCA+IHRoaXMudHJpYW5nbGVEYXRhLnBhcmVudEVsZW1lbnRXaWR0aCAtIHRoaXMudHJpYW5nbGVEYXRhLnBhZGRpbmcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJpdmF0ZSBnZXRUcmlhbmdsZUNvb3JkaW5hdGVzKHZhcmlhbnQ6ICdzYWZlLXRyaWFuZ2xlJyB8ICdmaWxsLWdhcCcpOiB1bmRlZmluZWQgfCB7XG4gICAgbGI6IHN0cmluZztcbiAgICBsdDogc3RyaW5nO1xuICAgIHJ0OiBzdHJpbmc7XG4gICAgcmI6IHN0cmluZztcbiAgfSB7XG4gICAgaWYgKCF0aGlzLnRyaWFuZ2xlRGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodmFyaWFudCA9PT0gJ2ZpbGwtZ2FwJykge1xuICAgICAgY29uc3QgaXRlbUhlaWdodCA9IGAke3RoaXMudHJpYW5nbGVEYXRhLml0ZW1SZWN0LmhlaWdodCArIDIgKiB0aGlzLnRyaWFuZ2xlRGF0YS5wYWRkaW5nfXB4YDtcbiAgICAgIGNvbnN0IHhTdGFydCA9IGAke3RoaXMudHJpYW5nbGVEYXRhLnBhcmVudEVsZW1lbnRXaWR0aCAtIHRoaXMudHJpYW5nbGVEYXRhLnBhZGRpbmd9cHhgO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGI6IGAke3hTdGFydH0gJHtpdGVtSGVpZ2h0fWAsXG4gICAgICAgIGx0OiBgJHt4U3RhcnR9IDBgLFxuICAgICAgICBydDogJzEwMCUgMCcsXG4gICAgICAgIHJiOiBgMTAwJSAke2l0ZW1IZWlnaHR9YFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgdGlwWCA9IHRoaXMuZ2V0VHJpYW5nbGVUaXBYKCk7XG4gICAgY29uc3QgdGlwWSA9IHRoaXMuZ2V0VHJpYW5nbGVUaXBZKCk7XG4gICAgY29uc3QgbGIgPSBgJHt0aXBYfXB4ICR7dGlwWX1weGA7XG4gICAgY29uc3QgbHQgPSBgJHt0aXBYfXB4ICR7dGlwWX1weGA7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxiLFxuICAgICAgbHQsXG4gICAgICBydDogJzEwMCUgMCcsXG4gICAgICByYjogJzEwMCUgMTAwJSdcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBmb2xsb3dCeU1vdXNlRXZlbnQoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWQgfHwgIXRoaXMudHJpYW5nbGVEYXRhIHx8ICF0aGlzLmVsZW1lbnQgfHwgIXRoaXMuc3ViTmF2aWdhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm1vdXNlWCA9IGV2ZW50LmNsaWVudFggLSB0aGlzLnRyaWFuZ2xlRGF0YS5pdGVtUmVjdC5sZWZ0O1xuICAgIHRoaXMubW91c2VZID0gZXZlbnQuY2xpZW50WSAtIHRoaXMudHJpYW5nbGVEYXRhLml0ZW1SZWN0LnRvcDtcbiAgICBjb25zdCBpc092ZXJTdWJOYXZpZ2F0aW9uID0gdGhpcy5oYXNNb3VzZUVudGVyZWRTdWJOYXZpZ2F0aW9uKCk7XG4gICAgY29uc3QgY29vcmRpbmF0ZXMgPSB0aGlzLmdldFRyaWFuZ2xlQ29vcmRpbmF0ZXMoaXNPdmVyU3ViTmF2aWdhdGlvbiA/ICdmaWxsLWdhcCcgOiAnc2FmZS10cmlhbmdsZScpO1xuICAgIGlmICghY29vcmRpbmF0ZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCctLWRiLW5hdmlnYXRpb24taXRlbS1jbGlwLXBhdGgnLCBgcG9seWdvbigke2Nvb3JkaW5hdGVzLmxifSwgJHtjb29yZGluYXRlcy5sdH0sICR7Y29vcmRpbmF0ZXMucnR9LCAke2Nvb3JkaW5hdGVzLnJifSlgKTtcbiAgICBpZiAoaXNPdmVyU3ViTmF2aWdhdGlvbikge1xuICAgICAgdGhpcy50cmlhbmdsZURhdGEgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG59XG5leHBvcnQgZGVmYXVsdCB7XG4gIGlzRXZlbnRUYXJnZXROYXZpZ2F0aW9uSXRlbSxcbiAgTmF2aWdhdGlvbkl0ZW1TYWZlVHJpYW5nbGVcbn0iXX0=