@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
@@ -1 +1 @@
1
- {"version":3,"file":"ng-doc-app-components-navbar.mjs","sources":["../../../../libs/app/components/navbar/navbar.component.ts","../../../../libs/app/components/navbar/navbar.component.html","../../../../libs/app/components/navbar/ng-doc-app-components-navbar.ts"],"sourcesContent":["import {\n afterNextRender,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n DestroyRef,\n HostBinding,\n inject,\n Input,\n NgZone,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NgDocSearchComponent } from '@ng-doc/app/components/search';\nimport { NgDocSidebarService } from '@ng-doc/app/services';\nimport { NgDocButtonIconComponent, NgDocIconComponent, ngDocZoneOptimize } from '@ng-doc/ui-kit';\nimport { WA_WINDOW } from '@ng-web-apis/common';\nimport { PolymorpheusOutlet } from '@taiga-ui/polymorpheus';\nimport { combineLatest, fromEvent } from 'rxjs';\nimport { distinctUntilChanged, map, startWith } from 'rxjs/operators';\n\n/**\n * Navbar component for ng-doc application\n */\n@Component({\n selector: 'ng-doc-navbar',\n templateUrl: './navbar.component.html',\n styleUrls: ['./navbar.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [PolymorpheusOutlet, NgDocSearchComponent, NgDocButtonIconComponent, NgDocIconComponent],\n})\nexport class NgDocNavbarComponent {\n private readonly window = inject<Window>(WA_WINDOW);\n private readonly ngZone = inject(NgZone);\n private readonly changeDetectorRef = inject(ChangeDetectorRef);\n protected readonly sidebarService = inject(NgDocSidebarService);\n\n /**\n * Show search input\n */\n @Input()\n search: boolean = true;\n\n /**\n * Show hamburger button\n */\n @Input()\n hamburger: boolean = true;\n\n /**\n * Use glass effect for navbar\n */\n @Input()\n @HostBinding('attr.data-glass-effect')\n glassEffect: boolean = true;\n\n /**\n * Indicates if navbar has border\n */\n @HostBinding('class.has-border')\n hasBorder: boolean = false;\n\n constructor() {\n const destroyRef = inject(DestroyRef);\n\n afterNextRender(() => {\n combineLatest([\n fromEvent(this.window, 'scroll').pipe(\n map((e: Event) => ((e.target as Document)?.scrollingElement?.scrollTop ?? 0) > 0),\n distinctUntilChanged(),\n startWith(false),\n ngDocZoneOptimize(this.ngZone),\n ),\n this.sidebarService.isExpanded(),\n ])\n .pipe(\n map(\n ([scrolled, isExpanded]: [boolean, boolean]) =>\n scrolled || (isExpanded && this.sidebarService.isMobile),\n ),\n takeUntilDestroyed(destroyRef),\n )\n .subscribe((hasShadow: boolean) => {\n this.hasBorder = hasShadow;\n this.changeDetectorRef.markForCheck();\n });\n });\n }\n}\n","<div class=\"navbar-container\">\n <div class=\"ng-doc-navbar-left\">\n <ng-content select=\"[ngDocNavbarLeft]\"></ng-content>\n </div>\n <div class=\"ng-doc-navbar-right\">\n @if (search) {\n <ng-doc-search></ng-doc-search>\n }\n <ng-content select=\"[ngDocNavbarRight]\"></ng-content>\n <button class=\"ng-doc-menu\" ng-doc-button-icon size=\"large\" (click)=\"sidebarService.toggle()\">\n <ng-doc-icon icon=\"menu\" [size]=\"24\"></ng-doc-icon>\n </button>\n </div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ng-doc-app-components-navbar.mjs","sources":["../../../../libs/app/components/navbar/navbar.component.ts","../../../../libs/app/components/navbar/navbar.component.html","../../../../libs/app/components/navbar/ng-doc-app-components-navbar.ts"],"sourcesContent":["import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n inject,\n input,\n viewChild,\n} from '@angular/core';\nimport { NgDocSearchComponent } from '@ng-doc/app/components/search';\nimport { NgDocSidebarService } from '@ng-doc/app/services/sidebar';\nimport { NgDocButtonIconComponent } from '@ng-doc/ui-kit';\n\n/**\n * Navbar of the NgDoc application: the header bar above the sidebar and the page.\n *\n * It lays out, from left to right: the menu button (only where the sidebar is an overlay), the\n * content marked with `ngDocNavbarLeft` (for example the logo), the content marked with\n * `ngDocNavbarCenter` (for example the section links, hidden at 1024px and below), the search, and\n * the content marked with `ngDocNavbarRight` (for example the theme toggle).\n * @example\n * ```html\n * <ng-doc-navbar>\n * <a ngDocNavbarLeft routerLink=\"/\">My library</a>\n * <nav ngDocNavbarCenter aria-label=\"Primary\"><a routerLink=\"/docs\">Guides</a></nav>\n * <ng-doc-theme-toggle ngDocNavbarRight />\n * </ng-doc-navbar>\n * ```\n */\n@Component({\n selector: 'ng-doc-navbar',\n templateUrl: './navbar.component.html',\n styleUrls: ['./navbar.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgDocSearchComponent, NgDocButtonIconComponent],\n host: {\n '[attr.data-glass-effect]': 'glassEffect()',\n '(document:keydown.escape)': 'closeSidebar()',\n },\n})\nexport class NgDocNavbarComponent {\n protected readonly sidebarService = inject(NgDocSidebarService);\n\n /**\n * Show search input\n */\n readonly search = input<boolean, unknown>(true, { transform: booleanAttribute });\n\n /**\n * Show the menu button that opens the sidebar where it is an overlay (900px and below).\n */\n readonly hamburger = input<boolean, unknown>(true, { transform: booleanAttribute });\n\n /**\n * Use glass effect for navbar\n */\n readonly glassEffect = input<boolean, unknown>(true, { transform: booleanAttribute });\n\n private readonly menuButton = viewChild('menuButton', { read: ElementRef<HTMLButtonElement> });\n\n /**\n * Closes the sidebar overlay and moves focus back to the menu button that opened it.\n */\n protected closeSidebar(): void {\n if (this.sidebarService.expandedState() && this.sidebarService.isMobile) {\n this.sidebarService.hide();\n this.menuButton()?.nativeElement.focus();\n }\n }\n}\n","<div class=\"ng-doc-navbar-container\">\n @if (hamburger()) {\n <button\n type=\"button\"\n class=\"ng-doc-menu\"\n ng-doc-button-icon\n size=\"large\"\n [rounded]=\"false\"\n aria-controls=\"ng-doc-sidenav\"\n [attr.aria-expanded]=\"sidebarService.expandedState()\"\n [attr.aria-label]=\"sidebarService.expandedState() ? 'Close navigation' : 'Open navigation'\"\n (click)=\"sidebarService.toggle()\"\n #menuButton>\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n aria-hidden=\"true\">\n <path d=\"M4 7h16M4 12h16M4 17h16\" />\n </svg>\n </button>\n }\n <div class=\"ng-doc-navbar-left\">\n <ng-content select=\"[ngDocNavbarLeft]\"></ng-content>\n </div>\n <div class=\"ng-doc-navbar-center\">\n <ng-content select=\"[ngDocNavbarCenter]\"></ng-content>\n </div>\n <div class=\"ng-doc-navbar-right\">\n @if (search()) {\n <ng-doc-search></ng-doc-search>\n }\n <ng-content select=\"[ngDocNavbarRight]\"></ng-content>\n </div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,21 +1,84 @@
1
+ import { isPlatformBrowser } from '@angular/common';
1
2
  import * as i0 from '@angular/core';
2
- import { Input, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { input, inject, ElementRef, PLATFORM_ID, effect, untracked, DestroyRef, ChangeDetectionStrategy, Component } from '@angular/core';
4
+ import { NgDocContentController } from '@ng-doc/app/classes/content-controller';
5
+ import { ɵrestoreNgDocHydrationSnapshot as _restoreNgDocHydrationSnapshot } from '@ng-doc/app/helpers';
3
6
  import { NgDocSanitizeHtmlPipe } from '@ng-doc/app/pipes';
4
7
  import { NgDocPageProcessorComponent } from '@ng-doc/app/processors';
5
8
 
9
+ /**
10
+ * The header of a documentation page: the rendered header HTML, or the header of an
11
+ * asynchronous content source.
12
+ */
6
13
  class NgDocPageHeaderComponent {
7
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NgDocPageHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
8
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.6", type: NgDocPageHeaderComponent, isStandalone: true, selector: "ng-doc-page-header", inputs: { headerContent: "headerContent" }, host: { attributes: { "ngSkipHydration": "true" } }, ngImport: i0, template: "<header\n class=\"ng-doc-page-header ngde\"\n [ngDocPageProcessor]=\"headerContent | ngDocSanitizeHtml\"></header>\n", styles: [""], dependencies: [{ kind: "component", type: NgDocPageProcessorComponent, selector: "[ngDocPageProcessor]", inputs: ["ngDocPageProcessor"], outputs: ["afterRender"] }, { kind: "pipe", type: NgDocSanitizeHtmlPipe, name: "ngDocSanitizeHtml" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
14
+ constructor() {
15
+ /** The rendered header HTML, used when there is no content source. */
16
+ this.headerContent = input.required(/* @ts-ignore */
17
+ ...(ngDevMode ? [{ debugName: "headerContent" }] : /* istanbul ignore next */ []));
18
+ /** The source of the header content, for pages whose content loads asynchronously. */
19
+ this.headerContentSource = input(/* @ts-ignore */
20
+ ...(ngDevMode ? [undefined, { debugName: "headerContentSource" }] : /* istanbul ignore next */ []));
21
+ this.contentController = inject(NgDocContentController);
22
+ this.host = inject(ElementRef).nativeElement;
23
+ this.browser = isPlatformBrowser(inject(PLATFORM_ID));
24
+ // Connects the controller to the current source, before the template renders its content.
25
+ effect(() => {
26
+ const source = this.headerContentSource();
27
+ untracked(() => {
28
+ if (source) {
29
+ // Angular empties this host (it skips hydration) and the header loads asynchronously,
30
+ // so the server-rendered header stays visible until the loaded one renders. The copy
31
+ // is shown once, for the host's first source.
32
+ if (this.browser && !this.snapshot)
33
+ this.snapshot = _restoreNgDocHydrationSnapshot(this.host);
34
+ this.contentController.connect(source);
35
+ }
36
+ else {
37
+ this.releaseSnapshot();
38
+ this.contentController.disconnect();
39
+ }
40
+ });
41
+ });
42
+ // A load that needs no new pass (its header is already rendered) or that failed settles
43
+ // without `revealLoaded`.
44
+ effect(() => {
45
+ if (this.contentController.settled())
46
+ untracked(() => this.releaseSnapshot());
47
+ });
48
+ effect(() => {
49
+ if (this.contentController.error())
50
+ untracked(() => this.releaseSnapshot());
51
+ });
52
+ inject(DestroyRef).onDestroy(() => this.releaseSnapshot());
53
+ }
54
+ /**
55
+ * Shows the loaded header in place of the server-rendered copy when a pass of it is about to
56
+ * render, in the same task. The pass of the empty header before the source has loaded keeps
57
+ * the copy.
58
+ * @param version - The content version of the pass.
59
+ * @internal
60
+ */
61
+ revealLoaded(version) {
62
+ if (version === this.contentController.loadedVersion())
63
+ this.releaseSnapshot();
64
+ }
65
+ releaseSnapshot() {
66
+ const release = this.snapshot;
67
+ this.snapshot = undefined;
68
+ release?.();
69
+ }
70
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocPageHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
71
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.2.1", type: NgDocPageHeaderComponent, isStandalone: true, selector: "ng-doc-page-header", inputs: { headerContent: { classPropertyName: "headerContent", publicName: "headerContent", isSignal: true, isRequired: true, transformFunction: null }, headerContentSource: { classPropertyName: "headerContentSource", publicName: "headerContentSource", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "ngSkipHydration": "true" }, properties: { "attr.data-ng-doc-async-content": "headerContentSource() ? \"\" : null" } }, providers: [NgDocContentController], ngImport: i0, template: "@if (headerContentSource()) {\n @if (contentController.error(); as error) {\n <header class=\"ng-doc-page-header ngde\" role=\"alert\">{{ error.message }}</header>\n } @else {\n <header\n class=\"ng-doc-page-header ngde\"\n [ngDocPageProcessor]=\"contentController.html() | ngDocSanitizeHtml\"\n [contentVersion]=\"contentController.version()\"\n (beforeRender)=\"revealLoaded($event)\"\n (contentProcessed)=\"contentController.processed($event)\"\n (processingError)=\"contentController.processingFailed($event)\"></header>\n }\n} @else {\n <header\n class=\"ng-doc-page-header ngde\"\n [ngDocPageProcessor]=\"headerContent() | ngDocSanitizeHtml\"></header>\n}\n", styles: [":host[data-ng-doc-hydration-snapshot]>:not(.ng-doc-hydration-snapshot){display:none!important}\n"], dependencies: [{ kind: "component", type: NgDocPageProcessorComponent, selector: "[ngDocPageProcessor]", inputs: ["ngDocPageProcessor", "contentVersion"], outputs: ["beforeRender", "afterRender", "contentProcessed", "processingError"] }, { kind: "pipe", type: NgDocSanitizeHtmlPipe, name: "ngDocSanitizeHtml" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9
72
  }
10
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NgDocPageHeaderComponent, decorators: [{
73
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocPageHeaderComponent, decorators: [{
11
74
  type: Component,
12
- args: [{ selector: 'ng-doc-page-header', imports: [NgDocPageProcessorComponent, NgDocSanitizeHtmlPipe], changeDetection: ChangeDetectionStrategy.OnPush, host: {
75
+ args: [{ selector: 'ng-doc-page-header', imports: [NgDocPageProcessorComponent, NgDocSanitizeHtmlPipe], changeDetection: ChangeDetectionStrategy.OnPush, providers: [NgDocContentController], host: {
13
76
  ngSkipHydration: 'true',
14
- }, template: "<header\n class=\"ng-doc-page-header ngde\"\n [ngDocPageProcessor]=\"headerContent | ngDocSanitizeHtml\"></header>\n" }]
15
- }], propDecorators: { headerContent: [{
16
- type: Input,
17
- args: [{ required: true }]
18
- }] } });
77
+ // Tells the browser that the server-rendered header must be kept until the loaded one
78
+ // renders (ɵNG_DOC_ASYNC_CONTENT_ATTRIBUTE).
79
+ '[attr.data-ng-doc-async-content]': 'headerContentSource() ? "" : null',
80
+ }, template: "@if (headerContentSource()) {\n @if (contentController.error(); as error) {\n <header class=\"ng-doc-page-header ngde\" role=\"alert\">{{ error.message }}</header>\n } @else {\n <header\n class=\"ng-doc-page-header ngde\"\n [ngDocPageProcessor]=\"contentController.html() | ngDocSanitizeHtml\"\n [contentVersion]=\"contentController.version()\"\n (beforeRender)=\"revealLoaded($event)\"\n (contentProcessed)=\"contentController.processed($event)\"\n (processingError)=\"contentController.processingFailed($event)\"></header>\n }\n} @else {\n <header\n class=\"ng-doc-page-header ngde\"\n [ngDocPageProcessor]=\"headerContent() | ngDocSanitizeHtml\"></header>\n}\n", styles: [":host[data-ng-doc-hydration-snapshot]>:not(.ng-doc-hydration-snapshot){display:none!important}\n"] }]
81
+ }], ctorParameters: () => [], propDecorators: { headerContent: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerContent", required: true }] }], headerContentSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerContentSource", required: false }] }] } });
19
82
 
20
83
  /**
21
84
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"ng-doc-app-components-page-header.mjs","sources":["../../../../libs/app/components/page-header/page-header.component.ts","../../../../libs/app/components/page-header/page-header.component.html","../../../../libs/app/components/page-header/ng-doc-app-components-page-header.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { NgDocSanitizeHtmlPipe } from '@ng-doc/app/pipes';\nimport { NgDocPageProcessorComponent } from '@ng-doc/app/processors';\n\n@Component({\n selector: 'ng-doc-page-header',\n imports: [NgDocPageProcessorComponent, NgDocSanitizeHtmlPipe],\n templateUrl: './page-header.component.html',\n styleUrl: './page-header.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n ngSkipHydration: 'true',\n },\n})\nexport class NgDocPageHeaderComponent {\n @Input({ required: true })\n headerContent!: string;\n}\n","<header\n class=\"ng-doc-page-header ngde\"\n [ngDocPageProcessor]=\"headerContent | ngDocSanitizeHtml\"></header>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;MAca,wBAAwB,CAAA;8GAAxB,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECdrC,wHAGA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDGY,2BAA2B,sHAAE,qBAAqB,EAAA,IAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAQjD,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAVpC,SAAS;+BACE,oBAAoB,EAAA,OAAA,EACrB,CAAC,2BAA2B,EAAE,qBAAqB,CAAC,EAAA,eAAA,EAG5C,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,eAAe,EAAE,MAAM;AACxB,qBAAA,EAAA,QAAA,EAAA,wHAAA,EAAA;;sBAGA,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;;AEf3B;;AAEG;;;;"}
1
+ {"version":3,"file":"ng-doc-app-components-page-header.mjs","sources":["../../../../libs/app/components/page-header/page-header.component.ts","../../../../libs/app/components/page-header/page-header.component.html","../../../../libs/app/components/page-header/ng-doc-app-components-page-header.ts"],"sourcesContent":["import { isPlatformBrowser } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n input,\n PLATFORM_ID,\n untracked,\n} from '@angular/core';\nimport { NgDocContentController } from '@ng-doc/app/classes/content-controller';\nimport { ɵrestoreNgDocHydrationSnapshot } from '@ng-doc/app/helpers';\nimport { NgDocSanitizeHtmlPipe } from '@ng-doc/app/pipes';\nimport { NgDocPageProcessorComponent } from '@ng-doc/app/processors';\nimport type { NgDocContentSource } from '@ng-doc/core/interfaces';\n\n/**\n * The header of a documentation page: the rendered header HTML, or the header of an\n * asynchronous content source.\n */\n@Component({\n selector: 'ng-doc-page-header',\n imports: [NgDocPageProcessorComponent, NgDocSanitizeHtmlPipe],\n templateUrl: './page-header.component.html',\n styleUrl: './page-header.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [NgDocContentController],\n host: {\n ngSkipHydration: 'true',\n // Tells the browser that the server-rendered header must be kept until the loaded one\n // renders (ɵNG_DOC_ASYNC_CONTENT_ATTRIBUTE).\n '[attr.data-ng-doc-async-content]': 'headerContentSource() ? \"\" : null',\n },\n})\nexport class NgDocPageHeaderComponent {\n /** The rendered header HTML, used when there is no content source. */\n readonly headerContent = input.required<string>();\n\n /** The source of the header content, for pages whose content loads asynchronously. */\n readonly headerContentSource = input<NgDocContentSource>();\n\n protected readonly contentController = inject(NgDocContentController);\n\n private readonly host: HTMLElement = inject(ElementRef).nativeElement;\n private readonly browser = isPlatformBrowser(inject(PLATFORM_ID));\n /** Removes the server-rendered copy shown while asynchronous content loads. */\n private snapshot?: () => void;\n\n constructor() {\n // Connects the controller to the current source, before the template renders its content.\n effect(() => {\n const source = this.headerContentSource();\n\n untracked(() => {\n if (source) {\n // Angular empties this host (it skips hydration) and the header loads asynchronously,\n // so the server-rendered header stays visible until the loaded one renders. The copy\n // is shown once, for the host's first source.\n if (this.browser && !this.snapshot)\n this.snapshot = ɵrestoreNgDocHydrationSnapshot(this.host);\n this.contentController.connect(source);\n } else {\n this.releaseSnapshot();\n this.contentController.disconnect();\n }\n });\n });\n // A load that needs no new pass (its header is already rendered) or that failed settles\n // without `revealLoaded`.\n effect(() => {\n if (this.contentController.settled()) untracked(() => this.releaseSnapshot());\n });\n effect(() => {\n if (this.contentController.error()) untracked(() => this.releaseSnapshot());\n });\n inject(DestroyRef).onDestroy(() => this.releaseSnapshot());\n }\n\n /**\n * Shows the loaded header in place of the server-rendered copy when a pass of it is about to\n * render, in the same task. The pass of the empty header before the source has loaded keeps\n * the copy.\n * @param version - The content version of the pass.\n * @internal\n */\n protected revealLoaded(version: number): void {\n if (version === this.contentController.loadedVersion()) this.releaseSnapshot();\n }\n\n private releaseSnapshot(): void {\n const release = this.snapshot;\n\n this.snapshot = undefined;\n release?.();\n }\n}\n","@if (headerContentSource()) {\n @if (contentController.error(); as error) {\n <header class=\"ng-doc-page-header ngde\" role=\"alert\">{{ error.message }}</header>\n } @else {\n <header\n class=\"ng-doc-page-header ngde\"\n [ngDocPageProcessor]=\"contentController.html() | ngDocSanitizeHtml\"\n [contentVersion]=\"contentController.version()\"\n (beforeRender)=\"revealLoaded($event)\"\n (contentProcessed)=\"contentController.processed($event)\"\n (processingError)=\"contentController.processingFailed($event)\"></header>\n }\n} @else {\n <header\n class=\"ng-doc-page-header ngde\"\n [ngDocPageProcessor]=\"headerContent() | ngDocSanitizeHtml\"></header>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["ɵrestoreNgDocHydrationSnapshot"],"mappings":"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"}
@@ -1,49 +1,141 @@
1
- import { NgTemplateOutlet } from '@angular/common';
1
+ import { LocationStrategy, NgTemplateOutlet } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
- import { inject, ElementRef, Input, ChangeDetectionStrategy, Component } from '@angular/core';
4
- import { RouterLink } from '@angular/router';
5
- import { NgDocDecodeUriComponentPipe } from '@ng-doc/app/pipes';
3
+ import { input, signal, inject, ElementRef, computed, ChangeDetectionStrategy, Component } from '@angular/core';
4
+ import { Router, RouterLink } from '@angular/router';
5
+ import { ɵngDocRouteUrl as _ngDocRouteUrl } from '@ng-doc/app/helpers';
6
6
  import { NgDocIconComponent } from '@ng-doc/ui-kit';
7
7
  import { WA_LOCATION } from '@ng-web-apis/common';
8
8
 
9
+ /**
10
+ * A link in the page content. Links inside the application navigate with the router; other links
11
+ * open in a new tab and, outside code, show an external-link icon.
12
+ */
9
13
  class NgDocPageLinkComponent {
10
14
  constructor() {
11
- this.href = '';
12
- this.classes = '';
13
- this.isInCode = false;
15
+ /**
16
+ * The link target, as written in the content. It is optional so that a render before the
17
+ * page processor sets it (auto-detected change detection) does not fail.
18
+ */
19
+ this.href = input('', /* @ts-ignore */
20
+ ...(ngDevMode ? [{ debugName: "href" }] : /* istanbul ignore next */ []));
21
+ /** Classes of the link element. */
22
+ this.classes = input('', /* @ts-ignore */
23
+ ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
24
+ /** Whether the link sits inside a code element. */
25
+ this.isInCode = signal(false, /* @ts-ignore */
26
+ ...(ngDevMode ? [{ debugName: "isInCode" }] : /* istanbul ignore next */ []));
14
27
  this.location = inject(WA_LOCATION);
28
+ this.locationStrategy = inject(LocationStrategy);
29
+ this.router = inject(Router);
15
30
  this.elementRef = inject(ElementRef);
31
+ this.resolved = computed(() => {
32
+ const href = this.href();
33
+ const resolvesFromCurrentPage = href.startsWith('#') || href.startsWith('?');
34
+ const absoluteUrl = isAbsoluteUrl(href);
35
+ // `#section` and `?query` resolve against the route, which with hash location is not the
36
+ // document's path.
37
+ const link = new URL(href, resolvesFromCurrentPage
38
+ ? _ngDocRouteUrl(this.locationStrategy, this.location.href)
39
+ : this.location.origin);
40
+ const routerBasePath = normalizeRouterBasePath(this.locationStrategy.getBaseHref(), this.location.origin);
41
+ const usesRouterLink = link.origin === this.location.origin &&
42
+ (!absoluteUrl || isPathWithinBase(link.pathname, routerBasePath));
43
+ return {
44
+ link,
45
+ usesRouterLink,
46
+ stripsRouterBase: usesRouterLink && (resolvesFromCurrentPage || absoluteUrl),
47
+ routerBasePath,
48
+ };
49
+ }, /* @ts-ignore */
50
+ ...(ngDevMode ? [{ debugName: "resolved" }] : /* istanbul ignore next */ []));
51
+ /** Whether the link navigates with the router. */
52
+ this.usesRouterLink = computed(() => this.resolved().usesRouterLink, /* @ts-ignore */
53
+ ...(ngDevMode ? [{ debugName: "usesRouterLink" }] : /* istanbul ignore next */ []));
54
+ /** The router target of an application link. */
55
+ this.routerLink = computed(() => {
56
+ const { link, usesRouterLink } = this.resolved();
57
+ return usesRouterLink
58
+ ? this.router.parseUrl(escapeInvalidPercents(`${this.path()}${link.search}${link.hash}`))
59
+ : undefined;
60
+ }, /* @ts-ignore */
61
+ ...(ngDevMode ? [{ debugName: "routerLink" }] : /* istanbul ignore next */ []));
62
+ /** Whether the link leaves the application's origin. */
63
+ this.isExternalLink = computed(() => this.resolved().link.origin !== this.location.origin, /* @ts-ignore */
64
+ ...(ngDevMode ? [{ debugName: "isExternalLink" }] : /* istanbul ignore next */ []));
65
+ /** The path of an application link, or the `href` of any other link. */
66
+ this.path = computed(() => {
67
+ const { link, usesRouterLink, stripsRouterBase, routerBasePath } = this.resolved();
68
+ if (!usesRouterLink) {
69
+ return this.href();
70
+ }
71
+ return stripsRouterBase ? stripRouterBase(link.pathname, routerBasePath) : link.pathname;
72
+ }, /* @ts-ignore */
73
+ ...(ngDevMode ? [{ debugName: "path" }] : /* istanbul ignore next */ []));
74
+ /** The fragment of the link, without `#`. */
75
+ this.fragment = computed(() => this.resolved().link.hash.replace(/^#/, '') || undefined, /* @ts-ignore */
76
+ ...(ngDevMode ? [{ debugName: "fragment" }] : /* istanbul ignore next */ []));
77
+ /** The query parameters of the link. */
78
+ this.queryParams = computed(() => Object.fromEntries(this.resolved().link.searchParams.entries()), /* @ts-ignore */
79
+ ...(ngDevMode ? [{ debugName: "queryParams" }] : /* istanbul ignore next */ []));
16
80
  }
17
81
  ngOnInit() {
18
- this.isInCode = this.elementRef.nativeElement.closest('code') !== null;
19
- }
20
- ngOnChanges() {
21
- this.link = new URL(this.href, this.location.origin);
82
+ this.isInCode.set(this.elementRef.nativeElement.closest('code') !== null);
22
83
  }
23
- get isExternalLink() {
24
- return this.link?.origin !== this.location.origin;
25
- }
26
- get path() {
27
- return (!this.isExternalLink ? this.link?.pathname : this.href) ?? '';
84
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocPageLinkComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
85
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.2.1", type: NgDocPageLinkComponent, isStandalone: true, selector: "ng-doc-page-link", inputs: { href: { classPropertyName: "href", publicName: "href", isSignal: true, isRequired: false, transformFunction: null }, classes: { classPropertyName: "classes", publicName: "classes", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (usesRouterLink()) {\n <a [class]=\"classes()\" [routerLink]=\"routerLink()\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </a>\n} @else {\n <a [class]=\"classes()\" [href]=\"path()\" [attr.target]=\"isExternalLink() ? '_blank' : null\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n @if (isExternalLink() && !isInCode()) {\n <ng-doc-icon icon=\"external-link\"></ng-doc-icon>\n }\n </a>\n}\n\n<ng-template #content>\n <ng-content></ng-content>\n</ng-template>\n", styles: [":host ng-doc-icon{margin-left:calc(var(--ng-doc-base-gutter) / 2);--ng-doc-icon-color: currentColor}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NgDocIconComponent, selector: "ng-doc-icon", inputs: ["icon", "customIcon", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
86
+ }
87
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocPageLinkComponent, decorators: [{
88
+ type: Component,
89
+ args: [{ selector: 'ng-doc-page-link', changeDetection: ChangeDetectionStrategy.OnPush, imports: [RouterLink, NgTemplateOutlet, NgDocIconComponent], template: "@if (usesRouterLink()) {\n <a [class]=\"classes()\" [routerLink]=\"routerLink()\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </a>\n} @else {\n <a [class]=\"classes()\" [href]=\"path()\" [attr.target]=\"isExternalLink() ? '_blank' : null\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n @if (isExternalLink() && !isInCode()) {\n <ng-doc-icon icon=\"external-link\"></ng-doc-icon>\n }\n </a>\n}\n\n<ng-template #content>\n <ng-content></ng-content>\n</ng-template>\n", styles: [":host ng-doc-icon{margin-left:calc(var(--ng-doc-base-gutter) / 2);--ng-doc-icon-color: currentColor}\n"] }]
90
+ }], propDecorators: { href: [{ type: i0.Input, args: [{ isSignal: true, alias: "href", required: false }] }], classes: [{ type: i0.Input, args: [{ isSignal: true, alias: "classes", required: false }] }] } });
91
+ /**
92
+ *
93
+ * @param href
94
+ */
95
+ function isAbsoluteUrl(href) {
96
+ return /^[a-z][a-z\d+.-]*:/i.test(href) || href.startsWith('//');
97
+ }
98
+ /**
99
+ *
100
+ * @param baseHref
101
+ * @param origin
102
+ */
103
+ function normalizeRouterBasePath(baseHref, origin) {
104
+ const pathname = new URL(baseHref || '/', origin).pathname;
105
+ if (pathname === '/') {
106
+ return pathname;
28
107
  }
29
- get fragment() {
30
- return this.link?.hash.replace(/^#/, '') || undefined;
108
+ return `/${pathname.replace(/^\/+|\/+$/g, '')}/`;
109
+ }
110
+ /**
111
+ *
112
+ * @param pathname
113
+ * @param basePath
114
+ */
115
+ function isPathWithinBase(pathname, basePath) {
116
+ return basePath === '/' || pathname === basePath.slice(0, -1) || pathname.startsWith(basePath);
117
+ }
118
+ /**
119
+ *
120
+ * @param pathname
121
+ * @param basePath
122
+ */
123
+ function stripRouterBase(pathname, basePath) {
124
+ if (basePath === '/' || !isPathWithinBase(pathname, basePath)) {
125
+ return pathname;
31
126
  }
32
- get queryParams() {
33
- return Object.fromEntries(this.link?.searchParams.entries() ?? []);
127
+ if (pathname === basePath.slice(0, -1)) {
128
+ return '/';
34
129
  }
35
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NgDocPageLinkComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
36
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: NgDocPageLinkComponent, isStandalone: true, selector: "ng-doc-page-link", inputs: { href: "href", classes: "classes" }, usesOnChanges: true, ngImport: i0, template: "@if (!isExternalLink) {\n <a\n [class]=\"classes\"\n [routerLink]=\"path\"\n [fragment]=\"fragment ? (fragment | decodeUriComponent) : undefined\"\n [queryParams]=\"queryParams\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </a>\n}\n\n@if (isExternalLink) {\n <a [class]=\"classes\" [href]=\"path\" target=\"_blank\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n @if (!isInCode) {\n <ng-doc-icon icon=\"external-link\"></ng-doc-icon>\n }\n </a>\n}\n\n<ng-template #content>\n <ng-content></ng-content>\n</ng-template>\n", styles: [":host{white-space:nowrap}:host ng-doc-icon{margin-left:calc(var(--ng-doc-base-gutter) / 2);--ng-doc-icon-color: currentColor}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NgDocIconComponent, selector: "ng-doc-icon", inputs: ["icon", "customIcon", "size"] }, { kind: "pipe", type: NgDocDecodeUriComponentPipe, name: "decodeUriComponent" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
130
+ return `/${pathname.slice(basePath.length)}`;
131
+ }
132
+ /**
133
+ *
134
+ * @param url
135
+ */
136
+ function escapeInvalidPercents(url) {
137
+ return url.replace(/%(?![\da-f]{2})/gi, '%25');
37
138
  }
38
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NgDocPageLinkComponent, decorators: [{
39
- type: Component,
40
- args: [{ selector: 'ng-doc-page-link', changeDetection: ChangeDetectionStrategy.OnPush, imports: [RouterLink, NgTemplateOutlet, NgDocIconComponent, NgDocDecodeUriComponentPipe], template: "@if (!isExternalLink) {\n <a\n [class]=\"classes\"\n [routerLink]=\"path\"\n [fragment]=\"fragment ? (fragment | decodeUriComponent) : undefined\"\n [queryParams]=\"queryParams\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </a>\n}\n\n@if (isExternalLink) {\n <a [class]=\"classes\" [href]=\"path\" target=\"_blank\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n @if (!isInCode) {\n <ng-doc-icon icon=\"external-link\"></ng-doc-icon>\n }\n </a>\n}\n\n<ng-template #content>\n <ng-content></ng-content>\n</ng-template>\n", styles: [":host{white-space:nowrap}:host ng-doc-icon{margin-left:calc(var(--ng-doc-base-gutter) / 2);--ng-doc-icon-color: currentColor}\n"] }]
41
- }], propDecorators: { href: [{
42
- type: Input,
43
- args: [{ required: true }]
44
- }], classes: [{
45
- type: Input
46
- }] } });
47
139
 
48
140
  /**
49
141
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"ng-doc-app-components-page-link.mjs","sources":["../../../../libs/app/components/page-link/page-link.component.ts","../../../../libs/app/components/page-link/page-link.component.html","../../../../libs/app/components/page-link/ng-doc-app-components-page-link.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n inject,\n Input,\n OnChanges,\n OnInit,\n} from '@angular/core';\nimport { Params, RouterLink } from '@angular/router';\nimport { NgDocDecodeUriComponentPipe } from '@ng-doc/app/pipes';\nimport { NgDocIconComponent } from '@ng-doc/ui-kit';\nimport { WA_LOCATION } from '@ng-web-apis/common';\n\n@Component({\n selector: 'ng-doc-page-link',\n templateUrl: './page-link.component.html',\n styleUrls: ['./page-link.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [RouterLink, NgTemplateOutlet, NgDocIconComponent, NgDocDecodeUriComponentPipe],\n})\nexport class NgDocPageLinkComponent implements OnInit, OnChanges {\n @Input({ required: true })\n href: string = '';\n\n @Input()\n classes: string = '';\n\n protected isInCode: boolean = false;\n\n private link: URL | undefined;\n\n private readonly location = inject(WA_LOCATION);\n private readonly elementRef: ElementRef<HTMLElement> = inject(ElementRef);\n\n ngOnInit(): void {\n this.isInCode = this.elementRef.nativeElement.closest('code') !== null;\n }\n\n ngOnChanges(): void {\n this.link = new URL(this.href, this.location.origin);\n }\n\n get isExternalLink(): boolean {\n return this.link?.origin !== this.location.origin;\n }\n\n get path(): string {\n return (!this.isExternalLink ? this.link?.pathname : this.href) ?? '';\n }\n\n get fragment(): string | undefined {\n return this.link?.hash.replace(/^#/, '') || undefined;\n }\n\n get queryParams(): Params {\n return Object.fromEntries(this.link?.searchParams.entries() ?? []);\n }\n}\n","@if (!isExternalLink) {\n <a\n [class]=\"classes\"\n [routerLink]=\"path\"\n [fragment]=\"fragment ? (fragment | decodeUriComponent) : undefined\"\n [queryParams]=\"queryParams\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </a>\n}\n\n@if (isExternalLink) {\n <a [class]=\"classes\" [href]=\"path\" target=\"_blank\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n @if (!isInCode) {\n <ng-doc-icon icon=\"external-link\"></ng-doc-icon>\n }\n </a>\n}\n\n<ng-template #content>\n <ng-content></ng-content>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;MAsBa,sBAAsB,CAAA;AAPnC,IAAA,WAAA,GAAA;QASE,IAAA,CAAA,IAAI,GAAW,EAAE;QAGjB,IAAA,CAAA,OAAO,GAAW,EAAE;QAEV,IAAA,CAAA,QAAQ,GAAY,KAAK;AAIlB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC;AAC9B,QAAA,IAAA,CAAA,UAAU,GAA4B,MAAM,CAAC,UAAU,CAAC;AAyB1E,IAAA;IAvBC,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI;IACxE;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IACtD;AAEA,IAAA,IAAI,cAAc,GAAA;QAChB,OAAO,IAAI,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,QAAQ,CAAC,MAAM;IACnD;AAEA,IAAA,IAAI,IAAI,GAAA;QACN,OAAO,CAAC,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC,IAAI,KAAK,EAAE;IACvE;AAEA,IAAA,IAAI,QAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,SAAS;IACvD;AAEA,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;IACpE;8GApCW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtBnC,klBAsBA,EAAA,MAAA,EAAA,CAAA,iIAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDFY,UAAU,oOAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,kBAAkB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,YAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,2BAA2B,EAAA,IAAA,EAAA,oBAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAE5E,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAPlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,EAAA,eAAA,EAGX,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,UAAU,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,2BAA2B,CAAC,EAAA,QAAA,EAAA,klBAAA,EAAA,MAAA,EAAA,CAAA,iIAAA,CAAA,EAAA;;sBAGvF,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;sBAGxB;;;AE1BH;;AAEG;;;;"}
1
+ {"version":3,"file":"ng-doc-app-components-page-link.mjs","sources":["../../../../libs/app/components/page-link/page-link.component.ts","../../../../libs/app/components/page-link/page-link.component.html","../../../../libs/app/components/page-link/ng-doc-app-components-page-link.ts"],"sourcesContent":["import { LocationStrategy, NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n OnInit,\n signal,\n} from '@angular/core';\nimport { Params, Router, RouterLink, UrlTree } from '@angular/router';\nimport { ɵngDocRouteUrl } from '@ng-doc/app/helpers';\nimport { NgDocIconComponent } from '@ng-doc/ui-kit';\nimport { WA_LOCATION } from '@ng-web-apis/common';\n\n/** How a page link resolves its `href`. */\ninterface NgDocResolvedPageLink {\n link: URL;\n usesRouterLink: boolean;\n stripsRouterBase: boolean;\n routerBasePath: string;\n}\n\n/**\n * A link in the page content. Links inside the application navigate with the router; other links\n * open in a new tab and, outside code, show an external-link icon.\n */\n@Component({\n selector: 'ng-doc-page-link',\n templateUrl: './page-link.component.html',\n styleUrls: ['./page-link.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [RouterLink, NgTemplateOutlet, NgDocIconComponent],\n})\nexport class NgDocPageLinkComponent implements OnInit {\n /**\n * The link target, as written in the content. It is optional so that a render before the\n * page processor sets it (auto-detected change detection) does not fail.\n */\n readonly href = input<string>('');\n\n /** Classes of the link element. */\n readonly classes = input<string>('');\n\n /** Whether the link sits inside a code element. */\n protected readonly isInCode = signal(false);\n\n private readonly location = inject(WA_LOCATION);\n private readonly locationStrategy = inject(LocationStrategy);\n private readonly router = inject(Router);\n private readonly elementRef: ElementRef<HTMLElement> = inject(ElementRef);\n\n private readonly resolved = computed<NgDocResolvedPageLink>(() => {\n const href: string = this.href();\n const resolvesFromCurrentPage = href.startsWith('#') || href.startsWith('?');\n const absoluteUrl = isAbsoluteUrl(href);\n // `#section` and `?query` resolve against the route, which with hash location is not the\n // document's path.\n const link = new URL(\n href,\n resolvesFromCurrentPage\n ? ɵngDocRouteUrl(this.locationStrategy, this.location.href)\n : this.location.origin,\n );\n const routerBasePath = normalizeRouterBasePath(\n this.locationStrategy.getBaseHref(),\n this.location.origin,\n );\n const usesRouterLink =\n link.origin === this.location.origin &&\n (!absoluteUrl || isPathWithinBase(link.pathname, routerBasePath));\n\n return {\n link,\n usesRouterLink,\n stripsRouterBase: usesRouterLink && (resolvesFromCurrentPage || absoluteUrl),\n routerBasePath,\n };\n });\n\n /** Whether the link navigates with the router. */\n protected readonly usesRouterLink = computed(() => this.resolved().usesRouterLink);\n\n /** The router target of an application link. */\n protected readonly routerLink = computed<UrlTree | undefined>(() => {\n const { link, usesRouterLink } = this.resolved();\n\n return usesRouterLink\n ? this.router.parseUrl(escapeInvalidPercents(`${this.path()}${link.search}${link.hash}`))\n : undefined;\n });\n\n /** Whether the link leaves the application's origin. */\n readonly isExternalLink = computed(() => this.resolved().link.origin !== this.location.origin);\n\n /** The path of an application link, or the `href` of any other link. */\n readonly path = computed(() => {\n const { link, usesRouterLink, stripsRouterBase, routerBasePath } = this.resolved();\n\n if (!usesRouterLink) {\n return this.href();\n }\n\n return stripsRouterBase ? stripRouterBase(link.pathname, routerBasePath) : link.pathname;\n });\n\n /** The fragment of the link, without `#`. */\n readonly fragment = computed(() => this.resolved().link.hash.replace(/^#/, '') || undefined);\n\n /** The query parameters of the link. */\n readonly queryParams = computed<Params>(() =>\n Object.fromEntries(this.resolved().link.searchParams.entries()),\n );\n\n ngOnInit(): void {\n this.isInCode.set(this.elementRef.nativeElement.closest('code') !== null);\n }\n}\n\n/**\n *\n * @param href\n */\nfunction isAbsoluteUrl(href: string): boolean {\n return /^[a-z][a-z\\d+.-]*:/i.test(href) || href.startsWith('//');\n}\n\n/**\n *\n * @param baseHref\n * @param origin\n */\nfunction normalizeRouterBasePath(baseHref: string, origin: string): string {\n const pathname = new URL(baseHref || '/', origin).pathname;\n\n if (pathname === '/') {\n return pathname;\n }\n\n return `/${pathname.replace(/^\\/+|\\/+$/g, '')}/`;\n}\n\n/**\n *\n * @param pathname\n * @param basePath\n */\nfunction isPathWithinBase(pathname: string, basePath: string): boolean {\n return basePath === '/' || pathname === basePath.slice(0, -1) || pathname.startsWith(basePath);\n}\n\n/**\n *\n * @param pathname\n * @param basePath\n */\nfunction stripRouterBase(pathname: string, basePath: string): string {\n if (basePath === '/' || !isPathWithinBase(pathname, basePath)) {\n return pathname;\n }\n\n if (pathname === basePath.slice(0, -1)) {\n return '/';\n }\n\n return `/${pathname.slice(basePath.length)}`;\n}\n\n/**\n *\n * @param url\n */\nfunction escapeInvalidPercents(url: string): string {\n return url.replace(/%(?![\\da-f]{2})/gi, '%25');\n}\n","@if (usesRouterLink()) {\n <a [class]=\"classes()\" [routerLink]=\"routerLink()\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </a>\n} @else {\n <a [class]=\"classes()\" [href]=\"path()\" [attr.target]=\"isExternalLink() ? '_blank' : null\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n @if (isExternalLink() && !isInCode()) {\n <ng-doc-icon icon=\"external-link\"></ng-doc-icon>\n }\n </a>\n}\n\n<ng-template #content>\n <ng-content></ng-content>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["ɵngDocRouteUrl"],"mappings":"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"}
@@ -1,28 +1,26 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Input, ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import { input, ChangeDetectionStrategy, Component } from '@angular/core';
3
3
  import { RouterLink } from '@angular/router';
4
- import { NgDocIconComponent, NgDocTextComponent, NgDocTextLeftDirective, NgDocTextRightDirective } from '@ng-doc/ui-kit';
5
4
 
5
+ /**
6
+ * Links to the previous and the next page, as two cards at the bottom of a guide.
7
+ */
6
8
  class NgDocPageNavigationComponent {
7
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NgDocPageNavigationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
8
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: NgDocPageNavigationComponent, isStandalone: true, selector: "ng-doc-page-navigation", inputs: { prevPage: "prevPage", nextPage: "nextPage" }, ngImport: i0, template: "<div class=\"ng-doc-navigation-controls\">\n @if (prevPage) {\n <a class=\"ng-doc-prev-page\" [routerLink]=\"prevPage.route\">\n <div class=\"ng-doc-navigation-page-label\" ng-doc-text size=\"small\">\n <ng-doc-icon icon=\"arrow-left\" ngDocTextLeft></ng-doc-icon>\n Previous\n </div>\n <div class=\"ng-doc-navigation-page-title\" ng-doc-text>{{ prevPage.title }}</div>\n </a>\n }\n @if (nextPage) {\n <a class=\"ng-doc-next-page\" [routerLink]=\"nextPage.route\">\n <div class=\"ng-doc-navigation-page-label\" ng-doc-text size=\"small\">\n Next\n <ng-doc-icon icon=\"arrow-right\" ngDocTextRight></ng-doc-icon>\n </div>\n <div class=\"ng-doc-navigation-page-title\" ng-doc-text>{{ nextPage.title }}</div>\n </a>\n }\n</div>\n", styles: [":host .ng-doc-navigation-controls{display:flex;margin-top:calc(var(--ng-doc-base-gutter) * 12);border-top:1px solid var(--ng-doc-base-2);padding-top:calc(var(--ng-doc-base-gutter) * 2)}:host .ng-doc-navigation-controls a{display:flex;flex-direction:column;text-decoration:unset;transition:var(--ng-doc-transition);--ng-doc-button-hover-background: var(--ng-doc-base-1);--ng-doc-button-active-background: var(--ng-doc-base-2);--ng-doc-text: var(--ng-doc-base-9);--ng-doc-icon-color: var(--ng-doc-text)}:host .ng-doc-navigation-controls a:hover{opacity:.6}:host .ng-doc-navigation-controls a.ng-doc-next-page{margin-left:auto}:host .ng-doc-navigation-controls a.ng-doc-prev-page{align-items:flex-start}:host .ng-doc-navigation-controls a.ng-doc-next-page{align-items:flex-end}:host .ng-doc-navigation-controls a .ng-doc-navigation-page-title{--ng-doc-text: var(--ng-doc-link-color)}\n"], dependencies: [{ kind: "component", type: NgDocIconComponent, selector: "ng-doc-icon", inputs: ["icon", "customIcon", "size"] }, { kind: "component", type: NgDocTextComponent, selector: "[ng-doc-text]", inputs: ["size", "color", "align", "absoluteContent"] }, { kind: "directive", type: NgDocTextLeftDirective, selector: "[ngDocTextLeft]" }, { kind: "directive", type: NgDocTextRightDirective, selector: "[ngDocTextRight]" }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9
+ constructor() {
10
+ /** The page before this one in the sidebar. */
11
+ this.prevPage = input(/* @ts-ignore */
12
+ ...(ngDevMode ? [undefined, { debugName: "prevPage" }] : /* istanbul ignore next */ []));
13
+ /** The page after this one in the sidebar. */
14
+ this.nextPage = input(/* @ts-ignore */
15
+ ...(ngDevMode ? [undefined, { debugName: "nextPage" }] : /* istanbul ignore next */ []));
16
+ }
17
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocPageNavigationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
18
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.2.1", type: NgDocPageNavigationComponent, isStandalone: true, selector: "ng-doc-page-navigation", inputs: { prevPage: { classPropertyName: "prevPage", publicName: "prevPage", isSignal: true, isRequired: false, transformFunction: null }, nextPage: { classPropertyName: "nextPage", publicName: "nextPage", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (prevPage() || nextPage()) {\n <nav class=\"ng-doc-navigation-controls\" aria-label=\"Previous and next page\">\n @if (prevPage(); as page) {\n <a class=\"ng-doc-prev-page\" [routerLink]=\"page.route\">\n <span class=\"ng-doc-navigation-page-label\">\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M19 12H5m6-6-6 6 6 6\" />\n </svg>\n Previous\n </span>\n <span class=\"ng-doc-navigation-page-title\">{{ page.title }}</span>\n </a>\n }\n @if (nextPage(); as page) {\n <a class=\"ng-doc-next-page\" [routerLink]=\"page.route\">\n <span class=\"ng-doc-navigation-page-label\">\n Next\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M5 12h14m-6-6 6 6-6 6\" />\n </svg>\n </span>\n <span class=\"ng-doc-navigation-page-title\">{{ page.title }}</span>\n </a>\n }\n </nav>\n}\n", styles: [".ng-doc-navigation-controls{display:grid;grid-template-columns:1fr 1fr;gap:var(--ng-doc-space-4);margin-top:var(--ng-doc-space-16);font-family:var(--ng-doc-font-family)}.ng-doc-navigation-controls a{display:grid;gap:2px;padding:var(--ng-doc-space-4) var(--ng-doc-space-5);border:1px solid var(--ng-doc-border-color);border-radius:var(--ng-doc-radius-lg);text-decoration:none;transition:border-color var(--ng-doc-transition)}.ng-doc-navigation-controls a:hover{border-color:var(--ng-doc-primary)}.ng-doc-navigation-controls a:focus-visible{outline:none;box-shadow:var(--ng-doc-focus-ring)}.ng-doc-navigation-controls .ng-doc-next-page{grid-column:2;text-align:right}.ng-doc-navigation-controls .ng-doc-next-page .ng-doc-navigation-page-label{justify-content:flex-end}.ng-doc-navigation-page-label{display:flex;align-items:center;gap:6px;color:var(--ng-doc-text-muted);font-size:13px;line-height:18px}.ng-doc-navigation-page-title{color:var(--ng-doc-link-color);font-size:var(--ng-doc-font-size);line-height:24px;font-weight:600;overflow-wrap:anywhere}@media(max-width:640px){.ng-doc-navigation-controls{grid-template-columns:1fr}.ng-doc-navigation-controls .ng-doc-next-page{grid-column:auto}}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9
19
  }
10
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NgDocPageNavigationComponent, decorators: [{
20
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocPageNavigationComponent, decorators: [{
11
21
  type: Component,
12
- args: [{ selector: 'ng-doc-page-navigation', imports: [
13
- NgDocIconComponent,
14
- NgDocTextComponent,
15
- NgDocTextLeftDirective,
16
- NgDocTextRightDirective,
17
- RouterLink,
18
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"ng-doc-navigation-controls\">\n @if (prevPage) {\n <a class=\"ng-doc-prev-page\" [routerLink]=\"prevPage.route\">\n <div class=\"ng-doc-navigation-page-label\" ng-doc-text size=\"small\">\n <ng-doc-icon icon=\"arrow-left\" ngDocTextLeft></ng-doc-icon>\n Previous\n </div>\n <div class=\"ng-doc-navigation-page-title\" ng-doc-text>{{ prevPage.title }}</div>\n </a>\n }\n @if (nextPage) {\n <a class=\"ng-doc-next-page\" [routerLink]=\"nextPage.route\">\n <div class=\"ng-doc-navigation-page-label\" ng-doc-text size=\"small\">\n Next\n <ng-doc-icon icon=\"arrow-right\" ngDocTextRight></ng-doc-icon>\n </div>\n <div class=\"ng-doc-navigation-page-title\" ng-doc-text>{{ nextPage.title }}</div>\n </a>\n }\n</div>\n", styles: [":host .ng-doc-navigation-controls{display:flex;margin-top:calc(var(--ng-doc-base-gutter) * 12);border-top:1px solid var(--ng-doc-base-2);padding-top:calc(var(--ng-doc-base-gutter) * 2)}:host .ng-doc-navigation-controls a{display:flex;flex-direction:column;text-decoration:unset;transition:var(--ng-doc-transition);--ng-doc-button-hover-background: var(--ng-doc-base-1);--ng-doc-button-active-background: var(--ng-doc-base-2);--ng-doc-text: var(--ng-doc-base-9);--ng-doc-icon-color: var(--ng-doc-text)}:host .ng-doc-navigation-controls a:hover{opacity:.6}:host .ng-doc-navigation-controls a.ng-doc-next-page{margin-left:auto}:host .ng-doc-navigation-controls a.ng-doc-prev-page{align-items:flex-start}:host .ng-doc-navigation-controls a.ng-doc-next-page{align-items:flex-end}:host .ng-doc-navigation-controls a .ng-doc-navigation-page-title{--ng-doc-text: var(--ng-doc-link-color)}\n"] }]
19
- }], propDecorators: { prevPage: [{
20
- type: Input,
21
- args: [{ required: true }]
22
- }], nextPage: [{
23
- type: Input,
24
- args: [{ required: true }]
25
- }] } });
22
+ args: [{ selector: 'ng-doc-page-navigation', imports: [RouterLink], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (prevPage() || nextPage()) {\n <nav class=\"ng-doc-navigation-controls\" aria-label=\"Previous and next page\">\n @if (prevPage(); as page) {\n <a class=\"ng-doc-prev-page\" [routerLink]=\"page.route\">\n <span class=\"ng-doc-navigation-page-label\">\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M19 12H5m6-6-6 6 6 6\" />\n </svg>\n Previous\n </span>\n <span class=\"ng-doc-navigation-page-title\">{{ page.title }}</span>\n </a>\n }\n @if (nextPage(); as page) {\n <a class=\"ng-doc-next-page\" [routerLink]=\"page.route\">\n <span class=\"ng-doc-navigation-page-label\">\n Next\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M5 12h14m-6-6 6 6-6 6\" />\n </svg>\n </span>\n <span class=\"ng-doc-navigation-page-title\">{{ page.title }}</span>\n </a>\n }\n </nav>\n}\n", styles: [".ng-doc-navigation-controls{display:grid;grid-template-columns:1fr 1fr;gap:var(--ng-doc-space-4);margin-top:var(--ng-doc-space-16);font-family:var(--ng-doc-font-family)}.ng-doc-navigation-controls a{display:grid;gap:2px;padding:var(--ng-doc-space-4) var(--ng-doc-space-5);border:1px solid var(--ng-doc-border-color);border-radius:var(--ng-doc-radius-lg);text-decoration:none;transition:border-color var(--ng-doc-transition)}.ng-doc-navigation-controls a:hover{border-color:var(--ng-doc-primary)}.ng-doc-navigation-controls a:focus-visible{outline:none;box-shadow:var(--ng-doc-focus-ring)}.ng-doc-navigation-controls .ng-doc-next-page{grid-column:2;text-align:right}.ng-doc-navigation-controls .ng-doc-next-page .ng-doc-navigation-page-label{justify-content:flex-end}.ng-doc-navigation-page-label{display:flex;align-items:center;gap:6px;color:var(--ng-doc-text-muted);font-size:13px;line-height:18px}.ng-doc-navigation-page-title{color:var(--ng-doc-link-color);font-size:var(--ng-doc-font-size);line-height:24px;font-weight:600;overflow-wrap:anywhere}@media(max-width:640px){.ng-doc-navigation-controls{grid-template-columns:1fr}.ng-doc-navigation-controls .ng-doc-next-page{grid-column:auto}}\n"] }]
23
+ }], propDecorators: { prevPage: [{ type: i0.Input, args: [{ isSignal: true, alias: "prevPage", required: false }] }], nextPage: [{ type: i0.Input, args: [{ isSignal: true, alias: "nextPage", required: false }] }] } });
26
24
 
27
25
  /**
28
26
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"ng-doc-app-components-page-navigation.mjs","sources":["../../../../libs/app/components/page-navigation/page-navigation.component.ts","../../../../libs/app/components/page-navigation/page-navigation.component.html","../../../../libs/app/components/page-navigation/ng-doc-app-components-page-navigation.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { NgDocNavigation, NgDocPageNavigation } from '@ng-doc/app/interfaces';\nimport {\n NgDocIconComponent,\n NgDocTextComponent,\n NgDocTextLeftDirective,\n NgDocTextRightDirective,\n} from '@ng-doc/ui-kit';\n\n@Component({\n selector: 'ng-doc-page-navigation',\n imports: [\n NgDocIconComponent,\n NgDocTextComponent,\n NgDocTextLeftDirective,\n NgDocTextRightDirective,\n RouterLink,\n ],\n templateUrl: './page-navigation.component.html',\n styleUrls: ['./page-navigation.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgDocPageNavigationComponent implements NgDocPageNavigation {\n @Input({ required: true })\n prevPage?: NgDocNavigation;\n\n @Input({ required: true })\n nextPage?: NgDocNavigation;\n}\n","<div class=\"ng-doc-navigation-controls\">\n @if (prevPage) {\n <a class=\"ng-doc-prev-page\" [routerLink]=\"prevPage.route\">\n <div class=\"ng-doc-navigation-page-label\" ng-doc-text size=\"small\">\n <ng-doc-icon icon=\"arrow-left\" ngDocTextLeft></ng-doc-icon>\n Previous\n </div>\n <div class=\"ng-doc-navigation-page-title\" ng-doc-text>{{ prevPage.title }}</div>\n </a>\n }\n @if (nextPage) {\n <a class=\"ng-doc-next-page\" [routerLink]=\"nextPage.route\">\n <div class=\"ng-doc-navigation-page-label\" ng-doc-text size=\"small\">\n Next\n <ng-doc-icon icon=\"arrow-right\" ngDocTextRight></ng-doc-icon>\n </div>\n <div class=\"ng-doc-navigation-page-title\" ng-doc-text>{{ nextPage.title }}</div>\n </a>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;MAuBa,4BAA4B,CAAA;8GAA5B,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAA5B,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvBzC,kyBAoBA,EAAA,MAAA,EAAA,CAAA,o3BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDPI,kBAAkB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,YAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,kBAAkB,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACtB,uBAAuB,EAAA,QAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACvB,UAAU,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAMD,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAbxC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,wBAAwB,EAAA,OAAA,EACzB;wBACP,kBAAkB;wBAClB,kBAAkB;wBAClB,sBAAsB;wBACtB,uBAAuB;wBACvB,UAAU;qBACX,EAAA,eAAA,EAGgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,kyBAAA,EAAA,MAAA,EAAA,CAAA,o3BAAA,CAAA,EAAA;;sBAG9C,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;sBAGxB,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;;AE3B3B;;AAEG;;;;"}
1
+ {"version":3,"file":"ng-doc-app-components-page-navigation.mjs","sources":["../../../../libs/app/components/page-navigation/page-navigation.component.ts","../../../../libs/app/components/page-navigation/page-navigation.component.html","../../../../libs/app/components/page-navigation/ng-doc-app-components-page-navigation.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { NgDocNavigation, NgDocPageNavigation } from '@ng-doc/app/interfaces';\n\n/**\n * Links to the previous and the next page, as two cards at the bottom of a guide.\n */\n@Component({\n selector: 'ng-doc-page-navigation',\n imports: [RouterLink],\n templateUrl: './page-navigation.component.html',\n styleUrls: ['./page-navigation.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgDocPageNavigationComponent implements NgDocPageNavigation {\n /** The page before this one in the sidebar. */\n readonly prevPage = input<NgDocNavigation>();\n\n /** The page after this one in the sidebar. */\n readonly nextPage = input<NgDocNavigation>();\n}\n","@if (prevPage() || nextPage()) {\n <nav class=\"ng-doc-navigation-controls\" aria-label=\"Previous and next page\">\n @if (prevPage(); as page) {\n <a class=\"ng-doc-prev-page\" [routerLink]=\"page.route\">\n <span class=\"ng-doc-navigation-page-label\">\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M19 12H5m6-6-6 6 6 6\" />\n </svg>\n Previous\n </span>\n <span class=\"ng-doc-navigation-page-title\">{{ page.title }}</span>\n </a>\n }\n @if (nextPage(); as page) {\n <a class=\"ng-doc-next-page\" [routerLink]=\"page.route\">\n <span class=\"ng-doc-navigation-page-label\">\n Next\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M5 12h14m-6-6 6 6-6 6\" />\n </svg>\n </span>\n <span class=\"ng-doc-navigation-page-title\">{{ page.title }}</span>\n </a>\n }\n </nav>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAIA;;AAEG;MAQU,4BAA4B,CAAA;AAPzC,IAAA,WAAA,GAAA;;AASW,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK;gGAAmB;;AAGnC,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK;gGAAmB;AAC7C,IAAA;8GANY,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAA5B,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECdzC,w7CA4CA,EAAA,MAAA,EAAA,CAAA,4qCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDnCY,UAAU,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAKT,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAPxC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,wBAAwB,WACzB,CAAC,UAAU,CAAC,EAAA,eAAA,EAGJ,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,w7CAAA,EAAA,MAAA,EAAA,CAAA,4qCAAA,CAAA,EAAA;;;AEZjD;;AAEG;;;;"}