@nanoporetech-digital/components 5.2.1 → 5.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/dist/cjs/{_commonjsHelpers-9f2314fc.js → _commonjsHelpers-29614748.js} +1 -17
- package/dist/cjs/_commonjsHelpers-29614748.js.map +1 -0
- package/dist/cjs/algoliasearch-lite.esm.browser-992a2eff.js +922 -0
- package/dist/cjs/algoliasearch-lite.esm.browser-992a2eff.js.map +1 -0
- package/dist/cjs/component-store-21cb4901.js +328 -0
- package/dist/cjs/component-store-21cb4901.js.map +1 -0
- package/dist/cjs/events-db0a42ee.js +39 -0
- package/dist/cjs/events-db0a42ee.js.map +1 -0
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/nano-alert.cjs.entry.js +9 -2
- package/dist/cjs/nano-alert.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-algolia-filter.cjs.entry.js +1 -2
- package/dist/cjs/nano-algolia-filter.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-algolia-input.cjs.entry.js +8 -4
- package/dist/cjs/nano-algolia-input.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-algolia.cjs.entry.js +4 -4
- package/dist/cjs/nano-algolia.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-components.cjs.js +1 -1
- package/dist/cjs/nano-datalist_3.cjs.entry.js +1 -1
- package/dist/cjs/nano-dialog.cjs.entry.js +23 -22
- package/dist/cjs/nano-dialog.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-drawer.cjs.entry.js +169 -111
- package/dist/cjs/nano-drawer.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-dropdown.cjs.entry.js +16 -2
- package/dist/cjs/nano-dropdown.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-global-nav.cjs.entry.js +5 -6
- package/dist/cjs/nano-global-nav.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-global-search-results.cjs.entry.js +2 -1
- package/dist/cjs/nano-global-search-results.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-slides.cjs.entry.js +1 -1
- package/dist/cjs/nano-sortable.cjs.entry.js +3 -15
- package/dist/cjs/nano-sortable.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-sticker.cjs.entry.js +16 -9
- package/dist/cjs/nano-sticker.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-tab-group.cjs.entry.js +1 -2
- package/dist/cjs/nano-tab-group.cjs.entry.js.map +1 -1
- package/dist/cjs/{nano-table-10a40ab3.js → nano-table-e15cc6b0.js} +6 -6
- package/dist/cjs/nano-table-e15cc6b0.js.map +1 -0
- package/dist/cjs/nano-table.cjs.entry.js +1 -1
- package/dist/cjs/{slot-a448c1a7.js → slot-2dd6ed1d.js} +20 -15
- package/dist/cjs/slot-2dd6ed1d.js.map +1 -0
- package/dist/cjs/{table.worker-f04588c1.js → table.worker-8759e6ea.js} +2 -2
- package/dist/cjs/table.worker-8759e6ea.js.map +1 -0
- package/dist/collection/components/alert/alert.css +15 -0
- package/dist/collection/components/alert/alert.js +10 -2
- package/dist/collection/components/alert/alert.js.map +1 -1
- package/dist/collection/components/algolia/algolia-interface.js.map +1 -1
- package/dist/collection/components/algolia/algolia.js +1 -1
- package/dist/collection/components/algolia/algolia.js.map +1 -1
- package/dist/collection/components/dialog/dialog.css +1 -17
- package/dist/collection/components/dialog/dialog.js +31 -20
- package/dist/collection/components/dialog/dialog.js.map +1 -1
- package/dist/collection/components/drawer/drawer.css +136 -67
- package/dist/collection/components/drawer/drawer.js +282 -154
- package/dist/collection/components/drawer/drawer.js.map +1 -1
- package/dist/collection/components/dropdown/dropdown.css +10 -0
- package/dist/collection/components/dropdown/dropdown.js +15 -1
- package/dist/collection/components/dropdown/dropdown.js.map +1 -1
- package/dist/collection/components/global-nav/global-nav.js +2 -2
- package/dist/collection/components/global-nav/global-nav.js.map +1 -1
- package/dist/collection/components/global-nav/style/global-nav.css +5 -1
- package/dist/collection/components/global-search-results/global-search-results.js +2 -1
- package/dist/collection/components/global-search-results/global-search-results.js.map +1 -1
- package/dist/collection/components/sticker/sticker.js +16 -9
- package/dist/collection/components/sticker/sticker.js.map +1 -1
- package/dist/collection/components/table/table.pin-service.js +4 -4
- package/dist/collection/components/table/table.pin-service.js.map +1 -1
- package/dist/collection/utils/events.js +17 -0
- package/dist/collection/utils/events.js.map +1 -1
- package/dist/collection/utils/slot.js +19 -14
- package/dist/collection/utils/slot.js.map +1 -1
- package/dist/collection/utils/store/get-set.js +6 -12
- package/dist/collection/utils/store/get-set.js.map +1 -1
- package/dist/components/_commonjsHelpers.js +1 -16
- package/dist/components/_commonjsHelpers.js.map +1 -1
- package/dist/components/algolia.js +2 -2
- package/dist/components/algolia.js.map +1 -1
- package/dist/components/algoliasearch-lite.esm.browser.js +920 -0
- package/dist/components/algoliasearch-lite.esm.browser.js.map +1 -0
- package/dist/components/component-store.js +68 -2001
- package/dist/components/component-store.js.map +1 -1
- package/dist/components/dropdown.js +16 -2
- package/dist/components/dropdown.js.map +1 -1
- package/dist/components/events.js +36 -0
- package/dist/components/events.js.map +1 -0
- package/dist/components/nano-alert.js +10 -2
- package/dist/components/nano-alert.js.map +1 -1
- package/dist/components/nano-algolia-input.js +6 -1
- package/dist/components/nano-algolia-input.js.map +1 -1
- package/dist/components/nano-dialog.js +21 -20
- package/dist/components/nano-dialog.js.map +1 -1
- package/dist/components/nano-drawer.js +205 -122
- package/dist/components/nano-drawer.js.map +1 -1
- package/dist/components/nano-global-nav.js +4 -4
- package/dist/components/nano-global-nav.js.map +1 -1
- package/dist/components/nano-global-search-results.js +2 -1
- package/dist/components/nano-global-search-results.js.map +1 -1
- package/dist/components/nano-sortable.js +1 -13
- package/dist/components/nano-sortable.js.map +1 -1
- package/dist/components/slot.js +19 -14
- package/dist/components/slot.js.map +1 -1
- package/dist/components/sticker.js +16 -9
- package/dist/components/sticker.js.map +1 -1
- package/dist/components/table.js +4 -4
- package/dist/components/table.js.map +1 -1
- package/dist/esm/{_commonjsHelpers-e401b2a2.js → _commonjsHelpers-04a0e019.js} +2 -17
- package/dist/esm/_commonjsHelpers-04a0e019.js.map +1 -0
- package/dist/esm/algoliasearch-lite.esm.browser-04891fdc.js +920 -0
- package/dist/esm/algoliasearch-lite.esm.browser-04891fdc.js.map +1 -0
- package/dist/esm/component-store-65d7e36a.js +326 -0
- package/dist/esm/component-store-65d7e36a.js.map +1 -0
- package/dist/esm/events-6a805b42.js +36 -0
- package/dist/esm/events-6a805b42.js.map +1 -0
- package/dist/esm/loader.js +1 -1
- package/dist/esm/nano-alert.entry.js +9 -2
- package/dist/esm/nano-alert.entry.js.map +1 -1
- package/dist/esm/nano-algolia-filter.entry.js +1 -2
- package/dist/esm/nano-algolia-filter.entry.js.map +1 -1
- package/dist/esm/nano-algolia-input.entry.js +7 -3
- package/dist/esm/nano-algolia-input.entry.js.map +1 -1
- package/dist/esm/nano-algolia.entry.js +4 -4
- package/dist/esm/nano-algolia.entry.js.map +1 -1
- package/dist/esm/nano-components.js +1 -1
- package/dist/esm/nano-datalist_3.entry.js +1 -1
- package/dist/esm/nano-dialog.entry.js +23 -22
- package/dist/esm/nano-dialog.entry.js.map +1 -1
- package/dist/esm/nano-drawer.entry.js +171 -113
- package/dist/esm/nano-drawer.entry.js.map +1 -1
- package/dist/esm/nano-dropdown.entry.js +16 -2
- package/dist/esm/nano-dropdown.entry.js.map +1 -1
- package/dist/esm/nano-global-nav.entry.js +5 -6
- package/dist/esm/nano-global-nav.entry.js.map +1 -1
- package/dist/esm/nano-global-search-results.entry.js +2 -1
- package/dist/esm/nano-global-search-results.entry.js.map +1 -1
- package/dist/esm/nano-slides.entry.js +1 -1
- package/dist/esm/nano-sortable.entry.js +1 -13
- package/dist/esm/nano-sortable.entry.js.map +1 -1
- package/dist/esm/nano-sticker.entry.js +16 -9
- package/dist/esm/nano-sticker.entry.js.map +1 -1
- package/dist/esm/nano-tab-group.entry.js +1 -2
- package/dist/esm/nano-tab-group.entry.js.map +1 -1
- package/dist/esm/{nano-table-2bbcaa8d.js → nano-table-5c5bd3f2.js} +6 -6
- package/dist/esm/nano-table-5c5bd3f2.js.map +1 -0
- package/dist/esm/nano-table.entry.js +1 -1
- package/dist/esm/{slot-a4f6e2af.js → slot-8126e238.js} +20 -15
- package/dist/esm/slot-8126e238.js.map +1 -0
- package/dist/esm/{table.worker-7324ad73.js → table.worker-e7f4f50c.js} +2 -2
- package/dist/esm/table.worker-e7f4f50c.js.map +1 -0
- package/dist/nano-components/nano-components.css +1 -1
- package/dist/nano-components/nano-components.esm.js +1 -1
- package/dist/nano-components/nano-components.esm.js.map +1 -1
- package/dist/nano-components/p-0301e8f7.entry.js +5 -0
- package/dist/nano-components/p-0301e8f7.entry.js.map +1 -0
- package/dist/nano-components/p-27422aa9.entry.js +5 -0
- package/dist/nano-components/{p-6920ad69.entry.js.map → p-27422aa9.entry.js.map} +1 -1
- package/dist/nano-components/{p-52ae36ec.js → p-2d79f5b3.js} +2 -2
- package/dist/nano-components/{p-0697795a.entry.js → p-31c23d6e.entry.js} +2 -2
- package/dist/nano-components/p-31c23d6e.entry.js.map +1 -0
- package/dist/nano-components/p-487de04d.entry.js.map +1 -1
- package/dist/nano-components/p-570d2e50.entry.js +5 -0
- package/dist/nano-components/p-570d2e50.entry.js.map +1 -0
- package/dist/nano-components/{p-3eb6d833.entry.js → p-5a4b3fa9.entry.js} +2 -2
- package/dist/nano-components/p-653ae985.js +5 -0
- package/dist/nano-components/p-653ae985.js.map +1 -0
- package/dist/nano-components/p-676a4744.entry.js +5 -0
- package/dist/nano-components/{p-d0eefd52.entry.js.map → p-676a4744.entry.js.map} +1 -1
- package/dist/nano-components/p-8fe51abf.js +5 -0
- package/dist/nano-components/{p-4884b65a.entry.js → p-90cd4f56.entry.js} +2 -2
- package/dist/nano-components/p-90cd4f56.entry.js.map +1 -0
- package/dist/nano-components/p-9ba81ed2.js +5 -0
- package/dist/nano-components/p-9ba81ed2.js.map +1 -0
- package/dist/nano-components/p-9bfdee71.js +5 -0
- package/dist/nano-components/p-9bfdee71.js.map +1 -0
- package/dist/nano-components/p-a8d6ca38.entry.js +5 -0
- package/dist/nano-components/p-a8d6ca38.entry.js.map +1 -0
- package/dist/nano-components/p-ace7743c.entry.js +5 -0
- package/dist/nano-components/p-ace7743c.entry.js.map +1 -0
- package/dist/nano-components/{p-39aec880.entry.js → p-bab2888b.entry.js} +2 -2
- package/dist/nano-components/p-bdb5b6fc.entry.js +5 -0
- package/dist/nano-components/p-bdb5b6fc.entry.js.map +1 -0
- package/dist/nano-components/p-cad86fb8.js +5 -0
- package/dist/nano-components/p-cad86fb8.js.map +1 -0
- package/dist/nano-components/p-dc565459.js +5 -0
- package/dist/nano-components/p-dc565459.js.map +1 -0
- package/dist/nano-components/p-ede12d35.entry.js +5 -0
- package/dist/nano-components/p-ede12d35.entry.js.map +1 -0
- package/dist/nano-components/p-f504b1df.entry.js +7 -0
- package/dist/nano-components/p-f504b1df.entry.js.map +1 -0
- package/dist/nano-components/{p-db370094.entry.js → p-f7a4c62b.entry.js} +2 -2
- package/dist/themes/london-calling.css.map +1 -1
- package/dist/themes/nanopore.cn.css.map +1 -1
- package/dist/themes/nanopore.css.map +1 -1
- package/dist/types/components/alert/alert.d.ts +1 -0
- package/dist/types/components/algolia/algolia-interface.d.ts +1 -1
- package/dist/types/components/algolia/algolia.d.ts +1 -1
- package/dist/types/components/dialog/dialog.d.ts +15 -4
- package/dist/types/components/drawer/drawer.d.ts +69 -50
- package/dist/types/components/sticker/sticker.d.ts +4 -4
- package/dist/types/components.d.ts +50 -28
- package/dist/types/types/algolia.d.ts +4 -0
- package/dist/types/types/scss.vars.d.ts +4 -0
- package/dist/types/utils/events.d.ts +7 -0
- package/dist/types/utils/slot.d.ts +3 -3
- package/docs-json.json +268 -61
- package/docs-vscode.json +28 -11
- package/hydrate/index.js +1335 -2236
- package/package.json +4 -4
- package/dist/cjs/_commonjsHelpers-9f2314fc.js.map +0 -1
- package/dist/cjs/algoliasearch.umd-689c1560.js +0 -15
- package/dist/cjs/algoliasearch.umd-689c1560.js.map +0 -1
- package/dist/cjs/component-store-f1dc1276.js +0 -2261
- package/dist/cjs/component-store-f1dc1276.js.map +0 -1
- package/dist/cjs/nano-table-10a40ab3.js.map +0 -1
- package/dist/cjs/slot-a448c1a7.js.map +0 -1
- package/dist/cjs/table.worker-f04588c1.js.map +0 -1
- package/dist/components/algoliasearch.umd.js +0 -13
- package/dist/components/algoliasearch.umd.js.map +0 -1
- package/dist/esm/_commonjsHelpers-e401b2a2.js.map +0 -1
- package/dist/esm/algoliasearch.umd-4f7efa84.js +0 -13
- package/dist/esm/algoliasearch.umd-4f7efa84.js.map +0 -1
- package/dist/esm/component-store-c23ebc9c.js +0 -2259
- package/dist/esm/component-store-c23ebc9c.js.map +0 -1
- package/dist/esm/nano-table-2bbcaa8d.js.map +0 -1
- package/dist/esm/slot-a4f6e2af.js.map +0 -1
- package/dist/esm/table.worker-7324ad73.js.map +0 -1
- package/dist/nano-components/p-0697795a.entry.js.map +0 -1
- package/dist/nano-components/p-17b099cc.entry.js +0 -5
- package/dist/nano-components/p-17b099cc.entry.js.map +0 -1
- package/dist/nano-components/p-1a0b5bc3.js +0 -5
- package/dist/nano-components/p-1a0b5bc3.js.map +0 -1
- package/dist/nano-components/p-4884b65a.entry.js.map +0 -1
- package/dist/nano-components/p-58cf5446.js +0 -5
- package/dist/nano-components/p-58cf5446.js.map +0 -1
- package/dist/nano-components/p-6920ad69.entry.js +0 -5
- package/dist/nano-components/p-69a3e911.js +0 -5
- package/dist/nano-components/p-7baa9e14.entry.js +0 -5
- package/dist/nano-components/p-7baa9e14.entry.js.map +0 -1
- package/dist/nano-components/p-9b533dc3.js +0 -5
- package/dist/nano-components/p-9b533dc3.js.map +0 -1
- package/dist/nano-components/p-a362bd23.entry.js +0 -5
- package/dist/nano-components/p-a362bd23.entry.js.map +0 -1
- package/dist/nano-components/p-b04fd7ca.entry.js +0 -5
- package/dist/nano-components/p-b04fd7ca.entry.js.map +0 -1
- package/dist/nano-components/p-b72df1aa.entry.js +0 -5
- package/dist/nano-components/p-b72df1aa.entry.js.map +0 -1
- package/dist/nano-components/p-ce5efc3f.entry.js +0 -5
- package/dist/nano-components/p-ce5efc3f.entry.js.map +0 -1
- package/dist/nano-components/p-d0eefd52.entry.js +0 -5
- package/dist/nano-components/p-e2b2b015.entry.js +0 -5
- package/dist/nano-components/p-e2b2b015.entry.js.map +0 -1
- package/dist/nano-components/p-ed6adde2.js +0 -7
- package/dist/nano-components/p-ed6adde2.js.map +0 -1
- package/dist/types/dom.ie.d.ts +0 -3
- /package/dist/nano-components/{p-39aec880.entry.js.map → p-2d79f5b3.js.map} +0 -0
- /package/dist/nano-components/{p-3eb6d833.entry.js.map → p-5a4b3fa9.entry.js.map} +0 -0
- /package/dist/nano-components/{p-52ae36ec.js.map → p-8fe51abf.js.map} +0 -0
- /package/dist/nano-components/{p-69a3e911.js.map → p-bab2888b.entry.js.map} +0 -0
- /package/dist/nano-components/{p-db370094.entry.js.map → p-f7a4c62b.entry.js.map} +0 -0
@@ -1,165 +1,223 @@
|
|
1
1
|
/*!
|
2
2
|
* Web Components for Nanopore digital Web Apps
|
3
3
|
*/
|
4
|
-
import { r as registerInstance, c as createEvent, h,
|
4
|
+
import { r as registerInstance, c as createEvent, h, g as getElement } from './index-dad5627b.js';
|
5
5
|
import { M as Modal } from './modal-bd9638c0.js';
|
6
|
-
import {
|
6
|
+
import { l as lockBodyScrolling, u as unlockBodyScrolling } from './scroll-952d292a.js';
|
7
|
+
import { h as hasSlot } from './slot-8126e238.js';
|
8
|
+
import { w as waitForEvent } from './events-6a805b42.js';
|
9
|
+
import { C as ComponentStore } from './component-store-65d7e36a.js';
|
7
10
|
import './tabbable-26a66a22.js';
|
8
11
|
import './dom-311c9e1e.js';
|
12
|
+
import './throttle-ac4fcefa.js';
|
9
13
|
|
10
|
-
const drawerCss = ":host{box-sizing:border-box}*,*::before,*::after{box-sizing:border-box}[hidden]{display:none !important}:host{
|
14
|
+
const drawerCss = ":host{box-sizing:border-box}*,*::before,*::after{box-sizing:border-box}[hidden]{display:none !important}:host{--size:25rem;--panel-background:white;--panel-shadow:var(--nano-layer-shadow-xlarge, 0 4px 16px rgba(0, 0, 0, 0.4));--scrim-color:var(--nano-layer-overlay-dark, rgb(74 74 74 / 50%));--header-button-color:#b5aea7;--footer-background:#e4e6e8;--header-background:var(--panel-background);--header-spacing:var(--nano-spacing-large, 20px);--body-spacing:var(--nano-spacing-large, 20px);--footer-spacing:var(--nano-spacing-medium, 16px) var(--nano-spacing-large, 20px);--dir:1}:host(:dir(rtl)){--dir:-1}:host-context([dir=rtl]){--dir:-1}.drawer{inset-block-start:0;inset-inline-start:0;width:100%;height:100%;pointer-events:none;overflow:hidden}.drawer--contained{position:absolute;z-index:initial}.drawer--fixed{position:fixed;z-index:var(--nano-layer-index-modal, 700)}.drawer__panel{position:absolute;z-index:2;max-width:100%;max-height:100%;background-color:var(--panel-background);box-shadow:var(--panel-shadow);pointer-events:all;transition:var(--nano-transition-fast, 0.3s) opacity, var(--nano-transition-fast, 0.3s) transform;display:flex;flex-direction:column}@media (forced-colors: active){.drawer__panel{border:solid 1px #4a4a4a}}.drawer__panel:focus{outline:none}.drawer--nodismiss .drawer__panel{animation:cannotClose 0.25s ease-in-out 1}@keyframes cannotClose{0%{transform:scale(1)}50%{transform:scale(1.08)}100%{transform:scale(1)}}.drawer--top .drawer__panel{inset-block:0 auto;inset-inline-end:auto;inset-inline-start:0;width:100%;height:var(--size);opacity:0;transform:translateY(-100%)}.drawer--bottom .drawer__panel{inset-block:auto 0;inset-inline-end:auto;inset-inline-start:0;width:100%;height:var(--size);opacity:0;transform:translateY(100%)}.drawer--top.drawer--open .drawer__panel,.drawer--bottom.drawer--open .drawer__panel{opacity:1;transform:translateY(0)}.drawer--start .drawer__panel{inset-block:0 auto;inset-inline-end:auto;inset-inline-start:0;width:var(--size);height:100%;opacity:0;transform:translateX(calc(var(--dir) * -100%))}.drawer--end .drawer__panel{inset-block:0 auto;inset-inline-end:0;inset-inline-start:auto;width:var(--size);height:100%;opacity:0;transform:translateX(calc(var(--dir) * 100%))}.drawer--start.drawer--open .drawer__panel,.drawer--end.drawer--open .drawer__panel{opacity:1;transform:translateX(0)}.drawer__header{inline-size:100%;display:flex;background-color:var(--header-background)}[stuck] .drawer__header{box-shadow:var(--nano-layer-shadow-medium, 0 2px 4px rgba(0, 0, 0, 0.2))}.drawer__title{flex:1 1 auto;font:inherit;font-size:var(--nano-fontsize-large, 1.25rem);line-height:1.2;padding:var(--header-spacing);margin:0}.drawer__header-actions{flex-shrink:0;display:flex;flex-wrap:wrap;justify-content:flex-end;gap:var(--nano-spacing-xsmall, 4px);padding:0 var(--header-spacing)}.drawer__header-actions .drawer__close,.drawer__header-actions ::slotted(nano-icon-button){flex:0 0 auto;display:flex;align-items:center;font-size:var(--nano-fontsize-xlarge, 1.5rem);--color:var(--header-button-color)}.drawer__main{display:flex;flex-direction:column;overflow:auto;-webkit-overflow-scrolling:touch;flex:1 1 auto}.drawer__body{display:block;flex:1 1 auto;padding:var(--body-spacing);padding-block:0 var(--body-spacing);padding-inline:var(--body-spacing)}.drawer:not(.drawer--has-header) .drawer__body{-webkit-padding-before:var(--body-spacing);padding-block-start:var(--body-spacing)}.drawer__footer{inline-size:100%;text-align:end;padding:var(--footer-spacing);background:var(--footer-background);inset-block-start:1px;position:relative}.drawer__footer ::slotted(button:not(:last-of-type)){-webkit-margin-end:var(--nano-spacing-xsmall, 4px);margin-inline-end:var(--nano-spacing-xsmall, 4px)}.drawer:not(.drawer--has-footer) .drawer__footer{display:none}.drawer__overlay{display:block;position:fixed;inset:0;background-color:var(--scrim-color);pointer-events:all;-webkit-backdrop-filter:blur(var(--nano-layer-overlay-blur, 3px));backdrop-filter:blur(var(--nano-layer-overlay-blur, 3px));opacity:0;transition:var(--nano-transition-fast, 0.3s) opacity}.drawer--open .drawer__overlay{opacity:1}.drawer--contained .drawer__overlay{display:none}";
|
11
15
|
|
12
|
-
let id = 0;
|
13
16
|
const Drawer = class {
|
14
17
|
constructor(hostRef) {
|
15
18
|
registerInstance(this, hostRef);
|
16
19
|
this.nanoShow = createEvent(this, "nanoShow", 7);
|
17
|
-
this.nanoAfterShow = createEvent(this, "nanoAfterShow", 7);
|
18
20
|
this.nanoHide = createEvent(this, "nanoHide", 7);
|
19
21
|
this.nanoAfterHide = createEvent(this, "nanoAfterHide", 7);
|
20
|
-
this.
|
21
|
-
this.
|
22
|
-
this.
|
23
|
-
this.
|
22
|
+
this.nanoAfterShow = createEvent(this, "nanoAfterShow", 7);
|
23
|
+
this.nanoInitialFocus = createEvent(this, "nanoInitialFocus", 7);
|
24
|
+
this.nanoRquestClose = createEvent(this, "nanoRquestClose", 7);
|
25
|
+
this.handleDocumentKeyDown = (event) => {
|
26
|
+
// Contained drawers aren't modal and don't response to the escape key
|
27
|
+
if (this.contained) {
|
28
|
+
return;
|
29
|
+
}
|
30
|
+
if (event.key === 'Escape' && this.modal.isActive() && this.open) {
|
31
|
+
event.stopImmediatePropagation();
|
32
|
+
this.requestClose('keyboard');
|
33
|
+
}
|
34
|
+
};
|
35
|
+
this.handleTransitionEnd = (event) => {
|
36
|
+
if (event.propertyName === 'opacity' &&
|
37
|
+
event
|
38
|
+
.composedPath()
|
39
|
+
.find((node) => node === this.panel || node === this.overlay)) {
|
40
|
+
if (!this.open) {
|
41
|
+
this.drawer.hidden = true;
|
42
|
+
// Now that the dialog is hidden, restore the overlay and panel for next time
|
43
|
+
this.overlay.hidden = false;
|
44
|
+
this.panel.hidden = false;
|
45
|
+
}
|
46
|
+
this.open ? this.nanoAfterShow.emit() : this.nanoAfterHide.emit();
|
47
|
+
}
|
48
|
+
};
|
49
|
+
this.handleSlotChange = () => {
|
50
|
+
this.hasFooter = hasSlot(this.host, 'footer');
|
51
|
+
};
|
52
|
+
this.noDismiss = false;
|
53
|
+
this.hasFooter = undefined;
|
24
54
|
this.open = false;
|
25
|
-
this.label =
|
55
|
+
this.label = undefined;
|
26
56
|
this.placement = 'end';
|
27
57
|
this.contained = false;
|
28
58
|
this.noHeader = false;
|
29
|
-
this.
|
30
|
-
this.
|
59
|
+
this.storeId = undefined;
|
60
|
+
this.storeMethod = 'url-hash';
|
61
|
+
this.noUserDismiss = false;
|
62
|
+
this.hoist = false;
|
31
63
|
}
|
32
|
-
|
33
|
-
|
64
|
+
get panel() {
|
65
|
+
return this._panel;
|
34
66
|
}
|
35
|
-
|
36
|
-
if (this.
|
37
|
-
|
38
|
-
if (!this.contentEle) {
|
39
|
-
this.type = 'overlay';
|
40
|
-
console.warn('a valid contentSelector must be set');
|
41
|
-
return;
|
67
|
+
set panel(ele) {
|
68
|
+
if (this._panel) {
|
69
|
+
this.panel.removeEventListener('animationend', this.handleTransitionEnd);
|
42
70
|
}
|
71
|
+
if (!ele)
|
72
|
+
return;
|
73
|
+
ele.addEventListener('transitionend', this.handleTransitionEnd);
|
74
|
+
this._panel = ele;
|
43
75
|
}
|
44
|
-
|
45
|
-
if (!this.
|
46
|
-
|
47
|
-
|
48
|
-
this.contentEle = this.host.ownerDocument.querySelector(this.contentSelector);
|
49
|
-
}
|
50
|
-
connectedCallback() {
|
51
|
-
this.handleCloseClick = this.handleCloseClick.bind(this);
|
52
|
-
this.handleTransitionEnd = this.handleTransitionEnd.bind(this);
|
53
|
-
this.handleKeyDown = this.handleKeyDown.bind(this);
|
54
|
-
this.handleOverlayClick = this.handleOverlayClick.bind(this);
|
55
|
-
this.handleSlotChange = this.handleSlotChange.bind(this);
|
56
|
-
this.modal = new Modal(this.host);
|
76
|
+
handleHoistChange() {
|
77
|
+
if (!this.hoist || Array.from(document.body.children).includes(this.host))
|
78
|
+
return;
|
79
|
+
document.body.prepend(this.host);
|
57
80
|
}
|
58
|
-
|
59
|
-
|
60
|
-
if (this.open)
|
61
|
-
|
62
|
-
|
63
|
-
this.
|
81
|
+
/** Shows the drawer. */
|
82
|
+
async show() {
|
83
|
+
if (this.open)
|
84
|
+
return undefined;
|
85
|
+
this.open = true;
|
86
|
+
return waitForEvent(this.host, 'nanoAfterShow');
|
64
87
|
}
|
65
|
-
|
66
|
-
|
88
|
+
/** Hides the drawer */
|
89
|
+
async hide() {
|
90
|
+
if (!this.open)
|
91
|
+
return undefined;
|
92
|
+
this.open = false;
|
93
|
+
return waitForEvent(this.host, 'nanoAfterHide');
|
67
94
|
}
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
95
|
+
requestClose(source) {
|
96
|
+
const nanoRequestClose = this.nanoRquestClose.emit({ source });
|
97
|
+
if (nanoRequestClose.defaultPrevented || this.noUserDismiss) {
|
98
|
+
this.noDismiss = true;
|
99
|
+
setTimeout(() => (this.noDismiss = false), 250);
|
72
100
|
return;
|
73
101
|
}
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
this.isVisible = true;
|
80
|
-
this.open = true;
|
81
|
-
// Lock body scrolling only if the drawer isn't contained
|
82
|
-
if (!this.contained) {
|
102
|
+
this.hide();
|
103
|
+
}
|
104
|
+
// Prop Change Handlers
|
105
|
+
handleNoModalChange() {
|
106
|
+
if (this.open && !this.contained) {
|
83
107
|
this.modal.activate();
|
84
108
|
lockBodyScrolling(this.host);
|
85
109
|
}
|
86
|
-
if (
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
this.contentEle.style.position = 'relative';
|
91
|
-
this.contentEle.style.overflow = 'hidden';
|
92
|
-
setTimeout((_) => (this.contentEle.style.right = '25rem'), 0);
|
110
|
+
if (this.open && this.contained) {
|
111
|
+
this.modal.deactivate();
|
112
|
+
unlockBodyScrolling(this.host);
|
113
|
+
}
|
93
114
|
}
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
115
|
+
async handleOpenChange() {
|
116
|
+
if (this.open) {
|
117
|
+
// Show
|
118
|
+
this.nanoShow.emit();
|
119
|
+
this.addOpenListeners();
|
120
|
+
this.originalTrigger = document.activeElement;
|
121
|
+
// Lock body scrolling only if the drawer isn't contained
|
122
|
+
if (!this.contained) {
|
123
|
+
this.modal.activate();
|
124
|
+
lockBodyScrolling(this.host);
|
125
|
+
}
|
126
|
+
// When the drawer is shown, Safari will attempt to set focus on whatever element has autofocus. This causes the
|
127
|
+
// drawer's animation to jitter, so we'll temporarily remove the attribute, call `focus({ preventScroll: true })`
|
128
|
+
// ourselves, and add the attribute back afterwards.
|
129
|
+
const autoFocusTarget = this.host.querySelector('[autofocus]');
|
130
|
+
if (autoFocusTarget) {
|
131
|
+
autoFocusTarget.removeAttribute('autofocus');
|
132
|
+
}
|
133
|
+
this.drawer.hidden = false;
|
134
|
+
// Set initial focus
|
135
|
+
requestAnimationFrame(() => {
|
136
|
+
const nanoInitialFocus = this.nanoInitialFocus.emit();
|
137
|
+
if (!nanoInitialFocus.defaultPrevented) {
|
138
|
+
// Set focus to the autofocus target and restore the attribute
|
139
|
+
if (autoFocusTarget) {
|
140
|
+
autoFocusTarget.focus({
|
141
|
+
preventScroll: true,
|
142
|
+
});
|
143
|
+
}
|
144
|
+
else {
|
145
|
+
this.panel.focus({ preventScroll: true });
|
146
|
+
}
|
147
|
+
}
|
148
|
+
// Restore the autofocus attribute
|
149
|
+
if (autoFocusTarget) {
|
150
|
+
autoFocusTarget.setAttribute('autofocus', '');
|
151
|
+
}
|
152
|
+
});
|
153
|
+
this.nanoAfterShow.emit();
|
98
154
|
return;
|
99
155
|
}
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
156
|
+
// Hide
|
157
|
+
this.nanoHide.emit();
|
158
|
+
this.removeOpenListeners();
|
159
|
+
if (!this.contained) {
|
160
|
+
this.modal.deactivate();
|
161
|
+
unlockBodyScrolling(this.host);
|
162
|
+
}
|
163
|
+
// Restore focus to the original trigger
|
164
|
+
const trigger = this.originalTrigger;
|
165
|
+
if (typeof (trigger === null || trigger === void 0 ? void 0 : trigger.focus) === 'function') {
|
166
|
+
setTimeout(() => trigger.focus());
|
104
167
|
}
|
105
|
-
this.open = false;
|
106
|
-
this.modal.deactivate();
|
107
|
-
unlockBodyScrolling(this.host);
|
108
|
-
if (!this.contentEle)
|
109
|
-
return;
|
110
|
-
this.contentEle.style.transition = '';
|
111
|
-
this.contentEle.style.position = '';
|
112
|
-
this.contentEle.style.overflow = '';
|
113
|
-
this.contentEle.style.right = '';
|
114
168
|
}
|
115
|
-
|
116
|
-
|
169
|
+
// Event Handling
|
170
|
+
addOpenListeners() {
|
171
|
+
document.addEventListener('keydown', this.handleDocumentKeyDown);
|
117
172
|
}
|
118
|
-
|
119
|
-
|
120
|
-
this.hide();
|
121
|
-
}
|
173
|
+
removeOpenListeners() {
|
174
|
+
document.removeEventListener('keydown', this.handleDocumentKeyDown);
|
122
175
|
}
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
176
|
+
// Component Lifecycle
|
177
|
+
connectedCallback() {
|
178
|
+
this.handleHoistChange();
|
179
|
+
this.modal = new Modal(this.host);
|
180
|
+
}
|
181
|
+
disconnectedCallback() {
|
182
|
+
unlockBodyScrolling(this.host);
|
128
183
|
}
|
129
|
-
|
130
|
-
this.
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
184
|
+
componentWillLoad() {
|
185
|
+
this.handleSlotChange();
|
186
|
+
// Show on init if open
|
187
|
+
if (this.open)
|
188
|
+
this.show();
|
189
|
+
if (this.storeId)
|
190
|
+
ComponentStore.init(this, ['open'], this.storeMethod, this.storeId);
|
191
|
+
}
|
192
|
+
componentDidLoad() {
|
193
|
+
this.drawer.hidden = !this.open;
|
194
|
+
if (this.open) {
|
195
|
+
this.addOpenListeners();
|
196
|
+
if (!this.contained) {
|
197
|
+
this.modal.activate();
|
198
|
+
lockBodyScrolling(this.host);
|
141
199
|
}
|
142
200
|
}
|
143
201
|
}
|
144
202
|
render() {
|
145
|
-
|
146
|
-
const typeClass = 'drawer--' + this.type;
|
147
|
-
return (h(Host, null, h("div", { part: "base", class: {
|
203
|
+
return (h("div", { ref: (ele) => (this.drawer = ele), part: "base", class: {
|
148
204
|
drawer: true,
|
149
205
|
'drawer--open': this.open,
|
150
|
-
|
151
|
-
[typeClass]: true,
|
152
|
-
[placementClass]: true,
|
206
|
+
[`drawer--${this.placement}`]: true,
|
153
207
|
'drawer--contained': this.contained,
|
154
208
|
'drawer--fixed': !this.contained,
|
155
|
-
'drawer--has-footer': this.
|
156
|
-
|
209
|
+
'drawer--has-footer': hasSlot(this.host, 'footer'),
|
210
|
+
'drawer--has-header': !this.noHeader,
|
211
|
+
'drawer--nodismiss': this.noDismiss,
|
212
|
+
} }, h("div", { ref: (ele) => (this.overlay = ele), part: "overlay", class: "drawer__overlay", onClick: () => this.requestClose('overlay'), tabindex: "-1" }), h("div", { ref: (ele) => (this.panel = ele), part: "panel", class: "drawer__panel", role: "dialog", "aria-modal": "true", "aria-hidden": this.open ? 'false' : 'true', "aria-label": this.noHeader ? this.label : undefined, "aria-labelledby": !this.noHeader ? 'title' : undefined, tabindex: "0" }, h("div", { class: "drawer__main" }, !this.noHeader && (h("nano-sticker", null, h("header", { part: "header", class: "drawer__header" }, h("h2", { part: "title", class: "drawer__title", id: "title" }, h("slot", { name: "label" }, this.label.length > 0
|
213
|
+
? this.label
|
214
|
+
: String.fromCharCode(65279))), h("div", { part: "header-actions", class: "drawer__header-actions" }, h("slot", { name: "header-actions" }), !this.noUserDismiss && (h("nano-icon-button", { part: "close-button", exportparts: "base:close-button__base", class: "drawer__close", iconName: "light/times", label: "Close", onClick: () => this.requestClose('close-button') })))))), h("div", { part: "body", class: "drawer__body" }, h("slot", null)), h("nano-sticker", { position: "bottom" }, h("footer", { part: "footer", class: "drawer__footer" }, h("slot", { name: "footer", onSlotchange: this.handleSlotChange })))))));
|
157
215
|
}
|
158
216
|
get host() { return getElement(this); }
|
159
217
|
static get watchers() { return {
|
160
|
-
"
|
161
|
-
"
|
162
|
-
"
|
218
|
+
"hoist": ["handleHoistChange"],
|
219
|
+
"contained": ["handleNoModalChange"],
|
220
|
+
"open": ["handleOpenChange"]
|
163
221
|
}; }
|
164
222
|
};
|
165
223
|
Drawer.style = drawerCss;
|
@@ -1 +1 @@
|
|
1
|
-
{"file":"nano-drawer.entry.js","mappings":"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","names":[],"sources":["./src/components/drawer/drawer.scss?tag=nano-drawer&encapsulation=shadow","./src/components/drawer/drawer.tsx"],"sourcesContent":["@import '../../global/style/utilities/globals';\n@import '../../global/style/utilities/css-patterns/visually_hidden';\n\n:host {\n /**\n * @prop --size: The preferred size of the drawer; width or height depending on placement. Note that the drawer will shrink to accommodate smaller screens. Defaults to 25rem\n * @prop --panel-background-color: background color of panel. Default to 'white'\n * @prop --panel-shadow: Defaults to '0 4px 16px rgb(0 0 0 / 10%)';\n * @prop --overlay-color: Defaults to 'hsla(203, 10%, 20%, 0.5)';\n */\n\n position: relative;\n display: block;\n\n --size: 25rem;\n --panel-background-color: white;\n --panel-shadow: 0 4px 16px rgb(0 0 0 / 10%);\n --overlay-color: hsl(203deg 10% 20% / 50%);\n}\n\n.drawer {\n inset-block-start: 0;\n inset-inline-start: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n overflow: hidden;\n\n &:not(.drawer--visible) {\n @include hidden;\n }\n}\n\n.drawer--contained {\n position: absolute;\n z-index: initial;\n}\n\n.drawer--fixed {\n position: fixed;\n z-index: 2000;\n}\n\n.drawer__panel {\n position: absolute;\n display: flex;\n flex-direction: column;\n z-index: 2;\n max-width: 100%;\n max-height: 100%;\n background-color: var(--panel-background-color);\n box-shadow: var(--panel-shadow);\n transition: 250ms transform;\n overflow: auto;\n pointer-events: all;\n\n &:focus {\n outline: none;\n }\n}\n\n.drawer--start .drawer__panel {\n @include transform(translate3d(-100%, 0, 0));\n\n inset-block: 0 auto;\n width: var(--size);\n height: 100%;\n}\n\n.drawer--end .drawer__panel {\n @include transform(translate3d(100%, 0, 0));\n\n inset-block: 0 auto;\n width: var(--size);\n height: 100%;\n}\n\n.drawer--top .drawer__panel {\n inset-inline: auto 0;\n inset-block: 0 auto;\n width: 100%;\n height: var(--size);\n transform: translate(0, -100%);\n}\n\n.drawer--bottom .drawer__panel {\n inset-inline: auto 0;\n inset-block: auto 0;\n width: 100%;\n height: var(--size);\n transform: translate(0, 100%);\n}\n\n.drawer--open .drawer__panel {\n transform: translate(0, 0);\n}\n\n.drawer__header {\n display: flex;\n}\n\n.drawer__title {\n flex: 1 1 auto;\n // font-size: var(--sl-font-size-large);\n // line-height: var(--sl-line-height-dense);\n padding: 20px;\n}\n\n.drawer__close {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n // font-size: var(--sl-font-size-x-large);\n // padding: 0 var(--sl-spacing-large);\n}\n\n.drawer__body {\n flex: 1 1 auto;\n // padding: var(--sl-spacing-large);\n overflow: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n.drawer__footer {\n text-align: end;\n // padding: var(--sl-spacing-large);\n\n // ::slotted(sl-button:not(:last-of-type)) {\n // margin-right: var(--sl-spacing-x-small);\n // }\n}\n\n.drawer:not(.drawer--has-footer) .drawer__footer {\n display: none;\n}\n\n.drawer__overlay {\n display: block;\n position: fixed;\n inset: 0;\n background-color: var(--overlay-color);\n opacity: 0;\n transition: 250ms opacity;\n pointer-events: all;\n}\n\n.drawer--contained .drawer__overlay {\n position: absolute;\n}\n\n.drawer--open .drawer__overlay {\n opacity: 1;\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n Method,\n Prop,\n State,\n Watch,\n h,\n Host,\n} from '@stencil/core';\nimport Modal from '../../utils/modal';\nimport { lockBodyScrolling, unlockBodyScrolling } from '../../utils/scroll';\n\nlet id = 0;\n\n/**\n * WIP / TODO. https://git.oxfordnanolabs.local/Digital/nano-components/-/issues/24\n * @slot - The drawer's content.\n * @slot label - The dialog's label. Alternatively, you can use the label prop.\n * @slot footer - The drawer's footer, usually one or more buttons representing various options.\n */\n@Component({\n tag: 'nano-drawer',\n styleUrl: 'drawer.scss',\n shadow: true,\n})\nexport class Drawer {\n private componentId = `drawer-${++id}`;\n private modal: Modal;\n private panel: HTMLElement;\n private contentEle: HTMLElement;\n\n @Element() host: HTMLNanoDrawerElement;\n\n @State() hasFooter = false;\n @State() isVisible = false;\n\n /**\n * Indicates whether or not the drawer is open. You can use this in lieu of the show/hide methods.\n */\n @Prop({ mutable: true, reflect: true }) open = false;\n\n /**\n * The drawer's label as displayed in the header. You should always include a relevant label even when using\n * `no-header`, as it is required for proper accessibility.\n */\n @Prop() label = '';\n\n /** The direction from which the drawer will open. */\n @Prop() placement: 'top' | 'end' | 'bottom' | 'start' = 'end';\n\n /**\n * By default, the drawer slides out of its containing block (usually the viewport). To make the drawer slide out of\n * its parent element, set this prop and add `position: relative` to the parent.\n */\n @Prop() contained = false;\n\n /**\n * Removes the header. This will also remove the default close button, so please ensure you provide an easy,\n * accessible way for users to dismiss the drawer.\n */\n @Prop() noHeader = false;\n\n /**\n * The display type of the drawer\n */\n @Prop() type: 'overlay' | 'reveal' | 'push' = 'overlay';\n\n /**\n * Required for 'reveal' and 'push' types\n * A valid DOM selector of the content element that this drawer will push or reveal underneath\n * Please remember - elements wrapping the content element must be 'overflow: hidden'\n * otherwise menus will be shown when closed\n */\n @Prop() contentSelector: string;\n\n @Watch('open')\n handleOpenChange() {\n this.open ? this.show() : this.hide();\n }\n\n @Watch('type')\n handleTypeChange() {\n if (this.type !== 'push' && this.type !== 'reveal') return;\n if (!this.contentEle) {\n this.type = 'overlay';\n console.warn('a valid contentSelector must be set');\n return;\n }\n }\n\n @Watch('contentSelector')\n handleContentSelector() {\n if (!this.contentSelector) this.contentEle = null;\n else\n this.contentEle = (this.host.ownerDocument as Document).querySelector(\n this.contentSelector\n );\n }\n\n /**\n * Emitted when the drawer opens. Calling `event.preventDefault()` will prevent it from being opened.\n */\n @Event() nanoShow: EventEmitter;\n\n /**\n * Emitted after the drawer opens and all transitions are complete.\n */\n @Event() nanoAfterShow: EventEmitter;\n\n /**\n * Emitted when the drawer closes. Calling `event.preventDefault()` will prevent it from being closed.\n */\n @Event() nanoHide: EventEmitter;\n\n /**\n * Emitted after the drawer closes and all transitions are complete.\n */\n @Event() nanoAfterHide: EventEmitter;\n\n /**\n * Emitted when the overlay is clicked. Calling `event.preventDefault()` will prevent the drawer from closing.\n */\n @Event() nanoOverlayDismiss: EventEmitter;\n\n connectedCallback() {\n this.handleCloseClick = this.handleCloseClick.bind(this);\n this.handleTransitionEnd = this.handleTransitionEnd.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleOverlayClick = this.handleOverlayClick.bind(this);\n this.handleSlotChange = this.handleSlotChange.bind(this);\n\n this.modal = new Modal(this.host);\n }\n\n componentWillLoad() {\n // Show on init if open\n if (this.open) {\n this.show();\n }\n this.handleContentSelector();\n }\n\n disconnectedCallback() {\n unlockBodyScrolling(this.host);\n }\n\n /** Shows the drawer */\n @Method()\n async show() {\n // Prevent subsequent calls to the method, whether manually or triggered by the `open` watcher\n if (this.isVisible) {\n return;\n }\n\n const nanoShow = this.nanoShow.emit();\n if (nanoShow.defaultPrevented) {\n this.open = false;\n return;\n }\n\n this.isVisible = true;\n this.open = true;\n\n // Lock body scrolling only if the drawer isn't contained\n if (!this.contained) {\n this.modal.activate();\n lockBodyScrolling(this.host);\n }\n\n if (!this.contentEle || (this.type !== 'push' && this.type !== 'reveal'))\n return;\n this.contentEle.style.right = '0';\n this.contentEle.style.transition = 'all ease 250ms';\n this.contentEle.style.position = 'relative';\n this.contentEle.style.overflow = 'hidden';\n setTimeout((_) => (this.contentEle.style.right = '25rem'), 0);\n }\n\n /** Hides the drawer */\n @Method()\n async hide() {\n // Prevent subsequent calls to the method, whether manually or triggered by the `open` watcher\n if (!this.isVisible) {\n return;\n }\n\n const nanoHide = this.nanoHide.emit();\n if (nanoHide.defaultPrevented) {\n this.open = true;\n return;\n }\n\n this.open = false;\n this.modal.deactivate();\n\n unlockBodyScrolling(this.host);\n\n if (!this.contentEle) return;\n this.contentEle.style.transition = '';\n this.contentEle.style.position = '';\n this.contentEle.style.overflow = '';\n this.contentEle.style.right = '';\n }\n\n private handleCloseClick() {\n this.hide();\n }\n\n private handleKeyDown(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n this.hide();\n }\n }\n\n private handleOverlayClick() {\n const slOverlayDismiss = this.nanoOverlayDismiss.emit();\n\n if (!slOverlayDismiss.defaultPrevented) {\n this.hide();\n }\n }\n\n private handleSlotChange() {\n this.hasFooter = !!this.host.querySelector('[slot=\"footer\"]');\n }\n\n private handleTransitionEnd(event: TransitionEvent) {\n const target = event.target as HTMLElement;\n\n // Ensure we only emit one event when the target element is no longer visible\n if (\n event.propertyName === 'transform' &&\n target.classList.contains('drawer__panel')\n ) {\n this.isVisible = this.open;\n this.open ? this.nanoAfterShow.emit() : this.nanoAfterHide.emit();\n\n if (this.open) {\n this.panel.focus();\n }\n }\n }\n\n render() {\n const placementClass = 'drawer--' + this.placement;\n const typeClass = 'drawer--' + this.type;\n\n return (\n <Host>\n <div\n part=\"base\"\n class={{\n drawer: true,\n 'drawer--open': this.open,\n 'drawer--visible': this.isVisible,\n [typeClass]: true,\n [placementClass]: true,\n 'drawer--contained': this.contained,\n 'drawer--fixed': !this.contained,\n 'drawer--has-footer': this.hasFooter,\n }}\n onKeyDown={this.handleKeyDown}\n onTransitionEnd={this.handleTransitionEnd}\n >\n <div\n part=\"overlay\"\n class=\"drawer__overlay\"\n onClick={this.handleOverlayClick}\n />\n\n <div\n ref={(el) => (this.panel = el)}\n part=\"panel\"\n class=\"drawer__panel\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-hidden={this.open ? 'false' : 'true'}\n aria-label={this.noHeader ? this.label : null}\n aria-labelledby={\n !this.noHeader ? `${this.componentId}-title` : null\n }\n tabIndex={0}\n >\n {!this.noHeader && (\n <header part=\"header\" class=\"drawer__header\">\n <span\n part=\"title\"\n class=\"drawer__title\"\n id={`${this.componentId}-title`}\n >\n <slot name=\"label\">\n {/* If there's no label, use an invisible character to prevent the heading from collapsing */}\n {this.label || String.fromCharCode(65279)}\n </slot>\n </span>\n {/* <sl-icon-button part=\"close-button\" class=\"drawer__close\" name=\"x\" onClick={this.handleCloseClick} /> */}\n </header>\n )}\n\n <div part=\"body\" class=\"drawer__body\">\n <slot />\n </div>\n\n <footer part=\"footer\" class=\"drawer__footer\">\n <slot name=\"footer\" onSlotchange={this.handleSlotChange} />\n </footer>\n </div>\n </div>\n </Host>\n );\n }\n}\n"],"version":3}
|
1
|
+
{"file":"nano-drawer.entry.js","mappings":";;;;;;;;;;;;;AAAA,MAAM,SAAS,GAAG,4mIAA4mI;;MC8CjnI,MAAM;;;;;;;;;IA+NT,0BAAqB,GAAG,CAAC,KAAoB;;MAEnD,IAAI,IAAI,CAAC,SAAS,EAAE;QAClB,OAAO;OACR;MAED,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE;QAChE,KAAK,CAAC,wBAAwB,EAAE,CAAC;QACjC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;OAC/B;KACF,CAAC;IAEM,wBAAmB,GAAG,CAAC,KAAsB;MACnD,IACE,KAAK,CAAC,YAAY,KAAK,SAAS;QAChC,KAAK;WACF,YAAY,EAAE;WACd,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,EAC/D;QACA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;UACd,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC;;UAE1B,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC;UAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;SAC3B;QACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;OACnE;KACF,CAAC;IAEM,qBAAgB,GAAG;MACzB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;KAC/C,CAAC;qBAtOmB,KAAK;;gBASM,KAAK;;qBAUnC,KAAK;qBAM8B,KAAK;oBAMN,KAAK;;uBAMH,UAAU;yBAGxB,KAAK;iBAGb,KAAK;;EAzDrB,IAAI,KAAK;IACP,OAAO,IAAI,CAAC,MAAM,CAAC;GACpB;EACD,IAAI,KAAK,CAAC,GAAgB;IACxB,IAAI,IAAI,CAAC,MAAM,EAAE;MACf,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,cAAc,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;KAC1E;IACD,IAAI,CAAC,GAAG;MAAE,OAAO;IAEjB,GAAG,CAAC,gBAAgB,CAAC,eAAe,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAChE,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;GACnB;EAiDD,iBAAiB;IACf,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;MACvE,OAAO;IACT,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;GAClC;;EAgCD,MAAM,IAAI;IACR,IAAI,IAAI,CAAC,IAAI;MAAE,OAAO,SAAS,CAAC;IAEhC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACjB,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;GACjD;;EAID,MAAM,IAAI;IACR,IAAI,CAAC,IAAI,CAAC,IAAI;MAAE,OAAO,SAAS,CAAC;IAEjC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;IAClB,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;GACjD;EAEO,YAAY,CAAC,MAA+C;IAClE,MAAM,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAE/D,IAAI,gBAAgB,CAAC,gBAAgB,IAAI,IAAI,CAAC,aAAa,EAAE;MAC3D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;MACtB,UAAU,CAAC,OAAO,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;MAChD,OAAO;KACR;IAED,IAAI,CAAC,IAAI,EAAE,CAAC;GACb;;EAKD,mBAAmB;IACjB,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;MAChC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;MACtB,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KAC9B;IAED,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE;MAC/B,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;MACxB,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KAChC;GACF;EAGD,MAAM,gBAAgB;IACpB,IAAI,IAAI,CAAC,IAAI,EAAE;;MAEb,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;MACrB,IAAI,CAAC,gBAAgB,EAAE,CAAC;MACxB,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC,aAA4B,CAAC;;MAG7D,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;QACnB,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACtB,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;OAC9B;;;;MAKD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;MAC/D,IAAI,eAAe,EAAE;QACnB,eAAe,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;OAC9C;MACD,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;;MAG3B,qBAAqB,CAAC;QACpB,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;QAEtD,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,EAAE;;UAEtC,IAAI,eAAe,EAAE;YAClB,eAAoC,CAAC,KAAK,CAAC;cAC1C,aAAa,EAAE,IAAI;aACpB,CAAC,CAAC;WACJ;eAAM;YACL,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;WAC3C;SACF;;QAGD,IAAI,eAAe,EAAE;UACnB,eAAe,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;SAC/C;OACF,CAAC,CAAC;MAEH,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;MAC1B,OAAO;KACR;;IAGD,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IACrB,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAE3B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;MACnB,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;MACxB,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KAChC;;IAGD,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC;IACrC,IAAI,QAAO,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,KAAK,CAAA,KAAK,UAAU,EAAE;MACxC,UAAU,CAAC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;KACnC;GACF;;EAIO,gBAAgB;IACtB,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;GAClE;EAEO,mBAAmB;IACzB,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;GACrE;;EAqCD,iBAAiB;IACf,IAAI,CAAC,iBAAiB,EAAE,CAAC;IACzB,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;GACnC;EAED,oBAAoB;IAClB,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;GAChC;EAED,iBAAiB;IACf,IAAI,CAAC,gBAAgB,EAAE,CAAC;;IAExB,IAAI,IAAI,CAAC,IAAI;MAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,IAAI,CAAC,OAAO;MACd,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;GACvE;EAED,gBAAgB;IACd,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;IAEhC,IAAI,IAAI,CAAC,IAAI,EAAE;MACb,IAAI,CAAC,gBAAgB,EAAE,CAAC;MAExB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;QACnB,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACtB,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;OAC9B;KACF;GACF;EAED,MAAM;IACJ,QACE,WACE,GAAG,EAAE,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,EACjC,IAAI,EAAC,MAAM,EACX,KAAK,EAAE;QACL,MAAM,EAAE,IAAI;QACZ,cAAc,EAAE,IAAI,CAAC,IAAI;QACzB,CAAC,WAAW,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI;QACnC,mBAAmB,EAAE,IAAI,CAAC,SAAS;QACnC,eAAe,EAAE,CAAC,IAAI,CAAC,SAAS;QAChC,oBAAoB,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC;QAClD,oBAAoB,EAAE,CAAC,IAAI,CAAC,QAAQ;QACpC,mBAAmB,EAAE,IAAI,CAAC,SAAS;OACpC,IAED,WACE,GAAG,EAAE,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,EAClC,IAAI,EAAC,SAAS,EACd,KAAK,EAAC,iBAAiB,EACvB,OAAO,EAAE,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,EAC3C,QAAQ,EAAC,IAAI,GACb,EAEF,WACE,GAAG,EAAE,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,EAChC,IAAI,EAAC,OAAO,EACZ,KAAK,EAAC,eAAe,EACrB,IAAI,EAAC,QAAQ,gBACF,MAAM,iBACJ,IAAI,CAAC,IAAI,GAAG,OAAO,GAAG,MAAM,gBAC7B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,GAAG,SAAS,qBACjC,CAAC,IAAI,CAAC,QAAQ,GAAG,OAAO,GAAG,SAAS,EACrD,QAAQ,EAAC,GAAG,IAEZ,WAAK,KAAK,EAAC,cAAc,IACtB,CAAC,IAAI,CAAC,QAAQ,KACb,wBACE,cAAQ,IAAI,EAAC,QAAQ,EAAC,KAAK,EAAC,gBAAgB,IAC1C,UAAI,IAAI,EAAC,OAAO,EAAC,KAAK,EAAC,eAAe,EAAC,EAAE,EAAC,OAAO,IAE/C,YAAM,IAAI,EAAC,OAAO,IACf,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;QAClB,IAAI,CAAC,KAAK;QACV,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CACzB,CACJ,EACL,WAAK,IAAI,EAAC,gBAAgB,EAAC,KAAK,EAAC,wBAAwB,IACvD,YAAM,IAAI,EAAC,gBAAgB,GAAG,EAE7B,CAAC,IAAI,CAAC,aAAa,KAClB,wBACE,IAAI,EAAC,cAAc,EACnB,WAAW,EAAC,yBAAyB,EACrC,KAAK,EAAC,eAAe,EACrB,QAAQ,EAAC,aAAa,EACtB,KAAK,EAAC,OAAO,EACb,OAAO,EAAE,MAAM,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,GAChD,CACH,CACG,CACC,CACI,CAChB,EAED,WAAK,IAAI,EAAC,MAAM,EAAC,KAAK,EAAC,cAAc,IACnC,eAAQ,CACJ,EAEN,oBAAc,QAAQ,EAAC,QAAQ,IAC7B,cAAQ,IAAI,EAAC,QAAQ,EAAC,KAAK,EAAC,gBAAgB,IAC1C,YAAM,IAAI,EAAC,QAAQ,EAAC,YAAY,EAAE,IAAI,CAAC,gBAAgB,GAAI,CACpD,CACI,CACX,CACF,CACF,EACN;GACH;;;;;;;;;;;;","names":[],"sources":["./src/components/drawer/drawer.scss?tag=nano-drawer&encapsulation=shadow","./src/components/drawer/drawer.tsx"],"sourcesContent":["@use 'sass:map';\n@use '../../global/style/utilities/mixins' as mx;\n@use '../../global/style/nano-theme/base' as base;\n@use '../../global/style/utilities/globals' as global;\n@use '../../global/style/nano-theme/colours' as color;\n@use '../../global/style/nano-theme/layers' as layer;\n\n:host {\n /**\n * @prop --size: The preferred size of the drawer; width or height depending on placement. Note that the drawer will shrink to accommodate smaller screens. Defaults to 25rem\n * @prop --panel-background: background color of panel. Default to 'white'\n * @prop --panel-shadow: Defaults to #{layer.$layer-shadow-xlarge};\n * @prop --scrim-color: overlay colour of alert display. Defaults to #{layer.$layer-overlay-dark};\n * @prop --footer-background: Defaults to #{map.get(color.$colors, lightgrey)};\n * @prop --header-spacing: The amount of padding to use for the header.\n * @prop --body-spacing: The amount of padding to use for the body.\n * @prop --footer-spacing: The amount of padding to use for the footer. Defaults to #{base.$spacing-medium} #{base.$spacing-large}\n * @prop --header-button-color: defaults to #{map.get(color.$colors, palegrey)};\n */\n\n --size: 25rem;\n --panel-background: white;\n --panel-shadow: #{layer.$layer-shadow-xlarge};\n --scrim-color: #{layer.$layer-overlay-dark};\n --header-button-color: #{map.get(color.$colors, palegrey)};\n --footer-background: #{map.get(color.$colors, lightgrey)};\n --header-background: var(--panel-background);\n --header-spacing: #{base.$spacing-large};\n --body-spacing: #{base.$spacing-large};\n --footer-spacing: #{base.$spacing-medium} #{base.$spacing-large};\n --dir: 1;\n}\n\n@include mx.rtl-host() {\n --dir: -1;\n}\n\n.drawer {\n inset-block-start: 0;\n inset-inline-start: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n overflow: hidden;\n\n &--contained {\n position: absolute;\n z-index: initial;\n }\n\n &--fixed {\n position: fixed;\n z-index: #{layer.$layer-index-modal};\n }\n}\n\n.drawer__panel {\n position: absolute;\n z-index: 2;\n max-width: 100%;\n max-height: 100%;\n background-color: var(--panel-background);\n box-shadow: var(--panel-shadow);\n pointer-events: all;\n transition: #{base.$transition-fast} opacity, #{base.$transition-fast} transform;\n display: flex;\n flex-direction: column;\n\n @media (forced-colors: active) {\n border: solid 1px #{map.get(color.$colors, black)};\n }\n\n &:focus {\n outline: none;\n }\n\n .drawer--nodismiss & {\n animation: cannotClose 0.25s ease-in-out 1;\n\n @keyframes cannotClose {\n 0% {\n transform: scale(1);\n }\n\n 50% {\n transform: scale(1.08);\n }\n\n 100% {\n transform: scale(1);\n }\n }\n }\n\n .drawer--top & {\n inset-block: 0 auto;\n inset-inline-end: auto;\n inset-inline-start: 0;\n width: 100%;\n height: var(--size);\n opacity: 0;\n transform: translateY(-100%);\n }\n\n .drawer--bottom & {\n inset-block: auto 0;\n inset-inline-end: auto;\n inset-inline-start: 0;\n width: 100%;\n height: var(--size);\n opacity: 0;\n transform: translateY(100%);\n }\n\n .drawer--top.drawer--open &,\n .drawer--bottom.drawer--open & {\n opacity: 1;\n transform: translateY(0);\n }\n\n .drawer--start & {\n inset-block: 0 auto;\n inset-inline-end: auto;\n inset-inline-start: 0;\n width: var(--size);\n height: 100%;\n opacity: 0;\n transform: translateX(calc(var(--dir) * -100%));\n }\n\n .drawer--end & {\n inset-block: 0 auto;\n inset-inline-end: 0;\n inset-inline-start: auto;\n width: var(--size);\n height: 100%;\n opacity: 0;\n transform: translateX(calc(var(--dir) * 100%));\n }\n\n .drawer--start.drawer--open &,\n .drawer--end.drawer--open & {\n opacity: 1;\n transform: translateX(0);\n }\n}\n\n.drawer__header {\n inline-size: 100%;\n display: flex;\n background-color: var(--header-background);\n\n [stuck] & {\n box-shadow: #{layer.$layer-shadow-medium};\n }\n}\n\n.drawer__title {\n flex: 1 1 auto;\n font: inherit;\n font-size: #{base.$fontsize-large};\n line-height: 1.2;\n padding: var(--header-spacing);\n margin: 0;\n}\n\n.drawer__header-actions {\n flex-shrink: 0;\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: #{base.$spacing-xsmall};\n padding: 0 var(--header-spacing);\n\n .drawer__close,\n ::slotted(nano-icon-button) {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n font-size: #{base.$fontsize-xlarge};\n\n --color: var(--header-button-color);\n }\n}\n\n.drawer__main {\n display: flex;\n flex-direction: column;\n overflow: auto;\n -webkit-overflow-scrolling: touch;\n flex: 1 1 auto;\n}\n\n.drawer__body {\n display: block;\n flex: 1 1 auto;\n padding: var(--body-spacing);\n padding-block: 0 var(--body-spacing);\n padding-inline: var(--body-spacing);\n\n .drawer:not(.drawer--has-header) & {\n padding-block-start: var(--body-spacing);\n }\n}\n\n.drawer__footer {\n inline-size: 100%;\n text-align: end;\n padding: var(--footer-spacing);\n background: var(--footer-background);\n inset-block-start: 1px;\n position: relative;\n\n ::slotted(button:not(:last-of-type)) {\n margin-inline-end: #{base.$spacing-xsmall};\n }\n\n .drawer:not(.drawer--has-footer) & {\n display: none;\n }\n}\n\n.drawer__overlay {\n display: block;\n position: fixed;\n inset: 0;\n background-color: var(--scrim-color);\n pointer-events: all;\n backdrop-filter: blur(#{layer.$layer-overlay-blur});\n opacity: 0;\n transition: #{base.$transition-fast} opacity;\n\n .drawer--open & {\n opacity: 1;\n }\n\n .drawer--contained & {\n display: none;\n }\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n Prop,\n State,\n Watch,\n h,\n ComponentInterface,\n Method,\n} from '@stencil/core';\nimport Modal from '../../utils/modal';\nimport { lockBodyScrolling, unlockBodyScrolling } from '../../utils/scroll';\nimport { hasSlot } from '../../utils/slot';\nimport { waitForEvent } from '../../utils/events';\nimport {\n ComponentStore,\n StorageMethods,\n} from '../../utils/store/component-store';\n\n/**\n * Drawers slide in from a container to expose additional options and information.\n *\n * @slot - The drawer's main content\n * @slot label - The drawer's label. Alternatively, you can use the `label` attribute\n * @slot header-actions - Optional actions to add to the header. Works best with `<nano-icon-button>`\n * @slot footer - The drawer's footer, usually one or more buttons representing various options\n *\n * @part base - The component's base wrapper\n * @part overlay - The overlay that covers the screen behind the drawer\n * @part panel - The drawer's panel (where the drawer and its content are rendered)\n * @part header - The drawer's header. This element wraps the title and header actions\n * @part header-actions - Optional actions to add to the header. Works best with `<nano-icon-button>`\n * @part title - The drawer's title\n * @part close-button - The close button, an `<nano-icon-button>`\n * @part close-button__base - The close button's exported `base` part\n * @part body - The drawer's body\n * @part footer - The drawer's footer\n */\n\n@Component({\n tag: 'nano-drawer',\n shadow: true,\n styleUrl: 'drawer.scss',\n})\nexport class Drawer implements ComponentInterface {\n // Private State\n\n @Element() host: HTMLNanoDrawerElement;\n\n private originalTrigger: HTMLElement | null;\n private drawer: HTMLElement;\n private overlay: HTMLElement;\n private modal: Modal;\n\n get panel() {\n return this._panel;\n }\n set panel(ele: HTMLElement) {\n if (this._panel) {\n this.panel.removeEventListener('animationend', this.handleTransitionEnd);\n }\n if (!ele) return;\n\n ele.addEventListener('transitionend', this.handleTransitionEnd);\n this._panel = ele;\n }\n private _panel: HTMLElement;\n\n @State() noDismiss = false;\n @State() hasFooter: boolean;\n\n // Public API\n\n /**\n * Indicates whether or not the drawer is open. You can toggle this attribute to show and hide the drawer, or you can\n * use the `show()` and `hide()` methods and this attribute will reflect the drawer's open state.\n */\n @Prop({ reflect: true }) open = false;\n\n /**\n * The drawer's label as displayed in the header. You should always include a relevant label even when using\n * `no-header`, as it is required for proper accessibility. If you need to display HTML, use the `label` slot instead.\n */\n @Prop({ reflect: true }) label!: string;\n\n /** The direction from which the drawer will open. */\n @Prop({ reflect: true }) placement: 'top' | 'end' | 'bottom' | 'start' =\n 'end';\n\n /**\n * By default, the drawer slides out of its containing block (usually the viewport). To make the drawer slide out of\n * its parent element, set this attribute and add `position: relative` to the parent.\n */\n @Prop({ reflect: true }) contained = false;\n\n /**\n * Removes the header. This will also remove the default close button, so please ensure you provide an easy,\n * accessible way for users to dismiss the drawer.\n */\n @Prop({ reflect: true }) noHeader = false;\n\n /** Store search queries (against this ID) to the component store. Use in conjunction with storeMethod */\n @Prop() storeId?: string;\n\n /** The method of storage. Either session storage, url hash (after the '#') or url query (after the '?'). */\n @Prop() storeMethod: StorageMethods = 'url-hash';\n\n /** An alternative to `preventDefault()` on the `nanoRequestClose` event. This will hide the close button and disable clicks on the overlay or presses the `Escape` key */\n @Prop() noUserDismiss = false;\n\n /** Relocate the dialog to the root of the DOM. Useful for elements bound via css `transform: ...` */\n @Prop() hoist = false;\n\n @Watch('hoist')\n handleHoistChange() {\n if (!this.hoist || Array.from(document.body.children).includes(this.host))\n return;\n document.body.prepend(this.host);\n }\n\n /** Emitted when the drawer opens. */\n @Event() nanoShow: EventEmitter;\n\n /** Emitted when the drawer closes. */\n @Event() nanoHide: EventEmitter;\n\n /** Emitted after the drawer closes and all animations are complete. */\n @Event() nanoAfterHide: EventEmitter;\n\n /** Emitted after the drawer opens and all animations are complete. */\n @Event() nanoAfterShow: EventEmitter;\n\n /**\n * Emitted when the drawer opens and is ready to receive focus. Calling\n * `event.preventDefault()` will prevent focusing and allow you to set it on a different element, such as an input.\n */\n @Event() nanoInitialFocus: EventEmitter;\n\n /**\n * Emitted when the user attempts to\n * close the drawer by clicking the close button, clicking the overlay, or pressing escape. Calling\n * `event.preventDefault()` will keep the drawer open. Avoid using this unless closing the drawer will result in\n * destructive behavior such as data loss.\n */\n @Event() nanoRquestClose: EventEmitter<{\n source: 'close-button' | 'keyboard' | 'overlay';\n }>;\n\n /** Shows the drawer. */\n @Method()\n async show() {\n if (this.open) return undefined;\n\n this.open = true;\n return waitForEvent(this.host, 'nanoAfterShow');\n }\n\n /** Hides the drawer */\n @Method()\n async hide() {\n if (!this.open) return undefined;\n\n this.open = false;\n return waitForEvent(this.host, 'nanoAfterHide');\n }\n\n private requestClose(source: 'close-button' | 'keyboard' | 'overlay') {\n const nanoRequestClose = this.nanoRquestClose.emit({ source });\n\n if (nanoRequestClose.defaultPrevented || this.noUserDismiss) {\n this.noDismiss = true;\n setTimeout(() => (this.noDismiss = false), 250);\n return;\n }\n\n this.hide();\n }\n\n // Prop Change Handlers\n\n @Watch('contained')\n handleNoModalChange() {\n if (this.open && !this.contained) {\n this.modal.activate();\n lockBodyScrolling(this.host);\n }\n\n if (this.open && this.contained) {\n this.modal.deactivate();\n unlockBodyScrolling(this.host);\n }\n }\n\n @Watch('open')\n async handleOpenChange() {\n if (this.open) {\n // Show\n this.nanoShow.emit();\n this.addOpenListeners();\n this.originalTrigger = document.activeElement as HTMLElement;\n\n // Lock body scrolling only if the drawer isn't contained\n if (!this.contained) {\n this.modal.activate();\n lockBodyScrolling(this.host);\n }\n\n // When the drawer is shown, Safari will attempt to set focus on whatever element has autofocus. This causes the\n // drawer's animation to jitter, so we'll temporarily remove the attribute, call `focus({ preventScroll: true })`\n // ourselves, and add the attribute back afterwards.\n const autoFocusTarget = this.host.querySelector('[autofocus]');\n if (autoFocusTarget) {\n autoFocusTarget.removeAttribute('autofocus');\n }\n this.drawer.hidden = false;\n\n // Set initial focus\n requestAnimationFrame(() => {\n const nanoInitialFocus = this.nanoInitialFocus.emit();\n\n if (!nanoInitialFocus.defaultPrevented) {\n // Set focus to the autofocus target and restore the attribute\n if (autoFocusTarget) {\n (autoFocusTarget as HTMLInputElement).focus({\n preventScroll: true,\n });\n } else {\n this.panel.focus({ preventScroll: true });\n }\n }\n\n // Restore the autofocus attribute\n if (autoFocusTarget) {\n autoFocusTarget.setAttribute('autofocus', '');\n }\n });\n\n this.nanoAfterShow.emit();\n return;\n }\n\n // Hide\n this.nanoHide.emit();\n this.removeOpenListeners();\n\n if (!this.contained) {\n this.modal.deactivate();\n unlockBodyScrolling(this.host);\n }\n\n // Restore focus to the original trigger\n const trigger = this.originalTrigger;\n if (typeof trigger?.focus === 'function') {\n setTimeout(() => trigger.focus());\n }\n }\n\n // Event Handling\n\n private addOpenListeners() {\n document.addEventListener('keydown', this.handleDocumentKeyDown);\n }\n\n private removeOpenListeners() {\n document.removeEventListener('keydown', this.handleDocumentKeyDown);\n }\n\n private handleDocumentKeyDown = (event: KeyboardEvent) => {\n // Contained drawers aren't modal and don't response to the escape key\n if (this.contained) {\n return;\n }\n\n if (event.key === 'Escape' && this.modal.isActive() && this.open) {\n event.stopImmediatePropagation();\n this.requestClose('keyboard');\n }\n };\n\n private handleTransitionEnd = (event: TransitionEvent) => {\n if (\n event.propertyName === 'opacity' &&\n event\n .composedPath()\n .find((node) => node === this.panel || node === this.overlay)\n ) {\n if (!this.open) {\n this.drawer.hidden = true;\n // Now that the dialog is hidden, restore the overlay and panel for next time\n this.overlay.hidden = false;\n this.panel.hidden = false;\n }\n this.open ? this.nanoAfterShow.emit() : this.nanoAfterHide.emit();\n }\n };\n\n private handleSlotChange = () => {\n this.hasFooter = hasSlot(this.host, 'footer');\n };\n\n // Component Lifecycle\n\n connectedCallback() {\n this.handleHoistChange();\n this.modal = new Modal(this.host);\n }\n\n disconnectedCallback() {\n unlockBodyScrolling(this.host);\n }\n\n componentWillLoad() {\n this.handleSlotChange();\n // Show on init if open\n if (this.open) this.show();\n if (this.storeId)\n ComponentStore.init(this, ['open'], this.storeMethod, this.storeId);\n }\n\n componentDidLoad() {\n this.drawer.hidden = !this.open;\n\n if (this.open) {\n this.addOpenListeners();\n\n if (!this.contained) {\n this.modal.activate();\n lockBodyScrolling(this.host);\n }\n }\n }\n\n render() {\n return (\n <div\n ref={(ele) => (this.drawer = ele)}\n part=\"base\"\n class={{\n drawer: true,\n 'drawer--open': this.open,\n [`drawer--${this.placement}`]: true,\n 'drawer--contained': this.contained,\n 'drawer--fixed': !this.contained,\n 'drawer--has-footer': hasSlot(this.host, 'footer'),\n 'drawer--has-header': !this.noHeader,\n 'drawer--nodismiss': this.noDismiss,\n }}\n >\n <div\n ref={(ele) => (this.overlay = ele)}\n part=\"overlay\"\n class=\"drawer__overlay\"\n onClick={() => this.requestClose('overlay')}\n tabindex=\"-1\"\n />\n\n <div\n ref={(ele) => (this.panel = ele)}\n part=\"panel\"\n class=\"drawer__panel\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-hidden={this.open ? 'false' : 'true'}\n aria-label={this.noHeader ? this.label : undefined}\n aria-labelledby={!this.noHeader ? 'title' : undefined}\n tabindex=\"0\"\n >\n <div class=\"drawer__main\">\n {!this.noHeader && (\n <nano-sticker>\n <header part=\"header\" class=\"drawer__header\">\n <h2 part=\"title\" class=\"drawer__title\" id=\"title\">\n {/* If there's no label, use an invisible character to prevent the header from collapsing */}\n <slot name=\"label\">\n {this.label.length > 0\n ? this.label\n : String.fromCharCode(65279)}\n </slot>\n </h2>\n <div part=\"header-actions\" class=\"drawer__header-actions\">\n <slot name=\"header-actions\" />\n\n {!this.noUserDismiss && (\n <nano-icon-button\n part=\"close-button\"\n exportparts=\"base:close-button__base\"\n class=\"drawer__close\"\n iconName=\"light/times\"\n label=\"Close\"\n onClick={() => this.requestClose('close-button')}\n />\n )}\n </div>\n </header>\n </nano-sticker>\n )}\n\n <div part=\"body\" class=\"drawer__body\">\n <slot />\n </div>\n\n <nano-sticker position=\"bottom\">\n <footer part=\"footer\" class=\"drawer__footer\">\n <slot name=\"footer\" onSlotchange={this.handleSlotChange} />\n </footer>\n </nano-sticker>\n </div>\n </div>\n </div>\n );\n }\n}\n"],"version":3}
|
@@ -6,7 +6,7 @@ import { g as getActiveElement } from './active-element-75b7c8a0.js';
|
|
6
6
|
import { P as Popover } from './popover-02e6714d.js';
|
7
7
|
import { a as getNearestTabbableElement } from './tabbable-26a66a22.js';
|
8
8
|
|
9
|
-
const dropdownCss = ":host{box-sizing:border-box}*,*::before,*::after{box-sizing:border-box}[hidden]{display:none !important}:host{--width:auto;--border:var(--nano-layer-border-style, 1px solid var(--nano-layer-border-color, rgba(0, 0, 0, 0.1)));--border-radius:var(--nano-layer-border-radius, var(--nano-border-radius-medium, 4px));--background:var(--nano-layer-bg, #fff);--padding:10px 0;--overflow:auto;--dropdown-z-index:var(--nano-layer-index-dropdown, 300);--min-width:0;--box-shadow:var(--nano-layer-shadow-large, 0 2px 8px rgba(0, 0, 0, 0.2));--menu-height:var(--max-menu-height, 50vh);display:flex}.dropdown{position:relative}.dropdown__trigger{display:block}.dropdown__positioner{position:absolute;z-index:var(--dropdown-z-index);min-inline-size:var(--min-width)}@media (max-width: 35.9375em){.dropdown__positioner{z-index:100}}.dropdown__panel{padding:var(--padding);background:var(--background);min-inline-size:var(--min-width);inline-size:var(--width);border:var(--border);border-radius:var(--border-radius);color:currentcolor;box-shadow:var(--box-shadow);opacity:0;transition:0.2s ease opacity, 0.2s ease transform, 0.2s ease min-block-size;min-block-size:20px;overflow:var(--overflow);box-sizing:content-box !important}.dropdown__panel.loading{overflow-y:hidden}.dropdown__panel.top{transform:translateY(-20px) translateZ(0)}.dropdown__panel.bottom{transform:translateY(20px) translateZ(0)}.dropdown__positioner.popover-visible .dropdown__panel{opacity:1;transform:translateY(0) translateZ(0)}.dropdown__panel ::slotted(nano-menu){max-block-size:var(--menu-height)}.dropdown__accessible-title{clip:rect(1px, 1px, 1px, 1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);block-size:1px;inline-size:1px;margin:-1px;overflow:hidden;padding:0;position:absolute}";
|
9
|
+
const dropdownCss = ":host{box-sizing:border-box}*,*::before,*::after{box-sizing:border-box}[hidden]{display:none !important}:host{--width:auto;--border:var(--nano-layer-border-style, 1px solid var(--nano-layer-border-color, rgba(0, 0, 0, 0.1)));--border-radius:var(--nano-layer-border-radius, var(--nano-border-radius-medium, 4px));--background:var(--nano-layer-bg, #fff);--padding:10px 0;--overflow:auto;--dropdown-z-index:var(--nano-layer-index-dropdown, 300);--min-width:0;--box-shadow:var(--nano-layer-shadow-large, 0 2px 8px rgba(0, 0, 0, 0.2));--menu-height:var(--max-menu-height, 50vh);display:flex}.dropdown{position:relative}.dropdown__trigger{display:block}.dropdown__positioner{position:absolute;z-index:var(--dropdown-z-index);min-inline-size:var(--min-width);border:0;background:none;padding:0;overflow:visible}.dropdown__positioner::backdrop{display:none}.dropdown__positioner[popover],.dropdown__positioner:popover-open{inset:unset}@media (max-width: 35.9375em){.dropdown__positioner{z-index:100}}.dropdown__panel{padding:var(--padding);background:var(--background);min-inline-size:var(--min-width);inline-size:var(--width);border:var(--border);border-radius:var(--border-radius);color:currentcolor;box-shadow:var(--box-shadow);opacity:0;transition:0.2s ease opacity, 0.2s ease transform, 0.2s ease min-block-size;min-block-size:20px;overflow:var(--overflow);box-sizing:content-box !important}.dropdown__panel.loading{overflow-y:hidden}.dropdown__panel.top{transform:translateY(-20px) translateZ(0)}.dropdown__panel.bottom{transform:translateY(20px) translateZ(0)}.dropdown__positioner.popover-visible .dropdown__panel{opacity:1;transform:translateY(0) translateZ(0)}.dropdown__panel ::slotted(nano-menu){max-block-size:var(--menu-height)}.dropdown__accessible-title{clip:rect(1px, 1px, 1px, 1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);block-size:1px;inline-size:1px;margin:-1px;overflow:hidden;padding:0;position:absolute}";
|
10
10
|
|
11
11
|
let dropDownIds = 0;
|
12
12
|
const Dropdown = class {
|
@@ -107,6 +107,7 @@ const Dropdown = class {
|
|
107
107
|
// Methods
|
108
108
|
/** Shows the dropdown panel */
|
109
109
|
async show() {
|
110
|
+
var _a;
|
110
111
|
this.ignoreOpenWatcher = true;
|
111
112
|
this.open = true;
|
112
113
|
const nanoShow = this.nanoShow.emit();
|
@@ -116,12 +117,18 @@ const Dropdown = class {
|
|
116
117
|
return;
|
117
118
|
}
|
118
119
|
this.popover.show();
|
120
|
+
// @ts-expect-error
|
121
|
+
if (typeof ((_a = this.positioner) === null || _a === void 0 ? void 0 : _a.showPopover) === 'function') {
|
122
|
+
// @ts-expect-error
|
123
|
+
this.positioner.showPopover();
|
124
|
+
}
|
119
125
|
this.ignoreOpenWatcher = false;
|
120
126
|
document.addEventListener('mousedown', this.handleDocumentMouseDown);
|
121
127
|
document.addEventListener('keydown', this.handleDocumentKeyDown);
|
122
128
|
}
|
123
129
|
/** Hides the dropdown panel */
|
124
130
|
async hide() {
|
131
|
+
var _a;
|
125
132
|
this.ignoreOpenWatcher = true;
|
126
133
|
this.open = false;
|
127
134
|
const nanoHide = this.nanoHide.emit();
|
@@ -133,6 +140,11 @@ const Dropdown = class {
|
|
133
140
|
if (this.popover)
|
134
141
|
this.popover.hide();
|
135
142
|
this.ignoreOpenWatcher = false;
|
143
|
+
// @ts-expect-error
|
144
|
+
if (typeof ((_a = this.positioner) === null || _a === void 0 ? void 0 : _a.hidePopover) === 'function') {
|
145
|
+
// @ts-expect-error
|
146
|
+
this.positioner.hidePopover();
|
147
|
+
}
|
136
148
|
document.removeEventListener('mousedown', this.handleDocumentMouseDown);
|
137
149
|
document.removeEventListener('keydown', this.handleDocumentKeyDown);
|
138
150
|
if (this.accessibleTrigger && this.focusEleInDropDwn()) {
|
@@ -272,7 +284,9 @@ const Dropdown = class {
|
|
272
284
|
return (h("div", { part: "base", id: this.dropdownId, class: {
|
273
285
|
dropdown: true,
|
274
286
|
'dropdown--open': this.open,
|
275
|
-
} }, h("span", { part: "trigger", class: "dropdown__trigger", ref: (el) => (this.trigger = el), onKeyDown: this.handleTriggerKeyDown, onClick: this.togglePanel }, h("slot", { name: "trigger", onSlotchange: this.handleTriggerSlotChange })), h("div", { ref: (el) => (this.positioner = el), class: "dropdown__positioner"
|
287
|
+
} }, h("span", { part: "trigger", class: "dropdown__trigger", ref: (el) => (this.trigger = el), onKeyDown: this.handleTriggerKeyDown, onClick: this.togglePanel }, h("slot", { name: "trigger", onSlotchange: this.handleTriggerSlotChange })), h("div", { ref: (el) => (this.positioner = el), class: "dropdown__positioner",
|
288
|
+
// @ts-ignore
|
289
|
+
popover: "manual", id: this.dropdownId + '-positioner' }, h("div", { ref: (el) => (this.panel = el), part: "panel", class: `dropdown__panel ${this.placement.split('-').join(' ')}`, "aria-hidden": !this.open, role: this.host.getAttribute('role') === 'group' ? 'group' : 'dialog', "aria-modal": this.host.getAttribute('role') === 'group' ? undefined : 'true', "aria-labelledby": this.dialogTitle ? this.labelId : undefined }, this.dialogTitle && (h("span", { id: this.labelId, class: "dropdown__accessible-title", "aria-live": this.host.getAttribute('role') === 'group'
|
276
290
|
? undefined
|
277
291
|
: 'polite' }, this.dialogTitle)), h("slot", null)))));
|
278
292
|
}
|