@duskmoon-dev/el-drawer 0.4.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.
@@ -0,0 +1,339 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropNames = Object.getOwnPropertyNames;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __moduleCache = /* @__PURE__ */ new WeakMap;
6
+ var __toCommonJS = (from) => {
7
+ var entry = __moduleCache.get(from), desc;
8
+ if (entry)
9
+ return entry;
10
+ entry = __defProp({}, "__esModule", { value: true });
11
+ if (from && typeof from === "object" || typeof from === "function")
12
+ __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
13
+ get: () => from[key],
14
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
15
+ }));
16
+ __moduleCache.set(from, entry);
17
+ return entry;
18
+ };
19
+ var __export = (target, all) => {
20
+ for (var name in all)
21
+ __defProp(target, name, {
22
+ get: all[name],
23
+ enumerable: true,
24
+ configurable: true,
25
+ set: (newValue) => all[name] = () => newValue
26
+ });
27
+ };
28
+
29
+ // src/index.ts
30
+ var exports_src = {};
31
+ __export(exports_src, {
32
+ register: () => register,
33
+ ElDmDrawer: () => ElDmDrawer
34
+ });
35
+ module.exports = __toCommonJS(exports_src);
36
+
37
+ // src/el-dm-drawer.ts
38
+ var import_el_core = require("@duskmoon-dev/el-core");
39
+ var styles = import_el_core.css`
40
+ :host {
41
+ display: contents;
42
+ }
43
+
44
+ :host([hidden]) {
45
+ display: none !important;
46
+ }
47
+
48
+ .drawer-wrapper {
49
+ position: fixed;
50
+ inset: 0;
51
+ z-index: 1000;
52
+ pointer-events: none;
53
+ }
54
+
55
+ .drawer-wrapper.open {
56
+ pointer-events: auto;
57
+ }
58
+
59
+ .drawer-backdrop {
60
+ position: absolute;
61
+ inset: 0;
62
+ background-color: rgba(0, 0, 0, 0.5);
63
+ opacity: 0;
64
+ visibility: hidden;
65
+ transition:
66
+ opacity 300ms ease,
67
+ visibility 300ms ease;
68
+ }
69
+
70
+ .drawer-wrapper.open .drawer-backdrop {
71
+ opacity: 1;
72
+ visibility: visible;
73
+ }
74
+
75
+ .drawer {
76
+ position: absolute;
77
+ top: 0;
78
+ bottom: 0;
79
+ display: flex;
80
+ flex-direction: column;
81
+ width: var(--drawer-width, 280px);
82
+ max-width: 100vw;
83
+ background-color: var(--color-surface);
84
+ box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25);
85
+ transition: transform 300ms cubic-bezier(0.4, 0, 0.2, 1);
86
+ font-family: inherit;
87
+ pointer-events: auto;
88
+ }
89
+
90
+ .drawer-left {
91
+ left: 0;
92
+ border-right: 1px solid var(--color-outline);
93
+ transform: translateX(-100%);
94
+ }
95
+
96
+ .drawer-right {
97
+ right: 0;
98
+ border-left: 1px solid var(--color-outline);
99
+ transform: translateX(100%);
100
+ }
101
+
102
+ .drawer-wrapper.open .drawer-left,
103
+ .drawer-wrapper.open .drawer-right {
104
+ transform: translateX(0);
105
+ }
106
+
107
+ .drawer-header {
108
+ display: flex;
109
+ align-items: center;
110
+ justify-content: space-between;
111
+ padding: 1rem 1.5rem;
112
+ border-bottom: 1px solid var(--color-outline);
113
+ flex-shrink: 0;
114
+ }
115
+
116
+ .drawer-body {
117
+ flex: 1;
118
+ padding: 1rem 1.5rem;
119
+ overflow-y: auto;
120
+ }
121
+
122
+ .drawer-footer {
123
+ display: flex;
124
+ align-items: center;
125
+ gap: 0.5rem;
126
+ padding: 1rem 1.5rem;
127
+ border-top: 1px solid var(--color-outline);
128
+ flex-shrink: 0;
129
+ }
130
+
131
+ .drawer-close {
132
+ display: flex;
133
+ align-items: center;
134
+ justify-content: center;
135
+ width: 2rem;
136
+ height: 2rem;
137
+ border: none;
138
+ background: transparent;
139
+ border-radius: 0.5rem;
140
+ cursor: pointer;
141
+ color: var(--color-on-surface);
142
+ opacity: 0.7;
143
+ transition:
144
+ opacity 150ms ease,
145
+ background-color 150ms ease;
146
+ }
147
+
148
+ .drawer-close:hover {
149
+ opacity: 1;
150
+ background-color: var(--color-surface-variant);
151
+ }
152
+
153
+ .drawer-close:focus {
154
+ outline: 2px solid var(--color-primary);
155
+ outline-offset: 2px;
156
+ }
157
+
158
+ /* Non-modal drawer positioning */
159
+ :host(:not([modal])) .drawer-wrapper {
160
+ pointer-events: none;
161
+ }
162
+
163
+ :host(:not([modal])) .drawer {
164
+ pointer-events: auto;
165
+ }
166
+ `;
167
+
168
+ class ElDmDrawer extends import_el_core.BaseElement {
169
+ static properties = {
170
+ open: { type: Boolean, reflect: true },
171
+ position: { type: String, reflect: true, default: "left" },
172
+ modal: { type: Boolean, reflect: true },
173
+ width: { type: String, reflect: true }
174
+ };
175
+ _focusableElements = [];
176
+ _previouslyFocused = null;
177
+ constructor() {
178
+ super();
179
+ this.attachStyles(styles);
180
+ }
181
+ _handleBackdropClick(event) {
182
+ if (this.modal && event.target === event.currentTarget) {
183
+ this.hide();
184
+ }
185
+ }
186
+ _handleKeyDown = (event) => {
187
+ if (event.key === "Escape" && this.modal) {
188
+ this.hide();
189
+ return;
190
+ }
191
+ if (event.key === "Tab" && this.modal && this.open) {
192
+ this._handleTabKey(event);
193
+ }
194
+ };
195
+ _handleTabKey(event) {
196
+ const focusable = this._getFocusableElements();
197
+ if (focusable.length === 0)
198
+ return;
199
+ const firstFocusable = focusable[0];
200
+ const lastFocusable = focusable[focusable.length - 1];
201
+ if (event.shiftKey) {
202
+ if (document.activeElement === firstFocusable) {
203
+ event.preventDefault();
204
+ lastFocusable.focus();
205
+ }
206
+ } else {
207
+ if (document.activeElement === lastFocusable) {
208
+ event.preventDefault();
209
+ firstFocusable.focus();
210
+ }
211
+ }
212
+ }
213
+ _getFocusableElements() {
214
+ const drawer = this.shadowRoot?.querySelector(".drawer");
215
+ if (!drawer)
216
+ return [];
217
+ const focusableSelectors = [
218
+ "button:not([disabled])",
219
+ "a[href]",
220
+ "input:not([disabled])",
221
+ "select:not([disabled])",
222
+ "textarea:not([disabled])",
223
+ '[tabindex]:not([tabindex="-1"])'
224
+ ].join(", ");
225
+ const shadowFocusable = Array.from(drawer.querySelectorAll(focusableSelectors));
226
+ const slots = drawer.querySelectorAll("slot");
227
+ const slottedFocusable = [];
228
+ slots.forEach((slot) => {
229
+ const assignedElements = slot.assignedElements({ flatten: true });
230
+ assignedElements.forEach((el) => {
231
+ if (el instanceof HTMLElement) {
232
+ if (el.matches(focusableSelectors)) {
233
+ slottedFocusable.push(el);
234
+ }
235
+ slottedFocusable.push(...Array.from(el.querySelectorAll(focusableSelectors)));
236
+ }
237
+ });
238
+ });
239
+ return [...shadowFocusable, ...slottedFocusable];
240
+ }
241
+ _trapFocus() {
242
+ this._previouslyFocused = document.activeElement;
243
+ this._focusableElements = this._getFocusableElements();
244
+ requestAnimationFrame(() => {
245
+ if (this._focusableElements.length > 0) {
246
+ this._focusableElements[0].focus();
247
+ } else {
248
+ const drawer = this.shadowRoot?.querySelector(".drawer");
249
+ drawer?.focus();
250
+ }
251
+ });
252
+ }
253
+ _releaseFocus() {
254
+ if (this._previouslyFocused && this._previouslyFocused.focus) {
255
+ this._previouslyFocused.focus();
256
+ }
257
+ this._previouslyFocused = null;
258
+ }
259
+ show() {
260
+ this.open = true;
261
+ document.addEventListener("keydown", this._handleKeyDown);
262
+ if (this.modal) {
263
+ document.body.style.overflow = "hidden";
264
+ this._trapFocus();
265
+ }
266
+ this.emit("open");
267
+ }
268
+ hide() {
269
+ this.open = false;
270
+ document.removeEventListener("keydown", this._handleKeyDown);
271
+ if (this.modal) {
272
+ document.body.style.overflow = "";
273
+ this._releaseFocus();
274
+ }
275
+ this.emit("close");
276
+ }
277
+ toggle() {
278
+ if (this.open) {
279
+ this.hide();
280
+ } else {
281
+ this.show();
282
+ }
283
+ }
284
+ disconnectedCallback() {
285
+ super.disconnectedCallback?.();
286
+ document.removeEventListener("keydown", this._handleKeyDown);
287
+ document.body.style.overflow = "";
288
+ }
289
+ render() {
290
+ const positionClass = this.position === "right" ? "drawer-right" : "drawer-left";
291
+ const widthStyle = this.width ? `--drawer-width: ${this.width}` : "";
292
+ return `
293
+ <div class="drawer-wrapper ${this.open ? "open" : ""}" part="wrapper">
294
+ ${this.modal ? '<div class="drawer-backdrop" part="backdrop"></div>' : ""}
295
+ <div
296
+ class="drawer ${positionClass}"
297
+ role="dialog"
298
+ aria-modal="${this.modal ? "true" : "false"}"
299
+ style="${widthStyle}"
300
+ tabindex="-1"
301
+ part="drawer"
302
+ >
303
+ <div class="drawer-header" part="header">
304
+ <slot name="header"></slot>
305
+ <button class="drawer-close" part="close" aria-label="Close drawer">
306
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
307
+ <line x1="18" y1="6" x2="6" y2="18"></line>
308
+ <line x1="6" y1="6" x2="18" y2="18"></line>
309
+ </svg>
310
+ </button>
311
+ </div>
312
+ <div class="drawer-body" part="body">
313
+ <slot></slot>
314
+ </div>
315
+ <div class="drawer-footer" part="footer">
316
+ <slot name="footer"></slot>
317
+ </div>
318
+ </div>
319
+ </div>
320
+ `;
321
+ }
322
+ update() {
323
+ super.update();
324
+ const backdrop = this.shadowRoot?.querySelector(".drawer-backdrop");
325
+ backdrop?.addEventListener("click", this._handleBackdropClick.bind(this));
326
+ const closeBtn = this.shadowRoot?.querySelector(".drawer-close");
327
+ closeBtn?.addEventListener("click", () => this.hide());
328
+ }
329
+ }
330
+
331
+ // src/index.ts
332
+ function register() {
333
+ if (!customElements.get("el-dm-drawer")) {
334
+ customElements.define("el-dm-drawer", ElDmDrawer);
335
+ }
336
+ }
337
+
338
+ //# debugId=1A81B53BEF9647E264756E2164756E21
339
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,11 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/el-dm-drawer.ts", "../../src/index.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * DuskMoon Drawer Element\n *\n * A side navigation drawer/sidebar component for displaying navigation or content panels.\n * Supports left/right positioning, modal mode with backdrop, and smooth slide animations.\n *\n * @element el-dm-drawer\n *\n * @attr {boolean} open - Whether the drawer is open\n * @attr {string} position - Drawer position: 'left' or 'right'\n * @attr {boolean} modal - Whether drawer shows backdrop and traps focus\n * @attr {string} width - Custom width for the drawer (CSS value)\n *\n * @slot - Default slot for drawer content\n * @slot header - Drawer header section\n * @slot footer - Drawer footer section\n *\n * @csspart drawer - The drawer container\n * @csspart backdrop - The backdrop overlay (modal mode)\n * @csspart content - The content wrapper\n * @csspart header - The header section\n * @csspart body - The body section\n * @csspart footer - The footer section\n *\n * @fires open - Fired when drawer opens\n * @fires close - Fired when drawer closes\n */\n\nimport { BaseElement, css } from '@duskmoon-dev/el-core';\n\nexport type DrawerPosition = 'left' | 'right';\n\nconst styles = css`\n :host {\n display: contents;\n }\n\n :host([hidden]) {\n display: none !important;\n }\n\n .drawer-wrapper {\n position: fixed;\n inset: 0;\n z-index: 1000;\n pointer-events: none;\n }\n\n .drawer-wrapper.open {\n pointer-events: auto;\n }\n\n .drawer-backdrop {\n position: absolute;\n inset: 0;\n background-color: rgba(0, 0, 0, 0.5);\n opacity: 0;\n visibility: hidden;\n transition:\n opacity 300ms ease,\n visibility 300ms ease;\n }\n\n .drawer-wrapper.open .drawer-backdrop {\n opacity: 1;\n visibility: visible;\n }\n\n .drawer {\n position: absolute;\n top: 0;\n bottom: 0;\n display: flex;\n flex-direction: column;\n width: var(--drawer-width, 280px);\n max-width: 100vw;\n background-color: var(--color-surface);\n box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25);\n transition: transform 300ms cubic-bezier(0.4, 0, 0.2, 1);\n font-family: inherit;\n pointer-events: auto;\n }\n\n .drawer-left {\n left: 0;\n border-right: 1px solid var(--color-outline);\n transform: translateX(-100%);\n }\n\n .drawer-right {\n right: 0;\n border-left: 1px solid var(--color-outline);\n transform: translateX(100%);\n }\n\n .drawer-wrapper.open .drawer-left,\n .drawer-wrapper.open .drawer-right {\n transform: translateX(0);\n }\n\n .drawer-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 1rem 1.5rem;\n border-bottom: 1px solid var(--color-outline);\n flex-shrink: 0;\n }\n\n .drawer-body {\n flex: 1;\n padding: 1rem 1.5rem;\n overflow-y: auto;\n }\n\n .drawer-footer {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 1rem 1.5rem;\n border-top: 1px solid var(--color-outline);\n flex-shrink: 0;\n }\n\n .drawer-close {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2rem;\n height: 2rem;\n border: none;\n background: transparent;\n border-radius: 0.5rem;\n cursor: pointer;\n color: var(--color-on-surface);\n opacity: 0.7;\n transition:\n opacity 150ms ease,\n background-color 150ms ease;\n }\n\n .drawer-close:hover {\n opacity: 1;\n background-color: var(--color-surface-variant);\n }\n\n .drawer-close:focus {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n }\n\n /* Non-modal drawer positioning */\n :host(:not([modal])) .drawer-wrapper {\n pointer-events: none;\n }\n\n :host(:not([modal])) .drawer {\n pointer-events: auto;\n }\n`;\n\nexport class ElDmDrawer extends BaseElement {\n static properties = {\n open: { type: Boolean, reflect: true },\n position: { type: String, reflect: true, default: 'left' },\n modal: { type: Boolean, reflect: true },\n width: { type: String, reflect: true },\n };\n\n declare open: boolean;\n declare position: DrawerPosition;\n declare modal: boolean;\n declare width: string;\n\n private _focusableElements: HTMLElement[] = [];\n private _previouslyFocused: HTMLElement | null = null;\n\n constructor() {\n super();\n this.attachStyles(styles);\n }\n\n private _handleBackdropClick(event: Event): void {\n if (this.modal && event.target === event.currentTarget) {\n this.hide();\n }\n }\n\n private _handleKeyDown = (event: KeyboardEvent): void => {\n if (event.key === 'Escape' && this.modal) {\n this.hide();\n return;\n }\n\n // Focus trap for modal mode\n if (event.key === 'Tab' && this.modal && this.open) {\n this._handleTabKey(event);\n }\n };\n\n private _handleTabKey(event: KeyboardEvent): void {\n const focusable = this._getFocusableElements();\n if (focusable.length === 0) return;\n\n const firstFocusable = focusable[0];\n const lastFocusable = focusable[focusable.length - 1];\n\n if (event.shiftKey) {\n if (document.activeElement === firstFocusable) {\n event.preventDefault();\n lastFocusable.focus();\n }\n } else {\n if (document.activeElement === lastFocusable) {\n event.preventDefault();\n firstFocusable.focus();\n }\n }\n }\n\n private _getFocusableElements(): HTMLElement[] {\n const drawer = this.shadowRoot?.querySelector('.drawer');\n if (!drawer) return [];\n\n const focusableSelectors = [\n 'button:not([disabled])',\n 'a[href]',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n ].join(', ');\n\n // Get focusable elements from shadow DOM\n const shadowFocusable = Array.from(\n drawer.querySelectorAll(focusableSelectors),\n ) as HTMLElement[];\n\n // Get focusable elements from slotted content\n const slots = drawer.querySelectorAll('slot');\n const slottedFocusable: HTMLElement[] = [];\n\n slots.forEach((slot) => {\n const assignedElements = slot.assignedElements({ flatten: true });\n assignedElements.forEach((el) => {\n if (el instanceof HTMLElement) {\n if (el.matches(focusableSelectors)) {\n slottedFocusable.push(el);\n }\n slottedFocusable.push(\n ...(Array.from(el.querySelectorAll(focusableSelectors)) as HTMLElement[]),\n );\n }\n });\n });\n\n return [...shadowFocusable, ...slottedFocusable];\n }\n\n private _trapFocus(): void {\n this._previouslyFocused = document.activeElement as HTMLElement;\n this._focusableElements = this._getFocusableElements();\n\n // Focus first focusable element or the drawer itself\n requestAnimationFrame(() => {\n if (this._focusableElements.length > 0) {\n this._focusableElements[0].focus();\n } else {\n const drawer = this.shadowRoot?.querySelector('.drawer') as HTMLElement;\n drawer?.focus();\n }\n });\n }\n\n private _releaseFocus(): void {\n if (this._previouslyFocused && this._previouslyFocused.focus) {\n this._previouslyFocused.focus();\n }\n this._previouslyFocused = null;\n }\n\n show(): void {\n this.open = true;\n document.addEventListener('keydown', this._handleKeyDown);\n\n if (this.modal) {\n document.body.style.overflow = 'hidden';\n this._trapFocus();\n }\n\n this.emit('open');\n }\n\n hide(): void {\n this.open = false;\n document.removeEventListener('keydown', this._handleKeyDown);\n\n if (this.modal) {\n document.body.style.overflow = '';\n this._releaseFocus();\n }\n\n this.emit('close');\n }\n\n toggle(): void {\n if (this.open) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback?.();\n document.removeEventListener('keydown', this._handleKeyDown);\n document.body.style.overflow = '';\n }\n\n render(): string {\n const positionClass = this.position === 'right' ? 'drawer-right' : 'drawer-left';\n const widthStyle = this.width ? `--drawer-width: ${this.width}` : '';\n\n return `\n <div class=\"drawer-wrapper ${this.open ? 'open' : ''}\" part=\"wrapper\">\n ${this.modal ? '<div class=\"drawer-backdrop\" part=\"backdrop\"></div>' : ''}\n <div\n class=\"drawer ${positionClass}\"\n role=\"dialog\"\n aria-modal=\"${this.modal ? 'true' : 'false'}\"\n style=\"${widthStyle}\"\n tabindex=\"-1\"\n part=\"drawer\"\n >\n <div class=\"drawer-header\" part=\"header\">\n <slot name=\"header\"></slot>\n <button class=\"drawer-close\" part=\"close\" aria-label=\"Close drawer\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n </button>\n </div>\n <div class=\"drawer-body\" part=\"body\">\n <slot></slot>\n </div>\n <div class=\"drawer-footer\" part=\"footer\">\n <slot name=\"footer\"></slot>\n </div>\n </div>\n </div>\n `;\n }\n\n update(): void {\n super.update();\n\n const backdrop = this.shadowRoot?.querySelector('.drawer-backdrop');\n backdrop?.addEventListener('click', this._handleBackdropClick.bind(this));\n\n const closeBtn = this.shadowRoot?.querySelector('.drawer-close');\n closeBtn?.addEventListener('click', () => this.hide());\n }\n}\n",
6
+ "import { ElDmDrawer } from './el-dm-drawer.js';\n\nexport { ElDmDrawer };\nexport type { DrawerPosition } from './el-dm-drawer.js';\n\nexport function register(): void {\n if (!customElements.get('el-dm-drawer')) {\n customElements.define('el-dm-drawer', ElDmDrawer);\n }\n}\n"
7
+ ],
8
+ "mappings": "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",
9
+ "debugId": "1A81B53BEF9647E264756E2164756E21",
10
+ "names": []
11
+ }