@spectrum-web-components/picker 0.30.0 → 0.30.1-overlay.30

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spectrum-web-components/picker",
3
- "version": "0.30.0",
3
+ "version": "0.30.1-overlay.30+1df211c75",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -65,17 +65,17 @@
65
65
  "lit-html"
66
66
  ],
67
67
  "dependencies": {
68
- "@spectrum-web-components/base": "^0.30.0",
69
- "@spectrum-web-components/button": "^0.30.0",
70
- "@spectrum-web-components/icon": "^0.30.0",
71
- "@spectrum-web-components/icons-ui": "^0.30.0",
72
- "@spectrum-web-components/icons-workflow": "^0.30.0",
73
- "@spectrum-web-components/menu": "^0.30.0",
74
- "@spectrum-web-components/overlay": "^0.30.0",
75
- "@spectrum-web-components/popover": "^0.30.0",
76
- "@spectrum-web-components/reactive-controllers": "^0.30.0",
77
- "@spectrum-web-components/shared": "^0.30.0",
78
- "@spectrum-web-components/tray": "^0.30.0"
68
+ "@spectrum-web-components/base": "^0.30.1-overlay.30+1df211c75",
69
+ "@spectrum-web-components/button": "^0.30.1-overlay.30+1df211c75",
70
+ "@spectrum-web-components/icon": "^0.30.1-overlay.30+1df211c75",
71
+ "@spectrum-web-components/icons-ui": "^0.30.1-overlay.30+1df211c75",
72
+ "@spectrum-web-components/icons-workflow": "^0.30.1-overlay.30+1df211c75",
73
+ "@spectrum-web-components/menu": "^0.30.1-overlay.30+1df211c75",
74
+ "@spectrum-web-components/overlay": "^0.30.1-overlay.30+1df211c75",
75
+ "@spectrum-web-components/popover": "^0.30.1-overlay.30+1df211c75",
76
+ "@spectrum-web-components/reactive-controllers": "^0.30.1-overlay.30+1df211c75",
77
+ "@spectrum-web-components/shared": "^0.30.1-overlay.30+1df211c75",
78
+ "@spectrum-web-components/tray": "^0.30.1-overlay.30+1df211c75"
79
79
  },
80
80
  "devDependencies": {
81
81
  "@spectrum-css/picker": "^2.0.11"
@@ -88,5 +88,5 @@
88
88
  "./sync/index.js",
89
89
  "./sync/sp-*.js"
90
90
  ],
91
- "gitHead": "e34a26bf2bbea5f60a5e415e0f12c97654f0e20d"
91
+ "gitHead": "1df211c7581b6fd6ec624cf2b09bc81aeec29c26"
92
92
  }
package/src/Picker.d.ts CHANGED
@@ -1,31 +1,20 @@
1
1
  import { CSSResultArray, PropertyValues, TemplateResult } from '@spectrum-web-components/base';
2
+ import { StyleInfo } from '@spectrum-web-components/base/src/directives.js';
2
3
  import { Focusable } from '@spectrum-web-components/shared/src/focusable.js';
3
4
  import '@spectrum-web-components/icons-ui/icons/sp-icon-chevron100.js';
4
5
  import '@spectrum-web-components/icons-workflow/icons/sp-icon-alert.js';
6
+ import '@spectrum-web-components/overlay/sp-overlay.js';
5
7
  import '@spectrum-web-components/menu/sp-menu.js';
6
- import type { Menu, MenuItem, MenuItemAddedOrUpdatedEvent, MenuItemChildren, MenuItemRemovedEvent } from '@spectrum-web-components/menu';
8
+ import type { Menu, MenuItem, MenuItemChildren } from '@spectrum-web-components/menu';
7
9
  import '@spectrum-web-components/tray/sp-tray.js';
8
10
  import '@spectrum-web-components/popover/sp-popover.js';
9
- import { OverlayOptions, Placement, TriggerInteractions } from '@spectrum-web-components/overlay';
11
+ import { Placement } from '@spectrum-web-components/overlay';
10
12
  import { MatchMediaController } from '@spectrum-web-components/reactive-controllers/src/MatchMedia.js';
11
13
  declare const PickerBase_base: typeof Focusable & {
12
14
  new (...args: any[]): import("@spectrum-web-components/base").SizedElementInterface;
13
15
  prototype: import("@spectrum-web-components/base").SizedElementInterface;
14
16
  };
15
- /**
16
- * @element sp-picker
17
- *
18
- * @slot label - The placeholder content for the Picker
19
- * @slot - menu items to be listed in the Picker
20
- * @fires change - Announces that the `value` of the element has changed
21
- * @fires sp-opened - Announces that the overlay has been opened
22
- * @fires sp-closed - Announces that the overlay has been closed
23
- */
24
17
  export declare class PickerBase extends PickerBase_base {
25
- /**
26
- * @private
27
- */
28
- static openOverlay: (target: HTMLElement, interaction: TriggerInteractions, content: HTMLElement, options: OverlayOptions) => Promise<() => void>;
29
18
  protected isMobile: MatchMediaController;
30
19
  button: HTMLButtonElement;
31
20
  get target(): HTMLButtonElement | this;
@@ -37,8 +26,7 @@ export declare class PickerBase extends PickerBase_base {
37
26
  open: boolean;
38
27
  readonly: boolean;
39
28
  selects: undefined | 'single';
40
- menuItems: MenuItem[];
41
- private restoreChildren?;
29
+ get menuItems(): MenuItem[];
42
30
  optionsMenu: Menu;
43
31
  /**
44
32
  * @type {"auto" | "auto-start" | "auto-end" | "top" | "bottom" | "right" | "left" | "top-start" | "top-end" | "bottom-start" | "bottom-end" | "right-start" | "right-end" | "left-start" | "left-end" | "none"}
@@ -47,9 +35,9 @@ export declare class PickerBase extends PickerBase_base {
47
35
  placement: Placement;
48
36
  quiet: boolean;
49
37
  value: string;
50
- selectedItem?: MenuItem;
51
- private closeOverlay?;
52
- private popoverEl;
38
+ get selectedItem(): MenuItem | undefined;
39
+ set selectedItem(selectedItem: MenuItem | undefined);
40
+ _selectedItem?: MenuItem;
53
41
  protected listRole: 'listbox' | 'menu';
54
42
  protected itemRole: string;
55
43
  constructor();
@@ -64,42 +52,41 @@ export declare class PickerBase extends PickerBase_base {
64
52
  protected onKeydown: (event: KeyboardEvent) => void;
65
53
  setValueFromItem(item: MenuItem, menuChangeEvent?: Event): Promise<void>;
66
54
  protected setMenuItemSelected(item: MenuItem, value: boolean): void;
55
+ private preventToggle;
67
56
  toggle(target?: boolean): void;
68
57
  close(): void;
69
- overlayOpenCallback: () => Promise<void>;
70
- overlayCloseCallback: () => Promise<void>;
71
- private popoverFragment;
72
- private generatePopover;
73
- private openMenu;
74
- protected sizePopover(popover: HTMLElement): void;
75
- private closeMenu;
58
+ protected get containerStyles(): StyleInfo;
76
59
  protected get selectedItemContent(): MenuItemChildren;
60
+ protected set selectedItemContent(selectedItemContent: MenuItemChildren | undefined);
61
+ _selectedItemContent?: MenuItemChildren;
77
62
  protected renderLabelContent(content: Node[]): TemplateResult | Node[];
78
63
  protected get buttonContent(): TemplateResult[];
64
+ protected get renderOverlay(): TemplateResult;
79
65
  protected render(): TemplateResult;
80
66
  protected update(changes: PropertyValues<this>): void;
81
67
  protected get dismissHelper(): TemplateResult;
82
- protected get renderPopover(): TemplateResult;
83
- private _willUpdateItems;
84
- protected itemsUpdated: Promise<void>;
85
- /**
86
- * Acquire the available MenuItems in the Picker by
87
- * direct element query or by assuming the list managed
88
- * by the Menu within the open options overlay.
89
- */
90
- protected updateMenuItems(event?: MenuItemAddedOrUpdatedEvent | MenuItemRemovedEvent): void;
68
+ protected get renderContainer(): TemplateResult;
69
+ private willManageSelection;
70
+ protected shouldScheduleManageSelection(event?: Event): void;
71
+ protected shouldManageSelection(): void;
91
72
  protected manageSelection(): Promise<void>;
92
- private menuStatePromise;
93
- private menuStateResolver;
94
73
  private selectionPromise;
95
74
  private selectionResolver;
96
75
  protected getUpdateComplete(): Promise<boolean>;
97
- connectedCallback(): void;
98
76
  disconnectedCallback(): void;
99
77
  }
78
+ /**
79
+ * @element sp-picker
80
+ *
81
+ * @slot label - The placeholder content for the Picker
82
+ * @slot - menu items to be listed in the Picker
83
+ * @fires change - Announces that the `value` of the element has changed
84
+ * @fires sp-opened - Announces that the overlay has been opened
85
+ * @fires sp-closed - Announces that the overlay has been closed
86
+ */
100
87
  export declare class Picker extends PickerBase {
101
88
  static get styles(): CSSResultArray;
102
- protected sizePopover(popover: HTMLElement): void;
89
+ protected get containerStyles(): StyleInfo;
103
90
  protected onKeydown: (event: KeyboardEvent) => void;
104
91
  }
105
92
  export {};
package/src/Picker.dev.js CHANGED
@@ -13,10 +13,12 @@ var __decorateClass = (decorators, target, key, kind) => {
13
13
  import {
14
14
  html,
15
15
  nothing,
16
- render,
17
16
  SizedMixin
18
17
  } from "@spectrum-web-components/base";
19
- import { classMap } from "@spectrum-web-components/base/src/directives.js";
18
+ import {
19
+ classMap,
20
+ styleMap
21
+ } from "@spectrum-web-components/base/src/directives.js";
20
22
  import {
21
23
  property,
22
24
  query
@@ -24,15 +26,12 @@ import {
24
26
  import pickerStyles from "./picker.css.js";
25
27
  import chevronStyles from "@spectrum-web-components/icon/src/spectrum-icon-chevron.css.js";
26
28
  import { Focusable } from "@spectrum-web-components/shared/src/focusable.js";
27
- import { reparentChildren } from "@spectrum-web-components/shared/src/reparent-children.js";
28
29
  import "@spectrum-web-components/icons-ui/icons/sp-icon-chevron100.js";
29
30
  import "@spectrum-web-components/icons-workflow/icons/sp-icon-alert.js";
31
+ import "@spectrum-web-components/overlay/sp-overlay.js";
30
32
  import "@spectrum-web-components/menu/sp-menu.js";
31
33
  import "@spectrum-web-components/tray/sp-tray.js";
32
34
  import "@spectrum-web-components/popover/sp-popover.js";
33
- import {
34
- openOverlay
35
- } from "@spectrum-web-components/overlay";
36
35
  import {
37
36
  IS_MOBILE,
38
37
  MatchMediaController
@@ -53,7 +52,6 @@ export class PickerBase extends SizedMixin(Focusable) {
53
52
  this.open = false;
54
53
  this.readonly = false;
55
54
  this.selects = "single";
56
- this.menuItems = [];
57
55
  this.placement = "bottom-start";
58
56
  this.quiet = false;
59
57
  this.value = "";
@@ -67,29 +65,34 @@ export class PickerBase extends SizedMixin(Focusable) {
67
65
  event.preventDefault();
68
66
  this.toggle(true);
69
67
  };
70
- this.overlayOpenCallback = async () => {
71
- this.updateMenuItems();
72
- await this.itemsUpdated;
73
- await this.optionsMenu.updateComplete;
74
- requestAnimationFrame(() => this.menuStateResolver());
75
- };
76
- this.overlayCloseCallback = async () => {
77
- if (this.restoreChildren) {
78
- this.restoreChildren();
79
- this.restoreChildren = void 0;
80
- }
81
- this.close();
82
- requestAnimationFrame(() => this.menuStateResolver());
83
- };
84
- this._willUpdateItems = false;
85
- this.itemsUpdated = Promise.resolve();
86
- this.menuStatePromise = Promise.resolve();
68
+ this.preventToggle = false;
69
+ this.willManageSelection = false;
87
70
  this.selectionPromise = Promise.resolve();
88
71
  this.onKeydown = this.onKeydown.bind(this);
72
+ this.addEventListener("focusout", (event) => {
73
+ if (event.relatedTarget && this.contains(event.relatedTarget) || event.target !== this) {
74
+ return;
75
+ }
76
+ this.open = false;
77
+ });
89
78
  }
90
79
  get target() {
91
80
  return this.button;
92
81
  }
82
+ get menuItems() {
83
+ return this.optionsMenu.childItems;
84
+ }
85
+ get selectedItem() {
86
+ return this._selectedItem;
87
+ }
88
+ set selectedItem(selectedItem) {
89
+ this.selectedItemContent = selectedItem ? selectedItem.itemChildren : void 0;
90
+ if (selectedItem === this.selectedItem)
91
+ return;
92
+ const oldSelectedItem = this.selectedItem;
93
+ this._selectedItem = selectedItem;
94
+ this.requestUpdate("selectedItem", oldSelectedItem);
95
+ }
93
96
  get focusElement() {
94
97
  if (this.open) {
95
98
  return this.optionsMenu;
@@ -128,20 +131,22 @@ export class PickerBase extends SizedMixin(Focusable) {
128
131
  handleChange(event) {
129
132
  const target = event.target;
130
133
  const [selected] = target.selectedItems;
134
+ event.stopPropagation();
131
135
  if (event.cancelable) {
132
- event.stopPropagation();
133
136
  this.setValueFromItem(selected, event);
134
137
  } else {
135
138
  this.open = false;
136
139
  }
137
140
  }
138
141
  async setValueFromItem(item, menuChangeEvent) {
142
+ this.open = false;
139
143
  const oldSelectedItem = this.selectedItem;
140
144
  const oldValue = this.value;
141
- this.selectedItem = item;
142
- this.value = item.value;
143
- this.open = false;
144
- await this.updateComplete;
145
+ if (this.selects) {
146
+ this.selectedItem = item;
147
+ this.value = item.value;
148
+ await this.updateComplete;
149
+ }
145
150
  const applyDefault = this.dispatchEvent(
146
151
  new Event("change", {
147
152
  bubbles: true,
@@ -149,7 +154,7 @@ export class PickerBase extends SizedMixin(Focusable) {
149
154
  composed: true
150
155
  })
151
156
  );
152
- if (!applyDefault) {
157
+ if (!applyDefault && this.selects) {
153
158
  if (menuChangeEvent) {
154
159
  menuChangeEvent.preventDefault();
155
160
  }
@@ -173,6 +178,8 @@ export class PickerBase extends SizedMixin(Focusable) {
173
178
  item.selected = value;
174
179
  }
175
180
  toggle(target) {
181
+ if (this.preventToggle)
182
+ return;
176
183
  if (this.readonly) {
177
184
  return;
178
185
  }
@@ -184,74 +191,23 @@ export class PickerBase extends SizedMixin(Focusable) {
184
191
  }
185
192
  this.open = false;
186
193
  }
187
- async generatePopover() {
188
- if (!this.popoverFragment) {
189
- this.popoverFragment = document.createDocumentFragment();
190
- }
191
- render(this.renderPopover, this.popoverFragment, { host: this });
192
- this.popoverEl = this.popoverFragment.children[0];
193
- this.optionsMenu = this.popoverEl.children[1];
194
- }
195
- async openMenu() {
196
- let reparentableChildren = [];
197
- const deprecatedMenu = this.querySelector(":scope > sp-menu");
198
- await this.generatePopover();
199
- if (deprecatedMenu) {
200
- reparentableChildren = Array.from(deprecatedMenu.children);
201
- } else {
202
- reparentableChildren = Array.from(this.children).filter(
203
- (element) => {
204
- return !element.hasAttribute("slot");
205
- }
206
- );
207
- }
208
- if (reparentableChildren.length === 0) {
209
- this.menuStateResolver();
210
- return;
211
- }
212
- this.restoreChildren = reparentChildren(reparentableChildren, this.optionsMenu, {
213
- position: "beforeend",
214
- prepareCallback: (el) => {
215
- if (this.value === el.value) {
216
- this.setMenuItemSelected(el, true);
217
- }
218
- return (el2) => {
219
- if (typeof el2.focused !== "undefined") {
220
- el2.focused = false;
221
- }
222
- };
223
- }
224
- });
225
- this.sizePopover(this.popoverEl);
226
- if (true) {
227
- window.__swc.ignoreWarningLevels.deprecation = true;
228
- }
229
- this.closeOverlay = Picker.openOverlay(this, "modal", this.popoverEl, {
230
- placement: this.isMobile.matches ? "none" : this.placement,
231
- receivesFocus: "auto"
232
- });
233
- if (true) {
234
- window.__swc.ignoreWarningLevels.deprecation = false;
235
- }
236
- }
237
- sizePopover(popover) {
194
+ get containerStyles() {
238
195
  if (this.isMobile.matches) {
239
- popover.style.setProperty("--swc-menu-width", `100%`);
240
- return;
241
- }
242
- }
243
- async closeMenu() {
244
- if (this.closeOverlay) {
245
- const closeOverlay = this.closeOverlay;
246
- delete this.closeOverlay;
247
- (await closeOverlay)();
196
+ return {
197
+ "--swc-menu-width": "100%"
198
+ };
248
199
  }
200
+ return {};
249
201
  }
250
202
  get selectedItemContent() {
251
- if (this.selectedItem) {
252
- return this.selectedItem.itemChildren;
253
- }
254
- return { icon: [], content: [] };
203
+ return this._selectedItemContent || { icon: [], content: [] };
204
+ }
205
+ set selectedItemContent(selectedItemContent) {
206
+ if (selectedItemContent === this.selectedItemContent)
207
+ return;
208
+ const oldContent = this.selectedItemContent;
209
+ this._selectedItemContent = selectedItemContent;
210
+ this.requestUpdate("selectedItemContent", oldContent);
255
211
  }
256
212
  renderLabelContent(content) {
257
213
  if (this.value && this.selectedItem) {
@@ -285,13 +241,41 @@ export class PickerBase extends SizedMixin(Focusable) {
285
241
  `
286
242
  ];
287
243
  }
244
+ get renderOverlay() {
245
+ return html`
246
+ <sp-overlay
247
+ .triggerElement=${this}
248
+ .offset=${0}
249
+ ?open=${this.open}
250
+ .placement=${this.placement}
251
+ type="auto"
252
+ .receivesFocus=${"true"}
253
+ @beforetoggle=${(event) => {
254
+ if (event.composedPath()[0] !== event.target) {
255
+ return;
256
+ }
257
+ this.open = event.target.open;
258
+ if (!this.open) {
259
+ this.preventToggle = true;
260
+ requestAnimationFrame(
261
+ () => this.preventToggle = false
262
+ );
263
+ this.optionsMenu.updateSelectedItemIndex();
264
+ this.optionsMenu.closeDescendentOverlays();
265
+ }
266
+ }}
267
+ >
268
+ ${this.renderContainer}
269
+ </sp-overlay>
270
+ `;
271
+ }
288
272
  // a helper to throw focus to the button is needed because Safari
289
273
  // won't include buttons in the tab order even with tabindex="0"
290
274
  render() {
291
275
  return html`
292
276
  <span
293
277
  id="focus-helper"
294
- tabindex="${this.focused ? "-1" : "0"}"
278
+ tabindex="${this.focused || this.open ? "-1" : "0"}"
295
279
  @focus=${this.onHelperFocus}
296
280
  ></span>
297
281
  <button
@@ -308,6 +292,7 @@ export class PickerBase extends SizedMixin(Focusable) {
308
292
  >
309
293
  ${this.buttonContent}
310
294
  </button>
295
+ ${this.renderOverlay}
311
296
  `;
312
297
  }
313
298
  update(changes) {
@@ -317,21 +302,15 @@ export class PickerBase extends SizedMixin(Focusable) {
317
302
  if (changes.has("disabled") && this.disabled) {
318
303
  this.open = false;
319
304
  }
320
- if (changes.has("open") && (this.open || typeof changes.get("open") !== "undefined")) {
321
- this.menuStatePromise = new Promise(
322
- (res) => this.menuStateResolver = res
323
- );
324
- if (this.open) {
325
- this.openMenu();
326
- } else {
327
- this.closeMenu();
328
- }
305
+ if (changes.has("value")) {
306
+ this.shouldScheduleManageSelection();
329
307
  }
330
- if (changes.has("value") && !changes.has("selectedItem")) {
331
- this.updateMenuItems();
308
+ if (!this.hasUpdated) {
309
+ const deprecatedMenu = this.querySelector(":scope > sp-menu");
310
+ deprecatedMenu == null ? void 0 : deprecatedMenu.setAttribute("selects", "inherit");
332
311
  }
333
312
  if (true) {
334
- if (!this.hasUpdated && this.querySelector("sp-menu")) {
313
+ if (!this.hasUpdated && this.querySelector(":scope > sp-menu")) {
335
314
  const { localName } = this;
336
315
  window.__swc.warn(
337
316
  this,
@@ -354,7 +333,7 @@ export class PickerBase extends SizedMixin(Focusable) {
354
333
  </div>
355
334
  `;
356
335
  }
357
- get renderPopover() {
336
+ get renderContainer() {
358
337
  const content = html`
359
338
  ${this.dismissHelper}
360
339
  <sp-menu
@@ -362,7 +341,11 @@ export class PickerBase extends SizedMixin(Focusable) {
362
341
  role="${this.listRole}"
363
342
  @change=${this.handleChange}
364
343
  .selects=${this.selects}
365
- ></sp-menu>
344
+ .selected=${this.value ? [this.value] : []}
345
+ @sp-menu-item-added-or-updated=${this.shouldManageSelection}
346
+ >
347
+ <slot @slotchange=${this.shouldScheduleManageSelection}></slot>
348
+ </sp-menu>
366
349
  ${this.dismissHelper}
367
350
  `;
368
351
  if (this.isMobile.matches) {
@@ -370,9 +353,7 @@ export class PickerBase extends SizedMixin(Focusable) {
370
353
  <sp-tray
371
354
  id="popover"
372
355
  role="dialog"
373
- @sp-menu-item-added-or-updated=${this.updateMenuItems}
374
- .overlayOpenCallback=${this.overlayOpenCallback}
375
- .overlayCloseCallback=${this.overlayCloseCallback}
356
+ style=${styleMap(this.containerStyles)}
376
357
  >
377
358
  ${content}
378
359
  </sp-tray>
@@ -382,56 +363,38 @@ export class PickerBase extends SizedMixin(Focusable) {
382
363
  <sp-popover
383
364
  id="popover"
384
365
  role="dialog"
385
- @sp-menu-item-added-or-updated=${this.updateMenuItems}
386
- .overlayOpenCallback=${this.overlayOpenCallback}
387
- .overlayCloseCallback=${this.overlayCloseCallback}
366
+ style=${styleMap(this.containerStyles)}
367
+ placement=${this.placement}
388
368
  >
389
369
  ${content}
390
370
  </sp-popover>
391
371
  `;
392
372
  }
393
- /**
394
- * Acquire the available MenuItems in the Picker by
395
- * direct element query or by assuming the list managed
396
- * by the Menu within the open options overlay.
397
- */
398
- updateMenuItems(event) {
399
- if (this.open && (event == null ? void 0 : event.type) === "sp-menu-item-removed")
400
- return;
401
- if (this._willUpdateItems)
402
- return;
403
- this._willUpdateItems = true;
404
- if ((event == null ? void 0 : event.item) === this.selectedItem) {
405
- this.requestUpdate();
373
+ shouldScheduleManageSelection(event) {
374
+ if (!this.willManageSelection && (!event || event.target.getRootNode().host === this)) {
375
+ this.willManageSelection = true;
376
+ requestAnimationFrame(() => {
377
+ requestAnimationFrame(() => {
378
+ this.manageSelection();
379
+ });
380
+ });
406
381
  }
407
- let resolve = () => {
382
+ }
383
+ shouldManageSelection() {
384
+ if (this.willManageSelection) {
408
385
  return;
409
- };
410
- this.itemsUpdated = new Promise((res) => resolve = res);
411
- window.requestAnimationFrame(async () => {
412
- if (this.open) {
413
- await this.optionsMenu.updateComplete;
414
- this.menuItems = this.optionsMenu.childItems;
415
- } else {
416
- this.menuItems = [
417
- ...this.querySelectorAll(
418
- 'sp-menu-item:not([slot="submenu"] *)'
419
- )
420
- ];
421
- }
422
- this.manageSelection();
423
- resolve();
424
- this._willUpdateItems = false;
425
- });
386
+ }
387
+ this.willManageSelection = true;
388
+ this.manageSelection();
426
389
  }
427
390
  async manageSelection() {
428
391
  if (this.selects == null)
429
392
  return;
430
- await this.menuStatePromise;
431
393
  this.selectionPromise = new Promise(
432
394
  (res) => this.selectionResolver = res
433
395
  );
434
396
  let selectedItem;
397
+ await this.optionsMenu.updateComplete;
435
398
  this.menuItems.forEach((item) => {
436
399
  if (this.value === item.value && !item.disabled) {
437
400
  selectedItem = item;
@@ -451,34 +414,18 @@ export class PickerBase extends SizedMixin(Focusable) {
451
414
  this.optionsMenu.updateSelectedItemIndex();
452
415
  }
453
416
  this.selectionResolver();
417
+ this.willManageSelection = false;
454
418
  }
455
419
  async getUpdateComplete() {
456
420
  const complete = await super.getUpdateComplete();
457
- await this.menuStatePromise;
458
- await this.itemsUpdated;
459
421
  await this.selectionPromise;
460
422
  return complete;
461
423
  }
462
- connectedCallback() {
463
- this.updateMenuItems();
464
- this.addEventListener(
465
- "sp-menu-item-added-or-updated",
466
- this.updateMenuItems
467
- );
468
- this.addEventListener("sp-menu-item-removed", this.updateMenuItems);
469
- super.connectedCallback();
470
- }
471
424
  disconnectedCallback() {
472
425
  this.close();
473
426
  super.disconnectedCallback();
474
427
  }
475
428
  }
476
- /**
477
- * @private
478
- */
479
- PickerBase.openOverlay = async (target, interaction, content, options) => {
480
- return await openOverlay(target, interaction, content, options);
481
- };
482
429
  __decorateClass([
483
430
  query("#button")
484
431
  ], PickerBase.prototype, "button", 2);
@@ -503,6 +450,9 @@ __decorateClass([
503
450
  __decorateClass([
504
451
  property({ type: Boolean, reflect: true })
505
452
  ], PickerBase.prototype, "readonly", 2);
453
+ __decorateClass([
454
+ query("sp-menu")
455
+ ], PickerBase.prototype, "optionsMenu", 2);
506
456
  __decorateClass([
507
457
  property()
508
458
  ], PickerBase.prototype, "placement", 2);
@@ -514,7 +464,10 @@ __decorateClass([
514
464
  ], PickerBase.prototype, "value", 2);
515
465
  __decorateClass([
516
466
  property({ attribute: false })
517
- ], PickerBase.prototype, "selectedItem", 2);
467
+ ], PickerBase.prototype, "selectedItem", 1);
468
+ __decorateClass([
469
+ property({ attribute: false })
470
+ ], PickerBase.prototype, "selectedItemContent", 1);
518
471
  export class Picker extends PickerBase {
519
472
  constructor() {
520
473
  super(...arguments);
@@ -546,11 +499,12 @@ export class Picker extends PickerBase {
546
499
  static get styles() {
547
500
  return [pickerStyles, chevronStyles];
548
501
  }
549
- sizePopover(popover) {
550
- super.sizePopover(popover);
551
- if (this.quiet)
552
- return;
553
- popover.style.setProperty("min-width", `${this.offsetWidth}px`);
502
+ get containerStyles() {
503
+ const styles = super.containerStyles;
504
+ if (!this.quiet) {
505
+ styles["min-width"] = `${this.offsetWidth}px`;
506
+ }
507
+ return styles;
554
508
  }
555
509
  }
556
510
  //# sourceMappingURL=Picker.dev.js.map