@foblex/m-render 3.0.1 → 3.0.5

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.
@@ -48,3 +48,13 @@
48
48
  }
49
49
  }
50
50
  }
51
+
52
+ @media (max-width: 959px) {
53
+ .m-render {
54
+ .f-code-group {
55
+ width: calc(100% + (var(--page-padding) * 2));
56
+ margin-inline: calc(var(--page-padding) * -1);
57
+ border-radius: 0;
58
+ }
59
+ }
60
+ }
@@ -1,36 +1,36 @@
1
1
  .m-render {
2
- --token-tag: var(--primary-2);
3
- --token-attr-name: var(--purple-2);
4
- --token-attr-value: var(--green-3);
5
- --token-string: var(--green-2);
6
- --token-punctuation: var(--primary-text);
7
- --token-keyword: var(--purple-2);
8
- --token-function: var(--primary-3);
9
- --token-number: var(--yellow-3);
10
- --token-operator: var(--secondary-text);
11
- --token-interpolation: var(--purple-2);
12
- --token-expression: var(--green-3);
13
- --token-comment: var(--gray-1);
14
- --token-selector: var(--primary-2);
15
- --token-variable: #d17adf;
2
+ --token-tag: #1d4ed8;
3
+ --token-attr-name: #7c3aed;
4
+ --token-attr-value: #0f7a43;
5
+ --token-string: #0f8a55;
6
+ --token-punctuation: #2f3441;
7
+ --token-keyword: #6d28d9;
8
+ --token-function: #1e40af;
9
+ --token-number: #b45309;
10
+ --token-operator: #4b5563;
11
+ --token-interpolation: #8b3cf6;
12
+ --token-expression: #0c7a4c;
13
+ --token-comment: #6b7280;
14
+ --token-selector: #1d4ed8;
15
+ --token-variable: #9b2fae;
16
16
  }
17
17
 
18
18
  .dark {
19
19
  .m-render {
20
- --token-tag: var(--indigo-1);
21
- --token-attr-name: var(--purple-1);
22
- --token-attr-value: var(--green-1);
23
- --token-string: var(--green-2);
24
- --token-punctuation: var(--primary-text);
25
- --token-keyword: var(--purple-1);
26
- --token-function: var(--primary-2);
27
- --token-number: var(--yellow-1);
28
- --token-operator: var(--secondary-text);
29
- --token-interpolation: var(--purple-1);
30
- --token-expression: var(--green-2);
31
- --token-comment: var(--gray-1);
32
- --token-selector: var(--indigo-1);
33
- --token-variable: #e0b3ff;
20
+ --token-tag: #8fb5ff;
21
+ --token-attr-name: #d2b4ff;
22
+ --token-attr-value: #7fe3a0;
23
+ --token-string: #84e1a8;
24
+ --token-punctuation: #ececf2;
25
+ --token-keyword: #cab8ff;
26
+ --token-function: #79a6ff;
27
+ --token-number: #f3c97a;
28
+ --token-operator: #b6bbca;
29
+ --token-interpolation: #e4b8ff;
30
+ --token-expression: #8fe7b8;
31
+ --token-comment: #8d95a5;
32
+ --token-selector: #8fb5ff;
33
+ --token-variable: #ffb4d8;
34
34
  }
35
35
  }
36
36
 
@@ -9,3 +9,12 @@
9
9
  overflow: hidden;
10
10
  }
11
11
  }
12
+
13
+ @media (max-width: 959px) {
14
+ .m-render {
15
+ .f-preview-group {
16
+ width: calc(100% + (var(--page-padding) * 2));
17
+ margin-inline: calc(var(--page-padding) * -1);
18
+ }
19
+ }
20
+ }
@@ -229,7 +229,7 @@
229
229
  --code-view-background: var(--alt-background);
230
230
  --code-view-border-radius: var(--border-radius);
231
231
 
232
- --code-view-text-color: var(--secondary-text);
232
+ --code-view-text-color: var(--primary-text);
233
233
  --code-view-line-height: 1.7;
234
234
  --code-view-font-size: 0.875em;
235
235
 
@@ -1,15 +1,15 @@
1
- @import "./_variables";
2
- @import "./_badge";
3
- @import "./_alert";
4
- @import "./_button";
5
- @import "./_fonts";
6
- @import "./_icons";
7
- @import "./_preview-group";
8
- @import "./_code-group";
9
- @import "./_code-view";
10
- @import "./_code-highlight";
11
- @import './_doc-text';
12
- @import "./_table";
1
+ @use "./variables";
2
+ @use "./badge";
3
+ @use "./alert";
4
+ @use "./button";
5
+ @use "./fonts";
6
+ @use "./icons";
7
+ @use "./preview-group";
8
+ @use "./code-group";
9
+ @use "./code-view";
10
+ @use "./code-highlight";
11
+ @use "./doc-text";
12
+ @use "./table";
13
13
 
14
14
  html {
15
15
  height: 100%;
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, Injectable, InjectionToken, signal, PLATFORM_ID, ChangeDetectionStrategy, Component, computed, Renderer2, HostListener, input, EventEmitter, booleanAttribute, Input, ViewChild, Output, output, viewChild, NgZone, ChangeDetectorRef, DestroyRef, Injector, ElementRef, ViewContainerRef, untracked, forwardRef, effect, afterNextRender } from '@angular/core';
2
+ import { inject, Injectable, InjectionToken, signal, PLATFORM_ID, ChangeDetectionStrategy, Component, computed, Renderer2, HostListener, input, viewChild, EventEmitter, booleanAttribute, Input, ViewChild, Output, output, NgZone, ChangeDetectorRef, DestroyRef, Injector, ElementRef, ViewContainerRef, untracked, forwardRef, effect, afterNextRender } from '@angular/core';
3
3
  import { DOCUMENT, isPlatformBrowser, TitleCasePipe } from '@angular/common';
4
4
  import { Router, NavigationEnd, RouterLink, ActivatedRoute, RouterOutlet } from '@angular/router';
5
5
  import { filter, tap, take, catchError, shareReplay, finalize } from 'rxjs/operators';
@@ -130,6 +130,13 @@ function provideHeaderSearch(search) {
130
130
  };
131
131
  }
132
132
 
133
+ function provideHeaderSearchAlgolia(configuration) {
134
+ return {
135
+ search: true,
136
+ searchConfiguration: configuration,
137
+ };
138
+ }
139
+
133
140
  function provideHeaderMediaLinks(mediaLinks) {
134
141
  return {
135
142
  mediaLinks,
@@ -892,15 +899,92 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImpor
892
899
  }], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], logo: [{ type: i0.Input, args: [{ isSignal: true, alias: "logo", required: true }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], logoAlt: [{ type: i0.Input, args: [{ isSignal: true, alias: "logoAlt", required: false }] }], href: [{ type: i0.Input, args: [{ isSignal: true, alias: "href", required: false }] }], routerLink: [{ type: i0.Input, args: [{ isSignal: true, alias: "routerLink", required: false }] }] } });
893
900
 
894
901
  class FSearchButtonComponent {
902
+ configuration = input(undefined, ...(ngDevMode ? [{ debugName: "configuration" }] : []));
903
+ _isBrowser = inject(IS_BROWSER_PLATFORM);
904
+ _document = inject(DOCUMENT);
905
+ _containerRef = viewChild('searchContainer', ...(ngDevMode ? [{ debugName: "_containerRef" }] : []));
906
+ _instance = null;
907
+ async ngAfterViewInit() {
908
+ if (!this._isBrowser)
909
+ return;
910
+ const docsearch = await loadDocSearch(this._document);
911
+ if (!docsearch)
912
+ return;
913
+ const config = this.configuration();
914
+ if (!config)
915
+ return;
916
+ const container = this._containerRef()?.nativeElement;
917
+ if (!container)
918
+ return;
919
+ this._instance = docsearch({
920
+ container,
921
+ appId: config.appId,
922
+ apiKey: config.apiKey,
923
+ indexName: config.indexName,
924
+ placeholder: config.placeholder || 'Search docs',
925
+ insights: config.insights ?? true,
926
+ searchParameters: config.searchParameters,
927
+ });
928
+ }
929
+ ngOnDestroy() {
930
+ this._instance?.destroy?.();
931
+ this._instance = null;
932
+ }
895
933
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: FSearchButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
896
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.4", type: FSearchButtonComponent, isStandalone: true, selector: "f-search-button", ngImport: i0, template: "<a class=\"f-icon search\" [routerLink]=\"[]\" fragment=\"search\"></a>\n", styles: [".f-icon{display:block;width:20px;height:20px;margin-left:8px;color:var(--sponsor);cursor:pointer;transition:transform .2s ease}.f-icon:hover{transform:scale(1.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 });
934
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: FSearchButtonComponent, isStandalone: true, selector: "f-search-button", inputs: { configuration: { classPropertyName: "configuration", publicName: "configuration", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "_containerRef", first: true, predicate: ["searchContainer"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (configuration()) {\n <div #searchContainer class=\"search-container\"></div>\n} @else {\n <a class=\"f-icon search fallback-search\" [routerLink]=\"[]\" fragment=\"search\" aria-label=\"Search\"></a>\n}\n", styles: [":host{display:inline-flex;justify-content:center;align-items:center}.search-container{display:inline-flex;justify-content:center;align-items:center}.fallback-search{display:block;width:20px;height:20px;color:var(--sponsor);cursor:pointer}:host ::ng-deep .DocSearch-Button{margin:0;border:1px solid var(--divider-color);border-radius:6px;width:36px;min-width:36px;height:32px;padding:0;background:var(--code-view-copy-button-background);color:var(--secondary-text)}:host ::ng-deep .DocSearch-Button:hover{background:var(--soft-background)}:host ::ng-deep .DocSearch-Button-Placeholder,:host ::ng-deep .DocSearch-Button-Keys,:host ::ng-deep .DocSearch-Search-Icon+span{display:none}:host ::ng-deep .DocSearch-Search-Icon{width:18px;height:18px}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
897
935
  }
898
936
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: FSearchButtonComponent, decorators: [{
899
937
  type: Component,
900
938
  args: [{ selector: 'f-search-button', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
901
939
  RouterLink,
902
- ], template: "<a class=\"f-icon search\" [routerLink]=\"[]\" fragment=\"search\"></a>\n", styles: [".f-icon{display:block;width:20px;height:20px;margin-left:8px;color:var(--sponsor);cursor:pointer;transition:transform .2s ease}.f-icon:hover{transform:scale(1.1)}\n"] }]
903
- }] });
940
+ ], template: "@if (configuration()) {\n <div #searchContainer class=\"search-container\"></div>\n} @else {\n <a class=\"f-icon search fallback-search\" [routerLink]=\"[]\" fragment=\"search\" aria-label=\"Search\"></a>\n}\n", styles: [":host{display:inline-flex;justify-content:center;align-items:center}.search-container{display:inline-flex;justify-content:center;align-items:center}.fallback-search{display:block;width:20px;height:20px;color:var(--sponsor);cursor:pointer}:host ::ng-deep .DocSearch-Button{margin:0;border:1px solid var(--divider-color);border-radius:6px;width:36px;min-width:36px;height:32px;padding:0;background:var(--code-view-copy-button-background);color:var(--secondary-text)}:host ::ng-deep .DocSearch-Button:hover{background:var(--soft-background)}:host ::ng-deep .DocSearch-Button-Placeholder,:host ::ng-deep .DocSearch-Button-Keys,:host ::ng-deep .DocSearch-Search-Icon+span{display:none}:host ::ng-deep .DocSearch-Search-Icon{width:18px;height:18px}\n"] }]
941
+ }], propDecorators: { configuration: [{ type: i0.Input, args: [{ isSignal: true, alias: "configuration", required: false }] }], _containerRef: [{ type: i0.ViewChild, args: ['searchContainer', { isSignal: true }] }] } });
942
+ let cachedDocSearchFactory = null;
943
+ async function loadDocSearch(documentRef) {
944
+ if (cachedDocSearchFactory) {
945
+ return cachedDocSearchFactory;
946
+ }
947
+ cachedDocSearchFactory = (async () => {
948
+ await Promise.all([
949
+ appendStyle(documentRef),
950
+ appendScript(documentRef),
951
+ ]);
952
+ const docsearch = documentRef.defaultView?.docsearch;
953
+ return typeof docsearch === 'function' ? docsearch : null;
954
+ })();
955
+ return cachedDocSearchFactory;
956
+ }
957
+ function appendScript(documentRef) {
958
+ const existing = documentRef.getElementById(DOCSEARCH_SCRIPT_ID);
959
+ if (existing) {
960
+ return Promise.resolve();
961
+ }
962
+ return new Promise((resolve, reject) => {
963
+ const script = documentRef.createElement('script');
964
+ script.id = DOCSEARCH_SCRIPT_ID;
965
+ script.src = DOCSEARCH_SCRIPT_URL;
966
+ script.async = true;
967
+ script.onload = () => resolve();
968
+ script.onerror = () => reject(new Error('Failed to load Algolia DocSearch script.'));
969
+ documentRef.head.appendChild(script);
970
+ });
971
+ }
972
+ function appendStyle(documentRef) {
973
+ const existing = documentRef.getElementById(DOCSEARCH_STYLE_ID);
974
+ if (existing) {
975
+ return Promise.resolve();
976
+ }
977
+ const link = documentRef.createElement('link');
978
+ link.id = DOCSEARCH_STYLE_ID;
979
+ link.rel = 'stylesheet';
980
+ link.href = DOCSEARCH_STYLE_URL;
981
+ documentRef.head.appendChild(link);
982
+ return Promise.resolve();
983
+ }
984
+ const DOCSEARCH_SCRIPT_ID = 'f-docsearch-script';
985
+ const DOCSEARCH_STYLE_ID = 'f-docsearch-style';
986
+ const DOCSEARCH_SCRIPT_URL = 'https://cdn.jsdelivr.net/npm/@docsearch/js@3/dist/umd/index.js';
987
+ const DOCSEARCH_STYLE_URL = 'https://cdn.jsdelivr.net/npm/@docsearch/css@3/dist/style.css';
904
988
 
905
989
  let uniqueId$1 = 0;
906
990
  class FCheckboxComponent {
@@ -1073,18 +1157,19 @@ class HeaderComponent {
1073
1157
  cancelAnimationFrame(this._rafId);
1074
1158
  }
1075
1159
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: HeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1076
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: HeaderComponent, isStandalone: true, selector: "f-header", viewQueries: [{ propertyName: "_containerRef", first: true, predicate: ["container"], descendants: true, isSignal: true }, { propertyName: "_targetRef", first: true, predicate: ["target"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (emptyNavigation) {\n <f-brand-link class=\"empty-navigation-title\"\n [routerLink]=\"''\"\n [title]=\"title\"\n [logo]=\"image\" />\n} @else {\n <div class=\"portal-title\">\n <button hamburger-button></button>\n <div class=\"title text-ellipsis\">{{ title }}</div>\n </div>\n}\n\n<div class=\"collapsable-row\" #container>\n <div #target class=\"target\" [class.hidden]=\"initialized() && overflowed()\">\n @if (config.navigation) {\n <inline-menu />\n <div class=\"divider\"></div>\n }\n\n <button theme-button></button>\n <div class=\"divider\"></div>\n <media-links />\n </div>\n\n <div class=\"fallback\" [class.hidden]=\"!initialized() || !overflowed()\">\n <dropdown-menu />\n </div>\n</div>\n", styles: [":host{position:sticky;width:100%;top:0;display:flex;justify-content:flex-start;align-items:center;padding:0 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)}}@media(min-width:1280px){:host.empty-navigation{padding-right:max(var(--page-padding),(100vw - var(--layout-max-width)) / 2);padding-left:max(var(--page-padding),(100vw - var(--layout-max-width)) / 2)}}.empty-navigation-title{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}.portal-title{display:flex;justify-content:flex-start;align-items:center}@media(min-width:960px){.portal-title{display:none}}.portal-title .title{font-weight:600;color:var(--primary-text)}.divider{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--divider-color);content:\"\"}.collapsable-row{position:relative;width:100%;display:flex;justify-content:flex-end}.collapsable-row .target{display:flex;justify-content:flex-start;align-items:center;width:fit-content}.collapsable-row .target.hidden{position:absolute;left:-99999px;top:0;visibility:hidden;white-space:nowrap}.collapsable-row .fallback.hidden{display:none}\n"], dependencies: [{ kind: "component", type: HamburgerButton, selector: "button[hamburger-button]" }, { kind: "component", type: FBrandLinkComponent, selector: "f-brand-link", inputs: ["title", "logo", "ariaLabel", "logoAlt", "href", "routerLink"] }, { kind: "component", type: ThemeButtonComponent, selector: "button[theme-button]" }, { kind: "component", type: InlineMenu, selector: "inline-menu" }, { kind: "component", type: DropdownMenu, selector: "dropdown-menu" }, { kind: "component", type: MediaLinks, selector: "media-links" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1160
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: HeaderComponent, isStandalone: true, selector: "f-header", viewQueries: [{ propertyName: "_containerRef", first: true, predicate: ["container"], descendants: true, isSignal: true }, { propertyName: "_targetRef", first: true, predicate: ["target"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (emptyNavigation) {\n <f-brand-link class=\"empty-navigation-title\"\n [routerLink]=\"''\"\n [title]=\"title\"\n [logo]=\"image\" />\n} @else {\n <div class=\"portal-title\">\n <button hamburger-button></button>\n <div class=\"title text-ellipsis\">{{ title }}</div>\n </div>\n}\n\n@if (config.search) {\n <f-search-button [configuration]=\"config.searchConfiguration\"></f-search-button>\n <div class=\"divider search-divider\"></div>\n}\n\n<div class=\"collapsable-row\" #container>\n <div #target class=\"target\" [class.hidden]=\"initialized() && overflowed()\">\n @if (config.navigation) {\n <inline-menu />\n <div class=\"divider\"></div>\n }\n\n <button theme-button></button>\n <div class=\"divider\"></div>\n <media-links />\n </div>\n\n <div class=\"fallback\" [class.hidden]=\"!initialized() || !overflowed()\">\n <dropdown-menu />\n </div>\n</div>\n", styles: [":host{position:sticky;width:100%;top:0;display:flex;justify-content:flex-start;align-items:center;padding:0 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)}}@media(min-width:1280px){:host.empty-navigation{padding-right:max(var(--page-padding),(100vw - var(--layout-max-width)) / 2);padding-left:max(var(--page-padding),(100vw - var(--layout-max-width)) / 2)}}.empty-navigation-title{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}.portal-title{display:flex;justify-content:flex-start;align-items:center}@media(min-width:960px){.portal-title{display:none}}.portal-title .title{font-weight:600;color:var(--primary-text)}.divider{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--divider-color);content:\"\"}@media(max-width:639px){.search-divider{margin-right:6px;margin-left:6px}}.collapsable-row{position:relative;width:100%;display:flex;justify-content:flex-end}.collapsable-row .target{display:flex;justify-content:flex-start;align-items:center;width:fit-content}.collapsable-row .target.hidden{position:absolute;left:-99999px;top:0;visibility:hidden;white-space:nowrap}.collapsable-row .fallback.hidden{display:none}\n"], dependencies: [{ kind: "component", type: HamburgerButton, selector: "button[hamburger-button]" }, { kind: "component", type: FBrandLinkComponent, selector: "f-brand-link", inputs: ["title", "logo", "ariaLabel", "logoAlt", "href", "routerLink"] }, { kind: "component", type: FSearchButtonComponent, selector: "f-search-button", inputs: ["configuration"] }, { kind: "component", type: ThemeButtonComponent, selector: "button[theme-button]" }, { kind: "component", type: InlineMenu, selector: "inline-menu" }, { kind: "component", type: DropdownMenu, selector: "dropdown-menu" }, { kind: "component", type: MediaLinks, selector: "media-links" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1077
1161
  }
1078
1162
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: HeaderComponent, decorators: [{
1079
1163
  type: Component,
1080
1164
  args: [{ selector: 'f-header', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
1081
1165
  HamburgerButton,
1082
1166
  FBrandLinkComponent,
1167
+ FSearchButtonComponent,
1083
1168
  ThemeButtonComponent,
1084
1169
  InlineMenu,
1085
1170
  DropdownMenu,
1086
1171
  MediaLinks,
1087
- ], template: "@if (emptyNavigation) {\n <f-brand-link class=\"empty-navigation-title\"\n [routerLink]=\"''\"\n [title]=\"title\"\n [logo]=\"image\" />\n} @else {\n <div class=\"portal-title\">\n <button hamburger-button></button>\n <div class=\"title text-ellipsis\">{{ title }}</div>\n </div>\n}\n\n<div class=\"collapsable-row\" #container>\n <div #target class=\"target\" [class.hidden]=\"initialized() && overflowed()\">\n @if (config.navigation) {\n <inline-menu />\n <div class=\"divider\"></div>\n }\n\n <button theme-button></button>\n <div class=\"divider\"></div>\n <media-links />\n </div>\n\n <div class=\"fallback\" [class.hidden]=\"!initialized() || !overflowed()\">\n <dropdown-menu />\n </div>\n</div>\n", styles: [":host{position:sticky;width:100%;top:0;display:flex;justify-content:flex-start;align-items:center;padding:0 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)}}@media(min-width:1280px){:host.empty-navigation{padding-right:max(var(--page-padding),(100vw - var(--layout-max-width)) / 2);padding-left:max(var(--page-padding),(100vw - var(--layout-max-width)) / 2)}}.empty-navigation-title{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}.portal-title{display:flex;justify-content:flex-start;align-items:center}@media(min-width:960px){.portal-title{display:none}}.portal-title .title{font-weight:600;color:var(--primary-text)}.divider{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--divider-color);content:\"\"}.collapsable-row{position:relative;width:100%;display:flex;justify-content:flex-end}.collapsable-row .target{display:flex;justify-content:flex-start;align-items:center;width:fit-content}.collapsable-row .target.hidden{position:absolute;left:-99999px;top:0;visibility:hidden;white-space:nowrap}.collapsable-row .fallback.hidden{display:none}\n"] }]
1172
+ ], template: "@if (emptyNavigation) {\n <f-brand-link class=\"empty-navigation-title\"\n [routerLink]=\"''\"\n [title]=\"title\"\n [logo]=\"image\" />\n} @else {\n <div class=\"portal-title\">\n <button hamburger-button></button>\n <div class=\"title text-ellipsis\">{{ title }}</div>\n </div>\n}\n\n@if (config.search) {\n <f-search-button [configuration]=\"config.searchConfiguration\"></f-search-button>\n <div class=\"divider search-divider\"></div>\n}\n\n<div class=\"collapsable-row\" #container>\n <div #target class=\"target\" [class.hidden]=\"initialized() && overflowed()\">\n @if (config.navigation) {\n <inline-menu />\n <div class=\"divider\"></div>\n }\n\n <button theme-button></button>\n <div class=\"divider\"></div>\n <media-links />\n </div>\n\n <div class=\"fallback\" [class.hidden]=\"!initialized() || !overflowed()\">\n <dropdown-menu />\n </div>\n</div>\n", styles: [":host{position:sticky;width:100%;top:0;display:flex;justify-content:flex-start;align-items:center;padding:0 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)}}@media(min-width:1280px){:host.empty-navigation{padding-right:max(var(--page-padding),(100vw - var(--layout-max-width)) / 2);padding-left:max(var(--page-padding),(100vw - var(--layout-max-width)) / 2)}}.empty-navigation-title{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}.portal-title{display:flex;justify-content:flex-start;align-items:center}@media(min-width:960px){.portal-title{display:none}}.portal-title .title{font-weight:600;color:var(--primary-text)}.divider{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--divider-color);content:\"\"}@media(max-width:639px){.search-divider{margin-right:6px;margin-left:6px}}.collapsable-row{position:relative;width:100%;display:flex;justify-content:flex-end}.collapsable-row .target{display:flex;justify-content:flex-start;align-items:center;width:fit-content}.collapsable-row .target.hidden{position:absolute;left:-99999px;top:0;visibility:hidden;white-space:nowrap}.collapsable-row .fallback.hidden{display:none}\n"] }]
1088
1173
  }], propDecorators: { _containerRef: [{ type: i0.ViewChild, args: ['container', { isSignal: true }] }], _targetRef: [{ type: i0.ViewChild, args: ['target', { isSignal: true }] }] } });
1089
1174
 
1090
1175
  class NavigationGroupComponent {
@@ -1351,8 +1436,10 @@ class MarkdownService {
1351
1436
  _provider = inject(F_PREVIEW_NAVIGATION_PROVIDER, { optional: true });
1352
1437
  _pageLayout = signal({ ...DEFAULT_MARKDOWN_PAGE_LAYOUT_OPTIONS }, ...(ngDevMode ? [{ debugName: "_pageLayout" }] : []));
1353
1438
  _pageSeo = signal(null, ...(ngDevMode ? [{ debugName: "_pageSeo" }] : []));
1439
+ _pageOrigin = signal(null, ...(ngDevMode ? [{ debugName: "_pageOrigin" }] : []));
1354
1440
  pageLayout = this._pageLayout.asReadonly();
1355
1441
  pageSeo = this._pageSeo.asReadonly();
1442
+ pageOrigin = this._pageOrigin.asReadonly();
1356
1443
  constructor() {
1357
1444
  this._markdown
1358
1445
  .use((x) => new ParseSingleCodeItem().render(x))
@@ -1425,15 +1512,17 @@ class MarkdownService {
1425
1512
  _parseFrontMatterData(rawFrontMatter) {
1426
1513
  const layout = { ...DEFAULT_MARKDOWN_PAGE_LAYOUT_OPTIONS };
1427
1514
  const seo = {};
1515
+ const origin = { url: null, label: null };
1428
1516
  rawFrontMatter
1429
1517
  .split(/\r?\n/)
1430
- .forEach((line) => this._parseFrontMatterLine(line, layout, seo));
1518
+ .forEach((line) => this._parseFrontMatterLine(line, layout, seo, origin));
1431
1519
  return {
1432
1520
  layout,
1433
1521
  seo: Object.keys(seo).length ? seo : null,
1522
+ origin: this._resolveOrigin(origin),
1434
1523
  };
1435
1524
  }
1436
- _parseFrontMatterLine(line, layout, seo) {
1525
+ _parseFrontMatterLine(line, layout, seo, origin) {
1437
1526
  const normalizedLine = line.trim();
1438
1527
  if (!normalizedLine || normalizedLine.startsWith('#')) {
1439
1528
  return;
@@ -1450,6 +1539,7 @@ class MarkdownService {
1450
1539
  const boolValue = this._parseBoolean(value);
1451
1540
  this._applyLayoutKey(key, boolValue, layout);
1452
1541
  this._applySeoKey(key, value, boolValue, seo);
1542
+ this._applyOriginKey(key, value, origin);
1453
1543
  }
1454
1544
  _normalizeFrontMatterValue(value) {
1455
1545
  const trimmed = value.trim();
@@ -1574,6 +1664,71 @@ class MarkdownService {
1574
1664
  return;
1575
1665
  }
1576
1666
  }
1667
+ _applyOriginKey(key, value, origin) {
1668
+ switch (key) {
1669
+ case 'origin':
1670
+ case 'originurl':
1671
+ case 'origin_url':
1672
+ case 'original':
1673
+ case 'originalurl':
1674
+ case 'original_url':
1675
+ case 'source':
1676
+ case 'sourceurl':
1677
+ case 'source_url': {
1678
+ const normalizedUrl = this._normalizeOriginUrl(value);
1679
+ if (normalizedUrl) {
1680
+ origin.url = normalizedUrl;
1681
+ }
1682
+ return;
1683
+ }
1684
+ case 'originlabel':
1685
+ case 'origin_label':
1686
+ case 'origintext':
1687
+ case 'origin_text':
1688
+ case 'sourcelabel':
1689
+ case 'source_label':
1690
+ origin.label = value;
1691
+ return;
1692
+ }
1693
+ }
1694
+ _normalizeOriginUrl(value) {
1695
+ const trimmed = value.trim();
1696
+ if (!trimmed) {
1697
+ return null;
1698
+ }
1699
+ const candidate = /^https?:\/\//i.test(trimmed) ? trimmed : `https://${trimmed}`;
1700
+ try {
1701
+ const url = new URL(candidate);
1702
+ if (!['http:', 'https:'].includes(url.protocol)) {
1703
+ return null;
1704
+ }
1705
+ return url.toString();
1706
+ }
1707
+ catch {
1708
+ return null;
1709
+ }
1710
+ }
1711
+ _resolveOrigin(origin) {
1712
+ if (!origin.url) {
1713
+ return null;
1714
+ }
1715
+ return {
1716
+ url: origin.url,
1717
+ label: origin.label || this._getOriginLabel(origin.url),
1718
+ };
1719
+ }
1720
+ _getOriginLabel(originUrl) {
1721
+ try {
1722
+ const hostname = new URL(originUrl).hostname.toLowerCase().replace(/^www\./, '');
1723
+ if (hostname === 'medium.com' || hostname.endsWith('.medium.com')) {
1724
+ return 'Originally published on Medium';
1725
+ }
1726
+ return `Originally published on ${hostname}`;
1727
+ }
1728
+ catch {
1729
+ return 'Originally published externally';
1730
+ }
1731
+ }
1577
1732
  _parseNumberOrDefault(value, fallback) {
1578
1733
  const numericValue = Number(value);
1579
1734
  if (!Number.isFinite(numericValue) || numericValue <= 0) {
@@ -1584,6 +1739,7 @@ class MarkdownService {
1584
1739
  _applyPageContext(data) {
1585
1740
  this._pageLayout.set({ ...data.layout });
1586
1741
  this._pageSeo.set(data.seo ? { ...data.seo } : null);
1742
+ this._pageOrigin.set(data.origin ? { ...data.origin } : null);
1587
1743
  }
1588
1744
  _resetPageContext() {
1589
1745
  this._applyPageContext(this._getDefaultFrontMatterData());
@@ -1592,6 +1748,7 @@ class MarkdownService {
1592
1748
  return {
1593
1749
  layout: { ...DEFAULT_MARKDOWN_PAGE_LAYOUT_OPTIONS },
1594
1750
  seo: null,
1751
+ origin: null,
1595
1752
  };
1596
1753
  }
1597
1754
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: MarkdownService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
@@ -3461,6 +3618,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImpor
3461
3618
 
3462
3619
  class MarkdownRenderer {
3463
3620
  value = input.required(...(ngDevMode ? [{ debugName: "value" }] : []));
3621
+ origin = input(null, ...(ngDevMode ? [{ debugName: "origin" }] : []));
3464
3622
  _hostElement = inject(ElementRef).nativeElement;
3465
3623
  _router = inject(Router);
3466
3624
  _injector = inject(Injector);
@@ -3507,14 +3665,14 @@ class MarkdownRenderer {
3507
3665
  this._dynamicComponents.dispose();
3508
3666
  }
3509
3667
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: MarkdownRenderer, deps: [], target: i0.ɵɵFactoryTarget.Component });
3510
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: MarkdownRenderer, isStandalone: true, selector: "markdown-renderer", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null } }, host: { listeners: { "click": "_onDocumentClick($event)" }, classAttribute: "m-render" }, ngImport: i0, template: "<div [innerHTML]=\"value()\"></div>\n@if (value()) {\n <markdown-footer />\n}\n\n", styles: [":host{display:block;width:100%}@media(min-width:1280px){:host{width:calc(100% - var(--on-page-navigation-width) - var(--page-padding))}}@media(min-width:1280px){:host.expand-no-toc{width:100%}}:host.empty-navigation{margin:auto;max-width:900px}\n"], dependencies: [{ kind: "component", type: MarkdownFooter, selector: "markdown-footer" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3668
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: MarkdownRenderer, isStandalone: true, selector: "markdown-renderer", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, origin: { classPropertyName: "origin", publicName: "origin", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "_onDocumentClick($event)" }, classAttribute: "m-render" }, ngImport: i0, template: "<div [innerHTML]=\"value()\"></div>\n@if (origin(); as pageOrigin) {\n <aside class=\"origin-link\" role=\"note\">\n <span class=\"origin-link-icon\" aria-hidden=\"true\"></span>\n <div class=\"origin-link-content\">\n <span class=\"origin-link-label\">{{ pageOrigin.label }}</span>\n <a class=\"origin-link-url\"\n [href]=\"pageOrigin.url\"\n target=\"_blank\"\n rel=\"noopener noreferrer nofollow\">{{ pageOrigin.url }}</a>\n </div>\n </aside>\n}\n@if (value()) {\n <markdown-footer />\n}\n", styles: [":host{display:block;width:100%}@media(min-width:1280px){:host{width:calc(100% - var(--on-page-navigation-width) - var(--page-padding))}}@media(min-width:1280px){:host.expand-no-toc{width:100%}}:host.empty-navigation{margin:auto;max-width:900px}.origin-link{display:flex;justify-content:flex-start;align-items:flex-start;gap:12px;margin-top:28px;border:1px solid var(--divider-color);border-radius:10px;padding:12px 14px;background:linear-gradient(135deg,var(--soft-background) 0%,var(--alt-background) 100%);box-shadow:var(--shadow-1);line-height:20px;font-size:14px}.origin-link-icon{flex-shrink:0;display:inline-flex;justify-content:center;align-items:center;width:28px;height:28px;border-radius:999px;background-color:var(--primary-soft);color:var(--primary-2);font-size:10px;font-weight:700;letter-spacing:.06em}.origin-link-icon:before{content:\"SRC\"}.origin-link-content{min-width:0}.origin-link-label{display:block;color:var(--secondary-text);font-weight:600}.origin-link-url{display:inline-block;margin-top:2px;color:var(--primary-1);text-decoration:underline;text-underline-offset:3px;overflow-wrap:anywhere;transition:color .2s ease}.origin-link-url:hover{color:var(--primary-2)}@media(max-width:639px){.origin-link{margin-top:24px;border-radius:8px;padding:10px 12px;gap:10px}.origin-link-icon{width:24px;height:24px;font-size:9px}}\n"], dependencies: [{ kind: "component", type: MarkdownFooter, selector: "markdown-footer" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3511
3669
  }
3512
3670
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: MarkdownRenderer, decorators: [{
3513
3671
  type: Component,
3514
3672
  args: [{ selector: 'markdown-renderer', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [MarkdownFooter], host: {
3515
3673
  class: 'm-render',
3516
- }, template: "<div [innerHTML]=\"value()\"></div>\n@if (value()) {\n <markdown-footer />\n}\n\n", styles: [":host{display:block;width:100%}@media(min-width:1280px){:host{width:calc(100% - var(--on-page-navigation-width) - var(--page-padding))}}@media(min-width:1280px){:host.expand-no-toc{width:100%}}:host.empty-navigation{margin:auto;max-width:900px}\n"] }]
3517
- }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }], _onDocumentClick: [{
3674
+ }, template: "<div [innerHTML]=\"value()\"></div>\n@if (origin(); as pageOrigin) {\n <aside class=\"origin-link\" role=\"note\">\n <span class=\"origin-link-icon\" aria-hidden=\"true\"></span>\n <div class=\"origin-link-content\">\n <span class=\"origin-link-label\">{{ pageOrigin.label }}</span>\n <a class=\"origin-link-url\"\n [href]=\"pageOrigin.url\"\n target=\"_blank\"\n rel=\"noopener noreferrer nofollow\">{{ pageOrigin.url }}</a>\n </div>\n </aside>\n}\n@if (value()) {\n <markdown-footer />\n}\n", styles: [":host{display:block;width:100%}@media(min-width:1280px){:host{width:calc(100% - var(--on-page-navigation-width) - var(--page-padding))}}@media(min-width:1280px){:host.expand-no-toc{width:100%}}:host.empty-navigation{margin:auto;max-width:900px}.origin-link{display:flex;justify-content:flex-start;align-items:flex-start;gap:12px;margin-top:28px;border:1px solid var(--divider-color);border-radius:10px;padding:12px 14px;background:linear-gradient(135deg,var(--soft-background) 0%,var(--alt-background) 100%);box-shadow:var(--shadow-1);line-height:20px;font-size:14px}.origin-link-icon{flex-shrink:0;display:inline-flex;justify-content:center;align-items:center;width:28px;height:28px;border-radius:999px;background-color:var(--primary-soft);color:var(--primary-2);font-size:10px;font-weight:700;letter-spacing:.06em}.origin-link-icon:before{content:\"SRC\"}.origin-link-content{min-width:0}.origin-link-label{display:block;color:var(--secondary-text);font-weight:600}.origin-link-url{display:inline-block;margin-top:2px;color:var(--primary-1);text-decoration:underline;text-underline-offset:3px;overflow-wrap:anywhere;transition:color .2s ease}.origin-link-url:hover{color:var(--primary-2)}@media(max-width:639px){.origin-link{margin-top:24px;border-radius:8px;padding:10px 12px;gap:10px}.origin-link-icon{width:24px;height:24px;font-size:9px}}\n"] }]
3675
+ }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }], origin: [{ type: i0.Input, args: [{ isSignal: true, alias: "origin", required: false }] }], _onDocumentClick: [{
3518
3676
  type: HostListener,
3519
3677
  args: ['click', ['$event']]
3520
3678
  }] } });
@@ -3526,6 +3684,7 @@ class MarkdownRouter {
3526
3684
  _dataProvider = inject(DocumentationStore);
3527
3685
  _metaService = inject(FMetaService, { optional: true });
3528
3686
  emptyNavigation = !this._dataProvider.getNavigation().length;
3687
+ pageOrigin = this._markdown.pageOrigin;
3529
3688
  shouldExpandContent = computed(() => {
3530
3689
  const layout = this._markdown.pageLayout();
3531
3690
  return layout.hideTableOfContent && layout.expandContentWithoutTableOfContent;
@@ -3539,7 +3698,7 @@ class MarkdownRouter {
3539
3698
  }), tap(() => this._metaService?.applyMarkdownSeo(this._markdown.pageSeo())));
3540
3699
  })), { initialValue: undefined });
3541
3700
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: MarkdownRouter, deps: [], target: i0.ɵɵFactoryTarget.Component });
3542
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.4", type: MarkdownRouter, isStandalone: true, selector: "markdown-router", host: { attributes: { "ngSkipHydration": "" }, properties: { "class.empty-navigation": "emptyNavigation" } }, ngImport: i0, template: "<markdown-renderer [value]=\"html()\"\n [class.empty-navigation]=\"emptyNavigation\"\n [class.expand-no-toc]=\"shouldExpandContent()\"/>\n", styles: [":host{display:block;width:100%;padding:48px var(--page-padding) 140px}@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)}}@media(min-width:1280px){:host.empty-navigation{padding-right:max(var(--page-padding),(100vw - var(--layout-max-width)) / 2);padding-left:max(var(--page-padding),(100vw - var(--layout-max-width)) / 2)}}\n"], dependencies: [{ kind: "component", type: MarkdownRenderer, selector: "markdown-renderer", inputs: ["value"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3701
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.4", type: MarkdownRouter, isStandalone: true, selector: "markdown-router", host: { attributes: { "ngSkipHydration": "" }, properties: { "class.empty-navigation": "emptyNavigation" } }, ngImport: i0, template: "<markdown-renderer [value]=\"html()\"\n [origin]=\"pageOrigin()\"\n [class.empty-navigation]=\"emptyNavigation\"\n [class.expand-no-toc]=\"shouldExpandContent()\"/>\n", styles: [":host{display:block;width:100%;padding:48px var(--page-padding) 140px}@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)}}@media(min-width:1280px){:host.empty-navigation{padding-right:max(var(--page-padding),(100vw - var(--layout-max-width)) / 2);padding-left:max(var(--page-padding),(100vw - var(--layout-max-width)) / 2)}}\n"], dependencies: [{ kind: "component", type: MarkdownRenderer, selector: "markdown-renderer", inputs: ["value", "origin"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3543
3702
  }
3544
3703
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: MarkdownRouter, decorators: [{
3545
3704
  type: Component,
@@ -3548,7 +3707,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImpor
3548
3707
  '[class.empty-navigation]': 'emptyNavigation',
3549
3708
  }, imports: [
3550
3709
  MarkdownRenderer,
3551
- ], template: "<markdown-renderer [value]=\"html()\"\n [class.empty-navigation]=\"emptyNavigation\"\n [class.expand-no-toc]=\"shouldExpandContent()\"/>\n", styles: [":host{display:block;width:100%;padding:48px var(--page-padding) 140px}@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)}}@media(min-width:1280px){:host.empty-navigation{padding-right:max(var(--page-padding),(100vw - var(--layout-max-width)) / 2);padding-left:max(var(--page-padding),(100vw - var(--layout-max-width)) / 2)}}\n"] }]
3710
+ ], template: "<markdown-renderer [value]=\"html()\"\n [origin]=\"pageOrigin()\"\n [class.empty-navigation]=\"emptyNavigation\"\n [class.expand-no-toc]=\"shouldExpandContent()\"/>\n", styles: [":host{display:block;width:100%;padding:48px var(--page-padding) 140px}@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)}}@media(min-width:1280px){:host.empty-navigation{padding-right:max(var(--page-padding),(100vw - var(--layout-max-width)) / 2);padding-left:max(var(--page-padding),(100vw - var(--layout-max-width)) / 2)}}\n"] }]
3552
3711
  }] });
3553
3712
 
3554
3713
  var index$2 = /*#__PURE__*/Object.freeze({
@@ -3992,5 +4151,5 @@ var index = /*#__PURE__*/Object.freeze({
3992
4151
  * Generated bundle index. Do not edit.
3993
4152
  */
3994
4153
 
3995
- export { AVAILABLE_LANGUAGES, ActivateTocByHash, ActivateTocByHashRequest, CalculateAbsoluteTopToContainer, CalculateAbsoluteTopToContainerRequest, CalculateHashFromScrollPosition, CalculateTableOfContent, CalculateTableOfContentRequest, CodeGroup, CodeView, DEFAULT_MARKDOWN_PAGE_LAYOUT_OPTIONS, DOCUMENTATION_CONFIGURATION, DOCUMENTATION_ROUTES, DOCUMENT_ELEMENT, DYNAMIC_COMPONENTS_MODULE_PROVIDERS, Documentation, DocumentationStore, DropdownMenu, DynamicComponentsStore, EMarkdownContainerType, EParsedContainerType, EXTERNAL_COMPONENT_PROVIDER, ExternalComponent, FBrandLinkComponent, FCheckboxComponent, FHomePageButtonsRowComponent, FHomePageFeaturesComponent, FHomePageFooterComponent, FHomePageHeaderComponent, FHomePageHeroComponent, FHomePageMembershipsComponent, FMetaService, FNavigationItemComponent, FRadioButtonComponent, FSearchButtonComponent, F_PREVIEW_NAVIGATION_PROVIDER, FooterNavigationButton, GTAG_CONFIG, GTagService, GetPreviousNextPageNavigationHandler, GetPreviousNextPageNavigationRequest, GetPreviousNextPageNavigationResponse, HEADER_CONFIGURATION_PROVIDER, HOME_PAGE_CONFIGURATION, HOME_ROUTES, HamburgerButton, HandleNavigationLinksHandler, HandleNavigationLinksRequest, HeaderComponent, HeaderMenuBase, Highlight, HighlightService, HomeRootComponent, HomeStore, IS_BROWSER_PLATFORM, InlineMenu, LOCAL_STORAGE, LOCATION, MEDIA_LINKS_PROVIDER, MExecution, MarkCodeFocusedBlocksPostProcessor, MarkdownFooter, MarkdownRenderer, MarkdownRouter, MarkdownService, MediaLinks, Mediatr, NavigationGroupComponent, NavigationPanelComponent, ParseAlerts, ParseAngularExampleWithCodeLinks, ParseGroupedCodeItems, ParsePreviewGroup, ParseShowcase, ParseSingleCodeItem, PopoverService, PreviewActionBar, PreviewCard, PreviewCardBase, PreviewGroupService, RenderDynamicComponent, RenderDynamicComponentRequest, RenderExternalComponent, RenderExternalComponentRequest, RenderInternalComponents, RenderInternalComponentsRequest, SCROLLABLE_CONTAINER, SHOWCASE_DATA, ScrollToElementInContainer, ScrollToElementInContainerRequest, ScrollableContainer, Showcase, ShowcaseItem, TABLE_OF_CONTENT_MODULE_PROVIDERS, TOGGLE_NAVIGATION_COMPONENT, TableOfContent, TableOfContentData, TableOfContentItemsComponent, ThemeButtonComponent, ThemeService, UNIVERSAL_THEME, WINDOW, calculateMarkdownUrl, coerceComponentHeight$1 as coerceComponentHeight, copyToClipboard, defineLazyComponent, defineNavigationGroup, encodeDataAttr, extractComponent, getContent, getLanguageLoader, isClosingToken, isOpeningToken, parseComponentTag, parseFileLinkLine, parseIframeUrl, parseSingleBracketText, provide404Markdown, provideBackground, provideComponents, provideDirectory, provideDocumentation, provideFooterNavigation, provideGTag, provideHeader, provideHeaderMediaLinks, provideHeaderNavigation, provideHeaderSearch, provideHero, provideHomeButtons, provideHomeFeatures, provideHomeFooter, provideHomePage, provideImage, provideLanguage, provideLogo, provideMeta, provideNavigation, provideShowcase, provideTableOfContent, provideTheme, provideTitle, resolveHighlightLanguage };
4154
+ export { AVAILABLE_LANGUAGES, ActivateTocByHash, ActivateTocByHashRequest, CalculateAbsoluteTopToContainer, CalculateAbsoluteTopToContainerRequest, CalculateHashFromScrollPosition, CalculateTableOfContent, CalculateTableOfContentRequest, CodeGroup, CodeView, DEFAULT_MARKDOWN_PAGE_LAYOUT_OPTIONS, DOCUMENTATION_CONFIGURATION, DOCUMENTATION_ROUTES, DOCUMENT_ELEMENT, DYNAMIC_COMPONENTS_MODULE_PROVIDERS, Documentation, DocumentationStore, DropdownMenu, DynamicComponentsStore, EMarkdownContainerType, EParsedContainerType, EXTERNAL_COMPONENT_PROVIDER, ExternalComponent, FBrandLinkComponent, FCheckboxComponent, FHomePageButtonsRowComponent, FHomePageFeaturesComponent, FHomePageFooterComponent, FHomePageHeaderComponent, FHomePageHeroComponent, FHomePageMembershipsComponent, FMetaService, FNavigationItemComponent, FRadioButtonComponent, FSearchButtonComponent, F_PREVIEW_NAVIGATION_PROVIDER, FooterNavigationButton, GTAG_CONFIG, GTagService, GetPreviousNextPageNavigationHandler, GetPreviousNextPageNavigationRequest, GetPreviousNextPageNavigationResponse, HEADER_CONFIGURATION_PROVIDER, HOME_PAGE_CONFIGURATION, HOME_ROUTES, HamburgerButton, HandleNavigationLinksHandler, HandleNavigationLinksRequest, HeaderComponent, HeaderMenuBase, Highlight, HighlightService, HomeRootComponent, HomeStore, IS_BROWSER_PLATFORM, InlineMenu, LOCAL_STORAGE, LOCATION, MEDIA_LINKS_PROVIDER, MExecution, MarkCodeFocusedBlocksPostProcessor, MarkdownFooter, MarkdownRenderer, MarkdownRouter, MarkdownService, MediaLinks, Mediatr, NavigationGroupComponent, NavigationPanelComponent, ParseAlerts, ParseAngularExampleWithCodeLinks, ParseGroupedCodeItems, ParsePreviewGroup, ParseShowcase, ParseSingleCodeItem, PopoverService, PreviewActionBar, PreviewCard, PreviewCardBase, PreviewGroupService, RenderDynamicComponent, RenderDynamicComponentRequest, RenderExternalComponent, RenderExternalComponentRequest, RenderInternalComponents, RenderInternalComponentsRequest, SCROLLABLE_CONTAINER, SHOWCASE_DATA, ScrollToElementInContainer, ScrollToElementInContainerRequest, ScrollableContainer, Showcase, ShowcaseItem, TABLE_OF_CONTENT_MODULE_PROVIDERS, TOGGLE_NAVIGATION_COMPONENT, TableOfContent, TableOfContentData, TableOfContentItemsComponent, ThemeButtonComponent, ThemeService, UNIVERSAL_THEME, WINDOW, calculateMarkdownUrl, coerceComponentHeight$1 as coerceComponentHeight, copyToClipboard, defineLazyComponent, defineNavigationGroup, encodeDataAttr, extractComponent, getContent, getLanguageLoader, isClosingToken, isOpeningToken, parseComponentTag, parseFileLinkLine, parseIframeUrl, parseSingleBracketText, provide404Markdown, provideBackground, provideComponents, provideDirectory, provideDocumentation, provideFooterNavigation, provideGTag, provideHeader, provideHeaderMediaLinks, provideHeaderNavigation, provideHeaderSearch, provideHeaderSearchAlgolia, provideHero, provideHomeButtons, provideHomeFeatures, provideHomeFooter, provideHomePage, provideImage, provideLanguage, provideLogo, provideMeta, provideNavigation, provideShowcase, provideTableOfContent, provideTheme, provideTitle, resolveHighlightLanguage };
3996
4155
  //# sourceMappingURL=foblex-m-render.mjs.map