@flyos/design-system 1.1.0 → 1.2.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/fesm2022/flyos-design-system.mjs +310 -33
- package/fesm2022/flyos-design-system.mjs.map +1 -1
- package/package.json +1 -1
- package/scss/_ink-baseline.scss +29 -29
- package/scss/_shell-embed-bridge.scss +81 -81
- package/scss/_vos-button-mixins.scss +28 -28
- package/types/flyos-design-system.d.ts +133 -2
- package/types/flyos-design-system.d.ts.map +1 -1
|
@@ -44,9 +44,11 @@ import { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';
|
|
|
44
44
|
* See skills/business-app-angular-remote.md § "Design-system singleton across
|
|
45
45
|
* the federation boundary".
|
|
46
46
|
*/
|
|
47
|
-
//
|
|
48
|
-
//
|
|
49
|
-
|
|
47
|
+
// Kept in sync with projects/design-system/package.json "version" — rewritten by
|
|
48
|
+
// tools/publish-library.ps1 at bump time, and asserted by the spec beside this file.
|
|
49
|
+
// Used only for the diagnostic message; the duplicate-instance detection itself is
|
|
50
|
+
// version-agnostic, so a stale literal misnames a fork rather than hiding one.
|
|
51
|
+
const FLY_DS_VERSION = '1.2.0';
|
|
50
52
|
const FLY_DS_REGISTRY_KEY = '__FLY_DS_INSTANCES__';
|
|
51
53
|
/**
|
|
52
54
|
* Records this design-system instance on the shared `scope` and returns the
|
|
@@ -1593,6 +1595,7 @@ const DS_BASELINE_LOCALES = {
|
|
|
1593
1595
|
'ui.nav.breadcrumbs': 'Breadcrumbs',
|
|
1594
1596
|
'ui.nav.home': 'Home',
|
|
1595
1597
|
'ui.nav.selectModule': 'Select a module',
|
|
1598
|
+
'ui.nav.sections': 'Sections',
|
|
1596
1599
|
'ui.nav.switchModule': 'Switch module',
|
|
1597
1600
|
'ui.pagination.first': 'First page',
|
|
1598
1601
|
'ui.pagination.label': 'Pagination',
|
|
@@ -1938,6 +1941,7 @@ const DS_BASELINE_LOCALES = {
|
|
|
1938
1941
|
'ui.nav.breadcrumbs': 'مسار التنقل',
|
|
1939
1942
|
'ui.nav.home': 'الرئيسية',
|
|
1940
1943
|
'ui.nav.selectModule': 'اختر وحدة',
|
|
1944
|
+
'ui.nav.sections': 'الأقسام',
|
|
1941
1945
|
'ui.nav.switchModule': 'تبديل الوحدة',
|
|
1942
1946
|
'ui.pagination.first': 'الصفحة الأولى',
|
|
1943
1947
|
'ui.pagination.label': 'تقسيم الصفحات',
|
|
@@ -2283,6 +2287,7 @@ const DS_BASELINE_LOCALES = {
|
|
|
2283
2287
|
'ui.nav.breadcrumbs': 'Fil d\'Ariane',
|
|
2284
2288
|
'ui.nav.home': 'Accueil',
|
|
2285
2289
|
'ui.nav.selectModule': 'Choisir un module',
|
|
2290
|
+
'ui.nav.sections': 'Sections',
|
|
2286
2291
|
'ui.nav.switchModule': 'Changer de module',
|
|
2287
2292
|
'ui.pagination.first': 'Première page',
|
|
2288
2293
|
'ui.pagination.label': 'Pagination',
|
|
@@ -2627,6 +2632,7 @@ const DS_BASELINE_LOCALES = {
|
|
|
2627
2632
|
'ui.nav.breadcrumbs': 'بریڈکرمب',
|
|
2628
2633
|
'ui.nav.home': 'ہوم',
|
|
2629
2634
|
'ui.nav.selectModule': 'ماڈیول منتخب کریں',
|
|
2635
|
+
'ui.nav.sections': 'حصے',
|
|
2630
2636
|
'ui.nav.switchModule': 'ماڈیول تبدیل کریں',
|
|
2631
2637
|
'ui.pagination.first': 'پہلا صفحہ',
|
|
2632
2638
|
'ui.pagination.label': 'صفحہ بندی',
|
|
@@ -8739,11 +8745,11 @@ class FlyBlockUiComponent {
|
|
|
8739
8745
|
return k && k.length > 0 ? k : 'common.loading';
|
|
8740
8746
|
}, ...(ngDevMode ? [{ debugName: "resolvedMessageKey" }] : /* istanbul ignore next */ []));
|
|
8741
8747
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: FlyBlockUiComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
8742
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.19", type: FlyBlockUiComponent, isStandalone: true, selector: "fly-block-ui", inputs: { active: { classPropertyName: "active", publicName: "active", isSignal: true, isRequired: true, transformFunction: null }, messageKey: { classPropertyName: "messageKey", publicName: "messageKey", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (active()) {\
|
|
8748
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.19", type: FlyBlockUiComponent, isStandalone: true, selector: "fly-block-ui", inputs: { active: { classPropertyName: "active", publicName: "active", isSignal: true, isRequired: true, transformFunction: null }, messageKey: { classPropertyName: "messageKey", publicName: "messageKey", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (active()) {\n <div\n class=\"fly-block-ui\"\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n [attr.aria-label]=\"resolvedMessageKey() | translate\">\n <div class=\"fly-block-ui__card\">\n <i class=\"pi pi-spin pi-spinner fly-block-ui__spinner\" aria-hidden=\"true\"></i>\n <span class=\"fly-block-ui__text\">{{ resolvedMessageKey() | translate }}</span>\n </div>\n </div>\n}\n", styles: [":host{display:contents}.fly-block-ui{position:absolute;inset:0;z-index:50;display:flex;align-items:center;justify-content:center;background:color-mix(in srgb,var(--surface-ground, #0c0c12) 58%,transparent);-webkit-backdrop-filter:blur(6px) saturate(120%);backdrop-filter:blur(6px) saturate(120%)}.fly-block-ui__card{display:flex;flex-direction:column;align-items:center;gap:12px;padding:24px 36px;border-radius:12px;background:var(--glass-bg, rgba(255, 255, 255, .14));border:1px solid var(--glass-border, rgba(255, 255, 255, .22));box-shadow:0 8px 32px #0000002e}.fly-block-ui__spinner{font-size:2rem;color:var(--primary-color)}.fly-block-ui__text{font-size:.875rem;color:var(--text-color-secondary)}\n"], dependencies: [{ kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
8743
8749
|
}
|
|
8744
8750
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: FlyBlockUiComponent, decorators: [{
|
|
8745
8751
|
type: Component,
|
|
8746
|
-
args: [{ selector: 'fly-block-ui', standalone: true, imports: [TranslatePipe], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (active()) {\
|
|
8752
|
+
args: [{ selector: 'fly-block-ui', standalone: true, imports: [TranslatePipe], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (active()) {\n <div\n class=\"fly-block-ui\"\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n [attr.aria-label]=\"resolvedMessageKey() | translate\">\n <div class=\"fly-block-ui__card\">\n <i class=\"pi pi-spin pi-spinner fly-block-ui__spinner\" aria-hidden=\"true\"></i>\n <span class=\"fly-block-ui__text\">{{ resolvedMessageKey() | translate }}</span>\n </div>\n </div>\n}\n", styles: [":host{display:contents}.fly-block-ui{position:absolute;inset:0;z-index:50;display:flex;align-items:center;justify-content:center;background:color-mix(in srgb,var(--surface-ground, #0c0c12) 58%,transparent);-webkit-backdrop-filter:blur(6px) saturate(120%);backdrop-filter:blur(6px) saturate(120%)}.fly-block-ui__card{display:flex;flex-direction:column;align-items:center;gap:12px;padding:24px 36px;border-radius:12px;background:var(--glass-bg, rgba(255, 255, 255, .14));border:1px solid var(--glass-border, rgba(255, 255, 255, .22));box-shadow:0 8px 32px #0000002e}.fly-block-ui__spinner{font-size:2rem;color:var(--primary-color)}.fly-block-ui__text{font-size:.875rem;color:var(--text-color-secondary)}\n"] }]
|
|
8747
8753
|
}], propDecorators: { active: [{ type: i0.Input, args: [{ isSignal: true, alias: "active", required: true }] }], messageKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "messageKey", required: false }] }] } });
|
|
8748
8754
|
|
|
8749
8755
|
/**
|
|
@@ -16239,11 +16245,11 @@ class FlyPeoplePickerComponent {
|
|
|
16239
16245
|
this.selectionChange.emit(this._selected().map((o) => o.id));
|
|
16240
16246
|
}
|
|
16241
16247
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: FlyPeoplePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
16242
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.19", type: FlyPeoplePickerComponent, isStandalone: true, selector: "fly-people-picker", inputs: { searchFn: { classPropertyName: "searchFn", publicName: "searchFn", isSignal: true, isRequired: true, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, excludeIds: { classPropertyName: "excludeIds", publicName: "excludeIds", isSignal: true, isRequired: false, transformFunction: null }, initialSelection: { classPropertyName: "initialSelection", publicName: "initialSelection", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectionChange: "selectionChange" }, host: { classAttribute: "fly-people-picker" }, viewQueries: [{ propertyName: "typeahead", first: true, predicate: FlyTypeaheadComponent, descendants: true }], ngImport: i0, template: "@if (selected().length > 0) {\
|
|
16248
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.19", type: FlyPeoplePickerComponent, isStandalone: true, selector: "fly-people-picker", inputs: { searchFn: { classPropertyName: "searchFn", publicName: "searchFn", isSignal: true, isRequired: true, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, excludeIds: { classPropertyName: "excludeIds", publicName: "excludeIds", isSignal: true, isRequired: false, transformFunction: null }, initialSelection: { classPropertyName: "initialSelection", publicName: "initialSelection", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectionChange: "selectionChange" }, host: { classAttribute: "fly-people-picker" }, viewQueries: [{ propertyName: "typeahead", first: true, predicate: FlyTypeaheadComponent, descendants: true }], ngImport: i0, template: "@if (selected().length > 0) {\n <ul class=\"fly-people-picker__chips\" role=\"list\">\n @for (o of selected(); track o.id) {\n <li class=\"fly-people-picker__chip\" role=\"listitem\">\n <span class=\"fly-people-picker__chip-avatar\" aria-hidden=\"true\">\n @if (o.avatarUrl) {\n <img [src]=\"o.avatarUrl\" alt=\"\" />\n } @else {\n <span class=\"fly-people-picker__chip-initials\">{{ initialsFor(o.displayName) }}</span>\n }\n </span>\n <span class=\"fly-people-picker__chip-name\" [title]=\"o.email || o.displayName\">{{ o.displayName }}</span>\n <button\n type=\"button\"\n class=\"fly-people-picker__chip-remove\"\n [attr.aria-label]=\"'people_picker.remove' | translate: { name: o.displayName }\"\n (click)=\"remove(o.id)\">\n \u2715\n </button>\n </li>\n }\n </ul>\n}\n\n@if (showSearch()) {\n <fly-typeahead\n [searchFn]=\"typeaheadSearchFn\"\n [placeholder]=\"placeholder() || ('people_picker.search_placeholder' | translate)\"\n [allowFreeText]=\"false\"\n (selected)=\"onPicked($event)\" />\n} @else {\n <button type=\"button\" class=\"fly-people-picker__change-btn\" (click)=\"change()\">\n {{ 'people_picker.change' | translate }}\n </button>\n}\n", styles: [":host,:host *,:host *:before,:host *:after{box-sizing:border-box}:host{--_surface: var(--surface-card, #fff);--_surface-hover: var(--surface-hover, #f1f5f9);--_border: var(--separator, var(--surface-border, #e2e8f0));--_text: var(--label-primary, var(--text-color, #0f172a));--_text-subtle: var(--label-secondary, var(--text-color-secondary, #64748b));--_fill: var(--fill-tertiary, #f3f4f6);--_accent: var(--accent);--_danger: var(--system-red, #ef4444);--_radius: 999px;display:flex;flex-direction:column;gap:8px;inline-size:100%;color:var(--_text);font-size:13px}.fly-people-picker__chips{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:6px}.fly-people-picker__chip{display:inline-flex;align-items:center;gap:6px;padding-block:3px;padding-inline:3px 6px;border-radius:var(--_radius);background:var(--_fill);max-inline-size:220px}.fly-people-picker__chip-avatar{inline-size:22px;block-size:22px;border-radius:50%;overflow:hidden;flex:none;background:var(--_surface);display:flex;align-items:center;justify-content:center}.fly-people-picker__chip-avatar img{inline-size:100%;block-size:100%;object-fit:cover}.fly-people-picker__chip-initials{font-size:9px;font-weight:700;color:var(--_text-subtle);text-transform:uppercase}.fly-people-picker__chip-name{font-size:12px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fly-people-picker__chip-remove{border:none;background:transparent;padding:2px;margin-inline-start:2px;border-radius:50%;color:var(--_text-subtle);font-size:10px;line-height:1;cursor:pointer;flex:none}.fly-people-picker__chip-remove:hover{background:color-mix(in srgb,var(--_danger) 18%,transparent);color:var(--_danger)}.fly-people-picker__change-btn{align-self:flex-start;border:1px solid var(--_border);border-radius:8px;background:var(--_surface);padding:5px 12px;color:var(--_text);font:inherit;font-weight:600;cursor:pointer}.fly-people-picker__change-btn:hover{background:var(--_surface-hover)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: FlyTypeaheadComponent, selector: "fly-typeahead", inputs: ["searchFn", "debounceMs", "placeholder", "ariaLabel", "value", "allowFreeText", "openOnFocus"], outputs: ["valueChange", "selected", "cleared"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
16243
16249
|
}
|
|
16244
16250
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: FlyPeoplePickerComponent, decorators: [{
|
|
16245
16251
|
type: Component,
|
|
16246
|
-
args: [{ selector: 'fly-people-picker', standalone: true, imports: [CommonModule, TranslatePipe, FlyTypeaheadComponent], changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'fly-people-picker' }, template: "@if (selected().length > 0) {\
|
|
16252
|
+
args: [{ selector: 'fly-people-picker', standalone: true, imports: [CommonModule, TranslatePipe, FlyTypeaheadComponent], changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'fly-people-picker' }, template: "@if (selected().length > 0) {\n <ul class=\"fly-people-picker__chips\" role=\"list\">\n @for (o of selected(); track o.id) {\n <li class=\"fly-people-picker__chip\" role=\"listitem\">\n <span class=\"fly-people-picker__chip-avatar\" aria-hidden=\"true\">\n @if (o.avatarUrl) {\n <img [src]=\"o.avatarUrl\" alt=\"\" />\n } @else {\n <span class=\"fly-people-picker__chip-initials\">{{ initialsFor(o.displayName) }}</span>\n }\n </span>\n <span class=\"fly-people-picker__chip-name\" [title]=\"o.email || o.displayName\">{{ o.displayName }}</span>\n <button\n type=\"button\"\n class=\"fly-people-picker__chip-remove\"\n [attr.aria-label]=\"'people_picker.remove' | translate: { name: o.displayName }\"\n (click)=\"remove(o.id)\">\n \u2715\n </button>\n </li>\n }\n </ul>\n}\n\n@if (showSearch()) {\n <fly-typeahead\n [searchFn]=\"typeaheadSearchFn\"\n [placeholder]=\"placeholder() || ('people_picker.search_placeholder' | translate)\"\n [allowFreeText]=\"false\"\n (selected)=\"onPicked($event)\" />\n} @else {\n <button type=\"button\" class=\"fly-people-picker__change-btn\" (click)=\"change()\">\n {{ 'people_picker.change' | translate }}\n </button>\n}\n", styles: [":host,:host *,:host *:before,:host *:after{box-sizing:border-box}:host{--_surface: var(--surface-card, #fff);--_surface-hover: var(--surface-hover, #f1f5f9);--_border: var(--separator, var(--surface-border, #e2e8f0));--_text: var(--label-primary, var(--text-color, #0f172a));--_text-subtle: var(--label-secondary, var(--text-color-secondary, #64748b));--_fill: var(--fill-tertiary, #f3f4f6);--_accent: var(--accent);--_danger: var(--system-red, #ef4444);--_radius: 999px;display:flex;flex-direction:column;gap:8px;inline-size:100%;color:var(--_text);font-size:13px}.fly-people-picker__chips{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:6px}.fly-people-picker__chip{display:inline-flex;align-items:center;gap:6px;padding-block:3px;padding-inline:3px 6px;border-radius:var(--_radius);background:var(--_fill);max-inline-size:220px}.fly-people-picker__chip-avatar{inline-size:22px;block-size:22px;border-radius:50%;overflow:hidden;flex:none;background:var(--_surface);display:flex;align-items:center;justify-content:center}.fly-people-picker__chip-avatar img{inline-size:100%;block-size:100%;object-fit:cover}.fly-people-picker__chip-initials{font-size:9px;font-weight:700;color:var(--_text-subtle);text-transform:uppercase}.fly-people-picker__chip-name{font-size:12px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fly-people-picker__chip-remove{border:none;background:transparent;padding:2px;margin-inline-start:2px;border-radius:50%;color:var(--_text-subtle);font-size:10px;line-height:1;cursor:pointer;flex:none}.fly-people-picker__chip-remove:hover{background:color-mix(in srgb,var(--_danger) 18%,transparent);color:var(--_danger)}.fly-people-picker__change-btn{align-self:flex-start;border:1px solid var(--_border);border-radius:8px;background:var(--_surface);padding:5px 12px;color:var(--_text);font:inherit;font-weight:600;cursor:pointer}.fly-people-picker__change-btn:hover{background:var(--_surface-hover)}\n"] }]
|
|
16247
16253
|
}], ctorParameters: () => [], propDecorators: { searchFn: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchFn", required: true }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], excludeIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "excludeIds", required: false }] }], initialSelection: [{ type: i0.Input, args: [{ isSignal: true, alias: "initialSelection", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], typeahead: [{
|
|
16248
16254
|
type: ViewChild,
|
|
16249
16255
|
args: [FlyTypeaheadComponent]
|
|
@@ -18461,6 +18467,302 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImpo
|
|
|
18461
18467
|
`, styles: [":host{display:block}.sh{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:13px 16px;border-block-end:1px solid var(--line-3)}.sh__t{margin:0;font-size:13px;font-weight:var(--fw-semibold);color:var(--ink);letter-spacing:-.005em;min-width:0}.sh__a{display:inline-flex;align-items:center;gap:var(--sp-1);flex-shrink:0}.sh__a ::ng-deep a:not([fly-button]),.sh__a ::ng-deep button:not([fly-button],[fly-icon-button]){display:inline-flex;align-items:center;gap:5px;background:transparent;border:0;color:var(--accent);font-size:12px;font-weight:var(--fw-medium);cursor:pointer;padding:4px 6px;border-radius:var(--r-sm);font-family:inherit;text-decoration:none;transition:background var(--t-state)}.sh__a ::ng-deep a:not([fly-button]):hover,.sh__a ::ng-deep button:not([fly-button],[fly-icon-button]):hover{background:color-mix(in srgb,var(--accent-soft) 50%,transparent)}.sh__a ::ng-deep a:not([fly-button]):focus-visible,.sh__a ::ng-deep button:not([fly-button],[fly-icon-button]):focus-visible{outline:2px solid var(--focus-ring);outline-offset:2px}\n"] }]
|
|
18462
18468
|
}], propDecorators: { titleKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "titleKey", required: false }] }] } });
|
|
18463
18469
|
|
|
18470
|
+
/**
|
|
18471
|
+
* Detail-page content card — the surface every panel and sidebar block on a detail
|
|
18472
|
+
* screen sits on: `card-surface` fill/hairline/radius/shadow, an optional
|
|
18473
|
+
* `fly-section-header`, and a padded body.
|
|
18474
|
+
*
|
|
18475
|
+
* Extracted because four detail screens (Circles signal + trend, Thoughts idea +
|
|
18476
|
+
* the six sibling detail pages) had each hand-rolled the identical
|
|
18477
|
+
* `.card` / `.card__body` / `.card__body--flush` recipe, and they drifted: some
|
|
18478
|
+
* carried the shadow, some didn't, and on the shell's translucent glass the ones
|
|
18479
|
+
* without it lost their edge and read as a lighter surface than their neighbours.
|
|
18480
|
+
*
|
|
18481
|
+
* ```html
|
|
18482
|
+
* <fly-detail-card titleKey="common.label.metadata">
|
|
18483
|
+
* <fly-meta [items]="rows()" />
|
|
18484
|
+
* </fly-detail-card>
|
|
18485
|
+
*
|
|
18486
|
+
* <!-- A child with its own list chrome shouldn't sit inside body padding. -->
|
|
18487
|
+
* <fly-detail-card titleKey="common.label.evidence" [flush]="true">
|
|
18488
|
+
* <button card-actions type="button" (click)="add()">Add</button>
|
|
18489
|
+
* <fly-evidence-panel [hideHeader]="true" />
|
|
18490
|
+
* </fly-detail-card>
|
|
18491
|
+
* ```
|
|
18492
|
+
*
|
|
18493
|
+
* With no `titleKey` and nothing projected into `[card-title]` the header is
|
|
18494
|
+
* omitted entirely, so the card also serves as a bare framed surface (a cover
|
|
18495
|
+
* image, a chart) without an empty header rule above it.
|
|
18496
|
+
*/
|
|
18497
|
+
class FlyDetailCardComponent {
|
|
18498
|
+
/** i18n key for the card title; alternatively project `[card-title]`. */
|
|
18499
|
+
titleKey = input(...(ngDevMode ? [undefined, { debugName: "titleKey" }] : /* istanbul ignore next */ []));
|
|
18500
|
+
/**
|
|
18501
|
+
* Set when the title arrives through `[card-title]` rather than `titleKey`.
|
|
18502
|
+
* Content projection cannot be *queried* for presence without a `contentChild`
|
|
18503
|
+
* on a directive the caller would also have to import, so this stays an
|
|
18504
|
+
* explicit flag — a header with neither is omitted rather than rendered empty.
|
|
18505
|
+
*/
|
|
18506
|
+
hasProjectedTitle = input(false, ...(ngDevMode ? [{ debugName: "hasProjectedTitle" }] : /* istanbul ignore next */ []));
|
|
18507
|
+
/** Drop the body padding — for a child that brings its own list/table chrome. */
|
|
18508
|
+
flush = input(false, ...(ngDevMode ? [{ debugName: "flush" }] : /* istanbul ignore next */ []));
|
|
18509
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: FlyDetailCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
18510
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.19", type: FlyDetailCardComponent, isStandalone: true, selector: "fly-detail-card", inputs: { titleKey: { classPropertyName: "titleKey", publicName: "titleKey", isSignal: true, isRequired: false, transformFunction: null }, hasProjectedTitle: { classPropertyName: "hasProjectedTitle", publicName: "hasProjectedTitle", isSignal: true, isRequired: false, transformFunction: null }, flush: { classPropertyName: "flush", publicName: "flush", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
18511
|
+
@if (titleKey() || hasProjectedTitle()) {
|
|
18512
|
+
<fly-section-header [titleKey]="titleKey()">
|
|
18513
|
+
<ng-content select="[card-title]" ngProjectAs="[section-title]" />
|
|
18514
|
+
<ng-content select="[card-actions]" ngProjectAs="[section-actions]" />
|
|
18515
|
+
</fly-section-header>
|
|
18516
|
+
}
|
|
18517
|
+
<div class="dc__body" [class.dc__body--flush]="flush()">
|
|
18518
|
+
<ng-content />
|
|
18519
|
+
</div>
|
|
18520
|
+
`, isInline: true, styles: [":host{display:block;background:var(--bg-2);border:1px solid var(--line);border-radius:var(--r-lg);box-shadow:var(--shadow-card);overflow:hidden}.dc__body{padding:var(--sp-3) var(--sp-4) var(--sp-4)}.dc__body--flush{padding:0}\n"], dependencies: [{ kind: "component", type: FlySectionHeaderComponent, selector: "fly-section-header", inputs: ["titleKey"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
18521
|
+
}
|
|
18522
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: FlyDetailCardComponent, decorators: [{
|
|
18523
|
+
type: Component,
|
|
18524
|
+
args: [{ selector: 'fly-detail-card', standalone: true, imports: [FlySectionHeaderComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
18525
|
+
@if (titleKey() || hasProjectedTitle()) {
|
|
18526
|
+
<fly-section-header [titleKey]="titleKey()">
|
|
18527
|
+
<ng-content select="[card-title]" ngProjectAs="[section-title]" />
|
|
18528
|
+
<ng-content select="[card-actions]" ngProjectAs="[section-actions]" />
|
|
18529
|
+
</fly-section-header>
|
|
18530
|
+
}
|
|
18531
|
+
<div class="dc__body" [class.dc__body--flush]="flush()">
|
|
18532
|
+
<ng-content />
|
|
18533
|
+
</div>
|
|
18534
|
+
`, styles: [":host{display:block;background:var(--bg-2);border:1px solid var(--line);border-radius:var(--r-lg);box-shadow:var(--shadow-card);overflow:hidden}.dc__body{padding:var(--sp-3) var(--sp-4) var(--sp-4)}.dc__body--flush{padding:0}\n"] }]
|
|
18535
|
+
}], propDecorators: { titleKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "titleKey", required: false }] }], hasProjectedTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasProjectedTitle", required: false }] }], flush: [{ type: i0.Input, args: [{ isSignal: true, alias: "flush", required: false }] }] } });
|
|
18536
|
+
|
|
18537
|
+
/**
|
|
18538
|
+
* Roving-focus target for a radiogroup keydown. Pure so the wrap-around and
|
|
18539
|
+
* RTL mirroring are unit-testable without the DOM.
|
|
18540
|
+
*
|
|
18541
|
+
* - ArrowRight/ArrowDown advance, ArrowLeft/ArrowUp go back — horizontal
|
|
18542
|
+
* arrows mirror under RTL (visual "right" stays visual "right").
|
|
18543
|
+
* - Home/End jump to the edges.
|
|
18544
|
+
* - Returns null for any other key (caller must not preventDefault).
|
|
18545
|
+
* - With no current selection (current < 0) navigation starts from index 0.
|
|
18546
|
+
*/
|
|
18547
|
+
function nextSegmentIndex(current, key, length, rtl) {
|
|
18548
|
+
if (length === 0)
|
|
18549
|
+
return null;
|
|
18550
|
+
if (key === 'Home')
|
|
18551
|
+
return 0;
|
|
18552
|
+
if (key === 'End')
|
|
18553
|
+
return length - 1;
|
|
18554
|
+
const forward = key === 'ArrowDown' || key === (rtl ? 'ArrowLeft' : 'ArrowRight');
|
|
18555
|
+
const backward = key === 'ArrowUp' || key === (rtl ? 'ArrowRight' : 'ArrowLeft');
|
|
18556
|
+
if (!forward && !backward)
|
|
18557
|
+
return null;
|
|
18558
|
+
const base = current < 0 ? 0 : current;
|
|
18559
|
+
return forward ? (base + 1) % length : (base - 1 + length) % length;
|
|
18560
|
+
}
|
|
18561
|
+
|
|
18562
|
+
/**
|
|
18563
|
+
* Resolve which section is active.
|
|
18564
|
+
*
|
|
18565
|
+
* The fallback is the point of this function. A detail page's section list is
|
|
18566
|
+
* derived from the record — a scorecard tab only exists while the record has a
|
|
18567
|
+
* scorecard, an approvals tab only while an approval is open — so a selection made
|
|
18568
|
+
* on one record can name a section the NEXT record does not have. The remote-router
|
|
18569
|
+
* outlet reuses the component instance across `/x/:id` → `/x/:id` navigations, so
|
|
18570
|
+
* that is a routine occurrence, not an edge case, and the symptom is an empty panel
|
|
18571
|
+
* with no indication why.
|
|
18572
|
+
*
|
|
18573
|
+
* Returns the selection when it still exists, otherwise the first section, or null
|
|
18574
|
+
* when there are none.
|
|
18575
|
+
*/
|
|
18576
|
+
function resolveActiveSection(sections, selected) {
|
|
18577
|
+
if (sections.length === 0)
|
|
18578
|
+
return null;
|
|
18579
|
+
if (selected !== undefined && sections.some(s => s.id === selected))
|
|
18580
|
+
return selected;
|
|
18581
|
+
return sections[0].id;
|
|
18582
|
+
}
|
|
18583
|
+
|
|
18584
|
+
let nextShellUid = 0;
|
|
18585
|
+
/**
|
|
18586
|
+
* Detail-page body scaffold — an aside (icon rail + pinned cards) beside a panel
|
|
18587
|
+
* showing the active section.
|
|
18588
|
+
*
|
|
18589
|
+
* The anatomy comes from the Circles signal-detail screen and had been hand-copied
|
|
18590
|
+
* onto every detail page that wanted it, CSS and all. Each copy re-derived the same
|
|
18591
|
+
* four decisions and got a different subset right, so this owns them:
|
|
18592
|
+
*
|
|
18593
|
+
* - **The rail sits at the top of the aside, but AFTER the content in the DOM** —
|
|
18594
|
+
* a screen reader meets the record before its navigation, while sighted readers
|
|
18595
|
+
* get the rail where a sidebar nav belongs. `order` does the visual half.
|
|
18596
|
+
* - **The panel stretches to the grid row** (already `max(aside, panel)`), so a
|
|
18597
|
+
* short section's card ends where the aside ends at every window size. A `vh`
|
|
18598
|
+
* floor cannot do this — it ignores the aside and mismatches at every size.
|
|
18599
|
+
* - **Below 980px the rail becomes a horizontal bar** above the panel rather than
|
|
18600
|
+
* a 300px column squeezing the content.
|
|
18601
|
+
* - **The active tab is a solid accent plate with `--on-accent-fill` ink** — NOT
|
|
18602
|
+
* `--accent` on `--accent-soft`: the shell paints `--accent-soft` as a tint of
|
|
18603
|
+
* `--accent`, so that pairing renders the label in its own background colour.
|
|
18604
|
+
*
|
|
18605
|
+
* It also supplies the tablist a11y both hand-rolled rails were missing: proper
|
|
18606
|
+
* `role="tablist"`/`tab`/`tabpanel` wiring, a roving tabindex, and RTL-aware arrow
|
|
18607
|
+
* keys with Home/End (shared with `fly-tabs` via `nextSegmentIndex`).
|
|
18608
|
+
*
|
|
18609
|
+
* ```html
|
|
18610
|
+
* <fly-detail-shell [sections]="sections()" [(selected)]="section">
|
|
18611
|
+
* <ng-container detail-aside>
|
|
18612
|
+
* <fly-detail-card titleKey="common.label.summary">…</fly-detail-card>
|
|
18613
|
+
* </ng-container>
|
|
18614
|
+
*
|
|
18615
|
+
* @switch (activeSection()) {
|
|
18616
|
+
* @case ('metadata') { <fly-detail-card …/> }
|
|
18617
|
+
* }
|
|
18618
|
+
* </fly-detail-shell>
|
|
18619
|
+
* ```
|
|
18620
|
+
*
|
|
18621
|
+
* The default slot is the panel. Read back the resolved section with the two-way
|
|
18622
|
+
* `selected` — it self-corrects when the bound id names a section that no longer
|
|
18623
|
+
* exists (see {@link resolveActiveSection}).
|
|
18624
|
+
*/
|
|
18625
|
+
class FlyDetailShellComponent {
|
|
18626
|
+
i18n = inject(I18nService);
|
|
18627
|
+
uid = `fly-detail-shell-${nextShellUid++}`;
|
|
18628
|
+
rail = viewChild('rail', ...(ngDevMode ? [{ debugName: "rail" }] : /* istanbul ignore next */ []));
|
|
18629
|
+
/** The rail's sections, in order. Empty renders the aside + panel with no rail. */
|
|
18630
|
+
sections = input([], ...(ngDevMode ? [{ debugName: "sections" }] : /* istanbul ignore next */ []));
|
|
18631
|
+
/** Active section id (two-way). Unset/unknown resolves to the first section. */
|
|
18632
|
+
selected = model(...(ngDevMode ? [undefined, { debugName: "selected" }] : /* istanbul ignore next */ []));
|
|
18633
|
+
/** i18n key for the rail's `aria-label`. */
|
|
18634
|
+
sectionsLabelKey = input('ui.nav.sections', ...(ngDevMode ? [{ debugName: "sectionsLabelKey" }] : /* istanbul ignore next */ []));
|
|
18635
|
+
/** The section actually rendered — self-corrects, see {@link resolveActiveSection}. */
|
|
18636
|
+
activeId = computed(() => resolveActiveSection(this.sections(), this.selected()), ...(ngDevMode ? [{ debugName: "activeId" }] : /* istanbul ignore next */ []));
|
|
18637
|
+
tabId(id) {
|
|
18638
|
+
return `${this.uid}-tab-${id}`;
|
|
18639
|
+
}
|
|
18640
|
+
panelId() {
|
|
18641
|
+
return `${this.uid}-panel`;
|
|
18642
|
+
}
|
|
18643
|
+
select(id) {
|
|
18644
|
+
this.selected.set(id);
|
|
18645
|
+
}
|
|
18646
|
+
onKey(event) {
|
|
18647
|
+
const sections = this.sections();
|
|
18648
|
+
const current = sections.findIndex(s => s.id === this.activeId());
|
|
18649
|
+
// The rail is a vertical tablist that turns horizontal below 980px, and
|
|
18650
|
+
// nextSegmentIndex already serves both: Up/Down step unmirrored, Left/Right
|
|
18651
|
+
// mirror under RTL. Home/End jump to the edges.
|
|
18652
|
+
const next = nextSegmentIndex(current, event.key, sections.length, this.i18n.isRtl());
|
|
18653
|
+
if (next === null)
|
|
18654
|
+
return;
|
|
18655
|
+
event.preventDefault();
|
|
18656
|
+
this.select(sections[next].id);
|
|
18657
|
+
const buttons = this.rail()?.nativeElement.querySelectorAll('[role="tab"]');
|
|
18658
|
+
buttons?.[next]?.focus();
|
|
18659
|
+
}
|
|
18660
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: FlyDetailShellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
18661
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.19", type: FlyDetailShellComponent, isStandalone: true, selector: "fly-detail-shell", inputs: { sections: { classPropertyName: "sections", publicName: "sections", isSignal: true, isRequired: false, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null }, sectionsLabelKey: { classPropertyName: "sectionsLabelKey", publicName: "sectionsLabelKey", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selected: "selectedChange" }, viewQueries: [{ propertyName: "rail", first: true, predicate: ["rail"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
18662
|
+
<div class="ds__layout">
|
|
18663
|
+
<aside class="ds__aside">
|
|
18664
|
+
<div class="ds__pinned">
|
|
18665
|
+
<ng-content select="[detail-aside]" />
|
|
18666
|
+
</div>
|
|
18667
|
+
|
|
18668
|
+
@if (sections().length > 0) {
|
|
18669
|
+
<div
|
|
18670
|
+
#rail
|
|
18671
|
+
class="ds__rail"
|
|
18672
|
+
role="tablist"
|
|
18673
|
+
tabindex="-1"
|
|
18674
|
+
[attr.aria-orientation]="'vertical'"
|
|
18675
|
+
[attr.aria-label]="sectionsLabelKey() | translate"
|
|
18676
|
+
(keydown)="onKey($event)"
|
|
18677
|
+
>
|
|
18678
|
+
@for (s of sections(); track s.id) {
|
|
18679
|
+
<button
|
|
18680
|
+
type="button"
|
|
18681
|
+
class="ds__tab"
|
|
18682
|
+
role="tab"
|
|
18683
|
+
[id]="tabId(s.id)"
|
|
18684
|
+
[class.ds__tab--active]="activeId() === s.id"
|
|
18685
|
+
[attr.aria-selected]="activeId() === s.id"
|
|
18686
|
+
[attr.aria-controls]="panelId()"
|
|
18687
|
+
[attr.tabindex]="activeId() === s.id ? 0 : -1"
|
|
18688
|
+
[attr.title]="s.labelKey | translate"
|
|
18689
|
+
(click)="select(s.id)"
|
|
18690
|
+
>
|
|
18691
|
+
@if (s.icon) {
|
|
18692
|
+
<span class="pi {{ s.icon }} ds__tab-ico" aria-hidden="true"></span>
|
|
18693
|
+
}
|
|
18694
|
+
<span class="ds__tab-label">{{ s.labelKey | translate }}</span>
|
|
18695
|
+
</button>
|
|
18696
|
+
}
|
|
18697
|
+
</div>
|
|
18698
|
+
}
|
|
18699
|
+
</aside>
|
|
18700
|
+
|
|
18701
|
+
<div
|
|
18702
|
+
class="ds__panel"
|
|
18703
|
+
[id]="panelId()"
|
|
18704
|
+
[attr.role]="sections().length ? 'tabpanel' : null"
|
|
18705
|
+
[attr.aria-labelledby]="activeId() ? tabId(activeId()!) : null"
|
|
18706
|
+
>
|
|
18707
|
+
<ng-content />
|
|
18708
|
+
</div>
|
|
18709
|
+
</div>
|
|
18710
|
+
`, isInline: true, styles: [":host{display:block}.ds__layout{display:grid;grid-template-columns:var(--fly-detail-aside, 300px) minmax(0,1fr);gap:var(--sp-4);align-items:start}.ds__aside{display:flex;flex-direction:column;gap:var(--sp-4);min-width:0}.ds__aside .ds__rail{order:-1}.ds__pinned{display:flex;flex-direction:column;gap:var(--sp-4);min-width:0}.ds__panel{display:flex;flex-direction:column;gap:var(--sp-4);min-width:0;align-self:stretch}.ds__panel>:only-child{flex:1}.ds__rail{display:flex;flex-direction:column;gap:var(--sp-1);padding:var(--sp-2);background:var(--bg-2);border:1px solid var(--line);border-radius:var(--r-lg);box-shadow:var(--shadow-card)}.ds__tab{display:flex;align-items:center;gap:var(--sp-3);width:100%;padding:var(--sp-2);border:0;background:transparent;border-radius:var(--r-md);color:var(--ink-2);cursor:pointer;font-family:inherit;font-size:var(--text-sm);text-align:start;white-space:nowrap;overflow:hidden;transition:background var(--t-state),color var(--t-state)}.ds__tab:hover{background:var(--bg-hover);color:var(--ink)}.ds__tab:focus-visible{outline:2px solid var(--focus-ring);outline-offset:2px}.ds__tab--active{background:var(--accent-fill);color:var(--on-accent-fill);font-weight:var(--fw-semibold)}.ds__tab-ico{font-size:var(--text-md);flex-shrink:0;width:20px;text-align:center}.ds__tab-label{min-width:0;overflow:hidden;text-overflow:ellipsis}@media(max-width:980px){.ds__layout{grid-template-columns:minmax(0,1fr)}.ds__rail{flex-direction:row;flex-wrap:wrap}.ds__tab{width:auto}}\n"], dependencies: [{ kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
18711
|
+
}
|
|
18712
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: FlyDetailShellComponent, decorators: [{
|
|
18713
|
+
type: Component,
|
|
18714
|
+
args: [{ selector: 'fly-detail-shell', standalone: true, imports: [TranslatePipe], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
18715
|
+
<div class="ds__layout">
|
|
18716
|
+
<aside class="ds__aside">
|
|
18717
|
+
<div class="ds__pinned">
|
|
18718
|
+
<ng-content select="[detail-aside]" />
|
|
18719
|
+
</div>
|
|
18720
|
+
|
|
18721
|
+
@if (sections().length > 0) {
|
|
18722
|
+
<div
|
|
18723
|
+
#rail
|
|
18724
|
+
class="ds__rail"
|
|
18725
|
+
role="tablist"
|
|
18726
|
+
tabindex="-1"
|
|
18727
|
+
[attr.aria-orientation]="'vertical'"
|
|
18728
|
+
[attr.aria-label]="sectionsLabelKey() | translate"
|
|
18729
|
+
(keydown)="onKey($event)"
|
|
18730
|
+
>
|
|
18731
|
+
@for (s of sections(); track s.id) {
|
|
18732
|
+
<button
|
|
18733
|
+
type="button"
|
|
18734
|
+
class="ds__tab"
|
|
18735
|
+
role="tab"
|
|
18736
|
+
[id]="tabId(s.id)"
|
|
18737
|
+
[class.ds__tab--active]="activeId() === s.id"
|
|
18738
|
+
[attr.aria-selected]="activeId() === s.id"
|
|
18739
|
+
[attr.aria-controls]="panelId()"
|
|
18740
|
+
[attr.tabindex]="activeId() === s.id ? 0 : -1"
|
|
18741
|
+
[attr.title]="s.labelKey | translate"
|
|
18742
|
+
(click)="select(s.id)"
|
|
18743
|
+
>
|
|
18744
|
+
@if (s.icon) {
|
|
18745
|
+
<span class="pi {{ s.icon }} ds__tab-ico" aria-hidden="true"></span>
|
|
18746
|
+
}
|
|
18747
|
+
<span class="ds__tab-label">{{ s.labelKey | translate }}</span>
|
|
18748
|
+
</button>
|
|
18749
|
+
}
|
|
18750
|
+
</div>
|
|
18751
|
+
}
|
|
18752
|
+
</aside>
|
|
18753
|
+
|
|
18754
|
+
<div
|
|
18755
|
+
class="ds__panel"
|
|
18756
|
+
[id]="panelId()"
|
|
18757
|
+
[attr.role]="sections().length ? 'tabpanel' : null"
|
|
18758
|
+
[attr.aria-labelledby]="activeId() ? tabId(activeId()!) : null"
|
|
18759
|
+
>
|
|
18760
|
+
<ng-content />
|
|
18761
|
+
</div>
|
|
18762
|
+
</div>
|
|
18763
|
+
`, styles: [":host{display:block}.ds__layout{display:grid;grid-template-columns:var(--fly-detail-aside, 300px) minmax(0,1fr);gap:var(--sp-4);align-items:start}.ds__aside{display:flex;flex-direction:column;gap:var(--sp-4);min-width:0}.ds__aside .ds__rail{order:-1}.ds__pinned{display:flex;flex-direction:column;gap:var(--sp-4);min-width:0}.ds__panel{display:flex;flex-direction:column;gap:var(--sp-4);min-width:0;align-self:stretch}.ds__panel>:only-child{flex:1}.ds__rail{display:flex;flex-direction:column;gap:var(--sp-1);padding:var(--sp-2);background:var(--bg-2);border:1px solid var(--line);border-radius:var(--r-lg);box-shadow:var(--shadow-card)}.ds__tab{display:flex;align-items:center;gap:var(--sp-3);width:100%;padding:var(--sp-2);border:0;background:transparent;border-radius:var(--r-md);color:var(--ink-2);cursor:pointer;font-family:inherit;font-size:var(--text-sm);text-align:start;white-space:nowrap;overflow:hidden;transition:background var(--t-state),color var(--t-state)}.ds__tab:hover{background:var(--bg-hover);color:var(--ink)}.ds__tab:focus-visible{outline:2px solid var(--focus-ring);outline-offset:2px}.ds__tab--active{background:var(--accent-fill);color:var(--on-accent-fill);font-weight:var(--fw-semibold)}.ds__tab-ico{font-size:var(--text-md);flex-shrink:0;width:20px;text-align:center}.ds__tab-label{min-width:0;overflow:hidden;text-overflow:ellipsis}@media(max-width:980px){.ds__layout{grid-template-columns:minmax(0,1fr)}.ds__rail{flex-direction:row;flex-wrap:wrap}.ds__tab{width:auto}}\n"] }]
|
|
18764
|
+
}], propDecorators: { rail: [{ type: i0.ViewChild, args: ['rail', { isSignal: true }] }], sections: [{ type: i0.Input, args: [{ isSignal: true, alias: "sections", required: false }] }], selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: false }] }, { type: i0.Output, args: ["selectedChange"] }], sectionsLabelKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "sectionsLabelKey", required: false }] }] } });
|
|
18765
|
+
|
|
18464
18766
|
/** Every module across every section, in visual order. */
|
|
18465
18767
|
function flattenModules(sections) {
|
|
18466
18768
|
return sections.flatMap(s => s.modules);
|
|
@@ -18694,31 +18996,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImpo
|
|
|
18694
18996
|
args: [{ selector: 'fly-app-topbar', standalone: true, imports: [TranslatePipe, FlyClickOutsideDirective, NgTemplateOutlet], changeDetection: ChangeDetectionStrategy.OnPush, host: { '(document:keydown.escape)': 'onEscape()' }, template: "<header class=\"fly-topbar\">\r\n <div class=\"fly-topbar__lead\">\r\n <button\r\n type=\"button\"\r\n class=\"fly-topbar__brand\"\r\n (click)=\"brandSelected.emit()\"\r\n [attr.aria-label]=\"brandAriaLabel()\"\r\n >\r\n <span class=\"fly-topbar__brand-mark\"><ng-content select=\"[app-topbar-brand]\" /></span>\r\n @if (brandLabelKey(); as key) {\r\n <span class=\"fly-topbar__brand-name\">{{ key | translate }}</span>\r\n }\r\n </button>\r\n\r\n @if (activeModule()) {\r\n <span class=\"fly-topbar__sep\" aria-hidden=\"true\">/</span>\r\n }\r\n\r\n <div class=\"fly-topbar__anchor\" (flyClickOutside)=\"close()\" [flyClickOutsideEnabled]=\"open()\">\r\n <button\r\n #trigger\r\n type=\"button\"\r\n class=\"fly-topbar__module\"\r\n [class.fly-topbar__module--on]=\"open()\"\r\n (click)=\"toggle()\"\r\n (keydown)=\"onTriggerKeydown($event)\"\r\n aria-haspopup=\"menu\"\r\n [attr.aria-expanded]=\"open()\"\r\n [attr.aria-label]=\"switchAriaLabel()\"\r\n >\r\n @if (activeModule(); as active) {\r\n <span class=\"fly-topbar__module-icon\">\r\n @if (iconFor(active.key); as tpl) {\r\n <ng-container *ngTemplateOutlet=\"tpl\" />\r\n } @else if (active.iconClass) {\r\n <i [class]=\"active.iconClass\" aria-hidden=\"true\"></i>\r\n }\r\n </span>\r\n <span class=\"fly-topbar__module-label\">{{ active.labelKey | translate }}</span>\r\n } @else {\r\n <span class=\"fly-topbar__module-label fly-topbar__module-label--empty\">\r\n {{ 'ui.nav.selectModule' | translate }}\r\n </span>\r\n }\r\n <svg class=\"fly-topbar__chevron\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n aria-hidden=\"true\">\r\n <polyline points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n </button>\r\n\r\n @if (open()) {\r\n <div class=\"fly-topbar__pop\" role=\"menu\" [attr.aria-label]=\"switchAriaLabel()\">\r\n <div class=\"fly-topbar__cols\">\r\n @for (section of sections(); track $index) {\r\n <div class=\"fly-topbar__col\">\r\n @if (section.titleKey; as titleKey) {\r\n <div class=\"fly-topbar__col-title\">{{ titleKey | translate }}</div>\r\n }\r\n @for (mod of section.modules; track mod.key) {\r\n <button\r\n #row\r\n type=\"button\"\r\n class=\"fly-topbar__item\"\r\n [class.fly-topbar__item--on]=\"mod.key === activeKey()\"\r\n role=\"menuitem\"\r\n [disabled]=\"mod.disabled ?? false\"\r\n [attr.tabindex]=\"indexOf(mod) === focusIndex() ? 0 : -1\"\r\n [attr.aria-current]=\"mod.key === activeKey() ? 'page' : null\"\r\n (click)=\"select(mod)\"\r\n (keydown)=\"onRowKeydown($event)\"\r\n >\r\n <span class=\"fly-topbar__item-icon\">\r\n @if (iconFor(mod.key); as tpl) {\r\n <ng-container *ngTemplateOutlet=\"tpl\" />\r\n } @else if (mod.iconClass) {\r\n <i [class]=\"mod.iconClass\" aria-hidden=\"true\"></i>\r\n }\r\n </span>\r\n <span class=\"fly-topbar__item-main\">\r\n <span class=\"fly-topbar__item-label\">{{ mod.labelKey | translate }}</span>\r\n @if (mod.descKey; as descKey) {\r\n <span class=\"fly-topbar__item-desc\">{{ descKey | translate }}</span>\r\n }\r\n </span>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n @if (footerLabel()) {\r\n <div class=\"fly-topbar__foot\">{{ footerLabel() }}</div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div class=\"fly-topbar__actions\"><ng-content select=\"[app-topbar-actions]\" /></div>\r\n</header>\r\n", styles: [":host{display:block;position:relative;z-index:var(--z-sticky)}.fly-topbar{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-3);padding:var(--sp-2) var(--sp-3);border-block-end:1px solid var(--line);background:var(--bg-3)}.fly-topbar__lead{display:flex;align-items:center;gap:var(--sp-2);min-inline-size:0}.fly-topbar__brand,.fly-topbar__module{display:inline-flex;align-items:center;gap:var(--sp-2);appearance:none;border:0;background:transparent;cursor:pointer;font:inherit;color:var(--ink);padding:var(--sp-1) var(--sp-2);border-radius:var(--r-md);transition:background var(--t-state)}.fly-topbar__brand:hover,.fly-topbar__module:hover{background:var(--bg-hover)}.fly-topbar__brand:focus-visible,.fly-topbar__module:focus-visible{outline:2px solid var(--focus-ring);outline-offset:2px}.fly-topbar__brand-name{font-weight:var(--fw-semibold);white-space:nowrap}.fly-topbar__brand-mark{display:inline-flex;align-items:center;max-block-size:var(--icon-lg)}.fly-topbar__sep{color:var(--ink-4);-webkit-user-select:none;user-select:none}.fly-topbar__module{min-inline-size:0}.fly-topbar__module--on{background:var(--bg-hover)}.fly-topbar__module-label{font-weight:var(--fw-medium);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fly-topbar__module-label--empty{color:var(--ink-3)}.fly-topbar__module-icon,.fly-topbar__item-icon{display:inline-flex;align-items:center;justify-content:center;inline-size:var(--icon-md);block-size:var(--icon-md);flex:0 0 auto;color:var(--accent)}.fly-topbar__chevron{flex:0 0 auto;color:var(--ink-3);transition:transform var(--t-state)}.fly-topbar__module--on .fly-topbar__chevron{transform:rotate(180deg)}.fly-topbar__anchor{position:relative}.fly-topbar__pop{position:absolute;inset-block-start:calc(100% + var(--sp-1));inset-inline-start:0;z-index:var(--z-overlay);min-inline-size:260px;max-inline-size:min(680px,92vw);padding:var(--sp-3);border:1px solid var(--line);border-radius:var(--r-lg);background:var(--bg-2);box-shadow:var(--shadow-panel)}.fly-topbar__cols{display:flex;gap:var(--sp-4);align-items:flex-start}@media(width<=720px){.fly-topbar__cols{flex-direction:column;gap:var(--sp-3)}}.fly-topbar__col{display:flex;flex-direction:column;gap:2px;min-inline-size:220px;flex:1 1 0}.fly-topbar__col-title{font-size:var(--text-2xs);font-weight:var(--fw-semibold);letter-spacing:var(--tracking-wide);text-transform:uppercase;color:var(--ink-3);padding:var(--sp-2) var(--sp-2) var(--sp-1)}.fly-topbar__item{display:flex;align-items:flex-start;gap:var(--sp-2);inline-size:100%;text-align:start;appearance:none;border:0;background:transparent;cursor:pointer;font:inherit;color:var(--ink);padding:var(--sp-2);border-radius:var(--r-md);transition:background var(--t-state)}.fly-topbar__item:hover:not(:disabled){background:var(--bg-hover)}.fly-topbar__item:focus-visible{outline:2px solid var(--focus-ring);outline-offset:-2px}.fly-topbar__item:disabled{opacity:.5;cursor:default}.fly-topbar__item--on{background:var(--accent-soft);color:var(--on-accent-soft);box-shadow:inset 2px 0 0 0 var(--accent)}.fly-topbar__item-main{display:flex;flex-direction:column;gap:1px;min-inline-size:0}.fly-topbar__item-label{font-weight:var(--fw-medium);line-height:1.3}.fly-topbar__item-desc{font-size:var(--text-xs);color:var(--ink-3);line-height:1.35}.fly-topbar__foot{margin-block-start:var(--sp-3);padding-block-start:var(--sp-2);border-block-start:1px solid var(--line-3);font-size:var(--text-2xs);color:var(--ink-4)}.fly-topbar__actions{display:flex;align-items:center;gap:var(--sp-2);flex:0 0 auto}@media(forced-colors:active){.fly-topbar__item--on{border-inline-start:2px solid CanvasText}}@media(prefers-reduced-motion:reduce){.fly-topbar__brand,.fly-topbar__module,.fly-topbar__item,.fly-topbar__chevron{transition:none}}\n"] }]
|
|
18695
18997
|
}], ctorParameters: () => [], propDecorators: { brandLabelKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "brandLabelKey", required: false }] }], sections: [{ type: i0.Input, args: [{ isSignal: true, alias: "sections", required: false }] }], activeKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeKey", required: false }] }], footerLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "footerLabel", required: false }] }], moduleSelected: [{ type: i0.Output, args: ["moduleSelected"] }], brandSelected: [{ type: i0.Output, args: ["brandSelected"] }], icons: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => FlyModuleIconDirective), { isSignal: true }] }], rows: [{ type: i0.ViewChildren, args: ['row', { isSignal: true }] }], trigger: [{ type: i0.ViewChildren, args: ['trigger', { isSignal: true }] }] } });
|
|
18696
18998
|
|
|
18697
|
-
/**
|
|
18698
|
-
* Roving-focus target for a radiogroup keydown. Pure so the wrap-around and
|
|
18699
|
-
* RTL mirroring are unit-testable without the DOM.
|
|
18700
|
-
*
|
|
18701
|
-
* - ArrowRight/ArrowDown advance, ArrowLeft/ArrowUp go back — horizontal
|
|
18702
|
-
* arrows mirror under RTL (visual "right" stays visual "right").
|
|
18703
|
-
* - Home/End jump to the edges.
|
|
18704
|
-
* - Returns null for any other key (caller must not preventDefault).
|
|
18705
|
-
* - With no current selection (current < 0) navigation starts from index 0.
|
|
18706
|
-
*/
|
|
18707
|
-
function nextSegmentIndex(current, key, length, rtl) {
|
|
18708
|
-
if (length === 0)
|
|
18709
|
-
return null;
|
|
18710
|
-
if (key === 'Home')
|
|
18711
|
-
return 0;
|
|
18712
|
-
if (key === 'End')
|
|
18713
|
-
return length - 1;
|
|
18714
|
-
const forward = key === 'ArrowDown' || key === (rtl ? 'ArrowLeft' : 'ArrowRight');
|
|
18715
|
-
const backward = key === 'ArrowUp' || key === (rtl ? 'ArrowRight' : 'ArrowLeft');
|
|
18716
|
-
if (!forward && !backward)
|
|
18717
|
-
return null;
|
|
18718
|
-
const base = current < 0 ? 0 : current;
|
|
18719
|
-
return forward ? (base + 1) % length : (base - 1 + length) % length;
|
|
18720
|
-
}
|
|
18721
|
-
|
|
18722
18999
|
/**
|
|
18723
19000
|
* Resolve which tab is active: the selected id when it exists in the tab set,
|
|
18724
19001
|
* otherwise the first tab (or null with no tabs). Pure so the fallback rules
|
|
@@ -20947,5 +21224,5 @@ const AUDIENCE_ERROR_CODES = {
|
|
|
20947
21224
|
* Generated bundle index. Do not edit.
|
|
20948
21225
|
*/
|
|
20949
21226
|
|
|
20950
|
-
export { AGENT_DRAG_MIME, AGENT_PAYLOAD_VERSION, APP_LOOKUP, AUDIENCE_ERROR_CODES, AUDIENCE_LIMITS, AUDIENCE_PRESETS, AUDIENCE_TERM_KINDS, AgentActionBus, AgentActionUnsupportedDispatchError, AgentCommandRegistry, AgentDropRegistry, AgentFlightAnimator, AgentLookupRegistry, AgentPayloadOversizeError, AudienceBuilderComponent, AuthService, BilingualFieldComponent, CRON_MODES, CRON_WEEKDAYS, ContextMenuComponent, DEFAULT_AGENT_PAYLOAD_LIMITS, DEFAULT_FLY_THEME_MODE, DS_BASELINE_LOCALES, DashboardKpiComponent, DialogResult, EntityLookupComponent, FLYOS_LAUNCH_EVENT, FLYOS_LAUNCH_REQUEST_EVENT, FLYOS_REMOTE_ROUTE_EVENT, FLY_ACCENT_PROPERTY, FLY_ADMIN_ROLES, FLY_CHUNK_RELOAD_FLAG, FLY_COMPACT_THRESHOLD, FLY_COUNTRIES, FLY_EMOJI_BY_ID, FLY_EMOJI_CATEGORIES, FLY_EMOJI_CATEGORY_BY_ID, FLY_EMOJI_DEFAULT_CATEGORIES, FLY_EMOJI_PACK, FLY_EMOJI_PACK_MISSING_MESSAGE, FLY_EMOJI_PREVIEW_COUNT, FLY_EMPTY_VALUE, FLY_LOCALE_CATALOG, FLY_NF_CACHE_HEAL_FLAG, FLY_RELOAD_DEBOUNCE_MS, FLY_REMOTE_BASE_PATH, FLY_REMOTE_CONTEXT_EVENT, FLY_REMOTE_CONTEXT_STORE_KEY, FLY_REMOTE_ROUTES, FLY_SEARCH_DEBOUNCE_MS, FLY_SKIN_TONES, FLY_STANDALONE_AUTH_CONFIG, FLY_THEME_MODE_IDS, FLY_WINDOW_HELP_HINT_EVENT, FLY_WINDOW_PAGE_TITLE_EVENT, FlyAchievementProgressComponent, FlyActionMenuComponent, FlyActionStackComponent, FlyAgentDraggableDirective, FlyAnimatedEmojiComponent, FlyAppTopbarComponent, FlyAuthLiveRefresh, FlyBadgeWallComponent, FlyBlockUiComponent, FlyBreadcrumbComponent, FlyButtonComponent, FlyBytesPipe, FlyCaptchaComponent, FlyCardActionsComponent, FlyCardBodyComponent, FlyCardComponent, FlyCardFooterComponent, FlyCardGridComponent, FlyCardMediaComponent, FlyCardMetaComponent, FlyCardStatusComponent, FlyCardTitleComponent, FlyCellDirective, FlyCheckboxComponent, FlyChipComponent, FlyChunkReloadErrorHandler, FlyClickOutsideDirective, FlyCollapsibleComponent, FlyCommentThreadComponent, FlyCompactNumberPipe, FlyConfirmDialogComponent, FlyControlDirective, FlyCronBuilderComponent, FlyDataTableComponent, FlyDatePipe, FlyDateTimePipe, FlyDebouncer, FlyDecimalNumberPipe, FlyDrawerComponent, FlyDurationPipe, FlyDynamicFormComponent, FlyEmojiPickerComponent, FlyFieldComponent, FlyFileUploadComponent, FlyFilterPanelComponent, FlyFormBannerComponent, FlyFormFooterComponent, FlyFormGridComponent, FlyFormSectionComponent, FlyFullNumberPipe, FlyGanttComponent, FlyHubClient, FlyIconButtonComponent, FlyIfAdminDirective, FlyIfRoleDirective, FlyImageUploadComponent, FlyLeaderboardComponent, FlyMetaListComponent, FlyModalComponent, FlyModerationQueueComponent, FlyModuleIconDirective, FlyPaginationComponent, FlyPeoplePickerComponent, FlyPointsTierComponent, FlyProgressComponent, FlyRelativeTimePipe, FlyRemoteContextService, FlyRemoteRouter, FlyRemoteRouterOutletComponent, FlySearchInputComponent, FlySectionHeaderComponent, FlySecureSrcDirective, FlySegmentedComponent, FlySelectComponent, FlySkeletonComponent, FlySliderComponent, FlySparklineComponent, FlySpinnerComponent, FlyStandaloneAuthCallbackComponent, FlyStandaloneAuthService, FlyStateMessageComponent, FlyDynamicFormComponent as FlySurveyFormComponent, FlyTabComponent, FlyTabsComponent, FlyTagsInputComponent, FlyThemeService, FlyTimePipe, FlyToastService, FlyToggleComponent, FlyTooltipDirective, FlyTreeNavComponent, FlyTypeaheadComponent, FlyWindowHelpService, FlyWindowTitleService, FlyosPendingLaunchesGlobalKey, FlyosShellHandlesLaunchRequestsGlobalKey, FlyosShellOwnsHistoryGlobalKey, GANTT_ZOOMS, I18nService, LAUNCH_CONTEXT, MessageBoxButtons, MessageBoxComponent, MessageBoxIcon, MessageBoxService, MockAuthService, OverlayStack, PRESENCE_COLORS, PageHeaderComponent, RTL_LOCALE_SET, SHARE_ORG_CHART_SYSTEM_KEY_APPS, SHARE_ORG_CHART_SYSTEM_KEY_DEFAULT, SHARE_PANEL_DEFAULT_FILE_LEVELS, STATE_DEFAULT_ICONS, STATE_DEFAULT_MESSAGE_KEYS, STEP_UP_CODE, STEP_UP_REAUTH_HANDLER, STEP_UP_RETURN_KEY, SUPPORTED_AGENT_PAYLOAD_VERSIONS, SharePanelComponent, SourceAppResolver, StandaloneWindowManagerService, StatusBadgeComponent, StepUpService, ToastHostComponent, TranslatePipe, WINDOW_DATA, WINDOW_HELP_HINT, WindowManagerService, applySkinTone, applySuggestion, ariaSort, buildCron, canConfirm, canGoNext, canGoPrev, captureFocus, clampPage, clampSliderValue, connectRemoteLaunch, enterActivatesNatively, filterGroup, filterSuggestions, findLocaleByDialect, findLocaleByPrefix, firstEnabledIndex, firstModuleIndex, flattenModules, flyAdminGuard, flyCaptchaBase64Utf8, flyCaptchaBuildToken, flyCaptchaSha256Hex, flyCompactNumber, flyDebounced, flyDecimalNumber, flyDownloadBlob, flyDuration, flyEmojiFor, flyEmojiIsTonable, flyEmojiPackUrl, flyExportFileName, flyFirstEnabledIndex, flyFormatBytes, flyFormatDate, flyFormatDateTime, flyFormatTime, flyFullNumber, flyNextEnabledIndex, flyNextSegmentIndex, flyRelativeTime, flyResolveActiveTab, flyRoleGuard, flySignedCompact, flySkinToneLabelKey, flyStandaloneAuthGuard, flyStandaloneAuthInterceptor, flyToDateOnly, hasAnyRoleIn, healNativeFederationCacheOnce, isAccentColor, isChunkLoadError, isFlyAuthStorePopulated, isNativeFederationCacheError, isRtlLocale, isRtlLocaleEntry, isValidCron, isValidSingleField, loadRemoteStyles, matchFlyRoutePattern, nextEnabledIndex, nextModuleIndex, nextSegmentIndex, nextSort, normalizeFlyTheme, normalizeRoles, overlayStack, parseCron, parseStepUpChallenge, parseTags, presenceColorFor, printConsoleSecurityWarning, provideFlyChunkReloadRecovery, provideFlyEmojiPack, provideFlyStandaloneAuth, reloadOnceForChunkError, requestAppLaunch, resolveActiveModule, resolveActiveTab, resolveCellValue, resolveStateIcon, resolveStateMessageKey, restoreFocus, sameTags, sliderTrackGradient, sparklinePath, sparklinePoints, stepUpInterceptor, stepUpReturnKey, trimAgentPayload, trimAgentString, unloadRemoteStyles, utf8ByteLength, validateAgentPayload, warnIfEmbeddedSessionMissing };
|
|
21227
|
+
export { AGENT_DRAG_MIME, AGENT_PAYLOAD_VERSION, APP_LOOKUP, AUDIENCE_ERROR_CODES, AUDIENCE_LIMITS, AUDIENCE_PRESETS, AUDIENCE_TERM_KINDS, AgentActionBus, AgentActionUnsupportedDispatchError, AgentCommandRegistry, AgentDropRegistry, AgentFlightAnimator, AgentLookupRegistry, AgentPayloadOversizeError, AudienceBuilderComponent, AuthService, BilingualFieldComponent, CRON_MODES, CRON_WEEKDAYS, ContextMenuComponent, DEFAULT_AGENT_PAYLOAD_LIMITS, DEFAULT_FLY_THEME_MODE, DS_BASELINE_LOCALES, DashboardKpiComponent, DialogResult, EntityLookupComponent, FLYOS_LAUNCH_EVENT, FLYOS_LAUNCH_REQUEST_EVENT, FLYOS_REMOTE_ROUTE_EVENT, FLY_ACCENT_PROPERTY, FLY_ADMIN_ROLES, FLY_CHUNK_RELOAD_FLAG, FLY_COMPACT_THRESHOLD, FLY_COUNTRIES, FLY_EMOJI_BY_ID, FLY_EMOJI_CATEGORIES, FLY_EMOJI_CATEGORY_BY_ID, FLY_EMOJI_DEFAULT_CATEGORIES, FLY_EMOJI_PACK, FLY_EMOJI_PACK_MISSING_MESSAGE, FLY_EMOJI_PREVIEW_COUNT, FLY_EMPTY_VALUE, FLY_LOCALE_CATALOG, FLY_NF_CACHE_HEAL_FLAG, FLY_RELOAD_DEBOUNCE_MS, FLY_REMOTE_BASE_PATH, FLY_REMOTE_CONTEXT_EVENT, FLY_REMOTE_CONTEXT_STORE_KEY, FLY_REMOTE_ROUTES, FLY_SEARCH_DEBOUNCE_MS, FLY_SKIN_TONES, FLY_STANDALONE_AUTH_CONFIG, FLY_THEME_MODE_IDS, FLY_WINDOW_HELP_HINT_EVENT, FLY_WINDOW_PAGE_TITLE_EVENT, FlyAchievementProgressComponent, FlyActionMenuComponent, FlyActionStackComponent, FlyAgentDraggableDirective, FlyAnimatedEmojiComponent, FlyAppTopbarComponent, FlyAuthLiveRefresh, FlyBadgeWallComponent, FlyBlockUiComponent, FlyBreadcrumbComponent, FlyButtonComponent, FlyBytesPipe, FlyCaptchaComponent, FlyCardActionsComponent, FlyCardBodyComponent, FlyCardComponent, FlyCardFooterComponent, FlyCardGridComponent, FlyCardMediaComponent, FlyCardMetaComponent, FlyCardStatusComponent, FlyCardTitleComponent, FlyCellDirective, FlyCheckboxComponent, FlyChipComponent, FlyChunkReloadErrorHandler, FlyClickOutsideDirective, FlyCollapsibleComponent, FlyCommentThreadComponent, FlyCompactNumberPipe, FlyConfirmDialogComponent, FlyControlDirective, FlyCronBuilderComponent, FlyDataTableComponent, FlyDatePipe, FlyDateTimePipe, FlyDebouncer, FlyDecimalNumberPipe, FlyDetailCardComponent, FlyDetailShellComponent, FlyDrawerComponent, FlyDurationPipe, FlyDynamicFormComponent, FlyEmojiPickerComponent, FlyFieldComponent, FlyFileUploadComponent, FlyFilterPanelComponent, FlyFormBannerComponent, FlyFormFooterComponent, FlyFormGridComponent, FlyFormSectionComponent, FlyFullNumberPipe, FlyGanttComponent, FlyHubClient, FlyIconButtonComponent, FlyIfAdminDirective, FlyIfRoleDirective, FlyImageUploadComponent, FlyLeaderboardComponent, FlyMetaListComponent, FlyModalComponent, FlyModerationQueueComponent, FlyModuleIconDirective, FlyPaginationComponent, FlyPeoplePickerComponent, FlyPointsTierComponent, FlyProgressComponent, FlyRelativeTimePipe, FlyRemoteContextService, FlyRemoteRouter, FlyRemoteRouterOutletComponent, FlySearchInputComponent, FlySectionHeaderComponent, FlySecureSrcDirective, FlySegmentedComponent, FlySelectComponent, FlySkeletonComponent, FlySliderComponent, FlySparklineComponent, FlySpinnerComponent, FlyStandaloneAuthCallbackComponent, FlyStandaloneAuthService, FlyStateMessageComponent, FlyDynamicFormComponent as FlySurveyFormComponent, FlyTabComponent, FlyTabsComponent, FlyTagsInputComponent, FlyThemeService, FlyTimePipe, FlyToastService, FlyToggleComponent, FlyTooltipDirective, FlyTreeNavComponent, FlyTypeaheadComponent, FlyWindowHelpService, FlyWindowTitleService, FlyosPendingLaunchesGlobalKey, FlyosShellHandlesLaunchRequestsGlobalKey, FlyosShellOwnsHistoryGlobalKey, GANTT_ZOOMS, I18nService, LAUNCH_CONTEXT, MessageBoxButtons, MessageBoxComponent, MessageBoxIcon, MessageBoxService, MockAuthService, OverlayStack, PRESENCE_COLORS, PageHeaderComponent, RTL_LOCALE_SET, SHARE_ORG_CHART_SYSTEM_KEY_APPS, SHARE_ORG_CHART_SYSTEM_KEY_DEFAULT, SHARE_PANEL_DEFAULT_FILE_LEVELS, STATE_DEFAULT_ICONS, STATE_DEFAULT_MESSAGE_KEYS, STEP_UP_CODE, STEP_UP_REAUTH_HANDLER, STEP_UP_RETURN_KEY, SUPPORTED_AGENT_PAYLOAD_VERSIONS, SharePanelComponent, SourceAppResolver, StandaloneWindowManagerService, StatusBadgeComponent, StepUpService, ToastHostComponent, TranslatePipe, WINDOW_DATA, WINDOW_HELP_HINT, WindowManagerService, applySkinTone, applySuggestion, ariaSort, buildCron, canConfirm, canGoNext, canGoPrev, captureFocus, clampPage, clampSliderValue, connectRemoteLaunch, enterActivatesNatively, filterGroup, filterSuggestions, findLocaleByDialect, findLocaleByPrefix, firstEnabledIndex, firstModuleIndex, flattenModules, flyAdminGuard, flyCaptchaBase64Utf8, flyCaptchaBuildToken, flyCaptchaSha256Hex, flyCompactNumber, flyDebounced, flyDecimalNumber, flyDownloadBlob, flyDuration, flyEmojiFor, flyEmojiIsTonable, flyEmojiPackUrl, flyExportFileName, flyFirstEnabledIndex, flyFormatBytes, flyFormatDate, flyFormatDateTime, flyFormatTime, flyFullNumber, flyNextEnabledIndex, flyNextSegmentIndex, flyRelativeTime, flyResolveActiveTab, flyRoleGuard, flySignedCompact, flySkinToneLabelKey, flyStandaloneAuthGuard, flyStandaloneAuthInterceptor, flyToDateOnly, hasAnyRoleIn, healNativeFederationCacheOnce, isAccentColor, isChunkLoadError, isFlyAuthStorePopulated, isNativeFederationCacheError, isRtlLocale, isRtlLocaleEntry, isValidCron, isValidSingleField, loadRemoteStyles, matchFlyRoutePattern, nextEnabledIndex, nextModuleIndex, nextSegmentIndex, nextSort, normalizeFlyTheme, normalizeRoles, overlayStack, parseCron, parseStepUpChallenge, parseTags, presenceColorFor, printConsoleSecurityWarning, provideFlyChunkReloadRecovery, provideFlyEmojiPack, provideFlyStandaloneAuth, reloadOnceForChunkError, requestAppLaunch, resolveActiveModule, resolveActiveSection, resolveActiveTab, resolveCellValue, resolveStateIcon, resolveStateMessageKey, restoreFocus, sameTags, sliderTrackGradient, sparklinePath, sparklinePoints, stepUpInterceptor, stepUpReturnKey, trimAgentPayload, trimAgentString, unloadRemoteStyles, utf8ByteLength, validateAgentPayload, warnIfEmbeddedSessionMissing };
|
|
20951
21228
|
//# sourceMappingURL=flyos-design-system.mjs.map
|