@nanoporetech-digital/components 3.2.0 → 3.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 +21 -0
- package/dist/cjs/dom-d7c33f11.js.map +1 -1
- package/dist/cjs/index.cjs.js +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/{modal-f09e431f.js → modal-e4defcc3.js} +3 -3
- package/dist/cjs/{modal-f09e431f.js.map → modal-e4defcc3.js.map} +1 -1
- package/dist/cjs/nano-alert.cjs.entry.js +3 -3
- package/dist/cjs/nano-alert.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-algolia.cjs.entry.js +1 -1
- package/dist/cjs/nano-algolia.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-aspect-ratio.cjs.entry.js +1 -1
- package/dist/cjs/nano-aspect-ratio.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-checkbox-group.cjs.entry.js +1 -1
- package/dist/cjs/nano-checkbox-group.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-checkbox.cjs.entry.js +1 -1
- package/dist/cjs/nano-checkbox.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-components.cjs.js +1 -1
- package/dist/cjs/nano-datalist_3.cjs.entry.js +2 -2
- package/dist/cjs/nano-datalist_3.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-date-input.cjs.entry.js +1 -1
- package/dist/cjs/nano-date-input.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-date-picker.cjs.entry.js +1 -1
- package/dist/cjs/nano-date-picker.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-details.cjs.entry.js +1 -1
- package/dist/cjs/nano-details.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-dialog.cjs.entry.js +3 -3
- package/dist/cjs/nano-dialog.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-drawer.cjs.entry.js +3 -3
- package/dist/cjs/nano-drawer.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-dropdown.cjs.entry.js +2 -2
- package/dist/cjs/nano-dropdown.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-file-upload.cjs.entry.js +1 -1
- package/dist/cjs/nano-file-upload.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-global-nav-user-profile_3.cjs.entry.js +10 -5
- package/dist/cjs/nano-global-nav-user-profile_3.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-global-nav.cjs.entry.js +27 -14
- package/dist/cjs/nano-global-nav.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-global-search-results.cjs.entry.js +1 -1
- package/dist/cjs/nano-global-search-results.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-grid_3.cjs.entry.js +2 -2
- package/dist/cjs/nano-grid_3.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-hero.cjs.entry.js +1 -1
- package/dist/cjs/nano-hero.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-icon-button.cjs.entry.js +1 -1
- package/dist/cjs/nano-icon-button.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-icon.cjs.entry.js +1 -1
- package/dist/cjs/nano-icon.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-input.cjs.entry.js +1 -1
- package/dist/cjs/nano-input.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-menu-drawer.cjs.entry.js +1 -1
- package/dist/cjs/nano-menu-drawer.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-progress-bar.cjs.entry.js +1 -1
- package/dist/cjs/nano-progress-bar.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-range.cjs.entry.js +1 -1
- package/dist/cjs/nano-range.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-rating.cjs.entry.js +1 -1
- package/dist/cjs/nano-rating.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-resize-observe_2.cjs.entry.js +23 -12
- package/dist/cjs/nano-resize-observe_2.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-slide.cjs.entry.js +1 -1
- package/dist/cjs/nano-slide.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-slides.cjs.entry.js +1 -1
- package/dist/cjs/nano-slides.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-spinner.cjs.entry.js +1 -1
- package/dist/cjs/nano-spinner.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-split-pane.cjs.entry.js +1 -1
- package/dist/cjs/nano-split-pane.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-sticker.cjs.entry.js +1 -1
- package/dist/cjs/nano-sticker.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-tab-content.cjs.entry.js +1 -1
- package/dist/cjs/nano-tab-content.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-tab-group.cjs.entry.js +1 -1
- package/dist/cjs/nano-tab-group.cjs.entry.js.map +1 -1
- package/dist/cjs/nano-tab.cjs.entry.js +1 -1
- package/dist/cjs/nano-tab.cjs.entry.js.map +1 -1
- package/dist/cjs/{nano-table-7dbe799c.js → nano-table-2ddb22be.js} +23 -23
- package/dist/cjs/nano-table-2ddb22be.js.map +1 -0
- package/dist/cjs/nano-table.cjs.entry.js +1 -1
- package/dist/cjs/nano-tooltip.cjs.entry.js +1 -1
- package/dist/cjs/nano-tooltip.cjs.entry.js.map +1 -1
- package/dist/cjs/{tabbable-de4c23d8.js → tabbable-bdf10c84.js} +13 -4
- package/dist/cjs/tabbable-bdf10c84.js.map +1 -0
- package/dist/cjs/{table.worker-fe960deb.js → table.worker-ec62a083.js} +2 -2
- package/dist/cjs/table.worker-ec62a083.js.map +1 -0
- package/dist/collection/components/alert/alert.css +16 -56
- package/dist/collection/components/algolia/algolia.css +5 -22
- package/dist/collection/components/aspect-ratio/aspect-ratio.css +2 -4
- package/dist/collection/components/checkbox/checkbox-group.css +8 -19
- package/dist/collection/components/checkbox/checkbox.css +24 -61
- package/dist/collection/components/date-input/date-input.css +8 -29
- package/dist/collection/components/date-picker/date-picker.css +22 -61
- package/dist/collection/components/details/details.css +7 -27
- package/dist/collection/components/dialog/dialog.css +20 -79
- package/dist/collection/components/drawer/drawer.css +13 -42
- package/dist/collection/components/dropdown/dropdown.css +5 -13
- package/dist/collection/components/file-upload/file-upload.css +45 -127
- package/dist/collection/components/global-nav/global-nav.js +26 -13
- package/dist/collection/components/global-nav/global-nav.js.map +1 -1
- package/dist/collection/components/global-nav/style/global-nav.css +138 -298
- package/dist/collection/components/global-search-results/global-search-results.css +81 -248
- package/dist/collection/components/grid/grid.css +21 -76
- package/dist/collection/components/hero/hero.css +22 -63
- package/dist/collection/components/icon/icon.css +2 -5
- package/dist/collection/components/icon-button/icon-button.css +4 -15
- package/dist/collection/components/img/img.css +9 -19
- package/dist/collection/components/input/input.css +34 -148
- package/dist/collection/components/menu/menu.css +1 -2
- package/dist/collection/components/menu-drawer/menu-drawer.css +16 -47
- package/dist/collection/components/nav-item/nav-item.css +73 -147
- package/dist/collection/components/nav-item/nav-item.js +8 -3
- package/dist/collection/components/nav-item/nav-item.js.map +1 -1
- package/dist/collection/components/option/option.css +10 -40
- package/dist/collection/components/progress-bar/progress-bar.css +5 -26
- package/dist/collection/components/range/range.css +20 -56
- package/dist/collection/components/rating/rating.css +9 -28
- package/dist/collection/components/resize-observe/resize-observe.js +38 -12
- package/dist/collection/components/resize-observe/resize-observe.js.map +1 -1
- package/dist/collection/components/select/select.css +56 -210
- package/dist/collection/components/skeleton/skeleton.css +2 -17
- package/dist/collection/components/slides/slide.css +4 -13
- package/dist/collection/components/slides/slides.css +3 -14
- package/dist/collection/components/spinner/spinner.css +34 -122
- package/dist/collection/components/split-pane/split-pane.css +4 -18
- package/dist/collection/components/sticker/sticker.css +8 -18
- package/dist/collection/components/table/table.children.js +10 -10
- package/dist/collection/components/table/table.children.js.map +1 -1
- package/dist/collection/components/table/table.css +87 -41
- package/dist/collection/components/table/table.js +18 -17
- package/dist/collection/components/table/table.js.map +1 -1
- package/dist/collection/components/table/table.service.js +1 -1
- package/dist/collection/components/table/table.service.js.map +1 -1
- package/dist/collection/components/tabs/tab-content.css +11 -59
- package/dist/collection/components/tabs/tab-group.css +20 -77
- package/dist/collection/components/tabs/tab.css +11 -30
- package/dist/collection/components/tooltip/tooltip.css +26 -56
- package/dist/collection/utils/dom.js.map +1 -1
- package/dist/collection/utils/modal.js +1 -1
- package/dist/collection/utils/modal.js.map +1 -1
- package/dist/collection/utils/tabbable.js +12 -3
- package/dist/collection/utils/tabbable.js.map +1 -1
- package/dist/components/algolia.js +1 -1
- package/dist/components/algolia.js.map +1 -1
- package/dist/components/date-picker.js +1 -1
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/dom.js.map +1 -1
- package/dist/components/dropdown.js +1 -1
- package/dist/components/dropdown.js.map +1 -1
- package/dist/components/grid.js +1 -1
- package/dist/components/grid.js.map +1 -1
- package/dist/components/icon-button.js +1 -1
- package/dist/components/icon-button.js.map +1 -1
- package/dist/components/icon.js +1 -1
- package/dist/components/icon.js.map +1 -1
- package/dist/components/img.js +1 -1
- package/dist/components/img.js.map +1 -1
- package/dist/components/input.js +1 -1
- package/dist/components/input.js.map +1 -1
- package/dist/components/menu.js +1 -1
- package/dist/components/menu.js.map +1 -1
- package/dist/components/modal.js +1 -1
- package/dist/components/modal.js.map +1 -1
- package/dist/components/nano-alert.js +1 -1
- package/dist/components/nano-alert.js.map +1 -1
- package/dist/components/nano-aspect-ratio.js +1 -1
- package/dist/components/nano-aspect-ratio.js.map +1 -1
- package/dist/components/nano-checkbox-group.js +1 -1
- package/dist/components/nano-checkbox-group.js.map +1 -1
- package/dist/components/nano-checkbox.js +1 -1
- package/dist/components/nano-checkbox.js.map +1 -1
- package/dist/components/nano-date-input.js +1 -1
- package/dist/components/nano-date-input.js.map +1 -1
- package/dist/components/nano-details.js +1 -1
- package/dist/components/nano-details.js.map +1 -1
- package/dist/components/nano-dialog.js +1 -1
- package/dist/components/nano-dialog.js.map +1 -1
- package/dist/components/nano-drawer.js +1 -1
- package/dist/components/nano-drawer.js.map +1 -1
- package/dist/components/nano-file-upload.js +1 -1
- package/dist/components/nano-file-upload.js.map +1 -1
- package/dist/components/nano-global-nav.js +27 -14
- package/dist/components/nano-global-nav.js.map +1 -1
- package/dist/components/nano-global-search-results.js +1 -1
- package/dist/components/nano-global-search-results.js.map +1 -1
- package/dist/components/nano-hero.js +1 -1
- package/dist/components/nano-hero.js.map +1 -1
- package/dist/components/nano-menu-drawer.js +1 -1
- package/dist/components/nano-menu-drawer.js.map +1 -1
- package/dist/components/nano-range.js +1 -1
- package/dist/components/nano-range.js.map +1 -1
- package/dist/components/nano-rating.js +1 -1
- package/dist/components/nano-rating.js.map +1 -1
- package/dist/components/nano-slide.js +1 -1
- package/dist/components/nano-slide.js.map +1 -1
- package/dist/components/nano-slides.js +1 -1
- package/dist/components/nano-slides.js.map +1 -1
- package/dist/components/nano-split-pane.js +1 -1
- package/dist/components/nano-split-pane.js.map +1 -1
- package/dist/components/nano-tab-content.js +1 -1
- package/dist/components/nano-tab-content.js.map +1 -1
- package/dist/components/nano-tab-group.js +1 -1
- package/dist/components/nano-tab-group.js.map +1 -1
- package/dist/components/nano-tab.js +1 -1
- package/dist/components/nano-tab.js.map +1 -1
- package/dist/components/nano-table.js +21 -21
- package/dist/components/nano-table.js.map +1 -1
- package/dist/components/nav-item.js +9 -4
- package/dist/components/nav-item.js.map +1 -1
- package/dist/components/option.js +1 -1
- package/dist/components/option.js.map +1 -1
- package/dist/components/progress-bar.js +1 -1
- package/dist/components/progress-bar.js.map +1 -1
- package/dist/components/resize-observe.js +23 -13
- package/dist/components/resize-observe.js.map +1 -1
- package/dist/components/select.js +1 -1
- package/dist/components/select.js.map +1 -1
- package/dist/components/skeleton.js +1 -1
- package/dist/components/skeleton.js.map +1 -1
- package/dist/components/spinner.js +1 -1
- package/dist/components/spinner.js.map +1 -1
- package/dist/components/sticker.js +1 -1
- package/dist/components/sticker.js.map +1 -1
- package/dist/components/tabbable.js +12 -3
- package/dist/components/tabbable.js.map +1 -1
- package/dist/components/tooltip.js +1 -1
- package/dist/components/tooltip.js.map +1 -1
- package/dist/custom-elements/index.js +128 -91
- package/dist/custom-elements/index.js.map +1 -1
- package/dist/esm/dom-d3ad49e2.js.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/esm/{modal-215df46b.js → modal-5c9ce466.js} +3 -3
- package/dist/esm/{modal-215df46b.js.map → modal-5c9ce466.js.map} +1 -1
- package/dist/esm/nano-alert.entry.js +3 -3
- package/dist/esm/nano-alert.entry.js.map +1 -1
- package/dist/esm/nano-algolia.entry.js +1 -1
- package/dist/esm/nano-algolia.entry.js.map +1 -1
- package/dist/esm/nano-aspect-ratio.entry.js +1 -1
- package/dist/esm/nano-aspect-ratio.entry.js.map +1 -1
- package/dist/esm/nano-checkbox-group.entry.js +1 -1
- package/dist/esm/nano-checkbox-group.entry.js.map +1 -1
- package/dist/esm/nano-checkbox.entry.js +1 -1
- package/dist/esm/nano-checkbox.entry.js.map +1 -1
- package/dist/esm/nano-components.js +1 -1
- package/dist/esm/nano-datalist_3.entry.js +2 -2
- package/dist/esm/nano-datalist_3.entry.js.map +1 -1
- package/dist/esm/nano-date-input.entry.js +1 -1
- package/dist/esm/nano-date-input.entry.js.map +1 -1
- package/dist/esm/nano-date-picker.entry.js +1 -1
- package/dist/esm/nano-date-picker.entry.js.map +1 -1
- package/dist/esm/nano-details.entry.js +1 -1
- package/dist/esm/nano-details.entry.js.map +1 -1
- package/dist/esm/nano-dialog.entry.js +3 -3
- package/dist/esm/nano-dialog.entry.js.map +1 -1
- package/dist/esm/nano-drawer.entry.js +3 -3
- package/dist/esm/nano-drawer.entry.js.map +1 -1
- package/dist/esm/nano-dropdown.entry.js +2 -2
- package/dist/esm/nano-dropdown.entry.js.map +1 -1
- package/dist/esm/nano-file-upload.entry.js +1 -1
- package/dist/esm/nano-file-upload.entry.js.map +1 -1
- package/dist/esm/nano-global-nav-user-profile_3.entry.js +10 -5
- package/dist/esm/nano-global-nav-user-profile_3.entry.js.map +1 -1
- package/dist/esm/nano-global-nav.entry.js +27 -14
- package/dist/esm/nano-global-nav.entry.js.map +1 -1
- package/dist/esm/nano-global-search-results.entry.js +1 -1
- package/dist/esm/nano-global-search-results.entry.js.map +1 -1
- package/dist/esm/nano-grid_3.entry.js +2 -2
- package/dist/esm/nano-grid_3.entry.js.map +1 -1
- package/dist/esm/nano-hero.entry.js +1 -1
- package/dist/esm/nano-hero.entry.js.map +1 -1
- package/dist/esm/nano-icon-button.entry.js +1 -1
- package/dist/esm/nano-icon-button.entry.js.map +1 -1
- package/dist/esm/nano-icon.entry.js +1 -1
- package/dist/esm/nano-icon.entry.js.map +1 -1
- package/dist/esm/nano-input.entry.js +1 -1
- package/dist/esm/nano-input.entry.js.map +1 -1
- package/dist/esm/nano-menu-drawer.entry.js +1 -1
- package/dist/esm/nano-menu-drawer.entry.js.map +1 -1
- package/dist/esm/nano-progress-bar.entry.js +1 -1
- package/dist/esm/nano-progress-bar.entry.js.map +1 -1
- package/dist/esm/nano-range.entry.js +1 -1
- package/dist/esm/nano-range.entry.js.map +1 -1
- package/dist/esm/nano-rating.entry.js +1 -1
- package/dist/esm/nano-rating.entry.js.map +1 -1
- package/dist/esm/nano-resize-observe_2.entry.js +23 -12
- package/dist/esm/nano-resize-observe_2.entry.js.map +1 -1
- package/dist/esm/nano-slide.entry.js +1 -1
- package/dist/esm/nano-slide.entry.js.map +1 -1
- package/dist/esm/nano-slides.entry.js +1 -1
- package/dist/esm/nano-slides.entry.js.map +1 -1
- package/dist/esm/nano-spinner.entry.js +1 -1
- package/dist/esm/nano-spinner.entry.js.map +1 -1
- package/dist/esm/nano-split-pane.entry.js +1 -1
- package/dist/esm/nano-split-pane.entry.js.map +1 -1
- package/dist/esm/nano-sticker.entry.js +1 -1
- package/dist/esm/nano-sticker.entry.js.map +1 -1
- package/dist/esm/nano-tab-content.entry.js +1 -1
- package/dist/esm/nano-tab-content.entry.js.map +1 -1
- package/dist/esm/nano-tab-group.entry.js +1 -1
- package/dist/esm/nano-tab-group.entry.js.map +1 -1
- package/dist/esm/nano-tab.entry.js +1 -1
- package/dist/esm/nano-tab.entry.js.map +1 -1
- package/dist/esm/{nano-table-93d25a68.js → nano-table-9d4fbd41.js} +23 -23
- package/dist/esm/nano-table-9d4fbd41.js.map +1 -0
- package/dist/esm/nano-table.entry.js +1 -1
- package/dist/esm/nano-tooltip.entry.js +1 -1
- package/dist/esm/nano-tooltip.entry.js.map +1 -1
- package/dist/esm/{tabbable-614f515e.js → tabbable-31485ff7.js} +13 -4
- package/dist/esm/tabbable-31485ff7.js.map +1 -0
- package/dist/esm/{table.worker-5d681b97.js → table.worker-1ba8ac3f.js} +2 -2
- package/dist/esm/table.worker-1ba8ac3f.js.map +1 -0
- package/dist/nano-components/index.esm.js +1 -1
- package/dist/nano-components/nano-components.css +1 -1
- package/dist/nano-components/nano-components.esm.js +1 -1
- package/dist/nano-components/{p-35295332.entry.js → p-151aad1e.entry.js} +5 -5
- package/dist/nano-components/{p-35295332.entry.js.map → p-151aad1e.entry.js.map} +1 -1
- package/dist/nano-components/p-15543295.entry.js +5 -0
- package/dist/nano-components/{p-6e3412d2.entry.js.map → p-15543295.entry.js.map} +1 -1
- package/dist/nano-components/p-1e709f87.entry.js +5 -0
- package/dist/nano-components/p-1e709f87.entry.js.map +1 -0
- package/dist/nano-components/p-1f347342.entry.js +5 -0
- package/dist/nano-components/{p-02df1f62.entry.js.map → p-1f347342.entry.js.map} +1 -1
- package/dist/nano-components/p-216ece9a.js +5 -0
- package/dist/nano-components/{p-39124baa.entry.js.map → p-216ece9a.js.map} +0 -0
- package/dist/nano-components/p-23575705.entry.js +5 -0
- package/dist/nano-components/{p-6958df8c.entry.js.map → p-23575705.entry.js.map} +1 -1
- package/dist/nano-components/p-244223f0.entry.js +5 -0
- package/dist/nano-components/{p-6cd59e58.entry.js.map → p-244223f0.entry.js.map} +1 -1
- package/dist/nano-components/p-284dd9a2.entry.js +5 -0
- package/dist/nano-components/{p-5107646c.entry.js.map → p-284dd9a2.entry.js.map} +1 -1
- package/dist/nano-components/p-2cb4615b.entry.js +5 -0
- package/dist/nano-components/{p-e3730878.entry.js.map → p-2cb4615b.entry.js.map} +1 -1
- package/dist/nano-components/p-36842a50.entry.js +5 -0
- package/dist/nano-components/{p-f69f93e9.entry.js.map → p-36842a50.entry.js.map} +1 -1
- package/dist/nano-components/p-41addb3a.entry.js +5 -0
- package/dist/nano-components/{p-0a5ad0ef.entry.js.map → p-41addb3a.entry.js.map} +1 -1
- package/dist/nano-components/{p-9a385481.js → p-45abbbdd.js} +2 -2
- package/dist/nano-components/p-45abbbdd.js.map +1 -0
- package/dist/nano-components/p-46b348b7.entry.js +5 -0
- package/dist/nano-components/{p-28f713fb.entry.js.map → p-46b348b7.entry.js.map} +1 -1
- package/dist/nano-components/p-4b69178e.entry.js +5 -0
- package/dist/nano-components/{p-5e33798f.entry.js.map → p-4b69178e.entry.js.map} +1 -1
- package/dist/nano-components/p-4f0e14b5.entry.js +5 -0
- package/dist/nano-components/{p-8f5e0022.entry.js.map → p-4f0e14b5.entry.js.map} +1 -1
- package/dist/nano-components/p-559a6492.entry.js +5 -0
- package/dist/nano-components/p-559a6492.entry.js.map +1 -0
- package/dist/nano-components/p-601e18d5.entry.js +5 -0
- package/dist/nano-components/p-601e18d5.entry.js.map +1 -0
- package/dist/nano-components/p-69e5a37d.entry.js +5 -0
- package/dist/nano-components/{p-282987e6.entry.js.map → p-69e5a37d.entry.js.map} +1 -1
- package/dist/nano-components/p-751927d1.entry.js +5 -0
- package/dist/nano-components/{p-5d81773d.entry.js.map → p-751927d1.entry.js.map} +1 -1
- package/dist/nano-components/p-845ae77e.js.map +1 -1
- package/dist/nano-components/p-866e7e88.js +5 -0
- package/dist/nano-components/p-866e7e88.js.map +1 -0
- package/dist/nano-components/{p-39124baa.entry.js → p-89b8ce4f.entry.js} +2 -2
- package/dist/nano-components/{p-619a1c8e.js.map → p-89b8ce4f.entry.js.map} +0 -0
- package/dist/nano-components/p-9059c8c1.entry.js +5 -0
- package/dist/nano-components/{p-d8e8d7e3.entry.js.map → p-9059c8c1.entry.js.map} +1 -1
- package/dist/nano-components/p-92504f7f.entry.js +5 -0
- package/dist/nano-components/{p-50fcb11c.entry.js.map → p-92504f7f.entry.js.map} +1 -1
- package/dist/nano-components/p-99fbae74.entry.js +5 -0
- package/dist/nano-components/{p-8a52a411.entry.js.map → p-99fbae74.entry.js.map} +1 -1
- package/dist/nano-components/p-9eeed8f5.entry.js +5 -0
- package/dist/nano-components/{p-4c97f05f.entry.js.map → p-9eeed8f5.entry.js.map} +1 -1
- package/dist/nano-components/p-a183e3c7.entry.js +5 -0
- package/dist/nano-components/{p-b290a970.entry.js.map → p-a183e3c7.entry.js.map} +1 -1
- package/dist/nano-components/p-a2e38472.entry.js +5 -0
- package/dist/nano-components/p-a2e38472.entry.js.map +1 -0
- package/dist/nano-components/p-b87539f0.entry.js +5 -0
- package/dist/nano-components/{p-efa8c520.entry.js.map → p-b87539f0.entry.js.map} +1 -1
- package/dist/nano-components/p-b9c8b99f.entry.js +5 -0
- package/dist/nano-components/p-b9c8b99f.entry.js.map +1 -0
- package/dist/nano-components/{p-cb79d1ec.js → p-c9a7c7ea.js} +2 -2
- package/dist/nano-components/{p-cb79d1ec.js.map → p-c9a7c7ea.js.map} +1 -1
- package/dist/nano-components/{p-c45851c3.entry.js → p-d1c8eca4.entry.js} +2 -2
- package/dist/nano-components/{p-c45851c3.entry.js.map → p-d1c8eca4.entry.js.map} +1 -1
- package/dist/nano-components/p-d8678bdc.entry.js +5 -0
- package/dist/nano-components/p-d8678bdc.entry.js.map +1 -0
- package/dist/nano-components/p-db4b6602.entry.js +5 -0
- package/dist/nano-components/{p-716064b6.entry.js.map → p-db4b6602.entry.js.map} +1 -1
- package/dist/nano-components/{p-916e4b6b.entry.js → p-dba8a88d.entry.js} +2 -2
- package/dist/nano-components/{p-916e4b6b.entry.js.map → p-dba8a88d.entry.js.map} +1 -1
- package/dist/nano-components/p-e4e41e06.entry.js +5 -0
- package/dist/nano-components/p-e4e41e06.entry.js.map +1 -0
- package/dist/nano-components/p-e5408bc8.entry.js +5 -0
- package/dist/nano-components/{p-c5bb5540.entry.js.map → p-e5408bc8.entry.js.map} +1 -1
- package/dist/nano-components/p-f43d1d8e.entry.js +5 -0
- package/dist/nano-components/{p-66099557.entry.js.map → p-f43d1d8e.entry.js.map} +1 -1
- package/dist/nano-components/p-f7471cca.entry.js +5 -0
- package/dist/nano-components/{p-66ad1418.entry.js.map → p-f7471cca.entry.js.map} +1 -1
- package/dist/nano-components/p-fe94eeff.entry.js +5 -0
- package/dist/nano-components/{p-701e8ebf.entry.js.map → p-fe94eeff.entry.js.map} +1 -1
- package/dist/nano-components/p-feb9f164.entry.js +5 -0
- package/dist/nano-components/{p-81136f24.entry.js.map → p-feb9f164.entry.js.map} +1 -1
- package/dist/themes/nanopore.css +1 -1
- package/dist/themes/nanopore.css.map +1 -1
- package/dist/types/components/global-nav/global-nav.d.ts +8 -3
- package/dist/types/components/resize-observe/resize-observe.d.ts +5 -2
- package/dist/types/components/table/table.d.ts +8 -7
- package/dist/types/components.d.ts +4 -0
- package/dist/types/utils/dom.d.ts +1 -1
- package/docs-json.json +167 -7
- package/docs-vscode.json +1 -1
- package/package.json +2 -2
- package/dist/cjs/nano-table-7dbe799c.js.map +0 -1
- package/dist/cjs/tabbable-de4c23d8.js.map +0 -1
- package/dist/cjs/table.worker-fe960deb.js.map +0 -1
- package/dist/collection/components/global-nav/search-widget.js +0 -4
- package/dist/collection/components/global-nav/search-widget.js.map +0 -1
- package/dist/esm/nano-table-93d25a68.js.map +0 -1
- package/dist/esm/tabbable-614f515e.js.map +0 -1
- package/dist/esm/table.worker-5d681b97.js.map +0 -1
- package/dist/nano-components/p-02df1f62.entry.js +0 -5
- package/dist/nano-components/p-0a5ad0ef.entry.js +0 -5
- package/dist/nano-components/p-282987e6.entry.js +0 -5
- package/dist/nano-components/p-28b43ee9.entry.js +0 -5
- package/dist/nano-components/p-28b43ee9.entry.js.map +0 -1
- package/dist/nano-components/p-28f713fb.entry.js +0 -5
- package/dist/nano-components/p-37553477.entry.js +0 -5
- package/dist/nano-components/p-37553477.entry.js.map +0 -1
- package/dist/nano-components/p-42fa11c3.entry.js +0 -5
- package/dist/nano-components/p-42fa11c3.entry.js.map +0 -1
- package/dist/nano-components/p-4c386a43.js +0 -5
- package/dist/nano-components/p-4c386a43.js.map +0 -1
- package/dist/nano-components/p-4c97f05f.entry.js +0 -5
- package/dist/nano-components/p-50fcb11c.entry.js +0 -5
- package/dist/nano-components/p-5107646c.entry.js +0 -5
- package/dist/nano-components/p-5d81773d.entry.js +0 -5
- package/dist/nano-components/p-5e33798f.entry.js +0 -5
- package/dist/nano-components/p-619a1c8e.js +0 -5
- package/dist/nano-components/p-653a25f8.entry.js +0 -5
- package/dist/nano-components/p-653a25f8.entry.js.map +0 -1
- package/dist/nano-components/p-66099557.entry.js +0 -5
- package/dist/nano-components/p-66ad1418.entry.js +0 -5
- package/dist/nano-components/p-6958df8c.entry.js +0 -5
- package/dist/nano-components/p-6cd59e58.entry.js +0 -5
- package/dist/nano-components/p-6e3412d2.entry.js +0 -5
- package/dist/nano-components/p-701e8ebf.entry.js +0 -5
- package/dist/nano-components/p-716064b6.entry.js +0 -5
- package/dist/nano-components/p-81136f24.entry.js +0 -5
- package/dist/nano-components/p-8a52a411.entry.js +0 -5
- package/dist/nano-components/p-8f5e0022.entry.js +0 -5
- package/dist/nano-components/p-9a385481.js.map +0 -1
- package/dist/nano-components/p-a151dea5.entry.js +0 -5
- package/dist/nano-components/p-a151dea5.entry.js.map +0 -1
- package/dist/nano-components/p-b290a970.entry.js +0 -5
- package/dist/nano-components/p-c5bb5540.entry.js +0 -5
- package/dist/nano-components/p-d8e8d7e3.entry.js +0 -5
- package/dist/nano-components/p-e3730878.entry.js +0 -5
- package/dist/nano-components/p-efa8c520.entry.js +0 -5
- package/dist/nano-components/p-f69f93e9.entry.js +0 -5
- package/dist/nano-components/p-f71f69c9.entry.js +0 -5
- package/dist/nano-components/p-f71f69c9.entry.js.map +0 -1
- package/dist/nano-components/p-fa2a6733.entry.js +0 -5
- package/dist/nano-components/p-fa2a6733.entry.js.map +0 -1
- package/dist/types/components/global-nav/search-widget.d.ts +0 -0
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["src/components/menu-drawer/menu-drawer.scss?tag=nano-menu-drawer&encapsulation=shadow","src/components/menu-drawer/menu-drawer.tsx"],"names":["menuDrawerCss","MenuDrawer","this","children","currHeight","window","innerHeight","onWindowResize","innerWidth","hideWidth","widthOk","vh","el","style","setProperty","heightOk","moveItemsToDrawer","toggle","e","preventDefault","open","onToggleKeyDown","ev","key","[object Object]","detail","secondaryMenu","stopPropagation","saveState","localStorage","setItem","toString","containerDiv","writeTask","width","contentDiv","scrollWidth","moveItemsToGlobalNav","hideHeight","io","attachIO","disconnect","undefined","currNavItems","querySelectorAll","forEach","element","push","slot","getAttribute","setAttribute","classList","add","globalNav","appendChild","hide","length","child","removeAttribute","remove","IntersectionObserver","data","intersectionRatio","threshold","observe","measureEle","target","tagName","setTimeout","openChange","isLoading","closestElement","localState","getItem","addEventListener","removeEventListener","debounceResize","h","Host","class","loading","has-global-nav","dir","ownerDocument","ref","div","onMouseDown","onKeyDown","name","aria-label"],"mappings":"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","sourcesContent":["@use 'sass:map';\n@use 'sass:list';\n\n@import '../../global/style/utilities/globals';\n@import '../../global/style/nano-theme/base';\n@import '../../global/style/nano-theme/colours';\n\n:host {\n --padding-top: 13px;\n --padding-end: 12px;\n --padding-bottom: 13px;\n --padding-start: 12px;\n --icon-size: 19px;\n --font-size: 11px;\n --global-nav-height: 61px;\n --bg-color: #001a21;\n --bg-color-hover: rgba(28, 62, 72, 0.8);\n --bg-color-selected: #274048;\n --bg-color-focus: rgba(28, 62, 72, 0.8);\n --focus-outline: none;\n --content-color: #{map.get($colors, white)};\n --secondary-bg-color: rgb(28, 62, 72);\n\n @include text-inherit();\n\n display: block;\n z-index: 1;\n background: var(--bg-color);\n\n ::slotted(nano-nav-item) {\n --secondary-padding-top: var(--global-nav-height);\n --nano-icon-size: var(--icon-size);\n\n color: var(--content-color);\n font-size: var(--font-size);\n // font-weight: bold;\n text-decoration: none;\n box-sizing: border-box;\n }\n\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n}\n\n:host(.hide) {\n display: none;\n}\n\n:host(.has-global-nav) {\n .content-wrap {\n padding-block-start: var(--global-nav-height);\n margin-block-start: calc(var(--global-nav-height) * -1);\n }\n}\n\n.container {\n inset-inline-end: auto;\n flex: 0 0 calc((var(--padding-end, 1em) * 2) + var(--icon-size));\n background: var(--bg-color);\n color: var(--content-color);\n z-index: 1;\n inline-size: calc((var(--padding-end, 1em) * 2) + var(--icon-size));\n block-size: 100%;\n}\n\n:host(.open) {\n .container {\n inline-size: auto;\n }\n}\n\n:host(:not(.loading)) {\n .container {\n transition: inline-size 0.3s ease;\n }\n}\n\n.content-wrap {\n inset-inline-start: 0;\n inset-block-start: 0;\n inline-size: inherit;\n max-inline-size: inherit;\n background: var(--bg-color);\n color: map.get($colors, white);\n position: sticky;\n font-size: var(--icon-size);\n line-height: 1;\n display: flex;\n min-block-size: calc(100vh - 61px);\n min-block-size: calc((var(--vh, 1vh) * 100) - 61px);\n z-index: 1;\n}\n\n.content {\n inline-size: auto;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: var(--bg-color);\n flex: 1;\n\n &::after {\n content: '';\n position: absolute;\n inset-block-start: 0;\n inset-inline: 0;\n background: var(--bg-color);\n z-index: -1;\n block-size: 100vh;\n }\n}\n\n.collapse-btn {\n background: var(--bg-color-selected);\n border: none;\n color: inherit;\n font-size: var(--icon-size);\n margin-block-start: var(--padding-top);\n margin-inline-end: 0;\n margin-block-end: var(--padding-bottom);\n margin-inline-start: calc(var(--padding-start) / 2);\n border-radius: 4px;\n padding-block: 6px;\n padding-inline: 5px;\n display: flex;\n align-content: center;\n inline-size: 30px;\n flex: 0 0 auto;\n\n nano-icon {\n font-size: var(--icon-size);\n transition: 0.2s transform ease-in-out;\n transform: translateZ(0) rotate(0deg);\n\n :host(.open) & {\n transform: translateZ(0) rotate(180deg);\n }\n }\n}\n\n.foot {\n margin-block-start: auto;\n}\n\n.measure-ele {\n block-size: 1px;\n}\n","import {\n Component,\n h,\n Host,\n Prop,\n writeTask,\n State,\n Element,\n Watch,\n Listen,\n Build,\n} from '@stencil/core';\nimport { closestElement } from '../../utils/dom';\nimport type { NavItemEventDetail } from '../../interface';\n\n/**\n * Menu drawer - digital specific navigation strip designed to be open (default) or closed.\n * Shows menu item logos only on minimised, expands to show entire menu item.\n * Used in conjunction with the [Globla-Nav](/story/compounds-global-nav) element -> it should be a direct descendent.\n * Only one nano-menu-drawer element should be present on any page. It is fixed to a side on larger screens and items are added to the global nav 'burger' on smaller screens.\n * @slot foot - nav items to be placed at the bottom of the drawer\n * @slot - default slot for nav items\n */\n@Component({\n tag: 'nano-menu-drawer',\n styleUrl: 'menu-drawer.scss',\n shadow: true,\n})\nexport class MenuDrawer {\n private containerDiv: HTMLDivElement;\n private contentDiv: HTMLElement;\n private measureEle: HTMLElement;\n private debounceResize: () => {};\n private globalNav: HTMLNanoGlobalNavElement;\n private children: Array<{ slot: string; element: HTMLNanoNavItemElement }> =\n [];\n private io: IntersectionObserver;\n private currHeight: number = window.innerHeight;\n\n @Element() private el: HTMLNanoMenuDrawerElement;\n\n @State() reset: boolean = false;\n @State() widthOk: boolean = true;\n @State() heightOk: boolean = true;\n @State() isLoading: boolean = true;\n @State() hide: boolean = false;\n\n /**\n * Set the initial menu drawer open or closed\n */\n @Prop() open: boolean = true;\n\n /**\n * Save open state to localStorage\n */\n @Prop() saveState: boolean = true;\n\n /**\n * Screen width to hide the menu drawer and move the items into the nano-global-nav\n */\n @Prop() hideWidth: number = 576;\n\n /**\n * Should element hide and move items into the nano-global-nav when items are cut off\n * (this will only work when nano-menu-drawer is displayed at full screen)\n */\n @Prop() hideHeight: boolean = true;\n\n @Listen('nanoOpen')\n @Listen('nanoClose')\n cancelNavItemEvents(ev: CustomEvent) {\n if (!(ev.detail as NavItemEventDetail).secondaryMenu) return;\n ev.stopPropagation();\n }\n\n @Watch('open')\n openChange() {\n if (this.saveState)\n localStorage.setItem('nanoMenuDrawerOpen', this.open.toString());\n if (this.containerDiv) {\n if (this.open)\n writeTask(\n () =>\n (this.containerDiv.style.width = this.contentDiv.scrollWidth + 'px')\n );\n else writeTask(() => (this.containerDiv.style.width = null));\n }\n }\n\n @Watch('widthOk')\n widthChange() {\n if (this.widthOk) this.moveItemsToDrawer();\n else this.moveItemsToGlobalNav();\n }\n\n @Watch('hideHeight')\n hideHeightChange() {\n if (this.hideHeight && !this.io) this.attachIO();\n else if (!this.hideHeight && this.io) {\n this.io.disconnect();\n this.io = undefined;\n }\n }\n\n private moveItemsToGlobalNav() {\n const currNavItems = this.el.querySelectorAll('nano-nav-item');\n // dimensions not cool - move items out of element and into global nav\n currNavItems.forEach((element) => {\n this.children.push({\n slot: element.getAttribute('slot'),\n element: element,\n });\n element.setAttribute('slot', 'overflow');\n element.classList.add('nano-global-nav-menu');\n this.globalNav.appendChild(element);\n });\n this.hide = true;\n }\n\n private moveItemsToDrawer() {\n if (!this.children || !this.children.length) return;\n\n this.children.forEach((child) => {\n child.element.removeAttribute('slot');\n child.element.classList.remove('nano-global-nav-menu');\n if (child.slot && child.slot.length)\n child.element.setAttribute('slot', child.slot);\n this.el.appendChild(child.element);\n });\n this.children = [];\n this.hide = false;\n if (!this.io) this.attachIO();\n }\n\n private onWindowResize = () => {\n if (window.innerWidth > this.hideWidth) this.widthOk = true;\n else this.widthOk = false;\n\n const vh = window.innerHeight * 0.01;\n this.el.style.setProperty('--vh', `${vh}px`);\n\n if (\n window.innerHeight > this.currHeight &&\n this.widthOk &&\n !this.heightOk\n ) {\n this.moveItemsToDrawer();\n }\n this.currHeight = window.innerHeight;\n };\n\n private toggle = (e: MouseEvent) => {\n e.preventDefault();\n this.open = !this.open;\n };\n\n private onToggleKeyDown = (ev: KeyboardEvent) => {\n switch (ev.key) {\n case 'Enter':\n case ' ':\n this.open = !this.open;\n break;\n }\n };\n\n private attachIO() {\n if (!this.hideHeight) return;\n const io: IntersectionObserver = (this.io = new (\n window as any\n ).IntersectionObserver(\n (data: IntersectionObserverEntry[]) => {\n this.heightOk = data[0].intersectionRatio !== 0;\n if (!this.heightOk) {\n this.moveItemsToGlobalNav();\n this.io.disconnect();\n this.io = undefined;\n }\n },\n { threshold: 1 }\n ));\n io.observe(this.measureEle);\n }\n\n @Listen('nanoIsReady', { target: 'body' })\n handleGlobalNavReady(e: CustomEvent & { target: HTMLNanoGlobalNavElement }) {\n if (e.target.tagName !== 'NANO-GLOBAL-NAV') return;\n\n setTimeout(() => {\n this.attachIO();\n this.openChange();\n this.onWindowResize();\n this.isLoading = false;\n }, 500);\n }\n\n componentWillLoad() {\n this.globalNav = closestElement(\n 'nano-global-nav',\n this.el\n ) as HTMLNanoGlobalNavElement;\n\n this.widthOk = window.innerWidth > this.hideWidth;\n this.currHeight = window.innerHeight;\n\n if (this.saveState) {\n const localState = localStorage.getItem('nanoMenuDrawerOpen');\n this.open = localState ? localState === 'true' : this.open;\n }\n }\n\n componentDidLoad() {\n if (Build.isBrowser) {\n window.addEventListener('resize', this.onWindowResize);\n }\n }\n\n disconnectedCallback() {\n window.removeEventListener('resize', this.debounceResize);\n if (this.io) {\n this.io.disconnect();\n this.io = null;\n }\n }\n\n render() {\n return (\n <Host\n class={{\n open: this.open,\n hide: this.hide,\n loading: this.isLoading,\n 'has-global-nav': !!this.globalNav,\n }}\n dir={(this.el.ownerDocument as Document).dir === 'rtl' ? 'rtl' : null}\n >\n <div ref={(div) => (this.containerDiv = div)} class=\"container\">\n <div class=\"content-wrap\">\n <nav ref={(div) => (this.contentDiv = div)} class=\"content\">\n <button\n onMouseDown={this.toggle}\n onKeyDown={this.onToggleKeyDown}\n class=\"collapse-btn\"\n >\n <nano-icon\n name=\"light/arrow-alt-to-right\"\n aria-label=\"collapse / expand\"\n ></nano-icon>\n </button>\n <slot />\n <div class=\"foot\">\n <div\n class=\"measure-ele\"\n ref={(div) => (this.measureEle = div)}\n ></div>\n <slot name=\"foot\" />\n </div>\n </nav>\n </div>\n </div>\n </Host>\n );\n }\n}\n"]}
|
1
|
+
{"version":3,"sources":["src/components/menu-drawer/menu-drawer.scss?tag=nano-menu-drawer&encapsulation=shadow","src/components/menu-drawer/menu-drawer.tsx"],"names":["menuDrawerCss","MenuDrawer","this","children","currHeight","window","innerHeight","onWindowResize","innerWidth","hideWidth","widthOk","vh","el","style","setProperty","heightOk","moveItemsToDrawer","toggle","e","preventDefault","open","onToggleKeyDown","ev","key","[object Object]","detail","secondaryMenu","stopPropagation","saveState","localStorage","setItem","toString","containerDiv","writeTask","width","contentDiv","scrollWidth","moveItemsToGlobalNav","hideHeight","io","attachIO","disconnect","undefined","currNavItems","querySelectorAll","forEach","element","push","slot","getAttribute","setAttribute","classList","add","globalNav","appendChild","hide","length","child","removeAttribute","remove","IntersectionObserver","data","intersectionRatio","threshold","observe","measureEle","target","tagName","setTimeout","openChange","isLoading","closestElement","localState","getItem","addEventListener","removeEventListener","debounceResize","h","Host","class","loading","has-global-nav","dir","ownerDocument","ref","div","onMouseDown","onKeyDown","name","aria-label"],"mappings":"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","sourcesContent":["@use 'sass:map';\n@use 'sass:list';\n\n@import '../../global/style/utilities/globals';\n@import '../../global/style/nano-theme/base';\n@import '../../global/style/nano-theme/colours';\n\n:host {\n --padding-top: 13px;\n --padding-end: 12px;\n --padding-bottom: 13px;\n --padding-start: 12px;\n --icon-size: 19px;\n --font-size: 11px;\n --global-nav-height: 61px;\n --bg-color: #001a21;\n --bg-color-hover: rgba(28, 62, 72, 0.8);\n --bg-color-selected: #274048;\n --bg-color-focus: rgba(28, 62, 72, 0.8);\n --focus-outline: none;\n --content-color: #{map.get($colors, white)};\n --secondary-bg-color: rgb(28, 62, 72);\n\n @include text-inherit();\n\n display: block;\n z-index: 1;\n background: var(--bg-color);\n\n ::slotted(nano-nav-item) {\n --secondary-padding-top: var(--global-nav-height);\n --nano-icon-size: var(--icon-size);\n\n color: var(--content-color);\n font-size: var(--font-size);\n // font-weight: bold;\n text-decoration: none;\n box-sizing: border-box;\n }\n\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n}\n\n:host(.hide) {\n display: none;\n}\n\n:host(.has-global-nav) {\n .content-wrap {\n padding-block-start: var(--global-nav-height);\n margin-block-start: calc(var(--global-nav-height) * -1);\n }\n}\n\n.container {\n inset-inline-end: auto;\n flex: 0 0 calc((var(--padding-end, 1em) * 2) + var(--icon-size));\n background: var(--bg-color);\n color: var(--content-color);\n z-index: 1;\n inline-size: calc((var(--padding-end, 1em) * 2) + var(--icon-size));\n block-size: 100%;\n}\n\n:host(.open) {\n .container {\n inline-size: auto;\n }\n}\n\n:host(:not(.loading)) {\n .container {\n transition: inline-size 0.3s ease;\n }\n}\n\n.content-wrap {\n inset-inline-start: 0;\n inset-block-start: 0;\n inline-size: inherit;\n max-inline-size: inherit;\n background: var(--bg-color);\n color: map.get($colors, white);\n position: sticky;\n font-size: var(--icon-size);\n line-height: 1;\n display: flex;\n min-block-size: calc(100vh - 61px);\n min-block-size: calc((var(--vh, 1vh) * 100) - 61px);\n z-index: 1;\n}\n\n.content {\n inline-size: auto;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: var(--bg-color);\n flex: 1;\n\n &::after {\n content: '';\n position: absolute;\n inset-block-start: 0;\n inset-inline: 0;\n background: var(--bg-color);\n z-index: -1;\n block-size: 100vh;\n }\n}\n\n.collapse-btn {\n background: var(--bg-color-selected);\n border: none;\n color: inherit;\n font-size: var(--icon-size);\n margin-block-start: var(--padding-top);\n margin-inline-end: 0;\n margin-block-end: var(--padding-bottom);\n margin-inline-start: calc(var(--padding-start) / 2);\n border-radius: 4px;\n padding-block: 6px;\n padding-inline: 5px;\n display: flex;\n align-content: center;\n inline-size: 30px;\n flex: 0 0 auto;\n\n nano-icon {\n font-size: var(--icon-size);\n transition: 0.2s transform ease-in-out;\n transform: translateZ(0) rotate(0deg);\n\n :host(.open) & {\n transform: translateZ(0) rotate(180deg);\n }\n }\n}\n\n.foot {\n margin-block-start: auto;\n}\n\n.measure-ele {\n block-size: 1px;\n}\n","import {\n Component,\n h,\n Host,\n Prop,\n writeTask,\n State,\n Element,\n Watch,\n Listen,\n Build,\n} from '@stencil/core';\nimport { closestElement } from '../../utils/dom';\nimport type { NavItemEventDetail } from '../../interface';\n\n/**\n * Menu drawer - digital specific navigation strip designed to be open (default) or closed.\n * Shows menu item logos only on minimised, expands to show entire menu item.\n * Used in conjunction with the [Globla-Nav](/story/compounds-global-nav) element -> it should be a direct descendent.\n * Only one nano-menu-drawer element should be present on any page. It is fixed to a side on larger screens and items are added to the global nav 'burger' on smaller screens.\n * @slot foot - nav items to be placed at the bottom of the drawer\n * @slot - default slot for nav items\n */\n@Component({\n tag: 'nano-menu-drawer',\n styleUrl: 'menu-drawer.scss',\n shadow: true,\n})\nexport class MenuDrawer {\n private containerDiv: HTMLDivElement;\n private contentDiv: HTMLElement;\n private measureEle: HTMLElement;\n private debounceResize: () => {};\n private globalNav: HTMLNanoGlobalNavElement;\n private children: Array<{ slot: string; element: HTMLNanoNavItemElement }> =\n [];\n private io: IntersectionObserver;\n private currHeight: number = window.innerHeight;\n\n @Element() private el: HTMLNanoMenuDrawerElement;\n\n @State() reset: boolean = false;\n @State() widthOk: boolean = true;\n @State() heightOk: boolean = true;\n @State() isLoading: boolean = true;\n @State() hide: boolean = false;\n\n /**\n * Set the initial menu drawer open or closed\n */\n @Prop() open: boolean = true;\n\n /**\n * Save open state to localStorage\n */\n @Prop() saveState: boolean = true;\n\n /**\n * Screen width to hide the menu drawer and move the items into the nano-global-nav\n */\n @Prop() hideWidth: number = 576;\n\n /**\n * Should element hide and move items into the nano-global-nav when items are cut off\n * (this will only work when nano-menu-drawer is displayed at full screen)\n */\n @Prop() hideHeight: boolean = true;\n\n @Listen('nanoOpen')\n @Listen('nanoClose')\n cancelNavItemEvents(ev: CustomEvent) {\n if (!(ev.detail as NavItemEventDetail).secondaryMenu) return;\n ev.stopPropagation();\n }\n\n @Watch('open')\n openChange() {\n if (this.saveState)\n localStorage.setItem('nanoMenuDrawerOpen', this.open.toString());\n if (this.containerDiv) {\n if (this.open)\n writeTask(\n () =>\n (this.containerDiv.style.width = this.contentDiv.scrollWidth + 'px')\n );\n else writeTask(() => (this.containerDiv.style.width = null));\n }\n }\n\n @Watch('widthOk')\n widthChange() {\n if (this.widthOk) this.moveItemsToDrawer();\n else this.moveItemsToGlobalNav();\n }\n\n @Watch('hideHeight')\n hideHeightChange() {\n if (this.hideHeight && !this.io) this.attachIO();\n else if (!this.hideHeight && this.io) {\n this.io.disconnect();\n this.io = undefined;\n }\n }\n\n private moveItemsToGlobalNav() {\n const currNavItems = this.el.querySelectorAll('nano-nav-item');\n // dimensions not cool - move items out of element and into global nav\n currNavItems.forEach((element) => {\n this.children.push({\n slot: element.getAttribute('slot'),\n element: element,\n });\n element.setAttribute('slot', 'overflow');\n element.classList.add('nano-global-nav-menu');\n this.globalNav.appendChild(element);\n });\n this.hide = true;\n }\n\n private moveItemsToDrawer() {\n if (!this.children || !this.children.length) return;\n\n this.children.forEach((child) => {\n child.element.removeAttribute('slot');\n child.element.classList.remove('nano-global-nav-menu');\n if (child.slot && child.slot.length)\n child.element.setAttribute('slot', child.slot);\n this.el.appendChild(child.element);\n });\n this.children = [];\n this.hide = false;\n if (!this.io) this.attachIO();\n }\n\n private onWindowResize = () => {\n if (window.innerWidth > this.hideWidth) this.widthOk = true;\n else this.widthOk = false;\n\n const vh = window.innerHeight * 0.01;\n this.el.style.setProperty('--vh', `${vh}px`);\n\n if (\n window.innerHeight > this.currHeight &&\n this.widthOk &&\n !this.heightOk\n ) {\n this.moveItemsToDrawer();\n }\n this.currHeight = window.innerHeight;\n };\n\n private toggle = (e: MouseEvent) => {\n e.preventDefault();\n this.open = !this.open;\n };\n\n private onToggleKeyDown = (ev: KeyboardEvent) => {\n switch (ev.key) {\n case 'Enter':\n case ' ':\n this.open = !this.open;\n break;\n }\n };\n\n private attachIO() {\n if (!this.hideHeight) return;\n const io: IntersectionObserver = (this.io = new (\n window as any\n ).IntersectionObserver(\n (data: IntersectionObserverEntry[]) => {\n this.heightOk = data[0].intersectionRatio !== 0;\n if (!this.heightOk) {\n this.moveItemsToGlobalNav();\n this.io.disconnect();\n this.io = undefined;\n }\n },\n { threshold: 1 }\n ));\n io.observe(this.measureEle);\n }\n\n @Listen('nanoIsReady', { target: 'body' })\n handleGlobalNavReady(e: CustomEvent & { target: HTMLNanoGlobalNavElement }) {\n if (e.target.tagName !== 'NANO-GLOBAL-NAV') return;\n\n setTimeout(() => {\n this.attachIO();\n this.openChange();\n this.onWindowResize();\n this.isLoading = false;\n }, 500);\n }\n\n componentWillLoad() {\n this.globalNav = closestElement(\n 'nano-global-nav',\n this.el\n ) as HTMLNanoGlobalNavElement;\n\n this.widthOk = window.innerWidth > this.hideWidth;\n this.currHeight = window.innerHeight;\n\n if (this.saveState) {\n const localState = localStorage.getItem('nanoMenuDrawerOpen');\n this.open = localState ? localState === 'true' : this.open;\n }\n }\n\n componentDidLoad() {\n if (Build.isBrowser) {\n window.addEventListener('resize', this.onWindowResize);\n }\n }\n\n disconnectedCallback() {\n window.removeEventListener('resize', this.debounceResize);\n if (this.io) {\n this.io.disconnect();\n this.io = null;\n }\n }\n\n render() {\n return (\n <Host\n class={{\n open: this.open,\n hide: this.hide,\n loading: this.isLoading,\n 'has-global-nav': !!this.globalNav,\n }}\n dir={(this.el.ownerDocument as Document).dir === 'rtl' ? 'rtl' : null}\n >\n <div ref={(div) => (this.containerDiv = div)} class=\"container\">\n <div class=\"content-wrap\">\n <nav ref={(div) => (this.contentDiv = div)} class=\"content\">\n <button\n onMouseDown={this.toggle}\n onKeyDown={this.onToggleKeyDown}\n class=\"collapse-btn\"\n >\n <nano-icon\n name=\"light/arrow-alt-to-right\"\n aria-label=\"collapse / expand\"\n ></nano-icon>\n </button>\n <slot />\n <div class=\"foot\">\n <div\n class=\"measure-ele\"\n ref={(div) => (this.measureEle = div)}\n ></div>\n <slot name=\"foot\" />\n </div>\n </nav>\n </div>\n </div>\n </Host>\n );\n }\n}\n"]}
|
@@ -0,0 +1,5 @@
|
|
1
|
+
/*!
|
2
|
+
* Web Components for Nanopore digital Web Apps
|
3
|
+
*/
|
4
|
+
import{r as n,c as a,h as e,a as r,g as s}from"./p-1fe12320.js";import{c as t}from"./p-ee045579.js";import{c as i}from"./p-7b3638b7.js";import{a as o}from"./p-9746b0a5.js";const h=(n,a,e,r)=>{let s=n.querySelector("input.aux-input");if(!s){s=n.ownerDocument.createElement("input");s.type="hidden";s.classList.add("aux-input");n.appendChild(s)}s.disabled=r;s.name=a;s.value=e||""};const c='.sc-nano-range-h{box-sizing:border-box}*.sc-nano-range,*.sc-nano-range::before,*.sc-nano-range::after{box-sizing:border-box}[hidden].sc-nano-range{display:none !important}.sc-nano-range-h{--knob-handle-size:(var(--knob-size) * 2);--rgb-inactive:165, 165, 165;--knob-border-radius:50%;--knob-background:var(--nano-color-primary, #007495);--knob-box-shadow:0 2px 4px 0 rgba(0, 0, 0, 0.3);--knob-size:30px;--bar-height:8px;--bar-background:#e2e1e0;--bar-background-active:#a5a5a5;--bar-border-radius:4px;--height:42px;--pin-background:var(--nano-color-primary, #007495);--pin-color:var(--nano-color-primary-contrast, #fff);--focus-style:0 0 0 5px var(--nano-control-focus-color, rgba(144, 198, 231, 0.8))}.range-wrap.sc-nano-range{display:flex;position:relative;flex:3;align-items:center;-webkit-user-select:none;user-select:none}.range-wrap.sc-nano-range-s>ion-icon[slot],.range-wrap .sc-nano-range-s>ion-icon[slot]{font-size:1.5em}.range-wrap.sc-nano-range-s>[slot=start],.range-wrap .sc-nano-range-s>[slot=start]{margin-inline:0 14px;margin-block:0;font-size:0.9em}.range-wrap.sc-nano-range-s>[slot=end],.range-wrap .sc-nano-range-s>[slot=end]{margin-inline:14px 0;margin-block:0;font-size:0.9em}.range-slider.sc-nano-range{position:relative;flex:1;width:100%;height:var(--height);contain:size layout style;cursor:grab;touch-action:pan-y}.range-pressed.sc-nano-range-h .range-slider.sc-nano-range{cursor:grabbing}.range-bar.sc-nano-range{border-radius:var(--bar-border-radius);inset-block-start:calc((var(--height) - var(--bar-height)) / 2);inset-inline-start:0;position:absolute;width:100%;height:var(--bar-height);background:var(--bar-background);pointer-events:none}.range-snaps.sc-nano-range-h .range-bar.sc-nano-range{border-radius:var(--bar-border-radius) 0 0 var(--bar-border-radius)}.range-bar-active.sc-nano-range{inset-block-end:0;width:auto;background:var(--bar-background-active)}.range-bar-active .range-pressed.sc-nano-range-h{will-change:left, right}.range-knob.sc-nano-range{border-radius:var(--knob-border-radius);inset-block-start:calc(50% - var(--knob-size) / 2);inset-inline-start:calc(50% - var(--knob-size) / 2);position:absolute;width:var(--knob-size);height:var(--knob-size);background:var(--knob-background);box-shadow:var(--knob-box-shadow);z-index:2;pointer-events:none;transform:scale(0.67);transition-duration:120ms;transition-property:transform, background-color, border;transition-timing-function:ease}.sc-nano-range-h:not(.range-has-pin) .range-knob-pressed.sc-nano-range .range-knob.sc-nano-range{transform:scale(1)}.range-knob-handle.sc-nano-range{inset-block-start:calc((var(--height) - var(--knob-handle-size)) / 2);inset-inline-start:0;margin-inline-start:calc(0px - var(--knob-handle-size) / 2);position:absolute;width:calc(var(--knob-handle-size));height:calc(var(--knob-handle-size));text-align:center}.range-knob-handle.sc-nano-range:active,.range-knob-handle.sc-nano-range:focus{outline:none}.range-knob-handle.sc-nano-range:active .range-knob.sc-nano-range,.range-knob-handle.sc-nano-range:focus .range-knob.sc-nano-range{box-shadow:var(--knob-box-shadow), var(--focus-style)}.range-tick.sc-nano-range{position:absolute;inset-block-start:calc((var(--height) - var(--bar-height)) / 2);width:var(--bar-height);height:var(--bar-height);background:var(--bar-background-active);z-index:1;pointer-events:none}.range-tick.sc-nano-range:first-of-type{border-radius:var(--bar-border-radius) 0 0 var(--bar-border-radius)}.range-tick.sc-nano-range:last-of-type{border-radius:0 var(--bar-border-radius) var(--bar-border-radius) 0}.range-tick-active.sc-nano-range{background:transparent}.range-pin.sc-nano-range{transform:translate3d(0, 0, 0) scale(0.01);transform-origin:center top;padding:0.66em 0;border-radius:50%;text-align:center;box-sizing:border-box;display:inline-block;position:relative;min-width:2.33em;height:2.33em;transition:transform 120ms ease, background 120ms ease;background:var(--pin-background);color:var(--pin-color);font-size:0.75em}.range-pin.sc-nano-range::before{inset-block-start:0.25em;inset-inline-start:50%;margin-inline-start:-1.08em;border-radius:50% 50% 50% 0;position:absolute;width:2.16em;height:2.16em;transform:rotate(-45deg);transition:background 120ms ease;background:var(--pin-background);content:"";z-index:-1}.range-knob-pressed.sc-nano-range .range-pin.sc-nano-range{transform:translate3d(0, -50%, 0) scale(1);transform:translate3d(0, calc((100% - var(--bar-height)) * -1), 0) scale(1)}.range-disabled.sc-nano-range-h{pointer-events:none}.range-disabled.sc-nano-range-h .range-bar-active.sc-nano-range,.range-disabled.sc-nano-range-h .range-bar.sc-nano-range,.range-disabled.sc-nano-range-h .range-tick.sc-nano-range{background-color:rgba(var(--rgb-inactive), 0.5)}.range-disabled.sc-nano-range-h .range-knob.sc-nano-range{transform:scale(0.55);outline:5px solid #fff;background-color:rgba(var(--rgb-inactive), 0.5)}.nano-color.sc-nano-range-h .range-bar-active.sc-nano-range,.nano-color.sc-nano-range-h .range-knob.sc-nano-range,.nano-color.sc-nano-range-h .range-pin.sc-nano-range,.nano-color.sc-nano-range-h .range-pin.sc-nano-range::before,.nano-color.sc-nano-range-h .range-tick.sc-nano-range{background:var(--nano-color-base);color:var(--nano-color-contrast)}.nano-color.sc-nano-range-h .range-bar.sc-nano-range{background:rgba(var(--nano-color-base-rgb), 0.26)}.nano-color.sc-nano-range-h .range-knob-handle.sc-nano-range:active .range-knob.sc-nano-range,.nano-color.sc-nano-range-h .range-knob-handle.sc-nano-range:focus .range-knob.sc-nano-range{box-shadow:var(--knob-box-shadow), 0 0 0 5px rgba(var(--nano-color-tint-rgb), 0.56)}';const g=class{constructor(e){n(this,e);this.nanoChange=a(this,"nanoChange",7);this.nanoStyle=a(this,"nanoStyle",7);this.nanoFocus=a(this,"nanoFocus",7);this.nanoBlur=a(this,"nanoBlur",7);this.noUpdate=false;this.hasFocus=false;this.clampBounds=n=>t(this.min,n,this.max);this.ensureValueInBounds=n=>{if(this.dualKnobs){return{lower:this.clampBounds(n.lower),upper:this.clampBounds(n.upper)}}else{return this.clampBounds(n)}};this.handleKeyboard=(n,a)=>{let e=this.step;e=e>0?e:1;e=e/(this.max-this.min);if(!a){e*=-1}if(n==="A"){this.ratioA=t(0,this.ratioA+e,1)}else{this.ratioB=t(0,this.ratioB+e,1)}this.updateValue()};this.onBlur=()=>{if(this.hasFocus){this.hasFocus=false;this.nanoBlur.emit();this.emitStyle()}};this.onFocus=()=>{if(!this.hasFocus){this.hasFocus=true;this.nanoFocus.emit();this.emitStyle()}};this.ratioA=0;this.ratioB=0;this.pressedKnob=undefined;this.color=undefined;this.debounce=0;this.name="";this.dualKnobs=false;this.min=0;this.max=100;this.pin=false;this.snaps=false;this.step=1;this.ticks=false;this.disabled=false;this.value=0}debounceChanged(){this.nanoChange=o(this.nanoChange,this.debounce)}minChanged(){if(!this.noUpdate){this.updateRatio()}}maxChanged(){if(!this.noUpdate){this.updateRatio()}}disabledChanged(){if(this.gesture){this.gesture.enable(!this.disabled)}this.emitStyle()}valueChanged(n){if(!this.noUpdate){this.updateRatio()}n=this.ensureValueInBounds(n);this.nanoChange.emit({value:n})}connectedCallback(){this.updateRatio();this.debounceChanged();this.disabledChanged()}disconnectedCallback(){if(this.gesture){this.gesture.destroy();this.gesture=undefined}}async componentDidLoad(){const n=this.rangeSlider;if(n){this.gesture=(await import("./p-2828788c.js")).createGesture({el:n,gestureName:"range",gesturePriority:100,threshold:0,onStart:n=>this.onStart(n),onMove:n=>this.onMove(n),onEnd:n=>this.onEnd(n)});this.gesture.enable(!this.disabled)}}getValue(){const n=this.value||0;if(this.dualKnobs){if(typeof n==="object"){return n}return{lower:0,upper:n}}else{if(typeof n==="object"){return n.upper}return n}}emitStyle(){this.nanoStyle.emit({interactive:true,"interactive-disabled":this.disabled})}onStart(n){const a=this.rect=this.rangeSlider.getBoundingClientRect();const e=n.currentX;let r=t(0,(e-a.left)/a.width,1);if(document.dir==="rtl"){r=1-r}this.pressedKnob=!this.dualKnobs||Math.abs(this.ratioA-r)<Math.abs(this.ratioB-r)?"A":"B";this.setFocus(this.pressedKnob);this.update(e)}onMove(n){this.update(n.currentX)}onEnd(n){this.update(n.currentX);this.pressedKnob=undefined}update(n){const a=this.rect;let e=t(0,(n-a.left)/a.width,1);if(document.dir==="rtl"){e=1-e}if(this.snaps){e=b(d(e,this.min,this.max,this.step),this.min,this.max)}if(this.pressedKnob==="A"){this.ratioA=e}else{this.ratioB=e}this.updateValue()}get valA(){return d(this.ratioA,this.min,this.max,this.step)}get valB(){return d(this.ratioB,this.min,this.max,this.step)}get ratioLower(){if(this.dualKnobs){return Math.min(this.ratioA,this.ratioB)}return 0}get ratioUpper(){if(this.dualKnobs){return Math.max(this.ratioA,this.ratioB)}return this.ratioA}updateRatio(){const n=this.getValue();const{min:a,max:e}=this;if(this.dualKnobs){this.ratioA=b(n.lower,a,e);this.ratioB=b(n.upper,a,e)}else{this.ratioA=b(n,a,e)}}updateValue(){this.noUpdate=true;const{valA:n,valB:a}=this;this.value=!this.dualKnobs?n:{lower:Math.min(n,a),upper:Math.max(n,a)};this.noUpdate=false}setFocus(n){if(this.el.shadowRoot){const a=this.el.shadowRoot.querySelector(n==="A"?".range-knob-a":".range-knob-b");if(a){a.focus()}}}render(){const{min:n,max:a,step:s,el:t,handleKeyboard:o,pressedKnob:c,disabled:g,pin:d,ratioLower:u,ratioUpper:p}=this;const v=`${u*100}%`;const k=`${100-p*100}%`;const f=document;const m=f.dir==="rtl";const x=m?"right":"left";const w=m?"left":"right";const y=n=>({[x]:n[x]});const z={[x]:v,[w]:k};const A=[];if(this.snaps&&this.ticks){for(let e=n;e<=a;e+=s){const r=b(e,n,a);const s={ratio:r,active:r>=u&&r<=p};s[x]=`${r*100}%`;A.push(s)}}h(t,this.name,JSON.stringify(this.getValue()),g);return e(r,{onFocusin:this.onFocus,onFocusout:this.onBlur,class:i(this.color,{"range-disabled":g,"range-pressed":c!==undefined,"range-has-pin":d,"range-snaps":this.snaps})},e("div",{class:"range-wrap"},e("slot",{name:"start"}),e("div",{class:"range-slider",ref:n=>this.rangeSlider=n},A.map((n=>e("span",{style:y(n),role:"presentation",class:{"range-tick":true,"range-tick-active":n.active},part:n.active?"tick-active":"tick"}))),e("div",{class:"range-bar",role:"presentation",part:"bar"}),e("div",{class:"range-bar range-bar-active",role:"presentation",style:z,part:"bar-active"}),l(m,{knob:"A",pressed:c==="A",value:this.valA,ratio:this.ratioA,pin:d,disabled:g,handleKeyboard:o,min:n,max:a}),this.dualKnobs&&l(m,{knob:"B",pressed:c==="B",value:this.valB,ratio:this.ratioB,pin:d,disabled:g,handleKeyboard:o,min:n,max:a})),e("slot",{name:"end"})))}get el(){return s(this)}static get watchers(){return{debounce:["debounceChanged"],min:["minChanged"],max:["maxChanged"],disabled:["disabledChanged"],value:["valueChanged"]}}};const l=(n,{knob:a,value:r,ratio:s,min:t,max:i,disabled:o,pressed:h,pin:c,handleKeyboard:g})=>{const l=n?"right":"left";const d=()=>{const n={};n[l]=`${s*100}%`;return n};return e("div",{onKeyDown:n=>{const e=n.key;if(e==="ArrowLeft"||e==="ArrowDown"){g(a,false);n.preventDefault();n.stopPropagation()}else if(e==="ArrowRight"||e==="ArrowUp"){g(a,true);n.preventDefault();n.stopPropagation()}},class:{"range-knob-handle":true,"range-knob-a":a==="A","range-knob-b":a==="B","range-knob-pressed":h,"range-knob-min":r===t,"range-knob-max":r===i},style:d(),role:"slider",tabindex:o?-1:0,"aria-valuemin":t,"aria-valuemax":i,"aria-disabled":o?"true":null,"aria-valuenow":r},c&&e("div",{class:"range-pin",role:"presentation",part:"pin"},Math.round(r)),e("div",{class:"range-knob",role:"presentation",part:"knob"}))};const d=(n,a,e,r)=>{let s=(e-a)*n;if(r>0){s=Math.round(s/r)*r+a}return t(a,s,e)};const b=(n,a,e)=>t(0,(n-a)/(e-a),1);g.style=c;export{g as nano_range};
|
5
|
+
//# sourceMappingURL=p-9eeed8f5.entry.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["src/utils/form.ts","src/components/range/range.scss?tag=nano-range&encapsulation=scoped","src/components/range/range.tsx"],"names":["renderHiddenInput","container","name","value","disabled","input","querySelector","ownerDocument","createElement","type","classList","add","appendChild","rangeCss","Range","this","noUpdate","hasFocus","clampBounds","clamp","min","max","ensureValueInBounds","dualKnobs","lower","upper","handleKeyboard","knob","isIncrease","step","ratioA","ratioB","updateValue","onBlur","nanoBlur","emit","emitStyle","onFocus","nanoFocus","[object Object]","nanoChange","debounceEvent","debounce","updateRatio","gesture","enable","debounceChanged","disabledChanged","destroy","undefined","rangeSlider","import","createGesture","el","gestureName","gesturePriority","threshold","onStart","ev","onMove","onEnd","nanoStyle","interactive","interactive-disabled","detail","rect","getBoundingClientRect","currentX","ratio","left","width","document","dir","pressedKnob","Math","abs","setFocus","update","snaps","valueToRatio","ratioToValue","valA","valB","ratioLower","ratioUpper","getValue","shadowRoot","knobEl","focus","pin","barStart","barEnd","doc","isRTL","start","end","tickStyle","tick","barStyle","ticks","active","push","JSON","stringify","h","Host","onFocusin","onFocusout","class","createColorClasses","color","range-disabled","range-pressed","range-has-pin","range-snaps","ref","rangeEl","map","style","role","range-tick","range-tick-active","part","renderKnob","pressed","knobStyle","onKeyDown","key","preventDefault","stopPropagation","range-knob-handle","range-knob-a","range-knob-b","range-knob-pressed","range-knob-min","range-knob-max","tabindex","aria-valuemin","aria-valuemax","aria-disabled","aria-valuenow","round"],"mappings":"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","sourcesContent":["export const renderHiddenInput = (\n container: HTMLElement,\n name: string,\n value: string | undefined | null,\n disabled: boolean\n) => {\n let input = container.querySelector(\n 'input.aux-input'\n ) as HTMLInputElement | null;\n if (!input) {\n input = container.ownerDocument!.createElement('input');\n input.type = 'hidden';\n input.classList.add('aux-input');\n container.appendChild(input);\n }\n input.disabled = disabled;\n input.name = name;\n input.value = value || '';\n};\n","@import '../../global/style/utilities/globals';\n@import '../../global/style/nano-theme/form';\n\n// Range\n// --------------------------------------------------\n\n:host {\n /**\n * @prop --knob-handle-size: defaults to calc(var(--knob-size) * 2);\n * @prop --rgb-inactive: defaults to #{color-to-rgb-list(#a5a5a5)};\n * @prop --bar-background: Background of the range bar; Defaults to #e2e1e0;\n * @prop --bar-background-active: Background of the active range bar; Defaults to #a5a5a5;\n * @prop --bar-height: Height of the range bar; Defaults to 8px;\n * @prop --bar-border-radius: Border radius of the range bar; Defaults to 4px;\n * @prop --height: Height of the range. Defaults to 42px;\n * @prop --knob-background: Background of the range knob. Defaults to #{nano-color(primary, base)};\n * @prop --knob-border-radius: Border radius of the range knob. Defaults to 50%;\n * @prop --knob-box-shadow: Box shadow of the range knob; Defaults to 0 2px 4px 0 rgba(0, 0, 0, 0.3);\n * @prop --knob-size: Size of the range knob; Defaults to 30px;\n * @prop --pin-background: Background of the range pin; Defaults to #{nano-color(primary, base)};\n * @prop --pin-color: Color of the range pin; Defaults to #{nano-color(primary, contrast)};\n * @prop --focus-style: Focus shadow around knob; Defaults to 0 0 0 5px #{$control-focus-color};\n */\n --knob-handle-size: (var(--knob-size) * 2);\n --rgb-inactive: #{color-to-rgb-list(#a5a5a5)};\n --knob-border-radius: 50%;\n --knob-background: #{nano-color(primary, base)};\n --knob-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.3);\n --knob-size: 30px;\n --bar-height: 8px;\n --bar-background: #e2e1e0;\n --bar-background-active: #a5a5a5;\n --bar-border-radius: 4px;\n --height: 42px;\n --pin-background: #{nano-color(primary, base)};\n --pin-color: #{nano-color(primary, contrast)};\n --focus-style: 0 0 0 5px #{$control-focus-color};\n}\n\n.range-wrap {\n display: flex;\n position: relative;\n flex: 3;\n align-items: center;\n user-select: none;\n\n ::slotted(ion-icon[slot]) {\n font-size: 1.5em;\n }\n\n ::slotted([slot='start']) {\n margin-inline: 0 14px;\n margin-block: 0;\n font-size: 0.9em;\n }\n\n ::slotted([slot='end']) {\n margin-inline: 14px 0;\n margin-block: 0;\n font-size: 0.9em;\n }\n}\n\n.range-slider {\n position: relative;\n flex: 1;\n width: 100%;\n height: var(--height);\n contain: size layout style;\n cursor: grab;\n touch-action: pan-y;\n}\n\n:host(.range-pressed) .range-slider {\n cursor: grabbing;\n}\n\n// bar\n\n.range-bar {\n border-radius: var(--bar-border-radius);\n inset-block-start: calc((var(--height) - var(--bar-height)) / 2);\n inset-inline-start: 0;\n position: absolute;\n width: 100%;\n height: var(--bar-height);\n background: var(--bar-background);\n pointer-events: none;\n\n :host(.range-snaps) & {\n border-radius: var(--bar-border-radius) 0 0 var(--bar-border-radius);\n }\n}\n\n.range-bar-active {\n inset-block-end: 0;\n width: auto;\n background: var(--bar-background-active);\n\n :host(.range-pressed) {\n will-change: left, right;\n }\n}\n\n// knob\n\n.range-knob {\n border-radius: var(--knob-border-radius);\n inset-block-start: calc(50% - var(--knob-size) / 2);\n inset-inline-start: calc(50% - var(--knob-size) / 2);\n position: absolute;\n width: var(--knob-size);\n height: var(--knob-size);\n background: var(--knob-background);\n box-shadow: var(--knob-box-shadow);\n z-index: 2;\n pointer-events: none;\n transform: scale(0.67);\n transition-duration: 120ms;\n transition-property: transform, background-color, border;\n transition-timing-function: ease;\n\n :host(:not(.range-has-pin)) .range-knob-pressed & {\n transform: scale(1);\n }\n}\n\n.range-knob-handle {\n inset-block-start: calc((var(--height) - var(--knob-handle-size)) / 2);\n inset-inline-start: 0;\n margin-inline-start: calc(0px - var(--knob-handle-size) / 2);\n position: absolute;\n width: calc(var(--knob-handle-size));\n height: calc(var(--knob-handle-size));\n text-align: center;\n\n &:active,\n &:focus {\n outline: none;\n\n .range-knob {\n box-shadow: var(--knob-box-shadow), var(--focus-style);\n }\n }\n}\n\n// ticks\n\n.range-tick {\n position: absolute;\n inset-block-start: calc((var(--height) - var(--bar-height)) / 2);\n width: var(--bar-height);\n height: var(--bar-height);\n background: var(--bar-background-active);\n z-index: 1;\n pointer-events: none;\n\n &:first-of-type {\n border-radius: var(--bar-border-radius) 0 0 var(--bar-border-radius);\n }\n\n &:last-of-type {\n border-radius: 0 var(--bar-border-radius) var(--bar-border-radius) 0;\n }\n\n &-active {\n background: transparent;\n }\n}\n\n// pin\n\n.range-pin {\n transform: translate3d(0, 0, 0) scale(0.01);\n transform-origin: center top;\n padding: 0.66em 0;\n border-radius: 50%;\n text-align: center;\n box-sizing: border-box;\n display: inline-block;\n position: relative;\n min-width: 2.33em;\n height: 2.33em;\n transition: transform 120ms ease, background 120ms ease;\n background: var(--pin-background);\n color: var(--pin-color);\n font-size: 0.75em;\n\n &::before {\n inset-block-start: 0.25em;\n inset-inline-start: 50%;\n margin-inline-start: -1.08em;\n border-radius: 50% 50% 50% 0;\n position: absolute;\n width: 2.16em;\n height: 2.16em;\n transform: rotate(-45deg);\n transition: background 120ms ease;\n background: var(--pin-background);\n content: '';\n z-index: -1;\n }\n\n .range-knob-pressed & {\n transform: translate3d(0, -50%, 0) scale(1);\n transform: translate3d(0, calc((100% - var(--bar-height)) * -1), 0) scale(1);\n }\n}\n\n// disabled\n\n:host(.range-disabled) {\n pointer-events: none;\n\n .range-bar-active,\n .range-bar,\n .range-tick {\n background-color: rgba(var(--rgb-inactive), 0.5);\n }\n\n .range-knob {\n transform: scale(0.55);\n outline: 5px solid #fff;\n background-color: rgba(var(--rgb-inactive), 0.5);\n }\n}\n\n// theme\n\n:host(.nano-color) {\n .range-bar-active,\n .range-knob,\n .range-pin,\n .range-pin::before,\n .range-tick {\n background: current-color(base);\n color: current-color(contrast);\n }\n\n .range-bar {\n background: current-color(base, 0.26);\n }\n\n .range-knob-handle {\n &:active,\n &:focus {\n .range-knob {\n box-shadow: var(--knob-box-shadow), 0 0 0 5px current-color(tint, 0.56);\n }\n }\n }\n}\n","import {\n Component,\n ComponentInterface,\n Element,\n Event,\n EventEmitter,\n Host,\n Prop,\n State,\n Watch,\n h,\n} from '@stencil/core';\nimport { renderHiddenInput } from '../../utils/form';\nimport { clamp } from '../../utils/math';\nimport { createColorClasses } from '../../utils/theme';\nimport { debounceEvent } from '../../utils/throttle';\nimport type {\n Color,\n Gesture,\n GestureDetail,\n KnobName,\n RangeChangeEventDetail,\n RangeValue,\n StyleEventDetail,\n} from '../../interface';\n\n/**\n * The Range slider lets users select from a range of values by moving\n * the slider knob. It can accept dual knobs, but by default one knob controls the value of the range.\n *\n * Labels can be placed on either side of the range by adding the\n * `slot=\"start\"` or `slot=\"end\"` to the element.\n *\n * @slot start - Content is placed to the left of the range slider in LTR, and to the right in RTL.\n * @slot end - Content is placed to the right of the range slider in LTR, and to the left in RTL.\n */\n@Component({\n tag: 'nano-range',\n styleUrl: 'range.scss',\n scoped: true,\n})\nexport class Range implements ComponentInterface {\n private noUpdate = false;\n private rect!: ClientRect;\n private hasFocus = false;\n private rangeSlider?: HTMLElement;\n private gesture?: Gesture;\n\n @Element() el!: HTMLNanoRangeElement;\n\n @State() private ratioA = 0;\n @State() private ratioB = 0;\n @State() private pressedKnob: KnobName;\n\n /**\n * The color to use from your application's color palette.\n * Default options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`\n */\n @Prop() color?: Color;\n\n /**\n * How long, in milliseconds, to wait to trigger the\n * `nanoChange` event after each change in the range value.\n */\n @Prop() debounce = 0;\n\n @Watch('debounce')\n protected debounceChanged() {\n this.nanoChange = debounceEvent(this.nanoChange, this.debounce);\n }\n\n /**\n * The name of the control, which is submitted with the form data.\n */\n @Prop() name = '';\n\n /**\n * Show two knobs.\n */\n @Prop() dualKnobs = false;\n\n /**\n * Minimum integer value of the range.\n */\n @Prop() min = 0;\n @Watch('min')\n protected minChanged() {\n if (!this.noUpdate) {\n this.updateRatio();\n }\n }\n\n /**\n * Maximum integer value of the range.\n */\n @Prop() max = 100;\n @Watch('max')\n protected maxChanged() {\n if (!this.noUpdate) {\n this.updateRatio();\n }\n }\n\n /**\n * If `true`, a pin with integer value is shown when the knob\n * is pressed.\n */\n @Prop() pin = false;\n\n /**\n * If `true`, the knob snaps to tick marks evenly spaced based\n * on the step property value.\n */\n @Prop() snaps = false;\n\n /**\n * Specifies the value granularity.\n */\n @Prop() step = 1;\n\n /**\n * If `true`, tick marks are displayed based on the step value.\n * Only applies when `snaps` is `true`.\n */\n @Prop() ticks = false;\n\n /**\n * If `true`, the user cannot interact with the range.\n */\n @Prop() disabled = false;\n @Watch('disabled')\n protected disabledChanged() {\n if (this.gesture) {\n this.gesture.enable(!this.disabled);\n }\n this.emitStyle();\n }\n\n /**\n * the value of the range.\n */\n @Prop({ mutable: true }) value: RangeValue = 0;\n @Watch('value')\n protected valueChanged(value: RangeValue) {\n if (!this.noUpdate) {\n this.updateRatio();\n }\n\n value = this.ensureValueInBounds(value);\n\n this.nanoChange.emit({ value });\n }\n\n private clampBounds = (value: any): number => {\n return clamp(this.min, value, this.max);\n };\n\n private ensureValueInBounds = (value: any) => {\n if (this.dualKnobs) {\n return {\n lower: this.clampBounds(value.lower),\n upper: this.clampBounds(value.upper),\n };\n } else {\n return this.clampBounds(value);\n }\n };\n\n /**\n * Emitted when the value property has changed.\n */\n @Event() nanoChange!: EventEmitter<RangeChangeEventDetail>;\n\n /**\n * Emitted when the styles change.\n * @internal\n */\n @Event() nanoStyle!: EventEmitter<StyleEventDetail>;\n\n /**\n * Emitted when the range has focus.\n */\n @Event() nanoFocus!: EventEmitter<void>;\n\n /**\n * Emitted when the range loses focus.\n */\n @Event() nanoBlur!: EventEmitter<void>;\n\n connectedCallback() {\n this.updateRatio();\n this.debounceChanged();\n this.disabledChanged();\n }\n\n disconnectedCallback() {\n if (this.gesture) {\n this.gesture.destroy();\n this.gesture = undefined;\n }\n }\n\n async componentDidLoad() {\n const rangeSlider = this.rangeSlider;\n if (rangeSlider) {\n this.gesture = (await import('../../utils/gesture/index')).createGesture({\n el: rangeSlider,\n gestureName: 'range',\n gesturePriority: 100,\n threshold: 0,\n onStart: (ev) => this.onStart(ev),\n onMove: (ev) => this.onMove(ev),\n onEnd: (ev) => this.onEnd(ev),\n });\n this.gesture.enable(!this.disabled);\n }\n }\n\n private handleKeyboard = (knob: KnobName, isIncrease: boolean) => {\n let step = this.step;\n step = step > 0 ? step : 1;\n step = step / (this.max - this.min);\n if (!isIncrease) {\n step *= -1;\n }\n if (knob === 'A') {\n this.ratioA = clamp(0, this.ratioA + step, 1);\n } else {\n this.ratioB = clamp(0, this.ratioB + step, 1);\n }\n this.updateValue();\n };\n\n private getValue(): RangeValue {\n const value = this.value || 0;\n if (this.dualKnobs) {\n if (typeof value === 'object') {\n return value;\n }\n return {\n lower: 0,\n upper: value,\n };\n } else {\n if (typeof value === 'object') {\n return value.upper;\n }\n return value;\n }\n }\n\n private emitStyle() {\n this.nanoStyle.emit({\n interactive: true,\n 'interactive-disabled': this.disabled,\n });\n }\n\n private onStart(detail: GestureDetail) {\n const rect = (this.rect = this.rangeSlider!.getBoundingClientRect() as any);\n const currentX = detail.currentX;\n\n // figure out which knob they started closer to\n let ratio = clamp(0, (currentX - rect.left) / rect.width, 1);\n if (document.dir === 'rtl') {\n ratio = 1 - ratio;\n }\n\n this.pressedKnob =\n !this.dualKnobs ||\n Math.abs(this.ratioA - ratio) < Math.abs(this.ratioB - ratio)\n ? 'A'\n : 'B';\n\n this.setFocus(this.pressedKnob);\n\n // update the active knob's position\n this.update(currentX);\n }\n\n private onMove(detail: GestureDetail) {\n this.update(detail.currentX);\n }\n\n private onEnd(detail: GestureDetail) {\n this.update(detail.currentX);\n this.pressedKnob = undefined;\n }\n\n private update(currentX: number) {\n // figure out where the pointer is currently at\n // update the knob being interacted with\n const rect = this.rect;\n let ratio = clamp(0, (currentX - rect.left) / rect.width, 1);\n if (document.dir === 'rtl') {\n ratio = 1 - ratio;\n }\n\n if (this.snaps) {\n // snaps the ratio to the current value\n ratio = valueToRatio(\n ratioToValue(ratio, this.min, this.max, this.step),\n this.min,\n this.max\n );\n }\n\n // update which knob is pressed\n if (this.pressedKnob === 'A') {\n this.ratioA = ratio;\n } else {\n this.ratioB = ratio;\n }\n\n // Update input value\n this.updateValue();\n }\n\n private get valA() {\n return ratioToValue(this.ratioA, this.min, this.max, this.step);\n }\n\n private get valB() {\n return ratioToValue(this.ratioB, this.min, this.max, this.step);\n }\n\n private get ratioLower() {\n if (this.dualKnobs) {\n return Math.min(this.ratioA, this.ratioB);\n }\n return 0;\n }\n\n private get ratioUpper() {\n if (this.dualKnobs) {\n return Math.max(this.ratioA, this.ratioB);\n }\n return this.ratioA;\n }\n\n private updateRatio() {\n const value = this.getValue() as any;\n const { min, max } = this;\n if (this.dualKnobs) {\n this.ratioA = valueToRatio(value.lower, min, max);\n this.ratioB = valueToRatio(value.upper, min, max);\n } else {\n this.ratioA = valueToRatio(value, min, max);\n }\n }\n\n private updateValue() {\n this.noUpdate = true;\n\n const { valA, valB } = this;\n this.value = !this.dualKnobs\n ? valA\n : {\n lower: Math.min(valA, valB),\n upper: Math.max(valA, valB),\n };\n\n this.noUpdate = false;\n }\n\n private setFocus(knob: KnobName) {\n if (this.el.shadowRoot) {\n const knobEl = this.el.shadowRoot.querySelector(\n knob === 'A' ? '.range-knob-a' : '.range-knob-b'\n ) as HTMLElement | undefined;\n if (knobEl) {\n knobEl.focus();\n }\n }\n }\n\n private onBlur = () => {\n if (this.hasFocus) {\n this.hasFocus = false;\n this.nanoBlur.emit();\n this.emitStyle();\n }\n };\n\n private onFocus = () => {\n if (!this.hasFocus) {\n this.hasFocus = true;\n this.nanoFocus.emit();\n this.emitStyle();\n }\n };\n\n render() {\n const {\n min,\n max,\n step,\n el,\n handleKeyboard,\n pressedKnob,\n disabled,\n pin,\n ratioLower,\n ratioUpper,\n } = this;\n\n const barStart = `${ratioLower * 100}%`;\n const barEnd = `${100 - ratioUpper * 100}%`;\n\n const doc = document;\n const isRTL = doc.dir === 'rtl';\n const start = isRTL ? 'right' : 'left';\n const end = isRTL ? 'left' : 'right';\n\n const tickStyle = (tick: any) => {\n return {\n [start]: tick[start],\n };\n };\n\n const barStyle = {\n [start]: barStart,\n [end]: barEnd,\n };\n\n const ticks = [];\n if (this.snaps && this.ticks) {\n for (let value = min; value <= max; value += step) {\n const ratio = valueToRatio(value, min, max);\n\n const tick: any = {\n ratio,\n active: ratio >= ratioLower && ratio <= ratioUpper,\n };\n\n tick[start] = `${ratio * 100}%`;\n\n ticks.push(tick);\n }\n }\n\n renderHiddenInput(el, this.name, JSON.stringify(this.getValue()), disabled);\n\n return (\n <Host\n onFocusin={this.onFocus}\n onFocusout={this.onBlur}\n class={createColorClasses(this.color, {\n 'range-disabled': disabled,\n 'range-pressed': pressedKnob !== undefined,\n 'range-has-pin': pin,\n 'range-snaps': this.snaps,\n })}\n >\n <div class=\"range-wrap\">\n <slot name=\"start\"></slot>\n <div\n class=\"range-slider\"\n ref={(rangeEl) => (this.rangeSlider = rangeEl)}\n >\n {ticks.map((tick) => (\n <span\n style={tickStyle(tick)}\n role=\"presentation\"\n class={{\n 'range-tick': true,\n 'range-tick-active': tick.active,\n }}\n part={tick.active ? 'tick-active' : 'tick'}\n />\n ))}\n\n <div class=\"range-bar\" role=\"presentation\" part=\"bar\" />\n <div\n class=\"range-bar range-bar-active\"\n role=\"presentation\"\n style={barStyle}\n part=\"bar-active\"\n />\n\n {renderKnob(isRTL, {\n knob: 'A',\n pressed: pressedKnob === 'A',\n value: this.valA,\n ratio: this.ratioA,\n pin,\n disabled,\n handleKeyboard,\n min,\n max,\n })}\n\n {this.dualKnobs &&\n renderKnob(isRTL, {\n knob: 'B',\n pressed: pressedKnob === 'B',\n value: this.valB,\n ratio: this.ratioB,\n pin,\n disabled,\n handleKeyboard,\n min,\n max,\n })}\n </div>\n <slot name=\"end\"></slot>\n </div>\n </Host>\n );\n }\n}\n\ninterface RangeKnob {\n knob: KnobName;\n value: number;\n ratio: number;\n min: number;\n max: number;\n disabled: boolean;\n pressed: boolean;\n pin: boolean;\n\n handleKeyboard: (name: KnobName, isIncrease: boolean) => void;\n}\n\nconst renderKnob = (\n isRTL: boolean,\n {\n knob,\n value,\n ratio,\n min,\n max,\n disabled,\n pressed,\n pin,\n handleKeyboard,\n }: RangeKnob\n) => {\n const start = isRTL ? 'right' : 'left';\n\n const knobStyle = () => {\n const style: any = {};\n style[start] = `${ratio * 100}%`;\n return style;\n };\n\n return (\n <div\n onKeyDown={(ev: KeyboardEvent) => {\n const key = ev.key;\n if (key === 'ArrowLeft' || key === 'ArrowDown') {\n handleKeyboard(knob, false);\n ev.preventDefault();\n ev.stopPropagation();\n } else if (key === 'ArrowRight' || key === 'ArrowUp') {\n handleKeyboard(knob, true);\n ev.preventDefault();\n ev.stopPropagation();\n }\n }}\n class={{\n 'range-knob-handle': true,\n 'range-knob-a': knob === 'A',\n 'range-knob-b': knob === 'B',\n 'range-knob-pressed': pressed,\n 'range-knob-min': value === min,\n 'range-knob-max': value === max,\n }}\n style={knobStyle()}\n role=\"slider\"\n tabindex={disabled ? -1 : 0}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-disabled={disabled ? 'true' : null}\n aria-valuenow={value}\n >\n {pin && (\n <div class=\"range-pin\" role=\"presentation\" part=\"pin\">\n {Math.round(value)}\n </div>\n )}\n <div class=\"range-knob\" role=\"presentation\" part=\"knob\" />\n </div>\n );\n};\n\nconst ratioToValue = (\n ratio: number,\n min: number,\n max: number,\n step: number\n): number => {\n let value = (max - min) * ratio;\n if (step > 0) {\n value = Math.round(value / step) * step + min;\n }\n return clamp(min, value, max);\n};\n\nconst valueToRatio = (value: number, min: number, max: number): number => {\n return clamp(0, (value - min) / (max - min), 1);\n};\n"]}
|
1
|
+
{"version":3,"sources":["src/utils/form.ts","src/components/range/range.scss?tag=nano-range&encapsulation=scoped","src/components/range/range.tsx"],"names":["renderHiddenInput","container","name","value","disabled","input","querySelector","ownerDocument","createElement","type","classList","add","appendChild","rangeCss","Range","this","noUpdate","hasFocus","clampBounds","clamp","min","max","ensureValueInBounds","dualKnobs","lower","upper","handleKeyboard","knob","isIncrease","step","ratioA","ratioB","updateValue","onBlur","nanoBlur","emit","emitStyle","onFocus","nanoFocus","[object Object]","nanoChange","debounceEvent","debounce","updateRatio","gesture","enable","debounceChanged","disabledChanged","destroy","undefined","rangeSlider","import","createGesture","el","gestureName","gesturePriority","threshold","onStart","ev","onMove","onEnd","nanoStyle","interactive","interactive-disabled","detail","rect","getBoundingClientRect","currentX","ratio","left","width","document","dir","pressedKnob","Math","abs","setFocus","update","snaps","valueToRatio","ratioToValue","valA","valB","ratioLower","ratioUpper","getValue","shadowRoot","knobEl","focus","pin","barStart","barEnd","doc","isRTL","start","end","tickStyle","tick","barStyle","ticks","active","push","JSON","stringify","h","Host","onFocusin","onFocusout","class","createColorClasses","color","range-disabled","range-pressed","range-has-pin","range-snaps","ref","rangeEl","map","style","role","range-tick","range-tick-active","part","renderKnob","pressed","knobStyle","onKeyDown","key","preventDefault","stopPropagation","range-knob-handle","range-knob-a","range-knob-b","range-knob-pressed","range-knob-min","range-knob-max","tabindex","aria-valuemin","aria-valuemax","aria-disabled","aria-valuenow","round"],"mappings":"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","sourcesContent":["export const renderHiddenInput = (\n container: HTMLElement,\n name: string,\n value: string | undefined | null,\n disabled: boolean\n) => {\n let input = container.querySelector(\n 'input.aux-input'\n ) as HTMLInputElement | null;\n if (!input) {\n input = container.ownerDocument!.createElement('input');\n input.type = 'hidden';\n input.classList.add('aux-input');\n container.appendChild(input);\n }\n input.disabled = disabled;\n input.name = name;\n input.value = value || '';\n};\n","@import '../../global/style/utilities/globals';\n@import '../../global/style/nano-theme/form';\n\n// Range\n// --------------------------------------------------\n\n:host {\n /**\n * @prop --knob-handle-size: defaults to calc(var(--knob-size) * 2);\n * @prop --rgb-inactive: defaults to #{color-to-rgb-list(#a5a5a5)};\n * @prop --bar-background: Background of the range bar; Defaults to #e2e1e0;\n * @prop --bar-background-active: Background of the active range bar; Defaults to #a5a5a5;\n * @prop --bar-height: Height of the range bar; Defaults to 8px;\n * @prop --bar-border-radius: Border radius of the range bar; Defaults to 4px;\n * @prop --height: Height of the range. Defaults to 42px;\n * @prop --knob-background: Background of the range knob. Defaults to #{nano-color(primary, base)};\n * @prop --knob-border-radius: Border radius of the range knob. Defaults to 50%;\n * @prop --knob-box-shadow: Box shadow of the range knob; Defaults to 0 2px 4px 0 rgba(0, 0, 0, 0.3);\n * @prop --knob-size: Size of the range knob; Defaults to 30px;\n * @prop --pin-background: Background of the range pin; Defaults to #{nano-color(primary, base)};\n * @prop --pin-color: Color of the range pin; Defaults to #{nano-color(primary, contrast)};\n * @prop --focus-style: Focus shadow around knob; Defaults to 0 0 0 5px #{$control-focus-color};\n */\n --knob-handle-size: (var(--knob-size) * 2);\n --rgb-inactive: #{color-to-rgb-list(#a5a5a5)};\n --knob-border-radius: 50%;\n --knob-background: #{nano-color(primary, base)};\n --knob-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.3);\n --knob-size: 30px;\n --bar-height: 8px;\n --bar-background: #e2e1e0;\n --bar-background-active: #a5a5a5;\n --bar-border-radius: 4px;\n --height: 42px;\n --pin-background: #{nano-color(primary, base)};\n --pin-color: #{nano-color(primary, contrast)};\n --focus-style: 0 0 0 5px #{$control-focus-color};\n}\n\n.range-wrap {\n display: flex;\n position: relative;\n flex: 3;\n align-items: center;\n user-select: none;\n\n ::slotted(ion-icon[slot]) {\n font-size: 1.5em;\n }\n\n ::slotted([slot='start']) {\n margin-inline: 0 14px;\n margin-block: 0;\n font-size: 0.9em;\n }\n\n ::slotted([slot='end']) {\n margin-inline: 14px 0;\n margin-block: 0;\n font-size: 0.9em;\n }\n}\n\n.range-slider {\n position: relative;\n flex: 1;\n width: 100%;\n height: var(--height);\n contain: size layout style;\n cursor: grab;\n touch-action: pan-y;\n}\n\n:host(.range-pressed) .range-slider {\n cursor: grabbing;\n}\n\n// bar\n\n.range-bar {\n border-radius: var(--bar-border-radius);\n inset-block-start: calc((var(--height) - var(--bar-height)) / 2);\n inset-inline-start: 0;\n position: absolute;\n width: 100%;\n height: var(--bar-height);\n background: var(--bar-background);\n pointer-events: none;\n\n :host(.range-snaps) & {\n border-radius: var(--bar-border-radius) 0 0 var(--bar-border-radius);\n }\n}\n\n.range-bar-active {\n inset-block-end: 0;\n width: auto;\n background: var(--bar-background-active);\n\n :host(.range-pressed) {\n will-change: left, right;\n }\n}\n\n// knob\n\n.range-knob {\n border-radius: var(--knob-border-radius);\n inset-block-start: calc(50% - var(--knob-size) / 2);\n inset-inline-start: calc(50% - var(--knob-size) / 2);\n position: absolute;\n width: var(--knob-size);\n height: var(--knob-size);\n background: var(--knob-background);\n box-shadow: var(--knob-box-shadow);\n z-index: 2;\n pointer-events: none;\n transform: scale(0.67);\n transition-duration: 120ms;\n transition-property: transform, background-color, border;\n transition-timing-function: ease;\n\n :host(:not(.range-has-pin)) .range-knob-pressed & {\n transform: scale(1);\n }\n}\n\n.range-knob-handle {\n inset-block-start: calc((var(--height) - var(--knob-handle-size)) / 2);\n inset-inline-start: 0;\n margin-inline-start: calc(0px - var(--knob-handle-size) / 2);\n position: absolute;\n width: calc(var(--knob-handle-size));\n height: calc(var(--knob-handle-size));\n text-align: center;\n\n &:active,\n &:focus {\n outline: none;\n\n .range-knob {\n box-shadow: var(--knob-box-shadow), var(--focus-style);\n }\n }\n}\n\n// ticks\n\n.range-tick {\n position: absolute;\n inset-block-start: calc((var(--height) - var(--bar-height)) / 2);\n width: var(--bar-height);\n height: var(--bar-height);\n background: var(--bar-background-active);\n z-index: 1;\n pointer-events: none;\n\n &:first-of-type {\n border-radius: var(--bar-border-radius) 0 0 var(--bar-border-radius);\n }\n\n &:last-of-type {\n border-radius: 0 var(--bar-border-radius) var(--bar-border-radius) 0;\n }\n\n &-active {\n background: transparent;\n }\n}\n\n// pin\n\n.range-pin {\n transform: translate3d(0, 0, 0) scale(0.01);\n transform-origin: center top;\n padding: 0.66em 0;\n border-radius: 50%;\n text-align: center;\n box-sizing: border-box;\n display: inline-block;\n position: relative;\n min-width: 2.33em;\n height: 2.33em;\n transition: transform 120ms ease, background 120ms ease;\n background: var(--pin-background);\n color: var(--pin-color);\n font-size: 0.75em;\n\n &::before {\n inset-block-start: 0.25em;\n inset-inline-start: 50%;\n margin-inline-start: -1.08em;\n border-radius: 50% 50% 50% 0;\n position: absolute;\n width: 2.16em;\n height: 2.16em;\n transform: rotate(-45deg);\n transition: background 120ms ease;\n background: var(--pin-background);\n content: '';\n z-index: -1;\n }\n\n .range-knob-pressed & {\n transform: translate3d(0, -50%, 0) scale(1);\n transform: translate3d(0, calc((100% - var(--bar-height)) * -1), 0) scale(1);\n }\n}\n\n// disabled\n\n:host(.range-disabled) {\n pointer-events: none;\n\n .range-bar-active,\n .range-bar,\n .range-tick {\n background-color: rgba(var(--rgb-inactive), 0.5);\n }\n\n .range-knob {\n transform: scale(0.55);\n outline: 5px solid #fff;\n background-color: rgba(var(--rgb-inactive), 0.5);\n }\n}\n\n// theme\n\n:host(.nano-color) {\n .range-bar-active,\n .range-knob,\n .range-pin,\n .range-pin::before,\n .range-tick {\n background: current-color(base);\n color: current-color(contrast);\n }\n\n .range-bar {\n background: current-color(base, 0.26);\n }\n\n .range-knob-handle {\n &:active,\n &:focus {\n .range-knob {\n box-shadow: var(--knob-box-shadow), 0 0 0 5px current-color(tint, 0.56);\n }\n }\n }\n}\n","import {\n Component,\n ComponentInterface,\n Element,\n Event,\n EventEmitter,\n Host,\n Prop,\n State,\n Watch,\n h,\n} from '@stencil/core';\nimport { renderHiddenInput } from '../../utils/form';\nimport { clamp } from '../../utils/math';\nimport { createColorClasses } from '../../utils/theme';\nimport { debounceEvent } from '../../utils/throttle';\nimport type {\n Color,\n Gesture,\n GestureDetail,\n KnobName,\n RangeChangeEventDetail,\n RangeValue,\n StyleEventDetail,\n} from '../../interface';\n\n/**\n * The Range slider lets users select from a range of values by moving\n * the slider knob. It can accept dual knobs, but by default one knob controls the value of the range.\n *\n * Labels can be placed on either side of the range by adding the\n * `slot=\"start\"` or `slot=\"end\"` to the element.\n *\n * @slot start - Content is placed to the left of the range slider in LTR, and to the right in RTL.\n * @slot end - Content is placed to the right of the range slider in LTR, and to the left in RTL.\n */\n@Component({\n tag: 'nano-range',\n styleUrl: 'range.scss',\n scoped: true,\n})\nexport class Range implements ComponentInterface {\n private noUpdate = false;\n private rect!: ClientRect;\n private hasFocus = false;\n private rangeSlider?: HTMLElement;\n private gesture?: Gesture;\n\n @Element() el!: HTMLNanoRangeElement;\n\n @State() private ratioA = 0;\n @State() private ratioB = 0;\n @State() private pressedKnob: KnobName;\n\n /**\n * The color to use from your application's color palette.\n * Default options are: `\"primary\"`, `\"secondary\"`, `\"tertiary\"`, `\"success\"`, `\"warning\"`, `\"danger\"`, `\"light\"`, `\"medium\"`, and `\"dark\"`\n */\n @Prop() color?: Color;\n\n /**\n * How long, in milliseconds, to wait to trigger the\n * `nanoChange` event after each change in the range value.\n */\n @Prop() debounce = 0;\n\n @Watch('debounce')\n protected debounceChanged() {\n this.nanoChange = debounceEvent(this.nanoChange, this.debounce);\n }\n\n /**\n * The name of the control, which is submitted with the form data.\n */\n @Prop() name = '';\n\n /**\n * Show two knobs.\n */\n @Prop() dualKnobs = false;\n\n /**\n * Minimum integer value of the range.\n */\n @Prop() min = 0;\n @Watch('min')\n protected minChanged() {\n if (!this.noUpdate) {\n this.updateRatio();\n }\n }\n\n /**\n * Maximum integer value of the range.\n */\n @Prop() max = 100;\n @Watch('max')\n protected maxChanged() {\n if (!this.noUpdate) {\n this.updateRatio();\n }\n }\n\n /**\n * If `true`, a pin with integer value is shown when the knob\n * is pressed.\n */\n @Prop() pin = false;\n\n /**\n * If `true`, the knob snaps to tick marks evenly spaced based\n * on the step property value.\n */\n @Prop() snaps = false;\n\n /**\n * Specifies the value granularity.\n */\n @Prop() step = 1;\n\n /**\n * If `true`, tick marks are displayed based on the step value.\n * Only applies when `snaps` is `true`.\n */\n @Prop() ticks = false;\n\n /**\n * If `true`, the user cannot interact with the range.\n */\n @Prop() disabled = false;\n @Watch('disabled')\n protected disabledChanged() {\n if (this.gesture) {\n this.gesture.enable(!this.disabled);\n }\n this.emitStyle();\n }\n\n /**\n * the value of the range.\n */\n @Prop({ mutable: true }) value: RangeValue = 0;\n @Watch('value')\n protected valueChanged(value: RangeValue) {\n if (!this.noUpdate) {\n this.updateRatio();\n }\n\n value = this.ensureValueInBounds(value);\n\n this.nanoChange.emit({ value });\n }\n\n private clampBounds = (value: any): number => {\n return clamp(this.min, value, this.max);\n };\n\n private ensureValueInBounds = (value: any) => {\n if (this.dualKnobs) {\n return {\n lower: this.clampBounds(value.lower),\n upper: this.clampBounds(value.upper),\n };\n } else {\n return this.clampBounds(value);\n }\n };\n\n /**\n * Emitted when the value property has changed.\n */\n @Event() nanoChange!: EventEmitter<RangeChangeEventDetail>;\n\n /**\n * Emitted when the styles change.\n * @internal\n */\n @Event() nanoStyle!: EventEmitter<StyleEventDetail>;\n\n /**\n * Emitted when the range has focus.\n */\n @Event() nanoFocus!: EventEmitter<void>;\n\n /**\n * Emitted when the range loses focus.\n */\n @Event() nanoBlur!: EventEmitter<void>;\n\n connectedCallback() {\n this.updateRatio();\n this.debounceChanged();\n this.disabledChanged();\n }\n\n disconnectedCallback() {\n if (this.gesture) {\n this.gesture.destroy();\n this.gesture = undefined;\n }\n }\n\n async componentDidLoad() {\n const rangeSlider = this.rangeSlider;\n if (rangeSlider) {\n this.gesture = (await import('../../utils/gesture/index')).createGesture({\n el: rangeSlider,\n gestureName: 'range',\n gesturePriority: 100,\n threshold: 0,\n onStart: (ev) => this.onStart(ev),\n onMove: (ev) => this.onMove(ev),\n onEnd: (ev) => this.onEnd(ev),\n });\n this.gesture.enable(!this.disabled);\n }\n }\n\n private handleKeyboard = (knob: KnobName, isIncrease: boolean) => {\n let step = this.step;\n step = step > 0 ? step : 1;\n step = step / (this.max - this.min);\n if (!isIncrease) {\n step *= -1;\n }\n if (knob === 'A') {\n this.ratioA = clamp(0, this.ratioA + step, 1);\n } else {\n this.ratioB = clamp(0, this.ratioB + step, 1);\n }\n this.updateValue();\n };\n\n private getValue(): RangeValue {\n const value = this.value || 0;\n if (this.dualKnobs) {\n if (typeof value === 'object') {\n return value;\n }\n return {\n lower: 0,\n upper: value,\n };\n } else {\n if (typeof value === 'object') {\n return value.upper;\n }\n return value;\n }\n }\n\n private emitStyle() {\n this.nanoStyle.emit({\n interactive: true,\n 'interactive-disabled': this.disabled,\n });\n }\n\n private onStart(detail: GestureDetail) {\n const rect = (this.rect = this.rangeSlider!.getBoundingClientRect() as any);\n const currentX = detail.currentX;\n\n // figure out which knob they started closer to\n let ratio = clamp(0, (currentX - rect.left) / rect.width, 1);\n if (document.dir === 'rtl') {\n ratio = 1 - ratio;\n }\n\n this.pressedKnob =\n !this.dualKnobs ||\n Math.abs(this.ratioA - ratio) < Math.abs(this.ratioB - ratio)\n ? 'A'\n : 'B';\n\n this.setFocus(this.pressedKnob);\n\n // update the active knob's position\n this.update(currentX);\n }\n\n private onMove(detail: GestureDetail) {\n this.update(detail.currentX);\n }\n\n private onEnd(detail: GestureDetail) {\n this.update(detail.currentX);\n this.pressedKnob = undefined;\n }\n\n private update(currentX: number) {\n // figure out where the pointer is currently at\n // update the knob being interacted with\n const rect = this.rect;\n let ratio = clamp(0, (currentX - rect.left) / rect.width, 1);\n if (document.dir === 'rtl') {\n ratio = 1 - ratio;\n }\n\n if (this.snaps) {\n // snaps the ratio to the current value\n ratio = valueToRatio(\n ratioToValue(ratio, this.min, this.max, this.step),\n this.min,\n this.max\n );\n }\n\n // update which knob is pressed\n if (this.pressedKnob === 'A') {\n this.ratioA = ratio;\n } else {\n this.ratioB = ratio;\n }\n\n // Update input value\n this.updateValue();\n }\n\n private get valA() {\n return ratioToValue(this.ratioA, this.min, this.max, this.step);\n }\n\n private get valB() {\n return ratioToValue(this.ratioB, this.min, this.max, this.step);\n }\n\n private get ratioLower() {\n if (this.dualKnobs) {\n return Math.min(this.ratioA, this.ratioB);\n }\n return 0;\n }\n\n private get ratioUpper() {\n if (this.dualKnobs) {\n return Math.max(this.ratioA, this.ratioB);\n }\n return this.ratioA;\n }\n\n private updateRatio() {\n const value = this.getValue() as any;\n const { min, max } = this;\n if (this.dualKnobs) {\n this.ratioA = valueToRatio(value.lower, min, max);\n this.ratioB = valueToRatio(value.upper, min, max);\n } else {\n this.ratioA = valueToRatio(value, min, max);\n }\n }\n\n private updateValue() {\n this.noUpdate = true;\n\n const { valA, valB } = this;\n this.value = !this.dualKnobs\n ? valA\n : {\n lower: Math.min(valA, valB),\n upper: Math.max(valA, valB),\n };\n\n this.noUpdate = false;\n }\n\n private setFocus(knob: KnobName) {\n if (this.el.shadowRoot) {\n const knobEl = this.el.shadowRoot.querySelector(\n knob === 'A' ? '.range-knob-a' : '.range-knob-b'\n ) as HTMLElement | undefined;\n if (knobEl) {\n knobEl.focus();\n }\n }\n }\n\n private onBlur = () => {\n if (this.hasFocus) {\n this.hasFocus = false;\n this.nanoBlur.emit();\n this.emitStyle();\n }\n };\n\n private onFocus = () => {\n if (!this.hasFocus) {\n this.hasFocus = true;\n this.nanoFocus.emit();\n this.emitStyle();\n }\n };\n\n render() {\n const {\n min,\n max,\n step,\n el,\n handleKeyboard,\n pressedKnob,\n disabled,\n pin,\n ratioLower,\n ratioUpper,\n } = this;\n\n const barStart = `${ratioLower * 100}%`;\n const barEnd = `${100 - ratioUpper * 100}%`;\n\n const doc = document;\n const isRTL = doc.dir === 'rtl';\n const start = isRTL ? 'right' : 'left';\n const end = isRTL ? 'left' : 'right';\n\n const tickStyle = (tick: any) => {\n return {\n [start]: tick[start],\n };\n };\n\n const barStyle = {\n [start]: barStart,\n [end]: barEnd,\n };\n\n const ticks = [];\n if (this.snaps && this.ticks) {\n for (let value = min; value <= max; value += step) {\n const ratio = valueToRatio(value, min, max);\n\n const tick: any = {\n ratio,\n active: ratio >= ratioLower && ratio <= ratioUpper,\n };\n\n tick[start] = `${ratio * 100}%`;\n\n ticks.push(tick);\n }\n }\n\n renderHiddenInput(el, this.name, JSON.stringify(this.getValue()), disabled);\n\n return (\n <Host\n onFocusin={this.onFocus}\n onFocusout={this.onBlur}\n class={createColorClasses(this.color, {\n 'range-disabled': disabled,\n 'range-pressed': pressedKnob !== undefined,\n 'range-has-pin': pin,\n 'range-snaps': this.snaps,\n })}\n >\n <div class=\"range-wrap\">\n <slot name=\"start\"></slot>\n <div\n class=\"range-slider\"\n ref={(rangeEl) => (this.rangeSlider = rangeEl)}\n >\n {ticks.map((tick) => (\n <span\n style={tickStyle(tick)}\n role=\"presentation\"\n class={{\n 'range-tick': true,\n 'range-tick-active': tick.active,\n }}\n part={tick.active ? 'tick-active' : 'tick'}\n />\n ))}\n\n <div class=\"range-bar\" role=\"presentation\" part=\"bar\" />\n <div\n class=\"range-bar range-bar-active\"\n role=\"presentation\"\n style={barStyle}\n part=\"bar-active\"\n />\n\n {renderKnob(isRTL, {\n knob: 'A',\n pressed: pressedKnob === 'A',\n value: this.valA,\n ratio: this.ratioA,\n pin,\n disabled,\n handleKeyboard,\n min,\n max,\n })}\n\n {this.dualKnobs &&\n renderKnob(isRTL, {\n knob: 'B',\n pressed: pressedKnob === 'B',\n value: this.valB,\n ratio: this.ratioB,\n pin,\n disabled,\n handleKeyboard,\n min,\n max,\n })}\n </div>\n <slot name=\"end\"></slot>\n </div>\n </Host>\n );\n }\n}\n\ninterface RangeKnob {\n knob: KnobName;\n value: number;\n ratio: number;\n min: number;\n max: number;\n disabled: boolean;\n pressed: boolean;\n pin: boolean;\n\n handleKeyboard: (name: KnobName, isIncrease: boolean) => void;\n}\n\nconst renderKnob = (\n isRTL: boolean,\n {\n knob,\n value,\n ratio,\n min,\n max,\n disabled,\n pressed,\n pin,\n handleKeyboard,\n }: RangeKnob\n) => {\n const start = isRTL ? 'right' : 'left';\n\n const knobStyle = () => {\n const style: any = {};\n style[start] = `${ratio * 100}%`;\n return style;\n };\n\n return (\n <div\n onKeyDown={(ev: KeyboardEvent) => {\n const key = ev.key;\n if (key === 'ArrowLeft' || key === 'ArrowDown') {\n handleKeyboard(knob, false);\n ev.preventDefault();\n ev.stopPropagation();\n } else if (key === 'ArrowRight' || key === 'ArrowUp') {\n handleKeyboard(knob, true);\n ev.preventDefault();\n ev.stopPropagation();\n }\n }}\n class={{\n 'range-knob-handle': true,\n 'range-knob-a': knob === 'A',\n 'range-knob-b': knob === 'B',\n 'range-knob-pressed': pressed,\n 'range-knob-min': value === min,\n 'range-knob-max': value === max,\n }}\n style={knobStyle()}\n role=\"slider\"\n tabindex={disabled ? -1 : 0}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-disabled={disabled ? 'true' : null}\n aria-valuenow={value}\n >\n {pin && (\n <div class=\"range-pin\" role=\"presentation\" part=\"pin\">\n {Math.round(value)}\n </div>\n )}\n <div class=\"range-knob\" role=\"presentation\" part=\"knob\" />\n </div>\n );\n};\n\nconst ratioToValue = (\n ratio: number,\n min: number,\n max: number,\n step: number\n): number => {\n let value = (max - min) * ratio;\n if (step > 0) {\n value = Math.round(value / step) * step + min;\n }\n return clamp(min, value, max);\n};\n\nconst valueToRatio = (value: number, min: number, max: number): number => {\n return clamp(0, (value - min) / (max - min), 1);\n};\n"]}
|
@@ -0,0 +1,5 @@
|
|
1
|
+
/*!
|
2
|
+
* Web Components for Nanopore digital Web Apps
|
3
|
+
*/
|
4
|
+
import{r as i,c as a,h as o,a as t,g as e}from"./p-1fe12320.js";import{M as s}from"./p-c9a7c7ea.js";import{l as n,u as r}from"./p-885b6950.js";import{h as l}from"./p-b933f3c8.js";import{C as d}from"./p-e3860f00.js";import"./p-45abbbdd.js";import"./p-845ae77e.js";import"./p-9746b0a5.js";import"./p-69a3e911.js";const h=":host{box-sizing:border-box}*,*::before,*::after{box-sizing:border-box}[hidden]{display:none !important}:host{--border-radius:var(--nano-layer-border-radius, var(--nano-border-radius-medium, 4px));--content-background:#fafafa;--footer-content:#e4e6e8;--scrim-color:var(--nano-layer-overlay-dark, rgba(74, 74, 74, .5));--box-shadow:var(--nano-layer-shadow-large, 0 2px 8px rgba(0, 0, 0, 0.2));--close-button-color:#b5aea7;--width:60rem;--tint-color:#00607b;--body-padding-v:var(--nano-spacing-large, 20px);--body-padding-h:var(--nano-spacing-large, 20px);--header-padding-v:var(--nano-spacing-medium, 16px);--header-padding-h:var(--nano-spacing-large, 20px);--footer-padding-v:var(--nano-spacing-medium, 16px);--footer-padding-h:var(--nano-spacing-large, 20px)}.dialog{display:flex;align-items:center;justify-content:center;position:fixed;inset:0;z-index:var(--nano-layer-index-modal, 700)}.dialog:not(.dialog--visible){position:absolute;inline-size:1px;block-size:1px;clip:rect(0 0 0 0);-webkit-clip-path:inset(50%);clip-path:inset(50%);overflow:hidden;pointer-events:none;visibility:hidden}.dialog__panel{display:flex;flex-direction:column;z-index:2;inline-size:var(--width);max-inline-size:calc(100% - var(--nano-spacing-xlarge, 24px));max-block-size:calc(92% - var(--nano-spacing-xlarge, 24px));background-color:var(--content-background);border-radius:var(--border-radius);box-shadow:var(--box-shadow);opacity:0;transform:scale(0.8);transition:var(--nano-transition-fast, 0.3s) opacity, var(--nano-transition-fast, 0.3s) transform}.dialog__panel:focus{outline:none}.dialog--with-ribbon .dialog__panel{border-block-start:5px solid var(--tint-color)}.dialog--open .dialog__panel{display:flex;opacity:1;transform:none}.dialog--nodismiss .dialog__panel{animation:cannotClose 0.25s ease-in-out 1}@keyframes cannotClose{0%{transform:scale(1)}50%{transform:scale(1.08)}100%{transform:scale(1)}}.dialog__header{flex:0 0 auto;display:flex;min-inline-size:var(--width);inline-size:100%;background-color:var(--content-background);border-radius:var(--border-radius) var(--border-radius) 0 0;transition:var(--nano-transition-fast, 0.1s) box-shadow}.dialog--visible .dialog__header{min-inline-size:auto}[stuck] .dialog__header{box-shadow:var(--nano-layer-shadow-medium, 0 2px 4px rgba(0, 0, 0, 0.2))}.dialog__title{flex:1 1 auto;font-size:var(--nano-fontsize-large, 1.25rem);line-height:1.6;padding-block:var(--header-padding-v);padding-inline:var(--header-padding-h)}.dialog .dialog__close-icon{flex:0 0 auto;display:flex;align-items:center;font-size:var(--nano-fontsize-xlarge, 1.5rem);padding-block:0;padding-inline:var(--header-padding-h);--color:var(--close-button-color)}.dialog__body{padding-block:0 var(--body-padding-v);padding-inline:var(--body-padding-h)}.dialog:not(.dialog--has-header) .dialog__body{padding-block-start:var(--body-padding-v)}.dialog__body ::slotted(*){max-inline-size:100%}.dialog__body-wrap{flex:1 1 auto;overflow:auto;-webkit-overflow-scrolling:touch;border-radius:var(--border-radius)}.dialog:not(.dialog--has-header) .dialog__body-wrap{border-radius:0 0 inherit inherit}.dialog:not(.dialog--has-footer) .dialog__body-wrap{border-radius:inherit inherit 0 0}.dialog__footer{inline-size:100%;padding-block:var(--footer-padding-v);padding-inline:var(--footer-padding-h);background:var(--footer-content);border-radius:0 0 var(--border-radius) var(--border-radius);position:relative;inset-block-start:1px}.dialog--visible .dialog__footer{min-inline-size:auto}.dialog__footer ::slotted(button){margin-inline-end:var(--nano-spacing-small, 8px) !important}.dialog:not(.dialog--has-footer) .dialog__footer{display:none}.dialog__close-txt{color:var(--tint-color);border:none;text-decoration:underline;margin:0;text-underline-offset:4px;background-color:transparent;font:inherit;-webkit-box-align:center;cursor:pointer;font-size:var(--nano-fontsize-small, 0.875rem);padding:0.5rem;border-radius:var(--nano-border-radius-small, 2px);transition:box-shadow 100ms ease-in-out}.dialog__close-txt:focus{outline:none;box-shadow:var(--nano-control-focus-shadow, 0 0 0 0.1875rem var(--nano-control-focus-color, rgba(144, 198, 231, 0.8)))}.dialog__overlay{position:fixed;inset:0;background-color:var(--scrim-color);opacity:0;transition:var(--nano-transition-fast, 0.3s) opacity;-webkit-backdrop-filter:blur(var(--nano-layer-overlay-blur, 3px));backdrop-filter:blur(var(--nano-layer-overlay-blur, 3px))}.dialog--open .dialog__overlay{opacity:1}";let c=0;const p=class{constructor(o){i(this,o);this.nanoShow=a(this,"nanoShow",7);this.nanoAfterShow=a(this,"nanoAfterShow",7);this.nanoHide=a(this,"nanoHide",7);this.nanoAfterHide=a(this,"nanoAfterHide",7);this.nanoInitialFocus=a(this,"nanoInitialFocus",7);this.nanoRequestClose=a(this,"nanoRequestClose",7);this.componentId=`dialog-${++c}`;this.willShow=false;this.willHide=false;this.addedTransEnd=false;this.handleKeyDown=i=>{if(i.key==="Escape"){this.requestClose()}};this.requestClose=()=>{const i=this.nanoRequestClose.emit();if(!i.defaultPrevented&&!this.noUserDismiss){this.hide()}else{this.noDismiss=true;setTimeout((i=>this.noDismiss=false),250)}};this.handleTransitionEnd=i=>{if(i.propertyName==="opacity"&&i.composedPath().find((i=>i===this.panel||i===this.overlay))){this.isVisible=this.open;this.willShow=false;this.willHide=false;this.open?this.nanoAfterShow.emit():this.nanoAfterHide.emit()}};this.handleSlotChange=()=>{this.hasFooter=l(this.host,"footer")};this.isVisible=false;this.noDismiss=false;this.hasFooter=false;this.showRibbon=true;this.open=false;this.label=undefined;this.noHeader=false;this.noFooter=false;this.noUserDismiss=false;this.storeId=undefined;this.storeMethod="url-hash";this.hoist=false}handleOpenChange(){this.open?this.show():this.hide()}handleHoistChange(){if(!this.hoist||document.body.children[0]===this.host)return;document.body.prepend(this.host)}async show(){if(this.willShow){return}const i=this.nanoShow.emit();if(i.defaultPrevented){this.open=false;return}this.originalTrigger=document.activeElement;this.willShow=true;this.isVisible=true;this.open=true;this.modal.activate();n(this.host);if(this.open){this.host.addEventListener("nanoAfterShow",(()=>{const i=this.nanoInitialFocus.emit();if(!i.defaultPrevented){this.panel.focus({preventScroll:true})}}),{once:true})}}async hide(){if(this.willHide){return}const i=this.nanoHide.emit();if(i.defaultPrevented){this.open=true;return}this.willHide=true;this.open=false;this.modal.deactivate();r(this.host);this.stopVideos();const a=this.originalTrigger;if(a&&typeof a.focus==="function"){setTimeout((()=>a.focus()))}}stopVideos(){const i=Array.from(this.host.querySelectorAll("iframe,video"));i.forEach((i=>{if(i.tagName.toLowerCase()==="video")i.pause();else{const a=i.src;i.src=a}}))}connectedCallback(){this.handleHoistChange();this.modal=new s(this.host);if(this.panel){this.addedTransEnd=true;this.panel.addEventListener("transitionend",this.handleTransitionEnd)}}componentWillLoad(){this.handleSlotChange();if(this.open)this.show();if(this.storeId)d.init(this,["open"],this.storeMethod,this.storeId)}componentDidLoad(){if(!this.addedTransEnd){this.panel.addEventListener("transitionend",this.handleTransitionEnd)}}disconnectedCallback(){if(!this.panel)return;r(this.host);this.addedTransEnd=false;this.panel.removeEventListener("transitionend",this.handleTransitionEnd)}render(){return o(t,{showing:this.isVisible?true:undefined},o("div",{part:"base",class:{dialog:true,"dialog--open":this.open,"dialog--visible":this.isVisible,"dialog--has-footer":!this.noFooter,"dialog--has-header":!this.noHeader,"dialog--nodismiss":this.noDismiss,"dialog--with-ribbon":this.showRibbon},onKeyDown:this.handleKeyDown},o("div",{part:"overlay",class:"dialog__overlay",ref:i=>this.overlay=i,onClick:this.requestClose}),o("div",{ref:i=>this.panel=i,part:"panel",class:"dialog__panel",role:"dialog","aria-modal":"true","aria-hidden":this.open?"false":"true","aria-label":this.noHeader?this.label:null,"aria-labelledby":!this.noHeader?`${this.componentId}-title`:null,tabIndex:0},o("div",{class:"dialog__body-wrap"},!this.noHeader&&o("nano-sticker",null,o("header",{part:"header",class:"dialog__header"},o("span",{part:"title",class:"dialog__title",id:`${this.componentId}-title`},o("slot",{name:"label"},this.label||String.fromCharCode(65279))),!this.noUserDismiss&&o("nano-icon-button",{exportparts:"base:close-button",class:"dialog__close-icon",label:"close dialog",onClick:this.requestClose,iconName:"light/times"}))),o("div",{part:"body",class:"dialog__body"},o("slot",null)),!this.noFooter&&(this.hasFooter||!this.noUserDismiss)&&o("nano-sticker",{position:"bottom"},o("footer",{part:"footer",class:"dialog__footer"},o("slot",{name:"footer",onSlotchange:this.handleSlotChange}),!this.noUserDismiss&&o("button",{class:"dialog__close-txt",onClick:this.requestClose},"Close")))))))}get host(){return e(this)}static get watchers(){return{open:["handleOpenChange"],hoist:["handleHoistChange"]}}};p.style=h;export{p as nano_dialog};
|
5
|
+
//# sourceMappingURL=p-a183e3c7.entry.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["src/components/dialog/dialog.scss?tag=nano-dialog&encapsulation=shadow","src/components/dialog/dialog.tsx"],"names":["dialogCss","id","Dialog","this","componentId","willShow","willHide","addedTransEnd","handleKeyDown","event","key","requestClose","nanoOverlayDismiss","nanoRequestClose","emit","defaultPrevented","noUserDismiss","hide","noDismiss","setTimeout","_","handleTransitionEnd","propertyName","composedPath","find","node","panel","overlay","isVisible","open","nanoAfterShow","nanoAfterHide","handleSlotChange","hasFooter","hasSlot","host","[object Object]","show","hoist","document","body","children","prepend","nanoShow","originalTrigger","activeElement","modal","activate","lockBodyScrolling","addEventListener","nanoInitialFocus","focus","preventScroll","once","nanoHide","deactivate","unlockBodyScrolling","stopVideos","trigger","videos","Array","from","querySelectorAll","forEach","video","tagName","toLowerCase","pause","src","handleHoistChange","Modal","storeId","ComponentStore","init","storeMethod","removeEventListener","h","Host","showing","undefined","part","class","dialog","dialog--open","dialog--visible","dialog--has-footer","noFooter","dialog--has-header","noHeader","dialog--nodismiss","dialog--with-ribbon","showRibbon","onKeyDown","ref","el","onClick","role","aria-modal","aria-hidden","aria-label","label","aria-labelledby","tabIndex","name","String","fromCharCode","exportparts","iconName","position","onSlotchange"],"mappings":"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","sourcesContent":["@use 'sass:map';\n@use 'sass:list';\n\n@import '../../global/style/nano-theme/base';\n@import '../../global/style/nano-theme/colours';\n@import '../../global/style/nano-theme/layers';\n@import '../../global/style/nano-theme/form';\n\n/**\n * @prop --width: The preferred width of the dialog. Note that the dialog will shrink to accommodate smaller screens.\n * @prop --border-radius: defaults to #{$layer-border-radius};\n * @prop --content-background: defaults to #{$layer-bg-color};\n * @prop --footer-background: defaults to #{map.get($colors, celsius)};\n * @prop --box-shadow: defaults to $layer-shadow-xlarge;\n * @prop --close-button-color: defaults to #{map.get($colors, mediumgrey)};\n * @prop --scrim-color: overlay colour of alert display. Defaults to #{$layer-overlay-dark};\n * @prop --tint-color: colour used to highlight items in the dialog - top ribbon, bottom close button. Default #{map.get($colors, blue)};\n * @prop --width: defaults to 31rem;\n */\n:host {\n --border-radius: #{$layer-border-radius};\n --content-background: #fafafa;\n --footer-content: #{map.get($colors, lightgrey)};\n --scrim-color: #{$layer-overlay-dark};\n --box-shadow: #{$layer-shadow-large};\n --close-button-color: #{map.get($colors, palegrey)};\n --width: 60rem;\n --tint-color: #{darken(map.get($colors, blue), 5%)};\n --body-padding-v: #{$spacing-large};\n --body-padding-h: #{$spacing-large};\n --header-padding-v: #{$spacing-medium};\n --header-padding-h: #{$spacing-large};\n --footer-padding-v: #{$spacing-medium};\n --footer-padding-h: #{$spacing-large};\n}\n\n.dialog {\n $self: &;\n\n display: flex;\n align-items: center;\n justify-content: center;\n position: fixed;\n inset: 0;\n z-index: #{$layer-index-modal};\n\n &:not(.dialog--visible) {\n @include hidden;\n }\n\n &__panel {\n display: flex;\n flex-direction: column;\n z-index: 2;\n inline-size: var(--width);\n max-inline-size: calc(100% - #{$spacing-xlarge});\n max-block-size: calc(92% - #{$spacing-xlarge});\n background-color: var(--content-background);\n border-radius: var(--border-radius);\n box-shadow: var(--box-shadow);\n opacity: 0;\n transform: scale(0.8);\n transition: #{$transition-fast} opacity, #{$transition-fast} transform;\n\n &:focus {\n outline: none;\n }\n\n .dialog--with-ribbon & {\n border-block-start: 5px solid var(--tint-color);\n }\n\n .dialog--open & {\n display: flex;\n opacity: 1;\n transform: none;\n }\n\n .dialog--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\n &__header {\n flex: 0 0 auto;\n display: flex;\n min-inline-size: var(--width);\n inline-size: 100%;\n background-color: var(--content-background);\n border-radius: var(--border-radius) var(--border-radius) 0 0;\n transition: #{$transition-xfast} box-shadow;\n\n .dialog--visible & {\n min-inline-size: auto;\n }\n\n [stuck] & {\n box-shadow: #{$layer-shadow-medium};\n }\n }\n\n &__title {\n flex: 1 1 auto;\n font-size: #{$fontsize-large};\n line-height: 1.6;\n padding-block: var(--header-padding-v);\n padding-inline: var(--header-padding-h);\n }\n\n & &__close-icon {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n font-size: #{$fontsize-xlarge};\n padding-block: 0;\n padding-inline: var(--header-padding-h);\n\n --color: var(--close-button-color);\n }\n\n &__body {\n padding-block: 0 var(--body-padding-v);\n padding-inline: var(--body-padding-h);\n\n .dialog:not(.dialog--has-header) & {\n padding-block-start: var(--body-padding-v);\n }\n\n & ::slotted(*) {\n max-inline-size: 100%;\n }\n\n &-wrap {\n flex: 1 1 auto;\n overflow: auto;\n -webkit-overflow-scrolling: touch;\n border-radius: var(--border-radius);\n\n .dialog:not(.dialog--has-header) & {\n border-radius: 0 0 inherit inherit;\n }\n\n .dialog:not(.dialog--has-footer) & {\n border-radius: inherit inherit 0 0;\n }\n }\n }\n\n &__footer {\n inline-size: 100%;\n padding-block: var(--footer-padding-v);\n padding-inline: var(--footer-padding-h);\n background: var(--footer-content);\n border-radius: 0 0 var(--border-radius) var(--border-radius);\n position: relative;\n inset-block-start: 1px;\n\n .dialog--visible & {\n min-inline-size: auto;\n }\n\n ::slotted(button) {\n margin-inline-end: #{$spacing-small} !important;\n }\n\n .dialog:not(.dialog--has-footer) & {\n display: none;\n }\n }\n\n &__close-txt {\n color: var(--tint-color);\n border: none;\n text-decoration: underline;\n margin: 0;\n text-underline-offset: 4px;\n background-color: transparent;\n font: inherit;\n -webkit-box-align: center;\n cursor: pointer;\n font-size: #{$fontsize-small};\n padding: 0.5rem;\n border-radius: #{$border-radius-small};\n transition: box-shadow 100ms ease-in-out;\n\n &:focus {\n outline: none;\n box-shadow: #{$control-focus-style};\n }\n }\n\n &__overlay {\n position: fixed;\n inset: 0;\n background-color: var(--scrim-color);\n opacity: 0;\n transition: #{$transition-fast} opacity;\n backdrop-filter: blur(#{$layer-overlay-blur});\n\n .dialog--open & {\n opacity: 1;\n }\n }\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n Method,\n Prop,\n State,\n Watch,\n h,\n Host,\n ComponentInterface,\n} from '@stencil/core';\nimport Modal from '../../utils/modal';\nimport { lockBodyScrolling, unlockBodyScrolling } from '../../utils/scroll';\nimport { hasSlot } from '../../utils/slot';\nimport {\n ComponentStore,\n StorageMethods,\n} from '../../utils/store/component-store';\n\nlet id = 0;\n\n/**\n * Dialogs, sometimes called \"modals\", appear above the page and require the user's immediate attention.\n *\n * @slot - The dialog's content.\n * @slot label - The dialog's label. Alternatively, you can use the label prop.\n * @slot footer - The dialog's footer, usually one or more buttons representing various options.\n */\n@Component({\n tag: 'nano-dialog',\n styleUrl: 'dialog.scss',\n shadow: true,\n})\nexport class Dialog implements ComponentInterface {\n private componentId = `dialog-${++id}`;\n private modal: Modal;\n private panel: HTMLElement;\n private willShow = false;\n private willHide = false;\n private originalTrigger: HTMLElement | null;\n private overlay: HTMLElement;\n private addedTransEnd = false;\n\n @Element() host: HTMLNanoDialogElement;\n @State() isVisible = false;\n @State() noDismiss = false;\n @State() hasFooter = false;\n\n /** Show a colour ribbon at the top of the modal */\n @Prop() showRibbon = true;\n\n /** Indicates whether or not the dialog is open. You can use this in lieu of the show/hide methods. */\n @Prop({ mutable: true, reflect: true }) open = false;\n\n @Watch('open')\n handleOpenChange() {\n this.open ? this.show() : this.hide();\n }\n\n /** The dialog's label as displayed in the header. You should always include a relevant\n * label even when using `no-header`, as it is required for proper accessibility. */\n @Prop() label!: string;\n\n /** Set to true to disable the header. This will also remove the default close button,\n * so please ensure you provide an easy, accessible way for users to dismiss the dialog. */\n @Prop() noHeader = false;\n\n /** Set to true to disable the footer. This will also remove the footer close button,\n * so please ensure you provide an easy, accessible way for users to dismiss the dialog. */\n @Prop() noFooter = false;\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 /** 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 /** 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 || document.body.children[0] === this.host) return;\n document.body.prepend(this.host);\n }\n\n /** Emitted when the dialog opens. Calling `event.preventDefault()` will prevent it from being opened. */\n @Event() nanoShow: EventEmitter;\n\n /** Emitted after the dialog opens and all transitions are complete. */\n @Event() nanoAfterShow: EventEmitter;\n\n /** Emitted when the dialog closes. Calling `event.preventDefault()` will prevent it from being closed. */\n @Event() nanoHide: EventEmitter;\n\n /** Emitted after the dialog closes and all transitions are complete. */\n @Event() nanoAfterHide: EventEmitter;\n\n /** Emitted when the dialog opens and the panel gains focus. Calling `event.preventDefault()` will prevent\n * focus and allow you to set it on a different element in the dialog, such as an input or button. */\n @Event() nanoInitialFocus: EventEmitter;\n\n /** Emitted when the user clicks the close button, clicks the overlay, or presses the `Escape` key. Calling `event.preventDefault()` will prevent the dialog from closing. */\n @Event() nanoRequestClose: EventEmitter;\n\n /** Shows the dialog */\n @Method()\n async show() {\n if (this.willShow) {\n return;\n }\n\n const nanoShow = this.nanoShow.emit();\n if (nanoShow.defaultPrevented) {\n this.open = false;\n return;\n }\n\n this.originalTrigger = document.activeElement as HTMLElement;\n this.willShow = true;\n this.isVisible = true;\n this.open = true;\n this.modal.activate();\n\n lockBodyScrolling(this.host);\n\n if (this.open) {\n // Wait for the next frame before setting initial focus so the dialog is technically visible\n this.host.addEventListener(\n 'nanoAfterShow',\n () => {\n const nanoInitialFocus = this.nanoInitialFocus.emit();\n if (!nanoInitialFocus.defaultPrevented) {\n this.panel.focus({ preventScroll: true });\n }\n },\n { once: true }\n );\n }\n }\n\n /** Hides the dialog */\n @Method()\n async hide() {\n if (this.willHide) {\n return;\n }\n\n const nanoHide = this.nanoHide.emit();\n if (nanoHide.defaultPrevented) {\n this.open = true;\n return;\n }\n\n this.willHide = true;\n this.open = false;\n this.modal.deactivate();\n unlockBodyScrolling(this.host);\n this.stopVideos();\n\n // Restore focus to the original trigger\n const trigger = this.originalTrigger;\n if (trigger && typeof trigger.focus === 'function') {\n setTimeout(() => trigger.focus());\n }\n }\n\n private handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n this.requestClose();\n }\n };\n\n private requestClose = () => {\n const nanoOverlayDismiss = this.nanoRequestClose.emit();\n\n if (!nanoOverlayDismiss.defaultPrevented && !this.noUserDismiss) {\n this.hide();\n } else {\n this.noDismiss = true;\n setTimeout((_) => (this.noDismiss = false), 250);\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 // Ensure we only emit one event when the target element is no longer visible\n this.isVisible = this.open;\n this.willShow = false;\n this.willHide = false;\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 private stopVideos() {\n const videos: (HTMLVideoElement | HTMLIFrameElement)[] = Array.from(\n this.host.querySelectorAll('iframe,video')\n );\n videos.forEach((video) => {\n if (video.tagName.toLowerCase() === 'video')\n (video as HTMLVideoElement).pause();\n else {\n const src = video.src;\n video.src = src;\n }\n });\n }\n\n connectedCallback() {\n this.handleHoistChange();\n this.modal = new Modal(this.host);\n if (this.panel) {\n this.addedTransEnd = true;\n this.panel.addEventListener('transitionend', this.handleTransitionEnd);\n }\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 if (!this.addedTransEnd) {\n this.panel.addEventListener('transitionend', this.handleTransitionEnd);\n }\n }\n\n disconnectedCallback() {\n if (!this.panel) return;\n unlockBodyScrolling(this.host);\n this.addedTransEnd = false;\n this.panel.removeEventListener('transitionend', this.handleTransitionEnd);\n }\n\n render() {\n return (\n <Host showing={this.isVisible ? true : undefined}>\n <div\n part=\"base\"\n class={{\n dialog: true,\n 'dialog--open': this.open,\n 'dialog--visible': this.isVisible,\n 'dialog--has-footer': !this.noFooter,\n 'dialog--has-header': !this.noHeader,\n 'dialog--nodismiss': this.noDismiss,\n 'dialog--with-ribbon': this.showRibbon,\n }}\n onKeyDown={this.handleKeyDown}\n >\n <div\n part=\"overlay\"\n class=\"dialog__overlay\"\n ref={(el) => (this.overlay = el)}\n onClick={this.requestClose}\n />\n\n <div\n ref={(el) => (this.panel = el)}\n part=\"panel\"\n class=\"dialog__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 <div class=\"dialog__body-wrap\">\n {!this.noHeader && (\n <nano-sticker>\n <header part=\"header\" class=\"dialog__header\">\n <span\n part=\"title\"\n class=\"dialog__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 {!this.noUserDismiss && (\n <nano-icon-button\n exportparts=\"base:close-button\"\n class=\"dialog__close-icon\"\n label=\"close dialog\"\n onClick={this.requestClose}\n iconName=\"light/times\"\n />\n )}\n </header>\n </nano-sticker>\n )}\n <div part=\"body\" class=\"dialog__body\">\n <slot />\n </div>\n {!this.noFooter && (this.hasFooter || !this.noUserDismiss) && (\n <nano-sticker position=\"bottom\">\n <footer part=\"footer\" class=\"dialog__footer\">\n <slot name=\"footer\" onSlotchange={this.handleSlotChange} />\n {!this.noUserDismiss && (\n <button\n class=\"dialog__close-txt\"\n onClick={this.requestClose}\n >\n Close\n </button>\n )}\n </footer>\n </nano-sticker>\n )}\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n"]}
|
1
|
+
{"version":3,"sources":["src/components/dialog/dialog.scss?tag=nano-dialog&encapsulation=shadow","src/components/dialog/dialog.tsx"],"names":["dialogCss","id","Dialog","this","componentId","willShow","willHide","addedTransEnd","handleKeyDown","event","key","requestClose","nanoOverlayDismiss","nanoRequestClose","emit","defaultPrevented","noUserDismiss","hide","noDismiss","setTimeout","_","handleTransitionEnd","propertyName","composedPath","find","node","panel","overlay","isVisible","open","nanoAfterShow","nanoAfterHide","handleSlotChange","hasFooter","hasSlot","host","[object Object]","show","hoist","document","body","children","prepend","nanoShow","originalTrigger","activeElement","modal","activate","lockBodyScrolling","addEventListener","nanoInitialFocus","focus","preventScroll","once","nanoHide","deactivate","unlockBodyScrolling","stopVideos","trigger","videos","Array","from","querySelectorAll","forEach","video","tagName","toLowerCase","pause","src","handleHoistChange","Modal","storeId","ComponentStore","init","storeMethod","removeEventListener","h","Host","showing","undefined","part","class","dialog","dialog--open","dialog--visible","dialog--has-footer","noFooter","dialog--has-header","noHeader","dialog--nodismiss","dialog--with-ribbon","showRibbon","onKeyDown","ref","el","onClick","role","aria-modal","aria-hidden","aria-label","label","aria-labelledby","tabIndex","name","String","fromCharCode","exportparts","iconName","position","onSlotchange"],"mappings":";;;uTAAA,MAAMA,EAAY,g2ICqBlB,IAAIC,EAAK,QAcIC,EAAM,qSACTC,KAAAC,YAAc,YAAYH,IAG1BE,KAAAE,SAAW,MACXF,KAAAG,SAAW,MAGXH,KAAAI,cAAgB,MAiIhBJ,KAAAK,cAAiBC,IACvB,GAAIA,EAAMC,MAAQ,SAAU,CAC1BP,KAAKQ,iBAIDR,KAAAQ,aAAe,KACrB,MAAMC,EAAqBT,KAAKU,iBAAiBC,OAEjD,IAAKF,EAAmBG,mBAAqBZ,KAAKa,cAAe,CAC/Db,KAAKc,WACA,CACLd,KAAKe,UAAY,KACjBC,YAAYC,GAAOjB,KAAKe,UAAY,OAAQ,OAIxCf,KAAAkB,oBAAuBZ,IAC7B,GACEA,EAAMa,eAAiB,WACvBb,EACGc,eACAC,MAAMC,GAASA,IAAStB,KAAKuB,OAASD,IAAStB,KAAKwB,UACvD,CAEAxB,KAAKyB,UAAYzB,KAAK0B,KACtB1B,KAAKE,SAAW,MAChBF,KAAKG,SAAW,MAChBH,KAAK0B,KAAO1B,KAAK2B,cAAchB,OAASX,KAAK4B,cAAcjB,SAIvDX,KAAA6B,iBAAmB,KACzB7B,KAAK8B,UAAYC,EAAQ/B,KAAKgC,KAAM,0BA/JjB,qBACA,qBACA,sBAGA,eAG0B,yCAa5B,oBAIA,yBAGK,8CAMc,sBAGtB,MA1BhBC,mBACEjC,KAAK0B,KAAO1B,KAAKkC,OAASlC,KAAKc,OA4BjCmB,oBACE,IAAKjC,KAAKmC,OAASC,SAASC,KAAKC,SAAS,KAAOtC,KAAKgC,KAAM,OAC5DI,SAASC,KAAKE,QAAQvC,KAAKgC,MAwB7BC,aACE,GAAIjC,KAAKE,SAAU,CACjB,OAGF,MAAMsC,EAAWxC,KAAKwC,SAAS7B,OAC/B,GAAI6B,EAAS5B,iBAAkB,CAC7BZ,KAAK0B,KAAO,MACZ,OAGF1B,KAAKyC,gBAAkBL,SAASM,cAChC1C,KAAKE,SAAW,KAChBF,KAAKyB,UAAY,KACjBzB,KAAK0B,KAAO,KACZ1B,KAAK2C,MAAMC,WAEXC,EAAkB7C,KAAKgC,MAEvB,GAAIhC,KAAK0B,KAAM,CAEb1B,KAAKgC,KAAKc,iBACR,iBACA,KACE,MAAMC,EAAmB/C,KAAK+C,iBAAiBpC,OAC/C,IAAKoC,EAAiBnC,iBAAkB,CACtCZ,KAAKuB,MAAMyB,MAAM,CAAEC,cAAe,UAGtC,CAAEC,KAAM,QAOdjB,aACE,GAAIjC,KAAKG,SAAU,CACjB,OAGF,MAAMgD,EAAWnD,KAAKmD,SAASxC,OAC/B,GAAIwC,EAASvC,iBAAkB,CAC7BZ,KAAK0B,KAAO,KACZ,OAGF1B,KAAKG,SAAW,KAChBH,KAAK0B,KAAO,MACZ1B,KAAK2C,MAAMS,aACXC,EAAoBrD,KAAKgC,MACzBhC,KAAKsD,aAGL,MAAMC,EAAUvD,KAAKyC,gBACrB,GAAIc,UAAkBA,EAAQP,QAAU,WAAY,CAClDhC,YAAW,IAAMuC,EAAQP,WAwCrBf,aACN,MAAMuB,EAAmDC,MAAMC,KAC7D1D,KAAKgC,KAAK2B,iBAAiB,iBAE7BH,EAAOI,SAASC,IACd,GAAIA,EAAMC,QAAQC,gBAAkB,QACjCF,EAA2BG,YACzB,CACH,MAAMC,EAAMJ,EAAMI,IAClBJ,EAAMI,IAAMA,MAKlBhC,oBACEjC,KAAKkE,oBACLlE,KAAK2C,MAAQ,IAAIwB,EAAMnE,KAAKgC,MAC5B,GAAIhC,KAAKuB,MAAO,CACdvB,KAAKI,cAAgB,KACrBJ,KAAKuB,MAAMuB,iBAAiB,gBAAiB9C,KAAKkB,sBAItDe,oBACEjC,KAAK6B,mBAEL,GAAI7B,KAAK0B,KAAM1B,KAAKkC,OACpB,GAAIlC,KAAKoE,QACPC,EAAeC,KAAKtE,KAAM,CAAC,QAASA,KAAKuE,YAAavE,KAAKoE,SAG/DnC,mBACE,IAAKjC,KAAKI,cAAe,CACvBJ,KAAKuB,MAAMuB,iBAAiB,gBAAiB9C,KAAKkB,sBAItDe,uBACE,IAAKjC,KAAKuB,MAAO,OACjB8B,EAAoBrD,KAAKgC,MACzBhC,KAAKI,cAAgB,MACrBJ,KAAKuB,MAAMiD,oBAAoB,gBAAiBxE,KAAKkB,qBAGvDe,SACE,OACEwC,EAACC,EAAI,CAACC,QAAS3E,KAAKyB,UAAY,KAAOmD,WACrCH,EAAA,MAAA,CACEI,KAAK,OACLC,MAAO,CACLC,OAAQ,KACRC,eAAgBhF,KAAK0B,KACrBuD,kBAAmBjF,KAAKyB,UACxByD,sBAAuBlF,KAAKmF,SAC5BC,sBAAuBpF,KAAKqF,SAC5BC,oBAAqBtF,KAAKe,UAC1BwE,sBAAuBvF,KAAKwF,YAE9BC,UAAWzF,KAAKK,eAEhBoE,EAAA,MAAA,CACEI,KAAK,UACLC,MAAM,kBACNY,IAAMC,GAAQ3F,KAAKwB,QAAUmE,EAC7BC,QAAS5F,KAAKQ,eAGhBiE,EAAA,MAAA,CACEiB,IAAMC,GAAQ3F,KAAKuB,MAAQoE,EAC3Bd,KAAK,QACLC,MAAM,gBACNe,KAAK,SAAQC,aACF,OAAMC,cACJ/F,KAAK0B,KAAO,QAAU,OAAMsE,aAC7BhG,KAAKqF,SAAWrF,KAAKiG,MAAQ,KAAIC,mBAE1ClG,KAAKqF,SAAW,GAAGrF,KAAKC,oBAAsB,KAEjDkG,SAAU,GAEV1B,EAAA,MAAA,CAAKK,MAAM,sBACP9E,KAAKqF,UACLZ,EAAA,eAAA,KACEA,EAAA,SAAA,CAAQI,KAAK,SAASC,MAAM,kBAC1BL,EAAA,OAAA,CACEI,KAAK,QACLC,MAAM,gBACNhF,GAAI,GAAGE,KAAKC,qBAEZwE,EAAA,OAAA,CAAM2B,KAAK,SAERpG,KAAKiG,OAASI,OAAOC,aAAa,UAGrCtG,KAAKa,eACL4D,EAAA,mBAAA,CACE8B,YAAY,oBACZzB,MAAM,qBACNmB,MAAM,eACNL,QAAS5F,KAAKQ,aACdgG,SAAS,kBAMnB/B,EAAA,MAAA,CAAKI,KAAK,OAAOC,MAAM,gBACrBL,EAAA,OAAA,QAEAzE,KAAKmF,WAAanF,KAAK8B,YAAc9B,KAAKa,gBAC1C4D,EAAA,eAAA,CAAcgC,SAAS,UACrBhC,EAAA,SAAA,CAAQI,KAAK,SAASC,MAAM,kBAC1BL,EAAA,OAAA,CAAM2B,KAAK,SAASM,aAAc1G,KAAK6B,oBACrC7B,KAAKa,eACL4D,EAAA,SAAA,CACEK,MAAM,oBACNc,QAAS5F,KAAKQ,cAAY","sourcesContent":["@use 'sass:map';\n@use 'sass:list';\n\n@import '../../global/style/nano-theme/base';\n@import '../../global/style/nano-theme/colours';\n@import '../../global/style/nano-theme/layers';\n@import '../../global/style/nano-theme/form';\n\n/**\n * @prop --width: The preferred width of the dialog. Note that the dialog will shrink to accommodate smaller screens.\n * @prop --border-radius: defaults to #{$layer-border-radius};\n * @prop --content-background: defaults to #{$layer-bg-color};\n * @prop --footer-background: defaults to #{map.get($colors, celsius)};\n * @prop --box-shadow: defaults to $layer-shadow-xlarge;\n * @prop --close-button-color: defaults to #{map.get($colors, mediumgrey)};\n * @prop --scrim-color: overlay colour of alert display. Defaults to #{$layer-overlay-dark};\n * @prop --tint-color: colour used to highlight items in the dialog - top ribbon, bottom close button. Default #{map.get($colors, blue)};\n * @prop --width: defaults to 31rem;\n */\n:host {\n --border-radius: #{$layer-border-radius};\n --content-background: #fafafa;\n --footer-content: #{map.get($colors, lightgrey)};\n --scrim-color: #{$layer-overlay-dark};\n --box-shadow: #{$layer-shadow-large};\n --close-button-color: #{map.get($colors, palegrey)};\n --width: 60rem;\n --tint-color: #{darken(map.get($colors, blue), 5%)};\n --body-padding-v: #{$spacing-large};\n --body-padding-h: #{$spacing-large};\n --header-padding-v: #{$spacing-medium};\n --header-padding-h: #{$spacing-large};\n --footer-padding-v: #{$spacing-medium};\n --footer-padding-h: #{$spacing-large};\n}\n\n.dialog {\n $self: &;\n\n display: flex;\n align-items: center;\n justify-content: center;\n position: fixed;\n inset: 0;\n z-index: #{$layer-index-modal};\n\n &:not(.dialog--visible) {\n @include hidden;\n }\n\n &__panel {\n display: flex;\n flex-direction: column;\n z-index: 2;\n inline-size: var(--width);\n max-inline-size: calc(100% - #{$spacing-xlarge});\n max-block-size: calc(92% - #{$spacing-xlarge});\n background-color: var(--content-background);\n border-radius: var(--border-radius);\n box-shadow: var(--box-shadow);\n opacity: 0;\n transform: scale(0.8);\n transition: #{$transition-fast} opacity, #{$transition-fast} transform;\n\n &:focus {\n outline: none;\n }\n\n .dialog--with-ribbon & {\n border-block-start: 5px solid var(--tint-color);\n }\n\n .dialog--open & {\n display: flex;\n opacity: 1;\n transform: none;\n }\n\n .dialog--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\n &__header {\n flex: 0 0 auto;\n display: flex;\n min-inline-size: var(--width);\n inline-size: 100%;\n background-color: var(--content-background);\n border-radius: var(--border-radius) var(--border-radius) 0 0;\n transition: #{$transition-xfast} box-shadow;\n\n .dialog--visible & {\n min-inline-size: auto;\n }\n\n [stuck] & {\n box-shadow: #{$layer-shadow-medium};\n }\n }\n\n &__title {\n flex: 1 1 auto;\n font-size: #{$fontsize-large};\n line-height: 1.6;\n padding-block: var(--header-padding-v);\n padding-inline: var(--header-padding-h);\n }\n\n & &__close-icon {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n font-size: #{$fontsize-xlarge};\n padding-block: 0;\n padding-inline: var(--header-padding-h);\n\n --color: var(--close-button-color);\n }\n\n &__body {\n padding-block: 0 var(--body-padding-v);\n padding-inline: var(--body-padding-h);\n\n .dialog:not(.dialog--has-header) & {\n padding-block-start: var(--body-padding-v);\n }\n\n & ::slotted(*) {\n max-inline-size: 100%;\n }\n\n &-wrap {\n flex: 1 1 auto;\n overflow: auto;\n -webkit-overflow-scrolling: touch;\n border-radius: var(--border-radius);\n\n .dialog:not(.dialog--has-header) & {\n border-radius: 0 0 inherit inherit;\n }\n\n .dialog:not(.dialog--has-footer) & {\n border-radius: inherit inherit 0 0;\n }\n }\n }\n\n &__footer {\n inline-size: 100%;\n padding-block: var(--footer-padding-v);\n padding-inline: var(--footer-padding-h);\n background: var(--footer-content);\n border-radius: 0 0 var(--border-radius) var(--border-radius);\n position: relative;\n inset-block-start: 1px;\n\n .dialog--visible & {\n min-inline-size: auto;\n }\n\n ::slotted(button) {\n margin-inline-end: #{$spacing-small} !important;\n }\n\n .dialog:not(.dialog--has-footer) & {\n display: none;\n }\n }\n\n &__close-txt {\n color: var(--tint-color);\n border: none;\n text-decoration: underline;\n margin: 0;\n text-underline-offset: 4px;\n background-color: transparent;\n font: inherit;\n -webkit-box-align: center;\n cursor: pointer;\n font-size: #{$fontsize-small};\n padding: 0.5rem;\n border-radius: #{$border-radius-small};\n transition: box-shadow 100ms ease-in-out;\n\n &:focus {\n outline: none;\n box-shadow: #{$control-focus-style};\n }\n }\n\n &__overlay {\n position: fixed;\n inset: 0;\n background-color: var(--scrim-color);\n opacity: 0;\n transition: #{$transition-fast} opacity;\n backdrop-filter: blur(#{$layer-overlay-blur});\n\n .dialog--open & {\n opacity: 1;\n }\n }\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n Method,\n Prop,\n State,\n Watch,\n h,\n Host,\n ComponentInterface,\n} from '@stencil/core';\nimport Modal from '../../utils/modal';\nimport { lockBodyScrolling, unlockBodyScrolling } from '../../utils/scroll';\nimport { hasSlot } from '../../utils/slot';\nimport {\n ComponentStore,\n StorageMethods,\n} from '../../utils/store/component-store';\n\nlet id = 0;\n\n/**\n * Dialogs, sometimes called \"modals\", appear above the page and require the user's immediate attention.\n *\n * @slot - The dialog's content.\n * @slot label - The dialog's label. Alternatively, you can use the label prop.\n * @slot footer - The dialog's footer, usually one or more buttons representing various options.\n */\n@Component({\n tag: 'nano-dialog',\n styleUrl: 'dialog.scss',\n shadow: true,\n})\nexport class Dialog implements ComponentInterface {\n private componentId = `dialog-${++id}`;\n private modal: Modal;\n private panel: HTMLElement;\n private willShow = false;\n private willHide = false;\n private originalTrigger: HTMLElement | null;\n private overlay: HTMLElement;\n private addedTransEnd = false;\n\n @Element() host: HTMLNanoDialogElement;\n @State() isVisible = false;\n @State() noDismiss = false;\n @State() hasFooter = false;\n\n /** Show a colour ribbon at the top of the modal */\n @Prop() showRibbon = true;\n\n /** Indicates whether or not the dialog is open. You can use this in lieu of the show/hide methods. */\n @Prop({ mutable: true, reflect: true }) open = false;\n\n @Watch('open')\n handleOpenChange() {\n this.open ? this.show() : this.hide();\n }\n\n /** The dialog's label as displayed in the header. You should always include a relevant\n * label even when using `no-header`, as it is required for proper accessibility. */\n @Prop() label!: string;\n\n /** Set to true to disable the header. This will also remove the default close button,\n * so please ensure you provide an easy, accessible way for users to dismiss the dialog. */\n @Prop() noHeader = false;\n\n /** Set to true to disable the footer. This will also remove the footer close button,\n * so please ensure you provide an easy, accessible way for users to dismiss the dialog. */\n @Prop() noFooter = false;\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 /** 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 /** 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 || document.body.children[0] === this.host) return;\n document.body.prepend(this.host);\n }\n\n /** Emitted when the dialog opens. Calling `event.preventDefault()` will prevent it from being opened. */\n @Event() nanoShow: EventEmitter;\n\n /** Emitted after the dialog opens and all transitions are complete. */\n @Event() nanoAfterShow: EventEmitter;\n\n /** Emitted when the dialog closes. Calling `event.preventDefault()` will prevent it from being closed. */\n @Event() nanoHide: EventEmitter;\n\n /** Emitted after the dialog closes and all transitions are complete. */\n @Event() nanoAfterHide: EventEmitter;\n\n /** Emitted when the dialog opens and the panel gains focus. Calling `event.preventDefault()` will prevent\n * focus and allow you to set it on a different element in the dialog, such as an input or button. */\n @Event() nanoInitialFocus: EventEmitter;\n\n /** Emitted when the user clicks the close button, clicks the overlay, or presses the `Escape` key. Calling `event.preventDefault()` will prevent the dialog from closing. */\n @Event() nanoRequestClose: EventEmitter;\n\n /** Shows the dialog */\n @Method()\n async show() {\n if (this.willShow) {\n return;\n }\n\n const nanoShow = this.nanoShow.emit();\n if (nanoShow.defaultPrevented) {\n this.open = false;\n return;\n }\n\n this.originalTrigger = document.activeElement as HTMLElement;\n this.willShow = true;\n this.isVisible = true;\n this.open = true;\n this.modal.activate();\n\n lockBodyScrolling(this.host);\n\n if (this.open) {\n // Wait for the next frame before setting initial focus so the dialog is technically visible\n this.host.addEventListener(\n 'nanoAfterShow',\n () => {\n const nanoInitialFocus = this.nanoInitialFocus.emit();\n if (!nanoInitialFocus.defaultPrevented) {\n this.panel.focus({ preventScroll: true });\n }\n },\n { once: true }\n );\n }\n }\n\n /** Hides the dialog */\n @Method()\n async hide() {\n if (this.willHide) {\n return;\n }\n\n const nanoHide = this.nanoHide.emit();\n if (nanoHide.defaultPrevented) {\n this.open = true;\n return;\n }\n\n this.willHide = true;\n this.open = false;\n this.modal.deactivate();\n unlockBodyScrolling(this.host);\n this.stopVideos();\n\n // Restore focus to the original trigger\n const trigger = this.originalTrigger;\n if (trigger && typeof trigger.focus === 'function') {\n setTimeout(() => trigger.focus());\n }\n }\n\n private handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n this.requestClose();\n }\n };\n\n private requestClose = () => {\n const nanoOverlayDismiss = this.nanoRequestClose.emit();\n\n if (!nanoOverlayDismiss.defaultPrevented && !this.noUserDismiss) {\n this.hide();\n } else {\n this.noDismiss = true;\n setTimeout((_) => (this.noDismiss = false), 250);\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 // Ensure we only emit one event when the target element is no longer visible\n this.isVisible = this.open;\n this.willShow = false;\n this.willHide = false;\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 private stopVideos() {\n const videos: (HTMLVideoElement | HTMLIFrameElement)[] = Array.from(\n this.host.querySelectorAll('iframe,video')\n );\n videos.forEach((video) => {\n if (video.tagName.toLowerCase() === 'video')\n (video as HTMLVideoElement).pause();\n else {\n const src = video.src;\n video.src = src;\n }\n });\n }\n\n connectedCallback() {\n this.handleHoistChange();\n this.modal = new Modal(this.host);\n if (this.panel) {\n this.addedTransEnd = true;\n this.panel.addEventListener('transitionend', this.handleTransitionEnd);\n }\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 if (!this.addedTransEnd) {\n this.panel.addEventListener('transitionend', this.handleTransitionEnd);\n }\n }\n\n disconnectedCallback() {\n if (!this.panel) return;\n unlockBodyScrolling(this.host);\n this.addedTransEnd = false;\n this.panel.removeEventListener('transitionend', this.handleTransitionEnd);\n }\n\n render() {\n return (\n <Host showing={this.isVisible ? true : undefined}>\n <div\n part=\"base\"\n class={{\n dialog: true,\n 'dialog--open': this.open,\n 'dialog--visible': this.isVisible,\n 'dialog--has-footer': !this.noFooter,\n 'dialog--has-header': !this.noHeader,\n 'dialog--nodismiss': this.noDismiss,\n 'dialog--with-ribbon': this.showRibbon,\n }}\n onKeyDown={this.handleKeyDown}\n >\n <div\n part=\"overlay\"\n class=\"dialog__overlay\"\n ref={(el) => (this.overlay = el)}\n onClick={this.requestClose}\n />\n\n <div\n ref={(el) => (this.panel = el)}\n part=\"panel\"\n class=\"dialog__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 <div class=\"dialog__body-wrap\">\n {!this.noHeader && (\n <nano-sticker>\n <header part=\"header\" class=\"dialog__header\">\n <span\n part=\"title\"\n class=\"dialog__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 {!this.noUserDismiss && (\n <nano-icon-button\n exportparts=\"base:close-button\"\n class=\"dialog__close-icon\"\n label=\"close dialog\"\n onClick={this.requestClose}\n iconName=\"light/times\"\n />\n )}\n </header>\n </nano-sticker>\n )}\n <div part=\"body\" class=\"dialog__body\">\n <slot />\n </div>\n {!this.noFooter && (this.hasFooter || !this.noUserDismiss) && (\n <nano-sticker position=\"bottom\">\n <footer part=\"footer\" class=\"dialog__footer\">\n <slot name=\"footer\" onSlotchange={this.handleSlotChange} />\n {!this.noUserDismiss && (\n <button\n class=\"dialog__close-txt\"\n onClick={this.requestClose}\n >\n Close\n </button>\n )}\n </footer>\n </nano-sticker>\n )}\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n"]}
|
@@ -0,0 +1,5 @@
|
|
1
|
+
/*!
|
2
|
+
* Web Components for Nanopore digital Web Apps
|
3
|
+
*/
|
4
|
+
import{r as t,c as i,h as s,a as e,g as h}from"./p-1fe12320.js";import{a as n}from"./p-845ae77e.js";import{d as o}from"./p-9746b0a5.js";const r=':host{box-sizing:border-box}*,*::before,*::after{box-sizing:border-box}[hidden]{display:none !important}:host{--stuck-left:initial;--stuck-right:initial;--stuck-z-index:var(--nano-layer-index-menubar, 10);--top-hide:translateY(-110%);--bottom-hide:translateY(110%);display:block;max-inline-size:100%}:host([sticky]){position:sticky;transition:0.3s ease transform;will-change:min-block-size}:host([sticky][stuck]){inset-inline:var(--stuck-left) var(--stuck-right);z-index:var(--stuck-z-index) !important}:host([sticky][hide][placed-top]){transform:var(--top-hide)}:host([sticky][hide][placed-bottom]){transform:var(--bottom-hide)}:host([sticky][index="1"]){z-index:calc(var(--stuck-z-index) + 1)}:host([sticky][index="2"]){z-index:calc(var(--stuck-z-index) + 2)}:host([sticky][index="3"]){z-index:calc(var(--stuck-z-index) + 3)}:host([sticky][index="4"]){z-index:calc(var(--stuck-z-index) + 4)}:host([sticky][index="5"]){z-index:calc(var(--stuck-z-index) + 5)}.sticker{display:inherit;max-inline-size:inherit;inline-size:100%}.sticker:not(.stuck){inline-size:auto !important}.sticker.sticky{transition:0.3s ease all;position:relative}:host([index="1"]) .sticker.sticky{z-index:calc(var(--stuck-z-index) + 1)}:host([index="2"]) .sticker.sticky{z-index:calc(var(--stuck-z-index) + 2)}:host([index="3"]) .sticker.sticky{z-index:calc(var(--stuck-z-index) + 3)}:host([index="4"]) .sticker.sticky{z-index:calc(var(--stuck-z-index) + 4)}:host([index="5"]) .sticker.sticky{z-index:calc(var(--stuck-z-index) + 5)}.sticker.stuck{position:fixed;inset-inline:var(--stuck-left) var(--stuck-right);z-index:var(--stuck-z-index);transform:translateY(0)}:host([placed-top]) .sticker.stuck{inset-block-start:0}:host([placed-bottom]) .sticker.stuck{inset-block-end:0}:host([placed-top]) .sticker.stuck.hide{transform:var(--top-hide)}:host([placed-bottom]) .sticker.stuck.hide{transform:var(--bottom-hide)}.sticker-content{display:flex;flex-wrap:wrap}';function a(t){return t instanceof Document?window.pageYOffset:t.scrollTop}function c(t,i){const s=i instanceof Document?document.documentElement:i;return n(t,s)}const l=class{constructor(s){t(this,s);this.nanoStuck=i(this,"nanoStuck",7);this.nanoUnstuck=i(this,"nanoUnstuck",7);this.nanoHide=i(this,"nanoHide",7);this.nanoShow=i(this,"nanoShow",7);this.isRtl=false;this.scrollPosCache=0;this.scrollPosThresholdCache=0;this.cacheOffset=0;this.pauseResizeWatcher=false;this.listenForScrollParent=false;this.positions=[];this.pauseHide=false;this.hasBootstrapped=false;this.setupParentResizeListener=()=>{if(this.parentSizeObserver){this.parentSizeObserver.disconnect();this.parentSizeObserver=undefined}this.parentSizeObserver=new ResizeObserver((t=>{for(const i of t){let t,s;if(i.contentRect.height)t=i.contentRect.height;if(i.contentRect.width)s=i.contentRect.width;if(typeof this.quietMode==="object"){if(s<this.quietMode.w||t<this.quietMode.h)this.quietModeIsOn=true;else this.quietModeIsOn=false}if(this.breakPointMin){if(s>this.breakPointMin)this.isSticky=true;else this.isSticky=false}if(this.breakPointMax){if(s<this.breakPointMax)this.isSticky=true;else this.isSticky=false}if(this.isRootSticker&&this.sticker&&this.autoResize)this.sticker.style.width=this.host.scrollWidth+"px"}}));const t=this.scrollParent instanceof Document?this.scrollParent.documentElement:this.scrollParent;if(t)this.parentSizeObserver.observe(t)};this.onStickToDisplayEvent=t=>{if(t.detail.sticker!==this.stickToEle)return;switch(t.type){case"nanoHide":this._offset=0;this.cacheOffset=this.offset;this.offset=0;if(!this.isStuck)this.moveTrigger(false);if(!this.isRootSticker&&this.quietModeIsOn){requestAnimationFrame((()=>{this.stickToEle.style.minHeight=this.stickToEleInitSize.height+(this.host.scrollHeight+(typeof this.cacheOffset==="object"?this.cacheOffset.v:this.cacheOffset))+"px";this.stickToEle.setTriggerPos(this.stickToEleInitSize.height*-1)}))}break;case"nanoShow":this._offset=this.stickToEleInitSize.height;this.offset=this.cacheOffset;this.moveTrigger(true);if(!this.isRootSticker&&this.quietModeIsOn){requestAnimationFrame((()=>{this.stickToEle.style.minHeight="";this.stickToEle.setTriggerPos(0)}))}break;case"nanoStuck":this.stickToEleInitSize=this.stickToEle.getBoundingClientRect();this._offset=this.stickToEleInitSize.height;break}};this.onStickEvent=async t=>{const i=t.detail?t.detail.sticker:null;if(!i||i.position!==this.position)return;const s=await i.getTriggerPos();if(t.type==="nanoStuck"&&i!==this.host&&i.scrollParent===this.host.scrollParent){this.stickerIndex++;if(!this.hideOnNewStickers)return;if(this.positions.includes("top")&&this.triggerPos.top<s.top||this.positions.includes("bottom")&&this.triggerPos.top>s.top){this.multiStickerHide=true;this.stuckCounter++}}if(t.type==="nanoUnstuck"&&i!==this.host&&i.scrollParent===this.host.scrollParent){this.stickerIndex--;if(!this.hideOnNewStickers)return;if(this.positions.includes("top")&&this.triggerPos.top<s.top||this.positions.includes("bottom")&&this.triggerPos.top>s.top){this.stuckCounter--;if(this.stuckCounter<1)this.multiStickerHide=false}}};this.onScroll=()=>{const t=a(this.scrollParent);if(t<this.scrollPosCache){if(!this.positions.includes("bottom"))this.handleScrollTo();else this.handleScrollAway(t)}if(t>this.scrollPosCache){if(!this.positions.includes("bottom"))this.handleScrollAway(t);else this.handleScrollTo()}this.scrollPosCache=t};this.isStuck=false;this.isRootSticker=true;this.hide=false;this.scrollHide=false;this.multiStickerHide=false;this.scrollingTo=false;this.quietModeIsOn=false;this.stuckCounter=0;this.stickerIndex=0;this.stickToEle=undefined;this.triggerPos=undefined;this.trigger=undefined;this._offset=0;this.autoResize=true;this.isSticky=true;this.offset=0;this.position="top";this.quietMode={h:600,w:600};this.hideOnNewStickers=true;this.breakPointMax=null;this.breakPointMin=null;this.scrollParent=undefined;this.stickTo=undefined}async isHiding(){return this.hide}async isSticking(){this.shouldStick();return this.isStuck}async setTriggerPos(t){return this._offset=t}async getTriggerPos(){return this.triggerPos}async pauseHiding(t){return this.pauseHide=t}updateTriggerOffset(){if(!this.trigger||!this.scrollParent||!this.listenForScrollParent)return;this.triggerPos=c(this.trigger,this.scrollParent)}stickerResizeListener(){if(this.contentSizeObserver){this.contentSizeObserver.disconnect();this.contentSizeObserver=undefined}this.contentSizeObserver=new ResizeObserver((t=>{for(const i of t){if(this.pauseResizeWatcher)return;if(i.contentRect.height){if(this.position==="top")this.host.style.height=i.contentRect.height+"px";if(this.position==="bottom")this.host.style.minHeight=i.contentRect.height+"px"}}}));this.contentSizeObserver.observe(this.content)}quietModeChange(){if(this.quietMode==="on")requestAnimationFrame((()=>this.quietModeIsOn=true));else if(this.quietMode==="off")requestAnimationFrame((()=>this.quietModeIsOn=false))}setOffset(){this.trigger.setAttribute("style","");let t,i,s,e;const h=this.isRootSticker||this.stickToEle?this.sticker:this.host;if(!h)return;if(typeof this.offset==="object")({v:t,h:i}=this.offset);else t=i=this.offset;if(typeof this._offset==="object")({v:t=s,h:i=e}=this._offset);else s=e=this._offset;const n=s=>{const e=s.match(/(top|bottom)/)?t:i;o(s);h.style[s]=e+"px";if(e)this.host.style.setProperty("--hide-transform-amount",`(110% + ${e}px)`);else this.host.style.setProperty("--hide-transform-amount",null)};const o=h=>{const n=h.match(/(top|bottom)/)?t+s:i+e;this.trigger.style[h]=n*-1+"px";this.trigger.style.position="relative";this.trigger.style.height="1px"};if(this.positions.includes("start")&&this.isRtl||this.positions.includes("end")&&!this.isRtl)n("right");if(this.positions.includes("end")&&this.isRtl||this.positions.includes("start")&&!this.isRtl)n("left");if(this.positions.includes("top"))n("top");if(this.positions.includes("bottom"))n("bottom")}positionChange(){this.positions=this.position.split("-");this.setOffset()}async stuckChange(){if(this.isStuck){if(this.stickToEle){const t=this.host.children;this.slottedContent=Array.from(t);this.slottedContent.forEach((t=>{this.stickToEle.appendChild(t);t.style.order=this.stickerIndex+""}));this.nanoStuck.emit({sticker:this.stickToEle})}else this.nanoStuck.emit({sticker:this.host})}else{this.scrollHide=false;if(this.stickToEle){this.slottedContent.forEach((t=>{this.host.appendChild(t);t.style.order=""}));this.nanoUnstuck.emit({sticker:this.stickToEle})}else this.nanoUnstuck.emit({sticker:this.host})}}attachScrollListeners(){if(this.quietModeIsOn)this.scrollParent.addEventListener("scroll",this.onScroll,{passive:true,capture:false});else if(this.scrollParent){this.scrollParent.removeEventListener("scroll",this.onScroll);this.moveTrigger(true)}}handleParentEvents(t,i=null){if(!this.listenForScrollParent)return;if(i)this.manageListenersOnParent(false,i);if(this.scrollParent)this.manageListenersOnParent(!this.stickToEle)}stickToEleChange(t,i){if(this.stickToEle){this.stickToEle.addEventListener("nanoHide",this.onStickToDisplayEvent);this.stickToEle.addEventListener("nanoShow",this.onStickToDisplayEvent);this.stickToEle.addEventListener("nanoStuck",this.onStickToDisplayEvent);this.stickToEle.addEventListener("nanoUnstuck",this.onStickToDisplayEvent)}if(i){i.removeEventListener("nanoHide",this.onStickToDisplayEvent);i.removeEventListener("nanoShow",this.onStickToDisplayEvent);i.removeEventListener("nanoStuck",this.onStickToDisplayEvent);i.removeEventListener("nanoUnstuck",this.onStickToDisplayEvent)}}stickToChange(){if(this.stickTo)this.stickToEle=this.scrollParent.querySelector(this.stickTo);else this.stickToEle=undefined}visibilityDecisionHandler(){if(this.multiStickerHide||this.scrollHide)this.hide=true;else this.hide=false}handleHideChange(){if(this.hide)this.nanoHide.emit({sticker:this.host});else this.nanoShow.emit({sticker:this.host})}setupIO(){if(this.io){this.io.disconnect();this.io=undefined}if(!this.scrollParent||!this.hasBootstrapped||!this.trigger)return;this.isRootSticker=this.scrollParent instanceof Document;let t=this.scrollParent;if(this.scrollParent instanceof Document)t=null;this.io=new window.IntersectionObserver((t=>{if(this.pauseResizeWatcher||!this.isSticky)return;this.shouldStick(t.slice(-1)[0])}),{root:t});this.io.observe(this.trigger)}manageListenersOnParent(t,i){const s=i||this.scrollParent;if(!s)return;if(!t){try{if(this.quietModeIsOn)s.removeEventListener("scroll",this.onScroll);s.removeEventListener("nanoStuck",this.onStickEvent);s.removeEventListener("nanoUnstuck",this.onStickEvent)}catch(t){console.error("Events haven`t been added")}}else{s.addEventListener("nanoStuck",this.onStickEvent);s.addEventListener("nanoUnstuck",this.onStickEvent);if(this.quietModeIsOn)this.attachScrollListeners()}this.setupParentResizeListener()}handleScrollTo(){this.scrollPosThresholdCache=null;if(!this.scrollHide)return;if(this.scrollingTo!==true){this._offset=this.cacheOffset||this._offset}this.scrollingTo=true;this.scrollHide=false}handleScrollAway(t){if(this.scrollHide)return;if(!this.isStuck)return;if(this.scrollingTo!==false){this.cacheOffset=this._offset;this._offset=0}this.scrollingTo=false;if(!this.scrollPosThresholdCache)this.scrollPosThresholdCache=t;else if(!this.pauseHide&&Math.abs(t-this.scrollPosThresholdCache)>100)this.scrollHide=true}moveTrigger(t){if(this.positions.includes("bottom")&&!t||!this.positions.includes("bottom")&&t){this.host.parentNode.insertBefore(this.trigger,this.host)}else this.host.parentNode.insertBefore(this.trigger,this.host.nextSibling)}getScrollParent(){const t=/(auto|scroll)/;const i=(t,s)=>{if(t.parentNode===null){return s}return i(t.parentNode,s.concat([t]))};const s=(t,i)=>getComputedStyle(t,null).getPropertyValue(i);const e=t=>s(t,"overflow")+s(t,"overflow-y")+s(t,"overflow-x");const h=i=>t.test(e(i));const n=document.documentElement.getBoundingClientRect().height;const o=t=>{if(!(t instanceof HTMLElement))return;const s=i(t,[]);return s.find((t=>h(t)&&t.getBoundingClientRect().height!==n))||document};return o(this.host)}shouldStick(t){let i;if(this.positions.includes("top")){if(!this.isRootSticker)i=c(this.trigger,this.scrollParent).top;else i=this.trigger.getBoundingClientRect().top;this.isStuck=i<-1}else if(this.positions.includes("bottom")){i=this.trigger.getBoundingClientRect().top;const s=t&&t.rootBounds?t.rootBounds:(this.scrollParent instanceof Document?document.documentElement:this.scrollParent).getBoundingClientRect();this.isStuck=i>s.height+s.top}}bootstrapGurantor(){this.hasBootstrapped=true;this.scrollParent=this.scrollParent||this.getScrollParent();this.isRootSticker=this.scrollParent instanceof Document;this.trigger=this.trigger||document.createElement("div");this.trigger.classList.add("sticker-trigger");this.positionChange();this.moveTrigger(true);this.quietModeChange();this.listenForScrollParent=true;this.handleParentEvents(true);this.stickerIndex=Array.from(this.scrollParent.querySelectorAll("nano-sticker")).filter((t=>t.position===this.position)).findIndex((t=>t===this.host));this.setOffset();this.stickerResizeListener();this.setupParentResizeListener();this.slottedContent=Array.from(this.host.children);this.slottedContent.forEach((t=>{t.style.order=this.stickerIndex+""}));this.updateTriggerOffset();this.stickToChange();this.setupIO();this.onStickToDisplayEvent=o(this.onStickToDisplayEvent,50)}connectedCallback(){this.isRtl=this.host.dir==="rtl"||this.host.ownerDocument.dir==="rtl";document.documentElement.addEventListener("nanoComponentsReady",(()=>{setTimeout((t=>this.bootstrapGurantor()),200)}));setTimeout((t=>{if(!this.hasBootstrapped)this.bootstrapGurantor()}),1e3)}disconnectedCallback(){if(this.io){this.io.disconnect();this.io=undefined}if(this.parentSizeObserver){this.parentSizeObserver.disconnect();this.parentSizeObserver=undefined}this.scrollParent=null;this.hasBootstrapped=false}render(){return s(e,{sticky:!this.isRootSticker&&!this.stickToEle&&this.isSticky,hide:this.hide&&this.isStuck,siblings:this.stuckCounter,index:this.stickerIndex,stuck:this.isStuck&&this.isSticky,"placed-bottom":this.positions.includes("bottom"),"placed-top":this.positions.includes("top"),"placed-end":this.positions.includes("end"),"placed-start":this.positions.includes("start")},s("div",{class:{sticker:true,sticky:this.isRootSticker&&this.isSticky,stuck:this.isStuck&&this.isRootSticker&&this.isSticky,hide:this.isRootSticker&&this.hide&&this.isStuck},ref:t=>this.sticker=t},s("div",{class:"sticker-content",ref:t=>this.content=t},s("slot",null))))}get host(){return h(this)}static get watchers(){return{trigger:["updateTriggerOffset"],scrollParent:["updateTriggerOffset","handleParentEvents","setupIO"],position:["stickerResizeListener","positionChange"],quietMode:["quietModeChange"],offset:["setOffset"],_offset:["setOffset"],isStuck:["stuckChange"],quietModeIsOn:["attachScrollListeners"],stickToEle:["handleParentEvents","stickToEleChange"],stickTo:["stickToChange"],multiStickerHide:["visibilityDecisionHandler"],scrollHide:["visibilityDecisionHandler"],hide:["handleHideChange"]}}};l.style=r;export{l as nano_sticker};
|
5
|
+
//# sourceMappingURL=p-a2e38472.entry.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["src/components/sticker/sticker.scss?tag=nano-sticker&encapsulation=shadow","src/components/sticker/sticker.tsx"],"names":["stickerCss","_getScrollTop","ele","Document","window","pageYOffset","scrollTop","_getOffset","parent","parentEle","document","documentElement","getOffset","Sticker","this","isRtl","scrollPosCache","scrollPosThresholdCache","cacheOffset","pauseResizeWatcher","listenForScrollParent","positions","pauseHide","hasBootstrapped","setupParentResizeListener","parentSizeObserver","disconnect","undefined","ResizeObserver","entries","entry","height","width","contentRect","quietMode","w","h","quietModeIsOn","breakPointMin","isSticky","breakPointMax","isRootSticker","sticker","autoResize","style","host","scrollWidth","toWatch","scrollParent","observe","onStickToDisplayEvent","e","detail","stickToEle","type","_offset","offset","isStuck","moveTrigger","requestAnimationFrame","minHeight","stickToEleInitSize","scrollHeight","v","setTriggerPos","getBoundingClientRect","onStickEvent","async","position","incomingTriggerPos","getTriggerPos","stickerIndex","hideOnNewStickers","includes","triggerPos","top","multiStickerHide","stuckCounter","onScroll","y","handleScrollTo","handleScrollAway","[object Object]","hide","shouldStick","pause","trigger","contentSizeObserver","content","setAttribute","_v","_h","setPos","pos","u","match","setTriggetPos","setProperty","split","setOffset","children","slottedContent","Array","from","forEach","child","appendChild","order","nanoStuck","emit","scrollHide","nanoUnstuck","addEventListener","passive","capture","removeEventListener","_","oldParent","manageListenersOnParent","oldEle","stickTo","querySelector","nanoHide","nanoShow","io","root","IntersectionObserver","slice","addEvents","console","error","attachScrollListeners","scrollingTo","currScroll","Math","abs","toInitial","parentNode","insertBefore","nextSibling","regex","parents","_node","ps","concat","prop","getComputedStyle","getPropertyValue","overflow","scroll","test","docHeight","HTMLElement","find","data","scrollAmt","parentBounding","rootBounds","getScrollParent","createElement","classList","add","positionChange","quietModeChange","handleParentEvents","querySelectorAll","filter","findIndex","stickerResizeListener","updateTriggerOffset","stickToChange","setupIO","debounce","dir","ownerDocument","setTimeout","bootstrapGurantor","Host","sticky","siblings","index","stuck","placed-bottom","placed-top","placed-end","placed-start","class","ref","div"],"mappings":"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","sourcesContent":["@import '../../global/style/nano-theme/layers';\n\n:host {\n /**\n * @prop --stuck-left: The left position when your sticker is stuck. This can be useful to force your sticker to fill the viewport for example. Defaults to initial\n * @prop --stuck-right: The right position when your sticker is stuck. This can be useful to force your sticker to fill the viewport for example. Defaults to initial\n * @prop --stuck-z-index: The z-index order to display your sticker. Can be useful when displaying multiple stickers simultaneously. Defaults to #{$layer-index-menubar};\n * @prop --top-hide: This is used for the hide transform animation (e.g. when quiet-mode is on). Defaults to translateY(-110%);\n * @prop --bottom-hide: This is used for the hide transform animation (e.g. when quiet-mode is on). Defaults to translateY(110%);\n */\n\n --stuck-left: initial;\n --stuck-right: initial;\n --stuck-z-index: #{$layer-index-menubar};\n --top-hide: translateY(-110%);\n --bottom-hide: translateY(110%);\n\n display: block;\n max-inline-size: 100%;\n}\n\n:host([sticky]) {\n position: sticky;\n transition: 0.3s ease transform;\n will-change: min-block-size;\n}\n\n:host([sticky][stuck]) {\n inset-inline: var(--stuck-left) var(--stuck-right);\n z-index: var(--stuck-z-index) !important;\n}\n\n:host([sticky][hide][placed-top]) {\n transform: var(--top-hide);\n}\n\n:host([sticky][hide][placed-bottom]) {\n transform: var(--bottom-hide);\n}\n\n:host([sticky][index='1']) {\n z-index: calc(var(--stuck-z-index) + 1);\n}\n\n:host([sticky][index='2']) {\n z-index: calc(var(--stuck-z-index) + 2);\n}\n\n:host([sticky][index='3']) {\n z-index: calc(var(--stuck-z-index) + 3);\n}\n\n:host([sticky][index='4']) {\n z-index: calc(var(--stuck-z-index) + 4);\n}\n\n:host([sticky][index='5']) {\n z-index: calc(var(--stuck-z-index) + 5);\n}\n\n.sticker {\n display: inherit;\n max-inline-size: inherit;\n inline-size: 100%;\n\n &:not(.stuck) {\n inline-size: auto !important;\n }\n\n &.sticky {\n transition: 0.3s ease all;\n position: relative;\n\n :host([index='1']) & {\n z-index: calc(var(--stuck-z-index) + 1);\n }\n\n :host([index='2']) & {\n z-index: calc(var(--stuck-z-index) + 2);\n }\n\n :host([index='3']) & {\n z-index: calc(var(--stuck-z-index) + 3);\n }\n\n :host([index='4']) & {\n z-index: calc(var(--stuck-z-index) + 4);\n }\n\n :host([index='5']) & {\n z-index: calc(var(--stuck-z-index) + 5);\n }\n }\n\n &.stuck {\n position: fixed;\n inset-inline: var(--stuck-left) var(--stuck-right);\n z-index: var(--stuck-z-index);\n transform: translateY(0);\n\n :host([placed-top]) & {\n inset-block-start: 0;\n }\n\n :host([placed-bottom]) & {\n inset-block-end: 0;\n }\n\n &.hide {\n :host([placed-top]) & {\n transform: var(--top-hide);\n }\n\n :host([placed-bottom]) & {\n transform: var(--bottom-hide);\n }\n }\n }\n}\n\n.sticker-content {\n display: flex;\n flex-wrap: wrap;\n}\n","import {\n Component,\n ComponentInterface,\n h,\n Host,\n Prop,\n State,\n Watch,\n Element,\n Event,\n EventEmitter,\n Method,\n} from '@stencil/core';\nimport { getOffset } from '../../utils/dom';\nimport { debounce } from '../../utils/throttle';\n\nfunction _getScrollTop(ele: HTMLElement | Document) {\n return ele instanceof Document ? window.pageYOffset : ele.scrollTop;\n}\n\nfunction _getOffset(ele: HTMLElement, parent: HTMLElement | Document) {\n const parentEle =\n parent instanceof Document ? document.documentElement : parent;\n return getOffset(ele, parentEle);\n}\n\ntype Positions = 'top' | 'bottom' | 'start' | 'end';\n\n/**\n * The Sticker component is a toolbox for 'sticking' items to scrolling containers.\n *\n */\n@Component({\n tag: 'nano-sticker',\n styleUrl: 'sticker.scss',\n shadow: true,\n})\nexport class Sticker implements ComponentInterface {\n private isRtl: boolean = false;\n private io: IntersectionObserver;\n private contentSizeObserver: ResizeObserver;\n private parentSizeObserver: ResizeObserver;\n private sticker: HTMLDivElement;\n private content: HTMLDivElement;\n private scrollPosCache = 0;\n private scrollPosThresholdCache = 0;\n private cacheOffset: number | { v: number; h: number } = 0;\n private slottedContent: Element[];\n private pauseResizeWatcher = false;\n private listenForScrollParent = false;\n private stickToEleInitSize?: DOMRect;\n private positions: Positions[] = [];\n private pauseHide: boolean = false;\n private hasBootstrapped = false;\n\n @Element() host: HTMLNanoStickerElement;\n\n // Internal State\n\n @State() isStuck = false;\n @State() isRootSticker = true;\n @State() hide = false;\n @State() scrollHide = false;\n @State() multiStickerHide = false;\n @State() scrollingTo = false;\n @State() quietModeIsOn = false;\n @State() stuckCounter = 0;\n @State() stickerIndex = 0;\n @State() stickToEle?: HTMLNanoStickerElement;\n @State() triggerPos: { top: number; left: number };\n @State() trigger: HTMLDivElement;\n @State() _offset: number | { v: number; h: number } = 0;\n\n // Public API\n\n /** Only applicable to root stickers. When applied the sticker will grow or shrink to the scrollParent size */\n @Prop() autoResize = true;\n\n /** Manually enable / disabled sticky behaviour */\n @Prop({ mutable: true }) isSticky = true;\n\n /** Distance the item should be stuck from the sticky edge. */\n @Prop({ mutable: true }) offset: number | { v: number; h: number } = 0;\n\n /** The edge of the scroll-parent to stick to */\n @Prop() position: 'top' | 'bottom' = 'top';\n // other opts I'd like one day. 'start' | 'end' | 'top-start' | 'top-end' | 'bottom-start' | 'bottom-end'\n\n /** When applied, the sticker will hide when the scroll-parent\n * is scrolling away from the sticker's stuck position and show when scrolling toward it.\n * By default this will apply when the parent is below either the h or w dimensions */\n @Prop() quietMode: 'on' | 'off' | { h: number; w: number } = {\n h: 600,\n w: 600,\n };\n\n /** When applied stickers will hide upon new stickers being stuck to the same position */\n @Prop() hideOnNewStickers = true;\n\n /** The max width of the item to implement sticky behaviour. */\n @Prop() breakPointMax: null | number = null;\n\n /** The min width of the item to implement sticky behaviour. */\n @Prop() breakPointMin: null | number = null;\n\n /** Define which scroll element to listen & stick to.\n * By default, it will find traverse the DOM to find the closest. */\n @Prop({ mutable: true }) scrollParent?: HTMLElement | Document;\n\n /** Upon being stuck, attach the sticker to another sticker element.\n * A JS query selector that returns a <nano-sticker> */\n @Prop() stickTo: string;\n\n // Broadcasted Events\n\n /** Emitted when a sticker is stuck */\n @Event() nanoStuck!: EventEmitter<{ sticker: HTMLNanoStickerElement }>;\n\n /** Emitted when a sticker is unstuck */\n @Event() nanoUnstuck!: EventEmitter<{ sticker: HTMLNanoStickerElement }>;\n\n /** Emitted when a sticker is hidden */\n @Event() nanoHide!: EventEmitter<{ sticker: HTMLNanoStickerElement }>;\n\n /** Emitted when a sticker is showing */\n @Event() nanoShow!: EventEmitter<{ sticker: HTMLNanoStickerElement }>;\n\n // Public methods\n\n /**\n * Method to return the visibility status of the sticker\n * @returns boolean\n */\n @Method()\n async isHiding() {\n return this.hide;\n }\n\n /**\n * Method to return the stuck status of the sticker\n * @returns boolean\n */\n @Method()\n async isSticking() {\n this.shouldStick();\n return this.isStuck;\n }\n\n /** @internal */\n @Method()\n async setTriggerPos(offset: number | { v: number; h: number }) {\n return (this._offset = offset);\n }\n\n /** @internal */\n @Method()\n async getTriggerPos() {\n return this.triggerPos;\n }\n\n /** @internal */\n @Method()\n async pauseHiding(pause: boolean) {\n return (this.pauseHide = pause);\n }\n\n // Watchers\n\n /** Keep a note of trigger position. Need this to track sticker order in the DOM */\n @Watch('trigger')\n @Watch('scrollParent')\n updateTriggerOffset() {\n if (!this.trigger || !this.scrollParent || !this.listenForScrollParent)\n return;\n this.triggerPos = _getOffset(this.trigger, this.scrollParent);\n }\n\n /** A root sticker is a fixed element Or this sticker is sticking to another.\n * We need a content resize watcher to make sure we maintain a correct placeholder size in the body */\n @Watch('position')\n stickerResizeListener() {\n if (this.contentSizeObserver) {\n this.contentSizeObserver.disconnect();\n this.contentSizeObserver = undefined;\n }\n\n this.contentSizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (this.pauseResizeWatcher) return;\n\n if (entry.contentRect.height) {\n if (this.position === 'top')\n this.host.style.height = entry.contentRect.height + 'px';\n if (this.position === 'bottom')\n this.host.style.minHeight = entry.contentRect.height + 'px';\n }\n }\n });\n this.contentSizeObserver.observe(this.content);\n }\n\n @Watch('quietMode')\n quietModeChange() {\n if (this.quietMode === 'on')\n requestAnimationFrame(() => (this.quietModeIsOn = true));\n else if (this.quietMode === 'off')\n requestAnimationFrame(() => (this.quietModeIsOn = false));\n }\n\n /** offset is part of the public API but we also use it to manipulate trigger points */\n @Watch('offset')\n @Watch('_offset')\n setOffset() {\n this.trigger.setAttribute('style', '');\n let v: number, h: number, _v: number, _h: number;\n const sticker: HTMLElement =\n this.isRootSticker || this.stickToEle ? this.sticker : this.host;\n\n if (!sticker) return;\n\n if (typeof this.offset === 'object') ({ v, h } = this.offset);\n else v = h = this.offset;\n\n if (typeof this._offset === 'object') ({ v = _v, h = _h } = this._offset);\n else _v = _h = this._offset;\n\n const setPos = (pos: 'top' | 'bottom' | 'left' | 'right') => {\n const u = pos.match(/(top|bottom)/) ? v : h;\n setTriggetPos(pos);\n sticker.style[pos] = u + 'px';\n if (u)\n this.host.style.setProperty(\n '--hide-transform-amount',\n `(110% + ${u}px)`\n );\n else this.host.style.setProperty('--hide-transform-amount', null);\n };\n\n const setTriggetPos = (pos: 'top' | 'bottom' | 'left' | 'right') => {\n const u = pos.match(/(top|bottom)/) ? v + _v : h + _h;\n this.trigger.style[pos] = u * -1 + 'px';\n this.trigger.style.position = 'relative';\n this.trigger.style.height = '1px';\n };\n\n if (\n (this.positions.includes('start') && this.isRtl) ||\n (this.positions.includes('end') && !this.isRtl)\n )\n setPos('right');\n\n if (\n (this.positions.includes('end') && this.isRtl) ||\n (this.positions.includes('start') && !this.isRtl)\n )\n setPos('left');\n\n if (this.positions.includes('top')) setPos('top');\n if (this.positions.includes('bottom')) setPos('bottom');\n }\n\n @Watch('position')\n positionChange() {\n this.positions = this.position.split('-') as Positions[];\n this.setOffset();\n }\n\n /** If this sticker is attached to a 'master' sticker (stickToEle),\n * here we move the content of this sticker in and out accordingly */\n @Watch('isStuck')\n async stuckChange() {\n if (this.isStuck) {\n if (this.stickToEle) {\n const content = this.host.children;\n this.slottedContent = Array.from(content);\n\n this.slottedContent.forEach((child: HTMLElement) => {\n this.stickToEle.appendChild(child);\n child.style.order = this.stickerIndex + '';\n });\n\n this.nanoStuck.emit({ sticker: this.stickToEle });\n } else this.nanoStuck.emit({ sticker: this.host });\n } else {\n this.scrollHide = false;\n\n if (this.stickToEle) {\n this.slottedContent.forEach((child: HTMLElement) => {\n this.host.appendChild(child);\n child.style.order = '';\n });\n this.nanoUnstuck.emit({ sticker: this.stickToEle });\n } else this.nanoUnstuck.emit({ sticker: this.host });\n }\n }\n\n /** attach scroll listener. 'hides' stickers when scrolling away from trigger and 'shows' when scrolling toward */\n @Watch('quietModeIsOn')\n attachScrollListeners() {\n if (this.quietModeIsOn)\n this.scrollParent.addEventListener('scroll', this.onScroll, {\n passive: true,\n capture: false,\n });\n else if (this.scrollParent) {\n this.scrollParent.removeEventListener('scroll', this.onScroll);\n this.moveTrigger(true);\n }\n }\n\n /** Add / remove parent scrolling listeners. If there's stickToEle we need to remove them */\n @Watch('scrollParent')\n @Watch('stickToEle')\n handleParentEvents(_, oldParent: null | HTMLElement = null) {\n if (!this.listenForScrollParent) return;\n if (oldParent) this.manageListenersOnParent(false, oldParent);\n if (this.scrollParent) this.manageListenersOnParent(!this.stickToEle);\n }\n\n /** Add remove specific listeners if we're sticking to a sticker.\n * We need to adjust triggers according to the status of the 'master' */\n @Watch('stickToEle')\n stickToEleChange(_, oldEle: null | HTMLNanoStickerElement) {\n if (this.stickToEle) {\n this.stickToEle.addEventListener('nanoHide', this.onStickToDisplayEvent);\n this.stickToEle.addEventListener('nanoShow', this.onStickToDisplayEvent);\n this.stickToEle.addEventListener('nanoStuck', this.onStickToDisplayEvent);\n this.stickToEle.addEventListener(\n 'nanoUnstuck',\n this.onStickToDisplayEvent\n );\n }\n if (oldEle) {\n oldEle.removeEventListener('nanoHide', this.onStickToDisplayEvent);\n oldEle.removeEventListener('nanoShow', this.onStickToDisplayEvent);\n oldEle.removeEventListener('nanoStuck', this.onStickToDisplayEvent);\n oldEle.removeEventListener('nanoUnstuck', this.onStickToDisplayEvent);\n }\n }\n\n /** Find and set the stickToEle from the public, selector string */\n @Watch('stickTo')\n stickToChange() {\n if (this.stickTo)\n this.stickToEle = this.scrollParent.querySelector(this.stickTo);\n else this.stickToEle = undefined;\n }\n\n /** 2 potential criteria for hiding. Multi-stickers or quietmode. */\n @Watch('multiStickerHide')\n @Watch('scrollHide')\n visibilityDecisionHandler() {\n if (this.multiStickerHide || this.scrollHide) this.hide = true;\n else this.hide = false;\n }\n\n @Watch('hide')\n handleHideChange() {\n if (this.hide) this.nanoHide.emit({ sticker: this.host });\n else this.nanoShow.emit({ sticker: this.host });\n }\n\n @Watch('scrollParent')\n setupIO() {\n if (this.io) {\n this.io.disconnect();\n this.io = undefined;\n }\n if (!this.scrollParent || !this.hasBootstrapped || !this.trigger) return;\n\n this.isRootSticker = this.scrollParent instanceof Document;\n let root = this.scrollParent;\n if (this.scrollParent instanceof Document) root = null;\n\n this.io = new window.IntersectionObserver(\n (_) => {\n if (this.pauseResizeWatcher || !this.isSticky) return;\n this.shouldStick(_.slice(-1)[0]);\n },\n { root: root as HTMLElement }\n );\n\n this.io.observe(this.trigger);\n }\n\n // Private methods / handlers\n\n /** Assesses the public API quitemode and works out if it should be applied atm.\n * If 'smallscreen', or there is a breakpointmax / min it will add a resizeobserver to conditionally add behaviour */\n private setupParentResizeListener = () => {\n if (this.parentSizeObserver) {\n this.parentSizeObserver.disconnect();\n this.parentSizeObserver = undefined;\n }\n\n this.parentSizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n let height: number, width: number;\n if (entry.contentRect.height) height = entry.contentRect.height;\n if (entry.contentRect.width) width = entry.contentRect.width;\n\n if (typeof this.quietMode === 'object') {\n if (width < this.quietMode.w || height < this.quietMode.h)\n this.quietModeIsOn = true;\n else this.quietModeIsOn = false;\n }\n\n if (this.breakPointMin) {\n if (width > this.breakPointMin) this.isSticky = true;\n else this.isSticky = false;\n }\n\n if (this.breakPointMax) {\n if (width < this.breakPointMax) this.isSticky = true;\n else this.isSticky = false;\n }\n\n if (this.isRootSticker && this.sticker && this.autoResize)\n this.sticker.style.width = this.host.scrollWidth + 'px';\n }\n });\n\n const toWatch =\n this.scrollParent instanceof Document\n ? this.scrollParent.documentElement\n : this.scrollParent;\n if (toWatch) this.parentSizeObserver.observe(toWatch);\n };\n\n /** For stickTo stickers. We listen to the events from the 'master' sticker to ammend the hide/show trigger\n * Main diffs from rootstickers / non is height being on 'master' */\n private onStickToDisplayEvent = (\n e: CustomEvent<{ sticker: HTMLNanoStickerElement }>\n ) => {\n if (e.detail.sticker !== this.stickToEle) return;\n\n switch (e.type) {\n case 'nanoHide':\n this._offset = 0;\n this.cacheOffset = this.offset;\n this.offset = 0;\n /** trigger moves down, underneath sticker if the main sticker hides */\n if (!this.isStuck) this.moveTrigger(false);\n\n /** If it's an actual 'position: sticky' element, we need to give the sticker an appropriate height.\n * This minimises content jumping around as items are added */\n if (!this.isRootSticker && this.quietModeIsOn) {\n requestAnimationFrame(() => {\n this.stickToEle.style.minHeight =\n this.stickToEleInitSize.height +\n (this.host.scrollHeight +\n (typeof this.cacheOffset === 'object'\n ? this.cacheOffset.v\n : this.cacheOffset)) +\n 'px';\n this.stickToEle.setTriggerPos(this.stickToEleInitSize.height * -1);\n });\n }\n break;\n case 'nanoShow':\n this._offset = this.stickToEleInitSize.height;\n this.offset = this.cacheOffset;\n this.moveTrigger(true);\n\n /** reset master sticker size */\n if (!this.isRootSticker && this.quietModeIsOn) {\n requestAnimationFrame(() => {\n this.stickToEle.style.minHeight = '';\n this.stickToEle.setTriggerPos(0);\n });\n }\n break;\n case 'nanoStuck':\n this.stickToEleInitSize = this.stickToEle.getBoundingClientRect();\n this._offset = this.stickToEleInitSize.height;\n break;\n }\n };\n\n /** Add or removes event listeners / observers on scrolling parent\n * for when the scrolling parent changes, or, this sticker is sticking to another */\n private manageListenersOnParent(\n addEvents: boolean,\n ele?: HTMLElement | Document\n ) {\n const scrollParent = ele || this.scrollParent;\n\n if (!scrollParent) return;\n\n if (!addEvents) {\n try {\n if (this.quietModeIsOn)\n scrollParent.removeEventListener('scroll', this.onScroll);\n scrollParent.removeEventListener('nanoStuck', this.onStickEvent);\n scrollParent.removeEventListener('nanoUnstuck', this.onStickEvent);\n } catch (e) {\n console.error('Events haven`t been added');\n }\n } else {\n scrollParent.addEventListener('nanoStuck', this.onStickEvent);\n scrollParent.addEventListener('nanoUnstuck', this.onStickEvent);\n\n if (this.quietModeIsOn) this.attachScrollListeners();\n }\n this.setupParentResizeListener();\n }\n\n /** Handler applied to scrolling parent. When 'hideOnNewStickers' is true, hide this sticker on subsequent stuck stickers. */\n private onStickEvent = async (\n e: CustomEvent<{ sticker: HTMLNanoStickerElement }>\n ) => {\n const sticker = e.detail ? e.detail.sticker : null;\n if (!sticker || sticker.position !== this.position) return;\n\n const incomingTriggerPos = await sticker.getTriggerPos();\n\n if (\n e.type === 'nanoStuck' &&\n sticker !== this.host &&\n sticker.scrollParent === this.host.scrollParent\n ) {\n this.stickerIndex++;\n\n if (!this.hideOnNewStickers) return;\n\n if (\n (this.positions.includes('top') &&\n this.triggerPos.top < incomingTriggerPos.top) ||\n (this.positions.includes('bottom') &&\n this.triggerPos.top > incomingTriggerPos.top)\n ) {\n this.multiStickerHide = true;\n this.stuckCounter++;\n }\n }\n\n if (\n e.type === 'nanoUnstuck' &&\n sticker !== this.host &&\n sticker.scrollParent === this.host.scrollParent\n ) {\n this.stickerIndex--;\n\n if (!this.hideOnNewStickers) return;\n\n if (\n (this.positions.includes('top') &&\n this.triggerPos.top < incomingTriggerPos.top) ||\n (this.positions.includes('bottom') &&\n this.triggerPos.top > incomingTriggerPos.top)\n ) {\n this.stuckCounter--;\n if (this.stuckCounter < 1) this.multiStickerHide = false;\n }\n }\n };\n\n /** Scroll handler applied to scrolling parent. Only applied when quietmode is on.\n * 'hides' stickers when scrolling over 100px away from trigger and 'shows' when scrolling toward */\n private onScroll = () => {\n const y: number = _getScrollTop(this.scrollParent);\n\n // scrolling up\n if (y < this.scrollPosCache) {\n if (!this.positions.includes('bottom')) this.handleScrollTo();\n else this.handleScrollAway(y);\n }\n\n // scrolling down\n if (y > this.scrollPosCache) {\n if (!this.positions.includes('bottom')) this.handleScrollAway(y);\n else this.handleScrollTo();\n }\n this.scrollPosCache = y;\n };\n\n /** Watch for scroll direction. Only applies when quietmode is on.\n * We need to addjust the position of the trigger when the sticker is hidden */\n private handleScrollTo() {\n this.scrollPosThresholdCache = null;\n if (!this.scrollHide) return;\n\n if (this.scrollingTo !== true) {\n this._offset = this.cacheOffset || this._offset;\n }\n this.scrollingTo = true;\n this.scrollHide = false;\n }\n\n private handleScrollAway(currScroll: number) {\n if (this.scrollHide) return;\n\n if (!this.isStuck) return;\n\n if (this.scrollingTo !== false) {\n this.cacheOffset = this._offset;\n this._offset = 0;\n }\n this.scrollingTo = false;\n\n if (!this.scrollPosThresholdCache)\n this.scrollPosThresholdCache = currScroll;\n else if (\n !this.pauseHide &&\n Math.abs(currScroll - this.scrollPosThresholdCache) > 100\n )\n this.scrollHide = true;\n }\n\n private moveTrigger(toInitial?: boolean) {\n if (\n (this.positions.includes('bottom') && !toInitial) ||\n (!this.positions.includes('bottom') && toInitial)\n ) {\n this.host.parentNode.insertBefore(this.trigger, this.host);\n } else\n this.host.parentNode.insertBefore(this.trigger, this.host.nextSibling);\n }\n\n /**\n * Gets the 'closest' scrolling parent\n * @returns either an element with `overflow: scroll | auto` or the parent Document\n */\n private getScrollParent(): HTMLElement | Document {\n const regex = /(auto|scroll)/;\n const parents = (_node: Node, ps: Node[]) => {\n if (_node.parentNode === null) {\n return ps;\n }\n return parents(_node.parentNode, ps.concat([_node]));\n };\n const style = (_node, prop) =>\n getComputedStyle(_node, null).getPropertyValue(prop);\n const overflow = (_node) =>\n style(_node, 'overflow') +\n style(_node, 'overflow-y') +\n style(_node, 'overflow-x');\n const scroll = (_node) => regex.test(overflow(_node));\n const docHeight = document.documentElement.getBoundingClientRect().height;\n\n const scrollParent = (_node: HTMLElement) => {\n if (!(_node instanceof HTMLElement)) return;\n\n const ps = parents(_node, []);\n return (\n ps.find(\n (ele) =>\n scroll(ele) && ele.getBoundingClientRect().height !== docHeight\n ) || document\n );\n };\n\n return scrollParent(this.host);\n }\n\n private shouldStick(data?: IntersectionObserverEntry) {\n let scrollAmt: number;\n\n if (this.positions.includes('top')) {\n if (!this.isRootSticker)\n scrollAmt = _getOffset(this.trigger, this.scrollParent).top;\n else scrollAmt = this.trigger.getBoundingClientRect().top;\n this.isStuck = scrollAmt < -1;\n } else if (this.positions.includes('bottom')) {\n scrollAmt = this.trigger.getBoundingClientRect().top;\n const parentBounding =\n data && data.rootBounds\n ? data.rootBounds\n : (this.scrollParent instanceof Document\n ? document.documentElement\n : this.scrollParent\n ).getBoundingClientRect();\n this.isStuck = scrollAmt > parentBounding.height + parentBounding.top;\n }\n }\n\n private bootstrapGurantor() {\n this.hasBootstrapped = true;\n\n this.scrollParent = this.scrollParent || this.getScrollParent();\n this.isRootSticker = this.scrollParent instanceof Document;\n\n this.trigger = this.trigger || document.createElement('div');\n this.trigger.classList.add('sticker-trigger');\n\n this.positionChange();\n this.moveTrigger(true);\n this.quietModeChange();\n\n this.listenForScrollParent = true;\n this.handleParentEvents(true);\n\n this.stickerIndex = Array.from(\n this.scrollParent.querySelectorAll('nano-sticker')\n )\n .filter(\n (sticker: HTMLNanoStickerElement) => sticker.position === this.position\n )\n .findIndex((sticker) => sticker === this.host);\n\n this.setOffset();\n this.stickerResizeListener();\n this.setupParentResizeListener();\n\n // bit of a hack ... add default 'order'. Required for 'stickTo' elements.\n this.slottedContent = Array.from(this.host.children);\n this.slottedContent.forEach((child: HTMLElement) => {\n child.style.order = this.stickerIndex + '';\n });\n\n this.updateTriggerOffset();\n this.stickToChange();\n this.setupIO();\n this.onStickToDisplayEvent = debounce(this.onStickToDisplayEvent, 50);\n }\n\n // Stencil metthods\n\n connectedCallback() {\n this.isRtl =\n this.host.dir === 'rtl' ||\n (this.host.ownerDocument as Document).dir === 'rtl';\n\n // this is all horrible.... shrug\n document.documentElement.addEventListener('nanoComponentsReady', () => {\n setTimeout((_) => this.bootstrapGurantor(), 200);\n });\n setTimeout((_) => {\n if (!this.hasBootstrapped) this.bootstrapGurantor();\n }, 1000);\n }\n\n disconnectedCallback() {\n if (this.io) {\n this.io.disconnect();\n this.io = undefined;\n }\n\n if (this.parentSizeObserver) {\n this.parentSizeObserver.disconnect();\n this.parentSizeObserver = undefined;\n }\n\n this.scrollParent = null;\n this.hasBootstrapped = false;\n }\n\n render() {\n return (\n <Host\n sticky={!this.isRootSticker && !this.stickToEle && this.isSticky}\n hide={this.hide && this.isStuck}\n siblings={this.stuckCounter}\n index={this.stickerIndex}\n stuck={this.isStuck && this.isSticky}\n placed-bottom={this.positions.includes('bottom')}\n placed-top={this.positions.includes('top')}\n placed-end={this.positions.includes('end')}\n placed-start={this.positions.includes('start')}\n >\n <div\n class={{\n sticker: true,\n sticky: this.isRootSticker && this.isSticky,\n stuck: this.isStuck && this.isRootSticker && this.isSticky,\n hide: this.isRootSticker && this.hide && this.isStuck,\n }}\n ref={(div) => (this.sticker = div)}\n >\n <div class=\"sticker-content\" ref={(div) => (this.content = div)}>\n <slot />\n </div>\n </div>\n </Host>\n );\n }\n}\n"]}
|
@@ -0,0 +1,5 @@
|
|
1
|
+
/*!
|
2
|
+
* Web Components for Nanopore digital Web Apps
|
3
|
+
*/
|
4
|
+
import{r as t,c as a,h as i,a as o,g as n}from"./p-1fe12320.js";const e=":host{box-sizing:border-box}*,*::before,*::after{box-sizing:border-box}[hidden]{display:none !important}:host{--focus-shadow:var(--nano-control-focus-shadow, 0 0 0 0.1875rem var(--nano-control-focus-color, rgba(144, 198, 231, 0.8)));--padding:0.75rem 1rem;--bg-rgb:var(--nano-layer-bg-rgb, 255, 255, 255);--active-bg:rgba(var(--bg-rgb), 1);--inactive-bg:rgba(var(--bg-rgb), 0.7);--disabled-bg-rgb:var(--bg-rgb);--text-color:#007495;--disabled-text-color:#455556;--active-text-color:#0c5a71;--h-font-size:0.93em;--v-font-size:0.875em;--tab-spacing:0.5rem;--tab-divider-size:0;--tab-divider-color:#90c6e7;--tab-indicator-size:5px;display:inline-block}:host([direction=vertical]){--padding:1rem}:host([direction=vertical]) .nanotab{font-size:var(--v-font-size)}:host([direction=vertical]) .nanotab.nanotab--active{font-weight:600;color:var(--active-text-color)}:host([direction=horizontal]) .nanotab{font-size:var(--h-font-size);margin-block-start:var(--tab-indicator-size);border-inline-end:solid var(--tab-divider-size) var(--tab-divider-color)}:host([direction=horizontal]) .nanotab.nanotab--active{margin-block-start:0;border-block-start:solid var(--tab-indicator-size) var(--tab-indicator-color);background:var(--active-bg);color:var(--active-text-color)}.nanotab{font-family:inherit;font-size:inherit;font-stretch:inherit;font-style:inherit;font-weight:inherit;letter-spacing:inherit;text-decoration:inherit;text-overflow:inherit;text-transform:inherit;text-align:inherit;white-space:inherit;color:inherit;margin-inline-end:var(--tab-spacing);padding:var(--padding);display:flex;block-size:100%;inline-size:auto;background:var(--inactive-bg);border-radius:var(--border-radius) var(--border-radius) 0 0;-webkit-user-select:none;user-select:none;cursor:pointer;overflow:visible;white-space:nowrap;align-items:center}.nanotab ::slotted(*){display:flex;align-items:center}:host(:last-of-type) .nanotab{margin-inline-end:0}.nanotab:hover:not(.tab--disabled){text-shadow:0 0 0.01px var(--text-color)}.nanotab:focus{outline:none;outline-style:none;box-shadow:none;border-color:transparent}.nanotab:focus:not(.nanotab--disabled){box-shadow:var(--focus-shadow) inset}.nanotab--disabled{background:rgba(var(--disabled-bg-rgb), 1);opacity:0.5;cursor:not-allowed;color:var(--disabled-text-color)}.nanotab__close-button{margin-inline-start:var(--nano-spacing-small, 8px);--padding:var(--nano-spacing-xsmall, 4px) !important}";let r=0;const s=class{constructor(i){t(this,i);this.nanoTabClose=a(this,"nanoTabClose",7);this.tabId=`nano-tab-${++r}`;this.handleCloseClick=()=>{this.nanoTabClose.emit()};this.handleCloseKeydown=t=>{if(t.key===" ")this.handleCloseClick()};this.panel="";this.active=false;this.disabled=false;this.closable=false}async setFocus(){this.tab.focus({preventScroll:true})}async removeFocus(){this.tab.blur()}render(){return i(o,{id:this.host.id||this.tabId},i("div",{part:"base",ref:t=>this.tab=t,class:{nanotab:true,"nanotab--active":this.active,"nanotab--disabled":this.disabled,"nanotab--closable":this.closable},role:"tab","aria-disabled":this.disabled?"true":"false","aria-selected":this.active?"true":"false",tabindex:this.disabled||!this.active?"-1":"0"},i("slot",null),this.closable&&i("nano-icon-button",{label:"Close this tab",iconName:"light/times",class:"nanotab__close-button",onClick:this.handleCloseClick,onKeyDown:this.handleCloseKeydown,tabIndex:-1})))}get host(){return n(this)}};s.style=e;export{s as nano_tab};
|
5
|
+
//# sourceMappingURL=p-b87539f0.entry.js.map
|