@akcelik/strct 4.0.0 → 4.1.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 { inject, DOCUMENT, signal, computed, Injectable, input, isDevMode, ViewEncapsulation, ChangeDetectionStrategy, Component, ElementRef, NgZone, booleanAttribute, afterNextRender, Directive, model, output, HostListener, contentChildren, effect, ApplicationRef, EnvironmentInjector, createComponent, forwardRef, DestroyRef, contentChild, viewChild, InjectionToken, untracked, Injector, viewChildren, TemplateRef, Renderer2, Pipe, PLATFORM_ID, afterRenderEffect } from '@angular/core';
2
+ import { inject, DOCUMENT, signal, computed, Injectable, input, isDevMode, ViewEncapsulation, ChangeDetectionStrategy, Component, ElementRef, NgZone, booleanAttribute, afterNextRender, Directive, model, output, HostListener, contentChildren, effect, ApplicationRef, EnvironmentInjector, createComponent, forwardRef, DestroyRef, TemplateRef, contentChild, viewChild, InjectionToken, untracked, Injector, viewChildren, Renderer2, Pipe, PLATFORM_ID, afterRenderEffect } from '@angular/core';
3
3
  import { DomSanitizer } from '@angular/platform-browser';
4
4
  import { NgTemplateOutlet, DOCUMENT as DOCUMENT$1, isPlatformBrowser } from '@angular/common';
5
5
  import { RouterLink, RouterLinkActive } from '@angular/router';
@@ -3344,6 +3344,31 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImpor
3344
3344
  }, styles: [".strct-tree{display:block}.strct-tree--comfortable .strct-tnode__row{gap:7px;padding:6px 10px;border-radius:6px;font-size:14px}.strct-tree--comfortable .strct-tnode__chevron{margin:-4px;margin-inline-end:-9px}.strct-tree--comfortable .strct-tnode__spacer{width:16px}.strct-tree--comfortable .strct-tnode__children{margin-inline-start:19px}\n"] }]
3345
3345
  }], propDecorators: { nodes: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodes", required: false }] }], density: [{ type: i0.Input, args: [{ isSignal: true, alias: "density", required: false }] }], nodeMenu: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodeMenu", required: false }] }], chevronAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "chevronAriaLabel", required: false }] }], nodeActivated: [{ type: i0.Output, args: ["nodeActivated"] }], nodeMenuSelect: [{ type: i0.Output, args: ["nodeMenuSelect"] }], expandedIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandedIds", required: false }] }, { type: i0.Output, args: ["expandedIdsChange"] }], expandedChange: [{ type: i0.Output, args: ["expandedChange"] }], nodeToggled: [{ type: i0.Output, args: ["nodeToggled"] }], projectedNodes: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => StrctTreeNode), { ...{ descendants: false }, isSignal: true }] }] } });
3346
3346
 
3347
+ /**
3348
+ * Dev-mode diagnostics for combinations a component accepts but cannot honour.
3349
+ *
3350
+ * Every message names what was ignored and what to do instead. Keyed: a
3351
+ * condition warns once per page load, not once per change detection.
3352
+ *
3353
+ * Production cost: none, PROVIDED each call site is guarded INLINE with
3354
+ * if (typeof ngDevMode !== 'undefined' && ngDevMode) { … }
3355
+ * Production builds define `ngDevMode` as false, and the minifier then drops
3356
+ * the whole block — messages included. A helper function returning that same
3357
+ * expression would NOT be folded across the call, so the check and its
3358
+ * strings would ship; that is why no such helper exists here.
3359
+ */
3360
+ const warned = new Set();
3361
+ function strctDevWarn(key, message) {
3362
+ if (typeof ngDevMode === 'undefined' || !ngDevMode || warned.has(key))
3363
+ return;
3364
+ warned.add(key);
3365
+ console.warn(message);
3366
+ }
3367
+ /** Test hook: forget which warnings have fired. Not part of the public API. */
3368
+ function resetStrctDevWarnings() {
3369
+ warned.clear();
3370
+ }
3371
+
3347
3372
  /**
3348
3373
  * Refcounted body scroll-lock shared across any number of simultaneously
3349
3374
  * open transient surfaces (modal, drawer …): the first lock hides body
@@ -3378,6 +3403,27 @@ function removeOpenModal(modal) {
3378
3403
  function isTopmostModal(modal) {
3379
3404
  return openModalStack[openModalStack.length - 1] === modal;
3380
3405
  }
3406
+ /**
3407
+ * Lazily rendered modal body. Plain projected content is created by the PARENT
3408
+ * with the parent's own view, so it is instantiated — and costs — even while
3409
+ * the modal is closed. Content inside this template is created only while the
3410
+ * modal is open, and destroyed when it closes (state does not survive a close):
3411
+ *
3412
+ * <strct-modal [(open)]="show" title="Import hosts">
3413
+ * <ng-template strctModalContent>
3414
+ * <strct-datagrid [rows]="hosts" … />
3415
+ * </ng-template>
3416
+ * </strct-modal>
3417
+ */
3418
+ class StrctModalContent {
3419
+ template = inject(TemplateRef);
3420
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: StrctModalContent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
3421
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.4", type: StrctModalContent, isStandalone: true, selector: "[strctModalContent]", ngImport: i0 });
3422
+ }
3423
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: StrctModalContent, decorators: [{
3424
+ type: Directive,
3425
+ args: [{ selector: '[strctModalContent]' }]
3426
+ }] });
3381
3427
  /**
3382
3428
  * Overlay dialog with two-way `open`:
3383
3429
  * <strct-modal [(open)]="show" title="Confirm">
@@ -3396,7 +3442,8 @@ class StrctModal {
3396
3442
  /** Dialog title. */
3397
3443
  title = input('', /* @ts-ignore */
3398
3444
  ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
3399
- /** Size variant (fixed scale; defaults to `sm` = 480px). */
3445
+ /** Size variant (fixed scale; defaults to `sm` = 480px). Ignored by
3446
+ * `chromeless`, which sizes from the wizard it hosts. */
3400
3447
  size = input('sm', /* @ts-ignore */
3401
3448
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
3402
3449
  /** Hide the footer slot. */
@@ -3406,6 +3453,11 @@ class StrctModal {
3406
3453
  * content (a `flush` vertical wizard) is the dialog surface. `title` still
3407
3454
  * names the dialog for assistive tech; backdrop/Escape dismissal follow
3408
3455
  * `dismissible` as usual.
3456
+ *
3457
+ * The dialog's width comes from the wizard's geometry, not from `size`:
3458
+ * rail + `--strct-wiz-content-min` (default 864px) [+ aside]. To change it,
3459
+ * set that variable on this `strct-modal` or an ancestor — the dialog reads
3460
+ * it on itself, so setting it on the `strct-wizard` inside does not reach it.
3409
3461
  */
3410
3462
  chromeless = input(false, { ...(ngDevMode ? { debugName: "chromeless" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
3411
3463
  /** Accessible label of the X close button (localizable). */
@@ -3431,6 +3483,22 @@ class StrctModal {
3431
3483
  ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
3432
3484
  /** Emitted when the alert is dismissed. */
3433
3485
  closed = output();
3486
+ /** Lazily rendered body, if one is provided (see {@link StrctModalContent}). */
3487
+ lazyContent = contentChild(StrctModalContent, /* @ts-ignore */
3488
+ ...(ngDevMode ? [{ debugName: "lazyContent" }] : /* istanbul ignore next */ []));
3489
+ // Dev mode only: `size` is accepted alongside `chromeless` but cannot apply.
3490
+ sizeDiagnostic = typeof ngDevMode !== 'undefined' && ngDevMode
3491
+ ? effect(() => {
3492
+ const size = this.size();
3493
+ if (this.chromeless() && size !== 'sm') {
3494
+ strctDevWarn(`modal:chromeless-size:${size}`, `[strct-modal] size="${size}" has no effect with chromeless: a chromeless ` +
3495
+ `dialog sizes itself from the wizard it hosts (rail + --strct-wiz-content-min, ` +
3496
+ `default 864px). To change its width, set --strct-wiz-content-min on the ` +
3497
+ `strct-modal or an ancestor — on the strct-wizard alone it does not reach ` +
3498
+ `the dialog.`);
3499
+ }
3500
+ })
3501
+ : null;
3434
3502
  titleId = `strct-modal-${++modalCounter}`;
3435
3503
  /** Element that had focus before the dialog opened, restored on close. */
3436
3504
  previousActive = null;
@@ -3573,7 +3641,7 @@ class StrctModal {
3573
3641
  (items[0] ?? this.dialog())?.focus();
3574
3642
  }
3575
3643
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: StrctModal, deps: [], target: i0.ɵɵFactoryTarget.Component });
3576
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.4", type: StrctModal, isStandalone: true, selector: "strct-modal", inputs: { open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, hideFooter: { classPropertyName: "hideFooter", publicName: "hideFooter", isSignal: true, isRequired: false, transformFunction: null }, chromeless: { classPropertyName: "chromeless", publicName: "chromeless", isSignal: true, isRequired: false, transformFunction: null }, closeLabel: { classPropertyName: "closeLabel", publicName: "closeLabel", isSignal: true, isRequired: false, transformFunction: null }, dismissible: { classPropertyName: "dismissible", publicName: "dismissible", isSignal: true, isRequired: false, transformFunction: null }, draggable: { classPropertyName: "draggable", publicName: "draggable", isSignal: true, isRequired: false, transformFunction: null }, panelClass: { classPropertyName: "panelClass", publicName: "panelClass", isSignal: true, isRequired: false, transformFunction: null }, backdropClass: { classPropertyName: "backdropClass", publicName: "backdropClass", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", closed: "closed" }, host: { listeners: { "document:keydown.escape": "onEscape()" } }, ngImport: i0, template: `
3644
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.4", type: StrctModal, isStandalone: true, selector: "strct-modal", inputs: { open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, hideFooter: { classPropertyName: "hideFooter", publicName: "hideFooter", isSignal: true, isRequired: false, transformFunction: null }, chromeless: { classPropertyName: "chromeless", publicName: "chromeless", isSignal: true, isRequired: false, transformFunction: null }, closeLabel: { classPropertyName: "closeLabel", publicName: "closeLabel", isSignal: true, isRequired: false, transformFunction: null }, dismissible: { classPropertyName: "dismissible", publicName: "dismissible", isSignal: true, isRequired: false, transformFunction: null }, draggable: { classPropertyName: "draggable", publicName: "draggable", isSignal: true, isRequired: false, transformFunction: null }, panelClass: { classPropertyName: "panelClass", publicName: "panelClass", isSignal: true, isRequired: false, transformFunction: null }, backdropClass: { classPropertyName: "backdropClass", publicName: "backdropClass", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", closed: "closed" }, host: { listeners: { "document:keydown.escape": "onEscape()" } }, queries: [{ propertyName: "lazyContent", first: true, predicate: StrctModalContent, descendants: true, isSignal: true }], ngImport: i0, template: `
3577
3645
  @if (open()) {
3578
3646
  <!-- Backdrop: pointer-only dismiss target. No role/tabindex — keyboard users
3579
3647
  dismiss via Escape, and the focus trap makes the backdrop unreachable
@@ -3619,18 +3687,23 @@ class StrctModal {
3619
3687
  </button>
3620
3688
  </div>
3621
3689
  }
3622
- <div class="strct-modal__body"><ng-content /></div>
3690
+ <div class="strct-modal__body">
3691
+ <ng-content />
3692
+ @if (lazyContent(); as lazy) {
3693
+ <ng-container [ngTemplateOutlet]="lazy.template" />
3694
+ }
3695
+ </div>
3623
3696
  @if (!hideFooter() && !chromeless()) {
3624
3697
  <div class="strct-modal__foot"><ng-content select="[strctModalFooter]" /></div>
3625
3698
  }
3626
3699
  </div>
3627
3700
  </div>
3628
3701
  }
3629
- `, isInline: true, styles: [".strct-modal__overlay{position:fixed;inset:0;z-index:var(--z-modal);display:flex;align-items:center;justify-content:center;padding:var(--space-5);background:var(--backdrop);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);animation:strct-modal-fade .12s ease}@media(max-width:768px){.strct-modal__overlay{padding:var(--space-3)}}.strct-modal__dialog{width:100%;max-height:calc(100vh - 48px);display:flex;flex-direction:column;background:var(--bg-1);border:1px solid var(--b2);border-radius:var(--radius-xl);box-shadow:var(--shadow-elevated);overflow:hidden;animation:strct-modal-rise .14s ease}.strct-modal__dialog--sm{max-width:min(480px,calc(100vw - 32px))}.strct-modal__dialog--md{max-width:min(640px,calc(100vw - 32px))}.strct-modal__dialog--lg{max-width:min(860px,calc(100vw - 32px))}.strct-modal__dialog--xl{max-width:min(1080px,calc(100vw - 32px))}.strct-modal__head{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);padding:var(--space-3) var(--space-4);border-bottom:1px solid var(--b1)}.strct-modal__head--drag{cursor:move;-webkit-user-select:none;user-select:none;touch-action:none}.strct-modal__overlay--glass{background:#00000061;-webkit-backdrop-filter:blur(10px) saturate(1.25);backdrop-filter:blur(10px) saturate(1.25)}.strct-modal__dialog--glass{background:color-mix(in srgb,var(--bg-1) 72%,transparent);-webkit-backdrop-filter:blur(24px) saturate(1.4);backdrop-filter:blur(24px) saturate(1.4)}.strct-modal__dialog--glass .strct-modal__foot{background:color-mix(in srgb,var(--bg-2) 55%,transparent)}.strct-modal__title{font-size:14px;font-weight:600;color:var(--t1)}.strct-modal__close{display:inline-flex;padding:4px;border:0;border-radius:5px;background:transparent;color:var(--t3);cursor:pointer}.strct-modal__close:hover{color:var(--t1);background:var(--bg-3)}.strct-modal__body{padding:var(--space-4);overflow-y:auto;color:var(--t2);font-size:13px}.strct-modal__dialog--chromeless{width:calc(232px + var(--strct-wiz-content-min, 864px) + 2px);max-width:calc(100vw - 32px)}.strct-modal__dialog--chromeless:has(.strct-wiz__layout--aside){width:calc(232px + var(--strct-wiz-content-min, 864px) + 280px + 2px)}.strct-modal__dialog--chromeless .strct-modal__body{padding:0;overflow:hidden;display:flex;flex-direction:column}.strct-modal__dialog--chromeless .strct-modal__body>*{flex:1;min-height:0}.strct-modal__foot{display:flex;align-items:center;justify-content:flex-end;gap:var(--space-2);padding:var(--space-3) var(--space-4);border-top:1px solid var(--b1);background:var(--bg-2)}@keyframes strct-modal-fade{0%{opacity:0}}@keyframes strct-modal-rise{0%{opacity:0;transform:translateY(8px) scale(.98)}}@media(prefers-reduced-motion:reduce){.strct-modal__overlay,.strct-modal__dialog{animation:none}}\n"], dependencies: [{ kind: "component", type: StrctIcon, selector: "strct-icon", inputs: ["name", "strictName", "size", "strokeWidth", "badge", "ariaLabel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3702
+ `, isInline: true, styles: [".strct-modal__overlay{position:fixed;inset:0;z-index:var(--z-modal);display:flex;align-items:center;justify-content:center;padding:var(--space-5);background:var(--backdrop);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);animation:strct-modal-fade .12s ease}@media(max-width:768px){.strct-modal__overlay{padding:var(--space-3)}}.strct-modal__dialog{width:100%;max-height:calc(100vh - 48px);display:flex;flex-direction:column;background:var(--bg-1);border:1px solid var(--b2);border-radius:var(--radius-xl);box-shadow:var(--shadow-elevated);overflow:hidden;animation:strct-modal-rise .14s ease}.strct-modal__dialog--sm{max-width:min(480px,calc(100vw - 32px))}.strct-modal__dialog--md{max-width:min(640px,calc(100vw - 32px))}.strct-modal__dialog--lg{max-width:min(860px,calc(100vw - 32px))}.strct-modal__dialog--xl{max-width:min(1080px,calc(100vw - 32px))}.strct-modal__head{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);padding:var(--space-3) var(--space-4);border-bottom:1px solid var(--b1)}.strct-modal__head--drag{cursor:move;-webkit-user-select:none;user-select:none;touch-action:none}.strct-modal__overlay--glass{background:#00000061;-webkit-backdrop-filter:blur(10px) saturate(1.25);backdrop-filter:blur(10px) saturate(1.25)}.strct-modal__dialog--glass{background:color-mix(in srgb,var(--bg-1) 72%,transparent);-webkit-backdrop-filter:blur(24px) saturate(1.4);backdrop-filter:blur(24px) saturate(1.4)}.strct-modal__dialog--glass .strct-modal__foot{background:color-mix(in srgb,var(--bg-2) 55%,transparent)}.strct-modal__title{font-size:14px;font-weight:600;color:var(--t1)}.strct-modal__close{display:inline-flex;padding:4px;border:0;border-radius:5px;background:transparent;color:var(--t3);cursor:pointer}.strct-modal__close:hover{color:var(--t1);background:var(--bg-3)}.strct-modal__body{padding:var(--space-4);overflow-y:auto;color:var(--t2);font-size:13px}.strct-modal__dialog--chromeless{width:calc(232px + var(--strct-wiz-content-min, 864px) + 2px);max-width:calc(100vw - 32px)}.strct-modal__dialog--chromeless:has(.strct-wiz__layout--aside){width:calc(232px + var(--strct-wiz-content-min, 864px) + 280px + 2px)}.strct-modal__dialog--chromeless .strct-modal__body{padding:0;overflow:hidden;display:flex;flex-direction:column}.strct-modal__dialog--chromeless .strct-modal__body>*{flex:1;min-height:0}.strct-modal__foot{display:flex;align-items:center;justify-content:flex-end;gap:var(--space-2);padding:var(--space-3) var(--space-4);border-top:1px solid var(--b1);background:var(--bg-2)}@keyframes strct-modal-fade{0%{opacity:0}}@keyframes strct-modal-rise{0%{opacity:0;transform:translateY(8px) scale(.98)}}@media(prefers-reduced-motion:reduce){.strct-modal__overlay,.strct-modal__dialog{animation:none}}\n"], dependencies: [{ kind: "component", type: StrctIcon, selector: "strct-icon", inputs: ["name", "strictName", "size", "strokeWidth", "badge", "ariaLabel"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3630
3703
  }
3631
3704
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: StrctModal, decorators: [{
3632
3705
  type: Component,
3633
- args: [{ selector: 'strct-modal', changeDetection: ChangeDetectionStrategy.OnPush, imports: [StrctIcon], template: `
3706
+ args: [{ selector: 'strct-modal', changeDetection: ChangeDetectionStrategy.OnPush, imports: [StrctIcon, NgTemplateOutlet], template: `
3634
3707
  @if (open()) {
3635
3708
  <!-- Backdrop: pointer-only dismiss target. No role/tabindex — keyboard users
3636
3709
  dismiss via Escape, and the focus trap makes the backdrop unreachable
@@ -3676,7 +3749,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImpor
3676
3749
  </button>
3677
3750
  </div>
3678
3751
  }
3679
- <div class="strct-modal__body"><ng-content /></div>
3752
+ <div class="strct-modal__body">
3753
+ <ng-content />
3754
+ @if (lazyContent(); as lazy) {
3755
+ <ng-container [ngTemplateOutlet]="lazy.template" />
3756
+ }
3757
+ </div>
3680
3758
  @if (!hideFooter() && !chromeless()) {
3681
3759
  <div class="strct-modal__foot"><ng-content select="[strctModalFooter]" /></div>
3682
3760
  }
@@ -3686,7 +3764,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImpor
3686
3764
  `, host: {
3687
3765
  '(document:keydown.escape)': 'onEscape()',
3688
3766
  }, styles: [".strct-modal__overlay{position:fixed;inset:0;z-index:var(--z-modal);display:flex;align-items:center;justify-content:center;padding:var(--space-5);background:var(--backdrop);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);animation:strct-modal-fade .12s ease}@media(max-width:768px){.strct-modal__overlay{padding:var(--space-3)}}.strct-modal__dialog{width:100%;max-height:calc(100vh - 48px);display:flex;flex-direction:column;background:var(--bg-1);border:1px solid var(--b2);border-radius:var(--radius-xl);box-shadow:var(--shadow-elevated);overflow:hidden;animation:strct-modal-rise .14s ease}.strct-modal__dialog--sm{max-width:min(480px,calc(100vw - 32px))}.strct-modal__dialog--md{max-width:min(640px,calc(100vw - 32px))}.strct-modal__dialog--lg{max-width:min(860px,calc(100vw - 32px))}.strct-modal__dialog--xl{max-width:min(1080px,calc(100vw - 32px))}.strct-modal__head{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);padding:var(--space-3) var(--space-4);border-bottom:1px solid var(--b1)}.strct-modal__head--drag{cursor:move;-webkit-user-select:none;user-select:none;touch-action:none}.strct-modal__overlay--glass{background:#00000061;-webkit-backdrop-filter:blur(10px) saturate(1.25);backdrop-filter:blur(10px) saturate(1.25)}.strct-modal__dialog--glass{background:color-mix(in srgb,var(--bg-1) 72%,transparent);-webkit-backdrop-filter:blur(24px) saturate(1.4);backdrop-filter:blur(24px) saturate(1.4)}.strct-modal__dialog--glass .strct-modal__foot{background:color-mix(in srgb,var(--bg-2) 55%,transparent)}.strct-modal__title{font-size:14px;font-weight:600;color:var(--t1)}.strct-modal__close{display:inline-flex;padding:4px;border:0;border-radius:5px;background:transparent;color:var(--t3);cursor:pointer}.strct-modal__close:hover{color:var(--t1);background:var(--bg-3)}.strct-modal__body{padding:var(--space-4);overflow-y:auto;color:var(--t2);font-size:13px}.strct-modal__dialog--chromeless{width:calc(232px + var(--strct-wiz-content-min, 864px) + 2px);max-width:calc(100vw - 32px)}.strct-modal__dialog--chromeless:has(.strct-wiz__layout--aside){width:calc(232px + var(--strct-wiz-content-min, 864px) + 280px + 2px)}.strct-modal__dialog--chromeless .strct-modal__body{padding:0;overflow:hidden;display:flex;flex-direction:column}.strct-modal__dialog--chromeless .strct-modal__body>*{flex:1;min-height:0}.strct-modal__foot{display:flex;align-items:center;justify-content:flex-end;gap:var(--space-2);padding:var(--space-3) var(--space-4);border-top:1px solid var(--b1);background:var(--bg-2)}@keyframes strct-modal-fade{0%{opacity:0}}@keyframes strct-modal-rise{0%{opacity:0;transform:translateY(8px) scale(.98)}}@media(prefers-reduced-motion:reduce){.strct-modal__overlay,.strct-modal__dialog{animation:none}}\n"] }]
3689
- }], ctorParameters: () => [], propDecorators: { open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], hideFooter: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideFooter", required: false }] }], chromeless: [{ type: i0.Input, args: [{ isSignal: true, alias: "chromeless", required: false }] }], closeLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeLabel", required: false }] }], dismissible: [{ type: i0.Input, args: [{ isSignal: true, alias: "dismissible", required: false }] }], draggable: [{ type: i0.Input, args: [{ isSignal: true, alias: "draggable", required: false }] }], panelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelClass", required: false }] }], backdropClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "backdropClass", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], closed: [{ type: i0.Output, args: ["closed"] }] } });
3767
+ }], ctorParameters: () => [], propDecorators: { open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], hideFooter: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideFooter", required: false }] }], chromeless: [{ type: i0.Input, args: [{ isSignal: true, alias: "chromeless", required: false }] }], closeLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeLabel", required: false }] }], dismissible: [{ type: i0.Input, args: [{ isSignal: true, alias: "dismissible", required: false }] }], draggable: [{ type: i0.Input, args: [{ isSignal: true, alias: "draggable", required: false }] }], panelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelClass", required: false }] }], backdropClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "backdropClass", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], closed: [{ type: i0.Output, args: ["closed"] }], lazyContent: [{ type: i0.ContentChild, args: [i0.forwardRef(() => StrctModalContent), { isSignal: true }] }] } });
3690
3768
 
3691
3769
  /** Marks the drawer's footer action area: `<ng-container strctDrawerFooter>…`. */
3692
3770
  class StrctDrawerFooter {
@@ -4668,7 +4746,10 @@ class StrctWizard {
4668
4746
  * ~720px of component width — it never flips horizontal.
4669
4747
  *
4670
4748
  * The default can be flipped app-wide via `provideStrctWizardDefaults`;
4671
- * this input always wins when bound.
4749
+ * this input always wins when bound. **Tests:** a spec that renders a
4750
+ * component using `strct-wizard` must provide the same defaults the app
4751
+ * does, or it renders the horizontal layout — a different DOM, no rail,
4752
+ * no title.
4672
4753
  */
4673
4754
  vertical = input(this.defaults?.vertical ?? false, { ...(ngDevMode ? { debugName: "vertical" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
4674
4755
  /**
@@ -4678,7 +4759,8 @@ class StrctWizard {
4678
4759
  * Size the host with width/height only; do not override its `display`.
4679
4760
  */
4680
4761
  flush = input(false, { ...(ngDevMode ? { debugName: "flush" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
4681
- /** Rail heading shown above the progress bar (vertical mode). */
4762
+ /** Rail heading shown above the progress bar. Vertical mode only — the
4763
+ * horizontal layout has no title band (a dev-mode warning says so). */
4682
4764
  title = input('', /* @ts-ignore */
4683
4765
  ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
4684
4766
  /**
@@ -4730,6 +4812,8 @@ class StrctWizard {
4730
4812
  canAdvance = computed(() => this.steps()[this.current()]?.canAdvance() ?? true, /* @ts-ignore */
4731
4813
  ...(ngDevMode ? [{ debugName: "canAdvance" }] : /* istanbul ignore next */ []));
4732
4814
  constructor() {
4815
+ if (typeof ngDevMode !== 'undefined' && ngDevMode)
4816
+ this.diagnose();
4733
4817
  effect(() => {
4734
4818
  const idx = this.current();
4735
4819
  this.steps().forEach((step, i) => step.setActive(i === idx));
@@ -4739,6 +4823,37 @@ class StrctWizard {
4739
4823
  });
4740
4824
  });
4741
4825
  }
4826
+ /** Dev-mode warnings for inputs the current layout silently ignores. */
4827
+ diagnose() {
4828
+ if (!(typeof ngDevMode !== 'undefined' && ngDevMode))
4829
+ return;
4830
+ effect(() => {
4831
+ const title = this.title();
4832
+ if (title && !this.vertical()) {
4833
+ strctDevWarn('wizard:horizontal-title', `[strct-wizard] title="${title}" is not rendered: only the vertical layout ` +
4834
+ `has a title band. Set \`vertical\` — or, if the app provides ` +
4835
+ `provideStrctWizardDefaults({ vertical: true }), provide it here too ` +
4836
+ `(a test that omits it renders the horizontal wizard).`);
4837
+ }
4838
+ });
4839
+ // A chromeless dialog sizes itself from --strct-wiz-content-min read on the
4840
+ // DIALOG; set on the wizard, it widens the grid but not the dialog.
4841
+ const host = inject((ElementRef)).nativeElement;
4842
+ afterNextRender(() => {
4843
+ const dialog = host.closest('.strct-modal__dialog--chromeless');
4844
+ if (!dialog)
4845
+ return;
4846
+ const prop = '--strct-wiz-content-min';
4847
+ const own = getComputedStyle(host).getPropertyValue(prop).trim();
4848
+ const outer = getComputedStyle(dialog).getPropertyValue(prop).trim();
4849
+ if (own !== outer) {
4850
+ strctDevWarn('wizard:content-min-scope', `[strct-wizard] ${prop} is ${own || '(unset)'} on the wizard but ` +
4851
+ `${outer || '(unset — default 864px)'} on its chromeless dialog. The dialog ` +
4852
+ `reads the variable on itself, so its width ignores the wizard's value. Set ` +
4853
+ `it on the strct-modal or an ancestor instead.`);
4854
+ }
4855
+ });
4856
+ }
4742
4857
  next() {
4743
4858
  if (!this.isLast() && this.canAdvance()) {
4744
4859
  this.current.update((i) => i + 1);
@@ -10492,7 +10607,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImpor
10492
10607
  * Per-column cell template for `strct-table` / `strct-datagrid`. The column key
10493
10608
  * is the directive value; the row, value and column are the template context:
10494
10609
  *
10495
- * <ng-template strctCell="status" let-row let-value="value">
10610
+ * <ng-template strctCell="status" let-row let-value="value"> (let-row="row" also works)
10496
10611
  * <strct-badge [status]="row['success'] ? 'success' : 'critical'">{{ value }}</strct-badge>
10497
10612
  * </ng-template>
10498
10613
  */
@@ -10576,6 +10691,7 @@ class StrctTable {
10576
10691
  [ngTemplateOutlet]="tpl"
10577
10692
  [ngTemplateOutletContext]="{
10578
10693
  $implicit: row,
10694
+ row,
10579
10695
  value: row[col.key],
10580
10696
  column: col,
10581
10697
  }"
@@ -10632,6 +10748,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImpor
10632
10748
  [ngTemplateOutlet]="tpl"
10633
10749
  [ngTemplateOutletContext]="{
10634
10750
  $implicit: row,
10751
+ row,
10635
10752
  value: row[col.key],
10636
10753
  column: col,
10637
10754
  }"
@@ -10809,7 +10926,7 @@ const UTIL_W = { detail: 36, expand: 36, sel: 40 };
10809
10926
  const STICKY_FALLBACK_W = 120;
10810
10927
  /**
10811
10928
  * Marks the expandable-row detail template. The row is the template's implicit
10812
- * context: `<ng-template strctRowDetail let-row> … {{ row['name'] }} … </ng-template>`.
10929
+ * context (`let-row`, or `let-row="row"`): `<ng-template strctRowDetail let-row> … {{ row['name'] }} … </ng-template>`.
10813
10930
  */
10814
10931
  class StrctRowDetailDef {
10815
10932
  template = inject(TemplateRef);
@@ -11603,6 +11720,55 @@ class StrctDatagrid {
11603
11720
  somePageSelected = computed(() => !this.allPageSelected() &&
11604
11721
  this.selectionRows().some((r) => this.selected().has(this.idOf(r))), /* @ts-ignore */
11605
11722
  ...(ngDevMode ? [{ debugName: "somePageSelected" }] : /* istanbul ignore next */ []));
11723
+ /** Dev-mode check that row identities can do their job (see util/dev-warn). */
11724
+ diagnoseIdentity(rowId, rows, init, lazy) {
11725
+ if (!(typeof ngDevMode !== 'undefined' && ngDevMode))
11726
+ return;
11727
+ if (rows.length === 0)
11728
+ return;
11729
+ const label = rowId == null ? '' : typeof rowId === 'function' ? 'rowId (function)' : `rowId="${rowId}"`;
11730
+ if (rowId != null) {
11731
+ const seen = new Set();
11732
+ const dupes = new Set();
11733
+ let unresolved = 0;
11734
+ for (const r of rows) {
11735
+ const raw = typeof rowId === 'function' ? rowId(r) : r[rowId];
11736
+ if (raw == null)
11737
+ unresolved++;
11738
+ else if (seen.has(raw))
11739
+ dupes.add(raw);
11740
+ else
11741
+ seen.add(raw);
11742
+ }
11743
+ if (dupes.size > 0) {
11744
+ const sample = [...dupes]
11745
+ .slice(0, 3)
11746
+ .map((v) => JSON.stringify(v))
11747
+ .join(', ');
11748
+ strctDevWarn(`datagrid:dupe:${label}`, `[strct-datagrid] ${label} resolves to the same value for more than one row ` +
11749
+ `(${sample}). Selection and expansion key on this value, so those rows ` +
11750
+ `will behave as one. Give each row a distinct value, or drop rowId to key ` +
11751
+ `on the row object.`);
11752
+ }
11753
+ if (unresolved > 0) {
11754
+ strctDevWarn(`datagrid:unresolved:${label}`, `[strct-datagrid] ${label} does not resolve for ${unresolved} of ${rows.length} ` +
11755
+ `rows. Those rows fall back to object identity, so their selection and ` +
11756
+ `expansion will not survive a data refresh. Check the field name, or give ` +
11757
+ `every row a value.`);
11758
+ }
11759
+ }
11760
+ // Lazy mode seeds ids for rows on other pages, so a miss there is normal.
11761
+ if (!lazy && init && init.length > 0) {
11762
+ const ids = new Set(rows.map((r) => this.idOf(r)));
11763
+ if (!init.some((v) => ids.has(v))) {
11764
+ strctDevWarn(`datagrid:init:${label}`, `[strct-datagrid] initialSelection has ${init.length} value(s), none of which ` +
11765
+ (rowId == null
11766
+ ? `is one of the rows — with no rowId, the values must be the row objects themselves. `
11767
+ : `matches any row's ${label}. `) +
11768
+ `The pre-selection will be empty.`);
11769
+ }
11770
+ }
11771
+ }
11606
11772
  /** Resolve a row's stable identity: its `rowId` value, or the row object
11607
11773
  * itself when there is no `rowId` or it resolves to null/undefined. */
11608
11774
  idOf(row) {
@@ -11654,6 +11820,17 @@ class StrctDatagrid {
11654
11820
  return;
11655
11821
  untracked(() => this.selected.set(new Set(init)));
11656
11822
  });
11823
+ // Dev mode only: say so when rowId or initialSelection cannot do what they
11824
+ // were given to do. In production the effect is never registered.
11825
+ if (typeof ngDevMode !== 'undefined' && ngDevMode) {
11826
+ effect(() => {
11827
+ const rowId = this.rowId();
11828
+ const rows = this.rows();
11829
+ const init = this.initialSelection();
11830
+ const lazy = this.lazy();
11831
+ untracked(() => this.diagnoseIdentity(rowId, rows, init, lazy));
11832
+ });
11833
+ }
11657
11834
  // Server-side mode: announce what to load whenever page / sort / pageSize
11658
11835
  // change (and once on init, so the consumer fetches the first page).
11659
11836
  effect(() => {
@@ -12340,6 +12517,7 @@ class StrctDatagrid {
12340
12517
  [ngTemplateOutlet]="tpl"
12341
12518
  [ngTemplateOutletContext]="{
12342
12519
  $implicit: row,
12520
+ row,
12343
12521
  value: row[col.key],
12344
12522
  column: col,
12345
12523
  }"
@@ -12368,7 +12546,7 @@ class StrctDatagrid {
12368
12546
  <div class="strct-dg__detail">
12369
12547
  <ng-container
12370
12548
  [ngTemplateOutlet]="detailDef()!.template"
12371
- [ngTemplateOutletContext]="{ $implicit: row }"
12549
+ [ngTemplateOutletContext]="{ $implicit: row, row }"
12372
12550
  />
12373
12551
  </div>
12374
12552
  </td>
@@ -12406,7 +12584,7 @@ class StrctDatagrid {
12406
12584
  <div class="strct-dg__pane-body">
12407
12585
  <ng-container
12408
12586
  [ngTemplateOutlet]="detailDef()!.template"
12409
- [ngTemplateOutletContext]="{ $implicit: activeRow() }"
12587
+ [ngTemplateOutletContext]="{ $implicit: activeRow(), row: activeRow() }"
12410
12588
  />
12411
12589
  </div>
12412
12590
  </aside>
@@ -12829,6 +13007,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImpor
12829
13007
  [ngTemplateOutlet]="tpl"
12830
13008
  [ngTemplateOutletContext]="{
12831
13009
  $implicit: row,
13010
+ row,
12832
13011
  value: row[col.key],
12833
13012
  column: col,
12834
13013
  }"
@@ -12857,7 +13036,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImpor
12857
13036
  <div class="strct-dg__detail">
12858
13037
  <ng-container
12859
13038
  [ngTemplateOutlet]="detailDef()!.template"
12860
- [ngTemplateOutletContext]="{ $implicit: row }"
13039
+ [ngTemplateOutletContext]="{ $implicit: row, row }"
12861
13040
  />
12862
13041
  </div>
12863
13042
  </td>
@@ -12895,7 +13074,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImpor
12895
13074
  <div class="strct-dg__pane-body">
12896
13075
  <ng-container
12897
13076
  [ngTemplateOutlet]="detailDef()!.template"
12898
- [ngTemplateOutletContext]="{ $implicit: activeRow() }"
13077
+ [ngTemplateOutletContext]="{ $implicit: activeRow(), row: activeRow() }"
12899
13078
  />
12900
13079
  </div>
12901
13080
  </aside>
@@ -21573,5 +21752,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImpor
21573
21752
  * Generated bundle index. Do not edit.
21574
21753
  */
21575
21754
 
21576
- export { FOCUSABLE_SELECTOR, STRCT_DP_DOW, STRCT_DP_DOW_FULL, STRCT_DP_MONTHS, STRCT_ICONS, STRCT_ICON_GROUPS, STRCT_ICON_NAMES, STRCT_MASKS, STRCT_NOTIFICATION_HISTORY_LIMIT, STRCT_PALETTES, STRCT_RAW_ICONS, STRCT_TIME_RANGE_PRESETS, STRCT_WIZARD_DEFAULTS, StrctAccordion, StrctAccordionPanel, StrctAlert, StrctAnnouncer, StrctAvatar, StrctBadge, StrctBreadcrumb, StrctBreadcrumbItem, StrctButton, StrctButtonGroup, StrctBytesPipe, StrctCard, StrctCardBlock, StrctCardFooter, StrctCardHeader, StrctCascadeColumn, StrctCascadeHost, StrctCascadeSelect, StrctCellDef, StrctCellStatus, StrctChart, StrctCheckbox, StrctChips, StrctCode, StrctColorPicker, StrctCombobox, StrctCommandPalette, StrctConfirmOutlet, StrctConfirmService, StrctContextMenu, StrctContextMenuTrigger, StrctCopy, StrctDatagrid, StrctDatagridActionBar, StrctDatepicker, StrctDatetimePicker, StrctDesc, StrctDescriptionList, StrctDiff, StrctDivider, StrctDonut, StrctDrawer, StrctDrawerFooter, StrctDropdown, StrctDropdownDivider, StrctDropdownItem, StrctDropdownTrigger, StrctDurationPipe, StrctEmptyState, StrctField, StrctFile, StrctFilterBar, StrctFlow, StrctFooter, StrctGauge, StrctHeader, StrctHeatmap, StrctHero, StrctHotkeysHelp, StrctHotkeysService, StrctIcon, StrctInlineEdit, StrctInput, StrctInputMask, StrctInputOtp, StrctKbd, StrctKnob, StrctLogViewer, StrctLogin, StrctMenuPanel, StrctMenuService, StrctMenubar, StrctMetricTile, StrctModal, StrctNav, StrctNavItem, StrctNotificationCenter, StrctNumber, StrctOverlay, StrctPageHeader, StrctPageHeaderActions, StrctPageHeaderCrumbs, StrctPagination, StrctPassword, StrctPopover, StrctPopoverTrigger, StrctProgress, StrctRadio, StrctRadioGroup, StrctRail, StrctRange, StrctRatePipe, StrctRating, StrctReorder, StrctReorderItem, StrctRowDetailDef, StrctSearchbox, StrctSectionMenu, StrctSegmented, StrctSelect, StrctShell, StrctShellService, StrctSiPipe, StrctSignpost, StrctSignpostTrigger, StrctSkeleton, StrctSparkline, StrctSpeedDial, StrctSpinner, StrctSplitButton, StrctSplitter, StrctStack, StrctStackItem, StrctStatusDot, StrctStep, StrctSubmenu, StrctTab, StrctTable, StrctTabs, StrctTag, StrctThemeService, StrctThemeSwitcher, StrctTimeRangePicker, StrctTimeline, StrctTimelineItem, StrctToastOutlet, StrctToastService, StrctToggle, StrctToolbar, StrctToolbarSpacer, StrctTooltip, StrctTour, StrctTransfer, StrctTree, StrctTreeNode, StrctTreeSelect, StrctVerticalNav, StrctWatermark, StrctWizard, StrctWizardAside, focusFirstIn, keepTabInside, lockBodyScroll, parseAnsi, provideStrctWizardDefaults, registerStrctIcon, restoreFocus, saveFocusedElement, strctComputeDiff, strctDpPad, strctFormatBytes, strctFormatDuration, strctFormatRate, strctFormatSi, strctValidationIcon, strctValidationTone, unlockBodyScroll };
21755
+ export { FOCUSABLE_SELECTOR, STRCT_DP_DOW, STRCT_DP_DOW_FULL, STRCT_DP_MONTHS, STRCT_ICONS, STRCT_ICON_GROUPS, STRCT_ICON_NAMES, STRCT_MASKS, STRCT_NOTIFICATION_HISTORY_LIMIT, STRCT_PALETTES, STRCT_RAW_ICONS, STRCT_TIME_RANGE_PRESETS, STRCT_WIZARD_DEFAULTS, StrctAccordion, StrctAccordionPanel, StrctAlert, StrctAnnouncer, StrctAvatar, StrctBadge, StrctBreadcrumb, StrctBreadcrumbItem, StrctButton, StrctButtonGroup, StrctBytesPipe, StrctCard, StrctCardBlock, StrctCardFooter, StrctCardHeader, StrctCascadeColumn, StrctCascadeHost, StrctCascadeSelect, StrctCellDef, StrctCellStatus, StrctChart, StrctCheckbox, StrctChips, StrctCode, StrctColorPicker, StrctCombobox, StrctCommandPalette, StrctConfirmOutlet, StrctConfirmService, StrctContextMenu, StrctContextMenuTrigger, StrctCopy, StrctDatagrid, StrctDatagridActionBar, StrctDatepicker, StrctDatetimePicker, StrctDesc, StrctDescriptionList, StrctDiff, StrctDivider, StrctDonut, StrctDrawer, StrctDrawerFooter, StrctDropdown, StrctDropdownDivider, StrctDropdownItem, StrctDropdownTrigger, StrctDurationPipe, StrctEmptyState, StrctField, StrctFile, StrctFilterBar, StrctFlow, StrctFooter, StrctGauge, StrctHeader, StrctHeatmap, StrctHero, StrctHotkeysHelp, StrctHotkeysService, StrctIcon, StrctInlineEdit, StrctInput, StrctInputMask, StrctInputOtp, StrctKbd, StrctKnob, StrctLogViewer, StrctLogin, StrctMenuPanel, StrctMenuService, StrctMenubar, StrctMetricTile, StrctModal, StrctModalContent, StrctNav, StrctNavItem, StrctNotificationCenter, StrctNumber, StrctOverlay, StrctPageHeader, StrctPageHeaderActions, StrctPageHeaderCrumbs, StrctPagination, StrctPassword, StrctPopover, StrctPopoverTrigger, StrctProgress, StrctRadio, StrctRadioGroup, StrctRail, StrctRange, StrctRatePipe, StrctRating, StrctReorder, StrctReorderItem, StrctRowDetailDef, StrctSearchbox, StrctSectionMenu, StrctSegmented, StrctSelect, StrctShell, StrctShellService, StrctSiPipe, StrctSignpost, StrctSignpostTrigger, StrctSkeleton, StrctSparkline, StrctSpeedDial, StrctSpinner, StrctSplitButton, StrctSplitter, StrctStack, StrctStackItem, StrctStatusDot, StrctStep, StrctSubmenu, StrctTab, StrctTable, StrctTabs, StrctTag, StrctThemeService, StrctThemeSwitcher, StrctTimeRangePicker, StrctTimeline, StrctTimelineItem, StrctToastOutlet, StrctToastService, StrctToggle, StrctToolbar, StrctToolbarSpacer, StrctTooltip, StrctTour, StrctTransfer, StrctTree, StrctTreeNode, StrctTreeSelect, StrctVerticalNav, StrctWatermark, StrctWizard, StrctWizardAside, focusFirstIn, keepTabInside, lockBodyScroll, parseAnsi, provideStrctWizardDefaults, registerStrctIcon, restoreFocus, saveFocusedElement, strctComputeDiff, strctDpPad, strctFormatBytes, strctFormatDuration, strctFormatRate, strctFormatSi, strctValidationIcon, strctValidationTone, unlockBodyScroll };
21577
21756
  //# sourceMappingURL=akcelik-strct.mjs.map