@aquera/nile-elements 1.4.8-beta-1.0 → 1.4.8-beta-1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/README.md +4 -0
  2. package/demo/index.html +133 -33
  3. package/dist/index.cjs.js +1 -1
  4. package/dist/index.esm.js +1 -1
  5. package/dist/index.js +98 -71
  6. package/dist/nile-file-preview/nile-file-preview.css.cjs.js +1 -1
  7. package/dist/nile-file-preview/nile-file-preview.css.cjs.js.map +1 -1
  8. package/dist/nile-file-preview/nile-file-preview.css.esm.js +7 -3
  9. package/dist/nile-file-preview/nile-file-preview.template.cjs.js +1 -1
  10. package/dist/nile-file-preview/nile-file-preview.template.cjs.js.map +1 -1
  11. package/dist/nile-file-preview/nile-file-preview.template.esm.js +73 -64
  12. package/dist/nile-lite-tooltip/nile-lite-tooltip.cjs.js +1 -1
  13. package/dist/nile-lite-tooltip/nile-lite-tooltip.cjs.js.map +1 -1
  14. package/dist/nile-lite-tooltip/nile-lite-tooltip.esm.js +1 -1
  15. package/dist/nile-option/nile-option.cjs.js +1 -1
  16. package/dist/nile-option/nile-option.cjs.js.map +1 -1
  17. package/dist/nile-option/nile-option.css.cjs.js +1 -1
  18. package/dist/nile-option/nile-option.css.cjs.js.map +1 -1
  19. package/dist/nile-option/nile-option.css.esm.js +10 -0
  20. package/dist/nile-option/nile-option.esm.js +10 -7
  21. package/dist/nile-side-bar-action/index.cjs.js +1 -1
  22. package/dist/nile-side-bar-action/index.esm.js +1 -1
  23. package/dist/nile-side-bar-action/nile-side-bar-action.cjs.js +1 -1
  24. package/dist/nile-side-bar-action/nile-side-bar-action.cjs.js.map +1 -1
  25. package/dist/nile-side-bar-action/nile-side-bar-action.esm.js +4 -3
  26. package/dist/nile-side-bar-action/portal-manager.cjs.js +2 -0
  27. package/dist/nile-side-bar-action/portal-manager.cjs.js.map +1 -0
  28. package/dist/nile-side-bar-action/portal-manager.esm.js +1 -0
  29. package/dist/nile-side-bar-action/portal-utils.cjs.js +2 -0
  30. package/dist/nile-side-bar-action/portal-utils.cjs.js.map +1 -0
  31. package/dist/nile-side-bar-action/portal-utils.esm.js +1 -0
  32. package/dist/src/nile-file-preview/nile-file-preview.css.js +7 -3
  33. package/dist/src/nile-file-preview/nile-file-preview.css.js.map +1 -1
  34. package/dist/src/nile-file-preview/nile-file-preview.template.js +46 -37
  35. package/dist/src/nile-file-preview/nile-file-preview.template.js.map +1 -1
  36. package/dist/src/nile-lite-tooltip/nile-lite-tooltip.d.ts +2 -0
  37. package/dist/src/nile-lite-tooltip/nile-lite-tooltip.js +15 -0
  38. package/dist/src/nile-lite-tooltip/nile-lite-tooltip.js.map +1 -1
  39. package/dist/src/nile-option/nile-option.css.js +10 -0
  40. package/dist/src/nile-option/nile-option.css.js.map +1 -1
  41. package/dist/src/nile-option/nile-option.d.ts +1 -0
  42. package/dist/src/nile-option/nile-option.js +13 -5
  43. package/dist/src/nile-option/nile-option.js.map +1 -1
  44. package/dist/src/nile-side-bar-action/nile-side-bar-action.d.ts +8 -1
  45. package/dist/src/nile-side-bar-action/nile-side-bar-action.js +66 -12
  46. package/dist/src/nile-side-bar-action/nile-side-bar-action.js.map +1 -1
  47. package/dist/src/nile-side-bar-action/portal-manager.d.ts +43 -0
  48. package/dist/src/nile-side-bar-action/portal-manager.js +374 -0
  49. package/dist/src/nile-side-bar-action/portal-manager.js.map +1 -0
  50. package/dist/src/nile-side-bar-action/portal-utils.d.ts +32 -0
  51. package/dist/src/nile-side-bar-action/portal-utils.js +212 -0
  52. package/dist/src/nile-side-bar-action/portal-utils.js.map +1 -0
  53. package/dist/src/version.js +1 -1
  54. package/dist/src/version.js.map +1 -1
  55. package/dist/tsconfig.tsbuildinfo +1 -1
  56. package/package.json +1 -1
  57. package/src/nile-file-preview/nile-file-preview.css.ts +7 -3
  58. package/src/nile-file-preview/nile-file-preview.template.ts +46 -37
  59. package/src/nile-lite-tooltip/nile-lite-tooltip.ts +15 -0
  60. package/src/nile-option/nile-option.css.ts +10 -0
  61. package/src/nile-option/nile-option.ts +11 -5
  62. package/src/nile-side-bar-action/nile-side-bar-action.ts +74 -15
  63. package/src/nile-side-bar-action/portal-manager.ts +489 -0
  64. package/src/nile-side-bar-action/portal-utils.ts +270 -0
  65. package/vscode-html-custom-data.json +22 -3
@@ -0,0 +1,212 @@
1
+ export class PortalUtils {
2
+ static calculateAvailableSpace(referenceElement) {
3
+ const rect = referenceElement.getBoundingClientRect();
4
+ const viewportHeight = window.innerHeight;
5
+ const viewportWidth = window.innerWidth;
6
+ const spaceBelow = viewportHeight - rect.bottom;
7
+ const spaceAbove = rect.top;
8
+ const spaceRight = viewportWidth - rect.right;
9
+ const spaceLeft = rect.left;
10
+ return { spaceAbove, spaceBelow, spaceLeft, spaceRight, viewportHeight, viewportWidth };
11
+ }
12
+ static getOptimalPlacement(referenceElement) {
13
+ const { spaceAbove, spaceBelow, spaceLeft, spaceRight } = this.calculateAvailableSpace(referenceElement);
14
+ if (spaceBelow >= 200 && spaceBelow >= spaceAbove) {
15
+ return 'bottom';
16
+ }
17
+ else if (spaceAbove >= 200 && spaceAbove > spaceBelow) {
18
+ return 'top';
19
+ }
20
+ if (spaceRight >= 200 && spaceRight >= spaceLeft) {
21
+ return 'right';
22
+ }
23
+ else if (spaceLeft >= 200) {
24
+ return 'left';
25
+ }
26
+ return 'bottom';
27
+ }
28
+ static findBoundaryElements(component) {
29
+ const boundaryElements = [];
30
+ let currentElement = component.parentElement;
31
+ while (currentElement && currentElement !== document.body) {
32
+ const computedStyle = window.getComputedStyle(currentElement);
33
+ const overflow = computedStyle.overflow;
34
+ const overflowY = computedStyle.overflowY;
35
+ const overflowX = computedStyle.overflowX;
36
+ if (overflow === 'auto' || overflow === 'scroll' ||
37
+ overflowY === 'auto' || overflowY === 'scroll' ||
38
+ overflowX === 'auto' || overflowX === 'scroll') {
39
+ boundaryElements.push(currentElement);
40
+ }
41
+ if (currentElement.hasAttribute('data-floating-boundary') ||
42
+ currentElement.classList.contains('floating-boundary') ||
43
+ currentElement.classList.contains('scroll-container')) {
44
+ boundaryElements.push(currentElement);
45
+ }
46
+ currentElement = currentElement.parentElement;
47
+ }
48
+ return boundaryElements.length > 0 ? boundaryElements : undefined;
49
+ }
50
+ static calculateOptimalHeight(referenceRect, viewportHeight, placement) {
51
+ const spaceBelow = viewportHeight - (referenceRect.y + referenceRect.height);
52
+ const spaceAbove = referenceRect.y;
53
+ if (placement.startsWith('top')) {
54
+ return Math.max(spaceAbove - 20, 100);
55
+ }
56
+ else if (placement.startsWith('bottom')) {
57
+ return Math.max(spaceBelow - 20, 100);
58
+ }
59
+ else if (placement.startsWith('left') || placement.startsWith('right')) {
60
+ return Math.max(Math.min(spaceAbove, spaceBelow) - 20, 100);
61
+ }
62
+ return Math.max(Math.min(spaceAbove, spaceBelow) - 20, 100);
63
+ }
64
+ static extractStylesAsCSS(styles) {
65
+ if (typeof styles === 'string') {
66
+ return styles;
67
+ }
68
+ if (Array.isArray(styles)) {
69
+ return styles.map(style => this.extractStylesAsCSS(style)).join('\n');
70
+ }
71
+ if (styles && typeof styles === 'object' && styles.cssText) {
72
+ return styles.cssText;
73
+ }
74
+ return '';
75
+ }
76
+ static generateStyleId() {
77
+ return `nile-dropdown-styles-${Math.random().toString(36).substring(2, 11)}`;
78
+ }
79
+ static isPositioningOptimal(placement, referenceElement) {
80
+ const { spaceAbove, spaceBelow, spaceLeft, spaceRight } = this.calculateAvailableSpace(referenceElement);
81
+ const isAbove = placement.startsWith('top');
82
+ const isBelow = placement.startsWith('bottom');
83
+ const isLeft = placement.startsWith('left');
84
+ const isRight = placement.startsWith('right');
85
+ if (isAbove && spaceBelow > spaceAbove)
86
+ return false;
87
+ if (isBelow && spaceAbove > spaceBelow)
88
+ return false;
89
+ if (isLeft && spaceRight > spaceLeft)
90
+ return false;
91
+ if (isRight && spaceLeft > spaceRight)
92
+ return false;
93
+ return true;
94
+ }
95
+ static applyCollisionData(element, middlewareData, placement) {
96
+ if (middlewareData.flip) {
97
+ const { overflows } = middlewareData.flip;
98
+ element.setAttribute('data-placement', placement);
99
+ if (overflows && overflows.length > 0) {
100
+ const overflowPlacements = overflows.map(overflow => overflow.placement).join(',');
101
+ element.setAttribute('data-overflow', overflowPlacements);
102
+ }
103
+ else {
104
+ element.removeAttribute('data-overflow');
105
+ }
106
+ }
107
+ if (middlewareData.shift) {
108
+ const { x, y } = middlewareData.shift;
109
+ if (x !== undefined && y !== undefined && (x !== 0 || y !== 0)) {
110
+ element.setAttribute('data-shift', `${x},${y}`);
111
+ }
112
+ else {
113
+ element.removeAttribute('data-shift');
114
+ }
115
+ }
116
+ if (middlewareData.size) {
117
+ const { availableWidth, availableHeight } = middlewareData.size;
118
+ if (availableWidth !== undefined) {
119
+ element.setAttribute('data-available-width', availableWidth.toString());
120
+ }
121
+ if (availableHeight !== undefined) {
122
+ element.setAttribute('data-available-height', availableHeight.toString());
123
+ }
124
+ }
125
+ }
126
+ }
127
+ export class PortalContentUtils {
128
+ static createPortalPanel(component) {
129
+ // Find the panel slot content (typically a nile-menu)
130
+ const panelSlot = component.shadowRoot?.querySelector('.dropdown__panel');
131
+ if (!panelSlot) {
132
+ // Fallback: try to find in light DOM
133
+ const slot = component.querySelector('[slot]');
134
+ if (!slot || slot.getAttribute('slot') === 'trigger') {
135
+ return document.createElement('div');
136
+ }
137
+ }
138
+ // Get assigned elements from the slot
139
+ let assignedElements = panelSlot?.assignedElements({ flatten: true }) || [];
140
+ // If no assigned elements, try direct children that aren't in trigger slot
141
+ if (assignedElements.length === 0) {
142
+ const children = Array.from(component.children);
143
+ assignedElements = children.filter(child => {
144
+ const slot = child.getAttribute('slot');
145
+ return !slot || slot !== 'trigger';
146
+ });
147
+ }
148
+ // Create a container for the cloned panel
149
+ const panelContainer = document.createElement('div');
150
+ panelContainer.className = 'dropdown__panel';
151
+ panelContainer.setAttribute('part', 'panel');
152
+ panelContainer.setAttribute('aria-hidden', 'false');
153
+ panelContainer.setAttribute('aria-labelledby', 'dropdown');
154
+ // Clone all assigned elements
155
+ assignedElements.forEach((element) => {
156
+ const clonedElement = element.cloneNode(true);
157
+ panelContainer.appendChild(clonedElement);
158
+ });
159
+ return panelContainer;
160
+ }
161
+ static updatePortalPanel(clonedPanel, component) {
162
+ if (!clonedPanel)
163
+ return;
164
+ // Clear existing content
165
+ clonedPanel.innerHTML = '';
166
+ // Re-clone the panel content
167
+ const panelSlot = component.shadowRoot?.querySelector('.dropdown__panel');
168
+ let assignedElements = panelSlot?.assignedElements({ flatten: true }) || [];
169
+ if (assignedElements.length === 0) {
170
+ const children = Array.from(component.children);
171
+ assignedElements = children.filter(child => {
172
+ const slot = child.getAttribute('slot');
173
+ return !slot || slot !== 'trigger';
174
+ });
175
+ }
176
+ assignedElements.forEach((element) => {
177
+ const clonedElement = element.cloneNode(true);
178
+ clonedPanel.appendChild(clonedElement);
179
+ });
180
+ }
181
+ }
182
+ export class PortalEventUtils {
183
+ static setupPortalEventListeners(clonedPanel, component) {
184
+ if (!clonedPanel)
185
+ return;
186
+ this.setupMenuSelectListeners(clonedPanel, component);
187
+ this.setupKeyDownListeners(clonedPanel, component);
188
+ }
189
+ static setupMenuSelectListeners(clonedPanel, component) {
190
+ if (!clonedPanel)
191
+ return;
192
+ // Listen for nile-select events from menu items
193
+ clonedPanel.addEventListener('nile-select', (event) => {
194
+ const customEvent = event;
195
+ // Forward the event to the original component
196
+ if (component.handlePanelSelect) {
197
+ component.handlePanelSelect(customEvent);
198
+ }
199
+ });
200
+ }
201
+ static setupKeyDownListeners(clonedPanel, component) {
202
+ if (!clonedPanel)
203
+ return;
204
+ // Listen for keydown events (like Escape)
205
+ clonedPanel.addEventListener('keydown', (event) => {
206
+ if (component.handleKeyDown) {
207
+ component.handleKeyDown(event);
208
+ }
209
+ });
210
+ }
211
+ }
212
+ //# sourceMappingURL=portal-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portal-utils.js","sourceRoot":"","sources":["../../../src/nile-side-bar-action/portal-utils.ts"],"names":[],"mappings":"AAKE,MAAM,OAAO,WAAW;IACtB,MAAM,CAAC,uBAAuB,CAAC,gBAA6B;QAQ1D,MAAM,IAAI,GAAG,gBAAgB,CAAC,qBAAqB,EAAE,CAAC;QACtD,MAAM,cAAc,GAAG,MAAM,CAAC,WAAW,CAAC;QAC1C,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,CAAC;QACxC,MAAM,UAAU,GAAG,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;QAChD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC;QAC5B,MAAM,UAAU,GAAG,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC;QAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC;QAE5B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC;IAC1F,CAAC;IAED,MAAM,CAAC,mBAAmB,CAAC,gBAA6B;QACtD,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;QAEzG,IAAI,UAAU,IAAI,GAAG,IAAI,UAAU,IAAI,UAAU,EAAE,CAAC;YAClD,OAAO,QAAQ,CAAC;QAClB,CAAC;aAAM,IAAI,UAAU,IAAI,GAAG,IAAI,UAAU,GAAG,UAAU,EAAE,CAAC;YACxD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,UAAU,IAAI,GAAG,IAAI,UAAU,IAAI,SAAS,EAAE,CAAC;YACjD,OAAO,OAAO,CAAC;QACjB,CAAC;aAAM,IAAI,SAAS,IAAI,GAAG,EAAE,CAAC;YAC5B,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,oBAAoB,CAAC,SAAsB;QAChD,MAAM,gBAAgB,GAAc,EAAE,CAAC;QAEvC,IAAI,cAAc,GAAG,SAAS,CAAC,aAAa,CAAC;QAE7C,OAAO,cAAc,IAAI,cAAc,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC1D,MAAM,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;YAC9D,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC;YACxC,MAAM,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC;YAC1C,MAAM,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC;YAE1C,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,QAAQ;gBAC5C,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,QAAQ;gBAC9C,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;gBACnD,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACxC,CAAC;YAED,IAAI,cAAc,CAAC,YAAY,CAAC,wBAAwB,CAAC;gBACrD,cAAc,CAAC,SAAS,CAAC,QAAQ,CAAC,mBAAmB,CAAC;gBACtD,cAAc,CAAC,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBAC1D,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACxC,CAAC;YAED,cAAc,GAAG,cAAc,CAAC,aAAa,CAAC;QAChD,CAAC;QAED,OAAO,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC;IACpE,CAAC;IAED,MAAM,CAAC,sBAAsB,CAC3B,aAAsE,EACtE,cAAsB,EACtB,SAAoB;QAEpB,MAAM,UAAU,GAAG,cAAc,GAAG,CAAC,aAAa,CAAC,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QAC7E,MAAM,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC;QAEnC,IAAI,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;QACxC,CAAC;aAAM,IAAI,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;QACxC,CAAC;aAAM,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACzE,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,CAAC,kBAAkB,CAAC,MAAW;QACnC,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxE,CAAC;QAED,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAC3D,OAAO,MAAM,CAAC,OAAO,CAAC;QACxB,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,CAAC,eAAe;QACpB,OAAO,wBAAwB,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IAC/E,CAAC;IAED,MAAM,CAAC,oBAAoB,CACzB,SAAoB,EACpB,gBAA6B;QAE7B,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;QAEzG,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAE9C,IAAI,OAAO,IAAI,UAAU,GAAG,UAAU;YAAE,OAAO,KAAK,CAAC;QACrD,IAAI,OAAO,IAAI,UAAU,GAAG,UAAU;YAAE,OAAO,KAAK,CAAC;QACrD,IAAI,MAAM,IAAI,UAAU,GAAG,SAAS;YAAE,OAAO,KAAK,CAAC;QACnD,IAAI,OAAO,IAAI,SAAS,GAAG,UAAU;YAAE,OAAO,KAAK,CAAC;QAEpD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,kBAAkB,CACvB,OAAoB,EACpB,cAA8B,EAC9B,SAAoB;QAEpB,IAAI,cAAc,CAAC,IAAI,EAAE,CAAC;YACxB,MAAM,EAAE,SAAS,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC;YAE1C,OAAO,CAAC,YAAY,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;YAElD,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtC,MAAM,kBAAkB,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACnF,OAAO,CAAC,YAAY,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;YAC5D,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,IAAI,cAAc,CAAC,KAAK,EAAE,CAAC;YACzB,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC;YAEtC,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBAC/D,OAAO,CAAC,YAAY,CAAC,YAAY,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QAED,IAAI,cAAc,CAAC,IAAI,EAAE,CAAC;YACxB,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC;YAEhE,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;gBACjC,OAAO,CAAC,YAAY,CAAC,sBAAsB,EAAE,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC1E,CAAC;YACD,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;gBAClC,OAAO,CAAC,YAAY,CAAC,uBAAuB,EAAE,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED,MAAM,OAAO,kBAAkB;IAC7B,MAAM,CAAC,iBAAiB,CAAC,SAAc;QACrC,sDAAsD;QACtD,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU,EAAE,aAAa,CAAC,kBAAkB,CAAoB,CAAC;QAC7F,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,qCAAqC;YACrC,MAAM,IAAI,GAAG,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAC/C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,SAAS,EAAE,CAAC;gBACrD,OAAO,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QAED,sCAAsC;QACtC,IAAI,gBAAgB,GAAc,SAAS,EAAE,gBAAgB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAc,IAAI,EAAE,CAAC;QAEpG,2EAA2E;QAC3E,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAc,CAAC;YAC7D,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;gBACzC,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;gBACxC,OAAO,CAAC,IAAI,IAAI,IAAI,KAAK,SAAS,CAAC;YACrC,CAAC,CAAC,CAAC;QACL,CAAC;QAED,0CAA0C;QAC1C,MAAM,cAAc,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACrD,cAAc,CAAC,SAAS,GAAG,iBAAiB,CAAC;QAC7C,cAAc,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7C,cAAc,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACpD,cAAc,CAAC,YAAY,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;QAE3D,8BAA8B;QAC9B,gBAAgB,CAAC,OAAO,CAAC,CAAC,OAAgB,EAAE,EAAE;YAC5C,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAgB,CAAC;YAC7D,cAAc,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,MAAM,CAAC,iBAAiB,CAAC,WAAwB,EAAE,SAAc;QAC/D,IAAI,CAAC,WAAW;YAAE,OAAO;QAEzB,yBAAyB;QACzB,WAAW,CAAC,SAAS,GAAG,EAAE,CAAC;QAE3B,6BAA6B;QAC7B,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU,EAAE,aAAa,CAAC,kBAAkB,CAAoB,CAAC;QAC7F,IAAI,gBAAgB,GAAc,SAAS,EAAE,gBAAgB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAc,IAAI,EAAE,CAAC;QAEpG,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAc,CAAC;YAC7D,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;gBACzC,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;gBACxC,OAAO,CAAC,IAAI,IAAI,IAAI,KAAK,SAAS,CAAC;YACrC,CAAC,CAAC,CAAC;QACL,CAAC;QAED,gBAAgB,CAAC,OAAO,CAAC,CAAC,OAAgB,EAAE,EAAE;YAC5C,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAgB,CAAC;YAC7D,WAAW,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED,MAAM,OAAO,gBAAgB;IAC3B,MAAM,CAAC,yBAAyB,CAAC,WAAwB,EAAE,SAAc;QACvE,IAAI,CAAC,WAAW;YAAE,OAAO;QAEzB,IAAI,CAAC,wBAAwB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACtD,IAAI,CAAC,qBAAqB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,CAAC,wBAAwB,CAAC,WAAwB,EAAE,SAAc;QACtE,IAAI,CAAC,WAAW;YAAE,OAAO;QAEzB,gDAAgD;QAChD,WAAW,CAAC,gBAAgB,CAAC,aAAa,EAAE,CAAC,KAAY,EAAE,EAAE;YAC3D,MAAM,WAAW,GAAG,KAAoB,CAAC;YACzC,8CAA8C;YAC9C,IAAI,SAAS,CAAC,iBAAiB,EAAE,CAAC;gBAChC,SAAS,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,qBAAqB,CAAC,WAAwB,EAAE,SAAc;QACnE,IAAI,CAAC,WAAW;YAAE,OAAO;QAEzB,0CAA0C;QAC1C,WAAW,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAoB,EAAE,EAAE;YAC/D,IAAI,SAAS,CAAC,aAAa,EAAE,CAAC;gBAC5B,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YACjC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["import { \n type Placement,\n type MiddlewareData\n } from '@floating-ui/dom';\n \n export class PortalUtils {\n static calculateAvailableSpace(referenceElement: HTMLElement): {\n spaceAbove: number;\n spaceBelow: number;\n spaceLeft: number;\n spaceRight: number;\n viewportHeight: number;\n viewportWidth: number;\n } {\n const rect = referenceElement.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const viewportWidth = window.innerWidth;\n const spaceBelow = viewportHeight - rect.bottom;\n const spaceAbove = rect.top;\n const spaceRight = viewportWidth - rect.right;\n const spaceLeft = rect.left;\n \n return { spaceAbove, spaceBelow, spaceLeft, spaceRight, viewportHeight, viewportWidth };\n }\n \n static getOptimalPlacement(referenceElement: HTMLElement): Placement {\n const { spaceAbove, spaceBelow, spaceLeft, spaceRight } = this.calculateAvailableSpace(referenceElement);\n \n if (spaceBelow >= 200 && spaceBelow >= spaceAbove) {\n return 'bottom';\n } else if (spaceAbove >= 200 && spaceAbove > spaceBelow) {\n return 'top';\n }\n \n if (spaceRight >= 200 && spaceRight >= spaceLeft) {\n return 'right';\n } else if (spaceLeft >= 200) {\n return 'left';\n }\n \n return 'bottom';\n }\n \n static findBoundaryElements(component: HTMLElement): Element[] | undefined {\n const boundaryElements: Element[] = [];\n \n let currentElement = component.parentElement;\n \n while (currentElement && currentElement !== document.body) {\n const computedStyle = window.getComputedStyle(currentElement);\n const overflow = computedStyle.overflow;\n const overflowY = computedStyle.overflowY;\n const overflowX = computedStyle.overflowX;\n \n if (overflow === 'auto' || overflow === 'scroll' || \n overflowY === 'auto' || overflowY === 'scroll' ||\n overflowX === 'auto' || overflowX === 'scroll') {\n boundaryElements.push(currentElement);\n }\n \n if (currentElement.hasAttribute('data-floating-boundary') ||\n currentElement.classList.contains('floating-boundary') ||\n currentElement.classList.contains('scroll-container')) {\n boundaryElements.push(currentElement);\n }\n \n currentElement = currentElement.parentElement;\n }\n \n return boundaryElements.length > 0 ? boundaryElements : undefined;\n }\n \n static calculateOptimalHeight(\n referenceRect: { x: number; y: number; width: number; height: number },\n viewportHeight: number,\n placement: Placement\n ): number {\n const spaceBelow = viewportHeight - (referenceRect.y + referenceRect.height);\n const spaceAbove = referenceRect.y;\n \n if (placement.startsWith('top')) {\n return Math.max(spaceAbove - 20, 100);\n } else if (placement.startsWith('bottom')) {\n return Math.max(spaceBelow - 20, 100);\n } else if (placement.startsWith('left') || placement.startsWith('right')) {\n return Math.max(Math.min(spaceAbove, spaceBelow) - 20, 100);\n }\n \n return Math.max(Math.min(spaceAbove, spaceBelow) - 20, 100);\n }\n \n static extractStylesAsCSS(styles: any): string {\n if (typeof styles === 'string') {\n return styles;\n }\n \n if (Array.isArray(styles)) {\n return styles.map(style => this.extractStylesAsCSS(style)).join('\\n');\n }\n \n if (styles && typeof styles === 'object' && styles.cssText) {\n return styles.cssText;\n }\n \n return '';\n }\n \n static generateStyleId(): string {\n return `nile-dropdown-styles-${Math.random().toString(36).substring(2, 11)}`;\n }\n \n static isPositioningOptimal(\n placement: Placement,\n referenceElement: HTMLElement\n ): boolean {\n const { spaceAbove, spaceBelow, spaceLeft, spaceRight } = this.calculateAvailableSpace(referenceElement);\n \n const isAbove = placement.startsWith('top');\n const isBelow = placement.startsWith('bottom');\n const isLeft = placement.startsWith('left');\n const isRight = placement.startsWith('right');\n \n if (isAbove && spaceBelow > spaceAbove) return false;\n if (isBelow && spaceAbove > spaceBelow) return false;\n if (isLeft && spaceRight > spaceLeft) return false;\n if (isRight && spaceLeft > spaceRight) return false;\n \n return true;\n }\n \n static applyCollisionData(\n element: HTMLElement,\n middlewareData: MiddlewareData,\n placement: Placement\n ): void {\n if (middlewareData.flip) {\n const { overflows } = middlewareData.flip;\n \n element.setAttribute('data-placement', placement);\n \n if (overflows && overflows.length > 0) {\n const overflowPlacements = overflows.map(overflow => overflow.placement).join(',');\n element.setAttribute('data-overflow', overflowPlacements);\n } else {\n element.removeAttribute('data-overflow');\n }\n }\n \n if (middlewareData.shift) {\n const { x, y } = middlewareData.shift;\n \n if (x !== undefined && y !== undefined && (x !== 0 || y !== 0)) {\n element.setAttribute('data-shift', `${x},${y}`);\n } else {\n element.removeAttribute('data-shift');\n }\n }\n \n if (middlewareData.size) {\n const { availableWidth, availableHeight } = middlewareData.size;\n \n if (availableWidth !== undefined) {\n element.setAttribute('data-available-width', availableWidth.toString());\n }\n if (availableHeight !== undefined) {\n element.setAttribute('data-available-height', availableHeight.toString());\n }\n }\n }\n }\n \n export class PortalContentUtils {\n static createPortalPanel(component: any): HTMLElement {\n // Find the panel slot content (typically a nile-menu)\n const panelSlot = component.shadowRoot?.querySelector('.dropdown__panel') as HTMLSlotElement;\n if (!panelSlot) {\n // Fallback: try to find in light DOM\n const slot = component.querySelector('[slot]');\n if (!slot || slot.getAttribute('slot') === 'trigger') {\n return document.createElement('div');\n }\n }\n \n // Get assigned elements from the slot\n let assignedElements: Element[] = panelSlot?.assignedElements({ flatten: true }) as Element[] || [];\n \n // If no assigned elements, try direct children that aren't in trigger slot\n if (assignedElements.length === 0) {\n const children = Array.from(component.children) as Element[];\n assignedElements = children.filter(child => {\n const slot = child.getAttribute('slot');\n return !slot || slot !== 'trigger';\n });\n }\n \n // Create a container for the cloned panel\n const panelContainer = document.createElement('div');\n panelContainer.className = 'dropdown__panel';\n panelContainer.setAttribute('part', 'panel');\n panelContainer.setAttribute('aria-hidden', 'false');\n panelContainer.setAttribute('aria-labelledby', 'dropdown');\n \n // Clone all assigned elements\n assignedElements.forEach((element: Element) => {\n const clonedElement = element.cloneNode(true) as HTMLElement;\n panelContainer.appendChild(clonedElement);\n });\n \n return panelContainer;\n }\n \n static updatePortalPanel(clonedPanel: HTMLElement, component: any): void {\n if (!clonedPanel) return;\n \n // Clear existing content\n clonedPanel.innerHTML = '';\n \n // Re-clone the panel content\n const panelSlot = component.shadowRoot?.querySelector('.dropdown__panel') as HTMLSlotElement;\n let assignedElements: Element[] = panelSlot?.assignedElements({ flatten: true }) as Element[] || [];\n \n if (assignedElements.length === 0) {\n const children = Array.from(component.children) as Element[];\n assignedElements = children.filter(child => {\n const slot = child.getAttribute('slot');\n return !slot || slot !== 'trigger';\n });\n }\n \n assignedElements.forEach((element: Element) => {\n const clonedElement = element.cloneNode(true) as HTMLElement;\n clonedPanel.appendChild(clonedElement);\n });\n }\n }\n \n export class PortalEventUtils {\n static setupPortalEventListeners(clonedPanel: HTMLElement, component: any): void {\n if (!clonedPanel) return;\n \n this.setupMenuSelectListeners(clonedPanel, component);\n this.setupKeyDownListeners(clonedPanel, component);\n }\n \n static setupMenuSelectListeners(clonedPanel: HTMLElement, component: any): void {\n if (!clonedPanel) return;\n \n // Listen for nile-select events from menu items\n clonedPanel.addEventListener('nile-select', (event: Event) => {\n const customEvent = event as CustomEvent;\n // Forward the event to the original component\n if (component.handlePanelSelect) {\n component.handlePanelSelect(customEvent);\n }\n });\n }\n \n static setupKeyDownListeners(clonedPanel: HTMLElement, component: any): void {\n if (!clonedPanel) return;\n \n // Listen for keydown events (like Escape)\n clonedPanel.addEventListener('keydown', (event: KeyboardEvent) => {\n if (component.handleKeyDown) {\n component.handleKeyDown(event);\n }\n });\n }\n }\n \n "]}
@@ -1,5 +1,5 @@
1
1
  // Version utility - placeholders will be replaced during build
2
- export const NILE_ELEMENTS_VERSION = '1.4.8-beta-1.0';
2
+ export const NILE_ELEMENTS_VERSION = '1.4.8-beta-1.2';
3
3
  export const NILE_VERSION = '1.1.7';
4
4
  // Set global versions for runtime access
5
5
  if (typeof window !== 'undefined') {
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,MAAM,CAAC,MAAM,qBAAqB,GAAG,2BAA2B,CAAC;AACjE,MAAM,CAAC,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAE/C,yCAAyC;AACzC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;IACjC,MAAc,CAAC,mBAAmB,GAAG,qBAAqB,CAAC;IAC3D,MAAc,CAAC,WAAW,GAAG,YAAY,CAAC;IAC3C,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,CAAC;AACzE,CAAC","sourcesContent":["// Version utility - placeholders will be replaced during build\nexport const NILE_ELEMENTS_VERSION = '1.4.8-beta-1.0';\nexport const NILE_VERSION = '1.1.7';\n\n// Set global versions for runtime access\nif (typeof window !== 'undefined') {\n (window as any).nileElementsVersion = NILE_ELEMENTS_VERSION;\n (window as any).nileVersion = NILE_VERSION;\n window.process = window.process || { env: { NODE_ENV: 'production' } };\n}\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,MAAM,CAAC,MAAM,qBAAqB,GAAG,2BAA2B,CAAC;AACjE,MAAM,CAAC,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAE/C,yCAAyC;AACzC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;IACjC,MAAc,CAAC,mBAAmB,GAAG,qBAAqB,CAAC;IAC3D,MAAc,CAAC,WAAW,GAAG,YAAY,CAAC;IAC3C,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,CAAC;AACzE,CAAC","sourcesContent":["// Version utility - placeholders will be replaced during build\nexport const NILE_ELEMENTS_VERSION = '1.4.8-beta-1.2';\nexport const NILE_VERSION = '1.1.7';\n\n// Set global versions for runtime access\nif (typeof window !== 'undefined') {\n (window as any).nileElementsVersion = NILE_ELEMENTS_VERSION;\n (window as any).nileVersion = NILE_VERSION;\n window.process = window.process || { env: { NODE_ENV: 'production' } };\n}\n"]}