@litigiovirtual/ius-design-components 2.0.0 → 2.0.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@litigiovirtual/ius-design-components",
3
- "version": "2.0.0",
3
+ "version": "2.0.3",
4
4
  "peerDependencies": {
5
5
  "@angular/cdk": ">=22.0.0 <23.0.0",
6
6
  "@angular/common": ">=22.0.0 <23.0.0",
@@ -849,7 +849,7 @@ declare class AlertComponent {
849
849
  /** Tamaño. */
850
850
  readonly size: _angular_core.InputSignal<AlertSize>;
851
851
  /** Estilo del borde. */
852
- readonly border: _angular_core.InputSignal<"solid" | "none" | "dashed">;
852
+ readonly border: _angular_core.InputSignal<"none" | "solid" | "dashed">;
853
853
  /** Título tonal en negrita. */
854
854
  readonly title: _angular_core.InputSignal<string | undefined>;
855
855
  /** Línea superior breve (uppercase). */
@@ -869,7 +869,7 @@ declare class AlertComponent {
869
869
  /** Alineación (auto: `center` si hay `trailing` sin `actions`). */
870
870
  readonly align: _angular_core.InputSignal<"start" | "center" | undefined>;
871
871
  /** `status` (default, no interrumpe) o `alert` (asertivo). */
872
- readonly role: _angular_core.InputSignal<"status" | "alert">;
872
+ readonly role: _angular_core.InputSignal<"alert" | "status">;
873
873
  /** Al pulsar × (original: `onClose`). */
874
874
  readonly closed: _angular_core.OutputEmitterRef<void>;
875
875
  private readonly actionsRef;
@@ -2221,7 +2221,7 @@ declare class TextComponent {
2221
2221
  /** Overrides por token (color/weight/align/italic-inline/tabular/truncate). */
2222
2222
  protected get styleObject(): Record<string, string>;
2223
2223
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TextComponent, never>;
2224
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TextComponent, "ius-text", never, { "variant": { "alias": "variant"; "required": false; }; "color": { "alias": "color"; "required": false; }; "weight": { "alias": "weight"; "required": false; }; "as": { "alias": "as"; "required": false; }; "align": { "alias": "align"; "required": false; }; "italic": { "alias": "italic"; "required": false; }; "truncate": { "alias": "truncate"; "required": false; }; "tabularNums": { "alias": "tabularNums"; "required": false; }; "for": { "alias": "for"; "required": false; }; }, {}, never, ["*", "*", "*", "*", "*", "*", "*", "*", "*", "*", "*", "*"], true, never>;
2224
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TextComponent, "ius-text", never, { "variant": { "alias": "variant"; "required": false; }; "color": { "alias": "color"; "required": false; }; "weight": { "alias": "weight"; "required": false; }; "as": { "alias": "as"; "required": false; }; "align": { "alias": "align"; "required": false; }; "italic": { "alias": "italic"; "required": false; }; "truncate": { "alias": "truncate"; "required": false; }; "tabularNums": { "alias": "tabularNums"; "required": false; }; "for": { "alias": "for"; "required": false; }; }, {}, never, ["*"], true, never>;
2225
2225
  static ngAcceptInputType_italic: unknown;
2226
2226
  static ngAcceptInputType_truncate: unknown;
2227
2227
  static ngAcceptInputType_tabularNums: unknown;
@@ -2396,8 +2396,13 @@ interface VisibleModel {
2396
2396
  * - El golden compone `OptionItem` (filas) y `Chip` (chips de múltiple): ya
2397
2397
  * portados como `ius-option-item` / `ius-chip`, se componen aquí directamente
2398
2398
  * (sin CSS inlineado). Los chips de múltiple usan `ius-chip removable`.
2399
- * - El menú se posiciona con `position: fixed` + medición manual (flip abajo/
2400
- * arriba, iguala ancho del campo), espejo de `updatePosition` del golden.
2399
+ * - El menú se portalea a `document.body` vía **CDK Overlay**
2400
+ * (`flexibleConnectedTo` el trigger + `scrollStrategy: reposition`), con
2401
+ * flip abajo/arriba e igualando el ancho del campo — espejo de
2402
+ * `updatePosition` del golden. Encapsulation por defecto (Emulated): los
2403
+ * estilos del menú siguen aplicando dentro del overlay porque Angular
2404
+ * inyecta el `<style>` scopeado en el `<head>` global (mismo patrón que
2405
+ * `ius-modal`, ver `src/lib/modal/modal.component.ts`).
2401
2406
  */
2402
2407
  declare class SelectComponent implements ControlValueAccessor, OnInit, OnDestroy {
2403
2408
  private readonly optionsState;
@@ -2486,21 +2491,24 @@ declare class SelectComponent implements ControlValueAccessor, OnInit, OnDestroy
2486
2491
  private readonly internalOpen;
2487
2492
  protected readonly query: _angular_core.WritableSignal<string>;
2488
2493
  protected readonly activeIndex: _angular_core.WritableSignal<number>;
2489
- protected readonly menuPos: _angular_core.WritableSignal<{
2490
- x: number;
2491
- y: number;
2492
- width: number;
2493
- placement: "bottom" | "top";
2494
- }>;
2494
+ /** Ancho del menú (portal CDK) — igualado al ancho del campo. */
2495
+ protected readonly menuWidth: _angular_core.WritableSignal<number>;
2495
2496
  private readonly field;
2496
2497
  private readonly menu;
2497
2498
  private readonly search;
2499
+ private readonly menuTpl;
2498
2500
  protected readonly baseId: string;
2499
2501
  protected readonly helpId: string;
2502
+ /** `id` único del menú — target de `aria-controls` en el trigger. */
2503
+ protected readonly menuId: string;
2500
2504
  private onChange;
2501
2505
  private onTouched;
2506
+ private readonly overlay;
2507
+ private readonly viewContainerRef;
2508
+ private overlayRef;
2502
2509
  private raf;
2503
- private readonly repositionBound;
2510
+ private typeaheadBuffer;
2511
+ private typeaheadTimer;
2504
2512
  protected readonly isDisabled: _angular_core.Signal<boolean>;
2505
2513
  protected readonly isError: _angular_core.Signal<boolean>;
2506
2514
  protected readonly isOpen: _angular_core.Signal<boolean>;
@@ -2515,6 +2523,16 @@ declare class SelectComponent implements ControlValueAccessor, OnInit, OnDestroy
2515
2523
  protected get showHint(): boolean;
2516
2524
  protected get showClearComputed(): boolean;
2517
2525
  protected get helpIconTitle(): string | undefined;
2526
+ /**
2527
+ * Alto de fila usado para `maxVisible × itemH` — deriva del box-model real
2528
+ * de `OptionItem` (`option-item.component.scss`): `--_opt-py` (padding
2529
+ * vertical, top+bottom) + `--ius-lh-base` (line-height, fija en 20px, no
2530
+ * cambia por tamaño — solo el font-size lo hace). small py=6px → 32px ·
2531
+ * medium py=8px (`--ius-space-xs`) → 36px · large py=11px → 42px. No
2532
+ * incluye el `gap` entre filas de `.ius-selectmenu__list`
2533
+ * (`--ius-space-xxs`) — constante estructural documentada, no medida en
2534
+ * runtime.
2535
+ */
2518
2536
  protected get listMaxH(): number;
2519
2537
  protected labelFor(val: IusSelectValue): string;
2520
2538
  protected isChosen(val: IusSelectValue): boolean;
@@ -2532,13 +2550,30 @@ declare class SelectComponent implements ControlValueAccessor, OnInit, OnDestroy
2532
2550
  private setOpen;
2533
2551
  protected onSearch(event: Event): void;
2534
2552
  private moveActive;
2553
+ /**
2554
+ * ¿Es una tecla imprimible de una sola posición (typeahead)? Se ignora
2555
+ * cuando el foco está en la caja de búsqueda (ahí escribir filtra, no
2556
+ * hace typeahead) y cuando hay modificadores (Ctrl/Alt/Meta).
2557
+ */
2558
+ private isTypeaheadKey;
2559
+ /** Quita diacríticos y normaliza a minúsculas para comparar etiquetas. */
2560
+ private normalizeLabel;
2561
+ /**
2562
+ * Typeahead: acumula el carácter en un buffer (expira a los ~700ms) y
2563
+ * salta el resaltado/apertura a la primera opción habilitada cuya etiqueta
2564
+ * empiece por el buffer. Con el menú abierto solo mueve el resaltado; con
2565
+ * el menú cerrado (single) lo abre y resalta el match (sin seleccionar).
2566
+ */
2567
+ private handleTypeahead;
2535
2568
  protected onTriggerKeyDown(event: KeyboardEvent): void;
2536
2569
  protected onDocumentMouseDown(event: MouseEvent): void;
2537
2570
  protected onEscape(): void;
2538
- private scheduleReposition;
2539
- private reposition;
2540
- private attachListeners;
2541
- private teardownListeners;
2571
+ /** Difiere el attach un frame (deja que `@if`/inputs terminen de asentarse). */
2572
+ private scheduleOpen;
2573
+ private attachOverlay;
2574
+ private detachOverlay;
2575
+ private updateMenuWidth;
2576
+ private readonly onWindowResize;
2542
2577
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SelectComponent, never>;
2543
2578
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<SelectComponent, "ius-select", never, { "options": { "alias": "options"; "required": false; }; "multiple": { "alias": "multiple"; "required": false; }; "size": { "alias": "size"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "error": { "alias": "error"; "required": false; }; "state": { "alias": "state"; "required": false; }; "open": { "alias": "open"; "required": false; }; "value": { "alias": "value"; "required": false; }; "label": { "alias": "label"; "required": false; }; "required": { "alias": "required"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "prefixIcon": { "alias": "prefixIcon"; "required": false; }; "searchable": { "alias": "searchable"; "required": false; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; }; "emptyText": { "alias": "emptyText"; "required": false; }; "maxVisible": { "alias": "maxVisible"; "required": false; }; "helpText": { "alias": "helpText"; "required": false; }; "errorText": { "alias": "errorText"; "required": false; }; "showHelpText": { "alias": "showHelpText"; "required": false; }; "showIconHelp": { "alias": "showIconHelp"; "required": false; }; "iconHelpTitle": { "alias": "iconHelpTitle"; "required": false; }; "iconHelpContent": { "alias": "iconHelpContent"; "required": false; }; "showClear": { "alias": "showClear"; "required": false; }; "defaultOpen": { "alias": "defaultOpen"; "required": false; }; "compact": { "alias": "compact"; "required": false; }; "defaultValue": { "alias": "defaultValue"; "required": false; }; "id": { "alias": "id"; "required": false; }; "name": { "alias": "name"; "required": false; }; }, { "valueChange": "valueChange"; "cleared": "cleared"; "openChange": "openChange"; }, never, never, true, never>;
2544
2579
  static ngAcceptInputType_multiple: unknown;