@flyos/design-system 1.4.0 → 1.6.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 +314 -160
- 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 +202 -9
- package/types/flyos-design-system.d.ts.map +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { InjectionToken, signal, computed, Injectable, inject, TemplateRef, ViewContainerRef, effect, Input, Directive, ErrorHandler, isDevMode, Pipe, ChangeDetectionStrategy, Component, makeEnvironmentProviders, provideAppInitializer, PLATFORM_ID, DestroyRef, ElementRef, input, output, afterNextRender, HostListener, ViewChild, NgZone, viewChild, DOCUMENT as DOCUMENT$1, EventEmitter, Output, forwardRef, model, viewChildren, untracked, Injector, ViewEncapsulation, Renderer2, contentChildren, contentChild } from '@angular/core';
|
|
3
|
-
import { catchError, throwError, Subject, from, firstValueFrom, of, Observable, map, ReplaySubject, retry, timer } from 'rxjs';
|
|
3
|
+
import { catchError, throwError, Subject, from, firstValueFrom, of, Observable, map, ReplaySubject, retry, timer, tap } from 'rxjs';
|
|
4
4
|
import { HttpClient, HttpParams, HttpHeaders, HttpErrorResponse, HttpEventType } from '@angular/common/http';
|
|
5
5
|
import { switchMap, debounceTime, distinctUntilChanged, filter } from 'rxjs/operators';
|
|
6
6
|
import { HubConnectionBuilder, HttpTransportType, LogLevel, HubConnectionState } from '@microsoft/signalr';
|
|
@@ -48,7 +48,7 @@ import { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';
|
|
|
48
48
|
// tools/publish-library.ps1 at bump time, and asserted by the spec beside this file.
|
|
49
49
|
// Used only for the diagnostic message; the duplicate-instance detection itself is
|
|
50
50
|
// version-agnostic, so a stale literal misnames a fork rather than hiding one.
|
|
51
|
-
const FLY_DS_VERSION = '1.
|
|
51
|
+
const FLY_DS_VERSION = '1.6.0';
|
|
52
52
|
const FLY_DS_REGISTRY_KEY = '__FLY_DS_INSTANCES__';
|
|
53
53
|
/**
|
|
54
54
|
* Records this design-system instance on the shared `scope` and returns the
|
|
@@ -1207,9 +1207,14 @@ const flyStandaloneAuthGuard = () => {
|
|
|
1207
1207
|
* token — attaching it would exfiltrate the token to whatever host the app happens to call.
|
|
1208
1208
|
*
|
|
1209
1209
|
* Requests that MUST NOT carry the bearer even same-origin: the STS token endpoint (its own client
|
|
1210
|
-
* auth)
|
|
1211
|
-
* cookie)
|
|
1212
|
-
*
|
|
1210
|
+
* auth), the pre-auth BFF endpoints under `/api/{appId}/auth/` (they authenticate via the HttpOnly
|
|
1211
|
+
* cookie), and any path the app declared in `anonymousPaths` (an `[AllowAnonymous]` surface such as
|
|
1212
|
+
* a public portal). The exclusion runs on the origin-NORMALIZED pathname, so an absolute same-origin
|
|
1213
|
+
* URL to the BFF is excluded exactly like its relative spelling.
|
|
1214
|
+
*
|
|
1215
|
+
* The same exclusion governs the 401 handling: a `401` from an excluded path never starts a login.
|
|
1216
|
+
* That matters most for `anonymousPaths` — without it, a stray 401 on a public surface would bounce
|
|
1217
|
+
* an anonymous visitor into a PKCE login they cannot complete.
|
|
1213
1218
|
*
|
|
1214
1219
|
* Ordering: register this AFTER any offline/sample-data interceptor and BEFORE `stepUpInterceptor`
|
|
1215
1220
|
* (a `401 step_up_required` arrives while the session is valid, so this interceptor passes it through
|
|
@@ -1217,8 +1222,11 @@ const flyStandaloneAuthGuard = () => {
|
|
|
1217
1222
|
*/
|
|
1218
1223
|
function flyStandaloneAuthInterceptor(req, next) {
|
|
1219
1224
|
const auth = inject(FlyStandaloneAuthService);
|
|
1220
|
-
const
|
|
1221
|
-
const
|
|
1225
|
+
const config = inject(FLY_STANDALONE_AUTH_CONFIG);
|
|
1226
|
+
const appId = config.appId;
|
|
1227
|
+
// App-declared anonymous surfaces join the built-in pre-auth paths: no bearer, and no
|
|
1228
|
+
// login redirect on a 401 (see `FlyStandaloneAuthConfig.anonymousPaths`).
|
|
1229
|
+
const authPaths = ['/connect/token', `/api/${appId}/auth/`, ...(config.anonymousPaths ?? [])];
|
|
1222
1230
|
// Normalize BEFORE any decision: resolving against the app's own origin collapses a relative URL
|
|
1223
1231
|
// and its absolute same-origin spelling onto one shape, and exposes a foreign origin for what it is.
|
|
1224
1232
|
let sameOrigin = false;
|
|
@@ -9141,11 +9149,11 @@ class FlyBlockUiComponent {
|
|
|
9141
9149
|
return k && k.length > 0 ? k : 'common.loading';
|
|
9142
9150
|
}, ...(ngDevMode ? [{ debugName: "resolvedMessageKey" }] : /* istanbul ignore next */ []));
|
|
9143
9151
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: FlyBlockUiComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
9144
|
-
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()) {\
|
|
9152
|
+
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 });
|
|
9145
9153
|
}
|
|
9146
9154
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: FlyBlockUiComponent, decorators: [{
|
|
9147
9155
|
type: Component,
|
|
9148
|
-
args: [{ selector: 'fly-block-ui', standalone: true, imports: [TranslatePipe], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (active()) {\
|
|
9156
|
+
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"] }]
|
|
9149
9157
|
}], propDecorators: { active: [{ type: i0.Input, args: [{ isSignal: true, alias: "active", required: true }] }], messageKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "messageKey", required: false }] }] } });
|
|
9150
9158
|
|
|
9151
9159
|
/**
|
|
@@ -15032,29 +15040,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImpo
|
|
|
15032
15040
|
args: ['dragstart', ['$event']]
|
|
15033
15041
|
}] } });
|
|
15034
15042
|
|
|
15035
|
-
/**
|
|
15036
|
-
*
|
|
15037
|
-
|
|
15038
|
-
|
|
15039
|
-
|
|
15040
|
-
|
|
15041
|
-
*
|
|
15042
|
-
*
|
|
15043
|
-
|
|
15044
|
-
|
|
15045
|
-
|
|
15046
|
-
const
|
|
15047
|
-
/**
|
|
15048
|
-
* Resolves a `423 Locked` / `SCAN_PENDING` error's `Retry-After` header to a
|
|
15049
|
-
*
|
|
15050
|
-
*
|
|
15051
|
-
*
|
|
15052
|
-
|
|
15053
|
-
|
|
15054
|
-
|
|
15055
|
-
const header = err.headers?.get('Retry-After');
|
|
15043
|
+
/**
|
|
15044
|
+
* Files-Manager answers a fresh (still-scanning) upload with `423 Locked` / `SCAN_PENDING` until
|
|
15045
|
+
* the background virus scan clears it.
|
|
15046
|
+
*/
|
|
15047
|
+
const FLY_SCAN_PENDING_STATUS = 423;
|
|
15048
|
+
/**
|
|
15049
|
+
* Retry budget. The scan usually clears within a few seconds, so six attempts comfortably covers
|
|
15050
|
+
* the common case without hammering the endpoint indefinitely on a stuck scan.
|
|
15051
|
+
*/
|
|
15052
|
+
const FLY_SCAN_PENDING_MAX_RETRIES = 6;
|
|
15053
|
+
/** Fallback delay when the response carries no (or an unparsable) `Retry-After` header. */
|
|
15054
|
+
const FLY_SCAN_PENDING_DEFAULT_DELAY_MS = 2000;
|
|
15055
|
+
/**
|
|
15056
|
+
* Resolves a `423 Locked` / `SCAN_PENDING` error's `Retry-After` header to a delay in
|
|
15057
|
+
* milliseconds. The header is advisory and, per RFC 9110, either a number of seconds or an
|
|
15058
|
+
* HTTP-date — both are handled. Falls back to {@link FLY_SCAN_PENDING_DEFAULT_DELAY_MS} when the
|
|
15059
|
+
* header is missing, unparsable, or already in the past.
|
|
15060
|
+
*/
|
|
15061
|
+
function flyScanPendingDelayMs(err) {
|
|
15062
|
+
const header = err?.headers?.get('Retry-After');
|
|
15056
15063
|
if (!header)
|
|
15057
|
-
return
|
|
15064
|
+
return FLY_SCAN_PENDING_DEFAULT_DELAY_MS;
|
|
15058
15065
|
const seconds = Number(header);
|
|
15059
15066
|
if (Number.isFinite(seconds) && seconds >= 0)
|
|
15060
15067
|
return seconds * 1000;
|
|
@@ -15064,8 +15071,36 @@ function scanPendingDelayMs(err) {
|
|
|
15064
15071
|
if (diff > 0)
|
|
15065
15072
|
return diff;
|
|
15066
15073
|
}
|
|
15067
|
-
return
|
|
15074
|
+
return FLY_SCAN_PENDING_DEFAULT_DELAY_MS;
|
|
15068
15075
|
}
|
|
15076
|
+
/**
|
|
15077
|
+
* Rides out the `423 SCAN_PENDING` window on any authenticated Files-Manager request.
|
|
15078
|
+
*
|
|
15079
|
+
* A file is not readable for the first seconds of its life — Files-Manager holds it at `423` until
|
|
15080
|
+
* the virus scan clears. Without this, the first read after an upload or an export completes just
|
|
15081
|
+
* fails, which is exactly when a user is most likely to click.
|
|
15082
|
+
*
|
|
15083
|
+
* **This honours `Retry-After`.** Every hand-rolled copy of this policy across the platform used a
|
|
15084
|
+
* flat `timer(2000)`, which is both slower than necessary when the server says "200ms" and a
|
|
15085
|
+
* hammer when it says "30s". The header is advisory, so the flat fallback remains for responses
|
|
15086
|
+
* that omit it.
|
|
15087
|
+
*
|
|
15088
|
+
* Only `423` is retried. A terminal outcome — `403 SCAN_INFECTED`, `422 SCAN_FAILED`, `401`, or
|
|
15089
|
+
* anything else — re-throws immediately: the `delay` notifier erroring stops `retry` at once
|
|
15090
|
+
* rather than waiting out the budget.
|
|
15091
|
+
*
|
|
15092
|
+
* @example
|
|
15093
|
+
* this.http.get(url, { responseType: 'blob' }).pipe(flyScanRetry())
|
|
15094
|
+
*/
|
|
15095
|
+
function flyScanRetry(options = {}) {
|
|
15096
|
+
return retry({
|
|
15097
|
+
count: options.count ?? FLY_SCAN_PENDING_MAX_RETRIES,
|
|
15098
|
+
delay: (err) => err?.status === FLY_SCAN_PENDING_STATUS
|
|
15099
|
+
? timer(flyScanPendingDelayMs(err))
|
|
15100
|
+
: throwError(() => err),
|
|
15101
|
+
});
|
|
15102
|
+
}
|
|
15103
|
+
|
|
15069
15104
|
/**
|
|
15070
15105
|
* Renders an authenticated image into a host `<img>` element by fetching the
|
|
15071
15106
|
* resource as a blob through Angular's `HttpClient` and binding the resulting
|
|
@@ -15114,7 +15149,7 @@ function scanPendingDelayMs(err) {
|
|
|
15114
15149
|
* few seconds of its life; the Files Manager download endpoint answers
|
|
15115
15150
|
* `423 Locked` / `SCAN_PENDING` (with an advisory `Retry-After` header) until
|
|
15116
15151
|
* the scan clears. Rather than treating that like a permission error, the
|
|
15117
|
-
* directive retries the fetch — up to {@link
|
|
15152
|
+
* directive retries the fetch — up to {@link FLY_SCAN_PENDING_MAX_RETRIES} times,
|
|
15118
15153
|
* honoring `Retry-After` when present (falling back to a flat 2s) — and swaps
|
|
15119
15154
|
* in the image automatically once the scan reports Clean. This mirrors the
|
|
15120
15155
|
* hand-rolled `retry({ count: 6, delay: … })` policy already used by the
|
|
@@ -15181,12 +15216,7 @@ class FlySecureSrcDirective {
|
|
|
15181
15216
|
// scan clears. Any other error (401/403/404, terminal 403
|
|
15182
15217
|
// SCAN_INFECTED, 422 SCAN_FAILED) re-throws immediately — the `delay`
|
|
15183
15218
|
// notifier erroring stops `retry` right away without waiting.
|
|
15184
|
-
|
|
15185
|
-
count: SCAN_PENDING_MAX_RETRIES,
|
|
15186
|
-
delay: (err) => err?.status === SCAN_PENDING_STATUS
|
|
15187
|
-
? timer(scanPendingDelayMs(err))
|
|
15188
|
-
: throwError(() => err),
|
|
15189
|
-
}))
|
|
15219
|
+
flyScanRetry())
|
|
15190
15220
|
.subscribe({
|
|
15191
15221
|
next: (blob) => {
|
|
15192
15222
|
const objectUrl = URL.createObjectURL(blob);
|
|
@@ -16721,11 +16751,11 @@ class FlyPeoplePickerComponent {
|
|
|
16721
16751
|
this.selectionChange.emit(this._selected().map((o) => o.id));
|
|
16722
16752
|
}
|
|
16723
16753
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: FlyPeoplePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
16724
|
-
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) {\
|
|
16754
|
+
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 });
|
|
16725
16755
|
}
|
|
16726
16756
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: FlyPeoplePickerComponent, decorators: [{
|
|
16727
16757
|
type: Component,
|
|
16728
|
-
args: [{ selector: 'fly-people-picker', standalone: true, imports: [CommonModule, TranslatePipe, FlyTypeaheadComponent], changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'fly-people-picker' }, template: "@if (selected().length > 0) {\
|
|
16758
|
+
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"] }]
|
|
16729
16759
|
}], 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: [{
|
|
16730
16760
|
type: ViewChild,
|
|
16731
16761
|
args: [FlyTypeaheadComponent]
|
|
@@ -17320,6 +17350,130 @@ function flyExportFileName(contentDisposition, fallback) {
|
|
|
17320
17350
|
}
|
|
17321
17351
|
}
|
|
17322
17352
|
|
|
17353
|
+
/**
|
|
17354
|
+
* Downloads a Files-Manager file through the authenticated `HttpClient` and hands it to the
|
|
17355
|
+
* browser's save dialog.
|
|
17356
|
+
*
|
|
17357
|
+
* **Why this exists rather than an `<a href>`.** `/api/files/{id}/download` is bearer-gated and
|
|
17358
|
+
* Files-Manager exposes no signed or public URL, so a browser-native navigation carries no
|
|
17359
|
+
* `Authorization` header and answers **401**. That is not a hypothetical: three Circles templates
|
|
17360
|
+
* shipped plain `<a href>` download links that were simply broken, Thoughts hit the same 401 on
|
|
17361
|
+
* its story attachments, and in both apps other screens had already hand-rolled the correct blob
|
|
17362
|
+
* fetch inline. The design system shipped the *save* half (`flyDownloadBlob`) and the image-side
|
|
17363
|
+
* *fetch* half (`img[flySecureSrc]`) but nothing for a plain authenticated download, so every app
|
|
17364
|
+
* rediscovered the same 401 and wrote the same fix.
|
|
17365
|
+
*
|
|
17366
|
+
* It also rides out the `423 SCAN_PENDING` window via {@link flyScanRetry}: a freshly-produced
|
|
17367
|
+
* export or upload is still being virus-scanned for the first seconds of its life, which is
|
|
17368
|
+
* exactly when a user clicks.
|
|
17369
|
+
*
|
|
17370
|
+
* @example
|
|
17371
|
+
* private readonly downloads = inject(FlyFileDownloadService);
|
|
17372
|
+
* this.downloads.download(attachment.fileId, attachment.fileName);
|
|
17373
|
+
*/
|
|
17374
|
+
class FlyFileDownloadService {
|
|
17375
|
+
http = inject(HttpClient);
|
|
17376
|
+
/**
|
|
17377
|
+
* Fetches a file and saves it, subscribing internally — the fire-and-forget form for a click
|
|
17378
|
+
* handler that has no state to drive.
|
|
17379
|
+
*
|
|
17380
|
+
* Errors are left to the app's global `HttpClient` error handling. Use {@link fetch} instead
|
|
17381
|
+
* when the caller needs to show a spinner or a per-row failure state.
|
|
17382
|
+
*
|
|
17383
|
+
* @param fileIdOrUrl A bare Files-Manager file id, or a path starting with `/` used verbatim.
|
|
17384
|
+
* @param fileName Name offered to the OS save dialog, extension included.
|
|
17385
|
+
*/
|
|
17386
|
+
download(fileIdOrUrl, fileName) {
|
|
17387
|
+
this.fetch(fileIdOrUrl, fileName).subscribe({
|
|
17388
|
+
// Swallowing here would hide a 403 SCAN_INFECTED behind a button that silently does
|
|
17389
|
+
// nothing; the app's error interceptor is the right place to surface it.
|
|
17390
|
+
error: () => undefined,
|
|
17391
|
+
});
|
|
17392
|
+
}
|
|
17393
|
+
/**
|
|
17394
|
+
* The observable form: emits the blob after saving it, so a caller can drive its own loading
|
|
17395
|
+
* and error state. The save happens on emission — subscribing is what triggers the download.
|
|
17396
|
+
*
|
|
17397
|
+
* @param fileIdOrUrl A bare Files-Manager file id, or a path starting with `/` used verbatim.
|
|
17398
|
+
* @param fileName Name offered to the OS save dialog, extension included.
|
|
17399
|
+
*/
|
|
17400
|
+
fetch(fileIdOrUrl, fileName) {
|
|
17401
|
+
const url = fileIdOrUrl.startsWith('/') ? fileIdOrUrl : `/api/files/${fileIdOrUrl}/download`;
|
|
17402
|
+
return this.http
|
|
17403
|
+
.get(url, { responseType: 'blob' })
|
|
17404
|
+
.pipe(flyScanRetry(), tap((blob) => flyDownloadBlob(blob, fileName)));
|
|
17405
|
+
}
|
|
17406
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: FlyFileDownloadService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
17407
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: FlyFileDownloadService, providedIn: 'root' });
|
|
17408
|
+
}
|
|
17409
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: FlyFileDownloadService, decorators: [{
|
|
17410
|
+
type: Injectable,
|
|
17411
|
+
args: [{ providedIn: 'root' }]
|
|
17412
|
+
}] });
|
|
17413
|
+
|
|
17414
|
+
/**
|
|
17415
|
+
* Unwraps `FlyApiResponse<T>` to its payload, or `null` when the call did not succeed.
|
|
17416
|
+
*
|
|
17417
|
+
* This is the STRICT reading: `success: false` yields `null` even if a partial `data` came with
|
|
17418
|
+
* it. Prefer it. Use {@link flyUnwrapLenient} only against an endpoint that is known to answer
|
|
17419
|
+
* unwrapped.
|
|
17420
|
+
*/
|
|
17421
|
+
function flyUnwrap(res) {
|
|
17422
|
+
return res.success ? res.data ?? null : null;
|
|
17423
|
+
}
|
|
17424
|
+
/**
|
|
17425
|
+
* Unwraps `FlyApiResponse<T>`, tolerating an endpoint that answered UNWRAPPED — i.e. returned the
|
|
17426
|
+
* payload as the whole body with no envelope around it.
|
|
17427
|
+
*
|
|
17428
|
+
* **This is a workaround for a backend that is inconsistent, not a preference.** Every endpoint is
|
|
17429
|
+
* supposed to wrap its payload; a handful do not, and call sites carried a defensive
|
|
17430
|
+
* `res.data ?? res` for them. That expression forced the surrounding chain to `any`, which
|
|
17431
|
+
* silenced the mismatch rather than naming it. This keeps the identical runtime behaviour while
|
|
17432
|
+
* staying typed — but a call site reaching for it is evidence of an endpoint worth fixing, and it
|
|
17433
|
+
* cannot distinguish "unwrapped payload" from "envelope with `success: false`".
|
|
17434
|
+
*/
|
|
17435
|
+
function flyUnwrapLenient(res) {
|
|
17436
|
+
return res.data ?? res;
|
|
17437
|
+
}
|
|
17438
|
+
/**
|
|
17439
|
+
* Normalizes the `FlyApiResponse<FlyPaged<T>>` envelope to the flat `{ items, total }` a list UI
|
|
17440
|
+
* reads. An absent `total` falls back to the row count, so a server that omits it still renders a
|
|
17441
|
+
* correct count for the page in hand rather than `0`.
|
|
17442
|
+
*/
|
|
17443
|
+
function flyToPage(res) {
|
|
17444
|
+
const items = res.data?.items ?? [];
|
|
17445
|
+
return { items, total: res.data?.total ?? items.length };
|
|
17446
|
+
}
|
|
17447
|
+
/**
|
|
17448
|
+
* Best-effort extraction of the message (usually an i18n key) out of an
|
|
17449
|
+
* `HttpErrorResponse.error` body returned by a FlyOS endpoint.
|
|
17450
|
+
*
|
|
17451
|
+
* The wire format is inconsistent by design: business-rule failures arrive as `{ errors: [key] }`,
|
|
17452
|
+
* the structured envelope as `{ error: { code, message } }`, framework failures as `{ message }`,
|
|
17453
|
+
* and some proxies hand back a bare string. Call sites used to inline this probe behind
|
|
17454
|
+
* `err?.error as any`, typing the whole chain as `any` and duplicating the logic verbatim.
|
|
17455
|
+
*
|
|
17456
|
+
* @returns the first `errors[]` entry, else `error.message`, else `message`, else the raw string
|
|
17457
|
+
* body — or `undefined` when none of those is present.
|
|
17458
|
+
*/
|
|
17459
|
+
function flyApiErrorMessage(err) {
|
|
17460
|
+
const raw = err?.error;
|
|
17461
|
+
if (typeof raw === 'string')
|
|
17462
|
+
return raw;
|
|
17463
|
+
if (raw && typeof raw === 'object') {
|
|
17464
|
+
const body = raw;
|
|
17465
|
+
if (Array.isArray(body.errors) && body.errors.length > 0)
|
|
17466
|
+
return String(body.errors[0]);
|
|
17467
|
+
const nested = body.error;
|
|
17468
|
+
if (nested && typeof nested === 'object' && typeof nested.message === 'string') {
|
|
17469
|
+
return nested.message;
|
|
17470
|
+
}
|
|
17471
|
+
if (typeof body.message === 'string')
|
|
17472
|
+
return body.message;
|
|
17473
|
+
}
|
|
17474
|
+
return undefined;
|
|
17475
|
+
}
|
|
17476
|
+
|
|
17323
17477
|
/**
|
|
17324
17478
|
* Shared presence-colour utility — one deterministic seed → colour mapping so
|
|
17325
17479
|
* every co-authoring surface (mind-maps, canvas-boards, and future Documents/
|
|
@@ -18989,30 +19143,30 @@ class FlyDetailCardComponent {
|
|
|
18989
19143
|
/** Drop the body padding — for a child that brings its own list/table chrome. */
|
|
18990
19144
|
flush = input(false, ...(ngDevMode ? [{ debugName: "flush" }] : /* istanbul ignore next */ []));
|
|
18991
19145
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: FlyDetailCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
18992
|
-
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: `
|
|
18993
|
-
@if (titleKey() || hasProjectedTitle()) {
|
|
18994
|
-
<fly-section-header [titleKey]="titleKey()">
|
|
18995
|
-
<ng-content select="[card-title]" ngProjectAs="[section-title]" />
|
|
18996
|
-
<ng-content select="[card-actions]" ngProjectAs="[section-actions]" />
|
|
18997
|
-
</fly-section-header>
|
|
18998
|
-
}
|
|
18999
|
-
<div class="dc__body" [class.dc__body--flush]="flush()">
|
|
19000
|
-
<ng-content />
|
|
19001
|
-
</div>
|
|
19146
|
+
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: `
|
|
19147
|
+
@if (titleKey() || hasProjectedTitle()) {
|
|
19148
|
+
<fly-section-header [titleKey]="titleKey()">
|
|
19149
|
+
<ng-content select="[card-title]" ngProjectAs="[section-title]" />
|
|
19150
|
+
<ng-content select="[card-actions]" ngProjectAs="[section-actions]" />
|
|
19151
|
+
</fly-section-header>
|
|
19152
|
+
}
|
|
19153
|
+
<div class="dc__body" [class.dc__body--flush]="flush()">
|
|
19154
|
+
<ng-content />
|
|
19155
|
+
</div>
|
|
19002
19156
|
`, 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 });
|
|
19003
19157
|
}
|
|
19004
19158
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: FlyDetailCardComponent, decorators: [{
|
|
19005
19159
|
type: Component,
|
|
19006
|
-
args: [{ selector: 'fly-detail-card', standalone: true, imports: [FlySectionHeaderComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
19007
|
-
@if (titleKey() || hasProjectedTitle()) {
|
|
19008
|
-
<fly-section-header [titleKey]="titleKey()">
|
|
19009
|
-
<ng-content select="[card-title]" ngProjectAs="[section-title]" />
|
|
19010
|
-
<ng-content select="[card-actions]" ngProjectAs="[section-actions]" />
|
|
19011
|
-
</fly-section-header>
|
|
19012
|
-
}
|
|
19013
|
-
<div class="dc__body" [class.dc__body--flush]="flush()">
|
|
19014
|
-
<ng-content />
|
|
19015
|
-
</div>
|
|
19160
|
+
args: [{ selector: 'fly-detail-card', standalone: true, imports: [FlySectionHeaderComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
19161
|
+
@if (titleKey() || hasProjectedTitle()) {
|
|
19162
|
+
<fly-section-header [titleKey]="titleKey()">
|
|
19163
|
+
<ng-content select="[card-title]" ngProjectAs="[section-title]" />
|
|
19164
|
+
<ng-content select="[card-actions]" ngProjectAs="[section-actions]" />
|
|
19165
|
+
</fly-section-header>
|
|
19166
|
+
}
|
|
19167
|
+
<div class="dc__body" [class.dc__body--flush]="flush()">
|
|
19168
|
+
<ng-content />
|
|
19169
|
+
</div>
|
|
19016
19170
|
`, 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"] }]
|
|
19017
19171
|
}], 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 }] }] } });
|
|
19018
19172
|
|
|
@@ -19140,108 +19294,108 @@ class FlyDetailShellComponent {
|
|
|
19140
19294
|
buttons?.[next]?.focus();
|
|
19141
19295
|
}
|
|
19142
19296
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: FlyDetailShellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
19143
|
-
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: `
|
|
19144
|
-
<div class="ds__layout">
|
|
19145
|
-
<aside class="ds__aside">
|
|
19146
|
-
<div class="ds__pinned">
|
|
19147
|
-
<ng-content select="[detail-aside]" />
|
|
19148
|
-
</div>
|
|
19149
|
-
|
|
19150
|
-
@if (sections().length > 0) {
|
|
19151
|
-
<div
|
|
19152
|
-
#rail
|
|
19153
|
-
class="ds__rail"
|
|
19154
|
-
role="tablist"
|
|
19155
|
-
tabindex="-1"
|
|
19156
|
-
[attr.aria-orientation]="'vertical'"
|
|
19157
|
-
[attr.aria-label]="sectionsLabelKey() | translate"
|
|
19158
|
-
(keydown)="onKey($event)"
|
|
19159
|
-
>
|
|
19160
|
-
@for (s of sections(); track s.id) {
|
|
19161
|
-
<button
|
|
19162
|
-
type="button"
|
|
19163
|
-
class="ds__tab"
|
|
19164
|
-
role="tab"
|
|
19165
|
-
[id]="tabId(s.id)"
|
|
19166
|
-
[class.ds__tab--active]="activeId() === s.id"
|
|
19167
|
-
[attr.aria-selected]="activeId() === s.id"
|
|
19168
|
-
[attr.aria-controls]="panelId()"
|
|
19169
|
-
[attr.tabindex]="activeId() === s.id ? 0 : -1"
|
|
19170
|
-
[attr.title]="s.labelKey | translate"
|
|
19171
|
-
(click)="select(s.id)"
|
|
19172
|
-
>
|
|
19173
|
-
@if (s.icon) {
|
|
19174
|
-
<span class="pi {{ s.icon }} ds__tab-ico" aria-hidden="true"></span>
|
|
19175
|
-
}
|
|
19176
|
-
<span class="ds__tab-label">{{ s.labelKey | translate }}</span>
|
|
19177
|
-
</button>
|
|
19178
|
-
}
|
|
19179
|
-
</div>
|
|
19180
|
-
}
|
|
19181
|
-
</aside>
|
|
19182
|
-
|
|
19183
|
-
<div
|
|
19184
|
-
class="ds__panel"
|
|
19185
|
-
[id]="panelId()"
|
|
19186
|
-
[attr.role]="sections().length ? 'tabpanel' : null"
|
|
19187
|
-
[attr.aria-labelledby]="activeId() ? tabId(activeId()!) : null"
|
|
19188
|
-
>
|
|
19189
|
-
<ng-content />
|
|
19190
|
-
</div>
|
|
19191
|
-
</div>
|
|
19297
|
+
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: `
|
|
19298
|
+
<div class="ds__layout">
|
|
19299
|
+
<aside class="ds__aside">
|
|
19300
|
+
<div class="ds__pinned">
|
|
19301
|
+
<ng-content select="[detail-aside]" />
|
|
19302
|
+
</div>
|
|
19303
|
+
|
|
19304
|
+
@if (sections().length > 0) {
|
|
19305
|
+
<div
|
|
19306
|
+
#rail
|
|
19307
|
+
class="ds__rail"
|
|
19308
|
+
role="tablist"
|
|
19309
|
+
tabindex="-1"
|
|
19310
|
+
[attr.aria-orientation]="'vertical'"
|
|
19311
|
+
[attr.aria-label]="sectionsLabelKey() | translate"
|
|
19312
|
+
(keydown)="onKey($event)"
|
|
19313
|
+
>
|
|
19314
|
+
@for (s of sections(); track s.id) {
|
|
19315
|
+
<button
|
|
19316
|
+
type="button"
|
|
19317
|
+
class="ds__tab"
|
|
19318
|
+
role="tab"
|
|
19319
|
+
[id]="tabId(s.id)"
|
|
19320
|
+
[class.ds__tab--active]="activeId() === s.id"
|
|
19321
|
+
[attr.aria-selected]="activeId() === s.id"
|
|
19322
|
+
[attr.aria-controls]="panelId()"
|
|
19323
|
+
[attr.tabindex]="activeId() === s.id ? 0 : -1"
|
|
19324
|
+
[attr.title]="s.labelKey | translate"
|
|
19325
|
+
(click)="select(s.id)"
|
|
19326
|
+
>
|
|
19327
|
+
@if (s.icon) {
|
|
19328
|
+
<span class="pi {{ s.icon }} ds__tab-ico" aria-hidden="true"></span>
|
|
19329
|
+
}
|
|
19330
|
+
<span class="ds__tab-label">{{ s.labelKey | translate }}</span>
|
|
19331
|
+
</button>
|
|
19332
|
+
}
|
|
19333
|
+
</div>
|
|
19334
|
+
}
|
|
19335
|
+
</aside>
|
|
19336
|
+
|
|
19337
|
+
<div
|
|
19338
|
+
class="ds__panel"
|
|
19339
|
+
[id]="panelId()"
|
|
19340
|
+
[attr.role]="sections().length ? 'tabpanel' : null"
|
|
19341
|
+
[attr.aria-labelledby]="activeId() ? tabId(activeId()!) : null"
|
|
19342
|
+
>
|
|
19343
|
+
<ng-content />
|
|
19344
|
+
</div>
|
|
19345
|
+
</div>
|
|
19192
19346
|
`, isInline: true, styles: [":host{display:block;container-type:inline-size}.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}@container (max-width: 980px){.ds__layout{grid-template-columns:minmax(0,1fr)}.ds__rail{flex-direction:row;flex-wrap:wrap}.ds__tab{width:auto}}@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 });
|
|
19193
19347
|
}
|
|
19194
19348
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: FlyDetailShellComponent, decorators: [{
|
|
19195
19349
|
type: Component,
|
|
19196
|
-
args: [{ selector: 'fly-detail-shell', standalone: true, imports: [TranslatePipe], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
19197
|
-
<div class="ds__layout">
|
|
19198
|
-
<aside class="ds__aside">
|
|
19199
|
-
<div class="ds__pinned">
|
|
19200
|
-
<ng-content select="[detail-aside]" />
|
|
19201
|
-
</div>
|
|
19202
|
-
|
|
19203
|
-
@if (sections().length > 0) {
|
|
19204
|
-
<div
|
|
19205
|
-
#rail
|
|
19206
|
-
class="ds__rail"
|
|
19207
|
-
role="tablist"
|
|
19208
|
-
tabindex="-1"
|
|
19209
|
-
[attr.aria-orientation]="'vertical'"
|
|
19210
|
-
[attr.aria-label]="sectionsLabelKey() | translate"
|
|
19211
|
-
(keydown)="onKey($event)"
|
|
19212
|
-
>
|
|
19213
|
-
@for (s of sections(); track s.id) {
|
|
19214
|
-
<button
|
|
19215
|
-
type="button"
|
|
19216
|
-
class="ds__tab"
|
|
19217
|
-
role="tab"
|
|
19218
|
-
[id]="tabId(s.id)"
|
|
19219
|
-
[class.ds__tab--active]="activeId() === s.id"
|
|
19220
|
-
[attr.aria-selected]="activeId() === s.id"
|
|
19221
|
-
[attr.aria-controls]="panelId()"
|
|
19222
|
-
[attr.tabindex]="activeId() === s.id ? 0 : -1"
|
|
19223
|
-
[attr.title]="s.labelKey | translate"
|
|
19224
|
-
(click)="select(s.id)"
|
|
19225
|
-
>
|
|
19226
|
-
@if (s.icon) {
|
|
19227
|
-
<span class="pi {{ s.icon }} ds__tab-ico" aria-hidden="true"></span>
|
|
19228
|
-
}
|
|
19229
|
-
<span class="ds__tab-label">{{ s.labelKey | translate }}</span>
|
|
19230
|
-
</button>
|
|
19231
|
-
}
|
|
19232
|
-
</div>
|
|
19233
|
-
}
|
|
19234
|
-
</aside>
|
|
19235
|
-
|
|
19236
|
-
<div
|
|
19237
|
-
class="ds__panel"
|
|
19238
|
-
[id]="panelId()"
|
|
19239
|
-
[attr.role]="sections().length ? 'tabpanel' : null"
|
|
19240
|
-
[attr.aria-labelledby]="activeId() ? tabId(activeId()!) : null"
|
|
19241
|
-
>
|
|
19242
|
-
<ng-content />
|
|
19243
|
-
</div>
|
|
19244
|
-
</div>
|
|
19350
|
+
args: [{ selector: 'fly-detail-shell', standalone: true, imports: [TranslatePipe], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
19351
|
+
<div class="ds__layout">
|
|
19352
|
+
<aside class="ds__aside">
|
|
19353
|
+
<div class="ds__pinned">
|
|
19354
|
+
<ng-content select="[detail-aside]" />
|
|
19355
|
+
</div>
|
|
19356
|
+
|
|
19357
|
+
@if (sections().length > 0) {
|
|
19358
|
+
<div
|
|
19359
|
+
#rail
|
|
19360
|
+
class="ds__rail"
|
|
19361
|
+
role="tablist"
|
|
19362
|
+
tabindex="-1"
|
|
19363
|
+
[attr.aria-orientation]="'vertical'"
|
|
19364
|
+
[attr.aria-label]="sectionsLabelKey() | translate"
|
|
19365
|
+
(keydown)="onKey($event)"
|
|
19366
|
+
>
|
|
19367
|
+
@for (s of sections(); track s.id) {
|
|
19368
|
+
<button
|
|
19369
|
+
type="button"
|
|
19370
|
+
class="ds__tab"
|
|
19371
|
+
role="tab"
|
|
19372
|
+
[id]="tabId(s.id)"
|
|
19373
|
+
[class.ds__tab--active]="activeId() === s.id"
|
|
19374
|
+
[attr.aria-selected]="activeId() === s.id"
|
|
19375
|
+
[attr.aria-controls]="panelId()"
|
|
19376
|
+
[attr.tabindex]="activeId() === s.id ? 0 : -1"
|
|
19377
|
+
[attr.title]="s.labelKey | translate"
|
|
19378
|
+
(click)="select(s.id)"
|
|
19379
|
+
>
|
|
19380
|
+
@if (s.icon) {
|
|
19381
|
+
<span class="pi {{ s.icon }} ds__tab-ico" aria-hidden="true"></span>
|
|
19382
|
+
}
|
|
19383
|
+
<span class="ds__tab-label">{{ s.labelKey | translate }}</span>
|
|
19384
|
+
</button>
|
|
19385
|
+
}
|
|
19386
|
+
</div>
|
|
19387
|
+
}
|
|
19388
|
+
</aside>
|
|
19389
|
+
|
|
19390
|
+
<div
|
|
19391
|
+
class="ds__panel"
|
|
19392
|
+
[id]="panelId()"
|
|
19393
|
+
[attr.role]="sections().length ? 'tabpanel' : null"
|
|
19394
|
+
[attr.aria-labelledby]="activeId() ? tabId(activeId()!) : null"
|
|
19395
|
+
>
|
|
19396
|
+
<ng-content />
|
|
19397
|
+
</div>
|
|
19398
|
+
</div>
|
|
19245
19399
|
`, styles: [":host{display:block;container-type:inline-size}.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}@container (max-width: 980px){.ds__layout{grid-template-columns:minmax(0,1fr)}.ds__rail{flex-direction:row;flex-wrap:wrap}.ds__tab{width:auto}}@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"] }]
|
|
19246
19400
|
}], 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 }] }] } });
|
|
19247
19401
|
|
|
@@ -21841,5 +21995,5 @@ const AUDIENCE_ERROR_CODES = {
|
|
|
21841
21995
|
* Generated bundle index. Do not edit.
|
|
21842
21996
|
*/
|
|
21843
21997
|
|
|
21844
|
-
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_RELOAD_REARM_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, FlyAppHomeComponent, 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, FlyUserDirectoryService, 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, initialExpanded, 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, sectionHintKey, sectionLayout, sliderTrackGradient, sparklinePath, sparklinePoints, stepUpInterceptor, stepUpReturnKey, trimAgentPayload, trimAgentString, unloadRemoteStyles, utf8ByteLength, validateAgentPayload, warnIfEmbeddedSessionMissing };
|
|
21998
|
+
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_RELOAD_REARM_MS, FLY_REMOTE_BASE_PATH, FLY_REMOTE_CONTEXT_EVENT, FLY_REMOTE_CONTEXT_STORE_KEY, FLY_REMOTE_ROUTES, FLY_SCAN_PENDING_DEFAULT_DELAY_MS, FLY_SCAN_PENDING_MAX_RETRIES, FLY_SCAN_PENDING_STATUS, 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, FlyAppHomeComponent, 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, FlyFileDownloadService, 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, FlyUserDirectoryService, 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, flyApiErrorMessage, flyCaptchaBase64Utf8, flyCaptchaBuildToken, flyCaptchaSha256Hex, flyCompactNumber, flyDebounced, flyDecimalNumber, flyDownloadBlob, flyDuration, flyEmojiFor, flyEmojiIsTonable, flyEmojiPackUrl, flyExportFileName, flyFirstEnabledIndex, flyFormatBytes, flyFormatDate, flyFormatDateTime, flyFormatTime, flyFullNumber, flyNextEnabledIndex, flyNextSegmentIndex, flyRelativeTime, flyResolveActiveTab, flyRoleGuard, flyScanPendingDelayMs, flyScanRetry, flySignedCompact, flySkinToneLabelKey, flyStandaloneAuthGuard, flyStandaloneAuthInterceptor, flyToDateOnly, flyToPage, flyUnwrap, flyUnwrapLenient, hasAnyRoleIn, healNativeFederationCacheOnce, initialExpanded, 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, sectionHintKey, sectionLayout, sliderTrackGradient, sparklinePath, sparklinePoints, stepUpInterceptor, stepUpReturnKey, trimAgentPayload, trimAgentString, unloadRemoteStyles, utf8ByteLength, validateAgentPayload, warnIfEmbeddedSessionMissing };
|
|
21845
21999
|
//# sourceMappingURL=flyos-design-system.mjs.map
|