@ixfx/components 0.5.20 → 0.6.1
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/bundle/index.d.ts +586 -261
- package/bundle/index.d.ts.map +1 -1
- package/bundle/index.js +8306 -6624
- package/bundle/index.js.map +1 -1
- package/dist/ac-text.d.ts +12 -7
- package/dist/ac-text.d.ts.map +1 -1
- package/dist/ac-text.js +3 -4
- package/dist/ac-text.js.map +1 -1
- package/dist/ac-token-DVbmHmky.d.ts +107 -0
- package/dist/ac-token-DVbmHmky.d.ts.map +1 -0
- package/dist/ac-token.d.ts +2 -0
- package/dist/ac-token.js +646 -0
- package/dist/ac-token.js.map +1 -0
- package/dist/{button-pcDaCemT.js → button-Bn0BuLpO.js} +3 -4
- package/dist/{button-pcDaCemT.js.map → button-Bn0BuLpO.js.map} +1 -1
- package/dist/button.d.ts +2 -3
- package/dist/button.d.ts.map +1 -1
- package/dist/button.js +1 -1
- package/dist/checkbox.d.ts +0 -1
- package/dist/checkbox.d.ts.map +1 -1
- package/dist/checkbox.js +1 -1
- package/dist/checkbox.js.map +1 -1
- package/dist/{colour-picker-D43Q96r0.js → colour-picker-0stHB90J.js} +11 -14
- package/dist/{colour-picker-D43Q96r0.js.map → colour-picker-0stHB90J.js.map} +1 -1
- package/dist/colour-picker.d.ts +1 -1
- package/dist/colour-picker.js +1 -1
- package/dist/crumbs.d.ts +4 -2
- package/dist/crumbs.d.ts.map +1 -1
- package/dist/crumbs.js +1152 -1
- package/dist/crumbs.js.map +1 -0
- package/dist/data-controller-DOlmqNKb.js +171 -0
- package/dist/data-controller-DOlmqNKb.js.map +1 -0
- package/dist/data-display.d.ts +1 -2
- package/dist/data-display.d.ts.map +1 -1
- package/dist/data-display.js +24 -22
- package/dist/data-display.js.map +1 -1
- package/dist/data-grid-BeAkORz2.d.ts +215 -0
- package/dist/data-grid-BeAkORz2.d.ts.map +1 -0
- package/dist/data-grid.d.ts +2 -0
- package/dist/data-grid.js +1225 -0
- package/dist/data-grid.js.map +1 -0
- package/dist/data-provider-BAn_-oR1.d.ts +61 -0
- package/dist/data-provider-BAn_-oR1.d.ts.map +1 -0
- package/dist/{decorate-DdjvVHS-.js → decorate-VRK8rslU.js} +2 -2
- package/dist/{decorate-DdjvVHS-.js.map → decorate-VRK8rslU.js.map} +1 -1
- package/dist/{defaults-BkWCPJFL.js → defaults-BCiDhZbF.js} +20 -3
- package/dist/defaults-BCiDhZbF.js.map +1 -0
- package/dist/drag-ghost-DtSDvjri.js +85 -0
- package/dist/drag-ghost-DtSDvjri.js.map +1 -0
- package/dist/editable-label.d.ts +1 -2
- package/dist/editable-label.d.ts.map +1 -1
- package/dist/editable-label.js +1 -1
- package/dist/editable-label.js.map +1 -1
- package/dist/{incr-search-CeERfijK.js → element-search-Y8SRfPGM.js} +7 -135
- package/dist/element-search-Y8SRfPGM.js.map +1 -0
- package/dist/form-CsXJX15p.js +64 -0
- package/dist/form-CsXJX15p.js.map +1 -0
- package/dist/form.d.ts +15 -0
- package/dist/form.d.ts.map +1 -0
- package/dist/form.js +2 -0
- package/dist/grouped-item-lister-CNLMgdIr.d.ts +121 -0
- package/dist/grouped-item-lister-CNLMgdIr.d.ts.map +1 -0
- package/dist/grouped-item-lister.d.ts +2 -0
- package/dist/grouped-item-lister.js +177 -0
- package/dist/grouped-item-lister.js.map +1 -0
- package/dist/{hex-editor-B-UI4OZu.js → hex-editor-Bk6rxhfg.js} +6 -8
- package/dist/{hex-editor-B-UI4OZu.js.map → hex-editor-Bk6rxhfg.js.map} +1 -1
- package/dist/{hex-editor-CMIxtNgT.d.ts → hex-editor-Caq8vNQk.d.ts} +2 -3
- package/dist/hex-editor-Caq8vNQk.d.ts.map +1 -0
- package/dist/hex.d.ts +1 -1
- package/dist/hex.js +1 -1
- package/dist/highlight-B-eQrhhb.js.map +1 -1
- package/dist/{icon-Bd5BiU4b.d.ts → icon-BUwP1CZ1.d.ts} +3 -4
- package/dist/icon-BUwP1CZ1.d.ts.map +1 -0
- package/dist/{icon-CK14NUcE.js → icons-Bm2ByQ3s.js} +10 -5
- package/dist/icons-Bm2ByQ3s.js.map +1 -0
- package/dist/icons.d.ts +2 -2
- package/dist/icons.js +2 -8
- package/dist/incr-search-vCzuao-2.js +137 -0
- package/dist/incr-search-vCzuao-2.js.map +1 -0
- package/dist/incr-search.d.ts +1 -1
- package/dist/incr-search.js +2 -1
- package/dist/{index-DrKRD8_a.d.ts → index-BOUaDIW-.d.ts} +4 -4
- package/dist/index-BOUaDIW-.d.ts.map +1 -0
- package/dist/{index-CkMIKEWp.d.ts → index-BUB5SICW.d.ts} +3 -4
- package/dist/index-BUB5SICW.d.ts.map +1 -0
- package/dist/{index-tX6fKF8m.d.ts → index-BeuCXtiO.d.ts} +3 -3
- package/dist/index-BeuCXtiO.d.ts.map +1 -0
- package/dist/{index-BslNaMLo.d.ts → index-Cu5i8zZY.d.ts} +3 -3
- package/dist/index-Cu5i8zZY.d.ts.map +1 -0
- package/dist/{index-D87kRcEs.d.ts → index-RqMh1i-O.d.ts} +2 -1
- package/dist/index-RqMh1i-O.d.ts.map +1 -0
- package/dist/{index-Cdmrn0SZ.d.ts → index-ovq_GTdl.d.ts} +11 -11
- package/dist/index-ovq_GTdl.d.ts.map +1 -0
- package/dist/index.d.ts +139 -599
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +789 -2845
- package/dist/index.js.map +1 -1
- package/dist/{labelled-input-base-ORb1rGq6.d.ts → labelled-input-base-Dp_9KP0G.d.ts} +2 -3
- package/dist/labelled-input-base-Dp_9KP0G.d.ts.map +1 -0
- package/dist/{labelled-input-base-9K_w3oLj.js → labelled-input-base-hoKGwyKT.js} +2 -2
- package/dist/{labelled-input-base-9K_w3oLj.js.map → labelled-input-base-hoKGwyKT.js.map} +1 -1
- package/dist/labelled-radial-input.d.ts +4 -5
- package/dist/labelled-radial-input.d.ts.map +1 -1
- package/dist/labelled-radial-input.js +2 -3
- package/dist/labelled-radial-input.js.map +1 -1
- package/dist/labelled-range-input.d.ts +1 -1
- package/dist/labelled-range-input.js +2 -2
- package/dist/labelled-range-input.js.map +1 -1
- package/dist/led.d.ts +1 -2
- package/dist/led.d.ts.map +1 -1
- package/dist/led.js +1 -1
- package/dist/led.js.map +1 -1
- package/dist/menu-DIfU70AA.js +1609 -0
- package/dist/menu-DIfU70AA.js.map +1 -0
- package/dist/{menu-item-AtoP6bD4.d.ts → menu-item-BG5w7fi4.d.ts} +4 -4
- package/dist/menu-item-BG5w7fi4.d.ts.map +1 -0
- package/dist/menu.d.ts +2 -2
- package/dist/menu.js +1 -2
- package/dist/miller.d.ts +7 -5
- package/dist/miller.d.ts.map +1 -1
- package/dist/miller.js +23 -25
- package/dist/miller.js.map +1 -1
- package/dist/narrowed-text.d.ts +1 -2
- package/dist/narrowed-text.d.ts.map +1 -1
- package/dist/narrowed-text.js +14 -13
- package/dist/narrowed-text.js.map +1 -1
- package/dist/notification-pill-DyZydXoZ.d.ts +68 -0
- package/dist/notification-pill-DyZydXoZ.d.ts.map +1 -0
- package/dist/notifier.d.ts +2 -0
- package/dist/notifier.js +146 -0
- package/dist/notifier.js.map +1 -0
- package/dist/panel.d.ts +1 -1
- package/dist/panel.d.ts.map +1 -1
- package/dist/panel.js +1 -2
- package/dist/panel.js.map +1 -1
- package/dist/plots.d.ts +1 -1
- package/dist/plots.js +1 -1
- package/dist/polar-pad.d.ts +1 -2
- package/dist/polar-pad.d.ts.map +1 -1
- package/dist/polar-pad.js +2 -2
- package/dist/polar-pad.js.map +1 -1
- package/dist/{radial-input-Dhu5ZGP5.d.ts → radial-input-BhZeyyP-.d.ts} +2 -3
- package/dist/radial-input-BhZeyyP-.d.ts.map +1 -0
- package/dist/{radial-input-C4f-2Bya.js → radial-input-Dk8Wydp5.js} +26 -16
- package/dist/radial-input-Dk8Wydp5.js.map +1 -0
- package/dist/radial-input.d.ts +1 -1
- package/dist/radial-input.js +1 -1
- package/dist/range-input.d.ts +2 -3
- package/dist/range-input.d.ts.map +1 -1
- package/dist/range-input.js +2 -2
- package/dist/range-input.js.map +1 -1
- package/dist/range.d.ts +2 -3
- package/dist/range.d.ts.map +1 -1
- package/dist/range.js +2 -2
- package/dist/range.js.map +1 -1
- package/dist/scroll-fade-CAs1EabA.js +70 -0
- package/dist/scroll-fade-CAs1EabA.js.map +1 -0
- package/dist/select-horiz.d.ts +50 -0
- package/dist/select-horiz.d.ts.map +1 -0
- package/dist/select-horiz.js +263 -0
- package/dist/select-horiz.js.map +1 -0
- package/dist/{slider-input-SW7e2Ac2.js → slider-input-CT4gcF-o.js} +30 -27
- package/dist/{slider-input-SW7e2Ac2.js.map → slider-input-CT4gcF-o.js.map} +1 -1
- package/dist/{slider-input-BEaztT-g.d.ts → slider-input-TidGhvXt.d.ts} +2 -3
- package/dist/slider-input-TidGhvXt.d.ts.map +1 -0
- package/dist/slider-input.d.ts +1 -1
- package/dist/slider-input.js +1 -1
- package/dist/snackbar.d.ts +58 -0
- package/dist/snackbar.d.ts.map +1 -0
- package/dist/snackbar.js +265 -0
- package/dist/snackbar.js.map +1 -0
- package/dist/snap-container.d.ts +1 -2
- package/dist/snap-container.d.ts.map +1 -1
- package/dist/snap-container.js +6 -5
- package/dist/snap-container.js.map +1 -1
- package/dist/split-layout.d.ts +1 -2
- package/dist/split-layout.d.ts.map +1 -1
- package/dist/split-layout.js +5 -3
- package/dist/split-layout.js.map +1 -1
- package/dist/swipe.d.ts +1 -2
- package/dist/swipe.d.ts.map +1 -1
- package/dist/swipe.js +4 -3
- package/dist/swipe.js.map +1 -1
- package/dist/{tab-list-B8v9KntS.d.ts → tab-list-Beuh2nom.d.ts} +4 -4
- package/dist/tab-list-Beuh2nom.d.ts.map +1 -0
- package/dist/tabs.d.ts +1 -1
- package/dist/tabs.js +533 -1
- package/dist/tabs.js.map +1 -0
- package/dist/{tickled-controller-JDOR9B8V.d.ts → tickled-controller-BtevrRLV.d.ts} +1 -2
- package/dist/tickled-controller-BtevrRLV.d.ts.map +1 -0
- package/dist/{tickled-styles-Bgo_Lpw-.js → tickled-controller-DkAU-0qL.js} +2 -88
- package/dist/tickled-controller-DkAU-0qL.js.map +1 -0
- package/dist/tickled-styles-BrAHEj1q.js +89 -0
- package/dist/tickled-styles-BrAHEj1q.js.map +1 -0
- package/dist/{timeline-CdSI003L.js → timeline-B2fgDL4U.js} +3 -3
- package/dist/{timeline-CdSI003L.js.map → timeline-B2fgDL4U.js.map} +1 -1
- package/dist/timeline.d.ts +1 -1
- package/dist/timeline.js +1 -1
- package/dist/{tooltip-BMTSUPBU.d.ts → tooltip-BlvBUQxx.d.ts} +2 -3
- package/dist/tooltip-BlvBUQxx.d.ts.map +1 -0
- package/dist/transitory-label.d.ts +30 -0
- package/dist/transitory-label.d.ts.map +1 -0
- package/dist/transitory-label.js +249 -0
- package/dist/transitory-label.js.map +1 -0
- package/dist/{tree-CqPhQRHo.js → tree-BO6BXI2b.js} +9 -10
- package/dist/{tree-CqPhQRHo.js.map → tree-BO6BXI2b.js.map} +1 -1
- package/dist/{tree-component-CDLO1ITF.d.ts → tree-component-BvV4muxx.d.ts} +8 -124
- package/dist/tree-component-BvV4muxx.d.ts.map +1 -0
- package/dist/tree.d.ts +9 -4
- package/dist/tree.d.ts.map +1 -1
- package/dist/tree.js +1 -1
- package/dist/types-Bc23SI94.d.ts +72 -0
- package/dist/types-Bc23SI94.d.ts.map +1 -0
- package/dist/types-DlVNJez_.d.ts +41 -0
- package/dist/types-DlVNJez_.d.ts.map +1 -0
- package/dist/vertical-list.d.ts +122 -0
- package/dist/vertical-list.d.ts.map +1 -0
- package/dist/vertical-list.js +737 -0
- package/dist/vertical-list.js.map +1 -0
- package/dist/{wheel-nudge-Dhzi5nHc.js → wheel-nudge-BlSCe_hD.js} +2 -2
- package/dist/{wheel-nudge-Dhzi5nHc.js.map → wheel-nudge-BlSCe_hD.js.map} +1 -1
- package/dist/{wheel-nudge-C-ra_1os.d.ts → wheel-nudge-DgMTRYlh.d.ts} +1 -2
- package/dist/wheel-nudge-DgMTRYlh.d.ts.map +1 -0
- package/dist/{xy-axis-CtDDQzGZ.d.ts → xy-axis-5KhVTNoX.d.ts} +8 -6
- package/dist/xy-axis-5KhVTNoX.d.ts.map +1 -0
- package/dist/{xy-axis-BpA2eJq6.js → xy-axis-B6yMjckW.js} +8 -112
- package/dist/xy-axis-B6yMjckW.js.map +1 -0
- package/dist/xy-pad.d.ts +1 -2
- package/dist/xy-pad.d.ts.map +1 -1
- package/dist/xy-pad.js +2 -2
- package/dist/xy-pad.js.map +1 -1
- package/docs-user/README.md +4 -2
- package/docs-user/data-grid.md +248 -0
- package/docs-user/index.json +222 -0
- package/docs-user/llms.txt +58 -0
- package/docs-user/rating.md +102 -0
- package/docs-user/toolbar.md +135 -0
- package/llms.txt +58 -0
- package/package.json +21 -11
- package/dist/crumb-navigation-Pif-kupA.js +0 -1221
- package/dist/crumb-navigation-Pif-kupA.js.map +0 -1
- package/dist/defaults-BkWCPJFL.js.map +0 -1
- package/dist/hex-editor-CMIxtNgT.d.ts.map +0 -1
- package/dist/icon-Bd5BiU4b.d.ts.map +0 -1
- package/dist/icon-CK14NUcE.js.map +0 -1
- package/dist/icons.js.map +0 -1
- package/dist/incr-search-CeERfijK.js.map +0 -1
- package/dist/index-BslNaMLo.d.ts.map +0 -1
- package/dist/index-Cdmrn0SZ.d.ts.map +0 -1
- package/dist/index-CkMIKEWp.d.ts.map +0 -1
- package/dist/index-D87kRcEs.d.ts.map +0 -1
- package/dist/index-DrKRD8_a.d.ts.map +0 -1
- package/dist/index-tX6fKF8m.d.ts.map +0 -1
- package/dist/interaction-_Y2qO3QI.js +0 -1
- package/dist/labelled-input-base-ORb1rGq6.d.ts.map +0 -1
- package/dist/menu-BiFarLUA.js +0 -826
- package/dist/menu-BiFarLUA.js.map +0 -1
- package/dist/menu-item-AtoP6bD4.d.ts.map +0 -1
- package/dist/menu-item-yHSPV8nS.js +0 -783
- package/dist/menu-item-yHSPV8nS.js.map +0 -1
- package/dist/radial-input-C4f-2Bya.js.map +0 -1
- package/dist/radial-input-Dhu5ZGP5.d.ts.map +0 -1
- package/dist/registry-CkW7q09Q.js +0 -21
- package/dist/registry-CkW7q09Q.js.map +0 -1
- package/dist/selecthorizontal.d.ts +0 -16
- package/dist/selecthorizontal.d.ts.map +0 -1
- package/dist/selecthorizontal.js +0 -43
- package/dist/selecthorizontal.js.map +0 -1
- package/dist/slider-input-BEaztT-g.d.ts.map +0 -1
- package/dist/tab-list-B8v9KntS.d.ts.map +0 -1
- package/dist/tab-list-CR0v53KJ.js +0 -615
- package/dist/tab-list-CR0v53KJ.js.map +0 -1
- package/dist/tickled-controller-JDOR9B8V.d.ts.map +0 -1
- package/dist/tickled-styles-Bgo_Lpw-.js.map +0 -1
- package/dist/tooltip-BMTSUPBU.d.ts.map +0 -1
- package/dist/tree-component-CDLO1ITF.d.ts.map +0 -1
- package/dist/types-DSfbtHs3.d.ts +0 -8
- package/dist/types-DSfbtHs3.d.ts.map +0 -1
- package/dist/wheel-nudge-C-ra_1os.d.ts.map +0 -1
- package/dist/xy-axis-BpA2eJq6.js.map +0 -1
- package/dist/xy-axis-CtDDQzGZ.d.ts.map +0 -1
- package/docs-user/selecthorizontal.md +0 -32
- /package/bundle/{chunk-D7D4PA-g.js → rolldown-runtime-D7D4PA-g.js} +0 -0
- /package/dist/{chunk-D7D4PA-g.js → rolldown-runtime-D7D4PA-g.js} +0 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { LitElement } from "lit";
|
|
2
|
+
//#region src/snackbar/snackbar.d.ts
|
|
3
|
+
type SnackbarMode = `explicit` | `manual` | `implicit`;
|
|
4
|
+
type SnackbarPlacement = `top` | `bottom` | `left` | `right`;
|
|
5
|
+
type SnackbarDismiss = `auto` | `manual`;
|
|
6
|
+
/**
|
|
7
|
+
* `ixfx-snackbar` is itself the popover panel (`popover="auto"` set on the host) -
|
|
8
|
+
* unlike `ixfx-menu-trigger`/`ixfx-colour-picker-popup` there's no separate always-visible
|
|
9
|
+
* trigger living inside the component to keep out of the top layer; the trigger is the
|
|
10
|
+
* external `for` target, so the whole host can be the popover content.
|
|
11
|
+
*/
|
|
12
|
+
declare class SnackbarElement extends LitElement {
|
|
13
|
+
for: string;
|
|
14
|
+
mode: SnackbarMode;
|
|
15
|
+
placement: SnackbarPlacement;
|
|
16
|
+
dismiss: SnackbarDismiss;
|
|
17
|
+
showDelay: number;
|
|
18
|
+
hideDelay: number;
|
|
19
|
+
private _isOpen;
|
|
20
|
+
private _recentCloseAt;
|
|
21
|
+
private readonly _anchorName;
|
|
22
|
+
private _target;
|
|
23
|
+
private _addedTabindex;
|
|
24
|
+
private _addedRole;
|
|
25
|
+
private _showTimeout;
|
|
26
|
+
private _hideTimeout;
|
|
27
|
+
private readonly _onTargetClick;
|
|
28
|
+
private readonly _onTargetKeydown;
|
|
29
|
+
private readonly _onTickleIn;
|
|
30
|
+
private readonly _onTickleOut;
|
|
31
|
+
private readonly _onPanelClick;
|
|
32
|
+
private readonly _onToggle;
|
|
33
|
+
private readonly _onBeforeToggle;
|
|
34
|
+
get isOpen(): boolean;
|
|
35
|
+
show(): void;
|
|
36
|
+
hide(): void;
|
|
37
|
+
toggle(): void;
|
|
38
|
+
connectedCallback(): void;
|
|
39
|
+
disconnectedCallback(): void;
|
|
40
|
+
updated(changed: Map<PropertyKey, unknown>): void;
|
|
41
|
+
private _resolveTarget;
|
|
42
|
+
private _attachToTarget;
|
|
43
|
+
private _detachFromTarget;
|
|
44
|
+
private _scheduleShow;
|
|
45
|
+
private _scheduleHide;
|
|
46
|
+
private _cancelShow;
|
|
47
|
+
private _cancelHide;
|
|
48
|
+
static styles: import("lit").CSSResult[];
|
|
49
|
+
protected render(): import("lit").TemplateResult<1>;
|
|
50
|
+
}
|
|
51
|
+
declare global {
|
|
52
|
+
interface HTMLElementTagNameMap {
|
|
53
|
+
'ixfx-snackbar': SnackbarElement;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//#endregion
|
|
57
|
+
export { SnackbarDismiss, SnackbarElement, SnackbarMode, SnackbarPlacement };
|
|
58
|
+
//# sourceMappingURL=snackbar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snackbar.d.ts","names":[],"sources":["../src/snackbar/snackbar.ts"],"mappings":";;KAMY;KACA;KACA;;;;;;;cAWC,wBAAwB;EACP;EACA,MAAM;EACS,WAAW;EAC1B,SAAS;EACgB;EACA;UAEpC;UAQT;mBAES;UAET;UACA;UACA;UACA;UACA;mBAES;mBACA;mBAQA;mBACA;mBACA;mBAKA;mBAQA;MAKb;EAIJ;EAUA;EAUA;EAkBS;EAYA;EAUA,QAAQ,SAAS,IAAI;UAOtB;UAOA;UAwCA;UA4BA;UAUA;UAUA;UAOA;SAOQ,sBAAM;YA0DH,wBAAM;;QAKnB;YACI;IACR,iBAAiB"}
|
package/dist/snackbar.js
ADDED
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import { t as themeFallbacks } from "./fallbacks-DEE1nCTt.js";
|
|
2
|
+
import { t as popupSurfaceStyles } from "./popup-D80sj2QC.js";
|
|
3
|
+
import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
|
|
4
|
+
import { LitElement, css, html } from "lit";
|
|
5
|
+
import { property, state } from "lit/decorators.js";
|
|
6
|
+
//#region src/snackbar/snackbar.ts
|
|
7
|
+
let _instanceCounter = 0;
|
|
8
|
+
let SnackbarElement = class SnackbarElement extends LitElement {
|
|
9
|
+
constructor(..._args) {
|
|
10
|
+
super(..._args);
|
|
11
|
+
this.for = ``;
|
|
12
|
+
this.mode = `explicit`;
|
|
13
|
+
this.placement = `top`;
|
|
14
|
+
this.dismiss = `auto`;
|
|
15
|
+
this.showDelay = 150;
|
|
16
|
+
this.hideDelay = 500;
|
|
17
|
+
this._isOpen = false;
|
|
18
|
+
this._anchorName = `--ixfx-snackbar-anchor-${++_instanceCounter}`;
|
|
19
|
+
this._addedTabindex = false;
|
|
20
|
+
this._addedRole = false;
|
|
21
|
+
this._onTargetClick = () => this.toggle();
|
|
22
|
+
this._onTargetKeydown = (e) => {
|
|
23
|
+
if (e.key !== `Enter` && e.key !== ` `) return;
|
|
24
|
+
e.preventDefault();
|
|
25
|
+
this.toggle();
|
|
26
|
+
};
|
|
27
|
+
this._onTickleIn = () => this._scheduleShow();
|
|
28
|
+
this._onTickleOut = () => this._scheduleHide();
|
|
29
|
+
this._onPanelClick = () => {
|
|
30
|
+
if (this.dismiss === `auto`) this.hide();
|
|
31
|
+
};
|
|
32
|
+
this._onToggle = (e) => {
|
|
33
|
+
const { newState } = e;
|
|
34
|
+
this._isOpen = newState === `open`;
|
|
35
|
+
if (newState === `closed` && this.contains(document.activeElement)) this._target?.focus();
|
|
36
|
+
};
|
|
37
|
+
this._onBeforeToggle = (e) => {
|
|
38
|
+
const { newState } = e;
|
|
39
|
+
this._recentCloseAt = newState === `closed` ? performance.now() : void 0;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
get isOpen() {
|
|
43
|
+
return this._isOpen;
|
|
44
|
+
}
|
|
45
|
+
show() {
|
|
46
|
+
if (!this.popover) return;
|
|
47
|
+
try {
|
|
48
|
+
this.showPopover();
|
|
49
|
+
} catch {}
|
|
50
|
+
}
|
|
51
|
+
hide() {
|
|
52
|
+
if (!this.popover) return;
|
|
53
|
+
try {
|
|
54
|
+
this.hidePopover();
|
|
55
|
+
} catch {}
|
|
56
|
+
}
|
|
57
|
+
toggle() {
|
|
58
|
+
if (!this.popover) return;
|
|
59
|
+
if (this._recentCloseAt !== void 0 && performance.now() - this._recentCloseAt < 50) {
|
|
60
|
+
this._recentCloseAt = void 0;
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
this.togglePopover();
|
|
65
|
+
} catch {}
|
|
66
|
+
}
|
|
67
|
+
connectedCallback() {
|
|
68
|
+
super.connectedCallback();
|
|
69
|
+
if (!this.hasAttribute(`popover`)) this.popover = `auto`;
|
|
70
|
+
this.classList.add(`popup-surface`);
|
|
71
|
+
this.addEventListener(`toggle`, this._onToggle);
|
|
72
|
+
this.addEventListener(`beforetoggle`, this._onBeforeToggle);
|
|
73
|
+
this.addEventListener(`click`, this._onPanelClick);
|
|
74
|
+
this.style.setProperty(`position-anchor`, this._anchorName);
|
|
75
|
+
this._attachToTarget();
|
|
76
|
+
}
|
|
77
|
+
disconnectedCallback() {
|
|
78
|
+
super.disconnectedCallback();
|
|
79
|
+
this.removeEventListener(`toggle`, this._onToggle);
|
|
80
|
+
this.removeEventListener(`beforetoggle`, this._onBeforeToggle);
|
|
81
|
+
this.removeEventListener(`click`, this._onPanelClick);
|
|
82
|
+
this._detachFromTarget();
|
|
83
|
+
this._cancelShow();
|
|
84
|
+
this._cancelHide();
|
|
85
|
+
}
|
|
86
|
+
updated(changed) {
|
|
87
|
+
super.updated(changed);
|
|
88
|
+
if (changed.has(`for`) || changed.has(`mode`)) this._attachToTarget();
|
|
89
|
+
}
|
|
90
|
+
_resolveTarget() {
|
|
91
|
+
if (!this.for) return void 0;
|
|
92
|
+
return this.getRootNode().getElementById(this.for) ?? void 0;
|
|
93
|
+
}
|
|
94
|
+
_attachToTarget() {
|
|
95
|
+
this._detachFromTarget();
|
|
96
|
+
const target = this._resolveTarget();
|
|
97
|
+
if (!target) {
|
|
98
|
+
if (this.for) console.warn(`ixfx-snackbar: no element found with id "${this.for}"`);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
this._target = target;
|
|
102
|
+
target.style.setProperty(`anchor-name`, this._anchorName);
|
|
103
|
+
if (this.mode === `explicit`) {
|
|
104
|
+
const alreadyFocusable = target.tabIndex >= 0;
|
|
105
|
+
if (!alreadyFocusable) {
|
|
106
|
+
target.setAttribute(`tabindex`, `0`);
|
|
107
|
+
this._addedTabindex = true;
|
|
108
|
+
}
|
|
109
|
+
if (!target.hasAttribute(`role`) && !alreadyFocusable) {
|
|
110
|
+
target.setAttribute(`role`, `button`);
|
|
111
|
+
this._addedRole = true;
|
|
112
|
+
}
|
|
113
|
+
target.setAttribute(`aria-haspopup`, `true`);
|
|
114
|
+
target.addEventListener(`click`, this._onTargetClick);
|
|
115
|
+
if (!alreadyFocusable) target.addEventListener(`keydown`, this._onTargetKeydown);
|
|
116
|
+
} else if (this.mode === `implicit`) {
|
|
117
|
+
target.addEventListener(`pointerenter`, this._onTickleIn);
|
|
118
|
+
target.addEventListener(`focus`, this._onTickleIn);
|
|
119
|
+
target.addEventListener(`pointerleave`, this._onTickleOut);
|
|
120
|
+
target.addEventListener(`blur`, this._onTickleOut);
|
|
121
|
+
this.addEventListener(`pointerenter`, this._onTickleIn);
|
|
122
|
+
this.addEventListener(`focusin`, this._onTickleIn);
|
|
123
|
+
this.addEventListener(`pointerleave`, this._onTickleOut);
|
|
124
|
+
this.addEventListener(`focusout`, this._onTickleOut);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
_detachFromTarget() {
|
|
128
|
+
const target = this._target;
|
|
129
|
+
if (!target) return;
|
|
130
|
+
target.style.removeProperty(`anchor-name`);
|
|
131
|
+
if (this._addedTabindex) {
|
|
132
|
+
target.removeAttribute(`tabindex`);
|
|
133
|
+
this._addedTabindex = false;
|
|
134
|
+
}
|
|
135
|
+
if (this._addedRole) {
|
|
136
|
+
target.removeAttribute(`role`);
|
|
137
|
+
this._addedRole = false;
|
|
138
|
+
}
|
|
139
|
+
target.removeAttribute(`aria-haspopup`);
|
|
140
|
+
target.removeEventListener(`click`, this._onTargetClick);
|
|
141
|
+
target.removeEventListener(`keydown`, this._onTargetKeydown);
|
|
142
|
+
target.removeEventListener(`pointerenter`, this._onTickleIn);
|
|
143
|
+
target.removeEventListener(`focus`, this._onTickleIn);
|
|
144
|
+
target.removeEventListener(`pointerleave`, this._onTickleOut);
|
|
145
|
+
target.removeEventListener(`blur`, this._onTickleOut);
|
|
146
|
+
this.removeEventListener(`pointerenter`, this._onTickleIn);
|
|
147
|
+
this.removeEventListener(`focusin`, this._onTickleIn);
|
|
148
|
+
this.removeEventListener(`pointerleave`, this._onTickleOut);
|
|
149
|
+
this.removeEventListener(`focusout`, this._onTickleOut);
|
|
150
|
+
this._target = void 0;
|
|
151
|
+
}
|
|
152
|
+
_scheduleShow() {
|
|
153
|
+
this._cancelHide();
|
|
154
|
+
this._cancelShow();
|
|
155
|
+
if (this.showDelay <= 0) {
|
|
156
|
+
this.show();
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
this._showTimeout = window.setTimeout(() => this.show(), this.showDelay);
|
|
160
|
+
}
|
|
161
|
+
_scheduleHide() {
|
|
162
|
+
this._cancelShow();
|
|
163
|
+
this._cancelHide();
|
|
164
|
+
if (this.hideDelay <= 0) {
|
|
165
|
+
this.hide();
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
this._hideTimeout = window.setTimeout(() => this.hide(), this.hideDelay);
|
|
169
|
+
}
|
|
170
|
+
_cancelShow() {
|
|
171
|
+
if (this._showTimeout !== void 0) {
|
|
172
|
+
window.clearTimeout(this._showTimeout);
|
|
173
|
+
this._showTimeout = void 0;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
_cancelHide() {
|
|
177
|
+
if (this._hideTimeout !== void 0) {
|
|
178
|
+
window.clearTimeout(this._hideTimeout);
|
|
179
|
+
this._hideTimeout = void 0;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
static {
|
|
183
|
+
this.styles = [
|
|
184
|
+
themeFallbacks,
|
|
185
|
+
popupSurfaceStyles,
|
|
186
|
+
css`
|
|
187
|
+
:host {
|
|
188
|
+
display: flex;
|
|
189
|
+
align-items: center;
|
|
190
|
+
gap: var(--space-s);
|
|
191
|
+
padding: var(--space-s);
|
|
192
|
+
|
|
193
|
+
position: fixed;
|
|
194
|
+
inset: unset;
|
|
195
|
+
margin: 0;
|
|
196
|
+
z-index: 100;
|
|
197
|
+
position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline;
|
|
198
|
+
|
|
199
|
+
opacity: 0;
|
|
200
|
+
scale: 0.97;
|
|
201
|
+
pointer-events: none;
|
|
202
|
+
transition: opacity 0.12s ease-out, scale 0.12s ease-out,
|
|
203
|
+
display 0.12s allow-discrete, overlay 0.12s allow-discrete;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
:host(:popover-open) {
|
|
207
|
+
opacity: 1;
|
|
208
|
+
scale: 1;
|
|
209
|
+
pointer-events: auto;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
@starting-style {
|
|
213
|
+
:host(:popover-open) {
|
|
214
|
+
opacity: 0;
|
|
215
|
+
scale: 0.97;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
:host([placement="top"]) {
|
|
220
|
+
position-area: block-start;
|
|
221
|
+
margin-block-end: var(--space-s);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
:host([placement="bottom"]) {
|
|
225
|
+
position-area: block-end;
|
|
226
|
+
margin-block-start: var(--space-s);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
:host([placement="left"]) {
|
|
230
|
+
position-area: inline-start;
|
|
231
|
+
margin-inline-end: var(--space-s);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
:host([placement="right"]) {
|
|
235
|
+
position-area: inline-end;
|
|
236
|
+
margin-inline-start: var(--space-s);
|
|
237
|
+
}
|
|
238
|
+
`
|
|
239
|
+
];
|
|
240
|
+
}
|
|
241
|
+
render() {
|
|
242
|
+
return html`<slot></slot>`;
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
__decorate([property({ type: String })], SnackbarElement.prototype, "for", void 0);
|
|
246
|
+
__decorate([property({ type: String })], SnackbarElement.prototype, "mode", void 0);
|
|
247
|
+
__decorate([property({
|
|
248
|
+
type: String,
|
|
249
|
+
reflect: true
|
|
250
|
+
})], SnackbarElement.prototype, "placement", void 0);
|
|
251
|
+
__decorate([property({ type: String })], SnackbarElement.prototype, "dismiss", void 0);
|
|
252
|
+
__decorate([property({
|
|
253
|
+
type: Number,
|
|
254
|
+
attribute: `show-delay`
|
|
255
|
+
})], SnackbarElement.prototype, "showDelay", void 0);
|
|
256
|
+
__decorate([property({
|
|
257
|
+
type: Number,
|
|
258
|
+
attribute: `hide-delay`
|
|
259
|
+
})], SnackbarElement.prototype, "hideDelay", void 0);
|
|
260
|
+
__decorate([state()], SnackbarElement.prototype, "_isOpen", void 0);
|
|
261
|
+
SnackbarElement = __decorate([safeCustomElement(`ixfx-snackbar`)], SnackbarElement);
|
|
262
|
+
//#endregion
|
|
263
|
+
export { SnackbarElement };
|
|
264
|
+
|
|
265
|
+
//# sourceMappingURL=snackbar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snackbar.js","names":["customElement"],"sources":["../src/snackbar/snackbar.ts"],"sourcesContent":["import { css, html, LitElement } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { popupSurfaceStyles } from '../styles/popup.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\nexport type SnackbarMode = `explicit` | `manual` | `implicit`;\nexport type SnackbarPlacement = `top` | `bottom` | `left` | `right`;\nexport type SnackbarDismiss = `auto` | `manual`;\n\nlet _instanceCounter = 0;\n\n/**\n * `ixfx-snackbar` is itself the popover panel (`popover=\"auto\"` set on the host) -\n * unlike `ixfx-menu-trigger`/`ixfx-colour-picker-popup` there's no separate always-visible\n * trigger living inside the component to keep out of the top layer; the trigger is the\n * external `for` target, so the whole host can be the popover content.\n */\n@customElement(`ixfx-snackbar`)\nexport class SnackbarElement extends LitElement {\n @property({ type: String }) for = ``;\n @property({ type: String }) mode: SnackbarMode = `explicit`;\n @property({ type: String, reflect: true }) placement: SnackbarPlacement = `top`;\n @property({ type: String }) dismiss: SnackbarDismiss = `auto`;\n @property({ type: Number, attribute: `show-delay` }) showDelay = 150;\n @property({ type: Number, attribute: `hide-delay` }) hideDelay = 500;\n\n @state() private _isOpen = false;\n\n // When a close wasn't initiated by our own code (light-dismiss: click outside or\n // Escape) the popover is already closed before the click that triggered it dispatches.\n // toggle() consults this to avoid immediately re-opening via togglePopover(). The\n // timestamp window is deliberately tiny — light-dismiss and the ensuing click happen\n // in the same event dispatch, microseconds apart, so it can't swallow a later, real\n // toggle (e.g. clicking a toggle button after having dismissed the popover earlier).\n private _recentCloseAt: number | undefined;\n\n private readonly _anchorName = `--ixfx-snackbar-anchor-${++_instanceCounter}`;\n\n private _target: HTMLElement | undefined;\n private _addedTabindex = false;\n private _addedRole = false;\n private _showTimeout: number | undefined;\n private _hideTimeout: number | undefined;\n\n private readonly _onTargetClick = (): void => this.toggle();\n private readonly _onTargetKeydown = (e: KeyboardEvent): void => {\n if (e.key !== `Enter` && e.key !== ` `)\n return;\n e.preventDefault();\n this.toggle();\n };\n\n // Shared by both the target and the panel itself - hovering/focusing either keeps it open.\n private readonly _onTickleIn = (): void => this._scheduleShow();\n private readonly _onTickleOut = (): void => this._scheduleHide();\n private readonly _onPanelClick = (): void => {\n if (this.dismiss === `auto`)\n this.hide();\n };\n\n private readonly _onToggle = (e: Event): void => {\n const { newState } = e as ToggleEvent;\n this._isOpen = newState === `open`;\n if (newState === `closed` && this.contains(document.activeElement)) {\n this._target?.focus();\n }\n };\n\n private readonly _onBeforeToggle = (e: Event): void => {\n const { newState } = e as ToggleEvent;\n this._recentCloseAt = newState === `closed` ? performance.now() : undefined;\n };\n\n get isOpen(): boolean {\n return this._isOpen;\n }\n\n show(): void {\n if (!this.popover)\n return;\n try {\n this.showPopover();\n } catch {\n // already open, or popover API unsupported\n }\n }\n\n hide(): void {\n if (!this.popover)\n return;\n try {\n this.hidePopover();\n } catch {\n // already closed\n }\n }\n\n toggle(): void {\n if (!this.popover)\n return;\n // If the popover was just closed by light-dismiss as part of this same click\n // (click outside closes an `auto` popover before the click event dispatches),\n // togglePopover() would re-open it. Honour the dismiss instead: the popover is\n // already closed, so the toggle is a no-op.\n if (this._recentCloseAt !== undefined && performance.now() - this._recentCloseAt < 50) {\n this._recentCloseAt = undefined;\n return;\n }\n try {\n this.togglePopover();\n } catch {\n // popover API unsupported\n }\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (!this.hasAttribute(`popover`))\n this.popover = `auto`;\n this.classList.add(`popup-surface`);\n this.addEventListener(`toggle`, this._onToggle);\n this.addEventListener(`beforetoggle`, this._onBeforeToggle);\n this.addEventListener(`click`, this._onPanelClick);\n this.style.setProperty(`position-anchor`, this._anchorName);\n this._attachToTarget();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`toggle`, this._onToggle);\n this.removeEventListener(`beforetoggle`, this._onBeforeToggle);\n this.removeEventListener(`click`, this._onPanelClick);\n this._detachFromTarget();\n this._cancelShow();\n this._cancelHide();\n }\n\n override updated(changed: Map<PropertyKey, unknown>): void {\n super.updated(changed);\n if (changed.has(`for`) || changed.has(`mode`)) {\n this._attachToTarget();\n }\n }\n\n private _resolveTarget(): HTMLElement | undefined {\n if (!this.for)\n return undefined;\n const root = this.getRootNode() as Document | ShadowRoot;\n return root.getElementById(this.for) ?? undefined;\n }\n\n private _attachToTarget(): void {\n this._detachFromTarget();\n\n const target = this._resolveTarget();\n if (!target) {\n if (this.for)\n console.warn(`ixfx-snackbar: no element found with id \"${this.for}\"`);\n return;\n }\n this._target = target;\n target.style.setProperty(`anchor-name`, this._anchorName);\n\n if (this.mode === `explicit`) {\n const alreadyFocusable = target.tabIndex >= 0;\n if (!alreadyFocusable) {\n target.setAttribute(`tabindex`, `0`);\n this._addedTabindex = true;\n }\n if (!target.hasAttribute(`role`) && !alreadyFocusable) {\n target.setAttribute(`role`, `button`);\n this._addedRole = true;\n }\n target.setAttribute(`aria-haspopup`, `true`);\n target.addEventListener(`click`, this._onTargetClick);\n // Native interactive elements (button, a[href], ...) already turn Enter/Space into a\n // click; a target we just made focusable via role=\"button\" does not get that for free.\n if (!alreadyFocusable)\n target.addEventListener(`keydown`, this._onTargetKeydown);\n } else if (this.mode === `implicit`) {\n target.addEventListener(`pointerenter`, this._onTickleIn);\n target.addEventListener(`focus`, this._onTickleIn);\n target.addEventListener(`pointerleave`, this._onTickleOut);\n target.addEventListener(`blur`, this._onTickleOut);\n this.addEventListener(`pointerenter`, this._onTickleIn);\n this.addEventListener(`focusin`, this._onTickleIn);\n this.addEventListener(`pointerleave`, this._onTickleOut);\n this.addEventListener(`focusout`, this._onTickleOut);\n }\n }\n\n private _detachFromTarget(): void {\n const target = this._target;\n if (!target)\n return;\n\n target.style.removeProperty(`anchor-name`);\n if (this._addedTabindex) {\n target.removeAttribute(`tabindex`);\n this._addedTabindex = false;\n }\n if (this._addedRole) {\n target.removeAttribute(`role`);\n this._addedRole = false;\n }\n target.removeAttribute(`aria-haspopup`);\n target.removeEventListener(`click`, this._onTargetClick);\n target.removeEventListener(`keydown`, this._onTargetKeydown);\n target.removeEventListener(`pointerenter`, this._onTickleIn);\n target.removeEventListener(`focus`, this._onTickleIn);\n target.removeEventListener(`pointerleave`, this._onTickleOut);\n target.removeEventListener(`blur`, this._onTickleOut);\n this.removeEventListener(`pointerenter`, this._onTickleIn);\n this.removeEventListener(`focusin`, this._onTickleIn);\n this.removeEventListener(`pointerleave`, this._onTickleOut);\n this.removeEventListener(`focusout`, this._onTickleOut);\n this._target = undefined;\n }\n\n private _scheduleShow(): void {\n this._cancelHide();\n this._cancelShow();\n if (this.showDelay <= 0) {\n this.show();\n return;\n }\n this._showTimeout = window.setTimeout(() => this.show(), this.showDelay);\n }\n\n private _scheduleHide(): void {\n this._cancelShow();\n this._cancelHide();\n if (this.hideDelay <= 0) {\n this.hide();\n return;\n }\n this._hideTimeout = window.setTimeout(() => this.hide(), this.hideDelay);\n }\n\n private _cancelShow(): void {\n if (this._showTimeout !== undefined) {\n window.clearTimeout(this._showTimeout);\n this._showTimeout = undefined;\n }\n }\n\n private _cancelHide(): void {\n if (this._hideTimeout !== undefined) {\n window.clearTimeout(this._hideTimeout);\n this._hideTimeout = undefined;\n }\n }\n\n static override styles = [\n themeFallbacks,\n popupSurfaceStyles,\n css`\n :host {\n display: flex;\n align-items: center;\n gap: var(--space-s);\n padding: var(--space-s);\n\n position: fixed;\n inset: unset;\n margin: 0;\n z-index: 100;\n position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline;\n\n opacity: 0;\n scale: 0.97;\n pointer-events: none;\n transition: opacity 0.12s ease-out, scale 0.12s ease-out,\n display 0.12s allow-discrete, overlay 0.12s allow-discrete;\n }\n\n :host(:popover-open) {\n opacity: 1;\n scale: 1;\n pointer-events: auto;\n }\n\n @starting-style {\n :host(:popover-open) {\n opacity: 0;\n scale: 0.97;\n }\n }\n\n :host([placement=\"top\"]) {\n position-area: block-start;\n margin-block-end: var(--space-s);\n }\n\n :host([placement=\"bottom\"]) {\n position-area: block-end;\n margin-block-start: var(--space-s);\n }\n\n :host([placement=\"left\"]) {\n position-area: inline-start;\n margin-inline-end: var(--space-s);\n }\n\n :host([placement=\"right\"]) {\n position-area: inline-end;\n margin-inline-start: var(--space-s);\n }\n `,\n ];\n\n protected override render() {\n return html`<slot></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-snackbar': SnackbarElement;\n }\n}\n"],"mappings":"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"}
|
package/dist/snap-container.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { LitElement, html } from "lit";
|
|
2
|
-
|
|
3
2
|
//#region src/snap-container/snap-container.d.ts
|
|
4
3
|
type SnapLogic = `centre` | `balanced`;
|
|
5
4
|
type ClickSnapMode = `closest` | `step`;
|
|
@@ -43,7 +42,7 @@ declare global {
|
|
|
43
42
|
interface HTMLElementTagNameMap {
|
|
44
43
|
'ixfx-snap-container': SnapContainer;
|
|
45
44
|
}
|
|
46
|
-
}
|
|
45
|
+
}
|
|
47
46
|
//#endregion
|
|
48
47
|
export { ClickSnapMode, SnapChangeDetail, SnapChangeEvent, SnapContainer, SnapInputDetail, SnapInputEvent, SnapLogic };
|
|
49
48
|
//# sourceMappingURL=snap-container.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snap-container.d.ts","names":[],"sources":["../src/snap-container/snap-container.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"snap-container.d.ts","names":[],"sources":["../src/snap-container/snap-container.ts"],"mappings":";;KAIY;KACA;cAGC,sBAAsB;SACjB,sBAAM;EA0DtB;EAGA;EAGA,WAAW;EAGX;EAGA;UAGQ;UAEA;UACA;UACA;UACA;UACA;cAEI;UAIJ;UAMA;UAwCA;UA8BA;UAWA;UAwBA;UA0DA;UAyBA;UA2BA;EAoCC;EAKA,QAAQ,mBAAmB;EAM3B,UAAU,kBAAkB;;KAc3B;WACD;WACA;;KAGC,kBAAkB,YAAY;KAE9B;WACD;;KAGC,iBAAiB,YAAY;QAEjC;YACI;IACR,uBAAuB"}
|
package/dist/snap-container.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as safeCustomElement, t as __decorate } from "./decorate-
|
|
1
|
+
import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
|
|
2
2
|
import { LitElement, css, html } from "lit";
|
|
3
3
|
import { property, state } from "lit/decorators.js";
|
|
4
4
|
//#region src/snap-container/snap-container.ts
|
|
@@ -95,10 +95,11 @@ let SnapContainer = class SnapContainer extends LitElement {
|
|
|
95
95
|
};
|
|
96
96
|
this._onKeyDown = (e) => {
|
|
97
97
|
let newSnap = this.snap;
|
|
98
|
-
if (this._isHorizontal)
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
98
|
+
if (this._isHorizontal) {
|
|
99
|
+
if (e.key === `ArrowLeft`) newSnap = Math.max(0, this.snap - 1);
|
|
100
|
+
else if (e.key === `ArrowRight`) newSnap = Math.min(this.snapPositions - 1, this.snap + 1);
|
|
101
|
+
else return;
|
|
102
|
+
} else if (e.key === `ArrowUp`) newSnap = Math.max(0, this.snap - 1);
|
|
102
103
|
else if (e.key === `ArrowDown`) newSnap = Math.min(this.snapPositions - 1, this.snap + 1);
|
|
103
104
|
else return;
|
|
104
105
|
e.preventDefault();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snap-container.js","names":["customElement"],"sources":["../src/snap-container/snap-container.ts"],"sourcesContent":["import { css, html, LitElement } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\nexport type SnapLogic = `centre` | `balanced`;\nexport type ClickSnapMode = `closest` | `step`;\n\n@customElement(`ixfx-snap-container`)\nexport class SnapContainer extends LitElement {\n static override styles = css`\n :host {\n display: block;\n position: relative;\n overflow: hidden;\n touch-action: none;\n user-select: none;\n --transition-duration: 200ms;\n }\n \n :host([orientation=\"horizontal\"]) {\n width: 100%;\n height: auto;\n min-height: 25px;\n }\n \n :host([orientation=\"vertical\"]) {\n height: 100%;\n width: auto;\n min-width: 25px;\n }\n \n :host(:not([orientation])) {\n width: 100%;\n min-height: 25px;\n }\n \n .container {\n position: relative;\n width: 100%;\n height: 100%;\n min-height: inherit;\n min-width: inherit;\n }\n \n ::slotted(*) {\n position: absolute;\n transition: left var(--transition-duration) ease-out, \n top var(--transition-duration) ease-out;\n cursor: grab;\n will-change: left, top;\n }\n \n ::slotted(*:active) {\n cursor: grabbing;\n }\n \n :host([orientation=\"vertical\"]) ::slotted(*) {\n transition: top var(--transition-duration) ease-out,\n left var(--transition-duration) ease-out;\n }\n \n .dragging {\n transition: none !important;\n }\n `;\n\n @property({ type: String, attribute: `orientation` })\n orientation: `horizontal` | `vertical` = `horizontal`;\n\n @property({ type: Number, attribute: `snap-positions` })\n snapPositions = 3;\n\n @property({ type: String, attribute: `snap-logic` })\n snapLogic: SnapLogic = `balanced`;\n\n @property({ type: String, attribute: `click-snap` })\n clickSnap: `closest` | `step` = `closest`;\n\n @property({ type: Number })\n snap = 0;\n\n @state()\n private _dragging = false;\n\n private _dragStart = 0;\n private _dragThreshold = 10;\n private _thresholdReached = false;\n private _currentDragIndex = 0;\n private _child: HTMLElement | null = null;\n\n private get _isHorizontal(): boolean {\n return this.orientation !== `vertical`;\n }\n\n private _getChild(): HTMLElement | null {\n if (this._child)\n return this._child;\n return this.firstElementChild as HTMLElement | null;\n }\n\n private _computeSnapPositions(): number[] {\n const positions: number[] = [];\n const containerSize = this._isHorizontal ? this.clientWidth : this.clientHeight;\n const child = this._getChild();\n const childSize = child\n ? (this._isHorizontal ? child.offsetWidth : child.offsetHeight)\n : 0;\n\n if (containerSize === 0 || childSize === 0)\n return [];\n\n const availableSpace = containerSize - childSize;\n\n if (this.snapLogic === `centre`) {\n for (let i = 0; i < this.snapPositions; i++) {\n const fraction = i / (this.snapPositions - 1 || 1);\n positions.push(fraction * availableSpace);\n }\n } else {\n const firstPosition = 0;\n const lastPosition = availableSpace;\n\n if (this.snapPositions === 1) {\n positions.push(availableSpace / 2);\n } else if (this.snapPositions === 2) {\n positions.push(firstPosition, lastPosition);\n } else {\n positions.push(firstPosition);\n const middleCount = this.snapPositions - 2;\n for (let i = 1; i <= middleCount; i++) {\n const fraction = i / (middleCount + 1);\n positions.push(firstPosition + fraction * (lastPosition - firstPosition));\n }\n positions.push(lastPosition);\n }\n }\n\n return positions;\n }\n\n private _getSnapIndex(clientPos: number, containerRect: DOMRect): number {\n const offsetInAxis = this._isHorizontal\n ? clientPos - containerRect.left\n : clientPos - containerRect.top;\n\n const snapPositions = this._computeSnapPositions();\n if (snapPositions.length === 0)\n return 0;\n\n const child = this._getChild();\n const childSize = child\n ? (this._isHorizontal ? child.offsetWidth : child.offsetHeight)\n : 0;\n\n const halfChild = childSize / 2;\n let closestIndex = 0;\n let closestDistance = Infinity;\n\n for (let i = 0; i < snapPositions.length; i++) {\n const snapCenter = snapPositions[i] + halfChild;\n const distance = Math.abs(offsetInAxis - snapCenter);\n if (distance < closestDistance) {\n closestDistance = distance;\n closestIndex = i;\n }\n }\n\n return closestIndex;\n }\n\n private _clampChildPosition(position: number): number {\n const containerSize = this._isHorizontal ? this.clientWidth : this.clientHeight;\n const child = this._getChild();\n const childSize = child\n ? (this._isHorizontal ? child.offsetWidth : child.offsetHeight)\n : 0;\n\n const maxPosition = containerSize - childSize;\n return Math.max(0, Math.min(position, maxPosition));\n }\n\n private _updateChildPosition(index: number): void {\n const snapPositions = this._computeSnapPositions();\n if (snapPositions.length === 0)\n return;\n\n const clampedIndex = Math.max(0, Math.min(index, snapPositions.length - 1));\n const position = snapPositions[clampedIndex];\n\n const child = this._getChild();\n if (!child)\n return;\n\n if (this._isHorizontal) {\n const clampedPosition = this._clampChildPosition(position);\n child.style.left = `${clampedPosition}px`;\n child.style.top = `0px`;\n } else {\n const clampedPosition = this._clampChildPosition(position);\n child.style.top = `${clampedPosition}px`;\n child.style.left = `0px`;\n }\n child.style.setProperty(`--snap-index`, String(clampedIndex));\n }\n\n private _onPointerDown = (e: PointerEvent): void => {\n const child = this._getChild();\n if (!child)\n return;\n\n const containerRect = this.getBoundingClientRect();\n const newIndex = this._getSnapIndex(\n this._isHorizontal ? e.clientX : e.clientY,\n containerRect,\n );\n\n if (child.contains(e.target as Node)) {\n e.preventDefault();\n e.stopPropagation();\n this._dragging = true;\n this._thresholdReached = false;\n this._dragStart = this._isHorizontal ? e.clientX : e.clientY;\n this._currentDragIndex = newIndex;\n child.classList.add(`dragging`);\n\n document.addEventListener(`pointermove`, this._onPointerMove);\n document.addEventListener(`pointerup`, this._onPointerUp);\n } else {\n let targetIndex: number;\n\n if (this.clickSnap === `step`) {\n targetIndex = this.snap;\n const childRect = child.getBoundingClientRect();\n const childCenter = this._isHorizontal\n ? childRect.left + childRect.width / 2\n : childRect.top + childRect.height / 2;\n const clickPos = this._isHorizontal ? e.clientX : e.clientY;\n\n if (clickPos > childCenter) {\n targetIndex = Math.min(this.snapPositions - 1, this.snap + 1);\n } else if (clickPos < childCenter) {\n targetIndex = Math.max(0, this.snap - 1);\n }\n } else {\n targetIndex = newIndex;\n }\n\n if (targetIndex !== this.snap) {\n const previousSnap = this.snap;\n this.snap = targetIndex;\n this._updateChildPosition(this.snap);\n\n this.dispatchEvent(new CustomEvent<SnapChangeDetail>(`snap-change`, {\n detail: { previousSnap, newSnap: this.snap },\n bubbles: true,\n composed: true,\n }));\n } else {\n this._updateChildPosition(this.snap);\n }\n }\n };\n\n private _onPointerMove = (e: PointerEvent): void => {\n if (!this._dragging)\n return;\n\n const currentPos = this._isHorizontal ? e.clientX : e.clientY;\n const delta = currentPos - this._dragStart;\n const containerRect = this.getBoundingClientRect();\n\n if (!this._thresholdReached && Math.abs(delta) < this._dragThreshold) {\n return;\n }\n\n this._thresholdReached = true;\n\n const newIndex = this._getSnapIndex(currentPos, containerRect);\n this._currentDragIndex = newIndex;\n this._updateChildPosition(newIndex);\n\n this.dispatchEvent(new CustomEvent<SnapInputDetail>(`snap-input`, {\n detail: { index: newIndex },\n bubbles: true,\n composed: true,\n }));\n };\n\n private _onPointerUp = (): void => {\n if (!this._dragging)\n return;\n\n this._dragging = false;\n const child = this._getChild();\n if (child)\n child.classList.remove(`dragging`);\n\n document.removeEventListener(`pointermove`, this._onPointerMove);\n document.removeEventListener(`pointerup`, this._onPointerUp);\n\n if (this._thresholdReached && this._currentDragIndex !== this.snap) {\n const previousSnap = this.snap;\n this.snap = this._currentDragIndex;\n this._updateChildPosition(this.snap);\n\n this.dispatchEvent(new CustomEvent<SnapChangeDetail>(`snap-change`, {\n detail: { previousSnap, newSnap: this.snap },\n bubbles: true,\n composed: true,\n }));\n } else {\n this._updateChildPosition(this.snap);\n }\n };\n\n private _onKeyDown = (e: KeyboardEvent): void => {\n let newSnap = this.snap;\n\n if (this._isHorizontal) {\n if (e.key === `ArrowLeft`) {\n newSnap = Math.max(0, this.snap - 1);\n } else if (e.key === `ArrowRight`) {\n newSnap = Math.min(this.snapPositions - 1, this.snap + 1);\n } else {\n return;\n }\n } else {\n if (e.key === `ArrowUp`) {\n newSnap = Math.max(0, this.snap - 1);\n } else if (e.key === `ArrowDown`) {\n newSnap = Math.min(this.snapPositions - 1, this.snap + 1);\n } else {\n return;\n }\n }\n\n e.preventDefault();\n\n if (newSnap !== this.snap) {\n const previousSnap = this.snap;\n this.snap = newSnap;\n this._updateChildPosition(this.snap);\n\n this.dispatchEvent(new CustomEvent<SnapChangeDetail>(`snap-change`, {\n detail: { previousSnap, newSnap: this.snap },\n bubbles: true,\n composed: true,\n }));\n }\n };\n\n override firstUpdated(): void {\n this._child = this.firstElementChild as HTMLElement | null;\n this._updateChildPosition(this.snap);\n }\n\n override updated(changedProperties: Map<string, unknown>): void {\n if (changedProperties.has(`snap`) && !this._dragging) {\n this._updateChildPosition(this.snap);\n }\n }\n\n override render(): ReturnType<typeof html> {\n return html`\n <div \n class=\"container\"\n @pointerdown=${this._onPointerDown}\n tabindex=\"0\"\n @keydown=${this._onKeyDown}\n >\n <slot></slot>\n </div>\n `;\n }\n}\n\nexport type SnapChangeDetail = {\n readonly previousSnap: number;\n readonly newSnap: number;\n};\n\nexport type SnapChangeEvent = CustomEvent<SnapChangeDetail>;\n\nexport type SnapInputDetail = {\n readonly index: number;\n};\n\nexport type SnapInputEvent = CustomEvent<SnapInputDetail>;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-snap-container': SnapContainer;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"snap-container.js","names":["customElement"],"sources":["../src/snap-container/snap-container.ts"],"sourcesContent":["import { css, html, LitElement } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\nexport type SnapLogic = `centre` | `balanced`;\nexport type ClickSnapMode = `closest` | `step`;\n\n@customElement(`ixfx-snap-container`)\nexport class SnapContainer extends LitElement {\n static override styles = css`\n :host {\n display: block;\n position: relative;\n overflow: hidden;\n touch-action: none;\n user-select: none;\n --transition-duration: 200ms;\n }\n \n :host([orientation=\"horizontal\"]) {\n width: 100%;\n height: auto;\n min-height: 25px;\n }\n \n :host([orientation=\"vertical\"]) {\n height: 100%;\n width: auto;\n min-width: 25px;\n }\n \n :host(:not([orientation])) {\n width: 100%;\n min-height: 25px;\n }\n \n .container {\n position: relative;\n width: 100%;\n height: 100%;\n min-height: inherit;\n min-width: inherit;\n }\n \n ::slotted(*) {\n position: absolute;\n transition: left var(--transition-duration) ease-out, \n top var(--transition-duration) ease-out;\n cursor: grab;\n will-change: left, top;\n }\n \n ::slotted(*:active) {\n cursor: grabbing;\n }\n \n :host([orientation=\"vertical\"]) ::slotted(*) {\n transition: top var(--transition-duration) ease-out,\n left var(--transition-duration) ease-out;\n }\n \n .dragging {\n transition: none !important;\n }\n `;\n\n @property({ type: String, attribute: `orientation` })\n orientation: `horizontal` | `vertical` = `horizontal`;\n\n @property({ type: Number, attribute: `snap-positions` })\n snapPositions = 3;\n\n @property({ type: String, attribute: `snap-logic` })\n snapLogic: SnapLogic = `balanced`;\n\n @property({ type: String, attribute: `click-snap` })\n clickSnap: `closest` | `step` = `closest`;\n\n @property({ type: Number })\n snap = 0;\n\n @state()\n private _dragging = false;\n\n private _dragStart = 0;\n private _dragThreshold = 10;\n private _thresholdReached = false;\n private _currentDragIndex = 0;\n private _child: HTMLElement | null = null;\n\n private get _isHorizontal(): boolean {\n return this.orientation !== `vertical`;\n }\n\n private _getChild(): HTMLElement | null {\n if (this._child)\n return this._child;\n return this.firstElementChild as HTMLElement | null;\n }\n\n private _computeSnapPositions(): number[] {\n const positions: number[] = [];\n const containerSize = this._isHorizontal ? this.clientWidth : this.clientHeight;\n const child = this._getChild();\n const childSize = child\n ? (this._isHorizontal ? child.offsetWidth : child.offsetHeight)\n : 0;\n\n if (containerSize === 0 || childSize === 0)\n return [];\n\n const availableSpace = containerSize - childSize;\n\n if (this.snapLogic === `centre`) {\n for (let i = 0; i < this.snapPositions; i++) {\n const fraction = i / (this.snapPositions - 1 || 1);\n positions.push(fraction * availableSpace);\n }\n } else {\n const firstPosition = 0;\n const lastPosition = availableSpace;\n\n if (this.snapPositions === 1) {\n positions.push(availableSpace / 2);\n } else if (this.snapPositions === 2) {\n positions.push(firstPosition, lastPosition);\n } else {\n positions.push(firstPosition);\n const middleCount = this.snapPositions - 2;\n for (let i = 1; i <= middleCount; i++) {\n const fraction = i / (middleCount + 1);\n positions.push(firstPosition + fraction * (lastPosition - firstPosition));\n }\n positions.push(lastPosition);\n }\n }\n\n return positions;\n }\n\n private _getSnapIndex(clientPos: number, containerRect: DOMRect): number {\n const offsetInAxis = this._isHorizontal\n ? clientPos - containerRect.left\n : clientPos - containerRect.top;\n\n const snapPositions = this._computeSnapPositions();\n if (snapPositions.length === 0)\n return 0;\n\n const child = this._getChild();\n const childSize = child\n ? (this._isHorizontal ? child.offsetWidth : child.offsetHeight)\n : 0;\n\n const halfChild = childSize / 2;\n let closestIndex = 0;\n let closestDistance = Infinity;\n\n for (let i = 0; i < snapPositions.length; i++) {\n const snapCenter = snapPositions[i] + halfChild;\n const distance = Math.abs(offsetInAxis - snapCenter);\n if (distance < closestDistance) {\n closestDistance = distance;\n closestIndex = i;\n }\n }\n\n return closestIndex;\n }\n\n private _clampChildPosition(position: number): number {\n const containerSize = this._isHorizontal ? this.clientWidth : this.clientHeight;\n const child = this._getChild();\n const childSize = child\n ? (this._isHorizontal ? child.offsetWidth : child.offsetHeight)\n : 0;\n\n const maxPosition = containerSize - childSize;\n return Math.max(0, Math.min(position, maxPosition));\n }\n\n private _updateChildPosition(index: number): void {\n const snapPositions = this._computeSnapPositions();\n if (snapPositions.length === 0)\n return;\n\n const clampedIndex = Math.max(0, Math.min(index, snapPositions.length - 1));\n const position = snapPositions[clampedIndex];\n\n const child = this._getChild();\n if (!child)\n return;\n\n if (this._isHorizontal) {\n const clampedPosition = this._clampChildPosition(position);\n child.style.left = `${clampedPosition}px`;\n child.style.top = `0px`;\n } else {\n const clampedPosition = this._clampChildPosition(position);\n child.style.top = `${clampedPosition}px`;\n child.style.left = `0px`;\n }\n child.style.setProperty(`--snap-index`, String(clampedIndex));\n }\n\n private _onPointerDown = (e: PointerEvent): void => {\n const child = this._getChild();\n if (!child)\n return;\n\n const containerRect = this.getBoundingClientRect();\n const newIndex = this._getSnapIndex(\n this._isHorizontal ? e.clientX : e.clientY,\n containerRect,\n );\n\n if (child.contains(e.target as Node)) {\n e.preventDefault();\n e.stopPropagation();\n this._dragging = true;\n this._thresholdReached = false;\n this._dragStart = this._isHorizontal ? e.clientX : e.clientY;\n this._currentDragIndex = newIndex;\n child.classList.add(`dragging`);\n\n document.addEventListener(`pointermove`, this._onPointerMove);\n document.addEventListener(`pointerup`, this._onPointerUp);\n } else {\n let targetIndex: number;\n\n if (this.clickSnap === `step`) {\n targetIndex = this.snap;\n const childRect = child.getBoundingClientRect();\n const childCenter = this._isHorizontal\n ? childRect.left + childRect.width / 2\n : childRect.top + childRect.height / 2;\n const clickPos = this._isHorizontal ? e.clientX : e.clientY;\n\n if (clickPos > childCenter) {\n targetIndex = Math.min(this.snapPositions - 1, this.snap + 1);\n } else if (clickPos < childCenter) {\n targetIndex = Math.max(0, this.snap - 1);\n }\n } else {\n targetIndex = newIndex;\n }\n\n if (targetIndex !== this.snap) {\n const previousSnap = this.snap;\n this.snap = targetIndex;\n this._updateChildPosition(this.snap);\n\n this.dispatchEvent(new CustomEvent<SnapChangeDetail>(`snap-change`, {\n detail: { previousSnap, newSnap: this.snap },\n bubbles: true,\n composed: true,\n }));\n } else {\n this._updateChildPosition(this.snap);\n }\n }\n };\n\n private _onPointerMove = (e: PointerEvent): void => {\n if (!this._dragging)\n return;\n\n const currentPos = this._isHorizontal ? e.clientX : e.clientY;\n const delta = currentPos - this._dragStart;\n const containerRect = this.getBoundingClientRect();\n\n if (!this._thresholdReached && Math.abs(delta) < this._dragThreshold) {\n return;\n }\n\n this._thresholdReached = true;\n\n const newIndex = this._getSnapIndex(currentPos, containerRect);\n this._currentDragIndex = newIndex;\n this._updateChildPosition(newIndex);\n\n this.dispatchEvent(new CustomEvent<SnapInputDetail>(`snap-input`, {\n detail: { index: newIndex },\n bubbles: true,\n composed: true,\n }));\n };\n\n private _onPointerUp = (): void => {\n if (!this._dragging)\n return;\n\n this._dragging = false;\n const child = this._getChild();\n if (child)\n child.classList.remove(`dragging`);\n\n document.removeEventListener(`pointermove`, this._onPointerMove);\n document.removeEventListener(`pointerup`, this._onPointerUp);\n\n if (this._thresholdReached && this._currentDragIndex !== this.snap) {\n const previousSnap = this.snap;\n this.snap = this._currentDragIndex;\n this._updateChildPosition(this.snap);\n\n this.dispatchEvent(new CustomEvent<SnapChangeDetail>(`snap-change`, {\n detail: { previousSnap, newSnap: this.snap },\n bubbles: true,\n composed: true,\n }));\n } else {\n this._updateChildPosition(this.snap);\n }\n };\n\n private _onKeyDown = (e: KeyboardEvent): void => {\n let newSnap = this.snap;\n\n if (this._isHorizontal) {\n if (e.key === `ArrowLeft`) {\n newSnap = Math.max(0, this.snap - 1);\n } else if (e.key === `ArrowRight`) {\n newSnap = Math.min(this.snapPositions - 1, this.snap + 1);\n } else {\n return;\n }\n } else {\n if (e.key === `ArrowUp`) {\n newSnap = Math.max(0, this.snap - 1);\n } else if (e.key === `ArrowDown`) {\n newSnap = Math.min(this.snapPositions - 1, this.snap + 1);\n } else {\n return;\n }\n }\n\n e.preventDefault();\n\n if (newSnap !== this.snap) {\n const previousSnap = this.snap;\n this.snap = newSnap;\n this._updateChildPosition(this.snap);\n\n this.dispatchEvent(new CustomEvent<SnapChangeDetail>(`snap-change`, {\n detail: { previousSnap, newSnap: this.snap },\n bubbles: true,\n composed: true,\n }));\n }\n };\n\n override firstUpdated(): void {\n this._child = this.firstElementChild as HTMLElement | null;\n this._updateChildPosition(this.snap);\n }\n\n override updated(changedProperties: Map<string, unknown>): void {\n if (changedProperties.has(`snap`) && !this._dragging) {\n this._updateChildPosition(this.snap);\n }\n }\n\n override render(): ReturnType<typeof html> {\n return html`\n <div \n class=\"container\"\n @pointerdown=${this._onPointerDown}\n tabindex=\"0\"\n @keydown=${this._onKeyDown}\n >\n <slot></slot>\n </div>\n `;\n }\n}\n\nexport type SnapChangeDetail = {\n readonly previousSnap: number;\n readonly newSnap: number;\n};\n\nexport type SnapChangeEvent = CustomEvent<SnapChangeDetail>;\n\nexport type SnapInputDetail = {\n readonly index: number;\n};\n\nexport type SnapInputEvent = CustomEvent<SnapInputDetail>;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-snap-container': SnapContainer;\n }\n}\n"],"mappings":"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"}
|
package/dist/split-layout.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { LitElement } from "lit";
|
|
2
|
-
|
|
3
2
|
//#region src/split-layout/split-layout.d.ts
|
|
4
3
|
/**
|
|
5
4
|
* Lays out two elements within a container, with a bar to resize them
|
|
@@ -55,7 +54,7 @@ declare global {
|
|
|
55
54
|
interface HTMLElementTagNameMap {
|
|
56
55
|
"ixfx-split-layout": SplitLayoutElement;
|
|
57
56
|
}
|
|
58
|
-
}
|
|
57
|
+
}
|
|
59
58
|
//#endregion
|
|
60
59
|
export { SplitLayoutElement };
|
|
61
60
|
//# sourceMappingURL=split-layout.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"split-layout.d.ts","names":[],"sources":["../src/split-layout/split-layout.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"split-layout.d.ts","names":[],"sources":["../src/split-layout/split-layout.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAmCa,2BAA2B;;EAEtC;EAGA;EAGA;EAGA;EAGA;EAGA;EAGA;EAGA;EAGA;EAGA;EAGA;EAGA;UAGQ;cAEI;EAuBZ;EAKA;EAIA,QAAQ,mBAAmB;EAgP3B,WAAW;EAsRX,wBAAM;SAyCC,sBAAM;;QA8IP;YACI;IACR,qBAAqB"}
|
package/dist/split-layout.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as themeFallbacks } from "./fallbacks-DEE1nCTt.js";
|
|
2
|
-
import { n as safeCustomElement, t as __decorate } from "./decorate-
|
|
2
|
+
import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
|
|
3
3
|
import { LitElement, css, html } from "lit";
|
|
4
4
|
import { property, state } from "lit/decorators.js";
|
|
5
5
|
import { clamp } from "@ixfx/numbers";
|
|
@@ -49,7 +49,8 @@ let SplitLayoutElement = class SplitLayoutElement extends LitElement {
|
|
|
49
49
|
if (!bounds) return;
|
|
50
50
|
const threshold = 5;
|
|
51
51
|
if (this.layout === `horizontal`) {
|
|
52
|
-
const
|
|
52
|
+
const y = event.y - bounds.y;
|
|
53
|
+
const relativeY = clamp(y / bounds.height);
|
|
53
54
|
if (this.collapsible && this.collapsedA) {
|
|
54
55
|
if (relativeY > (this.#collapsedAPointerAtCollapse ?? .05) + this.#hysteresisThreshold) {
|
|
55
56
|
this.collapsedA = false;
|
|
@@ -87,7 +88,8 @@ let SplitLayoutElement = class SplitLayoutElement extends LitElement {
|
|
|
87
88
|
this.#collapsedBPointerAtCollapse = relativeY;
|
|
88
89
|
}
|
|
89
90
|
} else {
|
|
90
|
-
const
|
|
91
|
+
const x = event.x - bounds.x;
|
|
92
|
+
const relativeX = clamp(x / bounds.width);
|
|
91
93
|
if (this.collapsible && this.collapsedA) {
|
|
92
94
|
if (relativeX > (this.#collapsedAPointerAtCollapse ?? .05) + this.#hysteresisThreshold) {
|
|
93
95
|
this.collapsedA = false;
|