@pine-ds/core 3.15.3 → 3.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/components/pds-dropdown-menu-item.js +1 -1
  2. package/components/pds-dropdown-menu-item.js.map +1 -1
  3. package/components/pds-dropdown-menu.js +70 -27
  4. package/components/pds-dropdown-menu.js.map +1 -1
  5. package/components/pds-input.js +1 -1
  6. package/components/pds-input.js.map +1 -1
  7. package/components/pds-multiselect.js +42 -6
  8. package/components/pds-multiselect.js.map +1 -1
  9. package/components/pds-table.js +5 -2
  10. package/components/pds-table.js.map +1 -1
  11. package/dist/cjs/pds-dropdown-menu-item.cjs.entry.js +1 -1
  12. package/dist/cjs/pds-dropdown-menu-item.entry.cjs.js.map +1 -1
  13. package/dist/cjs/pds-dropdown-menu.cjs.entry.js +70 -27
  14. package/dist/cjs/pds-dropdown-menu.entry.cjs.js.map +1 -1
  15. package/dist/cjs/pds-input.cjs.entry.js +1 -1
  16. package/dist/cjs/pds-input.entry.cjs.js.map +1 -1
  17. package/dist/cjs/pds-multiselect.cjs.entry.js +42 -6
  18. package/dist/cjs/pds-multiselect.entry.cjs.js.map +1 -1
  19. package/dist/cjs/pds-table.cjs.entry.js +5 -2
  20. package/dist/cjs/pds-table.entry.cjs.js.map +1 -1
  21. package/dist/collection/components/pds-dropdown-menu/pds-dropdown-menu-item/pds-dropdown-menu-item.css +5 -1
  22. package/dist/collection/components/pds-dropdown-menu/pds-dropdown-menu.css +32 -0
  23. package/dist/collection/components/pds-dropdown-menu/pds-dropdown-menu.js +69 -26
  24. package/dist/collection/components/pds-dropdown-menu/pds-dropdown-menu.js.map +1 -1
  25. package/dist/collection/components/pds-input/pds-input.css +10 -0
  26. package/dist/collection/components/pds-input/stories/pds-input.stories.js +8 -0
  27. package/dist/collection/components/pds-multiselect/pds-multiselect.js +42 -6
  28. package/dist/collection/components/pds-multiselect/pds-multiselect.js.map +1 -1
  29. package/dist/collection/components/pds-table/pds-table.js +5 -2
  30. package/dist/collection/components/pds-table/pds-table.js.map +1 -1
  31. package/dist/docs.json +1 -1
  32. package/dist/esm/pds-dropdown-menu-item.entry.js +1 -1
  33. package/dist/esm/pds-dropdown-menu-item.entry.js.map +1 -1
  34. package/dist/esm/pds-dropdown-menu.entry.js +70 -27
  35. package/dist/esm/pds-dropdown-menu.entry.js.map +1 -1
  36. package/dist/esm/pds-input.entry.js +1 -1
  37. package/dist/esm/pds-input.entry.js.map +1 -1
  38. package/dist/esm/pds-multiselect.entry.js +42 -6
  39. package/dist/esm/pds-multiselect.entry.js.map +1 -1
  40. package/dist/esm/pds-table.entry.js +5 -2
  41. package/dist/esm/pds-table.entry.js.map +1 -1
  42. package/dist/esm-es5/pds-dropdown-menu-item.entry.js +1 -1
  43. package/dist/esm-es5/pds-dropdown-menu-item.entry.js.map +1 -1
  44. package/dist/esm-es5/pds-dropdown-menu.entry.js +1 -1
  45. package/dist/esm-es5/pds-dropdown-menu.entry.js.map +1 -1
  46. package/dist/esm-es5/pds-input.entry.js +1 -1
  47. package/dist/esm-es5/pds-input.entry.js.map +1 -1
  48. package/dist/esm-es5/pds-multiselect.entry.js +1 -1
  49. package/dist/esm-es5/pds-multiselect.entry.js.map +1 -1
  50. package/dist/esm-es5/pds-table.entry.js +1 -1
  51. package/dist/esm-es5/pds-table.entry.js.map +1 -1
  52. package/dist/pine-core/p-23aba538.entry.js +2 -0
  53. package/dist/pine-core/p-23aba538.entry.js.map +1 -0
  54. package/dist/pine-core/p-3c026ec7.system.entry.js +2 -0
  55. package/dist/pine-core/p-3c026ec7.system.entry.js.map +1 -0
  56. package/dist/pine-core/p-7ecfe996.entry.js +2 -0
  57. package/dist/pine-core/p-7ecfe996.entry.js.map +1 -0
  58. package/dist/pine-core/p-8b4f76e4.system.entry.js +2 -0
  59. package/dist/pine-core/p-8b4f76e4.system.entry.js.map +1 -0
  60. package/dist/pine-core/{p-ea8aba18.entry.js → p-8eb29dbd.entry.js} +2 -2
  61. package/dist/pine-core/{p-ea8aba18.entry.js.map → p-8eb29dbd.entry.js.map} +1 -1
  62. package/dist/pine-core/p-C7XKS9nY.system.js.map +1 -0
  63. package/dist/pine-core/p-CCKncKbB.system.js.map +1 -0
  64. package/dist/pine-core/p-DZEhYV6y.system.js.map +1 -0
  65. package/dist/pine-core/p-DsJJz9LK.system.js.map +1 -0
  66. package/dist/pine-core/p-EnxcYko8.system.js.map +1 -0
  67. package/dist/pine-core/p-JAVnELnm.system.js +1 -1
  68. package/dist/pine-core/p-b61669b4.system.entry.js +2 -0
  69. package/dist/pine-core/p-b61669b4.system.entry.js.map +1 -0
  70. package/dist/pine-core/p-bcebce69.entry.js +2 -0
  71. package/dist/pine-core/{p-56cf3af8.entry.js.map → p-bcebce69.entry.js.map} +1 -1
  72. package/dist/pine-core/p-d456c898.entry.js +2 -0
  73. package/dist/pine-core/p-d456c898.entry.js.map +1 -0
  74. package/dist/pine-core/{p-0c2f13c3.system.entry.js → p-f03f4602.system.entry.js} +2 -2
  75. package/dist/pine-core/{p-0c2f13c3.system.entry.js.map → p-f03f4602.system.entry.js.map} +1 -1
  76. package/dist/pine-core/p-f94ae58d.system.entry.js +2 -0
  77. package/dist/pine-core/{p-5f552640.system.entry.js.map → p-f94ae58d.system.entry.js.map} +1 -1
  78. package/dist/pine-core/pds-dropdown-menu-item.entry.esm.js.map +1 -1
  79. package/dist/pine-core/pds-dropdown-menu.entry.esm.js.map +1 -1
  80. package/dist/pine-core/pds-input.entry.esm.js.map +1 -1
  81. package/dist/pine-core/pds-multiselect.entry.esm.js.map +1 -1
  82. package/dist/pine-core/pds-table.entry.esm.js.map +1 -1
  83. package/dist/pine-core/pine-core.esm.js +1 -1
  84. package/dist/types/components/pds-dropdown-menu/pds-dropdown-menu.d.ts +1 -0
  85. package/dist/types/components/pds-multiselect/pds-multiselect.d.ts +2 -0
  86. package/dist/vscode.html-data.json +1 -1
  87. package/hydrate/index.js +120 -38
  88. package/hydrate/index.mjs +120 -38
  89. package/package.json +2 -2
  90. package/dist/pine-core/p-56cf3af8.entry.js +0 -2
  91. package/dist/pine-core/p-5f552640.system.entry.js +0 -2
  92. package/dist/pine-core/p-946d7d11.system.entry.js +0 -2
  93. package/dist/pine-core/p-946d7d11.system.entry.js.map +0 -1
  94. package/dist/pine-core/p-9660a2c2.entry.js +0 -2
  95. package/dist/pine-core/p-9660a2c2.entry.js.map +0 -1
  96. package/dist/pine-core/p-9c0ec80a.entry.js +0 -2
  97. package/dist/pine-core/p-9c0ec80a.entry.js.map +0 -1
  98. package/dist/pine-core/p-C7nuqPJm.system.js.map +0 -1
  99. package/dist/pine-core/p-CCgKUhC7.system.js.map +0 -1
  100. package/dist/pine-core/p-GH_AtkdO.system.js.map +0 -1
  101. package/dist/pine-core/p-anXbtQm4.system.js.map +0 -1
  102. package/dist/pine-core/p-bf18c945.entry.js +0 -2
  103. package/dist/pine-core/p-bf18c945.entry.js.map +0 -1
  104. package/dist/pine-core/p-d98310b9.system.entry.js +0 -2
  105. package/dist/pine-core/p-d98310b9.system.entry.js.map +0 -1
  106. package/dist/pine-core/p-f00f70bf.system.entry.js +0 -2
  107. package/dist/pine-core/p-f00f70bf.system.entry.js.map +0 -1
  108. package/dist/pine-core/p-g2zH2UyI.system.js.map +0 -1
@@ -17,4 +17,36 @@
17
17
  }
18
18
  :host-context([data-theme=dark]) .pds-dropdown-menu--panel {
19
19
  border: var(--pine-border);
20
+ }
21
+
22
+ ::slotted(a),
23
+ ::slotted(button) {
24
+ align-items: center;
25
+ appearance: none;
26
+ background: transparent;
27
+ border: 0;
28
+ border-radius: var(--pine-dimension-xs);
29
+ box-sizing: border-box;
30
+ color: var(--pine-color-text) !important;
31
+ cursor: pointer;
32
+ display: flex;
33
+ flex-grow: 1;
34
+ font: var(--pine-typography-body-medium);
35
+ gap: var(--pine-dimension-xs);
36
+ margin: calc(var(--pine-border-width) + 2px);
37
+ padding: var(--pine-dimension-xs);
38
+ text-align: start;
39
+ text-decoration: none !important;
40
+ width: calc(100% - (var(--pine-border-width) + 2px) * 2);
41
+ }
42
+
43
+ ::slotted(.destructive) {
44
+ color: var(--pine-color-danger) !important;
45
+ }
46
+
47
+ ::slotted([aria-disabled=true]),
48
+ ::slotted([disabled]) {
49
+ cursor: not-allowed;
50
+ opacity: 0.5;
51
+ pointer-events: none;
20
52
  }
@@ -27,14 +27,22 @@ export class PdsDropdownMenu {
27
27
  this.slotEl = event.target;
28
28
  // Get all elements assigned to this slot
29
29
  const assignedElements = this.slotEl.assignedElements();
30
- // ensure assignedElements only contains pds-dropdown-menu-item or pds-dropdown-menu-separator
31
- // if there are other elements, throw an error
32
- const invalidElements = assignedElements.filter(el => el.tagName.toLowerCase() !== 'pds-dropdown-menu-item' && el.tagName.toLowerCase() !== 'pds-dropdown-menu-separator');
30
+ // Allowed elements: pds-dropdown-menu-item, pds-dropdown-menu-separator, <a>, <button>
31
+ // Raw <a> and <button> elements are allowed for edge cases requiring native browser/framework
32
+ // behavior (e.g., Rails UJS, Turbo) that cannot work through Shadow DOM.
33
+ const allowedTags = ['pds-dropdown-menu-item', 'pds-dropdown-menu-separator', 'a', 'button'];
34
+ const invalidElements = assignedElements.filter(el => !allowedTags.includes(el.tagName.toLowerCase()));
33
35
  if (invalidElements.length > 0) {
34
- throw new Error(`pds-dropdown-menu only accepts pds-dropdown-menu-item and pds-dropdown-menu-separator elements`);
36
+ const invalidTags = invalidElements.map(el => el.tagName.toLowerCase()).join(', ');
37
+ console.warn(`pds-dropdown-menu: Unexpected element(s) found: ${invalidTags}. ` +
38
+ `Expected: ${allowedTags.join(', ')}`);
35
39
  }
36
- // Store all menu items for keyboard navigation
37
- this.menuItems = assignedElements.filter(el => el.tagName.toLowerCase() === 'pds-dropdown-menu-item');
40
+ // Store all focusable items for keyboard navigation
41
+ // This includes pds-dropdown-menu-item components and raw <a>/<button> elements
42
+ this.menuItems = assignedElements.filter(el => {
43
+ const tag = el.tagName.toLowerCase();
44
+ return tag === 'pds-dropdown-menu-item' || tag === 'a' || tag === 'button';
45
+ });
38
46
  };
39
47
  // Toggle dropdown open/closed
40
48
  this.toggleDropdown = () => {
@@ -103,31 +111,66 @@ export class PdsDropdownMenu {
103
111
  this.cleanupAutoUpdate = null;
104
112
  }
105
113
  }
114
+ // Check if a menu item is disabled (handles both component and raw elements)
115
+ isItemDisabled(item) {
116
+ const tagName = item.tagName.toLowerCase();
117
+ if (tagName === 'pds-dropdown-menu-item') {
118
+ return item.disabled;
119
+ }
120
+ else if (tagName === 'button') {
121
+ return item.disabled;
122
+ }
123
+ else if (tagName === 'a') {
124
+ return item.getAttribute('aria-disabled') === 'true';
125
+ }
126
+ return false;
127
+ }
106
128
  // Get the index of the currently focused menu item
107
129
  getFocusedItemIndex() {
108
130
  const activeElement = document.activeElement;
109
131
  if (!activeElement)
110
132
  return -1;
111
- return this.menuItems.findIndex(item => item === activeElement);
133
+ // For raw elements, check direct match
134
+ // For pds-dropdown-menu-item, also check if the active element is inside the shadow root
135
+ return this.menuItems.findIndex(item => {
136
+ if (item === activeElement)
137
+ return true;
138
+ // Check if activeElement is inside the item's shadow root (for pds-dropdown-menu-item)
139
+ if (item.tagName.toLowerCase() === 'pds-dropdown-menu-item') {
140
+ const shadowRoot = item.shadowRoot;
141
+ if (shadowRoot === null || shadowRoot === void 0 ? void 0 : shadowRoot.contains(activeElement))
142
+ return true;
143
+ }
144
+ return false;
145
+ });
112
146
  }
113
147
  // Focus a specific menu item by index
114
148
  focusItemByIndex(index) {
115
- var _a, _b, _c, _d;
149
+ var _a, _b, _c, _d, _e;
116
150
  if (index >= 0 && index < this.menuItems.length) {
117
151
  this.currentFocusIndex = index;
118
- // Focus the inner button/link instead of the host element
119
- const menuItem = this.menuItems[index];
120
- const innerButton = (_a = menuItem.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('button');
121
- const innerLink = (_d = (_c = (_b = menuItem.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('pds-link')) === null || _c === void 0 ? void 0 : _c.shadowRoot) === null || _d === void 0 ? void 0 : _d.querySelector('a');
122
- if (innerButton) {
123
- return innerButton.focus();
124
- }
125
- else if (innerLink) {
126
- return innerLink.focus();
152
+ const item = this.menuItems[index];
153
+ const tagName = item.tagName.toLowerCase();
154
+ if (tagName === 'pds-dropdown-menu-item') {
155
+ // For pds-dropdown-menu-item, focus the inner element
156
+ const menuItem = item;
157
+ const innerButton = (_a = menuItem.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('button');
158
+ const innerLink = ((_d = (_c = (_b = menuItem.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('pds-link')) === null || _c === void 0 ? void 0 : _c.shadowRoot) === null || _d === void 0 ? void 0 : _d.querySelector('a'))
159
+ || ((_e = menuItem.shadowRoot) === null || _e === void 0 ? void 0 : _e.querySelector('a'));
160
+ if (innerButton) {
161
+ innerButton.focus();
162
+ }
163
+ else if (innerLink) {
164
+ innerLink.focus();
165
+ }
166
+ else {
167
+ // Fallback to focusing the host
168
+ menuItem.focus();
169
+ }
127
170
  }
128
171
  else {
129
- // Fallback to focusing the host if we can't find the inner element
130
- menuItem.focus();
172
+ // For raw <a> or <button> elements, focus directly
173
+ item.focus();
131
174
  }
132
175
  }
133
176
  }
@@ -137,7 +180,7 @@ export class PdsDropdownMenu {
137
180
  // Skip disabled items
138
181
  let attempts = 0;
139
182
  const maxAttempts = this.menuItems.length;
140
- while (attempts < maxAttempts && this.menuItems[nextIndex].disabled) {
183
+ while (attempts < maxAttempts && this.isItemDisabled(this.menuItems[nextIndex])) {
141
184
  nextIndex = (nextIndex + 1) % this.menuItems.length;
142
185
  attempts++;
143
186
  }
@@ -154,7 +197,7 @@ export class PdsDropdownMenu {
154
197
  // Skip disabled items
155
198
  let attempts = 0;
156
199
  const maxAttempts = this.menuItems.length;
157
- while (attempts < maxAttempts && this.menuItems[prevIndex].disabled) {
200
+ while (attempts < maxAttempts && this.isItemDisabled(this.menuItems[prevIndex])) {
158
201
  prevIndex = prevIndex <= 0 ? this.menuItems.length - 1 : prevIndex - 1;
159
202
  attempts++;
160
203
  }
@@ -185,7 +228,7 @@ export class PdsDropdownMenu {
185
228
  if (this.menuItems.length > 0) {
186
229
  // Find first non-disabled item
187
230
  let firstIndex = 0;
188
- while (firstIndex < this.menuItems.length && this.menuItems[firstIndex].disabled) {
231
+ while (firstIndex < this.menuItems.length && this.isItemDisabled(this.menuItems[firstIndex])) {
189
232
  firstIndex++;
190
233
  }
191
234
  if (firstIndex < this.menuItems.length) {
@@ -198,7 +241,7 @@ export class PdsDropdownMenu {
198
241
  if (this.menuItems.length > 0) {
199
242
  // Find last non-disabled item
200
243
  let lastIndex = this.menuItems.length - 1;
201
- while (lastIndex >= 0 && this.menuItems[lastIndex].disabled) {
244
+ while (lastIndex >= 0 && this.isItemDisabled(this.menuItems[lastIndex])) {
202
245
  lastIndex--;
203
246
  }
204
247
  if (lastIndex >= 0) {
@@ -228,7 +271,7 @@ export class PdsDropdownMenu {
228
271
  event.preventDefault();
229
272
  // Find the first non-disabled item
230
273
  let firstFocusableIndex = 0;
231
- while (firstFocusableIndex < this.menuItems.length && this.menuItems[firstFocusableIndex].disabled) {
274
+ while (firstFocusableIndex < this.menuItems.length && this.isItemDisabled(this.menuItems[firstFocusableIndex])) {
232
275
  firstFocusableIndex++;
233
276
  }
234
277
  if (firstFocusableIndex < this.menuItems.length) {
@@ -240,7 +283,7 @@ export class PdsDropdownMenu {
240
283
  event.preventDefault();
241
284
  // Find the first non-disabled item
242
285
  let firstFocusableIndex = 0;
243
- while (firstFocusableIndex < this.menuItems.length && this.menuItems[firstFocusableIndex].disabled) {
286
+ while (firstFocusableIndex < this.menuItems.length && this.isItemDisabled(this.menuItems[firstFocusableIndex])) {
244
287
  firstFocusableIndex++;
245
288
  }
246
289
  if (firstFocusableIndex < this.menuItems.length) {
@@ -263,7 +306,7 @@ export class PdsDropdownMenu {
263
306
  }
264
307
  }
265
308
  render() {
266
- return (h(Host, { key: 'bedd78a69e84f10abb3c714c02227fa76e255a35', id: this.componentId }, h("slot", { key: 'd2bf56037a85679a677470d04865823966ca19d6', name: "trigger", onSlotchange: this.handleTriggerSlotChange }), h("pds-box", { key: '64f56896103bb6cca6c71020d3d37c375d300c40', "border-radius": "sm", display: "flex", direction: "column", class: "pds-dropdown-menu--panel is-hidden", shadow: "100", role: "menu", "aria-orientation": "vertical", part: "menu-panel" }, h("slot", { key: '0303160562f74fe9d32cc020c4539a7c8fc288a9', onSlotchange: this.handleSlotChange }))));
309
+ return (h(Host, { key: '3144bc264072eccf89cdca45a0b28eb004b5d06e', id: this.componentId }, h("slot", { key: '500288f266dc7ab7e1ac5070e628c31a6ed50861', name: "trigger", onSlotchange: this.handleTriggerSlotChange }), h("pds-box", { key: '4085130e381b8be28e2e36de073c0755a455e30c', "border-radius": "sm", display: "flex", direction: "column", class: "pds-dropdown-menu--panel is-hidden", shadow: "100", role: "menu", "aria-orientation": "vertical", part: "menu-panel" }, h("slot", { key: '2c4d53799576d1c6913df9bb854bfbaf50e5032c', onSlotchange: this.handleSlotChange }))));
267
310
  }
268
311
  static get is() { return "pds-dropdown-menu"; }
269
312
  static get encapsulation() { return "shadow"; }
@@ -1 +1 @@
1
- {"version":3,"file":"pds-dropdown-menu.js","sourceRoot":"","sources":["../../../../src/components/pds-dropdown-menu/pds-dropdown-menu.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAGjF,OAAO,EAAG,eAAe,EACvB,IAAI,EACJ,MAAM,EACN,KAAK,EACL,UAAU,GACX,MAAM,kBAAkB,CAAC;AAE1B;;GAEG;AAMH,MAAM,OAAO,eAAe;IAL5B;QASU,WAAM,GAAY,KAAK,CAAC;QACxB,cAAS,GAAqC,EAAE,CAAC;QACjD,sBAAiB,GAAwB,IAAI,CAAC;QAI7C,sBAAiB,GAAW,CAAC,CAAC,CAAC;QAOxC;;WAEG;QACK,cAAS,GAAkB,cAAc,CAAC;QAc1C,4BAAuB,GAAG,CAAC,KAAY,EAAE,EAAE;YACjD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAyB,CAAC;YAE9C,yCAAyC;YACzC,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAExD,IAAI,CAAC,SAAS,GAAG,gBAAgB,CAAC,CAAC,CAAgB,CAAC;YACpD,IAAI,CAAC,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC;YAE1C,0CAA0C;YAC1C,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;YACrD,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QACxD,CAAC,CAAA;QAEO,qBAAgB,GAAG,CAAC,KAAY,EAAE,EAAE;YAC1C,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAyB,CAAC;YAE9C,yCAAyC;YACzC,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAExD,8FAA8F;YAC9F,8CAA8C;YAC9C,MAAM,eAAe,GAAG,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,wBAAwB,IAAI,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,6BAA6B,CAAC,CAAC;YAC3K,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,KAAK,CAAC,gGAAgG,CAAC,CAAC;YACpH,CAAC;YAED,+CAA+C;YAC/C,IAAI,CAAC,SAAS,GAAG,gBAAgB,CAAC,MAAM,CACtC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,wBAAwB,CACxB,CAAC;QACxC,CAAC,CAAA;QAED,8BAA8B;QACtB,mBAAc,GAAG,GAAG,EAAE;YAC5B,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;YAE3B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,CAAC;QACH,CAAC,CAAA;QAED,oCAAoC;QAC5B,iBAAY,GAAG,GAAG,EAAE;;YAC1B,MAAM,cAAc,GAAG,GAAG,EAAE;gBAC1B,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAsB,EAAE;oBAC3D,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,QAAQ,EAAE,OAAO;oBACjB,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,CAAC,EAAC,OAAO,EAAE,CAAC,EAAC,CAAC,CAAC;iBACrD,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE;oBACnB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;wBAChC,IAAI,EAAE,GAAG,CAAC,IAAI;wBACd,GAAG,EAAE,GAAG,CAAC,IAAI;qBACd,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;YACL,CAAC,CAAC;YAEF,mBAAmB;YACnB,cAAc,EAAE,CAAC;YAEjB,kDAAkD;YAClD,IAAI,CAAC,iBAAiB,GAAG,UAAU,CACjC,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,OAAsB,EAC3B,cAAc,CACf,CAAC;YAEF,MAAA,IAAI,CAAC,IAAI,CAAC,UAAU,0CAAE,aAAa,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAC7E,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YAEnB,yBAAyB;YACzB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QACvD,CAAC,CAAA;QAED,qBAAqB;QACb,kBAAa,GAAG,GAAG,EAAE;;YAC3B,MAAA,IAAI,CAAC,IAAI,CAAC,UAAU,0CAAE,aAAa,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAC1E,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YAEpB,uBAAuB;YACvB,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC3B,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACzB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAChC,CAAC;YAED,yBAAyB;YACzB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;YAEtD,oBAAoB;YACpB,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC;YAE5B,0BAA0B;YAC1B,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACzB,CAAC,CAAA;QAED,sCAAsC;QAC9B,gBAAW,GAAG,GAAG,EAAE;YACzB,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,CAAC,CAAA;KA4MF;IA5TC,kBAAkB;;QAChB,IAAI,CAAC,OAAO,GAAG,MAAA,IAAI,CAAC,IAAI,CAAC,UAAU,0CAAE,aAAa,CAAC,SAAS,CAAsB,CAAC;IACrF,CAAC;IAED,oBAAoB;QAClB,0DAA0D;QAC1D,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAChC,CAAC;IACH,CAAC;IAwGD,mDAAmD;IAC3C,mBAAmB;QACzB,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAsD,CAAC;QACtF,IAAI,CAAC,aAAa;YAAE,OAAO,CAAC,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC;IAClE,CAAC;IAED,sCAAsC;IAC9B,gBAAgB,CAAC,KAAa;;QACpC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;YAChD,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;YAE/B,0DAA0D;YAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACvC,MAAM,WAAW,GAAG,MAAA,QAAQ,CAAC,UAAU,0CAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;YACjE,MAAM,SAAS,GAAG,MAAA,MAAA,MAAA,QAAQ,CAAC,UAAU,0CAAE,aAAa,CAAC,UAAU,CAAC,0CAAE,UAAU,0CAAE,aAAa,CAAC,GAAG,CAAC,CAAC;YAEjG,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO,WAAW,CAAC,KAAK,EAAE,CAAC;YAC7B,CAAC;iBAAM,IAAI,SAAS,EAAE,CAAC;gBACrB,OAAO,SAAS,CAAC,KAAK,EAAE,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACN,mEAAmE;gBACnE,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IAED,2BAA2B;IACnB,aAAa;QACnB,IAAI,SAAS,GAAG,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;QAErE,sBAAsB;QACtB,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;QAE1C,OAAO,QAAQ,GAAG,WAAW,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC;YACpE,SAAS,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;YACpD,QAAQ,EAAE,CAAC;QACb,CAAC;QAED,6CAA6C;QAC7C,IAAI,QAAQ,GAAG,WAAW,EAAE,CAAC;YAC3B,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,+BAA+B;IACvB,iBAAiB;QACvB,IAAI,SAAS,GAAG,IAAI,CAAC,iBAAiB,IAAI,CAAC;YACzC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;YAC3B,CAAC,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;QAE/B,sBAAsB;QACtB,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;QAE1C,OAAO,QAAQ,GAAG,WAAW,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC;YACpE,SAAS,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC;YACvE,QAAQ,EAAE,CAAC;QACb,CAAC;QAED,6CAA6C;QAC7C,IAAI,QAAQ,GAAG,WAAW,EAAE,CAAC;YAC3B,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,0CAA0C;IAE1C,aAAa,CAAC,KAAoB;QAChC,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEzB,QAAQ,KAAK,CAAC,GAAG,EAAE,CAAC;YAClB,KAAK,QAAQ;gBACX,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;YAER,KAAK,WAAW;gBACd,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM;YAER,KAAK,SAAS;gBACZ,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACzB,MAAM;YAER,KAAK,MAAM;gBACT,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC9B,+BAA+B;oBAC/B,IAAI,UAAU,GAAG,CAAC,CAAC;oBACnB,OAAO,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC;wBACjF,UAAU,EAAE,CAAC;oBACf,CAAC;oBACD,IAAI,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;wBACvC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;oBACpC,CAAC;gBACH,CAAC;gBACD,MAAM;YAER,KAAK,KAAK;gBACR,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC9B,8BAA8B;oBAC9B,IAAI,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;oBAC1C,OAAO,SAAS,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC;wBAC5D,SAAS,EAAE,CAAC;oBACd,CAAC;oBACD,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;wBACnB,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;oBACnC,CAAC;gBACH,CAAC;gBACD,MAAM;YAER,KAAK,KAAK;gBACR,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;oBACnB,8DAA8D;oBAC9D,6CAA6C;oBAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;oBAEhD,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;wBACrB,gEAAgE;wBAChE,KAAK,CAAC,cAAc,EAAE,CAAC;wBACvB,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,2CAA2C;oBACvE,CAAC;oBACD,0EAA0E;gBAC5E,CAAC;qBAAM,CAAC;oBACN,yBAAyB;oBACzB,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC;oBAC7C,MAAM,gBAAgB,GAAG,aAAa,KAAK,IAAI,CAAC,SAAS,CAAC;oBAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;oBAEhD,IAAI,gBAAgB,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAClD,8DAA8D;wBAC9D,KAAK,CAAC,cAAc,EAAE,CAAC;wBAEvB,mCAAmC;wBACnC,IAAI,mBAAmB,GAAG,CAAC,CAAC;wBAC5B,OAAO,mBAAmB,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE,CAAC;4BACnG,mBAAmB,EAAE,CAAC;wBACxB,CAAC;wBAED,IAAI,mBAAmB,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;4BAChD,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;wBAC7C,CAAC;oBACH,CAAC;yBAAM,IAAI,YAAY,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC5D,+DAA+D;wBAC/D,KAAK,CAAC,cAAc,EAAE,CAAC;wBAEvB,mCAAmC;wBACnC,IAAI,mBAAmB,GAAG,CAAC,CAAC;wBAC5B,OAAO,mBAAmB,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE,CAAC;4BACnG,mBAAmB,EAAE,CAAC;wBACxB,CAAC;wBAED,IAAI,mBAAmB,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;4BAChD,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;wBAC7C,CAAC;oBACH,CAAC;yBAAM,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;wBAC/B,2CAA2C;wBAC3C,KAAK,CAAC,cAAc,EAAE,CAAC;wBACvB,IAAI,CAAC,aAAa,EAAE,CAAC;oBACvB,CAAC;gBACH,CAAC;gBACD,MAAM;QACV,CAAC;IACH,CAAC;IAED,iDAAiD;IAEjD,iBAAiB,CAAC,KAAiB;QACjC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YAChG,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAGD,MAAM;QACJ,OAAO,CACL,EAAC,IAAI,qDAAC,EAAE,EAAE,IAAI,CAAC,WAAW;YACxB,6DACE,IAAI,EAAC,SAAS,EACd,YAAY,EAAE,IAAI,CAAC,uBAAuB,GACpC;YACR,iFACgB,IAAI,EAClB,OAAO,EAAC,MAAM,EACd,SAAS,EAAC,QAAQ,EAClB,KAAK,EAAC,oCAAoC,EAC1C,MAAM,EAAC,KAAK,EACZ,IAAI,EAAC,MAAM,sBACM,UAAU,EAC3B,IAAI,EAAC,YAAY;gBAEjB,6DAAM,YAAY,EAAE,IAAI,CAAC,gBAAgB,GAAS,CAC1C,CACL,CACR,CAAC;IACJ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CACF","sourcesContent":["import { Component, Element, Host, h, Prop, Listen, State } from '@stencil/core';\nimport type { BasePdsProps } from '@utils/interfaces';\nimport { PlacementType } from '@utils/types';\nimport { computePosition,\n flip,\n offset,\n shift,\n autoUpdate,\n} from '@floating-ui/dom';\n\n/**\n * @part menu-panel - Exposes the dropdown menu container for styling.\n */\n@Component({\n tag: 'pds-dropdown-menu',\n styleUrl: 'pds-dropdown-menu.scss',\n shadow: true,\n})\nexport class PdsDropdownMenu implements BasePdsProps {\n private slotEl: HTMLSlotElement;\n private triggerEl: HTMLElement;\n private panelEl: HTMLPdsBoxElement;\n private isOpen: boolean = false;\n private menuItems: HTMLPdsDropdownMenuItemElement[] = [];\n private cleanupAutoUpdate: (() => void) | null = null;\n\n @Element() host: HTMLPdsDropdownMenuElement;\n\n @State() currentFocusIndex: number = -1;\n\n /**\n * A unique identifier used for the underlying component `id` attribute.\n */\n @Prop() componentId: string;\n\n /**\n * The placement of the dropdown panel relative to the trigger.\n */\n @Prop() placement: PlacementType = 'bottom-start';\n\n componentDidRender() {\n this.panelEl = this.host.shadowRoot?.querySelector('pds-box') as HTMLPdsBoxElement;\n }\n\n disconnectedCallback() {\n // Clean up auto-update when component is removed from DOM\n if (this.cleanupAutoUpdate) {\n this.cleanupAutoUpdate();\n this.cleanupAutoUpdate = null;\n }\n }\n\n private handleTriggerSlotChange = (event: Event) => {\n this.slotEl = event.target as HTMLSlotElement;\n\n // Get all elements assigned to this slot\n const assignedElements = this.slotEl.assignedElements();\n\n this.triggerEl = assignedElements[0] as HTMLElement;\n this.triggerEl.onclick = this.handleClick;\n\n // Add accessibility attributes to trigger\n this.triggerEl.setAttribute('aria-haspopup', 'menu');\n this.triggerEl.setAttribute('aria-expanded', 'false');\n }\n\n private handleSlotChange = (event: Event) => {\n this.slotEl = event.target as HTMLSlotElement;\n\n // Get all elements assigned to this slot\n const assignedElements = this.slotEl.assignedElements();\n\n // ensure assignedElements only contains pds-dropdown-menu-item or pds-dropdown-menu-separator\n // if there are other elements, throw an error\n const invalidElements = assignedElements.filter(el => el.tagName.toLowerCase() !== 'pds-dropdown-menu-item' && el.tagName.toLowerCase() !== 'pds-dropdown-menu-separator');\n if (invalidElements.length > 0) {\n throw new Error(`pds-dropdown-menu only accepts pds-dropdown-menu-item and pds-dropdown-menu-separator elements`);\n }\n\n // Store all menu items for keyboard navigation\n this.menuItems = assignedElements.filter(\n el => el.tagName.toLowerCase() === 'pds-dropdown-menu-item'\n ) as HTMLPdsDropdownMenuItemElement[];\n }\n\n // Toggle dropdown open/closed\n private toggleDropdown = () => {\n this.isOpen = !this.isOpen;\n\n if (this.isOpen) {\n this.openDropdown();\n } else {\n this.closeDropdown();\n }\n }\n\n // Open the dropdown and position it\n private openDropdown = () => {\n const updatePosition = () => {\n computePosition(this.triggerEl, this.panelEl as HTMLElement, {\n placement: this.placement,\n strategy: 'fixed',\n middleware: [offset(6), flip(), shift({padding: 5})],\n }).then(({ x, y }) => {\n Object.assign(this.panelEl.style, {\n left: `${x}px`,\n top: `${y}px`,\n });\n });\n };\n\n // Initial position\n updatePosition();\n\n // Set up auto-update for window resize and scroll\n this.cleanupAutoUpdate = autoUpdate(\n this.triggerEl,\n this.panelEl as HTMLElement,\n updatePosition\n );\n\n this.host.shadowRoot?.querySelector('pds-box').classList.remove('is-hidden');\n this.isOpen = true;\n\n // Update ARIA attributes\n this.triggerEl.setAttribute('aria-expanded', 'true');\n }\n\n // Close the dropdown\n private closeDropdown = () => {\n this.host.shadowRoot?.querySelector('pds-box').classList.add('is-hidden');\n this.isOpen = false;\n\n // Clean up auto-update\n if (this.cleanupAutoUpdate) {\n this.cleanupAutoUpdate();\n this.cleanupAutoUpdate = null;\n }\n\n // Update ARIA attributes\n this.triggerEl.setAttribute('aria-expanded', 'false');\n\n // Reset focus index\n this.currentFocusIndex = -1;\n\n // Return focus to trigger\n this.triggerEl.focus();\n }\n\n // Handle click on the trigger element\n private handleClick = () => {\n this.toggleDropdown();\n }\n\n // Get the index of the currently focused menu item\n private getFocusedItemIndex(): number {\n const activeElement = document.activeElement as HTMLPdsDropdownMenuItemElement | null;\n if (!activeElement) return -1;\n return this.menuItems.findIndex(item => item === activeElement);\n }\n\n // Focus a specific menu item by index\n private focusItemByIndex(index: number): void {\n if (index >= 0 && index < this.menuItems.length) {\n this.currentFocusIndex = index;\n\n // Focus the inner button/link instead of the host element\n const menuItem = this.menuItems[index];\n const innerButton = menuItem.shadowRoot?.querySelector('button');\n const innerLink = menuItem.shadowRoot?.querySelector('pds-link')?.shadowRoot?.querySelector('a');\n\n if (innerButton) {\n return innerButton.focus();\n } else if (innerLink) {\n return innerLink.focus();\n } else {\n // Fallback to focusing the host if we can't find the inner element\n menuItem.focus();\n }\n }\n }\n\n // Focus the next menu item\n private focusNextItem(): void {\n let nextIndex = (this.currentFocusIndex + 1) % this.menuItems.length;\n\n // Skip disabled items\n let attempts = 0;\n const maxAttempts = this.menuItems.length;\n\n while (attempts < maxAttempts && this.menuItems[nextIndex].disabled) {\n nextIndex = (nextIndex + 1) % this.menuItems.length;\n attempts++;\n }\n\n // Only focus if we found a non-disabled item\n if (attempts < maxAttempts) {\n this.focusItemByIndex(nextIndex);\n }\n }\n\n // Focus the previous menu item\n private focusPreviousItem(): void {\n let prevIndex = this.currentFocusIndex <= 0\n ? this.menuItems.length - 1\n : this.currentFocusIndex - 1;\n\n // Skip disabled items\n let attempts = 0;\n const maxAttempts = this.menuItems.length;\n\n while (attempts < maxAttempts && this.menuItems[prevIndex].disabled) {\n prevIndex = prevIndex <= 0 ? this.menuItems.length - 1 : prevIndex - 1;\n attempts++;\n }\n\n // Only focus if we found a non-disabled item\n if (attempts < maxAttempts) {\n this.focusItemByIndex(prevIndex);\n }\n }\n\n // Handle keyboard events for the dropdown\n @Listen('keydown', { target: 'window' })\n handleKeyDown(event: KeyboardEvent) {\n if (!this.isOpen) return;\n\n switch (event.key) {\n case 'Escape':\n event.preventDefault();\n this.closeDropdown();\n break;\n\n case 'ArrowDown':\n event.preventDefault();\n this.focusNextItem();\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n this.focusPreviousItem();\n break;\n\n case 'Home':\n event.preventDefault();\n if (this.menuItems.length > 0) {\n // Find first non-disabled item\n let firstIndex = 0;\n while (firstIndex < this.menuItems.length && this.menuItems[firstIndex].disabled) {\n firstIndex++;\n }\n if (firstIndex < this.menuItems.length) {\n this.focusItemByIndex(firstIndex);\n }\n }\n break;\n\n case 'End':\n event.preventDefault();\n if (this.menuItems.length > 0) {\n // Find last non-disabled item\n let lastIndex = this.menuItems.length - 1;\n while (lastIndex >= 0 && this.menuItems[lastIndex].disabled) {\n lastIndex--;\n }\n if (lastIndex >= 0) {\n this.focusItemByIndex(lastIndex);\n }\n }\n break;\n\n case 'Tab':\n if (event.shiftKey) {\n // Let Shift+Tab navigate naturally from first item to trigger\n // For all other items, move to previous item\n const currentIndex = this.getFocusedItemIndex();\n\n if (currentIndex > 0) {\n // If not on first item, prevent default and go to previous item\n event.preventDefault();\n this.focusPreviousItem(); // Use our method that skips disabled items\n }\n // If on first item or no item, let natural tab order move back to trigger\n } else {\n // Forward Tab navigation\n const activeElement = document.activeElement;\n const isTriggerFocused = activeElement === this.triggerEl;\n const currentIndex = this.getFocusedItemIndex();\n\n if (isTriggerFocused && this.menuItems.length > 0) {\n // If trigger is focused, move to first non-disabled menu item\n event.preventDefault();\n\n // Find the first non-disabled item\n let firstFocusableIndex = 0;\n while (firstFocusableIndex < this.menuItems.length && this.menuItems[firstFocusableIndex].disabled) {\n firstFocusableIndex++;\n }\n\n if (firstFocusableIndex < this.menuItems.length) {\n this.focusItemByIndex(firstFocusableIndex);\n }\n } else if (currentIndex === -1 && this.menuItems.length > 0) {\n // If no menu item is focused, focus the first non-disabled one\n event.preventDefault();\n\n // Find the first non-disabled item\n let firstFocusableIndex = 0;\n while (firstFocusableIndex < this.menuItems.length && this.menuItems[firstFocusableIndex].disabled) {\n firstFocusableIndex++;\n }\n\n if (firstFocusableIndex < this.menuItems.length) {\n this.focusItemByIndex(firstFocusableIndex);\n }\n } else if (currentIndex !== -1) {\n // Use our method that skips disabled items\n event.preventDefault();\n this.focusNextItem();\n }\n }\n break;\n }\n }\n\n // Handle clicks outside the dropdown to close it\n @Listen('click', { target: 'window' })\n handleWindowClick(event: MouseEvent) {\n if (this.isOpen && !this.host.contains(event.target as Node) && event.target !== this.triggerEl) {\n this.closeDropdown();\n }\n }\n\n\n render() {\n return (\n <Host id={this.componentId}>\n <slot\n name=\"trigger\"\n onSlotchange={this.handleTriggerSlotChange}\n ></slot>\n <pds-box\n border-radius=\"sm\"\n display=\"flex\"\n direction=\"column\"\n class=\"pds-dropdown-menu--panel is-hidden\"\n shadow=\"100\"\n role=\"menu\"\n aria-orientation=\"vertical\"\n part=\"menu-panel\"\n >\n <slot onSlotchange={this.handleSlotChange}></slot>\n </pds-box>\n </Host>\n );\n }\n}\n"]}
1
+ {"version":3,"file":"pds-dropdown-menu.js","sourceRoot":"","sources":["../../../../src/components/pds-dropdown-menu/pds-dropdown-menu.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, Element, Host, h, Prop, Listen, State } from '@stencil/core';\nimport type { BasePdsProps } from '@utils/interfaces';\nimport { PlacementType } from '@utils/types';\nimport { computePosition,\n flip,\n offset,\n shift,\n autoUpdate,\n} from '@floating-ui/dom';\n\n/**\n * Union type for focusable menu items (component or raw elements)\n */\ntype MenuItemElement = HTMLPdsDropdownMenuItemElement | HTMLAnchorElement | HTMLButtonElement;\n\n/**\n * @part menu-panel - Exposes the dropdown menu container for styling.\n */\n@Component({\n tag: 'pds-dropdown-menu',\n styleUrl: 'pds-dropdown-menu.scss',\n shadow: true,\n})\nexport class PdsDropdownMenu implements BasePdsProps {\n private slotEl: HTMLSlotElement;\n private triggerEl: HTMLElement;\n private panelEl: HTMLPdsBoxElement;\n private isOpen: boolean = false;\n private menuItems: MenuItemElement[] = [];\n private cleanupAutoUpdate: (() => void) | null = null;\n\n @Element() host: HTMLPdsDropdownMenuElement;\n\n @State() currentFocusIndex: number = -1;\n\n /**\n * A unique identifier used for the underlying component `id` attribute.\n */\n @Prop() componentId: string;\n\n /**\n * The placement of the dropdown panel relative to the trigger.\n */\n @Prop() placement: PlacementType = 'bottom-start';\n\n componentDidRender() {\n this.panelEl = this.host.shadowRoot?.querySelector('pds-box') as HTMLPdsBoxElement;\n }\n\n disconnectedCallback() {\n // Clean up auto-update when component is removed from DOM\n if (this.cleanupAutoUpdate) {\n this.cleanupAutoUpdate();\n this.cleanupAutoUpdate = null;\n }\n }\n\n private handleTriggerSlotChange = (event: Event) => {\n this.slotEl = event.target as HTMLSlotElement;\n\n // Get all elements assigned to this slot\n const assignedElements = this.slotEl.assignedElements();\n\n this.triggerEl = assignedElements[0] as HTMLElement;\n this.triggerEl.onclick = this.handleClick;\n\n // Add accessibility attributes to trigger\n this.triggerEl.setAttribute('aria-haspopup', 'menu');\n this.triggerEl.setAttribute('aria-expanded', 'false');\n }\n\n private handleSlotChange = (event: Event) => {\n this.slotEl = event.target as HTMLSlotElement;\n\n // Get all elements assigned to this slot\n const assignedElements = this.slotEl.assignedElements();\n\n // Allowed elements: pds-dropdown-menu-item, pds-dropdown-menu-separator, <a>, <button>\n // Raw <a> and <button> elements are allowed for edge cases requiring native browser/framework\n // behavior (e.g., Rails UJS, Turbo) that cannot work through Shadow DOM.\n const allowedTags = ['pds-dropdown-menu-item', 'pds-dropdown-menu-separator', 'a', 'button'];\n const invalidElements = assignedElements.filter(\n el => !allowedTags.includes(el.tagName.toLowerCase())\n );\n\n if (invalidElements.length > 0) {\n const invalidTags = invalidElements.map(el => el.tagName.toLowerCase()).join(', ');\n console.warn(\n `pds-dropdown-menu: Unexpected element(s) found: ${invalidTags}. ` +\n `Expected: ${allowedTags.join(', ')}`\n );\n }\n\n // Store all focusable items for keyboard navigation\n // This includes pds-dropdown-menu-item components and raw <a>/<button> elements\n this.menuItems = assignedElements.filter(el => {\n const tag = el.tagName.toLowerCase();\n return tag === 'pds-dropdown-menu-item' || tag === 'a' || tag === 'button';\n }) as MenuItemElement[];\n }\n\n // Toggle dropdown open/closed\n private toggleDropdown = () => {\n this.isOpen = !this.isOpen;\n\n if (this.isOpen) {\n this.openDropdown();\n } else {\n this.closeDropdown();\n }\n }\n\n // Open the dropdown and position it\n private openDropdown = () => {\n const updatePosition = () => {\n computePosition(this.triggerEl, this.panelEl as HTMLElement, {\n placement: this.placement,\n strategy: 'fixed',\n middleware: [offset(6), flip(), shift({padding: 5})],\n }).then(({ x, y }) => {\n Object.assign(this.panelEl.style, {\n left: `${x}px`,\n top: `${y}px`,\n });\n });\n };\n\n // Initial position\n updatePosition();\n\n // Set up auto-update for window resize and scroll\n this.cleanupAutoUpdate = autoUpdate(\n this.triggerEl,\n this.panelEl as HTMLElement,\n updatePosition\n );\n\n this.host.shadowRoot?.querySelector('pds-box').classList.remove('is-hidden');\n this.isOpen = true;\n\n // Update ARIA attributes\n this.triggerEl.setAttribute('aria-expanded', 'true');\n }\n\n // Close the dropdown\n private closeDropdown = () => {\n this.host.shadowRoot?.querySelector('pds-box').classList.add('is-hidden');\n this.isOpen = false;\n\n // Clean up auto-update\n if (this.cleanupAutoUpdate) {\n this.cleanupAutoUpdate();\n this.cleanupAutoUpdate = null;\n }\n\n // Update ARIA attributes\n this.triggerEl.setAttribute('aria-expanded', 'false');\n\n // Reset focus index\n this.currentFocusIndex = -1;\n\n // Return focus to trigger\n this.triggerEl.focus();\n }\n\n // Handle click on the trigger element\n private handleClick = () => {\n this.toggleDropdown();\n }\n\n // Check if a menu item is disabled (handles both component and raw elements)\n private isItemDisabled(item: MenuItemElement): boolean {\n const tagName = item.tagName.toLowerCase();\n\n if (tagName === 'pds-dropdown-menu-item') {\n return (item as HTMLPdsDropdownMenuItemElement).disabled;\n } else if (tagName === 'button') {\n return (item as HTMLButtonElement).disabled;\n } else if (tagName === 'a') {\n return item.getAttribute('aria-disabled') === 'true';\n }\n return false;\n }\n\n // Get the index of the currently focused menu item\n private getFocusedItemIndex(): number {\n const activeElement = document.activeElement as MenuItemElement | null;\n if (!activeElement) return -1;\n\n // For raw elements, check direct match\n // For pds-dropdown-menu-item, also check if the active element is inside the shadow root\n return this.menuItems.findIndex(item => {\n if (item === activeElement) return true;\n\n // Check if activeElement is inside the item's shadow root (for pds-dropdown-menu-item)\n if (item.tagName.toLowerCase() === 'pds-dropdown-menu-item') {\n const shadowRoot = (item as HTMLPdsDropdownMenuItemElement).shadowRoot;\n if (shadowRoot?.contains(activeElement)) return true;\n }\n\n return false;\n });\n }\n\n // Focus a specific menu item by index\n private focusItemByIndex(index: number): void {\n if (index >= 0 && index < this.menuItems.length) {\n this.currentFocusIndex = index;\n const item = this.menuItems[index];\n const tagName = item.tagName.toLowerCase();\n\n if (tagName === 'pds-dropdown-menu-item') {\n // For pds-dropdown-menu-item, focus the inner element\n const menuItem = item as HTMLPdsDropdownMenuItemElement;\n const innerButton = menuItem.shadowRoot?.querySelector('button');\n const innerLink = menuItem.shadowRoot?.querySelector('pds-link')?.shadowRoot?.querySelector('a')\n || menuItem.shadowRoot?.querySelector('a');\n\n if (innerButton) {\n innerButton.focus();\n } else if (innerLink) {\n innerLink.focus();\n } else {\n // Fallback to focusing the host\n menuItem.focus();\n }\n } else {\n // For raw <a> or <button> elements, focus directly\n (item as HTMLElement).focus();\n }\n }\n }\n\n // Focus the next menu item\n private focusNextItem(): void {\n let nextIndex = (this.currentFocusIndex + 1) % this.menuItems.length;\n\n // Skip disabled items\n let attempts = 0;\n const maxAttempts = this.menuItems.length;\n\n while (attempts < maxAttempts && this.isItemDisabled(this.menuItems[nextIndex])) {\n nextIndex = (nextIndex + 1) % this.menuItems.length;\n attempts++;\n }\n\n // Only focus if we found a non-disabled item\n if (attempts < maxAttempts) {\n this.focusItemByIndex(nextIndex);\n }\n }\n\n // Focus the previous menu item\n private focusPreviousItem(): void {\n let prevIndex = this.currentFocusIndex <= 0\n ? this.menuItems.length - 1\n : this.currentFocusIndex - 1;\n\n // Skip disabled items\n let attempts = 0;\n const maxAttempts = this.menuItems.length;\n\n while (attempts < maxAttempts && this.isItemDisabled(this.menuItems[prevIndex])) {\n prevIndex = prevIndex <= 0 ? this.menuItems.length - 1 : prevIndex - 1;\n attempts++;\n }\n\n // Only focus if we found a non-disabled item\n if (attempts < maxAttempts) {\n this.focusItemByIndex(prevIndex);\n }\n }\n\n // Handle keyboard events for the dropdown\n @Listen('keydown', { target: 'window' })\n handleKeyDown(event: KeyboardEvent) {\n if (!this.isOpen) return;\n\n switch (event.key) {\n case 'Escape':\n event.preventDefault();\n this.closeDropdown();\n break;\n\n case 'ArrowDown':\n event.preventDefault();\n this.focusNextItem();\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n this.focusPreviousItem();\n break;\n\n case 'Home':\n event.preventDefault();\n if (this.menuItems.length > 0) {\n // Find first non-disabled item\n let firstIndex = 0;\n while (firstIndex < this.menuItems.length && this.isItemDisabled(this.menuItems[firstIndex])) {\n firstIndex++;\n }\n if (firstIndex < this.menuItems.length) {\n this.focusItemByIndex(firstIndex);\n }\n }\n break;\n\n case 'End':\n event.preventDefault();\n if (this.menuItems.length > 0) {\n // Find last non-disabled item\n let lastIndex = this.menuItems.length - 1;\n while (lastIndex >= 0 && this.isItemDisabled(this.menuItems[lastIndex])) {\n lastIndex--;\n }\n if (lastIndex >= 0) {\n this.focusItemByIndex(lastIndex);\n }\n }\n break;\n\n case 'Tab':\n if (event.shiftKey) {\n // Let Shift+Tab navigate naturally from first item to trigger\n // For all other items, move to previous item\n const currentIndex = this.getFocusedItemIndex();\n\n if (currentIndex > 0) {\n // If not on first item, prevent default and go to previous item\n event.preventDefault();\n this.focusPreviousItem(); // Use our method that skips disabled items\n }\n // If on first item or no item, let natural tab order move back to trigger\n } else {\n // Forward Tab navigation\n const activeElement = document.activeElement;\n const isTriggerFocused = activeElement === this.triggerEl;\n const currentIndex = this.getFocusedItemIndex();\n\n if (isTriggerFocused && this.menuItems.length > 0) {\n // If trigger is focused, move to first non-disabled menu item\n event.preventDefault();\n\n // Find the first non-disabled item\n let firstFocusableIndex = 0;\n while (firstFocusableIndex < this.menuItems.length && this.isItemDisabled(this.menuItems[firstFocusableIndex])) {\n firstFocusableIndex++;\n }\n\n if (firstFocusableIndex < this.menuItems.length) {\n this.focusItemByIndex(firstFocusableIndex);\n }\n } else if (currentIndex === -1 && this.menuItems.length > 0) {\n // If no menu item is focused, focus the first non-disabled one\n event.preventDefault();\n\n // Find the first non-disabled item\n let firstFocusableIndex = 0;\n while (firstFocusableIndex < this.menuItems.length && this.isItemDisabled(this.menuItems[firstFocusableIndex])) {\n firstFocusableIndex++;\n }\n\n if (firstFocusableIndex < this.menuItems.length) {\n this.focusItemByIndex(firstFocusableIndex);\n }\n } else if (currentIndex !== -1) {\n // Use our method that skips disabled items\n event.preventDefault();\n this.focusNextItem();\n }\n }\n break;\n }\n }\n\n // Handle clicks outside the dropdown to close it\n @Listen('click', { target: 'window' })\n handleWindowClick(event: MouseEvent) {\n if (this.isOpen && !this.host.contains(event.target as Node) && event.target !== this.triggerEl) {\n this.closeDropdown();\n }\n }\n\n\n render() {\n return (\n <Host id={this.componentId}>\n <slot\n name=\"trigger\"\n onSlotchange={this.handleTriggerSlotChange}\n ></slot>\n <pds-box\n border-radius=\"sm\"\n display=\"flex\"\n direction=\"column\"\n class=\"pds-dropdown-menu--panel is-hidden\"\n shadow=\"100\"\n role=\"menu\"\n aria-orientation=\"vertical\"\n part=\"menu-panel\"\n >\n <slot onSlotchange={this.handleSlotChange}></slot>\n </pds-box>\n </Host>\n );\n }\n}\n"]}
@@ -284,4 +284,14 @@
284
284
  position: absolute;
285
285
  white-space: nowrap;
286
286
  width: 1px;
287
+ }
288
+
289
+ .pds-input__field::-webkit-search-cancel-button {
290
+ appearance: none;
291
+ background-color: var(--pds-input-placeholder-color);
292
+ cursor: pointer;
293
+ height: var(--pine-dimension-sm);
294
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3.646 3.646a.5.5 0 0 1 .708 0L8 7.293l3.646-3.647a.5.5 0 0 1 .708.708L8.707 8l3.647 3.646a.5.5 0 0 1-.708.708L8 8.707l-3.646 3.647a.5.5 0 0 1-.708-.708L7.293 8 3.646 4.354a.5.5 0 0 1 0-.708'/%3E%3C/svg%3E");
295
+ mask-size: contain;
296
+ width: var(--pine-dimension-sm);
287
297
  }
@@ -71,6 +71,14 @@ Email.args = {
71
71
  value: 'user123@test.com'
72
72
  };
73
73
 
74
+ export const Search = BaseTemplate.bind({});
75
+ Search.args = {
76
+ componentId: 'pds-input-search-example',
77
+ label: 'Search',
78
+ type: 'search',
79
+ placeholder: 'Search...',
80
+ };
81
+
74
82
  export const Required = BaseTemplate.bind({});
75
83
  Required.args = {
76
84
  componentId: 'pds-input-required-example',
@@ -73,6 +73,10 @@ export class PdsMultiselect {
73
73
  this.creating = false;
74
74
  // Flag to prevent focusout from closing during open transition
75
75
  this.isOpening = false;
76
+ // Flag to track if initial async fetch has been triggered (prevents double fetch)
77
+ this.initialAsyncFetchTriggered = false;
78
+ // Flag to track if value changed during loading and needs resolution after fetch completes
79
+ this.pendingUnresolvedFetch = false;
76
80
  this.handleTriggerClick = () => {
77
81
  if (this.disabled)
78
82
  return;
@@ -196,6 +200,12 @@ export class PdsMultiselect {
196
200
  this.updateOptionsFromSlot();
197
201
  this.syncSelectedItems();
198
202
  });
203
+ // If we have preselected values and asyncUrl, fetch options to resolve them
204
+ // This ensures the trigger shows "X items" instead of placeholder on initial render
205
+ if (this.asyncUrl && this.ensureValueArray().length > 0) {
206
+ this.initialAsyncFetchTriggered = true;
207
+ this.fetchOptions('', 1);
208
+ }
199
209
  }
200
210
  setupSlotChangeListener() {
201
211
  var _a;
@@ -239,6 +249,21 @@ export class PdsMultiselect {
239
249
  }
240
250
  this.syncSelectedItems();
241
251
  this.updateFormValue();
252
+ // If using asyncUrl and some values couldn't be resolved, fetch options
253
+ // This handles programmatic value changes where the options aren't loaded yet
254
+ if (this.asyncUrl) {
255
+ const valueArray = this.ensureValueArray();
256
+ const hasUnresolvedValues = valueArray.length > 0 && this.selectedItems.length < valueArray.length;
257
+ if (hasUnresolvedValues) {
258
+ if (this.loading) {
259
+ // Mark that we need to re-check after current fetch completes
260
+ this.pendingUnresolvedFetch = true;
261
+ }
262
+ else {
263
+ this.fetchOptions('', 1);
264
+ }
265
+ }
266
+ }
242
267
  }
243
268
  optionsChanged() {
244
269
  if (this.options) {
@@ -507,6 +532,15 @@ export class PdsMultiselect {
507
532
  }
508
533
  finally {
509
534
  this.loading = false;
535
+ // Check if value changed during loading and still has unresolved values
536
+ if (this.pendingUnresolvedFetch) {
537
+ this.pendingUnresolvedFetch = false;
538
+ const valueArray = this.ensureValueArray();
539
+ const hasUnresolvedValues = valueArray.length > 0 && this.selectedItems.length < valueArray.length;
540
+ if (hasUnresolvedValues) {
541
+ this.fetchOptions('', 1);
542
+ }
543
+ }
510
544
  }
511
545
  }
512
546
  async createOption(query) {
@@ -574,10 +608,12 @@ export class PdsMultiselect {
574
608
  this.isOpening = true;
575
609
  this.isOpen = true;
576
610
  this.highlightedIndex = -1;
577
- // Trigger initial fetch if async
578
- if (this.asyncUrl && this.internalOptions.length === 0) {
611
+ // Trigger initial fetch if async (skip if already fetching from componentDidLoad)
612
+ if (this.asyncUrl && this.internalOptions.length === 0 && !this.initialAsyncFetchTriggered) {
579
613
  this.debouncedFetchAsyncOptions(this.searchQuery, 1);
580
614
  }
615
+ // Reset the flag so subsequent opens can fetch if needed
616
+ this.initialAsyncFetchTriggered = false;
581
617
  requestAnimationFrame(() => {
582
618
  var _a;
583
619
  this.positionDropdown();
@@ -716,19 +752,19 @@ export class PdsMultiselect {
716
752
  }
717
753
  render() {
718
754
  const hasSelections = this.selectedItems.length > 0;
719
- return (h(Host, { key: '552af362e30da7a9229d50e6343d3f52749231aa', "aria-disabled": this.disabled ? 'true' : null }, h("div", { key: '8e43625030b590c3a206e50c217d4b5ae3c1092d', class: "pds-multiselect" }, this.label && (h("label", { key: 'f748c465048e006a112df3ed17d9d20f3da81cf9', htmlFor: this.componentId, class: {
755
+ return (h(Host, { key: '52253faa88bce1a67e657e160b2d260ff92bc28b', "aria-disabled": this.disabled ? 'true' : null }, h("div", { key: '43f73781a96bd421b7079984aaf4e1905a2ec29e', class: "pds-multiselect" }, this.label && (h("label", { key: '926e23ac24621da0af4336bfc64b9d4a6d44579b', htmlFor: this.componentId, class: {
720
756
  'pds-multiselect__label': true,
721
757
  'visually-hidden': this.hideLabel,
722
- } }, this.label)), h("div", { key: '8ce7471effdb7b3b7a12fa789f7d9f22a6759cc4', class: "pds-multiselect__wrapper", ref: el => (this.containerEl = el), onFocusout: this.handleContainerFocusOut, style: { width: this.triggerWidth } }, h("button", { key: '64aae33e2de6801160f2739ef1d8801491f0641b', ref: el => (this.triggerEl = el), type: "button", class: {
758
+ } }, this.label)), h("div", { key: '5051808a8b883ee8b5e7e3acef927091f206aaaf', class: "pds-multiselect__wrapper", ref: el => (this.containerEl = el), onFocusout: this.handleContainerFocusOut, style: { width: this.triggerWidth } }, h("button", { key: '4590bd41e14927fc9d652e0920b0cd7900bf4b1a', ref: el => (this.triggerEl = el), type: "button", class: {
723
759
  'pds-multiselect__trigger': true,
724
760
  'pds-multiselect__trigger--open': this.isOpen,
725
761
  'pds-multiselect__trigger--disabled': this.disabled,
726
762
  'pds-multiselect__trigger--invalid': this.invalid || !!this.errorMessage,
727
763
  'pds-multiselect__trigger--has-value': hasSelections,
728
- }, id: this.componentId, disabled: this.disabled, "aria-required": this.required ? 'true' : undefined, "aria-expanded": this.isOpen ? 'true' : 'false', "aria-haspopup": "listbox", "aria-describedby": assignDescription(this.componentId, this.invalid || !!this.errorMessage, this.errorMessage || this.helperMessage), "aria-invalid": this.invalid || !!this.errorMessage ? 'true' : undefined, onClick: this.handleTriggerClick, onKeyDown: this.handleTriggerKeyDown }, h("span", { key: '3294e7e1e04b0e168196b6913403e322b9210953', class: {
764
+ }, id: this.componentId, disabled: this.disabled, "aria-required": this.required ? 'true' : undefined, "aria-expanded": this.isOpen ? 'true' : 'false', "aria-haspopup": "listbox", "aria-describedby": assignDescription(this.componentId, this.invalid || !!this.errorMessage, this.errorMessage || this.helperMessage), "aria-invalid": this.invalid || !!this.errorMessage ? 'true' : undefined, onClick: this.handleTriggerClick, onKeyDown: this.handleTriggerKeyDown }, h("span", { key: '3033d029f02288071a16b2ef4a5399bb4b86ae7e', class: {
729
765
  'pds-multiselect__trigger-text': true,
730
766
  'pds-multiselect__trigger-text--placeholder': !hasSelections,
731
- } }, this.getTriggerText()), h("pds-icon", { key: '318ee17e3731f8676322c865fe91482a846970eb', class: "pds-multiselect__icon", icon: enlarge })), this.renderDropdown()), this.helperMessage && !(this.errorMessage && this.errorMessage.length > 0) && (h("p", { key: '0f253ea03ed0e16ec70d2faeb9b166a92509ba29', class: "pds-multiselect__helper", id: messageId(this.componentId, 'helper') }, this.helperMessage)), this.errorMessage && (h("p", { key: '3f0ffb6a0863002bec8d255d7366c7ce7bebb4f2', class: "pds-multiselect__error", id: messageId(this.componentId, 'error') }, h("pds-icon", { key: 'a2397bb89433fc25908f38ff07946c4267d03da9', icon: danger, size: "small" }), this.errorMessage)), h("div", { key: '5db799f7960eed966dd39354879d681f69dcdc2f', style: { display: 'none' } }, h("slot", { key: '3b46f861517369ab3dfe3105b469fab73d36df61' })))));
767
+ } }, this.getTriggerText()), h("pds-icon", { key: '4d971d7a95e5e47c9141a6614f71b194bfa74dfb', class: "pds-multiselect__icon", icon: enlarge })), this.renderDropdown()), this.helperMessage && !(this.errorMessage && this.errorMessage.length > 0) && (h("p", { key: '3571fafc7c78f785ccd7a1a8d73675b5e33fa317', class: "pds-multiselect__helper", id: messageId(this.componentId, 'helper') }, this.helperMessage)), this.errorMessage && (h("p", { key: '4acd308de067093578520a4ec85f299960f6e2c0', class: "pds-multiselect__error", id: messageId(this.componentId, 'error') }, h("pds-icon", { key: 'a4cdf56804b77e474b9c757512ed6da54ddc5535', icon: danger, size: "small" }), this.errorMessage)), h("div", { key: '10eac87a742d793b3f4e3acb55bbe469b547e3d3', style: { display: 'none' } }, h("slot", { key: '1d55851a6f4a35f86684af5be7b6c840c2ed083b' })))));
732
768
  }
733
769
  static get is() { return "pds-multiselect"; }
734
770
  static get encapsulation() { return "shadow"; }