@foblex/m-render 2.7.3 → 2.7.4

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.
@@ -1,7 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { inject, signal, computed, ChangeDetectionStrategy, Component } from '@angular/core';
3
- import { GTagService } from './foblex-m-render.mjs';
4
- import { LOCAL_STORAGE } from '@foblex/mr-common';
3
+ import { LOCAL_STORAGE, GTagService } from './foblex-m-render.mjs';
5
4
 
6
5
  const F_ACCEPT_COOKIES_KEY = 'm-accepts-cookies';
7
6
  class CookiePopupComponent {
@@ -37,4 +36,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.11", ngImpo
37
36
  }], ctorParameters: () => [] });
38
37
 
39
38
  export { CookiePopupComponent, F_ACCEPT_COOKIES_KEY };
40
- //# sourceMappingURL=foblex-m-render-cookie-popup.component-CqwZv5lc.mjs.map
39
+ //# sourceMappingURL=foblex-m-render-cookie-popup.component-BZZxqp3j.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foblex-m-render-cookie-popup.component-BZZxqp3j.mjs","sources":["../../../../libs/m-render/src/lib/analytics/cookie-popup/cookie-popup.component.ts","../../../../libs/m-render/src/lib/analytics/cookie-popup/cookie-popup.component.html"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\nimport { GTagService } from '../g-tag.service';\nimport { LOCAL_STORAGE } from '../../common';\n\nexport const F_ACCEPT_COOKIES_KEY = 'm-accepts-cookies';\n\n@Component({\n selector: 'cookie-popup',\n standalone: true,\n templateUrl: './cookie-popup.component.html',\n styleUrls: ['./cookie-popup.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CookiePopupComponent {\n private readonly _localStorage = inject(LOCAL_STORAGE);\n private readonly _gtag = inject(GTagService, { optional: true });\n\n private readonly _consentValue = signal<string | null>(null);\n\n protected readonly showPopup = computed(() =>\n this._gtag !== null &&\n this._consentValue() !== 'true' &&\n this._consentValue() !== 'false',\n );\n\n constructor() {\n try {\n const value = this._localStorage?.getItem(F_ACCEPT_COOKIES_KEY);\n this._consentValue.set(value);\n } catch {\n this._consentValue.set(null);\n }\n }\n\n protected accept(): void {\n try {\n this._localStorage?.setItem(F_ACCEPT_COOKIES_KEY, 'true');\n } catch { /* empty */ }\n\n this._gtag?.updateConsent(true);\n this._consentValue.set('true');\n }\n}\n\n","@if (showPopup()) {\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"],"names":[],"mappings":";;;;AAIO,MAAM,oBAAoB,GAAG;MASvB,oBAAoB,CAAA;AACd,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;IACrC,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAE/C,IAAA,aAAa,GAAG,MAAM,CAAgB,IAAI,CAAC;IAEzC,SAAS,GAAG,QAAQ,CAAC,MACtC,IAAI,CAAC,KAAK,KAAK,IAAI;AACnB,QAAA,IAAI,CAAC,aAAa,EAAE,KAAK,MAAM;AAC/B,QAAA,IAAI,CAAC,aAAa,EAAE,KAAK,OAAO,CACjC;AAED,IAAA,WAAA,GAAA;AACE,QAAA,IAAI;YACF,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,oBAAoB,CAAC;AAC/D,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;;AAC7B,QAAA,MAAM;AACN,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;;;IAItB,MAAM,GAAA;AACd,QAAA,IAAI;YACF,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,oBAAoB,EAAE,MAAM,CAAC;;AACzD,QAAA,MAAM;AAER,QAAA,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC;AAC/B,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;;wGA3BrB,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,wECbjC,ooBAoBA,EAAA,MAAA,EAAA,CAAA,+sBAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FDPa,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAPhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EACZ,UAAA,EAAA,IAAI,EAGC,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,ooBAAA,EAAA,MAAA,EAAA,CAAA,+sBAAA,CAAA,EAAA;;;;;"}
@@ -1,14 +1,13 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, Injectable, InjectionToken, EventEmitter, booleanAttribute, HostListener, Input, ViewChild, Output, ChangeDetectionStrategy, Component, input, output, viewChild, signal, ElementRef, NgZone, Directive, Renderer2, ChangeDetectorRef, DestroyRef, computed, ViewContainerRef, Injector, forwardRef, effect, untracked } from '@angular/core';
3
- import { DOCUMENT, TitleCasePipe } from '@angular/common';
4
- import { of, map, Subject, startWith, filter, EMPTY, switchMap, debounceTime, fromEvent } from 'rxjs';
2
+ import { inject, Injectable, InjectionToken, EventEmitter, booleanAttribute, HostListener, Input, ViewChild, Output, ChangeDetectionStrategy, Component, input, output, viewChild, signal, ElementRef, NgZone, Directive, PLATFORM_ID, Renderer2, ChangeDetectorRef, DestroyRef, computed, ViewContainerRef, Injector, forwardRef, effect, untracked } from '@angular/core';
3
+ import { DOCUMENT, isPlatformBrowser, TitleCasePipe } from '@angular/common';
4
+ import { of, map, Subject, from, switchMap, startWith, filter, defer, Observable, EMPTY, debounceTime, fromEvent } from 'rxjs';
5
5
  import { HttpClient } from '@angular/common/http';
6
- import { catchError, tap, filter as filter$1, take } from 'rxjs/operators';
6
+ import { catchError, tap, filter as filter$1, shareReplay, take } from 'rxjs/operators';
7
7
  import { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';
8
8
  import { Overlay, CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';
9
9
  import { Router, RouterLink, NavigationEnd, ActivatedRoute, RouterOutlet } from '@angular/router';
10
- import { LOCAL_STORAGE, WINDOW, DOCUMENT_ELEMENT, LOCATION, IS_BROWSER_PLATFORM, copyToClipboard } from '@foblex/mr-common';
11
- import { HighlightService, AVAILABLE_LANGUAGES } from '@foblex/mr-highlight';
10
+ import { createHighlighter } from 'shiki';
12
11
  import MarkdownIt from 'markdown-it';
13
12
  import { DomSanitizer } from '@angular/platform-browser';
14
13
  import container from 'markdown-it-container';
@@ -484,6 +483,46 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.11", ngImpo
484
483
  type: Injectable
485
484
  }] });
486
485
 
486
+ function copyToClipboard(value) {
487
+ const blob = new Blob([value], { type: 'text/plain' });
488
+ const data = [new ClipboardItem({ [blob.type]: blob })];
489
+ // @ts-ignore
490
+ return from(window?.navigator.permissions.query({ name: 'clipboard-write' })).pipe(map((permission) => permission.state !== 'denied'), switchMap((isGranted) => {
491
+ if (isGranted) {
492
+ return from(navigator.clipboard.write(data));
493
+ }
494
+ return of(undefined);
495
+ }));
496
+ }
497
+
498
+ const DOCUMENT_ELEMENT = new InjectionToken('DOCUMENT_ELEMENT', {
499
+ factory: () => inject(DOCUMENT).documentElement,
500
+ });
501
+
502
+ const WINDOW = new InjectionToken('F_WINDOW', {
503
+ factory: () => {
504
+ const { defaultView } = inject(DOCUMENT);
505
+ if (!defaultView) {
506
+ throw new Error('Window is not available');
507
+ }
508
+ return defaultView;
509
+ },
510
+ });
511
+
512
+ const LOCAL_STORAGE = new InjectionToken('F_LOCAL_STORAGE', {
513
+ factory: () => inject(WINDOW).localStorage,
514
+ });
515
+
516
+ const LOCATION = new InjectionToken('F_LOCATION', {
517
+ factory: () => inject(WINDOW).location,
518
+ });
519
+
520
+ const IS_BROWSER_PLATFORM = new InjectionToken('IS_BROWSER_PLATFORM', {
521
+ factory() {
522
+ return isPlatformBrowser(inject(PLATFORM_ID));
523
+ },
524
+ });
525
+
487
526
  class FHeadTagService {
488
527
  _document = inject(DOCUMENT);
489
528
  setTitle(title) {
@@ -989,6 +1028,391 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.11", ngImpo
989
1028
  }, template: "@for (data of data(); track data) {\n <button class=\"f-tab-button\" [class.active]=\"$index === index()\"\n (click)=\"onTabClick($index)\">\n {{ data.tab }}\n </button>\n}\n" }]
990
1029
  }] });
991
1030
 
1031
+ class MarkCodeFocusedBlocksPostProcessor {
1032
+ _window;
1033
+ constructor(_window) {
1034
+ this._window = _window;
1035
+ }
1036
+ handle(element) {
1037
+ const html = element.innerHTML;
1038
+ if (!FOCUS_REGEX.test(html)) {
1039
+ return of(element);
1040
+ }
1041
+ element.innerHTML = html.replace(FOCUS_REGEX, (_match, content) => {
1042
+ return `<focus class="focused"><div class="inline-focus">${content}</div></focus>`;
1043
+ });
1044
+ const focused = element.querySelector('.focused');
1045
+ if (focused) {
1046
+ this._applyOpacity(element.parentElement);
1047
+ }
1048
+ return of(element);
1049
+ }
1050
+ _applyOpacity(element) {
1051
+ if (!element.classList.contains('focused')) {
1052
+ element.style.color = this._createRgbaString(this._getElementColor(element), 0.5);
1053
+ element.childNodes.forEach((child) => {
1054
+ if (child.nodeType === Node.ELEMENT_NODE) {
1055
+ this._applyOpacity(child);
1056
+ }
1057
+ });
1058
+ }
1059
+ else {
1060
+ element.style.color = this._createRgbaString(this._getElementColor(element), 1, true);
1061
+ }
1062
+ }
1063
+ _getElementColor(element) {
1064
+ return this._window.getComputedStyle(element).color;
1065
+ }
1066
+ _createRgbaString(color, opacity, isRgb = false) {
1067
+ const [r, g, b, a] = this._getRgbValues(color);
1068
+ const alpha = Number(a) || 1;
1069
+ return isRgb ? `rgb(${r}, ${g}, ${b})` : `rgba(${r}, ${g}, ${b}, ${opacity * alpha})`;
1070
+ }
1071
+ _getRgbValues(color) {
1072
+ return color.match(/\d+/g);
1073
+ }
1074
+ }
1075
+ const FOCUS_REGEX = /ƒƒƒ([\s\S]*?)¢¢¢/g;
1076
+
1077
+ const UNIVERSAL_THEME = {
1078
+ name: 'universal',
1079
+ colors: {
1080
+ 'editor.background': 'transparent',
1081
+ 'editor.foreground': 'var(--code-view-text-color)',
1082
+ },
1083
+ settings: [
1084
+ {
1085
+ scope: ['comment', 'punctuation.definition.comment', 'string.comment'],
1086
+ settings: {
1087
+ foreground: 'var(--token-comment)',
1088
+ },
1089
+ },
1090
+ {
1091
+ scope: ['constant', 'entity.name.constant', 'variable.other.constant', 'variable.other.enummember', 'variable.language'],
1092
+ settings: {
1093
+ foreground: 'var(--token-number)',
1094
+ },
1095
+ },
1096
+ {
1097
+ scope: ['entity', 'entity.name'],
1098
+ settings: {
1099
+ foreground: 'var(--token-tag)',
1100
+ },
1101
+ },
1102
+ {
1103
+ scope: 'variable.parameter.function',
1104
+ settings: {
1105
+ foreground: 'var(--primary-text)',
1106
+ },
1107
+ },
1108
+ {
1109
+ scope: 'entity.name.tag',
1110
+ settings: {
1111
+ foreground: 'var(--token-tag)',
1112
+ },
1113
+ },
1114
+ {
1115
+ scope: 'keyword',
1116
+ settings: {
1117
+ foreground: 'var(--token-keyword)',
1118
+ },
1119
+ },
1120
+ {
1121
+ scope: ['storage', 'storage.type'],
1122
+ settings: {
1123
+ foreground: 'var(--token-keyword)',
1124
+ },
1125
+ },
1126
+ {
1127
+ scope: ['storage.modifier.package', 'storage.modifier.import', 'storage.type.java'],
1128
+ settings: {
1129
+ foreground: 'var(--primary-text)',
1130
+ },
1131
+ },
1132
+ {
1133
+ scope: ['string', 'punctuation.definition.string', 'string punctuation.section.embedded source'],
1134
+ settings: {
1135
+ foreground: 'var(--token-string)',
1136
+ },
1137
+ },
1138
+ {
1139
+ scope: 'support',
1140
+ settings: {
1141
+ foreground: 'var(--token-function)',
1142
+ },
1143
+ },
1144
+ {
1145
+ scope: 'meta.property-name',
1146
+ settings: {
1147
+ foreground: 'var(--token-function)',
1148
+ },
1149
+ },
1150
+ {
1151
+ scope: 'variable',
1152
+ settings: {
1153
+ foreground: 'var(--token-variable)',
1154
+ },
1155
+ },
1156
+ {
1157
+ scope: 'variable.other',
1158
+ settings: {
1159
+ foreground: 'var(--token-function)',
1160
+ },
1161
+ },
1162
+ {
1163
+ scope: [
1164
+ 'invalid.broken',
1165
+ 'invalid.deprecated',
1166
+ 'invalid.illegal',
1167
+ 'invalid.unimplemented',
1168
+ ],
1169
+ settings: {
1170
+ fontStyle: 'italic',
1171
+ foreground: 'var(--danger-2)',
1172
+ },
1173
+ },
1174
+ {
1175
+ scope: 'carriage-return',
1176
+ settings: {
1177
+ fontStyle: 'italic underline',
1178
+ foreground: 'var(--background-color)',
1179
+ background: 'var(--token-keyword)',
1180
+ },
1181
+ },
1182
+ {
1183
+ scope: 'message.error',
1184
+ settings: {
1185
+ foreground: 'var(--danger-2)',
1186
+ },
1187
+ },
1188
+ {
1189
+ scope: 'string variable',
1190
+ settings: {
1191
+ foreground: 'var(--token-function)',
1192
+ },
1193
+ },
1194
+ {
1195
+ scope: ['source.regexp', 'string.regexp'],
1196
+ settings: {
1197
+ foreground: 'var(--token-interpolation)',
1198
+ },
1199
+ },
1200
+ {
1201
+ scope: [
1202
+ 'string.regexp.character-class',
1203
+ 'string.regexp constant.character.escape',
1204
+ 'string.regexp source.ruby.embedded',
1205
+ 'string.regexp string.regexp.arbitrary-repitition',
1206
+ ],
1207
+ settings: {
1208
+ foreground: 'var(--token-interpolation)',
1209
+ },
1210
+ },
1211
+ {
1212
+ scope: 'string.regexp constant.character.escape',
1213
+ settings: {
1214
+ fontStyle: 'bold',
1215
+ foreground: 'var(--token-attr-value)',
1216
+ },
1217
+ },
1218
+ {
1219
+ scope: ['support.constant', 'support.variable', 'meta.module-reference'],
1220
+ settings: {
1221
+ foreground: 'var(--token-function)',
1222
+ },
1223
+ },
1224
+ {
1225
+ scope: 'punctuation.definition.list.begin.markdown',
1226
+ settings: {
1227
+ foreground: 'var(--token-variable)',
1228
+ },
1229
+ },
1230
+ {
1231
+ scope: ['markup.heading', 'markup.heading entity.name'],
1232
+ settings: {
1233
+ fontStyle: 'bold',
1234
+ foreground: 'var(--token-function)',
1235
+ },
1236
+ },
1237
+ {
1238
+ scope: 'markup.quote',
1239
+ settings: {
1240
+ foreground: 'var(--token-attr-value)',
1241
+ },
1242
+ },
1243
+ {
1244
+ scope: 'markup.italic',
1245
+ settings: {
1246
+ fontStyle: 'italic',
1247
+ foreground: 'var(--primary-text)',
1248
+ },
1249
+ },
1250
+ {
1251
+ scope: 'markup.bold',
1252
+ settings: {
1253
+ fontStyle: 'bold',
1254
+ foreground: 'var(--primary-text)',
1255
+ },
1256
+ },
1257
+ {
1258
+ scope: 'markup.underline',
1259
+ settings: {
1260
+ fontStyle: 'underline',
1261
+ },
1262
+ },
1263
+ {
1264
+ scope: 'markup.strikethrough',
1265
+ settings: {
1266
+ fontStyle: 'strikethrough',
1267
+ },
1268
+ },
1269
+ {
1270
+ scope: 'markup.inline.raw',
1271
+ settings: {
1272
+ foreground: 'var(--token-function)',
1273
+ },
1274
+ },
1275
+ {
1276
+ scope: ['markup.deleted', 'meta.diff.header.from-file', 'punctuation.definition.deleted'],
1277
+ settings: {
1278
+ background: 'var(--danger-3)',
1279
+ foreground: 'var(--danger-2)',
1280
+ },
1281
+ },
1282
+ {
1283
+ scope: ['markup.inserted', 'meta.diff.header.to-file', 'punctuation.definition.inserted'],
1284
+ settings: {
1285
+ background: 'var(--success-3)',
1286
+ foreground: 'var(--token-attr-value)',
1287
+ },
1288
+ },
1289
+ {
1290
+ scope: ['markup.changed', 'punctuation.definition.changed'],
1291
+ settings: {
1292
+ background: 'var(--warning-3)',
1293
+ foreground: 'var(--token-variable)',
1294
+ },
1295
+ },
1296
+ {
1297
+ scope: ['markup.ignored', 'markup.untracked'],
1298
+ settings: {
1299
+ background: 'var(--token-function)',
1300
+ foreground: 'var(--alt-background)',
1301
+ },
1302
+ },
1303
+ {
1304
+ scope: 'meta.diff.range',
1305
+ settings: {
1306
+ fontStyle: 'bold',
1307
+ foreground: 'var(--token-attr-name)',
1308
+ },
1309
+ },
1310
+ {
1311
+ scope: 'meta.diff.header',
1312
+ settings: {
1313
+ foreground: 'var(--token-function)',
1314
+ },
1315
+ },
1316
+ {
1317
+ scope: 'meta.separator',
1318
+ settings: {
1319
+ fontStyle: 'bold',
1320
+ foreground: 'var(--token-function)',
1321
+ },
1322
+ },
1323
+ {
1324
+ scope: 'meta.output',
1325
+ settings: {
1326
+ foreground: 'var(--token-function)',
1327
+ },
1328
+ },
1329
+ {
1330
+ scope: [
1331
+ 'brackethighlighter.tag',
1332
+ 'brackethighlighter.curly',
1333
+ 'brackethighlighter.round',
1334
+ 'brackethighlighter.square',
1335
+ 'brackethighlighter.angle',
1336
+ 'brackethighlighter.quote',
1337
+ ],
1338
+ settings: {
1339
+ foreground: 'var(--gray-1)',
1340
+ },
1341
+ },
1342
+ {
1343
+ scope: 'brackethighlighter.unmatched',
1344
+ settings: {
1345
+ foreground: 'var(--danger-2)',
1346
+ },
1347
+ },
1348
+ {
1349
+ scope: ['constant.other.reference.link', 'string.other.link'],
1350
+ settings: {
1351
+ fontStyle: 'underline',
1352
+ foreground: 'var(--token-interpolation)',
1353
+ },
1354
+ },
1355
+ ],
1356
+ };
1357
+
1358
+ const AVAILABLE_LANGUAGES = [
1359
+ 'javascript',
1360
+ 'typescript',
1361
+ 'angular-html',
1362
+ 'angular-ts',
1363
+ 'shell',
1364
+ 'html',
1365
+ 'bash',
1366
+ 'css',
1367
+ 'scss',
1368
+ 'markdown',
1369
+ 'text',
1370
+ ];
1371
+
1372
+ class HighlightService {
1373
+ /**
1374
+ * Service for highlighting code blocks using Shiki.
1375
+ * It supports syntax highlighting and post-processing for focused blocks.
1376
+ */
1377
+ _isBrowser = inject(IS_BROWSER_PLATFORM);
1378
+ _window = inject(WINDOW);
1379
+ _highlighter$ = defer(() => from(createHighlighter({ themes: [UNIVERSAL_THEME], langs: AVAILABLE_LANGUAGES }))).pipe(shareReplay(1));
1380
+ highlight(element, lang, content) {
1381
+ if (!this._isBrowser) {
1382
+ console.warn('[HighlightService] Skipping highlight on server.');
1383
+ return of(element);
1384
+ }
1385
+ return this._highlightCodeBlock(element, lang, content).pipe(switchMap((x) => this._postProcess(x)), catchError((err) => {
1386
+ console.error('[HighlightService] Failed to highlight:', err);
1387
+ return of(element);
1388
+ }));
1389
+ }
1390
+ _highlightCodeBlock(element, lang, content) {
1391
+ return this._highlighter$.pipe(switchMap((highlighter) => this._renderCode(element, highlighter, lang, content)));
1392
+ }
1393
+ _renderCode(element, highlighter, lang, content) {
1394
+ return new Observable((observer) => {
1395
+ const processedContent = this._preprocessFocus(content);
1396
+ element.innerHTML = highlighter.codeToHtml(processedContent, { lang, theme: 'universal', defaultColor: false });
1397
+ requestAnimationFrame(() => {
1398
+ observer.next(element);
1399
+ observer.complete();
1400
+ });
1401
+ });
1402
+ }
1403
+ _preprocessFocus(code) {
1404
+ return code.replace(/\|\:\|([\s\S]*?)\|\:\|/g, (_, p1) => `ƒƒƒ${p1}¢¢¢`);
1405
+ }
1406
+ _postProcess(element) {
1407
+ return of(element).pipe(switchMap((x) => new MarkCodeFocusedBlocksPostProcessor(this._window).handle(x)));
1408
+ }
1409
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: HighlightService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1410
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: HighlightService });
1411
+ }
1412
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: HighlightService, decorators: [{
1413
+ type: Injectable
1414
+ }] });
1415
+
992
1416
  class HighlightComponent {
993
1417
  _highlightService = inject(HighlightService);
994
1418
  _elementRef = inject(ElementRef);
@@ -2440,9 +2864,9 @@ class DocumentationRootComponent {
2440
2864
  provide: TOGGLE_NAVIGATION_COMPONENT,
2441
2865
  useExisting: DocumentationRootComponent,
2442
2866
  },
2443
- ], ngImport: i0, template: "<f-navigation-panel [class.visible]=\"isNavigationVisible()\"></f-navigation-panel>\n<div class=\"f-backdrop\" [class.visible]=\"isNavigationVisible()\" (click)=\"onToggleNavigation(false)\"></div>\n\n<f-scrollable-container>\n <f-header></f-header>\n <router-outlet></router-outlet>\n</f-scrollable-container>\n\n@if (popover()) {\n <div class=\"popover\">{{ popover() }}</div>\n}\n@defer (when isBrowser) {\n <cookie-popup/>\n}\n", styles: [":host{display:flex;justify-content:flex-start;align-items:flex-start;height:100%;gap:5px}.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);box-shadow:var(--shadow-3);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: NavigationPanelComponent, selector: "f-navigation-panel" }, { kind: "component", type: ScrollableContainerComponent, selector: "f-scrollable-container" }, { kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: HeaderComponent, selector: "f-header" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, deferBlockDependencies: [() => [import('./foblex-m-render-cookie-popup.component-CqwZv5lc.mjs').then(m => m.CookiePopupComponent)]] });
2867
+ ], ngImport: i0, template: "<f-navigation-panel [class.visible]=\"isNavigationVisible()\"></f-navigation-panel>\n<div class=\"f-backdrop\" [class.visible]=\"isNavigationVisible()\" (click)=\"onToggleNavigation(false)\"></div>\n\n<f-scrollable-container>\n <f-header></f-header>\n <router-outlet></router-outlet>\n</f-scrollable-container>\n\n@if (popover()) {\n <div class=\"popover\">{{ popover() }}</div>\n}\n@defer (when isBrowser) {\n <cookie-popup/>\n}\n", styles: [":host{display:flex;justify-content:flex-start;align-items:flex-start;height:100%;gap:5px}.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);box-shadow:var(--shadow-3);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: NavigationPanelComponent, selector: "f-navigation-panel" }, { kind: "component", type: ScrollableContainerComponent, selector: "f-scrollable-container" }, { kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: HeaderComponent, selector: "f-header" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, deferBlockDependencies: [() => [import('./foblex-m-render-cookie-popup.component-BZZxqp3j.mjs').then(m => m.CookiePopupComponent)]] });
2444
2868
  }
2445
- i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "19.2.11", ngImport: i0, type: DocumentationRootComponent, resolveDeferredDeps: () => [import('./foblex-m-render-cookie-popup.component-CqwZv5lc.mjs').then(m => m.CookiePopupComponent)], resolveMetadata: CookiePopupComponent => ({ decorators: [{
2869
+ i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "19.2.11", ngImport: i0, type: DocumentationRootComponent, resolveDeferredDeps: () => [import('./foblex-m-render-cookie-popup.component-BZZxqp3j.mjs').then(m => m.CookiePopupComponent)], resolveMetadata: CookiePopupComponent => ({ decorators: [{
2446
2870
  type: Component,
2447
2871
  args: [{ selector: 'documentation-root', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
2448
2872
  HighlightService,
@@ -2770,9 +3194,9 @@ class HomeRootComponent {
2770
3194
  provide: HEADER_CONFIGURATION_STORE,
2771
3195
  useExisting: HomeStore,
2772
3196
  },
2773
- ], 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 <f-home-page-memberships></f-home-page-memberships>\n</div>\n\n<div class=\"flex-space\"></div>\n<footer f-home-page-footer></footer>\n\n@defer (when isBrowser) {\n <cookie-popup/>\n}\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" }, { kind: "component", type: FHomePageMembershipsComponent, selector: "f-home-page-memberships" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, deferBlockDependencies: [() => [import('./foblex-m-render-cookie-popup.component-CqwZv5lc.mjs').then(m => m.CookiePopupComponent)]] });
3197
+ ], 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 <f-home-page-memberships></f-home-page-memberships>\n</div>\n\n<div class=\"flex-space\"></div>\n<footer f-home-page-footer></footer>\n\n@defer (when isBrowser) {\n <cookie-popup/>\n}\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" }, { kind: "component", type: FHomePageMembershipsComponent, selector: "f-home-page-memberships" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, deferBlockDependencies: [() => [import('./foblex-m-render-cookie-popup.component-BZZxqp3j.mjs').then(m => m.CookiePopupComponent)]] });
2774
3198
  }
2775
- i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "19.2.11", ngImport: i0, type: HomeRootComponent, resolveDeferredDeps: () => [import('./foblex-m-render-cookie-popup.component-CqwZv5lc.mjs').then(m => m.CookiePopupComponent)], resolveMetadata: CookiePopupComponent => ({ decorators: [{
3199
+ i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "19.2.11", ngImport: i0, type: HomeRootComponent, resolveDeferredDeps: () => [import('./foblex-m-render-cookie-popup.component-BZZxqp3j.mjs').then(m => m.CookiePopupComponent)], resolveMetadata: CookiePopupComponent => ({ decorators: [{
2776
3200
  type: Component,
2777
3201
  args: [{ selector: 'home-root', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
2778
3202
  HomeStore,
@@ -2828,5 +3252,5 @@ var index = /*#__PURE__*/Object.freeze({
2828
3252
  * Generated bundle index. Do not edit.
2829
3253
  */
2830
3254
 
2831
- export { ActivateTocByHashHandler, ActivateTocByHashRequest, CalculateHashFromScrollPositionAndActivateTocHandler, CalculateHashFromScrollPositionAndActivateTocRequest, CalculateTableOfContentDataHandler, CalculateTableOfContentDataRequest, DOCUMENTATION_CONFIGURATION, DOCUMENTATION_ROUTES, DocumentationRootComponent, DocumentationStore, DropdownMenuComponent, EMarkdownContainerType, EParsedContainerType, FCheckboxComponent, FCodeGroupComponent, FCodeGroupTabsComponent, FCodeViewComponent, FExampleViewComponent, FFooterEditInformationComponent, FFooterNavigationButtonComponent, FFooterNavigationComponent, FHomePageButtonsRowComponent, FHomePageFeaturesComponent, FHomePageFooterComponent, FHomePageHeaderComponent, FHomePageHeroComponent, FHomePageMembershipsComponent, FInsertComponentDirective, FMarkdownFooterComponent, FMarkdownRendererComponent, FMetaService, FNavigationItemComponent, FPreviewBase, FPreviewComponent, FPreviewGroupFiltersComponent, FPreviewGroupService, FRadioButtonComponent, FSocialLinksComponent, F_PREVIEW_NAVIGATION_PROVIDER, F_SOCIAL_LINKS_PROVIDER, GTAG_CONFIG, GTagService, GetAbsoluteTopToContainerHandler, GetAbsoluteTopToContainerRequest, GetPreviousNextPageNavigationHandler, GetPreviousNextPageNavigationRequest, GetPreviousNextPageNavigationResponse, HEADER_CONFIGURATION, HEADER_CONFIGURATION_STORE, HOME_PAGE_CONFIGURATION, HOME_ROUTES, HamburgerButtonComponent, HandleNavigationLinksHandler, HandleNavigationLinksRequest, HeaderComponent, HighlightComponent, HomeRootComponent, HomeStore, InlineMenuComponent, MarkdownContainerComponent, MarkdownService, NavigationGroupComponent, NavigationPanelComponent, NpmVersionComponent, OverflowObserverDirective, ParseAlerts, ParseAngularExampleWithCodeLinks, ParseGroupedCodeItems, ParsePreviewGroup, ParseSingleCodeItem, PopoverService, RIGHT_TOP_OVERLAY_POSITION, RenderDynamicComponentsHandler, RenderDynamicComponentsRequest, SCROLLABLE_CONTAINER, ScrollToElementInContainerHandler, ScrollToElementInContainerRequest, ScrollableContainerComponent, TOGGLE_NAVIGATION_COMPONENT, TableOfContentComponent, TableOfContentData, TableOfContentItemsComponent, ThemeButtonComponent, ThemeService, coerceComponentHeight, defineLazyComponent, defineNavigationGroup, encodeDataAttr, extractComponent, getContent, isClosingToken, isOpeningToken, parseComponentTag, parseFileLinkLine, parseLanguageFromFileExtension, parseSingleBracketText, parseSyntaxLanguage, provide404Markdown, provideBackground, provideComponents, provideDirectory, provideDocumentation, provideDocumentationMeta, provideFooterNavigation, provideGTag, provideHeader, provideHeaderMediaLinks, provideHeaderNavigation, provideHero, provideHomeButtons, provideHomeFeatures, provideHomeFooter, provideHomePage, provideImage, provideLanguage, provideLogo, provideNavigation, provideTheme, provideTitle, provideTocData };
3255
+ export { AVAILABLE_LANGUAGES, ActivateTocByHashHandler, ActivateTocByHashRequest, CalculateHashFromScrollPositionAndActivateTocHandler, CalculateHashFromScrollPositionAndActivateTocRequest, CalculateTableOfContentDataHandler, CalculateTableOfContentDataRequest, DOCUMENTATION_CONFIGURATION, DOCUMENTATION_ROUTES, DOCUMENT_ELEMENT, DocumentationRootComponent, DocumentationStore, DropdownMenuComponent, EMarkdownContainerType, EParsedContainerType, FCheckboxComponent, FCodeGroupComponent, FCodeGroupTabsComponent, FCodeViewComponent, FExampleViewComponent, FFooterEditInformationComponent, FFooterNavigationButtonComponent, FFooterNavigationComponent, FHomePageButtonsRowComponent, FHomePageFeaturesComponent, FHomePageFooterComponent, FHomePageHeaderComponent, FHomePageHeroComponent, FHomePageMembershipsComponent, FInsertComponentDirective, FMarkdownFooterComponent, FMarkdownRendererComponent, FMetaService, FNavigationItemComponent, FPreviewBase, FPreviewComponent, FPreviewGroupFiltersComponent, FPreviewGroupService, FRadioButtonComponent, FSocialLinksComponent, F_PREVIEW_NAVIGATION_PROVIDER, F_SOCIAL_LINKS_PROVIDER, GTAG_CONFIG, GTagService, GetAbsoluteTopToContainerHandler, GetAbsoluteTopToContainerRequest, GetPreviousNextPageNavigationHandler, GetPreviousNextPageNavigationRequest, GetPreviousNextPageNavigationResponse, HEADER_CONFIGURATION, HEADER_CONFIGURATION_STORE, HOME_PAGE_CONFIGURATION, HOME_ROUTES, HamburgerButtonComponent, HandleNavigationLinksHandler, HandleNavigationLinksRequest, HeaderComponent, HighlightComponent, HighlightService, HomeRootComponent, HomeStore, IS_BROWSER_PLATFORM, InlineMenuComponent, LOCAL_STORAGE, LOCATION, MarkCodeFocusedBlocksPostProcessor, MarkdownContainerComponent, MarkdownService, NavigationGroupComponent, NavigationPanelComponent, NpmVersionComponent, OverflowObserverDirective, ParseAlerts, ParseAngularExampleWithCodeLinks, ParseGroupedCodeItems, ParsePreviewGroup, ParseSingleCodeItem, PopoverService, RIGHT_TOP_OVERLAY_POSITION, RenderDynamicComponentsHandler, RenderDynamicComponentsRequest, SCROLLABLE_CONTAINER, ScrollToElementInContainerHandler, ScrollToElementInContainerRequest, ScrollableContainerComponent, TOGGLE_NAVIGATION_COMPONENT, TableOfContentComponent, TableOfContentData, TableOfContentItemsComponent, ThemeButtonComponent, ThemeService, UNIVERSAL_THEME, WINDOW, coerceComponentHeight, copyToClipboard, defineLazyComponent, defineNavigationGroup, encodeDataAttr, extractComponent, getContent, isClosingToken, isOpeningToken, parseComponentTag, parseFileLinkLine, parseLanguageFromFileExtension, parseSingleBracketText, parseSyntaxLanguage, provide404Markdown, provideBackground, provideComponents, provideDirectory, provideDocumentation, provideDocumentationMeta, provideFooterNavigation, provideGTag, provideHeader, provideHeaderMediaLinks, provideHeaderNavigation, provideHero, provideHomeButtons, provideHomeFeatures, provideHomeFooter, provideHomePage, provideImage, provideLanguage, provideLogo, provideNavigation, provideTheme, provideTitle, provideTocData };
2832
3256
  //# sourceMappingURL=foblex-m-render.mjs.map