@ng-doc/app 22.0.0-beta.1 → 22.0.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.
Files changed (205) hide show
  1. package/README.md +20 -29
  2. package/fesm2022/ng-doc-app-classes-content-anchor-controller.mjs +363 -0
  3. package/fesm2022/ng-doc-app-classes-content-anchor-controller.mjs.map +1 -0
  4. package/fesm2022/ng-doc-app-classes-content-controller.mjs +299 -0
  5. package/fesm2022/ng-doc-app-classes-content-controller.mjs.map +1 -0
  6. package/fesm2022/ng-doc-app-classes-default-search-engine.mjs +51 -35
  7. package/fesm2022/ng-doc-app-classes-default-search-engine.mjs.map +1 -1
  8. package/fesm2022/ng-doc-app-classes-root-page.mjs.map +1 -1
  9. package/fesm2022/ng-doc-app-classes-search-engine.mjs.map +1 -1
  10. package/fesm2022/ng-doc-app-classes.mjs +2 -0
  11. package/fesm2022/ng-doc-app-classes.mjs.map +1 -1
  12. package/fesm2022/ng-doc-app-components-api-list.mjs +178 -68
  13. package/fesm2022/ng-doc-app-components-api-list.mjs.map +1 -1
  14. package/fesm2022/ng-doc-app-components-breadcrumb.mjs +13 -10
  15. package/fesm2022/ng-doc-app-components-breadcrumb.mjs.map +1 -1
  16. package/fesm2022/ng-doc-app-components-code.mjs +152 -25
  17. package/fesm2022/ng-doc-app-components-code.mjs.map +1 -1
  18. package/fesm2022/ng-doc-app-components-command-palette.mjs +498 -0
  19. package/fesm2022/ng-doc-app-components-command-palette.mjs.map +1 -0
  20. package/fesm2022/ng-doc-app-components-copy-button.mjs +38 -21
  21. package/fesm2022/ng-doc-app-components-copy-button.mjs.map +1 -1
  22. package/fesm2022/ng-doc-app-components-demo-displayer.mjs +36 -29
  23. package/fesm2022/ng-doc-app-components-demo-displayer.mjs.map +1 -1
  24. package/fesm2022/ng-doc-app-components-demo-pane.mjs +39 -36
  25. package/fesm2022/ng-doc-app-components-demo-pane.mjs.map +1 -1
  26. package/fesm2022/ng-doc-app-components-demo.mjs +129 -44
  27. package/fesm2022/ng-doc-app-components-demo.mjs.map +1 -1
  28. package/fesm2022/ng-doc-app-components-fullscreen-button.mjs +12 -9
  29. package/fesm2022/ng-doc-app-components-fullscreen-button.mjs.map +1 -1
  30. package/fesm2022/ng-doc-app-components-fullscreen-toggle.mjs +79 -0
  31. package/fesm2022/ng-doc-app-components-fullscreen-toggle.mjs.map +1 -0
  32. package/fesm2022/ng-doc-app-components-heading-anchor.mjs +54 -21
  33. package/fesm2022/ng-doc-app-components-heading-anchor.mjs.map +1 -1
  34. package/fesm2022/ng-doc-app-components-image-viewer.mjs +187 -91
  35. package/fesm2022/ng-doc-app-components-image-viewer.mjs.map +1 -1
  36. package/fesm2022/ng-doc-app-components-kind-icon.mjs +42 -25
  37. package/fesm2022/ng-doc-app-components-kind-icon.mjs.map +1 -1
  38. package/fesm2022/ng-doc-app-components-link.mjs +12 -9
  39. package/fesm2022/ng-doc-app-components-link.mjs.map +1 -1
  40. package/fesm2022/ng-doc-app-components-members.mjs +30 -0
  41. package/fesm2022/ng-doc-app-components-members.mjs.map +1 -0
  42. package/fesm2022/ng-doc-app-components-mermaid-viewer.mjs +69 -24
  43. package/fesm2022/ng-doc-app-components-mermaid-viewer.mjs.map +1 -1
  44. package/fesm2022/ng-doc-app-components-navbar.mjs +39 -49
  45. package/fesm2022/ng-doc-app-components-navbar.mjs.map +1 -1
  46. package/fesm2022/ng-doc-app-components-page-header.mjs +73 -10
  47. package/fesm2022/ng-doc-app-components-page-header.mjs.map +1 -1
  48. package/fesm2022/ng-doc-app-components-page-link.mjs +123 -31
  49. package/fesm2022/ng-doc-app-components-page-link.mjs.map +1 -1
  50. package/fesm2022/ng-doc-app-components-page-navigation.mjs +17 -19
  51. package/fesm2022/ng-doc-app-components-page-navigation.mjs.map +1 -1
  52. package/fesm2022/ng-doc-app-components-page-wrapper.mjs +56 -35
  53. package/fesm2022/ng-doc-app-components-page-wrapper.mjs.map +1 -1
  54. package/fesm2022/ng-doc-app-components-page.mjs +168 -24
  55. package/fesm2022/ng-doc-app-components-page.mjs.map +1 -1
  56. package/fesm2022/ng-doc-app-components-playground.mjs +392 -263
  57. package/fesm2022/ng-doc-app-components-playground.mjs.map +1 -1
  58. package/fesm2022/ng-doc-app-components-root.mjs +48 -31
  59. package/fesm2022/ng-doc-app-components-root.mjs.map +1 -1
  60. package/fesm2022/ng-doc-app-components-search-result.mjs +22 -21
  61. package/fesm2022/ng-doc-app-components-search-result.mjs.map +1 -1
  62. package/fesm2022/ng-doc-app-components-search.mjs +64 -33
  63. package/fesm2022/ng-doc-app-components-search.mjs.map +1 -1
  64. package/fesm2022/ng-doc-app-components-sidebar.mjs +90 -63
  65. package/fesm2022/ng-doc-app-components-sidebar.mjs.map +1 -1
  66. package/fesm2022/ng-doc-app-components-tabs.mjs +18 -12
  67. package/fesm2022/ng-doc-app-components-tabs.mjs.map +1 -1
  68. package/fesm2022/ng-doc-app-components-theme-toggle.mjs +33 -21
  69. package/fesm2022/ng-doc-app-components-theme-toggle.mjs.map +1 -1
  70. package/fesm2022/ng-doc-app-components-toc.mjs +268 -90
  71. package/fesm2022/ng-doc-app-components-toc.mjs.map +1 -1
  72. package/fesm2022/ng-doc-app-components.mjs +3 -1
  73. package/fesm2022/ng-doc-app-components.mjs.map +1 -1
  74. package/fesm2022/ng-doc-app-defaults-default-processors.mjs +2 -1
  75. package/fesm2022/ng-doc-app-defaults-default-processors.mjs.map +1 -1
  76. package/fesm2022/ng-doc-app-directives-code-highlighter.mjs +14 -7
  77. package/fesm2022/ng-doc-app-directives-code-highlighter.mjs.map +1 -1
  78. package/fesm2022/ng-doc-app-directives-members-filter.mjs +276 -0
  79. package/fesm2022/ng-doc-app-directives-members-filter.mjs.map +1 -0
  80. package/fesm2022/ng-doc-app-directives-route-active.mjs +34 -30
  81. package/fesm2022/ng-doc-app-directives-route-active.mjs.map +1 -1
  82. package/fesm2022/ng-doc-app-directives.mjs +1 -0
  83. package/fesm2022/ng-doc-app-directives.mjs.map +1 -1
  84. package/fesm2022/ng-doc-app-helpers.mjs +285 -1
  85. package/fesm2022/ng-doc-app-helpers.mjs.map +1 -1
  86. package/fesm2022/ng-doc-app-pipes-decode-uri-component.mjs +6 -4
  87. package/fesm2022/ng-doc-app-pipes-decode-uri-component.mjs.map +1 -1
  88. package/fesm2022/ng-doc-app-pipes-extract-value.mjs +6 -4
  89. package/fesm2022/ng-doc-app-pipes-extract-value.mjs.map +1 -1
  90. package/fesm2022/ng-doc-app-pipes-filter-by-text.mjs +7 -4
  91. package/fesm2022/ng-doc-app-pipes-filter-by-text.mjs.map +1 -1
  92. package/fesm2022/ng-doc-app-pipes-sanitize-html.mjs +8 -5
  93. package/fesm2022/ng-doc-app-pipes-sanitize-html.mjs.map +1 -1
  94. package/fesm2022/ng-doc-app-processors-page-processor.mjs +86 -23
  95. package/fesm2022/ng-doc-app-processors-page-processor.mjs.map +1 -1
  96. package/fesm2022/ng-doc-app-processors-processors-tooltip.mjs +26 -25
  97. package/fesm2022/ng-doc-app-processors-processors-tooltip.mjs.map +1 -1
  98. package/fesm2022/ng-doc-app-processors-processors.mjs +12 -1
  99. package/fesm2022/ng-doc-app-processors-processors.mjs.map +1 -1
  100. package/fesm2022/ng-doc-app-providers-ng-doc-app.mjs +31 -2
  101. package/fesm2022/ng-doc-app-providers-ng-doc-app.mjs.map +1 -1
  102. package/fesm2022/ng-doc-app-services-content-scroll-intent.mjs +122 -0
  103. package/fesm2022/ng-doc-app-services-content-scroll-intent.mjs.map +1 -0
  104. package/fesm2022/ng-doc-app-services-content-state.mjs +57 -0
  105. package/fesm2022/ng-doc-app-services-content-state.mjs.map +1 -0
  106. package/fesm2022/ng-doc-app-services-fullscreen-route.mjs +74 -0
  107. package/fesm2022/ng-doc-app-services-fullscreen-route.mjs.map +1 -0
  108. package/fesm2022/ng-doc-app-services-highlighter.mjs +83 -14
  109. package/fesm2022/ng-doc-app-services-highlighter.mjs.map +1 -1
  110. package/fesm2022/ng-doc-app-services-route-preloader.mjs +360 -0
  111. package/fesm2022/ng-doc-app-services-route-preloader.mjs.map +1 -0
  112. package/fesm2022/ng-doc-app-services-shortcuts.mjs +214 -0
  113. package/fesm2022/ng-doc-app-services-shortcuts.mjs.map +1 -0
  114. package/fesm2022/ng-doc-app-services-sidebar.mjs +59 -25
  115. package/fesm2022/ng-doc-app-services-sidebar.mjs.map +1 -1
  116. package/fesm2022/ng-doc-app-services-store.mjs +8 -8
  117. package/fesm2022/ng-doc-app-services-store.mjs.map +1 -1
  118. package/fesm2022/ng-doc-app-services-theme.mjs +32 -12
  119. package/fesm2022/ng-doc-app-services-theme.mjs.map +1 -1
  120. package/fesm2022/ng-doc-app-services.mjs +143 -0
  121. package/fesm2022/ng-doc-app-services.mjs.map +1 -1
  122. package/fesm2022/ng-doc-app-tokens.mjs +7 -28
  123. package/fesm2022/ng-doc-app-tokens.mjs.map +1 -1
  124. package/fesm2022/ng-doc-app-type-controls-boolean-control.mjs +18 -9
  125. package/fesm2022/ng-doc-app-type-controls-boolean-control.mjs.map +1 -1
  126. package/fesm2022/ng-doc-app-type-controls-number-control.mjs +12 -9
  127. package/fesm2022/ng-doc-app-type-controls-number-control.mjs.map +1 -1
  128. package/fesm2022/ng-doc-app-type-controls-string-control.mjs +12 -9
  129. package/fesm2022/ng-doc-app-type-controls-string-control.mjs.map +1 -1
  130. package/fesm2022/ng-doc-app-type-controls-type-alias-control.mjs +22 -16
  131. package/fesm2022/ng-doc-app-type-controls-type-alias-control.mjs.map +1 -1
  132. package/package.json +74 -32
  133. package/styles/global.css +1129 -205
  134. package/styles/main.css +1129 -205
  135. package/styles/themes/dark.css +78 -56
  136. package/types/ng-doc-app-classes-content-anchor-controller.d.ts +54 -0
  137. package/types/ng-doc-app-classes-content-controller.d.ts +94 -0
  138. package/types/ng-doc-app-classes-default-search-engine.d.ts +9 -1
  139. package/types/ng-doc-app-classes-root-page.d.ts +6 -1
  140. package/types/ng-doc-app-classes-search-engine.d.ts +5 -0
  141. package/types/ng-doc-app-classes.d.ts +2 -0
  142. package/types/ng-doc-app-components-api-list.d.ts +69 -20
  143. package/types/ng-doc-app-components-breadcrumb.d.ts +8 -3
  144. package/types/ng-doc-app-components-code.d.ts +46 -12
  145. package/types/ng-doc-app-components-command-palette.d.ts +147 -0
  146. package/types/ng-doc-app-components-copy-button.d.ts +18 -6
  147. package/types/ng-doc-app-components-demo-displayer.d.ts +23 -10
  148. package/types/ng-doc-app-components-demo-pane.d.ts +19 -15
  149. package/types/ng-doc-app-components-demo.d.ts +62 -15
  150. package/types/ng-doc-app-components-fullscreen-button.d.ts +4 -2
  151. package/types/ng-doc-app-components-fullscreen-toggle.d.ts +24 -0
  152. package/types/ng-doc-app-components-heading-anchor.d.ts +26 -7
  153. package/types/ng-doc-app-components-image-viewer.d.ts +71 -7
  154. package/types/ng-doc-app-components-kind-icon.d.ts +28 -7
  155. package/types/ng-doc-app-components-link.d.ts +6 -2
  156. package/types/ng-doc-app-components-members.d.ts +13 -0
  157. package/types/ng-doc-app-components-mermaid-viewer.d.ts +21 -6
  158. package/types/ng-doc-app-components-navbar.d.ts +25 -15
  159. package/types/ng-doc-app-components-page-header.d.ts +28 -4
  160. package/types/ng-doc-app-components-page-link.d.ts +34 -15
  161. package/types/ng-doc-app-components-page-navigation.d.ts +10 -5
  162. package/types/ng-doc-app-components-page-wrapper.d.ts +35 -11
  163. package/types/ng-doc-app-components-page.d.ts +57 -6
  164. package/types/ng-doc-app-components-playground.d.ts +146 -78
  165. package/types/ng-doc-app-components-root.d.ts +28 -7
  166. package/types/ng-doc-app-components-search-result.d.ts +14 -6
  167. package/types/ng-doc-app-components-search.d.ts +19 -7
  168. package/types/ng-doc-app-components-tabs.d.ts +13 -4
  169. package/types/ng-doc-app-components-theme-toggle.d.ts +18 -5
  170. package/types/ng-doc-app-components-toc.d.ts +76 -29
  171. package/types/ng-doc-app-components.d.ts +3 -1
  172. package/types/ng-doc-app-directives-code-highlighter.d.ts +8 -4
  173. package/types/ng-doc-app-directives-members-filter.d.ts +61 -0
  174. package/types/ng-doc-app-directives-route-active.d.ts +21 -7
  175. package/types/ng-doc-app-directives.d.ts +1 -0
  176. package/types/ng-doc-app-helpers.d.ts +124 -3
  177. package/types/ng-doc-app-interfaces.d.ts +48 -28
  178. package/types/ng-doc-app-pipes-decode-uri-component.d.ts +3 -0
  179. package/types/ng-doc-app-pipes-extract-value.d.ts +3 -0
  180. package/types/ng-doc-app-pipes-filter-by-text.d.ts +4 -0
  181. package/types/ng-doc-app-pipes-sanitize-html.d.ts +4 -2
  182. package/types/ng-doc-app-processors-page-processor.d.ts +39 -10
  183. package/types/ng-doc-app-processors-processors-tooltip.d.ts +11 -10
  184. package/types/ng-doc-app-processors-processors.d.ts +5 -1
  185. package/types/ng-doc-app-providers-ng-doc-app.d.ts +17 -0
  186. package/types/ng-doc-app-providers-playground-demo.d.ts +1 -1
  187. package/types/ng-doc-app-providers-type-control.d.ts +2 -2
  188. package/types/ng-doc-app-services-content-scroll-intent.d.ts +52 -0
  189. package/types/ng-doc-app-services-content-state.d.ts +40 -0
  190. package/types/ng-doc-app-services-fullscreen-route.d.ts +35 -0
  191. package/types/ng-doc-app-services-highlighter.d.ts +40 -5
  192. package/types/ng-doc-app-services-route-preloader.d.ts +109 -0
  193. package/types/ng-doc-app-services-shortcuts.d.ts +96 -0
  194. package/types/ng-doc-app-services-sidebar.d.ts +24 -4
  195. package/types/ng-doc-app-services-store.d.ts +24 -1
  196. package/types/ng-doc-app-services-theme.d.ts +19 -3
  197. package/types/ng-doc-app-services.d.ts +77 -0
  198. package/types/ng-doc-app-tokens.d.ts +10 -30
  199. package/types/ng-doc-app-type-controls-boolean-control.d.ts +11 -6
  200. package/types/ng-doc-app-type-controls-number-control.d.ts +5 -3
  201. package/types/ng-doc-app-type-controls-string-control.d.ts +5 -3
  202. package/types/ng-doc-app-type-controls-type-alias-control.d.ts +13 -6
  203. package/fesm2022/ng-doc-app-components-search-dialog.mjs +0 -78
  204. package/fesm2022/ng-doc-app-components-search-dialog.mjs.map +0 -1
  205. package/types/ng-doc-app-components-search-dialog.d.ts +0 -28
package/README.md CHANGED
@@ -1,37 +1,28 @@
1
- <!-- PROJECT LOGO -->
2
- <br />
3
- <div align="center">
4
- <a href="https://github.com/ng-doc/ng-doc">
5
- <img src="https://ng-doc.com/assets/images/ng-doc.svg?raw=true" alt="Logo" height="150px">
6
- </a>
7
-
8
- <h1 align="center" style="margin-bottom: 0; border-bottom: 0">NgDoc</h1>
9
- <p align="center">
10
- Create user-friendly documentation for your projects with ease!
11
- <br />
12
- <a href="https://ng-doc.com/">Documentation</a>
13
- ·
14
- <a href="https://github.com/ng-doc/ng-doc/issues/new/choose">Report Bug</a>
15
- ·
16
- <a href="https://github.com/ng-doc/ng-doc/issues/new/choose">Request Feature</a>
17
-
18
- [![GitHub Workflow Status][build-shield]][build-url]
1
+ # 🖥️ @ng-doc/app
2
+
3
+ The Angular components and providers that make up an NgDoc documentation site.
4
+
5
+ It's part of [NgDoc](https://ng-doc.com/) 📚, the documentation engine for Angular projects.
6
+
19
7
  [![NPM][npm-shield]][npm-url]
20
8
  [![MIT License][license-shield]][license-url]
21
9
 
22
- </p>
23
- </div>
10
+ ## 🚀 Getting started
11
+
12
+ You don't need to install this package by hand. Add NgDoc to your project and it sets up
13
+ everything it needs:
24
14
 
25
- <!-- ABOUT THE PROJECT -->
15
+ ```bash
16
+ ng add @ng-doc/add
17
+ ```
26
18
 
27
- ## About The Project
19
+ ## 📖 Learn more
28
20
 
29
- This library is a part of NgDoc project, that uses to create documentation
30
- for Angular projects, please check our [repo](https://github.com/ng-doc/ng-doc) for more details.
21
+ - [Documentation](https://ng-doc.com/)
22
+ - [GitHub repository](https://github.com/ng-doc/ng-doc)
23
+ - [Report a bug or request a feature](https://github.com/ng-doc/ng-doc/issues/new/choose)
31
24
 
32
- [npm-shield]: https://img.shields.io/npm/v/@ng-doc/builder.svg?style=for-the-badge
33
- [npm-url]: https://www.npmjs.com/package/@ng-doc/builder
25
+ [npm-shield]: https://img.shields.io/npm/v/%40ng-doc%2Fapp.svg?style=for-the-badge
26
+ [npm-url]: https://www.npmjs.com/package/@ng-doc/app
34
27
  [license-shield]: https://img.shields.io/github/license/ng-doc/ng-doc.svg?style=for-the-badge
35
- [license-url]: https://github.com/othneildrew/Best-README-Template/blob/master/LICENSE.txt
36
- [build-shield]: https://img.shields.io/github/actions/workflow/status/ng-doc/ng-doc/release.yml?style=for-the-badge&branch=release
37
- [build-url]: https://github.com/ng-doc/ng-doc/actions
28
+ [license-url]: https://github.com/ng-doc/ng-doc/blob/main/LICENSE
@@ -0,0 +1,363 @@
1
+ import { DOCUMENT, ViewportScroller, isPlatformBrowser } from '@angular/common';
2
+ import * as i0 from '@angular/core';
3
+ import { inject, ApplicationRef, ElementRef, NgZone, PLATFORM_ID, DestroyRef, Injectable } from '@angular/core';
4
+ import { Router, Scroll, NavigationStart, NavigationEnd } from '@angular/router';
5
+ import { NgDocContentScrollIntent } from '@ng-doc/app/services/content-scroll-intent';
6
+ import { NgDocContentState } from '@ng-doc/app/services/content-state';
7
+ import { NG_DOC_CONTENT_ANCHOR_SCROLLING, NG_DOC_CONTENT_SCROLL_POSITION_RESTORATION } from '@ng-doc/app/tokens';
8
+
9
+ const overflowAnchorLeases = new WeakMap();
10
+ /** Coordinates one missed router anchor with the accepted asynchronous content pass. */
11
+ class NgDocContentAnchorController {
12
+ constructor() {
13
+ this.applicationRef = inject(ApplicationRef);
14
+ this.document = inject(DOCUMENT);
15
+ this.contentState = inject(NgDocContentState);
16
+ this.initialScrollIntent = inject(NgDocContentScrollIntent);
17
+ this.anchorScrolling = inject(NG_DOC_CONTENT_ANCHOR_SCROLLING);
18
+ this.positionRestoration = inject(NG_DOC_CONTENT_SCROLL_POSITION_RESTORATION);
19
+ this.host = inject(ElementRef).nativeElement;
20
+ this.zone = inject(NgZone);
21
+ this.router = inject(Router);
22
+ this.viewport = inject(ViewportScroller);
23
+ this.browser = isPlatformBrowser(inject(PLATFORM_ID));
24
+ this.active = false;
25
+ this.bodyProcessed = false;
26
+ this.destroyed = false;
27
+ this.latestNavigationId = 0;
28
+ this.sequence = 0;
29
+ this.viewportListening = false;
30
+ this.userInput = () => {
31
+ if (this.latestNavigationId > 0)
32
+ this.suppressedNavigationId = this.latestNavigationId;
33
+ if (this.pending)
34
+ this.clear();
35
+ };
36
+ this.keyInput = (event) => {
37
+ if (SCROLL_KEYS.has(event.key))
38
+ this.userInput();
39
+ };
40
+ this.viewportScroll = () => {
41
+ if (this.pending &&
42
+ this.pending.armed &&
43
+ !samePosition(this.viewport.getScrollPosition(), this.pending.observedPosition)) {
44
+ this.userInput();
45
+ }
46
+ };
47
+ this.subscription = this.router.events.subscribe((event) => {
48
+ if (event instanceof Scroll)
49
+ this.observeScroll(event);
50
+ else if (event instanceof NavigationStart) {
51
+ this.latestNavigationId = Math.max(this.latestNavigationId, event.id);
52
+ this.suppressedNavigationId = undefined;
53
+ this.clear();
54
+ }
55
+ });
56
+ inject(DestroyRef).onDestroy(() => this.destroy());
57
+ }
58
+ /** Limits delayed replay to pages backed by an asynchronous content source. */
59
+ activate() {
60
+ this.active = true;
61
+ this.unsubscribeIntent ??= this.initialScrollIntent.subscribe((intent) => this.observeInitialIntent(intent));
62
+ if ((this.anchorScrolling || this.positionRestoration === 'enabled') &&
63
+ this.browser &&
64
+ this.document.defaultView &&
65
+ !this.viewportListening) {
66
+ this.viewportListening = true;
67
+ this.document.defaultView.addEventListener('scroll', this.viewportScroll, {
68
+ capture: true,
69
+ passive: true,
70
+ });
71
+ this.document.defaultView.addEventListener('wheel', this.userInput, { passive: true });
72
+ this.document.defaultView.addEventListener('touchmove', this.userInput, { passive: true });
73
+ this.document.defaultView.addEventListener('keydown', this.keyInput);
74
+ }
75
+ }
76
+ /** Marks the current asynchronous body and its processors as accepted. */
77
+ contentProcessed() {
78
+ this.bodyProcessed = true;
79
+ const pending = this.pending;
80
+ if (!pending || !pending.armed || pending.scheduled)
81
+ return;
82
+ pending.scheduled = true;
83
+ void this.replayAfterStable(pending);
84
+ }
85
+ /** Cancels a missed anchor when the current body fails. */
86
+ contentFailed() {
87
+ this.bodyProcessed = false;
88
+ this.clear();
89
+ }
90
+ observeScroll(event) {
91
+ if (event.routerEvent.id < this.latestNavigationId)
92
+ return;
93
+ this.latestNavigationId = event.routerEvent.id;
94
+ this.clear();
95
+ if (this.suppressedNavigationId === event.routerEvent.id)
96
+ return;
97
+ const sequence = ++this.sequence;
98
+ if (!this.active ||
99
+ !this.browser ||
100
+ event.scrollBehavior === 'manual' ||
101
+ (event.position && this.positionRestoration !== 'enabled')) {
102
+ return;
103
+ }
104
+ const observedPosition = this.viewport.getScrollPosition();
105
+ if (event.position) {
106
+ if (samePosition(observedPosition, event.position))
107
+ return;
108
+ this.pending = {
109
+ armed: false,
110
+ kind: 'position',
111
+ navigationId: event.routerEvent.id,
112
+ observedPosition,
113
+ position: [event.position[0], event.position[1]],
114
+ sequence,
115
+ url: this.eventUrl(event.routerEvent),
116
+ scheduled: false,
117
+ };
118
+ const pending = this.pending;
119
+ this.acquireOverflowAnchor(pending);
120
+ queueMicrotask(() => {
121
+ if (this.destroyed || this.pending !== pending || pending.sequence !== this.sequence)
122
+ return;
123
+ pending.observedPosition = this.viewport.getScrollPosition();
124
+ pending.armed = true;
125
+ if (samePosition(pending.observedPosition, pending.position)) {
126
+ this.clear();
127
+ }
128
+ else if (this.bodyProcessed) {
129
+ this.contentProcessed();
130
+ }
131
+ });
132
+ return;
133
+ }
134
+ if (!this.anchorScrolling || !event.anchor || this.target(event.anchor))
135
+ return;
136
+ this.pending = {
137
+ armed: true,
138
+ kind: 'anchor',
139
+ anchor: event.anchor,
140
+ initial: false,
141
+ navigationId: event.routerEvent.id,
142
+ observedPosition,
143
+ sequence,
144
+ url: this.eventUrl(event.routerEvent),
145
+ scheduled: false,
146
+ };
147
+ if (this.bodyProcessed)
148
+ this.contentProcessed();
149
+ }
150
+ async replayAfterStable(pending) {
151
+ try {
152
+ await this.applicationRef.whenStable();
153
+ }
154
+ catch {
155
+ if (this.pending === pending)
156
+ this.clear();
157
+ return;
158
+ }
159
+ if (this.destroyed || this.pending !== pending || pending.sequence !== this.sequence)
160
+ return;
161
+ if (pending.kind === 'anchor' && pending.initial && !(await this.afterScrollOpportunity())) {
162
+ return;
163
+ }
164
+ if (this.destroyed || this.pending !== pending || pending.sequence !== this.sequence)
165
+ return;
166
+ const target = pending.kind === 'anchor' ? this.target(pending.anchor) : undefined;
167
+ const position = this.viewport.getScrollPosition();
168
+ this.pending = undefined;
169
+ if (pending.kind === 'anchor' && pending.initial) {
170
+ this.initialScrollIntent.settle(pending.navigationId);
171
+ }
172
+ try {
173
+ if (this.router.url !== pending.url ||
174
+ pending.navigationId !== this.latestNavigationId ||
175
+ this.contentState.currentFailure() ||
176
+ (pending.kind === 'anchor' && !target) ||
177
+ !samePosition(position, pending.observedPosition)) {
178
+ return;
179
+ }
180
+ if (pending.kind === 'anchor') {
181
+ this.viewport.scrollToAnchor(pending.anchor);
182
+ }
183
+ else
184
+ this.viewport.scrollToPosition(pending.position);
185
+ }
186
+ finally {
187
+ this.releaseOverflowAnchor(pending);
188
+ }
189
+ }
190
+ observeInitialIntent(intent) {
191
+ if (this.pending?.kind === 'anchor' && this.pending.initial)
192
+ this.clear();
193
+ if (!intent ||
194
+ !this.active ||
195
+ !this.browser ||
196
+ !this.anchorScrolling ||
197
+ this.suppressedNavigationId === intent.navigationId) {
198
+ return;
199
+ }
200
+ if (this.target(intent.anchor)) {
201
+ this.initialScrollIntent.settle(intent.navigationId);
202
+ return;
203
+ }
204
+ this.pending = {
205
+ armed: true,
206
+ kind: 'anchor',
207
+ anchor: intent.anchor,
208
+ initial: true,
209
+ navigationId: intent.navigationId,
210
+ observedPosition: this.viewport.getScrollPosition(),
211
+ sequence: ++this.sequence,
212
+ url: intent.url,
213
+ scheduled: false,
214
+ };
215
+ this.latestNavigationId = Math.max(this.latestNavigationId, intent.navigationId);
216
+ if (this.bodyProcessed)
217
+ this.contentProcessed();
218
+ }
219
+ afterScrollOpportunity() {
220
+ const window = this.document.defaultView;
221
+ if (!window)
222
+ return Promise.resolve(false);
223
+ this.cancelFrameWait();
224
+ return this.zone.runOutsideAngular(() => new Promise((resolve) => {
225
+ const wait = {
226
+ settle: (value) => {
227
+ if (this.frameWait !== wait)
228
+ return;
229
+ this.frameWait = undefined;
230
+ resolve(value);
231
+ },
232
+ };
233
+ this.frameWait = wait;
234
+ wait.first = window.requestAnimationFrame(() => {
235
+ wait.first = undefined;
236
+ wait.second = window.requestAnimationFrame(() => {
237
+ wait.second = undefined;
238
+ wait.settle(true);
239
+ });
240
+ });
241
+ }));
242
+ }
243
+ eventUrl(event) {
244
+ return event instanceof NavigationEnd ? event.urlAfterRedirects : event.url;
245
+ }
246
+ target(anchor) {
247
+ const scope = this.pageWrapper();
248
+ if (!scope || scope.ownerDocument !== this.document)
249
+ return undefined;
250
+ const local = scope.id === anchor || scope.getAttribute('name') === anchor
251
+ ? scope
252
+ : Array.from(scope.querySelectorAll('[id], [name]')).find((element) => element.id === anchor || element.getAttribute('name') === anchor);
253
+ const global = this.document.getElementById(anchor) ?? this.document.getElementsByName(anchor)[0];
254
+ return local && global === local ? local : undefined;
255
+ }
256
+ clear() {
257
+ const pending = this.pending;
258
+ this.cancelFrameWait();
259
+ this.sequence++;
260
+ this.pending = undefined;
261
+ if (pending)
262
+ this.releaseOverflowAnchor(pending);
263
+ if (pending?.kind === 'anchor' && pending.initial) {
264
+ this.initialScrollIntent.settle(pending.navigationId);
265
+ }
266
+ }
267
+ acquireOverflowAnchor(owner) {
268
+ const element = this.pageWrapper();
269
+ if (!element)
270
+ return;
271
+ let lease = overflowAnchorLeases.get(element);
272
+ if (!lease) {
273
+ lease = {
274
+ owners: new Set(),
275
+ previousPriority: element.style.getPropertyPriority('overflow-anchor'),
276
+ previousValue: element.style.getPropertyValue('overflow-anchor'),
277
+ };
278
+ overflowAnchorLeases.set(element, lease);
279
+ element.style.setProperty('overflow-anchor', 'none');
280
+ }
281
+ lease.owners.add(owner);
282
+ this.overflowAnchorLease = { element, owner };
283
+ }
284
+ releaseOverflowAnchor(owner) {
285
+ const current = this.overflowAnchorLease;
286
+ if (!current || current.owner !== owner)
287
+ return;
288
+ this.overflowAnchorLease = undefined;
289
+ const lease = overflowAnchorLeases.get(current.element);
290
+ if (!lease)
291
+ return;
292
+ lease.owners.delete(owner);
293
+ if (lease.owners.size > 0)
294
+ return;
295
+ overflowAnchorLeases.delete(current.element);
296
+ if (current.element.style.getPropertyValue('overflow-anchor') !== 'none' ||
297
+ current.element.style.getPropertyPriority('overflow-anchor') !== '') {
298
+ return;
299
+ }
300
+ if (lease.previousValue) {
301
+ current.element.style.setProperty('overflow-anchor', lease.previousValue, lease.previousPriority);
302
+ }
303
+ else {
304
+ current.element.style.removeProperty('overflow-anchor');
305
+ }
306
+ }
307
+ pageWrapper() {
308
+ return this.host.closest('ng-doc-page-wrapper') ?? undefined;
309
+ }
310
+ cancelFrameWait() {
311
+ const wait = this.frameWait;
312
+ if (!wait)
313
+ return;
314
+ const window = this.document.defaultView;
315
+ if (wait.first !== undefined)
316
+ window?.cancelAnimationFrame(wait.first);
317
+ if (wait.second !== undefined)
318
+ window?.cancelAnimationFrame(wait.second);
319
+ wait.settle(false);
320
+ }
321
+ destroy() {
322
+ if (this.destroyed)
323
+ return;
324
+ this.destroyed = true;
325
+ this.clear();
326
+ if (this.viewportListening) {
327
+ this.document.defaultView?.removeEventListener('scroll', this.viewportScroll, true);
328
+ this.document.defaultView?.removeEventListener('wheel', this.userInput);
329
+ this.document.defaultView?.removeEventListener('touchmove', this.userInput);
330
+ this.document.defaultView?.removeEventListener('keydown', this.keyInput);
331
+ this.viewportListening = false;
332
+ }
333
+ this.unsubscribeIntent?.();
334
+ this.unsubscribeIntent = undefined;
335
+ this.subscription.unsubscribe();
336
+ }
337
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocContentAnchorController, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
338
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocContentAnchorController }); }
339
+ }
340
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocContentAnchorController, decorators: [{
341
+ type: Injectable
342
+ }], ctorParameters: () => [] });
343
+ const SCROLL_KEYS = new Set([
344
+ ' ',
345
+ 'ArrowDown',
346
+ 'ArrowLeft',
347
+ 'ArrowRight',
348
+ 'ArrowUp',
349
+ 'End',
350
+ 'Home',
351
+ 'PageDown',
352
+ 'PageUp',
353
+ ]);
354
+ function samePosition(first, second) {
355
+ return first[0] === second[0] && first[1] === second[1];
356
+ }
357
+
358
+ /**
359
+ * Generated bundle index. Do not edit.
360
+ */
361
+
362
+ export { NgDocContentAnchorController };
363
+ //# sourceMappingURL=ng-doc-app-classes-content-anchor-controller.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ng-doc-app-classes-content-anchor-controller.mjs","sources":["../../../../libs/app/classes/content-anchor-controller/content-anchor-controller.ts","../../../../libs/app/classes/content-anchor-controller/ng-doc-app-classes-content-anchor-controller.ts"],"sourcesContent":["import { DOCUMENT, isPlatformBrowser, ViewportScroller } from '@angular/common';\nimport {\n ApplicationRef,\n DestroyRef,\n ElementRef,\n inject,\n Injectable,\n NgZone,\n PLATFORM_ID,\n} from '@angular/core';\nimport { NavigationEnd, NavigationSkipped, NavigationStart, Router, Scroll } from '@angular/router';\nimport {\n NgDocContentScrollIntent,\n NgDocInitialContentScrollIntent,\n} from '@ng-doc/app/services/content-scroll-intent';\nimport { NgDocContentState } from '@ng-doc/app/services/content-state';\nimport {\n NG_DOC_CONTENT_ANCHOR_SCROLLING,\n NG_DOC_CONTENT_SCROLL_POSITION_RESTORATION,\n} from '@ng-doc/app/tokens';\nimport { Subscription } from 'rxjs';\n\ntype PendingScroll = {\n armed: boolean;\n readonly navigationId: number;\n observedPosition: readonly [number, number];\n readonly sequence: number;\n readonly url: string;\n scheduled: boolean;\n} & (\n | { readonly kind: 'anchor'; readonly anchor: string; readonly initial: boolean }\n | { readonly kind: 'position'; readonly position: [number, number] }\n);\n\ninterface FrameWait {\n first?: number;\n second?: number;\n settle(value: boolean): void;\n}\n\ninterface OverflowAnchorLease {\n readonly owners: Set<object>;\n readonly previousPriority: string;\n readonly previousValue: string;\n}\n\nconst overflowAnchorLeases = new WeakMap<HTMLElement, OverflowAnchorLease>();\n\n/** Coordinates one missed router anchor with the accepted asynchronous content pass. */\n@Injectable()\nexport class NgDocContentAnchorController {\n private readonly applicationRef = inject(ApplicationRef);\n private readonly document = inject(DOCUMENT);\n private readonly contentState = inject(NgDocContentState);\n private readonly initialScrollIntent = inject(NgDocContentScrollIntent);\n private readonly anchorScrolling = inject(NG_DOC_CONTENT_ANCHOR_SCROLLING);\n private readonly positionRestoration = inject(NG_DOC_CONTENT_SCROLL_POSITION_RESTORATION);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n private readonly zone = inject(NgZone);\n private readonly router = inject(Router);\n private readonly viewport = inject(ViewportScroller);\n private readonly browser = isPlatformBrowser(inject(PLATFORM_ID));\n private active = false;\n private bodyProcessed = false;\n private destroyed = false;\n private latestNavigationId = 0;\n private pending?: PendingScroll;\n private sequence = 0;\n private readonly subscription: Subscription;\n private viewportListening = false;\n private frameWait?: FrameWait;\n private overflowAnchorLease?: { readonly element: HTMLElement; readonly owner: object };\n private suppressedNavigationId?: number;\n private unsubscribeIntent?: () => void;\n private readonly userInput = () => {\n if (this.latestNavigationId > 0) this.suppressedNavigationId = this.latestNavigationId;\n if (this.pending) this.clear();\n };\n private readonly keyInput = (event: KeyboardEvent) => {\n if (SCROLL_KEYS.has(event.key)) this.userInput();\n };\n private readonly viewportScroll = () => {\n if (\n this.pending &&\n this.pending.armed &&\n !samePosition(this.viewport.getScrollPosition(), this.pending.observedPosition)\n ) {\n this.userInput();\n }\n };\n\n constructor() {\n this.subscription = this.router.events.subscribe((event) => {\n if (event instanceof Scroll) this.observeScroll(event);\n else if (event instanceof NavigationStart) {\n this.latestNavigationId = Math.max(this.latestNavigationId, event.id);\n this.suppressedNavigationId = undefined;\n this.clear();\n }\n });\n inject(DestroyRef).onDestroy(() => this.destroy());\n }\n\n /** Limits delayed replay to pages backed by an asynchronous content source. */\n activate(): void {\n this.active = true;\n this.unsubscribeIntent ??= this.initialScrollIntent.subscribe((intent) =>\n this.observeInitialIntent(intent),\n );\n if (\n (this.anchorScrolling || this.positionRestoration === 'enabled') &&\n this.browser &&\n this.document.defaultView &&\n !this.viewportListening\n ) {\n this.viewportListening = true;\n this.document.defaultView.addEventListener('scroll', this.viewportScroll, {\n capture: true,\n passive: true,\n });\n this.document.defaultView.addEventListener('wheel', this.userInput, { passive: true });\n this.document.defaultView.addEventListener('touchmove', this.userInput, { passive: true });\n this.document.defaultView.addEventListener('keydown', this.keyInput);\n }\n }\n\n /** Marks the current asynchronous body and its processors as accepted. */\n contentProcessed(): void {\n this.bodyProcessed = true;\n const pending = this.pending;\n if (!pending || !pending.armed || pending.scheduled) return;\n pending.scheduled = true;\n void this.replayAfterStable(pending);\n }\n\n /** Cancels a missed anchor when the current body fails. */\n contentFailed(): void {\n this.bodyProcessed = false;\n this.clear();\n }\n\n private observeScroll(event: Scroll): void {\n if (event.routerEvent.id < this.latestNavigationId) return;\n this.latestNavigationId = event.routerEvent.id;\n this.clear();\n if (this.suppressedNavigationId === event.routerEvent.id) return;\n const sequence = ++this.sequence;\n if (\n !this.active ||\n !this.browser ||\n event.scrollBehavior === 'manual' ||\n (event.position && this.positionRestoration !== 'enabled')\n ) {\n return;\n }\n\n const observedPosition = this.viewport.getScrollPosition();\n if (event.position) {\n if (samePosition(observedPosition, event.position)) return;\n this.pending = {\n armed: false,\n kind: 'position',\n navigationId: event.routerEvent.id,\n observedPosition,\n position: [event.position[0], event.position[1]],\n sequence,\n url: this.eventUrl(event.routerEvent),\n scheduled: false,\n };\n const pending = this.pending;\n this.acquireOverflowAnchor(pending);\n queueMicrotask(() => {\n if (this.destroyed || this.pending !== pending || pending.sequence !== this.sequence)\n return;\n pending.observedPosition = this.viewport.getScrollPosition();\n pending.armed = true;\n if (samePosition(pending.observedPosition, pending.position)) {\n this.clear();\n } else if (this.bodyProcessed) {\n this.contentProcessed();\n }\n });\n return;\n }\n if (!this.anchorScrolling || !event.anchor || this.target(event.anchor)) return;\n\n this.pending = {\n armed: true,\n kind: 'anchor',\n anchor: event.anchor,\n initial: false,\n navigationId: event.routerEvent.id,\n observedPosition,\n sequence,\n url: this.eventUrl(event.routerEvent),\n scheduled: false,\n };\n if (this.bodyProcessed) this.contentProcessed();\n }\n\n private async replayAfterStable(pending: PendingScroll): Promise<void> {\n try {\n await this.applicationRef.whenStable();\n } catch {\n if (this.pending === pending) this.clear();\n return;\n }\n if (this.destroyed || this.pending !== pending || pending.sequence !== this.sequence) return;\n if (pending.kind === 'anchor' && pending.initial && !(await this.afterScrollOpportunity())) {\n return;\n }\n if (this.destroyed || this.pending !== pending || pending.sequence !== this.sequence) return;\n\n const target = pending.kind === 'anchor' ? this.target(pending.anchor) : undefined;\n const position = this.viewport.getScrollPosition();\n this.pending = undefined;\n if (pending.kind === 'anchor' && pending.initial) {\n this.initialScrollIntent.settle(pending.navigationId);\n }\n try {\n if (\n this.router.url !== pending.url ||\n pending.navigationId !== this.latestNavigationId ||\n this.contentState.currentFailure() ||\n (pending.kind === 'anchor' && !target) ||\n !samePosition(position, pending.observedPosition)\n ) {\n return;\n }\n if (pending.kind === 'anchor') {\n this.viewport.scrollToAnchor(pending.anchor);\n } else this.viewport.scrollToPosition(pending.position);\n } finally {\n this.releaseOverflowAnchor(pending);\n }\n }\n\n private observeInitialIntent(intent: NgDocInitialContentScrollIntent | undefined): void {\n if (this.pending?.kind === 'anchor' && this.pending.initial) this.clear();\n if (\n !intent ||\n !this.active ||\n !this.browser ||\n !this.anchorScrolling ||\n this.suppressedNavigationId === intent.navigationId\n ) {\n return;\n }\n if (this.target(intent.anchor)) {\n this.initialScrollIntent.settle(intent.navigationId);\n return;\n }\n this.pending = {\n armed: true,\n kind: 'anchor',\n anchor: intent.anchor,\n initial: true,\n navigationId: intent.navigationId,\n observedPosition: this.viewport.getScrollPosition(),\n sequence: ++this.sequence,\n url: intent.url,\n scheduled: false,\n };\n this.latestNavigationId = Math.max(this.latestNavigationId, intent.navigationId);\n if (this.bodyProcessed) this.contentProcessed();\n }\n\n private afterScrollOpportunity(): Promise<boolean> {\n const window = this.document.defaultView;\n if (!window) return Promise.resolve(false);\n this.cancelFrameWait();\n return this.zone.runOutsideAngular(\n () =>\n new Promise<boolean>((resolve) => {\n const wait: FrameWait = {\n settle: (value: boolean) => {\n if (this.frameWait !== wait) return;\n this.frameWait = undefined;\n resolve(value);\n },\n };\n this.frameWait = wait;\n wait.first = window.requestAnimationFrame(() => {\n wait.first = undefined;\n wait.second = window.requestAnimationFrame(() => {\n wait.second = undefined;\n wait.settle(true);\n });\n });\n }),\n );\n }\n\n private eventUrl(event: NavigationEnd | NavigationSkipped): string {\n return event instanceof NavigationEnd ? event.urlAfterRedirects : event.url;\n }\n\n private target(anchor: string): Element | undefined {\n const scope = this.pageWrapper();\n if (!scope || scope.ownerDocument !== this.document) return undefined;\n const local =\n scope.id === anchor || scope.getAttribute('name') === anchor\n ? scope\n : Array.from(scope.querySelectorAll('[id], [name]')).find(\n (element) => element.id === anchor || element.getAttribute('name') === anchor,\n );\n const global =\n this.document.getElementById(anchor) ?? this.document.getElementsByName(anchor)[0];\n return local && global === local ? local : undefined;\n }\n\n private clear(): void {\n const pending = this.pending;\n this.cancelFrameWait();\n this.sequence++;\n this.pending = undefined;\n if (pending) this.releaseOverflowAnchor(pending);\n if (pending?.kind === 'anchor' && pending.initial) {\n this.initialScrollIntent.settle(pending.navigationId);\n }\n }\n\n private acquireOverflowAnchor(owner: object): void {\n const element = this.pageWrapper();\n if (!element) return;\n let lease = overflowAnchorLeases.get(element);\n if (!lease) {\n lease = {\n owners: new Set(),\n previousPriority: element.style.getPropertyPriority('overflow-anchor'),\n previousValue: element.style.getPropertyValue('overflow-anchor'),\n };\n overflowAnchorLeases.set(element, lease);\n element.style.setProperty('overflow-anchor', 'none');\n }\n lease.owners.add(owner);\n this.overflowAnchorLease = { element, owner };\n }\n\n private releaseOverflowAnchor(owner: object): void {\n const current = this.overflowAnchorLease;\n if (!current || current.owner !== owner) return;\n this.overflowAnchorLease = undefined;\n const lease = overflowAnchorLeases.get(current.element);\n if (!lease) return;\n lease.owners.delete(owner);\n if (lease.owners.size > 0) return;\n overflowAnchorLeases.delete(current.element);\n if (\n current.element.style.getPropertyValue('overflow-anchor') !== 'none' ||\n current.element.style.getPropertyPriority('overflow-anchor') !== ''\n ) {\n return;\n }\n if (lease.previousValue) {\n current.element.style.setProperty(\n 'overflow-anchor',\n lease.previousValue,\n lease.previousPriority,\n );\n } else {\n current.element.style.removeProperty('overflow-anchor');\n }\n }\n\n private pageWrapper(): HTMLElement | undefined {\n return this.host.closest<HTMLElement>('ng-doc-page-wrapper') ?? undefined;\n }\n\n private cancelFrameWait(): void {\n const wait = this.frameWait;\n if (!wait) return;\n const window = this.document.defaultView;\n if (wait.first !== undefined) window?.cancelAnimationFrame(wait.first);\n if (wait.second !== undefined) window?.cancelAnimationFrame(wait.second);\n wait.settle(false);\n }\n\n private destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.clear();\n if (this.viewportListening) {\n this.document.defaultView?.removeEventListener('scroll', this.viewportScroll, true);\n this.document.defaultView?.removeEventListener('wheel', this.userInput);\n this.document.defaultView?.removeEventListener('touchmove', this.userInput);\n this.document.defaultView?.removeEventListener('keydown', this.keyInput);\n this.viewportListening = false;\n }\n this.unsubscribeIntent?.();\n this.unsubscribeIntent = undefined;\n this.subscription.unsubscribe();\n }\n}\n\nconst SCROLL_KEYS = new Set([\n ' ',\n 'ArrowDown',\n 'ArrowLeft',\n 'ArrowRight',\n 'ArrowUp',\n 'End',\n 'Home',\n 'PageDown',\n 'PageUp',\n]);\n\nfunction samePosition(\n first: readonly [number, number],\n second: readonly [number, number],\n): boolean {\n return first[0] === second[0] && first[1] === second[1];\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}