@solid-design-system/components 1.7.0 → 1.9.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 (96) hide show
  1. package/dist/components/es/accordion-group.js +1 -1
  2. package/dist/components/es/accordion.js +1 -1
  3. package/dist/components/es/drawer.js +1 -0
  4. package/dist/components/es/dropdown.js +1 -0
  5. package/dist/components/es/event.js +1 -0
  6. package/dist/components/es/popup.js +1 -0
  7. package/dist/components/es/solid-components2.js +1 -1
  8. package/dist/components/es/solid-element.js +4 -4
  9. package/dist/components/es/tabbable.js +1 -0
  10. package/dist/components/umd/solid-components.js +16 -16
  11. package/dist/custom-elements.json +1 -1
  12. package/dist/package/components/drawer/drawer.d.ts +34 -0
  13. package/dist/package/components/drawer/drawer.js +283 -0
  14. package/dist/package/components/dropdown/dropdown.d.ts +49 -0
  15. package/dist/package/components/dropdown/dropdown.js +335 -0
  16. package/dist/package/components/icon/library.system.d.ts +1 -0
  17. package/dist/package/components/icon/library.system.js +6 -1
  18. package/dist/package/components/popup/popup.d.ts +42 -0
  19. package/dist/package/components/popup/popup.js +318 -0
  20. package/dist/package/internal/modal.d.ts +12 -0
  21. package/dist/package/internal/modal.js +52 -0
  22. package/dist/package/internal/offset.d.ts +4 -0
  23. package/dist/package/internal/offset.js +9 -0
  24. package/dist/package/internal/scroll.d.ts +3 -0
  25. package/dist/package/internal/scroll.js +49 -0
  26. package/dist/package/internal/string.d.ts +1 -0
  27. package/dist/package/internal/string.js +6 -0
  28. package/dist/package/internal/tabbable.d.ts +4 -0
  29. package/dist/package/internal/tabbable.js +50 -0
  30. package/dist/package/solid-components.d.ts +3 -0
  31. package/dist/package/solid-components.js +16 -10
  32. package/dist/package/styles/tailwind.css.js +1 -1
  33. package/dist/versioned-components/es/accordion-group.js +1 -1
  34. package/dist/versioned-components/es/accordion.js +1 -1
  35. package/dist/versioned-components/es/badge.js +1 -1
  36. package/dist/versioned-components/es/brandshape.js +1 -1
  37. package/dist/versioned-components/es/button.js +2 -2
  38. package/dist/versioned-components/es/divider.js +1 -1
  39. package/dist/versioned-components/es/drawer.js +1 -0
  40. package/dist/versioned-components/es/dropdown.js +1 -0
  41. package/dist/versioned-components/es/event.js +1 -0
  42. package/dist/versioned-components/es/icon.js +1 -1
  43. package/dist/versioned-components/es/include.js +1 -1
  44. package/dist/versioned-components/es/link.js +1 -1
  45. package/dist/versioned-components/es/popup.js +1 -0
  46. package/dist/versioned-components/es/solid-components2.js +1 -1
  47. package/dist/versioned-components/es/solid-element.js +4 -4
  48. package/dist/versioned-components/es/spinner.js +1 -1
  49. package/dist/versioned-components/es/tabbable.js +1 -0
  50. package/dist/versioned-components/es/teaser.js +1 -1
  51. package/dist/versioned-package/components/accordion/accordion.d.ts +1 -1
  52. package/dist/versioned-package/components/accordion/accordion.js +2 -2
  53. package/dist/versioned-package/components/accordion-group/accordion-group.d.ts +1 -1
  54. package/dist/versioned-package/components/accordion-group/accordion-group.js +3 -3
  55. package/dist/versioned-package/components/badge/badge.d.ts +1 -1
  56. package/dist/versioned-package/components/badge/badge.js +1 -1
  57. package/dist/versioned-package/components/brandshape/brandshape.d.ts +1 -1
  58. package/dist/versioned-package/components/brandshape/brandshape.js +1 -1
  59. package/dist/versioned-package/components/button/button.d.ts +1 -1
  60. package/dist/versioned-package/components/button/button.js +4 -4
  61. package/dist/versioned-package/components/divider/divider.d.ts +1 -1
  62. package/dist/versioned-package/components/divider/divider.js +2 -2
  63. package/dist/versioned-package/components/drawer/drawer.d.ts +34 -0
  64. package/dist/versioned-package/components/drawer/drawer.js +283 -0
  65. package/dist/versioned-package/components/dropdown/dropdown.d.ts +49 -0
  66. package/dist/versioned-package/components/dropdown/dropdown.js +335 -0
  67. package/dist/versioned-package/components/icon/icon.d.ts +1 -1
  68. package/dist/versioned-package/components/icon/icon.js +1 -1
  69. package/dist/versioned-package/components/icon/library.system.d.ts +1 -0
  70. package/dist/versioned-package/components/icon/library.system.js +6 -1
  71. package/dist/versioned-package/components/include/include.d.ts +1 -1
  72. package/dist/versioned-package/components/include/include.js +1 -1
  73. package/dist/versioned-package/components/link/link.d.ts +1 -1
  74. package/dist/versioned-package/components/link/link.js +2 -2
  75. package/dist/versioned-package/components/popup/popup.d.ts +42 -0
  76. package/dist/versioned-package/components/popup/popup.js +318 -0
  77. package/dist/versioned-package/components/spinner/spinner.d.ts +1 -1
  78. package/dist/versioned-package/components/spinner/spinner.js +1 -1
  79. package/dist/versioned-package/components/teaser/teaser.js +1 -1
  80. package/dist/versioned-package/internal/form.js +1 -1
  81. package/dist/versioned-package/internal/modal.d.ts +12 -0
  82. package/dist/versioned-package/internal/modal.js +52 -0
  83. package/dist/versioned-package/internal/offset.d.ts +4 -0
  84. package/dist/versioned-package/internal/offset.js +9 -0
  85. package/dist/versioned-package/internal/scroll.d.ts +3 -0
  86. package/dist/versioned-package/internal/scroll.js +49 -0
  87. package/dist/versioned-package/internal/string.d.ts +1 -0
  88. package/dist/versioned-package/internal/string.js +6 -0
  89. package/dist/versioned-package/internal/tabbable.d.ts +4 -0
  90. package/dist/versioned-package/internal/tabbable.js +50 -0
  91. package/dist/versioned-package/solid-components.d.ts +3 -0
  92. package/dist/versioned-package/solid-components.js +16 -10
  93. package/dist/versioned-package/styles/tailwind.css.js +1 -1
  94. package/dist/vscode.html-custom-data.json +731 -11
  95. package/dist/web-types.json +2107 -625
  96. package/package.json +4 -3
@@ -0,0 +1,283 @@
1
+ import "../button/button.js";
2
+ import "../icon/icon.js";
3
+ import { animateTo, stopAnimations } from "../../internal/animate.js";
4
+ import { css, html } from "lit";
5
+ import { query, property, customElement } from "lit/decorators.js";
6
+ import { setDefaultAnimation, getAnimation } from "../../utilities/animation-registry.js";
7
+ import { HasSlotController } from "../../internal/slot.js";
8
+ import { ifDefined } from "lit/directives/if-defined.js";
9
+ import { LocalizeController } from "../../utilities/localize.js";
10
+ import { lockBodyScrolling, unlockBodyScrolling } from "../../internal/scroll.js";
11
+ import { uppercaseFirstLetter } from "../../internal/string.js";
12
+ import { waitForEvent } from "../../internal/event.js";
13
+ import { watch } from "../../internal/watch.js";
14
+ import componentStyles from "../../styles/component.styles.js";
15
+ import cx from "classix";
16
+ import Modal from "../../internal/modal.js";
17
+ import SolidElement from "../../internal/solid-element.js";
18
+ var __defProp = Object.defineProperty;
19
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
20
+ var __decorateClass = (decorators, target, key, kind) => {
21
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
22
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
23
+ if (decorator = decorators[i])
24
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
25
+ if (kind && result)
26
+ __defProp(target, key, result);
27
+ return result;
28
+ };
29
+ let SdDrawer = class extends SolidElement {
30
+ constructor() {
31
+ super(...arguments);
32
+ this.hasSlotController = new HasSlotController(this, "footer");
33
+ this.localize = new LocalizeController(this);
34
+ this.modal = new Modal(this);
35
+ this.open = false;
36
+ this.label = "";
37
+ this.placement = "end";
38
+ this.contained = false;
39
+ this.noHeader = false;
40
+ this.handleDocumentKeyDown = (event) => {
41
+ if (this.open && event.key === "Escape") {
42
+ event.stopPropagation();
43
+ this.requestClose("keyboard");
44
+ }
45
+ };
46
+ }
47
+ firstUpdated() {
48
+ this.drawer.hidden = !this.open;
49
+ if (this.open) {
50
+ this.addOpenListeners();
51
+ if (!this.contained) {
52
+ this.modal.activate();
53
+ lockBodyScrolling(this);
54
+ }
55
+ }
56
+ }
57
+ disconnectedCallback() {
58
+ super.disconnectedCallback();
59
+ unlockBodyScrolling(this);
60
+ }
61
+ requestClose(source) {
62
+ const slRequestClose = this.emit("sd-request-close", {
63
+ cancelable: true,
64
+ detail: { source }
65
+ });
66
+ if (slRequestClose.defaultPrevented) {
67
+ const animation = getAnimation(this, "drawer.denyClose", { dir: this.localize.dir() });
68
+ animateTo(this.panel, animation.keyframes, animation.options);
69
+ return;
70
+ }
71
+ this.hide();
72
+ }
73
+ addOpenListeners() {
74
+ document.addEventListener("keydown", this.handleDocumentKeyDown);
75
+ }
76
+ removeOpenListeners() {
77
+ document.removeEventListener("keydown", this.handleDocumentKeyDown);
78
+ }
79
+ async handleOpenChange() {
80
+ if (this.open) {
81
+ this.emit("sd-show");
82
+ this.addOpenListeners();
83
+ this.originalTrigger = document.activeElement;
84
+ if (!this.contained) {
85
+ this.modal.activate();
86
+ lockBodyScrolling(this);
87
+ }
88
+ const autoFocusTarget = this.querySelector("[autofocus]");
89
+ if (autoFocusTarget) {
90
+ autoFocusTarget.removeAttribute("autofocus");
91
+ }
92
+ await Promise.all([stopAnimations(this.drawer), stopAnimations(this.overlay)]);
93
+ this.drawer.hidden = false;
94
+ requestAnimationFrame(() => {
95
+ const sdInitialFocus = this.emit("sd-initial-focus", { cancelable: true });
96
+ if (!sdInitialFocus.defaultPrevented) {
97
+ if (autoFocusTarget) {
98
+ autoFocusTarget.focus({ preventScroll: true });
99
+ } else {
100
+ this.panel.focus({ preventScroll: true });
101
+ }
102
+ }
103
+ if (autoFocusTarget) {
104
+ autoFocusTarget.setAttribute("autofocus", "");
105
+ }
106
+ });
107
+ const panelAnimation = getAnimation(this, `drawer.show${uppercaseFirstLetter(this.placement)}`, {
108
+ dir: this.localize.dir()
109
+ });
110
+ const overlayAnimation = getAnimation(this, "drawer.overlay.show", { dir: this.localize.dir() });
111
+ await Promise.all([
112
+ animateTo(this.panel, panelAnimation.keyframes, panelAnimation.options),
113
+ animateTo(this.overlay, overlayAnimation.keyframes, overlayAnimation.options)
114
+ ]);
115
+ this.emit("sd-after-show");
116
+ } else {
117
+ this.emit("sd-hide");
118
+ this.removeOpenListeners();
119
+ if (!this.contained) {
120
+ this.modal.deactivate();
121
+ unlockBodyScrolling(this);
122
+ }
123
+ await Promise.all([stopAnimations(this.drawer), stopAnimations(this.overlay)]);
124
+ const panelAnimation = getAnimation(this, `drawer.hide${uppercaseFirstLetter(this.placement)}`, {
125
+ dir: this.localize.dir()
126
+ });
127
+ const overlayAnimation = getAnimation(this, "drawer.overlay.hide", { dir: this.localize.dir() });
128
+ await Promise.all([
129
+ animateTo(this.overlay, overlayAnimation.keyframes, overlayAnimation.options).then(() => {
130
+ this.overlay.hidden = true;
131
+ }),
132
+ animateTo(this.panel, panelAnimation.keyframes, panelAnimation.options).then(() => {
133
+ this.panel.hidden = true;
134
+ })
135
+ ]);
136
+ this.drawer.hidden = true;
137
+ this.overlay.hidden = false;
138
+ this.panel.hidden = false;
139
+ const trigger = this.originalTrigger;
140
+ if (typeof (trigger == null ? void 0 : trigger.focus) === "function") {
141
+ setTimeout(() => trigger.focus());
142
+ }
143
+ this.emit("sd-after-hide");
144
+ }
145
+ }
146
+ handleNoModalChange() {
147
+ if (this.open && !this.contained) {
148
+ this.modal.activate();
149
+ lockBodyScrolling(this);
150
+ }
151
+ if (this.open && this.contained) {
152
+ this.modal.deactivate();
153
+ unlockBodyScrolling(this);
154
+ }
155
+ }
156
+ /** Shows the drawer. */
157
+ async show() {
158
+ if (this.open) {
159
+ return void 0;
160
+ }
161
+ this.open = true;
162
+ return waitForEvent(this, "sd-after-show");
163
+ }
164
+ /** Hides the drawer */
165
+ async hide() {
166
+ if (!this.open) {
167
+ return void 0;
168
+ }
169
+ this.open = false;
170
+ return waitForEvent(this, "sd-after-hide");
171
+ }
172
+ render() {
173
+ return html`<div part="base" class="${cx(
174
+ "top-0 start-0 w-full h-full pointer-events-none overflow-hidden",
175
+ this.contained ? "absolute" : "fixed"
176
+ )}"><div part="overlay" class="${cx(
177
+ "block top-0 left-0 right-0 bottom-0 bg-neutral-800/75 pointer-events-auto",
178
+ this.contained ? "absolute" : "fixed"
179
+ )}" @click="${() => this.requestClose("overlay")}" tabindex="-1"></div><div part="panel" class="${cx(
180
+ "absolute flex flex-col z-10 max-w-full max-h-full bg-white shadow-lg overflow-auto pointer-events-auto focus:outline-none",
181
+ {
182
+ end: "top-0 end-0 bottom-auto start-auto w-[--width] h-full",
183
+ start: "top-0 end-auto bottom-auto start-0 w-[--width] h-full"
184
+ }[this.placement]
185
+ )}" role="dialog" aria-modal="true" aria-hidden="${this.open ? "false" : "true"}" aria-label="${this.label}" aria-labelledby="${ifDefined(!this.noHeader ? "title" : void 0)}" tabindex="0">${!this.noHeader ? html`<header part="header" class="flex justify-between py-2 px-4 items-center flex-shrink-0" style="min-height:56px"><div part="title"><slot name="header" part="title" class="flex-auto text-xl m-0" id="title"></slot></div><div class="shrink-0 flex flex-wrap justify-end gap-1 ml-4 absolute top-2 right-2"><sd-button variant="tertiary" size="lg" part="close-button" @click="${() => this.requestClose("close-button")}"><sd-icon name="close" library="system"></sd-icon></sd-button></div></header>` : ""}<div part="body" class="flex-auto block px-4"><slot></slot></div><footer part="footer" class="${cx(this.hasSlotController.test("footer") ? "text-left p-4" : "hidden")}"><slot name="footer"></slot></footer></div></div>`;
186
+ }
187
+ };
188
+ SdDrawer.styles = [
189
+ SolidElement.styles,
190
+ css`${componentStyles}:host{--width:25rem;display:contents}:host([contained]){z-index:initial}:host(:not([contained])){z-index:var(--sd-z-index-drawer)}[part=body]{-webkit-overflow-scrolling:touch;overflow-y:scroll;scrollbar-width:none}[part=body]::-webkit-scrollbar{width:0;height:0}`
191
+ ];
192
+ __decorateClass([
193
+ query("[part=base]")
194
+ ], SdDrawer.prototype, "drawer", 2);
195
+ __decorateClass([
196
+ query("[part=panel]")
197
+ ], SdDrawer.prototype, "panel", 2);
198
+ __decorateClass([
199
+ query("[part=overlay]")
200
+ ], SdDrawer.prototype, "overlay", 2);
201
+ __decorateClass([
202
+ property({ type: Boolean, reflect: true })
203
+ ], SdDrawer.prototype, "open", 2);
204
+ __decorateClass([
205
+ property({ attribute: "label", reflect: true })
206
+ ], SdDrawer.prototype, "label", 2);
207
+ __decorateClass([
208
+ property({ reflect: true })
209
+ ], SdDrawer.prototype, "placement", 2);
210
+ __decorateClass([
211
+ property({ type: Boolean, reflect: true })
212
+ ], SdDrawer.prototype, "contained", 2);
213
+ __decorateClass([
214
+ property({ attribute: "no-header", type: Boolean })
215
+ ], SdDrawer.prototype, "noHeader", 2);
216
+ __decorateClass([
217
+ watch("open", { waitUntilFirstUpdate: true })
218
+ ], SdDrawer.prototype, "handleOpenChange", 1);
219
+ __decorateClass([
220
+ watch("contained", { waitUntilFirstUpdate: true })
221
+ ], SdDrawer.prototype, "handleNoModalChange", 1);
222
+ SdDrawer = __decorateClass([
223
+ customElement("sd-drawer")
224
+ ], SdDrawer);
225
+ setDefaultAnimation("drawer.showStart", {
226
+ keyframes: [
227
+ { opacity: 0, translate: "-100%" },
228
+ { opacity: 1, translate: "0" }
229
+ ],
230
+ rtlKeyframes: [
231
+ { opacity: 0, translate: "100%" },
232
+ { opacity: 1, translate: "0" }
233
+ ],
234
+ options: { duration: 250, easing: "ease" }
235
+ });
236
+ setDefaultAnimation("drawer.hideStart", {
237
+ keyframes: [
238
+ { opacity: 1, translate: "0" },
239
+ { opacity: 0, translate: "-100%" }
240
+ ],
241
+ rtlKeyframes: [
242
+ { opacity: 1, translate: "0" },
243
+ { opacity: 0, translate: "100%" }
244
+ ],
245
+ options: { duration: 250, easing: "ease" }
246
+ });
247
+ setDefaultAnimation("drawer.showEnd", {
248
+ keyframes: [
249
+ { opacity: 0, translate: "100%" },
250
+ { opacity: 1, translate: "0" }
251
+ ],
252
+ rtlKeyframes: [
253
+ { opacity: 0, translate: "-100%" },
254
+ { opacity: 1, translate: "0" }
255
+ ],
256
+ options: { duration: 250, easing: "ease" }
257
+ });
258
+ setDefaultAnimation("drawer.hideEnd", {
259
+ keyframes: [
260
+ { opacity: 1, translate: "0" },
261
+ { opacity: 0, translate: "100%" }
262
+ ],
263
+ rtlKeyframes: [
264
+ { opacity: 1, translate: "0" },
265
+ { opacity: 0, translate: "-100%" }
266
+ ],
267
+ options: { duration: 250, easing: "ease" }
268
+ });
269
+ setDefaultAnimation("drawer.denyClose", {
270
+ keyframes: [{ scale: 1 }, { scale: 1.01 }, { scale: 1 }],
271
+ options: { duration: 250 }
272
+ });
273
+ setDefaultAnimation("drawer.overlay.show", {
274
+ keyframes: [{ opacity: 0 }, { opacity: 1 }],
275
+ options: { duration: 250 }
276
+ });
277
+ setDefaultAnimation("drawer.overlay.hide", {
278
+ keyframes: [{ opacity: 1 }, { opacity: 0 }],
279
+ options: { duration: 250 }
280
+ });
281
+ export {
282
+ SdDrawer as default
283
+ };
@@ -0,0 +1,49 @@
1
+ import '../popup/popup';
2
+ import SolidElement from '../../internal/solid-element';
3
+ import type SdMenu from '../../_components/menu/menu';
4
+ import type SdPopup from '../popup/popup';
5
+ export default class SdDropdown extends SolidElement {
6
+ popup: SdPopup;
7
+ trigger: HTMLSlotElement;
8
+ panel: HTMLSlotElement;
9
+ private readonly localize;
10
+ open: boolean;
11
+ rounded: boolean;
12
+ placement: 'top' | 'top-start' | 'top-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'right' | 'right-start' | 'right-end' | 'left' | 'left-start' | 'left-end';
13
+ disabled: boolean;
14
+ stayOpenOnSelect: boolean;
15
+ containingElement?: HTMLElement;
16
+ distance: number;
17
+ skidding: number;
18
+ noAutoSize: boolean;
19
+ noFlip: boolean;
20
+ hoist: boolean;
21
+ connectedCallback(): void;
22
+ firstUpdated(): void;
23
+ disconnectedCallback(): void;
24
+ focusOnTrigger(): void;
25
+ getMenu(): SdMenu | undefined;
26
+ handleKeyDown(event: KeyboardEvent): void;
27
+ handleDocumentKeyDown(event: KeyboardEvent): void;
28
+ handleDocumentMouseDown(event: MouseEvent): void;
29
+ handleMenuItemActivate(event: CustomEvent): void;
30
+ handlePanelSelect(event: CustomEvent): void;
31
+ handleTriggerClick(): void;
32
+ handleTriggerKeyDown(event: KeyboardEvent): void;
33
+ handleTriggerKeyUp(event: KeyboardEvent): void;
34
+ handleTriggerSlotChange(): void;
35
+ updateAccessibleTrigger(): void;
36
+ show(): Promise<void>;
37
+ hide(): Promise<void>;
38
+ reposition(): void;
39
+ addOpenListeners(): void;
40
+ removeOpenListeners(): void;
41
+ handleOpenChange(): Promise<void>;
42
+ render(): import("lit-html").TemplateResult<1>;
43
+ static styles: import("lit").CSSResultGroup[];
44
+ }
45
+ declare global {
46
+ interface HTMLElementTagNameMap {
47
+ 'sd-dropdown': SdDropdown;
48
+ }
49
+ }
@@ -0,0 +1,335 @@
1
+ import "../popup/popup.js";
2
+ import { stopAnimations, animateTo } from "../../internal/animate.js";
3
+ import { css, html } from "lit";
4
+ import { query, property, customElement } from "lit/decorators.js";
5
+ import { setDefaultAnimation, getAnimation } from "../../utilities/animation-registry.js";
6
+ import { getTabbableBoundary } from "../../internal/tabbable.js";
7
+ import { LocalizeController } from "../../utilities/localize.js";
8
+ import { scrollIntoView } from "../../internal/scroll.js";
9
+ import { waitForEvent } from "../../internal/event.js";
10
+ import { watch } from "../../internal/watch.js";
11
+ import componentStyles from "../../styles/component.styles.js";
12
+ import cx from "classix";
13
+ import SolidElement from "../../internal/solid-element.js";
14
+ var __defProp = Object.defineProperty;
15
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
16
+ var __decorateClass = (decorators, target, key, kind) => {
17
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
18
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
19
+ if (decorator = decorators[i])
20
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
21
+ if (kind && result)
22
+ __defProp(target, key, result);
23
+ return result;
24
+ };
25
+ let SdDropdown = class extends SolidElement {
26
+ constructor() {
27
+ super(...arguments);
28
+ this.localize = new LocalizeController(this);
29
+ this.open = false;
30
+ this.rounded = false;
31
+ this.placement = "bottom-start";
32
+ this.disabled = false;
33
+ this.stayOpenOnSelect = false;
34
+ this.distance = 0;
35
+ this.skidding = 0;
36
+ this.noAutoSize = false;
37
+ this.noFlip = false;
38
+ this.hoist = false;
39
+ }
40
+ connectedCallback() {
41
+ super.connectedCallback();
42
+ this.handleMenuItemActivate = this.handleMenuItemActivate.bind(this);
43
+ this.handlePanelSelect = this.handlePanelSelect.bind(this);
44
+ this.handleKeyDown = this.handleKeyDown.bind(this);
45
+ this.handleDocumentKeyDown = this.handleDocumentKeyDown.bind(this);
46
+ this.handleDocumentMouseDown = this.handleDocumentMouseDown.bind(this);
47
+ if (!this.containingElement) {
48
+ this.containingElement = this;
49
+ }
50
+ }
51
+ firstUpdated() {
52
+ this.panel.hidden = !this.open;
53
+ if (this.open) {
54
+ this.addOpenListeners();
55
+ this.popup.active = true;
56
+ }
57
+ }
58
+ disconnectedCallback() {
59
+ super.disconnectedCallback();
60
+ this.removeOpenListeners();
61
+ this.hide();
62
+ }
63
+ focusOnTrigger() {
64
+ const trigger = this.trigger.assignedElements({ flatten: true })[0];
65
+ if (typeof (trigger == null ? void 0 : trigger.focus) === "function") {
66
+ trigger.focus();
67
+ }
68
+ }
69
+ getMenu() {
70
+ return this.panel.assignedElements({ flatten: true }).find((el) => el.tagName.toLowerCase() === "sd-menu");
71
+ }
72
+ handleKeyDown(event) {
73
+ if (this.open && event.key === "Escape") {
74
+ event.stopPropagation();
75
+ this.hide();
76
+ this.focusOnTrigger();
77
+ }
78
+ }
79
+ handleDocumentKeyDown(event) {
80
+ var _a;
81
+ if (event.key === "Tab") {
82
+ if (this.open && ((_a = document.activeElement) == null ? void 0 : _a.tagName.toLowerCase()) === "sd-menu-item") {
83
+ event.preventDefault();
84
+ this.hide();
85
+ this.focusOnTrigger();
86
+ return;
87
+ }
88
+ setTimeout(() => {
89
+ var _a2, _b, _c;
90
+ const activeElement = ((_a2 = this.containingElement) == null ? void 0 : _a2.getRootNode()) instanceof ShadowRoot ? (_c = (_b = document.activeElement) == null ? void 0 : _b.shadowRoot) == null ? void 0 : _c.activeElement : document.activeElement;
91
+ if (!this.containingElement || (activeElement == null ? void 0 : activeElement.closest(this.containingElement.tagName.toLowerCase())) !== this.containingElement) {
92
+ this.hide();
93
+ }
94
+ });
95
+ }
96
+ }
97
+ handleDocumentMouseDown(event) {
98
+ const path = event.composedPath();
99
+ if (this.containingElement && !path.includes(this.containingElement)) {
100
+ this.hide();
101
+ }
102
+ }
103
+ handleMenuItemActivate(event) {
104
+ const item = event.target;
105
+ scrollIntoView(item, this.panel);
106
+ }
107
+ handlePanelSelect(event) {
108
+ const target = event.target;
109
+ if (!this.stayOpenOnSelect && target.tagName.toLowerCase() === "sd-menu") {
110
+ this.hide();
111
+ this.focusOnTrigger();
112
+ }
113
+ }
114
+ handleTriggerClick() {
115
+ if (this.open) {
116
+ this.hide();
117
+ } else {
118
+ this.show();
119
+ }
120
+ }
121
+ handleTriggerKeyDown(event) {
122
+ if (event.key === "Escape" && this.open) {
123
+ event.stopPropagation();
124
+ this.focusOnTrigger();
125
+ this.hide();
126
+ return;
127
+ }
128
+ if ([" ", "Enter"].includes(event.key)) {
129
+ event.preventDefault();
130
+ this.handleTriggerClick();
131
+ return;
132
+ }
133
+ const menu = this.getMenu();
134
+ if (menu) {
135
+ const menuItems = menu.defaultSlot.assignedElements({ flatten: true });
136
+ const firstMenuItem = menuItems[0];
137
+ const lastMenuItem = menuItems[menuItems.length - 1];
138
+ if (["ArrowDown", "ArrowUp", "Home", "End"].includes(event.key)) {
139
+ event.preventDefault();
140
+ if (!this.open) {
141
+ this.show();
142
+ }
143
+ if (menuItems.length > 0) {
144
+ requestAnimationFrame(() => {
145
+ if (event.key === "ArrowDown" || event.key === "Home") {
146
+ menu.setCurrentItem(firstMenuItem);
147
+ firstMenuItem.focus();
148
+ }
149
+ if (event.key === "ArrowUp" || event.key === "End") {
150
+ menu.setCurrentItem(lastMenuItem);
151
+ lastMenuItem.focus();
152
+ }
153
+ });
154
+ }
155
+ }
156
+ }
157
+ }
158
+ handleTriggerKeyUp(event) {
159
+ if (event.key === " ") {
160
+ event.preventDefault();
161
+ }
162
+ }
163
+ handleTriggerSlotChange() {
164
+ this.updateAccessibleTrigger();
165
+ }
166
+ //
167
+ // Slotted triggers can be arbitrary content, but we need to link them to the dropdown panel with `aria-haspopup` and
168
+ // `aria-expanded`. These must be applied to the "accessible trigger" (the tabbable portion of the trigger element
169
+ // that gets slotted in) so screen readers will understand them. The accessible trigger could be the slotted element,
170
+ // a child of the slotted element, or an element in the slotted element's shadow root.
171
+ //
172
+ // For example, the accessible trigger of an <sd-button> is a <button> located inside its shadow root.
173
+ //
174
+ // To determine this, we assume the first tabbable element in the trigger slot is the "accessible trigger."
175
+ //
176
+ updateAccessibleTrigger() {
177
+ const assignedElements = this.trigger.assignedElements({ flatten: true });
178
+ const accessibleTrigger = assignedElements.find((el) => getTabbableBoundary(el).start);
179
+ let target;
180
+ if (accessibleTrigger) {
181
+ switch (accessibleTrigger.tagName.toLowerCase()) {
182
+ case "sd-button":
183
+ case "sd-icon-button":
184
+ target = accessibleTrigger.button;
185
+ break;
186
+ default:
187
+ target = accessibleTrigger;
188
+ }
189
+ target.setAttribute("aria-haspopup", "true");
190
+ target.setAttribute("aria-expanded", this.open ? "true" : "false");
191
+ }
192
+ }
193
+ /** Shows the dropdown panel. */
194
+ async show() {
195
+ if (this.open) {
196
+ return void 0;
197
+ }
198
+ this.open = true;
199
+ return waitForEvent(this, "sd-after-show");
200
+ }
201
+ /** Hides the dropdown panel */
202
+ async hide() {
203
+ if (!this.open) {
204
+ return void 0;
205
+ }
206
+ this.open = false;
207
+ return waitForEvent(this, "sd-after-hide");
208
+ }
209
+ /**
210
+ * Instructs the dropdown menu to reposition. Useful when the position or size of the trigger changes when the menu
211
+ * is activated.
212
+ */
213
+ reposition() {
214
+ this.popup.reposition();
215
+ }
216
+ addOpenListeners() {
217
+ this.panel.addEventListener("sd-activate", this.handleMenuItemActivate);
218
+ this.panel.addEventListener("sd-select", this.handlePanelSelect);
219
+ this.panel.addEventListener("keydown", this.handleKeyDown);
220
+ document.addEventListener("keydown", this.handleDocumentKeyDown);
221
+ document.addEventListener("mousedown", this.handleDocumentMouseDown);
222
+ }
223
+ removeOpenListeners() {
224
+ if (this.panel) {
225
+ this.panel.removeEventListener("sd-activate", this.handleMenuItemActivate);
226
+ this.panel.removeEventListener("sd-select", this.handlePanelSelect);
227
+ this.panel.removeEventListener("keydown", this.handleKeyDown);
228
+ }
229
+ document.removeEventListener("keydown", this.handleDocumentKeyDown);
230
+ document.removeEventListener("mousedown", this.handleDocumentMouseDown);
231
+ }
232
+ async handleOpenChange() {
233
+ if (this.disabled) {
234
+ this.open = false;
235
+ return;
236
+ }
237
+ this.updateAccessibleTrigger();
238
+ if (this.open) {
239
+ this.emit("sd-show");
240
+ this.addOpenListeners();
241
+ await stopAnimations(this);
242
+ this.panel.hidden = false;
243
+ this.popup.active = true;
244
+ const { keyframes, options } = getAnimation(this, "dropdown.show", { dir: this.localize.dir() });
245
+ await animateTo(this.popup.popup, keyframes, options);
246
+ this.emit("sd-after-show");
247
+ } else {
248
+ this.emit("sd-hide");
249
+ this.removeOpenListeners();
250
+ await stopAnimations(this);
251
+ const { keyframes, options } = getAnimation(this, "dropdown.hide", { dir: this.localize.dir() });
252
+ await animateTo(this.popup.popup, keyframes, options);
253
+ this.panel.hidden = true;
254
+ this.popup.active = false;
255
+ this.emit("sd-after-hide");
256
+ }
257
+ }
258
+ render() {
259
+ return html`<sd-popup part="base" id="dropdown" placement="${this.placement}" distance="${this.rounded && this.distance < 1 ? 1 : this.distance}" skidding="${this.skidding}" strategy="${this.hoist ? "fixed" : "absolute"}" ?flip="${!this.noFlip}" shift auto-size="vertical" auto-size-padding="10" ?active="${this.open}"><slot name="trigger" slot="anchor" part="trigger" class="block" @click="${this.handleTriggerClick}" @keydown="${this.handleTriggerKeyDown}" @keyup="${this.handleTriggerKeyUp}" @slotchange="${this.handleTriggerSlotChange}"></slot><slot part="panel" class="${cx(
260
+ "shadow bg-white",
261
+ this.open ? "block pointer-events-auto" : "pointer-events-none",
262
+ this.rounded && "rounded-md"
263
+ )}" aria-hidden="${this.open ? "false" : "true"}" aria-labelledby="dropdown"></slot></sd-popup>`;
264
+ }
265
+ };
266
+ SdDropdown.styles = [
267
+ SolidElement.styles,
268
+ componentStyles,
269
+ css`:host{display:inline-block}#dropdown::part(popup){z-index:var(--sd-z-index-dropdown)}#dropdown[data-current-placement^=top]::part(popup){transform-origin:bottom}#dropdown[data-current-placement^=bottom]::part(popup){transform-origin:top}#dropdown[data-current-placement^=left]::part(popup){transform-origin:right}#dropdown[data-current-placement^=right]::part(popup){transform-origin:left}:host(:not([no-auto-size])) ::slotted(:not([slot=trigger])){overflow:auto;max-width:var(--auto-size-available-width)!important;max-height:var(--auto-size-available-height)!important}`
270
+ ];
271
+ __decorateClass([
272
+ query("#dropdown")
273
+ ], SdDropdown.prototype, "popup", 2);
274
+ __decorateClass([
275
+ query("[part=trigger]")
276
+ ], SdDropdown.prototype, "trigger", 2);
277
+ __decorateClass([
278
+ query("[part=panel]")
279
+ ], SdDropdown.prototype, "panel", 2);
280
+ __decorateClass([
281
+ property({ type: Boolean, reflect: true })
282
+ ], SdDropdown.prototype, "open", 2);
283
+ __decorateClass([
284
+ property({ type: Boolean, reflect: true })
285
+ ], SdDropdown.prototype, "rounded", 2);
286
+ __decorateClass([
287
+ property({ reflect: true })
288
+ ], SdDropdown.prototype, "placement", 2);
289
+ __decorateClass([
290
+ property({ type: Boolean, reflect: true })
291
+ ], SdDropdown.prototype, "disabled", 2);
292
+ __decorateClass([
293
+ property({ attribute: "stay-open-on-select", type: Boolean, reflect: true })
294
+ ], SdDropdown.prototype, "stayOpenOnSelect", 2);
295
+ __decorateClass([
296
+ property({ attribute: false })
297
+ ], SdDropdown.prototype, "containingElement", 2);
298
+ __decorateClass([
299
+ property({ type: Number })
300
+ ], SdDropdown.prototype, "distance", 2);
301
+ __decorateClass([
302
+ property({ type: Number })
303
+ ], SdDropdown.prototype, "skidding", 2);
304
+ __decorateClass([
305
+ property({ type: Boolean, reflect: true, attribute: "no-auto-size" })
306
+ ], SdDropdown.prototype, "noAutoSize", 2);
307
+ __decorateClass([
308
+ property({ type: Boolean, reflect: true, attribute: "no-flip" })
309
+ ], SdDropdown.prototype, "noFlip", 2);
310
+ __decorateClass([
311
+ property({ type: Boolean })
312
+ ], SdDropdown.prototype, "hoist", 2);
313
+ __decorateClass([
314
+ watch("open", { waitUntilFirstUpdate: true })
315
+ ], SdDropdown.prototype, "handleOpenChange", 1);
316
+ SdDropdown = __decorateClass([
317
+ customElement("sd-dropdown")
318
+ ], SdDropdown);
319
+ setDefaultAnimation("dropdown.show", {
320
+ keyframes: [
321
+ { opacity: 0, scale: 0.9 },
322
+ { opacity: 1, scale: 1 }
323
+ ],
324
+ options: { duration: 100, easing: "ease" }
325
+ });
326
+ setDefaultAnimation("dropdown.hide", {
327
+ keyframes: [
328
+ { opacity: 1, scale: 1 },
329
+ { opacity: 0, scale: 0.9 }
330
+ ],
331
+ options: { duration: 100, easing: "ease" }
332
+ });
333
+ export {
334
+ SdDropdown as default
335
+ };
@@ -2,6 +2,7 @@ import type { IconLibrary } from './library';
2
2
  export declare const icons: {
3
3
  'chevron-down': string;
4
4
  'chevron-up': string;
5
+ close: string;
5
6
  };
6
7
  declare const systemLibrary: IconLibrary;
7
8
  export default systemLibrary;
@@ -8,7 +8,12 @@ const icons = {
8
8
  <svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
9
9
  <path d="M12.743 6.333c-0.188-0.195-0.452-0.316-0.743-0.316s-0.555 0.121-0.743 0.315l-0 0-9 10c-0.137 0.17-0.22 0.388-0.22 0.626 0 0.552 0.448 1 1 1 0.276 0 0.526-0.112 0.707-0.293v0l8.257-9.173 8.257 9.173c0.181 0.181 0.431 0.292 0.707 0.292 0.552 0 1-0.448 1-1 0-0.238-0.083-0.456-0.222-0.628l0.001 0.002z"></path>
10
10
  </svg>
11
- `
11
+ `,
12
+ close: `
13
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
14
+ <path d="M21.707 2.293a1 1 0 0 0-1.414 0L12 10.586 3.707 2.293a1 1 0 0 0-1.413 1.414l-.001-.001 8.293 8.293-8.293 8.293a1 1 0 0 0 0 1.414 1 1 0 0 0 1.414 0L12 13.413l8.293 8.293a1 1 0 0 0 1.414 0 1 1 0 0 0 0-1.414l-8.293-8.293 8.293-8.293a1 1 0 0 0 0-1.414z"/></svg>
15
+ </svg>
16
+ `
12
17
  };
13
18
  const systemLibrary = {
14
19
  name: "system",