luxen-ui 0.1.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.
- package/LICENSE +21 -0
- package/README.md +98 -0
- package/dist/css/elements/avatar.css +20 -0
- package/dist/css/elements/badge.css +159 -0
- package/dist/css/elements/button.css +171 -0
- package/dist/css/elements/close-button/circle.css +66 -0
- package/dist/css/elements/close-button/ring.css +71 -0
- package/dist/css/elements/close-button/square.css +70 -0
- package/dist/css/elements/disclosure.css +137 -0
- package/dist/css/elements/divider.css +75 -0
- package/dist/css/elements/input-otp.css +164 -0
- package/dist/css/elements/input-stepper/default.css +245 -0
- package/dist/css/elements/input-stepper/rounded.css +238 -0
- package/dist/css/elements/kbd.css +21 -0
- package/dist/css/elements/progress.css +114 -0
- package/dist/css/elements/select.css +71 -0
- package/dist/css/elements/skeleton.css +89 -0
- package/dist/css/elements/tabs/enclosed.css +148 -0
- package/dist/css/elements/tabs/line.css +138 -0
- package/dist/css/elements/toast.css +260 -0
- package/dist/css/index.css +885 -0
- package/dist/custom-elements.json +14424 -0
- package/dist/define.d.ts +9 -0
- package/dist/define.d.ts.map +1 -0
- package/dist/define.js +16 -0
- package/dist/elements/avatar/avatar.css +128 -0
- package/dist/elements/avatar/avatar.d.ts +21 -0
- package/dist/elements/avatar/avatar.d.ts.map +1 -0
- package/dist/elements/avatar/avatar.js +106 -0
- package/dist/elements/avatar/index.d.ts +8 -0
- package/dist/elements/avatar/index.d.ts.map +1 -0
- package/dist/elements/avatar/index.js +4 -0
- package/dist/elements/badge/badge.d.ts +17 -0
- package/dist/elements/badge/badge.d.ts.map +1 -0
- package/dist/elements/badge/badge.js +34 -0
- package/dist/elements/badge/index.d.ts +8 -0
- package/dist/elements/badge/index.d.ts.map +1 -0
- package/dist/elements/badge/index.js +4 -0
- package/dist/elements/carousel/carousel.css +205 -0
- package/dist/elements/carousel/carousel.d.ts +148 -0
- package/dist/elements/carousel/carousel.d.ts.map +1 -0
- package/dist/elements/carousel/carousel.js +473 -0
- package/dist/elements/carousel/index.d.ts +8 -0
- package/dist/elements/carousel/index.d.ts.map +1 -0
- package/dist/elements/carousel/index.js +4 -0
- package/dist/elements/carousel-item/carousel-item.css +11 -0
- package/dist/elements/carousel-item/carousel-item.d.ts +13 -0
- package/dist/elements/carousel-item/carousel-item.d.ts.map +1 -0
- package/dist/elements/carousel-item/carousel-item.js +20 -0
- package/dist/elements/carousel-item/index.d.ts +8 -0
- package/dist/elements/carousel-item/index.d.ts.map +1 -0
- package/dist/elements/carousel-item/index.js +4 -0
- package/dist/elements/dialog/dialog.css +92 -0
- package/dist/elements/dialog/dialog.d.ts +56 -0
- package/dist/elements/dialog/dialog.d.ts.map +1 -0
- package/dist/elements/dialog/dialog.js +204 -0
- package/dist/elements/dialog/dialog.styles.d.ts +8 -0
- package/dist/elements/dialog/dialog.styles.d.ts.map +1 -0
- package/dist/elements/dialog/dialog.styles.js +8 -0
- package/dist/elements/dialog/index.d.ts +8 -0
- package/dist/elements/dialog/index.d.ts.map +1 -0
- package/dist/elements/dialog/index.js +4 -0
- package/dist/elements/divider/divider.d.ts +23 -0
- package/dist/elements/divider/divider.d.ts.map +1 -0
- package/dist/elements/divider/divider.js +49 -0
- package/dist/elements/divider/index.d.ts +8 -0
- package/dist/elements/divider/index.d.ts.map +1 -0
- package/dist/elements/divider/index.js +4 -0
- package/dist/elements/drawer/drawer.css +66 -0
- package/dist/elements/drawer/drawer.d.ts +34 -0
- package/dist/elements/drawer/drawer.d.ts.map +1 -0
- package/dist/elements/drawer/drawer.js +46 -0
- package/dist/elements/drawer/index.d.ts +8 -0
- package/dist/elements/drawer/index.d.ts.map +1 -0
- package/dist/elements/drawer/index.js +4 -0
- package/dist/elements/dropdown/dropdown.css +31 -0
- package/dist/elements/dropdown/dropdown.d.ts +64 -0
- package/dist/elements/dropdown/dropdown.d.ts.map +1 -0
- package/dist/elements/dropdown/dropdown.js +322 -0
- package/dist/elements/dropdown/index.d.ts +8 -0
- package/dist/elements/dropdown/index.d.ts.map +1 -0
- package/dist/elements/dropdown/index.js +4 -0
- package/dist/elements/dropdown-item/dropdown-item.css +51 -0
- package/dist/elements/dropdown-item/dropdown-item.d.ts +25 -0
- package/dist/elements/dropdown-item/dropdown-item.d.ts.map +1 -0
- package/dist/elements/dropdown-item/dropdown-item.js +110 -0
- package/dist/elements/dropdown-item/index.d.ts +8 -0
- package/dist/elements/dropdown-item/index.d.ts.map +1 -0
- package/dist/elements/dropdown-item/index.js +4 -0
- package/dist/elements/icon/icon.css +10 -0
- package/dist/elements/icon/icon.d.ts +19 -0
- package/dist/elements/icon/icon.d.ts.map +1 -0
- package/dist/elements/icon/icon.js +53 -0
- package/dist/elements/icon/index.d.ts +8 -0
- package/dist/elements/icon/index.d.ts.map +1 -0
- package/dist/elements/icon/index.js +4 -0
- package/dist/elements/input-otp/index.d.ts +8 -0
- package/dist/elements/input-otp/index.d.ts.map +1 -0
- package/dist/elements/input-otp/index.js +4 -0
- package/dist/elements/input-otp/input-otp.d.ts +31 -0
- package/dist/elements/input-otp/input-otp.d.ts.map +1 -0
- package/dist/elements/input-otp/input-otp.js +139 -0
- package/dist/elements/input-stepper/index.d.ts +8 -0
- package/dist/elements/input-stepper/index.d.ts.map +1 -0
- package/dist/elements/input-stepper/index.js +4 -0
- package/dist/elements/input-stepper/input-stepper.d.ts +63 -0
- package/dist/elements/input-stepper/input-stepper.d.ts.map +1 -0
- package/dist/elements/input-stepper/input-stepper.js +249 -0
- package/dist/elements/popover/index.d.ts +8 -0
- package/dist/elements/popover/index.d.ts.map +1 -0
- package/dist/elements/popover/index.js +4 -0
- package/dist/elements/popover/popover.css +61 -0
- package/dist/elements/popover/popover.d.ts +62 -0
- package/dist/elements/popover/popover.d.ts.map +1 -0
- package/dist/elements/popover/popover.js +244 -0
- package/dist/elements/rating/index.d.ts +8 -0
- package/dist/elements/rating/index.d.ts.map +1 -0
- package/dist/elements/rating/index.js +4 -0
- package/dist/elements/rating/rating.css +102 -0
- package/dist/elements/rating/rating.d.ts +38 -0
- package/dist/elements/rating/rating.d.ts.map +1 -0
- package/dist/elements/rating/rating.js +193 -0
- package/dist/elements/skeleton/index.d.ts +8 -0
- package/dist/elements/skeleton/index.d.ts.map +1 -0
- package/dist/elements/skeleton/index.js +4 -0
- package/dist/elements/skeleton/skeleton.d.ts +12 -0
- package/dist/elements/skeleton/skeleton.d.ts.map +1 -0
- package/dist/elements/skeleton/skeleton.js +13 -0
- package/dist/elements/spinner/index.d.ts +8 -0
- package/dist/elements/spinner/index.d.ts.map +1 -0
- package/dist/elements/spinner/index.js +4 -0
- package/dist/elements/spinner/spinner.css +28 -0
- package/dist/elements/spinner/spinner.d.ts +16 -0
- package/dist/elements/spinner/spinner.d.ts.map +1 -0
- package/dist/elements/spinner/spinner.js +37 -0
- package/dist/elements/tabs/index.d.ts +8 -0
- package/dist/elements/tabs/index.d.ts.map +1 -0
- package/dist/elements/tabs/index.js +4 -0
- package/dist/elements/tabs/tabs.d.ts +48 -0
- package/dist/elements/tabs/tabs.d.ts.map +1 -0
- package/dist/elements/tabs/tabs.js +210 -0
- package/dist/elements/toast/index.d.ts +9 -0
- package/dist/elements/toast/index.d.ts.map +1 -0
- package/dist/elements/toast/index.js +5 -0
- package/dist/elements/toast/toast.d.ts +72 -0
- package/dist/elements/toast/toast.d.ts.map +1 -0
- package/dist/elements/toast/toast.js +375 -0
- package/dist/elements/tooltip/index.d.ts +8 -0
- package/dist/elements/tooltip/index.d.ts.map +1 -0
- package/dist/elements/tooltip/index.js +4 -0
- package/dist/elements/tooltip/tooltip.css +37 -0
- package/dist/elements/tooltip/tooltip.d.ts +59 -0
- package/dist/elements/tooltip/tooltip.d.ts.map +1 -0
- package/dist/elements/tooltip/tooltip.js +231 -0
- package/dist/elements/tree/index.d.ts +8 -0
- package/dist/elements/tree/index.d.ts.map +1 -0
- package/dist/elements/tree/index.js +4 -0
- package/dist/elements/tree/tree.css +26 -0
- package/dist/elements/tree/tree.d.ts +76 -0
- package/dist/elements/tree/tree.d.ts.map +1 -0
- package/dist/elements/tree/tree.js +432 -0
- package/dist/elements/tree-item/index.d.ts +8 -0
- package/dist/elements/tree-item/index.d.ts.map +1 -0
- package/dist/elements/tree-item/index.js +4 -0
- package/dist/elements/tree-item/tree-item.css +172 -0
- package/dist/elements/tree-item/tree-item.d.ts +74 -0
- package/dist/elements/tree-item/tree-item.d.ts.map +1 -0
- package/dist/elements/tree-item/tree-item.js +301 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/registry.d.ts +22 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +33 -0
- package/dist/shared/controllers/popover.d.ts +44 -0
- package/dist/shared/controllers/popover.d.ts.map +1 -0
- package/dist/shared/controllers/popover.js +359 -0
- package/dist/shared/luxen-element.d.ts +20 -0
- package/dist/shared/luxen-element.d.ts.map +1 -0
- package/dist/shared/luxen-element.js +23 -0
- package/dist/shared/luxen-form-associated-element.d.ts +49 -0
- package/dist/shared/luxen-form-associated-element.d.ts.map +1 -0
- package/dist/shared/luxen-form-associated-element.js +123 -0
- package/dist/shared/styles/host.css +13 -0
- package/dist/shared/styles/host.styles.d.ts +9 -0
- package/dist/shared/styles/host.styles.d.ts.map +1 -0
- package/dist/shared/styles/host.styles.js +9 -0
- package/dist/skills/luxen-ui/SKILL.md +82 -0
- package/dist/skills/luxen-ui/references/avatar.md +259 -0
- package/dist/skills/luxen-ui/references/badge.md +289 -0
- package/dist/skills/luxen-ui/references/button.md +309 -0
- package/dist/skills/luxen-ui/references/close-button.md +104 -0
- package/dist/skills/luxen-ui/references/dialog.md +435 -0
- package/dist/skills/luxen-ui/references/drawer.md +400 -0
- package/dist/skills/luxen-ui/references/progress.md +133 -0
- package/dist/skills/luxen-ui/references/select.md +100 -0
- package/dist/skills/luxen-ui/references/toast.md +396 -0
- package/dist/skills/luxen-ui/references/tree.md +359 -0
- package/package.json +116 -0
- package/postcss-plugin-prefix.js +63 -0
- package/vite-plugin.ts +29 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { html, unsafeCSS } from 'lit';
|
|
2
|
+
import { LuxenElement } from '../../shared/luxen-element';
|
|
3
|
+
import hostStyles from '../../shared/styles/host.styles';
|
|
4
|
+
import rawStyles from './carousel-item.css?inline';
|
|
5
|
+
const styles = unsafeCSS(rawStyles);
|
|
6
|
+
/**
|
|
7
|
+
* A single slide inside an `<l-carousel>`.
|
|
8
|
+
*
|
|
9
|
+
* @cssproperty --aspect-ratio - Aspect ratio of the slide.
|
|
10
|
+
*/
|
|
11
|
+
export class LuxenCarouselItem extends LuxenElement {
|
|
12
|
+
connectedCallback() {
|
|
13
|
+
super.connectedCallback();
|
|
14
|
+
this.setAttribute('role', 'group');
|
|
15
|
+
}
|
|
16
|
+
render() {
|
|
17
|
+
return html ` <slot></slot> `;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
LuxenCarouselItem.styles = [hostStyles, styles];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/html/elements/carousel-item/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,cAAc,iBAAiB,CAAC;AAGhC,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,iBAAiB,EAAE,iBAAiB,CAAC;KACtC;CACF"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
:host {
|
|
2
|
+
--width: 31rem;
|
|
3
|
+
--border-radius: 6px;
|
|
4
|
+
--show-duration: 200ms;
|
|
5
|
+
--hide-duration: 200ms;
|
|
6
|
+
--backdrop: var(--l-backdrop);
|
|
7
|
+
--backdrop-blur: 0;
|
|
8
|
+
|
|
9
|
+
display: contents;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
dialog {
|
|
13
|
+
position: fixed;
|
|
14
|
+
inset: 0;
|
|
15
|
+
box-sizing: border-box;
|
|
16
|
+
width: var(--width);
|
|
17
|
+
max-inline-size: min(90vw, var(--width));
|
|
18
|
+
max-block-size: min(80dvb, 100%);
|
|
19
|
+
margin: auto;
|
|
20
|
+
padding: 0;
|
|
21
|
+
border: 0;
|
|
22
|
+
border-radius: var(--border-radius);
|
|
23
|
+
background-color: var(--l-color-surface-overlay);
|
|
24
|
+
color: var(--l-color-text-primary);
|
|
25
|
+
|
|
26
|
+
/* EXIT STATE */
|
|
27
|
+
opacity: 0;
|
|
28
|
+
|
|
29
|
+
transition-property: opacity, display, overlay;
|
|
30
|
+
transition-duration: var(--hide-duration);
|
|
31
|
+
transition-behavior: allow-discrete;
|
|
32
|
+
|
|
33
|
+
&::backdrop {
|
|
34
|
+
background: var(--backdrop);
|
|
35
|
+
backdrop-filter: blur(var(--backdrop-blur));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* OPEN STATE */
|
|
39
|
+
/* grid layout pins header/footer; the middle row (body) scrolls via
|
|
40
|
+
overflow on [part='body'] and minmax(0, 1fr) allowing it to shrink. */
|
|
41
|
+
&[open] {
|
|
42
|
+
display: grid;
|
|
43
|
+
grid-template-rows: auto minmax(0, 1fr) auto;
|
|
44
|
+
opacity: 1;
|
|
45
|
+
transition-duration: var(--show-duration);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/* BEFORE-OPEN STATE */
|
|
49
|
+
@starting-style {
|
|
50
|
+
&[open] {
|
|
51
|
+
opacity: 0;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
[part='header'] {
|
|
57
|
+
display: flex;
|
|
58
|
+
justify-content: space-between;
|
|
59
|
+
align-items: center;
|
|
60
|
+
gap: 1rem;
|
|
61
|
+
padding: 1.5rem;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
[part='title'] {
|
|
65
|
+
margin: 0;
|
|
66
|
+
font-size: 1.125rem;
|
|
67
|
+
font-weight: 600;
|
|
68
|
+
line-height: 1.4;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
[part='body'] {
|
|
72
|
+
padding: 0 1.5rem;
|
|
73
|
+
overflow-y: auto;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
[part='footer'] {
|
|
77
|
+
display: flex;
|
|
78
|
+
place-content: end;
|
|
79
|
+
gap: 0.5rem;
|
|
80
|
+
padding: 1.5rem;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
::slotted(menu[slot='footer']) {
|
|
84
|
+
display: contents;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
@media (prefers-reduced-motion: reduce) {
|
|
88
|
+
:host {
|
|
89
|
+
--show-duration: 0ms;
|
|
90
|
+
--hide-duration: 0ms;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { type PropertyValues } from 'lit';
|
|
2
|
+
import { LuxenElement } from '../../shared/luxen-element';
|
|
3
|
+
/**
|
|
4
|
+
* A modal dialog rendered in the top layer via the native `<dialog>` element.
|
|
5
|
+
*
|
|
6
|
+
* Open and close by toggling the `open` property (or the `--show` / `--hide`
|
|
7
|
+
* Invoker commands). There are no public `show()` / `close()` methods.
|
|
8
|
+
*
|
|
9
|
+
* @slot - Body content.
|
|
10
|
+
* @slot close - Close button (typically `<button class="l-close">`).
|
|
11
|
+
* @slot footer - Footer actions.
|
|
12
|
+
*
|
|
13
|
+
* @csspart dialog - The native `<dialog>` element.
|
|
14
|
+
* @csspart header - The header wrapper containing the title and close slot.
|
|
15
|
+
* @csspart title - The dialog title heading.
|
|
16
|
+
* @csspart body - The body wrapper around the default slot.
|
|
17
|
+
* @csspart footer - The footer wrapper around the footer slot.
|
|
18
|
+
*
|
|
19
|
+
* @cssproperty --width - Dialog width. Default `31rem`.
|
|
20
|
+
* @cssproperty --border-radius - Dialog border radius. Default `6px`.
|
|
21
|
+
* @cssproperty --show-duration - Open transition duration. Default `200ms`.
|
|
22
|
+
* @cssproperty --hide-duration - Close transition duration. Default `200ms`.
|
|
23
|
+
* @cssproperty --backdrop - Backdrop color.
|
|
24
|
+
* @cssproperty --backdrop-blur - Backdrop blur amount (any CSS length). Default `0` (no blur). Set to e.g. `4px` for a subtle frost.
|
|
25
|
+
*
|
|
26
|
+
* @event show - Fired when the dialog opens. Not cancelable.
|
|
27
|
+
* @event after-show - Fired after the open animation completes.
|
|
28
|
+
* @event hide - Fired when the dialog is about to close. Cancelable — call `event.preventDefault()` to keep it open.
|
|
29
|
+
* @event after-hide - Fired after the close animation completes.
|
|
30
|
+
*/
|
|
31
|
+
export declare class LuxenDialog extends LuxenElement {
|
|
32
|
+
static styles: import("lit").CSSResult[];
|
|
33
|
+
/** Dialog title rendered in the header. */
|
|
34
|
+
title: string;
|
|
35
|
+
/** Whether the dialog is open. */
|
|
36
|
+
open: boolean;
|
|
37
|
+
/** Close when the backdrop is clicked. */
|
|
38
|
+
lightDismiss: boolean;
|
|
39
|
+
dialog: HTMLDialogElement;
|
|
40
|
+
private _mouseDownTarget;
|
|
41
|
+
private _commandListener;
|
|
42
|
+
connectedCallback(): void;
|
|
43
|
+
disconnectedCallback(): void;
|
|
44
|
+
firstUpdated(): void;
|
|
45
|
+
updated(changed: PropertyValues<this>): void;
|
|
46
|
+
private _onCommand;
|
|
47
|
+
private _onCancel;
|
|
48
|
+
private _onNativeClose;
|
|
49
|
+
private _onDialogClick;
|
|
50
|
+
private _nudgeAnimation?;
|
|
51
|
+
private _nudgeDismiss;
|
|
52
|
+
private _emitAfter;
|
|
53
|
+
private _focusAutofocusTarget;
|
|
54
|
+
render(): import("lit").TemplateResult<1>;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=dialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialog.d.ts","sourceRoot":"","sources":["../../../src/html/elements/dialog/dialog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAwB1D;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,WAAY,SAAQ,YAAY;IAC3C,MAAM,CAAC,MAAM,4BAAwB;IAErC,2CAA2C;IAE3C,KAAK,SAAM;IAEX,kCAAkC;IAElC,IAAI,UAAS;IAEb,0CAA0C;IAE1C,YAAY,UAAS;IAGrB,MAAM,EAAG,iBAAiB,CAAC;IAE3B,OAAO,CAAC,gBAAgB,CAA4B;IAEpD,OAAO,CAAC,gBAAgB,CAEtB;IAIF,iBAAiB;IAKjB,oBAAoB;IAKpB,YAAY;IASZ,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC;IA0BrC,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,eAAe,CAAC,CAAY;IAEpC,OAAO,CAAC,aAAa;YAcP,UAAU;IAUxB,OAAO,CAAC,qBAAqB;IAK7B,MAAM;CAoBP"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { html, nothing } from 'lit';
|
|
8
|
+
import { property, query } from 'lit/decorators.js';
|
|
9
|
+
import { LuxenElement } from '../../shared/luxen-element';
|
|
10
|
+
import hostStyles from '../../shared/styles/host.styles';
|
|
11
|
+
import styles from './dialog.styles';
|
|
12
|
+
const supportsClosedBy = typeof HTMLDialogElement !== 'undefined' && 'closedBy' in HTMLDialogElement.prototype;
|
|
13
|
+
// Native <dialog> doesn't lock body scroll. Inject a global rule that uses
|
|
14
|
+
// `:has()` to freeze the root scroll container whenever any modal l-dialog
|
|
15
|
+
// is open. Purely declarative — no manual lock/unlock bookkeeping.
|
|
16
|
+
// Symbol guard makes the injection idempotent across HMR reloads.
|
|
17
|
+
const SCROLL_LOCK_SHEET = Symbol.for('luxen-dialog-scroll-lock');
|
|
18
|
+
if (typeof document !== 'undefined' && !(SCROLL_LOCK_SHEET in document)) {
|
|
19
|
+
const sheet = new CSSStyleSheet();
|
|
20
|
+
sheet.replaceSync(`html:has([data-modal]) { overflow: hidden; scrollbar-gutter: stable; }`);
|
|
21
|
+
document.adoptedStyleSheets.push(sheet);
|
|
22
|
+
Object.defineProperty(document, SCROLL_LOCK_SHEET, { value: sheet });
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* A modal dialog rendered in the top layer via the native `<dialog>` element.
|
|
26
|
+
*
|
|
27
|
+
* Open and close by toggling the `open` property (or the `--show` / `--hide`
|
|
28
|
+
* Invoker commands). There are no public `show()` / `close()` methods.
|
|
29
|
+
*
|
|
30
|
+
* @slot - Body content.
|
|
31
|
+
* @slot close - Close button (typically `<button class="l-close">`).
|
|
32
|
+
* @slot footer - Footer actions.
|
|
33
|
+
*
|
|
34
|
+
* @csspart dialog - The native `<dialog>` element.
|
|
35
|
+
* @csspart header - The header wrapper containing the title and close slot.
|
|
36
|
+
* @csspart title - The dialog title heading.
|
|
37
|
+
* @csspart body - The body wrapper around the default slot.
|
|
38
|
+
* @csspart footer - The footer wrapper around the footer slot.
|
|
39
|
+
*
|
|
40
|
+
* @cssproperty --width - Dialog width. Default `31rem`.
|
|
41
|
+
* @cssproperty --border-radius - Dialog border radius. Default `6px`.
|
|
42
|
+
* @cssproperty --show-duration - Open transition duration. Default `200ms`.
|
|
43
|
+
* @cssproperty --hide-duration - Close transition duration. Default `200ms`.
|
|
44
|
+
* @cssproperty --backdrop - Backdrop color.
|
|
45
|
+
* @cssproperty --backdrop-blur - Backdrop blur amount (any CSS length). Default `0` (no blur). Set to e.g. `4px` for a subtle frost.
|
|
46
|
+
*
|
|
47
|
+
* @event show - Fired when the dialog opens. Not cancelable.
|
|
48
|
+
* @event after-show - Fired after the open animation completes.
|
|
49
|
+
* @event hide - Fired when the dialog is about to close. Cancelable — call `event.preventDefault()` to keep it open.
|
|
50
|
+
* @event after-hide - Fired after the close animation completes.
|
|
51
|
+
*/
|
|
52
|
+
export class LuxenDialog extends LuxenElement {
|
|
53
|
+
constructor() {
|
|
54
|
+
super(...arguments);
|
|
55
|
+
/** Dialog title rendered in the header. */
|
|
56
|
+
this.title = '';
|
|
57
|
+
/** Whether the dialog is open. */
|
|
58
|
+
this.open = false;
|
|
59
|
+
/** Close when the backdrop is clicked. */
|
|
60
|
+
this.lightDismiss = false;
|
|
61
|
+
this._mouseDownTarget = null;
|
|
62
|
+
this._commandListener = {
|
|
63
|
+
handleEvent: (e) => this._onCommand(e),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
// --- Lifecycle ---
|
|
67
|
+
connectedCallback() {
|
|
68
|
+
super.connectedCallback();
|
|
69
|
+
this.addEventListener('command', this._commandListener);
|
|
70
|
+
}
|
|
71
|
+
disconnectedCallback() {
|
|
72
|
+
super.disconnectedCallback();
|
|
73
|
+
this.removeEventListener('command', this._commandListener);
|
|
74
|
+
}
|
|
75
|
+
firstUpdated() {
|
|
76
|
+
this.dialog.addEventListener('cancel', (e) => this._onCancel(e));
|
|
77
|
+
this.dialog.addEventListener('close', () => this._onNativeClose());
|
|
78
|
+
this.dialog.addEventListener('mousedown', (e) => {
|
|
79
|
+
this._mouseDownTarget = e.target;
|
|
80
|
+
});
|
|
81
|
+
this.dialog.addEventListener('click', (e) => this._onDialogClick(e));
|
|
82
|
+
}
|
|
83
|
+
updated(changed) {
|
|
84
|
+
if (!changed.has('open'))
|
|
85
|
+
return;
|
|
86
|
+
if (this.open && !this.dialog.open) {
|
|
87
|
+
// Opening — not cancelable.
|
|
88
|
+
this.emit('show');
|
|
89
|
+
this.toggleAttribute('data-modal', true);
|
|
90
|
+
this.dialog.showModal();
|
|
91
|
+
this._focusAutofocusTarget();
|
|
92
|
+
this._emitAfter('after-show');
|
|
93
|
+
}
|
|
94
|
+
else if (!this.open && this.dialog.open) {
|
|
95
|
+
// Closing — cancelable. Revert the property if consumer prevents.
|
|
96
|
+
if (!this.emit('hide', { cancelable: true })) {
|
|
97
|
+
this.open = true;
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
this.dialog.close();
|
|
101
|
+
// `after-hide` is emitted from `_onNativeClose` (runs for every close path).
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// --- Event handlers ---
|
|
105
|
+
// Custom commands on a custom element must start with `--`.
|
|
106
|
+
// Built-in commands like "close" are reserved for native elements
|
|
107
|
+
// and won't fire here.
|
|
108
|
+
_onCommand(e) {
|
|
109
|
+
switch (e.command) {
|
|
110
|
+
case '--hide':
|
|
111
|
+
this.open = false;
|
|
112
|
+
break;
|
|
113
|
+
case '--show':
|
|
114
|
+
this.open = true;
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Fires on Escape and on `closedby="any"` close requests.
|
|
119
|
+
// Does NOT fire when script calls `.close()`, so `updated()`'s cancelable
|
|
120
|
+
// `hide` emit doesn't collide with this one.
|
|
121
|
+
_onCancel(e) {
|
|
122
|
+
if (!this.emit('hide', { cancelable: true })) {
|
|
123
|
+
e.preventDefault();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
_onNativeClose() {
|
|
127
|
+
this.open = false;
|
|
128
|
+
this.removeAttribute('data-modal');
|
|
129
|
+
this._emitAfter('after-hide');
|
|
130
|
+
}
|
|
131
|
+
_onDialogClick(e) {
|
|
132
|
+
// With `dialog { padding: 0 }`, `e.target === this.dialog` only fires
|
|
133
|
+
// for backdrop clicks. The mousedown guard prevents drag-out dismissal.
|
|
134
|
+
const clickedBackdrop = e.target === this.dialog && this._mouseDownTarget === this.dialog;
|
|
135
|
+
this._mouseDownTarget = null;
|
|
136
|
+
if (!clickedBackdrop)
|
|
137
|
+
return;
|
|
138
|
+
if (this.lightDismiss) {
|
|
139
|
+
// When `supportsClosedBy`, the native `closedby="any"` already closed.
|
|
140
|
+
if (!supportsClosedBy)
|
|
141
|
+
this.open = false;
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
this._nudgeDismiss();
|
|
145
|
+
}
|
|
146
|
+
_nudgeDismiss() {
|
|
147
|
+
if (matchMedia('(prefers-reduced-motion: reduce)').matches)
|
|
148
|
+
return;
|
|
149
|
+
this._nudgeAnimation?.cancel();
|
|
150
|
+
this._nudgeAnimation = this.dialog.animate([{ transform: 'scale(1)' }, { transform: 'scale(1.02)' }, { transform: 'scale(1)' }], { duration: 250, easing: 'ease-in-out' });
|
|
151
|
+
}
|
|
152
|
+
// Awaits every active animation on the dialog (transitions + @keyframes)
|
|
153
|
+
// and then emits. Resolves immediately when no animations are running,
|
|
154
|
+
// which covers `prefers-reduced-motion` and consumers that zero the
|
|
155
|
+
// duration custom properties — cases where `transitionend` never fires.
|
|
156
|
+
// Waits one frame first so @starting-style transitions have registered.
|
|
157
|
+
async _emitAfter(name) {
|
|
158
|
+
await new Promise((r) => requestAnimationFrame(() => r(null)));
|
|
159
|
+
const anims = this.dialog.getAnimations({ subtree: false });
|
|
160
|
+
await Promise.all(anims.map((a) => a.finished.catch(() => { })));
|
|
161
|
+
if ((name === 'after-show') !== this.open)
|
|
162
|
+
return;
|
|
163
|
+
this.emit(name);
|
|
164
|
+
}
|
|
165
|
+
// Firefox/Safari don't reliably resolve `[autofocus]` when `<dialog>`
|
|
166
|
+
// is in shadow DOM and the target is in light DOM. Resolve it manually.
|
|
167
|
+
_focusAutofocusTarget() {
|
|
168
|
+
const target = this.querySelector('[autofocus]');
|
|
169
|
+
target?.focus({ preventScroll: true });
|
|
170
|
+
}
|
|
171
|
+
render() {
|
|
172
|
+
const closedby = this.lightDismiss && supportsClosedBy ? 'any' : nothing;
|
|
173
|
+
return html `
|
|
174
|
+
<dialog
|
|
175
|
+
part="dialog"
|
|
176
|
+
closedby=${closedby}
|
|
177
|
+
>
|
|
178
|
+
<header part="header">
|
|
179
|
+
<h2 part="title">${this.title}</h2>
|
|
180
|
+
<slot name="close"></slot>
|
|
181
|
+
</header>
|
|
182
|
+
<div part="body">
|
|
183
|
+
<slot></slot>
|
|
184
|
+
</div>
|
|
185
|
+
<footer part="footer">
|
|
186
|
+
<slot name="footer"></slot>
|
|
187
|
+
</footer>
|
|
188
|
+
</dialog>
|
|
189
|
+
`;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
LuxenDialog.styles = [hostStyles, styles];
|
|
193
|
+
__decorate([
|
|
194
|
+
property()
|
|
195
|
+
], LuxenDialog.prototype, "title", void 0);
|
|
196
|
+
__decorate([
|
|
197
|
+
property({ type: Boolean, reflect: true })
|
|
198
|
+
], LuxenDialog.prototype, "open", void 0);
|
|
199
|
+
__decorate([
|
|
200
|
+
property({ type: Boolean, reflect: true, attribute: 'light-dismiss' })
|
|
201
|
+
], LuxenDialog.prototype, "lightDismiss", void 0);
|
|
202
|
+
__decorate([
|
|
203
|
+
query('dialog')
|
|
204
|
+
], LuxenDialog.prototype, "dialog", void 0);
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wrapper module: imported by both `dialog.ts` and `drawer.ts`.
|
|
3
|
+
* `unsafeCSS()` is called once here so both importers share the same
|
|
4
|
+
* `CSSResult` instance (one constructed `CSSStyleSheet`, not two).
|
|
5
|
+
*/
|
|
6
|
+
declare const _default: import("lit").CSSResult;
|
|
7
|
+
export default _default;
|
|
8
|
+
//# sourceMappingURL=dialog.styles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialog.styles.d.ts","sourceRoot":"","sources":["../../../src/html/elements/dialog/dialog.styles.ts"],"names":[],"mappings":"AAGA;;;;GAIG;;AACH,wBAA8B"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { unsafeCSS } from 'lit';
|
|
2
|
+
import raw from './dialog.css?inline';
|
|
3
|
+
/**
|
|
4
|
+
* Wrapper module: imported by both `dialog.ts` and `drawer.ts`.
|
|
5
|
+
* `unsafeCSS()` is called once here so both importers share the same
|
|
6
|
+
* `CSSResult` instance (one constructed `CSSStyleSheet`, not two).
|
|
7
|
+
*/
|
|
8
|
+
export default unsafeCSS(raw);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/html/elements/dialog/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,cAAc,UAAU,CAAC;AAGzB,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,UAAU,EAAE,WAAW,CAAC;KACzB;CACF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { LuxenElement } from '../../shared/luxen-element';
|
|
2
|
+
export type DividerOrientation = 'horizontal' | 'vertical';
|
|
3
|
+
/**
|
|
4
|
+
* @summary Dividers visually separate or group elements.
|
|
5
|
+
*
|
|
6
|
+
* @example <l-divider></l-divider>
|
|
7
|
+
*
|
|
8
|
+
* @cssproperty --color - The color of the divider line.
|
|
9
|
+
* @cssproperty --width - The thickness of the divider line.
|
|
10
|
+
* @cssproperty --spacing - The spacing between the divider and its neighboring elements.
|
|
11
|
+
*
|
|
12
|
+
* @customElement l-divider
|
|
13
|
+
*/
|
|
14
|
+
export declare class LuxenDivider extends LuxenElement {
|
|
15
|
+
createRenderRoot(): this;
|
|
16
|
+
/** The divider's orientation. */
|
|
17
|
+
orientation: DividerOrientation;
|
|
18
|
+
/** Optional text label displayed over the divider line. */
|
|
19
|
+
label?: string;
|
|
20
|
+
connectedCallback(): void;
|
|
21
|
+
updated(changed: Map<string, unknown>): void;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=divider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"divider.d.ts","sourceRoot":"","sources":["../../../src/html/elements/divider/divider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG,UAAU,CAAC;AAE3D;;;;;;;;;;GAUG;AACH,qBAAa,YAAa,SAAQ,YAAY;IACnC,gBAAgB;IAIzB,iCAAiC;IAEjC,WAAW,EAAE,kBAAkB,CAAgB;IAE/C,2DAA2D;IAE3D,KAAK,CAAC,EAAE,MAAM,CAAC;IAEN,iBAAiB;IAKjB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;CAS/C"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { property } from 'lit/decorators.js';
|
|
8
|
+
import { LuxenElement } from '../../shared/luxen-element';
|
|
9
|
+
/**
|
|
10
|
+
* @summary Dividers visually separate or group elements.
|
|
11
|
+
*
|
|
12
|
+
* @example <l-divider></l-divider>
|
|
13
|
+
*
|
|
14
|
+
* @cssproperty --color - The color of the divider line.
|
|
15
|
+
* @cssproperty --width - The thickness of the divider line.
|
|
16
|
+
* @cssproperty --spacing - The spacing between the divider and its neighboring elements.
|
|
17
|
+
*
|
|
18
|
+
* @customElement l-divider
|
|
19
|
+
*/
|
|
20
|
+
export class LuxenDivider extends LuxenElement {
|
|
21
|
+
constructor() {
|
|
22
|
+
super(...arguments);
|
|
23
|
+
/** The divider's orientation. */
|
|
24
|
+
this.orientation = 'horizontal';
|
|
25
|
+
}
|
|
26
|
+
createRenderRoot() {
|
|
27
|
+
return this;
|
|
28
|
+
}
|
|
29
|
+
connectedCallback() {
|
|
30
|
+
super.connectedCallback();
|
|
31
|
+
this.setAttribute('role', 'separator');
|
|
32
|
+
}
|
|
33
|
+
updated(changed) {
|
|
34
|
+
if (changed.has('orientation')) {
|
|
35
|
+
if (this.orientation === 'vertical') {
|
|
36
|
+
this.setAttribute('aria-orientation', 'vertical');
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
this.removeAttribute('aria-orientation');
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
__decorate([
|
|
45
|
+
property({ reflect: true })
|
|
46
|
+
], LuxenDivider.prototype, "orientation", void 0);
|
|
47
|
+
__decorate([
|
|
48
|
+
property({ reflect: true })
|
|
49
|
+
], LuxenDivider.prototype, "label", void 0);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/html/elements/divider/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,cAAc,WAAW,CAAC;AAG1B,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,WAAW,EAAE,YAAY,CAAC;KAC3B;CACF"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
:host {
|
|
2
|
+
--size: 320px;
|
|
3
|
+
--border-radius: 0.75rem;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
/* Override dialog's opacity fade with a slide from the inline-start edge. */
|
|
7
|
+
dialog {
|
|
8
|
+
inset: 0;
|
|
9
|
+
margin: 0;
|
|
10
|
+
width: min(var(--size), 100dvw);
|
|
11
|
+
max-inline-size: 100dvw;
|
|
12
|
+
height: 100dvh;
|
|
13
|
+
max-block-size: 100dvh;
|
|
14
|
+
border-radius: 0 var(--border-radius) var(--border-radius) 0;
|
|
15
|
+
opacity: 1;
|
|
16
|
+
translate: -100% 0;
|
|
17
|
+
transition-property: translate, display, overlay;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
dialog[open] {
|
|
21
|
+
translate: 0 0;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
@starting-style {
|
|
25
|
+
dialog[open] {
|
|
26
|
+
translate: -100% 0;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/* Inline-end edge */
|
|
31
|
+
:host([placement='end']) dialog {
|
|
32
|
+
border-radius: var(--border-radius) 0 0 var(--border-radius);
|
|
33
|
+
margin-inline-start: auto;
|
|
34
|
+
translate: 100% 0;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
:host([placement='end']) dialog[open] {
|
|
38
|
+
translate: 0 0;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
@starting-style {
|
|
42
|
+
:host([placement='end']) dialog[open] {
|
|
43
|
+
translate: 100% 0;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/* Block-end (bottom) edge */
|
|
48
|
+
:host([placement='bottom']) dialog {
|
|
49
|
+
width: 100dvw;
|
|
50
|
+
max-inline-size: 100dvw;
|
|
51
|
+
height: min(var(--size), 100dvh);
|
|
52
|
+
max-block-size: 100dvh;
|
|
53
|
+
margin-block-start: auto;
|
|
54
|
+
border-radius: var(--border-radius) var(--border-radius) 0 0;
|
|
55
|
+
translate: 0 100%;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
:host([placement='bottom']) dialog[open] {
|
|
59
|
+
translate: 0 0;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
@starting-style {
|
|
63
|
+
:host([placement='bottom']) dialog[open] {
|
|
64
|
+
translate: 0 100%;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { LuxenDialog } from '../dialog/dialog';
|
|
2
|
+
/**
|
|
3
|
+
* A drawer that slides in from a screen edge. Extends `<l-dialog>`.
|
|
4
|
+
*
|
|
5
|
+
* Open and close by toggling the `open` property (or the `--show` / `--hide`
|
|
6
|
+
* Invoker commands). Always opens as modal.
|
|
7
|
+
*
|
|
8
|
+
* @slot - Body content.
|
|
9
|
+
* @slot close - Close button (typically `<button class="l-close">`).
|
|
10
|
+
* @slot footer - Footer actions.
|
|
11
|
+
*
|
|
12
|
+
* @csspart dialog - The native `<dialog>` element.
|
|
13
|
+
* @csspart header - The header wrapper containing the title and close slot.
|
|
14
|
+
* @csspart title - The drawer title heading.
|
|
15
|
+
* @csspart body - The body wrapper around the default slot.
|
|
16
|
+
* @csspart footer - The footer wrapper around the footer slot.
|
|
17
|
+
*
|
|
18
|
+
* @cssproperty --size - Drawer size on the axis perpendicular to its edge (width for `start`/`end`, height for `bottom`). Default `320px`.
|
|
19
|
+
* @cssproperty --border-radius - Drawer border radius on the inner edges. Default `0.75rem`.
|
|
20
|
+
* @cssproperty --show-duration - Open transition duration. Default `200ms`.
|
|
21
|
+
* @cssproperty --hide-duration - Close transition duration. Default `200ms`.
|
|
22
|
+
* @cssproperty --backdrop - Backdrop color.
|
|
23
|
+
*
|
|
24
|
+
* @event show - Fired when the drawer opens. Not cancelable.
|
|
25
|
+
* @event after-show - Fired after the open animation completes.
|
|
26
|
+
* @event hide - Fired when the drawer is about to close. Cancelable — call `event.preventDefault()` to keep it open.
|
|
27
|
+
* @event after-hide - Fired after the close animation completes.
|
|
28
|
+
*/
|
|
29
|
+
export declare class LuxenDrawer extends LuxenDialog {
|
|
30
|
+
static styles: import("lit").CSSResult[];
|
|
31
|
+
/** Edge the drawer slides in from. Defaults to the start (inline-start) edge. */
|
|
32
|
+
placement?: 'start' | 'end' | 'bottom';
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=drawer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drawer.d.ts","sourceRoot":"","sources":["../../../src/html/elements/drawer/drawer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAM/C;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,WAAY,SAAQ,WAAW;IAC1C,OAAgB,MAAM,4BAA4C;IAElE,iFAAiF;IAEjF,SAAS,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;CACxC"}
|