UNPKG

lisn.js

Version:

Simply handle user gestures and actions. Includes widgets.

1 lines 22.2 kB
{"version":3,"file":"scroll-to-top.cjs","names":["MC","_interopRequireWildcard","require","MH","_cssAlter","_domAlter","_domEvents","_domOptimize","_domSearch","_event","_validation","_views","_scrollWatcher","_viewWatcher","_widget","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ScrollToTop","Widget","element","mainWidget","instance","DUMMY_ID","isInstanceOf","register","registerWidget","WIDGET_NAME","config","newConfigValidator","enableMain","button","createButton","widget","onDestroy","moveElement","waitForElement","getBody","then","body","isDestroyed","to","constructor","_ScrollToTop$get","destroyPromise","destroy","id","offset","S_TOP","prefixCssVar","position","S_RIGHT","scrollable","hasCustomScrollable","getDocElement","scrollWatcher","ScrollWatcher","reuse","viewWatcher","ViewWatcher","root","clickListener","scrollTo","top","left","arrow","placeholder","showIt","showElement","hideIt","hideElement","promiseResolve","flexDirection","getParentFlexDirection","waitForMutateTime","createElement","moveElementNow","ignoreMove","shouldInsertBefore","S_LEFT","wrapElementNow","wrapper","disableInitialTransition","addClassesNow","PREFIX_ROOT","PREFIX_BTN","setBooleanDataNow","PREFIX_FIXED","setDataNow","PREFIX_PLACE","insertArrow","S_UP","addEventListenerTo","S_CLICK","onView","views","S_AT","S_BELOW","S_ABOVE","onDisable","undisplayElement","onEnable","displayElement","removeEventListenerFrom","removeClassesNow","delDataNow","displayElementNow","replaceElementNow","offView","exports","PREFIXED_NAME","prefixName","key","value","validateString","isValidScrollOffset","v","_ref","isLiteralString","waitForReferenceElement","undefined"],"sources":["../../../src/ts/widgets/scroll-to-top.ts"],"sourcesContent":["/**\n * @module Widgets\n */\n\nimport * as MC from \"@lisn/globals/minification-constants\";\nimport * as MH from \"@lisn/globals/minification-helpers\";\n\nimport { ScrollOffsetSpec } from \"@lisn/globals/types\";\n\nimport {\n showElement,\n hideElement,\n displayElement,\n displayElementNow,\n undisplayElement,\n disableInitialTransition,\n addClassesNow,\n removeClassesNow,\n setDataNow,\n setBooleanDataNow,\n delDataNow,\n getParentFlexDirection,\n} from \"@lisn/utils/css-alter\";\nimport {\n replaceElementNow,\n wrapElementNow,\n moveElement,\n moveElementNow,\n insertArrow,\n} from \"@lisn/utils/dom-alter\";\nimport { waitForElement } from \"@lisn/utils/dom-events\";\nimport { waitForMutateTime } from \"@lisn/utils/dom-optimize\";\nimport { waitForReferenceElement } from \"@lisn/utils/dom-search\";\nimport { addEventListenerTo, removeEventListenerFrom } from \"@lisn/utils/event\";\nimport { validateString } from \"@lisn/utils/validation\";\nimport { isValidScrollOffset } from \"@lisn/utils/views\";\n\nimport { ScrollWatcher } from \"@lisn/watchers/scroll-watcher\";\nimport { ViewWatcher } from \"@lisn/watchers/view-watcher\";\n\nimport {\n Widget,\n WidgetConfigValidatorFunc,\n registerWidget,\n} from \"@lisn/widgets/widget\";\n\n/**\n * Configures the given element as a {@link ScrollToTop} widget.\n *\n * The ScrollToTop widget adds a scroll-to-top button in the lower right corder\n * of the screen (can be changed to bottom left) which scrolls smoothly (and\n * more slowly than the native scroll) back to the top.\n *\n * The button is only shown when the scroll offset from the top is more than a\n * given configurable amount.\n *\n * **IMPORTANT:** When configuring an existing element as the button (i.e. using\n * `new ScrollToTop` or auto-widgets, rather than {@link ScrollToTop.enableMain}):\n * - if using\n * {@link Settings.settings.mainScrollableElementSelector | the main scrolling element}\n * as the scrollable, the button element will have it's CSS position set to `fixed`;\n * - otherwise, if using a custom scrollable element, the button element may be\n * moved in the DOM tree in order to position it on top of the scrollable\n * If you don't want the button element changed in any way, then consider using\n * the {@link Triggers.ClickTrigger | ClickTrigger} with a\n * {@link Actions.ScrollTo | ScrollTo} action.\n *\n * **IMPORTANT:** You should not instantiate more than one {@link ScrollToTop}\n * widget on a given element. Use {@link ScrollToTop.get} to get an existing\n * instance if any. If there is already a widget instance, it will be destroyed!\n *\n * -----\n *\n * You can use the following dynamic attributes or CSS properties in your\n * stylesheet:\n *\n * The following dynamic attributes are set on the element:\n * - `data-lisn-place`: `\"left\"` or `\"right\"`\n *\n * -----\n *\n * To use with auto-widgets (HTML API) (see\n * {@link Settings.settings.autoWidgets | settings.autoWidgets}), the following\n * CSS classes or data attributes are recognized:\n * - `lisn-scroll-to-top` class or `data-lisn-scroll-to-top` attribute set on\n * the element that constitutes the widget. The element should be empty.\n *\n * See below examples for what values you can use set for the data attributes\n * in order to modify the configuration of the automatically created widget.\n *\n * @example\n * This will create a scroll-to-top button using the JavaScript API.\n *\n * This will work even if\n * {@link Settings.settings.autoWidgets | settings.autoWidgets}) is false.\n *\n * ```html\n * <!-- LISN should be loaded beforehand -->\n * <script>\n * LISN.widgets.ScrollToTop.enableMain({\n * position: \"left\",\n * offset: \"top: 300vh\"\n * });\n * </script>\n * ```\n *\n * You can customise the offset show/hide trigger via CSS as well as long as\n * {@link ScrollToTopConfig.offset} is left at its default value which uses\n * this CSS property:\n *\n * ```html\n * <style type=\"text/css\" media=\"screen\">\n * :root {\n * --lisn-scroll-to-top--offset: 300vh;\n * }\n * </style>\n * ```\n *\n * @example\n * This will configure the given element as a scroll-to-top button for the main\n * scrolling element using an existing element for the button with default\n * {@link ScrollToTopConfig}.\n *\n * ```html\n * <button class=\"lisn-scroll-to-top\"></button>\n * ```\n * @example\n * As above but with custom settings.\n *\n * ```html\n * <button data-lisn-scroll-to-top=\"position=left | offset=top:300vh\"></button>\n * ```\n *\n * @example\n * This will configure the given element as a scroll-to-top button for a custom\n * scrolling element (i.e. one with overflow \"auto\" or \"scroll\").\n *\n * ```html\n * <div id=\"scrollable\">\n * <!-- content here... -->\n * </div>\n * <button data-lisn-scroll-to-top=\"scrollable=#scrollable\"></button>\n * ```\n *\n * @example\n * As above, but using a reference specification with a class name to find the\n * scrollable.\n *\n * ```html\n * <div class=\"scrollable\">\n * <!-- content here... -->\n * </div>\n * <button data-lisn-scroll-to-top=\"scrollable=prev.scrollable\"></button>\n * ```\n *\n * @example\n * As above but with all custom settings.\n *\n * ```html\n * <div class=\"scrollable\">\n * <!-- content here... -->\n * </div>\n * <button data-lisn-scroll-to-top=\"scrollable=prev.scrollable\n * | position=left\n * | offset=top:300vh\n * \"></button>\n * ```\n */\nexport class ScrollToTop extends Widget {\n /**\n * If element is omitted, returns the instance created by {@link enableMain}\n * if any.\n */\n static get(element?: Element): ScrollToTop | null {\n if (!element) {\n return mainWidget;\n }\n\n const instance = super.get(element, DUMMY_ID);\n if (MH.isInstanceOf(instance, ScrollToTop)) {\n return instance;\n }\n return null;\n }\n\n static register() {\n registerWidget(\n WIDGET_NAME,\n (element, config) => {\n if (!ScrollToTop.get(element)) {\n return new ScrollToTop(element, config);\n }\n return null;\n },\n newConfigValidator,\n );\n }\n\n /**\n * Creates a new button element, inserts it into the document body and\n * configures it as a {@link ScrollToTop}.\n */\n static enableMain(config?: ScrollToTopConfig) {\n const button = MH.createButton(\"Back to top\");\n const widget = new ScrollToTop(button, config);\n widget.onDestroy(() => {\n if (mainWidget === widget) {\n mainWidget = null;\n }\n return moveElement(button);\n });\n\n waitForElement(MH.getBody).then((body) => {\n if (!widget.isDestroyed()) {\n moveElement(button, { to: body });\n }\n });\n\n mainWidget = widget;\n return widget;\n }\n\n constructor(element: Element, config?: ScrollToTopConfig) {\n const destroyPromise = ScrollToTop.get(element)?.destroy();\n super(element, { id: DUMMY_ID });\n\n const offset: ScrollOffsetSpec =\n config?.offset ||\n `${MC.S_TOP}: var(${MH.prefixCssVar(\"scroll-to-top--offset\")}, 200vh)`;\n const position: \"left\" | \"right\" = config?.position || MC.S_RIGHT;\n const scrollable = config?.scrollable;\n const hasCustomScrollable =\n scrollable &&\n scrollable !== MH.getDocElement() &&\n scrollable !== MH.getBody();\n\n const scrollWatcher = ScrollWatcher.reuse();\n const viewWatcher = ViewWatcher.reuse(\n hasCustomScrollable ? { root: scrollable } : {},\n );\n\n const clickListener = () =>\n scrollWatcher.scrollTo({ top: 0, left: 0 }, { scrollable });\n\n let arrow: Element;\n let placeholder: Element;\n let root = element;\n\n const showIt = () => {\n showElement(root);\n };\n\n const hideIt = () => {\n hideElement(root);\n };\n\n // SETUP ------------------------------\n\n (destroyPromise || MH.promiseResolve()).then(async () => {\n const flexDirection = scrollable\n ? await getParentFlexDirection(scrollable)\n : null;\n\n await waitForMutateTime();\n if (this.isDestroyed()) {\n return;\n }\n\n if (hasCustomScrollable) {\n // Add a placeholder to restore its position on destroy.\n placeholder = MH.createElement(\"div\");\n moveElementNow(placeholder, {\n to: element,\n position: \"before\",\n ignoreMove: true,\n });\n\n // Then move it to immediately after the scrollable.\n // If the parent is a horizontal flexbox and position is left, then\n // we need to insert it before the scrollable.\n const shouldInsertBefore =\n flexDirection === \"column-reverse\" ||\n (position === MC.S_LEFT && flexDirection === \"row\") ||\n (position === MC.S_RIGHT && flexDirection === \"row-reverse\");\n\n moveElementNow(element, {\n to: scrollable,\n position: shouldInsertBefore ? \"before\" : \"after\",\n ignoreMove: true,\n });\n\n // Wrap the button.\n root = wrapElementNow(element, { wrapper: \"div\", ignoreMove: true });\n }\n\n disableInitialTransition(root);\n addClassesNow(root, PREFIX_ROOT);\n addClassesNow(element, PREFIX_BTN);\n setBooleanDataNow(root, PREFIX_FIXED, !hasCustomScrollable);\n setDataNow(root, MC.PREFIX_PLACE, position);\n\n arrow = insertArrow(element, MC.S_UP);\n\n hideIt(); // initial\n\n addEventListenerTo(element, MC.S_CLICK, clickListener);\n\n viewWatcher.onView(offset, showIt, {\n views: [MC.S_AT, MC.S_BELOW],\n });\n\n viewWatcher.onView(offset, hideIt, {\n views: [MC.S_ABOVE],\n });\n\n this.onDisable(() => {\n undisplayElement(root);\n });\n\n this.onEnable(() => {\n displayElement(root);\n });\n\n this.onDestroy(async () => {\n await waitForMutateTime();\n removeEventListenerFrom(element, MC.S_CLICK, clickListener);\n\n removeClassesNow(root, PREFIX_ROOT);\n removeClassesNow(element, PREFIX_BTN);\n delDataNow(root, PREFIX_FIXED);\n delDataNow(root, MC.PREFIX_PLACE);\n displayElementNow(root); // revert undisplay by onDisable\n\n if (arrow) {\n moveElementNow(arrow); // remove\n }\n\n if (root !== element) {\n // Unwrap the button.\n replaceElementNow(root, element, { ignoreMove: true });\n }\n\n if (placeholder) {\n // Move it back into its original position.\n replaceElementNow(placeholder, element, { ignoreMove: true });\n }\n\n viewWatcher.offView(offset, showIt);\n viewWatcher.offView(offset, hideIt);\n });\n });\n }\n}\n\n/**\n * @interface\n */\nexport type ScrollToTopConfig = {\n /**\n * The button will be shown when the scroll top offset of the page is below\n * the given value, and hidden otherwise. Accepts a colon-separated key:value\n * string where the key is \"top\" or \"bottom\" (or if your page scrolls\n * horizontally, then use \"left\" or \"right\"), and the value can be any valid\n * CSS length specification, e.g. \"top: 200vh\" or \"top: var(--offset, 50%)\".\n *\n * Alternatively, you set the `--lisn-scroll-to-top--offset` CSS variable on\n * the document root, which is used by the default value.\n *\n * @defaultValue \"top: var(--lisn-scroll-to-top--offset, 200vh)\"\n */\n offset?: ScrollOffsetSpec;\n\n /**\n * The horizontal position of the scroll-to-top button.\n *\n * @defaultValue \"right\"\n */\n position?: \"left\" | \"right\";\n\n /**\n * The element that should be scrolled.\n *\n * @defaultValue {@link ScrollWatcher} default\n */\n scrollable?: Element;\n};\n\n// --------------------\n\nconst WIDGET_NAME = \"scroll-to-top\";\nconst PREFIXED_NAME = MH.prefixName(WIDGET_NAME);\n// Only one ScrollToTop widget per element is allowed, but Widget requires a\n// non-blank ID.\nconst DUMMY_ID = PREFIXED_NAME;\nconst PREFIX_ROOT = `${PREFIXED_NAME}__root`;\nconst PREFIX_BTN = `${PREFIXED_NAME}__btn`;\nconst PREFIX_FIXED = MH.prefixName(\"fixed\");\n\nlet mainWidget: ScrollToTop | null = null;\n\nconst newConfigValidator: WidgetConfigValidatorFunc<ScrollToTopConfig> = (\n element,\n) => {\n return {\n offset: (key, value) => validateString(key, value, isValidScrollOffset),\n position: (key, value) =>\n validateString(key, value, (v) => v === MC.S_LEFT || v === MC.S_RIGHT),\n scrollable: (key, value) =>\n (MH.isLiteralString(value)\n ? waitForReferenceElement(value, element)\n : null) ?? undefined,\n };\n};\n"],"mappings":";;;;;;AAIA,IAAAA,EAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,EAAA,GAAAF,uBAAA,CAAAC,OAAA;AAIA,IAAAE,SAAA,GAAAF,OAAA;AAcA,IAAAG,SAAA,GAAAH,OAAA;AAOA,IAAAI,UAAA,GAAAJ,OAAA;AACA,IAAAK,YAAA,GAAAL,OAAA;AACA,IAAAM,UAAA,GAAAN,OAAA;AACA,IAAAO,MAAA,GAAAP,OAAA;AACA,IAAAQ,WAAA,GAAAR,OAAA;AACA,IAAAS,MAAA,GAAAT,OAAA;AAEA,IAAAU,cAAA,GAAAV,OAAA;AACA,IAAAW,YAAA,GAAAX,OAAA;AAEA,IAAAY,OAAA,GAAAZ,OAAA;AAI8B,SAAAD,wBAAAc,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAhB,uBAAA,YAAAA,CAAAc,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAU,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA;AA5C9B;AACA;AACA;;AA4CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMkB,WAAW,SAASC,cAAM,CAAC;EACtC;AACF;AACA;AACA;EACE,OAAOR,GAAGA,CAACS,OAAiB,EAAsB;IAChD,IAAI,CAACA,OAAO,EAAE;MACZ,OAAOC,UAAU;IACnB;IAEA,MAAMC,QAAQ,GAAG,KAAK,CAACX,GAAG,CAACS,OAAO,EAAEG,QAAQ,CAAC;IAC7C,IAAIpC,EAAE,CAACqC,YAAY,CAACF,QAAQ,EAAEJ,WAAW,CAAC,EAAE;MAC1C,OAAOI,QAAQ;IACjB;IACA,OAAO,IAAI;EACb;EAEA,OAAOG,QAAQA,CAAA,EAAG;IAChB,IAAAC,sBAAc,EACZC,WAAW,EACX,CAACP,OAAO,EAAEQ,MAAM,KAAK;MACnB,IAAI,CAACV,WAAW,CAACP,GAAG,CAACS,OAAO,CAAC,EAAE;QAC7B,OAAO,IAAIF,WAAW,CAACE,OAAO,EAAEQ,MAAM,CAAC;MACzC;MACA,OAAO,IAAI;IACb,CAAC,EACDC,kBACF,CAAC;EACH;;EAEA;AACF;AACA;AACA;EACE,OAAOC,UAAUA,CAACF,MAA0B,E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","ignoreList":[]}