q2-tecton-elements 1.27.1 → 1.28.0

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 (156) hide show
  1. package/dist/cjs/click-elsewhere_2.cjs.entry.js +258 -0
  2. package/dist/cjs/{index-ffd19146.js → index-7a73e106.js} +12 -52
  3. package/dist/cjs/loader.cjs.js +1 -1
  4. package/dist/cjs/q2-action-sheet.cjs.entry.js +1 -1
  5. package/dist/cjs/q2-badge_2.cjs.entry.js +1 -1
  6. package/dist/cjs/q2-btn_2.cjs.entry.js +1 -1
  7. package/dist/cjs/q2-calendar.cjs.entry.js +128 -83
  8. package/dist/cjs/q2-card.cjs.entry.js +1 -1
  9. package/dist/cjs/q2-carousel-pane.cjs.entry.js +1 -1
  10. package/dist/cjs/q2-carousel.cjs.entry.js +1 -1
  11. package/dist/cjs/q2-chart-area.cjs.entry.js +1 -1
  12. package/dist/cjs/q2-chart-bar.cjs.entry.js +1 -1
  13. package/dist/cjs/q2-chart-donut.cjs.entry.js +1 -1
  14. package/dist/cjs/q2-checkbox-group.cjs.entry.js +1 -1
  15. package/dist/cjs/q2-checkbox.cjs.entry.js +1 -1
  16. package/dist/cjs/q2-dropdown-item.cjs.entry.js +1 -1
  17. package/dist/cjs/q2-dropdown.cjs.entry.js +44 -45
  18. package/dist/cjs/q2-editable-field.cjs.entry.js +1 -1
  19. package/dist/cjs/q2-icon.cjs.entry.js +1 -1
  20. package/dist/cjs/q2-loc.cjs.entry.js +1 -1
  21. package/dist/cjs/q2-message.cjs.entry.js +1 -1
  22. package/dist/cjs/q2-month-picker.cjs.entry.js +1 -1
  23. package/dist/cjs/q2-optgroup_2.cjs.entry.js +1 -1
  24. package/dist/cjs/{q2-option-list_2.cjs.entry.js → q2-option-list.cjs.entry.js} +3 -167
  25. package/dist/cjs/q2-pagination.cjs.entry.js +1 -1
  26. package/dist/cjs/q2-pill.cjs.entry.js +1 -1
  27. package/dist/cjs/q2-radio-group.cjs.entry.js +1 -1
  28. package/dist/cjs/q2-radio.cjs.entry.js +1 -1
  29. package/dist/cjs/q2-section.cjs.entry.js +1 -1
  30. package/dist/cjs/q2-select.cjs.entry.js +11 -6
  31. package/dist/cjs/q2-stepper-pane.cjs.entry.js +1 -1
  32. package/dist/cjs/q2-stepper-vertical.cjs.entry.js +1 -1
  33. package/dist/cjs/q2-stepper.cjs.entry.js +1 -1
  34. package/dist/cjs/q2-tab-container.cjs.entry.js +1 -1
  35. package/dist/cjs/q2-tag.cjs.entry.js +1 -1
  36. package/dist/cjs/q2-tecton-elements.cjs.js +1 -1
  37. package/dist/cjs/q2-textarea.cjs.entry.js +1 -1
  38. package/dist/cjs/q2-tooltip.cjs.entry.js +1 -1
  39. package/dist/collection/components/q2-calendar/helpers.js +37 -11
  40. package/dist/collection/components/q2-calendar/index.js +174 -91
  41. package/dist/collection/components/q2-calendar/styles.css +5 -68
  42. package/dist/collection/components/q2-dropdown/index.js +123 -66
  43. package/dist/collection/components/q2-dropdown/styles.css +3 -89
  44. package/dist/collection/components/q2-select/index.js +10 -5
  45. package/dist/collection/utils/index.js +11 -51
  46. package/dist/components/index11.js +1 -1
  47. package/dist/components/index15.js +12 -52
  48. package/dist/components/index7.js +1 -1
  49. package/dist/components/index8.js +1 -1
  50. package/dist/components/q2-calendar.js +154 -101
  51. package/dist/components/q2-card.js +1 -1
  52. package/dist/components/q2-carousel.js +1 -1
  53. package/dist/components/q2-checkbox-group.js +1 -1
  54. package/dist/components/q2-checkbox.js +1 -1
  55. package/dist/components/q2-dropdown.js +66 -59
  56. package/dist/components/q2-radio-group.js +1 -1
  57. package/dist/components/q2-radio.js +1 -1
  58. package/dist/components/q2-select.js +11 -6
  59. package/dist/components/q2-stepper-pane.js +1 -1
  60. package/dist/components/q2-stepper-vertical.js +1 -1
  61. package/dist/components/q2-stepper.js +1 -1
  62. package/dist/components/q2-tab-container.js +1 -1
  63. package/dist/components/q2-textarea.js +1 -1
  64. package/dist/docs.json +144 -4
  65. package/dist/esm/click-elsewhere_2.entry.js +253 -0
  66. package/dist/esm/{index-a0cc60e3.js → index-576f618c.js} +12 -52
  67. package/dist/esm/loader.js +1 -1
  68. package/dist/esm/q2-action-sheet.entry.js +1 -1
  69. package/dist/esm/q2-badge_2.entry.js +1 -1
  70. package/dist/esm/q2-btn_2.entry.js +1 -1
  71. package/dist/esm/q2-calendar.entry.js +128 -83
  72. package/dist/esm/q2-card.entry.js +1 -1
  73. package/dist/esm/q2-carousel-pane.entry.js +1 -1
  74. package/dist/esm/q2-carousel.entry.js +1 -1
  75. package/dist/esm/q2-chart-area.entry.js +1 -1
  76. package/dist/esm/q2-chart-bar.entry.js +1 -1
  77. package/dist/esm/q2-chart-donut.entry.js +1 -1
  78. package/dist/esm/q2-checkbox-group.entry.js +1 -1
  79. package/dist/esm/q2-checkbox.entry.js +1 -1
  80. package/dist/esm/q2-dropdown-item.entry.js +1 -1
  81. package/dist/esm/q2-dropdown.entry.js +44 -45
  82. package/dist/esm/q2-editable-field.entry.js +1 -1
  83. package/dist/esm/q2-icon.entry.js +1 -1
  84. package/dist/esm/q2-loc.entry.js +1 -1
  85. package/dist/esm/q2-message.entry.js +1 -1
  86. package/dist/esm/q2-month-picker.entry.js +1 -1
  87. package/dist/esm/q2-optgroup_2.entry.js +1 -1
  88. package/dist/esm/{q2-option-list_2.entry.js → q2-option-list.entry.js} +4 -167
  89. package/dist/esm/q2-pagination.entry.js +1 -1
  90. package/dist/esm/q2-pill.entry.js +1 -1
  91. package/dist/esm/q2-radio-group.entry.js +1 -1
  92. package/dist/esm/q2-radio.entry.js +1 -1
  93. package/dist/esm/q2-section.entry.js +1 -1
  94. package/dist/esm/q2-select.entry.js +11 -6
  95. package/dist/esm/q2-stepper-pane.entry.js +1 -1
  96. package/dist/esm/q2-stepper-vertical.entry.js +1 -1
  97. package/dist/esm/q2-stepper.entry.js +1 -1
  98. package/dist/esm/q2-tab-container.entry.js +1 -1
  99. package/dist/esm/q2-tag.entry.js +1 -1
  100. package/dist/esm/q2-tecton-elements.js +1 -1
  101. package/dist/esm/q2-textarea.entry.js +1 -1
  102. package/dist/esm/q2-tooltip.entry.js +1 -1
  103. package/dist/q2-tecton-elements/p-0b7003c4.entry.js +1 -0
  104. package/dist/q2-tecton-elements/{p-0b8943da.entry.js → p-0d92ab4a.entry.js} +1 -1
  105. package/dist/q2-tecton-elements/p-138db98d.entry.js +1 -0
  106. package/dist/q2-tecton-elements/{p-a298cbfb.entry.js → p-1b9e07b4.entry.js} +1 -1
  107. package/dist/q2-tecton-elements/{p-bafb5e70.entry.js → p-1e57a843.entry.js} +1 -1
  108. package/dist/q2-tecton-elements/{p-ac6dd5b1.entry.js → p-2423b9a9.entry.js} +1 -1
  109. package/dist/q2-tecton-elements/{p-396fd275.entry.js → p-2bb447c3.entry.js} +1 -1
  110. package/dist/q2-tecton-elements/{p-85e780b2.entry.js → p-3422207a.entry.js} +1 -1
  111. package/dist/q2-tecton-elements/{p-edcf49fd.entry.js → p-39989362.entry.js} +1 -1
  112. package/dist/q2-tecton-elements/{p-3dca7465.entry.js → p-3aad6a45.entry.js} +1 -1
  113. package/dist/q2-tecton-elements/{p-ef657f8f.entry.js → p-4d2b7f2e.entry.js} +1 -1
  114. package/dist/q2-tecton-elements/{p-869e899c.entry.js → p-4ffde81a.entry.js} +1 -1
  115. package/dist/q2-tecton-elements/{p-d06d752f.entry.js → p-55bdd480.entry.js} +1 -1
  116. package/dist/q2-tecton-elements/p-590adc15.entry.js +1 -0
  117. package/dist/q2-tecton-elements/{p-949fa312.entry.js → p-5cd51157.entry.js} +1 -1
  118. package/dist/q2-tecton-elements/p-5e14a790.entry.js +1 -0
  119. package/dist/q2-tecton-elements/{p-12e65423.entry.js → p-6524d5f3.entry.js} +1 -1
  120. package/dist/q2-tecton-elements/{p-521c9085.entry.js → p-68908be9.entry.js} +1 -1
  121. package/dist/q2-tecton-elements/{p-9367dc29.entry.js → p-6975e5e4.entry.js} +1 -1
  122. package/dist/q2-tecton-elements/p-6bb3789b.entry.js +1 -0
  123. package/dist/q2-tecton-elements/{p-5a670d93.entry.js → p-6db208c7.entry.js} +1 -1
  124. package/dist/q2-tecton-elements/{p-2b8a8981.entry.js → p-7a702d92.entry.js} +1 -1
  125. package/dist/q2-tecton-elements/{p-fb768d19.entry.js → p-7e1a14ea.entry.js} +1 -1
  126. package/dist/q2-tecton-elements/p-921ea070.js +1 -0
  127. package/dist/q2-tecton-elements/{p-04b9a7ee.entry.js → p-a63e64f0.entry.js} +1 -1
  128. package/dist/q2-tecton-elements/p-b9bbfaf7.entry.js +1 -0
  129. package/dist/q2-tecton-elements/{p-d69cb7d1.entry.js → p-bbd2c530.entry.js} +1 -1
  130. package/dist/q2-tecton-elements/{p-05bdc0aa.entry.js → p-c19e143e.entry.js} +1 -1
  131. package/dist/q2-tecton-elements/{p-256e5161.entry.js → p-c8525f80.entry.js} +1 -1
  132. package/dist/q2-tecton-elements/{p-fcad1609.entry.js → p-c93341d5.entry.js} +1 -1
  133. package/dist/q2-tecton-elements/{p-8545c3cb.entry.js → p-d6824ce5.entry.js} +1 -1
  134. package/dist/q2-tecton-elements/{p-f3e4bb52.entry.js → p-ddfb393a.entry.js} +1 -1
  135. package/dist/q2-tecton-elements/{p-9292bd80.entry.js → p-df3fb1e7.entry.js} +1 -1
  136. package/dist/q2-tecton-elements/{p-fe3625ad.entry.js → p-ed77f0c2.entry.js} +1 -1
  137. package/dist/q2-tecton-elements/{p-25ea01d3.entry.js → p-ed91f837.entry.js} +1 -1
  138. package/dist/q2-tecton-elements/{p-1d28c600.entry.js → p-fa0e471c.entry.js} +1 -1
  139. package/dist/q2-tecton-elements/q2-tecton-elements.esm.js +1 -1
  140. package/dist/test/helpers.js +1 -1
  141. package/dist/types/components/q2-calendar/helpers.d.ts +1 -0
  142. package/dist/types/components/q2-calendar/index.d.ts +22 -12
  143. package/dist/types/components/q2-dropdown/index.d.ts +12 -8
  144. package/dist/types/components.d.ts +24 -0
  145. package/dist/types/utils/index.d.ts +4 -9
  146. package/dist/types/workspace/workspace/{tecton-production_release_1.27.x → Tecton_tecton-production_master}/packages/q2-tecton-elements/.stencil/test/helpers.d.ts +1 -1
  147. package/package.json +3 -3
  148. package/dist/cjs/click-elsewhere.cjs.entry.js +0 -93
  149. package/dist/esm/click-elsewhere.entry.js +0 -89
  150. package/dist/q2-tecton-elements/p-2453cd92.js +0 -1
  151. package/dist/q2-tecton-elements/p-72374b8e.entry.js +0 -1
  152. package/dist/q2-tecton-elements/p-8e652d59.entry.js +0 -1
  153. package/dist/q2-tecton-elements/p-aae8b9fc.entry.js +0 -1
  154. package/dist/q2-tecton-elements/p-be0d3bfe.entry.js +0 -1
  155. package/dist/q2-tecton-elements/p-c1d33fd2.entry.js +0 -1
  156. package/dist/q2-tecton-elements/p-ee1f3114.entry.js +0 -1
@@ -1,44 +1,39 @@
1
1
  import { h, Fragment } from '@stencil/core';
2
- import { handleAriaLabel, isEventFromElement, loc, overrideFocus, setPopProperties } from 'src/utils';
2
+ import { handleAriaLabel, handleRenamedProp, isEventFromElement, loc, overrideFocus } from 'src/utils';
3
3
  export class Q2Dropdown {
4
4
  constructor() {
5
- this.scheduledAfterRender = [];
6
5
  this.dropdownItemSelector = 'q2-dropdown-item:not([disabled]):not([separator])';
7
6
  ///// Actions ////////
8
7
  this.focusToggle = () => {
9
- const toggleBtn = this.hostElement.shadowRoot.querySelector('.dropdown-button');
10
- toggleBtn && toggleBtn.dispatchEvent(new FocusEvent('focus'));
8
+ this.controlElement.shadowRoot.querySelector('button').focus();
11
9
  };
12
10
  this.openDropdown = () => {
13
- setPopProperties(this);
14
- if (!this.dropdownOpen) {
15
- this.dropdownOpen = true;
16
- this.scheduledAfterRender.push(this.resizeIframe);
17
- }
11
+ if (this.open)
12
+ return;
13
+ this.open = true;
18
14
  };
19
15
  this.closeDropdown = () => {
20
- if (this.dropdownOpen) {
21
- this.dropdownOpen = false;
22
- this.scheduledAfterRender.push(() => {
23
- this.resizeIframe();
24
- });
25
- }
16
+ if (!this.open)
17
+ return;
18
+ this.open = false;
26
19
  };
27
20
  this.onClickElsewhere = (event) => {
28
21
  const target = event.target;
29
22
  if (target.localName === 'click-elsewhere') {
30
23
  event.stopPropagation();
31
- this.closeDropdown();
24
+ const { popoverElement } = this;
25
+ if (!popoverElement)
26
+ return;
27
+ popoverElement.open = false;
32
28
  }
33
29
  };
34
30
  this.onToggleClick = () => {
35
- if (this.dropdownOpen) {
36
- this.focusToggle();
31
+ if (this.open) {
37
32
  this.closeDropdown();
38
- return;
39
33
  }
40
- this.focusToggle();
41
- this.openDropdown();
34
+ else {
35
+ this.openDropdown();
36
+ }
42
37
  };
43
38
  this.onToggleKeydown = (event) => {
44
39
  if (['ArrowUp', 'Up'].includes(event.key)) {
@@ -96,18 +91,17 @@ export class Q2Dropdown {
96
91
  this.label = undefined;
97
92
  this.hideLabel = undefined;
98
93
  this.disabled = undefined;
99
- this.popDirection = undefined;
100
94
  this.alignment = 'left';
101
95
  this.name = undefined;
102
96
  this.context = undefined;
103
97
  this.contextValue = undefined;
104
98
  this.resolvedType = undefined;
105
99
  this.block = undefined;
100
+ this.open = undefined;
101
+ this.popoverMinHeight = 150;
102
+ this.popoverDirection = undefined;
103
+ this.popDirection = undefined;
106
104
  this.ariaLabel = undefined;
107
- this.dropdownOpen = false;
108
- }
109
- resizeIframe() {
110
- return window.TectonElements && window.TectonElements.resizeIframe && window.TectonElements.resizeIframe();
111
105
  }
112
106
  resolveMenu() {
113
107
  return (this.name &&
@@ -163,10 +157,12 @@ export class Q2Dropdown {
163
157
  });
164
158
  }
165
159
  navigateTo(featureName, moduleName, queryParams) {
166
- return window.TectonElements && window.TectonElements.navigateTo(featureName, moduleName, queryParams);
160
+ var _a, _b;
161
+ return (_b = (_a = window.TectonElements) === null || _a === void 0 ? void 0 : _a.navigateTo) === null || _b === void 0 ? void 0 : _b.call(_a, featureName, moduleName, queryParams);
167
162
  }
168
163
  showOverpanel(overpanelPath, params) {
169
- return window.TectonElements && window.TectonElements.showOverpanel(overpanelPath, params, undefined, true);
164
+ var _a, _b;
165
+ return (_b = (_a = window.TectonElements) === null || _a === void 0 ? void 0 : _a.showOverpanel) === null || _b === void 0 ? void 0 : _b.call(_a, overpanelPath, params, undefined, true);
170
166
  }
171
167
  get hasCustomButton() {
172
168
  return !!this.hostElement.querySelector('[slot=custom-dropdown-button]');
@@ -182,10 +178,10 @@ export class Q2Dropdown {
182
178
  if (allowedIntents.includes(type)) {
183
179
  intent = type === 'neutral' ? type : `workflow-${type}`;
184
180
  }
185
- const active = this.dropdownOpen;
181
+ const active = this.open;
186
182
  const disabled = !!this.disabled;
187
- const ariaExpanded = this.dropdownOpen;
188
- const className = `dropdown-button${!icon && !fab && !intent ? ' unstyled' : ''}`;
183
+ const ariaExpanded = this.open;
184
+ const className = !icon && !fab && !intent ? 'unstyled' : '';
189
185
  return {
190
186
  icon,
191
187
  fab,
@@ -198,7 +194,10 @@ export class Q2Dropdown {
198
194
  };
199
195
  }
200
196
  //////// Observers //////////
201
- ariaLabelObserver() {
197
+ popDirectionHandler() {
198
+ handleRenamedProp(this, 'popDirection', 'popoverDirection');
199
+ }
200
+ ariaLabelHandler() {
202
201
  handleAriaLabel(this);
203
202
  }
204
203
  nameHandler() {
@@ -216,29 +215,28 @@ export class Q2Dropdown {
216
215
  delegateFocus(event) {
217
216
  if (!isEventFromElement(event, this.hostElement))
218
217
  return;
219
- this.controlElement.shadowRoot.querySelector('button').focus();
218
+ this.focusToggle();
219
+ }
220
+ popoverStateHandler({ detail: { open } }) {
221
+ if (this.open !== open)
222
+ this.open = open;
220
223
  }
221
224
  ///// Lifecycle Hooks ////////
222
225
  componentWillLoad() {
223
- handleAriaLabel(this);
226
+ this.popDirectionHandler();
227
+ this.ariaLabelHandler();
224
228
  }
225
229
  componentDidLoad() {
226
230
  this.orchestrateResolvedMenuItems();
227
231
  overrideFocus(this.hostElement);
228
232
  }
229
- componentDidRender() {
230
- setTimeout(() => {
231
- this.scheduledAfterRender.forEach(fn => fn());
232
- this.scheduledAfterRender = [];
233
- }, 25);
234
- }
235
233
  focusFirstItem() {
236
234
  const firstItem = this.hostElement.querySelector(`${this.dropdownItemSelector}:first-child`);
237
- firstItem && firstItem.dispatchEvent(new FocusEvent('focus'));
235
+ firstItem === null || firstItem === void 0 ? void 0 : firstItem.dispatchEvent(new FocusEvent('focus'));
238
236
  }
239
237
  focusLastItem() {
240
238
  const lastItem = this.hostElement.querySelector(`${this.dropdownItemSelector}:last-child`);
241
- lastItem && lastItem.dispatchEvent(new FocusEvent('focus'));
239
+ lastItem === null || lastItem === void 0 ? void 0 : lastItem.dispatchEvent(new FocusEvent('focus'));
242
240
  }
243
241
  focusAdjacentItem(activeItem, direction) {
244
242
  const dropdownItems = Array.from(this.hostElement.querySelectorAll(this.dropdownItemSelector));
@@ -263,7 +261,7 @@ export class Q2Dropdown {
263
261
  }
264
262
  render() {
265
263
  const btnProps = this.toggleButtonProps;
266
- return (h("click-elsewhere", { class: `dropdown-container${this.dropdownOpen ? ' dropdown-open' : ''}`, onChange: this.onClickElsewhere, "test-id": "dropdownContainer" }, h("q2-btn", { ref: el => (this.controlElement = el), class: btnProps.className, onClick: this.onToggleClick, onKeyDown: this.onToggleKeydown, fab: btnProps.fab, intent: btnProps.intent, active: btnProps.active, disabled: btnProps.disabled, ariaExpanded: `${!!btnProps.ariaExpanded}`, label: this.hideLabel && this.label ? loc(this.label) : undefined, hideLabel: this.hideLabel, ariaHasPopup: "menu", "test-id": "dropdownButton", block: this.block }, this.hasCustomButton ? (h("div", { "test-id": "dropdownCustom", class: btnProps.custom ? '' : 'hidden' }, h("slot", { name: "custom-dropdown-button" }))) : (h(Fragment, null, this.icon ? h("q2-icon", { type: this.icon }) : ' ', this.label && !this.hideLabel && (h("span", { class: "dropdown-button-text" }, loc(this.label)))))), h("div", { ref: el => (this.dropdownContainer = el), class: `q2-element-dropdown ${this.privatePopDirection === 'up' ? 'dropup' : ''}`, role: "menu", onClick: this.onDropdownMenuClick, onKeyDown: this.onDropdownMenuKeydown }, h("div", null, h("slot", null), this.dropdownOpen && (h("q2-btn", { class: "sr close-dropdown", onFocus: this.closeDropdown }))))));
264
+ return (h("click-elsewhere", { class: this.open ? 'dropdown-open' : '', onChange: this.onClickElsewhere, "test-id": "dropdownContainer" }, h("q2-btn", { ref: el => (this.controlElement = el), class: btnProps.className, onClick: this.onToggleClick, onKeyDown: this.onToggleKeydown, fab: btnProps.fab, intent: btnProps.intent, active: btnProps.active, disabled: btnProps.disabled, ariaExpanded: `${!!btnProps.ariaExpanded}`, label: this.hideLabel && this.label ? loc(this.label) : undefined, hideLabel: this.hideLabel, ariaHasPopup: "menu", "test-id": "dropdownButton", block: this.block }, this.hasCustomButton ? (h("div", { "test-id": "dropdownCustom", class: btnProps.custom ? '' : 'hidden' }, h("slot", { name: "custom-dropdown-button" }))) : (h(Fragment, null, this.icon ? h("q2-icon", { type: this.icon }) : ' ', this.label && !this.hideLabel && (h("span", { class: "dropdown-button-text" }, loc(this.label)))))), h("q2-popover", { ref: el => (this.popoverElement = el), controlElement: this.controlElement, open: this.open, minHeight: this.popoverMinHeight, direction: this.popoverDirection, align: this.alignment }, h("div", { onClick: this.onDropdownMenuClick, onKeyDown: this.onDropdownMenuKeydown }, h("slot", null), this.open && (h("q2-btn", { class: "sr close-dropdown", onFocus: this.closeDropdown }))))));
267
265
  }
268
266
  static get is() { return "q2-dropdown"; }
269
267
  static get encapsulation() { return "shadow"; }
@@ -365,23 +363,6 @@ export class Q2Dropdown {
365
363
  "attribute": "disabled",
366
364
  "reflect": true
367
365
  },
368
- "popDirection": {
369
- "type": "string",
370
- "mutable": false,
371
- "complexType": {
372
- "original": "'up' | 'down'",
373
- "resolved": "\"down\" | \"up\"",
374
- "references": {}
375
- },
376
- "required": false,
377
- "optional": false,
378
- "docs": {
379
- "tags": [],
380
- "text": ""
381
- },
382
- "attribute": "pop-direction",
383
- "reflect": true
384
- },
385
366
  "alignment": {
386
367
  "type": "string",
387
368
  "mutable": false,
@@ -485,6 +466,78 @@ export class Q2Dropdown {
485
466
  "attribute": "block",
486
467
  "reflect": true
487
468
  },
469
+ "open": {
470
+ "type": "boolean",
471
+ "mutable": true,
472
+ "complexType": {
473
+ "original": "boolean",
474
+ "resolved": "boolean",
475
+ "references": {}
476
+ },
477
+ "required": false,
478
+ "optional": false,
479
+ "docs": {
480
+ "tags": [],
481
+ "text": ""
482
+ },
483
+ "attribute": "open",
484
+ "reflect": true
485
+ },
486
+ "popoverMinHeight": {
487
+ "type": "number",
488
+ "mutable": false,
489
+ "complexType": {
490
+ "original": "number",
491
+ "resolved": "number",
492
+ "references": {}
493
+ },
494
+ "required": false,
495
+ "optional": false,
496
+ "docs": {
497
+ "tags": [],
498
+ "text": ""
499
+ },
500
+ "attribute": "popover-min-height",
501
+ "reflect": false,
502
+ "defaultValue": "150"
503
+ },
504
+ "popoverDirection": {
505
+ "type": "string",
506
+ "mutable": true,
507
+ "complexType": {
508
+ "original": "'up' | 'down'",
509
+ "resolved": "\"down\" | \"up\"",
510
+ "references": {}
511
+ },
512
+ "required": false,
513
+ "optional": false,
514
+ "docs": {
515
+ "tags": [],
516
+ "text": ""
517
+ },
518
+ "attribute": "popover-direction",
519
+ "reflect": false
520
+ },
521
+ "popDirection": {
522
+ "type": "string",
523
+ "mutable": false,
524
+ "complexType": {
525
+ "original": "'up' | 'down'",
526
+ "resolved": "\"down\" | \"up\"",
527
+ "references": {}
528
+ },
529
+ "required": false,
530
+ "optional": false,
531
+ "docs": {
532
+ "tags": [{
533
+ "name": "deprecated",
534
+ "text": undefined
535
+ }],
536
+ "text": ""
537
+ },
538
+ "attribute": "pop-direction",
539
+ "reflect": true
540
+ },
488
541
  "ariaLabel": {
489
542
  "type": "string",
490
543
  "mutable": true,
@@ -507,16 +560,14 @@ export class Q2Dropdown {
507
560
  }
508
561
  };
509
562
  }
510
- static get states() {
511
- return {
512
- "dropdownOpen": {}
513
- };
514
- }
515
563
  static get elementRef() { return "hostElement"; }
516
564
  static get watchers() {
517
565
  return [{
566
+ "propName": "popDirection",
567
+ "methodName": "popDirectionHandler"
568
+ }, {
518
569
  "propName": "ariaLabel",
519
- "methodName": "ariaLabelObserver"
570
+ "methodName": "ariaLabelHandler"
520
571
  }, {
521
572
  "propName": "name",
522
573
  "methodName": "nameHandler"
@@ -538,6 +589,12 @@ export class Q2Dropdown {
538
589
  "target": undefined,
539
590
  "capture": false,
540
591
  "passive": false
592
+ }, {
593
+ "name": "popoverStateChanged",
594
+ "method": "popoverStateHandler",
595
+ "target": undefined,
596
+ "capture": false,
597
+ "passive": false
541
598
  }];
542
599
  }
543
600
  }
@@ -65,101 +65,15 @@ button {
65
65
  visibility: hidden;
66
66
  }
67
67
 
68
- .q2-element-dropdown {
69
- display: none;
70
- position: absolute;
71
- background-color: var(--app-white, #ffffff);
72
- color: var(--t-text, #4d4d4d);
73
- left: 0;
74
- width: 100%;
75
- z-index: 100;
76
- margin-top: 1px;
77
- box-shadow: var(--app-shadow-1, 0 2px 4px rgba(0, 0, 0, 0.3));
78
- height: 0;
79
- overflow: hidden;
80
- opacity: 0;
81
- visibility: hidden;
82
- transition: opacity var(--app-tween-1, 0.2s ease);
83
- border-radius: var(--tct-dropdown-border-radius, --t-dropdown-border-radius, 0);
84
- --comp-scrollbar-size: var(--tct-scrollbar-size, var(--t-scrollbar-size, var(--app-scale-1x, 5px)));
85
- --comp-scrollbar-border-radius: var(--tct-scrollbar-border-radius, var(--t-scrollbar-border-radius, var(--app-border-radius-1, 3px)));
86
- --comp-scrollbar-color: var(--tct-scrollbar-color, var(--t-scrollbar-color, var(--t-a11y-gray-color, #747474)));
87
- scrollbar-width: thin;
88
- scrollbar-color: var(--comp-scrollbar-color) transparent;
89
- }
90
- .q2-element-dropdown::-webkit-scrollbar {
91
- width: var(--comp-scrollbar-size);
92
- height: var(--comp-scrollbar-size);
93
- margin: 5px;
94
- }
95
- .q2-element-dropdown::-webkit-scrollbar-thumb {
96
- background: var(--comp-scrollbar-color);
97
- border-radius: var(--comp-scrollbar-border-radius);
98
- }
99
- .q2-element-dropdown::-webkit-scrollbar-track {
100
- background: transparent;
101
- border-radius: var(--comp-scrollbar-border-radius);
102
- }
103
-
104
- .q2-element-dropdown.sizable {
105
- display: block;
106
- height: auto;
107
- }
108
-
109
- .dropdown-open .q2-element-dropdown {
110
- display: block;
111
- height: auto;
112
- overflow: auto;
113
- opacity: 1;
114
- visibility: visible;
115
- }
116
-
117
- :host([alignment=right]) .q2-element-dropdown {
118
- left: auto;
119
- right: 0;
120
- }
121
-
122
- :host([block]) q2-btn,
123
- :host([block]) {
124
- display: block;
125
- }
126
-
127
68
  :host {
128
69
  display: inline-flex;
129
70
  }
130
71
 
131
- .dropdown-container {
72
+ click-elsewhere {
132
73
  position: relative;
133
74
  display: block;
134
75
  }
135
76
 
136
- .dropdown-button-content {
137
- display: flex;
138
- align-items: center;
139
- }
140
-
141
- .dropdown-button.unstyled .dropdown-button-content {
142
- padding: var(--tct-scale-2, var(--app-scale-2x, 10px)) var(--tct-scale-1, var(--app-scale-1x, 5px));
143
- }
144
-
145
- .q2-element-dropdown {
146
- width: var(--tct-dropdown-width, var(--t-dropdown-width, 175px));
147
- }
148
-
149
- .q2-element-dropdown.dropup {
150
- bottom: var(--tct-btn-icon-height, var(--t-btn-icon-height, 44px));
151
- }
152
-
153
- q2-btn[color=primary] ~ .q2-element-dropdown.dropup,
154
- q2-btn[intent=workflow-primary] ~ .q2-element-dropdown.dropup {
155
- bottom: calc(var(--tct-btn-icon-height, var(--t-btn-icon-height, 44px)) + var(--tct-btn-primary-border-width, var(--t-btn-primary-border-width, 0)));
156
- }
157
-
158
- q2-btn[color=secondary] ~ .q2-element-dropdown.dropup,
159
- q2-btn[intent=workflow-secondary] ~ .q2-element-dropdown.dropup {
160
- bottom: calc(var(--tct-btn-icon-height, var(--t-btn-icon-height, 44px)) + var(--tct-btn-secondary-border-width, var(--t-btn-secondary-border-width, 0)));
161
- }
162
-
163
- q2-btn[intent=neutral] ~ .q2-element-dropdown.dropup {
164
- bottom: calc(var(--tct-btn-icon-height, var(--t-btn-icon-height, 44px)) + var(--tct-btn-neutral-border-width, var(--t-btn-neutral-border-width, 0)));
77
+ q2-popover {
78
+ --tct-popover-min-width: var(--tct-dropdown-width, var(--t-dropdown-width));
165
79
  }
@@ -361,11 +361,16 @@ export class Q2Select {
361
361
  }
362
362
  calculateSingleSelectSelectedDisplay() {
363
363
  var _a;
364
- const { firstSelectedOptionElement } = this;
365
- return (((firstSelectedOptionElement === null || firstSelectedOptionElement === void 0 ? void 0 : firstSelectedOptionElement.display) && loc(firstSelectedOptionElement.display)) ||
366
- ((_a = firstSelectedOptionElement === null || firstSelectedOptionElement === void 0 ? void 0 : firstSelectedOptionElement.textContent) === null || _a === void 0 ? void 0 : _a.trim()) ||
367
- this.value ||
368
- '');
364
+ const { firstSelectedOptionElement, multilineOptions } = this;
365
+ if (multilineOptions) {
366
+ return ((firstSelectedOptionElement === null || firstSelectedOptionElement === void 0 ? void 0 : firstSelectedOptionElement.display) && loc(firstSelectedOptionElement.display)) || this.value || '';
367
+ }
368
+ else {
369
+ return (((firstSelectedOptionElement === null || firstSelectedOptionElement === void 0 ? void 0 : firstSelectedOptionElement.display) && loc(firstSelectedOptionElement.display)) ||
370
+ ((_a = firstSelectedOptionElement === null || firstSelectedOptionElement === void 0 ? void 0 : firstSelectedOptionElement.textContent) === null || _a === void 0 ? void 0 : _a.trim()) ||
371
+ this.value ||
372
+ '');
373
+ }
369
374
  }
370
375
  openDropdownWithoutActiveElement() {
371
376
  if (this.readonly || this.disabled)
@@ -102,6 +102,17 @@ export function handleAriaLabel(target) {
102
102
  target.label = loc(ariaLabel);
103
103
  target.ariaLabel = undefined;
104
104
  }
105
+ /**
106
+ * Handles when a prop has been renamed on a component without introducing a breaking change.
107
+ */
108
+ export function handleRenamedProp(target, oldProp, newProp, removeOldProp) {
109
+ if (typeof target[oldProp] === 'undefined')
110
+ return;
111
+ target[newProp] = target[oldProp];
112
+ if (removeOldProp) {
113
+ delete target[oldProp];
114
+ }
115
+ }
105
116
  export function messagesDOM(target) {
106
117
  const type = target.hasError ? 'danger' : 'info';
107
118
  return (h("div", { class: "messages-container" }, h("q2-message", { appearance: "minimal", description: true, type: type, "test-id": "message" }, h("ul", { id: target.inputDescribedBy }, target.messages.map(message => (h("li", { "test-id": "messageListItem" }, loc(message))))))));
@@ -123,57 +134,6 @@ export function setMessageHeight(target) {
123
134
  }
124
135
  });
125
136
  }
126
- export function setPopProperties(target) {
127
- var _a, _b, _c, _d;
128
- const { dropdownContainer, popDirection } = target;
129
- if (dropdownContainer) {
130
- dropdownContainer.style.maxHeight = null;
131
- }
132
- if (popDirection) {
133
- return (target.privatePopDirection = popDirection);
134
- }
135
- const controlElement = target.inputField || target.controlElement;
136
- const minPopHeight = target.minPopHeight || null;
137
- // Add sizable so that we can capture the height
138
- dropdownContainer.classList.add('sizable');
139
- const dropdownHeight = dropdownContainer.getBoundingClientRect().height;
140
- dropdownContainer.classList.remove('sizable');
141
- const { top: topOffset, height } = controlElement.getBoundingClientRect();
142
- const scrollY = ((_b = (_a = window.Tecton) === null || _a === void 0 ? void 0 : _a.platformDimensions) === null || _b === void 0 ? void 0 : _b.scrollY) || 0;
143
- const innerHeight = ((_d = (_c = window.Tecton) === null || _c === void 0 ? void 0 : _c.platformDimensions) === null || _d === void 0 ? void 0 : _d.innerHeight) || window.innerHeight;
144
- const bottomOffset = scrollY + innerHeight - topOffset - height;
145
- const canShowFullSizeBelow = bottomOffset > dropdownHeight;
146
- const canShowFullSizeAbove = dropdownHeight <= topOffset;
147
- // Prefer full size above or below
148
- if (canShowFullSizeBelow) {
149
- return (target.privatePopDirection = 'down');
150
- }
151
- else if (canShowFullSizeAbove || !minPopHeight) {
152
- determinePopOffset(target);
153
- return (target.privatePopDirection = 'up');
154
- }
155
- // If full size will not fit and minHeight is set, then make as tall as possible
156
- const displayBuffer = 5;
157
- const canShowSmallBelow = bottomOffset >= minPopHeight + displayBuffer;
158
- if (canShowSmallBelow) {
159
- const maxBelowHeight = Math.max(bottomOffset - displayBuffer, minPopHeight);
160
- dropdownContainer.style.maxHeight = `${maxBelowHeight}px`;
161
- return (target.privatePopDirection = 'down');
162
- }
163
- else {
164
- const maxAboveHeight = Math.max(topOffset, minPopHeight);
165
- dropdownContainer.style.maxHeight = `${maxAboveHeight}px`;
166
- determinePopOffset(target);
167
- return (target.privatePopDirection = 'up');
168
- }
169
- }
170
- const determinePopOffset = ({ dropdownContainer, inputField }) => {
171
- var _a, _b;
172
- if (!inputField)
173
- return;
174
- const inputFieldHeight = (_b = (_a = inputField.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('.input-field')) === null || _b === void 0 ? void 0 : _b.getBoundingClientRect().height;
175
- dropdownContainer.style.setProperty('--comp-dropup-offset', `${inputFieldHeight}px`);
176
- };
177
137
  export const resizeIframe = () => {
178
138
  var _a, _b;
179
139
  return (_b = (_a = window.TectonElements) === null || _a === void 0 ? void 0 : _a.resizeIframe) === null || _b === void 0 ? void 0 : _b.call(_a);
@@ -1,5 +1,5 @@
1
1
  import { proxyCustomElement, HTMLElement, h } from '@stencil/core/internal/client';
2
- import { c as createGuid, l as loc } from './index15.js';
2
+ import { d as createGuid, l as loc } from './index15.js';
3
3
 
4
4
  const stylesCss = "*{box-sizing:border-box}*:active{outline:none}*:focus{outline:none;box-shadow:var(--const-double-focus-ring, 0 0 0 2px #ffffff, 0 0 0 4px #33b4ff #06C)}:host{box-shadow:none !important}::-moz-focus-inner{border:none}input,textarea,button{font-family:inherit;font-size:inherit;font-stretch:inherit}:host(.sr),:host(.sr) button{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.sr,.sr button{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.hidden{display:none}:host([hidden]){display:none}.invisible{visibility:hidden}:host{display:block}.q2-optgroup-header{--comp-header-padding:var(--tct-scale-1, var(--app-scale-1x, 5px)) var(--tct-scale-2, var(--app-scale-2x, 10px));background:var(--tct-optgroup-header-bg, var(--t-optgroup-header-bg, var(--tct-gray-13, var(--t-gray-13, var(--tct-gray-l2, var(--app-gray-l2, #e6e6e6))))));padding:var(--tct-optgroup-header-padding, var(--t-optgroup-header-padding, var(--comp-header-padding)));font-weight:var(--tct-optgroup-header-font-weight, var(--t-optgroup-header-font-weight, 600));text-transform:var(--tct-optgroup-header-text-transform, var(--t-optgroup-header-text-transform, uppercase));position:sticky;top:calc(var(--comp-multi-select-header-height, 0px) + var(--tct-optgroup-top, var(--t-optgroup-top, 0px)));z-index:5}";
5
5
 
@@ -540,6 +540,17 @@ function handleAriaLabel(target) {
540
540
  target.label = loc(ariaLabel);
541
541
  target.ariaLabel = undefined;
542
542
  }
543
+ /**
544
+ * Handles when a prop has been renamed on a component without introducing a breaking change.
545
+ */
546
+ function handleRenamedProp(target, oldProp, newProp, removeOldProp) {
547
+ if (typeof target[oldProp] === 'undefined')
548
+ return;
549
+ target[newProp] = target[oldProp];
550
+ if (removeOldProp) {
551
+ delete target[oldProp];
552
+ }
553
+ }
543
554
  function messagesDOM(target) {
544
555
  const type = target.hasError ? 'danger' : 'info';
545
556
  return (h("div", { class: "messages-container" },
@@ -563,57 +574,6 @@ function setMessageHeight(target) {
563
574
  }
564
575
  });
565
576
  }
566
- function setPopProperties(target) {
567
- var _a, _b, _c, _d;
568
- const { dropdownContainer, popDirection } = target;
569
- if (dropdownContainer) {
570
- dropdownContainer.style.maxHeight = null;
571
- }
572
- if (popDirection) {
573
- return (target.privatePopDirection = popDirection);
574
- }
575
- const controlElement = target.inputField || target.controlElement;
576
- const minPopHeight = target.minPopHeight || null;
577
- // Add sizable so that we can capture the height
578
- dropdownContainer.classList.add('sizable');
579
- const dropdownHeight = dropdownContainer.getBoundingClientRect().height;
580
- dropdownContainer.classList.remove('sizable');
581
- const { top: topOffset, height } = controlElement.getBoundingClientRect();
582
- const scrollY = ((_b = (_a = window.Tecton) === null || _a === void 0 ? void 0 : _a.platformDimensions) === null || _b === void 0 ? void 0 : _b.scrollY) || 0;
583
- const innerHeight = ((_d = (_c = window.Tecton) === null || _c === void 0 ? void 0 : _c.platformDimensions) === null || _d === void 0 ? void 0 : _d.innerHeight) || window.innerHeight;
584
- const bottomOffset = scrollY + innerHeight - topOffset - height;
585
- const canShowFullSizeBelow = bottomOffset > dropdownHeight;
586
- const canShowFullSizeAbove = dropdownHeight <= topOffset;
587
- // Prefer full size above or below
588
- if (canShowFullSizeBelow) {
589
- return (target.privatePopDirection = 'down');
590
- }
591
- else if (canShowFullSizeAbove || !minPopHeight) {
592
- determinePopOffset(target);
593
- return (target.privatePopDirection = 'up');
594
- }
595
- // If full size will not fit and minHeight is set, then make as tall as possible
596
- const displayBuffer = 5;
597
- const canShowSmallBelow = bottomOffset >= minPopHeight + displayBuffer;
598
- if (canShowSmallBelow) {
599
- const maxBelowHeight = Math.max(bottomOffset - displayBuffer, minPopHeight);
600
- dropdownContainer.style.maxHeight = `${maxBelowHeight}px`;
601
- return (target.privatePopDirection = 'down');
602
- }
603
- else {
604
- const maxAboveHeight = Math.max(topOffset, minPopHeight);
605
- dropdownContainer.style.maxHeight = `${maxAboveHeight}px`;
606
- determinePopOffset(target);
607
- return (target.privatePopDirection = 'up');
608
- }
609
- }
610
- const determinePopOffset = ({ dropdownContainer, inputField }) => {
611
- var _a, _b;
612
- if (!inputField)
613
- return;
614
- const inputFieldHeight = (_b = (_a = inputField.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('.input-field')) === null || _b === void 0 ? void 0 : _b.getBoundingClientRect().height;
615
- dropdownContainer.style.setProperty('--comp-dropup-offset', `${inputFieldHeight}px`);
616
- };
617
577
  const resizeIframe = () => {
618
578
  var _a, _b;
619
579
  return (_b = (_a = window.TectonElements) === null || _a === void 0 ? void 0 : _a.resizeIframe) === null || _b === void 0 ? void 0 : _b.call(_a);
@@ -626,4 +586,4 @@ const handleColor = (target) => {
626
586
  }
627
587
  };
628
588
 
629
- export { isEventFromElement as a, isTouchDevice as b, createGuid as c, isRelatedTargetWithinHost as d, isHostLosingFocus as e, addSmoothScrollPolyfill as f, setMessageHeight as g, handleAriaLabel as h, isMobile as i, labelDOM as j, handleColor as k, loc as l, messagesDOM as m, nextPaint as n, overrideFocus as o, isFirefox as p, resizeIframe as r, setPopProperties as s, waitForNextPaint as w };
589
+ export { isEventFromElement as a, handleRenamedProp as b, isTouchDevice as c, createGuid as d, isRelatedTargetWithinHost as e, isHostLosingFocus as f, addSmoothScrollPolyfill as g, handleAriaLabel as h, isMobile as i, labelDOM as j, handleColor as k, loc as l, messagesDOM as m, nextPaint as n, overrideFocus as o, isFirefox as p, resizeIframe as r, setMessageHeight as s, waitForNextPaint as w };
@@ -1,5 +1,5 @@
1
1
  import { h, proxyCustomElement, HTMLElement } from '@stencil/core/internal/client';
2
- import { c as createGuid } from './index15.js';
2
+ import { d as createGuid } from './index15.js';
3
3
 
4
4
  const icons = {
5
5
  a11y: {
@@ -1,5 +1,5 @@
1
1
  import { proxyCustomElement, HTMLElement, createEvent, h, Fragment } from '@stencil/core/internal/client';
2
- import { i as isMobile, c as createGuid, g as setMessageHeight, h as handleAriaLabel, o as overrideFocus, l as loc, a as isEventFromElement, j as labelDOM, m as messagesDOM } from './index15.js';
2
+ import { i as isMobile, d as createGuid, s as setMessageHeight, h as handleAriaLabel, o as overrideFocus, l as loc, a as isEventFromElement, j as labelDOM, m as messagesDOM } from './index15.js';
3
3
  import { d as defineCustomElement$4 } from './index4.js';
4
4
  import { d as defineCustomElement$3 } from './index5.js';
5
5
  import { d as defineCustomElement$2 } from './index7.js';