@mohamedatia/fly-design-system 2.15.2 → 2.16.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.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, signal, computed, Injectable, inject, ErrorHandler, PLATFORM_ID, DestroyRef, ChangeDetectionStrategy, Component, Pipe, ElementRef, input, output, afterNextRender, HostListener, ViewChild, ChangeDetectorRef, forwardRef, DOCUMENT, EventEmitter, Output, Input, Injector, viewChild, effect, ViewEncapsulation, model, Directive, Renderer2 } from '@angular/core';
2
+ import { InjectionToken, signal, computed, Injectable, inject, ErrorHandler, PLATFORM_ID, DestroyRef, ChangeDetectionStrategy, Component, Pipe, ElementRef, input, output, afterNextRender, HostListener, ViewChild, ChangeDetectorRef, forwardRef, DOCUMENT, EventEmitter, Output, Input, effect, Injector, viewChild, ViewEncapsulation, model, Directive, Renderer2 } from '@angular/core';
3
3
  import * as i1$1 from '@angular/common';
4
4
  import { isPlatformBrowser, NgComponentOutlet, CommonModule, DOCUMENT as DOCUMENT$1 } from '@angular/common';
5
5
  import { Router, NavigationEnd } from '@angular/router';
@@ -17,6 +17,8 @@ import { TiptapEditorDirective } from 'ngx-tiptap';
17
17
  import { Link } from '@tiptap/extension-link';
18
18
  import { registerCustomProtocol } from 'linkifyjs';
19
19
  import { switchMap, debounceTime, distinctUntilChanged, filter } from 'rxjs/operators';
20
+ import * as i1$2 from '@angular/cdk/a11y';
21
+ import { A11yModule } from '@angular/cdk/a11y';
20
22
  import Cropper from 'cropperjs';
21
23
 
22
24
  /**
@@ -4176,6 +4178,159 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
4176
4178
  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"] }]
4177
4179
  }], propDecorators: { active: [{ type: i0.Input, args: [{ isSignal: true, alias: "active", required: true }] }], messageKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "messageKey", required: false }] }] } });
4178
4180
 
4181
+ /**
4182
+ * `fly-drawer` — the ONE overlay-drawer primitive for FlyOS apps.
4183
+ *
4184
+ * Replaces every hand-rolled centered modal / `*-backdrop` + `modal-panel`
4185
+ * scaffold. A slide-in panel pinned to the window's inline-end edge over a
4186
+ * scrim, dismissing away — drops onto ANY app layout (sidebar+main, editor,
4187
+ * list) with no restructuring.
4188
+ *
4189
+ * ## Windowed rendering (important)
4190
+ * Desktop apps are windowed, so the drawer renders **in-place** — the scrim is
4191
+ * `position: absolute; inset: 0` and overlays the nearest positioned ancestor,
4192
+ * NOT a body/CDK portal (a body-level overlay would escape the app window and
4193
+ * break the shell's window stacking). **The consuming app's root container must
4194
+ * be `position: relative`** (add it where missing) so the scrim is clipped to
4195
+ * the window.
4196
+ *
4197
+ * ## Controlled
4198
+ * `open` is a controlled input — bind it to a signal and flip it in the
4199
+ * `(closed)` / `(openChange)` handlers. The drawer never closes itself; it only
4200
+ * requests closure (scrim / Escape / ✕) by emitting.
4201
+ *
4202
+ * ## Owns (so apps stop reimplementing it)
4203
+ * slide in/out (honours `prefers-reduced-motion`), focus trap + focus restore,
4204
+ * Escape + scrim dismiss (both gated), scroll-lock of the host content, ARIA
4205
+ * (`role=dialog` + `aria-modal` + labelledby/label), logical CSS (RTL-safe),
4206
+ * dark theme.
4207
+ *
4208
+ * ## Slots
4209
+ * - `[flyDrawerHeader]` — optional custom header (else `heading` + close ✕).
4210
+ * - default — body (scrolls).
4211
+ * - `[flyDrawerFooter]` — optional sticky footer (action bar).
4212
+ */
4213
+ class FlyDrawerComponent {
4214
+ host = inject((ElementRef));
4215
+ destroyRef = inject(DestroyRef);
4216
+ /** Drives mount + slide. Controlled by the parent. */
4217
+ open = input(false, ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
4218
+ /** Width tier → inline-size (sm 360 / md 480 / lg 640 / xl min(960px, 94%)). */
4219
+ size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
4220
+ /** Convenience title shown in the default header (ignored if `[flyDrawerHeader]` is projected). Treated as an i18n key. */
4221
+ heading = input(null, ...(ngDevMode ? [{ debugName: "heading" }] : /* istanbul ignore next */ []));
4222
+ /** Edge to pin to. `end` (default) slides from inline-end; RTL flips it. */
4223
+ side = input('end', ...(ngDevMode ? [{ debugName: "side" }] : /* istanbul ignore next */ []));
4224
+ /** Close when the scrim is clicked. */
4225
+ dismissOnScrim = input(true, ...(ngDevMode ? [{ debugName: "dismissOnScrim" }] : /* istanbul ignore next */ []));
4226
+ /** Close on Escape. */
4227
+ dismissOnEscape = input(true, ...(ngDevMode ? [{ debugName: "dismissOnEscape" }] : /* istanbul ignore next */ []));
4228
+ /** Accessible label when no `heading` / projected header title is available. Treated as an i18n key. */
4229
+ ariaLabel = input(null, ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
4230
+ /** Hide the built-in close ✕ in the default header (e.g. a mandatory step). */
4231
+ hideCloseButton = input(false, ...(ngDevMode ? [{ debugName: "hideCloseButton" }] : /* istanbul ignore next */ []));
4232
+ /** Emitted when the user requests dismissal (scrim / Escape / ✕). */
4233
+ closed = output();
4234
+ /** Two-way friendly: emits `false` on a dismissal request. */
4235
+ openChange = output();
4236
+ /** Whether the panel is mounted (true while open AND during the slide-out). */
4237
+ rendered = signal(false, ...(ngDevMode ? [{ debugName: "rendered" }] : /* istanbul ignore next */ []));
4238
+ /** Whether the panel is in its entered (slid-in) state. */
4239
+ entered = signal(false, ...(ngDevMode ? [{ debugName: "entered" }] : /* istanbul ignore next */ []));
4240
+ headingId = 'fly-drawer-heading';
4241
+ labelledBy = computed(() => (this.heading() ? this.headingId : null), ...(ngDevMode ? [{ debugName: "labelledBy" }] : /* istanbul ignore next */ []));
4242
+ /** Element focused before the drawer opened, restored on close. */
4243
+ previouslyFocused = null;
4244
+ /** Parent element whose overflow we lock while open. */
4245
+ scrollLockTarget = null;
4246
+ prevOverflow = '';
4247
+ constructor() {
4248
+ effect(() => {
4249
+ if (this.open())
4250
+ this.onOpen();
4251
+ else
4252
+ this.onClose();
4253
+ });
4254
+ this.destroyRef.onDestroy(() => this.releaseScrollLock());
4255
+ }
4256
+ onOpen() {
4257
+ if (this.rendered())
4258
+ return;
4259
+ this.previouslyFocused =
4260
+ document.activeElement instanceof HTMLElement ? document.activeElement : null;
4261
+ this.lockScroll();
4262
+ this.rendered.set(true);
4263
+ // Next frame → flip to entered so the CSS transition runs.
4264
+ requestAnimationFrame(() => requestAnimationFrame(() => this.entered.set(true)));
4265
+ }
4266
+ onClose() {
4267
+ if (!this.rendered())
4268
+ return;
4269
+ this.entered.set(false);
4270
+ this.releaseScrollLock();
4271
+ this.restoreFocus();
4272
+ // Unmount on transitionend; fallback timer covers reduced-motion / a missed
4273
+ // event so the (still pointer-grabbing) scrim can never linger.
4274
+ setTimeout(() => {
4275
+ if (!this.open())
4276
+ this.rendered.set(false);
4277
+ }, 320);
4278
+ }
4279
+ /** Remove the panel from the DOM once the slide-out transition completes. */
4280
+ onPanelTransitionEnd() {
4281
+ if (!this.entered() && !this.open())
4282
+ this.rendered.set(false);
4283
+ }
4284
+ onEscape() {
4285
+ if (this.open() && this.dismissOnEscape())
4286
+ this.requestClose();
4287
+ }
4288
+ onScrimClick() {
4289
+ if (this.dismissOnScrim())
4290
+ this.requestClose();
4291
+ }
4292
+ requestClose() {
4293
+ this.openChange.emit(false);
4294
+ this.closed.emit();
4295
+ }
4296
+ lockScroll() {
4297
+ // Lock the nearest positioned ancestor (the app window root) — the same box
4298
+ // the absolutely-positioned scrim clips to — not the immediate DOM parent
4299
+ // (which may be a `display:contents` dialog wrapper).
4300
+ const target = this.host.nativeElement.offsetParent ??
4301
+ this.host.nativeElement.parentElement;
4302
+ if (!target)
4303
+ return;
4304
+ this.scrollLockTarget = target;
4305
+ this.prevOverflow = target.style.overflow;
4306
+ target.style.overflow = 'hidden';
4307
+ }
4308
+ releaseScrollLock() {
4309
+ if (!this.scrollLockTarget)
4310
+ return;
4311
+ this.scrollLockTarget.style.overflow = this.prevOverflow;
4312
+ this.scrollLockTarget = null;
4313
+ this.prevOverflow = '';
4314
+ }
4315
+ restoreFocus() {
4316
+ const el = this.previouslyFocused;
4317
+ this.previouslyFocused = null;
4318
+ if (el && document.contains(el)) {
4319
+ // Defer so focus lands after the panel is removed from the a11y tree.
4320
+ requestAnimationFrame(() => el.focus());
4321
+ }
4322
+ }
4323
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: FlyDrawerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4324
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: FlyDrawerComponent, isStandalone: true, selector: "fly-drawer", inputs: { open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, heading: { classPropertyName: "heading", publicName: "heading", isSignal: true, isRequired: false, transformFunction: null }, side: { classPropertyName: "side", publicName: "side", isSignal: true, isRequired: false, transformFunction: null }, dismissOnScrim: { classPropertyName: "dismissOnScrim", publicName: "dismissOnScrim", isSignal: true, isRequired: false, transformFunction: null }, dismissOnEscape: { classPropertyName: "dismissOnEscape", publicName: "dismissOnEscape", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, hideCloseButton: { classPropertyName: "hideCloseButton", publicName: "hideCloseButton", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed", openChange: "openChange" }, host: { listeners: { "document:keydown.escape": "onEscape()" } }, ngImport: i0, template: "<!--\n Windowed overlay drawer. Renders only while mounted (open or sliding out).\n Scrim + panel are absolutely positioned within the nearest positioned\n ancestor (the consuming app root must be position:relative).\n-->\n@if (rendered()) {\n <div\n class=\"fly-drawer__scrim\"\n [class.fly-drawer__scrim--in]=\"entered()\"\n (click)=\"onScrimClick()\"\n aria-hidden=\"true\"\n ></div>\n\n <div\n class=\"fly-drawer__panel\"\n [class.fly-drawer__panel--in]=\"entered()\"\n [class]=\"'fly-drawer__panel--' + size() + ' fly-drawer__panel--side-' + side()\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-labelledby]=\"labelledBy()\"\n [attr.aria-label]=\"!labelledBy() && ariaLabel() ? (ariaLabel()! | translate) : null\"\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"true\"\n (transitionend)=\"onPanelTransitionEnd()\"\n >\n <!-- Header: custom slot, else heading + close \u2715. -->\n <ng-content select=\"[flyDrawerHeader]\">\n @if (heading()) {\n <header class=\"fly-drawer__header\">\n <h2 class=\"fly-drawer__title\" [id]=\"headingId\">{{ heading()! | translate }}</h2>\n @if (!hideCloseButton()) {\n <button\n type=\"button\"\n class=\"fly-drawer__close\"\n (click)=\"requestClose()\"\n [attr.aria-label]=\"'common.action.close' | translate\"\n >\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n }\n </header>\n }\n </ng-content>\n\n <div class=\"fly-drawer__body\">\n <ng-content></ng-content>\n </div>\n\n <ng-content select=\"[flyDrawerFooter]\"></ng-content>\n </div>\n}\n", styles: [":host{position:absolute;inset:0;z-index:60;pointer-events:none}.fly-drawer__scrim{position:absolute;inset:0;pointer-events:auto;background:#00000061;opacity:0;transition:opacity .24s ease}.fly-drawer__scrim--in{opacity:1}.fly-drawer__panel{position:absolute;inset-block:0;inset-inline-end:0;pointer-events:auto;display:flex;flex-direction:column;min-block-size:0;inline-size:min(480px,100%);max-inline-size:100%;background:var(--surface-card, #fff);border-inline-start:1px solid var(--surface-border, rgba(0, 0, 0, .08));box-shadow:-16px 0 48px #00000038;transform:translate(100%);transition:transform .28s cubic-bezier(.32,.72,0,1)}.fly-drawer__panel--sm{inline-size:min(360px,100%)}.fly-drawer__panel--md{inline-size:min(480px,100%)}.fly-drawer__panel--lg{inline-size:min(640px,100%)}.fly-drawer__panel--xl{inline-size:min(960px,94%)}.fly-drawer__panel--side-start{inset-inline-end:auto;inset-inline-start:0;border-inline-start:none;border-inline-end:1px solid var(--surface-border, rgba(0, 0, 0, .08));box-shadow:16px 0 48px #00000038;transform:translate(-100%)}.fly-drawer__panel--in{transform:translate(0)}:host-context([dir=rtl]) .fly-drawer__panel{transform:translate(-100%)}:host-context([dir=rtl]) .fly-drawer__panel--side-start{transform:translate(100%)}:host-context([dir=rtl]) .fly-drawer__panel--in{transform:translate(0)}:host-context([dir=rtl]) .fly-drawer__panel{box-shadow:16px 0 48px #00000038;border-inline-start:1px solid var(--surface-border, rgba(0, 0, 0, .08))}.fly-drawer__header{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 18px;border-block-end:1px solid var(--surface-border, rgba(0, 0, 0, .08));flex:0 0 auto}.fly-drawer__title{margin:0;font-size:16px;font-weight:600;color:var(--label-primary, #1d1d1f)}.fly-drawer__close{display:inline-flex;align-items:center;justify-content:center;inline-size:30px;block-size:30px;border:none;border-radius:8px;background:transparent;color:var(--label-secondary, #6e6e73);cursor:pointer}.fly-drawer__close:hover{background:#0000000f}.fly-drawer__body{flex:1 1 auto;min-block-size:0;overflow-y:auto}:host ::ng-deep [flyDrawerFooter]{flex:0 0 auto;display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:12px 18px;border-block-start:1px solid var(--surface-border, rgba(0, 0, 0, .08))}:host-context(html.dark-theme) .fly-drawer__panel{background:#1c1c1e}:host-context(html.dark-theme) .fly-drawer__title{color:#f5f5f7}:host-context(html.dark-theme) .fly-drawer__close:hover{background:#ffffff14}@media(prefers-reduced-motion:reduce){.fly-drawer__scrim,.fly-drawer__panel{transition:none}}@media(forced-colors:active){.fly-drawer__panel{border:1px solid CanvasText}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: A11yModule }, { kind: "directive", type: i1$2.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4325
+ }
4326
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: FlyDrawerComponent, decorators: [{
4327
+ type: Component,
4328
+ args: [{ selector: 'fly-drawer', standalone: true, imports: [CommonModule, A11yModule, TranslatePipe], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n Windowed overlay drawer. Renders only while mounted (open or sliding out).\n Scrim + panel are absolutely positioned within the nearest positioned\n ancestor (the consuming app root must be position:relative).\n-->\n@if (rendered()) {\n <div\n class=\"fly-drawer__scrim\"\n [class.fly-drawer__scrim--in]=\"entered()\"\n (click)=\"onScrimClick()\"\n aria-hidden=\"true\"\n ></div>\n\n <div\n class=\"fly-drawer__panel\"\n [class.fly-drawer__panel--in]=\"entered()\"\n [class]=\"'fly-drawer__panel--' + size() + ' fly-drawer__panel--side-' + side()\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-labelledby]=\"labelledBy()\"\n [attr.aria-label]=\"!labelledBy() && ariaLabel() ? (ariaLabel()! | translate) : null\"\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"true\"\n (transitionend)=\"onPanelTransitionEnd()\"\n >\n <!-- Header: custom slot, else heading + close \u2715. -->\n <ng-content select=\"[flyDrawerHeader]\">\n @if (heading()) {\n <header class=\"fly-drawer__header\">\n <h2 class=\"fly-drawer__title\" [id]=\"headingId\">{{ heading()! | translate }}</h2>\n @if (!hideCloseButton()) {\n <button\n type=\"button\"\n class=\"fly-drawer__close\"\n (click)=\"requestClose()\"\n [attr.aria-label]=\"'common.action.close' | translate\"\n >\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n }\n </header>\n }\n </ng-content>\n\n <div class=\"fly-drawer__body\">\n <ng-content></ng-content>\n </div>\n\n <ng-content select=\"[flyDrawerFooter]\"></ng-content>\n </div>\n}\n", styles: [":host{position:absolute;inset:0;z-index:60;pointer-events:none}.fly-drawer__scrim{position:absolute;inset:0;pointer-events:auto;background:#00000061;opacity:0;transition:opacity .24s ease}.fly-drawer__scrim--in{opacity:1}.fly-drawer__panel{position:absolute;inset-block:0;inset-inline-end:0;pointer-events:auto;display:flex;flex-direction:column;min-block-size:0;inline-size:min(480px,100%);max-inline-size:100%;background:var(--surface-card, #fff);border-inline-start:1px solid var(--surface-border, rgba(0, 0, 0, .08));box-shadow:-16px 0 48px #00000038;transform:translate(100%);transition:transform .28s cubic-bezier(.32,.72,0,1)}.fly-drawer__panel--sm{inline-size:min(360px,100%)}.fly-drawer__panel--md{inline-size:min(480px,100%)}.fly-drawer__panel--lg{inline-size:min(640px,100%)}.fly-drawer__panel--xl{inline-size:min(960px,94%)}.fly-drawer__panel--side-start{inset-inline-end:auto;inset-inline-start:0;border-inline-start:none;border-inline-end:1px solid var(--surface-border, rgba(0, 0, 0, .08));box-shadow:16px 0 48px #00000038;transform:translate(-100%)}.fly-drawer__panel--in{transform:translate(0)}:host-context([dir=rtl]) .fly-drawer__panel{transform:translate(-100%)}:host-context([dir=rtl]) .fly-drawer__panel--side-start{transform:translate(100%)}:host-context([dir=rtl]) .fly-drawer__panel--in{transform:translate(0)}:host-context([dir=rtl]) .fly-drawer__panel{box-shadow:16px 0 48px #00000038;border-inline-start:1px solid var(--surface-border, rgba(0, 0, 0, .08))}.fly-drawer__header{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 18px;border-block-end:1px solid var(--surface-border, rgba(0, 0, 0, .08));flex:0 0 auto}.fly-drawer__title{margin:0;font-size:16px;font-weight:600;color:var(--label-primary, #1d1d1f)}.fly-drawer__close{display:inline-flex;align-items:center;justify-content:center;inline-size:30px;block-size:30px;border:none;border-radius:8px;background:transparent;color:var(--label-secondary, #6e6e73);cursor:pointer}.fly-drawer__close:hover{background:#0000000f}.fly-drawer__body{flex:1 1 auto;min-block-size:0;overflow-y:auto}:host ::ng-deep [flyDrawerFooter]{flex:0 0 auto;display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:12px 18px;border-block-start:1px solid var(--surface-border, rgba(0, 0, 0, .08))}:host-context(html.dark-theme) .fly-drawer__panel{background:#1c1c1e}:host-context(html.dark-theme) .fly-drawer__title{color:#f5f5f7}:host-context(html.dark-theme) .fly-drawer__close:hover{background:#ffffff14}@media(prefers-reduced-motion:reduce){.fly-drawer__scrim,.fly-drawer__panel{transition:none}}@media(forced-colors:active){.fly-drawer__panel{border:1px solid CanvasText}}\n"] }]
4329
+ }], ctorParameters: () => [], propDecorators: { open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], heading: [{ type: i0.Input, args: [{ isSignal: true, alias: "heading", required: false }] }], side: [{ type: i0.Input, args: [{ isSignal: true, alias: "side", required: false }] }], dismissOnScrim: [{ type: i0.Input, args: [{ isSignal: true, alias: "dismissOnScrim", required: false }] }], dismissOnEscape: [{ type: i0.Input, args: [{ isSignal: true, alias: "dismissOnEscape", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], hideCloseButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideCloseButton", required: false }] }], closed: [{ type: i0.Output, args: ["closed"] }], openChange: [{ type: i0.Output, args: ["openChange"] }], onEscape: [{
4330
+ type: HostListener,
4331
+ args: ['document:keydown.escape']
4332
+ }] } });
4333
+
4179
4334
  /**
4180
4335
  * Image upload component with built-in cropperjs cropping modal.
4181
4336
  *
@@ -6632,5 +6787,5 @@ const AUDIENCE_ERROR_CODES = {
6632
6787
  * Generated bundle index. Do not edit.
6633
6788
  */
6634
6789
 
6635
- 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, ContextMenuComponent, DEFAULT_AGENT_PAYLOAD_LIMITS, DEFAULT_FLY_THEME_MODE, DS_BASELINE_LOCALES, DialogResult, ENTITY_LINK_LAUNCHER, EntityLookupComponent, FLYOS_LAUNCH_EVENT, FLYOS_PROTOCOL, FLYOS_REMOTE_ROUTE_EVENT, FLY_LOCALE_CATALOG, FLY_REMOTE_BASE_PATH, FLY_REMOTE_CONTEXT_EVENT, FLY_REMOTE_CONTEXT_STORE_KEY, FLY_REMOTE_ROUTES, FLY_THEME_MODE_IDS, FLY_WINDOW_HELP_HINT_EVENT, FlyAgentDraggableDirective, FlyBlockUiComponent, FlyFileUploadComponent, FlyImageUploadComponent, FlyMarkdownEditorComponent, FlyRemoteContextService, FlyRemoteRouter, FlyRemoteRouterOutletComponent, FlySecureSrcDirective, FlyThemeService, FlyWindowHelpService, FlyosLink, FlyosPendingLaunchesGlobalKey, FlyosShellOwnsHistoryGlobalKey, I18nService, LAUNCH_CONTEXT, MARKDOWN_TOOLBAR_PRESETS, MessageBoxButtons, MessageBoxComponent, MessageBoxIcon, MessageBoxService, MockAuthService, RTL_LOCALE_SET, SHARE_ORG_CHART_SYSTEM_KEY_APPS, SHARE_ORG_CHART_SYSTEM_KEY_DEFAULT, SHARE_PANEL_DEFAULT_FILE_LEVELS, SUPPORTED_AGENT_PAYLOAD_VERSIONS, SharePanelComponent, SourceAppResolver, StandaloneWindowManagerService, TranslatePipe, WINDOW_DATA, WINDOW_HELP_HINT, WindowManagerService, findLocaleByDialect, findLocaleByPrefix, isRtlLocale, isRtlLocaleEntry, loadRemoteStyles, matchFlyRoutePattern, normalizeFlyTheme, registerFlyosProtocol, trimAgentPayload, trimAgentString, unloadRemoteStyles, utf8ByteLength, validateAgentPayload };
6790
+ 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, ContextMenuComponent, DEFAULT_AGENT_PAYLOAD_LIMITS, DEFAULT_FLY_THEME_MODE, DS_BASELINE_LOCALES, DialogResult, ENTITY_LINK_LAUNCHER, EntityLookupComponent, FLYOS_LAUNCH_EVENT, FLYOS_PROTOCOL, FLYOS_REMOTE_ROUTE_EVENT, FLY_LOCALE_CATALOG, FLY_REMOTE_BASE_PATH, FLY_REMOTE_CONTEXT_EVENT, FLY_REMOTE_CONTEXT_STORE_KEY, FLY_REMOTE_ROUTES, FLY_THEME_MODE_IDS, FLY_WINDOW_HELP_HINT_EVENT, FlyAgentDraggableDirective, FlyBlockUiComponent, FlyDrawerComponent, FlyFileUploadComponent, FlyImageUploadComponent, FlyMarkdownEditorComponent, FlyRemoteContextService, FlyRemoteRouter, FlyRemoteRouterOutletComponent, FlySecureSrcDirective, FlyThemeService, FlyWindowHelpService, FlyosLink, FlyosPendingLaunchesGlobalKey, FlyosShellOwnsHistoryGlobalKey, I18nService, LAUNCH_CONTEXT, MARKDOWN_TOOLBAR_PRESETS, MessageBoxButtons, MessageBoxComponent, MessageBoxIcon, MessageBoxService, MockAuthService, RTL_LOCALE_SET, SHARE_ORG_CHART_SYSTEM_KEY_APPS, SHARE_ORG_CHART_SYSTEM_KEY_DEFAULT, SHARE_PANEL_DEFAULT_FILE_LEVELS, SUPPORTED_AGENT_PAYLOAD_VERSIONS, SharePanelComponent, SourceAppResolver, StandaloneWindowManagerService, TranslatePipe, WINDOW_DATA, WINDOW_HELP_HINT, WindowManagerService, findLocaleByDialect, findLocaleByPrefix, isRtlLocale, isRtlLocaleEntry, loadRemoteStyles, matchFlyRoutePattern, normalizeFlyTheme, registerFlyosProtocol, trimAgentPayload, trimAgentString, unloadRemoteStyles, utf8ByteLength, validateAgentPayload };
6636
6791
  //# sourceMappingURL=mohamedatia-fly-design-system.mjs.map