@litigiovirtual/ius-design-components 2.2.2 → 2.2.3
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 { EventEmitter, signal, booleanAttribute, Output, Input, ChangeDetectionStrategy, Component, inject, NgZone, ElementRef, numberAttribute, ViewChild, ViewContainerRef, forwardRef, computed, viewChildren, input, output, effect, DestroyRef, Directive, contentChild, isDevMode, TemplateRef, ContentChild, linkedSignal, PLATFORM_ID, viewChild, HostListener, afterRenderEffect, Injectable, untracked, contentChildren, ViewChildren } from '@angular/core';
|
|
2
|
+
import { EventEmitter, signal, booleanAttribute, Output, Input, ChangeDetectionStrategy, Component, inject, NgZone, ElementRef, numberAttribute, ViewChild, ViewContainerRef, forwardRef, computed, viewChildren, input, output, effect, DestroyRef, Directive, contentChild, isDevMode, TemplateRef, ContentChild, linkedSignal, PLATFORM_ID, viewChild, HostListener, afterRenderEffect, Injectable, untracked, contentChildren, Injector, afterNextRender, ViewChildren } from '@angular/core';
|
|
3
3
|
import { Overlay } from '@angular/cdk/overlay';
|
|
4
4
|
import { TemplatePortal } from '@angular/cdk/portal';
|
|
5
5
|
import { Subscription, Subject, timer, of, from } from 'rxjs';
|
|
@@ -16251,6 +16251,14 @@ const VIRT_ITEM_H = {
|
|
|
16251
16251
|
};
|
|
16252
16252
|
/** px de margen arriba/abajo de la ventana (igual al rootMargin del centinela). */
|
|
16253
16253
|
const VIRT_OVERSCAN = 240;
|
|
16254
|
+
/**
|
|
16255
|
+
* Ventana que un salto por letra espera a que aparezca su destino (ms). La
|
|
16256
|
+
* necesita el auto-despliegue: el ancla se pinta un render después, y con
|
|
16257
|
+
* `collapsedGroups` controlado hay que darle al consumidor tiempo de aplicar el
|
|
16258
|
+
* set que se le emitió. Acotada a propósito — pasado el plazo el salto se
|
|
16259
|
+
* descarta, para que un render posterior no dispare un desplazamiento sorpresa.
|
|
16260
|
+
*/
|
|
16261
|
+
const SALTO_PENDIENTE_TTL = 2000;
|
|
16254
16262
|
/** Muestreo uniforme de letras cuando el rail no da para todas. */
|
|
16255
16263
|
function sampleEven(arr, n) {
|
|
16256
16264
|
if (n >= arr.length)
|
|
@@ -16458,6 +16466,7 @@ class EntityNavigatorComponent {
|
|
|
16458
16466
|
this.letterAnchors = viewChildren('letterAnchor', /* @ts-ignore */
|
|
16459
16467
|
...(ngDevMode ? [{ debugName: "letterAnchors" }] : /* istanbul ignore next */ []));
|
|
16460
16468
|
this.doc = inject(DOCUMENT);
|
|
16469
|
+
this.injector = inject(Injector);
|
|
16461
16470
|
this.zone = inject(NgZone);
|
|
16462
16471
|
this.destroyRef = inject(DestroyRef);
|
|
16463
16472
|
// ── Estado interno (los pares no controlados) ───────────────────────────
|
|
@@ -16507,8 +16516,8 @@ class EntityNavigatorComponent {
|
|
|
16507
16516
|
this.lmBusy = new Set();
|
|
16508
16517
|
this.lmCounts = new Map();
|
|
16509
16518
|
this.pendingLetter = null;
|
|
16519
|
+
this.pendingDesde = 0;
|
|
16510
16520
|
this.io = null;
|
|
16511
|
-
this.vRaf = 0;
|
|
16512
16521
|
this.isCollapsed = computed(() => this.collapsed() ?? this.internalCollapsed(), /* @ts-ignore */
|
|
16513
16522
|
...(ngDevMode ? [{ debugName: "isCollapsed" }] : /* istanbul ignore next */ []));
|
|
16514
16523
|
/** Grupos plegados efectivos: el input controlado manda sobre el interno. */
|
|
@@ -17216,10 +17225,12 @@ class EntityNavigatorComponent {
|
|
|
17216
17225
|
const suave = !this.prefiereMenosMovimiento();
|
|
17217
17226
|
// El destino puede caer dentro de un grupo plegado: sin sus filas no hay
|
|
17218
17227
|
// ancla ni offset y el rail quedaría clicable pero muerto. Se despliega y
|
|
17219
|
-
// el desplazamiento
|
|
17228
|
+
// el desplazamiento espera a tener layout. `afterNextRender` es lo que lo
|
|
17229
|
+
// garantiza: el efecto de anclas puede correr ANTES de que refresque la
|
|
17230
|
+
// consulta `letterAnchors` y vería el DOM de un turno atrás.
|
|
17220
17231
|
if (this.desplegarGrupoDeLetra(letter)) {
|
|
17221
|
-
this.
|
|
17222
|
-
this.
|
|
17232
|
+
this.dejarSaltoPendiente(letter);
|
|
17233
|
+
afterNextRender(() => this.resolverSaltoPendiente(), { injector: this.injector });
|
|
17223
17234
|
return;
|
|
17224
17235
|
}
|
|
17225
17236
|
// Con ventana de render el ancla puede no estar pintada: el destino sale del
|
|
@@ -17233,8 +17244,7 @@ class EntityNavigatorComponent {
|
|
|
17233
17244
|
return;
|
|
17234
17245
|
}
|
|
17235
17246
|
if (this.hayMasLotes()) {
|
|
17236
|
-
this.
|
|
17237
|
-
this.activeLetter.set(letter);
|
|
17247
|
+
this.dejarSaltoPendiente(letter);
|
|
17238
17248
|
this.dispararTodosLosLotes();
|
|
17239
17249
|
}
|
|
17240
17250
|
return;
|
|
@@ -17243,8 +17253,7 @@ class EntityNavigatorComponent {
|
|
|
17243
17253
|
if (!el) {
|
|
17244
17254
|
// Destino aún no cargado: fuerza lotes hasta que aparezca el ancla.
|
|
17245
17255
|
if (this.hayMasLotes()) {
|
|
17246
|
-
this.
|
|
17247
|
-
this.activeLetter.set(letter);
|
|
17256
|
+
this.dejarSaltoPendiente(letter);
|
|
17248
17257
|
this.dispararTodosLosLotes();
|
|
17249
17258
|
}
|
|
17250
17259
|
return;
|
|
@@ -17253,6 +17262,12 @@ class EntityNavigatorComponent {
|
|
|
17253
17262
|
container.scrollTo({ top: this.topDeAncla(container, el), behavior: suave ? 'smooth' : 'auto' });
|
|
17254
17263
|
this.activeLetter.set(letter);
|
|
17255
17264
|
}
|
|
17265
|
+
/** Deja el salto en espera de su destino, con el sello para acotar la espera. */
|
|
17266
|
+
dejarSaltoPendiente(letter) {
|
|
17267
|
+
this.pendingLetter = letter;
|
|
17268
|
+
this.pendingDesde = Date.now();
|
|
17269
|
+
this.activeLetter.set(letter);
|
|
17270
|
+
}
|
|
17256
17271
|
/**
|
|
17257
17272
|
* Despliega el grupo que contiene `letter` si está plegado. Va por el mismo
|
|
17258
17273
|
* camino que el chevron (`aplicarPlegado`): con `collapsedGroups` controlado
|
|
@@ -17273,6 +17288,20 @@ class EntityNavigatorComponent {
|
|
|
17273
17288
|
this.aplicarPlegado(next);
|
|
17274
17289
|
return true;
|
|
17275
17290
|
}
|
|
17291
|
+
/**
|
|
17292
|
+
* ¿El cuerpo ya pintó las filas del grupo al que pertenece `letter`? Es lo que
|
|
17293
|
+
* distingue «el destino todavía no tiene layout» de «el destino no existe».
|
|
17294
|
+
*/
|
|
17295
|
+
vistaAlDia(root, letter) {
|
|
17296
|
+
const gk = this.barridoDeLetras().grupo.get(letter);
|
|
17297
|
+
if (gk === undefined)
|
|
17298
|
+
return true;
|
|
17299
|
+
for (const sec of root.querySelectorAll('.ius-entnav__section')) {
|
|
17300
|
+
if (sec.getAttribute('data-group') === gk)
|
|
17301
|
+
return !!sec.querySelector('ius-entity-row');
|
|
17302
|
+
}
|
|
17303
|
+
return false;
|
|
17304
|
+
}
|
|
17276
17305
|
anclaDeLetra(letter) {
|
|
17277
17306
|
for (const ref of this.letterAnchors()) {
|
|
17278
17307
|
if (ref.nativeElement.getAttribute('data-letter') === letter)
|
|
@@ -17288,37 +17317,58 @@ class EntityNavigatorComponent {
|
|
|
17288
17317
|
prefiereMenosMovimiento() {
|
|
17289
17318
|
return (typeof matchMedia !== 'undefined' && matchMedia('(prefers-reduced-motion: reduce)').matches);
|
|
17290
17319
|
}
|
|
17291
|
-
/**
|
|
17320
|
+
/**
|
|
17321
|
+
* Reintenta el salto pendiente cada vez que cambian las anclas o el modelo —
|
|
17322
|
+
* el destino puede aparecer tras cargar lotes o tras desplegar su grupo.
|
|
17323
|
+
*/
|
|
17292
17324
|
registrarAnclasDeLetra() {
|
|
17293
17325
|
effect(() => {
|
|
17294
|
-
|
|
17295
|
-
|
|
17296
|
-
|
|
17297
|
-
untracked(() =>
|
|
17298
|
-
const pend = this.pendingLetter;
|
|
17299
|
-
if (!pend || !root)
|
|
17300
|
-
return;
|
|
17301
|
-
const off = this.modelo().virtOn ? letras[pend] : null;
|
|
17302
|
-
const el = anchors
|
|
17303
|
-
.map((r) => r.nativeElement)
|
|
17304
|
-
.find((n) => n.getAttribute('data-letter') === pend);
|
|
17305
|
-
if (off != null || el) {
|
|
17306
|
-
this.pendingLetter = null;
|
|
17307
|
-
const top = off != null ? off : this.topDeAncla(root, el);
|
|
17308
|
-
root.scrollTo({
|
|
17309
|
-
top: Math.max(0, top),
|
|
17310
|
-
behavior: this.prefiereMenosMovimiento() ? 'auto' : 'smooth',
|
|
17311
|
-
});
|
|
17312
|
-
}
|
|
17313
|
-
else if (this.hayMasLotes()) {
|
|
17314
|
-
this.dispararTodosLosLotes();
|
|
17315
|
-
}
|
|
17316
|
-
else {
|
|
17317
|
-
this.pendingLetter = null;
|
|
17318
|
-
}
|
|
17319
|
-
});
|
|
17326
|
+
this.letterAnchors();
|
|
17327
|
+
this.modelo();
|
|
17328
|
+
this.bodyRef();
|
|
17329
|
+
untracked(() => this.resolverSaltoPendiente());
|
|
17320
17330
|
});
|
|
17321
17331
|
}
|
|
17332
|
+
/**
|
|
17333
|
+
* Desplaza hasta el destino del salto pendiente si ya se puede: con ventana de
|
|
17334
|
+
* render sale del offset declarado, si no del ancla en el DOM.
|
|
17335
|
+
*
|
|
17336
|
+
* Mientras no se pueda, el salto se CONSERVA: el destino puede estar a un
|
|
17337
|
+
* render de distancia (grupo recién desplegado), a un lote de distancia, o a
|
|
17338
|
+
* la espera de que el consumidor aplique el `collapsedGroups` que se le emitió.
|
|
17339
|
+
* Descartarlo en el primer intento fallido era el bug: el ancla llegaba un
|
|
17340
|
+
* turno después y el salto ya no existía. La espera va acotada por
|
|
17341
|
+
* `SALTO_PENDIENTE_TTL` para no dejarlo colgado ni desplazar por sorpresa
|
|
17342
|
+
* mucho después (p. ej. si el ancla nunca se pinta por `groupLimit`).
|
|
17343
|
+
*/
|
|
17344
|
+
resolverSaltoPendiente() {
|
|
17345
|
+
const pend = this.pendingLetter;
|
|
17346
|
+
const root = this.bodyRef()?.nativeElement;
|
|
17347
|
+
if (!pend || !root)
|
|
17348
|
+
return;
|
|
17349
|
+
const m = this.modelo();
|
|
17350
|
+
// El offset que declara la ventana de render existe ANTES de que el DOM
|
|
17351
|
+
// crezca: usarlo con el grupo todavía plegado desplaza contra un cuerpo que
|
|
17352
|
+
// aún no puede desplazarse (el scroll clampea a 0) y el salto se pierde.
|
|
17353
|
+
// Solo vale cuando la vista ya pintó ese grupo.
|
|
17354
|
+
const off = m.virtOn && this.vistaAlDia(root, pend) ? m.letras[pend] : null;
|
|
17355
|
+
const el = this.anclaDeLetra(pend);
|
|
17356
|
+
if (off != null || el) {
|
|
17357
|
+
this.pendingLetter = null;
|
|
17358
|
+
const top = off != null ? off : this.topDeAncla(root, el);
|
|
17359
|
+
root.scrollTo({
|
|
17360
|
+
top: Math.max(0, top),
|
|
17361
|
+
behavior: this.prefiereMenosMovimiento() ? 'auto' : 'smooth',
|
|
17362
|
+
});
|
|
17363
|
+
return;
|
|
17364
|
+
}
|
|
17365
|
+
if (this.hayMasLotes()) {
|
|
17366
|
+
this.dispararTodosLosLotes();
|
|
17367
|
+
return;
|
|
17368
|
+
}
|
|
17369
|
+
if (Date.now() - this.pendingDesde > SALTO_PENDIENTE_TTL)
|
|
17370
|
+
this.pendingLetter = null;
|
|
17371
|
+
}
|
|
17322
17372
|
/** Teclado del rail: ↑/↓/Inicio/Fin mueven el foco entre letras habilitadas. */
|
|
17323
17373
|
onRailKey(event) {
|
|
17324
17374
|
const teclas = ['ArrowUp', 'ArrowDown', 'Home', 'End'];
|
|
@@ -17355,12 +17405,14 @@ class EntityNavigatorComponent {
|
|
|
17355
17405
|
const virtOn = untracked(() => this.modelo().virtOn);
|
|
17356
17406
|
this.zone.run(() => {
|
|
17357
17407
|
this.bodyScrolled.set(scrolled);
|
|
17358
|
-
|
|
17359
|
-
|
|
17360
|
-
|
|
17361
|
-
|
|
17362
|
-
|
|
17363
|
-
|
|
17408
|
+
// `vScroll` se escribe DIRECTO desde el listener: los eventos de
|
|
17409
|
+
// scroll ya vienen coalescidos por el navegador. Envolverlo en
|
|
17410
|
+
// `requestAnimationFrame` con un handle de guarda (como estaba) es el
|
|
17411
|
+
// anti-patrón que la ng-spec prohíbe: en un contenedor que no está
|
|
17412
|
+
// pintando el callback nunca corre, el handle queda latcheado y la
|
|
17413
|
+
// ventana de render se congela arriba de la lista.
|
|
17414
|
+
if (virtOn)
|
|
17415
|
+
this.vScroll.set(el.scrollTop);
|
|
17364
17416
|
this.actualizarLetraActiva(el);
|
|
17365
17417
|
});
|
|
17366
17418
|
};
|
|
@@ -17368,13 +17420,7 @@ class EntityNavigatorComponent {
|
|
|
17368
17420
|
onScroll();
|
|
17369
17421
|
el.addEventListener('scroll', onScroll, { passive: true });
|
|
17370
17422
|
});
|
|
17371
|
-
onCleanup(() =>
|
|
17372
|
-
el.removeEventListener('scroll', onScroll);
|
|
17373
|
-
if (this.vRaf) {
|
|
17374
|
-
cancelAnimationFrame(this.vRaf);
|
|
17375
|
-
this.vRaf = 0;
|
|
17376
|
-
}
|
|
17377
|
-
});
|
|
17423
|
+
onCleanup(() => el.removeEventListener('scroll', onScroll));
|
|
17378
17424
|
});
|
|
17379
17425
|
// Alto del rail alfabético → cuántas letras caben.
|
|
17380
17426
|
effect((onCleanup) => {
|
|
@@ -17449,7 +17495,7 @@ class EntityNavigatorComponent {
|
|
|
17449
17495
|
return fijada ? 'Dejar de fijar sección arriba' : 'Fijar sección arriba';
|
|
17450
17496
|
}
|
|
17451
17497
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: EntityNavigatorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
17452
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: EntityNavigatorComponent, isStandalone: true, selector: "ius-entity-navigator", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, titleIcon: { classPropertyName: "titleIcon", publicName: "titleIcon", isSignal: true, isRequired: false, transformFunction: null }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, searchThreshold: { classPropertyName: "searchThreshold", publicName: "searchThreshold", isSignal: true, isRequired: false, transformFunction: null }, searchPlaceholder: { classPropertyName: "searchPlaceholder", publicName: "searchPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, searchValue: { classPropertyName: "searchValue", publicName: "searchValue", isSignal: true, isRequired: false, transformFunction: null }, filters: { classPropertyName: "filters", publicName: "filters", isSignal: true, isRequired: false, transformFunction: null }, selectedFilters: { classPropertyName: "selectedFilters", publicName: "selectedFilters", isSignal: true, isRequired: false, transformFunction: null }, availableFilters: { classPropertyName: "availableFilters", publicName: "availableFilters", isSignal: true, isRequired: false, transformFunction: null }, activeFacets: { classPropertyName: "activeFacets", publicName: "activeFacets", isSignal: true, isRequired: false, transformFunction: null }, stateSegments: { classPropertyName: "stateSegments", publicName: "stateSegments", isSignal: true, isRequired: false, transformFunction: null }, stateValue: { classPropertyName: "stateValue", publicName: "stateValue", isSignal: true, isRequired: false, transformFunction: null }, sortLabel: { classPropertyName: "sortLabel", publicName: "sortLabel", isSignal: true, isRequired: false, transformFunction: null }, sortOptions: { classPropertyName: "sortOptions", publicName: "sortOptions", isSignal: true, isRequired: false, transformFunction: null }, sortValue: { classPropertyName: "sortValue", publicName: "sortValue", isSignal: true, isRequired: false, transformFunction: null }, metaLabel: { classPropertyName: "metaLabel", publicName: "metaLabel", isSignal: true, isRequired: false, transformFunction: null }, groups: { classPropertyName: "groups", publicName: "groups", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, accent: { classPropertyName: "accent", publicName: "accent", isSignal: true, isRequired: false, transformFunction: null }, defaultExpanded: { classPropertyName: "defaultExpanded", publicName: "defaultExpanded", isSignal: true, isRequired: false, transformFunction: null }, expanded: { classPropertyName: "expanded", publicName: "expanded", isSignal: true, isRequired: false, transformFunction: null }, autoExpandOnFilter: { classPropertyName: "autoExpandOnFilter", publicName: "autoExpandOnFilter", isSignal: true, isRequired: false, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null }, defaultSelected: { classPropertyName: "defaultSelected", publicName: "defaultSelected", isSignal: true, isRequired: false, transformFunction: null }, emptyStateTemplate: { classPropertyName: "emptyStateTemplate", publicName: "emptyStateTemplate", isSignal: true, isRequired: false, transformFunction: null }, noResultsLabel: { classPropertyName: "noResultsLabel", publicName: "noResultsLabel", isSignal: true, isRequired: false, transformFunction: null }, createLabel: { classPropertyName: "createLabel", publicName: "createLabel", isSignal: true, isRequired: false, transformFunction: null }, createIcon: { classPropertyName: "createIcon", publicName: "createIcon", isSignal: true, isRequired: false, transformFunction: null }, groupLimit: { classPropertyName: "groupLimit", publicName: "groupLimit", isSignal: true, isRequired: false, transformFunction: null }, collapsibleGroups: { classPropertyName: "collapsibleGroups", publicName: "collapsibleGroups", isSignal: true, isRequired: false, transformFunction: null }, collapsedGroups: { classPropertyName: "collapsedGroups", publicName: "collapsedGroups", isSignal: true, isRequired: false, transformFunction: null }, stickyHeaders: { classPropertyName: "stickyHeaders", publicName: "stickyHeaders", isSignal: true, isRequired: false, transformFunction: null }, pinnableGroups: { classPropertyName: "pinnableGroups", publicName: "pinnableGroups", isSignal: true, isRequired: false, transformFunction: null }, defaultPinnedGroup: { classPropertyName: "defaultPinnedGroup", publicName: "defaultPinnedGroup", isSignal: true, isRequired: false, transformFunction: null }, moreLabel: { classPropertyName: "moreLabel", publicName: "moreLabel", isSignal: true, isRequired: false, transformFunction: null }, alphaIndex: { classPropertyName: "alphaIndex", publicName: "alphaIndex", isSignal: true, isRequired: false, transformFunction: null }, alphaIndexLetters: { classPropertyName: "alphaIndexLetters", publicName: "alphaIndexLetters", isSignal: true, isRequired: false, transformFunction: null }, loadMoreLabel: { classPropertyName: "loadMoreLabel", publicName: "loadMoreLabel", isSignal: true, isRequired: false, transformFunction: null }, virtualized: { classPropertyName: "virtualized", publicName: "virtualized", isSignal: true, isRequired: false, transformFunction: null }, virtualizeThreshold: { classPropertyName: "virtualizeThreshold", publicName: "virtualizeThreshold", isSignal: true, isRequired: false, transformFunction: null }, itemHeights: { classPropertyName: "itemHeights", publicName: "itemHeights", isSignal: true, isRequired: false, transformFunction: null }, collapsible: { classPropertyName: "collapsible", publicName: "collapsible", isSignal: true, isRequired: false, transformFunction: null }, collapsed: { classPropertyName: "collapsed", publicName: "collapsed", isSignal: true, isRequired: false, transformFunction: null }, defaultCollapsed: { classPropertyName: "defaultCollapsed", publicName: "defaultCollapsed", isSignal: true, isRequired: false, transformFunction: null }, fluidWidth: { classPropertyName: "fluidWidth", publicName: "fluidWidth", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { search: "search", searchChange: "searchChange", searchClear: "searchClear", filter: "filter", filterRemove: "filterRemove", addFilter: "addFilter", stateChange: "stateChange", facetAdd: "facetAdd", facetRemove: "facetRemove", sort: "sort", select: "select", selectedChange: "selectedChange", expandedChange: "expandedChange", togglePin: "togglePin", create: "create", pinGroup: "pinGroup", groupCollapse: "groupCollapse", more: "more", collapsedChange: "collapsedChange", jumpToLetter: "jumpToLetter", loadMore: "loadMore", expandLoad: "expandLoad" }, host: { properties: { "attr.data-collapsed": "isCollapsed() ? 'true' : null", "attr.data-fluid": "fluidWidth() ? 'true' : null", "attr.aria-label": "ariaLabel() || title() || null" }, classAttribute: "ius-entnav" }, viewQueries: [{ propertyName: "bodyRef", first: true, predicate: ["body"], descendants: true, isSignal: true }, { propertyName: "alphaRef", first: true, predicate: ["alpha"], descendants: true, isSignal: true }, { propertyName: "searchRef", first: true, predicate: ["searchBox"], descendants: true, isSignal: true }, { propertyName: "sentinels", predicate: ["lmSentinel"], descendants: true, isSignal: true }, { propertyName: "letterAnchors", predicate: ["letterAnchor"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- Riel colapsado: solo expandir + CTA. Rama aparte, como el golden. -->\n@if (collapsible() && isCollapsed()) {\n <div class=\"ius-entnav__rail\">\n <ius-icon-button\n icon=\"left_panel_open\"\n variant=\"tertiary\"\n shape=\"circle\"\n size=\"small\"\n ariaLabel=\"Expandir\"\n (clicked)=\"alternarColapso()\"\n />\n @if (hayPie()) {\n <ius-icon-button\n [icon]=\"createIcon()\"\n variant=\"secondary\"\n shape=\"circle\"\n size=\"small\"\n [ariaLabel]=\"createLabel()\"\n (clicked)=\"create.emit($event)\"\n />\n }\n </div>\n} @else {\n <!-- \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Cabecera \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n <div class=\"ius-entnav__head\">\n @if (hayCabecera()) {\n <div class=\"ius-entnav__titlerow\">\n @if (title()) {\n <div class=\"ius-entnav__title\">\n @if (titleIcon()) {\n <span translate=\"no\" class=\"ius-icon\">{{ titleIcon() }}</span>\n }\n {{ title() }}\n </div>\n } @else {\n <span></span>\n }\n <span class=\"ius-entnav__actions\">\n @if (showSearchToggle()) {\n <!-- El `state: pressed` del golden no se porta: IconButton omite `state`\n de su API p\u00FAblica a prop\u00F3sito (decisi\u00F3n suya, documentada). -->\n <ius-icon-button\n icon=\"search\"\n variant=\"tertiary\"\n shape=\"circle\"\n size=\"small\"\n ariaLabel=\"Buscar (\u2318K)\"\n (clicked)=\"alternarBusqueda()\"\n />\n }\n @if (collapsible()) {\n <ius-icon-button\n icon=\"left_panel_close\"\n variant=\"tertiary\"\n shape=\"circle\"\n size=\"small\"\n ariaLabel=\"Colapsar\"\n (clicked)=\"alternarColapso()\"\n />\n }\n </span>\n </div>\n }\n\n @if (searchVisible()) {\n <div #searchBox>\n <ius-search-bar\n [placeholder]=\"searchPlaceholder()\"\n size=\"medium\"\n [value]=\"searchValue()\"\n (valueChange)=\"onSearchValueChange($event)\"\n (search)=\"search.emit($event)\"\n (cleared)=\"searchClear.emit()\"\n />\n </div>\n }\n\n <!-- Eje de estado: excluyente, ortogonal a facetas y b\u00FAsqueda; no poda datos. -->\n @if (stateSegments()?.length) {\n <div class=\"ius-entnav__state\">\n <ius-segmented-control\n [options]=\"segmentos()\"\n [value]=\"stateVal()\"\n size=\"small\"\n variant=\"subtle\"\n fullWidth\n (valueChange)=\"elegirEstado($event)\"\n />\n </div>\n }\n\n @if (hayBarraFiltros()) {\n <div class=\"ius-entnav__filters\">\n @for (f of filters(); track f.key) {\n <ius-tag\n role=\"filter\"\n size=\"small\"\n [tone]=\"tonoFiltro(f)\"\n [icon]=\"f.icon\"\n [dot]=\"f.dot\"\n [count]=\"f.count\"\n [label]=\"f.label\"\n [selected]=\"activeKeys().has(f.key)\"\n [closable]=\"!!f.removable\"\n (clicked)=\"alternarFiltro(f.key)\"\n (closed)=\"quitarFiltro(f.key)\"\n />\n }\n\n <!-- Facetas: Tag `soft` con el tono categ\u00F3rico de su categor\u00EDa, NUNCA solid. -->\n @for (f of facets(); track f.key) {\n <ius-tag\n role=\"label\"\n variant=\"soft\"\n size=\"small\"\n [tone]=\"tonoFaceta(f)\"\n [icon]=\"f.icon\"\n closable\n [label]=\"textoFaceta(f)\"\n (closed)=\"quitarFaceta(f.key)\"\n />\n }\n\n @if (availableFilters().length) {\n <ius-popover\n trigger=\"manual\"\n [open]=\"addOpen()\"\n [dismissable]=\"true\"\n placement=\"bottom-start\"\n [offset]=\"6\"\n [showArrow]=\"false\"\n padding=\"none\"\n (openChange)=\"onAddOpenChange($event)\"\n >\n <ius-tag\n role=\"filter\"\n variant=\"outline\"\n tone=\"neutral\"\n size=\"small\"\n icon=\"add\"\n label=\"Filtro\"\n [selected]=\"addOpen()\"\n (clicked)=\"alternarMenuFiltro()\"\n />\n\n <div iusPopoverContent class=\"ius-entnav__addpanel\">\n @if (addStep(); as step) {\n <div class=\"ius-entnav__addhead\">\n <ius-menu-item\n icon=\"chevron_left\"\n [label]=\"step.label\"\n size=\"small\"\n (clicked)=\"volverDelPaso()\"\n />\n @if (step.picker === 'search') {\n <ius-search-bar\n size=\"small\"\n placeholder=\"Buscar\u2026\"\n [value]=\"addQuery()\"\n (valueChange)=\"addQuery.set($event)\"\n (cleared)=\"addQuery.set('')\"\n />\n }\n </div>\n <div class=\"ius-entnav__addlist ius-scroll ius-scroll--sm\">\n @if (opcionesDelPaso().length === 0) {\n <div class=\"ius-entnav__addempty\">Sin resultados</div>\n } @else {\n @for (o of opcionesDelPaso(); track o.key) {\n <!-- El check se proyecta SIEMPRE y se oculta por CSS: un\n `<ng-content>` detr\u00E1s de un `@if` que depende de un\n contentChild se pierde en el primer render. -->\n <ius-menu-item\n [label]=\"o.label\"\n size=\"small\"\n [selected]=\"facetaActiva(step, o)\"\n (clicked)=\"elegirValor(step, o)\"\n >\n <span\n iusMenuItemTrailing\n translate=\"no\"\n class=\"ius-icon\"\n [class.ius-entnav__check--off]=\"!facetaActiva(step, o)\"\n >check</span\n >\n </ius-menu-item>\n }\n }\n </div>\n } @else {\n <div class=\"ius-entnav__addlist ius-scroll ius-scroll--sm\">\n @for (a of categoriasDisponibles(); track a.key) {\n <ius-menu-item\n [icon]=\"a.icon\"\n [label]=\"a.label\"\n size=\"small\"\n (clicked)=\"elegirCategoria(a)\"\n >\n <span\n iusMenuItemTrailing\n translate=\"no\"\n class=\"ius-icon\"\n [class.ius-entnav__check--off]=\"!a.picker\"\n >chevron_right</span\n >\n </ius-menu-item>\n }\n </div>\n }\n </div>\n </ius-popover>\n }\n </div>\n }\n\n @if (hayMeta()) {\n <div class=\"ius-entnav__meta\">\n <span>{{ metaLabel() || '' }}</span>\n @if (sortOptions()?.length) {\n <ius-dropdown\n [selectable]=\"true\"\n [value]=\"sortValue()\"\n label=\"Ordenar por\"\n tone=\"neutral\"\n [items]=\"sortOptions() ?? []\"\n placement=\"bottom-end\"\n (valueChange)=\"onSort($event)\"\n />\n } @else if (sortLabel()) {\n <button type=\"button\" class=\"ius-entnav__sort\" (click)=\"sort.emit({ value: sortValue() })\">\n {{ sortLabel() }}\n <span translate=\"no\" class=\"ius-icon\">expand_more</span>\n </button>\n }\n </div>\n }\n </div>\n\n <!-- Secci\u00F3n fijada: vive FUERA del cuerpo con scroll (no entra en la ventana\n de render ni en el cursor aritm\u00E9tico de la virtualizaci\u00F3n). -->\n @if (modelo().fijada; as fijada) {\n <div class=\"ius-entnav__pinned\">\n <ng-container [ngTemplateOutlet]=\"seccionTpl\" [ngTemplateOutletContext]=\"{ $implicit: fijada }\" />\n </div>\n }\n\n <div class=\"ius-entnav__scrollwrap\">\n <div\n class=\"ius-entnav__body ius-scroll ius-scroll--sm\"\n #body\n [attr.data-scrolled]=\"bodyScrolled() ? 'true' : null\"\n >\n @if (vacio()) {\n <div class=\"ius-entnav__empty\">\n @if (emptyStateTemplate(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n <ius-empty-state\n variant=\"no-results\"\n size=\"compact\"\n [title]=\"noResultsLabel()\"\n [description]=\"descripcionVacio()\"\n />\n }\n </div>\n } @else {\n @for (s of modelo().secciones; track s.gk) {\n <ng-container [ngTemplateOutlet]=\"seccionTpl\" [ngTemplateOutletContext]=\"{ $implicit: s }\" />\n }\n }\n </div>\n\n <!-- \u00CDndice alfab\u00E9tico: navega, no reordena. Se oculta con b\u00FAsqueda/filtros. -->\n @if (alphaVisible()) {\n <nav\n class=\"ius-entnav__alpha\"\n #alpha\n role=\"navigation\"\n aria-label=\"\u00CDndice alfab\u00E9tico\"\n (keydown)=\"onRailKey($event)\"\n >\n @for (L of displayLetters(); track L) {\n <button\n type=\"button\"\n class=\"ius-entnav__alpha-let\"\n [disabled]=\"!letraHabilitada(L)\"\n [attr.data-active]=\"activeLetter() === L ? 'true' : null\"\n [attr.aria-current]=\"activeLetter() === L ? 'true' : null\"\n [attr.aria-label]=\"'Ir a ' + L\"\n [attr.tabindex]=\"letraHabilitada(L) ? (L === alphaTabStop() ? 0 : -1) : -1\"\n (click)=\"saltarALetra(L)\"\n >\n {{ L }}\n </button>\n }\n </nav>\n }\n </div>\n\n @if (hayPie()) {\n <div class=\"ius-entnav__footer\">\n <ius-button\n variant=\"primary\"\n [prefixIcon]=\"createIcon()\"\n [label]=\"createLabel()\"\n fullWidth\n class=\"ius-entnav__cta\"\n (clicked)=\"create.emit($event)\"\n />\n </div>\n }\n}\n\n<!-- \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Plantilla de secci\u00F3n (cuerpo y secci\u00F3n fijada comparten) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n<ng-template #seccionTpl let-s>\n <section class=\"ius-entnav__section\" [attr.data-pinned]=\"s.isPinned ? 'true' : null\">\n @if (s.hasHeader) {\n <ius-section-header\n [icon]=\"s.group.icon\"\n [count]=\"s.group.count\"\n [accent]=\"accent()\"\n [sticky]=\"s.sticky\"\n [collapsible]=\"collapsibleGroups()\"\n [collapsed]=\"s.isCollapsed\"\n (toggle)=\"alternarPlegadoGrupo(s.gk)\"\n >\n {{ s.group.label }}\n @if (pinnableGroups()) {\n <ius-icon-button\n iusSectionHeaderAction\n class=\"ius-entnav__pinbtn\"\n [class.ius-entnav__pinbtn--on]=\"s.isPinned\"\n icon=\"pinboard\"\n variant=\"tertiary\"\n shape=\"circle\"\n size=\"small\"\n [ariaLabel]=\"etiquetaPinGrupo(s.isPinned)\"\n (clicked)=\"alternarPinGrupo(s.gk)\"\n />\n }\n </ius-section-header>\n }\n\n @if (s.padTop) {\n <div class=\"ius-entnav__vpad\" [style.height.px]=\"s.padTop\" aria-hidden=\"true\"></div>\n }\n\n @for (d of s.visible; track d.key) {\n @switch (d.kind) {\n @case ('letter') {\n <div class=\"ius-entnav__lanchor\" #letterAnchor [attr.data-letter]=\"d.letter\">\n <ius-section-header variant=\"letter\" [accent]=\"accent()\">{{ d.letter }}</ius-section-header>\n </div>\n }\n @case ('addChild') {\n <div class=\"ius-entnav__addchild\" [style.padding-left.px]=\"padAddChild(d.level)\">\n <ius-text-button\n size=\"small\"\n prefixIcon=\"add\"\n [label]=\"d.node.addChildLabel\"\n (clicked)=\"onAddChild(d.node, $event)\"\n />\n </div>\n }\n @default {\n <ius-entity-row\n [kind]=\"d.node.kind ?? 'expediente'\"\n [icon]=\"d.node.icon\"\n [label]=\"d.node.label\"\n [sublabel]=\"d.node.sublabel\"\n [level]=\"d.level\"\n [accent]=\"accent()\"\n [expandable]=\"d.expandable\"\n [expanded]=\"d.expanded\"\n [loading]=\"d.loading\"\n [selected]=\"d.selected\"\n [count]=\"d.node.count\"\n [unread]=\"d.node.unread\"\n [hasUnread]=\"!!d.node.hasUnread\"\n [noveltyTone]=\"d.node.noveltyTone ?? 'info'\"\n [pinned]=\"!!d.node.pinned\"\n [pinnable]=\"d.canPin\"\n [actions]=\"d.node.actions ?? []\"\n (toggle)=\"alternarNodo(d.node)\"\n (togglePin)=\"onTogglePinNodo(d.node, $event)\"\n (clicked)=\"elegirNodo(d)\"\n />\n }\n }\n }\n\n @if (s.padBot) {\n <div class=\"ius-entnav__vpad\" [style.height.px]=\"s.padBot\" aria-hidden=\"true\"></div>\n }\n\n @if (s.showMore) {\n <div class=\"ius-entnav__morerow\">\n <ius-show-more\n [expanded]=\"s.moreExpanded\"\n [remaining]=\"s.moreRemaining\"\n align=\"end\"\n (toggle)=\"alternarShowMore(s.gk)\"\n />\n </div>\n }\n\n <!-- Carga por lotes: centinela (IntersectionObserver) + \u00ABCargar m\u00E1s\u00BB. -->\n @if (s.showLoadMore) {\n <div class=\"ius-entnav__loadmore\">\n @if (s.loadingMore) {\n <ius-loading variant=\"inline\" size=\"small\" [label]=\"textoCargando()\" />\n } @else {\n <div\n class=\"ius-entnav__sentinel\"\n #lmSentinel\n [attr.data-lm-group]=\"s.gk\"\n aria-hidden=\"true\"\n ></div>\n <ius-text-button size=\"small\" [label]=\"textoCargarMas()\" (clicked)=\"dispararLote(s.gk)\" />\n }\n </div>\n }\n </section>\n</ng-template>\n", styles: ["@charset \"UTF-8\";:host{box-sizing:border-box;-webkit-user-select:none;user-select:none;display:flex;flex-direction:column;width:340px;min-width:0;height:100%;background:var(--ius-surface-card);border-right:1px solid var(--ius-stroke);font-family:var(--ius-font-body)}:host([data-collapsed=true]){width:52px}:host([data-fluid=true]:not([data-collapsed=true])){width:100%}.ius-entnav__rail{display:flex;flex-direction:column;align-items:center;gap:var(--ius-space-xs);padding:var(--ius-space-sm) var(--ius-space-xs)}.ius-entnav__head{flex:0 0 auto;display:flex;flex-direction:column;gap:var(--ius-space-xs);padding:var(--ius-space-md) var(--ius-space-md) var(--ius-space-sm);border-bottom:1px solid var(--ius-stroke)}.ius-entnav__titlerow{display:flex;align-items:center;justify-content:space-between;gap:var(--ius-space-xs)}.ius-entnav__actions{display:inline-flex;align-items:center;gap:var(--ius-space-xxs);margin-right:-4px}.ius-entnav__title{font-family:var(--ius-font-display);font-weight:var(--ius-fw-semibold);font-size:var(--ius-fs-sm);letter-spacing:.06em;text-transform:uppercase;color:var(--ius-text-tertiary);display:inline-flex;align-items:center;gap:var(--ius-space-xs)}.ius-entnav__title .ius-icon{font-size:var(--ius-icon-sm)}.ius-entnav__filters{display:flex;flex-wrap:wrap;gap:var(--ius-space-xs)}.ius-entnav__state{display:flex}.ius-entnav__state+.ius-entnav__filters{padding-top:var(--ius-space-xs);border-top:1px solid var(--ius-stroke)}.ius-entnav__addpanel{display:flex;flex-direction:column;min-width:224px;max-width:300px;max-height:min(52vh,360px)}.ius-entnav__addhead{flex:0 0 auto;display:flex;flex-direction:column;gap:var(--ius-space-xxs);padding:var(--ius-space-xxs);border-bottom:1px solid var(--ius-stroke)}.ius-entnav__addlist{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;display:flex;flex-direction:column;gap:var(--ius-space-xxs);padding:var(--ius-space-xxs);--_sb-track-margin: var(--ius-space-sm)}.ius-entnav__addempty{padding:var(--ius-space-lg) var(--ius-space-sm);text-align:center;font-size:var(--ius-fs-sm);color:var(--ius-text-tertiary)}.ius-entnav__check--off{visibility:hidden}.ius-entnav__meta{display:flex;align-items:center;justify-content:space-between;gap:var(--ius-space-xs);font-size:var(--ius-fs-sm);color:var(--ius-text-tertiary)}.ius-entnav__meta>span:first-child{flex:1 1 auto;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ius-entnav__meta>ius-dropdown{flex:0 0 auto}.ius-entnav__sort{appearance:none;border:0;background:transparent;cursor:pointer;display:inline-flex;align-items:center;gap:var(--ius-space-xxs);font-family:var(--ius-font-body);font-weight:var(--ius-fw-semibold);font-size:var(--ius-fs-sm);line-height:1.2;color:var(--ius-primary-700)}.ius-entnav__sort .ius-icon{font-size:var(--ius-icon-sm)}.ius-entnav__sort:focus-visible{outline:none;box-shadow:var(--ius-focus-ring);border-radius:var(--ius-radius-sm)}.ius-entnav__scrollwrap{position:relative;flex:1 1 auto;min-height:0;display:flex}.ius-entnav__body{flex:1 1 auto;min-width:0;overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;padding:0 var(--ius-space-xs) var(--ius-space-xs);position:relative}.ius-entnav__body[data-scrolled=true]{box-shadow:inset 0 7px 6px -6px #26262629}.ius-entnav__body[data-scrolled=true]:before{content:\"\";position:sticky;top:0;z-index:3;display:block;height:0;margin:0 -8px;border-top:1px solid var(--ius-stroke)}.ius-entnav__section{display:contents}.ius-entnav__body ius-section-header[data-variant=group]{margin:0 -8px;padding-left:var(--ius-space-md);padding-right:var(--ius-space-md)}.ius-entnav__morerow{padding:var(--ius-space-xxs) 0}ius-show-more{padding-right:var(--ius-space-xs)}.ius-entnav__loadmore{display:flex;justify-content:center;padding:var(--ius-space-xs) 0 var(--ius-space-sm)}.ius-entnav__sentinel{height:1px;margin:0;padding:0;pointer-events:none}.ius-entnav__pinned{flex:0 0 auto;padding:var(--ius-space-xxs) var(--ius-space-xs) var(--ius-space-xs);border-bottom:1px solid var(--ius-stroke);background:var(--ius-surface-card)}.ius-entnav__pinned ius-section-header[data-variant=group]{margin:0 -8px;padding-left:var(--ius-space-md);padding-right:var(--ius-space-md)}.ius-entnav__pinbtn{opacity:0;transition:opacity var(--ius-duration-fast) var(--ius-ease-standard)}ius-section-header:hover .ius-entnav__pinbtn,.ius-entnav__pinbtn:focus-within,.ius-entnav__pinbtn--on{opacity:1}.ius-entnav__addchild{display:flex;padding:var(--ius-space-xxs) var(--ius-space-xs) var(--ius-space-xs) 0}.ius-entnav__empty{display:flex;align-items:center;justify-content:center;min-height:220px;padding:var(--ius-space-xl) var(--ius-space-md)}.ius-entnav__footer{flex:0 0 auto;padding:var(--ius-space-sm) var(--ius-space-md);border-top:1px solid var(--ius-stroke)}.ius-entnav__cta{width:100%}.ius-entnav__alpha{flex:0 0 auto;display:flex;flex-direction:column;align-items:stretch;gap:var(--ius-space-none);width:var(--ius-space-lg);padding:var(--ius-space-xxs) 0;overflow:hidden;-webkit-user-select:none;user-select:none}.ius-entnav__alpha-let{appearance:none;border:0;background:transparent;cursor:pointer;flex:1 1 0;min-height:0;display:inline-flex;align-items:center;justify-content:center;padding:0;font-family:var(--ius-font-body);font-weight:var(--ius-fw-medium);font-size:var(--ius-fs-sm);line-height:var(--ius-lh-sm);color:var(--ius-text-tertiary);border-radius:var(--ius-radius-sm);transition:color var(--ius-duration-fast) var(--ius-ease-standard),background var(--ius-duration-fast) var(--ius-ease-standard)}.ius-entnav__alpha-let:hover{color:var(--ius-primary-700)}.ius-entnav__alpha-let[data-active=true]{color:var(--ius-primary-900);background:var(--ius-neutral-2);font-weight:var(--ius-fw-bold)}.ius-entnav__alpha-let:disabled{color:var(--ius-text-tertiary);opacity:.35;cursor:default}.ius-entnav__alpha-let:focus-visible{outline:none;box-shadow:var(--ius-focus-ring)}\n"], dependencies: [{ kind: "component", type: ButtonComponent, selector: "ius-button", inputs: ["variant", "label", "prefixIcon", "sufixIcon", "dynamic", "loading", "status", "disabled", "pressed", "fullWidth", "type", "ariaLabel", "action", "size"], outputs: ["clicked"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: DropdownComponent, selector: "ius-dropdown", inputs: ["items", "selectable", "value", "label", "triggerLabel", "triggerIcon", "tone", "variant", "placement", "open", "defaultOpen", "ariaLabel"], outputs: ["valueChange", "openChange"] }, { kind: "component", type: EmptyStateComponent, selector: "ius-empty-state", inputs: ["variant", "size", "tone", "icon", "illustration", "illustrationTemplate", "title", "description", "primaryAction", "secondaryAction", "actionsTemplate", "role"], outputs: ["primaryClick", "secondaryClick"] }, { kind: "component", type: EntityRowComponent, selector: "ius-entity-row", inputs: ["kind", "icon", "label", "sublabel", "level", "accent", "expandable", "expanded", "loading", "selected", "disabled", "count", "unread", "hasUnread", "noveltyTone", "pinned", "pinnable", "actions", "actionsLabel", "ariaLabel"], outputs: ["toggle", "togglePin", "clicked"] }, { kind: "component", type: IconButtonComponent, selector: "ius-icon-button", inputs: ["icon", "variant", "size", "shape", "disabled", "type", "ariaLabel", "tooltip", "ariaPressed", "tooltipPlacement"], outputs: ["clicked"] }, { kind: "directive", type: IusMenuItemTrailingDirective, selector: "[iusMenuItemTrailing]" }, { kind: "component", type: LoadingComponent, selector: "ius-loading", inputs: ["variant", "label", "showLabel", "tone", "brand", "size", "active", "ariaLabel"] }, { kind: "component", type: MenuItemComponent, selector: "ius-menu-item", inputs: ["icon", "label", "badge", "variant", "size", "selected", "disabled", "danger", "state", "href", "ariaLabel", "itemRole"], outputs: ["clicked"] }, { kind: "component", type: PopoverComponent, selector: "ius-popover", inputs: ["title", "content", "placement", "trigger", "offset", "open", "defaultOpen", "showArrow", "disabled", "anchorRect", "padding", "dismissable", "panelClass"], outputs: ["openChange"] }, { kind: "component", type: SearchBarComponent, selector: "ius-search-bar", inputs: ["value", "defaultValue", "size", "disabled", "state", "placeholder", "ariaLabel", "name", "id"], outputs: ["valueChange", "search", "cleared"] }, { kind: "component", type: SectionHeaderComponent, selector: "ius-section-header", inputs: ["icon", "count", "variant", "accent", "collapsible", "collapsed", "sticky", "ariaLabel"], outputs: ["toggle"] }, { kind: "component", type: SegmentedControlComponent, selector: "ius-segmented-control", inputs: ["options", "size", "variant", "fullWidth", "iconOnly", "ariaLabel", "name", "value", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: ShowMoreComponent, selector: "ius-show-more", inputs: ["expanded", "remaining", "moreLabel", "lessLabel", "collapsible", "size", "align", "ariaControls"], outputs: ["toggle"] }, { kind: "component", type: TagComponent, selector: "ius-tag", inputs: ["label", "role", "tone", "variant", "size", "shape", "icon", "dot", "count", "closable", "closeLabel", "selected", "disabled", "interactive", "state"], outputs: ["clicked", "closed"] }, { kind: "component", type: TextButtonComponent, selector: "ius-text-button", inputs: ["label", "prefixIcon", "sufixIcon", "size", "disabled", "type", "ariaExpanded", "ariaControls"], outputs: ["clicked"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
17498
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: EntityNavigatorComponent, isStandalone: true, selector: "ius-entity-navigator", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, titleIcon: { classPropertyName: "titleIcon", publicName: "titleIcon", isSignal: true, isRequired: false, transformFunction: null }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, searchThreshold: { classPropertyName: "searchThreshold", publicName: "searchThreshold", isSignal: true, isRequired: false, transformFunction: null }, searchPlaceholder: { classPropertyName: "searchPlaceholder", publicName: "searchPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, searchValue: { classPropertyName: "searchValue", publicName: "searchValue", isSignal: true, isRequired: false, transformFunction: null }, filters: { classPropertyName: "filters", publicName: "filters", isSignal: true, isRequired: false, transformFunction: null }, selectedFilters: { classPropertyName: "selectedFilters", publicName: "selectedFilters", isSignal: true, isRequired: false, transformFunction: null }, availableFilters: { classPropertyName: "availableFilters", publicName: "availableFilters", isSignal: true, isRequired: false, transformFunction: null }, activeFacets: { classPropertyName: "activeFacets", publicName: "activeFacets", isSignal: true, isRequired: false, transformFunction: null }, stateSegments: { classPropertyName: "stateSegments", publicName: "stateSegments", isSignal: true, isRequired: false, transformFunction: null }, stateValue: { classPropertyName: "stateValue", publicName: "stateValue", isSignal: true, isRequired: false, transformFunction: null }, sortLabel: { classPropertyName: "sortLabel", publicName: "sortLabel", isSignal: true, isRequired: false, transformFunction: null }, sortOptions: { classPropertyName: "sortOptions", publicName: "sortOptions", isSignal: true, isRequired: false, transformFunction: null }, sortValue: { classPropertyName: "sortValue", publicName: "sortValue", isSignal: true, isRequired: false, transformFunction: null }, metaLabel: { classPropertyName: "metaLabel", publicName: "metaLabel", isSignal: true, isRequired: false, transformFunction: null }, groups: { classPropertyName: "groups", publicName: "groups", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, accent: { classPropertyName: "accent", publicName: "accent", isSignal: true, isRequired: false, transformFunction: null }, defaultExpanded: { classPropertyName: "defaultExpanded", publicName: "defaultExpanded", isSignal: true, isRequired: false, transformFunction: null }, expanded: { classPropertyName: "expanded", publicName: "expanded", isSignal: true, isRequired: false, transformFunction: null }, autoExpandOnFilter: { classPropertyName: "autoExpandOnFilter", publicName: "autoExpandOnFilter", isSignal: true, isRequired: false, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null }, defaultSelected: { classPropertyName: "defaultSelected", publicName: "defaultSelected", isSignal: true, isRequired: false, transformFunction: null }, emptyStateTemplate: { classPropertyName: "emptyStateTemplate", publicName: "emptyStateTemplate", isSignal: true, isRequired: false, transformFunction: null }, noResultsLabel: { classPropertyName: "noResultsLabel", publicName: "noResultsLabel", isSignal: true, isRequired: false, transformFunction: null }, createLabel: { classPropertyName: "createLabel", publicName: "createLabel", isSignal: true, isRequired: false, transformFunction: null }, createIcon: { classPropertyName: "createIcon", publicName: "createIcon", isSignal: true, isRequired: false, transformFunction: null }, groupLimit: { classPropertyName: "groupLimit", publicName: "groupLimit", isSignal: true, isRequired: false, transformFunction: null }, collapsibleGroups: { classPropertyName: "collapsibleGroups", publicName: "collapsibleGroups", isSignal: true, isRequired: false, transformFunction: null }, collapsedGroups: { classPropertyName: "collapsedGroups", publicName: "collapsedGroups", isSignal: true, isRequired: false, transformFunction: null }, stickyHeaders: { classPropertyName: "stickyHeaders", publicName: "stickyHeaders", isSignal: true, isRequired: false, transformFunction: null }, pinnableGroups: { classPropertyName: "pinnableGroups", publicName: "pinnableGroups", isSignal: true, isRequired: false, transformFunction: null }, defaultPinnedGroup: { classPropertyName: "defaultPinnedGroup", publicName: "defaultPinnedGroup", isSignal: true, isRequired: false, transformFunction: null }, moreLabel: { classPropertyName: "moreLabel", publicName: "moreLabel", isSignal: true, isRequired: false, transformFunction: null }, alphaIndex: { classPropertyName: "alphaIndex", publicName: "alphaIndex", isSignal: true, isRequired: false, transformFunction: null }, alphaIndexLetters: { classPropertyName: "alphaIndexLetters", publicName: "alphaIndexLetters", isSignal: true, isRequired: false, transformFunction: null }, loadMoreLabel: { classPropertyName: "loadMoreLabel", publicName: "loadMoreLabel", isSignal: true, isRequired: false, transformFunction: null }, virtualized: { classPropertyName: "virtualized", publicName: "virtualized", isSignal: true, isRequired: false, transformFunction: null }, virtualizeThreshold: { classPropertyName: "virtualizeThreshold", publicName: "virtualizeThreshold", isSignal: true, isRequired: false, transformFunction: null }, itemHeights: { classPropertyName: "itemHeights", publicName: "itemHeights", isSignal: true, isRequired: false, transformFunction: null }, collapsible: { classPropertyName: "collapsible", publicName: "collapsible", isSignal: true, isRequired: false, transformFunction: null }, collapsed: { classPropertyName: "collapsed", publicName: "collapsed", isSignal: true, isRequired: false, transformFunction: null }, defaultCollapsed: { classPropertyName: "defaultCollapsed", publicName: "defaultCollapsed", isSignal: true, isRequired: false, transformFunction: null }, fluidWidth: { classPropertyName: "fluidWidth", publicName: "fluidWidth", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { search: "search", searchChange: "searchChange", searchClear: "searchClear", filter: "filter", filterRemove: "filterRemove", addFilter: "addFilter", stateChange: "stateChange", facetAdd: "facetAdd", facetRemove: "facetRemove", sort: "sort", select: "select", selectedChange: "selectedChange", expandedChange: "expandedChange", togglePin: "togglePin", create: "create", pinGroup: "pinGroup", groupCollapse: "groupCollapse", more: "more", collapsedChange: "collapsedChange", jumpToLetter: "jumpToLetter", loadMore: "loadMore", expandLoad: "expandLoad" }, host: { properties: { "attr.data-collapsed": "isCollapsed() ? 'true' : null", "attr.data-fluid": "fluidWidth() ? 'true' : null", "attr.aria-label": "ariaLabel() || title() || null" }, classAttribute: "ius-entnav" }, viewQueries: [{ propertyName: "bodyRef", first: true, predicate: ["body"], descendants: true, isSignal: true }, { propertyName: "alphaRef", first: true, predicate: ["alpha"], descendants: true, isSignal: true }, { propertyName: "searchRef", first: true, predicate: ["searchBox"], descendants: true, isSignal: true }, { propertyName: "sentinels", predicate: ["lmSentinel"], descendants: true, isSignal: true }, { propertyName: "letterAnchors", predicate: ["letterAnchor"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- Riel colapsado: solo expandir + CTA. Rama aparte, como el golden. -->\n@if (collapsible() && isCollapsed()) {\n <div class=\"ius-entnav__rail\">\n <ius-icon-button\n icon=\"left_panel_open\"\n variant=\"tertiary\"\n shape=\"circle\"\n size=\"small\"\n ariaLabel=\"Expandir\"\n (clicked)=\"alternarColapso()\"\n />\n @if (hayPie()) {\n <ius-icon-button\n [icon]=\"createIcon()\"\n variant=\"secondary\"\n shape=\"circle\"\n size=\"small\"\n [ariaLabel]=\"createLabel()\"\n (clicked)=\"create.emit($event)\"\n />\n }\n </div>\n} @else {\n <!-- \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Cabecera \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n <div class=\"ius-entnav__head\">\n @if (hayCabecera()) {\n <div class=\"ius-entnav__titlerow\">\n @if (title()) {\n <div class=\"ius-entnav__title\">\n @if (titleIcon()) {\n <span translate=\"no\" class=\"ius-icon\">{{ titleIcon() }}</span>\n }\n {{ title() }}\n </div>\n } @else {\n <span></span>\n }\n <span class=\"ius-entnav__actions\">\n @if (showSearchToggle()) {\n <!-- El `state: pressed` del golden no se porta: IconButton omite `state`\n de su API p\u00FAblica a prop\u00F3sito (decisi\u00F3n suya, documentada). -->\n <ius-icon-button\n icon=\"search\"\n variant=\"tertiary\"\n shape=\"circle\"\n size=\"small\"\n ariaLabel=\"Buscar (\u2318K)\"\n (clicked)=\"alternarBusqueda()\"\n />\n }\n @if (collapsible()) {\n <ius-icon-button\n icon=\"left_panel_close\"\n variant=\"tertiary\"\n shape=\"circle\"\n size=\"small\"\n ariaLabel=\"Colapsar\"\n (clicked)=\"alternarColapso()\"\n />\n }\n </span>\n </div>\n }\n\n @if (searchVisible()) {\n <div #searchBox>\n <ius-search-bar\n [placeholder]=\"searchPlaceholder()\"\n size=\"medium\"\n [value]=\"searchValue()\"\n (valueChange)=\"onSearchValueChange($event)\"\n (search)=\"search.emit($event)\"\n (cleared)=\"searchClear.emit()\"\n />\n </div>\n }\n\n <!-- Eje de estado: excluyente, ortogonal a facetas y b\u00FAsqueda; no poda datos. -->\n @if (stateSegments()?.length) {\n <div class=\"ius-entnav__state\">\n <ius-segmented-control\n [options]=\"segmentos()\"\n [value]=\"stateVal()\"\n size=\"small\"\n variant=\"subtle\"\n fullWidth\n (valueChange)=\"elegirEstado($event)\"\n />\n </div>\n }\n\n @if (hayBarraFiltros()) {\n <div class=\"ius-entnav__filters\">\n @for (f of filters(); track f.key) {\n <ius-tag\n role=\"filter\"\n size=\"small\"\n [tone]=\"tonoFiltro(f)\"\n [icon]=\"f.icon\"\n [dot]=\"f.dot\"\n [count]=\"f.count\"\n [label]=\"f.label\"\n [selected]=\"activeKeys().has(f.key)\"\n [closable]=\"!!f.removable\"\n (clicked)=\"alternarFiltro(f.key)\"\n (closed)=\"quitarFiltro(f.key)\"\n />\n }\n\n <!-- Facetas: Tag `soft` con el tono categ\u00F3rico de su categor\u00EDa, NUNCA solid. -->\n @for (f of facets(); track f.key) {\n <ius-tag\n role=\"label\"\n variant=\"soft\"\n size=\"small\"\n [tone]=\"tonoFaceta(f)\"\n [icon]=\"f.icon\"\n closable\n [label]=\"textoFaceta(f)\"\n (closed)=\"quitarFaceta(f.key)\"\n />\n }\n\n @if (availableFilters().length) {\n <ius-popover\n trigger=\"manual\"\n [open]=\"addOpen()\"\n [dismissable]=\"true\"\n placement=\"bottom-start\"\n [offset]=\"6\"\n [showArrow]=\"false\"\n padding=\"none\"\n (openChange)=\"onAddOpenChange($event)\"\n >\n <ius-tag\n role=\"filter\"\n variant=\"outline\"\n tone=\"neutral\"\n size=\"small\"\n icon=\"add\"\n label=\"Filtro\"\n [selected]=\"addOpen()\"\n (clicked)=\"alternarMenuFiltro()\"\n />\n\n <div iusPopoverContent class=\"ius-entnav__addpanel\">\n @if (addStep(); as step) {\n <div class=\"ius-entnav__addhead\">\n <ius-menu-item\n icon=\"chevron_left\"\n [label]=\"step.label\"\n size=\"small\"\n (clicked)=\"volverDelPaso()\"\n />\n @if (step.picker === 'search') {\n <ius-search-bar\n size=\"small\"\n placeholder=\"Buscar\u2026\"\n [value]=\"addQuery()\"\n (valueChange)=\"addQuery.set($event)\"\n (cleared)=\"addQuery.set('')\"\n />\n }\n </div>\n <div class=\"ius-entnav__addlist ius-scroll ius-scroll--sm\">\n @if (opcionesDelPaso().length === 0) {\n <div class=\"ius-entnav__addempty\">Sin resultados</div>\n } @else {\n @for (o of opcionesDelPaso(); track o.key) {\n <!-- El check se proyecta SIEMPRE y se oculta por CSS: un\n `<ng-content>` detr\u00E1s de un `@if` que depende de un\n contentChild se pierde en el primer render. -->\n <ius-menu-item\n [label]=\"o.label\"\n size=\"small\"\n [selected]=\"facetaActiva(step, o)\"\n (clicked)=\"elegirValor(step, o)\"\n >\n <span\n iusMenuItemTrailing\n translate=\"no\"\n class=\"ius-icon\"\n [class.ius-entnav__check--off]=\"!facetaActiva(step, o)\"\n >check</span\n >\n </ius-menu-item>\n }\n }\n </div>\n } @else {\n <div class=\"ius-entnav__addlist ius-scroll ius-scroll--sm\">\n @for (a of categoriasDisponibles(); track a.key) {\n <ius-menu-item\n [icon]=\"a.icon\"\n [label]=\"a.label\"\n size=\"small\"\n (clicked)=\"elegirCategoria(a)\"\n >\n <span\n iusMenuItemTrailing\n translate=\"no\"\n class=\"ius-icon\"\n [class.ius-entnav__check--off]=\"!a.picker\"\n >chevron_right</span\n >\n </ius-menu-item>\n }\n </div>\n }\n </div>\n </ius-popover>\n }\n </div>\n }\n\n @if (hayMeta()) {\n <div class=\"ius-entnav__meta\">\n <span>{{ metaLabel() || '' }}</span>\n @if (sortOptions()?.length) {\n <ius-dropdown\n [selectable]=\"true\"\n [value]=\"sortValue()\"\n label=\"Ordenar por\"\n tone=\"neutral\"\n [items]=\"sortOptions() ?? []\"\n placement=\"bottom-end\"\n (valueChange)=\"onSort($event)\"\n />\n } @else if (sortLabel()) {\n <button type=\"button\" class=\"ius-entnav__sort\" (click)=\"sort.emit({ value: sortValue() })\">\n {{ sortLabel() }}\n <span translate=\"no\" class=\"ius-icon\">expand_more</span>\n </button>\n }\n </div>\n }\n </div>\n\n <!-- Secci\u00F3n fijada: vive FUERA del cuerpo con scroll (no entra en la ventana\n de render ni en el cursor aritm\u00E9tico de la virtualizaci\u00F3n). -->\n @if (modelo().fijada; as fijada) {\n <div class=\"ius-entnav__pinned\">\n <ng-container [ngTemplateOutlet]=\"seccionTpl\" [ngTemplateOutletContext]=\"{ $implicit: fijada }\" />\n </div>\n }\n\n <div class=\"ius-entnav__scrollwrap\">\n <div\n class=\"ius-entnav__body ius-scroll ius-scroll--sm\"\n #body\n [attr.data-scrolled]=\"bodyScrolled() ? 'true' : null\"\n >\n @if (vacio()) {\n <div class=\"ius-entnav__empty\">\n @if (emptyStateTemplate(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n <ius-empty-state\n variant=\"no-results\"\n size=\"compact\"\n [title]=\"noResultsLabel()\"\n [description]=\"descripcionVacio()\"\n />\n }\n </div>\n } @else {\n @for (s of modelo().secciones; track s.gk) {\n <ng-container [ngTemplateOutlet]=\"seccionTpl\" [ngTemplateOutletContext]=\"{ $implicit: s }\" />\n }\n }\n </div>\n\n <!-- \u00CDndice alfab\u00E9tico: navega, no reordena. Se oculta con b\u00FAsqueda/filtros. -->\n @if (alphaVisible()) {\n <nav\n class=\"ius-entnav__alpha\"\n #alpha\n role=\"navigation\"\n aria-label=\"\u00CDndice alfab\u00E9tico\"\n (keydown)=\"onRailKey($event)\"\n >\n @for (L of displayLetters(); track L) {\n <button\n type=\"button\"\n class=\"ius-entnav__alpha-let\"\n [disabled]=\"!letraHabilitada(L)\"\n [attr.data-active]=\"activeLetter() === L ? 'true' : null\"\n [attr.aria-current]=\"activeLetter() === L ? 'true' : null\"\n [attr.aria-label]=\"'Ir a ' + L\"\n [attr.tabindex]=\"letraHabilitada(L) ? (L === alphaTabStop() ? 0 : -1) : -1\"\n (click)=\"saltarALetra(L)\"\n >\n {{ L }}\n </button>\n }\n </nav>\n }\n </div>\n\n @if (hayPie()) {\n <div class=\"ius-entnav__footer\">\n <ius-button\n variant=\"primary\"\n [prefixIcon]=\"createIcon()\"\n [label]=\"createLabel()\"\n fullWidth\n class=\"ius-entnav__cta\"\n (clicked)=\"create.emit($event)\"\n />\n </div>\n }\n}\n\n<!-- \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Plantilla de secci\u00F3n (cuerpo y secci\u00F3n fijada comparten) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n<ng-template #seccionTpl let-s>\n <section\n class=\"ius-entnav__section\"\n [attr.data-group]=\"s.gk\"\n [attr.data-pinned]=\"s.isPinned ? 'true' : null\"\n >\n @if (s.hasHeader) {\n <ius-section-header\n [icon]=\"s.group.icon\"\n [count]=\"s.group.count\"\n [accent]=\"accent()\"\n [sticky]=\"s.sticky\"\n [collapsible]=\"collapsibleGroups()\"\n [collapsed]=\"s.isCollapsed\"\n (toggle)=\"alternarPlegadoGrupo(s.gk)\"\n >\n {{ s.group.label }}\n @if (pinnableGroups()) {\n <ius-icon-button\n iusSectionHeaderAction\n class=\"ius-entnav__pinbtn\"\n [class.ius-entnav__pinbtn--on]=\"s.isPinned\"\n icon=\"pinboard\"\n variant=\"tertiary\"\n shape=\"circle\"\n size=\"small\"\n [ariaLabel]=\"etiquetaPinGrupo(s.isPinned)\"\n (clicked)=\"alternarPinGrupo(s.gk)\"\n />\n }\n </ius-section-header>\n }\n\n @if (s.padTop) {\n <div class=\"ius-entnav__vpad\" [style.height.px]=\"s.padTop\" aria-hidden=\"true\"></div>\n }\n\n @for (d of s.visible; track d.key) {\n @switch (d.kind) {\n @case ('letter') {\n <div class=\"ius-entnav__lanchor\" #letterAnchor [attr.data-letter]=\"d.letter\">\n <ius-section-header variant=\"letter\" [accent]=\"accent()\">{{ d.letter }}</ius-section-header>\n </div>\n }\n @case ('addChild') {\n <div class=\"ius-entnav__addchild\" [style.padding-left.px]=\"padAddChild(d.level)\">\n <ius-text-button\n size=\"small\"\n prefixIcon=\"add\"\n [label]=\"d.node.addChildLabel\"\n (clicked)=\"onAddChild(d.node, $event)\"\n />\n </div>\n }\n @default {\n <ius-entity-row\n [kind]=\"d.node.kind ?? 'expediente'\"\n [icon]=\"d.node.icon\"\n [label]=\"d.node.label\"\n [sublabel]=\"d.node.sublabel\"\n [level]=\"d.level\"\n [accent]=\"accent()\"\n [expandable]=\"d.expandable\"\n [expanded]=\"d.expanded\"\n [loading]=\"d.loading\"\n [selected]=\"d.selected\"\n [count]=\"d.node.count\"\n [unread]=\"d.node.unread\"\n [hasUnread]=\"!!d.node.hasUnread\"\n [noveltyTone]=\"d.node.noveltyTone ?? 'info'\"\n [pinned]=\"!!d.node.pinned\"\n [pinnable]=\"d.canPin\"\n [actions]=\"d.node.actions ?? []\"\n (toggle)=\"alternarNodo(d.node)\"\n (togglePin)=\"onTogglePinNodo(d.node, $event)\"\n (clicked)=\"elegirNodo(d)\"\n />\n }\n }\n }\n\n @if (s.padBot) {\n <div class=\"ius-entnav__vpad\" [style.height.px]=\"s.padBot\" aria-hidden=\"true\"></div>\n }\n\n @if (s.showMore) {\n <div class=\"ius-entnav__morerow\">\n <ius-show-more\n [expanded]=\"s.moreExpanded\"\n [remaining]=\"s.moreRemaining\"\n align=\"end\"\n (toggle)=\"alternarShowMore(s.gk)\"\n />\n </div>\n }\n\n <!-- Carga por lotes: centinela (IntersectionObserver) + \u00ABCargar m\u00E1s\u00BB. -->\n @if (s.showLoadMore) {\n <div class=\"ius-entnav__loadmore\">\n @if (s.loadingMore) {\n <ius-loading variant=\"inline\" size=\"small\" [label]=\"textoCargando()\" />\n } @else {\n <div\n class=\"ius-entnav__sentinel\"\n #lmSentinel\n [attr.data-lm-group]=\"s.gk\"\n aria-hidden=\"true\"\n ></div>\n <ius-text-button size=\"small\" [label]=\"textoCargarMas()\" (clicked)=\"dispararLote(s.gk)\" />\n }\n </div>\n }\n </section>\n</ng-template>\n", styles: ["@charset \"UTF-8\";:host{box-sizing:border-box;-webkit-user-select:none;user-select:none;display:flex;flex-direction:column;width:340px;min-width:0;height:100%;background:var(--ius-surface-card);border-right:1px solid var(--ius-stroke);font-family:var(--ius-font-body)}:host([data-collapsed=true]){width:52px}:host([data-fluid=true]:not([data-collapsed=true])){width:100%}.ius-entnav__rail{display:flex;flex-direction:column;align-items:center;gap:var(--ius-space-xs);padding:var(--ius-space-sm) var(--ius-space-xs)}.ius-entnav__head{flex:0 0 auto;display:flex;flex-direction:column;gap:var(--ius-space-xs);padding:var(--ius-space-md) var(--ius-space-md) var(--ius-space-sm);border-bottom:1px solid var(--ius-stroke)}.ius-entnav__titlerow{display:flex;align-items:center;justify-content:space-between;gap:var(--ius-space-xs)}.ius-entnav__actions{display:inline-flex;align-items:center;gap:var(--ius-space-xxs);margin-right:-4px}.ius-entnav__title{font-family:var(--ius-font-display);font-weight:var(--ius-fw-semibold);font-size:var(--ius-fs-sm);letter-spacing:.06em;text-transform:uppercase;color:var(--ius-text-tertiary);display:inline-flex;align-items:center;gap:var(--ius-space-xs)}.ius-entnav__title .ius-icon{font-size:var(--ius-icon-sm)}.ius-entnav__filters{display:flex;flex-wrap:wrap;gap:var(--ius-space-xs)}.ius-entnav__state{display:flex}.ius-entnav__state+.ius-entnav__filters{padding-top:var(--ius-space-xs);border-top:1px solid var(--ius-stroke)}.ius-entnav__addpanel{display:flex;flex-direction:column;min-width:224px;max-width:300px;max-height:min(52vh,360px)}.ius-entnav__addhead{flex:0 0 auto;display:flex;flex-direction:column;gap:var(--ius-space-xxs);padding:var(--ius-space-xxs);border-bottom:1px solid var(--ius-stroke)}.ius-entnav__addlist{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;display:flex;flex-direction:column;gap:var(--ius-space-xxs);padding:var(--ius-space-xxs);--_sb-track-margin: var(--ius-space-sm)}.ius-entnav__addempty{padding:var(--ius-space-lg) var(--ius-space-sm);text-align:center;font-size:var(--ius-fs-sm);color:var(--ius-text-tertiary)}.ius-entnav__check--off{visibility:hidden}.ius-entnav__meta{display:flex;align-items:center;justify-content:space-between;gap:var(--ius-space-xs);font-size:var(--ius-fs-sm);color:var(--ius-text-tertiary)}.ius-entnav__meta>span:first-child{flex:1 1 auto;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ius-entnav__meta>ius-dropdown{flex:0 0 auto}.ius-entnav__sort{appearance:none;border:0;background:transparent;cursor:pointer;display:inline-flex;align-items:center;gap:var(--ius-space-xxs);font-family:var(--ius-font-body);font-weight:var(--ius-fw-semibold);font-size:var(--ius-fs-sm);line-height:1.2;color:var(--ius-primary-700)}.ius-entnav__sort .ius-icon{font-size:var(--ius-icon-sm)}.ius-entnav__sort:focus-visible{outline:none;box-shadow:var(--ius-focus-ring);border-radius:var(--ius-radius-sm)}.ius-entnav__scrollwrap{position:relative;flex:1 1 auto;min-height:0;display:flex}.ius-entnav__body{flex:1 1 auto;min-width:0;overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;padding:0 var(--ius-space-xs) var(--ius-space-xs);position:relative}.ius-entnav__body[data-scrolled=true]{box-shadow:inset 0 7px 6px -6px #26262629}.ius-entnav__body[data-scrolled=true]:before{content:\"\";position:sticky;top:0;z-index:3;display:block;height:0;margin:0 -8px;border-top:1px solid var(--ius-stroke)}.ius-entnav__section{display:contents}.ius-entnav__body ius-section-header[data-variant=group]{margin:0 -8px;padding-left:var(--ius-space-md);padding-right:var(--ius-space-md)}.ius-entnav__morerow{padding:var(--ius-space-xxs) 0}ius-show-more{padding-right:var(--ius-space-xs)}.ius-entnav__loadmore{display:flex;justify-content:center;padding:var(--ius-space-xs) 0 var(--ius-space-sm)}.ius-entnav__sentinel{height:1px;margin:0;padding:0;pointer-events:none}.ius-entnav__pinned{flex:0 0 auto;padding:var(--ius-space-xxs) var(--ius-space-xs) var(--ius-space-xs);border-bottom:1px solid var(--ius-stroke);background:var(--ius-surface-card)}.ius-entnav__pinned ius-section-header[data-variant=group]{margin:0 -8px;padding-left:var(--ius-space-md);padding-right:var(--ius-space-md)}.ius-entnav__pinbtn{opacity:0;transition:opacity var(--ius-duration-fast) var(--ius-ease-standard)}ius-section-header:hover .ius-entnav__pinbtn,.ius-entnav__pinbtn:focus-within,.ius-entnav__pinbtn--on{opacity:1}.ius-entnav__addchild{display:flex;padding:var(--ius-space-xxs) var(--ius-space-xs) var(--ius-space-xs) 0}.ius-entnav__empty{display:flex;align-items:center;justify-content:center;min-height:220px;padding:var(--ius-space-xl) var(--ius-space-md)}.ius-entnav__footer{flex:0 0 auto;padding:var(--ius-space-sm) var(--ius-space-md);border-top:1px solid var(--ius-stroke)}.ius-entnav__cta{width:100%}.ius-entnav__alpha{flex:0 0 auto;display:flex;flex-direction:column;align-items:stretch;gap:var(--ius-space-none);width:var(--ius-space-lg);padding:var(--ius-space-xxs) 0;overflow:hidden;-webkit-user-select:none;user-select:none}.ius-entnav__alpha-let{appearance:none;border:0;background:transparent;cursor:pointer;flex:1 1 0;min-height:0;display:inline-flex;align-items:center;justify-content:center;padding:0;font-family:var(--ius-font-body);font-weight:var(--ius-fw-medium);font-size:var(--ius-fs-sm);line-height:var(--ius-lh-sm);color:var(--ius-text-tertiary);border-radius:var(--ius-radius-sm);transition:color var(--ius-duration-fast) var(--ius-ease-standard),background var(--ius-duration-fast) var(--ius-ease-standard)}.ius-entnav__alpha-let:hover{color:var(--ius-primary-700)}.ius-entnav__alpha-let[data-active=true]{color:var(--ius-primary-900);background:var(--ius-neutral-2);font-weight:var(--ius-fw-bold)}.ius-entnav__alpha-let:disabled{color:var(--ius-text-tertiary);opacity:.35;cursor:default}.ius-entnav__alpha-let:focus-visible{outline:none;box-shadow:var(--ius-focus-ring)}\n"], dependencies: [{ kind: "component", type: ButtonComponent, selector: "ius-button", inputs: ["variant", "label", "prefixIcon", "sufixIcon", "dynamic", "loading", "status", "disabled", "pressed", "fullWidth", "type", "ariaLabel", "action", "size"], outputs: ["clicked"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: DropdownComponent, selector: "ius-dropdown", inputs: ["items", "selectable", "value", "label", "triggerLabel", "triggerIcon", "tone", "variant", "placement", "open", "defaultOpen", "ariaLabel"], outputs: ["valueChange", "openChange"] }, { kind: "component", type: EmptyStateComponent, selector: "ius-empty-state", inputs: ["variant", "size", "tone", "icon", "illustration", "illustrationTemplate", "title", "description", "primaryAction", "secondaryAction", "actionsTemplate", "role"], outputs: ["primaryClick", "secondaryClick"] }, { kind: "component", type: EntityRowComponent, selector: "ius-entity-row", inputs: ["kind", "icon", "label", "sublabel", "level", "accent", "expandable", "expanded", "loading", "selected", "disabled", "count", "unread", "hasUnread", "noveltyTone", "pinned", "pinnable", "actions", "actionsLabel", "ariaLabel"], outputs: ["toggle", "togglePin", "clicked"] }, { kind: "component", type: IconButtonComponent, selector: "ius-icon-button", inputs: ["icon", "variant", "size", "shape", "disabled", "type", "ariaLabel", "tooltip", "ariaPressed", "tooltipPlacement"], outputs: ["clicked"] }, { kind: "directive", type: IusMenuItemTrailingDirective, selector: "[iusMenuItemTrailing]" }, { kind: "component", type: LoadingComponent, selector: "ius-loading", inputs: ["variant", "label", "showLabel", "tone", "brand", "size", "active", "ariaLabel"] }, { kind: "component", type: MenuItemComponent, selector: "ius-menu-item", inputs: ["icon", "label", "badge", "variant", "size", "selected", "disabled", "danger", "state", "href", "ariaLabel", "itemRole"], outputs: ["clicked"] }, { kind: "component", type: PopoverComponent, selector: "ius-popover", inputs: ["title", "content", "placement", "trigger", "offset", "open", "defaultOpen", "showArrow", "disabled", "anchorRect", "padding", "dismissable", "panelClass"], outputs: ["openChange"] }, { kind: "component", type: SearchBarComponent, selector: "ius-search-bar", inputs: ["value", "defaultValue", "size", "disabled", "state", "placeholder", "ariaLabel", "name", "id"], outputs: ["valueChange", "search", "cleared"] }, { kind: "component", type: SectionHeaderComponent, selector: "ius-section-header", inputs: ["icon", "count", "variant", "accent", "collapsible", "collapsed", "sticky", "ariaLabel"], outputs: ["toggle"] }, { kind: "component", type: SegmentedControlComponent, selector: "ius-segmented-control", inputs: ["options", "size", "variant", "fullWidth", "iconOnly", "ariaLabel", "name", "value", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: ShowMoreComponent, selector: "ius-show-more", inputs: ["expanded", "remaining", "moreLabel", "lessLabel", "collapsible", "size", "align", "ariaControls"], outputs: ["toggle"] }, { kind: "component", type: TagComponent, selector: "ius-tag", inputs: ["label", "role", "tone", "variant", "size", "shape", "icon", "dot", "count", "closable", "closeLabel", "selected", "disabled", "interactive", "state"], outputs: ["clicked", "closed"] }, { kind: "component", type: TextButtonComponent, selector: "ius-text-button", inputs: ["label", "prefixIcon", "sufixIcon", "size", "disabled", "type", "ariaExpanded", "ariaControls"], outputs: ["clicked"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
17453
17499
|
}
|
|
17454
17500
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: EntityNavigatorComponent, decorators: [{
|
|
17455
17501
|
type: Component,
|
|
@@ -17475,7 +17521,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
17475
17521
|
'[attr.data-collapsed]': "isCollapsed() ? 'true' : null",
|
|
17476
17522
|
'[attr.data-fluid]': "fluidWidth() ? 'true' : null",
|
|
17477
17523
|
'[attr.aria-label]': 'ariaLabel() || title() || null',
|
|
17478
|
-
}, template: "<!-- Riel colapsado: solo expandir + CTA. Rama aparte, como el golden. -->\n@if (collapsible() && isCollapsed()) {\n <div class=\"ius-entnav__rail\">\n <ius-icon-button\n icon=\"left_panel_open\"\n variant=\"tertiary\"\n shape=\"circle\"\n size=\"small\"\n ariaLabel=\"Expandir\"\n (clicked)=\"alternarColapso()\"\n />\n @if (hayPie()) {\n <ius-icon-button\n [icon]=\"createIcon()\"\n variant=\"secondary\"\n shape=\"circle\"\n size=\"small\"\n [ariaLabel]=\"createLabel()\"\n (clicked)=\"create.emit($event)\"\n />\n }\n </div>\n} @else {\n <!-- \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Cabecera \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n <div class=\"ius-entnav__head\">\n @if (hayCabecera()) {\n <div class=\"ius-entnav__titlerow\">\n @if (title()) {\n <div class=\"ius-entnav__title\">\n @if (titleIcon()) {\n <span translate=\"no\" class=\"ius-icon\">{{ titleIcon() }}</span>\n }\n {{ title() }}\n </div>\n } @else {\n <span></span>\n }\n <span class=\"ius-entnav__actions\">\n @if (showSearchToggle()) {\n <!-- El `state: pressed` del golden no se porta: IconButton omite `state`\n de su API p\u00FAblica a prop\u00F3sito (decisi\u00F3n suya, documentada). -->\n <ius-icon-button\n icon=\"search\"\n variant=\"tertiary\"\n shape=\"circle\"\n size=\"small\"\n ariaLabel=\"Buscar (\u2318K)\"\n (clicked)=\"alternarBusqueda()\"\n />\n }\n @if (collapsible()) {\n <ius-icon-button\n icon=\"left_panel_close\"\n variant=\"tertiary\"\n shape=\"circle\"\n size=\"small\"\n ariaLabel=\"Colapsar\"\n (clicked)=\"alternarColapso()\"\n />\n }\n </span>\n </div>\n }\n\n @if (searchVisible()) {\n <div #searchBox>\n <ius-search-bar\n [placeholder]=\"searchPlaceholder()\"\n size=\"medium\"\n [value]=\"searchValue()\"\n (valueChange)=\"onSearchValueChange($event)\"\n (search)=\"search.emit($event)\"\n (cleared)=\"searchClear.emit()\"\n />\n </div>\n }\n\n <!-- Eje de estado: excluyente, ortogonal a facetas y b\u00FAsqueda; no poda datos. -->\n @if (stateSegments()?.length) {\n <div class=\"ius-entnav__state\">\n <ius-segmented-control\n [options]=\"segmentos()\"\n [value]=\"stateVal()\"\n size=\"small\"\n variant=\"subtle\"\n fullWidth\n (valueChange)=\"elegirEstado($event)\"\n />\n </div>\n }\n\n @if (hayBarraFiltros()) {\n <div class=\"ius-entnav__filters\">\n @for (f of filters(); track f.key) {\n <ius-tag\n role=\"filter\"\n size=\"small\"\n [tone]=\"tonoFiltro(f)\"\n [icon]=\"f.icon\"\n [dot]=\"f.dot\"\n [count]=\"f.count\"\n [label]=\"f.label\"\n [selected]=\"activeKeys().has(f.key)\"\n [closable]=\"!!f.removable\"\n (clicked)=\"alternarFiltro(f.key)\"\n (closed)=\"quitarFiltro(f.key)\"\n />\n }\n\n <!-- Facetas: Tag `soft` con el tono categ\u00F3rico de su categor\u00EDa, NUNCA solid. -->\n @for (f of facets(); track f.key) {\n <ius-tag\n role=\"label\"\n variant=\"soft\"\n size=\"small\"\n [tone]=\"tonoFaceta(f)\"\n [icon]=\"f.icon\"\n closable\n [label]=\"textoFaceta(f)\"\n (closed)=\"quitarFaceta(f.key)\"\n />\n }\n\n @if (availableFilters().length) {\n <ius-popover\n trigger=\"manual\"\n [open]=\"addOpen()\"\n [dismissable]=\"true\"\n placement=\"bottom-start\"\n [offset]=\"6\"\n [showArrow]=\"false\"\n padding=\"none\"\n (openChange)=\"onAddOpenChange($event)\"\n >\n <ius-tag\n role=\"filter\"\n variant=\"outline\"\n tone=\"neutral\"\n size=\"small\"\n icon=\"add\"\n label=\"Filtro\"\n [selected]=\"addOpen()\"\n (clicked)=\"alternarMenuFiltro()\"\n />\n\n <div iusPopoverContent class=\"ius-entnav__addpanel\">\n @if (addStep(); as step) {\n <div class=\"ius-entnav__addhead\">\n <ius-menu-item\n icon=\"chevron_left\"\n [label]=\"step.label\"\n size=\"small\"\n (clicked)=\"volverDelPaso()\"\n />\n @if (step.picker === 'search') {\n <ius-search-bar\n size=\"small\"\n placeholder=\"Buscar\u2026\"\n [value]=\"addQuery()\"\n (valueChange)=\"addQuery.set($event)\"\n (cleared)=\"addQuery.set('')\"\n />\n }\n </div>\n <div class=\"ius-entnav__addlist ius-scroll ius-scroll--sm\">\n @if (opcionesDelPaso().length === 0) {\n <div class=\"ius-entnav__addempty\">Sin resultados</div>\n } @else {\n @for (o of opcionesDelPaso(); track o.key) {\n <!-- El check se proyecta SIEMPRE y se oculta por CSS: un\n `<ng-content>` detr\u00E1s de un `@if` que depende de un\n contentChild se pierde en el primer render. -->\n <ius-menu-item\n [label]=\"o.label\"\n size=\"small\"\n [selected]=\"facetaActiva(step, o)\"\n (clicked)=\"elegirValor(step, o)\"\n >\n <span\n iusMenuItemTrailing\n translate=\"no\"\n class=\"ius-icon\"\n [class.ius-entnav__check--off]=\"!facetaActiva(step, o)\"\n >check</span\n >\n </ius-menu-item>\n }\n }\n </div>\n } @else {\n <div class=\"ius-entnav__addlist ius-scroll ius-scroll--sm\">\n @for (a of categoriasDisponibles(); track a.key) {\n <ius-menu-item\n [icon]=\"a.icon\"\n [label]=\"a.label\"\n size=\"small\"\n (clicked)=\"elegirCategoria(a)\"\n >\n <span\n iusMenuItemTrailing\n translate=\"no\"\n class=\"ius-icon\"\n [class.ius-entnav__check--off]=\"!a.picker\"\n >chevron_right</span\n >\n </ius-menu-item>\n }\n </div>\n }\n </div>\n </ius-popover>\n }\n </div>\n }\n\n @if (hayMeta()) {\n <div class=\"ius-entnav__meta\">\n <span>{{ metaLabel() || '' }}</span>\n @if (sortOptions()?.length) {\n <ius-dropdown\n [selectable]=\"true\"\n [value]=\"sortValue()\"\n label=\"Ordenar por\"\n tone=\"neutral\"\n [items]=\"sortOptions() ?? []\"\n placement=\"bottom-end\"\n (valueChange)=\"onSort($event)\"\n />\n } @else if (sortLabel()) {\n <button type=\"button\" class=\"ius-entnav__sort\" (click)=\"sort.emit({ value: sortValue() })\">\n {{ sortLabel() }}\n <span translate=\"no\" class=\"ius-icon\">expand_more</span>\n </button>\n }\n </div>\n }\n </div>\n\n <!-- Secci\u00F3n fijada: vive FUERA del cuerpo con scroll (no entra en la ventana\n de render ni en el cursor aritm\u00E9tico de la virtualizaci\u00F3n). -->\n @if (modelo().fijada; as fijada) {\n <div class=\"ius-entnav__pinned\">\n <ng-container [ngTemplateOutlet]=\"seccionTpl\" [ngTemplateOutletContext]=\"{ $implicit: fijada }\" />\n </div>\n }\n\n <div class=\"ius-entnav__scrollwrap\">\n <div\n class=\"ius-entnav__body ius-scroll ius-scroll--sm\"\n #body\n [attr.data-scrolled]=\"bodyScrolled() ? 'true' : null\"\n >\n @if (vacio()) {\n <div class=\"ius-entnav__empty\">\n @if (emptyStateTemplate(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n <ius-empty-state\n variant=\"no-results\"\n size=\"compact\"\n [title]=\"noResultsLabel()\"\n [description]=\"descripcionVacio()\"\n />\n }\n </div>\n } @else {\n @for (s of modelo().secciones; track s.gk) {\n <ng-container [ngTemplateOutlet]=\"seccionTpl\" [ngTemplateOutletContext]=\"{ $implicit: s }\" />\n }\n }\n </div>\n\n <!-- \u00CDndice alfab\u00E9tico: navega, no reordena. Se oculta con b\u00FAsqueda/filtros. -->\n @if (alphaVisible()) {\n <nav\n class=\"ius-entnav__alpha\"\n #alpha\n role=\"navigation\"\n aria-label=\"\u00CDndice alfab\u00E9tico\"\n (keydown)=\"onRailKey($event)\"\n >\n @for (L of displayLetters(); track L) {\n <button\n type=\"button\"\n class=\"ius-entnav__alpha-let\"\n [disabled]=\"!letraHabilitada(L)\"\n [attr.data-active]=\"activeLetter() === L ? 'true' : null\"\n [attr.aria-current]=\"activeLetter() === L ? 'true' : null\"\n [attr.aria-label]=\"'Ir a ' + L\"\n [attr.tabindex]=\"letraHabilitada(L) ? (L === alphaTabStop() ? 0 : -1) : -1\"\n (click)=\"saltarALetra(L)\"\n >\n {{ L }}\n </button>\n }\n </nav>\n }\n </div>\n\n @if (hayPie()) {\n <div class=\"ius-entnav__footer\">\n <ius-button\n variant=\"primary\"\n [prefixIcon]=\"createIcon()\"\n [label]=\"createLabel()\"\n fullWidth\n class=\"ius-entnav__cta\"\n (clicked)=\"create.emit($event)\"\n />\n </div>\n }\n}\n\n<!-- \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Plantilla de secci\u00F3n (cuerpo y secci\u00F3n fijada comparten) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n<ng-template #seccionTpl let-s>\n <section class=\"ius-entnav__section\" [attr.data-pinned]=\"s.isPinned ? 'true' : null\">\n @if (s.hasHeader) {\n <ius-section-header\n [icon]=\"s.group.icon\"\n [count]=\"s.group.count\"\n [accent]=\"accent()\"\n [sticky]=\"s.sticky\"\n [collapsible]=\"collapsibleGroups()\"\n [collapsed]=\"s.isCollapsed\"\n (toggle)=\"alternarPlegadoGrupo(s.gk)\"\n >\n {{ s.group.label }}\n @if (pinnableGroups()) {\n <ius-icon-button\n iusSectionHeaderAction\n class=\"ius-entnav__pinbtn\"\n [class.ius-entnav__pinbtn--on]=\"s.isPinned\"\n icon=\"pinboard\"\n variant=\"tertiary\"\n shape=\"circle\"\n size=\"small\"\n [ariaLabel]=\"etiquetaPinGrupo(s.isPinned)\"\n (clicked)=\"alternarPinGrupo(s.gk)\"\n />\n }\n </ius-section-header>\n }\n\n @if (s.padTop) {\n <div class=\"ius-entnav__vpad\" [style.height.px]=\"s.padTop\" aria-hidden=\"true\"></div>\n }\n\n @for (d of s.visible; track d.key) {\n @switch (d.kind) {\n @case ('letter') {\n <div class=\"ius-entnav__lanchor\" #letterAnchor [attr.data-letter]=\"d.letter\">\n <ius-section-header variant=\"letter\" [accent]=\"accent()\">{{ d.letter }}</ius-section-header>\n </div>\n }\n @case ('addChild') {\n <div class=\"ius-entnav__addchild\" [style.padding-left.px]=\"padAddChild(d.level)\">\n <ius-text-button\n size=\"small\"\n prefixIcon=\"add\"\n [label]=\"d.node.addChildLabel\"\n (clicked)=\"onAddChild(d.node, $event)\"\n />\n </div>\n }\n @default {\n <ius-entity-row\n [kind]=\"d.node.kind ?? 'expediente'\"\n [icon]=\"d.node.icon\"\n [label]=\"d.node.label\"\n [sublabel]=\"d.node.sublabel\"\n [level]=\"d.level\"\n [accent]=\"accent()\"\n [expandable]=\"d.expandable\"\n [expanded]=\"d.expanded\"\n [loading]=\"d.loading\"\n [selected]=\"d.selected\"\n [count]=\"d.node.count\"\n [unread]=\"d.node.unread\"\n [hasUnread]=\"!!d.node.hasUnread\"\n [noveltyTone]=\"d.node.noveltyTone ?? 'info'\"\n [pinned]=\"!!d.node.pinned\"\n [pinnable]=\"d.canPin\"\n [actions]=\"d.node.actions ?? []\"\n (toggle)=\"alternarNodo(d.node)\"\n (togglePin)=\"onTogglePinNodo(d.node, $event)\"\n (clicked)=\"elegirNodo(d)\"\n />\n }\n }\n }\n\n @if (s.padBot) {\n <div class=\"ius-entnav__vpad\" [style.height.px]=\"s.padBot\" aria-hidden=\"true\"></div>\n }\n\n @if (s.showMore) {\n <div class=\"ius-entnav__morerow\">\n <ius-show-more\n [expanded]=\"s.moreExpanded\"\n [remaining]=\"s.moreRemaining\"\n align=\"end\"\n (toggle)=\"alternarShowMore(s.gk)\"\n />\n </div>\n }\n\n <!-- Carga por lotes: centinela (IntersectionObserver) + \u00ABCargar m\u00E1s\u00BB. -->\n @if (s.showLoadMore) {\n <div class=\"ius-entnav__loadmore\">\n @if (s.loadingMore) {\n <ius-loading variant=\"inline\" size=\"small\" [label]=\"textoCargando()\" />\n } @else {\n <div\n class=\"ius-entnav__sentinel\"\n #lmSentinel\n [attr.data-lm-group]=\"s.gk\"\n aria-hidden=\"true\"\n ></div>\n <ius-text-button size=\"small\" [label]=\"textoCargarMas()\" (clicked)=\"dispararLote(s.gk)\" />\n }\n </div>\n }\n </section>\n</ng-template>\n", styles: ["@charset \"UTF-8\";:host{box-sizing:border-box;-webkit-user-select:none;user-select:none;display:flex;flex-direction:column;width:340px;min-width:0;height:100%;background:var(--ius-surface-card);border-right:1px solid var(--ius-stroke);font-family:var(--ius-font-body)}:host([data-collapsed=true]){width:52px}:host([data-fluid=true]:not([data-collapsed=true])){width:100%}.ius-entnav__rail{display:flex;flex-direction:column;align-items:center;gap:var(--ius-space-xs);padding:var(--ius-space-sm) var(--ius-space-xs)}.ius-entnav__head{flex:0 0 auto;display:flex;flex-direction:column;gap:var(--ius-space-xs);padding:var(--ius-space-md) var(--ius-space-md) var(--ius-space-sm);border-bottom:1px solid var(--ius-stroke)}.ius-entnav__titlerow{display:flex;align-items:center;justify-content:space-between;gap:var(--ius-space-xs)}.ius-entnav__actions{display:inline-flex;align-items:center;gap:var(--ius-space-xxs);margin-right:-4px}.ius-entnav__title{font-family:var(--ius-font-display);font-weight:var(--ius-fw-semibold);font-size:var(--ius-fs-sm);letter-spacing:.06em;text-transform:uppercase;color:var(--ius-text-tertiary);display:inline-flex;align-items:center;gap:var(--ius-space-xs)}.ius-entnav__title .ius-icon{font-size:var(--ius-icon-sm)}.ius-entnav__filters{display:flex;flex-wrap:wrap;gap:var(--ius-space-xs)}.ius-entnav__state{display:flex}.ius-entnav__state+.ius-entnav__filters{padding-top:var(--ius-space-xs);border-top:1px solid var(--ius-stroke)}.ius-entnav__addpanel{display:flex;flex-direction:column;min-width:224px;max-width:300px;max-height:min(52vh,360px)}.ius-entnav__addhead{flex:0 0 auto;display:flex;flex-direction:column;gap:var(--ius-space-xxs);padding:var(--ius-space-xxs);border-bottom:1px solid var(--ius-stroke)}.ius-entnav__addlist{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;display:flex;flex-direction:column;gap:var(--ius-space-xxs);padding:var(--ius-space-xxs);--_sb-track-margin: var(--ius-space-sm)}.ius-entnav__addempty{padding:var(--ius-space-lg) var(--ius-space-sm);text-align:center;font-size:var(--ius-fs-sm);color:var(--ius-text-tertiary)}.ius-entnav__check--off{visibility:hidden}.ius-entnav__meta{display:flex;align-items:center;justify-content:space-between;gap:var(--ius-space-xs);font-size:var(--ius-fs-sm);color:var(--ius-text-tertiary)}.ius-entnav__meta>span:first-child{flex:1 1 auto;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ius-entnav__meta>ius-dropdown{flex:0 0 auto}.ius-entnav__sort{appearance:none;border:0;background:transparent;cursor:pointer;display:inline-flex;align-items:center;gap:var(--ius-space-xxs);font-family:var(--ius-font-body);font-weight:var(--ius-fw-semibold);font-size:var(--ius-fs-sm);line-height:1.2;color:var(--ius-primary-700)}.ius-entnav__sort .ius-icon{font-size:var(--ius-icon-sm)}.ius-entnav__sort:focus-visible{outline:none;box-shadow:var(--ius-focus-ring);border-radius:var(--ius-radius-sm)}.ius-entnav__scrollwrap{position:relative;flex:1 1 auto;min-height:0;display:flex}.ius-entnav__body{flex:1 1 auto;min-width:0;overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;padding:0 var(--ius-space-xs) var(--ius-space-xs);position:relative}.ius-entnav__body[data-scrolled=true]{box-shadow:inset 0 7px 6px -6px #26262629}.ius-entnav__body[data-scrolled=true]:before{content:\"\";position:sticky;top:0;z-index:3;display:block;height:0;margin:0 -8px;border-top:1px solid var(--ius-stroke)}.ius-entnav__section{display:contents}.ius-entnav__body ius-section-header[data-variant=group]{margin:0 -8px;padding-left:var(--ius-space-md);padding-right:var(--ius-space-md)}.ius-entnav__morerow{padding:var(--ius-space-xxs) 0}ius-show-more{padding-right:var(--ius-space-xs)}.ius-entnav__loadmore{display:flex;justify-content:center;padding:var(--ius-space-xs) 0 var(--ius-space-sm)}.ius-entnav__sentinel{height:1px;margin:0;padding:0;pointer-events:none}.ius-entnav__pinned{flex:0 0 auto;padding:var(--ius-space-xxs) var(--ius-space-xs) var(--ius-space-xs);border-bottom:1px solid var(--ius-stroke);background:var(--ius-surface-card)}.ius-entnav__pinned ius-section-header[data-variant=group]{margin:0 -8px;padding-left:var(--ius-space-md);padding-right:var(--ius-space-md)}.ius-entnav__pinbtn{opacity:0;transition:opacity var(--ius-duration-fast) var(--ius-ease-standard)}ius-section-header:hover .ius-entnav__pinbtn,.ius-entnav__pinbtn:focus-within,.ius-entnav__pinbtn--on{opacity:1}.ius-entnav__addchild{display:flex;padding:var(--ius-space-xxs) var(--ius-space-xs) var(--ius-space-xs) 0}.ius-entnav__empty{display:flex;align-items:center;justify-content:center;min-height:220px;padding:var(--ius-space-xl) var(--ius-space-md)}.ius-entnav__footer{flex:0 0 auto;padding:var(--ius-space-sm) var(--ius-space-md);border-top:1px solid var(--ius-stroke)}.ius-entnav__cta{width:100%}.ius-entnav__alpha{flex:0 0 auto;display:flex;flex-direction:column;align-items:stretch;gap:var(--ius-space-none);width:var(--ius-space-lg);padding:var(--ius-space-xxs) 0;overflow:hidden;-webkit-user-select:none;user-select:none}.ius-entnav__alpha-let{appearance:none;border:0;background:transparent;cursor:pointer;flex:1 1 0;min-height:0;display:inline-flex;align-items:center;justify-content:center;padding:0;font-family:var(--ius-font-body);font-weight:var(--ius-fw-medium);font-size:var(--ius-fs-sm);line-height:var(--ius-lh-sm);color:var(--ius-text-tertiary);border-radius:var(--ius-radius-sm);transition:color var(--ius-duration-fast) var(--ius-ease-standard),background var(--ius-duration-fast) var(--ius-ease-standard)}.ius-entnav__alpha-let:hover{color:var(--ius-primary-700)}.ius-entnav__alpha-let[data-active=true]{color:var(--ius-primary-900);background:var(--ius-neutral-2);font-weight:var(--ius-fw-bold)}.ius-entnav__alpha-let:disabled{color:var(--ius-text-tertiary);opacity:.35;cursor:default}.ius-entnav__alpha-let:focus-visible{outline:none;box-shadow:var(--ius-focus-ring)}\n"] }]
|
|
17524
|
+
}, template: "<!-- Riel colapsado: solo expandir + CTA. Rama aparte, como el golden. -->\n@if (collapsible() && isCollapsed()) {\n <div class=\"ius-entnav__rail\">\n <ius-icon-button\n icon=\"left_panel_open\"\n variant=\"tertiary\"\n shape=\"circle\"\n size=\"small\"\n ariaLabel=\"Expandir\"\n (clicked)=\"alternarColapso()\"\n />\n @if (hayPie()) {\n <ius-icon-button\n [icon]=\"createIcon()\"\n variant=\"secondary\"\n shape=\"circle\"\n size=\"small\"\n [ariaLabel]=\"createLabel()\"\n (clicked)=\"create.emit($event)\"\n />\n }\n </div>\n} @else {\n <!-- \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Cabecera \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n <div class=\"ius-entnav__head\">\n @if (hayCabecera()) {\n <div class=\"ius-entnav__titlerow\">\n @if (title()) {\n <div class=\"ius-entnav__title\">\n @if (titleIcon()) {\n <span translate=\"no\" class=\"ius-icon\">{{ titleIcon() }}</span>\n }\n {{ title() }}\n </div>\n } @else {\n <span></span>\n }\n <span class=\"ius-entnav__actions\">\n @if (showSearchToggle()) {\n <!-- El `state: pressed` del golden no se porta: IconButton omite `state`\n de su API p\u00FAblica a prop\u00F3sito (decisi\u00F3n suya, documentada). -->\n <ius-icon-button\n icon=\"search\"\n variant=\"tertiary\"\n shape=\"circle\"\n size=\"small\"\n ariaLabel=\"Buscar (\u2318K)\"\n (clicked)=\"alternarBusqueda()\"\n />\n }\n @if (collapsible()) {\n <ius-icon-button\n icon=\"left_panel_close\"\n variant=\"tertiary\"\n shape=\"circle\"\n size=\"small\"\n ariaLabel=\"Colapsar\"\n (clicked)=\"alternarColapso()\"\n />\n }\n </span>\n </div>\n }\n\n @if (searchVisible()) {\n <div #searchBox>\n <ius-search-bar\n [placeholder]=\"searchPlaceholder()\"\n size=\"medium\"\n [value]=\"searchValue()\"\n (valueChange)=\"onSearchValueChange($event)\"\n (search)=\"search.emit($event)\"\n (cleared)=\"searchClear.emit()\"\n />\n </div>\n }\n\n <!-- Eje de estado: excluyente, ortogonal a facetas y b\u00FAsqueda; no poda datos. -->\n @if (stateSegments()?.length) {\n <div class=\"ius-entnav__state\">\n <ius-segmented-control\n [options]=\"segmentos()\"\n [value]=\"stateVal()\"\n size=\"small\"\n variant=\"subtle\"\n fullWidth\n (valueChange)=\"elegirEstado($event)\"\n />\n </div>\n }\n\n @if (hayBarraFiltros()) {\n <div class=\"ius-entnav__filters\">\n @for (f of filters(); track f.key) {\n <ius-tag\n role=\"filter\"\n size=\"small\"\n [tone]=\"tonoFiltro(f)\"\n [icon]=\"f.icon\"\n [dot]=\"f.dot\"\n [count]=\"f.count\"\n [label]=\"f.label\"\n [selected]=\"activeKeys().has(f.key)\"\n [closable]=\"!!f.removable\"\n (clicked)=\"alternarFiltro(f.key)\"\n (closed)=\"quitarFiltro(f.key)\"\n />\n }\n\n <!-- Facetas: Tag `soft` con el tono categ\u00F3rico de su categor\u00EDa, NUNCA solid. -->\n @for (f of facets(); track f.key) {\n <ius-tag\n role=\"label\"\n variant=\"soft\"\n size=\"small\"\n [tone]=\"tonoFaceta(f)\"\n [icon]=\"f.icon\"\n closable\n [label]=\"textoFaceta(f)\"\n (closed)=\"quitarFaceta(f.key)\"\n />\n }\n\n @if (availableFilters().length) {\n <ius-popover\n trigger=\"manual\"\n [open]=\"addOpen()\"\n [dismissable]=\"true\"\n placement=\"bottom-start\"\n [offset]=\"6\"\n [showArrow]=\"false\"\n padding=\"none\"\n (openChange)=\"onAddOpenChange($event)\"\n >\n <ius-tag\n role=\"filter\"\n variant=\"outline\"\n tone=\"neutral\"\n size=\"small\"\n icon=\"add\"\n label=\"Filtro\"\n [selected]=\"addOpen()\"\n (clicked)=\"alternarMenuFiltro()\"\n />\n\n <div iusPopoverContent class=\"ius-entnav__addpanel\">\n @if (addStep(); as step) {\n <div class=\"ius-entnav__addhead\">\n <ius-menu-item\n icon=\"chevron_left\"\n [label]=\"step.label\"\n size=\"small\"\n (clicked)=\"volverDelPaso()\"\n />\n @if (step.picker === 'search') {\n <ius-search-bar\n size=\"small\"\n placeholder=\"Buscar\u2026\"\n [value]=\"addQuery()\"\n (valueChange)=\"addQuery.set($event)\"\n (cleared)=\"addQuery.set('')\"\n />\n }\n </div>\n <div class=\"ius-entnav__addlist ius-scroll ius-scroll--sm\">\n @if (opcionesDelPaso().length === 0) {\n <div class=\"ius-entnav__addempty\">Sin resultados</div>\n } @else {\n @for (o of opcionesDelPaso(); track o.key) {\n <!-- El check se proyecta SIEMPRE y se oculta por CSS: un\n `<ng-content>` detr\u00E1s de un `@if` que depende de un\n contentChild se pierde en el primer render. -->\n <ius-menu-item\n [label]=\"o.label\"\n size=\"small\"\n [selected]=\"facetaActiva(step, o)\"\n (clicked)=\"elegirValor(step, o)\"\n >\n <span\n iusMenuItemTrailing\n translate=\"no\"\n class=\"ius-icon\"\n [class.ius-entnav__check--off]=\"!facetaActiva(step, o)\"\n >check</span\n >\n </ius-menu-item>\n }\n }\n </div>\n } @else {\n <div class=\"ius-entnav__addlist ius-scroll ius-scroll--sm\">\n @for (a of categoriasDisponibles(); track a.key) {\n <ius-menu-item\n [icon]=\"a.icon\"\n [label]=\"a.label\"\n size=\"small\"\n (clicked)=\"elegirCategoria(a)\"\n >\n <span\n iusMenuItemTrailing\n translate=\"no\"\n class=\"ius-icon\"\n [class.ius-entnav__check--off]=\"!a.picker\"\n >chevron_right</span\n >\n </ius-menu-item>\n }\n </div>\n }\n </div>\n </ius-popover>\n }\n </div>\n }\n\n @if (hayMeta()) {\n <div class=\"ius-entnav__meta\">\n <span>{{ metaLabel() || '' }}</span>\n @if (sortOptions()?.length) {\n <ius-dropdown\n [selectable]=\"true\"\n [value]=\"sortValue()\"\n label=\"Ordenar por\"\n tone=\"neutral\"\n [items]=\"sortOptions() ?? []\"\n placement=\"bottom-end\"\n (valueChange)=\"onSort($event)\"\n />\n } @else if (sortLabel()) {\n <button type=\"button\" class=\"ius-entnav__sort\" (click)=\"sort.emit({ value: sortValue() })\">\n {{ sortLabel() }}\n <span translate=\"no\" class=\"ius-icon\">expand_more</span>\n </button>\n }\n </div>\n }\n </div>\n\n <!-- Secci\u00F3n fijada: vive FUERA del cuerpo con scroll (no entra en la ventana\n de render ni en el cursor aritm\u00E9tico de la virtualizaci\u00F3n). -->\n @if (modelo().fijada; as fijada) {\n <div class=\"ius-entnav__pinned\">\n <ng-container [ngTemplateOutlet]=\"seccionTpl\" [ngTemplateOutletContext]=\"{ $implicit: fijada }\" />\n </div>\n }\n\n <div class=\"ius-entnav__scrollwrap\">\n <div\n class=\"ius-entnav__body ius-scroll ius-scroll--sm\"\n #body\n [attr.data-scrolled]=\"bodyScrolled() ? 'true' : null\"\n >\n @if (vacio()) {\n <div class=\"ius-entnav__empty\">\n @if (emptyStateTemplate(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n <ius-empty-state\n variant=\"no-results\"\n size=\"compact\"\n [title]=\"noResultsLabel()\"\n [description]=\"descripcionVacio()\"\n />\n }\n </div>\n } @else {\n @for (s of modelo().secciones; track s.gk) {\n <ng-container [ngTemplateOutlet]=\"seccionTpl\" [ngTemplateOutletContext]=\"{ $implicit: s }\" />\n }\n }\n </div>\n\n <!-- \u00CDndice alfab\u00E9tico: navega, no reordena. Se oculta con b\u00FAsqueda/filtros. -->\n @if (alphaVisible()) {\n <nav\n class=\"ius-entnav__alpha\"\n #alpha\n role=\"navigation\"\n aria-label=\"\u00CDndice alfab\u00E9tico\"\n (keydown)=\"onRailKey($event)\"\n >\n @for (L of displayLetters(); track L) {\n <button\n type=\"button\"\n class=\"ius-entnav__alpha-let\"\n [disabled]=\"!letraHabilitada(L)\"\n [attr.data-active]=\"activeLetter() === L ? 'true' : null\"\n [attr.aria-current]=\"activeLetter() === L ? 'true' : null\"\n [attr.aria-label]=\"'Ir a ' + L\"\n [attr.tabindex]=\"letraHabilitada(L) ? (L === alphaTabStop() ? 0 : -1) : -1\"\n (click)=\"saltarALetra(L)\"\n >\n {{ L }}\n </button>\n }\n </nav>\n }\n </div>\n\n @if (hayPie()) {\n <div class=\"ius-entnav__footer\">\n <ius-button\n variant=\"primary\"\n [prefixIcon]=\"createIcon()\"\n [label]=\"createLabel()\"\n fullWidth\n class=\"ius-entnav__cta\"\n (clicked)=\"create.emit($event)\"\n />\n </div>\n }\n}\n\n<!-- \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Plantilla de secci\u00F3n (cuerpo y secci\u00F3n fijada comparten) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n<ng-template #seccionTpl let-s>\n <section\n class=\"ius-entnav__section\"\n [attr.data-group]=\"s.gk\"\n [attr.data-pinned]=\"s.isPinned ? 'true' : null\"\n >\n @if (s.hasHeader) {\n <ius-section-header\n [icon]=\"s.group.icon\"\n [count]=\"s.group.count\"\n [accent]=\"accent()\"\n [sticky]=\"s.sticky\"\n [collapsible]=\"collapsibleGroups()\"\n [collapsed]=\"s.isCollapsed\"\n (toggle)=\"alternarPlegadoGrupo(s.gk)\"\n >\n {{ s.group.label }}\n @if (pinnableGroups()) {\n <ius-icon-button\n iusSectionHeaderAction\n class=\"ius-entnav__pinbtn\"\n [class.ius-entnav__pinbtn--on]=\"s.isPinned\"\n icon=\"pinboard\"\n variant=\"tertiary\"\n shape=\"circle\"\n size=\"small\"\n [ariaLabel]=\"etiquetaPinGrupo(s.isPinned)\"\n (clicked)=\"alternarPinGrupo(s.gk)\"\n />\n }\n </ius-section-header>\n }\n\n @if (s.padTop) {\n <div class=\"ius-entnav__vpad\" [style.height.px]=\"s.padTop\" aria-hidden=\"true\"></div>\n }\n\n @for (d of s.visible; track d.key) {\n @switch (d.kind) {\n @case ('letter') {\n <div class=\"ius-entnav__lanchor\" #letterAnchor [attr.data-letter]=\"d.letter\">\n <ius-section-header variant=\"letter\" [accent]=\"accent()\">{{ d.letter }}</ius-section-header>\n </div>\n }\n @case ('addChild') {\n <div class=\"ius-entnav__addchild\" [style.padding-left.px]=\"padAddChild(d.level)\">\n <ius-text-button\n size=\"small\"\n prefixIcon=\"add\"\n [label]=\"d.node.addChildLabel\"\n (clicked)=\"onAddChild(d.node, $event)\"\n />\n </div>\n }\n @default {\n <ius-entity-row\n [kind]=\"d.node.kind ?? 'expediente'\"\n [icon]=\"d.node.icon\"\n [label]=\"d.node.label\"\n [sublabel]=\"d.node.sublabel\"\n [level]=\"d.level\"\n [accent]=\"accent()\"\n [expandable]=\"d.expandable\"\n [expanded]=\"d.expanded\"\n [loading]=\"d.loading\"\n [selected]=\"d.selected\"\n [count]=\"d.node.count\"\n [unread]=\"d.node.unread\"\n [hasUnread]=\"!!d.node.hasUnread\"\n [noveltyTone]=\"d.node.noveltyTone ?? 'info'\"\n [pinned]=\"!!d.node.pinned\"\n [pinnable]=\"d.canPin\"\n [actions]=\"d.node.actions ?? []\"\n (toggle)=\"alternarNodo(d.node)\"\n (togglePin)=\"onTogglePinNodo(d.node, $event)\"\n (clicked)=\"elegirNodo(d)\"\n />\n }\n }\n }\n\n @if (s.padBot) {\n <div class=\"ius-entnav__vpad\" [style.height.px]=\"s.padBot\" aria-hidden=\"true\"></div>\n }\n\n @if (s.showMore) {\n <div class=\"ius-entnav__morerow\">\n <ius-show-more\n [expanded]=\"s.moreExpanded\"\n [remaining]=\"s.moreRemaining\"\n align=\"end\"\n (toggle)=\"alternarShowMore(s.gk)\"\n />\n </div>\n }\n\n <!-- Carga por lotes: centinela (IntersectionObserver) + \u00ABCargar m\u00E1s\u00BB. -->\n @if (s.showLoadMore) {\n <div class=\"ius-entnav__loadmore\">\n @if (s.loadingMore) {\n <ius-loading variant=\"inline\" size=\"small\" [label]=\"textoCargando()\" />\n } @else {\n <div\n class=\"ius-entnav__sentinel\"\n #lmSentinel\n [attr.data-lm-group]=\"s.gk\"\n aria-hidden=\"true\"\n ></div>\n <ius-text-button size=\"small\" [label]=\"textoCargarMas()\" (clicked)=\"dispararLote(s.gk)\" />\n }\n </div>\n }\n </section>\n</ng-template>\n", styles: ["@charset \"UTF-8\";:host{box-sizing:border-box;-webkit-user-select:none;user-select:none;display:flex;flex-direction:column;width:340px;min-width:0;height:100%;background:var(--ius-surface-card);border-right:1px solid var(--ius-stroke);font-family:var(--ius-font-body)}:host([data-collapsed=true]){width:52px}:host([data-fluid=true]:not([data-collapsed=true])){width:100%}.ius-entnav__rail{display:flex;flex-direction:column;align-items:center;gap:var(--ius-space-xs);padding:var(--ius-space-sm) var(--ius-space-xs)}.ius-entnav__head{flex:0 0 auto;display:flex;flex-direction:column;gap:var(--ius-space-xs);padding:var(--ius-space-md) var(--ius-space-md) var(--ius-space-sm);border-bottom:1px solid var(--ius-stroke)}.ius-entnav__titlerow{display:flex;align-items:center;justify-content:space-between;gap:var(--ius-space-xs)}.ius-entnav__actions{display:inline-flex;align-items:center;gap:var(--ius-space-xxs);margin-right:-4px}.ius-entnav__title{font-family:var(--ius-font-display);font-weight:var(--ius-fw-semibold);font-size:var(--ius-fs-sm);letter-spacing:.06em;text-transform:uppercase;color:var(--ius-text-tertiary);display:inline-flex;align-items:center;gap:var(--ius-space-xs)}.ius-entnav__title .ius-icon{font-size:var(--ius-icon-sm)}.ius-entnav__filters{display:flex;flex-wrap:wrap;gap:var(--ius-space-xs)}.ius-entnav__state{display:flex}.ius-entnav__state+.ius-entnav__filters{padding-top:var(--ius-space-xs);border-top:1px solid var(--ius-stroke)}.ius-entnav__addpanel{display:flex;flex-direction:column;min-width:224px;max-width:300px;max-height:min(52vh,360px)}.ius-entnav__addhead{flex:0 0 auto;display:flex;flex-direction:column;gap:var(--ius-space-xxs);padding:var(--ius-space-xxs);border-bottom:1px solid var(--ius-stroke)}.ius-entnav__addlist{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;display:flex;flex-direction:column;gap:var(--ius-space-xxs);padding:var(--ius-space-xxs);--_sb-track-margin: var(--ius-space-sm)}.ius-entnav__addempty{padding:var(--ius-space-lg) var(--ius-space-sm);text-align:center;font-size:var(--ius-fs-sm);color:var(--ius-text-tertiary)}.ius-entnav__check--off{visibility:hidden}.ius-entnav__meta{display:flex;align-items:center;justify-content:space-between;gap:var(--ius-space-xs);font-size:var(--ius-fs-sm);color:var(--ius-text-tertiary)}.ius-entnav__meta>span:first-child{flex:1 1 auto;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ius-entnav__meta>ius-dropdown{flex:0 0 auto}.ius-entnav__sort{appearance:none;border:0;background:transparent;cursor:pointer;display:inline-flex;align-items:center;gap:var(--ius-space-xxs);font-family:var(--ius-font-body);font-weight:var(--ius-fw-semibold);font-size:var(--ius-fs-sm);line-height:1.2;color:var(--ius-primary-700)}.ius-entnav__sort .ius-icon{font-size:var(--ius-icon-sm)}.ius-entnav__sort:focus-visible{outline:none;box-shadow:var(--ius-focus-ring);border-radius:var(--ius-radius-sm)}.ius-entnav__scrollwrap{position:relative;flex:1 1 auto;min-height:0;display:flex}.ius-entnav__body{flex:1 1 auto;min-width:0;overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;padding:0 var(--ius-space-xs) var(--ius-space-xs);position:relative}.ius-entnav__body[data-scrolled=true]{box-shadow:inset 0 7px 6px -6px #26262629}.ius-entnav__body[data-scrolled=true]:before{content:\"\";position:sticky;top:0;z-index:3;display:block;height:0;margin:0 -8px;border-top:1px solid var(--ius-stroke)}.ius-entnav__section{display:contents}.ius-entnav__body ius-section-header[data-variant=group]{margin:0 -8px;padding-left:var(--ius-space-md);padding-right:var(--ius-space-md)}.ius-entnav__morerow{padding:var(--ius-space-xxs) 0}ius-show-more{padding-right:var(--ius-space-xs)}.ius-entnav__loadmore{display:flex;justify-content:center;padding:var(--ius-space-xs) 0 var(--ius-space-sm)}.ius-entnav__sentinel{height:1px;margin:0;padding:0;pointer-events:none}.ius-entnav__pinned{flex:0 0 auto;padding:var(--ius-space-xxs) var(--ius-space-xs) var(--ius-space-xs);border-bottom:1px solid var(--ius-stroke);background:var(--ius-surface-card)}.ius-entnav__pinned ius-section-header[data-variant=group]{margin:0 -8px;padding-left:var(--ius-space-md);padding-right:var(--ius-space-md)}.ius-entnav__pinbtn{opacity:0;transition:opacity var(--ius-duration-fast) var(--ius-ease-standard)}ius-section-header:hover .ius-entnav__pinbtn,.ius-entnav__pinbtn:focus-within,.ius-entnav__pinbtn--on{opacity:1}.ius-entnav__addchild{display:flex;padding:var(--ius-space-xxs) var(--ius-space-xs) var(--ius-space-xs) 0}.ius-entnav__empty{display:flex;align-items:center;justify-content:center;min-height:220px;padding:var(--ius-space-xl) var(--ius-space-md)}.ius-entnav__footer{flex:0 0 auto;padding:var(--ius-space-sm) var(--ius-space-md);border-top:1px solid var(--ius-stroke)}.ius-entnav__cta{width:100%}.ius-entnav__alpha{flex:0 0 auto;display:flex;flex-direction:column;align-items:stretch;gap:var(--ius-space-none);width:var(--ius-space-lg);padding:var(--ius-space-xxs) 0;overflow:hidden;-webkit-user-select:none;user-select:none}.ius-entnav__alpha-let{appearance:none;border:0;background:transparent;cursor:pointer;flex:1 1 0;min-height:0;display:inline-flex;align-items:center;justify-content:center;padding:0;font-family:var(--ius-font-body);font-weight:var(--ius-fw-medium);font-size:var(--ius-fs-sm);line-height:var(--ius-lh-sm);color:var(--ius-text-tertiary);border-radius:var(--ius-radius-sm);transition:color var(--ius-duration-fast) var(--ius-ease-standard),background var(--ius-duration-fast) var(--ius-ease-standard)}.ius-entnav__alpha-let:hover{color:var(--ius-primary-700)}.ius-entnav__alpha-let[data-active=true]{color:var(--ius-primary-900);background:var(--ius-neutral-2);font-weight:var(--ius-fw-bold)}.ius-entnav__alpha-let:disabled{color:var(--ius-text-tertiary);opacity:.35;cursor:default}.ius-entnav__alpha-let:focus-visible{outline:none;box-shadow:var(--ius-focus-ring)}\n"] }]
|
|
17479
17525
|
}], ctorParameters: () => [], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], titleIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "titleIcon", required: false }] }], searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], searchThreshold: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchThreshold", required: false }] }], searchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchPlaceholder", required: false }] }], searchValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchValue", required: false }] }], filters: [{ type: i0.Input, args: [{ isSignal: true, alias: "filters", required: false }] }], selectedFilters: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedFilters", required: false }] }], availableFilters: [{ type: i0.Input, args: [{ isSignal: true, alias: "availableFilters", required: false }] }], activeFacets: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeFacets", required: false }] }], stateSegments: [{ type: i0.Input, args: [{ isSignal: true, alias: "stateSegments", required: false }] }], stateValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "stateValue", required: false }] }], sortLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortLabel", required: false }] }], sortOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortOptions", required: false }] }], sortValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortValue", required: false }] }], metaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "metaLabel", required: false }] }], groups: [{ type: i0.Input, args: [{ isSignal: true, alias: "groups", required: false }] }], items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], accent: [{ type: i0.Input, args: [{ isSignal: true, alias: "accent", required: false }] }], defaultExpanded: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultExpanded", required: false }] }], expanded: [{ type: i0.Input, args: [{ isSignal: true, alias: "expanded", required: false }] }], autoExpandOnFilter: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoExpandOnFilter", required: false }] }], selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: false }] }], defaultSelected: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultSelected", required: false }] }], emptyStateTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyStateTemplate", required: false }] }], noResultsLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "noResultsLabel", required: false }] }], createLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "createLabel", required: false }] }], createIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "createIcon", required: false }] }], groupLimit: [{ type: i0.Input, args: [{ isSignal: true, alias: "groupLimit", required: false }] }], collapsibleGroups: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsibleGroups", required: false }] }], collapsedGroups: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsedGroups", required: false }] }], stickyHeaders: [{ type: i0.Input, args: [{ isSignal: true, alias: "stickyHeaders", required: false }] }], pinnableGroups: [{ type: i0.Input, args: [{ isSignal: true, alias: "pinnableGroups", required: false }] }], defaultPinnedGroup: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultPinnedGroup", required: false }] }], moreLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "moreLabel", required: false }] }], alphaIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "alphaIndex", required: false }] }], alphaIndexLetters: [{ type: i0.Input, args: [{ isSignal: true, alias: "alphaIndexLetters", required: false }] }], loadMoreLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadMoreLabel", required: false }] }], virtualized: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualized", required: false }] }], virtualizeThreshold: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualizeThreshold", required: false }] }], itemHeights: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemHeights", required: false }] }], collapsible: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsible", required: false }] }], collapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsed", required: false }] }], defaultCollapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultCollapsed", required: false }] }], fluidWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "fluidWidth", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], search: [{
|
|
17480
17526
|
type: Output
|
|
17481
17527
|
}], searchChange: [{
|