@foblex/m-render 2.5.1 → 2.5.2

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 (383) hide show
  1. package/LICENSE +1 -1
  2. package/esm2022/lib/common-components/f-checkbox/f-checkbox.component.mjs +73 -0
  3. package/esm2022/lib/{f-documentation → common-components}/f-cookie-popup/f-cookie-popup.component.mjs +6 -6
  4. package/esm2022/lib/common-components/f-hamburger-button/f-hamburger-button.component.mjs +25 -0
  5. package/esm2022/lib/common-components/f-header-menu/f-header-menu.component.mjs +26 -0
  6. package/esm2022/lib/common-components/f-social-links/f-social-links.component.mjs +13 -0
  7. package/esm2022/lib/common-components/f-theme-button/f-theme-button.component.mjs +44 -0
  8. package/esm2022/lib/common-components/f-version/f-version.component.mjs +16 -0
  9. package/esm2022/lib/common-components/index.mjs +8 -0
  10. package/esm2022/lib/common-services/analytics/f-analytics.service.mjs +6 -8
  11. package/esm2022/lib/common-services/f-head-tag.service.mjs +6 -4
  12. package/esm2022/lib/common-services/f-meta.service.mjs +80 -0
  13. package/esm2022/lib/common-services/f-popover.service.mjs +23 -0
  14. package/esm2022/lib/common-services/index.mjs +3 -1
  15. package/esm2022/lib/common-services/json-ld/f-json-ld.service.mjs +6 -4
  16. package/esm2022/lib/domain/f-state.service.mjs +6 -5
  17. package/esm2022/lib/domain/get-version-handler/get-version.handler.mjs +28 -0
  18. package/esm2022/lib/domain/get-version-handler/get-version.request.mjs +7 -0
  19. package/esm2022/lib/domain/get-version-handler/index.mjs +3 -0
  20. package/esm2022/lib/domain/handle-navigation-links/handle-navigation-links.handler.mjs +53 -0
  21. package/esm2022/lib/domain/handle-navigation-links/handle-navigation-links.request.mjs +7 -0
  22. package/esm2022/lib/domain/handle-navigation-links/index.mjs +3 -0
  23. package/esm2022/lib/domain/i-environment-service.mjs +3 -0
  24. package/esm2022/lib/domain/index.mjs +4 -8
  25. package/esm2022/lib/f-documentation/domain/i-docs-environment.mjs +2 -0
  26. package/esm2022/lib/f-documentation/domain/index.mjs +2 -0
  27. package/esm2022/lib/f-documentation/f-badge/f-badge.component.mjs +6 -8
  28. package/esm2022/lib/f-documentation/f-documentation-environment.service.mjs +69 -0
  29. package/esm2022/lib/f-documentation/f-documentation.component.mjs +20 -14
  30. package/esm2022/lib/f-documentation/f-header/f-header.component.mjs +9 -17
  31. package/esm2022/lib/f-documentation/f-navigation-panel/domain/i-navigation-group.mjs +2 -0
  32. package/esm2022/lib/f-documentation/f-navigation-panel/domain/i-navigation-item-badge.mjs +2 -0
  33. package/esm2022/lib/f-documentation/f-navigation-panel/domain/i-navigation-item.mjs +2 -0
  34. package/esm2022/lib/f-documentation/f-navigation-panel/domain/index.mjs +4 -0
  35. package/esm2022/lib/f-documentation/f-navigation-panel/f-navigation-group/f-navigation-group.component.mjs +21 -0
  36. package/esm2022/lib/f-documentation/f-navigation-panel/f-navigation-header/f-navigation-header.component.mjs +26 -0
  37. package/esm2022/lib/f-documentation/f-navigation-panel/f-navigation-item/f-navigation-item.component.mjs +11 -0
  38. package/esm2022/lib/f-documentation/f-navigation-panel/f-navigation-panel.component.mjs +101 -0
  39. package/esm2022/lib/f-documentation/f-navigation-panel/index.mjs +6 -0
  40. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/handle-dynamic-components/handle-dynamic-components.handler.mjs +104 -0
  41. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/handle-dynamic-components/handle-dynamic-components.request.mjs +7 -0
  42. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/handle-dynamic-components/index.mjs +3 -0
  43. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/handle-parsed-containers/handle-parsed-containers.handler.mjs +35 -0
  44. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/handle-parsed-containers/handle-parsed-containers.request.mjs +7 -0
  45. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/handle-parsed-containers/i-parsed-container.mjs +2 -0
  46. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/handle-parsed-containers/index.mjs +5 -0
  47. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/handle-parsed-containers/pseudo-components/clipboard/copy-to-clipboard.mjs +15 -0
  48. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/handle-parsed-containers/pseudo-components/clipboard/index.mjs +2 -0
  49. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/handle-parsed-containers/pseudo-components/f-async-code-view-handler.mjs +46 -0
  50. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/handle-parsed-containers/pseudo-components/f-code-group/f-code-group.handler.mjs +54 -0
  51. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/handle-parsed-containers/pseudo-components/f-code-group/i-code-group-view.mjs +2 -0
  52. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/handle-parsed-containers/pseudo-components/f-code-group/index.mjs +3 -0
  53. package/esm2022/lib/{f-page → f-documentation/f-page}/f-markdown/domain/handle-parsed-containers/pseudo-components/f-code-group-body.handler.mjs +4 -1
  54. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/handle-parsed-containers/pseudo-components/f-code-view-handler.mjs +63 -0
  55. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/handle-parsed-containers/pseudo-components/f-example-view-handler.mjs +10 -0
  56. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/handle-parsed-containers/pseudo-components/index.mjs +7 -0
  57. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/highlight/change-code-focused-syntax.pre-processor.mjs +23 -0
  58. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/highlight/highlight.service.mjs +56 -0
  59. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/highlight/index.mjs +6 -0
  60. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/highlight/mark-code-focused-blocks.post-processor.mjs +53 -0
  61. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/highlight/modify-punctuation-highlight.post-processor.mjs +22 -0
  62. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/highlight/separate-code-by-lines.post-processor.mjs +28 -0
  63. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/index.mjs +5 -0
  64. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/markdown/index.mjs +4 -0
  65. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/markdown/markdown.service.mjs +69 -0
  66. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/markdown/parse-markdown/e-markdown-container-type.mjs +13 -0
  67. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/markdown/parse-markdown/i-markdown-it-token.mjs +2 -0
  68. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/markdown/parse-markdown/index.mjs +8 -0
  69. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/markdown/parse-markdown/parse-alerts.mjs +19 -0
  70. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/markdown/parse-markdown/parse-code-group.mjs +54 -0
  71. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/markdown/parse-markdown/parse-code-view.mjs +15 -0
  72. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/markdown/parse-markdown/parse-example-group.mjs +92 -0
  73. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/markdown/parse-markdown/parse-preview-group.mjs +50 -0
  74. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/markdown/utils/get-content.mjs +17 -0
  75. package/esm2022/lib/f-documentation/f-page/f-markdown/domain/markdown/utils/index.mjs +2 -0
  76. package/esm2022/lib/f-documentation/f-page/f-markdown/f-markdown-renderer.component.mjs +84 -0
  77. package/esm2022/lib/f-documentation/f-page/f-markdown/index.mjs +3 -0
  78. package/esm2022/lib/f-documentation/f-page/f-markdown-footer/domain/features/get-previous-next-page-navigation/get-previous-next-page-navigation.handler.mjs +37 -0
  79. package/esm2022/lib/f-documentation/f-page/f-markdown-footer/domain/features/get-previous-next-page-navigation/get-previous-next-page-navigation.request.mjs +7 -0
  80. package/esm2022/lib/f-documentation/f-page/f-markdown-footer/domain/features/get-previous-next-page-navigation/get-previous-next-page-navigation.response.mjs +9 -0
  81. package/esm2022/lib/f-documentation/f-page/f-markdown-footer/domain/features/get-previous-next-page-navigation/index.mjs +4 -0
  82. package/esm2022/lib/f-documentation/f-page/f-markdown-footer/domain/features/index.mjs +2 -0
  83. package/esm2022/lib/f-documentation/f-page/f-markdown-footer/domain/i-page-link.mjs +2 -0
  84. package/esm2022/lib/f-documentation/f-page/f-markdown-footer/domain/index.mjs +3 -0
  85. package/esm2022/lib/f-documentation/f-page/f-markdown-footer/f-footer-edit-information/f-footer-edit-information.component.mjs +11 -0
  86. package/esm2022/lib/f-documentation/f-page/f-markdown-footer/f-footer-edit-information/f-footer-edit-link/f-footer-edit-link.component.mjs +11 -0
  87. package/esm2022/lib/f-documentation/f-page/f-markdown-footer/f-footer-edit-information/f-footer-edit-link/index.mjs +2 -0
  88. package/esm2022/lib/f-documentation/f-page/f-markdown-footer/f-footer-edit-information/f-footer-last-updated/f-footer-last-updated.component.mjs +11 -0
  89. package/esm2022/lib/f-documentation/f-page/f-markdown-footer/f-footer-edit-information/f-footer-last-updated/index.mjs +2 -0
  90. package/esm2022/lib/f-documentation/f-page/f-markdown-footer/f-footer-edit-information/index.mjs +2 -0
  91. package/esm2022/lib/f-documentation/f-page/f-markdown-footer/f-footer-navigation/f-footer-navigation-button/f-footer-navigation-button.component.mjs +19 -0
  92. package/esm2022/lib/f-documentation/f-page/f-markdown-footer/f-footer-navigation/f-footer-navigation-button/index.mjs +2 -0
  93. package/esm2022/lib/f-documentation/f-page/f-markdown-footer/f-footer-navigation/f-footer-navigation.component.mjs +11 -0
  94. package/esm2022/lib/f-documentation/f-page/f-markdown-footer/f-footer-navigation/index.mjs +3 -0
  95. package/esm2022/lib/f-documentation/f-page/f-markdown-footer/f-markdown-footer.component.mjs +89 -0
  96. package/esm2022/lib/f-documentation/f-page/f-markdown-footer/index.mjs +5 -0
  97. package/esm2022/lib/f-documentation/f-page/f-page.component.mjs +18 -0
  98. package/esm2022/lib/f-documentation/f-page/f-table-of-content/f-table-of-content-items/f-table-of-content-items.component.mjs +14 -0
  99. package/esm2022/lib/f-documentation/f-page/f-table-of-content/f-table-of-content-items/index.mjs +2 -0
  100. package/esm2022/lib/f-documentation/f-page/f-table-of-content/f-table-of-content.component.mjs +69 -0
  101. package/esm2022/lib/f-documentation/f-page/f-table-of-content/index.mjs +3 -0
  102. package/esm2022/lib/f-documentation/f-page/index.mjs +5 -0
  103. package/esm2022/lib/f-documentation/f-preview/f-preview.component.mjs +16 -7
  104. package/esm2022/lib/f-documentation/f-scrollable-container/domain/calculate-hash-from-scroll-position/calculate-hash-from-scroll-position.handler.mjs +53 -0
  105. package/esm2022/lib/f-documentation/f-scrollable-container/domain/calculate-hash-from-scroll-position/calculate-hash-from-scroll-position.request.mjs +7 -0
  106. package/esm2022/lib/f-documentation/f-scrollable-container/domain/calculate-hash-from-scroll-position/index.mjs +3 -0
  107. package/esm2022/lib/f-documentation/f-scrollable-container/domain/get-absolute-top-to-container/get-absolute-top-to-container.handler.mjs +14 -0
  108. package/esm2022/lib/f-documentation/f-scrollable-container/domain/get-absolute-top-to-container/get-absolute-top-to-container.request.mjs +9 -0
  109. package/esm2022/lib/f-documentation/f-scrollable-container/domain/get-absolute-top-to-container/index.mjs +3 -0
  110. package/esm2022/lib/f-documentation/f-scrollable-container/domain/get-table-of-content-data/get-table-of-content-data.handler.mjs +52 -0
  111. package/esm2022/lib/f-documentation/f-scrollable-container/domain/get-table-of-content-data/get-table-of-content-data.request.mjs +9 -0
  112. package/esm2022/lib/f-documentation/f-scrollable-container/domain/get-table-of-content-data/index.mjs +3 -0
  113. package/esm2022/lib/f-documentation/f-scrollable-container/domain/i-table-of-content-item.mjs +2 -0
  114. package/esm2022/lib/f-documentation/f-scrollable-container/domain/index.mjs +7 -0
  115. package/esm2022/lib/f-documentation/f-scrollable-container/domain/scroll-to-element-in-container.mjs +35 -0
  116. package/esm2022/lib/f-documentation/f-scrollable-container/domain/table-of-content-data.mjs +9 -0
  117. package/esm2022/lib/{f-scrollable-container → f-documentation/f-scrollable-container}/f-scrollable-container.component.mjs +7 -5
  118. package/esm2022/lib/f-documentation/f-scrollable-container/f-scrollable.service.mjs +60 -0
  119. package/esm2022/lib/f-documentation/f-scrollable-container/index.mjs +3 -0
  120. package/esm2022/lib/f-documentation/index.mjs +8 -8
  121. package/esm2022/lib/f-documentation/providers.mjs +3 -0
  122. package/esm2022/lib/f-documentation/router.mjs +13 -0
  123. package/esm2022/lib/f-home-page/domain/i-home-page-environment.mjs +2 -0
  124. package/esm2022/lib/f-home-page/domain/i-home-page-feature.mjs +2 -0
  125. package/esm2022/lib/f-home-page/domain/i-home-page-footer.mjs +2 -0
  126. package/esm2022/lib/f-home-page/domain/i-home-page-hero.mjs +2 -0
  127. package/esm2022/lib/f-home-page/domain/i-home-page-link.mjs +2 -0
  128. package/esm2022/lib/f-home-page/domain/index.mjs +6 -0
  129. package/esm2022/lib/f-home-page/f-home-page-environment.service.mjs +57 -0
  130. package/esm2022/lib/f-home-page/f-home-page-features/f-home-page-features.component.mjs +13 -0
  131. package/esm2022/lib/f-home-page/f-home-page-footer/f-home-page-footer.component.mjs +13 -0
  132. package/esm2022/lib/f-home-page/f-home-page-header/f-home-page-header.component.mjs +17 -0
  133. package/esm2022/lib/f-home-page/f-home-page-hero/f-home-page-buttons-row/f-home-page-buttons-row.component.mjs +16 -0
  134. package/esm2022/lib/f-home-page/f-home-page-hero/f-home-page-hero.component.mjs +16 -0
  135. package/esm2022/lib/f-home-page/f-home-page.component.mjs +66 -0
  136. package/esm2022/lib/f-home-page/index.mjs +9 -0
  137. package/esm2022/lib/f-home-page/providers.mjs +3 -0
  138. package/esm2022/lib/f-home-page/router.mjs +7 -0
  139. package/esm2022/lib/index.mjs +3 -4
  140. package/fesm2022/foblex-m-render.mjs +1347 -1033
  141. package/fesm2022/foblex-m-render.mjs.map +1 -1
  142. package/lib/{f-documentation → common-components}/f-hamburger-button/f-hamburger-button.component.d.ts +1 -1
  143. package/lib/{f-documentation → common-components}/f-header-menu/f-header-menu.component.d.ts +3 -5
  144. package/lib/{f-documentation → common-components}/f-social-links/f-social-links.component.d.ts +1 -4
  145. package/lib/{f-documentation → common-components}/f-version/f-version.component.d.ts +0 -3
  146. package/lib/common-components/index.d.ts +7 -0
  147. package/lib/common-services/analytics/set-cookie-consent.d.ts +1 -1
  148. package/lib/{domain → common-services}/f-meta.service.d.ts +3 -3
  149. package/lib/common-services/index.d.ts +2 -0
  150. package/lib/domain/{features/get-version-handler → get-version-handler}/get-version.request.d.ts +1 -1
  151. package/lib/domain/i-environment-service.d.ts +12 -0
  152. package/lib/domain/index.d.ts +3 -7
  153. package/lib/{domain → f-documentation/domain}/i-docs-environment.d.ts +6 -6
  154. package/lib/f-documentation/domain/index.d.ts +1 -0
  155. package/lib/{domain/f-environment.service.d.ts → f-documentation/f-documentation-environment.service.d.ts} +5 -5
  156. package/lib/f-documentation/f-documentation.component.d.ts +1 -1
  157. package/lib/f-documentation/f-header/f-header.component.d.ts +0 -3
  158. package/lib/{f-navigation-panel → f-documentation/f-navigation-panel}/f-navigation-header/f-navigation-header.component.d.ts +2 -2
  159. package/lib/{f-navigation-panel → f-documentation/f-navigation-panel}/f-navigation-panel.component.d.ts +2 -3
  160. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/handle-dynamic-components/handle-dynamic-components.handler.d.ts +2 -2
  161. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/markdown/markdown.service.d.ts +2 -2
  162. package/lib/{f-page → f-documentation/f-page}/f-markdown-footer/domain/features/get-previous-next-page-navigation/get-previous-next-page-navigation.handler.d.ts +2 -2
  163. package/lib/{f-page → f-documentation/f-page}/f-markdown-footer/f-markdown-footer.component.d.ts +3 -2
  164. package/lib/{f-page → f-documentation/f-page}/f-table-of-content/f-table-of-content.component.d.ts +2 -2
  165. package/lib/f-documentation/f-preview/f-preview.component.d.ts +3 -3
  166. package/lib/{f-scrollable-container → f-documentation/f-scrollable-container}/f-scrollable.service.d.ts +2 -2
  167. package/lib/f-documentation/index.d.ts +7 -7
  168. package/lib/f-documentation/providers.d.ts +3 -0
  169. package/lib/f-home-page/domain/i-home-page-environment.d.ts +19 -0
  170. package/lib/f-home-page/domain/i-home-page-feature.d.ts +4 -0
  171. package/lib/f-home-page/domain/i-home-page-footer.d.ts +3 -0
  172. package/lib/f-home-page/domain/i-home-page-hero.d.ts +6 -0
  173. package/lib/f-home-page/domain/i-home-page-link.d.ts +6 -0
  174. package/lib/f-home-page/domain/index.d.ts +5 -0
  175. package/lib/f-home-page/f-home-page-environment.service.d.ts +24 -0
  176. package/lib/f-home-page/f-home-page-features/f-home-page-features.component.d.ts +6 -0
  177. package/lib/f-home-page/f-home-page-footer/f-home-page-footer.component.d.ts +6 -0
  178. package/lib/f-home-page/f-home-page-header/f-home-page-header.component.d.ts +7 -0
  179. package/lib/f-home-page/f-home-page-hero/f-home-page-buttons-row/f-home-page-buttons-row.component.d.ts +6 -0
  180. package/lib/f-home-page/f-home-page-hero/f-home-page-hero.component.d.ts +6 -0
  181. package/lib/f-home-page/f-home-page.component.d.ts +17 -0
  182. package/lib/f-home-page/index.d.ts +8 -0
  183. package/lib/f-home-page/providers.d.ts +3 -0
  184. package/lib/f-home-page/router.d.ts +2 -0
  185. package/lib/index.d.ts +2 -3
  186. package/package.json +3 -3
  187. package/esm2022/lib/domain/f-environment.service.mjs +0 -66
  188. package/esm2022/lib/domain/f-meta.service.mjs +0 -77
  189. package/esm2022/lib/domain/f-popover.service.mjs +0 -25
  190. package/esm2022/lib/domain/features/get-version-handler/get-version.handler.mjs +0 -27
  191. package/esm2022/lib/domain/features/get-version-handler/get-version.request.mjs +0 -6
  192. package/esm2022/lib/domain/features/get-version-handler/index.mjs +0 -3
  193. package/esm2022/lib/domain/features/handle-navigation-links/handle-navigation-links.handler.mjs +0 -51
  194. package/esm2022/lib/domain/features/handle-navigation-links/handle-navigation-links.request.mjs +0 -6
  195. package/esm2022/lib/domain/features/handle-navigation-links/index.mjs +0 -3
  196. package/esm2022/lib/domain/features/index.mjs +0 -3
  197. package/esm2022/lib/domain/i-docs-environment.mjs +0 -2
  198. package/esm2022/lib/domain/providers.mjs +0 -3
  199. package/esm2022/lib/domain/router.mjs +0 -13
  200. package/esm2022/lib/f-documentation/f-checkbox/f-checkbox.component.mjs +0 -70
  201. package/esm2022/lib/f-documentation/f-hamburger-button/f-hamburger-button.component.mjs +0 -24
  202. package/esm2022/lib/f-documentation/f-header-menu/f-header-menu.component.mjs +0 -29
  203. package/esm2022/lib/f-documentation/f-social-links/f-social-links.component.mjs +0 -18
  204. package/esm2022/lib/f-documentation/f-theme-button/f-theme-button.component.mjs +0 -41
  205. package/esm2022/lib/f-documentation/f-version/f-version.component.mjs +0 -19
  206. package/esm2022/lib/f-navigation-panel/domain/i-navigation-group.mjs +0 -2
  207. package/esm2022/lib/f-navigation-panel/domain/i-navigation-item-badge.mjs +0 -2
  208. package/esm2022/lib/f-navigation-panel/domain/i-navigation-item.mjs +0 -2
  209. package/esm2022/lib/f-navigation-panel/domain/index.mjs +0 -4
  210. package/esm2022/lib/f-navigation-panel/f-navigation-group/f-navigation-group.component.mjs +0 -22
  211. package/esm2022/lib/f-navigation-panel/f-navigation-header/f-navigation-header.component.mjs +0 -24
  212. package/esm2022/lib/f-navigation-panel/f-navigation-item/f-navigation-item.component.mjs +0 -11
  213. package/esm2022/lib/f-navigation-panel/f-navigation-panel.component.mjs +0 -94
  214. package/esm2022/lib/f-navigation-panel/index.mjs +0 -6
  215. package/esm2022/lib/f-page/f-markdown/domain/handle-dynamic-components/handle-dynamic-components.handler.mjs +0 -102
  216. package/esm2022/lib/f-page/f-markdown/domain/handle-dynamic-components/handle-dynamic-components.request.mjs +0 -6
  217. package/esm2022/lib/f-page/f-markdown/domain/handle-dynamic-components/index.mjs +0 -3
  218. package/esm2022/lib/f-page/f-markdown/domain/handle-parsed-containers/handle-parsed-containers.handler.mjs +0 -34
  219. package/esm2022/lib/f-page/f-markdown/domain/handle-parsed-containers/handle-parsed-containers.request.mjs +0 -6
  220. package/esm2022/lib/f-page/f-markdown/domain/handle-parsed-containers/i-parsed-container.mjs +0 -2
  221. package/esm2022/lib/f-page/f-markdown/domain/handle-parsed-containers/index.mjs +0 -5
  222. package/esm2022/lib/f-page/f-markdown/domain/handle-parsed-containers/pseudo-components/clipboard/copy-to-clipboard.mjs +0 -15
  223. package/esm2022/lib/f-page/f-markdown/domain/handle-parsed-containers/pseudo-components/clipboard/index.mjs +0 -2
  224. package/esm2022/lib/f-page/f-markdown/domain/handle-parsed-containers/pseudo-components/f-async-code-view-handler.mjs +0 -46
  225. package/esm2022/lib/f-page/f-markdown/domain/handle-parsed-containers/pseudo-components/f-code-group/f-code-group.handler.mjs +0 -51
  226. package/esm2022/lib/f-page/f-markdown/domain/handle-parsed-containers/pseudo-components/f-code-group/i-code-group-view.mjs +0 -2
  227. package/esm2022/lib/f-page/f-markdown/domain/handle-parsed-containers/pseudo-components/f-code-group/index.mjs +0 -3
  228. package/esm2022/lib/f-page/f-markdown/domain/handle-parsed-containers/pseudo-components/f-code-view-handler.mjs +0 -60
  229. package/esm2022/lib/f-page/f-markdown/domain/handle-parsed-containers/pseudo-components/f-example-view-handler.mjs +0 -9
  230. package/esm2022/lib/f-page/f-markdown/domain/handle-parsed-containers/pseudo-components/index.mjs +0 -7
  231. package/esm2022/lib/f-page/f-markdown/domain/highlight/change-code-focused-syntax.pre-processor.mjs +0 -23
  232. package/esm2022/lib/f-page/f-markdown/domain/highlight/highlight.service.mjs +0 -54
  233. package/esm2022/lib/f-page/f-markdown/domain/highlight/index.mjs +0 -6
  234. package/esm2022/lib/f-page/f-markdown/domain/highlight/mark-code-focused-blocks.post-processor.mjs +0 -52
  235. package/esm2022/lib/f-page/f-markdown/domain/highlight/modify-punctuation-highlight.post-processor.mjs +0 -22
  236. package/esm2022/lib/f-page/f-markdown/domain/highlight/separate-code-by-lines.post-processor.mjs +0 -28
  237. package/esm2022/lib/f-page/f-markdown/domain/index.mjs +0 -5
  238. package/esm2022/lib/f-page/f-markdown/domain/markdown/index.mjs +0 -4
  239. package/esm2022/lib/f-page/f-markdown/domain/markdown/markdown.service.mjs +0 -65
  240. package/esm2022/lib/f-page/f-markdown/domain/markdown/parse-markdown/e-markdown-container-type.mjs +0 -13
  241. package/esm2022/lib/f-page/f-markdown/domain/markdown/parse-markdown/i-markdown-it-token.mjs +0 -2
  242. package/esm2022/lib/f-page/f-markdown/domain/markdown/parse-markdown/index.mjs +0 -8
  243. package/esm2022/lib/f-page/f-markdown/domain/markdown/parse-markdown/parse-alerts.mjs +0 -19
  244. package/esm2022/lib/f-page/f-markdown/domain/markdown/parse-markdown/parse-code-group.mjs +0 -54
  245. package/esm2022/lib/f-page/f-markdown/domain/markdown/parse-markdown/parse-code-view.mjs +0 -15
  246. package/esm2022/lib/f-page/f-markdown/domain/markdown/parse-markdown/parse-example-group.mjs +0 -92
  247. package/esm2022/lib/f-page/f-markdown/domain/markdown/parse-markdown/parse-preview-group.mjs +0 -49
  248. package/esm2022/lib/f-page/f-markdown/domain/markdown/utils/get-content.mjs +0 -17
  249. package/esm2022/lib/f-page/f-markdown/domain/markdown/utils/index.mjs +0 -2
  250. package/esm2022/lib/f-page/f-markdown/f-markdown-renderer.component.mjs +0 -80
  251. package/esm2022/lib/f-page/f-markdown/index.mjs +0 -3
  252. package/esm2022/lib/f-page/f-markdown-footer/domain/features/get-previous-next-page-navigation/get-previous-next-page-navigation.handler.mjs +0 -36
  253. package/esm2022/lib/f-page/f-markdown-footer/domain/features/get-previous-next-page-navigation/get-previous-next-page-navigation.request.mjs +0 -6
  254. package/esm2022/lib/f-page/f-markdown-footer/domain/features/get-previous-next-page-navigation/get-previous-next-page-navigation.response.mjs +0 -7
  255. package/esm2022/lib/f-page/f-markdown-footer/domain/features/get-previous-next-page-navigation/index.mjs +0 -4
  256. package/esm2022/lib/f-page/f-markdown-footer/domain/features/index.mjs +0 -2
  257. package/esm2022/lib/f-page/f-markdown-footer/domain/i-page-link.mjs +0 -2
  258. package/esm2022/lib/f-page/f-markdown-footer/domain/index.mjs +0 -3
  259. package/esm2022/lib/f-page/f-markdown-footer/f-footer-edit-information/f-footer-edit-information.component.mjs +0 -11
  260. package/esm2022/lib/f-page/f-markdown-footer/f-footer-edit-information/f-footer-edit-link/f-footer-edit-link.component.mjs +0 -11
  261. package/esm2022/lib/f-page/f-markdown-footer/f-footer-edit-information/f-footer-edit-link/index.mjs +0 -2
  262. package/esm2022/lib/f-page/f-markdown-footer/f-footer-edit-information/f-footer-last-updated/f-footer-last-updated.component.mjs +0 -11
  263. package/esm2022/lib/f-page/f-markdown-footer/f-footer-edit-information/f-footer-last-updated/index.mjs +0 -2
  264. package/esm2022/lib/f-page/f-markdown-footer/f-footer-edit-information/index.mjs +0 -2
  265. package/esm2022/lib/f-page/f-markdown-footer/f-footer-navigation/f-footer-navigation-button/f-footer-navigation-button.component.mjs +0 -17
  266. package/esm2022/lib/f-page/f-markdown-footer/f-footer-navigation/f-footer-navigation-button/index.mjs +0 -2
  267. package/esm2022/lib/f-page/f-markdown-footer/f-footer-navigation/f-footer-navigation.component.mjs +0 -11
  268. package/esm2022/lib/f-page/f-markdown-footer/f-footer-navigation/index.mjs +0 -3
  269. package/esm2022/lib/f-page/f-markdown-footer/f-markdown-footer.component.mjs +0 -82
  270. package/esm2022/lib/f-page/f-markdown-footer/index.mjs +0 -5
  271. package/esm2022/lib/f-page/f-page.component.mjs +0 -18
  272. package/esm2022/lib/f-page/f-table-of-content/f-table-of-content-items/f-table-of-content-items.component.mjs +0 -16
  273. package/esm2022/lib/f-page/f-table-of-content/f-table-of-content-items/index.mjs +0 -2
  274. package/esm2022/lib/f-page/f-table-of-content/f-table-of-content.component.mjs +0 -63
  275. package/esm2022/lib/f-page/f-table-of-content/index.mjs +0 -3
  276. package/esm2022/lib/f-page/index.mjs +0 -5
  277. package/esm2022/lib/f-scrollable-container/domain/calculate-hash-from-scroll-position/calculate-hash-from-scroll-position.handler.mjs +0 -51
  278. package/esm2022/lib/f-scrollable-container/domain/calculate-hash-from-scroll-position/calculate-hash-from-scroll-position.request.mjs +0 -6
  279. package/esm2022/lib/f-scrollable-container/domain/calculate-hash-from-scroll-position/index.mjs +0 -3
  280. package/esm2022/lib/f-scrollable-container/domain/get-absolute-top-to-container/get-absolute-top-to-container.handler.mjs +0 -14
  281. package/esm2022/lib/f-scrollable-container/domain/get-absolute-top-to-container/get-absolute-top-to-container.request.mjs +0 -7
  282. package/esm2022/lib/f-scrollable-container/domain/get-absolute-top-to-container/index.mjs +0 -3
  283. package/esm2022/lib/f-scrollable-container/domain/get-table-of-content-data/get-table-of-content-data.handler.mjs +0 -52
  284. package/esm2022/lib/f-scrollable-container/domain/get-table-of-content-data/get-table-of-content-data.request.mjs +0 -7
  285. package/esm2022/lib/f-scrollable-container/domain/get-table-of-content-data/index.mjs +0 -3
  286. package/esm2022/lib/f-scrollable-container/domain/i-table-of-content-item.mjs +0 -2
  287. package/esm2022/lib/f-scrollable-container/domain/index.mjs +0 -7
  288. package/esm2022/lib/f-scrollable-container/domain/scroll-to-element-in-container.mjs +0 -34
  289. package/esm2022/lib/f-scrollable-container/domain/table-of-content-data.mjs +0 -7
  290. package/esm2022/lib/f-scrollable-container/f-scrollable.service.mjs +0 -57
  291. package/esm2022/lib/f-scrollable-container/index.mjs +0 -3
  292. package/lib/domain/features/index.d.ts +0 -2
  293. package/lib/domain/providers.d.ts +0 -3
  294. package/lib/{f-documentation → common-components}/f-checkbox/f-checkbox.component.d.ts +0 -0
  295. package/lib/{f-documentation → common-components}/f-cookie-popup/f-cookie-popup.component.d.ts +0 -0
  296. package/lib/{f-documentation → common-components}/f-theme-button/f-theme-button.component.d.ts +0 -0
  297. package/lib/{domain → common-services}/f-popover.service.d.ts +0 -0
  298. package/lib/domain/{features/get-version-handler → get-version-handler}/get-version.handler.d.ts +0 -0
  299. package/lib/domain/{features/get-version-handler → get-version-handler}/index.d.ts +0 -0
  300. package/lib/domain/{features/handle-navigation-links → handle-navigation-links}/handle-navigation-links.handler.d.ts +0 -0
  301. package/lib/domain/{features/handle-navigation-links → handle-navigation-links}/handle-navigation-links.request.d.ts +0 -0
  302. package/lib/domain/{features/handle-navigation-links → handle-navigation-links}/index.d.ts +0 -0
  303. package/lib/{f-navigation-panel → f-documentation/f-navigation-panel}/domain/i-navigation-group.d.ts +0 -0
  304. package/lib/{f-navigation-panel → f-documentation/f-navigation-panel}/domain/i-navigation-item-badge.d.ts +0 -0
  305. package/lib/{f-navigation-panel → f-documentation/f-navigation-panel}/domain/i-navigation-item.d.ts +0 -0
  306. package/lib/{f-navigation-panel → f-documentation/f-navigation-panel}/domain/index.d.ts +0 -0
  307. package/lib/{f-navigation-panel → f-documentation/f-navigation-panel}/f-navigation-group/f-navigation-group.component.d.ts +0 -0
  308. package/lib/{f-navigation-panel → f-documentation/f-navigation-panel}/f-navigation-item/f-navigation-item.component.d.ts +0 -0
  309. package/lib/{f-navigation-panel → f-documentation/f-navigation-panel}/index.d.ts +0 -0
  310. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/handle-dynamic-components/handle-dynamic-components.request.d.ts +0 -0
  311. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/handle-dynamic-components/index.d.ts +0 -0
  312. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/handle-parsed-containers/handle-parsed-containers.handler.d.ts +0 -0
  313. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/handle-parsed-containers/handle-parsed-containers.request.d.ts +0 -0
  314. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/handle-parsed-containers/i-parsed-container.d.ts +0 -0
  315. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/handle-parsed-containers/index.d.ts +0 -0
  316. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/handle-parsed-containers/pseudo-components/clipboard/copy-to-clipboard.d.ts +0 -0
  317. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/handle-parsed-containers/pseudo-components/clipboard/index.d.ts +0 -0
  318. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/handle-parsed-containers/pseudo-components/f-async-code-view-handler.d.ts +0 -0
  319. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/handle-parsed-containers/pseudo-components/f-code-group/f-code-group.handler.d.ts +0 -0
  320. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/handle-parsed-containers/pseudo-components/f-code-group/i-code-group-view.d.ts +0 -0
  321. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/handle-parsed-containers/pseudo-components/f-code-group/index.d.ts +0 -0
  322. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/handle-parsed-containers/pseudo-components/f-code-group-body.handler.d.ts +0 -0
  323. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/handle-parsed-containers/pseudo-components/f-code-view-handler.d.ts +0 -0
  324. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/handle-parsed-containers/pseudo-components/f-example-view-handler.d.ts +0 -0
  325. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/handle-parsed-containers/pseudo-components/index.d.ts +0 -0
  326. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/highlight/change-code-focused-syntax.pre-processor.d.ts +0 -0
  327. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/highlight/highlight.service.d.ts +0 -0
  328. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/highlight/index.d.ts +0 -0
  329. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/highlight/mark-code-focused-blocks.post-processor.d.ts +0 -0
  330. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/highlight/modify-punctuation-highlight.post-processor.d.ts +0 -0
  331. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/highlight/separate-code-by-lines.post-processor.d.ts +0 -0
  332. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/index.d.ts +0 -0
  333. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/markdown/index.d.ts +0 -0
  334. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/markdown/parse-markdown/e-markdown-container-type.d.ts +0 -0
  335. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/markdown/parse-markdown/i-markdown-it-token.d.ts +0 -0
  336. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/markdown/parse-markdown/index.d.ts +0 -0
  337. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/markdown/parse-markdown/parse-alerts.d.ts +0 -0
  338. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/markdown/parse-markdown/parse-code-group.d.ts +0 -0
  339. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/markdown/parse-markdown/parse-code-view.d.ts +0 -0
  340. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/markdown/parse-markdown/parse-example-group.d.ts +0 -0
  341. package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/markdown/parse-markdown/parse-preview-group.d.ts +1 -1
  342. /package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/markdown/utils/get-content.d.ts +0 -0
  343. /package/lib/{f-page → f-documentation/f-page}/f-markdown/domain/markdown/utils/index.d.ts +0 -0
  344. /package/lib/{f-page → f-documentation/f-page}/f-markdown/f-markdown-renderer.component.d.ts +0 -0
  345. /package/lib/{f-page → f-documentation/f-page}/f-markdown/index.d.ts +0 -0
  346. /package/lib/{f-page → f-documentation/f-page}/f-markdown-footer/domain/features/get-previous-next-page-navigation/get-previous-next-page-navigation.request.d.ts +0 -0
  347. /package/lib/{f-page → f-documentation/f-page}/f-markdown-footer/domain/features/get-previous-next-page-navigation/get-previous-next-page-navigation.response.d.ts +0 -0
  348. /package/lib/{f-page → f-documentation/f-page}/f-markdown-footer/domain/features/get-previous-next-page-navigation/index.d.ts +0 -0
  349. /package/lib/{f-page → f-documentation/f-page}/f-markdown-footer/domain/features/index.d.ts +0 -0
  350. /package/lib/{f-page → f-documentation/f-page}/f-markdown-footer/domain/i-page-link.d.ts +0 -0
  351. /package/lib/{f-page → f-documentation/f-page}/f-markdown-footer/domain/index.d.ts +0 -0
  352. /package/lib/{f-page → f-documentation/f-page}/f-markdown-footer/f-footer-edit-information/f-footer-edit-information.component.d.ts +0 -0
  353. /package/lib/{f-page → f-documentation/f-page}/f-markdown-footer/f-footer-edit-information/f-footer-edit-link/f-footer-edit-link.component.d.ts +0 -0
  354. /package/lib/{f-page → f-documentation/f-page}/f-markdown-footer/f-footer-edit-information/f-footer-edit-link/index.d.ts +0 -0
  355. /package/lib/{f-page → f-documentation/f-page}/f-markdown-footer/f-footer-edit-information/f-footer-last-updated/f-footer-last-updated.component.d.ts +0 -0
  356. /package/lib/{f-page → f-documentation/f-page}/f-markdown-footer/f-footer-edit-information/f-footer-last-updated/index.d.ts +0 -0
  357. /package/lib/{f-page → f-documentation/f-page}/f-markdown-footer/f-footer-edit-information/index.d.ts +0 -0
  358. /package/lib/{f-page → f-documentation/f-page}/f-markdown-footer/f-footer-navigation/f-footer-navigation-button/f-footer-navigation-button.component.d.ts +0 -0
  359. /package/lib/{f-page → f-documentation/f-page}/f-markdown-footer/f-footer-navigation/f-footer-navigation-button/index.d.ts +0 -0
  360. /package/lib/{f-page → f-documentation/f-page}/f-markdown-footer/f-footer-navigation/f-footer-navigation.component.d.ts +0 -0
  361. /package/lib/{f-page → f-documentation/f-page}/f-markdown-footer/f-footer-navigation/index.d.ts +0 -0
  362. /package/lib/{f-page → f-documentation/f-page}/f-markdown-footer/index.d.ts +0 -0
  363. /package/lib/{f-page → f-documentation/f-page}/f-page.component.d.ts +0 -0
  364. /package/lib/{f-page → f-documentation/f-page}/f-table-of-content/f-table-of-content-items/f-table-of-content-items.component.d.ts +0 -0
  365. /package/lib/{f-page → f-documentation/f-page}/f-table-of-content/f-table-of-content-items/index.d.ts +0 -0
  366. /package/lib/{f-page → f-documentation/f-page}/f-table-of-content/index.d.ts +0 -0
  367. /package/lib/{f-page → f-documentation/f-page}/index.d.ts +0 -0
  368. /package/lib/{f-scrollable-container → f-documentation/f-scrollable-container}/domain/calculate-hash-from-scroll-position/calculate-hash-from-scroll-position.handler.d.ts +0 -0
  369. /package/lib/{f-scrollable-container → f-documentation/f-scrollable-container}/domain/calculate-hash-from-scroll-position/calculate-hash-from-scroll-position.request.d.ts +0 -0
  370. /package/lib/{f-scrollable-container → f-documentation/f-scrollable-container}/domain/calculate-hash-from-scroll-position/index.d.ts +0 -0
  371. /package/lib/{f-scrollable-container → f-documentation/f-scrollable-container}/domain/get-absolute-top-to-container/get-absolute-top-to-container.handler.d.ts +0 -0
  372. /package/lib/{f-scrollable-container → f-documentation/f-scrollable-container}/domain/get-absolute-top-to-container/get-absolute-top-to-container.request.d.ts +0 -0
  373. /package/lib/{f-scrollable-container → f-documentation/f-scrollable-container}/domain/get-absolute-top-to-container/index.d.ts +0 -0
  374. /package/lib/{f-scrollable-container → f-documentation/f-scrollable-container}/domain/get-table-of-content-data/get-table-of-content-data.handler.d.ts +0 -0
  375. /package/lib/{f-scrollable-container → f-documentation/f-scrollable-container}/domain/get-table-of-content-data/get-table-of-content-data.request.d.ts +0 -0
  376. /package/lib/{f-scrollable-container → f-documentation/f-scrollable-container}/domain/get-table-of-content-data/index.d.ts +0 -0
  377. /package/lib/{f-scrollable-container → f-documentation/f-scrollable-container}/domain/i-table-of-content-item.d.ts +0 -0
  378. /package/lib/{f-scrollable-container → f-documentation/f-scrollable-container}/domain/index.d.ts +0 -0
  379. /package/lib/{f-scrollable-container → f-documentation/f-scrollable-container}/domain/scroll-to-element-in-container.d.ts +0 -0
  380. /package/lib/{f-scrollable-container → f-documentation/f-scrollable-container}/domain/table-of-content-data.d.ts +0 -0
  381. /package/lib/{f-scrollable-container → f-documentation/f-scrollable-container}/f-scrollable-container.component.d.ts +0 -0
  382. /package/lib/{f-scrollable-container → f-documentation/f-scrollable-container}/index.d.ts +0 -0
  383. /package/lib/{domain → f-documentation}/router.d.ts +0 -0
@@ -1,12 +1,12 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, Injectable, Inject, Optional, InjectionToken, Component, ChangeDetectionStrategy, Input, EventEmitter, booleanAttribute, Output, ViewChild, HostListener, signal, ViewChildren, ViewContainerRef, ElementRef } from '@angular/core';
2
+ import { EventEmitter, booleanAttribute, Component, ChangeDetectionStrategy, Input, Output, ViewChild, HostListener, inject, Injectable, Inject, signal, InjectionToken, Optional, ViewChildren, ViewContainerRef, ElementRef, Injector } from '@angular/core';
3
3
  import * as i2 from '@foblex/platform';
4
4
  import { F_LOCAL_STORAGE } from '@foblex/platform';
5
- import { DOCUMENT, ɵgetDOM as _getDOM, AsyncPipe, NgOptimizedImage, JsonPipe } from '@angular/common';
6
- import { of, map, startWith, filter, BehaviorSubject, Subject, Subscription, fromEvent, debounceTime, from, switchMap, Observable } from 'rxjs';
7
- import { catchError, filter as filter$1, take, tap } from 'rxjs/operators';
5
+ import { DOCUMENT, ɵgetDOM as _getDOM, NgOptimizedImage, AsyncPipe, JsonPipe } from '@angular/common';
8
6
  import * as i1 from '@angular/router';
9
- import { NavigationEnd, RouterLink, RouterOutlet, Router, ActivatedRoute } from '@angular/router';
7
+ import { NavigationEnd, RouterLink, Router, ActivatedRoute, RouterOutlet } from '@angular/router';
8
+ import { startWith, filter, BehaviorSubject, of, map, Subscription, from, switchMap, Observable, fromEvent, Subject, debounceTime } from 'rxjs';
9
+ import { catchError, filter as filter$1, take, tap } from 'rxjs/operators';
10
10
  import * as i1$1 from '@angular/common/http';
11
11
  import { HttpClient } from '@angular/common/http';
12
12
  import { deepClone } from '@foblex/utils';
@@ -14,6 +14,77 @@ import container from 'markdown-it-container';
14
14
  import MarkdownIt from 'markdown-it';
15
15
  import * as i2$1 from '@angular/platform-browser';
16
16
 
17
+ let uniqueId = 0;
18
+ class FCheckboxComponent {
19
+ changeDetectorRef;
20
+ id = `f-checkbox-${uniqueId++}`;
21
+ change = new EventEmitter();
22
+ inputElement;
23
+ labelElement;
24
+ get checked() {
25
+ return this.isChecked;
26
+ }
27
+ set checked(value) {
28
+ if (value != this.checked) {
29
+ this.isChecked = value;
30
+ this.changeDetectorRef.markForCheck();
31
+ }
32
+ }
33
+ isChecked = false;
34
+ constructor(changeDetectorRef) {
35
+ this.changeDetectorRef = changeDetectorRef;
36
+ }
37
+ onInputClick() {
38
+ this.handleInputClick();
39
+ }
40
+ onTouchTargetClick() {
41
+ this.handleInputClick();
42
+ this.inputElement?.nativeElement.focus();
43
+ }
44
+ handleInputClick() {
45
+ this.isChecked = !this.isChecked;
46
+ this.emitChangeEvent();
47
+ }
48
+ emitChangeEvent() {
49
+ this.change.emit(this.isChecked);
50
+ if (this.inputElement) {
51
+ this.inputElement.nativeElement.checked = this.isChecked;
52
+ }
53
+ }
54
+ onInteractionEvent(event) {
55
+ event.stopPropagation();
56
+ }
57
+ preventBubblingFromLabel(event) {
58
+ if (!!event.target && this.labelElement?.nativeElement.contains(event.target)) {
59
+ event.stopPropagation();
60
+ }
61
+ }
62
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FCheckboxComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
63
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.2.13", type: FCheckboxComponent, isStandalone: true, selector: "f-checkbox", inputs: { id: "id", checked: ["checked", "checked", booleanAttribute] }, outputs: { change: "change" }, host: { listeners: { "click": "preventBubblingFromLabel($event)" }, properties: { "class.f-checkbox-checked": "checked" } }, viewQueries: [{ propertyName: "inputElement", first: true, predicate: ["input"], descendants: true }, { propertyName: "labelElement", first: true, predicate: ["label"], descendants: true }], ngImport: i0, template: "<input #input\n [id]=\"id\"\n type=\"checkbox\"\n [checked]=\"checked\"\n (click)=\"onInputClick()\"\n (change)=\"onInteractionEvent($event)\"/>\n<div class=\"f-checkbox-container\" (click)=\"onTouchTargetClick()\">\n <svg class=\"f-checkbox-checkmark\" focusable=\"false\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path class=\"f-checkbox-checkmark-path\" fill=\"none\" d=\"M1.73,12.91 8.1,19.28 22.79,4.59\"/>\n </svg>\n</div>\n<label [for]=\"id\" #label>\n <ng-content></ng-content>\n</label>\n", styles: [":host{position:relative;display:flex;align-items:center;font-weight:400;white-space:nowrap;font-size:14px;cursor:pointer;background-color:var(--checkbox-container-background);border-radius:var(--checkbox-border-radius);padding:0 8px;color:var(--checkbox-text);transition:color .25s,background-color .25s}:host input{position:absolute;inset:0;opacity:0;cursor:pointer}:host .f-checkbox-container{position:relative;display:flex;align-items:center;justify-content:center;width:var(--checkbox-size);height:var(--checkbox-size);margin-right:6px;border-radius:var(--checkbox-border-radius);background-color:var(--checkbox-background);padding:2px}:host .f-checkbox-container .f-checkbox-checkmark{position:absolute;top:calc(var(--checkbox-size) / 8);right:calc(var(--checkbox-size) / 8);bottom:calc(var(--checkbox-size) / 8);left:calc(var(--checkbox-size) / 8);opacity:0}:host .f-checkbox-container .f-checkbox-checkmark .f-checkbox-checkmark-path{stroke:currentColor;stroke-width:3}:host label{-webkit-user-select:none;user-select:none}:host.f-checkbox-checked .f-checkbox-container{background-color:var(--checkbox-checked-background)}:host.f-checkbox-checked .f-checkbox-container .f-checkbox-checkmark{color:var(--checkbox-checkmark-color);opacity:1}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
64
+ }
65
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FCheckboxComponent, decorators: [{
66
+ type: Component,
67
+ args: [{ selector: 'f-checkbox', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, host: {
68
+ '[class.f-checkbox-checked]': 'checked',
69
+ }, template: "<input #input\n [id]=\"id\"\n type=\"checkbox\"\n [checked]=\"checked\"\n (click)=\"onInputClick()\"\n (change)=\"onInteractionEvent($event)\"/>\n<div class=\"f-checkbox-container\" (click)=\"onTouchTargetClick()\">\n <svg class=\"f-checkbox-checkmark\" focusable=\"false\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path class=\"f-checkbox-checkmark-path\" fill=\"none\" d=\"M1.73,12.91 8.1,19.28 22.79,4.59\"/>\n </svg>\n</div>\n<label [for]=\"id\" #label>\n <ng-content></ng-content>\n</label>\n", styles: [":host{position:relative;display:flex;align-items:center;font-weight:400;white-space:nowrap;font-size:14px;cursor:pointer;background-color:var(--checkbox-container-background);border-radius:var(--checkbox-border-radius);padding:0 8px;color:var(--checkbox-text);transition:color .25s,background-color .25s}:host input{position:absolute;inset:0;opacity:0;cursor:pointer}:host .f-checkbox-container{position:relative;display:flex;align-items:center;justify-content:center;width:var(--checkbox-size);height:var(--checkbox-size);margin-right:6px;border-radius:var(--checkbox-border-radius);background-color:var(--checkbox-background);padding:2px}:host .f-checkbox-container .f-checkbox-checkmark{position:absolute;top:calc(var(--checkbox-size) / 8);right:calc(var(--checkbox-size) / 8);bottom:calc(var(--checkbox-size) / 8);left:calc(var(--checkbox-size) / 8);opacity:0}:host .f-checkbox-container .f-checkbox-checkmark .f-checkbox-checkmark-path{stroke:currentColor;stroke-width:3}:host label{-webkit-user-select:none;user-select:none}:host.f-checkbox-checked .f-checkbox-container{background-color:var(--checkbox-checked-background)}:host.f-checkbox-checked .f-checkbox-container .f-checkbox-checkmark{color:var(--checkbox-checkmark-color);opacity:1}\n"] }]
70
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { id: [{
71
+ type: Input
72
+ }], change: [{
73
+ type: Output
74
+ }], inputElement: [{
75
+ type: ViewChild,
76
+ args: ['input']
77
+ }], labelElement: [{
78
+ type: ViewChild,
79
+ args: ['label']
80
+ }], checked: [{
81
+ type: Input,
82
+ args: [{ transform: booleanAttribute }]
83
+ }], preventBubblingFromLabel: [{
84
+ type: HostListener,
85
+ args: ['click', ['$event']]
86
+ }] } });
87
+
17
88
  const F_ACCEPT_COOKIES_KEY = 'm-render-accepts-cookies';
18
89
 
19
90
  const setCookieConsent = (state) => {
@@ -49,10 +120,8 @@ const setCookieConsent = (state) => {
49
120
  };
50
121
 
51
122
  class FAnalyticsService {
52
- constructor() {
53
- this.fLocalStorage = inject(F_LOCAL_STORAGE);
54
- this.document = inject(DOCUMENT);
55
- }
123
+ fLocalStorage = inject(F_LOCAL_STORAGE);
124
+ document = inject(DOCUMENT);
56
125
  initialize(analyticsId) {
57
126
  this.installGlobalSiteTag(analyticsId);
58
127
  }
@@ -86,15 +155,17 @@ class FAnalyticsService {
86
155
  gtmScript.id = 'gtag-script';
87
156
  return gtmScript;
88
157
  }
89
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FAnalyticsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
90
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FAnalyticsService, providedIn: 'root' }); }
158
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FAnalyticsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
159
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FAnalyticsService, providedIn: 'root' });
91
160
  }
92
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FAnalyticsService, decorators: [{
161
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FAnalyticsService, decorators: [{
93
162
  type: Injectable,
94
163
  args: [{ providedIn: 'root' }]
95
164
  }] });
96
165
 
97
166
  class FJsonLdService {
167
+ _document;
168
+ _dom;
98
169
  constructor(_document) {
99
170
  this._document = _document;
100
171
  this._dom = _getDOM();
@@ -131,10 +202,10 @@ class FJsonLdService {
131
202
  head.appendChild(element);
132
203
  return element;
133
204
  }
134
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FJsonLdService, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
135
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FJsonLdService, providedIn: 'root' }); }
205
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FJsonLdService, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable });
206
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FJsonLdService, providedIn: 'root' });
136
207
  }
137
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FJsonLdService, decorators: [{
208
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FJsonLdService, decorators: [{
138
209
  type: Injectable,
139
210
  args: [{ providedIn: 'root' }]
140
211
  }], ctorParameters: () => [{ type: undefined, decorators: [{
@@ -143,6 +214,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
143
214
  }] }] });
144
215
 
145
216
  class FHeadTagService {
217
+ _document;
218
+ _dom;
146
219
  constructor(_document) {
147
220
  this._document = _document;
148
221
  this._dom = _getDOM();
@@ -180,10 +253,10 @@ class FHeadTagService {
180
253
  head.appendChild(element);
181
254
  return element;
182
255
  }
183
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FHeadTagService, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
184
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FHeadTagService, providedIn: 'root' }); }
256
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FHeadTagService, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable });
257
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FHeadTagService, providedIn: 'root' });
185
258
  }
186
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FHeadTagService, decorators: [{
259
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FHeadTagService, decorators: [{
187
260
  type: Injectable,
188
261
  args: [{ providedIn: 'root' }]
189
262
  }], ctorParameters: () => [{ type: undefined, decorators: [{
@@ -191,13 +264,154 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
191
264
  args: [DOCUMENT]
192
265
  }] }] });
193
266
 
267
+ class FMetaService {
268
+ router;
269
+ fHeadTag;
270
+ fBrowser;
271
+ navigation = [];
272
+ constructor(router, fHeadTag, fBrowser) {
273
+ this.router = router;
274
+ this.fHeadTag = fHeadTag;
275
+ this.fBrowser = fBrowser;
276
+ }
277
+ subscribeOnRouteChanges(defaultData, environments) {
278
+ this.navigation = environments.reduce((result, e) => result.concat(...e.navigation), []);
279
+ return this.router.events.pipe(startWith(new NavigationEnd(1, '', '')), filter(event => event instanceof NavigationEnd)).subscribe((x) => {
280
+ let data = {
281
+ ...defaultData,
282
+ };
283
+ const item = this.findDocItemByUrl(this.findDocGroupByUrl(this.router.url), this.router.url);
284
+ if (item) {
285
+ data.title = `${item.text} - ${defaultData.app_name}`;
286
+ data.url = this.fBrowser.window.location.href;
287
+ data.description = item.description || defaultData.description;
288
+ data.image = item.image || defaultData.image;
289
+ data.image_width = item.image_width || defaultData.image_width;
290
+ data.image_height = item.image_height || defaultData.image_height;
291
+ data.image_type = item.image_type || defaultData.image_type;
292
+ }
293
+ if (!data.url) {
294
+ data.url = this.fBrowser.window.location.origin + this.router.url;
295
+ }
296
+ if (!data.image.startsWith('http') && !data.image.startsWith('www')) {
297
+ if (data.image.startsWith('.')) {
298
+ data.image = this.fBrowser.window.location.origin + data.image.slice(1);
299
+ }
300
+ else {
301
+ data.image = this.fBrowser.window.location.origin + data.image;
302
+ }
303
+ }
304
+ if (!data.url.endsWith('/')) {
305
+ data.url += '/';
306
+ }
307
+ this.updateMetaTags(data);
308
+ });
309
+ }
310
+ findDocGroupByUrl(url) {
311
+ return this.navigation.find((g) => g.items.find((i) => url.endsWith(i.link)));
312
+ }
313
+ findDocItemByUrl(group, url) {
314
+ return (group?.items || []).find((i) => url.endsWith(i.link));
315
+ }
316
+ updateMetaTags(item) {
317
+ this.fHeadTag.setTitle(item.title);
318
+ this.fHeadTag.setDescription(item.description);
319
+ this.fHeadTag.setCanonical(item.url);
320
+ this.fHeadTag.updateTag({ property: 'og:url', content: item.url });
321
+ this.fHeadTag.updateTag({ property: 'og:type', content: item.type });
322
+ this.fHeadTag.updateTag({ property: 'og:title', content: item.title });
323
+ this.fHeadTag.updateTag({ property: 'og:site_name', content: item.title });
324
+ this.fHeadTag.updateTag({ property: 'og:locale', content: item.locale });
325
+ this.fHeadTag.updateTag({ property: 'og:description', content: item.description });
326
+ this.fHeadTag.updateTag({ property: 'og:image', content: item.image });
327
+ this.fHeadTag.updateTag({ property: 'og:image:secure_url', content: item.image });
328
+ this.fHeadTag.updateTag({ property: 'og:image:type', content: item.image_type });
329
+ this.fHeadTag.updateTag({ property: 'og:image:width', content: item.image_width.toString() });
330
+ this.fHeadTag.updateTag({ property: 'og:image:height', content: item.image_height.toString() });
331
+ }
332
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FMetaService, deps: [{ token: i1.Router }, { token: FHeadTagService }, { token: i2.BrowserService }], target: i0.ɵɵFactoryTarget.Injectable });
333
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FMetaService, providedIn: 'root' });
334
+ }
335
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FMetaService, decorators: [{
336
+ type: Injectable,
337
+ args: [{ providedIn: 'root' }]
338
+ }], ctorParameters: () => [{ type: i1.Router }, { type: FHeadTagService }, { type: i2.BrowserService }] });
339
+
340
+ class FPopoverService {
341
+ popover = new BehaviorSubject(null);
342
+ get popover$() {
343
+ return this.popover.asObservable();
344
+ }
345
+ show(message) {
346
+ this.popover.next(message);
347
+ setTimeout(() => this.popover.next(null), 2000);
348
+ }
349
+ dispose() {
350
+ this.popover.next(null);
351
+ this.popover.complete();
352
+ }
353
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FPopoverService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
354
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FPopoverService });
355
+ }
356
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FPopoverService, decorators: [{
357
+ type: Injectable
358
+ }] });
359
+
360
+ class CookiePopup {
361
+ fLocalStorage = inject(F_LOCAL_STORAGE);
362
+ hasAccepted = signal(false);
363
+ constructor() {
364
+ try {
365
+ this.hasAccepted.set(this.fLocalStorage?.getItem(F_ACCEPT_COOKIES_KEY) === 'true');
366
+ }
367
+ catch {
368
+ this.hasAccepted.set(false);
369
+ }
370
+ }
371
+ accept() {
372
+ try {
373
+ this.fLocalStorage?.setItem(F_ACCEPT_COOKIES_KEY, 'true');
374
+ }
375
+ catch {
376
+ }
377
+ this.hasAccepted.set(true);
378
+ setCookieConsent('granted');
379
+ }
380
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CookiePopup, deps: [], target: i0.ɵɵFactoryTarget.Component });
381
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: CookiePopup, isStandalone: true, selector: "f-cookie-popup", ngImport: i0, template: "@if (!hasAccepted()) {\n <div class=\"docs-cookies-popup docs-invert-mode\">\n <p>This site uses cookies from Google to deliver its services and to analyze traffic.</p>\n\n <div>\n <a href=\"https://policies.google.com/technologies/cookies\" target=\"_blank\" rel=\"noopener\">\n <button class=\"f-button\" [attr.text]=\"'Learn more'\" aria-label=\"Learn More\">\n Learn more\n </button>\n </a>\n <button\n (click)=\"accept()\"\n class=\"f-button\"\n [attr.text]=\"'Ok, Got it'\"\n aria-label=\"Ok, Got it\">\n Ok, Got it\n </button>\n </div>\n </div>\n}\n", styles: [":host{position:fixed;bottom:16px;right:16px;z-index:99999;opacity:0;visibility:hidden;animation:1s linear forwards .5s fadeIn}.docs-cookies-popup{padding:1rem;background-color:var(--background-color);border:1px solid var(--divider-color);color:var(--primary-text);border-radius:var(--border-radius);font-size:14px;max-width:310px;transition:background-color .3s ease,border-color .3s ease,color .3s ease;box-shadow:var(--shadow-3)}.docs-cookies-popup>div{display:flex;gap:8px;align-items:center;width:100%;margin-block-start:1rem}.f-button{outline:none;border:none;height:unset;line-height:26px;font-size:14px;font-weight:500;border-radius:var(--border-radius)}@keyframes fadeIn{to{opacity:100%;visibility:visible}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
382
+ }
383
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CookiePopup, decorators: [{
384
+ type: Component,
385
+ args: [{ selector: 'f-cookie-popup', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (!hasAccepted()) {\n <div class=\"docs-cookies-popup docs-invert-mode\">\n <p>This site uses cookies from Google to deliver its services and to analyze traffic.</p>\n\n <div>\n <a href=\"https://policies.google.com/technologies/cookies\" target=\"_blank\" rel=\"noopener\">\n <button class=\"f-button\" [attr.text]=\"'Learn more'\" aria-label=\"Learn More\">\n Learn more\n </button>\n </a>\n <button\n (click)=\"accept()\"\n class=\"f-button\"\n [attr.text]=\"'Ok, Got it'\"\n aria-label=\"Ok, Got it\">\n Ok, Got it\n </button>\n </div>\n </div>\n}\n", styles: [":host{position:fixed;bottom:16px;right:16px;z-index:99999;opacity:0;visibility:hidden;animation:1s linear forwards .5s fadeIn}.docs-cookies-popup{padding:1rem;background-color:var(--background-color);border:1px solid var(--divider-color);color:var(--primary-text);border-radius:var(--border-radius);font-size:14px;max-width:310px;transition:background-color .3s ease,border-color .3s ease,color .3s ease;box-shadow:var(--shadow-3)}.docs-cookies-popup>div{display:flex;gap:8px;align-items:center;width:100%;margin-block-start:1rem}.f-button{outline:none;border:none;height:unset;line-height:26px;font-size:14px;font-weight:500;border-radius:var(--border-radius)}@keyframes fadeIn{to{opacity:100%;visibility:visible}}\n"] }]
386
+ }], ctorParameters: () => [] });
387
+
388
+ class FBadgeComponent {
389
+ text = '';
390
+ type = 'tip';
391
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FBadgeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
392
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FBadgeComponent, isStandalone: true, selector: "span[f-badge]", inputs: { text: "text", type: "type" }, host: { properties: { "class": "type" }, classAttribute: "f-badge" }, ngImport: i0, template: "{{ text }}\n", changeDetection: i0.ChangeDetectionStrategy.OnPush });
393
+ }
394
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FBadgeComponent, decorators: [{
395
+ type: Component,
396
+ args: [{ selector: 'span[f-badge]', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, host: {
397
+ 'class': 'f-badge',
398
+ '[class]': 'type',
399
+ }, template: "{{ text }}\n" }]
400
+ }], propDecorators: { text: [{
401
+ type: Input
402
+ }], type: [{
403
+ type: Input
404
+ }] } });
405
+
194
406
  class GetVersionRequest {
407
+ version;
195
408
  constructor(version) {
196
409
  this.version = version;
197
410
  }
198
411
  }
199
412
 
200
413
  class GetVersionHandler {
414
+ http;
201
415
  constructor(http) {
202
416
  this.http = http;
203
417
  }
@@ -223,6 +437,8 @@ class GetVersionHandler {
223
437
  }
224
438
 
225
439
  class HandleNavigationLinksHandler {
440
+ router;
441
+ fBrowser;
226
442
  constructor(router, fBrowser) {
227
443
  this.router = router;
228
444
  this.fBrowser = fBrowser;
@@ -262,20 +478,25 @@ class HandleNavigationLinksHandler {
262
478
  openExternalLink(href) {
263
479
  this.fBrowser.window.open(href, '_blank');
264
480
  }
265
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HandleNavigationLinksHandler, deps: [{ token: i1.Router }, { token: i2.BrowserService }], target: i0.ɵɵFactoryTarget.Injectable }); }
266
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HandleNavigationLinksHandler }); }
481
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HandleNavigationLinksHandler, deps: [{ token: i1.Router }, { token: i2.BrowserService }], target: i0.ɵɵFactoryTarget.Injectable });
482
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HandleNavigationLinksHandler });
267
483
  }
268
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HandleNavigationLinksHandler, decorators: [{
484
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HandleNavigationLinksHandler, decorators: [{
269
485
  type: Injectable
270
486
  }], ctorParameters: () => [{ type: i1.Router }, { type: i2.BrowserService }] });
271
487
 
272
488
  class HandleNavigationLinksRequest {
489
+ event;
273
490
  constructor(event) {
274
491
  this.event = event;
275
492
  }
276
493
  }
277
494
 
278
- class FEnvironmentService {
495
+ const INTERNAL_ENVIRONMENT_SERVICE = new InjectionToken('INTERNAL_ENVIRONMENT_SERVICE');
496
+
497
+ class FDocumentationEnvironmentService {
498
+ environment;
499
+ http;
279
500
  constructor(environment, http) {
280
501
  this.environment = environment;
281
502
  this.http = http;
@@ -325,900 +546,179 @@ class FEnvironmentService {
325
546
  range: { start: 2, end: 6 },
326
547
  };
327
548
  }
328
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FEnvironmentService, deps: [{ token: F_ENVIRONMENT, optional: true }, { token: i1$1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
329
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FEnvironmentService }); }
549
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FDocumentationEnvironmentService, deps: [{ token: F_DOCS_ENVIRONMENT, optional: true }, { token: i1$1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
550
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FDocumentationEnvironmentService });
330
551
  }
331
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FEnvironmentService, decorators: [{
552
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FDocumentationEnvironmentService, decorators: [{
332
553
  type: Injectable
333
554
  }], ctorParameters: () => [{ type: undefined, decorators: [{
334
555
  type: Optional
335
556
  }, {
336
557
  type: Inject,
337
- args: [F_ENVIRONMENT]
558
+ args: [F_DOCS_ENVIRONMENT]
338
559
  }] }, { type: i1$1.HttpClient }] });
339
560
 
340
- class FMetaService {
341
- constructor(router, fHeadTag, fBrowser) {
342
- this.router = router;
343
- this.fHeadTag = fHeadTag;
344
- this.fBrowser = fBrowser;
345
- this.navigation = [];
346
- }
347
- subscribeOnRouteChanges(defaultData, environments) {
348
- this.navigation = environments.reduce((result, e) => result.concat(...e.navigation), []);
349
- return this.router.events.pipe(startWith(new NavigationEnd(1, '', '')), filter(event => event instanceof NavigationEnd)).subscribe((x) => {
350
- let data = {
351
- ...defaultData,
352
- };
353
- const item = this.findDocItemByUrl(this.findDocGroupByUrl(this.router.url), this.router.url);
354
- if (item) {
355
- data.title = `${item.text} - ${defaultData.app_name}`;
356
- data.url = this.fBrowser.window.location.href;
357
- data.description = item.description || defaultData.description;
358
- data.image = item.image || defaultData.image;
359
- data.image_width = item.image_width || defaultData.image_width;
360
- data.image_height = item.image_height || defaultData.image_height;
361
- data.image_type = item.image_type || defaultData.image_type;
362
- }
363
- if (!data.url) {
364
- data.url = this.fBrowser.window.location.origin + this.router.url;
365
- }
366
- if (!data.image.startsWith('http') && !data.image.startsWith('www')) {
367
- if (data.image.startsWith('.')) {
368
- data.image = this.fBrowser.window.location.origin + data.image.slice(1);
369
- }
370
- else {
371
- data.image = this.fBrowser.window.location.origin + data.image;
372
- }
373
- }
374
- if (!data.url.endsWith('/')) {
375
- data.url += '/';
376
- }
377
- this.updateMetaTags(data);
378
- });
561
+ class FHeaderComponent {
562
+ title = inject(FDocumentationEnvironmentService).getTitle();
563
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
564
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FHeaderComponent, isStandalone: true, selector: "f-header", ngImport: i0, template: "<button f-hamburger-button></button>\n<div class=\"title text-ellipsis\">{{ title }}</div>\n<div class=\"flex-space\"></div>\n<f-header-menu></f-header-menu>\n<f-version></f-version>\n<div class=\"divider\"></div>\n<button f-theme-button></button>\n<div class=\"divider\"></div>\n<f-social-links></f-social-links>\n\n", styles: [":host{position:sticky;width:100%;top:0;display:flex;justify-content:flex-start;align-items:center;padding:20px 32px;font-weight:600;color:var(--primary-text);height:calc(var(--header-height) + 1px);background-color:var(--background-color);border-bottom:1px solid var(--divider-color);z-index:var(--z-index-header)}@media (min-width: 1280px){:host{padding-right:max(var(--page-padding),(100vw - var(--layout-max-width)) / 3);padding-left:max(var(--page-padding),(100vw - var(--layout-max-width)) / 4)}}.title{display:none;justify-content:flex-start;align-items:center;padding:20px 0;font-weight:600;color:var(--primary-text);height:var(--header-height)}@media (min-width: 460px){.title{display:block}}@media (min-width: 960px){.title{display:none}}.divider{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--divider-color);content:\"\"}\n"], dependencies: [{ kind: "component", type: FHamburgerButtonComponent, selector: "button[f-hamburger-button]" }, { kind: "component", type: FVersionComponent, selector: "f-version" }, { kind: "component", type: FSocialLinksComponent, selector: "f-social-links" }, { kind: "component", type: FThemeButtonComponent, selector: "button[f-theme-button]" }, { kind: "component", type: FHeaderMenuComponent, selector: "f-header-menu" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
565
+ }
566
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FHeaderComponent, decorators: [{
567
+ type: Component,
568
+ args: [{ selector: 'f-header', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
569
+ NgOptimizedImage,
570
+ FHamburgerButtonComponent,
571
+ FVersionComponent,
572
+ FSocialLinksComponent,
573
+ FThemeButtonComponent,
574
+ FHeaderMenuComponent
575
+ ], template: "<button f-hamburger-button></button>\n<div class=\"title text-ellipsis\">{{ title }}</div>\n<div class=\"flex-space\"></div>\n<f-header-menu></f-header-menu>\n<f-version></f-version>\n<div class=\"divider\"></div>\n<button f-theme-button></button>\n<div class=\"divider\"></div>\n<f-social-links></f-social-links>\n\n", styles: [":host{position:sticky;width:100%;top:0;display:flex;justify-content:flex-start;align-items:center;padding:20px 32px;font-weight:600;color:var(--primary-text);height:calc(var(--header-height) + 1px);background-color:var(--background-color);border-bottom:1px solid var(--divider-color);z-index:var(--z-index-header)}@media (min-width: 1280px){:host{padding-right:max(var(--page-padding),(100vw - var(--layout-max-width)) / 3);padding-left:max(var(--page-padding),(100vw - var(--layout-max-width)) / 4)}}.title{display:none;justify-content:flex-start;align-items:center;padding:20px 0;font-weight:600;color:var(--primary-text);height:var(--header-height)}@media (min-width: 460px){.title{display:block}}@media (min-width: 960px){.title{display:none}}.divider{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--divider-color);content:\"\"}\n"] }]
576
+ }] });
577
+
578
+ class FNavigationGroupComponent {
579
+ title;
580
+ isCollapsed = false;
581
+ toggle() {
582
+ this.isCollapsed = !this.isCollapsed;
379
583
  }
380
- findDocGroupByUrl(url) {
381
- return this.navigation.find((g) => g.items.find((i) => url.endsWith(i.link)));
382
- }
383
- findDocItemByUrl(group, url) {
384
- return (group?.items || []).find((i) => url.endsWith(i.link));
385
- }
386
- updateMetaTags(item) {
387
- this.fHeadTag.setTitle(item.title);
388
- this.fHeadTag.setDescription(item.description);
389
- this.fHeadTag.setCanonical(item.url);
390
- this.fHeadTag.updateTag({ property: 'og:url', content: item.url });
391
- this.fHeadTag.updateTag({ property: 'og:type', content: item.type });
392
- this.fHeadTag.updateTag({ property: 'og:title', content: item.title });
393
- this.fHeadTag.updateTag({ property: 'og:site_name', content: item.title });
394
- this.fHeadTag.updateTag({ property: 'og:locale', content: item.locale });
395
- this.fHeadTag.updateTag({ property: 'og:description', content: item.description });
396
- this.fHeadTag.updateTag({ property: 'og:image', content: item.image });
397
- this.fHeadTag.updateTag({ property: 'og:image:secure_url', content: item.image });
398
- this.fHeadTag.updateTag({ property: 'og:image:type', content: item.image_type });
399
- this.fHeadTag.updateTag({ property: 'og:image:width', content: item.image_width.toString() });
400
- this.fHeadTag.updateTag({ property: 'og:image:height', content: item.image_height.toString() });
401
- }
402
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FMetaService, deps: [{ token: i1.Router }, { token: FHeadTagService }, { token: i2.BrowserService }], target: i0.ɵɵFactoryTarget.Injectable }); }
403
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FMetaService, providedIn: 'root' }); }
404
- }
405
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FMetaService, decorators: [{
406
- type: Injectable,
407
- args: [{ providedIn: 'root' }]
408
- }], ctorParameters: () => [{ type: i1.Router }, { type: FHeadTagService }, { type: i2.BrowserService }] });
409
-
410
- class FPopoverService {
411
- constructor() {
412
- this.popover = new BehaviorSubject(null);
413
- }
414
- get popover$() {
415
- return this.popover.asObservable();
416
- }
417
- show(message) {
418
- this.popover.next(message);
419
- setTimeout(() => this.popover.next(null), 2000);
420
- }
421
- dispose() {
422
- this.popover.next(null);
423
- this.popover.complete();
424
- }
425
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FPopoverService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
426
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FPopoverService }); }
427
- }
428
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FPopoverService, decorators: [{
429
- type: Injectable
430
- }] });
431
-
432
- const F_ENVIRONMENT = new InjectionToken('F_ENVIRONMENT');
433
-
434
- const F_DOCUMENTATION_ROUTES = [
435
- {
436
- path: '',
437
- loadComponent: () => Promise.resolve().then(function () { return index$1; }).then(m => m.FDocumentationComponent),
438
- children: [
439
- {
440
- path: '**',
441
- loadComponent: () => Promise.resolve().then(function () { return index; }).then(m => m.FPageComponent)
442
- }
443
- ]
444
- }
445
- ];
446
-
447
- class FBadgeComponent {
448
- constructor() {
449
- this.text = '';
450
- this.type = 'tip';
451
- }
452
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FBadgeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
453
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FBadgeComponent, isStandalone: true, selector: "span[f-badge]", inputs: { text: "text", type: "type" }, host: { properties: { "class": "type" }, classAttribute: "f-badge" }, ngImport: i0, template: "{{ text }}\n", changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
454
- }
455
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FBadgeComponent, decorators: [{
456
- type: Component,
457
- args: [{ selector: 'span[f-badge]', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, host: {
458
- 'class': 'f-badge',
459
- '[class]': 'type',
460
- }, template: "{{ text }}\n" }]
461
- }], propDecorators: { text: [{
462
- type: Input
463
- }], type: [{
464
- type: Input
465
- }] } });
466
-
467
- let uniqueId = 0;
468
- class FCheckboxComponent {
469
- get checked() {
470
- return this.isChecked;
471
- }
472
- set checked(value) {
473
- if (value != this.checked) {
474
- this.isChecked = value;
475
- this.changeDetectorRef.markForCheck();
476
- }
477
- }
478
- constructor(changeDetectorRef) {
479
- this.changeDetectorRef = changeDetectorRef;
480
- this.id = `f-checkbox-${uniqueId++}`;
481
- this.change = new EventEmitter();
482
- this.isChecked = false;
483
- }
484
- onInputClick() {
485
- this.handleInputClick();
486
- }
487
- onTouchTargetClick() {
488
- this.handleInputClick();
489
- this.inputElement?.nativeElement.focus();
490
- }
491
- handleInputClick() {
492
- this.isChecked = !this.isChecked;
493
- this.emitChangeEvent();
494
- }
495
- emitChangeEvent() {
496
- this.change.emit(this.isChecked);
497
- if (this.inputElement) {
498
- this.inputElement.nativeElement.checked = this.isChecked;
499
- }
500
- }
501
- onInteractionEvent(event) {
502
- event.stopPropagation();
503
- }
504
- preventBubblingFromLabel(event) {
505
- if (!!event.target && this.labelElement?.nativeElement.contains(event.target)) {
506
- event.stopPropagation();
507
- }
508
- }
509
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FCheckboxComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
510
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "17.3.12", type: FCheckboxComponent, isStandalone: true, selector: "f-checkbox", inputs: { id: "id", checked: ["checked", "checked", booleanAttribute] }, outputs: { change: "change" }, host: { listeners: { "click": "preventBubblingFromLabel($event)" }, properties: { "class.f-checkbox-checked": "checked" } }, viewQueries: [{ propertyName: "inputElement", first: true, predicate: ["input"], descendants: true }, { propertyName: "labelElement", first: true, predicate: ["label"], descendants: true }], ngImport: i0, template: "<input #input\n [id]=\"id\"\n type=\"checkbox\"\n [checked]=\"checked\"\n (click)=\"onInputClick()\"\n (change)=\"onInteractionEvent($event)\"/>\n<div class=\"f-checkbox-container\" (click)=\"onTouchTargetClick()\">\n <svg class=\"f-checkbox-checkmark\" focusable=\"false\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path class=\"f-checkbox-checkmark-path\" fill=\"none\" d=\"M1.73,12.91 8.1,19.28 22.79,4.59\"/>\n </svg>\n</div>\n<label [for]=\"id\" #label>\n <ng-content></ng-content>\n</label>\n", styles: [":host{position:relative;display:flex;align-items:center;font-weight:400;white-space:nowrap;font-size:14px;cursor:pointer;background-color:var(--checkbox-container-background);border-radius:var(--checkbox-border-radius);padding:0 8px;color:var(--checkbox-text);transition:color .25s,background-color .25s}:host input{position:absolute;inset:0;opacity:0;cursor:pointer}:host .f-checkbox-container{position:relative;display:flex;align-items:center;justify-content:center;width:var(--checkbox-size);height:var(--checkbox-size);margin-right:6px;border-radius:var(--checkbox-border-radius);background-color:var(--checkbox-background);padding:2px}:host .f-checkbox-container .f-checkbox-checkmark{position:absolute;top:calc(var(--checkbox-size) / 8);right:calc(var(--checkbox-size) / 8);bottom:calc(var(--checkbox-size) / 8);left:calc(var(--checkbox-size) / 8);opacity:0}:host .f-checkbox-container .f-checkbox-checkmark .f-checkbox-checkmark-path{stroke:currentColor;stroke-width:3}:host label{-webkit-user-select:none;user-select:none}:host.f-checkbox-checked .f-checkbox-container{background-color:var(--checkbox-checked-background)}:host.f-checkbox-checked .f-checkbox-container .f-checkbox-checkmark{color:var(--checkbox-checkmark-color);opacity:1}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
511
- }
512
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FCheckboxComponent, decorators: [{
513
- type: Component,
514
- args: [{ selector: 'f-checkbox', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, host: {
515
- '[class.f-checkbox-checked]': 'checked',
516
- }, template: "<input #input\n [id]=\"id\"\n type=\"checkbox\"\n [checked]=\"checked\"\n (click)=\"onInputClick()\"\n (change)=\"onInteractionEvent($event)\"/>\n<div class=\"f-checkbox-container\" (click)=\"onTouchTargetClick()\">\n <svg class=\"f-checkbox-checkmark\" focusable=\"false\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path class=\"f-checkbox-checkmark-path\" fill=\"none\" d=\"M1.73,12.91 8.1,19.28 22.79,4.59\"/>\n </svg>\n</div>\n<label [for]=\"id\" #label>\n <ng-content></ng-content>\n</label>\n", styles: [":host{position:relative;display:flex;align-items:center;font-weight:400;white-space:nowrap;font-size:14px;cursor:pointer;background-color:var(--checkbox-container-background);border-radius:var(--checkbox-border-radius);padding:0 8px;color:var(--checkbox-text);transition:color .25s,background-color .25s}:host input{position:absolute;inset:0;opacity:0;cursor:pointer}:host .f-checkbox-container{position:relative;display:flex;align-items:center;justify-content:center;width:var(--checkbox-size);height:var(--checkbox-size);margin-right:6px;border-radius:var(--checkbox-border-radius);background-color:var(--checkbox-background);padding:2px}:host .f-checkbox-container .f-checkbox-checkmark{position:absolute;top:calc(var(--checkbox-size) / 8);right:calc(var(--checkbox-size) / 8);bottom:calc(var(--checkbox-size) / 8);left:calc(var(--checkbox-size) / 8);opacity:0}:host .f-checkbox-container .f-checkbox-checkmark .f-checkbox-checkmark-path{stroke:currentColor;stroke-width:3}:host label{-webkit-user-select:none;user-select:none}:host.f-checkbox-checked .f-checkbox-container{background-color:var(--checkbox-checked-background)}:host.f-checkbox-checked .f-checkbox-container .f-checkbox-checkmark{color:var(--checkbox-checkmark-color);opacity:1}\n"] }]
517
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { id: [{
518
- type: Input
519
- }], change: [{
520
- type: Output
521
- }], inputElement: [{
522
- type: ViewChild,
523
- args: ['input']
524
- }], labelElement: [{
525
- type: ViewChild,
526
- args: ['label']
527
- }], checked: [{
528
- type: Input,
529
- args: [{ transform: booleanAttribute }]
530
- }], preventBubblingFromLabel: [{
531
- type: HostListener,
532
- args: ['click', ['$event']]
533
- }] } });
534
-
535
- class CookiePopup {
536
- constructor() {
537
- this.fLocalStorage = inject(F_LOCAL_STORAGE);
538
- this.hasAccepted = signal(false);
539
- try {
540
- this.hasAccepted.set(this.fLocalStorage?.getItem(F_ACCEPT_COOKIES_KEY) === 'true');
541
- }
542
- catch {
543
- this.hasAccepted.set(false);
544
- }
545
- }
546
- accept() {
547
- try {
548
- this.fLocalStorage?.setItem(F_ACCEPT_COOKIES_KEY, 'true');
549
- }
550
- catch {
551
- }
552
- this.hasAccepted.set(true);
553
- setCookieConsent('granted');
554
- }
555
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CookiePopup, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
556
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: CookiePopup, isStandalone: true, selector: "f-cookie-popup", ngImport: i0, template: "@if (!hasAccepted()) {\n <div class=\"docs-cookies-popup docs-invert-mode\">\n <p>This site uses cookies from Google to deliver its services and to analyze traffic.</p>\n\n <div>\n <a href=\"https://policies.google.com/technologies/cookies\" target=\"_blank\" rel=\"noopener\">\n <button class=\"f-button\" [attr.text]=\"'Learn more'\" aria-label=\"Learn More\">\n Learn more\n </button>\n </a>\n <button\n (click)=\"accept()\"\n class=\"f-button\"\n [attr.text]=\"'Ok, Got it'\"\n aria-label=\"Ok, Got it\">\n Ok, Got it\n </button>\n </div>\n </div>\n}\n", styles: [":host{position:fixed;bottom:16px;right:16px;z-index:99999;opacity:0;visibility:hidden;animation:1s linear forwards .5s fadeIn}.docs-cookies-popup{padding:1rem;background-color:var(--background-color);border:1px solid var(--divider-color);color:var(--primary-text);border-radius:var(--border-radius);font-size:14px;max-width:310px;transition:background-color .3s ease,border-color .3s ease,color .3s ease;box-shadow:var(--shadow-3)}.docs-cookies-popup>div{display:flex;gap:8px;align-items:center;width:100%;margin-block-start:1rem}.f-button{outline:none;border:none;height:unset;line-height:26px;font-size:14px;font-weight:500;border-radius:var(--border-radius)}@keyframes fadeIn{to{opacity:100%;visibility:visible}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
557
- }
558
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CookiePopup, decorators: [{
559
- type: Component,
560
- args: [{ selector: 'f-cookie-popup', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (!hasAccepted()) {\n <div class=\"docs-cookies-popup docs-invert-mode\">\n <p>This site uses cookies from Google to deliver its services and to analyze traffic.</p>\n\n <div>\n <a href=\"https://policies.google.com/technologies/cookies\" target=\"_blank\" rel=\"noopener\">\n <button class=\"f-button\" [attr.text]=\"'Learn more'\" aria-label=\"Learn More\">\n Learn more\n </button>\n </a>\n <button\n (click)=\"accept()\"\n class=\"f-button\"\n [attr.text]=\"'Ok, Got it'\"\n aria-label=\"Ok, Got it\">\n Ok, Got it\n </button>\n </div>\n </div>\n}\n", styles: [":host{position:fixed;bottom:16px;right:16px;z-index:99999;opacity:0;visibility:hidden;animation:1s linear forwards .5s fadeIn}.docs-cookies-popup{padding:1rem;background-color:var(--background-color);border:1px solid var(--divider-color);color:var(--primary-text);border-radius:var(--border-radius);font-size:14px;max-width:310px;transition:background-color .3s ease,border-color .3s ease,color .3s ease;box-shadow:var(--shadow-3)}.docs-cookies-popup>div{display:flex;gap:8px;align-items:center;width:100%;margin-block-start:1rem}.f-button{outline:none;border:none;height:unset;line-height:26px;font-size:14px;font-weight:500;border-radius:var(--border-radius)}@keyframes fadeIn{to{opacity:100%;visibility:visible}}\n"] }]
561
- }], ctorParameters: () => [] });
562
-
563
- const F_DOCUMENTATION_COMPONENT = new InjectionToken('F_DOCUMENTATION_COMPONENT');
564
-
565
- class FHamburgerButtonComponent {
566
- constructor(fDocumentation) {
567
- this.fDocumentation = fDocumentation;
568
- }
569
- onShowNavigation() {
570
- this.fDocumentation.onToggleNavigation(true);
571
- }
572
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FHamburgerButtonComponent, deps: [{ token: F_DOCUMENTATION_COMPONENT }], target: i0.ɵɵFactoryTarget.Component }); }
573
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FHamburgerButtonComponent, isStandalone: true, selector: "button[f-hamburger-button]", host: { listeners: { "click": "onShowNavigation()" } }, ngImport: i0, template: "<span class=\"f-icon hamburger\"></span>\n\n", styles: [":host{background-color:transparent;border:0;display:flex;padding:0;margin-right:16px;color:var(--secondary-text);cursor:pointer}@media (min-width: 960px){:host{display:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
574
- }
575
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FHamburgerButtonComponent, decorators: [{
576
- type: Component,
577
- args: [{ selector: 'button[f-hamburger-button]', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<span class=\"f-icon hamburger\"></span>\n\n", styles: [":host{background-color:transparent;border:0;display:flex;padding:0;margin-right:16px;color:var(--secondary-text);cursor:pointer}@media (min-width: 960px){:host{display:none}}\n"] }]
578
- }], ctorParameters: () => [{ type: undefined, decorators: [{
579
- type: Inject,
580
- args: [F_DOCUMENTATION_COMPONENT]
581
- }] }], propDecorators: { onShowNavigation: [{
582
- type: HostListener,
583
- args: ['click']
584
- }] } });
585
-
586
- class FVersionComponent {
587
- constructor(fEnvironmentService) {
588
- this.fEnvironmentService = fEnvironmentService;
589
- this.version$ = this.fEnvironmentService.getVersion();
590
- }
591
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FVersionComponent, deps: [{ token: FEnvironmentService }], target: i0.ɵɵFactoryTarget.Component }); }
592
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: FVersionComponent, isStandalone: true, selector: "f-version", ngImport: i0, template: "@if (version$ | async;as version) {\n <span class=\"version\">v{{ version }}</span>\n}\n", styles: [".version{margin-left:8px;margin-right:8px;display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--primary-text)}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
593
- }
594
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FVersionComponent, decorators: [{
595
- type: Component,
596
- args: [{ selector: 'f-version', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
597
- AsyncPipe
598
- ], template: "@if (version$ | async;as version) {\n <span class=\"version\">v{{ version }}</span>\n}\n", styles: [".version{margin-left:8px;margin-right:8px;display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--primary-text)}\n"] }]
599
- }], ctorParameters: () => [{ type: FEnvironmentService }] });
600
-
601
- class FSocialLinksComponent {
602
- get links() {
603
- return this.fEnvironmentService.getSocialLinks();
604
- }
605
- constructor(fEnvironmentService) {
606
- this.fEnvironmentService = fEnvironmentService;
607
- }
608
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FSocialLinksComponent, deps: [{ token: FEnvironmentService }], target: i0.ɵɵFactoryTarget.Component }); }
609
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: FSocialLinksComponent, isStandalone: true, selector: "f-social-links", ngImport: i0, template: "@for (link of links; track link.link) {\n <a href=\"{{ link.link }}\" class=\"header-link\">\n <div class=\"f-icon {{ link.icon }}\"></div>\n </a>\n}\n", styles: [":host{display:flex;justify-content:flex-start;align-items:center}.header-link{width:36px;height:36px;padding:7.5px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
610
- }
611
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FSocialLinksComponent, decorators: [{
612
- type: Component,
613
- args: [{ selector: 'f-social-links', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "@for (link of links; track link.link) {\n <a href=\"{{ link.link }}\" class=\"header-link\">\n <div class=\"f-icon {{ link.icon }}\"></div>\n </a>\n}\n", styles: [":host{display:flex;justify-content:flex-start;align-items:center}.header-link{width:36px;height:36px;padding:7.5px}\n"] }]
614
- }], ctorParameters: () => [{ type: FEnvironmentService }] });
615
-
616
- class FStateService {
617
- constructor(fBrowser) {
618
- this.fBrowser = fBrowser;
619
- this.theme = new Subject();
620
- }
621
- get theme$() {
622
- return this.theme.asObservable();
623
- }
624
- updateTheme() {
625
- this.theme.next();
626
- }
627
- getPreferredTheme() {
628
- return this.fBrowser.localStorage.getItem('preferred-theme')
629
- || (this.fBrowser.window.isMediaQuery('(prefers-color-scheme: dark)') ? 'dark' : 'light');
630
- }
631
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FStateService, deps: [{ token: i2.BrowserService }], target: i0.ɵɵFactoryTarget.Injectable }); }
632
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FStateService, providedIn: 'root' }); }
633
- }
634
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FStateService, decorators: [{
635
- type: Injectable,
636
- args: [{ providedIn: 'root' }]
637
- }], ctorParameters: () => [{ type: i2.BrowserService }] });
638
-
639
- class FThemeButtonComponent {
640
- constructor(renderer, fState, fBrowser) {
641
- this.renderer = renderer;
642
- this.fState = fState;
643
- this.fBrowser = fBrowser;
644
- }
645
- ngOnInit() {
646
- if (this.fState.getPreferredTheme() === 'dark' && !this.isDocumentContainsDarkTheme()) {
647
- this.renderer.addClass(this.fBrowser.document.documentElement, 'dark');
648
- this.fBrowser.localStorage.setItem('preferred-theme', 'dark');
649
- }
650
- }
651
- isDocumentContainsDarkTheme() {
652
- return this.fBrowser.document.documentElement.classList.contains('dark');
653
- }
654
- onClick() {
655
- if (this.fState.getPreferredTheme() === 'light' && !this.isDocumentContainsDarkTheme()) {
656
- this.renderer.addClass(this.fBrowser.document.documentElement, 'dark');
657
- this.fBrowser.localStorage.setItem('preferred-theme', 'dark');
658
- }
659
- else {
660
- this.renderer.removeClass(this.fBrowser.document.documentElement, 'dark');
661
- this.fBrowser.localStorage.setItem('preferred-theme', 'light');
662
- }
663
- this.fState.updateTheme();
664
- }
665
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FThemeButtonComponent, deps: [{ token: i0.Renderer2 }, { token: FStateService }, { token: i2.BrowserService }], target: i0.ɵɵFactoryTarget.Component }); }
666
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FThemeButtonComponent, isStandalone: true, selector: "button[f-theme-button]", host: { listeners: { "click": "onClick()" } }, ngImport: i0, template: "<div class=\"f-icon-container\">\n <div class=\"f-icon moon\"></div>\n <div class=\"f-icon sun\"></div>\n</div>\n", styles: [":host{margin:0 8px;position:relative;border-radius:11px;display:block;width:44px;min-width:44px;height:22px;border:1px solid var(--theme-button-border-color);background-color:var(--theme-button-background);cursor:pointer}:host:hover{border-color:var(--theme-button-hovered-border-color)}.f-icon-container{position:absolute;top:1px;left:1px;width:18px;height:18px;padding:3px;border-radius:50%;background-color:var(--theme-button-icon-background);transition:transform .4s}.f-icon-container .f-icon{position:absolute;top:3px;left:3px;width:12px;height:12px}.f-icon-container .sun{display:block}.f-icon-container .moon{display:none}.dark :host .f-icon-container{transform:translate(22px)}.dark :host .f-icon-container .sun{display:none}.dark :host .f-icon-container .moon{display:block}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
667
- }
668
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FThemeButtonComponent, decorators: [{
669
- type: Component,
670
- args: [{ selector: 'button[f-theme-button]', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"f-icon-container\">\n <div class=\"f-icon moon\"></div>\n <div class=\"f-icon sun\"></div>\n</div>\n", styles: [":host{margin:0 8px;position:relative;border-radius:11px;display:block;width:44px;min-width:44px;height:22px;border:1px solid var(--theme-button-border-color);background-color:var(--theme-button-background);cursor:pointer}:host:hover{border-color:var(--theme-button-hovered-border-color)}.f-icon-container{position:absolute;top:1px;left:1px;width:18px;height:18px;padding:3px;border-radius:50%;background-color:var(--theme-button-icon-background);transition:transform .4s}.f-icon-container .f-icon{position:absolute;top:3px;left:3px;width:12px;height:12px}.f-icon-container .sun{display:block}.f-icon-container .moon{display:none}.dark :host .f-icon-container{transform:translate(22px)}.dark :host .f-icon-container .sun{display:none}.dark :host .f-icon-container .moon{display:block}\n"] }]
671
- }], ctorParameters: () => [{ type: i0.Renderer2 }, { type: FStateService }, { type: i2.BrowserService }], propDecorators: { onClick: [{
672
- type: HostListener,
673
- args: ['click']
674
- }] } });
675
-
676
- class FHeaderMenuComponent {
677
- constructor(fEnvironmentService, router) {
678
- this.fEnvironmentService = fEnvironmentService;
679
- this.router = router;
680
- this.navigation = [];
681
- }
682
- ngOnInit() {
683
- this.navigation = this.fEnvironmentService.getHeaderNavigation().map((x) => {
684
- return {
685
- ...x,
686
- isActive: this.router.url.startsWith(x.link)
687
- };
688
- });
689
- }
690
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FHeaderMenuComponent, deps: [{ token: FEnvironmentService }, { token: i1.Router }], target: i0.ɵɵFactoryTarget.Component }); }
691
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: FHeaderMenuComponent, isStandalone: true, selector: "f-header-menu", ngImport: i0, template: "@for (item of navigation; track item.link) {\n <a class=\"header-link\" [routerLink]=\"item.link\" [class.active]=\"item.isActive\">\n <span>{{ item.text }}</span>\n </a>\n}\n\n", styles: [":host{display:flex;justify-content:flex-start;align-items:center}.header-link{display:flex;align-items:center;padding:0 12px;line-height:var(--header-height);font-size:14px;font-weight:500;color:var(--primary-text);cursor:pointer}.header-link:hover,.header-link.active{color:var(--primary-1)}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
692
- }
693
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FHeaderMenuComponent, decorators: [{
694
- type: Component,
695
- args: [{ selector: 'f-header-menu', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
696
- RouterLink
697
- ], template: "@for (item of navigation; track item.link) {\n <a class=\"header-link\" [routerLink]=\"item.link\" [class.active]=\"item.isActive\">\n <span>{{ item.text }}</span>\n </a>\n}\n\n", styles: [":host{display:flex;justify-content:flex-start;align-items:center}.header-link{display:flex;align-items:center;padding:0 12px;line-height:var(--header-height);font-size:14px;font-weight:500;color:var(--primary-text);cursor:pointer}.header-link:hover,.header-link.active{color:var(--primary-1)}\n"] }]
698
- }], ctorParameters: () => [{ type: FEnvironmentService }, { type: i1.Router }] });
699
-
700
- class FHeaderComponent {
701
- constructor(fEnvironmentService) {
702
- this.fEnvironmentService = fEnvironmentService;
703
- this.title = '';
704
- this.title = this.fEnvironmentService.getTitle();
705
- }
706
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FHeaderComponent, deps: [{ token: FEnvironmentService }], target: i0.ɵɵFactoryTarget.Component }); }
707
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FHeaderComponent, isStandalone: true, selector: "f-header", ngImport: i0, template: "<button f-hamburger-button></button>\n<div class=\"title text-ellipsis\">{{ title }}</div>\n<div class=\"flex-space\"></div>\n<f-header-menu></f-header-menu>\n<f-version></f-version>\n<div class=\"divider\"></div>\n<button f-theme-button></button>\n<div class=\"divider\"></div>\n<f-social-links></f-social-links>\n\n", styles: [":host{position:sticky;width:100%;top:0;display:flex;justify-content:flex-start;align-items:center;padding:20px 32px;font-weight:600;color:var(--primary-text);height:calc(var(--header-height) + 1px);background-color:var(--background-color);border-bottom:1px solid var(--divider-color);z-index:var(--z-index-header)}@media (min-width: 1280px){:host{padding-right:max(var(--page-padding),(100vw - var(--layout-max-width)) / 3);padding-left:max(var(--page-padding),(100vw - var(--layout-max-width)) / 4)}}.title{display:none;justify-content:flex-start;align-items:center;padding:20px 0;font-weight:600;color:var(--primary-text);height:var(--header-height)}@media (min-width: 460px){.title{display:block}}@media (min-width: 960px){.title{display:none}}.divider{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--divider-color);content:\"\"}\n"], dependencies: [{ kind: "component", type: FHamburgerButtonComponent, selector: "button[f-hamburger-button]" }, { kind: "component", type: FVersionComponent, selector: "f-version" }, { kind: "component", type: FSocialLinksComponent, selector: "f-social-links" }, { kind: "component", type: FThemeButtonComponent, selector: "button[f-theme-button]" }, { kind: "component", type: FHeaderMenuComponent, selector: "f-header-menu" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
708
- }
709
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FHeaderComponent, decorators: [{
710
- type: Component,
711
- args: [{ selector: 'f-header', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
712
- NgOptimizedImage,
713
- FHamburgerButtonComponent,
714
- FVersionComponent,
715
- FSocialLinksComponent,
716
- FThemeButtonComponent,
717
- FHeaderMenuComponent
718
- ], template: "<button f-hamburger-button></button>\n<div class=\"title text-ellipsis\">{{ title }}</div>\n<div class=\"flex-space\"></div>\n<f-header-menu></f-header-menu>\n<f-version></f-version>\n<div class=\"divider\"></div>\n<button f-theme-button></button>\n<div class=\"divider\"></div>\n<f-social-links></f-social-links>\n\n", styles: [":host{position:sticky;width:100%;top:0;display:flex;justify-content:flex-start;align-items:center;padding:20px 32px;font-weight:600;color:var(--primary-text);height:calc(var(--header-height) + 1px);background-color:var(--background-color);border-bottom:1px solid var(--divider-color);z-index:var(--z-index-header)}@media (min-width: 1280px){:host{padding-right:max(var(--page-padding),(100vw - var(--layout-max-width)) / 3);padding-left:max(var(--page-padding),(100vw - var(--layout-max-width)) / 4)}}.title{display:none;justify-content:flex-start;align-items:center;padding:20px 0;font-weight:600;color:var(--primary-text);height:var(--header-height)}@media (min-width: 460px){.title{display:block}}@media (min-width: 960px){.title{display:none}}.divider{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--divider-color);content:\"\"}\n"] }]
719
- }], ctorParameters: () => [{ type: FEnvironmentService }] });
720
-
721
- class FPreviewComponent {
722
- constructor(fEnvironment, fState, router, changeDetectorRef) {
723
- this.fEnvironment = fEnvironment;
724
- this.fState = fState;
725
- this.router = router;
726
- this.changeDetectorRef = changeDetectorRef;
727
- this.subscriptions$ = new Subscription();
728
- }
729
- initialize() {
730
- this.viewModel = this.getNavigationItem(this.getNavigationGroup());
731
- this.url = this.normalizeLink(this.viewModel.link, this.getUrlPrefix());
732
- this.subscriptions$.add(this.fState.theme$.pipe(startWith(null)).subscribe(() => this.updateTheme()));
733
- }
734
- getNavigationGroup() {
735
- return this.fEnvironment.getNavigation().find((x) => x.text === this.group);
736
- }
737
- getNavigationItem(group) {
738
- return group.items.find((x) => x.link === this.item);
739
- }
740
- updateTheme() {
741
- this.src = this.fState.getPreferredTheme() === 'dark' ? this.viewModel?.image_dark : this.viewModel?.image;
742
- if (!this.src) {
743
- this.src = this.viewModel?.image;
744
- }
745
- this.changeDetectorRef.markForCheck();
746
- }
747
- normalizeLink(link, prefix) {
748
- if (!this.isExternalLink(link)) {
749
- return link.startsWith('/') ? `${prefix}${link}` : `${prefix}/${link}`;
750
- }
751
- return link;
752
- }
753
- getUrlPrefix() {
754
- return this.router.url.substring(0, this.router.url.lastIndexOf('/'));
755
- }
756
- isExternalLink(href) {
757
- return href.startsWith('www') || href.startsWith('http');
758
- }
759
- ngOnDestroy() {
760
- this.subscriptions$.unsubscribe();
761
- }
762
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FPreviewComponent, deps: [{ token: FEnvironmentService }, { token: FStateService }, { token: i1.Router }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
763
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: FPreviewComponent, isStandalone: true, selector: "a[f-preview]", host: { properties: { "attr.href": "url", "attr.title": "viewModel?.text" } }, ngImport: i0, template: "@if (viewModel) {\n <img [src]=\"src\" [alt]=\"viewModel.description\" [title]=\"viewModel.text\">\n <div class=\"title\">{{ viewModel.text }}</div>\n <div class=\"description\">{{ viewModel.description }}</div>\n}\n\n\n\n", styles: [":host{display:block;border-radius:4px;background-color:var(--soft-background);padding:24px;width:100%;text-decoration:none!important;color:inherit!important;line-height:24px;font-size:14px;cursor:pointer}:host:hover img{transform:scale(1.1)}:host img{display:block;margin-bottom:16px;width:100%;height:180px;border-radius:4px;object-fit:cover;transition:transform .3s}:host .title{line-height:inherit;font-weight:600;text-transform:uppercase;color:var(--primary-text)}:host .description{margin:8px 0!important;line-height:inherit;color:var(--secondary-text);width:100%;word-wrap:break-word;white-space:normal;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}@media (min-width: 640px){:host{width:calc((100% - 32px)/2)}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
764
- }
765
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FPreviewComponent, decorators: [{
766
- type: Component,
767
- args: [{ selector: 'a[f-preview]', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, host: {
768
- '[attr.href]': 'url',
769
- '[attr.title]': 'viewModel?.text',
770
- }, template: "@if (viewModel) {\n <img [src]=\"src\" [alt]=\"viewModel.description\" [title]=\"viewModel.text\">\n <div class=\"title\">{{ viewModel.text }}</div>\n <div class=\"description\">{{ viewModel.description }}</div>\n}\n\n\n\n", styles: [":host{display:block;border-radius:4px;background-color:var(--soft-background);padding:24px;width:100%;text-decoration:none!important;color:inherit!important;line-height:24px;font-size:14px;cursor:pointer}:host:hover img{transform:scale(1.1)}:host img{display:block;margin-bottom:16px;width:100%;height:180px;border-radius:4px;object-fit:cover;transition:transform .3s}:host .title{line-height:inherit;font-weight:600;text-transform:uppercase;color:var(--primary-text)}:host .description{margin:8px 0!important;line-height:inherit;color:var(--secondary-text);width:100%;word-wrap:break-word;white-space:normal;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}@media (min-width: 640px){:host{width:calc((100% - 32px)/2)}}\n"] }]
771
- }], ctorParameters: () => [{ type: FEnvironmentService }, { type: FStateService }, { type: i1.Router }, { type: i0.ChangeDetectorRef }] });
772
-
773
- class FNavigationGroupComponent {
774
- constructor() {
775
- this.isCollapsed = false;
776
- }
777
- toggle() {
778
- this.isCollapsed = !this.isCollapsed;
779
- }
780
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FNavigationGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
781
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: FNavigationGroupComponent, isStandalone: true, selector: "f-navigation-group", inputs: { title: "title" }, host: { properties: { "class.collapsed": "isCollapsed", "class.no-title": "!title" } }, ngImport: i0, template: "@if (title) {\n <header (click)=\"toggle()\">\n <span>{{ title }}</span>\n <div class=\"flex-space\"></div>\n <div class=\"caret\">\n <span class=\"chevron-right caret-icon\"></span>\n </div>\n </header>\n}\n@if (!isCollapsed) {\n <ng-content></ng-content>\n}\n\n\n\n", styles: [":host{padding-top:10px;padding-bottom:24px;border-top:1px solid var(--divider-color);display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start;width:100%;max-width:240px;margin-left:auto}:host.collapsed,:host.no-title{padding-top:10px;padding-bottom:10px}header{font-weight:600;color:var(--primary-text);flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;cursor:pointer;display:flex;justify-content:flex-start;align-items:center;width:100%}.caret{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--tertiary-text);cursor:pointer;transition:color .25s;flex-shrink:0}:host:hover .caret{color:var(--secondary-text)}:host:hover .caret:hover{color:var(--primary-text)}:host .caret-icon{font-size:18px;transform:rotate(90deg);transition:transform .25s;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;width:18px;height:18px}:host.collapsed .caret-icon{transform:rotate(0)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
782
- }
783
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FNavigationGroupComponent, decorators: [{
784
- type: Component,
785
- args: [{ selector: 'f-navigation-group', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, host: {
786
- '[class.collapsed]': 'isCollapsed',
787
- '[class.no-title]': '!title'
788
- }, template: "@if (title) {\n <header (click)=\"toggle()\">\n <span>{{ title }}</span>\n <div class=\"flex-space\"></div>\n <div class=\"caret\">\n <span class=\"chevron-right caret-icon\"></span>\n </div>\n </header>\n}\n@if (!isCollapsed) {\n <ng-content></ng-content>\n}\n\n\n\n", styles: [":host{padding-top:10px;padding-bottom:24px;border-top:1px solid var(--divider-color);display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start;width:100%;max-width:240px;margin-left:auto}:host.collapsed,:host.no-title{padding-top:10px;padding-bottom:10px}header{font-weight:600;color:var(--primary-text);flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;cursor:pointer;display:flex;justify-content:flex-start;align-items:center;width:100%}.caret{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--tertiary-text);cursor:pointer;transition:color .25s;flex-shrink:0}:host:hover .caret{color:var(--secondary-text)}:host:hover .caret:hover{color:var(--primary-text)}:host .caret-icon{font-size:18px;transform:rotate(90deg);transition:transform .25s;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;width:18px;height:18px}:host.collapsed .caret-icon{transform:rotate(0)}\n"] }]
789
- }], propDecorators: { title: [{
790
- type: Input
791
- }] } });
792
-
793
- class FNavigationHeaderComponent {
794
- constructor(router, fEnvironmentService) {
795
- this.router = router;
796
- this.fEnvironmentService = fEnvironmentService;
797
- this.title = '';
798
- this.image = '';
799
- this.title = this.fEnvironmentService.getTitle();
800
- this.image = this.fEnvironmentService.getLogo();
801
- }
802
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FNavigationHeaderComponent, deps: [{ token: i1.Router }, { token: FEnvironmentService }], target: i0.ɵɵFactoryTarget.Component }); }
803
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FNavigationHeaderComponent, isStandalone: true, selector: "a[f-navigation-header]", ngImport: i0, template: "<img [src]=\"image\" width=\"24\" height=\"24\" alt=\"logo\" class=\"logo\"/> {{ title }}\n\n\n\n", styles: [":host{display:flex;justify-content:flex-start;align-items:center;padding:20px 0;font-weight:600;color:var(--primary-text);height:var(--header-height);width:100%;max-width:240px;margin-left:auto;cursor:pointer}:host img{margin-right:8px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
804
- }
805
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FNavigationHeaderComponent, decorators: [{
806
- type: Component,
807
- args: [{ selector: 'a[f-navigation-header]', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
808
- RouterLink
809
- ], template: "<img [src]=\"image\" width=\"24\" height=\"24\" alt=\"logo\" class=\"logo\"/> {{ title }}\n\n\n\n", styles: [":host{display:flex;justify-content:flex-start;align-items:center;padding:20px 0;font-weight:600;color:var(--primary-text);height:var(--header-height);width:100%;max-width:240px;margin-left:auto;cursor:pointer}:host img{margin-right:8px}\n"] }]
810
- }], ctorParameters: () => [{ type: i1.Router }, { type: FEnvironmentService }] });
811
-
812
- class FNavigationItemComponent {
813
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FNavigationItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
814
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FNavigationItemComponent, isStandalone: true, selector: "a[f-navigation-item]", ngImport: i0, template: "<ng-content></ng-content>\n\n\n\n", styles: [":host{font-weight:500;color:var(--secondary-text);flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;cursor:pointer;width:100%;display:flex;align-items:center;justify-content:flex-start;gap:2px}:host:hover{text-decoration:none;color:var(--primary-1)}:host.active{color:var(--primary-1)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
815
- }
816
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FNavigationItemComponent, decorators: [{
817
- type: Component,
818
- args: [{ selector: 'a[f-navigation-item]', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-content></ng-content>\n\n\n\n", styles: [":host{font-weight:500;color:var(--secondary-text);flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;cursor:pointer;width:100%;display:flex;align-items:center;justify-content:flex-start;gap:2px}:host:hover{text-decoration:none;color:var(--primary-1)}:host.active{color:var(--primary-1)}\n"] }]
819
- }] });
820
-
821
- class FNavigationPanelComponent {
822
- constructor(fEnvironmentService, fDocumentation, router, injector, changeDetectorRef) {
823
- this.fEnvironmentService = fEnvironmentService;
824
- this.fDocumentation = fDocumentation;
825
- this.router = router;
826
- this.injector = injector;
827
- this.changeDetectorRef = changeDetectorRef;
828
- this.subscription = new Subscription();
829
- this.navigation = [];
830
- this.navigation = this.fEnvironmentService.getNavigation();
831
- }
832
- ngOnInit() {
833
- const currentPath = this.router.url;
834
- const prefix = currentPath.substring(0, currentPath.lastIndexOf('/'));
835
- const navigation = deepClone(this.fEnvironmentService.getNavigation());
836
- navigation.forEach((group) => {
837
- group.items.forEach((item) => {
838
- this.normalizeLink(item, prefix);
839
- });
840
- });
841
- this.navigation = navigation;
842
- }
843
- normalizeLink(item, prefix) {
844
- if (item.link && !this.isExternalLink(item.link)) {
845
- item.link = item.link.startsWith('/') ? `${prefix}${item.link}` : `${prefix}/${item.link}`;
846
- }
847
- }
848
- isExternalLink(href) {
849
- return href.startsWith('www') || href.startsWith('http');
850
- }
851
- ngAfterViewInit() {
852
- this.subscription.add(this.subscribeOnRouteChanges());
853
- }
854
- subscribeOnRouteChanges() {
855
- return this.router.events.pipe(startWith(new NavigationEnd(1, '', '')), filter$1(event => event instanceof NavigationEnd)).subscribe(() => {
856
- this.highlightLink(this.router.url);
857
- this.fDocumentation.onToggleNavigation(false);
858
- this.changeDetectorRef.detectChanges();
859
- });
860
- }
861
- highlightLink(url) {
862
- this.value = undefined;
863
- this.navigation.forEach((group) => {
864
- this.value = group.items.find((x) => {
865
- return url.endsWith(x.link);
866
- })?.link || this.value;
867
- });
868
- }
869
- onDocumentClick(event) {
870
- this.injector.get(HandleNavigationLinksHandler).handle(new HandleNavigationLinksRequest(event));
871
- }
872
- ngOnDestroy() {
873
- this.subscription.unsubscribe();
874
- }
875
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FNavigationPanelComponent, deps: [{ token: FEnvironmentService }, { token: F_DOCUMENTATION_COMPONENT }, { token: i1.Router }, { token: i0.Injector }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
876
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: FNavigationPanelComponent, isStandalone: true, selector: "f-navigation-panel", host: { listeners: { "click": "onDocumentClick($event)" } }, providers: [
877
- HandleNavigationLinksHandler
878
- ], viewQueries: [{ propertyName: "items", predicate: FNavigationItemComponent, descendants: true }], ngImport: i0, template: "<a f-navigation-header routerLink></a>\n\n@for (group of navigation; track group) {\n <f-navigation-group [title]=\"group.text\">\n @for (item of group.items; track item.link) {\n <a f-navigation-item [href]=\"item.link\" [class.active]=\"item.link === value\">\n <div class=\"text-ellipsis\">{{ item.text }}</div>\n @if (item.badge) {\n <span f-badge [text]=\"item.badge.text\" [type]=\"item.badge.type\"></span>\n }\n </a>\n }\n </f-navigation-group>\n}\n", styles: [":host{height:100%;flex-direction:column;justify-content:flex-start;align-items:flex-start;padding:0 var(--navigation-panel-padding);background-color:var(--navigation-panel-background);overflow:hidden;overflow-y:auto;position:fixed;width:var(--navigation-panel-width);top:0;left:calc(-1 * var(--navigation-panel-width));transition:transform .2s ease-in-out;z-index:var(--z-index-navigation);transform:none}@media (min-width: 960px){:host{position:unset;display:flex;min-width:var(--navigation-panel-width);width:fit-content;transform:none!important}}@media (min-width: 1440px){:host{min-width:calc((100% - (var(--layout-max-width) - 64px)) / 3 + var(--navigation-panel-width) - var(--navigation-panel-padding))}}:host.visible{transform:translate(var(--navigation-panel-width))}\n"], dependencies: [{ kind: "component", type: FNavigationHeaderComponent, selector: "a[f-navigation-header]" }, { kind: "component", type: FNavigationItemComponent, selector: "a[f-navigation-item]" }, { kind: "component", type: FNavigationGroupComponent, selector: "f-navigation-group", inputs: ["title"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: FBadgeComponent, selector: "span[f-badge]", inputs: ["text", "type"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
879
- }
880
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FNavigationPanelComponent, decorators: [{
881
- type: Component,
882
- args: [{ selector: 'f-navigation-panel', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
883
- HandleNavigationLinksHandler
884
- ], imports: [
885
- FNavigationHeaderComponent,
886
- FNavigationItemComponent,
887
- FNavigationGroupComponent,
888
- RouterLink,
889
- FBadgeComponent,
890
- ], template: "<a f-navigation-header routerLink></a>\n\n@for (group of navigation; track group) {\n <f-navigation-group [title]=\"group.text\">\n @for (item of group.items; track item.link) {\n <a f-navigation-item [href]=\"item.link\" [class.active]=\"item.link === value\">\n <div class=\"text-ellipsis\">{{ item.text }}</div>\n @if (item.badge) {\n <span f-badge [text]=\"item.badge.text\" [type]=\"item.badge.type\"></span>\n }\n </a>\n }\n </f-navigation-group>\n}\n", styles: [":host{height:100%;flex-direction:column;justify-content:flex-start;align-items:flex-start;padding:0 var(--navigation-panel-padding);background-color:var(--navigation-panel-background);overflow:hidden;overflow-y:auto;position:fixed;width:var(--navigation-panel-width);top:0;left:calc(-1 * var(--navigation-panel-width));transition:transform .2s ease-in-out;z-index:var(--z-index-navigation);transform:none}@media (min-width: 960px){:host{position:unset;display:flex;min-width:var(--navigation-panel-width);width:fit-content;transform:none!important}}@media (min-width: 1440px){:host{min-width:calc((100% - (var(--layout-max-width) - 64px)) / 3 + var(--navigation-panel-width) - var(--navigation-panel-padding))}}:host.visible{transform:translate(var(--navigation-panel-width))}\n"] }]
891
- }], ctorParameters: () => [{ type: FEnvironmentService }, { type: undefined, decorators: [{
892
- type: Inject,
893
- args: [F_DOCUMENTATION_COMPONENT]
894
- }] }, { type: i1.Router }, { type: i0.Injector }, { type: i0.ChangeDetectorRef }], propDecorators: { items: [{
895
- type: ViewChildren,
896
- args: [FNavigationItemComponent]
897
- }], onDocumentClick: [{
898
- type: HostListener,
899
- args: ['click', ['$event']]
900
- }] } });
901
-
902
- class GetAbsoluteTopToContainerHandler {
903
- handle(request) {
904
- let element = request.element;
905
- let result = 0;
906
- while (element !== request.container) {
907
- if (!element)
908
- return NaN;
909
- result += element.offsetTop;
910
- element = element.offsetParent;
911
- }
912
- return result;
913
- }
914
- }
915
-
916
- class GetAbsoluteTopToContainerRequest {
917
- constructor(element, container) {
918
- this.element = element;
919
- this.container = container;
920
- }
921
- }
922
-
923
- class TableOfContentData {
924
- constructor(flat, tree) {
925
- this.flat = flat;
926
- this.tree = tree;
927
- }
928
- }
929
-
930
- class GetTableOfContentDataHandler {
931
- handle(request) {
932
- const flat = [];
933
- const tree = [];
934
- const stack = [];
935
- this.getNavigationSelectors(request.fMarkdownPage, request.tocRange).forEach((element) => {
936
- const tocItem = this.createItem(element);
937
- this.insertItemIntoTree(tocItem, tree, stack);
938
- flat.push(tocItem);
939
- });
940
- return new TableOfContentData(flat, tree);
941
- }
942
- getNavigationSelectors(fMarkdownPage, tocRange) {
943
- if (!tocRange || tocRange.start < 1 || tocRange.end > 6) {
944
- tocRange = { start: 1, end: 6 };
945
- }
946
- let selectors = [];
947
- for (let i = tocRange.start; i <= tocRange.end; i++) {
948
- selectors.push(`h${i}`);
949
- }
950
- return Array.from(fMarkdownPage.querySelectorAll(selectors.join(', ')));
951
- }
952
- createItem(element) {
953
- element.id = this.createNavigationId(element);
954
- return {
955
- hash: `#${element.id}`,
956
- title: element.innerHTML,
957
- element,
958
- children: []
959
- };
960
- }
961
- createNavigationId(element) {
962
- return element.innerHTML.toLowerCase().replaceAll(' ', '-');
963
- }
964
- getLevel(element) {
965
- return parseInt(element.tagName.substring(1));
966
- }
967
- insertItemIntoTree(tocItem, tree, stack) {
968
- while (stack.length > 0 && this.getLevel(stack[stack.length - 1].element) >= this.getLevel(tocItem.element)) {
969
- stack.pop();
970
- }
971
- if (stack.length === 0) {
972
- tree.push(tocItem);
973
- }
974
- else {
975
- stack[stack.length - 1].children.push(tocItem);
976
- }
977
- stack.push(tocItem);
978
- }
979
- }
980
-
981
- class GetTableOfContentDataRequest {
982
- constructor(fMarkdownPage, tocRange) {
983
- this.fMarkdownPage = fMarkdownPage;
984
- this.tocRange = tocRange;
985
- }
986
- }
987
-
988
- class CalculateHashFromScrollPositionHandler {
989
- constructor(scrollableContainer, fBrowser) {
990
- this.scrollableContainer = scrollableContainer;
991
- this.fBrowser = fBrowser;
992
- }
993
- handle(request) {
994
- let result;
995
- const containerScrollTop = this.getContainerScrollTop();
996
- const elementsWithTopPosition = this.calculateElementsTopPositions(request.tocData);
997
- if (elementsWithTopPosition.length) {
998
- if (this.isScrollAtBottom(containerScrollTop)) {
999
- result = elementsWithTopPosition[elementsWithTopPosition.length - 1].hash;
1000
- }
1001
- else {
1002
- result = this.findTargetHashByPosition(containerScrollTop, elementsWithTopPosition);
1003
- }
1004
- }
1005
- return result;
1006
- }
1007
- getContainerScrollTop() {
1008
- return this.scrollableContainer.scrollTop + this.getHeaderHeight();
1009
- }
1010
- getHeaderHeight() {
1011
- return parseInt(this.fBrowser.window.getComputedStyle(this.fBrowser.document.documentElement).getPropertyValue('--header-height'), 10);
1012
- }
1013
- calculateElementsTopPositions(items) {
1014
- return items.map((x) => {
1015
- return {
1016
- hash: x.hash,
1017
- top: this.getAbsoluteTopToContainer(x.element)
1018
- };
1019
- }).filter((x) => !Number.isNaN(x.top));
1020
- }
1021
- getAbsoluteTopToContainer(element) {
1022
- return new GetAbsoluteTopToContainerHandler().handle(new GetAbsoluteTopToContainerRequest(element, this.scrollableContainer));
1023
- }
1024
- isScrollAtBottom(containerScrollTop) {
1025
- return Math.abs(containerScrollTop - this.getHeaderHeight() + this.scrollableContainer.clientHeight - this.scrollableContainer.scrollHeight) < 1;
1026
- }
1027
- findTargetHashByPosition(containerScrollTop, elementsWithTopPosition) {
1028
- let result = elementsWithTopPosition[0].hash;
1029
- for (const { hash, top } of elementsWithTopPosition) {
1030
- if (top > containerScrollTop)
1031
- break;
1032
- result = hash;
1033
- }
1034
- return result;
1035
- }
1036
- }
1037
-
1038
- class CalculateHashFromScrollPositionRequest {
1039
- constructor(tocData) {
1040
- this.tocData = tocData;
584
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FNavigationGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
585
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: FNavigationGroupComponent, isStandalone: true, selector: "f-navigation-group", inputs: { title: "title" }, host: { properties: { "class.collapsed": "isCollapsed", "class.no-title": "!title" } }, ngImport: i0, template: "@if (title) {\n <header (click)=\"toggle()\">\n <span>{{ title }}</span>\n <div class=\"flex-space\"></div>\n <div class=\"caret\">\n <span class=\"chevron-right caret-icon\"></span>\n </div>\n </header>\n}\n@if (!isCollapsed) {\n <ng-content></ng-content>\n}\n\n\n\n", styles: [":host{padding-top:10px;padding-bottom:24px;border-top:1px solid var(--divider-color);display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start;width:100%;max-width:240px;margin-left:auto}:host.collapsed,:host.no-title{padding-top:10px;padding-bottom:10px}header{font-weight:600;color:var(--primary-text);flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;cursor:pointer;display:flex;justify-content:flex-start;align-items:center;width:100%}.caret{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--tertiary-text);cursor:pointer;transition:color .25s;flex-shrink:0}:host:hover .caret{color:var(--secondary-text)}:host:hover .caret:hover{color:var(--primary-text)}:host .caret-icon{font-size:18px;transform:rotate(90deg);transition:transform .25s;mask-size:100% 100%;background-color:currentColor;color:inherit;width:18px;height:18px}:host.collapsed .caret-icon{transform:rotate(0)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
586
+ }
587
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FNavigationGroupComponent, decorators: [{
588
+ type: Component,
589
+ args: [{ selector: 'f-navigation-group', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, host: {
590
+ '[class.collapsed]': 'isCollapsed',
591
+ '[class.no-title]': '!title'
592
+ }, template: "@if (title) {\n <header (click)=\"toggle()\">\n <span>{{ title }}</span>\n <div class=\"flex-space\"></div>\n <div class=\"caret\">\n <span class=\"chevron-right caret-icon\"></span>\n </div>\n </header>\n}\n@if (!isCollapsed) {\n <ng-content></ng-content>\n}\n\n\n\n", styles: [":host{padding-top:10px;padding-bottom:24px;border-top:1px solid var(--divider-color);display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start;width:100%;max-width:240px;margin-left:auto}:host.collapsed,:host.no-title{padding-top:10px;padding-bottom:10px}header{font-weight:600;color:var(--primary-text);flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;cursor:pointer;display:flex;justify-content:flex-start;align-items:center;width:100%}.caret{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--tertiary-text);cursor:pointer;transition:color .25s;flex-shrink:0}:host:hover .caret{color:var(--secondary-text)}:host:hover .caret:hover{color:var(--primary-text)}:host .caret-icon{font-size:18px;transform:rotate(90deg);transition:transform .25s;mask-size:100% 100%;background-color:currentColor;color:inherit;width:18px;height:18px}:host.collapsed .caret-icon{transform:rotate(0)}\n"] }]
593
+ }], propDecorators: { title: [{
594
+ type: Input
595
+ }] } });
596
+
597
+ class FNavigationHeaderComponent {
598
+ router;
599
+ fEnvironmentService;
600
+ title = '';
601
+ image = '';
602
+ constructor(router, fEnvironmentService) {
603
+ this.router = router;
604
+ this.fEnvironmentService = fEnvironmentService;
605
+ this.title = this.fEnvironmentService.getTitle();
606
+ this.image = this.fEnvironmentService.getLogo();
1041
607
  }
608
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FNavigationHeaderComponent, deps: [{ token: i1.Router }, { token: FDocumentationEnvironmentService }], target: i0.ɵɵFactoryTarget.Component });
609
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FNavigationHeaderComponent, isStandalone: true, selector: "a[f-navigation-header]", ngImport: i0, template: "<img [src]=\"image\" width=\"24\" height=\"24\" alt=\"logo\" class=\"logo\"/> {{ title }}\n\n\n\n", styles: [":host{display:flex;justify-content:flex-start;align-items:center;padding:20px 0;font-weight:600;color:var(--primary-text);height:var(--header-height);width:100%;max-width:240px;margin-left:auto;cursor:pointer}:host img{margin-right:8px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1042
610
  }
611
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FNavigationHeaderComponent, decorators: [{
612
+ type: Component,
613
+ args: [{ selector: 'a[f-navigation-header]', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
614
+ RouterLink
615
+ ], template: "<img [src]=\"image\" width=\"24\" height=\"24\" alt=\"logo\" class=\"logo\"/> {{ title }}\n\n\n\n", styles: [":host{display:flex;justify-content:flex-start;align-items:center;padding:20px 0;font-weight:600;color:var(--primary-text);height:var(--header-height);width:100%;max-width:240px;margin-left:auto;cursor:pointer}:host img{margin-right:8px}\n"] }]
616
+ }], ctorParameters: () => [{ type: i1.Router }, { type: FDocumentationEnvironmentService }] });
1043
617
 
1044
- class ScrollToElementInContainer {
1045
- constructor(container) {
1046
- this.container = container;
1047
- }
1048
- handle(hash) {
1049
- this.container.scrollTo({
1050
- top: this.getScrollTo(this.getScrollToElement(hash)) - 64,
1051
- behavior: 'smooth'
1052
- });
1053
- }
1054
- getScrollToElement(hash) {
1055
- const element = this.container.querySelector(hash);
1056
- if (!element) {
1057
- throw new Error(`Element ${hash} not found`);
1058
- }
1059
- return element;
1060
- }
1061
- getScrollTo(element) {
1062
- return this.isFirstElementInContainer(element) ? 0 : this.calculateScrollTo(element);
1063
- }
1064
- isFirstElementInContainer(element) {
1065
- return element.parentElement.children[0] === element;
1066
- }
1067
- calculateScrollTo(element) {
1068
- return this.getElementTop(element) - this.getContainerTop() + this.container.scrollTop;
1069
- }
1070
- getElementTop(element) {
1071
- return element.getBoundingClientRect().top;
1072
- }
1073
- getContainerTop() {
1074
- return this.container.getBoundingClientRect().top;
1075
- }
618
+ class FNavigationItemComponent {
619
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FNavigationItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
620
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FNavigationItemComponent, isStandalone: true, selector: "a[f-navigation-item]", ngImport: i0, template: "<ng-content></ng-content>\n\n\n\n", styles: [":host{font-weight:500;color:var(--secondary-text);flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;cursor:pointer;width:100%;display:flex;align-items:center;justify-content:flex-start;gap:2px}:host:hover{text-decoration:none;color:var(--primary-1)}:host.active{color:var(--primary-1)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1076
621
  }
622
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FNavigationItemComponent, decorators: [{
623
+ type: Component,
624
+ args: [{ selector: 'a[f-navigation-item]', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-content></ng-content>\n\n\n\n", styles: [":host{font-weight:500;color:var(--secondary-text);flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;cursor:pointer;width:100%;display:flex;align-items:center;justify-content:flex-start;gap:2px}:host:hover{text-decoration:none;color:var(--primary-1)}:host.active{color:var(--primary-1)}\n"] }]
625
+ }] });
1077
626
 
1078
- class FScrollableService {
1079
- get onToc$() {
1080
- return this.onTocChanged$.asObservable().pipe(map(() => this.tocData));
1081
- }
1082
- constructor(fEnvironmentService, fBrowser) {
627
+ class FNavigationPanelComponent {
628
+ fEnvironmentService;
629
+ fDocumentation;
630
+ router;
631
+ injector;
632
+ changeDetectorRef;
633
+ subscription = new Subscription();
634
+ items;
635
+ value;
636
+ navigation = [];
637
+ constructor(fEnvironmentService, fDocumentation, router, injector, changeDetectorRef) {
1083
638
  this.fEnvironmentService = fEnvironmentService;
1084
- this.fBrowser = fBrowser;
1085
- this.tocData = new TableOfContentData([], []);
1086
- this.onTocChanged$ = new Subject();
1087
- this.onScrollSubscription$ = Subscription.EMPTY;
1088
- }
1089
- setContainer(fScrollableContainer) {
1090
- this.fScrollableContainer = fScrollableContainer;
1091
- this.onScrollSubscription$ = this.subscribeOnScroll();
639
+ this.fDocumentation = fDocumentation;
640
+ this.router = router;
641
+ this.injector = injector;
642
+ this.changeDetectorRef = changeDetectorRef;
643
+ this.navigation = this.fEnvironmentService.getNavigation();
1092
644
  }
1093
- subscribeOnScroll() {
1094
- return fromEvent(this.fScrollableContainer, 'scroll').pipe(debounceTime(100)).subscribe((event) => {
1095
- this.calculateHashAndActivate();
645
+ ngOnInit() {
646
+ const currentPath = this.router.url;
647
+ const prefix = currentPath.substring(0, currentPath.lastIndexOf('/'));
648
+ const navigation = deepClone(this.fEnvironmentService.getNavigation());
649
+ navigation.forEach((group) => {
650
+ group.items.forEach((item) => {
651
+ this.normalizeLink(item, prefix);
652
+ });
1096
653
  });
654
+ this.navigation = navigation;
1097
655
  }
1098
- scrollTo(hash) {
1099
- if (!this.fScrollableContainer) {
1100
- throw new Error('Scrollable container is not set');
656
+ normalizeLink(item, prefix) {
657
+ if (item.link && !this.isExternalLink(item.link)) {
658
+ item.link = item.link.startsWith('/') ? `${prefix}${item.link}` : `${prefix}/${item.link}`;
1101
659
  }
1102
- this.activateHash(hash);
1103
- new ScrollToElementInContainer(this.fScrollableContainer).handle(hash);
1104
- }
1105
- setOnPageNavigation(fMarkdownPage) {
1106
- this.tocData = new GetTableOfContentDataHandler().handle(new GetTableOfContentDataRequest(fMarkdownPage, this.fEnvironmentService.getToC().range));
1107
- this.calculateHashAndActivate();
1108
- }
1109
- calculateHashAndActivate() {
1110
- this.activateHash(this.calculateHashFromScrollPosition());
1111
- }
1112
- calculateHashFromScrollPosition() {
1113
- return new CalculateHashFromScrollPositionHandler(this.fScrollableContainer, this.fBrowser).handle(new CalculateHashFromScrollPositionRequest(this.tocData.flat));
1114
- }
1115
- activateHash(hash) {
1116
- this.tocData.flat.forEach(x => x.isActive = x.hash === hash);
1117
- this.onTocChanged$.next();
1118
- }
1119
- dispose() {
1120
- this.onScrollSubscription$.unsubscribe();
1121
- }
1122
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FScrollableService, deps: [{ token: FEnvironmentService }, { token: i2.BrowserService }], target: i0.ɵɵFactoryTarget.Injectable }); }
1123
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FScrollableService }); }
1124
- }
1125
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FScrollableService, decorators: [{
1126
- type: Injectable
1127
- }], ctorParameters: () => [{ type: FEnvironmentService }, { type: i2.BrowserService }] });
1128
-
1129
- class FScrollableContainerComponent {
1130
- get hostElement() {
1131
- return this.elementRef.nativeElement;
1132
- }
1133
- constructor(elementRef, fScrollableService) {
1134
- this.elementRef = elementRef;
1135
- this.fScrollableService = fScrollableService;
1136
- }
1137
- ngOnInit() {
1138
- this.fScrollableService.setContainer(this.hostElement);
1139
660
  }
1140
- ngOnDestroy() {
1141
- this.fScrollableService.dispose();
661
+ isExternalLink(href) {
662
+ return href.startsWith('www') || href.startsWith('http');
1142
663
  }
1143
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FScrollableContainerComponent, deps: [{ token: i0.ElementRef }, { token: FScrollableService }], target: i0.ɵɵFactoryTarget.Component }); }
1144
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FScrollableContainerComponent, isStandalone: true, selector: "f-scrollable-container", providers: [
1145
- FScrollableService
1146
- ], ngImport: i0, template: "<ng-content></ng-content>\n\n\n\n", styles: [":host{position:relative;width:100%;height:100%;overflow:hidden;overflow-y:auto}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1147
- }
1148
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FScrollableContainerComponent, decorators: [{
1149
- type: Component,
1150
- args: [{ selector: 'f-scrollable-container', providers: [
1151
- FScrollableService
1152
- ], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-content></ng-content>\n\n\n\n", styles: [":host{position:relative;width:100%;height:100%;overflow:hidden;overflow-y:auto}\n"] }]
1153
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: FScrollableService }] });
1154
-
1155
- class FDocumentationComponent {
1156
- constructor(fPopoverService, changeDetectorRef) {
1157
- this.fPopoverService = fPopoverService;
1158
- this.changeDetectorRef = changeDetectorRef;
1159
- this.subscriptions$ = new Subscription();
1160
- this.isNavigationVisible = false;
1161
- this.popoverMessage = null;
664
+ ngAfterViewInit() {
665
+ this.subscription.add(this.subscribeOnRouteChanges());
1162
666
  }
1163
- ngOnInit() {
1164
- this.subscriptions$.add(this.subscribeOnPopover());
667
+ subscribeOnRouteChanges() {
668
+ return this.router.events.pipe(startWith(new NavigationEnd(1, '', '')), filter$1(event => event instanceof NavigationEnd)).subscribe(() => {
669
+ this.highlightLink(this.router.url);
670
+ this.fDocumentation.onToggleNavigation(false);
671
+ this.changeDetectorRef.detectChanges();
672
+ });
1165
673
  }
1166
- subscribeOnPopover() {
1167
- return this.fPopoverService.popover$.subscribe((x) => {
1168
- this.popoverMessage = x;
1169
- this.changeDetectorRef.markForCheck();
674
+ highlightLink(url) {
675
+ this.value = undefined;
676
+ this.navigation.forEach((group) => {
677
+ this.value = group.items.find((x) => {
678
+ return url.endsWith(x.link);
679
+ })?.link || this.value;
1170
680
  });
1171
681
  }
1172
- onToggleNavigation(value) {
1173
- this.isNavigationVisible = value;
1174
- this.changeDetectorRef.markForCheck();
682
+ onDocumentClick(event) {
683
+ this.injector.get(HandleNavigationLinksHandler).handle(new HandleNavigationLinksRequest(event));
1175
684
  }
1176
685
  ngOnDestroy() {
1177
- this.fPopoverService.dispose();
1178
- this.subscriptions$.unsubscribe();
686
+ this.subscription.unsubscribe();
1179
687
  }
1180
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FDocumentationComponent, deps: [{ token: FPopoverService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
1181
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: FDocumentationComponent, isStandalone: true, selector: "f-documentation", providers: [
1182
- FEnvironmentService,
1183
- FPopoverService,
1184
- { provide: F_DOCUMENTATION_COMPONENT, useExisting: FDocumentationComponent }
1185
- ], ngImport: i0, template: "<div class=\"f-backdrop\" [class.visible]=\"isNavigationVisible\" (click)=\"onToggleNavigation(false)\"></div>\n<f-navigation-panel [class.visible]=\"isNavigationVisible\"></f-navigation-panel>\n\n<f-scrollable-container>\n <f-header></f-header>\n <router-outlet></router-outlet>\n</f-scrollable-container>\n@if (popoverMessage) {\n <div class=\"popover\">{{ popoverMessage }}</div>\n}\n", styles: [":host{display:flex;justify-content:flex-start;align-items:flex-start;height:100%;gap:10px}.f-backdrop{position:fixed;inset:0;opacity:0;z-index:var(--z-index-backdrop);background:var(--backdrop-color);transition:opacity .2s ease-in-out;pointer-events:none}.f-backdrop.visible{opacity:1;pointer-events:all}@media (min-width: 960px){.f-backdrop{position:unset}}.popover{position:fixed;min-width:120px;bottom:50%;left:50%;text-align:center;transform:translate(-50%,-50%);background-color:var(--code-view-copy-button-hover-background);border:1px solid var(--code-view-copy-button-border-color);color:var(--primary-text);font-size:14px;padding:4px 8px;border-radius:4px;z-index:var(--z-index-popover);opacity:1}\n"], dependencies: [{ kind: "component", type: FNavigationPanelComponent, selector: "f-navigation-panel" }, { kind: "component", type: FHeaderComponent, selector: "f-header" }, { kind: "component", type: FScrollableContainerComponent, selector: "f-scrollable-container" }, { kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
688
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FNavigationPanelComponent, deps: [{ token: FDocumentationEnvironmentService }, { token: F_DOCUMENTATION_COMPONENT }, { token: i1.Router }, { token: i0.Injector }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
689
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: FNavigationPanelComponent, isStandalone: true, selector: "f-navigation-panel", host: { listeners: { "click": "onDocumentClick($event)" } }, providers: [
690
+ HandleNavigationLinksHandler
691
+ ], viewQueries: [{ propertyName: "items", predicate: FNavigationItemComponent, descendants: true }], ngImport: i0, template: "<a f-navigation-header routerLink></a>\n\n@for (group of navigation; track group) {\n <f-navigation-group [title]=\"group.text\">\n @for (item of group.items; track item.link) {\n <a f-navigation-item [href]=\"item.link\" [class.active]=\"item.link === value\">\n <div class=\"text-ellipsis\">{{ item.text }}</div>\n @if (item.badge) {\n <span f-badge [text]=\"item.badge.text\" [type]=\"item.badge.type\"></span>\n }\n </a>\n }\n </f-navigation-group>\n}\n", styles: [":host{height:100%;flex-direction:column;justify-content:flex-start;align-items:flex-start;padding:0 var(--navigation-panel-padding);background-color:var(--navigation-panel-background);overflow:hidden;overflow-y:auto;position:fixed;width:var(--navigation-panel-width);top:0;left:calc(-1 * var(--navigation-panel-width));transition:transform .2s ease-in-out;z-index:var(--z-index-navigation);transform:none}@media (min-width: 960px){:host{position:unset;display:flex;min-width:var(--navigation-panel-width);width:fit-content;transform:none!important}}@media (min-width: 1440px){:host{min-width:calc((100% - (var(--layout-max-width) - 64px)) / 3 + var(--navigation-panel-width) - var(--navigation-panel-padding))}}:host.visible{transform:translate(var(--navigation-panel-width))}\n"], dependencies: [{ kind: "component", type: FNavigationHeaderComponent, selector: "a[f-navigation-header]" }, { kind: "component", type: FNavigationItemComponent, selector: "a[f-navigation-item]" }, { kind: "component", type: FNavigationGroupComponent, selector: "f-navigation-group", inputs: ["title"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: FBadgeComponent, selector: "span[f-badge]", inputs: ["text", "type"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1186
692
  }
1187
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FDocumentationComponent, decorators: [{
1188
- type: Component,
1189
- args: [{ selector: 'f-documentation', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
1190
- FEnvironmentService,
1191
- FPopoverService,
1192
- { provide: F_DOCUMENTATION_COMPONENT, useExisting: FDocumentationComponent }
693
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FNavigationPanelComponent, decorators: [{
694
+ type: Component,
695
+ args: [{ selector: 'f-navigation-panel', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
696
+ HandleNavigationLinksHandler
1193
697
  ], imports: [
1194
- FNavigationPanelComponent,
1195
- FHeaderComponent,
1196
- FScrollableContainerComponent,
1197
- RouterOutlet
1198
- ], template: "<div class=\"f-backdrop\" [class.visible]=\"isNavigationVisible\" (click)=\"onToggleNavigation(false)\"></div>\n<f-navigation-panel [class.visible]=\"isNavigationVisible\"></f-navigation-panel>\n\n<f-scrollable-container>\n <f-header></f-header>\n <router-outlet></router-outlet>\n</f-scrollable-container>\n@if (popoverMessage) {\n <div class=\"popover\">{{ popoverMessage }}</div>\n}\n", styles: [":host{display:flex;justify-content:flex-start;align-items:flex-start;height:100%;gap:10px}.f-backdrop{position:fixed;inset:0;opacity:0;z-index:var(--z-index-backdrop);background:var(--backdrop-color);transition:opacity .2s ease-in-out;pointer-events:none}.f-backdrop.visible{opacity:1;pointer-events:all}@media (min-width: 960px){.f-backdrop{position:unset}}.popover{position:fixed;min-width:120px;bottom:50%;left:50%;text-align:center;transform:translate(-50%,-50%);background-color:var(--code-view-copy-button-hover-background);border:1px solid var(--code-view-copy-button-border-color);color:var(--primary-text);font-size:14px;padding:4px 8px;border-radius:4px;z-index:var(--z-index-popover);opacity:1}\n"] }]
1199
- }], ctorParameters: () => [{ type: FPopoverService }, { type: i0.ChangeDetectorRef }] });
1200
-
1201
- var index$1 = /*#__PURE__*/Object.freeze({
1202
- __proto__: null,
1203
- CookiePopup: CookiePopup,
1204
- FBadgeComponent: FBadgeComponent,
1205
- FCheckboxComponent: FCheckboxComponent,
1206
- FDocumentationComponent: FDocumentationComponent,
1207
- FHamburgerButtonComponent: FHamburgerButtonComponent,
1208
- FHeaderComponent: FHeaderComponent,
1209
- FHeaderMenuComponent: FHeaderMenuComponent,
1210
- FPreviewComponent: FPreviewComponent,
1211
- FSocialLinksComponent: FSocialLinksComponent,
1212
- FThemeButtonComponent: FThemeButtonComponent,
1213
- FVersionComponent: FVersionComponent,
1214
- F_DOCUMENTATION_COMPONENT: F_DOCUMENTATION_COMPONENT
1215
- });
698
+ FNavigationHeaderComponent,
699
+ FNavigationItemComponent,
700
+ FNavigationGroupComponent,
701
+ RouterLink,
702
+ FBadgeComponent,
703
+ ], template: "<a f-navigation-header routerLink></a>\n\n@for (group of navigation; track group) {\n <f-navigation-group [title]=\"group.text\">\n @for (item of group.items; track item.link) {\n <a f-navigation-item [href]=\"item.link\" [class.active]=\"item.link === value\">\n <div class=\"text-ellipsis\">{{ item.text }}</div>\n @if (item.badge) {\n <span f-badge [text]=\"item.badge.text\" [type]=\"item.badge.type\"></span>\n }\n </a>\n }\n </f-navigation-group>\n}\n", styles: [":host{height:100%;flex-direction:column;justify-content:flex-start;align-items:flex-start;padding:0 var(--navigation-panel-padding);background-color:var(--navigation-panel-background);overflow:hidden;overflow-y:auto;position:fixed;width:var(--navigation-panel-width);top:0;left:calc(-1 * var(--navigation-panel-width));transition:transform .2s ease-in-out;z-index:var(--z-index-navigation);transform:none}@media (min-width: 960px){:host{position:unset;display:flex;min-width:var(--navigation-panel-width);width:fit-content;transform:none!important}}@media (min-width: 1440px){:host{min-width:calc((100% - (var(--layout-max-width) - 64px)) / 3 + var(--navigation-panel-width) - var(--navigation-panel-padding))}}:host.visible{transform:translate(var(--navigation-panel-width))}\n"] }]
704
+ }], ctorParameters: () => [{ type: FDocumentationEnvironmentService }, { type: undefined, decorators: [{
705
+ type: Inject,
706
+ args: [F_DOCUMENTATION_COMPONENT]
707
+ }] }, { type: i1.Router }, { type: i0.Injector }, { type: i0.ChangeDetectorRef }], propDecorators: { items: [{
708
+ type: ViewChildren,
709
+ args: [FNavigationItemComponent]
710
+ }], onDocumentClick: [{
711
+ type: HostListener,
712
+ args: ['click', ['$event']]
713
+ }] } });
1216
714
 
1217
715
  class HandleDynamicComponentsHandler {
716
+ fEnvironmentService;
717
+ injector;
718
+ componentRefs = [];
1218
719
  constructor(fEnvironmentService, injector) {
1219
720
  this.fEnvironmentService = fEnvironmentService;
1220
721
  this.injector = injector;
1221
- this.componentRefs = [];
1222
722
  }
1223
723
  handle(request) {
1224
724
  this.dispose();
@@ -1305,14 +805,15 @@ class HandleDynamicComponentsHandler {
1305
805
  this.componentRefs.forEach((ref) => ref.destroy());
1306
806
  this.componentRefs = [];
1307
807
  }
1308
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HandleDynamicComponentsHandler, deps: [{ token: FEnvironmentService }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); }
1309
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HandleDynamicComponentsHandler }); }
808
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HandleDynamicComponentsHandler, deps: [{ token: FDocumentationEnvironmentService }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable });
809
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HandleDynamicComponentsHandler });
1310
810
  }
1311
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HandleDynamicComponentsHandler, decorators: [{
811
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HandleDynamicComponentsHandler, decorators: [{
1312
812
  type: Injectable
1313
- }], ctorParameters: () => [{ type: FEnvironmentService }, { type: i0.Injector }] });
813
+ }], ctorParameters: () => [{ type: FDocumentationEnvironmentService }, { type: i0.Injector }] });
1314
814
 
1315
815
  class HandleDynamicComponentsRequest {
816
+ hostElement;
1316
817
  constructor(hostElement) {
1317
818
  this.hostElement = hostElement;
1318
819
  }
@@ -1403,6 +904,7 @@ const RULE$1 = {
1403
904
  };
1404
905
 
1405
906
  class MarkCodeFocusedBlocksPostProcessor {
907
+ fBrowser;
1406
908
  constructor(fBrowser) {
1407
909
  this.fBrowser = fBrowser;
1408
910
  }
@@ -1454,6 +956,8 @@ const RULE = {
1454
956
  };
1455
957
 
1456
958
  class HighlightService {
959
+ fBrowser;
960
+ Prism;
1457
961
  constructor(fBrowser) {
1458
962
  this.fBrowser = fBrowser;
1459
963
  }
@@ -1492,18 +996,21 @@ class HighlightService {
1492
996
  element.querySelectorAll('pre code:not([class*="language-"])').forEach((x) => x.classList.add('language-none'));
1493
997
  return of(element);
1494
998
  }
1495
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HighlightService, deps: [{ token: i2.BrowserService }], target: i0.ɵɵFactoryTarget.Injectable }); }
1496
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HighlightService }); }
999
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HighlightService, deps: [{ token: i2.BrowserService }], target: i0.ɵɵFactoryTarget.Injectable });
1000
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HighlightService });
1497
1001
  }
1498
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HighlightService, decorators: [{
1002
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HighlightService, decorators: [{
1499
1003
  type: Injectable
1500
1004
  }], ctorParameters: () => [{ type: i2.BrowserService }] });
1501
1005
 
1502
1006
  class FCodeViewHandler {
1007
+ element;
1008
+ injector;
1009
+ subscriptions$ = new Subscription();
1010
+ fDocument;
1503
1011
  constructor(element, injector) {
1504
1012
  this.element = element;
1505
1013
  this.injector = injector;
1506
- this.subscriptions$ = new Subscription();
1507
1014
  this.fDocument = this.injector.get(DOCUMENT);
1508
1015
  this.initialize();
1509
1016
  }
@@ -1554,6 +1061,7 @@ class FCodeViewHandler {
1554
1061
  }
1555
1062
 
1556
1063
  class FExampleViewHandler {
1064
+ element;
1557
1065
  constructor(element) {
1558
1066
  this.element = element;
1559
1067
  }
@@ -1605,6 +1113,9 @@ class FAsyncCodeViewHandler extends FCodeViewHandler {
1605
1113
  }
1606
1114
 
1607
1115
  class FCodeGroupBodyHandler {
1116
+ element;
1117
+ injector;
1118
+ fContainerHandlers;
1608
1119
  constructor(element, injector) {
1609
1120
  this.element = element;
1610
1121
  this.injector = injector;
@@ -1647,6 +1158,10 @@ class FCodeGroupBodyHandler {
1647
1158
  }
1648
1159
 
1649
1160
  class FCodeGroupHandler {
1161
+ element;
1162
+ injector;
1163
+ subscriptions$ = new Subscription();
1164
+ body;
1650
1165
  get tabs() {
1651
1166
  return Array.from(this.element.querySelectorAll('.f-tab-button'));
1652
1167
  }
@@ -1660,7 +1175,6 @@ class FCodeGroupHandler {
1660
1175
  constructor(element, injector) {
1661
1176
  this.element = element;
1662
1177
  this.injector = injector;
1663
- this.subscriptions$ = new Subscription();
1664
1178
  this.body = new FCodeGroupBodyHandler(this.element, this.injector);
1665
1179
  this.initialize();
1666
1180
  }
@@ -1696,10 +1210,11 @@ class FCodeGroupHandler {
1696
1210
  }
1697
1211
 
1698
1212
  class HandleParsedContainersHandler {
1213
+ injector;
1214
+ fCodeGroupHandler = [];
1215
+ fCodeViewHandler = [];
1699
1216
  constructor(injector) {
1700
1217
  this.injector = injector;
1701
- this.fCodeGroupHandler = [];
1702
- this.fCodeViewHandler = [];
1703
1218
  }
1704
1219
  handle(request) {
1705
1220
  this.dispose();
@@ -1719,14 +1234,15 @@ class HandleParsedContainersHandler {
1719
1234
  this.fCodeGroupHandler.forEach((x) => x.dispose?.());
1720
1235
  this.fCodeViewHandler.forEach((x) => x.dispose?.());
1721
1236
  }
1722
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HandleParsedContainersHandler, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); }
1723
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HandleParsedContainersHandler }); }
1237
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HandleParsedContainersHandler, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable });
1238
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HandleParsedContainersHandler });
1724
1239
  }
1725
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HandleParsedContainersHandler, decorators: [{
1240
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HandleParsedContainersHandler, decorators: [{
1726
1241
  type: Injectable
1727
1242
  }], ctorParameters: () => [{ type: i0.Injector }] });
1728
1243
 
1729
1244
  class HandleParsedContainersRequest {
1245
+ hostElement;
1730
1246
  constructor(hostElement) {
1731
1247
  this.hostElement = hostElement;
1732
1248
  }
@@ -1937,6 +1453,7 @@ class ParseExampleGroup {
1937
1453
  }
1938
1454
 
1939
1455
  class ParsePreviewGroup {
1456
+ navigation;
1940
1457
  constructor(navigation) {
1941
1458
  this.navigation = navigation;
1942
1459
  }
@@ -1975,69 +1492,315 @@ class ParsePreviewGroup {
1975
1492
  return `<h2>${x.text}</h2><div class="f-preview-group">${this.getItemsHTML(x)}</div>`;
1976
1493
  }).join('');
1977
1494
  }
1978
- getItemsHTML(group) {
1979
- return group.items.map((item) => {
1980
- return `<f-preview data-group="${group.text}" data-item="${item.link}"></f-preview>`;
1981
- }).join('');
1495
+ getItemsHTML(group) {
1496
+ return group.items.map((item) => {
1497
+ return `<f-preview data-group="${group.text}" data-item="${item.link}"></f-preview>`;
1498
+ }).join('');
1499
+ }
1500
+ }
1501
+
1502
+ class MarkdownService {
1503
+ httpClient;
1504
+ domSanitizer;
1505
+ fEnvironment;
1506
+ router;
1507
+ markdown = new MarkdownIt({ html: true, linkify: true });
1508
+ constructor(httpClient, domSanitizer, fEnvironment, router) {
1509
+ this.httpClient = httpClient;
1510
+ this.domSanitizer = domSanitizer;
1511
+ this.fEnvironment = fEnvironment;
1512
+ this.router = router;
1513
+ this.markdown
1514
+ .use((x) => new ParseCodeView().render(x))
1515
+ .use(...new ParseAlerts().render(EMarkdownContainerType.ALERT_TIP, this.markdown))
1516
+ .use(...new ParseAlerts().render(EMarkdownContainerType.ALERT_INFO, this.markdown))
1517
+ .use(...new ParseAlerts().render(EMarkdownContainerType.ALERT_WARNING, this.markdown))
1518
+ .use(...new ParseAlerts().render(EMarkdownContainerType.ALERT_DANGER, this.markdown))
1519
+ .use(...new ParseAlerts().render(EMarkdownContainerType.ALERT_DANGER, this.markdown))
1520
+ .use(...new ParseAlerts().render(EMarkdownContainerType.ALERT_SUCCESS, this.markdown))
1521
+ .use(...new ParseCodeGroup().render())
1522
+ .use(...new ParsePreviewGroup(this.fEnvironment.getNavigation()).render())
1523
+ .use(...new ParseExampleGroup().render());
1524
+ }
1525
+ parse(src) {
1526
+ return this.httpClient.get(src, { responseType: 'text' }).pipe(take(1), catchError(() => of(''))).pipe(switchMap((text) => of(this.markdown.render(text))), switchMap((x) => of(this.cleanupEmptyParagraphs(x))), switchMap((x) => of(this.cleanupWasteParagraphFromExampleView(x))), switchMap((x) => of(this.cleanupWasteParagraphFromPreviewGroup(x))), switchMap((x) => of(this.normalizeLinks(x))), switchMap((x) => of(this.domSanitizer.bypassSecurityTrustHtml(x))));
1527
+ }
1528
+ normalizeLinks(html) {
1529
+ const currentPath = this.router.url;
1530
+ const prefix = currentPath.substring(0, currentPath.lastIndexOf('/'));
1531
+ return html.replace(/<a\s+href="([^"]*)"/g, (match, href) => {
1532
+ if (!this.isExternalLink(href)) {
1533
+ let newHref = href.substring(0);
1534
+ if (!href.startsWith('./')) {
1535
+ newHref = href.startsWith('/') ? `${prefix}${href}` : `${prefix}/${href}`;
1536
+ }
1537
+ return `<a href="${newHref}"`;
1538
+ }
1539
+ return match;
1540
+ });
1541
+ }
1542
+ isExternalLink(href) {
1543
+ return href.startsWith('www') || href.startsWith('http');
1544
+ }
1545
+ cleanupEmptyParagraphs(html) {
1546
+ return html.replace(/<p>\s*<\/p>/g, '');
1547
+ }
1548
+ cleanupWasteParagraphFromExampleView(html) {
1549
+ return html.replace(/<div class="f-code-group-body">\s*<p>[^<]*<\/p>/g, '<div class="f-code-group-body">');
1550
+ }
1551
+ cleanupWasteParagraphFromPreviewGroup(html) {
1552
+ return html.replace(/<p>(\[[^\]]+\](\s*\[[^\]]+\])*)<\/p>/g, '');
1553
+ }
1554
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MarkdownService, deps: [{ token: i1$1.HttpClient }, { token: i2$1.DomSanitizer }, { token: FDocumentationEnvironmentService }, { token: i1.Router }], target: i0.ɵɵFactoryTarget.Injectable });
1555
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MarkdownService });
1556
+ }
1557
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MarkdownService, decorators: [{
1558
+ type: Injectable
1559
+ }], ctorParameters: () => [{ type: i1$1.HttpClient }, { type: i2$1.DomSanitizer }, { type: FDocumentationEnvironmentService }, { type: i1.Router }] });
1560
+
1561
+ class GetAbsoluteTopToContainerHandler {
1562
+ handle(request) {
1563
+ let element = request.element;
1564
+ let result = 0;
1565
+ while (element !== request.container) {
1566
+ if (!element)
1567
+ return NaN;
1568
+ result += element.offsetTop;
1569
+ element = element.offsetParent;
1570
+ }
1571
+ return result;
1572
+ }
1573
+ }
1574
+
1575
+ class GetAbsoluteTopToContainerRequest {
1576
+ element;
1577
+ container;
1578
+ constructor(element, container) {
1579
+ this.element = element;
1580
+ this.container = container;
1581
+ }
1582
+ }
1583
+
1584
+ class TableOfContentData {
1585
+ flat;
1586
+ tree;
1587
+ constructor(flat, tree) {
1588
+ this.flat = flat;
1589
+ this.tree = tree;
1590
+ }
1591
+ }
1592
+
1593
+ class GetTableOfContentDataHandler {
1594
+ handle(request) {
1595
+ const flat = [];
1596
+ const tree = [];
1597
+ const stack = [];
1598
+ this.getNavigationSelectors(request.fMarkdownPage, request.tocRange).forEach((element) => {
1599
+ const tocItem = this.createItem(element);
1600
+ this.insertItemIntoTree(tocItem, tree, stack);
1601
+ flat.push(tocItem);
1602
+ });
1603
+ return new TableOfContentData(flat, tree);
1604
+ }
1605
+ getNavigationSelectors(fMarkdownPage, tocRange) {
1606
+ if (!tocRange || tocRange.start < 1 || tocRange.end > 6) {
1607
+ tocRange = { start: 1, end: 6 };
1608
+ }
1609
+ let selectors = [];
1610
+ for (let i = tocRange.start; i <= tocRange.end; i++) {
1611
+ selectors.push(`h${i}`);
1612
+ }
1613
+ return Array.from(fMarkdownPage.querySelectorAll(selectors.join(', ')));
1614
+ }
1615
+ createItem(element) {
1616
+ element.id = this.createNavigationId(element);
1617
+ return {
1618
+ hash: `#${element.id}`,
1619
+ title: element.innerHTML,
1620
+ element,
1621
+ children: []
1622
+ };
1623
+ }
1624
+ createNavigationId(element) {
1625
+ return element.innerHTML.toLowerCase().replaceAll(' ', '-');
1626
+ }
1627
+ getLevel(element) {
1628
+ return parseInt(element.tagName.substring(1));
1629
+ }
1630
+ insertItemIntoTree(tocItem, tree, stack) {
1631
+ while (stack.length > 0 && this.getLevel(stack[stack.length - 1].element) >= this.getLevel(tocItem.element)) {
1632
+ stack.pop();
1633
+ }
1634
+ if (stack.length === 0) {
1635
+ tree.push(tocItem);
1636
+ }
1637
+ else {
1638
+ stack[stack.length - 1].children.push(tocItem);
1639
+ }
1640
+ stack.push(tocItem);
1641
+ }
1642
+ }
1643
+
1644
+ class GetTableOfContentDataRequest {
1645
+ fMarkdownPage;
1646
+ tocRange;
1647
+ constructor(fMarkdownPage, tocRange) {
1648
+ this.fMarkdownPage = fMarkdownPage;
1649
+ this.tocRange = tocRange;
1650
+ }
1651
+ }
1652
+
1653
+ class CalculateHashFromScrollPositionHandler {
1654
+ scrollableContainer;
1655
+ fBrowser;
1656
+ constructor(scrollableContainer, fBrowser) {
1657
+ this.scrollableContainer = scrollableContainer;
1658
+ this.fBrowser = fBrowser;
1659
+ }
1660
+ handle(request) {
1661
+ let result;
1662
+ const containerScrollTop = this.getContainerScrollTop();
1663
+ const elementsWithTopPosition = this.calculateElementsTopPositions(request.tocData);
1664
+ if (elementsWithTopPosition.length) {
1665
+ if (this.isScrollAtBottom(containerScrollTop)) {
1666
+ result = elementsWithTopPosition[elementsWithTopPosition.length - 1].hash;
1667
+ }
1668
+ else {
1669
+ result = this.findTargetHashByPosition(containerScrollTop, elementsWithTopPosition);
1670
+ }
1671
+ }
1672
+ return result;
1673
+ }
1674
+ getContainerScrollTop() {
1675
+ return this.scrollableContainer.scrollTop + this.getHeaderHeight();
1676
+ }
1677
+ getHeaderHeight() {
1678
+ return parseInt(this.fBrowser.window.getComputedStyle(this.fBrowser.document.documentElement).getPropertyValue('--header-height'), 10);
1679
+ }
1680
+ calculateElementsTopPositions(items) {
1681
+ return items.map((x) => {
1682
+ return {
1683
+ hash: x.hash,
1684
+ top: this.getAbsoluteTopToContainer(x.element)
1685
+ };
1686
+ }).filter((x) => !Number.isNaN(x.top));
1687
+ }
1688
+ getAbsoluteTopToContainer(element) {
1689
+ return new GetAbsoluteTopToContainerHandler().handle(new GetAbsoluteTopToContainerRequest(element, this.scrollableContainer));
1690
+ }
1691
+ isScrollAtBottom(containerScrollTop) {
1692
+ return Math.abs(containerScrollTop - this.getHeaderHeight() + this.scrollableContainer.clientHeight - this.scrollableContainer.scrollHeight) < 1;
1693
+ }
1694
+ findTargetHashByPosition(containerScrollTop, elementsWithTopPosition) {
1695
+ let result = elementsWithTopPosition[0].hash;
1696
+ for (const { hash, top } of elementsWithTopPosition) {
1697
+ if (top > containerScrollTop)
1698
+ break;
1699
+ result = hash;
1700
+ }
1701
+ return result;
1702
+ }
1703
+ }
1704
+
1705
+ class CalculateHashFromScrollPositionRequest {
1706
+ tocData;
1707
+ constructor(tocData) {
1708
+ this.tocData = tocData;
1709
+ }
1710
+ }
1711
+
1712
+ class ScrollToElementInContainer {
1713
+ container;
1714
+ constructor(container) {
1715
+ this.container = container;
1716
+ }
1717
+ handle(hash) {
1718
+ this.container.scrollTo({
1719
+ top: this.getScrollTo(this.getScrollToElement(hash)) - 64,
1720
+ behavior: 'smooth'
1721
+ });
1722
+ }
1723
+ getScrollToElement(hash) {
1724
+ const element = this.container.querySelector(hash);
1725
+ if (!element) {
1726
+ throw new Error(`Element ${hash} not found`);
1727
+ }
1728
+ return element;
1729
+ }
1730
+ getScrollTo(element) {
1731
+ return this.isFirstElementInContainer(element) ? 0 : this.calculateScrollTo(element);
1732
+ }
1733
+ isFirstElementInContainer(element) {
1734
+ return element.parentElement.children[0] === element;
1735
+ }
1736
+ calculateScrollTo(element) {
1737
+ return this.getElementTop(element) - this.getContainerTop() + this.container.scrollTop;
1738
+ }
1739
+ getElementTop(element) {
1740
+ return element.getBoundingClientRect().top;
1741
+ }
1742
+ getContainerTop() {
1743
+ return this.container.getBoundingClientRect().top;
1982
1744
  }
1983
1745
  }
1984
1746
 
1985
- class MarkdownService {
1986
- constructor(httpClient, domSanitizer, fEnvironment, router) {
1987
- this.httpClient = httpClient;
1988
- this.domSanitizer = domSanitizer;
1989
- this.fEnvironment = fEnvironment;
1990
- this.router = router;
1991
- this.markdown = new MarkdownIt({ html: true, linkify: true });
1992
- this.markdown
1993
- .use((x) => new ParseCodeView().render(x))
1994
- .use(...new ParseAlerts().render(EMarkdownContainerType.ALERT_TIP, this.markdown))
1995
- .use(...new ParseAlerts().render(EMarkdownContainerType.ALERT_INFO, this.markdown))
1996
- .use(...new ParseAlerts().render(EMarkdownContainerType.ALERT_WARNING, this.markdown))
1997
- .use(...new ParseAlerts().render(EMarkdownContainerType.ALERT_DANGER, this.markdown))
1998
- .use(...new ParseAlerts().render(EMarkdownContainerType.ALERT_DANGER, this.markdown))
1999
- .use(...new ParseAlerts().render(EMarkdownContainerType.ALERT_SUCCESS, this.markdown))
2000
- .use(...new ParseCodeGroup().render())
2001
- .use(...new ParsePreviewGroup(this.fEnvironment.getNavigation()).render())
2002
- .use(...new ParseExampleGroup().render());
1747
+ class FScrollableService {
1748
+ fEnvironmentService;
1749
+ fBrowser;
1750
+ fScrollableContainer;
1751
+ tocData = new TableOfContentData([], []);
1752
+ onTocChanged$ = new Subject();
1753
+ get onToc$() {
1754
+ return this.onTocChanged$.asObservable().pipe(map(() => this.tocData));
2003
1755
  }
2004
- parse(src) {
2005
- return this.httpClient.get(src, { responseType: 'text' }).pipe(take(1), catchError(() => of(''))).pipe(switchMap((text) => of(this.markdown.render(text))), switchMap((x) => of(this.cleanupEmptyParagraphs(x))), switchMap((x) => of(this.cleanupWasteParagraphFromExampleView(x))), switchMap((x) => of(this.cleanupWasteParagraphFromPreviewGroup(x))), switchMap((x) => of(this.normalizeLinks(x))), switchMap((x) => of(this.domSanitizer.bypassSecurityTrustHtml(x))));
1756
+ onScrollSubscription$ = Subscription.EMPTY;
1757
+ constructor(fEnvironmentService, fBrowser) {
1758
+ this.fEnvironmentService = fEnvironmentService;
1759
+ this.fBrowser = fBrowser;
2006
1760
  }
2007
- normalizeLinks(html) {
2008
- const currentPath = this.router.url;
2009
- const prefix = currentPath.substring(0, currentPath.lastIndexOf('/'));
2010
- return html.replace(/<a\s+href="([^"]*)"/g, (match, href) => {
2011
- if (!this.isExternalLink(href)) {
2012
- let newHref = href.substring(0);
2013
- if (!href.startsWith('./')) {
2014
- newHref = href.startsWith('/') ? `${prefix}${href}` : `${prefix}/${href}`;
2015
- }
2016
- return `<a href="${newHref}"`;
2017
- }
2018
- return match;
1761
+ setContainer(fScrollableContainer) {
1762
+ this.fScrollableContainer = fScrollableContainer;
1763
+ this.onScrollSubscription$ = this.subscribeOnScroll();
1764
+ }
1765
+ subscribeOnScroll() {
1766
+ return fromEvent(this.fScrollableContainer, 'scroll').pipe(debounceTime(100)).subscribe((event) => {
1767
+ this.calculateHashAndActivate();
2019
1768
  });
2020
1769
  }
2021
- isExternalLink(href) {
2022
- return href.startsWith('www') || href.startsWith('http');
1770
+ scrollTo(hash) {
1771
+ if (!this.fScrollableContainer) {
1772
+ throw new Error('Scrollable container is not set');
1773
+ }
1774
+ this.activateHash(hash);
1775
+ new ScrollToElementInContainer(this.fScrollableContainer).handle(hash);
2023
1776
  }
2024
- cleanupEmptyParagraphs(html) {
2025
- return html.replace(/<p>\s*<\/p>/g, '');
1777
+ setOnPageNavigation(fMarkdownPage) {
1778
+ this.tocData = new GetTableOfContentDataHandler().handle(new GetTableOfContentDataRequest(fMarkdownPage, this.fEnvironmentService.getToC().range));
1779
+ this.calculateHashAndActivate();
2026
1780
  }
2027
- cleanupWasteParagraphFromExampleView(html) {
2028
- return html.replace(/<div class="f-code-group-body">\s*<p>[^<]*<\/p>/g, '<div class="f-code-group-body">');
1781
+ calculateHashAndActivate() {
1782
+ this.activateHash(this.calculateHashFromScrollPosition());
2029
1783
  }
2030
- cleanupWasteParagraphFromPreviewGroup(html) {
2031
- return html.replace(/<p>(\[[^\]]+\](\s*\[[^\]]+\])*)<\/p>/g, '');
1784
+ calculateHashFromScrollPosition() {
1785
+ return new CalculateHashFromScrollPositionHandler(this.fScrollableContainer, this.fBrowser).handle(new CalculateHashFromScrollPositionRequest(this.tocData.flat));
1786
+ }
1787
+ activateHash(hash) {
1788
+ this.tocData.flat.forEach(x => x.isActive = x.hash === hash);
1789
+ this.onTocChanged$.next();
2032
1790
  }
2033
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MarkdownService, deps: [{ token: i1$1.HttpClient }, { token: i2$1.DomSanitizer }, { token: FEnvironmentService }, { token: i1.Router }], target: i0.ɵɵFactoryTarget.Injectable }); }
2034
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MarkdownService }); }
1791
+ dispose() {
1792
+ this.onScrollSubscription$.unsubscribe();
1793
+ }
1794
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FScrollableService, deps: [{ token: FDocumentationEnvironmentService }, { token: i2.BrowserService }], target: i0.ɵɵFactoryTarget.Injectable });
1795
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FScrollableService });
2035
1796
  }
2036
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MarkdownService, decorators: [{
1797
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FScrollableService, decorators: [{
2037
1798
  type: Injectable
2038
- }], ctorParameters: () => [{ type: i1$1.HttpClient }, { type: i2$1.DomSanitizer }, { type: FEnvironmentService }, { type: i1.Router }] });
1799
+ }], ctorParameters: () => [{ type: FDocumentationEnvironmentService }, { type: i2.BrowserService }] });
2039
1800
 
2040
1801
  class GetPreviousNextPageNavigationResponse {
1802
+ previousLink;
1803
+ nextLink;
2041
1804
  constructor(previousLink, nextLink) {
2042
1805
  this.previousLink = previousLink;
2043
1806
  this.nextLink = nextLink;
@@ -2045,6 +1808,7 @@ class GetPreviousNextPageNavigationResponse {
2045
1808
  }
2046
1809
 
2047
1810
  class GetPreviousNextPageNavigationHandler {
1811
+ fEnvironmentService;
2048
1812
  constructor(fEnvironmentService) {
2049
1813
  this.fEnvironmentService = fEnvironmentService;
2050
1814
  }
@@ -2080,25 +1844,28 @@ class GetPreviousNextPageNavigationHandler {
2080
1844
  }
2081
1845
 
2082
1846
  class GetPreviousNextPageNavigationRequest {
1847
+ currentLink;
2083
1848
  constructor(currentLink) {
2084
1849
  this.currentLink = currentLink;
2085
1850
  }
2086
1851
  }
2087
1852
 
2088
1853
  class FFooterEditInformationComponent {
2089
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FFooterEditInformationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2090
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FFooterEditInformationComponent, isStandalone: true, selector: "f-footer-edit-information", ngImport: i0, template: "<ng-content></ng-content>\n", styles: [":host{padding-bottom:18px}@media (min-width: 640px){:host{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1854
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FFooterEditInformationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1855
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FFooterEditInformationComponent, isStandalone: true, selector: "f-footer-edit-information", ngImport: i0, template: "<ng-content></ng-content>\n", styles: [":host{padding-bottom:18px}@media (min-width: 640px){:host{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2091
1856
  }
2092
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FFooterEditInformationComponent, decorators: [{
1857
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FFooterEditInformationComponent, decorators: [{
2093
1858
  type: Component,
2094
1859
  args: [{ selector: 'f-footer-edit-information', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<ng-content></ng-content>\n", styles: [":host{padding-bottom:18px}@media (min-width: 640px){:host{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}\n"] }]
2095
1860
  }] });
2096
1861
 
2097
1862
  class FFooterNavigationButtonComponent {
2098
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FFooterNavigationButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2099
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FFooterNavigationButtonComponent, isStandalone: true, selector: "a[f-footer-navigation-button]", inputs: { description: "description", link: "link" }, ngImport: i0, template: "<span class=\"description\">{{ description }}</span>\n<span class=\"page-title\">{{ link.text }}</span>\n", styles: [":host{display:block;border:1px solid var(--divider-color);border-radius:2px;padding:12px 16px;flex:1;max-width:50%;min-width:260px;text-decoration:none!important;cursor:pointer;pointer-events:all}:host:hover{border-color:var(--dark-divider-color)}:host:active{border-color:var(--primary-1)}:host.next{margin-left:auto;text-align:right}:host .description{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--secondary-text);pointer-events:none}:host .page-title{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--primary-1);pointer-events:none}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1863
+ description;
1864
+ link;
1865
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FFooterNavigationButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1866
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FFooterNavigationButtonComponent, isStandalone: true, selector: "a[f-footer-navigation-button]", inputs: { description: "description", link: "link" }, ngImport: i0, template: "<span class=\"description\">{{ description }}</span>\n<span class=\"page-title\">{{ link.text }}</span>\n", styles: [":host{display:block;border:1px solid var(--divider-color);border-radius:2px;padding:12px 16px;flex:1;max-width:50%;min-width:260px;text-decoration:none!important;cursor:pointer;pointer-events:all}:host:hover{border-color:var(--dark-divider-color)}:host:active{border-color:var(--primary-1)}:host.next{margin-left:auto;text-align:right}:host .description{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--secondary-text);pointer-events:none}:host .page-title{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--primary-1);pointer-events:none}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2100
1867
  }
2101
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FFooterNavigationButtonComponent, decorators: [{
1868
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FFooterNavigationButtonComponent, decorators: [{
2102
1869
  type: Component,
2103
1870
  args: [{ selector: 'a[f-footer-navigation-button]', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<span class=\"description\">{{ description }}</span>\n<span class=\"page-title\">{{ link.text }}</span>\n", styles: [":host{display:block;border:1px solid var(--divider-color);border-radius:2px;padding:12px 16px;flex:1;max-width:50%;min-width:260px;text-decoration:none!important;cursor:pointer;pointer-events:all}:host:hover{border-color:var(--dark-divider-color)}:host:active{border-color:var(--primary-1)}:host.next{margin-left:auto;text-align:right}:host .description{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--secondary-text);pointer-events:none}:host .page-title{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--primary-1);pointer-events:none}\n"] }]
2104
1871
  }], propDecorators: { description: [{
@@ -2110,40 +1877,47 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
2110
1877
  }] } });
2111
1878
 
2112
1879
  class FFooterNavigationComponent {
2113
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FFooterNavigationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2114
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FFooterNavigationComponent, isStandalone: true, selector: "nav[f-footer-navigation]", ngImport: i0, template: "<ng-content></ng-content>\n", styles: [":host{border-top:1px solid var(--divider-color);padding-top:24px;display:flex;justify-content:flex-start;align-items:flex-start;flex-wrap:wrap;gap:16px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1880
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FFooterNavigationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1881
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FFooterNavigationComponent, isStandalone: true, selector: "nav[f-footer-navigation]", ngImport: i0, template: "<ng-content></ng-content>\n", styles: [":host{border-top:1px solid var(--divider-color);padding-top:24px;display:flex;justify-content:flex-start;align-items:flex-start;flex-wrap:wrap;gap:16px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2115
1882
  }
2116
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FFooterNavigationComponent, decorators: [{
1883
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FFooterNavigationComponent, decorators: [{
2117
1884
  type: Component,
2118
1885
  args: [{ selector: 'nav[f-footer-navigation]', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<ng-content></ng-content>\n", styles: [":host{border-top:1px solid var(--divider-color);padding-top:24px;display:flex;justify-content:flex-start;align-items:flex-start;flex-wrap:wrap;gap:16px}\n"] }]
2119
1886
  }] });
2120
1887
 
2121
1888
  class FFooterEditLinkComponent {
2122
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FFooterEditLinkComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2123
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FFooterEditLinkComponent, isStandalone: true, selector: "a[f-footer-edit-link]", ngImport: i0, template: "<span class=\"edit-link-icon f-icon edit\"></span>\n<ng-content></ng-content>\n", styles: [":host{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--primary-1);cursor:pointer}:host .edit-link-icon{margin-right:8px;width:14px;height:14px;color:inherit}:host:hover{color:var(--primary-2)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1889
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FFooterEditLinkComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1890
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FFooterEditLinkComponent, isStandalone: true, selector: "a[f-footer-edit-link]", ngImport: i0, template: "<span class=\"edit-link-icon f-icon edit\"></span>\n<ng-content></ng-content>\n", styles: [":host{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--primary-1);cursor:pointer}:host .edit-link-icon{margin-right:8px;width:14px;height:14px;color:inherit}:host:hover{color:var(--primary-2)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2124
1891
  }
2125
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FFooterEditLinkComponent, decorators: [{
1892
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FFooterEditLinkComponent, decorators: [{
2126
1893
  type: Component,
2127
1894
  args: [{ selector: 'a[f-footer-edit-link]', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<span class=\"edit-link-icon f-icon edit\"></span>\n<ng-content></ng-content>\n", styles: [":host{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--primary-1);cursor:pointer}:host .edit-link-icon{margin-right:8px;width:14px;height:14px;color:inherit}:host:hover{color:var(--primary-2)}\n"] }]
2128
1895
  }] });
2129
1896
 
2130
1897
  class FFooterLastUpdatedComponent {
2131
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FFooterLastUpdatedComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2132
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FFooterLastUpdatedComponent, isStandalone: true, selector: "f-footer-last-updated", ngImport: i0, template: "<ng-content></ng-content>\n", styles: [":host{line-height:24px;font-size:14px;font-weight:500;color:var(--secondary-text)}@media (min-width: 640px){:host{line-height:32px;font-size:14px;font-weight:500}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1898
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FFooterLastUpdatedComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1899
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FFooterLastUpdatedComponent, isStandalone: true, selector: "f-footer-last-updated", ngImport: i0, template: "<ng-content></ng-content>\n", styles: [":host{line-height:24px;font-size:14px;font-weight:500;color:var(--secondary-text)}@media (min-width: 640px){:host{line-height:32px;font-size:14px;font-weight:500}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2133
1900
  }
2134
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FFooterLastUpdatedComponent, decorators: [{
1901
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FFooterLastUpdatedComponent, decorators: [{
2135
1902
  type: Component,
2136
1903
  args: [{ selector: 'f-footer-last-updated', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<ng-content></ng-content>\n", styles: [":host{line-height:24px;font-size:14px;font-weight:500;color:var(--secondary-text)}@media (min-width: 640px){:host{line-height:32px;font-size:14px;font-weight:500}}\n"] }]
2137
1904
  }] });
2138
1905
 
2139
1906
  class FMarkdownFooterComponent {
1907
+ injector;
1908
+ fEnvironmentService;
1909
+ router;
1910
+ changeDetectorRef;
1911
+ subscriptions$ = new Subscription();
1912
+ navigation = {};
1913
+ editLink;
1914
+ previousLink;
1915
+ nextLink;
2140
1916
  constructor(injector, fEnvironmentService, router, changeDetectorRef) {
2141
1917
  this.injector = injector;
2142
1918
  this.fEnvironmentService = fEnvironmentService;
2143
1919
  this.router = router;
2144
1920
  this.changeDetectorRef = changeDetectorRef;
2145
- this.subscriptions$ = new Subscription();
2146
- this.navigation = {};
2147
1921
  }
2148
1922
  ngOnInit() {
2149
1923
  this.subscriptions$.add(this.subscribeOnRouteChanges());
@@ -2188,10 +1962,10 @@ class FMarkdownFooterComponent {
2188
1962
  ngOnDestroy() {
2189
1963
  this.subscriptions$.unsubscribe();
2190
1964
  }
2191
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FMarkdownFooterComponent, deps: [{ token: i0.Injector }, { token: FEnvironmentService }, { token: i1.Router }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
2192
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: FMarkdownFooterComponent, isStandalone: true, selector: "footer [f-markdown-footer]", host: { listeners: { "click": "onDocumentClick($event)" } }, ngImport: i0, template: "@if (editLink) {\n <f-footer-edit-information>\n <a f-footer-edit-link [href]=\"editLink\">\n {{ navigation.editLink?.text || 'Edit this page on GitHub' }}\n </a>\n\n <!-- <f-footer-last-updated>-->\n <!-- Last updated: <span>{{ lastUpdated.datetime }}</span>-->\n <!-- </f-footer-last-updated>-->\n </f-footer-edit-information>\n}\n\n@if (previousLink || nextLink) {\n <nav f-footer-navigation>\n @if (previousLink) {\n <a f-footer-navigation-button\n [href]=\"previousLink.link\"\n [description]=\"navigation.previous\"\n [link]=\"previousLink\">\n </a>\n }\n @if (nextLink) {\n <a f-footer-navigation-button class=\"next\"\n [href]=\"nextLink.link\"\n [description]=\"navigation.next\"\n [link]=\"nextLink\">\n </a>\n }\n </nav>\n}\n\n", styles: [":host{display:block;margin-top:64px}\n"], dependencies: [{ kind: "component", type: FFooterNavigationComponent, selector: "nav[f-footer-navigation]" }, { kind: "component", type: FFooterNavigationButtonComponent, selector: "a[f-footer-navigation-button]", inputs: ["description", "link"] }, { kind: "component", type: FFooterEditInformationComponent, selector: "f-footer-edit-information" }, { kind: "component", type: FFooterEditLinkComponent, selector: "a[f-footer-edit-link]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1965
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FMarkdownFooterComponent, deps: [{ token: i0.Injector }, { token: FDocumentationEnvironmentService }, { token: i1.Router }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
1966
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: FMarkdownFooterComponent, isStandalone: true, selector: "footer [f-markdown-footer]", host: { listeners: { "click": "onDocumentClick($event)" } }, ngImport: i0, template: "@if (editLink) {\n <f-footer-edit-information>\n <a f-footer-edit-link [href]=\"editLink\">\n {{ navigation.editLink?.text || 'Edit this page on GitHub' }}\n </a>\n\n <!-- <f-footer-last-updated>-->\n <!-- Last updated: <span>{{ lastUpdated.datetime }}</span>-->\n <!-- </f-footer-last-updated>-->\n </f-footer-edit-information>\n}\n\n@if (previousLink || nextLink) {\n <nav f-footer-navigation>\n @if (previousLink) {\n <a f-footer-navigation-button\n [href]=\"previousLink.link\"\n [description]=\"navigation.previous\"\n [link]=\"previousLink\">\n </a>\n }\n @if (nextLink) {\n <a f-footer-navigation-button class=\"next\"\n [href]=\"nextLink.link\"\n [description]=\"navigation.next\"\n [link]=\"nextLink\">\n </a>\n }\n </nav>\n}\n\n", styles: [":host{display:block;margin-top:64px}\n"], dependencies: [{ kind: "component", type: FFooterNavigationComponent, selector: "nav[f-footer-navigation]" }, { kind: "component", type: FFooterNavigationButtonComponent, selector: "a[f-footer-navigation-button]", inputs: ["description", "link"] }, { kind: "component", type: FFooterEditInformationComponent, selector: "f-footer-edit-information" }, { kind: "component", type: FFooterEditLinkComponent, selector: "a[f-footer-edit-link]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2193
1967
  }
2194
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FMarkdownFooterComponent, decorators: [{
1968
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FMarkdownFooterComponent, decorators: [{
2195
1969
  type: Component,
2196
1970
  args: [{ selector: 'footer [f-markdown-footer]', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
2197
1971
  FFooterNavigationComponent,
@@ -2201,27 +1975,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
2201
1975
  FFooterLastUpdatedComponent,
2202
1976
  RouterLink,
2203
1977
  ], standalone: true, template: "@if (editLink) {\n <f-footer-edit-information>\n <a f-footer-edit-link [href]=\"editLink\">\n {{ navigation.editLink?.text || 'Edit this page on GitHub' }}\n </a>\n\n <!-- <f-footer-last-updated>-->\n <!-- Last updated: <span>{{ lastUpdated.datetime }}</span>-->\n <!-- </f-footer-last-updated>-->\n </f-footer-edit-information>\n}\n\n@if (previousLink || nextLink) {\n <nav f-footer-navigation>\n @if (previousLink) {\n <a f-footer-navigation-button\n [href]=\"previousLink.link\"\n [description]=\"navigation.previous\"\n [link]=\"previousLink\">\n </a>\n }\n @if (nextLink) {\n <a f-footer-navigation-button class=\"next\"\n [href]=\"nextLink.link\"\n [description]=\"navigation.next\"\n [link]=\"nextLink\">\n </a>\n }\n </nav>\n}\n\n", styles: [":host{display:block;margin-top:64px}\n"] }]
2204
- }], ctorParameters: () => [{ type: i0.Injector }, { type: FEnvironmentService }, { type: i1.Router }, { type: i0.ChangeDetectorRef }], propDecorators: { onDocumentClick: [{
1978
+ }], ctorParameters: () => [{ type: i0.Injector }, { type: FDocumentationEnvironmentService }, { type: i1.Router }, { type: i0.ChangeDetectorRef }], propDecorators: { onDocumentClick: [{
2205
1979
  type: HostListener,
2206
1980
  args: ['click', ['$event']]
2207
1981
  }] } });
2208
1982
 
2209
1983
  class FMarkdownRendererComponent {
1984
+ injector;
1985
+ changeDetectorRef;
1986
+ subscriptions$ = new Subscription();
1987
+ value;
1988
+ hostElement = inject(ElementRef).nativeElement;
1989
+ fScrollableService = inject(FScrollableService);
1990
+ fContainersHandler = inject(HandleParsedContainersHandler);
1991
+ fDynamicComponentsHandler = inject(HandleDynamicComponentsHandler);
1992
+ isMarkdownChanged = false;
2210
1993
  constructor(injector, changeDetectorRef) {
2211
1994
  this.injector = injector;
2212
1995
  this.changeDetectorRef = changeDetectorRef;
2213
- this.subscriptions$ = new Subscription();
2214
- this.hostElement = inject(ElementRef).nativeElement;
2215
- this.fScrollableService = inject(FScrollableService);
2216
- this.fContainersHandler = inject(HandleParsedContainersHandler);
2217
- this.fDynamicComponentsHandler = inject(HandleDynamicComponentsHandler);
2218
- this.isMarkdownChanged = false;
2219
1996
  }
2220
1997
  ngOnInit() {
2221
1998
  this.subscriptions$.add(this.subscribeOnRouteChanges());
2222
1999
  }
2223
2000
  subscribeOnRouteChanges() {
2224
- return this.getRouterEvents().pipe(startWith(null), debounceTime(50), switchMap(() => this.injector.get(MarkdownService).parse(this.injector.get(FEnvironmentService).getMarkdownUrl(this.markdownPath))), tap((x) => this.renderMarkdown(x)), catchError((e, data) => data)).subscribe();
2001
+ return this.getRouterEvents().pipe(startWith(null), debounceTime(50), switchMap(() => this.injector.get(MarkdownService).parse(this.injector.get(FDocumentationEnvironmentService).getMarkdownUrl(this.markdownPath))), tap((x) => this.renderMarkdown(x)), catchError((e, data) => data)).subscribe();
2225
2002
  }
2226
2003
  getRouterEvents() {
2227
2004
  return this.injector.get(Router).events;
@@ -2250,16 +2027,16 @@ class FMarkdownRendererComponent {
2250
2027
  this.fDynamicComponentsHandler.dispose();
2251
2028
  this.subscriptions$.unsubscribe();
2252
2029
  }
2253
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FMarkdownRendererComponent, deps: [{ token: i0.Injector }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
2254
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FMarkdownRendererComponent, isStandalone: true, selector: "f-markdown-renderer", host: { listeners: { "click": "onDocumentClick($event)" }, classAttribute: "m-render" }, providers: [
2030
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FMarkdownRendererComponent, deps: [{ token: i0.Injector }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
2031
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FMarkdownRendererComponent, isStandalone: true, selector: "f-markdown-renderer", host: { listeners: { "click": "onDocumentClick($event)" }, classAttribute: "m-render" }, providers: [
2255
2032
  MarkdownService,
2256
2033
  HighlightService,
2257
2034
  HandleNavigationLinksHandler,
2258
2035
  HandleParsedContainersHandler,
2259
2036
  HandleDynamicComponentsHandler
2260
- ], ngImport: i0, template: "<div [innerHTML]=\"value\"></div>\n<footer f-markdown-footer></footer>\n", styles: [":host{display:block;width:100%}@media (min-width: 1280px){:host{width:calc(100% - var(--on-page-navigation-width) - var(--page-padding))}}\n"], dependencies: [{ kind: "component", type: FMarkdownFooterComponent, selector: "footer [f-markdown-footer]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2037
+ ], ngImport: i0, template: "<div [innerHTML]=\"value\"></div>\n<footer f-markdown-footer></footer>\n", styles: [":host{display:block;width:100%}@media (min-width: 1280px){:host{width:calc(100% - var(--on-page-navigation-width) - var(--page-padding))}}\n"], dependencies: [{ kind: "component", type: FMarkdownFooterComponent, selector: "footer [f-markdown-footer]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2261
2038
  }
2262
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FMarkdownRendererComponent, decorators: [{
2039
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FMarkdownRendererComponent, decorators: [{
2263
2040
  type: Component,
2264
2041
  args: [{ selector: 'f-markdown-renderer', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
2265
2042
  MarkdownService,
@@ -2278,107 +2055,348 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
2278
2055
  }] } });
2279
2056
 
2280
2057
  class FTableOfContentItemsComponent {
2281
- constructor() {
2282
- this.items = [];
2283
- }
2284
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FTableOfContentItemsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2285
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: FTableOfContentItemsComponent, isStandalone: true, selector: "ul[f-table-of-content-items]", inputs: { items: "items" }, ngImport: i0, template: "@for (item of items;track item.hash) {\n <li [class.active]=\"item.isActive\"><a class=\"text-ellipsis\" [href]=\"item.hash\">{{ item.title }}</a></li>\n @if (item.children) {\n <ul f-table-of-content-items [items]=\"item.children\"></ul>\n }\n}\n", styles: [":host{list-style:none;margin:0;padding:0}:host li{overflow-wrap:break-word;color:var(--secondary-text);max-width:180px}:host li a{display:block;line-height:var(--on-page-navigation-item-height);font-size:14px;color:inherit;font-weight:400}:host li.active{color:var(--primary-text)}:host li+ul{padding:0 16px}\n"], dependencies: [{ kind: "component", type: FTableOfContentItemsComponent, selector: "ul[f-table-of-content-items]", inputs: ["items"] }], changeDetection: i0.ChangeDetectionStrategy.Default }); }
2058
+ items = [];
2059
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FTableOfContentItemsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2060
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: FTableOfContentItemsComponent, isStandalone: true, selector: "ul[f-table-of-content-items]", inputs: { items: "items" }, ngImport: i0, template: "@for (item of items;track item.hash) {\n <li [class.active]=\"item.isActive\"><a class=\"text-ellipsis\" [href]=\"item.hash\">{{ item.title }}</a></li>\n @if (item.children) {\n <ul f-table-of-content-items [items]=\"item.children\"></ul>\n }\n}\n", styles: [":host{list-style:none;margin:0;padding:0}:host li{overflow-wrap:break-word;color:var(--secondary-text);max-width:180px}:host li a{display:block;line-height:var(--on-page-navigation-item-height);font-size:14px;color:inherit;font-weight:400}:host li.active{color:var(--primary-text)}:host li+ul{padding:0 16px}\n"], dependencies: [{ kind: "component", type: FTableOfContentItemsComponent, selector: "ul[f-table-of-content-items]", inputs: ["items"] }], changeDetection: i0.ChangeDetectionStrategy.Default });
2286
2061
  }
2287
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FTableOfContentItemsComponent, decorators: [{
2062
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FTableOfContentItemsComponent, decorators: [{
2288
2063
  type: Component,
2289
2064
  args: [{ selector: 'ul[f-table-of-content-items]', changeDetection: ChangeDetectionStrategy.Default, standalone: true, template: "@for (item of items;track item.hash) {\n <li [class.active]=\"item.isActive\"><a class=\"text-ellipsis\" [href]=\"item.hash\">{{ item.title }}</a></li>\n @if (item.children) {\n <ul f-table-of-content-items [items]=\"item.children\"></ul>\n }\n}\n", styles: [":host{list-style:none;margin:0;padding:0}:host li{overflow-wrap:break-word;color:var(--secondary-text);max-width:180px}:host li a{display:block;line-height:var(--on-page-navigation-item-height);font-size:14px;color:inherit;font-weight:400}:host li.active{color:var(--primary-text)}:host li+ul{padding:0 16px}\n"] }]
2290
2065
  }], propDecorators: { items: [{
2291
2066
  type: Input
2292
2067
  }] } });
2293
2068
 
2069
+ class FScrollableContainerComponent {
2070
+ elementRef;
2071
+ fScrollableService;
2072
+ get hostElement() {
2073
+ return this.elementRef.nativeElement;
2074
+ }
2075
+ constructor(elementRef, fScrollableService) {
2076
+ this.elementRef = elementRef;
2077
+ this.fScrollableService = fScrollableService;
2078
+ }
2079
+ ngOnInit() {
2080
+ this.fScrollableService.setContainer(this.hostElement);
2081
+ }
2082
+ ngOnDestroy() {
2083
+ this.fScrollableService.dispose();
2084
+ }
2085
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FScrollableContainerComponent, deps: [{ token: i0.ElementRef }, { token: FScrollableService }], target: i0.ɵɵFactoryTarget.Component });
2086
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FScrollableContainerComponent, isStandalone: true, selector: "f-scrollable-container", providers: [
2087
+ FScrollableService
2088
+ ], ngImport: i0, template: "<ng-content></ng-content>\n\n\n\n", styles: [":host{position:relative;width:100%;height:100%;overflow:hidden;overflow-y:auto}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2089
+ }
2090
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FScrollableContainerComponent, decorators: [{
2091
+ type: Component,
2092
+ args: [{ selector: 'f-scrollable-container', providers: [
2093
+ FScrollableService
2094
+ ], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-content></ng-content>\n\n\n\n", styles: [":host{position:relative;width:100%;height:100%;overflow:hidden;overflow-y:auto}\n"] }]
2095
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: FScrollableService }] });
2096
+
2294
2097
  class FTableOfContentComponent {
2098
+ fEnvironmentService;
2099
+ elementRef;
2100
+ fScrollableService;
2101
+ changeDetectorRef;
2102
+ fBrowser;
2103
+ subscriptions$ = new Subscription();
2295
2104
  get onToc$() {
2296
2105
  return this.fScrollableService.onToc$;
2297
2106
  }
2298
- constructor(fEnvironmentService, elementRef, fScrollableService, changeDetectorRef, fBrowser) {
2299
- this.fEnvironmentService = fEnvironmentService;
2300
- this.elementRef = elementRef;
2301
- this.fScrollableService = fScrollableService;
2107
+ tocData = new TableOfContentData([], []);
2108
+ activeMarkerPosition = 0;
2109
+ title;
2110
+ constructor(fEnvironmentService, elementRef, fScrollableService, changeDetectorRef, fBrowser) {
2111
+ this.fEnvironmentService = fEnvironmentService;
2112
+ this.elementRef = elementRef;
2113
+ this.fScrollableService = fScrollableService;
2114
+ this.changeDetectorRef = changeDetectorRef;
2115
+ this.fBrowser = fBrowser;
2116
+ this.title = this.fEnvironmentService.getToC().title;
2117
+ }
2118
+ ngOnInit() {
2119
+ this.subscriptions$.add(this.subscribeOnPageNavigation());
2120
+ }
2121
+ subscribeOnPageNavigation() {
2122
+ return this.onToc$.subscribe((data) => {
2123
+ this.tocData = data;
2124
+ this.activeMarkerPosition = this.getActiveMarkerPosition();
2125
+ this.changeDetectorRef.detectChanges();
2126
+ });
2127
+ }
2128
+ getActiveMarkerPosition() {
2129
+ const index = this.tocData.flat.findIndex((x) => x.isActive) || 0;
2130
+ const itemHeight = parseInt(this.getComputedStyle(this.elementRef.nativeElement).getPropertyValue('--on-page-navigation-item-height'));
2131
+ return (index + 1) * itemHeight + itemHeight / 4;
2132
+ }
2133
+ getComputedStyle(element) {
2134
+ return this.fBrowser.window.getComputedStyle(element);
2135
+ }
2136
+ onDocumentClick(event) {
2137
+ const target = event.target;
2138
+ if (target.tagName === 'A') {
2139
+ event.preventDefault();
2140
+ this.fScrollableService.scrollTo(target.getAttribute('href'));
2141
+ }
2142
+ }
2143
+ ngOnDestroy() {
2144
+ this.subscriptions$.unsubscribe();
2145
+ }
2146
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FTableOfContentComponent, deps: [{ token: FDocumentationEnvironmentService }, { token: i0.ElementRef }, { token: FScrollableService }, { token: i0.ChangeDetectorRef }, { token: i2.BrowserService }], target: i0.ɵɵFactoryTarget.Component });
2147
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FTableOfContentComponent, isStandalone: true, selector: "aside[f-table-of-content]", host: { listeners: { "click": "onDocumentClick($event)" } }, ngImport: i0, template: "<div class=\"title\">{{ title || 'In this article' }}</div>\n<ul f-table-of-content-items [items]=\"tocData.tree\"></ul>\n<div class=\"active-marker\" [style.top]=\"activeMarkerPosition + 'px'\"></div>\n", styles: [":host{--on-page-navigation-item-height: 32px;display:none;padding-left:16px;border-left:1px solid var(--divider-color);font-size:13px;font-weight:500;position:relative}:host .title{line-height:32px;font-size:14px;font-weight:600}@media (min-width: 1280px){:host{display:block;width:var(--on-page-navigation-width);position:fixed;top:calc(var(--header-height) + 48px);right:max(var(--page-padding),(100vw - var(--layout-max-width)) / 3)}}:host .active-marker{position:absolute;top:0;left:0;width:2px;height:calc(var(--on-page-navigation-item-height) / 2);border-radius:2px;background-color:var(--primary-1);transition:top .25s cubic-bezier(0,1,.5,1),opacity .25s}\n"], dependencies: [{ kind: "component", type: FTableOfContentItemsComponent, selector: "ul[f-table-of-content-items]", inputs: ["items"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2148
+ }
2149
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FTableOfContentComponent, decorators: [{
2150
+ type: Component,
2151
+ args: [{ selector: 'aside[f-table-of-content]', standalone: true, imports: [AsyncPipe, JsonPipe, FTableOfContentItemsComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"title\">{{ title || 'In this article' }}</div>\n<ul f-table-of-content-items [items]=\"tocData.tree\"></ul>\n<div class=\"active-marker\" [style.top]=\"activeMarkerPosition + 'px'\"></div>\n", styles: [":host{--on-page-navigation-item-height: 32px;display:none;padding-left:16px;border-left:1px solid var(--divider-color);font-size:13px;font-weight:500;position:relative}:host .title{line-height:32px;font-size:14px;font-weight:600}@media (min-width: 1280px){:host{display:block;width:var(--on-page-navigation-width);position:fixed;top:calc(var(--header-height) + 48px);right:max(var(--page-padding),(100vw - var(--layout-max-width)) / 3)}}:host .active-marker{position:absolute;top:0;left:0;width:2px;height:calc(var(--on-page-navigation-item-height) / 2);border-radius:2px;background-color:var(--primary-1);transition:top .25s cubic-bezier(0,1,.5,1),opacity .25s}\n"] }]
2152
+ }], ctorParameters: () => [{ type: FDocumentationEnvironmentService }, { type: i0.ElementRef }, { type: FScrollableService }, { type: i0.ChangeDetectorRef }, { type: i2.BrowserService }], propDecorators: { onDocumentClick: [{
2153
+ type: HostListener,
2154
+ args: ['click', ['$event']]
2155
+ }] } });
2156
+
2157
+ class FPageComponent {
2158
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2159
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FPageComponent, isStandalone: true, selector: "f-page", host: { attributes: { "ngSkipHydration": "" } }, ngImport: i0, template: "<f-markdown-renderer></f-markdown-renderer>\n<aside f-table-of-content></aside>\n\n", styles: [":host{display:block;width:100%;padding:48px var(--page-padding) 140px}:host [fMarkdownRenderer]{width:100%}@media (min-width: 1280px){:host{padding-right:max(var(--page-padding),(100vw - var(--layout-max-width)) / 2);padding-left:max(var(--page-padding),(100vw - var(--layout-max-width)) / 4)}:host [fMarkdownRenderer]{width:calc(100% - var(--on-page-navigation-width) - var(--page-padding))}}\n"], dependencies: [{ kind: "component", type: FTableOfContentComponent, selector: "aside[f-table-of-content]" }, { kind: "component", type: FMarkdownRendererComponent, selector: "f-markdown-renderer" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2160
+ }
2161
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FPageComponent, decorators: [{
2162
+ type: Component,
2163
+ args: [{ selector: 'f-page', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
2164
+ FTableOfContentComponent,
2165
+ FMarkdownRendererComponent
2166
+ ], host: {
2167
+ 'ngSkipHydration': ''
2168
+ }, template: "<f-markdown-renderer></f-markdown-renderer>\n<aside f-table-of-content></aside>\n\n", styles: [":host{display:block;width:100%;padding:48px var(--page-padding) 140px}:host [fMarkdownRenderer]{width:100%}@media (min-width: 1280px){:host{padding-right:max(var(--page-padding),(100vw - var(--layout-max-width)) / 2);padding-left:max(var(--page-padding),(100vw - var(--layout-max-width)) / 4)}:host [fMarkdownRenderer]{width:calc(100% - var(--on-page-navigation-width) - var(--page-padding))}}\n"] }]
2169
+ }] });
2170
+
2171
+ var index$2 = /*#__PURE__*/Object.freeze({
2172
+ __proto__: null,
2173
+ ChangeCodeFocusedSyntaxPreProcessor: ChangeCodeFocusedSyntaxPreProcessor,
2174
+ get EMarkdownContainerType () { return EMarkdownContainerType; },
2175
+ FAsyncCodeViewHandler: FAsyncCodeViewHandler,
2176
+ FCodeGroupBodyHandler: FCodeGroupBodyHandler,
2177
+ FCodeGroupHandler: FCodeGroupHandler,
2178
+ FCodeViewHandler: FCodeViewHandler,
2179
+ FExampleViewHandler: FExampleViewHandler,
2180
+ FFooterEditInformationComponent: FFooterEditInformationComponent,
2181
+ FFooterNavigationButtonComponent: FFooterNavigationButtonComponent,
2182
+ FFooterNavigationComponent: FFooterNavigationComponent,
2183
+ FMarkdownFooterComponent: FMarkdownFooterComponent,
2184
+ FMarkdownRendererComponent: FMarkdownRendererComponent,
2185
+ FPageComponent: FPageComponent,
2186
+ FTableOfContentComponent: FTableOfContentComponent,
2187
+ FTableOfContentItemsComponent: FTableOfContentItemsComponent,
2188
+ GetPreviousNextPageNavigationHandler: GetPreviousNextPageNavigationHandler,
2189
+ GetPreviousNextPageNavigationRequest: GetPreviousNextPageNavigationRequest,
2190
+ GetPreviousNextPageNavigationResponse: GetPreviousNextPageNavigationResponse,
2191
+ HandleDynamicComponentsHandler: HandleDynamicComponentsHandler,
2192
+ HandleDynamicComponentsRequest: HandleDynamicComponentsRequest,
2193
+ HandleParsedContainersHandler: HandleParsedContainersHandler,
2194
+ HandleParsedContainersRequest: HandleParsedContainersRequest,
2195
+ HighlightService: HighlightService,
2196
+ MarkCodeFocusedBlocksPostProcessor: MarkCodeFocusedBlocksPostProcessor,
2197
+ MarkdownService: MarkdownService,
2198
+ ModifyPunctuationHighlightPostProcessor: ModifyPunctuationHighlightPostProcessor,
2199
+ ParseAlerts: ParseAlerts,
2200
+ ParseCodeGroup: ParseCodeGroup,
2201
+ ParseCodeView: ParseCodeView,
2202
+ ParseExampleGroup: ParseExampleGroup,
2203
+ ParsePreviewGroup: ParsePreviewGroup,
2204
+ SeparateCodeByLinesPostProcessor: SeparateCodeByLinesPostProcessor,
2205
+ copyToClipboard: copyToClipboard,
2206
+ getContent: getContent
2207
+ });
2208
+
2209
+ class FStateService {
2210
+ fBrowser;
2211
+ theme = new Subject();
2212
+ constructor(fBrowser) {
2213
+ this.fBrowser = fBrowser;
2214
+ }
2215
+ get theme$() {
2216
+ return this.theme.asObservable();
2217
+ }
2218
+ updateTheme() {
2219
+ this.theme.next();
2220
+ }
2221
+ getPreferredTheme() {
2222
+ return this.fBrowser.localStorage.getItem('preferred-theme')
2223
+ || (this.fBrowser.window.isMediaQuery('(prefers-color-scheme: dark)') ? 'dark' : 'light');
2224
+ }
2225
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FStateService, deps: [{ token: i2.BrowserService }], target: i0.ɵɵFactoryTarget.Injectable });
2226
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FStateService, providedIn: 'root' });
2227
+ }
2228
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FStateService, decorators: [{
2229
+ type: Injectable,
2230
+ args: [{ providedIn: 'root' }]
2231
+ }], ctorParameters: () => [{ type: i2.BrowserService }] });
2232
+
2233
+ class FPreviewComponent {
2234
+ fEnvironment;
2235
+ fState;
2236
+ router;
2237
+ changeDetectorRef;
2238
+ subscriptions$ = new Subscription();
2239
+ item;
2240
+ group;
2241
+ viewModel;
2242
+ src;
2243
+ url;
2244
+ constructor(fEnvironment, fState, router, changeDetectorRef) {
2245
+ this.fEnvironment = fEnvironment;
2246
+ this.fState = fState;
2247
+ this.router = router;
2248
+ this.changeDetectorRef = changeDetectorRef;
2249
+ }
2250
+ initialize() {
2251
+ this.viewModel = this.getNavigationItem(this.getNavigationGroup());
2252
+ this.url = this.normalizeLink(this.viewModel.link, this.getUrlPrefix());
2253
+ this.subscriptions$.add(this.fState.theme$.pipe(startWith(null)).subscribe(() => this.updateTheme()));
2254
+ }
2255
+ getNavigationGroup() {
2256
+ return this.fEnvironment.getNavigation().find((x) => x.text === this.group);
2257
+ }
2258
+ getNavigationItem(group) {
2259
+ return group.items.find((x) => x.link === this.item);
2260
+ }
2261
+ updateTheme() {
2262
+ this.src = this.fState.getPreferredTheme() === 'dark' ? this.viewModel?.image_dark : this.viewModel?.image;
2263
+ if (!this.src) {
2264
+ this.src = this.viewModel?.image;
2265
+ }
2266
+ this.changeDetectorRef.markForCheck();
2267
+ }
2268
+ normalizeLink(link, prefix) {
2269
+ if (!this.isExternalLink(link)) {
2270
+ return link.startsWith('/') ? `${prefix}${link}` : `${prefix}/${link}`;
2271
+ }
2272
+ return link;
2273
+ }
2274
+ getUrlPrefix() {
2275
+ return this.router.url.substring(0, this.router.url.lastIndexOf('/'));
2276
+ }
2277
+ isExternalLink(href) {
2278
+ return href.startsWith('www') || href.startsWith('http');
2279
+ }
2280
+ ngOnDestroy() {
2281
+ this.subscriptions$.unsubscribe();
2282
+ }
2283
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FPreviewComponent, deps: [{ token: FDocumentationEnvironmentService }, { token: FStateService }, { token: i1.Router }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
2284
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: FPreviewComponent, isStandalone: true, selector: "a[f-preview]", host: { properties: { "attr.href": "url", "attr.title": "viewModel?.text" } }, ngImport: i0, template: "@if (viewModel) {\n <img [src]=\"src\" [alt]=\"viewModel.description\" [title]=\"viewModel.text\">\n <div class=\"title\">{{ viewModel.text }}</div>\n <div class=\"description\">{{ viewModel.description }}</div>\n}\n\n\n\n", styles: [":host{display:block;border-radius:4px;background-color:var(--soft-background);padding:24px;width:100%;text-decoration:none!important;color:inherit!important;line-height:24px;font-size:14px;cursor:pointer}:host:hover img{transform:scale(1.1)}:host img{display:block;margin-bottom:16px;width:100%;height:180px;border-radius:4px;object-fit:cover;transition:transform .3s}:host .title{line-height:inherit;font-weight:600;text-transform:uppercase;color:var(--primary-text)}:host .description{margin:8px 0!important;line-height:inherit;color:var(--secondary-text);width:100%;word-wrap:break-word;white-space:normal;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}@media (min-width: 640px){:host{width:calc((100% - 32px)/2)}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2285
+ }
2286
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FPreviewComponent, decorators: [{
2287
+ type: Component,
2288
+ args: [{ selector: 'a[f-preview]', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, host: {
2289
+ '[attr.href]': 'url',
2290
+ '[attr.title]': 'viewModel?.text',
2291
+ }, template: "@if (viewModel) {\n <img [src]=\"src\" [alt]=\"viewModel.description\" [title]=\"viewModel.text\">\n <div class=\"title\">{{ viewModel.text }}</div>\n <div class=\"description\">{{ viewModel.description }}</div>\n}\n\n\n\n", styles: [":host{display:block;border-radius:4px;background-color:var(--soft-background);padding:24px;width:100%;text-decoration:none!important;color:inherit!important;line-height:24px;font-size:14px;cursor:pointer}:host:hover img{transform:scale(1.1)}:host img{display:block;margin-bottom:16px;width:100%;height:180px;border-radius:4px;object-fit:cover;transition:transform .3s}:host .title{line-height:inherit;font-weight:600;text-transform:uppercase;color:var(--primary-text)}:host .description{margin:8px 0!important;line-height:inherit;color:var(--secondary-text);width:100%;word-wrap:break-word;white-space:normal;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}@media (min-width: 640px){:host{width:calc((100% - 32px)/2)}}\n"] }]
2292
+ }], ctorParameters: () => [{ type: FDocumentationEnvironmentService }, { type: FStateService }, { type: i1.Router }, { type: i0.ChangeDetectorRef }] });
2293
+
2294
+ const F_DOCUMENTATION_COMPONENT = new InjectionToken('F_DOCUMENTATION_COMPONENT');
2295
+
2296
+ class FDocumentationComponent {
2297
+ fPopoverService;
2298
+ changeDetectorRef;
2299
+ subscriptions$ = new Subscription();
2300
+ isNavigationVisible = false;
2301
+ popoverMessage = null;
2302
+ constructor(fPopoverService, changeDetectorRef) {
2303
+ this.fPopoverService = fPopoverService;
2302
2304
  this.changeDetectorRef = changeDetectorRef;
2303
- this.fBrowser = fBrowser;
2304
- this.subscriptions$ = new Subscription();
2305
- this.tocData = new TableOfContentData([], []);
2306
- this.activeMarkerPosition = 0;
2307
- this.title = this.fEnvironmentService.getToC().title;
2308
2305
  }
2309
2306
  ngOnInit() {
2310
- this.subscriptions$.add(this.subscribeOnPageNavigation());
2307
+ this.subscriptions$.add(this.subscribeOnPopover());
2311
2308
  }
2312
- subscribeOnPageNavigation() {
2313
- return this.onToc$.subscribe((data) => {
2314
- this.tocData = data;
2315
- this.activeMarkerPosition = this.getActiveMarkerPosition();
2316
- this.changeDetectorRef.detectChanges();
2309
+ subscribeOnPopover() {
2310
+ return this.fPopoverService.popover$.subscribe((x) => {
2311
+ this.popoverMessage = x;
2312
+ this.changeDetectorRef.markForCheck();
2317
2313
  });
2318
2314
  }
2319
- getActiveMarkerPosition() {
2320
- const index = this.tocData.flat.findIndex((x) => x.isActive) || 0;
2321
- const itemHeight = parseInt(this.getComputedStyle(this.elementRef.nativeElement).getPropertyValue('--on-page-navigation-item-height'));
2322
- return (index + 1) * itemHeight + itemHeight / 4;
2323
- }
2324
- getComputedStyle(element) {
2325
- return this.fBrowser.window.getComputedStyle(element);
2326
- }
2327
- onDocumentClick(event) {
2328
- const target = event.target;
2329
- if (target.tagName === 'A') {
2330
- event.preventDefault();
2331
- this.fScrollableService.scrollTo(target.getAttribute('href'));
2332
- }
2315
+ onToggleNavigation(value) {
2316
+ this.isNavigationVisible = value;
2317
+ this.changeDetectorRef.markForCheck();
2333
2318
  }
2334
2319
  ngOnDestroy() {
2320
+ this.fPopoverService.dispose();
2335
2321
  this.subscriptions$.unsubscribe();
2336
2322
  }
2337
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FTableOfContentComponent, deps: [{ token: FEnvironmentService }, { token: i0.ElementRef }, { token: FScrollableService }, { token: i0.ChangeDetectorRef }, { token: i2.BrowserService }], target: i0.ɵɵFactoryTarget.Component }); }
2338
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FTableOfContentComponent, isStandalone: true, selector: "aside[f-table-of-content]", host: { listeners: { "click": "onDocumentClick($event)" } }, ngImport: i0, template: "<div class=\"title\">{{ title || 'In this article' }}</div>\n<ul f-table-of-content-items [items]=\"tocData.tree\"></ul>\n<div class=\"active-marker\" [style.top]=\"activeMarkerPosition + 'px'\"></div>\n", styles: [":host{--on-page-navigation-item-height: 32px;display:none;padding-left:16px;border-left:1px solid var(--divider-color);font-size:13px;font-weight:500;position:relative}:host .title{line-height:32px;font-size:14px;font-weight:600}@media (min-width: 1280px){:host{display:block;width:var(--on-page-navigation-width);position:fixed;top:calc(var(--header-height) + 48px);right:max(var(--page-padding),(100vw - var(--layout-max-width)) / 3)}}:host .active-marker{position:absolute;top:0;left:0;width:2px;height:calc(var(--on-page-navigation-item-height) / 2);border-radius:2px;background-color:var(--primary-1);transition:top .25s cubic-bezier(0,1,.5,1),opacity .25s}\n"], dependencies: [{ kind: "component", type: FTableOfContentItemsComponent, selector: "ul[f-table-of-content-items]", inputs: ["items"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2323
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FDocumentationComponent, deps: [{ token: FPopoverService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
2324
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: FDocumentationComponent, isStandalone: true, selector: "f-documentation", providers: [
2325
+ FDocumentationEnvironmentService,
2326
+ FPopoverService,
2327
+ { provide: INTERNAL_ENVIRONMENT_SERVICE, useExisting: FDocumentationEnvironmentService },
2328
+ { provide: F_DOCUMENTATION_COMPONENT, useExisting: FDocumentationComponent }
2329
+ ], ngImport: i0, template: "<div class=\"f-backdrop\" [class.visible]=\"isNavigationVisible\" (click)=\"onToggleNavigation(false)\"></div>\n<f-navigation-panel [class.visible]=\"isNavigationVisible\"></f-navigation-panel>\n\n<f-scrollable-container>\n <f-header></f-header>\n <router-outlet></router-outlet>\n</f-scrollable-container>\n@if (popoverMessage) {\n <div class=\"popover\">{{ popoverMessage }}</div>\n}\n", styles: [":host{display:flex;justify-content:flex-start;align-items:flex-start;height:100%;gap:10px}.f-backdrop{position:fixed;inset:0;opacity:0;z-index:var(--z-index-backdrop);background:var(--backdrop-color);transition:opacity .2s ease-in-out;pointer-events:none}.f-backdrop.visible{opacity:1;pointer-events:all}@media (min-width: 960px){.f-backdrop{position:unset}}.popover{position:fixed;min-width:120px;bottom:50%;left:50%;text-align:center;transform:translate(-50%,-50%);background-color:var(--code-view-copy-button-hover-background);border:1px solid var(--code-view-copy-button-border-color);color:var(--primary-text);font-size:14px;padding:4px 8px;border-radius:4px;z-index:var(--z-index-popover);opacity:1}\n"], dependencies: [{ kind: "component", type: FNavigationPanelComponent, selector: "f-navigation-panel" }, { kind: "component", type: FHeaderComponent, selector: "f-header" }, { kind: "component", type: FScrollableContainerComponent, selector: "f-scrollable-container" }, { kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2339
2330
  }
2340
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FTableOfContentComponent, decorators: [{
2331
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FDocumentationComponent, decorators: [{
2341
2332
  type: Component,
2342
- args: [{ selector: 'aside[f-table-of-content]', standalone: true, imports: [AsyncPipe, JsonPipe, FTableOfContentItemsComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"title\">{{ title || 'In this article' }}</div>\n<ul f-table-of-content-items [items]=\"tocData.tree\"></ul>\n<div class=\"active-marker\" [style.top]=\"activeMarkerPosition + 'px'\"></div>\n", styles: [":host{--on-page-navigation-item-height: 32px;display:none;padding-left:16px;border-left:1px solid var(--divider-color);font-size:13px;font-weight:500;position:relative}:host .title{line-height:32px;font-size:14px;font-weight:600}@media (min-width: 1280px){:host{display:block;width:var(--on-page-navigation-width);position:fixed;top:calc(var(--header-height) + 48px);right:max(var(--page-padding),(100vw - var(--layout-max-width)) / 3)}}:host .active-marker{position:absolute;top:0;left:0;width:2px;height:calc(var(--on-page-navigation-item-height) / 2);border-radius:2px;background-color:var(--primary-1);transition:top .25s cubic-bezier(0,1,.5,1),opacity .25s}\n"] }]
2343
- }], ctorParameters: () => [{ type: FEnvironmentService }, { type: i0.ElementRef }, { type: FScrollableService }, { type: i0.ChangeDetectorRef }, { type: i2.BrowserService }], propDecorators: { onDocumentClick: [{
2344
- type: HostListener,
2345
- args: ['click', ['$event']]
2346
- }] } });
2333
+ args: [{ selector: 'f-documentation', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
2334
+ FDocumentationEnvironmentService,
2335
+ FPopoverService,
2336
+ { provide: INTERNAL_ENVIRONMENT_SERVICE, useExisting: FDocumentationEnvironmentService },
2337
+ { provide: F_DOCUMENTATION_COMPONENT, useExisting: FDocumentationComponent }
2338
+ ], imports: [
2339
+ FNavigationPanelComponent,
2340
+ FHeaderComponent,
2341
+ FScrollableContainerComponent,
2342
+ RouterOutlet
2343
+ ], template: "<div class=\"f-backdrop\" [class.visible]=\"isNavigationVisible\" (click)=\"onToggleNavigation(false)\"></div>\n<f-navigation-panel [class.visible]=\"isNavigationVisible\"></f-navigation-panel>\n\n<f-scrollable-container>\n <f-header></f-header>\n <router-outlet></router-outlet>\n</f-scrollable-container>\n@if (popoverMessage) {\n <div class=\"popover\">{{ popoverMessage }}</div>\n}\n", styles: [":host{display:flex;justify-content:flex-start;align-items:flex-start;height:100%;gap:10px}.f-backdrop{position:fixed;inset:0;opacity:0;z-index:var(--z-index-backdrop);background:var(--backdrop-color);transition:opacity .2s ease-in-out;pointer-events:none}.f-backdrop.visible{opacity:1;pointer-events:all}@media (min-width: 960px){.f-backdrop{position:unset}}.popover{position:fixed;min-width:120px;bottom:50%;left:50%;text-align:center;transform:translate(-50%,-50%);background-color:var(--code-view-copy-button-hover-background);border:1px solid var(--code-view-copy-button-border-color);color:var(--primary-text);font-size:14px;padding:4px 8px;border-radius:4px;z-index:var(--z-index-popover);opacity:1}\n"] }]
2344
+ }], ctorParameters: () => [{ type: FPopoverService }, { type: i0.ChangeDetectorRef }] });
2347
2345
 
2348
- class FPageComponent {
2349
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2350
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FPageComponent, isStandalone: true, selector: "f-page", host: { attributes: { "ngSkipHydration": "" } }, ngImport: i0, template: "<f-markdown-renderer></f-markdown-renderer>\n<aside f-table-of-content></aside>\n\n", styles: [":host{display:block;width:100%;padding:48px var(--page-padding) 140px}:host [fMarkdownRenderer]{width:100%}@media (min-width: 1280px){:host{padding-right:max(var(--page-padding),(100vw - var(--layout-max-width)) / 2);padding-left:max(var(--page-padding),(100vw - var(--layout-max-width)) / 4)}:host [fMarkdownRenderer]{width:calc(100% - var(--on-page-navigation-width) - var(--page-padding))}}\n"], dependencies: [{ kind: "component", type: FTableOfContentComponent, selector: "aside[f-table-of-content]" }, { kind: "component", type: FMarkdownRendererComponent, selector: "f-markdown-renderer" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2351
- }
2352
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FPageComponent, decorators: [{
2353
- type: Component,
2354
- args: [{ selector: 'f-page', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
2355
- FTableOfContentComponent,
2356
- FMarkdownRendererComponent
2357
- ], host: {
2358
- 'ngSkipHydration': ''
2359
- }, template: "<f-markdown-renderer></f-markdown-renderer>\n<aside f-table-of-content></aside>\n\n", styles: [":host{display:block;width:100%;padding:48px var(--page-padding) 140px}:host [fMarkdownRenderer]{width:100%}@media (min-width: 1280px){:host{padding-right:max(var(--page-padding),(100vw - var(--layout-max-width)) / 2);padding-left:max(var(--page-padding),(100vw - var(--layout-max-width)) / 4)}:host [fMarkdownRenderer]{width:calc(100% - var(--on-page-navigation-width) - var(--page-padding))}}\n"] }]
2360
- }] });
2346
+ const F_DOCS_ENVIRONMENT = new InjectionToken('F_DOCS_ENVIRONMENT');
2361
2347
 
2362
- var index = /*#__PURE__*/Object.freeze({
2348
+ const F_DOCUMENTATION_ROUTES = [
2349
+ {
2350
+ path: '',
2351
+ loadComponent: () => Promise.resolve().then(function () { return index$1; }).then(m => m.FDocumentationComponent),
2352
+ children: [
2353
+ {
2354
+ path: '**',
2355
+ loadComponent: () => Promise.resolve().then(function () { return index$2; }).then(m => m.FPageComponent)
2356
+ }
2357
+ ]
2358
+ }
2359
+ ];
2360
+
2361
+ var index$1 = /*#__PURE__*/Object.freeze({
2363
2362
  __proto__: null,
2363
+ CalculateHashFromScrollPositionHandler: CalculateHashFromScrollPositionHandler,
2364
+ CalculateHashFromScrollPositionRequest: CalculateHashFromScrollPositionRequest,
2364
2365
  ChangeCodeFocusedSyntaxPreProcessor: ChangeCodeFocusedSyntaxPreProcessor,
2365
2366
  get EMarkdownContainerType () { return EMarkdownContainerType; },
2366
2367
  FAsyncCodeViewHandler: FAsyncCodeViewHandler,
2368
+ FBadgeComponent: FBadgeComponent,
2367
2369
  FCodeGroupBodyHandler: FCodeGroupBodyHandler,
2368
2370
  FCodeGroupHandler: FCodeGroupHandler,
2369
2371
  FCodeViewHandler: FCodeViewHandler,
2372
+ FDocumentationComponent: FDocumentationComponent,
2373
+ FDocumentationEnvironmentService: FDocumentationEnvironmentService,
2370
2374
  FExampleViewHandler: FExampleViewHandler,
2371
2375
  FFooterEditInformationComponent: FFooterEditInformationComponent,
2372
2376
  FFooterNavigationButtonComponent: FFooterNavigationButtonComponent,
2373
2377
  FFooterNavigationComponent: FFooterNavigationComponent,
2378
+ FHeaderComponent: FHeaderComponent,
2374
2379
  FMarkdownFooterComponent: FMarkdownFooterComponent,
2375
2380
  FMarkdownRendererComponent: FMarkdownRendererComponent,
2381
+ FNavigationGroupComponent: FNavigationGroupComponent,
2382
+ FNavigationHeaderComponent: FNavigationHeaderComponent,
2383
+ FNavigationItemComponent: FNavigationItemComponent,
2384
+ FNavigationPanelComponent: FNavigationPanelComponent,
2376
2385
  FPageComponent: FPageComponent,
2386
+ FPreviewComponent: FPreviewComponent,
2387
+ FScrollableContainerComponent: FScrollableContainerComponent,
2377
2388
  FTableOfContentComponent: FTableOfContentComponent,
2378
2389
  FTableOfContentItemsComponent: FTableOfContentItemsComponent,
2390
+ F_DOCS_ENVIRONMENT: F_DOCS_ENVIRONMENT,
2391
+ F_DOCUMENTATION_COMPONENT: F_DOCUMENTATION_COMPONENT,
2392
+ F_DOCUMENTATION_ROUTES: F_DOCUMENTATION_ROUTES,
2393
+ GetAbsoluteTopToContainerHandler: GetAbsoluteTopToContainerHandler,
2394
+ GetAbsoluteTopToContainerRequest: GetAbsoluteTopToContainerRequest,
2379
2395
  GetPreviousNextPageNavigationHandler: GetPreviousNextPageNavigationHandler,
2380
2396
  GetPreviousNextPageNavigationRequest: GetPreviousNextPageNavigationRequest,
2381
2397
  GetPreviousNextPageNavigationResponse: GetPreviousNextPageNavigationResponse,
2398
+ GetTableOfContentDataHandler: GetTableOfContentDataHandler,
2399
+ GetTableOfContentDataRequest: GetTableOfContentDataRequest,
2382
2400
  HandleDynamicComponentsHandler: HandleDynamicComponentsHandler,
2383
2401
  HandleDynamicComponentsRequest: HandleDynamicComponentsRequest,
2384
2402
  HandleParsedContainersHandler: HandleParsedContainersHandler,
@@ -2392,14 +2410,310 @@ var index = /*#__PURE__*/Object.freeze({
2392
2410
  ParseCodeView: ParseCodeView,
2393
2411
  ParseExampleGroup: ParseExampleGroup,
2394
2412
  ParsePreviewGroup: ParsePreviewGroup,
2413
+ ScrollToElementInContainer: ScrollToElementInContainer,
2395
2414
  SeparateCodeByLinesPostProcessor: SeparateCodeByLinesPostProcessor,
2415
+ TableOfContentData: TableOfContentData,
2396
2416
  copyToClipboard: copyToClipboard,
2397
2417
  getContent: getContent
2398
2418
  });
2399
2419
 
2420
+ class FHamburgerButtonComponent {
2421
+ fDocumentation;
2422
+ constructor(fDocumentation) {
2423
+ this.fDocumentation = fDocumentation;
2424
+ }
2425
+ onShowNavigation() {
2426
+ this.fDocumentation.onToggleNavigation(true);
2427
+ }
2428
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FHamburgerButtonComponent, deps: [{ token: F_DOCUMENTATION_COMPONENT }], target: i0.ɵɵFactoryTarget.Component });
2429
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FHamburgerButtonComponent, isStandalone: true, selector: "button[f-hamburger-button]", host: { listeners: { "click": "onShowNavigation()" } }, ngImport: i0, template: "<span class=\"f-icon hamburger\"></span>\n\n", styles: [":host{background-color:transparent;border:0;display:flex;padding:0;margin-right:16px;color:var(--secondary-text);cursor:pointer}@media (min-width: 960px){:host{display:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2430
+ }
2431
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FHamburgerButtonComponent, decorators: [{
2432
+ type: Component,
2433
+ args: [{ selector: 'button[f-hamburger-button]', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<span class=\"f-icon hamburger\"></span>\n\n", styles: [":host{background-color:transparent;border:0;display:flex;padding:0;margin-right:16px;color:var(--secondary-text);cursor:pointer}@media (min-width: 960px){:host{display:none}}\n"] }]
2434
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
2435
+ type: Inject,
2436
+ args: [F_DOCUMENTATION_COMPONENT]
2437
+ }] }], propDecorators: { onShowNavigation: [{
2438
+ type: HostListener,
2439
+ args: ['click']
2440
+ }] } });
2441
+
2442
+ class FHeaderMenuComponent {
2443
+ navigation = [];
2444
+ _router = inject(Router);
2445
+ _fEnvironmentService = inject(INTERNAL_ENVIRONMENT_SERVICE);
2446
+ ngOnInit() {
2447
+ this.navigation = this._fEnvironmentService.getHeaderNavigation().map((x) => {
2448
+ return {
2449
+ ...x,
2450
+ isActive: this._router.url.startsWith(x.link)
2451
+ };
2452
+ });
2453
+ }
2454
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FHeaderMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2455
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: FHeaderMenuComponent, isStandalone: true, selector: "f-header-menu", ngImport: i0, template: "@for (item of navigation; track item.link) {\n <a class=\"header-link\" [routerLink]=\"item.link\" [class.active]=\"item.isActive\">\n <span>{{ item.text }}</span>\n </a>\n}\n\n", styles: [":host{display:flex;justify-content:flex-start;align-items:center}.header-link{display:flex;align-items:center;padding:0 12px;line-height:var(--header-height);font-size:14px;font-weight:500;color:var(--primary-text);cursor:pointer}.header-link:hover,.header-link.active{color:var(--primary-1)}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2456
+ }
2457
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FHeaderMenuComponent, decorators: [{
2458
+ type: Component,
2459
+ args: [{ selector: 'f-header-menu', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
2460
+ RouterLink
2461
+ ], template: "@for (item of navigation; track item.link) {\n <a class=\"header-link\" [routerLink]=\"item.link\" [class.active]=\"item.isActive\">\n <span>{{ item.text }}</span>\n </a>\n}\n\n", styles: [":host{display:flex;justify-content:flex-start;align-items:center}.header-link{display:flex;align-items:center;padding:0 12px;line-height:var(--header-height);font-size:14px;font-weight:500;color:var(--primary-text);cursor:pointer}.header-link:hover,.header-link.active{color:var(--primary-1)}\n"] }]
2462
+ }] });
2463
+
2464
+ class FSocialLinksComponent {
2465
+ links = inject(INTERNAL_ENVIRONMENT_SERVICE).getSocialLinks();
2466
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FSocialLinksComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2467
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: FSocialLinksComponent, isStandalone: true, selector: "f-social-links", ngImport: i0, template: "@for (link of links; track link.link) {\n <a href=\"{{ link.link }}\" class=\"header-link\">\n <div class=\"f-icon {{ link.icon }}\"></div>\n </a>\n}\n", styles: [":host{display:flex;justify-content:flex-start;align-items:center}.header-link{width:36px;height:36px;padding:7.5px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2468
+ }
2469
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FSocialLinksComponent, decorators: [{
2470
+ type: Component,
2471
+ args: [{ selector: 'f-social-links', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "@for (link of links; track link.link) {\n <a href=\"{{ link.link }}\" class=\"header-link\">\n <div class=\"f-icon {{ link.icon }}\"></div>\n </a>\n}\n", styles: [":host{display:flex;justify-content:flex-start;align-items:center}.header-link{width:36px;height:36px;padding:7.5px}\n"] }]
2472
+ }] });
2473
+
2474
+ class FThemeButtonComponent {
2475
+ renderer;
2476
+ fState;
2477
+ fBrowser;
2478
+ constructor(renderer, fState, fBrowser) {
2479
+ this.renderer = renderer;
2480
+ this.fState = fState;
2481
+ this.fBrowser = fBrowser;
2482
+ }
2483
+ ngOnInit() {
2484
+ if (this.fState.getPreferredTheme() === 'dark' && !this.isDocumentContainsDarkTheme()) {
2485
+ this.renderer.addClass(this.fBrowser.document.documentElement, 'dark');
2486
+ this.fBrowser.localStorage.setItem('preferred-theme', 'dark');
2487
+ }
2488
+ }
2489
+ isDocumentContainsDarkTheme() {
2490
+ return this.fBrowser.document.documentElement.classList.contains('dark');
2491
+ }
2492
+ onClick() {
2493
+ if (this.fState.getPreferredTheme() === 'light' && !this.isDocumentContainsDarkTheme()) {
2494
+ this.renderer.addClass(this.fBrowser.document.documentElement, 'dark');
2495
+ this.fBrowser.localStorage.setItem('preferred-theme', 'dark');
2496
+ }
2497
+ else {
2498
+ this.renderer.removeClass(this.fBrowser.document.documentElement, 'dark');
2499
+ this.fBrowser.localStorage.setItem('preferred-theme', 'light');
2500
+ }
2501
+ this.fState.updateTheme();
2502
+ }
2503
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FThemeButtonComponent, deps: [{ token: i0.Renderer2 }, { token: FStateService }, { token: i2.BrowserService }], target: i0.ɵɵFactoryTarget.Component });
2504
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FThemeButtonComponent, isStandalone: true, selector: "button[f-theme-button]", host: { listeners: { "click": "onClick()" } }, ngImport: i0, template: "<div class=\"f-icon-container\">\n <div class=\"f-icon moon\"></div>\n <div class=\"f-icon sun\"></div>\n</div>\n", styles: [":host{margin:0 8px;position:relative;border-radius:11px;display:block;width:44px;min-width:44px;height:22px;border:1px solid var(--theme-button-border-color);background-color:var(--theme-button-background);cursor:pointer}:host:hover{border-color:var(--theme-button-hovered-border-color)}.f-icon-container{position:absolute;top:1px;left:1px;width:18px;height:18px;padding:3px;border-radius:50%;background-color:var(--theme-button-icon-background);transition:transform .4s}.f-icon-container .f-icon{position:absolute;top:3px;left:3px;width:12px;height:12px}.f-icon-container .sun{display:block}.f-icon-container .moon{display:none}.dark :host .f-icon-container{transform:translate(22px)}.dark :host .f-icon-container .sun{display:none}.dark :host .f-icon-container .moon{display:block}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2505
+ }
2506
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FThemeButtonComponent, decorators: [{
2507
+ type: Component,
2508
+ args: [{ selector: 'button[f-theme-button]', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"f-icon-container\">\n <div class=\"f-icon moon\"></div>\n <div class=\"f-icon sun\"></div>\n</div>\n", styles: [":host{margin:0 8px;position:relative;border-radius:11px;display:block;width:44px;min-width:44px;height:22px;border:1px solid var(--theme-button-border-color);background-color:var(--theme-button-background);cursor:pointer}:host:hover{border-color:var(--theme-button-hovered-border-color)}.f-icon-container{position:absolute;top:1px;left:1px;width:18px;height:18px;padding:3px;border-radius:50%;background-color:var(--theme-button-icon-background);transition:transform .4s}.f-icon-container .f-icon{position:absolute;top:3px;left:3px;width:12px;height:12px}.f-icon-container .sun{display:block}.f-icon-container .moon{display:none}.dark :host .f-icon-container{transform:translate(22px)}.dark :host .f-icon-container .sun{display:none}.dark :host .f-icon-container .moon{display:block}\n"] }]
2509
+ }], ctorParameters: () => [{ type: i0.Renderer2 }, { type: FStateService }, { type: i2.BrowserService }], propDecorators: { onClick: [{
2510
+ type: HostListener,
2511
+ args: ['click']
2512
+ }] } });
2513
+
2514
+ class FVersionComponent {
2515
+ version$ = inject(INTERNAL_ENVIRONMENT_SERVICE).getVersion();
2516
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FVersionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2517
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: FVersionComponent, isStandalone: true, selector: "f-version", ngImport: i0, template: "@if (version$ | async;as version) {\n <span class=\"version\">v{{ version }}</span>\n}\n", styles: [".version{margin-left:8px;margin-right:8px;display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--primary-text)}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2518
+ }
2519
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FVersionComponent, decorators: [{
2520
+ type: Component,
2521
+ args: [{ selector: 'f-version', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
2522
+ AsyncPipe
2523
+ ], template: "@if (version$ | async;as version) {\n <span class=\"version\">v{{ version }}</span>\n}\n", styles: [".version{margin-left:8px;margin-right:8px;display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--primary-text)}\n"] }]
2524
+ }] });
2525
+
2526
+ const F_HOME_PAGE_ENVIRONMENT = new InjectionToken('F_HOME_PAGE_ENVIRONMENT');
2527
+
2528
+ class FHomePageEnvironmentService {
2529
+ environment;
2530
+ http;
2531
+ constructor(environment, http) {
2532
+ this.environment = environment;
2533
+ this.http = http;
2534
+ }
2535
+ getLogo() {
2536
+ return this.environment.logo;
2537
+ }
2538
+ getTitle() {
2539
+ return this.environment.title;
2540
+ }
2541
+ getHeaderNavigation() {
2542
+ return this.environment.headerNavigation || [];
2543
+ }
2544
+ getVersion() {
2545
+ return new GetVersionHandler(this.http).handle(new GetVersionRequest(this.environment.version));
2546
+ }
2547
+ getSocialLinks() {
2548
+ return this.environment.socialLinks || [];
2549
+ }
2550
+ getHero() {
2551
+ return this.environment.hero;
2552
+ }
2553
+ getButtons() {
2554
+ return this.environment.buttons;
2555
+ }
2556
+ getFeatures() {
2557
+ return this.environment.features;
2558
+ }
2559
+ getFooter() {
2560
+ return this.environment.footer;
2561
+ }
2562
+ getBackgroundComponent() {
2563
+ return this.environment.backgroundComponent;
2564
+ }
2565
+ getImageComponent() {
2566
+ return this.environment.heroImageComponent;
2567
+ }
2568
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FHomePageEnvironmentService, deps: [{ token: F_HOME_PAGE_ENVIRONMENT, optional: true }, { token: i1$1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
2569
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FHomePageEnvironmentService });
2570
+ }
2571
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FHomePageEnvironmentService, decorators: [{
2572
+ type: Injectable
2573
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
2574
+ type: Optional
2575
+ }, {
2576
+ type: Inject,
2577
+ args: [F_HOME_PAGE_ENVIRONMENT]
2578
+ }] }, { type: i1$1.HttpClient }] });
2579
+
2580
+ class FHomePageFeaturesComponent {
2581
+ viewModel = inject(FHomePageEnvironmentService).getFeatures();
2582
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FHomePageFeaturesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2583
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: FHomePageFeaturesComponent, isStandalone: true, selector: "f-home-page-features", ngImport: i0, template: "<div class=\"feature-list\">\n @for (feature of viewModel; track feature.headline) {\n <div class=\"feature\">\n <h2>{{ feature.headline }}</h2>\n <p>{{ feature.description }}</p>\n </div>\n }\n</div>\n\n", styles: [":host{margin-top:64px;margin-bottom:64px;width:100%;display:block;padding:0 24px}:host .feature-list{margin:0 auto;display:flex;flex-wrap:wrap;gap:16px;max-width:1248px;pointer-events:all}:host .feature{width:100%;border-radius:4px;background-color:var(--soft-background);display:flex;flex-direction:column;padding:24px}:host .feature h2{margin:0;line-height:24px;font-size:16px;font-weight:600}:host .feature p{flex-grow:1;padding-top:8px;line-height:24px;font-size:14px;font-weight:500;color:var(--secondary-text)}@media (min-width: 640px){:host{padding:0 48px}:host .feature{width:calc(50% - 12px)}}@media (min-width: 960px){:host{padding:0 64px}:host .feature{width:calc(25% - 12px)}}\n"] });
2584
+ }
2585
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FHomePageFeaturesComponent, decorators: [{
2586
+ type: Component,
2587
+ args: [{ selector: 'f-home-page-features', standalone: true, template: "<div class=\"feature-list\">\n @for (feature of viewModel; track feature.headline) {\n <div class=\"feature\">\n <h2>{{ feature.headline }}</h2>\n <p>{{ feature.description }}</p>\n </div>\n }\n</div>\n\n", styles: [":host{margin-top:64px;margin-bottom:64px;width:100%;display:block;padding:0 24px}:host .feature-list{margin:0 auto;display:flex;flex-wrap:wrap;gap:16px;max-width:1248px;pointer-events:all}:host .feature{width:100%;border-radius:4px;background-color:var(--soft-background);display:flex;flex-direction:column;padding:24px}:host .feature h2{margin:0;line-height:24px;font-size:16px;font-weight:600}:host .feature p{flex-grow:1;padding-top:8px;line-height:24px;font-size:14px;font-weight:500;color:var(--secondary-text)}@media (min-width: 640px){:host{padding:0 48px}:host .feature{width:calc(50% - 12px)}}@media (min-width: 960px){:host{padding:0 64px}:host .feature{width:calc(25% - 12px)}}\n"] }]
2588
+ }] });
2589
+
2590
+ class FHomePageHeaderComponent {
2591
+ logo = inject(FHomePageEnvironmentService).getLogo();
2592
+ title = inject(FHomePageEnvironmentService).getTitle();
2593
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FHomePageHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2594
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FHomePageHeaderComponent, isStandalone: true, selector: "header[f-home-page-header]", ngImport: i0, template: "<div class=\"content\">\n <img [src]=\"logo\" class=\"logo\" alt=\"{{ title }} Logo\" width=\"24\" height=\"24\"/>\n <span class=\"title\">{{ title }}</span>\n <div class=\"flex-space\"></div>\n <button f-theme-button aria-label=\"Change theme\"></button>\n</div>\n\n", styles: [":host{position:relative;z-index:5;padding:0 24px}:host .content{display:flex;justify-content:flex-start;align-items:center;width:100%;height:64px;max-width:1376px;margin:0 auto}:host .logo{margin-right:8px}:host .title{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;font-size:16px;font-weight:600;color:var(--primary-text)}@media (min-width: 640px){:host{padding:0 48px}}@media (min-width: 960px){:host{padding:0 64px}}\n"], dependencies: [{ kind: "component", type: FThemeButtonComponent, selector: "button[f-theme-button]" }] });
2595
+ }
2596
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FHomePageHeaderComponent, decorators: [{
2597
+ type: Component,
2598
+ args: [{ selector: 'header[f-home-page-header]', standalone: true, imports: [
2599
+ FThemeButtonComponent
2600
+ ], template: "<div class=\"content\">\n <img [src]=\"logo\" class=\"logo\" alt=\"{{ title }} Logo\" width=\"24\" height=\"24\"/>\n <span class=\"title\">{{ title }}</span>\n <div class=\"flex-space\"></div>\n <button f-theme-button aria-label=\"Change theme\"></button>\n</div>\n\n", styles: [":host{position:relative;z-index:5;padding:0 24px}:host .content{display:flex;justify-content:flex-start;align-items:center;width:100%;height:64px;max-width:1376px;margin:0 auto}:host .logo{margin-right:8px}:host .title{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;font-size:16px;font-weight:600;color:var(--primary-text)}@media (min-width: 640px){:host{padding:0 48px}}@media (min-width: 960px){:host{padding:0 64px}}\n"] }]
2601
+ }] });
2602
+
2603
+ class FHomePageFooterComponent {
2604
+ viewModel = inject(FHomePageEnvironmentService).getFooter();
2605
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FHomePageFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2606
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FHomePageFooterComponent, isStandalone: true, selector: "footer[f-home-page-footer]", ngImport: i0, template: "<div class=\"content\">\n <div class=\"flex-space\"></div>\n <div>\n <div class=\"item\">Created with Foblex <a href=\"https://github.com/Foblex/m-render\" target=\"_blank\">MRender</a></div>\n <div class=\"item\">{{ viewModel.text }}</div>\n </div>\n</div>\n\n", styles: [":host{position:relative;z-index:5;padding:0 24px}:host .content{display:flex;justify-content:flex-start;align-items:center;flex-wrap:wrap;width:100%;height:64px;max-width:1376px;margin:0 auto}:host .item{line-height:20px;font-size:12px;font-weight:500;color:var(--secondary-text);text-align:right}@media (min-width: 640px){:host{padding:0 48px}}@media (min-width: 960px){:host{padding:0 64px}}\n"] });
2607
+ }
2608
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FHomePageFooterComponent, decorators: [{
2609
+ type: Component,
2610
+ args: [{ selector: 'footer[f-home-page-footer]', standalone: true, template: "<div class=\"content\">\n <div class=\"flex-space\"></div>\n <div>\n <div class=\"item\">Created with Foblex <a href=\"https://github.com/Foblex/m-render\" target=\"_blank\">MRender</a></div>\n <div class=\"item\">{{ viewModel.text }}</div>\n </div>\n</div>\n\n", styles: [":host{position:relative;z-index:5;padding:0 24px}:host .content{display:flex;justify-content:flex-start;align-items:center;flex-wrap:wrap;width:100%;height:64px;max-width:1376px;margin:0 auto}:host .item{line-height:20px;font-size:12px;font-weight:500;color:var(--secondary-text);text-align:right}@media (min-width: 640px){:host{padding:0 48px}}@media (min-width: 960px){:host{padding:0 64px}}\n"] }]
2611
+ }] });
2612
+
2613
+ class FHomePageButtonsRowComponent {
2614
+ viewModel = inject(FHomePageEnvironmentService).getButtons();
2615
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FHomePageButtonsRowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2616
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: FHomePageButtonsRowComponent, isStandalone: true, selector: "f-home-page-buttons-row", ngImport: i0, template: "@for (button of viewModel; track button.text) {\n @if (button.routerLink) {\n <a class=\"f-button\" [class.primary]=\"button.primary\" routerLink=\"{{ button.routerLink }}\">{{ button.text }}</a>\n } @else if(button.href) {\n <a class=\"f-button\" [class.primary]=\"button.primary\" href=\"{{ button.href }}\">{{ button.text }}</a>\n }\n\n}\n<!--<a class=\"f-button primary\" routerLink=\"/docs/get-started\">Get Started</a>-->\n<!--<a class=\"f-button\" routerLink=\"/examples/overview\">Examples</a>-->\n<!--<a class=\"f-button\" href=\"https://github.com/Foblex/m-render\">Github</a>-->\n", styles: [":host{display:flex;padding-top:32px;gap:12px;width:fit-content;margin:0 auto}@media (min-width: 960px){:host{margin:0}}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
2617
+ }
2618
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FHomePageButtonsRowComponent, decorators: [{
2619
+ type: Component,
2620
+ args: [{ selector: 'f-home-page-buttons-row', standalone: true, imports: [
2621
+ RouterLink
2622
+ ], template: "@for (button of viewModel; track button.text) {\n @if (button.routerLink) {\n <a class=\"f-button\" [class.primary]=\"button.primary\" routerLink=\"{{ button.routerLink }}\">{{ button.text }}</a>\n } @else if(button.href) {\n <a class=\"f-button\" [class.primary]=\"button.primary\" href=\"{{ button.href }}\">{{ button.text }}</a>\n }\n\n}\n<!--<a class=\"f-button primary\" routerLink=\"/docs/get-started\">Get Started</a>-->\n<!--<a class=\"f-button\" routerLink=\"/examples/overview\">Examples</a>-->\n<!--<a class=\"f-button\" href=\"https://github.com/Foblex/m-render\">Github</a>-->\n", styles: [":host{display:flex;padding-top:32px;gap:12px;width:fit-content;margin:0 auto}@media (min-width: 960px){:host{margin:0}}\n"] }]
2623
+ }] });
2624
+
2625
+ class FHomePageHeroComponent {
2626
+ viewModel = inject(FHomePageEnvironmentService).getHero();
2627
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FHomePageHeroComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2628
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FHomePageHeroComponent, isStandalone: true, selector: "f-home-page-hero", ngImport: i0, template: "<h1>{{ viewModel.headline }}</h1>\n<p class=\"powered\">{{ viewModel.tagline1 }}</p>\n<p class=\"powered\">{{ viewModel.tagline2 }}</p>\n<p class=\"second-description\">{{ viewModel.subDescription }}</p>\n<f-home-page-buttons-row></f-home-page-buttons-row>\n", styles: [":host{display:block;width:100%}@media (min-width: 640px){:host{width:100%}}@media (min-width: 960px){:host{width:50%}}.powered,h1{letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;width:fit-content;margin:0 auto;text-align:center;white-space:pre-wrap;pointer-events:all}@media (min-width: 640px){.powered,h1{line-height:56px;font-size:48px}}@media (min-width: 960px){.powered,h1{line-height:64px;font-size:56px;margin:0;text-align:left}}h1{background:-webkit-linear-gradient(120deg,#bd34fe 30%,#41d1ff);background-clip:text;color:transparent}.second-description{line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--secondary-text);margin:0 auto;width:fit-content;pointer-events:all;text-align:center;padding:8px 16px 0}@media (min-width: 640px){.second-description{padding-top:12px;line-height:32px;font-size:20px}}@media (min-width: 960px){.second-description{line-height:36px;font-size:24px;margin:0;text-align:left;padding:8px 0 0}}\n"], dependencies: [{ kind: "component", type: FHomePageButtonsRowComponent, selector: "f-home-page-buttons-row" }] });
2629
+ }
2630
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FHomePageHeroComponent, decorators: [{
2631
+ type: Component,
2632
+ args: [{ selector: 'f-home-page-hero', standalone: true, imports: [
2633
+ FHomePageButtonsRowComponent
2634
+ ], template: "<h1>{{ viewModel.headline }}</h1>\n<p class=\"powered\">{{ viewModel.tagline1 }}</p>\n<p class=\"powered\">{{ viewModel.tagline2 }}</p>\n<p class=\"second-description\">{{ viewModel.subDescription }}</p>\n<f-home-page-buttons-row></f-home-page-buttons-row>\n", styles: [":host{display:block;width:100%}@media (min-width: 640px){:host{width:100%}}@media (min-width: 960px){:host{width:50%}}.powered,h1{letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;width:fit-content;margin:0 auto;text-align:center;white-space:pre-wrap;pointer-events:all}@media (min-width: 640px){.powered,h1{line-height:56px;font-size:48px}}@media (min-width: 960px){.powered,h1{line-height:64px;font-size:56px;margin:0;text-align:left}}h1{background:-webkit-linear-gradient(120deg,#bd34fe 30%,#41d1ff);background-clip:text;color:transparent}.second-description{line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--secondary-text);margin:0 auto;width:fit-content;pointer-events:all;text-align:center;padding:8px 16px 0}@media (min-width: 640px){.second-description{padding-top:12px;line-height:32px;font-size:20px}}@media (min-width: 960px){.second-description{line-height:36px;font-size:24px;margin:0;text-align:left;padding:8px 0 0}}\n"] }]
2635
+ }] });
2636
+
2637
+ const F_HOME_PAGE_COMPONENT = new InjectionToken('F_HOME_PAGE_COMPONENT');
2638
+ class FHomePageComponent {
2639
+ _injector = inject(Injector);
2640
+ _environmentService = inject(FHomePageEnvironmentService);
2641
+ _backgroundContainer;
2642
+ _heroImageContainer;
2643
+ ngAfterViewInit() {
2644
+ const heroImageComponent = this._environmentService.getImageComponent();
2645
+ if (heroImageComponent) {
2646
+ const heroImageComponentRef = this._getImageComponentReference(heroImageComponent);
2647
+ this.requestComponentRedraw(heroImageComponentRef);
2648
+ }
2649
+ const backgroundComponent = this._environmentService.getBackgroundComponent();
2650
+ if (backgroundComponent) {
2651
+ const backgroundComponentRef = this._getBackgroundComponentReference(backgroundComponent);
2652
+ this.requestComponentRedraw(backgroundComponentRef);
2653
+ }
2654
+ }
2655
+ _getBackgroundComponentReference(component) {
2656
+ return this._backgroundContainer.createComponent(component);
2657
+ }
2658
+ _getImageComponentReference(component) {
2659
+ return this._heroImageContainer.createComponent(component);
2660
+ }
2661
+ getComponentElement(componentRef) {
2662
+ this.requestComponentRedraw(componentRef);
2663
+ return componentRef.hostView.rootNodes[0];
2664
+ }
2665
+ requestComponentRedraw(componentRef) {
2666
+ componentRef.changeDetectorRef.markForCheck();
2667
+ }
2668
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FHomePageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2669
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FHomePageComponent, isStandalone: true, selector: "f-home-page", providers: [
2670
+ FHomePageEnvironmentService,
2671
+ { provide: INTERNAL_ENVIRONMENT_SERVICE, useExisting: FHomePageEnvironmentService },
2672
+ { provide: F_HOME_PAGE_COMPONENT, useExisting: FHomePageComponent }
2673
+ ], viewQueries: [{ propertyName: "_backgroundContainer", first: true, predicate: ["backgroundContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "_heroImageContainer", first: true, predicate: ["heroImageContainer"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<ng-container #backgroundContainer></ng-container>\n<header f-home-page-header></header>\n\n<div class=\"body\">\n <div class=\"hero-row\">\n <f-home-page-hero></f-home-page-hero>\n <ng-container #heroImageContainer></ng-container>\n </div>\n <f-home-page-features></f-home-page-features>\n</div>\n\n<div class=\"flex-space\"></div>\n<footer f-home-page-footer></footer>\n", styles: [":host{display:flex;flex-direction:column;position:relative;width:100%;height:100%;min-height:100%;overflow:hidden;overflow-y:auto}.body{position:relative;z-index:3;pointer-events:none}@media (min-width: 960px){.body{margin-top:50px}}@media (min-width: 1376px){.body{margin-top:100px}}.hero-row{display:flex;flex-direction:column-reverse;justify-content:space-between;align-items:center;margin:0 auto}@media (min-width: 960px){.hero-row{flex-direction:row;margin-left:64px;margin-right:64px}}@media (min-width: 1376px){.hero-row{flex-direction:row;margin-left:calc(50% - 624px);margin-right:calc(50% - 624px)}}\n"], dependencies: [{ kind: "component", type: FHomePageFooterComponent, selector: "footer[f-home-page-footer]" }, { kind: "component", type: FHomePageHeaderComponent, selector: "header[f-home-page-header]" }, { kind: "component", type: FHomePageFeaturesComponent, selector: "f-home-page-features" }, { kind: "component", type: FHomePageHeroComponent, selector: "f-home-page-hero" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2674
+ }
2675
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FHomePageComponent, decorators: [{
2676
+ type: Component,
2677
+ args: [{ selector: 'f-home-page', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
2678
+ FHomePageEnvironmentService,
2679
+ { provide: INTERNAL_ENVIRONMENT_SERVICE, useExisting: FHomePageEnvironmentService },
2680
+ { provide: F_HOME_PAGE_COMPONENT, useExisting: FHomePageComponent }
2681
+ ], imports: [
2682
+ FHomePageFooterComponent,
2683
+ FHomePageHeaderComponent,
2684
+ FHomePageFeaturesComponent,
2685
+ FHomePageHeroComponent,
2686
+ ], template: "<ng-container #backgroundContainer></ng-container>\n<header f-home-page-header></header>\n\n<div class=\"body\">\n <div class=\"hero-row\">\n <f-home-page-hero></f-home-page-hero>\n <ng-container #heroImageContainer></ng-container>\n </div>\n <f-home-page-features></f-home-page-features>\n</div>\n\n<div class=\"flex-space\"></div>\n<footer f-home-page-footer></footer>\n", styles: [":host{display:flex;flex-direction:column;position:relative;width:100%;height:100%;min-height:100%;overflow:hidden;overflow-y:auto}.body{position:relative;z-index:3;pointer-events:none}@media (min-width: 960px){.body{margin-top:50px}}@media (min-width: 1376px){.body{margin-top:100px}}.hero-row{display:flex;flex-direction:column-reverse;justify-content:space-between;align-items:center;margin:0 auto}@media (min-width: 960px){.hero-row{flex-direction:row;margin-left:64px;margin-right:64px}}@media (min-width: 1376px){.hero-row{flex-direction:row;margin-left:calc(50% - 624px);margin-right:calc(50% - 624px)}}\n"] }]
2687
+ }], propDecorators: { _backgroundContainer: [{
2688
+ type: ViewChild,
2689
+ args: ['backgroundContainer', { read: ViewContainerRef }]
2690
+ }], _heroImageContainer: [{
2691
+ type: ViewChild,
2692
+ args: ['heroImageContainer', { read: ViewContainerRef }]
2693
+ }] } });
2694
+
2695
+ const F_HOME_PAGE_ROUTES = [
2696
+ {
2697
+ path: '',
2698
+ loadComponent: () => Promise.resolve().then(function () { return index; }).then(m => m.FHomePageComponent),
2699
+ }
2700
+ ];
2701
+
2702
+ var index = /*#__PURE__*/Object.freeze({
2703
+ __proto__: null,
2704
+ FHomePageComponent: FHomePageComponent,
2705
+ FHomePageEnvironmentService: FHomePageEnvironmentService,
2706
+ FHomePageFeaturesComponent: FHomePageFeaturesComponent,
2707
+ FHomePageFooterComponent: FHomePageFooterComponent,
2708
+ FHomePageHeaderComponent: FHomePageHeaderComponent,
2709
+ F_HOME_PAGE_COMPONENT: F_HOME_PAGE_COMPONENT,
2710
+ F_HOME_PAGE_ENVIRONMENT: F_HOME_PAGE_ENVIRONMENT,
2711
+ F_HOME_PAGE_ROUTES: F_HOME_PAGE_ROUTES
2712
+ });
2713
+
2400
2714
  /**
2401
2715
  * Generated bundle index. Do not edit.
2402
2716
  */
2403
2717
 
2404
- export { CalculateHashFromScrollPositionHandler, CalculateHashFromScrollPositionRequest, ChangeCodeFocusedSyntaxPreProcessor, CookiePopup, EMarkdownContainerType, FAnalyticsService, FAsyncCodeViewHandler, FBadgeComponent, FCheckboxComponent, FCodeGroupBodyHandler, FCodeGroupHandler, FCodeViewHandler, FDocumentationComponent, FEnvironmentService, FExampleViewHandler, FFooterEditInformationComponent, FFooterNavigationButtonComponent, FFooterNavigationComponent, FHamburgerButtonComponent, FHeadTagService, FHeaderComponent, FHeaderMenuComponent, FJsonLdService, FMarkdownFooterComponent, FMarkdownRendererComponent, FMetaService, FNavigationGroupComponent, FNavigationHeaderComponent, FNavigationItemComponent, FNavigationPanelComponent, FPageComponent, FPopoverService, FPreviewComponent, FScrollableContainerComponent, FSocialLinksComponent, FTableOfContentComponent, FTableOfContentItemsComponent, FThemeButtonComponent, FVersionComponent, F_ACCEPT_COOKIES_KEY, F_DOCUMENTATION_COMPONENT, F_DOCUMENTATION_ROUTES, F_ENVIRONMENT, GetAbsoluteTopToContainerHandler, GetAbsoluteTopToContainerRequest, GetPreviousNextPageNavigationHandler, GetPreviousNextPageNavigationRequest, GetPreviousNextPageNavigationResponse, GetTableOfContentDataHandler, GetTableOfContentDataRequest, GetVersionHandler, GetVersionRequest, HandleDynamicComponentsHandler, HandleDynamicComponentsRequest, HandleNavigationLinksHandler, HandleNavigationLinksRequest, HandleParsedContainersHandler, HandleParsedContainersRequest, HighlightService, MarkCodeFocusedBlocksPostProcessor, MarkdownService, ModifyPunctuationHighlightPostProcessor, ParseAlerts, ParseCodeGroup, ParseCodeView, ParseExampleGroup, ParsePreviewGroup, ScrollToElementInContainer, SeparateCodeByLinesPostProcessor, TableOfContentData, copyToClipboard, getContent, setCookieConsent };
2718
+ export { CalculateHashFromScrollPositionHandler, CalculateHashFromScrollPositionRequest, ChangeCodeFocusedSyntaxPreProcessor, CookiePopup, EMarkdownContainerType, FAnalyticsService, FAsyncCodeViewHandler, FBadgeComponent, FCheckboxComponent, FCodeGroupBodyHandler, FCodeGroupHandler, FCodeViewHandler, FDocumentationComponent, FDocumentationEnvironmentService, FExampleViewHandler, FFooterEditInformationComponent, FFooterNavigationButtonComponent, FFooterNavigationComponent, FHamburgerButtonComponent, FHeadTagService, FHeaderComponent, FHeaderMenuComponent, FHomePageComponent, FHomePageEnvironmentService, FHomePageFeaturesComponent, FHomePageFooterComponent, FHomePageHeaderComponent, FJsonLdService, FMarkdownFooterComponent, FMarkdownRendererComponent, FMetaService, FNavigationGroupComponent, FNavigationHeaderComponent, FNavigationItemComponent, FNavigationPanelComponent, FPageComponent, FPopoverService, FPreviewComponent, FScrollableContainerComponent, FSocialLinksComponent, FTableOfContentComponent, FTableOfContentItemsComponent, FThemeButtonComponent, FVersionComponent, F_ACCEPT_COOKIES_KEY, F_DOCS_ENVIRONMENT, F_DOCUMENTATION_COMPONENT, F_DOCUMENTATION_ROUTES, F_HOME_PAGE_COMPONENT, F_HOME_PAGE_ENVIRONMENT, F_HOME_PAGE_ROUTES, GetAbsoluteTopToContainerHandler, GetAbsoluteTopToContainerRequest, GetPreviousNextPageNavigationHandler, GetPreviousNextPageNavigationRequest, GetPreviousNextPageNavigationResponse, GetTableOfContentDataHandler, GetTableOfContentDataRequest, GetVersionHandler, GetVersionRequest, HandleDynamicComponentsHandler, HandleDynamicComponentsRequest, HandleNavigationLinksHandler, HandleNavigationLinksRequest, HandleParsedContainersHandler, HandleParsedContainersRequest, HighlightService, INTERNAL_ENVIRONMENT_SERVICE, MarkCodeFocusedBlocksPostProcessor, MarkdownService, ModifyPunctuationHighlightPostProcessor, ParseAlerts, ParseCodeGroup, ParseCodeView, ParseExampleGroup, ParsePreviewGroup, ScrollToElementInContainer, SeparateCodeByLinesPostProcessor, TableOfContentData, copyToClipboard, getContent, setCookieConsent };
2405
2719
  //# sourceMappingURL=foblex-m-render.mjs.map