@teleporthq/teleport-project-generator-next 0.43.69 → 0.43.70

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.
@@ -0,0 +1,58 @@
1
+ import generate from '@babel/generator'
2
+ import { ChunkDefinition, ProjectUIDL } from '@teleporthq/teleport-types'
3
+ import { InlineScriptErrorGuard } from '@teleporthq/teleport-shared'
4
+ import { createDocumentFileChunks } from '../src/utils'
5
+
6
+ /**
7
+ * A script in the project's custom code that throws used to cover every page of
8
+ * the generated app with Next's "Unhandled Runtime Error" overlay. `_document`
9
+ * now runs the inline script error guard before anything else in <head>, and
10
+ * only for a project that has scripts of its own.
11
+ */
12
+
13
+ const uidlWith = (globals: Record<string, unknown>): ProjectUIDL =>
14
+ ({
15
+ name: 'site',
16
+ globals: {
17
+ settings: { title: 'Site', language: 'en' },
18
+ meta: [{ name: 'description', content: 'Site' }],
19
+ assets: [{ type: 'style', path: 'https://fonts.test/font.css' }],
20
+ ...globals,
21
+ },
22
+ root: { name: 'App', node: { type: 'element', content: { elementType: 'Router' } } },
23
+ } as unknown as ProjectUIDL)
24
+
25
+ const documentSource = (uidl: ProjectUIDL): string => {
26
+ const chunks = createDocumentFileChunks(uidl, { assets: {} } as never)
27
+ const chunk = (chunks.js as ChunkDefinition[])[0]
28
+ return generate(chunk.content as never).code
29
+ }
30
+
31
+ describe('generated _document — inline script error guard', () => {
32
+ it('runs before everything else in <head> when the custom code has a script', () => {
33
+ const source = documentSource(
34
+ uidlWith({ customCode: { body: '<script>new Accordion().init()</script>' } })
35
+ )
36
+ const head = source.slice(source.indexOf('<Head>') + '<Head>'.length).trimStart()
37
+
38
+ expect(head.startsWith('<script dangerouslySetInnerHTML={{')).toBe(true)
39
+ expect(source).toContain(JSON.stringify(InlineScriptErrorGuard.INLINE_SCRIPT_ERROR_GUARD))
40
+ expect(source.indexOf('stopImmediatePropagation')).toBeLessThan(
41
+ source.indexOf('new Accordion().init()')
42
+ )
43
+ })
44
+
45
+ it('runs for an inline script asset too', () => {
46
+ const source = documentSource(
47
+ uidlWith({ assets: [{ type: 'script', content: 'console.log(1)' }] })
48
+ )
49
+
50
+ expect(source).toContain('stopImmediatePropagation')
51
+ })
52
+
53
+ it('leaves the document of a project without scripts of its own untouched', () => {
54
+ const source = documentSource(uidlWith({ customCode: { head: '<style>body{}</style>' } }))
55
+
56
+ expect(source).not.toContain('stopImmediatePropagation')
57
+ })
58
+ })
@@ -73,7 +73,15 @@ describe('pagination scroll runtime source', () => {
73
73
  )
74
74
  // An empty result renders no rows at all; the list block is still a target.
75
75
  expect(PAGINATION_SCROLL_RUNTIME_JS).toContain(
76
- 'return findFirstListItem(pagination) || pagination.parentElement'
76
+ 'return findFirstListItem(pagination) || findListBlock(pagination)'
77
+ )
78
+ })
79
+
80
+ it('aims at a list block with a box, never at a display: contents wrapper', () => {
81
+ // A wrapper without a box measures at the top of the viewport wherever the
82
+ // page is, so each correction scrolled one header height further up.
83
+ expect(PAGINATION_SCROLL_RUNTIME_JS).toContain(
84
+ 'var block = pagination.parentElement\n while (block && !hasBox(block)) {\n block = block.parentElement\n }'
77
85
  )
78
86
  })
79
87
 
@@ -1 +1 @@
1
- {"version":3,"file":"pagination-scroll-runtime.d.ts","sourceRoot":"","sources":["../../../src/pagination-scroll/pagination-scroll-runtime.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,eAAO,MAAM,4BAA4B,QAmTxC,CAAA"}
1
+ {"version":3,"file":"pagination-scroll-runtime.d.ts","sourceRoot":"","sources":["../../../src/pagination-scroll/pagination-scroll-runtime.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,eAAO,MAAM,4BAA4B,QA+TxC,CAAA"}
@@ -47,5 +47,5 @@ var constants_1 = require("./constants");
47
47
  * re-issues the scroll once the document is tall enough again, and hands
48
48
  * control straight back the moment the visitor scrolls for themselves.
49
49
  */
50
- exports.PAGINATION_SCROLL_RUNTIME_JS = "/* Array-mapper pagination scroll (TeleportHQ). Generated file, do not edit.\n See the pagination-scroll project plugin in teleport-project-generator-next. */\n\nvar PAGINATION_ATTR = '".concat(constants_1.PAGINATION_ATTR, "'\nvar CHROME_ATTR = '").concat(constants_1.LIST_CHROME_ATTR, "'\nvar PAGINATION_SELECTOR = '[' + PAGINATION_ATTR + ']'\nvar CHROME_SELECTOR = '[' + CHROME_ATTR + ']'\n\n// Only a real control counts. A caption or a page counter sitting inside the\n// pagination block must not move the page when it is clicked.\nvar CONTROL_SELECTOR = 'button, [role=\"button\"]'\n\n// Load More appends below what the visitor is already reading, so scrolling\n// them back to the first row would undo the click they just made.\nvar LOAD_MORE_SELECTOR = '[").concat(constants_1.PAGINATION_CONTROL_ATTR, "=\"").concat(constants_1.LOAD_MORE_CONTROL_VALUE, "\"]'\n\n// Keys that mean \"I am scrolling myself\", and therefore end the correction loop.\nvar SCROLL_KEYS = ['ArrowUp', 'ArrowDown', 'PageUp', 'PageDown', 'Home', 'End', ' ', 'Spacebar']\n\n// How long after the click corrections stay armed. Long enough to cover a slow\n// fetch, short enough that a late layout shift is no longer attributed to it.\nvar SETTLE_MS = 2000\nvar CORRECTION_INTERVAL_MS = 100\n\n// Breathing room above the first row.\nvar TOP_GAP = 8\n\n// Whatever is pinned to the top of the viewport may not be treated as a header\n// beyond this share of it \u2014 a full-screen fixed overlay is not a header.\nvar MAX_STICKY_RATIO = 0.4\n\nvar activePin = null\n\nfunction isElement(node) {\n return !!node && node.nodeType === 1\n}\n\nfunction asElement(node) {\n if (isElement(node)) {\n return node\n }\n return node && node.parentElement ? node.parentElement : null\n}\n\nfunction isDisabled(control) {\n return control.disabled === true || control.getAttribute('aria-disabled') === 'true'\n}\n\nfunction hasBox(element) {\n return element.getClientRects().length > 0\n}\n\nfunction prefersReducedMotion() {\n try {\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches\n } catch (error) {\n return false\n }\n}\n\n// A sibling of the rows that is chrome rather than a row: a pagination block\n// (this one, or a second one rendered above the rows), the mapper's\n// search/sort/filter block, or a wrapper holding either of them.\nfunction isChrome(candidate) {\n if (candidate.hasAttribute(CHROME_ATTR) || candidate.hasAttribute(PAGINATION_ATTR)) {\n return true\n }\n return !!candidate.querySelector(CHROME_SELECTOR + ', ' + PAGINATION_SELECTOR)\n}\n\n// The rows live alongside the pagination block, so the first row is the first\n// sibling that is neither chrome nor hidden. Deliberately does NOT climb past\n// that one parent: when a list has no rows to point at, the enclosing block is\n// a safe answer, whereas a search widened to grandparents starts returning\n// whatever else happens to sit next to the list.\nfunction findFirstListItem(pagination) {\n var region = pagination.parentElement\n if (!region) {\n return null\n }\n\n var children = region.children\n for (var index = 0; index < children.length; index++) {\n var child = children[index]\n // A hidden sibling reports a zero box, which would put the scroll somewhere\n // the visitor cannot see anything.\n if (isChrome(child) || !hasBox(child)) {\n continue\n }\n return child\n }\n\n return null\n}\n\n// Falls back to the block holding the pagination: an empty result may render\n// no rows at all, and its top is still the top of the list.\nfunction findScrollTarget(pagination) {\n return findFirstListItem(pagination) || pagination.parentElement\n}\n\nfunction isScrollable(element) {\n var overflowY = window.getComputedStyle(element).overflowY\n if (overflowY !== 'auto' && overflowY !== 'scroll' && overflowY !== 'overlay') {\n return false\n }\n // A block that grows with its content reports the same two heights, so only a\n // genuinely constrained one is treated as the scroller. This also rules out\n // the horizontal table wrapper, whose overflow-y computes to auto by spec.\n return element.scrollHeight - element.clientHeight > 1\n}\n\n// The element that actually scrolls the list \u2014 a panel with its own overflow,\n// or null when it is the page itself.\nfunction findScrollContainer(element) {\n var parent = element.parentElement\n while (parent && parent !== document.body && parent !== document.documentElement) {\n if (isScrollable(parent)) {\n return parent\n }\n parent = parent.parentElement\n }\n return null\n}\n\n// Height of whatever is pinned to the top of the viewport, so the first row\n// lands below a sticky header instead of behind it.\nfunction stickyOffset() {\n if (typeof document.elementsFromPoint !== 'function') {\n return 0\n }\n\n var stack = document.elementsFromPoint(Math.floor(window.innerWidth / 2), 1)\n var offset = 0\n\n for (var index = 0; index < stack.length; index++) {\n var element = stack[index]\n if (!isElement(element)) {\n continue\n }\n var position = window.getComputedStyle(element).position\n if (position !== 'fixed' && position !== 'sticky') {\n continue\n }\n var bottom = element.getBoundingClientRect().bottom\n if (bottom > offset) {\n offset = bottom\n }\n }\n\n return Math.min(Math.max(offset, 0), window.innerHeight * MAX_STICKY_RATIO)\n}\n\nfunction maxScrollTop(container) {\n var scroller = container || document.scrollingElement || document.documentElement\n return Math.max(0, scroller.scrollHeight - scroller.clientHeight)\n}\n\nfunction desiredScrollTop(pagination, container) {\n var target = findScrollTarget(pagination)\n if (!target || !target.isConnected) {\n return null\n }\n\n var top = target.getBoundingClientRect().top\n var desired\n\n if (container) {\n var box = container.getBoundingClientRect()\n desired = container.scrollTop + top - box.top - container.clientTop - TOP_GAP\n } else {\n desired = top + window.pageYOffset - stickyOffset() - TOP_GAP\n }\n\n return Math.min(Math.max(desired, 0), maxScrollTop(container))\n}\n\nfunction applyScroll(container, top, behavior) {\n var scroller = container || window\n try {\n scroller.scrollTo({ top: top, behavior: behavior })\n } catch (error) {\n if (container) {\n container.scrollTop = top\n } else {\n window.scrollTo(0, top)\n }\n }\n}\n\nfunction pinListStart(pagination) {\n if (activePin) {\n activePin.stop()\n }\n\n var container = findScrollContainer(pagination)\n var behavior = prefersReducedMotion() ? 'auto' : 'smooth'\n var deadline = Date.now() + SETTLE_MS\n var lastTop = null\n var timer = null\n var listening = false\n var pin = { stop: stop }\n\n function stop() {\n if (timer) {\n window.clearTimeout(timer)\n timer = null\n }\n if (listening) {\n window.removeEventListener('wheel', onVisitorScroll)\n window.removeEventListener('touchstart', onVisitorScroll)\n window.removeEventListener('keydown', onVisitorScroll)\n listening = false\n }\n if (activePin === pin) {\n activePin = null\n }\n }\n\n function onVisitorScroll(event) {\n if (event.type === 'keydown' && SCROLL_KEYS.indexOf(event.key) === -1) {\n return\n }\n stop()\n }\n\n // Armed only once the first scroll has been issued: a trackpad still coasting\n // from the gesture that brought the visitor down to the button would\n // otherwise cancel the pin before it had moved the page at all.\n function listenForVisitorScroll() {\n if (listening) {\n return\n }\n listening = true\n window.addEventListener('wheel', onVisitorScroll, { passive: true })\n window.addEventListener('touchstart', onVisitorScroll, { passive: true })\n window.addEventListener('keydown', onVisitorScroll)\n }\n\n function correct() {\n timer = null\n\n try {\n if (!pagination.isConnected) {\n stop()\n return\n }\n\n var top = desiredScrollTop(pagination, container)\n if (top !== null && (lastTop === null || Math.abs(top - lastTop) > 1)) {\n // A correction re-targets with the SAME behaviour: it usually arrives\n // while the first scroll is still animating, and switching to an\n // instant jump there would cut that animation short in front of the\n // visitor.\n applyScroll(container, top, behavior)\n lastTop = top\n listenForVisitorScroll()\n }\n } catch (error) {\n // Never leave the loop half-alive with its listeners still attached.\n stop()\n return\n }\n\n if (Date.now() < deadline) {\n timer = window.setTimeout(correct, CORRECTION_INTERVAL_MS)\n } else {\n stop()\n }\n }\n\n activePin = pin\n // Deferred by one task rather than run inline, so React has committed the\n // click's state update and the list is already showing whatever it shows for\n // the new page. A timer rather than an animation frame: the correction loop\n // is timer-based anyway, so stop() stays a single cancel path.\n timer = window.setTimeout(correct, 0)\n}\n\nfunction onDocumentClick(event) {\n try {\n var target = asElement(event.target)\n if (!target) {\n return\n }\n var control = target.closest(CONTROL_SELECTOR)\n if (!control) {\n return\n }\n if (control.closest(LOAD_MORE_SELECTOR)) {\n return\n }\n var pagination = control.closest(PAGINATION_SELECTOR)\n if (!pagination || isDisabled(control)) {\n return\n }\n pinListStart(pagination)\n } catch (error) {\n // Scroll assistance is best-effort \u2014 pagination has to keep working.\n }\n}\n\nif (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Capture phase, so the listener is reached even when a handler closer to the\n // button stops the event from bubbling.\n document.addEventListener('click', onDocumentClick, true)\n}\n");
50
+ exports.PAGINATION_SCROLL_RUNTIME_JS = "/* Array-mapper pagination scroll (TeleportHQ). Generated file, do not edit.\n See the pagination-scroll project plugin in teleport-project-generator-next. */\n\nvar PAGINATION_ATTR = '".concat(constants_1.PAGINATION_ATTR, "'\nvar CHROME_ATTR = '").concat(constants_1.LIST_CHROME_ATTR, "'\nvar PAGINATION_SELECTOR = '[' + PAGINATION_ATTR + ']'\nvar CHROME_SELECTOR = '[' + CHROME_ATTR + ']'\n\n// Only a real control counts. A caption or a page counter sitting inside the\n// pagination block must not move the page when it is clicked.\nvar CONTROL_SELECTOR = 'button, [role=\"button\"]'\n\n// Load More appends below what the visitor is already reading, so scrolling\n// them back to the first row would undo the click they just made.\nvar LOAD_MORE_SELECTOR = '[").concat(constants_1.PAGINATION_CONTROL_ATTR, "=\"").concat(constants_1.LOAD_MORE_CONTROL_VALUE, "\"]'\n\n// Keys that mean \"I am scrolling myself\", and therefore end the correction loop.\nvar SCROLL_KEYS = ['ArrowUp', 'ArrowDown', 'PageUp', 'PageDown', 'Home', 'End', ' ', 'Spacebar']\n\n// How long after the click corrections stay armed. Long enough to cover a slow\n// fetch, short enough that a late layout shift is no longer attributed to it.\nvar SETTLE_MS = 2000\nvar CORRECTION_INTERVAL_MS = 100\n\n// Breathing room above the first row.\nvar TOP_GAP = 8\n\n// Whatever is pinned to the top of the viewport may not be treated as a header\n// beyond this share of it \u2014 a full-screen fixed overlay is not a header.\nvar MAX_STICKY_RATIO = 0.4\n\nvar activePin = null\n\nfunction isElement(node) {\n return !!node && node.nodeType === 1\n}\n\nfunction asElement(node) {\n if (isElement(node)) {\n return node\n }\n return node && node.parentElement ? node.parentElement : null\n}\n\nfunction isDisabled(control) {\n return control.disabled === true || control.getAttribute('aria-disabled') === 'true'\n}\n\nfunction hasBox(element) {\n return element.getClientRects().length > 0\n}\n\nfunction prefersReducedMotion() {\n try {\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches\n } catch (error) {\n return false\n }\n}\n\n// A sibling of the rows that is chrome rather than a row: a pagination block\n// (this one, or a second one rendered above the rows), the mapper's\n// search/sort/filter block, or a wrapper holding either of them.\nfunction isChrome(candidate) {\n if (candidate.hasAttribute(CHROME_ATTR) || candidate.hasAttribute(PAGINATION_ATTR)) {\n return true\n }\n return !!candidate.querySelector(CHROME_SELECTOR + ', ' + PAGINATION_SELECTOR)\n}\n\n// The rows live alongside the pagination block, so the first row is the first\n// sibling that is neither chrome nor hidden. Deliberately does NOT climb past\n// that one parent: when a list has no rows to point at, the enclosing block is\n// a safe answer, whereas a search widened to grandparents starts returning\n// whatever else happens to sit next to the list.\nfunction findFirstListItem(pagination) {\n var region = pagination.parentElement\n if (!region) {\n return null\n }\n\n var children = region.children\n for (var index = 0; index < children.length; index++) {\n var child = children[index]\n // A hidden sibling reports a zero box, which would put the scroll somewhere\n // the visitor cannot see anything.\n if (isChrome(child) || !hasBox(child)) {\n continue\n }\n return child\n }\n\n return null\n}\n\n// The block holding the pagination, or the nearest ancestor that has a box of\n// its own. A block laid out with display: contents has none: its rect reads 0,\n// so every correction would aim one header height above wherever the page is\n// now and walk it up in steps until the rows come back.\nfunction findListBlock(pagination) {\n var block = pagination.parentElement\n while (block && !hasBox(block)) {\n block = block.parentElement\n }\n return block\n}\n\n// Falls back to the list block: while a page is loading, or for an empty\n// result, there may be no rows at all, and its top is still the top of the list.\nfunction findScrollTarget(pagination) {\n return findFirstListItem(pagination) || findListBlock(pagination)\n}\n\nfunction isScrollable(element) {\n var overflowY = window.getComputedStyle(element).overflowY\n if (overflowY !== 'auto' && overflowY !== 'scroll' && overflowY !== 'overlay') {\n return false\n }\n // A block that grows with its content reports the same two heights, so only a\n // genuinely constrained one is treated as the scroller. This also rules out\n // the horizontal table wrapper, whose overflow-y computes to auto by spec.\n return element.scrollHeight - element.clientHeight > 1\n}\n\n// The element that actually scrolls the list \u2014 a panel with its own overflow,\n// or null when it is the page itself.\nfunction findScrollContainer(element) {\n var parent = element.parentElement\n while (parent && parent !== document.body && parent !== document.documentElement) {\n if (isScrollable(parent)) {\n return parent\n }\n parent = parent.parentElement\n }\n return null\n}\n\n// Height of whatever is pinned to the top of the viewport, so the first row\n// lands below a sticky header instead of behind it.\nfunction stickyOffset() {\n if (typeof document.elementsFromPoint !== 'function') {\n return 0\n }\n\n var stack = document.elementsFromPoint(Math.floor(window.innerWidth / 2), 1)\n var offset = 0\n\n for (var index = 0; index < stack.length; index++) {\n var element = stack[index]\n if (!isElement(element)) {\n continue\n }\n var position = window.getComputedStyle(element).position\n if (position !== 'fixed' && position !== 'sticky') {\n continue\n }\n var bottom = element.getBoundingClientRect().bottom\n if (bottom > offset) {\n offset = bottom\n }\n }\n\n return Math.min(Math.max(offset, 0), window.innerHeight * MAX_STICKY_RATIO)\n}\n\nfunction maxScrollTop(container) {\n var scroller = container || document.scrollingElement || document.documentElement\n return Math.max(0, scroller.scrollHeight - scroller.clientHeight)\n}\n\nfunction desiredScrollTop(pagination, container) {\n var target = findScrollTarget(pagination)\n if (!target || !target.isConnected) {\n return null\n }\n\n var top = target.getBoundingClientRect().top\n var desired\n\n if (container) {\n var box = container.getBoundingClientRect()\n desired = container.scrollTop + top - box.top - container.clientTop - TOP_GAP\n } else {\n desired = top + window.pageYOffset - stickyOffset() - TOP_GAP\n }\n\n return Math.min(Math.max(desired, 0), maxScrollTop(container))\n}\n\nfunction applyScroll(container, top, behavior) {\n var scroller = container || window\n try {\n scroller.scrollTo({ top: top, behavior: behavior })\n } catch (error) {\n if (container) {\n container.scrollTop = top\n } else {\n window.scrollTo(0, top)\n }\n }\n}\n\nfunction pinListStart(pagination) {\n if (activePin) {\n activePin.stop()\n }\n\n var container = findScrollContainer(pagination)\n var behavior = prefersReducedMotion() ? 'auto' : 'smooth'\n var deadline = Date.now() + SETTLE_MS\n var lastTop = null\n var timer = null\n var listening = false\n var pin = { stop: stop }\n\n function stop() {\n if (timer) {\n window.clearTimeout(timer)\n timer = null\n }\n if (listening) {\n window.removeEventListener('wheel', onVisitorScroll)\n window.removeEventListener('touchstart', onVisitorScroll)\n window.removeEventListener('keydown', onVisitorScroll)\n listening = false\n }\n if (activePin === pin) {\n activePin = null\n }\n }\n\n function onVisitorScroll(event) {\n if (event.type === 'keydown' && SCROLL_KEYS.indexOf(event.key) === -1) {\n return\n }\n stop()\n }\n\n // Armed only once the first scroll has been issued: a trackpad still coasting\n // from the gesture that brought the visitor down to the button would\n // otherwise cancel the pin before it had moved the page at all.\n function listenForVisitorScroll() {\n if (listening) {\n return\n }\n listening = true\n window.addEventListener('wheel', onVisitorScroll, { passive: true })\n window.addEventListener('touchstart', onVisitorScroll, { passive: true })\n window.addEventListener('keydown', onVisitorScroll)\n }\n\n function correct() {\n timer = null\n\n try {\n if (!pagination.isConnected) {\n stop()\n return\n }\n\n var top = desiredScrollTop(pagination, container)\n if (top !== null && (lastTop === null || Math.abs(top - lastTop) > 1)) {\n // A correction re-targets with the SAME behaviour: it usually arrives\n // while the first scroll is still animating, and switching to an\n // instant jump there would cut that animation short in front of the\n // visitor.\n applyScroll(container, top, behavior)\n lastTop = top\n listenForVisitorScroll()\n }\n } catch (error) {\n // Never leave the loop half-alive with its listeners still attached.\n stop()\n return\n }\n\n if (Date.now() < deadline) {\n timer = window.setTimeout(correct, CORRECTION_INTERVAL_MS)\n } else {\n stop()\n }\n }\n\n activePin = pin\n // Deferred by one task rather than run inline, so React has committed the\n // click's state update and the list is already showing whatever it shows for\n // the new page. A timer rather than an animation frame: the correction loop\n // is timer-based anyway, so stop() stays a single cancel path.\n timer = window.setTimeout(correct, 0)\n}\n\nfunction onDocumentClick(event) {\n try {\n var target = asElement(event.target)\n if (!target) {\n return\n }\n var control = target.closest(CONTROL_SELECTOR)\n if (!control) {\n return\n }\n if (control.closest(LOAD_MORE_SELECTOR)) {\n return\n }\n var pagination = control.closest(PAGINATION_SELECTOR)\n if (!pagination || isDisabled(control)) {\n return\n }\n pinListStart(pagination)\n } catch (error) {\n // Scroll assistance is best-effort \u2014 pagination has to keep working.\n }\n}\n\nif (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Capture phase, so the listener is reached even when a handler closer to the\n // button stops the event from bubbling.\n document.addEventListener('click', onDocumentClick, true)\n}\n");
51
51
  //# sourceMappingURL=pagination-scroll-runtime.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pagination-scroll-runtime.js","sourceRoot":"","sources":["../../../src/pagination-scroll/pagination-scroll-runtime.ts"],"names":[],"mappings":";;;AAAA,yCAKoB;AAEpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACU,QAAA,4BAA4B,GAAG,qMAGnB,2BAAe,mCACnB,4BAAgB,0eAUR,mCAAuB,gBAAK,mCAAuB,+8RAqS/E,CAAA"}
1
+ {"version":3,"file":"pagination-scroll-runtime.js","sourceRoot":"","sources":["../../../src/pagination-scroll/pagination-scroll-runtime.ts"],"names":[],"mappings":";;;AAAA,yCAKoB;AAEpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACU,QAAA,4BAA4B,GAAG,qMAGnB,2BAAe,mCACnB,4BAAgB,0eAUR,mCAAuB,gBAAK,mCAAuB,y7SAiT/E,CAAA"}