@expressivecss/expressive 0.12.0 → 0.14.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/CHANGELOG.md +339 -1
- package/README.md +38 -1
- package/dist/css/expressive.css +5342 -105
- package/dist/css/expressive.css.map +1 -1
- package/dist/css/expressive.min.css +1 -1
- package/dist/css/expressive.min.css.map +1 -1
- package/dist/fonts/material-symbols-outlined.woff2 +0 -0
- package/dist/fonts/material-symbols-rounded.woff2 +0 -0
- package/dist/fonts/material-symbols-sharp.woff2 +0 -0
- package/dist/js/chunks/chunk-3DHK5CZU.mjs +105 -0
- package/dist/js/chunks/chunk-3DHK5CZU.mjs.map +7 -0
- package/dist/js/chunks/{chunk-HB6IW7QQ.mjs → chunk-3GVFZ4XO.mjs} +3 -3
- package/dist/js/chunks/{chunk-HLDXZ7XB.mjs → chunk-4HZMB7LI.mjs} +22 -8
- package/dist/js/chunks/chunk-4HZMB7LI.mjs.map +7 -0
- package/dist/js/chunks/chunk-4KMNFIFZ.mjs +270 -0
- package/dist/js/chunks/chunk-4KMNFIFZ.mjs.map +7 -0
- package/dist/js/chunks/chunk-4TKTLGEM.mjs +262 -0
- package/dist/js/chunks/chunk-4TKTLGEM.mjs.map +7 -0
- package/dist/js/chunks/{chunk-3VOK6J7U.mjs → chunk-5BKHWHYY.mjs} +13 -6
- package/dist/js/chunks/chunk-5BKHWHYY.mjs.map +7 -0
- package/dist/js/chunks/{chunk-H2WA4XHH.mjs → chunk-5HQSGDZ5.mjs} +16 -7
- package/dist/js/chunks/chunk-5HQSGDZ5.mjs.map +7 -0
- package/dist/js/chunks/{chunk-LWBQIX5J.mjs → chunk-A7ALMYUR.mjs} +41 -44
- package/dist/js/chunks/chunk-A7ALMYUR.mjs.map +7 -0
- package/dist/js/chunks/chunk-BG6ZRB5H.mjs +154 -0
- package/dist/js/chunks/chunk-BG6ZRB5H.mjs.map +7 -0
- package/dist/js/chunks/{chunk-DLWYKFEI.mjs → chunk-CUQPB25U.mjs} +3 -3
- package/dist/js/chunks/{chunk-6WLSDZ4O.mjs → chunk-DAIU5SLG.mjs} +2 -2
- package/dist/js/chunks/chunk-FS7XY3HT.mjs +124 -0
- package/dist/js/chunks/chunk-FS7XY3HT.mjs.map +7 -0
- package/dist/js/chunks/{chunk-WJXDBPXQ.mjs → chunk-GIW4K4SE.mjs} +8 -12
- package/dist/js/chunks/chunk-GIW4K4SE.mjs.map +7 -0
- package/dist/js/chunks/chunk-GUB3TNO2.mjs +164 -0
- package/dist/js/chunks/chunk-GUB3TNO2.mjs.map +7 -0
- package/dist/js/chunks/chunk-GVGT6MIU.mjs +47 -0
- package/dist/js/chunks/chunk-GVGT6MIU.mjs.map +7 -0
- package/dist/js/chunks/{chunk-HNFSMIBY.mjs → chunk-GZKEFWPM.mjs} +83 -22
- package/dist/js/chunks/chunk-GZKEFWPM.mjs.map +7 -0
- package/dist/js/chunks/chunk-HKT2S7VM.mjs +48 -0
- package/dist/js/chunks/chunk-HKT2S7VM.mjs.map +7 -0
- package/dist/js/chunks/chunk-ILP3PDTL.mjs +187 -0
- package/dist/js/chunks/chunk-ILP3PDTL.mjs.map +7 -0
- package/dist/js/chunks/{chunk-YSBCHYXP.mjs → chunk-JIDMQGK6.mjs} +118 -13
- package/dist/js/chunks/chunk-JIDMQGK6.mjs.map +7 -0
- package/dist/js/chunks/chunk-KBNN3QDH.mjs +7 -0
- package/dist/js/chunks/chunk-KBNN3QDH.mjs.map +7 -0
- package/dist/js/chunks/{chunk-NNYP33NB.mjs → chunk-KHV6DZXX.mjs} +5 -4
- package/dist/js/chunks/chunk-KHV6DZXX.mjs.map +7 -0
- package/dist/js/chunks/{chunk-RFZZCYVU.mjs → chunk-KY6U46SM.mjs} +3 -3
- package/dist/js/chunks/{chunk-CKQP6P76.mjs → chunk-LRZMJZ3T.mjs} +4 -3
- package/dist/js/chunks/chunk-LRZMJZ3T.mjs.map +7 -0
- package/dist/js/chunks/{chunk-6OMRGML6.mjs → chunk-MNPROCZF.mjs} +4 -4
- package/dist/js/chunks/{chunk-6OMRGML6.mjs.map → chunk-MNPROCZF.mjs.map} +2 -2
- package/dist/js/chunks/{chunk-QV2JAWIZ.mjs → chunk-MZ6Z24BX.mjs} +3 -2
- package/dist/js/chunks/{chunk-QV2JAWIZ.mjs.map → chunk-MZ6Z24BX.mjs.map} +2 -2
- package/dist/js/chunks/chunk-NS2UMNZV.mjs +292 -0
- package/dist/js/chunks/chunk-NS2UMNZV.mjs.map +7 -0
- package/dist/js/chunks/chunk-O5XPWXIQ.mjs +406 -0
- package/dist/js/chunks/chunk-O5XPWXIQ.mjs.map +7 -0
- package/dist/js/chunks/{chunk-UBLRRJ7N.mjs → chunk-PM655FXL.mjs} +2 -2
- package/dist/js/chunks/{chunk-IFXVDDDH.mjs → chunk-QERLECVU.mjs} +3 -3
- package/dist/js/chunks/{chunk-GZWPXXY6.mjs → chunk-QJABDLSD.mjs} +5 -2
- package/dist/js/chunks/chunk-QJABDLSD.mjs.map +7 -0
- package/dist/js/chunks/chunk-RHRQKTTX.mjs +139 -0
- package/dist/js/chunks/chunk-RHRQKTTX.mjs.map +7 -0
- package/dist/js/chunks/{chunk-UNEMYWEW.mjs → chunk-S3XDFGSZ.mjs} +2 -2
- package/dist/js/chunks/chunk-SPETGK25.mjs +59 -0
- package/dist/js/chunks/chunk-SPETGK25.mjs.map +7 -0
- package/dist/js/chunks/chunk-TBM3FT7G.mjs +398 -0
- package/dist/js/chunks/chunk-TBM3FT7G.mjs.map +7 -0
- package/dist/js/chunks/chunk-UEXCIMJZ.mjs +214 -0
- package/dist/js/chunks/chunk-UEXCIMJZ.mjs.map +7 -0
- package/dist/js/chunks/chunk-VGZSAFTX.mjs +173 -0
- package/dist/js/chunks/chunk-VGZSAFTX.mjs.map +7 -0
- package/dist/js/chunks/{chunk-UAEAQBRC.mjs → chunk-X7OCHZVF.mjs} +2 -2
- package/dist/js/chunks/{chunk-EC63CHXU.mjs → chunk-YMSXJON6.mjs} +7 -6
- package/dist/js/chunks/chunk-YMSXJON6.mjs.map +7 -0
- package/dist/js/chunks/{chunk-QVVEWBOF.mjs → chunk-Z2NRKI7R.mjs} +2 -2
- package/dist/js/chunks/{chunk-PIJ2TAR3.mjs → chunk-ZAS25YFD.mjs} +2 -2
- package/dist/js/chunks/chunk-ZKZKNSLC.mjs +1 -0
- package/dist/js/expressive.cjs +3113 -148
- package/dist/js/expressive.cjs.map +4 -4
- package/dist/js/expressive.js +3113 -148
- package/dist/js/expressive.js.map +4 -4
- package/dist/js/expressive.min.js +11 -11
- package/dist/js/expressive.min.js.map +4 -4
- package/dist/js/expressive.mjs +95 -35
- package/dist/js/expressive.mjs.map +1 -1
- package/dist/js/internal/behaviors/bottomSheets.mjs +3 -3
- package/dist/js/internal/behaviors/dialogs.mjs +2 -2
- package/dist/js/internal/behaviors/forms.mjs +2 -2
- package/dist/js/internal/behaviors/sheetDrag.mjs +2 -2
- package/dist/js/internal/behaviors/sideSheets.mjs +3 -3
- package/dist/js/internal/components/autocomplete.mjs +3 -3
- package/dist/js/internal/components/barChart.mjs +10 -0
- package/dist/js/internal/components/barChart.mjs.map +7 -0
- package/dist/js/internal/components/buttons.mjs +2 -2
- package/dist/js/internal/components/cards.mjs +2 -2
- package/dist/js/internal/components/carousel.mjs +2 -2
- package/dist/js/internal/components/chips.mjs +4 -4
- package/dist/js/internal/components/columnChart.mjs +9 -0
- package/dist/js/internal/components/columnChart.mjs.map +7 -0
- package/dist/js/internal/components/commandPalette.mjs +9 -0
- package/dist/js/internal/components/commandPalette.mjs.map +7 -0
- package/dist/js/internal/components/confetti.mjs +8 -0
- package/dist/js/internal/components/confetti.mjs.map +7 -0
- package/dist/js/internal/components/datepicker.mjs +5 -5
- package/dist/js/internal/components/expandingCard.mjs +2 -2
- package/dist/js/internal/components/heatmapChart.mjs +9 -0
- package/dist/js/internal/components/heatmapChart.mjs.map +7 -0
- package/dist/js/internal/components/index.mjs +88 -28
- package/dist/js/internal/components/lightbox.mjs +2 -2
- package/dist/js/internal/components/lineChart.mjs +12 -0
- package/dist/js/internal/components/lineChart.mjs.map +7 -0
- package/dist/js/internal/components/mapView.mjs +9 -0
- package/dist/js/internal/components/mapView.mjs.map +7 -0
- package/dist/js/internal/components/menu.mjs +2 -2
- package/dist/js/internal/components/messageScroller.mjs +9 -0
- package/dist/js/internal/components/messageScroller.mjs.map +7 -0
- package/dist/js/internal/components/mixedChart.mjs +10 -0
- package/dist/js/internal/components/mixedChart.mjs.map +7 -0
- package/dist/js/internal/components/particles.mjs +8 -0
- package/dist/js/internal/components/particles.mjs.map +7 -0
- package/dist/js/internal/components/pieChart.mjs +9 -0
- package/dist/js/internal/components/pieChart.mjs.map +7 -0
- package/dist/js/internal/components/questionnaire.mjs +9 -0
- package/dist/js/internal/components/questionnaire.mjs.map +7 -0
- package/dist/js/internal/components/radarChart.mjs +9 -0
- package/dist/js/internal/components/radarChart.mjs.map +7 -0
- package/dist/js/internal/components/radialChart.mjs +9 -0
- package/dist/js/internal/components/radialChart.mjs.map +7 -0
- package/dist/js/internal/components/registry.mjs +35 -20
- package/dist/js/internal/components/richTextEditor.mjs +9 -0
- package/dist/js/internal/components/richTextEditor.mjs.map +7 -0
- package/dist/js/internal/components/scrollspy.mjs +1 -1
- package/dist/js/internal/components/select.mjs +3 -3
- package/dist/js/internal/components/slider.mjs +2 -2
- package/dist/js/internal/components/snackbar.mjs +2 -2
- package/dist/js/internal/components/tabs.mjs +3 -3
- package/dist/js/internal/components/timepicker.mjs +3 -3
- package/dist/js/internal/components/tooltip.mjs +2 -2
- package/dist/js/internal/core/utils.mjs +1 -1
- package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +2 -2
- package/dist/js/modular.mjs +95 -35
- package/dist/types/behaviors/forms.d.ts +27 -0
- package/dist/types/components/barChart.d.ts +24 -0
- package/dist/types/components/carousel.d.ts +2 -0
- package/dist/types/components/columnChart.d.ts +21 -0
- package/dist/types/components/commandPalette.d.ts +96 -0
- package/dist/types/components/confetti.d.ts +103 -0
- package/dist/types/components/datepicker.d.ts +2 -0
- package/dist/types/components/heatmapChart.d.ts +49 -0
- package/dist/types/components/index.d.ts +15 -0
- package/dist/types/components/lineChart.d.ts +134 -0
- package/dist/types/components/mapView.d.ts +151 -0
- package/dist/types/components/menu.d.ts +31 -0
- package/dist/types/components/messageScroller.d.ts +111 -0
- package/dist/types/components/mixedChart.d.ts +25 -0
- package/dist/types/components/particles.d.ts +72 -0
- package/dist/types/components/pieChart.d.ts +43 -0
- package/dist/types/components/questionnaire.d.ts +96 -0
- package/dist/types/components/radarChart.d.ts +39 -0
- package/dist/types/components/radialChart.d.ts +45 -0
- package/dist/types/components/registry.d.ts +52 -0
- package/dist/types/components/richTextEditor.d.ts +71 -0
- package/dist/types/components/slider.d.ts +1 -1
- package/dist/types/components/snackbar.d.ts +2 -0
- package/dist/types/components/tabs.d.ts +1 -1
- package/dist/types/modular.d.ts +10 -1
- package/dist/types/plugins/dockedDisplayPlugin.d.ts +3 -3
- package/package.json +5 -1
- package/src/sass/README.md +3 -6
- package/src/sass/abstracts/_index.scss +1 -1
- package/src/sass/abstracts/_mixins.scss +226 -0
- package/src/sass/abstracts/_variables.scss +14 -0
- package/src/sass/base/_typography.scss +45 -0
- package/src/sass/components/_accordion.scss +161 -0
- package/src/sass/components/_aura.scss +119 -0
- package/src/sass/components/_avatar.scss +86 -0
- package/src/sass/components/_bar-chart.scss +285 -0
- package/src/sass/components/_bottom-sheet.scss +1 -0
- package/src/sass/components/_button-groups.scss +13 -3
- package/src/sass/components/_buttons.scss +1 -1
- package/src/sass/components/_cards.scss +16 -13
- package/src/sass/components/_column-chart.scss +134 -0
- package/src/sass/components/_command-palette.scss +140 -0
- package/src/sass/components/_confetti.scss +14 -0
- package/src/sass/components/_countdown.scss +89 -0
- package/src/sass/components/_data-table.scss +188 -0
- package/src/sass/components/_dialog.scss +1 -0
- package/src/sass/components/_empty-state.scss +78 -0
- package/src/sass/components/_expanding-card.scss +3 -0
- package/src/sass/components/_heatmap-chart.scss +156 -0
- package/src/sass/components/_index.scss +30 -0
- package/src/sass/components/_kpi.scss +162 -0
- package/src/sass/components/_line-chart.scss +102 -0
- package/src/sass/components/_map.scss +188 -0
- package/src/sass/components/_marquee.scss +111 -0
- package/src/sass/components/_menu.scss +10 -0
- package/src/sass/components/_message-scroller.scss +66 -0
- package/src/sass/components/_message.scss +202 -0
- package/src/sass/components/_mixed-chart.scss +157 -0
- package/src/sass/components/_navigation-bar.scss +1 -0
- package/src/sass/components/_navigation-rail.scss +9 -0
- package/src/sass/components/_particles.scss +14 -0
- package/src/sass/components/_pie-chart.scss +203 -0
- package/src/sass/components/_popover.scss +112 -0
- package/src/sass/components/_questionnaire.scss +144 -0
- package/src/sass/components/_radar-chart.scss +205 -0
- package/src/sass/components/_radial-chart.scss +174 -0
- package/src/sass/components/_rich-text-editor.scss +99 -0
- package/src/sass/components/_search.scss +1 -0
- package/src/sass/components/_side-sheet.scss +1 -0
- package/src/sass/components/_skeleton.scss +81 -0
- package/src/sass/components/_snackbar.scss +1 -0
- package/src/sass/components/_stat.scss +86 -0
- package/src/sass/components/_stepper.scss +190 -0
- package/src/sass/components/_table_of_contents.scss +3 -1
- package/src/sass/components/_timeline.scss +114 -0
- package/src/sass/components/_toolbar.scss +1 -0
- package/src/sass/components/_tooltip.scss +2 -0
- package/src/sass/components/_tree.scss +139 -0
- package/src/sass/components/forms/_checkboxes.scss +7 -2
- package/src/sass/components/forms/_drop-zone.scss +128 -0
- package/src/sass/components/forms/_index.scss +2 -0
- package/src/sass/components/forms/_input-fields.scss +133 -2
- package/src/sass/components/forms/_rating.scss +165 -0
- package/src/sass/tokens/_reference.scss +3 -15
- package/src/sass/utilities/_index.scss +2 -0
- package/src/sass/utilities/_scroll-area.scss +35 -0
- package/src/sass/utilities/_shapes.scss +164 -0
- package/dist/js/chunks/chunk-3VOK6J7U.mjs.map +0 -7
- package/dist/js/chunks/chunk-CKQP6P76.mjs.map +0 -7
- package/dist/js/chunks/chunk-EC63CHXU.mjs.map +0 -7
- package/dist/js/chunks/chunk-G3I5H2U3.mjs +0 -7
- package/dist/js/chunks/chunk-G3I5H2U3.mjs.map +0 -7
- package/dist/js/chunks/chunk-GZWPXXY6.mjs.map +0 -7
- package/dist/js/chunks/chunk-H2WA4XHH.mjs.map +0 -7
- package/dist/js/chunks/chunk-HLDXZ7XB.mjs.map +0 -7
- package/dist/js/chunks/chunk-HNFSMIBY.mjs.map +0 -7
- package/dist/js/chunks/chunk-LWBQIX5J.mjs.map +0 -7
- package/dist/js/chunks/chunk-NNYP33NB.mjs.map +0 -7
- package/dist/js/chunks/chunk-PSSHQWCX.mjs +0 -100
- package/dist/js/chunks/chunk-PSSHQWCX.mjs.map +0 -7
- package/dist/js/chunks/chunk-WJXDBPXQ.mjs.map +0 -7
- package/dist/js/chunks/chunk-WWPAPHMA.mjs +0 -1
- package/dist/js/chunks/chunk-YSBCHYXP.mjs.map +0 -7
- /package/dist/js/chunks/{chunk-HB6IW7QQ.mjs.map → chunk-3GVFZ4XO.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-DLWYKFEI.mjs.map → chunk-CUQPB25U.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-6WLSDZ4O.mjs.map → chunk-DAIU5SLG.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-RFZZCYVU.mjs.map → chunk-KY6U46SM.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-UBLRRJ7N.mjs.map → chunk-PM655FXL.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-IFXVDDDH.mjs.map → chunk-QERLECVU.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-UNEMYWEW.mjs.map → chunk-S3XDFGSZ.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-UAEAQBRC.mjs.map → chunk-X7OCHZVF.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-QVVEWBOF.mjs.map → chunk-Z2NRKI7R.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-PIJ2TAR3.mjs.map → chunk-ZAS25YFD.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-WWPAPHMA.mjs.map → chunk-ZKZKNSLC.mjs.map} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Utils
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-MNPROCZF.mjs";
|
|
4
4
|
import {
|
|
5
5
|
Component
|
|
6
6
|
} from "./chunk-LTWPGFBR.mjs";
|
|
@@ -16,6 +16,7 @@ var _defaults = {
|
|
|
16
16
|
coverTrigger: false,
|
|
17
17
|
closeOnClick: true,
|
|
18
18
|
hover: false,
|
|
19
|
+
contextMenu: false,
|
|
19
20
|
inDuration: 150,
|
|
20
21
|
outDuration: 250,
|
|
21
22
|
onOpenStart: null,
|
|
@@ -31,6 +32,40 @@ var _Menu = class _Menu extends Component {
|
|
|
31
32
|
this._pendingTimers = /* @__PURE__ */ new Set();
|
|
32
33
|
this._transition = 0;
|
|
33
34
|
this._menuClickTargets = /* @__PURE__ */ new WeakMap();
|
|
35
|
+
/**
|
|
36
|
+
* Viewport point the open context menu belongs to. Null outside a
|
|
37
|
+
* right-click, so a keyboard or programmatic open uses the region's corner
|
|
38
|
+
* rather than an old pointer position.
|
|
39
|
+
*/
|
|
40
|
+
this._contextPoint = null;
|
|
41
|
+
/** What had focus when a context menu opened; focus goes back there. */
|
|
42
|
+
this._contextReturn = null;
|
|
43
|
+
this._handleContextMenu = (e) => {
|
|
44
|
+
if (e.defaultPrevented) {
|
|
45
|
+
this.close();
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const path = e.composedPath();
|
|
49
|
+
if (_Menu._menus.some((menu) => menu !== this && menu.isOpen && path.includes(menu.menuEl))) return;
|
|
50
|
+
e.preventDefault();
|
|
51
|
+
if (!this.isOpen) {
|
|
52
|
+
const root = this.el.getRootNode();
|
|
53
|
+
this._contextReturn = root.activeElement instanceof HTMLElement ? root.activeElement : null;
|
|
54
|
+
}
|
|
55
|
+
const rect = this.el.getBoundingClientRect();
|
|
56
|
+
const fromPointer = (e.clientX !== 0 || e.clientY !== 0) && e.clientX >= rect.left && e.clientX <= rect.right && e.clientY >= rect.top && e.clientY <= rect.bottom;
|
|
57
|
+
this._contextPoint = fromPointer ? { x: e.clientX, y: e.clientY } : null;
|
|
58
|
+
if (this.isOpen) this.recalculateDimensions();
|
|
59
|
+
else this.open();
|
|
60
|
+
};
|
|
61
|
+
this._handleDocumentContextMenu = (e) => {
|
|
62
|
+
const path = e.composedPath();
|
|
63
|
+
if (path.includes(this.menuEl)) {
|
|
64
|
+
e.preventDefault();
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (!path.includes(this.el)) this.close();
|
|
68
|
+
};
|
|
34
69
|
this._handleClick = (e) => {
|
|
35
70
|
e.preventDefault();
|
|
36
71
|
if (this.isOpen) {
|
|
@@ -77,6 +112,7 @@ var _Menu = class _Menu extends Component {
|
|
|
77
112
|
this.isTouchMoving = false;
|
|
78
113
|
};
|
|
79
114
|
this._handleTriggerKeydown = (e) => {
|
|
115
|
+
if (this.options.contextMenu) return;
|
|
80
116
|
const opensMenu = e.key === SPACE || e.key === Utils.keys.ENTER || e.key === Utils.keys.ARROW_DOWN || e.key === Utils.keys.ARROW_UP;
|
|
81
117
|
if (opensMenu && !this.isOpen) {
|
|
82
118
|
e.preventDefault();
|
|
@@ -235,7 +271,7 @@ var _Menu = class _Menu extends Component {
|
|
|
235
271
|
this._placeMenu();
|
|
236
272
|
this._schedule(() => this._setupTemporaryEventHandlers(), 0);
|
|
237
273
|
this._animateIn();
|
|
238
|
-
this.
|
|
274
|
+
this._setExpanded(true);
|
|
239
275
|
};
|
|
240
276
|
/**
|
|
241
277
|
* Close menu.
|
|
@@ -257,10 +293,13 @@ var _Menu = class _Menu extends Component {
|
|
|
257
293
|
if (transition !== this._transition) return;
|
|
258
294
|
this._animateOut();
|
|
259
295
|
this._removeTemporaryEventHandlers();
|
|
260
|
-
this.
|
|
296
|
+
this._setExpanded(false);
|
|
261
297
|
if (this.options.autoFocus && this.menuEl.contains(focused) && (root.activeElement === focused || this.el.ownerDocument.activeElement === this.el.ownerDocument.body)) {
|
|
262
|
-
this.
|
|
298
|
+
const back = this._contextReturn;
|
|
299
|
+
(back?.isConnected && back !== this.el.ownerDocument.body ? back : this.el).focus();
|
|
263
300
|
}
|
|
301
|
+
this._contextReturn = null;
|
|
302
|
+
this._contextPoint = null;
|
|
264
303
|
};
|
|
265
304
|
/**
|
|
266
305
|
* While menu is open, you can recalculate its dimensions if its contents have changed.
|
|
@@ -278,6 +317,7 @@ var _Menu = class _Menu extends Component {
|
|
|
278
317
|
this._originalInert = this.menuEl?.getAttribute("inert") ?? null;
|
|
279
318
|
this.options = {
|
|
280
319
|
..._Menu.defaults,
|
|
320
|
+
contextMenu: el.hasAttribute("data-context-menu"),
|
|
281
321
|
...options
|
|
282
322
|
};
|
|
283
323
|
this.isOpen = false;
|
|
@@ -285,10 +325,12 @@ var _Menu = class _Menu extends Component {
|
|
|
285
325
|
this.isTouchMoving = false;
|
|
286
326
|
this.focusedIndex = -1;
|
|
287
327
|
this.filterQuery = [];
|
|
288
|
-
this.
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
this.el.
|
|
328
|
+
if (!this.options.contextMenu) {
|
|
329
|
+
this.el.ariaExpanded = "false";
|
|
330
|
+
if (!this.el.hasAttribute("aria-haspopup")) this.el.setAttribute("aria-haspopup", "menu");
|
|
331
|
+
if (this.id && !this.el.hasAttribute("aria-controls"))
|
|
332
|
+
this.el.setAttribute("aria-controls", this.id);
|
|
333
|
+
}
|
|
292
334
|
this._moveMenuToElement();
|
|
293
335
|
this._setupAccessibility();
|
|
294
336
|
this._makeMenuFocusable();
|
|
@@ -312,7 +354,7 @@ var _Menu = class _Menu extends Component {
|
|
|
312
354
|
destroy() {
|
|
313
355
|
this._clearPendingTimers();
|
|
314
356
|
this.isOpen = false;
|
|
315
|
-
this.
|
|
357
|
+
this._setExpanded(false);
|
|
316
358
|
clearTimeout(this.filterTimeout);
|
|
317
359
|
this._resetMenuStyles();
|
|
318
360
|
this._restoreInert();
|
|
@@ -328,7 +370,9 @@ var _Menu = class _Menu extends Component {
|
|
|
328
370
|
if (this.menuEl?.querySelector(":scope > li > menu")) {
|
|
329
371
|
this.menuEl.addEventListener("mouseover", this._handleSubmenuAlign);
|
|
330
372
|
}
|
|
331
|
-
if (this.options.
|
|
373
|
+
if (this.options.contextMenu) {
|
|
374
|
+
this.el.addEventListener("contextmenu", this._handleContextMenu);
|
|
375
|
+
} else if (this.options.hover) {
|
|
332
376
|
this.el.addEventListener("mouseenter", this._handleMouseEnter);
|
|
333
377
|
this.el.addEventListener("mouseleave", this._handleMouseLeave);
|
|
334
378
|
this.menuEl.addEventListener("mouseleave", this._handleMouseLeave);
|
|
@@ -340,7 +384,9 @@ var _Menu = class _Menu extends Component {
|
|
|
340
384
|
this.el.removeEventListener("keydown", this._handleTriggerKeydown);
|
|
341
385
|
this.menuEl?.removeEventListener("click", this._handleMenuClick);
|
|
342
386
|
this.menuEl?.removeEventListener("mouseover", this._handleSubmenuAlign);
|
|
343
|
-
if (this.options.
|
|
387
|
+
if (this.options.contextMenu) {
|
|
388
|
+
this.el.removeEventListener("contextmenu", this._handleContextMenu);
|
|
389
|
+
} else if (this.options.hover) {
|
|
344
390
|
this.el.removeEventListener("mouseenter", this._handleMouseEnter);
|
|
345
391
|
this.el.removeEventListener("mouseleave", this._handleMouseLeave);
|
|
346
392
|
this.menuEl?.removeEventListener("mouseleave", this._handleMouseLeave);
|
|
@@ -356,6 +402,7 @@ var _Menu = class _Menu extends Component {
|
|
|
356
402
|
});
|
|
357
403
|
this.menuEl?.addEventListener("keydown", this._handleMenuKeydown);
|
|
358
404
|
window.addEventListener("resize", this._handleWindowResize);
|
|
405
|
+
if (this.options.contextMenu) document.addEventListener("contextmenu", this._handleDocumentContextMenu);
|
|
359
406
|
}
|
|
360
407
|
_removeTemporaryEventHandlers() {
|
|
361
408
|
document.body.removeEventListener("click", this._handleDocumentClick);
|
|
@@ -363,6 +410,7 @@ var _Menu = class _Menu extends Component {
|
|
|
363
410
|
document.body.removeEventListener("touchmove", this._handleDocumentTouchmove);
|
|
364
411
|
this.menuEl?.removeEventListener("keydown", this._handleMenuKeydown);
|
|
365
412
|
window.removeEventListener("resize", this._handleWindowResize);
|
|
413
|
+
document.removeEventListener("contextmenu", this._handleDocumentContextMenu);
|
|
366
414
|
}
|
|
367
415
|
_setupAccessibility() {
|
|
368
416
|
if (!this.menuEl) return;
|
|
@@ -460,6 +508,7 @@ var _Menu = class _Menu extends Component {
|
|
|
460
508
|
item.scrollIntoView({ block: "nearest", inline: "nearest" });
|
|
461
509
|
}
|
|
462
510
|
_resetMenuStyles() {
|
|
511
|
+
if (!this.menuEl) return;
|
|
463
512
|
this.menuEl.style.display = "";
|
|
464
513
|
this._resetMenuPositioningStyles();
|
|
465
514
|
this.menuEl.style.transform = "";
|
|
@@ -652,8 +701,12 @@ var _Menu = class _Menu extends Component {
|
|
|
652
701
|
closestOverflowParent.style.position = "relative";
|
|
653
702
|
const natural = this.menuEl.getBoundingClientRect().width;
|
|
654
703
|
const triggerWidth = this.el.getBoundingClientRect().width;
|
|
655
|
-
const idealWidth = this.options.constrainWidth && triggerWidth >= MIN_SURFACE_WIDTH ? triggerWidth : Math.min(MAX_SURFACE_WIDTH, Math.max(MIN_SURFACE_WIDTH, natural));
|
|
704
|
+
const idealWidth = this.options.constrainWidth && !this.options.contextMenu && triggerWidth >= MIN_SURFACE_WIDTH ? triggerWidth : Math.min(MAX_SURFACE_WIDTH, Math.max(MIN_SURFACE_WIDTH, natural));
|
|
656
705
|
this.menuEl.style.width = idealWidth + "px";
|
|
706
|
+
if (this.options.contextMenu) {
|
|
707
|
+
this._placeMenuAtPoint(this._contextPoint ?? this._regionCorner(), closestOverflowParent);
|
|
708
|
+
return;
|
|
709
|
+
}
|
|
657
710
|
const positionInfo = this._getMenuPosition(closestOverflowParent);
|
|
658
711
|
this.menuEl.style.left = positionInfo.x + "px";
|
|
659
712
|
this.menuEl.style.top = positionInfo.y + "px";
|
|
@@ -661,6 +714,58 @@ var _Menu = class _Menu extends Component {
|
|
|
661
714
|
this.menuEl.style.width = positionInfo.width + "px";
|
|
662
715
|
this.menuEl.style.transformOrigin = `${positionInfo.horizontalAlignment === "left" ? "0" : "100%"} ${positionInfo.verticalAlignment === "top" ? "0" : "100%"}`;
|
|
663
716
|
}
|
|
717
|
+
/** Where a context menu opens without a pointer: the region's start corner. */
|
|
718
|
+
_regionCorner() {
|
|
719
|
+
const rect = this.el.getBoundingClientRect();
|
|
720
|
+
const rtl = getComputedStyle(this.el).direction === "rtl";
|
|
721
|
+
return { x: rtl ? rect.right : rect.left, y: rect.bottom };
|
|
722
|
+
}
|
|
723
|
+
/**
|
|
724
|
+
* Places a context menu with its start corner on the point, flipping to
|
|
725
|
+
* the other side of the point where it would not fit. The bounds are the
|
|
726
|
+
* viewport, narrowed to a scrolling or clipping ancestor the menu sits in;
|
|
727
|
+
* a menu taller than them gets their height and scrolls.
|
|
728
|
+
*
|
|
729
|
+
* The menu rests at left/top 0 of its containing block, so its rect is the
|
|
730
|
+
* offset to subtract - the same trick _getMenuPosition uses. It is measured
|
|
731
|
+
* without the entry animation's scale, which a second right-click can catch.
|
|
732
|
+
*/
|
|
733
|
+
_placeMenuAtPoint({ x, y }, container) {
|
|
734
|
+
const { transform, transition } = this.menuEl.style;
|
|
735
|
+
this.menuEl.style.transition = "none";
|
|
736
|
+
this.menuEl.style.transform = "none";
|
|
737
|
+
const menu = this.menuEl.getBoundingClientRect();
|
|
738
|
+
this.menuEl.style.transform = transform;
|
|
739
|
+
this.menuEl.style.transition = transition;
|
|
740
|
+
let bounds = { left: 0, top: 0, right: window.innerWidth, bottom: window.innerHeight };
|
|
741
|
+
if (container && getComputedStyle(container).overflow !== "visible") {
|
|
742
|
+
const clip = container.getBoundingClientRect();
|
|
743
|
+
bounds = {
|
|
744
|
+
left: Math.max(bounds.left, clip.left),
|
|
745
|
+
top: Math.max(bounds.top, clip.top),
|
|
746
|
+
right: Math.min(bounds.right, clip.right),
|
|
747
|
+
bottom: Math.min(bounds.bottom, clip.bottom)
|
|
748
|
+
};
|
|
749
|
+
}
|
|
750
|
+
const width = menu.width;
|
|
751
|
+
const height = Math.min(menu.height, bounds.bottom - bounds.top);
|
|
752
|
+
this.isScrollable = height < menu.height;
|
|
753
|
+
if (this.isScrollable) this.menuEl.style.height = height + "px";
|
|
754
|
+
const rtl = getComputedStyle(this.el).direction === "rtl";
|
|
755
|
+
const fitsRight = x + width <= bounds.right;
|
|
756
|
+
const fitsLeft = x - width >= bounds.left;
|
|
757
|
+
const leftward = rtl ? fitsLeft || !fitsRight : !fitsRight && fitsLeft;
|
|
758
|
+
const upward = y + height > bounds.bottom && y - height >= bounds.top;
|
|
759
|
+
const clamp = (value, min, max) => Math.max(min, Math.min(value, max));
|
|
760
|
+
const left = clamp(leftward ? x - width : x, bounds.left, bounds.right - width);
|
|
761
|
+
const top = clamp(upward ? y - height : y, bounds.top, bounds.bottom - height);
|
|
762
|
+
this.menuEl.style.left = left - menu.left + "px";
|
|
763
|
+
this.menuEl.style.top = top - menu.top + "px";
|
|
764
|
+
this.menuEl.style.transformOrigin = `${leftward ? "100%" : "0"} ${upward ? "100%" : "0"}`;
|
|
765
|
+
}
|
|
766
|
+
_setExpanded(expanded) {
|
|
767
|
+
if (!this.options.contextMenu) this.el.ariaExpanded = String(expanded);
|
|
768
|
+
}
|
|
664
769
|
};
|
|
665
770
|
_Menu._menus = [];
|
|
666
771
|
var Menu = _Menu;
|
|
@@ -668,4 +773,4 @@ var Menu = _Menu;
|
|
|
668
773
|
export {
|
|
669
774
|
Menu
|
|
670
775
|
};
|
|
671
|
-
//# sourceMappingURL=chunk-
|
|
776
|
+
//# sourceMappingURL=chunk-JIDMQGK6.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/components/menu.ts"],
|
|
4
|
+
"sourcesContent": ["import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, InitElement, Openable } from '../core/component';\n\nexport interface MenuOptions extends BaseOptions {\n /**\n * Defines the edge the menu is aligned to.\n * @default 'left'\n */\n alignment: 'left' | 'right';\n /**\n * If true, automatically focus menu el for keyboard.\n * @default true\n */\n autoFocus: boolean;\n /**\n * If true, constrainWidth to the size of the menu activator.\n *\n * A trigger narrower than the surface's own 112dp minimum cannot be\n * honoured, so such a menu is sized to its content instead - see\n * MIN_SURFACE_WIDTH.\n * @default true\n */\n constrainWidth: boolean;\n /**\n * Provide an element that will be the bounding container of the menu.\n * @default null\n */\n container: Element | ShadowRoot;\n /**\n * If false, the menu will show below the trigger.\n * That is the M3 placement. Pass `true` to cover the trigger.\n * @default false\n */\n coverTrigger: boolean;\n /**\n * If true, close menu on item click.\n * @default true\n */\n closeOnClick: boolean;\n /**\n * If true, the menu will open on hover.\n * @default false\n */\n hover: boolean;\n /**\n * If true, the trigger is a region and the menu is its context menu: it\n * opens at the pointer on right-click, long-press or the keyboard context\n * menu key instead of on click. `data-context-menu` on the trigger sets it.\n * @default false\n */\n contextMenu: boolean;\n /**\n * The duration of the transition enter in milliseconds.\n * @default 150\n */\n inDuration: number;\n /**\n * The duration of the transition out in milliseconds.\n * @default 250\n */\n outDuration: number;\n /**\n * Function called when menu starts entering.\n * @default null\n */\n onOpenStart: (el: HTMLElement) => void;\n /**\n * Function called when menu finishes entering.\n * @default null\n */\n onOpenEnd: (el: HTMLElement) => void;\n /**\n * Function called when menu starts exiting.\n * @default null\n */\n onCloseStart: (el: HTMLElement) => void;\n /**\n * Function called when menu finishes exiting.\n * @default null\n */\n onCloseEnd: (el: HTMLElement) => void;\n /**\n * Function called when item is clicked.\n * @default null\n */\n onItemClick: (el: HTMLLIElement) => void;\n}\n\n// The menu surface's own width bounds, stated in `components/_menu.scss` and\n// restated here because the constraint below has to reason about them.\nconst MIN_SURFACE_WIDTH = 112;\nconst MAX_SURFACE_WIDTH = 280;\n\nconst _defaults: MenuOptions = {\n alignment: 'left',\n autoFocus: true,\n constrainWidth: true,\n container: null,\n coverTrigger: false,\n closeOnClick: true,\n hover: false,\n contextMenu: false,\n inDuration: 150,\n outDuration: 250,\n onOpenStart: null,\n onOpenEnd: null,\n onCloseStart: null,\n onCloseEnd: null,\n onItemClick: null\n};\n\nconst SPACE = ' ';\n\nexport class Menu extends Component<MenuOptions> implements Openable {\n static _menus: Menu[] = [];\n /** ID of the menu element. */\n id: string;\n /** The DOM element of the menu. */\n menuEl: HTMLElement;\n /** If the menu is open. */\n isOpen: boolean;\n /** If the menu content is scrollable. */\n isScrollable: boolean;\n isTouchMoving: boolean;\n /** The index of the item focused. */\n focusedIndex: number;\n filterQuery: string[];\n filterTimeout: ReturnType<typeof setTimeout>;\n private _pendingTimers = new Set<ReturnType<typeof setTimeout>>();\n private _transition = 0;\n private _originalInert: string | null;\n private _menuClickTargets = new WeakMap<Event, HTMLElement>();\n /**\n * Viewport point the open context menu belongs to. Null outside a\n * right-click, so a keyboard or programmatic open uses the region's corner\n * rather than an old pointer position.\n */\n private _contextPoint: { x: number; y: number } | null = null;\n /** What had focus when a context menu opened; focus goes back there. */\n private _contextReturn: HTMLElement | null = null;\n\n constructor(el: HTMLElement, options: Partial<MenuOptions>) {\n super(el, options, Menu);\n this.el['Expressive_Menu'] = this;\n\n Menu._menus.push(this);\n this.id = Utils.getIdFromTrigger(el);\n this.menuEl = Utils.getElementById(el, this.id);\n this._originalInert = this.menuEl?.getAttribute('inert') ?? null;\n\n this.options = {\n ...Menu.defaults,\n contextMenu: el.hasAttribute('data-context-menu'),\n ...options\n };\n\n this.isOpen = false;\n this.isScrollable = false;\n this.isTouchMoving = false;\n this.focusedIndex = -1;\n this.filterQuery = [];\n // A context region is content, not a button: expanded, haspopup and\n // controls are not valid on it, and the menu key is how it is discovered.\n if (!this.options.contextMenu) {\n this.el.ariaExpanded = 'false';\n if (!this.el.hasAttribute('aria-haspopup')) this.el.setAttribute('aria-haspopup', 'menu');\n if (this.id && !this.el.hasAttribute('aria-controls'))\n this.el.setAttribute('aria-controls', this.id);\n }\n\n // Keep the menu next to the trigger so positioning stays local.\n this._moveMenuToElement();\n this._setupAccessibility();\n this._makeMenuFocusable();\n this._setupSubmenus();\n this._setupEventHandlers();\n }\n\n static get defaults(): MenuOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Menu.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<MenuOptions>): Menu;\n /**\n * Initializes instances of Menu.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<InitElement>, options?: Partial<MenuOptions>): Menu[];\n /**\n * Initializes instances of Menu.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<MenuOptions> = {}\n ): Menu | Menu[] {\n return super.init(els, options, Menu);\n }\n\n static getInstance(el: HTMLElement): Menu {\n return el['Expressive_Menu'];\n }\n\n destroy() {\n this._clearPendingTimers();\n this.isOpen = false;\n this._setExpanded(false);\n clearTimeout(this.filterTimeout);\n this._resetMenuStyles();\n this._restoreInert();\n this._removeEventHandlers();\n // Temporary handlers only exist while open, but removing them is a no-op\n // otherwise and leaving them attached leaks the instance.\n this._removeTemporaryEventHandlers();\n const index = Menu._menus.indexOf(this);\n if (index >= 0) Menu._menus.splice(index, 1);\n this.el['Expressive_Menu'] = undefined;\n }\n\n _setupEventHandlers() {\n // Trigger keydown handler\n this.el.addEventListener('keydown', this._handleTriggerKeydown);\n // Item click handler\n this.menuEl?.addEventListener('click', this._handleMenuClick);\n if (this.menuEl?.querySelector(':scope > li > menu')) {\n this.menuEl.addEventListener('mouseover', this._handleSubmenuAlign);\n }\n if (this.options.contextMenu) {\n this.el.addEventListener('contextmenu', this._handleContextMenu);\n } else if (this.options.hover) {\n // Hover event handlers\n this.el.addEventListener('mouseenter', this._handleMouseEnter);\n this.el.addEventListener('mouseleave', this._handleMouseLeave);\n this.menuEl.addEventListener('mouseleave', this._handleMouseLeave);\n // Click event handlers\n } else {\n this.el.addEventListener('click', this._handleClick);\n }\n }\n\n _removeEventHandlers() {\n // `menuEl` is optional-chained on the way in (the trigger may point at\n // an id that does not resolve); it has to be here too, or destroy() throws\n // before it can detach anything else.\n this.el.removeEventListener('keydown', this._handleTriggerKeydown);\n this.menuEl?.removeEventListener('click', this._handleMenuClick);\n this.menuEl?.removeEventListener('mouseover', this._handleSubmenuAlign);\n if (this.options.contextMenu) {\n this.el.removeEventListener('contextmenu', this._handleContextMenu);\n } else if (this.options.hover) {\n this.el.removeEventListener('mouseenter', this._handleMouseEnter);\n this.el.removeEventListener('mouseleave', this._handleMouseLeave);\n this.menuEl?.removeEventListener('mouseleave', this._handleMouseLeave);\n } else {\n this.el.removeEventListener('click', this._handleClick);\n }\n }\n\n _setupTemporaryEventHandlers() {\n document.body.addEventListener('click', this._handleDocumentClick);\n this.menuEl?.addEventListener('touchmove', this._handleDocumentTouchmove, { passive: true });\n document.body.addEventListener('touchmove', this._handleDocumentTouchmove, {\n passive: true\n });\n this.menuEl?.addEventListener('keydown', this._handleMenuKeydown);\n window.addEventListener('resize', this._handleWindowResize);\n // A right-click elsewhere fires no click, so it would leave the menu open.\n if (this.options.contextMenu) document.addEventListener('contextmenu', this._handleDocumentContextMenu);\n }\n\n _removeTemporaryEventHandlers() {\n document.body.removeEventListener('click', this._handleDocumentClick);\n this.menuEl?.removeEventListener('touchmove', this._handleDocumentTouchmove);\n document.body.removeEventListener('touchmove', this._handleDocumentTouchmove);\n this.menuEl?.removeEventListener('keydown', this._handleMenuKeydown);\n window.removeEventListener('resize', this._handleWindowResize);\n document.removeEventListener('contextmenu', this._handleDocumentContextMenu);\n }\n\n _handleContextMenu = (e: MouseEvent) => {\n // A nested region already answered this right-click; this one closes so\n // two menus never stack.\n if (e.defaultPrevented) {\n this.close();\n return;\n }\n // A right-click on another open menu inside this region belongs to that\n // menu, which keeps itself open.\n const path = e.composedPath();\n if (Menu._menus.some((menu) => menu !== this && menu.isOpen && path.includes(menu.menuEl))) return;\n e.preventDefault();\n if (!this.isOpen) {\n const root = this.el.getRootNode() as Document | ShadowRoot;\n this._contextReturn = root.activeElement instanceof HTMLElement ? root.activeElement : null;\n }\n // The menu key and Shift+F10 fire this too, with a point that may sit\n // outside the region (0, 0 in some engines). Those leave the point unset\n // and open at the region's start corner.\n const rect = this.el.getBoundingClientRect();\n const fromPointer =\n (e.clientX !== 0 || e.clientY !== 0) &&\n e.clientX >= rect.left && e.clientX <= rect.right &&\n e.clientY >= rect.top && e.clientY <= rect.bottom;\n this._contextPoint = fromPointer ? { x: e.clientX, y: e.clientY } : null;\n if (this.isOpen) this.recalculateDimensions();\n else this.open();\n };\n\n _handleDocumentContextMenu = (e: MouseEvent) => {\n const path = e.composedPath();\n // A right-click on the menu itself keeps it open and the browser's own\n // menu shut.\n if (path.includes(this.menuEl)) {\n e.preventDefault();\n return;\n }\n if (!path.includes(this.el)) this.close();\n };\n\n _handleClick = (e: MouseEvent) => {\n e.preventDefault();\n //this._moveMenu((<HTMLElement>e.target).closest('li'));\n if (this.isOpen) {\n this.close();\n } else {\n this.open();\n }\n };\n\n _handleMouseEnter = () => {\n //this._moveMenu((<HTMLElement>e.target).closest('li'));\n this.open();\n };\n\n _handleMouseLeave = (e: MouseEvent) => {\n const toEl = e.relatedTarget as HTMLElement;\n // relatedTarget is null when the pointer leaves the window entirely.\n if (!toEl) {\n this.close();\n return;\n }\n const leaveToMenuContent = !!(this.menuEl && toEl && this.menuEl.contains(toEl));\n let leaveToActiveMenuTrigger = false;\n const closestTrigger = toEl.closest('.menu-trigger');\n if (\n closestTrigger &&\n !!closestTrigger['Expressive_Menu'] &&\n closestTrigger['Expressive_Menu'].isOpen\n ) {\n leaveToActiveMenuTrigger = true;\n }\n // Close hover menu if mouse did not leave to either active menu-trigger or menu-content\n if (!leaveToActiveMenuTrigger && !leaveToMenuContent) {\n this.close();\n }\n };\n\n _handleDocumentClick = (e: MouseEvent) => {\n const path = e.composedPath();\n const menuTarget = this._menuClickTargets.get(e);\n this._menuClickTargets.delete(e);\n const target = menuTarget ?? <HTMLElement>(path[0] || e.target);\n const inside = !!menuTarget || path.includes(this.menuEl) || this.menuEl?.contains(target);\n if (this._isSubmenuTriggerClick(target)) return;\n if (this.options.closeOnClick && inside && !this.isTouchMoving) {\n // isTouchMoving to check if scrolling on mobile.\n this.close();\n } else if (!inside) {\n // Do this one frame later so that if the element clicked also triggers _handleClick\n // For example, if a label for a select was clicked, that we don't close/open the menu\n this._schedule(() => {\n if (this.isOpen) {\n this.close();\n }\n }, 0);\n }\n this.isTouchMoving = false;\n };\n\n _handleTriggerKeydown = (e: KeyboardEvent) => {\n // A context region keeps its keys for its own content; the browser turns\n // the menu key and Shift+F10 into a contextmenu event.\n if (this.options.contextMenu) return;\n // M3: Space, Enter, Arrow Down, and Arrow Up open a closed menu.\n const opensMenu =\n e.key === SPACE ||\n e.key === Utils.keys.ENTER ||\n e.key === Utils.keys.ARROW_DOWN ||\n e.key === Utils.keys.ARROW_UP;\n if (opensMenu && !this.isOpen) {\n e.preventDefault();\n this.open();\n }\n };\n\n _handleDocumentTouchmove = (e: TouchEvent) => {\n const target = <HTMLElement>e.target;\n if (e.composedPath().includes(this.menuEl) || this.menuEl?.contains(target)) {\n this.isTouchMoving = true;\n }\n };\n\n _handleMenuClick = (e: MouseEvent) => {\n const target = <HTMLElement>e.target;\n // Closed shadow roots hide the original target from document listeners.\n this._menuClickTargets.set(e, target);\n const li = target.closest('li');\n if (li?.matches('.disabled, [aria-disabled=\"true\"]')) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n if (li && this._isSubmenuTriggerClick(target)) {\n e.preventDefault();\n e.stopPropagation();\n this._toggleSubmenu(li);\n return;\n }\n if (li && typeof this.options.onItemClick === 'function') {\n this.options.onItemClick.call(this, li);\n }\n };\n\n private _setupAccessibility() {\n if (!this.menuEl) return;\n if (!this.menuEl.hasAttribute('role')) this.menuEl.setAttribute('role', 'menu');\n\n const menus = [this.menuEl, ...this.menuEl.querySelectorAll('menu')];\n menus.forEach((menu) => {\n if (!menu.hasAttribute('role')) menu.setAttribute('role', 'menu');\n if (menu.getAttribute('role') !== 'menu') return;\n\n menu.querySelectorAll(':scope > li').forEach((li) => {\n if (li.classList.contains('divider')) {\n if (!li.hasAttribute('role')) li.setAttribute('role', 'separator');\n return;\n }\n if (li.classList.contains('gap')) {\n li.setAttribute('aria-hidden', 'true');\n return;\n }\n if (li.classList.contains('label') || li.classList.contains('optgroup')) {\n if (!li.hasAttribute('role')) li.setAttribute('role', 'presentation');\n return;\n }\n if (!li.hasAttribute('role')) li.setAttribute('role', 'menuitem');\n if (li.classList.contains('disabled') && !li.hasAttribute('aria-disabled')) {\n li.setAttribute('aria-disabled', 'true');\n }\n });\n });\n }\n\n private _isSubmenuTriggerClick(target: HTMLElement) {\n if (!this.menuEl) return false;\n const li = target.closest('li');\n if (!li || !this.menuEl.contains(li)) return false;\n const submenu = li.querySelector(':scope > menu');\n if (!submenu) return false;\n return !submenu.contains(target);\n }\n\n private _setupSubmenus() {\n this.menuEl?.querySelectorAll('li').forEach((li) => {\n if (!li.querySelector(':scope > menu')) return;\n const trigger = li.querySelector(':scope > a, :scope > button, :scope > span') ?? li;\n trigger.setAttribute('aria-haspopup', 'menu');\n trigger.setAttribute('aria-expanded', 'false');\n });\n }\n\n private _toggleSubmenu(li: HTMLElement) {\n const open = !li.classList.contains('open');\n li.parentElement?.querySelectorAll(':scope > li.open').forEach((other) => {\n if (other !== li) {\n other.classList.remove('open', 'submenu-start');\n this._syncSubmenuAria(other as HTMLElement, false);\n }\n });\n li.classList.toggle('open', open);\n if (open) this._alignSubmenu(li);\n this._syncSubmenuAria(li, open);\n }\n\n private _syncSubmenuAria(li: HTMLElement, open: boolean) {\n const trigger = li.querySelector(':scope > a, :scope > button, :scope > span') ?? li;\n trigger.setAttribute('aria-expanded', open ? 'true' : 'false');\n }\n\n private _handleSubmenuAlign = (e: MouseEvent) => {\n const target = e.target;\n if (!(target instanceof Element)) return;\n const li = target.closest('li');\n if (li?.querySelector(':scope > menu') && this.menuEl?.contains(li)) {\n this._alignSubmenu(li as HTMLElement);\n }\n };\n\n private _alignSubmenu(li: HTMLElement) {\n const menu = li.querySelector(':scope > menu') as HTMLElement | null;\n if (!menu) return;\n // Flyouts stay `display: block` (visibility/opacity hide them) so the\n // rect is readable without temporarily painting the menu.\n li.classList.remove('submenu-start');\n const rect = menu.getBoundingClientRect();\n if (rect.left < 8 || rect.right > window.innerWidth - 8) li.classList.add('submenu-start');\n }\n\n private _closeSubmenus() {\n this.menuEl?.querySelectorAll('li.open').forEach((li) => {\n li.classList.remove('open', 'submenu-start');\n this._syncSubmenuAria(li as HTMLElement, false);\n });\n }\n\n private _containingSubmenu(e: Event): HTMLElement | null {\n const target = e.target;\n if (!(target instanceof Element)) return null;\n const submenu = target.closest('li > menu');\n if (submenu instanceof HTMLElement && this.menuEl?.contains(submenu)) return submenu;\n return null;\n }\n\n private _focusedRow(e: Event): HTMLElement | null {\n const target = e.target;\n if (!(target instanceof Element)) return null;\n const li = target.closest('li');\n if (li instanceof HTMLElement && this.menuEl?.contains(li)) return li;\n return null;\n }\n\n _handleMenuKeydown = (e: KeyboardEvent) => {\n if (!this.isOpen || e.ctrlKey || e.metaKey || e.altKey || e.isComposing) return;\n const list = this._containingSubmenu(e) ?? this.menuEl;\n const rtl = getComputedStyle(list).direction === 'rtl';\n const openKey = rtl ? Utils.keys.ARROW_LEFT : Utils.keys.ARROW_RIGHT;\n const backKey = rtl ? Utils.keys.ARROW_RIGHT : Utils.keys.ARROW_LEFT;\n if ([openKey, backKey, Utils.keys.ARROW_UP, Utils.keys.ARROW_DOWN, Utils.keys.ESC, Utils.keys.TAB].includes(e.key)) {\n clearTimeout(this.filterTimeout);\n this._resetFilterQuery();\n }\n const arrowUpOrDown =\n e.key === Utils.keys.ARROW_DOWN || e.key === Utils.keys.ARROW_UP;\n if (e.key === Utils.keys.TAB) {\n e.preventDefault();\n this.close();\n } else if (e.key === openKey) {\n const li = this._focusedRow(e);\n if (li?.querySelector(':scope > menu') && !li.matches('.disabled, [aria-disabled=\"true\"]')) {\n e.preventDefault();\n li.classList.add('open');\n this._alignSubmenu(li);\n this._syncSubmenuAria(li, true);\n const first = Array.from(li.querySelector(':scope > menu').children).find(\n child => child instanceof HTMLElement && child.tabIndex !== -1\n ) as HTMLElement | undefined;\n if (first) this._focusRow(first);\n }\n } else if (e.key === backKey) {\n const submenu = this._containingSubmenu(e);\n if (submenu) {\n e.preventDefault();\n const parentLi = submenu.parentElement as HTMLElement;\n parentLi.classList.remove('open', 'submenu-start');\n this._syncSubmenuAria(parentLi, false);\n this._focusRow(parentLi);\n }\n }\n // Navigate down menu list\n else if (arrowUpOrDown && this.isOpen) {\n e.preventDefault();\n const direction = e.key === Utils.keys.ARROW_DOWN ? 1 : -1;\n const row = this._focusedRow(e);\n let newFocusedIndex = row ? Array.from(list.children).indexOf(row) : this.focusedIndex;\n let hasFoundNewIndex = false;\n do {\n newFocusedIndex = newFocusedIndex + direction;\n if (\n !!list.children[newFocusedIndex] &&\n (<HTMLLIElement>list.children[newFocusedIndex]).tabIndex !== -1\n ) {\n hasFoundNewIndex = true;\n break;\n }\n } while (newFocusedIndex < list.children.length && newFocusedIndex >= 0);\n\n if (hasFoundNewIndex) {\n if (this.focusedIndex >= 0) list.children[this.focusedIndex]?.classList.remove('active');\n const item = list.children[newFocusedIndex] as HTMLElement;\n item.classList.add('active');\n this._focusRow(item);\n }\n }\n // SPACE OR ENTER selects the focused item.\n else if ((e.key === Utils.keys.ENTER || e.key === SPACE) && this.isOpen) {\n const li = this._focusedRow(e);\n e.preventDefault();\n if (li?.matches('.disabled, [aria-disabled=\"true\"]')) return;\n if (li?.querySelector(':scope > menu')) {\n this._toggleSubmenu(li);\n return;\n }\n const focusedElement = li ?? this.menuEl.children[this.focusedIndex];\n const activatableElement = <HTMLElement>focusedElement?.querySelector(':scope > a, :scope > button');\n if (!!activatableElement) {\n activatableElement.click();\n } else if (focusedElement instanceof HTMLElement) {\n focusedElement.click();\n }\n }\n // Close menu on ESC\n else if (e.key === Utils.keys.ESC && this.isOpen) {\n e.preventDefault();\n const openSub = this._containingSubmenu(e)?.parentElement ??\n Array.from(this.menuEl.querySelectorAll('li.open')).reverse()[0];\n if (openSub) {\n openSub.classList.remove('open', 'submenu-start');\n this._syncSubmenuAria(openSub as HTMLElement, false);\n this._focusRow(openSub as HTMLElement);\n } else {\n this.close();\n }\n }\n\n const keyText = e.key.toLowerCase();\n if (e.key.length === 1 && e.key !== SPACE && !e.ctrlKey && !e.metaKey && !e.altKey && !e.isComposing) {\n this.filterQuery.push(keyText);\n const string = this.filterQuery.join('');\n // textContent rather than innerText: this scans every item on every\n // keystroke, and innerText forces a layout flush per item.\n const newOptionEl = Array.from(list.querySelectorAll(':scope > li')).find(\n (el) => (el as HTMLElement).tabIndex !== -1 &&\n !el.matches('.disabled, [aria-disabled=\"true\"]') &&\n Array.from(el.childNodes).filter(node => !(node instanceof Element && node.matches('menu')))\n .map(node => node.textContent).join('').trim().toLowerCase().startsWith(string)\n );\n if (newOptionEl) {\n this._focusRow(newOptionEl as HTMLElement);\n }\n // Re-arm rather than stack: without the clear, every keystroke left a live\n // timer behind and the query could reset while the user was still typing.\n clearTimeout(this.filterTimeout);\n this.filterTimeout = setTimeout(this._resetFilterQuery, 1000);\n }\n };\n\n _handleWindowResize = () => {\n // Only re-place the menu if it's still visible\n // Accounts for elements hiding via media queries\n if (this.el.offsetParent) {\n this.recalculateDimensions();\n }\n };\n\n _resetFilterQuery = () => {\n this.filterQuery = [];\n };\n\n private _restoreInert() {\n if (this._originalInert === null) this.menuEl?.removeAttribute('inert');\n else this.menuEl?.setAttribute('inert', this._originalInert);\n }\n\n private _focusRow(item: HTMLElement) {\n this.focusedIndex = Array.from(item.parentElement.children).indexOf(item);\n item.focus({ preventScroll: true });\n item.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n }\n\n _resetMenuStyles() {\n // destroy() runs this even when the menu target was never found.\n if (!this.menuEl) return;\n this.menuEl.style.display = '';\n this._resetMenuPositioningStyles();\n this.menuEl.style.transform = '';\n this.menuEl.style.opacity = '';\n }\n\n _resetMenuPositioningStyles() {\n this.menuEl.style.width = '';\n this.menuEl.style.height = '';\n this.menuEl.style.left = '';\n this.menuEl.style.top = '';\n this.menuEl.style.transformOrigin = '';\n }\n\n _moveMenuToElement(containerEl: HTMLElement = null) {\n if (this.options.container) {\n this.options.container.append(this.menuEl);\n return;\n }\n if (containerEl) {\n if (!containerEl.contains(this.menuEl)) containerEl.append(this.menuEl);\n return;\n }\n this.el.after(this.menuEl);\n }\n\n _makeMenuFocusable() {\n if (!this.menuEl) return;\n this.menuEl.popover = '';\n // Focus moves directly to menu items; the surface itself is not a stop.\n this.menuEl.tabIndex = -1;\n // Only set tabindex if it hasn't been set by user\n this.menuEl.querySelectorAll(':scope li, :scope > hr').forEach((el) => {\n if (\n el instanceof HTMLHRElement ||\n el.classList.contains('divider') ||\n el.classList.contains('gap') ||\n el.classList.contains('label') ||\n el.classList.contains('optgroup')\n ) {\n el.setAttribute('tabindex', '-1');\n return;\n }\n if (!el.getAttribute('tabindex')) el.setAttribute('tabindex', '0');\n });\n }\n\n private _focusInitialItem() {\n if (!this.menuEl || !this.options.autoFocus) return;\n const first = Array.from(this.menuEl.children).find(\n (child) => child instanceof HTMLElement && child.tabIndex !== -1\n ) as HTMLElement | undefined;\n if (!first) return;\n this.focusedIndex = Array.from(this.menuEl.children).indexOf(first);\n first.focus({ preventScroll: true });\n }\n\n _focusFocusedItem() {\n if (\n this.focusedIndex >= 0 &&\n this.focusedIndex < this.menuEl.children.length &&\n this.options.autoFocus\n ) {\n (this.menuEl.children[this.focusedIndex] as HTMLElement).focus({\n preventScroll: true\n });\n this.menuEl.children[this.focusedIndex].scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'nearest'\n });\n }\n }\n\n _getMenuPosition(closestOverflowParent: HTMLElement) {\n const triggerBRect = this.el.getBoundingClientRect();\n const menuBRect = this.menuEl.getBoundingClientRect();\n\n let idealHeight = menuBRect.height;\n let idealWidth = menuBRect.width;\n let idealXPos = triggerBRect.left - menuBRect.left;\n let idealYPos = triggerBRect.top - menuBRect.top;\n\n const menuBounds = {\n left: idealXPos,\n top: idealYPos,\n height: idealHeight,\n width: idealWidth\n };\n\n const alignments = Utils.checkPossibleAlignments(\n this.el,\n closestOverflowParent,\n menuBounds,\n this.options.coverTrigger ? 0 : triggerBRect.height\n );\n\n let verticalAlignment = 'top';\n let horizontalAlignment = this.options.alignment;\n idealYPos += this.options.coverTrigger ? 0 : triggerBRect.height;\n\n // Reset isScrollable\n this.isScrollable = false;\n\n if (!alignments.top) {\n if (alignments.bottom) {\n verticalAlignment = 'bottom';\n\n if (!this.options.coverTrigger) {\n idealYPos -= triggerBRect.height;\n }\n } else {\n this.isScrollable = true;\n\n // Determine which side has most space and cutoff at correct height\n idealHeight -= 20; // Add padding when cutoff\n if (alignments.spaceOnTop > alignments.spaceOnBottom) {\n verticalAlignment = 'bottom';\n idealHeight += alignments.spaceOnTop;\n idealYPos -= this.options.coverTrigger\n ? alignments.spaceOnTop - 20\n : alignments.spaceOnTop - 20 + triggerBRect.height;\n } else {\n idealHeight += alignments.spaceOnBottom;\n }\n }\n }\n\n // If preferred horizontal alignment is possible\n if (!alignments[horizontalAlignment]) {\n const oppositeAlignment = horizontalAlignment === 'left' ? 'right' : 'left';\n if (alignments[oppositeAlignment]) {\n horizontalAlignment = oppositeAlignment;\n } else {\n // Determine which side has most space and cutoff at correct height\n if (alignments.spaceOnLeft > alignments.spaceOnRight) {\n horizontalAlignment = 'right';\n idealWidth += alignments.spaceOnLeft;\n idealXPos -= alignments.spaceOnLeft;\n } else {\n horizontalAlignment = 'left';\n idealWidth += alignments.spaceOnRight;\n }\n }\n }\n\n if (verticalAlignment === 'bottom') {\n idealYPos =\n idealYPos - menuBRect.height + (this.options.coverTrigger ? triggerBRect.height : 0);\n }\n if (horizontalAlignment === 'right') {\n idealXPos = idealXPos - menuBRect.width + triggerBRect.width;\n }\n return {\n x: idealXPos,\n y: idealYPos,\n verticalAlignment: verticalAlignment,\n horizontalAlignment: horizontalAlignment,\n height: idealHeight,\n width: idealWidth\n };\n }\n\n private _schedule(callback: () => void, delay: number) {\n const timer = setTimeout(() => {\n this._pendingTimers.delete(timer);\n callback();\n }, delay);\n this._pendingTimers.add(timer);\n }\n\n private _clearPendingTimers() {\n for (const timer of this._pendingTimers) clearTimeout(timer);\n this._pendingTimers.clear();\n return ++this._transition;\n }\n\n _animateIn() {\n const transition = this._transition;\n const duration = this.options.inDuration;\n this.menuEl.style.transition = 'none';\n // from\n this.menuEl.style.opacity = '0';\n this.menuEl.style.transform = 'scale(0.85)';\n this._schedule(() => {\n this.menuEl.style.transition = `opacity ${duration}ms ease, transform ${duration}ms ease`;\n this.menuEl.style.opacity = '1';\n this.menuEl.style.transform = 'scale(1)';\n }, 1);\n this._schedule(() => {\n this._focusInitialItem();\n if (transition !== this._transition) return;\n if (typeof this.options.onOpenEnd === 'function') this.options.onOpenEnd.call(this, this.el);\n }, duration);\n }\n\n _animateOut() {\n const duration = this.options.outDuration;\n // easeOutQuad (opacity) & easeOutQuint\n this.menuEl.style.transition = `opacity ${duration}ms ease, transform ${duration}ms ease`;\n // to\n this.menuEl.style.opacity = '0';\n this.menuEl.style.transform = 'scale(0.85)';\n this._schedule(() => {\n this._resetMenuStyles();\n if (typeof this.options.onCloseEnd === 'function')\n this.options.onCloseEnd.call(this, this.el);\n }, duration);\n }\n\n private _getClosestAncestor(el: HTMLElement, condition: (Function) => boolean): HTMLElement {\n let ancestor: Node = el.parentNode;\n while (ancestor !== null && ancestor !== undefined && ancestor !== document) {\n // A shadow root is not an element and getComputedStyle() rejects it, so\n // step over it to the host - the elements that actually clip the menu\n // are above that.\n if (ancestor.nodeType === Node.ELEMENT_NODE && condition(ancestor)) {\n return <HTMLElement>ancestor;\n }\n ancestor = ancestor.parentNode ?? (<ShadowRoot>ancestor).host;\n }\n return null;\n }\n\n _placeMenu() {\n // Container here will be closest ancestor with overflow: hidden\n let closestOverflowParent: HTMLElement = this._getClosestAncestor(\n this.menuEl,\n (ancestor: HTMLElement) => {\n return (\n !['HTML', 'BODY'].includes(ancestor.tagName) &&\n getComputedStyle(ancestor).overflow !== 'visible'\n );\n }\n );\n // Fallback\n if (!closestOverflowParent) {\n const parent = !!this.menuEl.offsetParent ? this.menuEl.offsetParent : this.menuEl.parentNode;\n // Same hazard as the walk: the parent is a shadow root when the menu was\n // moved into one, and the next line reads its computed style.\n closestOverflowParent = <HTMLElement>((<ShadowRoot>parent).host ?? parent);\n }\n\n if (getComputedStyle(closestOverflowParent).position === 'static')\n closestOverflowParent.style.position = 'relative';\n\n //this._moveMenu(closestOverflowParent);\n\n // Set width before calculating positionInfo. Both callers reset the\n // positioning styles first, so this reads the surface's natural width.\n const natural = this.menuEl.getBoundingClientRect().width;\n // A trigger narrower than the surface's own minimum is not a constraint\n // the menu can honour: the width is written and `min-width` overrides it,\n // leaving the surface at the floor with every item inside it wrapped. So\n // constrain only to a trigger wide enough to mean something, and size by\n // content otherwise. An icon button and a split button's chevron are both\n // that case - 40dp and 48dp against a 112dp floor.\n const triggerWidth = this.el.getBoundingClientRect().width;\n const idealWidth =\n this.options.constrainWidth && !this.options.contextMenu && triggerWidth >= MIN_SURFACE_WIDTH\n ? triggerWidth\n : Math.min(MAX_SURFACE_WIDTH, Math.max(MIN_SURFACE_WIDTH, natural));\n this.menuEl.style.width = idealWidth + 'px';\n\n if (this.options.contextMenu) {\n this._placeMenuAtPoint(this._contextPoint ?? this._regionCorner(), closestOverflowParent);\n return;\n }\n\n const positionInfo = this._getMenuPosition(closestOverflowParent);\n this.menuEl.style.left = positionInfo.x + 'px';\n this.menuEl.style.top = positionInfo.y + 'px';\n this.menuEl.style.height = positionInfo.height + 'px';\n this.menuEl.style.width = positionInfo.width + 'px';\n this.menuEl.style.transformOrigin = `${\n positionInfo.horizontalAlignment === 'left' ? '0' : '100%'\n } ${positionInfo.verticalAlignment === 'top' ? '0' : '100%'}`;\n }\n\n /** Where a context menu opens without a pointer: the region's start corner. */\n private _regionCorner() {\n const rect = this.el.getBoundingClientRect();\n const rtl = getComputedStyle(this.el).direction === 'rtl';\n return { x: rtl ? rect.right : rect.left, y: rect.bottom };\n }\n\n /**\n * Places a context menu with its start corner on the point, flipping to\n * the other side of the point where it would not fit. The bounds are the\n * viewport, narrowed to a scrolling or clipping ancestor the menu sits in;\n * a menu taller than them gets their height and scrolls.\n *\n * The menu rests at left/top 0 of its containing block, so its rect is the\n * offset to subtract - the same trick _getMenuPosition uses. It is measured\n * without the entry animation's scale, which a second right-click can catch.\n */\n private _placeMenuAtPoint({ x, y }: { x: number; y: number }, container: HTMLElement) {\n // A running transition would still report the interpolated scale, so it\n // is suspended for the read; the target transform is unchanged after.\n const { transform, transition } = this.menuEl.style;\n this.menuEl.style.transition = 'none';\n this.menuEl.style.transform = 'none';\n const menu = this.menuEl.getBoundingClientRect();\n this.menuEl.style.transform = transform;\n this.menuEl.style.transition = transition;\n\n let bounds = { left: 0, top: 0, right: window.innerWidth, bottom: window.innerHeight };\n if (container && getComputedStyle(container).overflow !== 'visible') {\n const clip = container.getBoundingClientRect();\n bounds = {\n left: Math.max(bounds.left, clip.left),\n top: Math.max(bounds.top, clip.top),\n right: Math.min(bounds.right, clip.right),\n bottom: Math.min(bounds.bottom, clip.bottom)\n };\n }\n\n const width = menu.width;\n const height = Math.min(menu.height, bounds.bottom - bounds.top);\n this.isScrollable = height < menu.height;\n if (this.isScrollable) this.menuEl.style.height = height + 'px';\n\n const rtl = getComputedStyle(this.el).direction === 'rtl';\n const fitsRight = x + width <= bounds.right;\n const fitsLeft = x - width >= bounds.left;\n const leftward = rtl ? fitsLeft || !fitsRight : !fitsRight && fitsLeft;\n const upward = y + height > bounds.bottom && y - height >= bounds.top;\n const clamp = (value: number, min: number, max: number) => Math.max(min, Math.min(value, max));\n const left = clamp(leftward ? x - width : x, bounds.left, bounds.right - width);\n const top = clamp(upward ? y - height : y, bounds.top, bounds.bottom - height);\n this.menuEl.style.left = left - menu.left + 'px';\n this.menuEl.style.top = top - menu.top + 'px';\n this.menuEl.style.transformOrigin = `${leftward ? '100%' : '0'} ${upward ? '100%' : '0'}`;\n }\n\n private _setExpanded(expanded: boolean) {\n if (!this.options.contextMenu) this.el.ariaExpanded = String(expanded);\n }\n\n /**\n * Open menu.\n */\n open = () => {\n if (this.isOpen || this.el['Expressive_Menu'] !== this) return;\n const transition = this._clearPendingTimers();\n this.isOpen = true;\n // onOpenStart callback\n if (typeof this.options.onOpenStart === 'function') {\n this.options.onOpenStart.call(this, this.el);\n }\n if (transition !== this._transition) return;\n // Reset styles\n this._resetMenuStyles();\n this.menuEl.style.display = 'block';\n this._restoreInert();\n this._placeMenu();\n // Do this one frame later so that we don't bind an event handler that's immediately\n // called when the event bubbles up to the document and closes the menu\n this._schedule(() => this._setupTemporaryEventHandlers(), 0);\n // Queue handlers before initial focus, including zero-duration entry.\n this._animateIn();\n this._setExpanded(true);\n };\n\n /**\n * Close menu.\n */\n close = () => {\n if (!this.isOpen) return;\n const transition = this._clearPendingTimers();\n const root = this.menuEl.getRootNode() as Document | ShadowRoot;\n const focused = root.activeElement;\n this.isOpen = false;\n this.menuEl.setAttribute('inert', '');\n clearTimeout(this.filterTimeout);\n this._resetFilterQuery();\n this.focusedIndex = -1;\n this._closeSubmenus();\n // onCloseStart callback\n if (typeof this.options.onCloseStart === 'function') {\n this.options.onCloseStart.call(this, this.el);\n }\n if (transition !== this._transition) return;\n this._animateOut();\n this._removeTemporaryEventHandlers();\n this._setExpanded(false);\n if (this.options.autoFocus && this.menuEl.contains(focused) &&\n (root.activeElement === focused || this.el.ownerDocument.activeElement === this.el.ownerDocument.body)) {\n // A context region may not take focus itself; return to what had it.\n const back = this._contextReturn;\n (back?.isConnected && back !== this.el.ownerDocument.body ? back : this.el).focus();\n }\n this._contextReturn = null;\n this._contextPoint = null;\n };\n\n /**\n * While menu is open, you can recalculate its dimensions if its contents have changed.\n */\n recalculateDimensions = () => {\n if (this.isOpen) {\n this._resetMenuPositioningStyles();\n this._placeMenu();\n }\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/modular.ts"],
|
|
4
|
+
"sourcesContent": ["export * from './components';\nexport { Dialogs } from './behaviors/dialogs';\nexport { BottomSheets } from './behaviors/bottomSheets';\nexport { SideSheets } from './behaviors/sideSheets';\nexport { Forms } from './behaviors/forms';\nexport { AutoInit } from './components/registry';\nexport type { AutoInitOptions } from './components/registry';\n\nexport const version = '0.14.1';\n\nexport type * from './components/autocomplete';\nexport type * from './components/appBar';\nexport type * from './components/buttons';\nexport type * from './components/buttonGroup';\nexport type * from './components/cards';\nexport type * from './components/expandingCard';\nexport type * from './components/carousel';\nexport type * from './components/characterCounter';\nexport type * from './components/chips';\nexport type * from './components/lineChart';\nexport type * from './components/columnChart';\nexport type * from './components/barChart';\nexport type * from './components/pieChart';\nexport type * from './components/heatmapChart';\nexport type * from './components/radarChart';\nexport type * from './components/radialChart';\nexport type * from './components/mixedChart';\nexport type * from './components/questionnaire';\nexport type * from './components/datepicker';\nexport type * from './components/menu';\nexport type * from './components/lightbox';\nexport type * from './components/slider';\nexport type * from './components/scrollspy';\nexport type * from './components/select';\nexport type * from './components/navigationRail';\nexport type * from './components/tabs';\nexport type * from './components/timepicker';\nexport type * from './components/snackbar';\nexport type * from './components/tooltip';\n"],
|
|
5
|
+
"mappings": ";AAQO,IAAM,UAAU;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Utils
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-MNPROCZF.mjs";
|
|
4
4
|
|
|
5
5
|
// src/ts/components/snackbar.ts
|
|
6
6
|
var _defaults = {
|
|
@@ -93,6 +93,7 @@ var _Snackbar = class _Snackbar {
|
|
|
93
93
|
snackbar.velocityX = 0;
|
|
94
94
|
snackbar.time = Date.now();
|
|
95
95
|
snackbar.xPos = e.clientX;
|
|
96
|
+
snackbar._activationDistance = snackbar.el.offsetWidth * snackbar.options.activationPercent;
|
|
96
97
|
}
|
|
97
98
|
}
|
|
98
99
|
static _onDragMove(e) {
|
|
@@ -105,7 +106,7 @@ var _Snackbar = class _Snackbar {
|
|
|
105
106
|
snackbar.velocityX = snackbar.deltaX / (Date.now() - snackbar.time);
|
|
106
107
|
snackbar.time = Date.now();
|
|
107
108
|
const totalDeltaX = snackbar.xPos - snackbar.startingXPos;
|
|
108
|
-
const activationDistance = snackbar.
|
|
109
|
+
const activationDistance = snackbar._activationDistance;
|
|
109
110
|
snackbar.el.style.transform = `translateX(${totalDeltaX}px)`;
|
|
110
111
|
snackbar.el.style.opacity = (1 - Math.abs(totalDeltaX / activationDistance)).toString();
|
|
111
112
|
}
|
|
@@ -118,7 +119,7 @@ var _Snackbar = class _Snackbar {
|
|
|
118
119
|
snackbar.panning = false;
|
|
119
120
|
snackbar.el.classList.remove("panning");
|
|
120
121
|
const totalDeltaX = snackbar.xPos - snackbar.startingXPos;
|
|
121
|
-
const activationDistance = snackbar.
|
|
122
|
+
const activationDistance = snackbar._activationDistance;
|
|
122
123
|
const velocity = Date.now() - snackbar.time < 100 ? snackbar.velocityX : 0;
|
|
123
124
|
const shouldBeDismissed = Math.abs(totalDeltaX) > activationDistance || velocity > 1;
|
|
124
125
|
if (shouldBeDismissed) {
|
|
@@ -352,4 +353,4 @@ var Snackbar = _Snackbar;
|
|
|
352
353
|
export {
|
|
353
354
|
Snackbar
|
|
354
355
|
};
|
|
355
|
-
//# sourceMappingURL=chunk-
|
|
356
|
+
//# sourceMappingURL=chunk-KHV6DZXX.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/components/snackbar.ts"],
|
|
4
|
+
"sourcesContent": ["import { BaseOptions } from '../core/component';\nimport { Utils } from '../core/utils';\n\nexport interface SnackbarOptions extends BaseOptions {\n /**\n * The content of the Snackbar.\n * @default \"\"\n */\n text: string;\n /**\n * Optional action label. Rendered as a trailing text button.\n * @default \"\"\n */\n action: string;\n /**\n * Called when the action button is pressed. The snackbar still dismisses.\n * @default null\n */\n onAction: () => void;\n /**\n * Show a trailing close icon button.\n * Defaults to true when action is set, otherwise false.\n */\n dismissible: boolean;\n /**\n * Element id of a `<template>` (or another element) used as the snackbar body.\n * @default \"\"\n */\n snackbarId?: string;\n /**\n * Length in ms the Snackbar stays before dismissal.\n * `Infinity` keeps it on screen until the user acts.\n * When `action` is set and this is omitted, the default is Infinity.\n * @default 4000\n */\n displayLength: number;\n /**\n * Transition in duration in milliseconds.\n * @default 300\n */\n inDuration: number;\n /**\n * Transition out duration in milliseconds.\n * @default 375\n */\n outDuration: number;\n /**\n * Classes to be added to the snackbar element.\n * @default \"\"\n */\n classes: string;\n /**\n * Callback function called when the snackbar is dismissed.\n * @default null\n */\n completeCallback: () => void;\n /**\n * The percentage of the snackbar's width it takes for a drag\n * to dismiss a Snackbar.\n * @default 0.8\n */\n activationPercent: number;\n /**\n * Any element in the tree the snackbar should render into. A Snackbar has no\n * originating element to infer this from, so pass one when the page lives in\n * a shadow root \u2014 the container is appended to that root instead of to\n * `document.body`, where a root-scoped stylesheet could not reach it.\n * @default null\n */\n root: HTMLElement;\n}\n\nconst _defaults: SnackbarOptions = {\n text: '',\n action: '',\n onAction: null,\n dismissible: false,\n displayLength: 4000,\n inDuration: 300,\n outDuration: 375,\n classes: '',\n completeCallback: null,\n activationPercent: 0.8,\n root: null\n};\n\nexport class Snackbar {\n /** The snackbar element. */\n el: HTMLElement;\n /**\n * The remaining amount of time in ms that the snackbar\n * will stay before dismissal.\n */\n timeRemaining: number;\n /**\n * Describes the current pan state of the Snackbar.\n */\n panning: boolean;\n options: SnackbarOptions;\n message: string;\n counterTimeout: ReturnType<typeof setTimeout>;\n /** Wall-clock time the snackbar is due to dismiss, for pause/resume. */\n private _deadline: number;\n wasSwiped: boolean;\n startingXPos: number;\n xPos: number;\n time: number;\n deltaX: number;\n velocityX: number;\n /** Swipe distance that dismisses, measured once when the drag starts. */\n private _activationDistance: number;\n private _dismissed = false;\n private _returnFocus: HTMLElement | null = null;\n private _events: AbortController;\n private _restoreElement: (() => void) | null = null;\n private _transitionTimer: ReturnType<typeof setTimeout>;\n private _dismissTimer: ReturnType<typeof setTimeout>;\n private _focusTimer: ReturnType<typeof setTimeout>;\n\n static _snackbars: Snackbar[];\n static _container: HTMLElement;\n static _draggedSnackbar: Snackbar;\n /** Which pointer owns the drag in flight; a second finger is ignored. */\n static _dragPointerId: number | null = null;\n\n constructor(options: Partial<SnackbarOptions> = {}) {\n this.options = {\n ...Snackbar.defaults,\n ...options\n };\n if (options.displayLength === undefined && this.options.action) {\n this.options.displayLength = Infinity;\n }\n if (options.dismissible === undefined && this.options.action) this.options.dismissible = true;\n this.message = this.options.text;\n this.panning = false;\n this.timeRemaining = this.options.displayLength;\n // One snackbar at a time so a new update does not stack over the page.\n while (Snackbar._snackbars.length > 0) {\n const snackbar = Snackbar._snackbars.shift();\n snackbar._dismissed = true;\n snackbar._restoreFocus(true);\n }\n let focused = document.activeElement;\n while (focused?.shadowRoot?.activeElement) focused = focused.shadowRoot.activeElement;\n this._returnFocus = focused instanceof HTMLElement ? focused : null;\n this.el = this._createSnackbar();\n // One container serves every snackbar, and only one snackbar shows at a\n // time \u2014 so it is moved rather than duplicated when the root changes.\n const root = Utils.portalRoot(this.options.root ?? document.body);\n if (\n !Snackbar._container ||\n !Snackbar._container.isConnected ||\n Snackbar._container.parentNode !== root\n ) {\n if (Snackbar._container) Snackbar._removeContainer();\n Snackbar._createContainer(root);\n }\n Snackbar._container.appendChild(this.el);\n this.el['Expressive_Snackbar'] = this;\n Snackbar._snackbars.push(this);\n this._animateIn();\n this._setTimer();\n }\n\n static get defaults(): SnackbarOptions {\n return _defaults;\n }\n\n static getInstance(el: HTMLElement): Snackbar {\n return el['Expressive_Snackbar'];\n }\n\n static _createContainer(root: HTMLElement | ShadowRoot = document.body) {\n const container = document.createElement('div');\n container.setAttribute('id', 'snackbar-container');\n // One listener per stage. These used to be a touch trio on the container\n // plus a mouse trio split across the container and the document, with a\n // helper picking `targetTouches[0].clientX` or `clientX` apart afterwards.\n // Move and up stay on the document so a drag that leaves the container\n // still completes.\n container.addEventListener('pointerdown', Snackbar._onDragStart);\n document.addEventListener('pointermove', Snackbar._onDragMove);\n document.addEventListener('pointerup', Snackbar._onDragEnd);\n document.addEventListener('pointercancel', Snackbar._onDragCancel);\n root.appendChild(container);\n Snackbar._container = container;\n }\n\n static _removeContainer() {\n document.removeEventListener('pointermove', Snackbar._onDragMove);\n document.removeEventListener('pointerup', Snackbar._onDragEnd);\n document.removeEventListener('pointercancel', Snackbar._onDragCancel);\n Snackbar._container.remove();\n Snackbar._container = null;\n }\n\n static _onDragStart(e: PointerEvent) {\n if (!e.isPrimary) return;\n if (e.pointerType === 'mouse' && e.button !== 0) return;\n const target = e.target as HTMLElement | null;\n // Don't start a swipe from the action or close \u2014 those are buttons.\n if (target && !target.closest('button, a') && target.closest('.snackbar')) {\n const snackbarElem = target.closest('.snackbar') as HTMLElement;\n const snackbar: Snackbar = snackbarElem['Expressive_Snackbar'];\n if (!snackbar) return;\n snackbar.panning = true;\n snackbar._pauseTimer();\n Snackbar._draggedSnackbar = snackbar;\n snackbar.el.classList.add('panning');\n snackbar.el.style.transition = '';\n Snackbar._dragPointerId = e.pointerId;\n snackbar.startingXPos = e.clientX;\n snackbar.velocityX = 0;\n snackbar.time = Date.now();\n snackbar.xPos = e.clientX;\n // A translateX does not change the width, so one read covers the drag.\n snackbar._activationDistance = snackbar.el.offsetWidth * snackbar.options.activationPercent;\n }\n }\n\n static _onDragMove(e: PointerEvent) {\n if (Snackbar._dragPointerId !== e.pointerId) return;\n if (!!Snackbar._draggedSnackbar) {\n e.preventDefault();\n const snackbar = Snackbar._draggedSnackbar;\n snackbar.deltaX = Math.abs(snackbar.xPos - e.clientX);\n snackbar.xPos = e.clientX;\n snackbar.velocityX = snackbar.deltaX / (Date.now() - snackbar.time);\n snackbar.time = Date.now();\n\n const totalDeltaX = snackbar.xPos - snackbar.startingXPos;\n const activationDistance = snackbar._activationDistance;\n snackbar.el.style.transform = `translateX(${totalDeltaX}px)`;\n snackbar.el.style.opacity = (1 - Math.abs(totalDeltaX / activationDistance)).toString();\n }\n }\n\n static _onDragEnd(e: PointerEvent) {\n if (Snackbar._dragPointerId !== e.pointerId) return;\n Snackbar._dragPointerId = null;\n if (!!Snackbar._draggedSnackbar) {\n const snackbar = Snackbar._draggedSnackbar;\n snackbar.panning = false;\n snackbar.el.classList.remove('panning');\n\n const totalDeltaX = snackbar.xPos - snackbar.startingXPos;\n const activationDistance = snackbar._activationDistance;\n const velocity = Date.now() - snackbar.time < 100 ? snackbar.velocityX : 0;\n const shouldBeDismissed = Math.abs(totalDeltaX) > activationDistance || velocity > 1;\n\n // Remove snackbar\n if (shouldBeDismissed) {\n snackbar.wasSwiped = true;\n snackbar.dismiss();\n // Animate snackbar back to original position\n } else {\n snackbar.el.style.transition = 'transform .2s, opacity .2s';\n snackbar.el.style.transform = '';\n snackbar.el.style.opacity = '';\n snackbar._resumeTimer();\n }\n Snackbar._draggedSnackbar = null;\n }\n }\n\n /**\n * A cancelled pointer is not a short swipe. Snap back and resume the timer\n * without consulting the distance travelled - the browser took the gesture\n * over, so the movement so far says nothing about what the user wanted.\n */\n static _onDragCancel(e: PointerEvent) {\n if (Snackbar._dragPointerId !== e.pointerId) return;\n Snackbar._dragPointerId = null;\n const snackbar = Snackbar._draggedSnackbar;\n if (!snackbar) return;\n snackbar.panning = false;\n snackbar.el.classList.remove('panning');\n snackbar.el.style.transition = 'transform .2s, opacity .2s';\n snackbar.el.style.transform = '';\n snackbar.el.style.opacity = '';\n snackbar._resumeTimer();\n Snackbar._draggedSnackbar = null;\n }\n\n /**\n * dismiss all snackbars.\n */\n static dismissAll() {\n // Copy first: dismiss() splices the list it is iterating.\n for (const snackbar of [...Snackbar._snackbars]) {\n snackbar.dismiss();\n }\n }\n\n _createSnackbar() {\n let snackbar: HTMLElement = this.options.snackbarId\n ? Utils.getElementById(this.options.root ?? document.body, this.options.snackbarId)\n : document.createElement('div');\n if (snackbar instanceof HTMLTemplateElement) {\n const node = (snackbar as HTMLTemplateElement).content.cloneNode(true);\n snackbar = (node as HTMLElement).firstElementChild as HTMLElement;\n } else if (snackbar && this.options.snackbarId) {\n const placeholder = document.createComment('');\n snackbar.before(placeholder);\n const children = [...snackbar.childNodes];\n const attributes = ['class', 'style', 'role', 'aria-live', 'aria-atomic', 'inert']\n .map(name => [name, snackbar.getAttribute(name)]);\n this._restoreElement = () => {\n snackbar.replaceChildren(...children);\n for (const [name, value] of attributes) {\n if (value === null) snackbar.removeAttribute(name);\n else snackbar.setAttribute(name, value);\n }\n placeholder.replaceWith(snackbar);\n };\n }\n if (!snackbar) throw new Error('Snackbar body not found');\n this._events = new (snackbar.ownerDocument.defaultView ?? window).AbortController();\n const listenerOptions = { signal: this._events.signal };\n snackbar.classList.add('snackbar');\n snackbar.setAttribute('role', 'status');\n snackbar.setAttribute('aria-live', 'polite');\n snackbar.setAttribute('aria-atomic', 'true');\n snackbar.inert = false;\n snackbar.addEventListener('focusin', (e) => {\n if (e.relatedTarget instanceof HTMLElement && !snackbar.contains(e.relatedTarget)) {\n this._returnFocus = e.relatedTarget;\n }\n this._pauseTimer();\n }, listenerOptions);\n snackbar.addEventListener('keydown', (e) => {\n if (e.key !== 'Escape' || e.defaultPrevented || this._dismissed) return;\n e.preventDefault();\n e.stopPropagation();\n this.dismiss();\n }, listenerOptions);\n snackbar.addEventListener('focusout', () => {\n clearTimeout(this._focusTimer);\n this._focusTimer = setTimeout(() => this._resumeTimer(), 0);\n }, listenerOptions);\n snackbar.addEventListener('pointerenter', () => this._pauseTimer(), listenerOptions);\n snackbar.addEventListener('pointerleave', () => this._resumeTimer(), listenerOptions);\n // Add custom classes onto snackbar\n if (this.options.classes.length > 0) {\n snackbar.classList.add(...this.options.classes.split(' ').filter(Boolean));\n }\n if (this.message) {\n const text = document.createElement('p');\n text.textContent = this.message;\n snackbar.replaceChildren(text);\n }\n if (this.options.action) {\n const action = document.createElement('button');\n action.type = 'button';\n action.textContent = this.options.action;\n action.addEventListener('click', (e) => {\n e.stopPropagation();\n if (this._dismissed) return;\n try {\n if (typeof this.options.onAction === 'function') this.options.onAction();\n } finally {\n this.dismiss();\n }\n }, listenerOptions);\n snackbar.appendChild(action);\n }\n if (this.options.dismissible) {\n const close = document.createElement('button');\n close.type = 'button';\n close.className = 'circle';\n close.setAttribute('aria-label', 'Dismiss');\n const icon = document.createElement('i');\n icon.className = 'material-symbols';\n icon.setAttribute('aria-hidden', 'true');\n icon.textContent = 'close';\n close.appendChild(icon);\n close.addEventListener('click', (e) => {\n e.stopPropagation();\n this.dismiss();\n }, listenerOptions);\n snackbar.appendChild(close);\n }\n return snackbar;\n }\n\n private _remove() {\n if (this._events.signal.aborted) return;\n this._events.abort();\n clearTimeout(this.counterTimeout);\n clearTimeout(this._transitionTimer);\n clearTimeout(this._dismissTimer);\n clearTimeout(this._focusTimer);\n this.counterTimeout = null;\n if (Snackbar._draggedSnackbar === this) {\n Snackbar._draggedSnackbar = null;\n Snackbar._dragPointerId = null;\n }\n this.el['Expressive_Snackbar'] = undefined;\n if (this._restoreElement) this._restoreElement();\n else this.el.remove();\n const index = Snackbar._snackbars.indexOf(this);\n if (index >= 0) Snackbar._snackbars.splice(index, 1);\n if (!Snackbar._snackbars.length && Snackbar._container?.childElementCount === 0) {\n Snackbar._removeContainer();\n }\n }\n\n _animateIn() {\n this.el.style.display = '';\n this.el.style.opacity = '0';\n this.el.style.transform = 'translateY(24px)';\n this.el.style.transition = `\n transform ${this.options.inDuration}ms ease,\n opacity ${this.options.inDuration}ms ease\n `;\n this._transitionTimer = setTimeout(() => {\n this.el.style.transform = '';\n this.el.style.opacity = '1';\n }, 1);\n }\n\n /**\n * Arm the dismissal timer.\n *\n * One timeout, not a 20ms interval ticking a counter down: the old form woke\n * the page up 50 times a second per snackbar purely to subtract 20 from a\n * number. Dragging pauses the countdown via _pauseTimer/_resumeTimer instead.\n */\n _setTimer() {\n if (this.timeRemaining === Infinity) return;\n this._deadline = Date.now() + this.timeRemaining;\n this.counterTimeout = setTimeout(() => this.dismiss(), this.timeRemaining);\n }\n\n /** Stop the countdown, banking the time that was left on it. */\n _pauseTimer() {\n if (this.counterTimeout == null) return;\n clearTimeout(this.counterTimeout);\n this.counterTimeout = null;\n this.timeRemaining = Math.max(0, this._deadline - Date.now());\n }\n\n /** Restart a countdown stopped by {@link _pauseTimer}. */\n _resumeTimer() {\n if (this._dismissed || this.panning || this.el.matches(':hover, :focus-within') || this.counterTimeout != null) return;\n this._setTimer();\n }\n\n private _restoreFocus(remove = false) {\n const focused = (this.el.getRootNode() as Document | ShadowRoot).activeElement;\n const returnFocus = focused && this.el.contains(focused) ? this._returnFocus : null;\n this.el.inert = true;\n if (remove) this._remove();\n if (returnFocus?.isConnected) returnFocus.focus({ preventScroll: true });\n }\n\n /**\n * Dismiss snackbar with animation.\n */\n dismiss() {\n if (this._dismissed) return;\n this._dismissed = true;\n clearTimeout(this.counterTimeout);\n this.counterTimeout = null;\n this._restoreFocus();\n if (this._events.signal.aborted) return;\n const activationDistance = this.el.offsetWidth * this.options.activationPercent;\n\n if (this.wasSwiped) {\n this.el.style.transition = 'transform .05s, opacity .05s';\n this.el.style.transform = `translateX(${activationDistance}px)`;\n this.el.style.opacity = '0';\n }\n\n // easeOutExpo\n this.el.style.transition = `\n margin ${this.options.outDuration}ms ease,\n opacity ${this.options.outDuration}ms ease`;\n\n clearTimeout(this._transitionTimer);\n this._transitionTimer = setTimeout(() => {\n this.el.style.opacity = '0';\n this.el.style.marginTop = '-40px';\n }, 1);\n\n this._dismissTimer = setTimeout(() => {\n this._remove();\n // Call the optional callback\n if (typeof this.options.completeCallback === 'function') {\n this.options.completeCallback();\n }\n }, this.options.outDuration);\n }\n\n static {\n Snackbar._snackbars = [];\n Snackbar._container = null;\n Snackbar._draggedSnackbar = null;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Autocomplete
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-4HZMB7LI.mjs";
|
|
4
4
|
import {
|
|
5
5
|
Utils
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-MNPROCZF.mjs";
|
|
7
7
|
import {
|
|
8
8
|
Component
|
|
9
9
|
} from "./chunk-LTWPGFBR.mjs";
|
|
@@ -342,4 +342,4 @@ var Chips = _Chips;
|
|
|
342
342
|
export {
|
|
343
343
|
Chips
|
|
344
344
|
};
|
|
345
|
-
//# sourceMappingURL=chunk-
|
|
345
|
+
//# sourceMappingURL=chunk-KY6U46SM.mjs.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Utils
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-MNPROCZF.mjs";
|
|
4
4
|
import {
|
|
5
5
|
Component
|
|
6
6
|
} from "./chunk-LTWPGFBR.mjs";
|
|
@@ -28,6 +28,7 @@ var Tooltip = class _Tooltip extends Component {
|
|
|
28
28
|
clearTimeout(this._exitDelayTimeout);
|
|
29
29
|
clearTimeout(this._animationTimeout);
|
|
30
30
|
this.isOpen = true;
|
|
31
|
+
this.el.ownerDocument.addEventListener("keydown", this._handleKeydown, true);
|
|
31
32
|
this.options = { ...this.options, ...this._getAttributeOptions() };
|
|
32
33
|
this._updateTooltipContent();
|
|
33
34
|
this._setEnterDelayTimeout(isManual);
|
|
@@ -40,6 +41,7 @@ var Tooltip = class _Tooltip extends Component {
|
|
|
40
41
|
this.isHovered = false;
|
|
41
42
|
this.isFocused = false;
|
|
42
43
|
this.isOpen = false;
|
|
44
|
+
this.el.ownerDocument.removeEventListener("keydown", this._handleKeydown, true);
|
|
43
45
|
clearTimeout(this._enterDelayTimeout);
|
|
44
46
|
this._setExitDelayTimeout();
|
|
45
47
|
};
|
|
@@ -169,7 +171,6 @@ var Tooltip = class _Tooltip extends Component {
|
|
|
169
171
|
el.addEventListener("focus", this._handleFocus, true);
|
|
170
172
|
el.addEventListener("blur", this._handleBlur, true);
|
|
171
173
|
}
|
|
172
|
-
this.el.ownerDocument.addEventListener("keydown", this._handleKeydown, true);
|
|
173
174
|
}
|
|
174
175
|
_removeEventHandlers() {
|
|
175
176
|
for (const el of [this.el, this.tooltipEl]) {
|
|
@@ -287,4 +288,4 @@ var Tooltip = class _Tooltip extends Component {
|
|
|
287
288
|
export {
|
|
288
289
|
Tooltip
|
|
289
290
|
};
|
|
290
|
-
//# sourceMappingURL=chunk-
|
|
291
|
+
//# sourceMappingURL=chunk-LRZMJZ3T.mjs.map
|