@mintplayer/ng-spark 22.31.0 → 22.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +101 -1
- package/fesm2022/mintplayer-ng-spark-attribute-description.mjs +3 -3
- package/fesm2022/mintplayer-ng-spark-auth-account.mjs +18 -18
- package/fesm2022/mintplayer-ng-spark-auth-auth-bar.mjs +16 -8
- package/fesm2022/mintplayer-ng-spark-auth-auth-bar.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-spark-auth-confirm-email.mjs +3 -3
- package/fesm2022/mintplayer-ng-spark-auth-core.mjs +6 -6
- package/fesm2022/mintplayer-ng-spark-auth-external-login.mjs +3 -3
- package/fesm2022/mintplayer-ng-spark-auth-forgot-password.mjs +3 -3
- package/fesm2022/mintplayer-ng-spark-auth-login.mjs +3 -3
- package/fesm2022/mintplayer-ng-spark-auth-pipes.mjs +3 -3
- package/fesm2022/mintplayer-ng-spark-auth-register.mjs +3 -3
- package/fesm2022/mintplayer-ng-spark-auth-reset-password.mjs +3 -3
- package/fesm2022/mintplayer-ng-spark-auth-sign-in.mjs +3 -3
- package/fesm2022/mintplayer-ng-spark-auth-two-factor.mjs +3 -3
- package/fesm2022/mintplayer-ng-spark-client-operations.mjs +24 -24
- package/fesm2022/mintplayer-ng-spark-column-filter.mjs +3 -3
- package/fesm2022/mintplayer-ng-spark-contributions.mjs +9 -9
- package/fesm2022/mintplayer-ng-spark-grid.mjs +220 -49
- package/fesm2022/mintplayer-ng-spark-grid.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-spark-history.mjs +9 -9
- package/fesm2022/mintplayer-ng-spark-icon.mjs +3 -3
- package/fesm2022/mintplayer-ng-spark-identity-provider-connected-applications.mjs +3 -3
- package/fesm2022/mintplayer-ng-spark-identity-provider-core.mjs +9 -9
- package/fesm2022/mintplayer-ng-spark-identity-provider-developers.mjs +6 -6
- package/fesm2022/mintplayer-ng-spark-identity-provider-management.mjs +3 -3
- package/fesm2022/mintplayer-ng-spark-models.mjs +44 -1
- package/fesm2022/mintplayer-ng-spark-models.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-spark-moderation.mjs +21 -21
- package/fesm2022/mintplayer-ng-spark-notifications.mjs +687 -0
- package/fesm2022/mintplayer-ng-spark-notifications.mjs.map +1 -0
- package/fesm2022/mintplayer-ng-spark-organizations-accept.mjs +179 -0
- package/fesm2022/mintplayer-ng-spark-organizations-accept.mjs.map +1 -0
- package/fesm2022/mintplayer-ng-spark-organizations.mjs +202 -0
- package/fesm2022/mintplayer-ng-spark-organizations.mjs.map +1 -0
- package/fesm2022/mintplayer-ng-spark-pipes.mjs +125 -85
- package/fesm2022/mintplayer-ng-spark-pipes.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-spark-po-create.mjs +3 -3
- package/fesm2022/mintplayer-ng-spark-po-detail.mjs +90 -26
- package/fesm2022/mintplayer-ng-spark-po-detail.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-spark-po-edit.mjs +84 -12
- package/fesm2022/mintplayer-ng-spark-po-edit.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-spark-po-form.mjs +9 -9
- package/fesm2022/mintplayer-ng-spark-pwa.mjs +74 -6
- package/fesm2022/mintplayer-ng-spark-pwa.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-spark-query-list.mjs +10 -109
- package/fesm2022/mintplayer-ng-spark-query-list.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-spark-renderers.mjs +3 -3
- package/fesm2022/mintplayer-ng-spark-retry-action-modal.mjs +3 -3
- package/fesm2022/mintplayer-ng-spark-score-renderers.mjs +801 -0
- package/fesm2022/mintplayer-ng-spark-score-renderers.mjs.map +1 -0
- package/fesm2022/mintplayer-ng-spark-services.mjs +424 -72
- package/fesm2022/mintplayer-ng-spark-services.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-spark-share-page.mjs +334 -0
- package/fesm2022/mintplayer-ng-spark-share-page.mjs.map +1 -0
- package/fesm2022/mintplayer-ng-spark-share.mjs +10 -0
- package/fesm2022/mintplayer-ng-spark-share.mjs.map +1 -0
- package/fesm2022/mintplayer-ng-spark-shell.mjs +38 -36
- package/fesm2022/mintplayer-ng-spark-shell.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-spark-soft-delete.mjs +9 -9
- package/package.json +25 -1
- package/types/mintplayer-ng-spark-grid.d.ts +77 -26
- package/types/mintplayer-ng-spark-models.d.ts +150 -17
- package/types/mintplayer-ng-spark-notifications.d.ts +188 -0
- package/types/mintplayer-ng-spark-organizations-accept.d.ts +40 -0
- package/types/mintplayer-ng-spark-organizations.d.ts +72 -0
- package/types/mintplayer-ng-spark-pipes.d.ts +10 -0
- package/types/mintplayer-ng-spark-po-detail.d.ts +26 -0
- package/types/mintplayer-ng-spark-po-edit.d.ts +37 -0
- package/types/mintplayer-ng-spark-pwa.d.ts +48 -2
- package/types/mintplayer-ng-spark-query-list.d.ts +8 -23
- package/types/mintplayer-ng-spark-score-renderers.d.ts +340 -0
- package/types/mintplayer-ng-spark-services.d.ts +146 -6
- package/types/mintplayer-ng-spark-share-page.d.ts +67 -0
- package/types/mintplayer-ng-spark-share.d.ts +26 -0
|
@@ -35,7 +35,7 @@ var SparkProgramUnitsComponent = class SparkProgramUnitsComponent {
|
|
|
35
35
|
}
|
|
36
36
|
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
37
37
|
minVersion: "12.0.0",
|
|
38
|
-
version: "22.2.
|
|
38
|
+
version: "22.2.2",
|
|
39
39
|
ngImport: i0,
|
|
40
40
|
type: SparkProgramUnitsComponent,
|
|
41
41
|
deps: [],
|
|
@@ -43,7 +43,7 @@ var SparkProgramUnitsComponent = class SparkProgramUnitsComponent {
|
|
|
43
43
|
});
|
|
44
44
|
static ɵcmp = i0.ɵɵngDeclareComponent({
|
|
45
45
|
minVersion: "17.0.0",
|
|
46
|
-
version: "22.2.
|
|
46
|
+
version: "22.2.2",
|
|
47
47
|
type: SparkProgramUnitsComponent,
|
|
48
48
|
isStandalone: true,
|
|
49
49
|
selector: "spark-program-units",
|
|
@@ -153,7 +153,7 @@ var SparkProgramUnitsComponent = class SparkProgramUnitsComponent {
|
|
|
153
153
|
};
|
|
154
154
|
i0.ɵɵngDeclareClassMetadata({
|
|
155
155
|
minVersion: "12.0.0",
|
|
156
|
-
version: "22.2.
|
|
156
|
+
version: "22.2.2",
|
|
157
157
|
ngImport: i0,
|
|
158
158
|
type: SparkProgramUnitsComponent,
|
|
159
159
|
decorators: [{
|
|
@@ -202,7 +202,7 @@ var SparkLanguageSelectorComponent = class SparkLanguageSelectorComponent {
|
|
|
202
202
|
lang = inject(SparkLanguageService);
|
|
203
203
|
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
204
204
|
minVersion: "12.0.0",
|
|
205
|
-
version: "22.2.
|
|
205
|
+
version: "22.2.2",
|
|
206
206
|
ngImport: i0,
|
|
207
207
|
type: SparkLanguageSelectorComponent,
|
|
208
208
|
deps: [],
|
|
@@ -210,7 +210,7 @@ var SparkLanguageSelectorComponent = class SparkLanguageSelectorComponent {
|
|
|
210
210
|
});
|
|
211
211
|
static ɵcmp = i0.ɵɵngDeclareComponent({
|
|
212
212
|
minVersion: "17.0.0",
|
|
213
|
-
version: "22.2.
|
|
213
|
+
version: "22.2.2",
|
|
214
214
|
type: SparkLanguageSelectorComponent,
|
|
215
215
|
isStandalone: true,
|
|
216
216
|
selector: "spark-language-selector",
|
|
@@ -227,6 +227,7 @@ var SparkLanguageSelectorComponent = class SparkLanguageSelectorComponent {
|
|
|
227
227
|
}
|
|
228
228
|
`,
|
|
229
229
|
isInline: true,
|
|
230
|
+
styles: [":host{display:inline-block;min-width:0}@media(max-width:575.98px){:host{flex:0 0 4.25rem}}\n"],
|
|
230
231
|
dependencies: [
|
|
231
232
|
{
|
|
232
233
|
kind: "ngmodule",
|
|
@@ -296,7 +297,7 @@ var SparkLanguageSelectorComponent = class SparkLanguageSelectorComponent {
|
|
|
296
297
|
};
|
|
297
298
|
i0.ɵɵngDeclareClassMetadata({
|
|
298
299
|
minVersion: "12.0.0",
|
|
299
|
-
version: "22.2.
|
|
300
|
+
version: "22.2.2",
|
|
300
301
|
ngImport: i0,
|
|
301
302
|
type: SparkLanguageSelectorComponent,
|
|
302
303
|
decorators: [{
|
|
@@ -322,7 +323,8 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
322
323
|
</bs-select>
|
|
323
324
|
}
|
|
324
325
|
}
|
|
325
|
-
|
|
326
|
+
`,
|
|
327
|
+
styles: [":host{display:inline-block;min-width:0}@media(max-width:575.98px){:host{flex:0 0 4.25rem}}\n"]
|
|
326
328
|
}]
|
|
327
329
|
}]
|
|
328
330
|
});
|
|
@@ -330,7 +332,7 @@ var SparkShellTopbarStartDirective = class SparkShellTopbarStartDirective {
|
|
|
330
332
|
templateRef = inject(TemplateRef);
|
|
331
333
|
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
332
334
|
minVersion: "12.0.0",
|
|
333
|
-
version: "22.2.
|
|
335
|
+
version: "22.2.2",
|
|
334
336
|
ngImport: i0,
|
|
335
337
|
type: SparkShellTopbarStartDirective,
|
|
336
338
|
deps: [],
|
|
@@ -338,7 +340,7 @@ var SparkShellTopbarStartDirective = class SparkShellTopbarStartDirective {
|
|
|
338
340
|
});
|
|
339
341
|
static ɵdir = i0.ɵɵngDeclareDirective({
|
|
340
342
|
minVersion: "14.0.0",
|
|
341
|
-
version: "22.2.
|
|
343
|
+
version: "22.2.2",
|
|
342
344
|
type: SparkShellTopbarStartDirective,
|
|
343
345
|
isStandalone: true,
|
|
344
346
|
selector: "[sparkShellTopbarStart]",
|
|
@@ -347,7 +349,7 @@ var SparkShellTopbarStartDirective = class SparkShellTopbarStartDirective {
|
|
|
347
349
|
};
|
|
348
350
|
i0.ɵɵngDeclareClassMetadata({
|
|
349
351
|
minVersion: "12.0.0",
|
|
350
|
-
version: "22.2.
|
|
352
|
+
version: "22.2.2",
|
|
351
353
|
ngImport: i0,
|
|
352
354
|
type: SparkShellTopbarStartDirective,
|
|
353
355
|
decorators: [{
|
|
@@ -359,7 +361,7 @@ var SparkShellTopbarEndDirective = class SparkShellTopbarEndDirective {
|
|
|
359
361
|
templateRef = inject(TemplateRef);
|
|
360
362
|
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
361
363
|
minVersion: "12.0.0",
|
|
362
|
-
version: "22.2.
|
|
364
|
+
version: "22.2.2",
|
|
363
365
|
ngImport: i0,
|
|
364
366
|
type: SparkShellTopbarEndDirective,
|
|
365
367
|
deps: [],
|
|
@@ -367,7 +369,7 @@ var SparkShellTopbarEndDirective = class SparkShellTopbarEndDirective {
|
|
|
367
369
|
});
|
|
368
370
|
static ɵdir = i0.ɵɵngDeclareDirective({
|
|
369
371
|
minVersion: "14.0.0",
|
|
370
|
-
version: "22.2.
|
|
372
|
+
version: "22.2.2",
|
|
371
373
|
type: SparkShellTopbarEndDirective,
|
|
372
374
|
isStandalone: true,
|
|
373
375
|
selector: "[sparkShellTopbarEnd]",
|
|
@@ -376,7 +378,7 @@ var SparkShellTopbarEndDirective = class SparkShellTopbarEndDirective {
|
|
|
376
378
|
};
|
|
377
379
|
i0.ɵɵngDeclareClassMetadata({
|
|
378
380
|
minVersion: "12.0.0",
|
|
379
|
-
version: "22.2.
|
|
381
|
+
version: "22.2.2",
|
|
380
382
|
ngImport: i0,
|
|
381
383
|
type: SparkShellTopbarEndDirective,
|
|
382
384
|
decorators: [{
|
|
@@ -388,7 +390,7 @@ var SparkShellTopbarActionsDirective = class SparkShellTopbarActionsDirective {
|
|
|
388
390
|
templateRef = inject(TemplateRef);
|
|
389
391
|
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
390
392
|
minVersion: "12.0.0",
|
|
391
|
-
version: "22.2.
|
|
393
|
+
version: "22.2.2",
|
|
392
394
|
ngImport: i0,
|
|
393
395
|
type: SparkShellTopbarActionsDirective,
|
|
394
396
|
deps: [],
|
|
@@ -396,7 +398,7 @@ var SparkShellTopbarActionsDirective = class SparkShellTopbarActionsDirective {
|
|
|
396
398
|
});
|
|
397
399
|
static ɵdir = i0.ɵɵngDeclareDirective({
|
|
398
400
|
minVersion: "14.0.0",
|
|
399
|
-
version: "22.2.
|
|
401
|
+
version: "22.2.2",
|
|
400
402
|
type: SparkShellTopbarActionsDirective,
|
|
401
403
|
isStandalone: true,
|
|
402
404
|
selector: "[sparkShellTopbarActions]",
|
|
@@ -405,7 +407,7 @@ var SparkShellTopbarActionsDirective = class SparkShellTopbarActionsDirective {
|
|
|
405
407
|
};
|
|
406
408
|
i0.ɵɵngDeclareClassMetadata({
|
|
407
409
|
minVersion: "12.0.0",
|
|
408
|
-
version: "22.2.
|
|
410
|
+
version: "22.2.2",
|
|
409
411
|
ngImport: i0,
|
|
410
412
|
type: SparkShellTopbarActionsDirective,
|
|
411
413
|
decorators: [{
|
|
@@ -417,7 +419,7 @@ var SparkShellSidebarHeaderDirective = class SparkShellSidebarHeaderDirective {
|
|
|
417
419
|
templateRef = inject(TemplateRef);
|
|
418
420
|
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
419
421
|
minVersion: "12.0.0",
|
|
420
|
-
version: "22.2.
|
|
422
|
+
version: "22.2.2",
|
|
421
423
|
ngImport: i0,
|
|
422
424
|
type: SparkShellSidebarHeaderDirective,
|
|
423
425
|
deps: [],
|
|
@@ -425,7 +427,7 @@ var SparkShellSidebarHeaderDirective = class SparkShellSidebarHeaderDirective {
|
|
|
425
427
|
});
|
|
426
428
|
static ɵdir = i0.ɵɵngDeclareDirective({
|
|
427
429
|
minVersion: "14.0.0",
|
|
428
|
-
version: "22.2.
|
|
430
|
+
version: "22.2.2",
|
|
429
431
|
type: SparkShellSidebarHeaderDirective,
|
|
430
432
|
isStandalone: true,
|
|
431
433
|
selector: "[sparkShellSidebarHeader]",
|
|
@@ -434,7 +436,7 @@ var SparkShellSidebarHeaderDirective = class SparkShellSidebarHeaderDirective {
|
|
|
434
436
|
};
|
|
435
437
|
i0.ɵɵngDeclareClassMetadata({
|
|
436
438
|
minVersion: "12.0.0",
|
|
437
|
-
version: "22.2.
|
|
439
|
+
version: "22.2.2",
|
|
438
440
|
ngImport: i0,
|
|
439
441
|
type: SparkShellSidebarHeaderDirective,
|
|
440
442
|
decorators: [{
|
|
@@ -446,7 +448,7 @@ var SparkShellSidebarTopDirective = class SparkShellSidebarTopDirective {
|
|
|
446
448
|
templateRef = inject(TemplateRef);
|
|
447
449
|
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
448
450
|
minVersion: "12.0.0",
|
|
449
|
-
version: "22.2.
|
|
451
|
+
version: "22.2.2",
|
|
450
452
|
ngImport: i0,
|
|
451
453
|
type: SparkShellSidebarTopDirective,
|
|
452
454
|
deps: [],
|
|
@@ -454,7 +456,7 @@ var SparkShellSidebarTopDirective = class SparkShellSidebarTopDirective {
|
|
|
454
456
|
});
|
|
455
457
|
static ɵdir = i0.ɵɵngDeclareDirective({
|
|
456
458
|
minVersion: "14.0.0",
|
|
457
|
-
version: "22.2.
|
|
459
|
+
version: "22.2.2",
|
|
458
460
|
type: SparkShellSidebarTopDirective,
|
|
459
461
|
isStandalone: true,
|
|
460
462
|
selector: "[sparkShellSidebarTop]",
|
|
@@ -463,7 +465,7 @@ var SparkShellSidebarTopDirective = class SparkShellSidebarTopDirective {
|
|
|
463
465
|
};
|
|
464
466
|
i0.ɵɵngDeclareClassMetadata({
|
|
465
467
|
minVersion: "12.0.0",
|
|
466
|
-
version: "22.2.
|
|
468
|
+
version: "22.2.2",
|
|
467
469
|
ngImport: i0,
|
|
468
470
|
type: SparkShellSidebarTopDirective,
|
|
469
471
|
decorators: [{
|
|
@@ -487,7 +489,7 @@ var SparkShellTabDirective = class SparkShellTabDirective {
|
|
|
487
489
|
});
|
|
488
490
|
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
489
491
|
minVersion: "12.0.0",
|
|
490
|
-
version: "22.2.
|
|
492
|
+
version: "22.2.2",
|
|
491
493
|
ngImport: i0,
|
|
492
494
|
type: SparkShellTabDirective,
|
|
493
495
|
deps: [],
|
|
@@ -495,7 +497,7 @@ var SparkShellTabDirective = class SparkShellTabDirective {
|
|
|
495
497
|
});
|
|
496
498
|
static ɵdir = i0.ɵɵngDeclareDirective({
|
|
497
499
|
minVersion: "17.1.0",
|
|
498
|
-
version: "22.2.
|
|
500
|
+
version: "22.2.2",
|
|
499
501
|
type: SparkShellTabDirective,
|
|
500
502
|
isStandalone: true,
|
|
501
503
|
selector: "[sparkShellTab]",
|
|
@@ -527,7 +529,7 @@ var SparkShellTabDirective = class SparkShellTabDirective {
|
|
|
527
529
|
};
|
|
528
530
|
i0.ɵɵngDeclareClassMetadata({
|
|
529
531
|
minVersion: "12.0.0",
|
|
530
|
-
version: "22.2.
|
|
532
|
+
version: "22.2.2",
|
|
531
533
|
ngImport: i0,
|
|
532
534
|
type: SparkShellTabDirective,
|
|
533
535
|
decorators: [{
|
|
@@ -565,7 +567,7 @@ var SparkShellSidebarFooterDirective = class SparkShellSidebarFooterDirective {
|
|
|
565
567
|
templateRef = inject(TemplateRef);
|
|
566
568
|
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
567
569
|
minVersion: "12.0.0",
|
|
568
|
-
version: "22.2.
|
|
570
|
+
version: "22.2.2",
|
|
569
571
|
ngImport: i0,
|
|
570
572
|
type: SparkShellSidebarFooterDirective,
|
|
571
573
|
deps: [],
|
|
@@ -573,7 +575,7 @@ var SparkShellSidebarFooterDirective = class SparkShellSidebarFooterDirective {
|
|
|
573
575
|
});
|
|
574
576
|
static ɵdir = i0.ɵɵngDeclareDirective({
|
|
575
577
|
minVersion: "14.0.0",
|
|
576
|
-
version: "22.2.
|
|
578
|
+
version: "22.2.2",
|
|
577
579
|
type: SparkShellSidebarFooterDirective,
|
|
578
580
|
isStandalone: true,
|
|
579
581
|
selector: "[sparkShellSidebarFooter]",
|
|
@@ -582,7 +584,7 @@ var SparkShellSidebarFooterDirective = class SparkShellSidebarFooterDirective {
|
|
|
582
584
|
};
|
|
583
585
|
i0.ɵɵngDeclareClassMetadata({
|
|
584
586
|
minVersion: "12.0.0",
|
|
585
|
-
version: "22.2.
|
|
587
|
+
version: "22.2.2",
|
|
586
588
|
ngImport: i0,
|
|
587
589
|
type: SparkShellSidebarFooterDirective,
|
|
588
590
|
decorators: [{
|
|
@@ -594,7 +596,7 @@ var SparkShellMainHeaderDirective = class SparkShellMainHeaderDirective {
|
|
|
594
596
|
templateRef = inject(TemplateRef);
|
|
595
597
|
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
596
598
|
minVersion: "12.0.0",
|
|
597
|
-
version: "22.2.
|
|
599
|
+
version: "22.2.2",
|
|
598
600
|
ngImport: i0,
|
|
599
601
|
type: SparkShellMainHeaderDirective,
|
|
600
602
|
deps: [],
|
|
@@ -602,7 +604,7 @@ var SparkShellMainHeaderDirective = class SparkShellMainHeaderDirective {
|
|
|
602
604
|
});
|
|
603
605
|
static ɵdir = i0.ɵɵngDeclareDirective({
|
|
604
606
|
minVersion: "14.0.0",
|
|
605
|
-
version: "22.2.
|
|
607
|
+
version: "22.2.2",
|
|
606
608
|
type: SparkShellMainHeaderDirective,
|
|
607
609
|
isStandalone: true,
|
|
608
610
|
selector: "[sparkShellMainHeader]",
|
|
@@ -611,7 +613,7 @@ var SparkShellMainHeaderDirective = class SparkShellMainHeaderDirective {
|
|
|
611
613
|
};
|
|
612
614
|
i0.ɵɵngDeclareClassMetadata({
|
|
613
615
|
minVersion: "12.0.0",
|
|
614
|
-
version: "22.2.
|
|
616
|
+
version: "22.2.2",
|
|
615
617
|
ngImport: i0,
|
|
616
618
|
type: SparkShellMainHeaderDirective,
|
|
617
619
|
decorators: [{
|
|
@@ -673,7 +675,7 @@ var SparkShellComponent = class SparkShellComponent {
|
|
|
673
675
|
}
|
|
674
676
|
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
675
677
|
minVersion: "12.0.0",
|
|
676
|
-
version: "22.2.
|
|
678
|
+
version: "22.2.2",
|
|
677
679
|
ngImport: i0,
|
|
678
680
|
type: SparkShellComponent,
|
|
679
681
|
deps: [],
|
|
@@ -681,7 +683,7 @@ var SparkShellComponent = class SparkShellComponent {
|
|
|
681
683
|
});
|
|
682
684
|
static ɵcmp = i0.ɵɵngDeclareComponent({
|
|
683
685
|
minVersion: "17.0.0",
|
|
684
|
-
version: "22.2.
|
|
686
|
+
version: "22.2.2",
|
|
685
687
|
type: SparkShellComponent,
|
|
686
688
|
isStandalone: true,
|
|
687
689
|
selector: "spark-shell",
|
|
@@ -829,7 +831,7 @@ var SparkShellComponent = class SparkShellComponent {
|
|
|
829
831
|
],
|
|
830
832
|
ngImport: i0,
|
|
831
833
|
template: "<bs-shell [state]=\"shellState()\" [breakpoint]=\"breakpoint()\" [dismissOnNavigate]=\"true\"\n (statechange)=\"onShellToggle($event)\">\n <div slot=\"topbar\" class=\"spark-topbar w-100 d-flex align-items-center\">\n @if (topbarStartTpl(); as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl\" />\n } @else {\n <bs-navbar-toggler [state]=\"isSidebarVisible()\" (stateChange)=\"toggleSidebar($event)\" />\n }\n <div class=\"ms-auto me-3 d-flex align-items-center gap-2\">\n <!-- Ahead of the trailing chrome, and OUTSIDE the @if below: these actions are additive, so\n they render whether the host replaced the trailing edge or left the default selector. -->\n @if (topbarActionsTpl(); as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl\" />\n }\n <!-- Also outside the trailing @if: replacing the end slot (e.g. with spark-auth-bar) keeps it. -->\n @if (themeToggle()) {\n <bs-theme-toggle [modes]=\"themeModes()\" />\n }\n @if (topbarEndTpl(); as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl\" />\n } @else {\n <spark-language-selector />\n }\n </div>\n </div>\n\n <nav bsShellSidebar class=\"spark-sidebar p-2\">\n @if (sidebarHeaderTpl(); as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl\" />\n } @else {\n <h5 class=\"p-3 border-bottom\">{{ title() }}</h5>\n }\n @if (sidebarTopTpl(); as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl\" />\n }\n <spark-program-units [reloadToken]=\"reloadToken()\" [extraTabs]=\"tabs()\" />\n @if (sidebarFooterTpl(); as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl\" />\n }\n </nav>\n\n <!-- The padding lives in the stylesheet as `--spark-main-padding`, not as a `p-4` utility, so the\n sticky action bar can read it and bleed back out to the scrollport edges. See _actionbar.scss. -->\n <main>\n @if (mainHeaderTpl(); as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl\" />\n }\n <ng-content />\n </main>\n</bs-shell>\n",
|
|
832
|
-
styles: ["::ng-deep :root,::ng-deep [data-bs-theme=light]{--spark-shell-topbar-bg: var(--bs-tertiary-bg);--spark-shell-topbar-color: var(--bs-body-color);--spark-shell-sidebar-bg: var(--bs-tertiary-bg);--spark-shell-sidebar-color: var(--bs-body-color);--spark-shell-main-bg: var(--bs-body-bg);--spark-shell-main-color: var(--bs-body-color)}::ng-deep [data-bs-theme=dark]{--spark-shell-topbar-bg: var(--bs-tertiary-bg);--spark-shell-topbar-color: var(--bs-body-color);--spark-shell-sidebar-bg: var(--bs-tertiary-bg);--spark-shell-sidebar-color: var(--bs-body-color);--spark-shell-main-bg: var(--bs-body-bg);--spark-shell-main-color: var(--bs-body-color)}:host{display:flex;flex-direction:column;height:100vh;--spark-shell-border-color: var(--bs-border-color)}bs-shell{flex:1 1 auto;min-height:0}.spark-topbar{background-color:var(--spark-shell-topbar-bg, var(--bs-tertiary-bg));color:var(--spark-shell-topbar-color, var(--bs-body-color));border-bottom:var(--bs-border-width) solid var(--spark-shell-border-color)}::ng-deep spark-shell mp-shell::part(hamburger){display:none}bs-navbar-toggler{--bs-secondary-color: var(--spark-shell-topbar-color, var(--bs-body-color))}main{--spark-main-padding: 1.5rem;--spark-content-inset-block: var(--spark-main-padding);--spark-content-inset-inline: var(--spark-main-padding);height:100%;padding:var(--spark-main-padding);background-color:var(--spark-shell-main-bg, var(--bs-body-bg));color:var(--spark-shell-main-color, var(--bs-body-color));display:flex;flex-direction:column;overflow:auto}nav.spark-sidebar{min-height:100%;background:var(--spark-shell-sidebar-bg, var(--bs-tertiary-bg));color:var(--spark-shell-sidebar-color, var(--bs-body-color));border-inline-end:var(--bs-border-width) solid var(--spark-shell-border-color)}:host ::ng-deep nav.spark-sidebar{--bs-primary-bg-subtle: rgba(var(--bs-emphasis-color-rgb), .1);--bs-border-color: transparent}:host ::ng-deep nav.spark-sidebar mp-accordion::part(content){padding:0}:host ::ng-deep nav.spark-sidebar .nav-link{color:inherit}:host ::ng-deep nav.spark-sidebar .nav-link:hover{background-color:rgba(var(--bs-emphasis-color-rgb),.1)}:host ::ng-deep nav.spark-sidebar .nav-link.active{background-color:rgba(var(--bs-emphasis-color-rgb),.2)}\n"],
|
|
834
|
+
styles: ["::ng-deep :root,::ng-deep [data-bs-theme=light]{--spark-shell-topbar-bg: var(--bs-tertiary-bg);--spark-shell-topbar-color: var(--bs-body-color);--spark-shell-sidebar-bg: var(--bs-tertiary-bg);--spark-shell-sidebar-color: var(--bs-body-color);--spark-shell-main-bg: var(--bs-body-bg);--spark-shell-main-color: var(--bs-body-color)}::ng-deep [data-bs-theme=dark]{--spark-shell-topbar-bg: var(--bs-tertiary-bg);--spark-shell-topbar-color: var(--bs-body-color);--spark-shell-sidebar-bg: var(--bs-tertiary-bg);--spark-shell-sidebar-color: var(--bs-body-color);--spark-shell-main-bg: var(--bs-body-bg);--spark-shell-main-color: var(--bs-body-color)}:host{display:flex;flex-direction:column;height:100vh;--spark-shell-border-color: var(--bs-border-color)}bs-shell{flex:1 1 auto;min-height:0}.spark-topbar{background-color:var(--spark-shell-topbar-bg, var(--bs-tertiary-bg));color:var(--spark-shell-topbar-color, var(--bs-body-color));border-bottom:var(--bs-border-width) solid var(--spark-shell-border-color)}.spark-topbar>.ms-auto{min-width:0}@media(max-width:575.98px){.spark-topbar>.ms-auto{gap:.25rem!important;margin-right:.5rem!important}}::ng-deep spark-shell mp-shell::part(hamburger){display:none}bs-navbar-toggler{--bs-secondary-color: var(--spark-shell-topbar-color, var(--bs-body-color))}main{--spark-main-padding: 1.5rem;--spark-content-inset-block: var(--spark-main-padding);--spark-content-inset-inline: var(--spark-main-padding);height:100%;padding:var(--spark-main-padding);background-color:var(--spark-shell-main-bg, var(--bs-body-bg));color:var(--spark-shell-main-color, var(--bs-body-color));display:flex;flex-direction:column;overflow:auto}nav.spark-sidebar{min-height:100%;background:var(--spark-shell-sidebar-bg, var(--bs-tertiary-bg));color:var(--spark-shell-sidebar-color, var(--bs-body-color));border-inline-end:var(--bs-border-width) solid var(--spark-shell-border-color)}:host ::ng-deep nav.spark-sidebar{--bs-primary-bg-subtle: rgba(var(--bs-emphasis-color-rgb), .1);--bs-border-color: transparent}:host ::ng-deep nav.spark-sidebar mp-accordion::part(content){padding:0}:host ::ng-deep nav.spark-sidebar .nav-link{color:inherit}:host ::ng-deep nav.spark-sidebar .nav-link:hover{background-color:rgba(var(--bs-emphasis-color-rgb),.1)}:host ::ng-deep nav.spark-sidebar .nav-link.active{background-color:rgba(var(--bs-emphasis-color-rgb),.2)}\n"],
|
|
833
835
|
dependencies: [
|
|
834
836
|
{
|
|
835
837
|
kind: "directive",
|
|
@@ -892,7 +894,7 @@ var SparkShellComponent = class SparkShellComponent {
|
|
|
892
894
|
};
|
|
893
895
|
i0.ɵɵngDeclareClassMetadata({
|
|
894
896
|
minVersion: "12.0.0",
|
|
895
|
-
version: "22.2.
|
|
897
|
+
version: "22.2.2",
|
|
896
898
|
ngImport: i0,
|
|
897
899
|
type: SparkShellComponent,
|
|
898
900
|
decorators: [{
|
|
@@ -911,7 +913,7 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
911
913
|
SparkLanguageSelectorComponent
|
|
912
914
|
],
|
|
913
915
|
template: "<bs-shell [state]=\"shellState()\" [breakpoint]=\"breakpoint()\" [dismissOnNavigate]=\"true\"\n (statechange)=\"onShellToggle($event)\">\n <div slot=\"topbar\" class=\"spark-topbar w-100 d-flex align-items-center\">\n @if (topbarStartTpl(); as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl\" />\n } @else {\n <bs-navbar-toggler [state]=\"isSidebarVisible()\" (stateChange)=\"toggleSidebar($event)\" />\n }\n <div class=\"ms-auto me-3 d-flex align-items-center gap-2\">\n <!-- Ahead of the trailing chrome, and OUTSIDE the @if below: these actions are additive, so\n they render whether the host replaced the trailing edge or left the default selector. -->\n @if (topbarActionsTpl(); as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl\" />\n }\n <!-- Also outside the trailing @if: replacing the end slot (e.g. with spark-auth-bar) keeps it. -->\n @if (themeToggle()) {\n <bs-theme-toggle [modes]=\"themeModes()\" />\n }\n @if (topbarEndTpl(); as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl\" />\n } @else {\n <spark-language-selector />\n }\n </div>\n </div>\n\n <nav bsShellSidebar class=\"spark-sidebar p-2\">\n @if (sidebarHeaderTpl(); as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl\" />\n } @else {\n <h5 class=\"p-3 border-bottom\">{{ title() }}</h5>\n }\n @if (sidebarTopTpl(); as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl\" />\n }\n <spark-program-units [reloadToken]=\"reloadToken()\" [extraTabs]=\"tabs()\" />\n @if (sidebarFooterTpl(); as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl\" />\n }\n </nav>\n\n <!-- The padding lives in the stylesheet as `--spark-main-padding`, not as a `p-4` utility, so the\n sticky action bar can read it and bleed back out to the scrollport edges. See _actionbar.scss. -->\n <main>\n @if (mainHeaderTpl(); as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl\" />\n }\n <ng-content />\n </main>\n</bs-shell>\n",
|
|
914
|
-
styles: ["::ng-deep :root,::ng-deep [data-bs-theme=light]{--spark-shell-topbar-bg: var(--bs-tertiary-bg);--spark-shell-topbar-color: var(--bs-body-color);--spark-shell-sidebar-bg: var(--bs-tertiary-bg);--spark-shell-sidebar-color: var(--bs-body-color);--spark-shell-main-bg: var(--bs-body-bg);--spark-shell-main-color: var(--bs-body-color)}::ng-deep [data-bs-theme=dark]{--spark-shell-topbar-bg: var(--bs-tertiary-bg);--spark-shell-topbar-color: var(--bs-body-color);--spark-shell-sidebar-bg: var(--bs-tertiary-bg);--spark-shell-sidebar-color: var(--bs-body-color);--spark-shell-main-bg: var(--bs-body-bg);--spark-shell-main-color: var(--bs-body-color)}:host{display:flex;flex-direction:column;height:100vh;--spark-shell-border-color: var(--bs-border-color)}bs-shell{flex:1 1 auto;min-height:0}.spark-topbar{background-color:var(--spark-shell-topbar-bg, var(--bs-tertiary-bg));color:var(--spark-shell-topbar-color, var(--bs-body-color));border-bottom:var(--bs-border-width) solid var(--spark-shell-border-color)}::ng-deep spark-shell mp-shell::part(hamburger){display:none}bs-navbar-toggler{--bs-secondary-color: var(--spark-shell-topbar-color, var(--bs-body-color))}main{--spark-main-padding: 1.5rem;--spark-content-inset-block: var(--spark-main-padding);--spark-content-inset-inline: var(--spark-main-padding);height:100%;padding:var(--spark-main-padding);background-color:var(--spark-shell-main-bg, var(--bs-body-bg));color:var(--spark-shell-main-color, var(--bs-body-color));display:flex;flex-direction:column;overflow:auto}nav.spark-sidebar{min-height:100%;background:var(--spark-shell-sidebar-bg, var(--bs-tertiary-bg));color:var(--spark-shell-sidebar-color, var(--bs-body-color));border-inline-end:var(--bs-border-width) solid var(--spark-shell-border-color)}:host ::ng-deep nav.spark-sidebar{--bs-primary-bg-subtle: rgba(var(--bs-emphasis-color-rgb), .1);--bs-border-color: transparent}:host ::ng-deep nav.spark-sidebar mp-accordion::part(content){padding:0}:host ::ng-deep nav.spark-sidebar .nav-link{color:inherit}:host ::ng-deep nav.spark-sidebar .nav-link:hover{background-color:rgba(var(--bs-emphasis-color-rgb),.1)}:host ::ng-deep nav.spark-sidebar .nav-link.active{background-color:rgba(var(--bs-emphasis-color-rgb),.2)}\n"]
|
|
916
|
+
styles: ["::ng-deep :root,::ng-deep [data-bs-theme=light]{--spark-shell-topbar-bg: var(--bs-tertiary-bg);--spark-shell-topbar-color: var(--bs-body-color);--spark-shell-sidebar-bg: var(--bs-tertiary-bg);--spark-shell-sidebar-color: var(--bs-body-color);--spark-shell-main-bg: var(--bs-body-bg);--spark-shell-main-color: var(--bs-body-color)}::ng-deep [data-bs-theme=dark]{--spark-shell-topbar-bg: var(--bs-tertiary-bg);--spark-shell-topbar-color: var(--bs-body-color);--spark-shell-sidebar-bg: var(--bs-tertiary-bg);--spark-shell-sidebar-color: var(--bs-body-color);--spark-shell-main-bg: var(--bs-body-bg);--spark-shell-main-color: var(--bs-body-color)}:host{display:flex;flex-direction:column;height:100vh;--spark-shell-border-color: var(--bs-border-color)}bs-shell{flex:1 1 auto;min-height:0}.spark-topbar{background-color:var(--spark-shell-topbar-bg, var(--bs-tertiary-bg));color:var(--spark-shell-topbar-color, var(--bs-body-color));border-bottom:var(--bs-border-width) solid var(--spark-shell-border-color)}.spark-topbar>.ms-auto{min-width:0}@media(max-width:575.98px){.spark-topbar>.ms-auto{gap:.25rem!important;margin-right:.5rem!important}}::ng-deep spark-shell mp-shell::part(hamburger){display:none}bs-navbar-toggler{--bs-secondary-color: var(--spark-shell-topbar-color, var(--bs-body-color))}main{--spark-main-padding: 1.5rem;--spark-content-inset-block: var(--spark-main-padding);--spark-content-inset-inline: var(--spark-main-padding);height:100%;padding:var(--spark-main-padding);background-color:var(--spark-shell-main-bg, var(--bs-body-bg));color:var(--spark-shell-main-color, var(--bs-body-color));display:flex;flex-direction:column;overflow:auto}nav.spark-sidebar{min-height:100%;background:var(--spark-shell-sidebar-bg, var(--bs-tertiary-bg));color:var(--spark-shell-sidebar-color, var(--bs-body-color));border-inline-end:var(--bs-border-width) solid var(--spark-shell-border-color)}:host ::ng-deep nav.spark-sidebar{--bs-primary-bg-subtle: rgba(var(--bs-emphasis-color-rgb), .1);--bs-border-color: transparent}:host ::ng-deep nav.spark-sidebar mp-accordion::part(content){padding:0}:host ::ng-deep nav.spark-sidebar .nav-link{color:inherit}:host ::ng-deep nav.spark-sidebar .nav-link:hover{background-color:rgba(var(--bs-emphasis-color-rgb),.1)}:host ::ng-deep nav.spark-sidebar .nav-link.active{background-color:rgba(var(--bs-emphasis-color-rgb),.2)}\n"]
|
|
915
917
|
}]
|
|
916
918
|
}],
|
|
917
919
|
propDecorators: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mintplayer-ng-spark-shell.mjs","names":[],"sources":["../../shell/src/spark-program-units.component.ts","../../shell/src/spark-program-units.component.html","../../shell/src/spark-language-selector.component.ts","../../shell/src/spark-shell-slots.ts","../../shell/src/spark-shell.component.ts","../../shell/src/spark-shell.component.html"],"sourcesContent":["import { ChangeDetectionStrategy, Component, effect, inject, input, signal, untracked } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { RouterLink, RouterLinkActive } from '@angular/router';\nimport { BsAccordionComponent, BsAccordionTabComponent, BsAccordionTabHeaderDirective } from '@mintplayer/ng-bootstrap/accordion';\nimport { SPARK_AUTH_STATE } from '@mintplayer/ng-spark';\nimport { ProgramUnitGroup } from '@mintplayer/ng-spark/models';\nimport { SparkService } from '@mintplayer/ng-spark/services';\nimport { IconNamePipe, ResolveTranslationPipe, RouterLinkPipe } from '@mintplayer/ng-spark/pipes';\nimport { SparkIconComponent } from '@mintplayer/ng-spark/icon';\nimport { SparkSidebarTab } from './spark-shell-slots';\n\n/**\n * The server-driven navigation menu: an accordion of program-unit groups fetched from\n * `GET /spark/program-units`, which the server has already filtered to what the caller's rights\n * allow. Hosts write ZERO router links for navigation — every group, unit, icon, label and link\n * comes from `programUnits.json`; content around the menu belongs in `<spark-shell>`'s slots,\n * and a host tempted to hand-write a unit anchor should add a unit to `programUnits.json`\n * instead.\n *\n * Because the response is caller-scoped it must be re-fetched when the caller changes: the\n * component tracks the optional `SPARK_AUTH_STATE` signal (supplied by ng-spark/auth's\n * `provideSparkAuth()`, or by the app's own auth stack) and reloads on every change. Without a\n * provider it fetches once. `reloadToken` is the manual escape hatch (any changed value triggers\n * a reload), and `reload()` the imperative one.\n *\n * Usually rendered by `<spark-shell>`; exported standalone for hosts that own their own layout.\n */\n@Component({\n selector: 'spark-program-units',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgTemplateOutlet,\n RouterLink, RouterLinkActive,\n BsAccordionComponent, BsAccordionTabComponent, BsAccordionTabHeaderDirective,\n SparkIconComponent, ResolveTranslationPipe, IconNamePipe, RouterLinkPipe,\n ],\n templateUrl: './spark-program-units.component.html',\n styleUrl: './spark-program-units.component.scss',\n})\nexport class SparkProgramUnitsComponent {\n private readonly sparkService = inject(SparkService);\n private readonly authState = inject(SPARK_AUTH_STATE, { optional: true });\n\n /** Any changed value triggers a reload — for apps whose auth state isn't a provided signal. */\n readonly reloadToken = input<unknown>(null);\n\n /**\n * Extra tabs to render after the generated groups, normally forwarded by `<spark-shell>` from\n * its `*sparkShellTab` directives. They must be rendered by THIS template — see\n * `SparkShellTabDirective` for why a host-declared `<bs-accordion-tab>` cannot work.\n */\n readonly extraTabs = input<readonly SparkSidebarTab[]>([]);\n\n protected readonly groups = signal<ProgramUnitGroup[]>([]);\n\n constructor() {\n effect(() => {\n this.authState?.();\n this.reloadToken();\n untracked(() => this.reload());\n });\n }\n\n /** Re-fetches the menu. The response is already rights-filtered per caller. */\n async reload(): Promise<void> {\n const config = await this.sparkService.getProgramUnits();\n // Order is the server file's contract, but sort both levels here so the rendered menu never\n // depends on JSON array order — groups were sorted, units were not (#324 F5).\n const groups = [...config.programUnitGroups]\n .sort((a, b) => a.order - b.order)\n .map(g => ({ ...g, programUnits: [...g.programUnits].sort((a, b) => a.order - b.order) }));\n this.groups.set(groups);\n }\n}\n","<bs-accordion class=\"d-block\">\n @for (group of groups(); track group.id) {\n <bs-accordion-tab>\n <ng-container *bsAccordionTabHeader>\n <spark-icon [name]=\"group.icon | iconName:'bi-folder'\" />\n <span class=\"ms-2\">{{ group.name | resolveTranslation }}</span>\n </ng-container>\n @for (unit of group.programUnits; track unit.id) {\n @if (unit | routerLink; as link) {\n <a [routerLink]=\"link\"\n routerLinkActive=\"active\"\n class=\"d-block px-3 py-2 text-decoration-none nav-link\">\n <spark-icon [name]=\"unit.icon | iconName:'bi-file'\" />\n <span class=\"ms-2\">{{ unit.name | resolveTranslation }}</span>\n </a>\n } @else {\n <!-- A url unit is an external address: a plain anchor, never a router link. -->\n <a [href]=\"unit.url\" target=\"_blank\" rel=\"noopener\"\n class=\"d-block px-3 py-2 text-decoration-none nav-link\">\n <spark-icon [name]=\"unit.icon | iconName:'bi-box-arrow-up-right'\" />\n <span class=\"ms-2\">{{ unit.name | resolveTranslation }}</span>\n </a>\n }\n }\n </bs-accordion-tab>\n }\n <!-- Host-contributed tabs are rendered HERE, by this template, so that the accordion's content\n query registers them and they join the generated groups' single-open group. -->\n @for (tab of extraTabs(); track tab.content) {\n <bs-accordion-tab>\n <ng-container *bsAccordionTabHeader>\n @if (tab.headerTemplate; as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl\" />\n } @else {\n <spark-icon [name]=\"tab.icon | iconName:'bi-folder'\" />\n <span class=\"ms-2\">{{ tab.header }}</span>\n }\n </ng-container>\n <ng-container *ngTemplateOutlet=\"tab.content\" />\n </bs-accordion-tab>\n }\n</bs-accordion>\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { KeyValuePipe } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { BsSelectComponent, BsSelectOption } from '@mintplayer/ng-bootstrap/select';\nimport { SparkLanguageService } from '@mintplayer/ng-spark/services';\nimport { ResolveTranslationPipe } from '@mintplayer/ng-spark/pipes';\n\n/**\n * The culture switcher: a `bs-select` over `SparkLanguageService`'s languages, persisting the\n * choice. Renders nothing when the app declares one language (or none), so hosts can include it\n * unconditionally — `<spark-shell>`'s topbar does exactly that as its trailing default.\n */\n@Component({\n selector: 'spark-language-selector',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [KeyValuePipe, FormsModule, BsSelectComponent, BsSelectOption, ResolveTranslationPipe],\n template: `\n @if (lang.languages() | keyvalue; as langs) {\n @if (langs.length > 1) {\n <bs-select [ngModel]=\"lang.language()\" (ngModelChange)=\"lang.setLanguage($event)\">\n @for (l of langs; track l.key) {\n <option [ngValue]=\"l.key\">{{ l.value | resolveTranslation }}</option>\n }\n </bs-select>\n }\n }\n `,\n})\nexport class SparkLanguageSelectorComponent {\n protected readonly lang = inject(SparkLanguageService);\n}\n","import { Directive, inject, input, TemplateRef } from '@angular/core';\n\n/**\n * Region slots for `<spark-shell>`.\n *\n * Each directive marks a template that REPLACES one region of the shell chrome (or fills an\n * empty one). An omitted slot is not an empty slot: the shell renders its default — the toggler,\n * the language selector, the title heading — so a host that supplies nothing still gets a\n * complete working shell, and a host that supplies one slot leaves the rest alone.\n *\n * The menu itself is deliberately NOT a slot. Navigation is sourced entirely from\n * `programUnits.json` through the rights-filtered `/spark/program-units` endpoint and re-fetched\n * on sign-in/out; a host that finds itself writing unit anchors in a slot should be adding units\n * to `programUnits.json` instead. Slots exist for the content AROUND the menu: an auth bar, a\n * user chip, branding, a one-off extra link, an alert strip above the routed content.\n *\n * Naming follows the house convention (prefix, component, slot — see `*sparkQueryIcon` in\n * `@mintplayer/ng-spark/grid`): `sparkShell` + region. Every slot also exists as a `TemplateRef`\n * input on `SparkShellComponent` for hosts that cannot use content projection.\n *\n * ```html\n * <spark-shell title=\"My App\">\n * <spark-auth-bar *sparkShellTopbarEnd />\n * <div *sparkShellSidebarTop>\n * <a routerLink=\"/github-projects\" class=\"nav-link\">GitHub projects</a>\n * </div>\n * <router-outlet />\n * </spark-shell>\n * ```\n */\n\n/** Topbar, leading edge. Default: a `bs-navbar-toggler` mirroring the shell's open state. */\n@Directive({ selector: '[sparkShellTopbarStart]' })\nexport class SparkShellTopbarStartDirective {\n readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\n}\n\n/**\n * Topbar, trailing edge. Default: the language selector (which hides itself when the app has\n * one language). This is where an auth bar goes — the shell cannot ship one itself, since\n * the non-auth entry points of `@mintplayer/ng-spark` do not (and must not) import `@mintplayer/ng-spark/auth/*`.\n */\n@Directive({ selector: '[sparkShellTopbarEnd]' })\nexport class SparkShellTopbarEndDirective {\n readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\n}\n\n/**\n * Topbar, trailing edge, **beside** the default chrome rather than instead of it — rendered before\n * the language selector, which stays.\n *\n * ## Why this is not just `*sparkShellTopbarEnd`\n *\n * That slot REPLACES the region, which is right for an auth bar (a host taking over the trailing\n * edge wholesale) and wrong for a page-level action button. A host that only wanted to add a\n * button had to re-render the language selector itself to keep it — which means importing it,\n * knowing it hides itself in a single-language app, and keeping that copy in step with the shell.\n * Every host that did this got it slightly differently.\n *\n * Pairs with `SparkQueryActionsService`: that service resolves a query's custom actions without the\n * grid, and this is where a page-level one goes.\n *\n * ```html\n * <button *sparkShellTopbarActions class=\"btn btn-primary\" (click)=\"publish()\">Publish</button>\n * ```\n *\n * Supplying both slots is allowed and does what it says: `topbarEnd` replaces the default chrome,\n * and these actions still render ahead of whatever it put there.\n */\n@Directive({ selector: '[sparkShellTopbarActions]' })\nexport class SparkShellTopbarActionsDirective {\n readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\n}\n\n/** Sidebar, above everything. Default: `<h5>{{ title }}</h5>`. */\n@Directive({ selector: '[sparkShellSidebarHeader]' })\nexport class SparkShellSidebarHeaderDirective {\n readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\n}\n\n/** Sidebar, between the header and the program-units menu. No default. */\n@Directive({ selector: '[sparkShellSidebarTop]' })\nexport class SparkShellSidebarTopDirective {\n readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\n}\n\n/**\n * An extra accordion tab in the sidebar menu, rendered after the generated program-unit groups\n * and sharing their single-open behavior.\n *\n * A tab is contributed as DATA (header + body template), not as markup, and that is load-bearing:\n * `bs-accordion` discovers its tabs with an Angular content query, which matches by declaration\n * view, so a `<bs-accordion-tab>` written in a host's template and inserted into the library's\n * accordion is never registered — it would land at index -1, get no hoisted header and no slot.\n * Declaring a second `<bs-accordion>` instead is what puts the tab in its own exclusivity group:\n * `mp-accordion` enforces single-open per element, over children it owns and over\n * `<details name>`, whose grouping cannot cross a shadow root. So the tab element must be created\n * by the menu itself, from what this directive carries.\n *\n * ```html\n * <ng-container *sparkShellTab=\"'Component demos'; icon: 'palette'\">\n * <a routerLink=\"/query-slots\" routerLinkActive=\"active\" class=\"nav-link\">Query card slots</a>\n * </ng-container>\n * ```\n *\n * Navigation still belongs in `programUnits.json` — this is for pages the model cannot describe\n * (client-side demos, external tools). For sidebar content that is NOT an accordion tab, use\n * `*sparkShellSidebarTop` or `*sparkShellSidebarFooter`.\n */\n@Directive({ selector: '[sparkShellTab]' })\nexport class SparkShellTabDirective {\n readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\n\n /** The tab's header label. */\n readonly header = input.required<string>({ alias: 'sparkShellTab' });\n\n /** Bootstrap icon name for the header, as in `programUnits.json`. Defaults to a folder. */\n readonly icon = input<string | undefined>(undefined, { alias: 'sparkShellTabIcon' });\n\n /** Replaces the icon+label header entirely, for a header that needs its own markup. */\n readonly headerTemplate = input<TemplateRef<unknown> | null>(null, { alias: 'sparkShellTabHeader' });\n}\n\n/**\n * A sidebar accordion tab in the shape the menu renders it. Hosts normally contribute tabs with\n * `*sparkShellTab`; this is the same thing as data, for a host that computes its tabs.\n */\nexport interface SparkSidebarTab {\n readonly header: string;\n readonly icon?: string;\n readonly headerTemplate?: TemplateRef<unknown> | null;\n readonly content: TemplateRef<unknown>;\n}\n\n/** Sidebar, at the very bottom. No default. */\n@Directive({ selector: '[sparkShellSidebarFooter]' })\nexport class SparkShellSidebarFooterDirective {\n readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\n}\n\n/** Main region, above the projected content (the host's `<router-outlet>`). No default. */\n@Directive({ selector: '[sparkShellMainHeader]' })\nexport class SparkShellMainHeaderDirective {\n readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\n}\n","import { ChangeDetectionStrategy, Component, computed, contentChild, contentChildren, inject, input, signal, TemplateRef } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { BsShellComponent, BsShellSidebarDirective, BsShellState } from '@mintplayer/ng-bootstrap/shell';\nimport { BsNavbarTogglerComponent } from '@mintplayer/ng-bootstrap/navbar-toggler';\nimport { BS_THEME_DEFAULT_MODES, BsThemeService, BsThemeToggleComponent, BsThemeToggleMode } from '@mintplayer/ng-bootstrap/theming';\nimport { SparkLanguageService } from '@mintplayer/ng-spark/services';\nimport type { Breakpoint } from '@mintplayer/ng-bootstrap';\nimport type { ShellStateChangeEventDetail } from '@mintplayer/web-components/shell';\nimport { SparkProgramUnitsComponent } from './spark-program-units.component';\nimport { SparkLanguageSelectorComponent } from './spark-language-selector.component';\nimport {\n SparkShellMainHeaderDirective,\n SparkShellSidebarFooterDirective,\n SparkShellSidebarHeaderDirective,\n SparkShellSidebarTopDirective,\n SparkShellTabDirective,\n SparkShellTopbarEndDirective,\n SparkShellTopbarActionsDirective,\n SparkShellTopbarStartDirective,\n SparkSidebarTab,\n} from './spark-shell-slots';\n\n/**\n * The application frame: topbar + sidebar + main, wrapping ng-bootstrap's `bs-shell` (whose\n * `mp-shell` web component owns ALL responsive behavior — breakpoints, the overlay drawer,\n * dismiss-on-navigate — in CSS; nothing here re-derives a pixel width). The sidebar renders the\n * server-driven program-units menu; the host projects its `<router-outlet>` as the default\n * content and customizes the chrome through the `*sparkShell*` slots (see `spark-shell-slots.ts`\n * for the doctrine: an omitted slot renders its default, and the menu itself is never a slot).\n *\n * ```html\n * <spark-shell title=\"My App\">\n * <spark-auth-bar *sparkShellTopbarEnd />\n * <router-outlet />\n * </spark-shell>\n * ```\n *\n * The one piece of state the shell keeps is the toggler↔drawer mirror: the built-in hamburger is\n * hidden (`::part(hamburger)`) in favor of a `bs-navbar-toggler` in the topbar, so the shell\n * listens to `statechange` to keep the toggler's icon truthful in `auto` mode and only forces\n * `show`/`hide` on explicit toggles.\n *\n * Theming: the chrome colors are CSS custom properties —\n * `--spark-shell-{topbar,sidebar,main}-{bg,color}` — declared per colour scheme under\n * `[data-bs-theme=light]` / `[data-bs-theme=dark]` from Bootstrap tokens, so the whole shell follows\n * the page's theme. An app restyles it by overriding those tokens, globally per scheme or on the\n * `<spark-shell>` element.\n *\n * Colour mode: the shell injects `BsThemeService` itself, so 'auto' follows the OS live even when\n * the topbar toggle is hidden with `[themeToggle]=\"false\"` (an app may then place its own\n * `<bs-theme-toggle>` elsewhere). The first paint is themed by `bs-theme-preboot.js` in the app's\n * `index.html`, not by anything here.\n */\n@Component({\n selector: 'spark-shell',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgTemplateOutlet,\n BsShellComponent, BsShellSidebarDirective, BsNavbarTogglerComponent, BsThemeToggleComponent,\n SparkProgramUnitsComponent, SparkLanguageSelectorComponent,\n ],\n templateUrl: './spark-shell.component.html',\n styleUrl: './spark-shell.component.scss',\n})\nexport class SparkShellComponent {\n /** The sidebar heading. Ignored when a `*sparkShellSidebarHeader` slot is supplied. */\n readonly title = input('');\n\n /** Forwarded to `bs-shell`: below it the sidebar is an overlay drawer. */\n readonly breakpoint = input<Breakpoint>('md');\n\n /**\n * Render the Auto / Light / Dark `bs-theme-toggle` in the topbar. `false` hides it; the theme\n * service stays live either way.\n */\n readonly themeToggle = input(true);\n\n /**\n * Instantiated here, not only through the toggle (PRD D3): without it, `[themeToggle]=\"false\"`\n * would leave 'auto' with no live `prefers-color-scheme` listener in Angular's view.\n */\n protected readonly theme = inject(BsThemeService);\n private readonly lang = inject(SparkLanguageService);\n\n /** The toggle's cycle with Spark's translated labels (`theme.*` keys); icons stay ng-bootstrap's. */\n protected readonly themeModes = computed<readonly BsThemeToggleMode[]>(() =>\n BS_THEME_DEFAULT_MODES.map(m => {\n const name = m.mode.charAt(0).toUpperCase() + m.mode.slice(1);\n return { ...m, label: this.lang.t(`theme.switchTo${name}`), announcement: this.lang.t(`theme.${m.mode}`) };\n }));\n\n /** Forwarded to the menu: any changed value re-fetches the program units. */\n readonly reloadToken = input<unknown>(null);\n\n /** Extra sidebar tabs as data, for hosts that compute them; `*sparkShellTab` is the usual way. */\n readonly sidebarTabs = input<readonly SparkSidebarTab[]>([]);\n\n // One TemplateRef input per slot, for hosts that cannot use content projection\n // (the spark-query-card precedent). The projected directive wins when both are present.\n readonly topbarStartTemplate = input<TemplateRef<unknown> | null>(null);\n readonly topbarEndTemplate = input<TemplateRef<unknown> | null>(null);\n readonly topbarActionsTemplate = input<TemplateRef<unknown> | null>(null);\n readonly sidebarHeaderTemplate = input<TemplateRef<unknown> | null>(null);\n readonly sidebarTopTemplate = input<TemplateRef<unknown> | null>(null);\n readonly sidebarFooterTemplate = input<TemplateRef<unknown> | null>(null);\n readonly mainHeaderTemplate = input<TemplateRef<unknown> | null>(null);\n\n private readonly topbarStartSlot = contentChild(SparkShellTopbarStartDirective);\n private readonly topbarEndSlot = contentChild(SparkShellTopbarEndDirective);\n private readonly topbarActionsSlot = contentChild(SparkShellTopbarActionsDirective);\n private readonly sidebarHeaderSlot = contentChild(SparkShellSidebarHeaderDirective);\n private readonly sidebarTopSlot = contentChild(SparkShellSidebarTopDirective);\n private readonly sidebarFooterSlot = contentChild(SparkShellSidebarFooterDirective);\n private readonly mainHeaderSlot = contentChild(SparkShellMainHeaderDirective);\n\n protected readonly topbarStartTpl = computed(() => this.topbarStartSlot()?.templateRef ?? this.topbarStartTemplate());\n protected readonly topbarEndTpl = computed(() => this.topbarEndSlot()?.templateRef ?? this.topbarEndTemplate());\n protected readonly topbarActionsTpl = computed(() => this.topbarActionsSlot()?.templateRef ?? this.topbarActionsTemplate());\n protected readonly sidebarHeaderTpl = computed(() => this.sidebarHeaderSlot()?.templateRef ?? this.sidebarHeaderTemplate());\n protected readonly sidebarTopTpl = computed(() => this.sidebarTopSlot()?.templateRef ?? this.sidebarTopTemplate());\n protected readonly sidebarFooterTpl = computed(() => this.sidebarFooterSlot()?.templateRef ?? this.sidebarFooterTemplate());\n protected readonly mainHeaderTpl = computed(() => this.mainHeaderSlot()?.templateRef ?? this.mainHeaderTemplate());\n\n /**\n * Extra accordion tabs, forwarded to the menu so IT creates the `<bs-accordion-tab>` elements —\n * the only way they share the generated groups' single-open behavior (see\n * `SparkShellTabDirective`). Data-supplied tabs come first, then projected ones in declaration\n * order.\n */\n private readonly tabSlots = contentChildren(SparkShellTabDirective);\n\n protected readonly tabs = computed<readonly SparkSidebarTab[]>(() => [\n ...this.sidebarTabs(),\n ...this.tabSlots().map(slot => ({\n header: slot.header(),\n icon: slot.icon(),\n headerTemplate: slot.headerTemplate(),\n content: slot.templateRef,\n })),\n ]);\n\n protected readonly shellState = signal<BsShellState>('auto');\n protected readonly isSidebarVisible = signal(false);\n\n // Explicit toggles force show/hide; 'auto' responsive behavior is otherwise preserved by\n // never writing state on our own. The mirror below keeps the toggler icon truthful when the\n // shell opens/closes itself at the breakpoint.\n protected toggleSidebar(open: boolean): void {\n this.shellState.set(open ? 'show' : 'hide');\n }\n\n protected onShellToggle(detail: ShellStateChangeEventDetail): void {\n this.isSidebarVisible.set(detail.open);\n }\n}\n","<bs-shell [state]=\"shellState()\" [breakpoint]=\"breakpoint()\" [dismissOnNavigate]=\"true\"\n (statechange)=\"onShellToggle($event)\">\n <div slot=\"topbar\" class=\"spark-topbar w-100 d-flex align-items-center\">\n @if (topbarStartTpl(); as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl\" />\n } @else {\n <bs-navbar-toggler [state]=\"isSidebarVisible()\" (stateChange)=\"toggleSidebar($event)\" />\n }\n <div class=\"ms-auto me-3 d-flex align-items-center gap-2\">\n <!-- Ahead of the trailing chrome, and OUTSIDE the @if below: these actions are additive, so\n they render whether the host replaced the trailing edge or left the default selector. -->\n @if (topbarActionsTpl(); as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl\" />\n }\n <!-- Also outside the trailing @if: replacing the end slot (e.g. with spark-auth-bar) keeps it. -->\n @if (themeToggle()) {\n <bs-theme-toggle [modes]=\"themeModes()\" />\n }\n @if (topbarEndTpl(); as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl\" />\n } @else {\n <spark-language-selector />\n }\n </div>\n </div>\n\n <nav bsShellSidebar class=\"spark-sidebar p-2\">\n @if (sidebarHeaderTpl(); as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl\" />\n } @else {\n <h5 class=\"p-3 border-bottom\">{{ title() }}</h5>\n }\n @if (sidebarTopTpl(); as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl\" />\n }\n <spark-program-units [reloadToken]=\"reloadToken()\" [extraTabs]=\"tabs()\" />\n @if (sidebarFooterTpl(); as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl\" />\n }\n </nav>\n\n <!-- The padding lives in the stylesheet as `--spark-main-padding`, not as a `p-4` utility, so the\n sticky action bar can read it and bleed back out to the scrollport edges. See _actionbar.scss. -->\n <main>\n @if (mainHeaderTpl(); as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl\" />\n }\n <ng-content />\n </main>\n</bs-shell>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mintplayer-ng-spark-shell.mjs","names":[],"sources":["../../shell/src/spark-program-units.component.ts","../../shell/src/spark-program-units.component.html","../../shell/src/spark-language-selector.component.ts","../../shell/src/spark-shell-slots.ts","../../shell/src/spark-shell.component.ts","../../shell/src/spark-shell.component.html"],"sourcesContent":["import { ChangeDetectionStrategy, Component, effect, inject, input, signal, untracked } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { RouterLink, RouterLinkActive } from '@angular/router';\nimport { BsAccordionComponent, BsAccordionTabComponent, BsAccordionTabHeaderDirective } from '@mintplayer/ng-bootstrap/accordion';\nimport { SPARK_AUTH_STATE } from '@mintplayer/ng-spark';\nimport { ProgramUnitGroup } from '@mintplayer/ng-spark/models';\nimport { SparkService } from '@mintplayer/ng-spark/services';\nimport { IconNamePipe, ResolveTranslationPipe, RouterLinkPipe } from '@mintplayer/ng-spark/pipes';\nimport { SparkIconComponent } from '@mintplayer/ng-spark/icon';\nimport { SparkSidebarTab } from './spark-shell-slots';\n\n/**\n * The server-driven navigation menu: an accordion of program-unit groups fetched from\n * `GET /spark/program-units`, which the server has already filtered to what the caller's rights\n * allow. Hosts write ZERO router links for navigation — every group, unit, icon, label and link\n * comes from `programUnits.json`; content around the menu belongs in `<spark-shell>`'s slots,\n * and a host tempted to hand-write a unit anchor should add a unit to `programUnits.json`\n * instead.\n *\n * Because the response is caller-scoped it must be re-fetched when the caller changes: the\n * component tracks the optional `SPARK_AUTH_STATE` signal (supplied by ng-spark/auth's\n * `provideSparkAuth()`, or by the app's own auth stack) and reloads on every change. Without a\n * provider it fetches once. `reloadToken` is the manual escape hatch (any changed value triggers\n * a reload), and `reload()` the imperative one.\n *\n * Usually rendered by `<spark-shell>`; exported standalone for hosts that own their own layout.\n */\n@Component({\n selector: 'spark-program-units',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgTemplateOutlet,\n RouterLink, RouterLinkActive,\n BsAccordionComponent, BsAccordionTabComponent, BsAccordionTabHeaderDirective,\n SparkIconComponent, ResolveTranslationPipe, IconNamePipe, RouterLinkPipe,\n ],\n templateUrl: './spark-program-units.component.html',\n styleUrl: './spark-program-units.component.scss',\n})\nexport class SparkProgramUnitsComponent {\n private readonly sparkService = inject(SparkService);\n private readonly authState = inject(SPARK_AUTH_STATE, { optional: true });\n\n /** Any changed value triggers a reload — for apps whose auth state isn't a provided signal. */\n readonly reloadToken = input<unknown>(null);\n\n /**\n * Extra tabs to render after the generated groups, normally forwarded by `<spark-shell>` from\n * its `*sparkShellTab` directives. They must be rendered by THIS template — see\n * `SparkShellTabDirective` for why a host-declared `<bs-accordion-tab>` cannot work.\n */\n readonly extraTabs = input<readonly SparkSidebarTab[]>([]);\n\n protected readonly groups = signal<ProgramUnitGroup[]>([]);\n\n constructor() {\n effect(() => {\n this.authState?.();\n this.reloadToken();\n untracked(() => this.reload());\n });\n }\n\n /** Re-fetches the menu. The response is already rights-filtered per caller. */\n async reload(): Promise<void> {\n const config = await this.sparkService.getProgramUnits();\n // Order is the server file's contract, but sort both levels here so the rendered menu never\n // depends on JSON array order — groups were sorted, units were not (#324 F5).\n const groups = [...config.programUnitGroups]\n .sort((a, b) => a.order - b.order)\n .map(g => ({ ...g, programUnits: [...g.programUnits].sort((a, b) => a.order - b.order) }));\n this.groups.set(groups);\n }\n}\n","<bs-accordion class=\"d-block\">\n @for (group of groups(); track group.id) {\n <bs-accordion-tab>\n <ng-container *bsAccordionTabHeader>\n <spark-icon [name]=\"group.icon | iconName:'bi-folder'\" />\n <span class=\"ms-2\">{{ group.name | resolveTranslation }}</span>\n </ng-container>\n @for (unit of group.programUnits; track unit.id) {\n @if (unit | routerLink; as link) {\n <a [routerLink]=\"link\"\n routerLinkActive=\"active\"\n class=\"d-block px-3 py-2 text-decoration-none nav-link\">\n <spark-icon [name]=\"unit.icon | iconName:'bi-file'\" />\n <span class=\"ms-2\">{{ unit.name | resolveTranslation }}</span>\n </a>\n } @else {\n <!-- A url unit is an external address: a plain anchor, never a router link. -->\n <a [href]=\"unit.url\" target=\"_blank\" rel=\"noopener\"\n class=\"d-block px-3 py-2 text-decoration-none nav-link\">\n <spark-icon [name]=\"unit.icon | iconName:'bi-box-arrow-up-right'\" />\n <span class=\"ms-2\">{{ unit.name | resolveTranslation }}</span>\n </a>\n }\n }\n </bs-accordion-tab>\n }\n <!-- Host-contributed tabs are rendered HERE, by this template, so that the accordion's content\n query registers them and they join the generated groups' single-open group. -->\n @for (tab of extraTabs(); track tab.content) {\n <bs-accordion-tab>\n <ng-container *bsAccordionTabHeader>\n @if (tab.headerTemplate; as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl\" />\n } @else {\n <spark-icon [name]=\"tab.icon | iconName:'bi-folder'\" />\n <span class=\"ms-2\">{{ tab.header }}</span>\n }\n </ng-container>\n <ng-container *ngTemplateOutlet=\"tab.content\" />\n </bs-accordion-tab>\n }\n</bs-accordion>\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { KeyValuePipe } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { BsSelectComponent, BsSelectOption } from '@mintplayer/ng-bootstrap/select';\nimport { SparkLanguageService } from '@mintplayer/ng-spark/services';\nimport { ResolveTranslationPipe } from '@mintplayer/ng-spark/pipes';\n\n/**\n * The culture switcher: a `bs-select` over `SparkLanguageService`'s languages, persisting the\n * choice. Renders nothing when the app declares one language (or none), so hosts can include it\n * unconditionally — `<spark-shell>`'s topbar does exactly that as its trailing default.\n */\n@Component({\n selector: 'spark-language-selector',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [KeyValuePipe, FormsModule, BsSelectComponent, BsSelectOption, ResolveTranslationPipe],\n template: `\n @if (lang.languages() | keyvalue; as langs) {\n @if (langs.length > 1) {\n <bs-select [ngModel]=\"lang.language()\" (ngModelChange)=\"lang.setLanguage($event)\">\n @for (l of langs; track l.key) {\n <option [ngValue]=\"l.key\">{{ l.value | resolveTranslation }}</option>\n }\n </bs-select>\n }\n }\n `,\n // Narrow on a phone, never unreadable: the topbar also holds the theme toggle, an organization switcher,\n // the bell and the account buttons in 375 px. Below 4.25rem the select showed only its caret.\n styles: [`\n :host { display: inline-block; min-width: 0; }\n @media (max-width: 575.98px) { :host { flex: 0 0 4.25rem; } }\n `],\n})\nexport class SparkLanguageSelectorComponent {\n protected readonly lang = inject(SparkLanguageService);\n}\n","import { Directive, inject, input, TemplateRef } from '@angular/core';\n\n/**\n * Region slots for `<spark-shell>`.\n *\n * Each directive marks a template that REPLACES one region of the shell chrome (or fills an\n * empty one). An omitted slot is not an empty slot: the shell renders its default — the toggler,\n * the language selector, the title heading — so a host that supplies nothing still gets a\n * complete working shell, and a host that supplies one slot leaves the rest alone.\n *\n * The menu itself is deliberately NOT a slot. Navigation is sourced entirely from\n * `programUnits.json` through the rights-filtered `/spark/program-units` endpoint and re-fetched\n * on sign-in/out; a host that finds itself writing unit anchors in a slot should be adding units\n * to `programUnits.json` instead. Slots exist for the content AROUND the menu: an auth bar, a\n * user chip, branding, a one-off extra link, an alert strip above the routed content.\n *\n * Naming follows the house convention (prefix, component, slot — see `*sparkQueryIcon` in\n * `@mintplayer/ng-spark/grid`): `sparkShell` + region. Every slot also exists as a `TemplateRef`\n * input on `SparkShellComponent` for hosts that cannot use content projection.\n *\n * ```html\n * <spark-shell title=\"My App\">\n * <spark-auth-bar *sparkShellTopbarEnd />\n * <div *sparkShellSidebarTop>\n * <a routerLink=\"/github-projects\" class=\"nav-link\">GitHub projects</a>\n * </div>\n * <router-outlet />\n * </spark-shell>\n * ```\n */\n\n/** Topbar, leading edge. Default: a `bs-navbar-toggler` mirroring the shell's open state. */\n@Directive({ selector: '[sparkShellTopbarStart]' })\nexport class SparkShellTopbarStartDirective {\n readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\n}\n\n/**\n * Topbar, trailing edge. Default: the language selector (which hides itself when the app has\n * one language). This is where an auth bar goes — the shell cannot ship one itself, since\n * the non-auth entry points of `@mintplayer/ng-spark` do not (and must not) import `@mintplayer/ng-spark/auth/*`.\n */\n@Directive({ selector: '[sparkShellTopbarEnd]' })\nexport class SparkShellTopbarEndDirective {\n readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\n}\n\n/**\n * Topbar, trailing edge, **beside** the default chrome rather than instead of it — rendered before\n * the language selector, which stays.\n *\n * ## Why this is not just `*sparkShellTopbarEnd`\n *\n * That slot REPLACES the region, which is right for an auth bar (a host taking over the trailing\n * edge wholesale) and wrong for a page-level action button. A host that only wanted to add a\n * button had to re-render the language selector itself to keep it — which means importing it,\n * knowing it hides itself in a single-language app, and keeping that copy in step with the shell.\n * Every host that did this got it slightly differently.\n *\n * Pairs with `SparkQueryActionsService`: that service resolves a query's custom actions without the\n * grid, and this is where a page-level one goes.\n *\n * ```html\n * <button *sparkShellTopbarActions class=\"btn btn-primary\" (click)=\"publish()\">Publish</button>\n * ```\n *\n * Supplying both slots is allowed and does what it says: `topbarEnd` replaces the default chrome,\n * and these actions still render ahead of whatever it put there.\n */\n@Directive({ selector: '[sparkShellTopbarActions]' })\nexport class SparkShellTopbarActionsDirective {\n readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\n}\n\n/** Sidebar, above everything. Default: `<h5>{{ title }}</h5>`. */\n@Directive({ selector: '[sparkShellSidebarHeader]' })\nexport class SparkShellSidebarHeaderDirective {\n readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\n}\n\n/** Sidebar, between the header and the program-units menu. No default. */\n@Directive({ selector: '[sparkShellSidebarTop]' })\nexport class SparkShellSidebarTopDirective {\n readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\n}\n\n/**\n * An extra accordion tab in the sidebar menu, rendered after the generated program-unit groups\n * and sharing their single-open behavior.\n *\n * A tab is contributed as DATA (header + body template), not as markup, and that is load-bearing:\n * `bs-accordion` discovers its tabs with an Angular content query, which matches by declaration\n * view, so a `<bs-accordion-tab>` written in a host's template and inserted into the library's\n * accordion is never registered — it would land at index -1, get no hoisted header and no slot.\n * Declaring a second `<bs-accordion>` instead is what puts the tab in its own exclusivity group:\n * `mp-accordion` enforces single-open per element, over children it owns and over\n * `<details name>`, whose grouping cannot cross a shadow root. So the tab element must be created\n * by the menu itself, from what this directive carries.\n *\n * ```html\n * <ng-container *sparkShellTab=\"'Component demos'; icon: 'palette'\">\n * <a routerLink=\"/query-slots\" routerLinkActive=\"active\" class=\"nav-link\">Query card slots</a>\n * </ng-container>\n * ```\n *\n * Navigation still belongs in `programUnits.json` — this is for pages the model cannot describe\n * (client-side demos, external tools). For sidebar content that is NOT an accordion tab, use\n * `*sparkShellSidebarTop` or `*sparkShellSidebarFooter`.\n */\n@Directive({ selector: '[sparkShellTab]' })\nexport class SparkShellTabDirective {\n readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\n\n /** The tab's header label. */\n readonly header = input.required<string>({ alias: 'sparkShellTab' });\n\n /** Bootstrap icon name for the header, as in `programUnits.json`. Defaults to a folder. */\n readonly icon = input<string | undefined>(undefined, { alias: 'sparkShellTabIcon' });\n\n /** Replaces the icon+label header entirely, for a header that needs its own markup. */\n readonly headerTemplate = input<TemplateRef<unknown> | null>(null, { alias: 'sparkShellTabHeader' });\n}\n\n/**\n * A sidebar accordion tab in the shape the menu renders it. Hosts normally contribute tabs with\n * `*sparkShellTab`; this is the same thing as data, for a host that computes its tabs.\n */\nexport interface SparkSidebarTab {\n readonly header: string;\n readonly icon?: string;\n readonly headerTemplate?: TemplateRef<unknown> | null;\n readonly content: TemplateRef<unknown>;\n}\n\n/** Sidebar, at the very bottom. No default. */\n@Directive({ selector: '[sparkShellSidebarFooter]' })\nexport class SparkShellSidebarFooterDirective {\n readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\n}\n\n/** Main region, above the projected content (the host's `<router-outlet>`). No default. */\n@Directive({ selector: '[sparkShellMainHeader]' })\nexport class SparkShellMainHeaderDirective {\n readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\n}\n","import { ChangeDetectionStrategy, Component, computed, contentChild, contentChildren, inject, input, signal, TemplateRef } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { BsShellComponent, BsShellSidebarDirective, BsShellState } from '@mintplayer/ng-bootstrap/shell';\nimport { BsNavbarTogglerComponent } from '@mintplayer/ng-bootstrap/navbar-toggler';\nimport { BS_THEME_DEFAULT_MODES, BsThemeService, BsThemeToggleComponent, BsThemeToggleMode } from '@mintplayer/ng-bootstrap/theming';\nimport { SparkLanguageService } from '@mintplayer/ng-spark/services';\nimport type { Breakpoint } from '@mintplayer/ng-bootstrap';\nimport type { ShellStateChangeEventDetail } from '@mintplayer/web-components/shell';\nimport { SparkProgramUnitsComponent } from './spark-program-units.component';\nimport { SparkLanguageSelectorComponent } from './spark-language-selector.component';\nimport {\n SparkShellMainHeaderDirective,\n SparkShellSidebarFooterDirective,\n SparkShellSidebarHeaderDirective,\n SparkShellSidebarTopDirective,\n SparkShellTabDirective,\n SparkShellTopbarEndDirective,\n SparkShellTopbarActionsDirective,\n SparkShellTopbarStartDirective,\n SparkSidebarTab,\n} from './spark-shell-slots';\n\n/**\n * The application frame: topbar + sidebar + main, wrapping ng-bootstrap's `bs-shell` (whose\n * `mp-shell` web component owns ALL responsive behavior — breakpoints, the overlay drawer,\n * dismiss-on-navigate — in CSS; nothing here re-derives a pixel width). The sidebar renders the\n * server-driven program-units menu; the host projects its `<router-outlet>` as the default\n * content and customizes the chrome through the `*sparkShell*` slots (see `spark-shell-slots.ts`\n * for the doctrine: an omitted slot renders its default, and the menu itself is never a slot).\n *\n * ```html\n * <spark-shell title=\"My App\">\n * <spark-auth-bar *sparkShellTopbarEnd />\n * <router-outlet />\n * </spark-shell>\n * ```\n *\n * The one piece of state the shell keeps is the toggler↔drawer mirror: the built-in hamburger is\n * hidden (`::part(hamburger)`) in favor of a `bs-navbar-toggler` in the topbar, so the shell\n * listens to `statechange` to keep the toggler's icon truthful in `auto` mode and only forces\n * `show`/`hide` on explicit toggles.\n *\n * Theming: the chrome colors are CSS custom properties —\n * `--spark-shell-{topbar,sidebar,main}-{bg,color}` — declared per colour scheme under\n * `[data-bs-theme=light]` / `[data-bs-theme=dark]` from Bootstrap tokens, so the whole shell follows\n * the page's theme. An app restyles it by overriding those tokens, globally per scheme or on the\n * `<spark-shell>` element.\n *\n * Colour mode: the shell injects `BsThemeService` itself, so 'auto' follows the OS live even when\n * the topbar toggle is hidden with `[themeToggle]=\"false\"` (an app may then place its own\n * `<bs-theme-toggle>` elsewhere). The first paint is themed by `bs-theme-preboot.js` in the app's\n * `index.html`, not by anything here.\n */\n@Component({\n selector: 'spark-shell',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgTemplateOutlet,\n BsShellComponent, BsShellSidebarDirective, BsNavbarTogglerComponent, BsThemeToggleComponent,\n SparkProgramUnitsComponent, SparkLanguageSelectorComponent,\n ],\n templateUrl: './spark-shell.component.html',\n styleUrl: './spark-shell.component.scss',\n})\nexport class SparkShellComponent {\n /** The sidebar heading. Ignored when a `*sparkShellSidebarHeader` slot is supplied. */\n readonly title = input('');\n\n /** Forwarded to `bs-shell`: below it the sidebar is an overlay drawer. */\n readonly breakpoint = input<Breakpoint>('md');\n\n /**\n * Render the Auto / Light / Dark `bs-theme-toggle` in the topbar. `false` hides it; the theme\n * service stays live either way.\n */\n readonly themeToggle = input(true);\n\n /**\n * Instantiated here, not only through the toggle (PRD D3): without it, `[themeToggle]=\"false\"`\n * would leave 'auto' with no live `prefers-color-scheme` listener in Angular's view.\n */\n protected readonly theme = inject(BsThemeService);\n private readonly lang = inject(SparkLanguageService);\n\n /** The toggle's cycle with Spark's translated labels (`theme.*` keys); icons stay ng-bootstrap's. */\n protected readonly themeModes = computed<readonly BsThemeToggleMode[]>(() =>\n BS_THEME_DEFAULT_MODES.map(m => {\n const name = m.mode.charAt(0).toUpperCase() + m.mode.slice(1);\n return { ...m, label: this.lang.t(`theme.switchTo${name}`), announcement: this.lang.t(`theme.${m.mode}`) };\n }));\n\n /** Forwarded to the menu: any changed value re-fetches the program units. */\n readonly reloadToken = input<unknown>(null);\n\n /** Extra sidebar tabs as data, for hosts that compute them; `*sparkShellTab` is the usual way. */\n readonly sidebarTabs = input<readonly SparkSidebarTab[]>([]);\n\n // One TemplateRef input per slot, for hosts that cannot use content projection\n // (the spark-query-card precedent). The projected directive wins when both are present.\n readonly topbarStartTemplate = input<TemplateRef<unknown> | null>(null);\n readonly topbarEndTemplate = input<TemplateRef<unknown> | null>(null);\n readonly topbarActionsTemplate = input<TemplateRef<unknown> | null>(null);\n readonly sidebarHeaderTemplate = input<TemplateRef<unknown> | null>(null);\n readonly sidebarTopTemplate = input<TemplateRef<unknown> | null>(null);\n readonly sidebarFooterTemplate = input<TemplateRef<unknown> | null>(null);\n readonly mainHeaderTemplate = input<TemplateRef<unknown> | null>(null);\n\n private readonly topbarStartSlot = contentChild(SparkShellTopbarStartDirective);\n private readonly topbarEndSlot = contentChild(SparkShellTopbarEndDirective);\n private readonly topbarActionsSlot = contentChild(SparkShellTopbarActionsDirective);\n private readonly sidebarHeaderSlot = contentChild(SparkShellSidebarHeaderDirective);\n private readonly sidebarTopSlot = contentChild(SparkShellSidebarTopDirective);\n private readonly sidebarFooterSlot = contentChild(SparkShellSidebarFooterDirective);\n private readonly mainHeaderSlot = contentChild(SparkShellMainHeaderDirective);\n\n protected readonly topbarStartTpl = computed(() => this.topbarStartSlot()?.templateRef ?? this.topbarStartTemplate());\n protected readonly topbarEndTpl = computed(() => this.topbarEndSlot()?.templateRef ?? this.topbarEndTemplate());\n protected readonly topbarActionsTpl = computed(() => this.topbarActionsSlot()?.templateRef ?? this.topbarActionsTemplate());\n protected readonly sidebarHeaderTpl = computed(() => this.sidebarHeaderSlot()?.templateRef ?? this.sidebarHeaderTemplate());\n protected readonly sidebarTopTpl = computed(() => this.sidebarTopSlot()?.templateRef ?? this.sidebarTopTemplate());\n protected readonly sidebarFooterTpl = computed(() => this.sidebarFooterSlot()?.templateRef ?? this.sidebarFooterTemplate());\n protected readonly mainHeaderTpl = computed(() => this.mainHeaderSlot()?.templateRef ?? this.mainHeaderTemplate());\n\n /**\n * Extra accordion tabs, forwarded to the menu so IT creates the `<bs-accordion-tab>` elements —\n * the only way they share the generated groups' single-open behavior (see\n * `SparkShellTabDirective`). Data-supplied tabs come first, then projected ones in declaration\n * order.\n */\n private readonly tabSlots = contentChildren(SparkShellTabDirective);\n\n protected readonly tabs = computed<readonly SparkSidebarTab[]>(() => [\n ...this.sidebarTabs(),\n ...this.tabSlots().map(slot => ({\n header: slot.header(),\n icon: slot.icon(),\n headerTemplate: slot.headerTemplate(),\n content: slot.templateRef,\n })),\n ]);\n\n protected readonly shellState = signal<BsShellState>('auto');\n protected readonly isSidebarVisible = signal(false);\n\n // Explicit toggles force show/hide; 'auto' responsive behavior is otherwise preserved by\n // never writing state on our own. The mirror below keeps the toggler icon truthful when the\n // shell opens/closes itself at the breakpoint.\n protected toggleSidebar(open: boolean): void {\n this.shellState.set(open ? 'show' : 'hide');\n }\n\n protected onShellToggle(detail: ShellStateChangeEventDetail): void {\n this.isSidebarVisible.set(detail.open);\n }\n}\n","<bs-shell [state]=\"shellState()\" [breakpoint]=\"breakpoint()\" [dismissOnNavigate]=\"true\"\n (statechange)=\"onShellToggle($event)\">\n <div slot=\"topbar\" class=\"spark-topbar w-100 d-flex align-items-center\">\n @if (topbarStartTpl(); as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl\" />\n } @else {\n <bs-navbar-toggler [state]=\"isSidebarVisible()\" (stateChange)=\"toggleSidebar($event)\" />\n }\n <div class=\"ms-auto me-3 d-flex align-items-center gap-2\">\n <!-- Ahead of the trailing chrome, and OUTSIDE the @if below: these actions are additive, so\n they render whether the host replaced the trailing edge or left the default selector. -->\n @if (topbarActionsTpl(); as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl\" />\n }\n <!-- Also outside the trailing @if: replacing the end slot (e.g. with spark-auth-bar) keeps it. -->\n @if (themeToggle()) {\n <bs-theme-toggle [modes]=\"themeModes()\" />\n }\n @if (topbarEndTpl(); as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl\" />\n } @else {\n <spark-language-selector />\n }\n </div>\n </div>\n\n <nav bsShellSidebar class=\"spark-sidebar p-2\">\n @if (sidebarHeaderTpl(); as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl\" />\n } @else {\n <h5 class=\"p-3 border-bottom\">{{ title() }}</h5>\n }\n @if (sidebarTopTpl(); as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl\" />\n }\n <spark-program-units [reloadToken]=\"reloadToken()\" [extraTabs]=\"tabs()\" />\n @if (sidebarFooterTpl(); as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl\" />\n }\n </nav>\n\n <!-- The padding lives in the stylesheet as `--spark-main-padding`, not as a `p-4` utility, so the\n sticky action bar can read it and bleed back out to the scrollport edges. See _actionbar.scss. -->\n <main>\n @if (mainHeaderTpl(); as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl\" />\n }\n <ng-content />\n </main>\n</bs-shell>\n"],"mappings":"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"}
|
|
@@ -22,7 +22,7 @@ var SparkSoftDeleteService = class SparkSoftDeleteService {
|
|
|
22
22
|
}
|
|
23
23
|
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
24
24
|
minVersion: "12.0.0",
|
|
25
|
-
version: "22.2.
|
|
25
|
+
version: "22.2.2",
|
|
26
26
|
ngImport: i0,
|
|
27
27
|
type: SparkSoftDeleteService,
|
|
28
28
|
deps: [],
|
|
@@ -30,7 +30,7 @@ var SparkSoftDeleteService = class SparkSoftDeleteService {
|
|
|
30
30
|
});
|
|
31
31
|
static ɵprov = i0.ɵɵngDeclareInjectable({
|
|
32
32
|
minVersion: "12.0.0",
|
|
33
|
-
version: "22.2.
|
|
33
|
+
version: "22.2.2",
|
|
34
34
|
ngImport: i0,
|
|
35
35
|
type: SparkSoftDeleteService,
|
|
36
36
|
providedIn: "root"
|
|
@@ -38,7 +38,7 @@ var SparkSoftDeleteService = class SparkSoftDeleteService {
|
|
|
38
38
|
};
|
|
39
39
|
i0.ɵɵngDeclareClassMetadata({
|
|
40
40
|
minVersion: "12.0.0",
|
|
41
|
-
version: "22.2.
|
|
41
|
+
version: "22.2.2",
|
|
42
42
|
ngImport: i0,
|
|
43
43
|
type: SparkSoftDeleteService,
|
|
44
44
|
decorators: [{
|
|
@@ -55,7 +55,7 @@ var SparkDeletedToggleComponent = class SparkDeletedToggleComponent {
|
|
|
55
55
|
}
|
|
56
56
|
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
57
57
|
minVersion: "12.0.0",
|
|
58
|
-
version: "22.2.
|
|
58
|
+
version: "22.2.2",
|
|
59
59
|
ngImport: i0,
|
|
60
60
|
type: SparkDeletedToggleComponent,
|
|
61
61
|
deps: [],
|
|
@@ -63,7 +63,7 @@ var SparkDeletedToggleComponent = class SparkDeletedToggleComponent {
|
|
|
63
63
|
});
|
|
64
64
|
static ɵcmp = i0.ɵɵngDeclareComponent({
|
|
65
65
|
minVersion: "17.0.0",
|
|
66
|
-
version: "22.2.
|
|
66
|
+
version: "22.2.2",
|
|
67
67
|
type: SparkDeletedToggleComponent,
|
|
68
68
|
isStandalone: true,
|
|
69
69
|
selector: "spark-deleted-toggle",
|
|
@@ -103,7 +103,7 @@ var SparkDeletedToggleComponent = class SparkDeletedToggleComponent {
|
|
|
103
103
|
};
|
|
104
104
|
i0.ɵɵngDeclareClassMetadata({
|
|
105
105
|
minVersion: "12.0.0",
|
|
106
|
-
version: "22.2.
|
|
106
|
+
version: "22.2.2",
|
|
107
107
|
ngImport: i0,
|
|
108
108
|
type: SparkDeletedToggleComponent,
|
|
109
109
|
decorators: [{
|
|
@@ -185,7 +185,7 @@ var SparkSoftDeleteActionsComponent = class SparkSoftDeleteActionsComponent {
|
|
|
185
185
|
}
|
|
186
186
|
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
187
187
|
minVersion: "12.0.0",
|
|
188
|
-
version: "22.2.
|
|
188
|
+
version: "22.2.2",
|
|
189
189
|
ngImport: i0,
|
|
190
190
|
type: SparkSoftDeleteActionsComponent,
|
|
191
191
|
deps: [],
|
|
@@ -193,7 +193,7 @@ var SparkSoftDeleteActionsComponent = class SparkSoftDeleteActionsComponent {
|
|
|
193
193
|
});
|
|
194
194
|
static ɵcmp = i0.ɵɵngDeclareComponent({
|
|
195
195
|
minVersion: "17.0.0",
|
|
196
|
-
version: "22.2.
|
|
196
|
+
version: "22.2.2",
|
|
197
197
|
type: SparkSoftDeleteActionsComponent,
|
|
198
198
|
isStandalone: true,
|
|
199
199
|
selector: "spark-soft-delete-actions",
|
|
@@ -240,7 +240,7 @@ var SparkSoftDeleteActionsComponent = class SparkSoftDeleteActionsComponent {
|
|
|
240
240
|
};
|
|
241
241
|
i0.ɵɵngDeclareClassMetadata({
|
|
242
242
|
minVersion: "12.0.0",
|
|
243
|
-
version: "22.2.
|
|
243
|
+
version: "22.2.2",
|
|
244
244
|
ngImport: i0,
|
|
245
245
|
type: SparkSoftDeleteActionsComponent,
|
|
246
246
|
decorators: [{
|