@ship-ui/core 0.19.5 → 0.22.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 (153) hide show
  1. package/README.md +3 -0
  2. package/assets/mcp/components.json +66 -4243
  3. package/bin/mcp/index.js +6027 -273
  4. package/bin/ship-fg-scanner +0 -0
  5. package/bin/ship-fg.mjs +14 -12
  6. package/bin/src/subset.ts +3 -1
  7. package/fesm2022/ship-ui-core-sh-form-field-experimental.mjs +42 -0
  8. package/fesm2022/ship-ui-core-sh-form-field-experimental.mjs.map +1 -0
  9. package/fesm2022/ship-ui-core-ship-accordion.mjs +127 -0
  10. package/fesm2022/ship-ui-core-ship-accordion.mjs.map +1 -0
  11. package/fesm2022/ship-ui-core-ship-alert.mjs +305 -0
  12. package/fesm2022/ship-ui-core-ship-alert.mjs.map +1 -0
  13. package/fesm2022/ship-ui-core-ship-blueprint.mjs +1156 -0
  14. package/fesm2022/ship-ui-core-ship-blueprint.mjs.map +1 -0
  15. package/fesm2022/ship-ui-core-ship-button-group.mjs +41 -0
  16. package/fesm2022/ship-ui-core-ship-button-group.mjs.map +1 -0
  17. package/fesm2022/ship-ui-core-ship-button.mjs +38 -0
  18. package/fesm2022/ship-ui-core-ship-button.mjs.map +1 -0
  19. package/fesm2022/ship-ui-core-ship-card.mjs +35 -0
  20. package/fesm2022/ship-ui-core-ship-card.mjs.map +1 -0
  21. package/fesm2022/ship-ui-core-ship-checkbox.mjs +113 -0
  22. package/fesm2022/ship-ui-core-ship-checkbox.mjs.map +1 -0
  23. package/fesm2022/ship-ui-core-ship-chip.mjs +44 -0
  24. package/fesm2022/ship-ui-core-ship-chip.mjs.map +1 -0
  25. package/fesm2022/ship-ui-core-ship-color-picker.mjs +947 -0
  26. package/fesm2022/ship-ui-core-ship-color-picker.mjs.map +1 -0
  27. package/fesm2022/ship-ui-core-ship-datepicker.mjs +951 -0
  28. package/fesm2022/ship-ui-core-ship-datepicker.mjs.map +1 -0
  29. package/fesm2022/ship-ui-core-ship-dialog.mjs +263 -0
  30. package/fesm2022/ship-ui-core-ship-dialog.mjs.map +1 -0
  31. package/fesm2022/ship-ui-core-ship-divider.mjs +22 -0
  32. package/fesm2022/ship-ui-core-ship-divider.mjs.map +1 -0
  33. package/fesm2022/ship-ui-core-ship-event-card.mjs +50 -0
  34. package/fesm2022/ship-ui-core-ship-event-card.mjs.map +1 -0
  35. package/fesm2022/ship-ui-core-ship-file-upload.mjs +112 -0
  36. package/fesm2022/ship-ui-core-ship-file-upload.mjs.map +1 -0
  37. package/fesm2022/ship-ui-core-ship-form-field.mjs +310 -0
  38. package/fesm2022/ship-ui-core-ship-form-field.mjs.map +1 -0
  39. package/fesm2022/ship-ui-core-ship-icon.mjs +81 -0
  40. package/fesm2022/ship-ui-core-ship-icon.mjs.map +1 -0
  41. package/fesm2022/ship-ui-core-ship-list.mjs +22 -0
  42. package/fesm2022/ship-ui-core-ship-list.mjs.map +1 -0
  43. package/fesm2022/ship-ui-core-ship-menu.mjs +545 -0
  44. package/fesm2022/ship-ui-core-ship-menu.mjs.map +1 -0
  45. package/fesm2022/ship-ui-core-ship-popover.mjs +286 -0
  46. package/fesm2022/ship-ui-core-ship-popover.mjs.map +1 -0
  47. package/fesm2022/ship-ui-core-ship-progress-bar.mjs +37 -0
  48. package/fesm2022/ship-ui-core-ship-progress-bar.mjs.map +1 -0
  49. package/fesm2022/ship-ui-core-ship-radio.mjs +102 -0
  50. package/fesm2022/ship-ui-core-ship-radio.mjs.map +1 -0
  51. package/fesm2022/ship-ui-core-ship-range-slider.mjs +277 -0
  52. package/fesm2022/ship-ui-core-ship-range-slider.mjs.map +1 -0
  53. package/fesm2022/ship-ui-core-ship-select.mjs +971 -0
  54. package/fesm2022/ship-ui-core-ship-select.mjs.map +1 -0
  55. package/fesm2022/ship-ui-core-ship-sidenav.mjs +248 -0
  56. package/fesm2022/ship-ui-core-ship-sidenav.mjs.map +1 -0
  57. package/fesm2022/ship-ui-core-ship-sortable.mjs +485 -0
  58. package/fesm2022/ship-ui-core-ship-sortable.mjs.map +1 -0
  59. package/fesm2022/ship-ui-core-ship-spinner.mjs +28 -0
  60. package/fesm2022/ship-ui-core-ship-spinner.mjs.map +1 -0
  61. package/fesm2022/ship-ui-core-ship-stepper.mjs +76 -0
  62. package/fesm2022/ship-ui-core-ship-stepper.mjs.map +1 -0
  63. package/fesm2022/ship-ui-core-ship-table-filter-bar.mjs +28 -0
  64. package/fesm2022/ship-ui-core-ship-table-filter-bar.mjs.map +1 -0
  65. package/fesm2022/ship-ui-core-ship-table.mjs +442 -0
  66. package/fesm2022/ship-ui-core-ship-table.mjs.map +1 -0
  67. package/fesm2022/ship-ui-core-ship-tabs.mjs +38 -0
  68. package/fesm2022/ship-ui-core-ship-tabs.mjs.map +1 -0
  69. package/fesm2022/ship-ui-core-ship-theme-toggle.mjs +119 -0
  70. package/fesm2022/ship-ui-core-ship-theme-toggle.mjs.map +1 -0
  71. package/fesm2022/ship-ui-core-ship-toggle-card.mjs +75 -0
  72. package/fesm2022/ship-ui-core-ship-toggle-card.mjs.map +1 -0
  73. package/fesm2022/ship-ui-core-ship-toggle.mjs +105 -0
  74. package/fesm2022/ship-ui-core-ship-toggle.mjs.map +1 -0
  75. package/fesm2022/ship-ui-core-ship-virtual-scroll.mjs +186 -0
  76. package/fesm2022/ship-ui-core-ship-virtual-scroll.mjs.map +1 -0
  77. package/fesm2022/ship-ui-core.mjs +880 -8782
  78. package/fesm2022/ship-ui-core.mjs.map +1 -1
  79. package/package.json +147 -3
  80. package/styles/core.scss +43 -0
  81. package/styles/helpers.scss +2 -0
  82. package/styles/index.scss +12 -123
  83. package/types/ship-ui-core-sh-form-field-experimental.d.ts +11 -0
  84. package/types/ship-ui-core-ship-accordion.d.ts +19 -0
  85. package/types/ship-ui-core-ship-alert.d.ts +68 -0
  86. package/types/ship-ui-core-ship-blueprint.d.ts +112 -0
  87. package/types/ship-ui-core-ship-button-group.d.ts +15 -0
  88. package/types/ship-ui-core-ship-button.d.ts +13 -0
  89. package/types/ship-ui-core-ship-card.d.ts +11 -0
  90. package/types/ship-ui-core-ship-checkbox.d.ts +22 -0
  91. package/types/ship-ui-core-ship-chip.d.ts +15 -0
  92. package/types/ship-ui-core-ship-color-picker.d.ts +105 -0
  93. package/types/ship-ui-core-ship-datepicker.d.ts +96 -0
  94. package/types/ship-ui-core-ship-dialog.d.ts +76 -0
  95. package/types/ship-ui-core-ship-divider.d.ts +8 -0
  96. package/types/ship-ui-core-ship-event-card.d.ts +11 -0
  97. package/types/ship-ui-core-ship-file-upload.d.ts +20 -0
  98. package/types/ship-ui-core-ship-form-field.d.ts +32 -0
  99. package/types/ship-ui-core-ship-icon.d.ts +18 -0
  100. package/types/ship-ui-core-ship-list.d.ts +8 -0
  101. package/types/ship-ui-core-ship-menu.d.ts +49 -0
  102. package/types/ship-ui-core-ship-popover.d.ts +40 -0
  103. package/types/ship-ui-core-ship-progress-bar.d.ts +14 -0
  104. package/types/ship-ui-core-ship-radio.d.ts +22 -0
  105. package/types/ship-ui-core-ship-range-slider.d.ts +31 -0
  106. package/types/ship-ui-core-ship-select.d.ts +81 -0
  107. package/types/ship-ui-core-ship-sidenav.d.ts +36 -0
  108. package/types/ship-ui-core-ship-sortable.d.ts +72 -0
  109. package/types/ship-ui-core-ship-spinner.d.ts +10 -0
  110. package/types/ship-ui-core-ship-stepper.d.ts +13 -0
  111. package/types/ship-ui-core-ship-table-filter-bar.d.ts +8 -0
  112. package/types/ship-ui-core-ship-table.d.ts +69 -0
  113. package/types/ship-ui-core-ship-tabs.d.ts +14 -0
  114. package/types/ship-ui-core-ship-theme-toggle.d.ts +28 -0
  115. package/types/ship-ui-core-ship-toggle-card.d.ts +15 -0
  116. package/types/ship-ui-core-ship-toggle.d.ts +21 -0
  117. package/types/ship-ui-core-ship-virtual-scroll.d.ts +22 -0
  118. package/types/ship-ui-core.d.ts +88 -1070
  119. package/styles/components/ship-accordion.scss +0 -113
  120. package/styles/components/ship-alert-container.scss +0 -49
  121. package/styles/components/ship-alert.scss +0 -177
  122. package/styles/components/ship-blueprint.scss +0 -242
  123. package/styles/components/ship-button-group.scss +0 -165
  124. package/styles/components/ship-button.scss +0 -141
  125. package/styles/components/ship-card.scss +0 -57
  126. package/styles/components/ship-checkbox.scss +0 -116
  127. package/styles/components/ship-chip.scss +0 -104
  128. package/styles/components/ship-color-picker.scss +0 -150
  129. package/styles/components/ship-datepicker.scss +0 -317
  130. package/styles/components/ship-dialog.scss +0 -152
  131. package/styles/components/ship-divider.scss +0 -27
  132. package/styles/components/ship-event-card.scss +0 -51
  133. package/styles/components/ship-file-upload.scss +0 -47
  134. package/styles/components/ship-form-field.scss +0 -408
  135. package/styles/components/ship-icon.scss +0 -54
  136. package/styles/components/ship-list.scss +0 -165
  137. package/styles/components/ship-menu.scss +0 -237
  138. package/styles/components/ship-popover.scss +0 -205
  139. package/styles/components/ship-progress-bar.scss +0 -173
  140. package/styles/components/ship-radio.scss +0 -113
  141. package/styles/components/ship-range-slider.scss +0 -421
  142. package/styles/components/ship-select.scss +0 -153
  143. package/styles/components/ship-sidenav.scss +0 -195
  144. package/styles/components/ship-sortable.scss +0 -45
  145. package/styles/components/ship-spinner.scss +0 -53
  146. package/styles/components/ship-stepper.scss +0 -158
  147. package/styles/components/ship-table.scss +0 -443
  148. package/styles/components/ship-tabs.scss +0 -125
  149. package/styles/components/ship-theme-toggle.scss +0 -41
  150. package/styles/components/ship-toggle-card.scss +0 -69
  151. package/styles/components/ship-toggle.scss +0 -255
  152. package/styles/components/ship-tooltip.scss +0 -151
  153. package/styles/components/ship-virtual-scroll.scss +0 -12
@@ -0,0 +1,545 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, DOCUMENT, Renderer2, computed, input, model, output, signal, viewChild, effect, HostListener, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
3
+ import { ShipFormField } from '@ship-ui/core/ship-form-field';
4
+ import { ShipIcon } from '@ship-ui/core/ship-icon';
5
+ import { ShipPopover } from '@ship-ui/core/ship-popover';
6
+ import { observeChildren, createFormInputSignal, generateUniqueId } from '@ship-ui/core';
7
+
8
+ class ShipMenu {
9
+ constructor() {
10
+ this.#document = inject(DOCUMENT);
11
+ this.#renderer = inject(Renderer2);
12
+ this.parentMenu = inject(ShipMenu, { optional: true, skipSelf: true });
13
+ this.isSubmenu = computed(() => this.parentMenu !== null, /* @ts-ignore */
14
+ ...(ngDevMode ? [{ debugName: "isSubmenu" }] : /* istanbul ignore next */ []));
15
+ this.asMultiLayer = input(false, /* @ts-ignore */
16
+ ...(ngDevMode ? [{ debugName: "asMultiLayer" }] : /* istanbul ignore next */ []));
17
+ this.openIndicator = input(false, /* @ts-ignore */
18
+ ...(ngDevMode ? [{ debugName: "openIndicator" }] : /* istanbul ignore next */ []));
19
+ this.disabled = input(false, /* @ts-ignore */
20
+ ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
21
+ this.customOptionElementSelectors = input(['button'], /* @ts-ignore */
22
+ ...(ngDevMode ? [{ debugName: "customOptionElementSelectors" }] : /* istanbul ignore next */ []));
23
+ this.keepClickedOptionActive = input(false, /* @ts-ignore */
24
+ ...(ngDevMode ? [{ debugName: "keepClickedOptionActive" }] : /* istanbul ignore next */ []));
25
+ this.closeOnClick = input(true, /* @ts-ignore */
26
+ ...(ngDevMode ? [{ debugName: "closeOnClick" }] : /* istanbul ignore next */ []));
27
+ this.isOpen = model(false, /* @ts-ignore */
28
+ ...(ngDevMode ? [{ debugName: "isOpen" }] : /* istanbul ignore next */ []));
29
+ this.closed = output();
30
+ this.searchable = input(false, /* @ts-ignore */
31
+ ...(ngDevMode ? [{ debugName: "searchable" }] : /* istanbul ignore next */ []));
32
+ this.activeOptionIndex = signal(-1, /* @ts-ignore */
33
+ ...(ngDevMode ? [{ debugName: "activeOptionIndex" }] : /* istanbul ignore next */ []));
34
+ this.inputRef = viewChild('inputRef', /* @ts-ignore */
35
+ ...(ngDevMode ? [{ debugName: "inputRef" }] : /* istanbul ignore next */ []));
36
+ this.optionsRef = viewChild('optionsRef', /* @ts-ignore */
37
+ ...(ngDevMode ? [{ debugName: "optionsRef" }] : /* istanbul ignore next */ []));
38
+ this.openMenusEffect = effect((onCleanup) => {
39
+ if (this.isOpen()) {
40
+ ShipMenu.openMenus.push(this);
41
+ }
42
+ onCleanup(() => {
43
+ const index = ShipMenu.openMenus.indexOf(this);
44
+ if (index > -1) {
45
+ ShipMenu.openMenus.splice(index, 1);
46
+ }
47
+ });
48
+ }, /* @ts-ignore */
49
+ ...(ngDevMode ? [{ debugName: "openMenusEffect" }] : /* istanbul ignore next */ []));
50
+ this.options = observeChildren(this.optionsRef, this.customOptionElementSelectors);
51
+ this.optionsEl = computed(() => {
52
+ const optionsContainer = this.optionsRef()?.nativeElement;
53
+ if (!optionsContainer)
54
+ return [];
55
+ return this.options.signal().filter((x) => {
56
+ if (x.disabled)
57
+ return false;
58
+ return x.closest('.options') === optionsContainer;
59
+ });
60
+ }, /* @ts-ignore */
61
+ ...(ngDevMode ? [{ debugName: "optionsEl" }] : /* istanbul ignore next */ []));
62
+ this.inputValue = createFormInputSignal(this.inputRef);
63
+ this.optionsId = generateUniqueId();
64
+ this.activeOptionId = signal(undefined, /* @ts-ignore */
65
+ ...(ngDevMode ? [{ debugName: "activeOptionId" }] : /* istanbul ignore next */ []));
66
+ this.abortController = null;
67
+ this.optionsEffect = effect(() => {
68
+ if (this.abortController !== null) {
69
+ this.abortController.abort();
70
+ this.abortController = null;
71
+ }
72
+ if (!this.isOpen())
73
+ return;
74
+ this.abortController = new AbortController();
75
+ const searchable = this.searchable();
76
+ if (!searchable) {
77
+ this.#document.documentElement.addEventListener('keydown', this.keyDownEventListener, {
78
+ signal: this.abortController.signal,
79
+ });
80
+ }
81
+ else {
82
+ const inputEl = this.inputRef()?.nativeElement;
83
+ if (inputEl) {
84
+ inputEl.addEventListener('keydown', this.keyDownEventListener, {
85
+ signal: this.abortController.signal,
86
+ });
87
+ }
88
+ }
89
+ const inputEl = this.inputRef()?.nativeElement;
90
+ if (!inputEl)
91
+ return;
92
+ queueMicrotask(() => inputEl.focus());
93
+ if (!this.closeOnClick()) {
94
+ const optionRef = this.optionsRef()?.nativeElement;
95
+ optionRef?.addEventListener('click', (e) => {
96
+ const optionEl = e.target;
97
+ let optionElements = this.activeElements();
98
+ if (!optionElements.length) {
99
+ const newOptionElements = this.optionsEl();
100
+ this.activeElements.set(newOptionElements);
101
+ optionElements = newOptionElements;
102
+ }
103
+ const clickedOptionIndex = optionElements.findIndex((x) => x === optionEl);
104
+ if (clickedOptionIndex > -1) {
105
+ this.activeOptionIndex.set(clickedOptionIndex);
106
+ inputEl.focus();
107
+ }
108
+ });
109
+ }
110
+ }, /* @ts-ignore */
111
+ ...(ngDevMode ? [{ debugName: "optionsEffect" }] : /* istanbul ignore next */ []));
112
+ this.keyDownEventListener = (e) => {
113
+ // Only handle events if this is the most recently opened menu
114
+ if (ShipMenu.openMenus.at(-1) !== this)
115
+ return;
116
+ const activeOptionIndex = this.activeOptionIndex();
117
+ if (e.key === 'ArrowDown') {
118
+ e.preventDefault();
119
+ this.activeOptionIndex.set(this.nextActiveIndex(activeOptionIndex));
120
+ }
121
+ else if (e.key === 'ArrowUp') {
122
+ e.preventDefault();
123
+ this.activeOptionIndex.set(this.prevActiveIndex(activeOptionIndex));
124
+ }
125
+ else if (e.key === 'ArrowRight') {
126
+ if (activeOptionIndex > -1) {
127
+ const el = this.activeElements()[activeOptionIndex];
128
+ const parent = el.parentElement;
129
+ // For nested menu's
130
+ if (parent?.hasAttribute('trigger')) {
131
+ e.preventDefault();
132
+ const event = new CustomEvent('ship-menu-open', {
133
+ bubbles: true,
134
+ cancelable: true,
135
+ detail: { keyboard: true },
136
+ });
137
+ el.dispatchEvent(event);
138
+ }
139
+ }
140
+ }
141
+ else if (e.key === 'ArrowLeft') {
142
+ if (this.isSubmenu()) {
143
+ e.preventDefault();
144
+ this.close('closed');
145
+ }
146
+ }
147
+ else if (e.key === 'Enter') {
148
+ e.preventDefault();
149
+ if (activeOptionIndex > -1) {
150
+ const el = this.activeElements()[activeOptionIndex];
151
+ const parent = el.parentElement;
152
+ // For nested menu's
153
+ if (parent?.hasAttribute('trigger')) {
154
+ const event = new CustomEvent('ship-menu-open', {
155
+ bubbles: true,
156
+ cancelable: true,
157
+ detail: { keyboard: true },
158
+ });
159
+ el.dispatchEvent(event);
160
+ }
161
+ else {
162
+ el.click();
163
+ if (!el.querySelector('sh-checkbox')) {
164
+ queueMicrotask(() => this.close('active'));
165
+ }
166
+ }
167
+ }
168
+ }
169
+ else if (e.key === 'Tab') {
170
+ let optionElements = this.activeElements();
171
+ if (!optionElements.length) {
172
+ const newOptionElements = this.optionsEl();
173
+ this.activeElements.set(newOptionElements);
174
+ optionElements = newOptionElements;
175
+ }
176
+ if (e.shiftKey) {
177
+ if (activeOptionIndex <= 0) {
178
+ e.preventDefault();
179
+ this.close('closed');
180
+ }
181
+ else {
182
+ e.preventDefault();
183
+ this.activeOptionIndex.set(this.prevActiveIndex(activeOptionIndex));
184
+ }
185
+ }
186
+ else {
187
+ if (activeOptionIndex >= optionElements.length - 1) {
188
+ e.preventDefault();
189
+ this.close('closed');
190
+ }
191
+ else {
192
+ e.preventDefault();
193
+ this.activeOptionIndex.set(this.nextActiveIndex(activeOptionIndex));
194
+ }
195
+ }
196
+ }
197
+ };
198
+ this._lastElementList = [];
199
+ this.activeElements = signal([], /* @ts-ignore */
200
+ ...(ngDevMode ? [{ debugName: "activeElements" }] : /* istanbul ignore next */ []));
201
+ this.lastInputValue = '';
202
+ this.inputValueEffect = effect(() => {
203
+ const searchable = this.searchable();
204
+ if (!searchable) {
205
+ this.activeElements.set(this.optionsEl());
206
+ return;
207
+ }
208
+ const inputValue = (this.inputValue() ?? '').toLowerCase();
209
+ this.#resetActiveOption();
210
+ if (!inputValue || inputValue === '') {
211
+ const allOptions = this.optionsEl();
212
+ this.activeElements.set(allOptions);
213
+ this._lastElementList = allOptions;
214
+ for (let i = 0; i < allOptions.length; i++) {
215
+ this.#renderer.removeStyle(allOptions[i], 'order');
216
+ if (!allOptions[i].id) {
217
+ allOptions[i].id = `${this.optionsId}-option-${i}`;
218
+ }
219
+ allOptions[i].setAttribute('role', 'option');
220
+ }
221
+ return;
222
+ }
223
+ if (!inputValue || inputValue === '')
224
+ return;
225
+ let optionElements = this._lastElementList.length && inputValue.length > this.lastInputValue.length
226
+ ? this._lastElementList
227
+ : this.optionsEl();
228
+ this.lastInputValue = inputValue;
229
+ for (let i = 0; i < optionElements.length; i++) {
230
+ const el = optionElements[i];
231
+ const textContent = el.textContent?.toLowerCase() || '';
232
+ const score = this.#calculateMatchScore(textContent, inputValue);
233
+ el.value = score;
234
+ }
235
+ optionElements = optionElements
236
+ .filter((x) => x.value > 0)
237
+ .sort((a, b) => b.value - a.value);
238
+ for (let i = 0; i < optionElements.length; i++) {
239
+ this.#renderer.setStyle(optionElements[i], 'order', i);
240
+ }
241
+ this.activeElements.set(optionElements);
242
+ this._lastElementList = optionElements;
243
+ // Assign IDs to options for ARIA support
244
+ for (let i = 0; i < optionElements.length; i++) {
245
+ if (!optionElements[i].id) {
246
+ optionElements[i].id = `${this.optionsId}-option-${i}`;
247
+ }
248
+ optionElements[i].setAttribute('role', 'option');
249
+ }
250
+ }, /* @ts-ignore */
251
+ ...(ngDevMode ? [{ debugName: "inputValueEffect" }] : /* istanbul ignore next */ []));
252
+ this.activeOptionIndexEffect = effect(() => {
253
+ const optionElements = this.activeElements();
254
+ const activeOptionIndex = this.activeOptionIndex();
255
+ for (let index = 0; index < optionElements.length; index++) {
256
+ optionElements[index].classList.remove('active');
257
+ optionElements[index].removeAttribute('aria-selected');
258
+ }
259
+ if (activeOptionIndex > -1) {
260
+ const activeOption = optionElements[activeOptionIndex];
261
+ activeOption.scrollIntoView({ block: 'center' });
262
+ activeOption.classList.add('active');
263
+ activeOption.setAttribute('aria-selected', 'true');
264
+ this.activeOptionId.set(activeOption.id);
265
+ }
266
+ else {
267
+ this.activeOptionId.set(undefined);
268
+ }
269
+ }, /* @ts-ignore */
270
+ ...(ngDevMode ? [{ debugName: "activeOptionIndexEffect" }] : /* istanbul ignore next */ []));
271
+ }
272
+ #document;
273
+ #renderer;
274
+ static { this.openMenus = []; }
275
+ toggleIsOpen(event) {
276
+ event.preventDefault();
277
+ event.stopPropagation();
278
+ if (this.disabled())
279
+ return;
280
+ if (this.isOpen()) {
281
+ this.close('fromPopover');
282
+ }
283
+ else {
284
+ this.open();
285
+ }
286
+ }
287
+ open() {
288
+ if (this.disabled())
289
+ return;
290
+ this.isOpen.set(true);
291
+ if (this.searchable()) {
292
+ setTimeout(() => this.inputRef()?.nativeElement.focus());
293
+ }
294
+ }
295
+ onShipMenuOpen(event) {
296
+ event.preventDefault();
297
+ event.stopPropagation();
298
+ this.open();
299
+ const customEvent = event;
300
+ if (customEvent.detail?.keyboard) {
301
+ setTimeout(() => {
302
+ this.activeOptionIndex.set(0);
303
+ }, 50);
304
+ }
305
+ }
306
+ #calculateMatchScore(option, input) {
307
+ if (!input)
308
+ return 0;
309
+ let score = 0;
310
+ let lastIndex = -1;
311
+ let matchCount = 0;
312
+ let inSequence = true;
313
+ for (let i = 0; i < input.length; i++) {
314
+ const char = input[i];
315
+ if (option.length > lastIndex + 1 && option[lastIndex + 1] === char) {
316
+ score += i === 0 ? 100 : 150;
317
+ lastIndex++;
318
+ matchCount++;
319
+ }
320
+ else {
321
+ const charIndex = option.indexOf(char, lastIndex + 1);
322
+ if (i > 0) {
323
+ inSequence = false;
324
+ }
325
+ if (charIndex === -1) {
326
+ return 0;
327
+ }
328
+ score += 100;
329
+ lastIndex = charIndex;
330
+ matchCount++;
331
+ }
332
+ }
333
+ if (inSequence && input.length === matchCount) {
334
+ score += 1000;
335
+ }
336
+ score += matchCount * 20;
337
+ return score;
338
+ }
339
+ nextActiveIndex(activeIndex) {
340
+ let optionElements = this.activeElements();
341
+ if (!optionElements.length) {
342
+ const newOptionElements = this.optionsEl();
343
+ this.activeElements.set(newOptionElements);
344
+ optionElements = newOptionElements;
345
+ }
346
+ if (activeIndex === -1) {
347
+ return 0;
348
+ }
349
+ if (activeIndex === optionElements.length - 1) {
350
+ return 0;
351
+ }
352
+ const nextIndex = activeIndex + 1;
353
+ if (optionElements[nextIndex].disabled) {
354
+ return this.nextActiveIndex(nextIndex);
355
+ }
356
+ return nextIndex;
357
+ }
358
+ prevActiveIndex(activeIndex) {
359
+ let optionElements = this.activeElements();
360
+ if (!optionElements.length) {
361
+ const newOptionElements = this.optionsEl();
362
+ this.activeElements.set(newOptionElements);
363
+ optionElements = newOptionElements;
364
+ }
365
+ if (activeIndex === 0) {
366
+ return optionElements.length - 1;
367
+ }
368
+ if (activeIndex === -1) {
369
+ return optionElements.length - 1;
370
+ }
371
+ const prevIndex = activeIndex - 1;
372
+ if (optionElements[prevIndex].disabled) {
373
+ return this.prevActiveIndex(prevIndex);
374
+ }
375
+ return prevIndex;
376
+ }
377
+ close(action = 'closed', event) {
378
+ this.inputValue.set('');
379
+ const inputEl = this.inputRef()?.nativeElement;
380
+ if (inputEl) {
381
+ inputEl.value = '';
382
+ }
383
+ if (this.closeOnClick()) {
384
+ (!this.keepClickedOptionActive() || action === 'closed') && this.#resetActiveOption();
385
+ this.isOpen.set(false);
386
+ this.closed.emit(action === 'active');
387
+ if (this.isSubmenu()) {
388
+ const parentInput = this.parentMenu?.inputRef()?.nativeElement;
389
+ if (parentInput) {
390
+ queueMicrotask(() => parentInput.focus());
391
+ }
392
+ }
393
+ }
394
+ }
395
+ #resetActiveOption() {
396
+ this.activeOptionIndex.set(-1);
397
+ const optionElements = this.optionsEl();
398
+ for (let index = 0; index < optionElements.length; index++) {
399
+ optionElements[index].classList.remove('active');
400
+ optionElements[index].removeAttribute('aria-selected');
401
+ }
402
+ }
403
+ ngOnDestroy() {
404
+ if (this.abortController) {
405
+ this.abortController.abort();
406
+ this.abortController = null;
407
+ }
408
+ const index = ShipMenu.openMenus.indexOf(this);
409
+ if (index > -1) {
410
+ ShipMenu.openMenus.splice(index, 1);
411
+ }
412
+ }
413
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ShipMenu, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
414
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: ShipMenu, isStandalone: true, selector: "sh-menu", inputs: { asMultiLayer: { classPropertyName: "asMultiLayer", publicName: "asMultiLayer", isSignal: true, isRequired: false, transformFunction: null }, openIndicator: { classPropertyName: "openIndicator", publicName: "openIndicator", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, customOptionElementSelectors: { classPropertyName: "customOptionElementSelectors", publicName: "customOptionElementSelectors", isSignal: true, isRequired: false, transformFunction: null }, keepClickedOptionActive: { classPropertyName: "keepClickedOptionActive", publicName: "keepClickedOptionActive", isSignal: true, isRequired: false, transformFunction: null }, closeOnClick: { classPropertyName: "closeOnClick", publicName: "closeOnClick", isSignal: true, isRequired: false, transformFunction: null }, isOpen: { classPropertyName: "isOpen", publicName: "isOpen", isSignal: true, isRequired: false, transformFunction: null }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { isOpen: "isOpenChange", closed: "closed" }, host: { listeners: { "ship-menu-open": "onShipMenuOpen($event)" }, properties: { "class.disabled": "disabled()", "class.has-search": "searchable()", "class.multi-layer": "asMultiLayer()" } }, viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["inputRef"], descendants: true, isSignal: true }, { propertyName: "optionsRef", first: true, predicate: ["optionsRef"], descendants: true, isSignal: true }], ngImport: i0, template: `
415
+ <sh-popover
416
+ #formFieldWrapper
417
+ [(isOpen)]="isOpen"
418
+ [disableOpenByClick]="true"
419
+ (closed)="close('fromPopover')"
420
+ [asMultiLayer]="asMultiLayer()"
421
+ [options]="{
422
+ closeOnButton: false,
423
+ closeOnEsc: true,
424
+ }">
425
+ <div
426
+ trigger
427
+ [class.is-open]="isOpen()"
428
+ (click)="toggleIsOpen($event)"
429
+ role="combobox"
430
+ [attr.aria-expanded]="isOpen()"
431
+ aria-haspopup="listbox"
432
+ [attr.aria-controls]="optionsId"
433
+ [attr.aria-activedescendant]="activeOptionId()">
434
+ <ng-content />
435
+
436
+ @if (openIndicator()) {
437
+ <sh-icon class="open-indicator">caret-down</sh-icon>
438
+ }
439
+
440
+ @if (isSubmenu()) {
441
+ <sh-icon class="submenu-indicator">caret-right</sh-icon>
442
+ }
443
+ </div>
444
+
445
+ <div class="form-field-wrap">
446
+ <sh-form-field class="small stretch" [class.hidden]="searchable() === false">
447
+ <input
448
+ type="text"
449
+ #inputRef
450
+ placeholder="Search"
451
+ role="combobox"
452
+ [attr.aria-expanded]="isOpen()"
453
+ [attr.aria-controls]="optionsId"
454
+ [attr.aria-activedescendant]="activeOptionId()"
455
+ aria-autocomplete="list" />
456
+ </sh-form-field>
457
+ </div>
458
+
459
+ <div
460
+ class="options"
461
+ #optionsRef
462
+ (click)="close('active')"
463
+ [class.searching]="searchable() && inputValue() !== ''"
464
+ role="listbox"
465
+ [id]="optionsId"
466
+ [attr.aria-activedescendant]="activeOptionId()">
467
+ <ng-content select="[menu]" />
468
+ </div>
469
+ </sh-popover>
470
+ `, isInline: true, styles: ["sh-menu{--menu-mh: 20rem;display:inline-flex;position:relative}sh-menu.disabled{opacity:.5;pointer-events:none}sh-menu.stretch{width:100%}sh-menu.stretch [trigger]>*{width:100%}sh-menu.has-search sh-popover .options [title]{position:sticky;border-bottom:var(--border-10)}sh-menu.has-search .form-field-wrap{margin:.5rem .5rem 0}sh-menu.has-search .options{margin:.25rem 0 0}sh-menu.multi-layer [trigger]:has(sh-icon.open-indicator).is-open .open-indicator{transform:translateY(-50%) rotate(-90deg)}sh-menu.multi-layer [trigger]:has(sh-icon.open-indicator){display:flex}sh-menu.multi-layer [trigger]:has(sh-icon.open-indicator) .open-indicator{right:1rem}sh-menu.multi-layer [trigger] button:first-child{margin-top:0}sh-menu [trigger]:has(sh-icon.open-indicator){position:relative}sh-menu [trigger]:has(sh-icon.open-indicator)>:first-child{padding-right:2rem}sh-menu [trigger]:has(sh-icon.open-indicator) .open-indicator{position:absolute;right:.5rem;top:50%;transform:translateY(-50%);color:var(--base-8);font-size:1rem;font-weight:inherit;pointer-events:none;transition:transform 75ms ease-in-out}sh-menu [trigger]:has(sh-icon.open-indicator).is-open .open-indicator{transform:translateY(-50%) rotate(-180deg)}sh-menu [trigger]:has(sh-icon.submenu-indicator){position:relative}sh-menu [trigger]:has(sh-icon.submenu-indicator)>:first-child{padding-right:2rem!important}sh-menu [trigger]:has(sh-icon.submenu-indicator) .submenu-indicator{position:absolute;right:1rem;top:50%;transform:translateY(-50%);color:var(--base-8);font-size:1rem;font-weight:inherit;pointer-events:none;transition:transform 75ms ease-in-out}sh-menu [trigger]:has(sh-icon.submenu-indicator).is-open .submenu-indicator{transform:translateY(-50%) rotate(90deg)}sh-menu sh-popover{flex:1 0}sh-menu sh-popover .popover{padding:0}sh-menu sh-popover .popover-content{overflow:hidden}sh-menu sh-popover .form-field-wrap sh-form-field{z-index:10;background-color:var(--base-1)}sh-menu sh-popover .form-field-wrap sh-form-field.hidden{opacity:0;height:0;width:0;min-width:0;min-height:0;margin:0}sh-menu sh-popover .options{z-index:2;position:relative;display:flex;flex-direction:column;gap:.25rem;padding:0;margin:0;max-height:var(--menu-mh);overflow:auto}sh-menu sh-popover .options sh-menu:first-child,sh-menu sh-popover .options button:first-child{margin-top:.5rem}sh-menu sh-popover .options.searching button[disabled]{display:none}sh-menu sh-popover .options.searching button[value=\"0\"]{display:none}sh-menu sh-popover .options.searching>*:not(button){display:none}sh-menu sh-popover .options:after{content:\"\";display:block;width:100%;min-height:.25rem;order:9999999}sh-menu sh-popover .options [title]{font:var(--paragraph-30);color:var(--base-8);padding:.5rem .75rem;margin:0;-webkit-user-select:none;user-select:none;position:relative;top:0;z-index:10;background-color:var(--base-1)}sh-menu sh-popover .options button{display:flex;justify-content:flex-start;align-items:center;text-align:left;height:auto;margin:0 .5rem;padding:.25rem .5rem;gap:0 .5rem;width:calc(100% - 1rem);border-radius:var(--shape-2);appearance:none;background-color:transparent;border:0;cursor:pointer;color:var(--base-12);transition:transform 125ms linear;transform:scale(1)}sh-menu sh-popover .options button:before{content:\"\";min-height:1.5rem;display:inline-block;width:0;margin-right:-.5rem}sh-menu sh-popover .options button:active{transform:scale(.98)}sh-menu sh-popover .options button[disabled]{opacity:.3;cursor:initial}sh-menu sh-popover .options button[disabled]:hover{background-color:transparent}sh-menu sh-popover .options button [suffix]{order:999;color:var(--base-8);font:var(--paragraph-30);justify-self:flex-end;display:inline-flex;flex:1 0;justify-content:flex-end}sh-menu sh-popover .options button sh-icon{font-size:1rem}sh-menu sh-popover .options button.active,sh-menu sh-popover .options button:hover{background-color:var(--base-2);color:var(--base-12)}sh-menu sh-popover .options button.focused{background-color:var(--primary-2);color:var(--base-12)}sh-menu sh-popover .options button.focused:hover{background-color:var(--primary-3)}\n"], dependencies: [{ kind: "component", type: ShipPopover, selector: "sh-popover", inputs: ["asMultiLayer", "asSheetOnMobile", "disableOpenByClick", "isOpen", "options"], outputs: ["isOpenChange", "closed"] }, { kind: "component", type: ShipFormField, selector: "sh-form-field", inputs: ["color", "variant", "size", "readonly"] }, { kind: "component", type: ShipIcon, selector: "sh-icon", inputs: ["color", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
471
+ }
472
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ShipMenu, decorators: [{
473
+ type: Component,
474
+ args: [{ selector: 'sh-menu', encapsulation: ViewEncapsulation.None, imports: [ShipPopover, ShipFormField, ShipIcon], template: `
475
+ <sh-popover
476
+ #formFieldWrapper
477
+ [(isOpen)]="isOpen"
478
+ [disableOpenByClick]="true"
479
+ (closed)="close('fromPopover')"
480
+ [asMultiLayer]="asMultiLayer()"
481
+ [options]="{
482
+ closeOnButton: false,
483
+ closeOnEsc: true,
484
+ }">
485
+ <div
486
+ trigger
487
+ [class.is-open]="isOpen()"
488
+ (click)="toggleIsOpen($event)"
489
+ role="combobox"
490
+ [attr.aria-expanded]="isOpen()"
491
+ aria-haspopup="listbox"
492
+ [attr.aria-controls]="optionsId"
493
+ [attr.aria-activedescendant]="activeOptionId()">
494
+ <ng-content />
495
+
496
+ @if (openIndicator()) {
497
+ <sh-icon class="open-indicator">caret-down</sh-icon>
498
+ }
499
+
500
+ @if (isSubmenu()) {
501
+ <sh-icon class="submenu-indicator">caret-right</sh-icon>
502
+ }
503
+ </div>
504
+
505
+ <div class="form-field-wrap">
506
+ <sh-form-field class="small stretch" [class.hidden]="searchable() === false">
507
+ <input
508
+ type="text"
509
+ #inputRef
510
+ placeholder="Search"
511
+ role="combobox"
512
+ [attr.aria-expanded]="isOpen()"
513
+ [attr.aria-controls]="optionsId"
514
+ [attr.aria-activedescendant]="activeOptionId()"
515
+ aria-autocomplete="list" />
516
+ </sh-form-field>
517
+ </div>
518
+
519
+ <div
520
+ class="options"
521
+ #optionsRef
522
+ (click)="close('active')"
523
+ [class.searching]="searchable() && inputValue() !== ''"
524
+ role="listbox"
525
+ [id]="optionsId"
526
+ [attr.aria-activedescendant]="activeOptionId()">
527
+ <ng-content select="[menu]" />
528
+ </div>
529
+ </sh-popover>
530
+ `, changeDetection: ChangeDetectionStrategy.OnPush, host: {
531
+ '[class.disabled]': 'disabled()',
532
+ '[class.has-search]': 'searchable()',
533
+ '[class.multi-layer]': 'asMultiLayer()',
534
+ }, styles: ["sh-menu{--menu-mh: 20rem;display:inline-flex;position:relative}sh-menu.disabled{opacity:.5;pointer-events:none}sh-menu.stretch{width:100%}sh-menu.stretch [trigger]>*{width:100%}sh-menu.has-search sh-popover .options [title]{position:sticky;border-bottom:var(--border-10)}sh-menu.has-search .form-field-wrap{margin:.5rem .5rem 0}sh-menu.has-search .options{margin:.25rem 0 0}sh-menu.multi-layer [trigger]:has(sh-icon.open-indicator).is-open .open-indicator{transform:translateY(-50%) rotate(-90deg)}sh-menu.multi-layer [trigger]:has(sh-icon.open-indicator){display:flex}sh-menu.multi-layer [trigger]:has(sh-icon.open-indicator) .open-indicator{right:1rem}sh-menu.multi-layer [trigger] button:first-child{margin-top:0}sh-menu [trigger]:has(sh-icon.open-indicator){position:relative}sh-menu [trigger]:has(sh-icon.open-indicator)>:first-child{padding-right:2rem}sh-menu [trigger]:has(sh-icon.open-indicator) .open-indicator{position:absolute;right:.5rem;top:50%;transform:translateY(-50%);color:var(--base-8);font-size:1rem;font-weight:inherit;pointer-events:none;transition:transform 75ms ease-in-out}sh-menu [trigger]:has(sh-icon.open-indicator).is-open .open-indicator{transform:translateY(-50%) rotate(-180deg)}sh-menu [trigger]:has(sh-icon.submenu-indicator){position:relative}sh-menu [trigger]:has(sh-icon.submenu-indicator)>:first-child{padding-right:2rem!important}sh-menu [trigger]:has(sh-icon.submenu-indicator) .submenu-indicator{position:absolute;right:1rem;top:50%;transform:translateY(-50%);color:var(--base-8);font-size:1rem;font-weight:inherit;pointer-events:none;transition:transform 75ms ease-in-out}sh-menu [trigger]:has(sh-icon.submenu-indicator).is-open .submenu-indicator{transform:translateY(-50%) rotate(90deg)}sh-menu sh-popover{flex:1 0}sh-menu sh-popover .popover{padding:0}sh-menu sh-popover .popover-content{overflow:hidden}sh-menu sh-popover .form-field-wrap sh-form-field{z-index:10;background-color:var(--base-1)}sh-menu sh-popover .form-field-wrap sh-form-field.hidden{opacity:0;height:0;width:0;min-width:0;min-height:0;margin:0}sh-menu sh-popover .options{z-index:2;position:relative;display:flex;flex-direction:column;gap:.25rem;padding:0;margin:0;max-height:var(--menu-mh);overflow:auto}sh-menu sh-popover .options sh-menu:first-child,sh-menu sh-popover .options button:first-child{margin-top:.5rem}sh-menu sh-popover .options.searching button[disabled]{display:none}sh-menu sh-popover .options.searching button[value=\"0\"]{display:none}sh-menu sh-popover .options.searching>*:not(button){display:none}sh-menu sh-popover .options:after{content:\"\";display:block;width:100%;min-height:.25rem;order:9999999}sh-menu sh-popover .options [title]{font:var(--paragraph-30);color:var(--base-8);padding:.5rem .75rem;margin:0;-webkit-user-select:none;user-select:none;position:relative;top:0;z-index:10;background-color:var(--base-1)}sh-menu sh-popover .options button{display:flex;justify-content:flex-start;align-items:center;text-align:left;height:auto;margin:0 .5rem;padding:.25rem .5rem;gap:0 .5rem;width:calc(100% - 1rem);border-radius:var(--shape-2);appearance:none;background-color:transparent;border:0;cursor:pointer;color:var(--base-12);transition:transform 125ms linear;transform:scale(1)}sh-menu sh-popover .options button:before{content:\"\";min-height:1.5rem;display:inline-block;width:0;margin-right:-.5rem}sh-menu sh-popover .options button:active{transform:scale(.98)}sh-menu sh-popover .options button[disabled]{opacity:.3;cursor:initial}sh-menu sh-popover .options button[disabled]:hover{background-color:transparent}sh-menu sh-popover .options button [suffix]{order:999;color:var(--base-8);font:var(--paragraph-30);justify-self:flex-end;display:inline-flex;flex:1 0;justify-content:flex-end}sh-menu sh-popover .options button sh-icon{font-size:1rem}sh-menu sh-popover .options button.active,sh-menu sh-popover .options button:hover{background-color:var(--base-2);color:var(--base-12)}sh-menu sh-popover .options button.focused{background-color:var(--primary-2);color:var(--base-12)}sh-menu sh-popover .options button.focused:hover{background-color:var(--primary-3)}\n"] }]
535
+ }], propDecorators: { asMultiLayer: [{ type: i0.Input, args: [{ isSignal: true, alias: "asMultiLayer", required: false }] }], openIndicator: [{ type: i0.Input, args: [{ isSignal: true, alias: "openIndicator", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], customOptionElementSelectors: [{ type: i0.Input, args: [{ isSignal: true, alias: "customOptionElementSelectors", required: false }] }], keepClickedOptionActive: [{ type: i0.Input, args: [{ isSignal: true, alias: "keepClickedOptionActive", required: false }] }], closeOnClick: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnClick", required: false }] }], isOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "isOpen", required: false }] }, { type: i0.Output, args: ["isOpenChange"] }], closed: [{ type: i0.Output, args: ["closed"] }], searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], inputRef: [{ type: i0.ViewChild, args: ['inputRef', { isSignal: true }] }], optionsRef: [{ type: i0.ViewChild, args: ['optionsRef', { isSignal: true }] }], onShipMenuOpen: [{
536
+ type: HostListener,
537
+ args: ['ship-menu-open', ['$event']]
538
+ }] } });
539
+
540
+ /**
541
+ * Generated bundle index. Do not edit.
542
+ */
543
+
544
+ export { ShipMenu };
545
+ //# sourceMappingURL=ship-ui-core-ship-menu.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ship-ui-core-ship-menu.mjs","sources":["../../../projects/ship-ui/ship-menu/ship-menu.ts","../../../projects/ship-ui/ship-menu/ship-ui-core-ship-menu.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, DOCUMENT, effect, ElementRef, HostListener, inject, input, model, output, Renderer2, signal, viewChild, ViewEncapsulation } from '@angular/core';\nimport { ShipFormField } from '@ship-ui/core/ship-form-field';\nimport { ShipIcon } from '@ship-ui/core/ship-icon';\nimport { ShipPopover } from '@ship-ui/core/ship-popover';\nimport { createFormInputSignal } from '@ship-ui/core';\nimport { observeChildren } from '@ship-ui/core';\nimport { generateUniqueId } from '@ship-ui/core';\n\n@Component({\n selector: 'sh-menu',\n styleUrl: './ship-menu.scss',\n encapsulation: ViewEncapsulation.None,\n imports: [ShipPopover, ShipFormField, ShipIcon],\n template: `\n <sh-popover\n #formFieldWrapper\n [(isOpen)]=\"isOpen\"\n [disableOpenByClick]=\"true\"\n (closed)=\"close('fromPopover')\"\n [asMultiLayer]=\"asMultiLayer()\"\n [options]=\"{\n closeOnButton: false,\n closeOnEsc: true,\n }\">\n <div\n trigger\n [class.is-open]=\"isOpen()\"\n (click)=\"toggleIsOpen($event)\"\n role=\"combobox\"\n [attr.aria-expanded]=\"isOpen()\"\n aria-haspopup=\"listbox\"\n [attr.aria-controls]=\"optionsId\"\n [attr.aria-activedescendant]=\"activeOptionId()\">\n <ng-content />\n\n @if (openIndicator()) {\n <sh-icon class=\"open-indicator\">caret-down</sh-icon>\n }\n\n @if (isSubmenu()) {\n <sh-icon class=\"submenu-indicator\">caret-right</sh-icon>\n }\n </div>\n\n <div class=\"form-field-wrap\">\n <sh-form-field class=\"small stretch\" [class.hidden]=\"searchable() === false\">\n <input\n type=\"text\"\n #inputRef\n placeholder=\"Search\"\n role=\"combobox\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"optionsId\"\n [attr.aria-activedescendant]=\"activeOptionId()\"\n aria-autocomplete=\"list\" />\n </sh-form-field>\n </div>\n\n <div\n class=\"options\"\n #optionsRef\n (click)=\"close('active')\"\n [class.searching]=\"searchable() && inputValue() !== ''\"\n role=\"listbox\"\n [id]=\"optionsId\"\n [attr.aria-activedescendant]=\"activeOptionId()\">\n <ng-content select=\"[menu]\" />\n </div>\n </sh-popover>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class.disabled]': 'disabled()',\n '[class.has-search]': 'searchable()',\n '[class.multi-layer]': 'asMultiLayer()',\n },\n})\nexport class ShipMenu {\n #document = inject(DOCUMENT);\n #renderer = inject(Renderer2);\n parentMenu = inject(ShipMenu, { optional: true, skipSelf: true });\n isSubmenu = computed(() => this.parentMenu !== null);\n asMultiLayer = input<boolean>(false);\n openIndicator = input(false);\n disabled = input<boolean>(false);\n customOptionElementSelectors = input<string[]>(['button']);\n keepClickedOptionActive = input<boolean>(false);\n closeOnClick = input<boolean>(true);\n isOpen = model<boolean>(false);\n closed = output<boolean>();\n\n searchable = input<boolean>(false);\n activeOptionIndex = signal<number>(-1);\n inputRef = viewChild<ElementRef<HTMLInputElement>>('inputRef');\n optionsRef = viewChild<ElementRef<HTMLDivElement>>('optionsRef');\n\n private static openMenus: ShipMenu[] = [];\n\n openMenusEffect = effect((onCleanup) => {\n if (this.isOpen()) {\n ShipMenu.openMenus.push(this);\n }\n\n onCleanup(() => {\n const index = ShipMenu.openMenus.indexOf(this);\n if (index > -1) {\n ShipMenu.openMenus.splice(index, 1);\n }\n });\n });\n\n options = observeChildren<HTMLButtonElement>(this.optionsRef, this.customOptionElementSelectors);\n optionsEl = computed(() => {\n const optionsContainer = this.optionsRef()?.nativeElement;\n if (!optionsContainer) return [];\n return this.options.signal().filter((x) => {\n if (x.disabled) return false;\n return x.closest('.options') === optionsContainer;\n });\n });\n inputValue = createFormInputSignal(this.inputRef);\n\n readonly optionsId = generateUniqueId();\n activeOptionId = signal<string | undefined>(undefined);\n\n abortController: AbortController | null = null;\n optionsEffect = effect(() => {\n if (this.abortController !== null) {\n this.abortController.abort();\n this.abortController = null;\n }\n\n if (!this.isOpen()) return;\n\n this.abortController = new AbortController();\n\n const searchable = this.searchable();\n\n if (!searchable) {\n this.#document.documentElement.addEventListener('keydown', this.keyDownEventListener, {\n signal: this.abortController.signal,\n });\n } else {\n const inputEl = this.inputRef()?.nativeElement;\n if (inputEl) {\n inputEl.addEventListener('keydown', this.keyDownEventListener, {\n signal: this.abortController.signal,\n });\n }\n }\n\n const inputEl = this.inputRef()?.nativeElement;\n\n if (!inputEl) return;\n\n queueMicrotask(() => inputEl.focus());\n\n if (!this.closeOnClick()) {\n const optionRef = this.optionsRef()?.nativeElement;\n\n optionRef?.addEventListener('click', (e: MouseEvent) => {\n const optionEl = e.target as HTMLButtonElement;\n\n let optionElements = this.activeElements();\n\n if (!optionElements.length) {\n const newOptionElements = this.optionsEl();\n this.activeElements.set(newOptionElements);\n optionElements = newOptionElements;\n }\n\n const clickedOptionIndex = optionElements.findIndex((x) => x === optionEl);\n\n if (clickedOptionIndex > -1) {\n this.activeOptionIndex.set(clickedOptionIndex);\n inputEl.focus();\n }\n });\n }\n });\n\n keyDownEventListener = (e: KeyboardEvent) => {\n // Only handle events if this is the most recently opened menu\n if (ShipMenu.openMenus.at(-1) !== this) return;\n\n const activeOptionIndex = this.activeOptionIndex();\n\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n this.activeOptionIndex.set(this.nextActiveIndex(activeOptionIndex));\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n this.activeOptionIndex.set(this.prevActiveIndex(activeOptionIndex));\n } else if (e.key === 'ArrowRight') {\n if (activeOptionIndex > -1) {\n const el = this.activeElements()[activeOptionIndex as number];\n const parent = el.parentElement;\n\n // For nested menu's\n if (parent?.hasAttribute('trigger')) {\n e.preventDefault();\n const event = new CustomEvent('ship-menu-open', {\n bubbles: true,\n cancelable: true,\n detail: { keyboard: true },\n });\n\n el.dispatchEvent(event);\n }\n }\n } else if (e.key === 'ArrowLeft') {\n if (this.isSubmenu()) {\n e.preventDefault();\n this.close('closed');\n }\n } else if (e.key === 'Enter') {\n e.preventDefault();\n if (activeOptionIndex > -1) {\n const el = this.activeElements()[activeOptionIndex as number];\n const parent = el.parentElement;\n\n // For nested menu's\n if (parent?.hasAttribute('trigger')) {\n const event = new CustomEvent('ship-menu-open', {\n bubbles: true,\n cancelable: true,\n detail: { keyboard: true },\n });\n\n el.dispatchEvent(event);\n } else {\n el.click();\n if (!el.querySelector('sh-checkbox')) {\n queueMicrotask(() => this.close('active'));\n }\n }\n }\n } else if (e.key === 'Tab') {\n let optionElements = this.activeElements();\n if (!optionElements.length) {\n const newOptionElements = this.optionsEl();\n this.activeElements.set(newOptionElements);\n optionElements = newOptionElements;\n }\n\n if (e.shiftKey) {\n if (activeOptionIndex <= 0) {\n e.preventDefault();\n this.close('closed');\n } else {\n e.preventDefault();\n this.activeOptionIndex.set(this.prevActiveIndex(activeOptionIndex));\n }\n } else {\n if (activeOptionIndex >= optionElements.length - 1) {\n e.preventDefault();\n this.close('closed');\n } else {\n e.preventDefault();\n this.activeOptionIndex.set(this.nextActiveIndex(activeOptionIndex));\n }\n }\n }\n };\n\n _lastElementList: HTMLButtonElement[] = [];\n activeElements = signal<HTMLButtonElement[]>([]);\n lastInputValue = '';\n inputValueEffect = effect(() => {\n const searchable = this.searchable();\n\n if (!searchable) {\n this.activeElements.set(this.optionsEl());\n return;\n }\n\n const inputValue = (this.inputValue() ?? '').toLowerCase();\n\n this.#resetActiveOption();\n\n if (!inputValue || inputValue === '') {\n const allOptions = this.optionsEl();\n\n this.activeElements.set(allOptions);\n this._lastElementList = allOptions;\n\n for (let i = 0; i < allOptions.length; i++) {\n this.#renderer.removeStyle(allOptions[i], 'order');\n if (!allOptions[i].id) {\n allOptions[i].id = `${this.optionsId}-option-${i}`;\n }\n allOptions[i].setAttribute('role', 'option');\n }\n\n return;\n }\n\n if (!inputValue || inputValue === '') return;\n\n let optionElements =\n this._lastElementList.length && inputValue.length > this.lastInputValue.length\n ? this._lastElementList\n : this.optionsEl();\n\n this.lastInputValue = inputValue;\n\n for (let i = 0; i < optionElements.length; i++) {\n const el = optionElements[i];\n const textContent = el.textContent?.toLowerCase() || '';\n const score = this.#calculateMatchScore(textContent, inputValue);\n\n (el.value as any) = score;\n }\n\n optionElements = optionElements\n .filter((x) => (x.value as any) > 0)\n .sort((a, b) => (b.value as any) - (a.value as any));\n\n for (let i = 0; i < optionElements.length; i++) {\n this.#renderer.setStyle(optionElements[i], 'order', i);\n }\n\n this.activeElements.set(optionElements);\n this._lastElementList = optionElements;\n\n // Assign IDs to options for ARIA support\n for (let i = 0; i < optionElements.length; i++) {\n if (!optionElements[i].id) {\n optionElements[i].id = `${this.optionsId}-option-${i}`;\n }\n optionElements[i].setAttribute('role', 'option');\n }\n });\n\n toggleIsOpen(event: MouseEvent) {\n event.preventDefault();\n event.stopPropagation();\n\n if (this.disabled()) return;\n\n if (this.isOpen()) {\n this.close('fromPopover');\n } else {\n this.open();\n }\n }\n\n open() {\n if (this.disabled()) return;\n this.isOpen.set(true);\n\n if (this.searchable()) {\n setTimeout(() => this.inputRef()?.nativeElement.focus());\n }\n }\n\n @HostListener('ship-menu-open', ['$event'])\n onShipMenuOpen(event: Event) {\n event.preventDefault();\n event.stopPropagation();\n this.open();\n\n const customEvent = event as CustomEvent;\n if (customEvent.detail?.keyboard) {\n setTimeout(() => {\n this.activeOptionIndex.set(0);\n }, 50);\n }\n }\n\n #calculateMatchScore(option: string, input: string): number {\n if (!input) return 0;\n\n let score = 0;\n let lastIndex = -1;\n let matchCount = 0;\n let inSequence = true;\n\n for (let i = 0; i < input.length; i++) {\n const char = input[i];\n if (option.length > lastIndex + 1 && option[lastIndex + 1] === char) {\n score += i === 0 ? 100 : 150;\n lastIndex++;\n matchCount++;\n } else {\n const charIndex = option.indexOf(char, lastIndex + 1);\n\n if (i > 0) {\n inSequence = false;\n }\n\n if (charIndex === -1) {\n return 0;\n }\n\n score += 100;\n\n lastIndex = charIndex;\n matchCount++;\n }\n }\n\n if (inSequence && input.length === matchCount) {\n score += 1000;\n }\n\n score += matchCount * 20;\n\n return score;\n }\n\n activeOptionIndexEffect = effect(() => {\n const optionElements = this.activeElements();\n const activeOptionIndex = this.activeOptionIndex();\n\n for (let index = 0; index < optionElements.length; index++) {\n optionElements[index].classList.remove('active');\n optionElements[index].removeAttribute('aria-selected');\n }\n\n if (activeOptionIndex > -1) {\n const activeOption = optionElements[activeOptionIndex];\n activeOption.scrollIntoView({ block: 'center' });\n activeOption.classList.add('active');\n activeOption.setAttribute('aria-selected', 'true');\n this.activeOptionId.set(activeOption.id);\n } else {\n this.activeOptionId.set(undefined);\n }\n });\n\n nextActiveIndex(activeIndex: number): number {\n let optionElements = this.activeElements();\n\n if (!optionElements.length) {\n const newOptionElements = this.optionsEl();\n this.activeElements.set(newOptionElements);\n optionElements = newOptionElements;\n }\n\n if (activeIndex === -1) {\n return 0;\n }\n\n if (activeIndex === optionElements.length - 1) {\n return 0;\n }\n\n const nextIndex = activeIndex + 1;\n\n if (optionElements[nextIndex].disabled) {\n return this.nextActiveIndex(nextIndex);\n }\n\n return nextIndex;\n }\n\n prevActiveIndex(activeIndex: number): number {\n let optionElements = this.activeElements();\n\n if (!optionElements.length) {\n const newOptionElements = this.optionsEl();\n this.activeElements.set(newOptionElements);\n optionElements = newOptionElements;\n }\n\n if (activeIndex === 0) {\n return optionElements.length - 1;\n }\n\n if (activeIndex === -1) {\n return optionElements.length - 1;\n }\n\n const prevIndex = activeIndex - 1;\n\n if (optionElements[prevIndex].disabled) {\n return this.prevActiveIndex(prevIndex);\n }\n\n return prevIndex;\n }\n\n close(action: 'fromPopover' | 'closed' | 'active' = 'closed', event?: MouseEvent) {\n this.inputValue.set('');\n\n const inputEl = this.inputRef()?.nativeElement;\n if (inputEl) {\n inputEl.value = '';\n }\n\n if (this.closeOnClick()) {\n (!this.keepClickedOptionActive() || action === 'closed') && this.#resetActiveOption();\n\n this.isOpen.set(false);\n this.closed.emit(action === 'active');\n\n if (this.isSubmenu()) {\n const parentInput = this.parentMenu?.inputRef()?.nativeElement;\n if (parentInput) {\n queueMicrotask(() => parentInput.focus());\n }\n }\n }\n }\n\n #resetActiveOption() {\n this.activeOptionIndex.set(-1);\n\n const optionElements = this.optionsEl();\n\n for (let index = 0; index < optionElements.length; index++) {\n optionElements[index].classList.remove('active');\n optionElements[index].removeAttribute('aria-selected');\n }\n }\n\n ngOnDestroy() {\n if (this.abortController) {\n this.abortController.abort();\n this.abortController = null;\n }\n const index = ShipMenu.openMenus.indexOf(this);\n if (index > -1) {\n ShipMenu.openMenus.splice(index, 1);\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}