@litigiovirtual/ius-design-components 2.0.6 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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<"none" | "solid" | "dashed">;
852
+ readonly border: _angular_core.InputSignal<"solid" | "none" | "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<"alert" | "status">;
872
+ readonly role: _angular_core.InputSignal<"status" | "alert">;
873
873
  /** Al pulsar × (original: `onClose`). */
874
874
  readonly closed: _angular_core.OutputEmitterRef<void>;
875
875
  private readonly actionsRef;
@@ -1900,446 +1900,553 @@ declare class TagComponent {
1900
1900
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<TagComponent, "ius-tag", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "role": { "alias": "role"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "shape": { "alias": "shape"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "dot": { "alias": "dot"; "required": false; "isSignal": true; }; "count": { "alias": "count"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; "closeLabel": { "alias": "closeLabel"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; }, { "clicked": "clicked"; "closed": "closed"; }, ["prefixRef", "suffixRef"], ["[iusTagPrefix]", "*", "[iusTagSuffix]"], true, never>;
1901
1901
  }
1902
1902
 
1903
- /** Tamaño del campo: small ~34 · medium ~40 (default) · large ~48 px. */
1904
- type IusMultiTextFieldSize = 'small' | 'medium' | 'large';
1905
- /** Estado forzado solo demos / especímenes. */
1906
- type IusMultiTextFieldState = 'hover' | 'focused' | 'error' | 'disabled';
1907
- /** Un segmento (`<input>`) del MultiTextField. */
1908
- interface IusMultiTextFieldSlot {
1909
- /** Placeholder del segmento. */
1910
- placeholder?: string;
1911
- /** `name` del input (envío como form). */
1912
- name?: string;
1913
- /** Tipo del `<input>`. Default `text`. */
1914
- type?: 'text' | 'number' | 'tel' | 'password';
1915
- /** Valor controlado del segmento. */
1916
- value?: string;
1917
- /** Valor inicial (no controlado). */
1918
- defaultValue?: string;
1919
- /** Ancho fijo. Número → px; string → CSS literal. */
1903
+ /** Tono semántico de un estado (nunca un hue "fruta"). */
1904
+ type StatusTone = 'info' | 'neutral' | 'primary' | 'success' | 'warning' | 'danger';
1905
+ /** Los 6 tonos semánticos, en el orden del contrato. Útil para matrices/demos. */
1906
+ declare const STATUS_TONES: readonly StatusTone[];
1907
+ /**
1908
+ * Cómo se pinta un estado: rótulo, tono semántico e ícono Material Symbols
1909
+ * (ligadura, p. ej. `check_circle`).
1910
+ */
1911
+ interface StatusMeta {
1912
+ /** Rótulo humano del estado. `string` (el golden usa `ReactNode`; ver §1 de la cabecera). */
1913
+ label: string;
1914
+ /** Familia semántica del estado. */
1915
+ tone: StatusTone;
1916
+ /** Ligadura Material Symbols Rounded. */
1917
+ icon: string;
1918
+ }
1919
+ /**
1920
+ * Mapa de una entidad: `status → StatusMeta`. El **orden de declaración** de las
1921
+ * claves es el orden del ciclo de vida.
1922
+ */
1923
+ type StatusVocabMap = Readonly<Record<string, StatusMeta>>;
1924
+ /** Opción lista para dropdown / filtro / orden por estado. */
1925
+ interface StatusOption {
1926
+ /** Clave del estado (la que viaja al backend). */
1927
+ value: string;
1928
+ /** Rótulo humano. */
1929
+ label: string;
1930
+ /** Familia semántica. */
1931
+ tone: StatusTone;
1932
+ /** Ligadura Material Symbols Rounded. */
1933
+ icon: string;
1934
+ }
1935
+ /** Par de variables de color de un tono: texto/ícono y punto (marca). */
1936
+ interface StatusToneVars {
1937
+ /** Color del texto y del ícono. Siempre un `var(--ius-*)`. */
1938
+ fg: string;
1939
+ /** Color del punto/marca. Siempre un `var(--ius-*)`. */
1940
+ mark: string;
1941
+ }
1942
+ /**
1943
+ * Catálogo: entidad → `{ status → StatusMeta }`.
1944
+ *
1945
+ * El **orden de declaración** de cada estado es el orden del ciclo. El catálogo
1946
+ * es ABIERTO: se agregan entidades aquí sin tocar `StatusChip` (ver
1947
+ * `STATUS_VOCABS_PENDING`). Un módulo puede además extender en runtime pasando
1948
+ * `customMap` a `resolveStatus`.
1949
+ */
1950
+ declare const STATUS_VOCAB: {
1951
+ readonly actuacion: {
1952
+ readonly nueva: {
1953
+ readonly label: "Nueva";
1954
+ readonly tone: "info";
1955
+ readonly icon: "fiber_new";
1956
+ };
1957
+ readonly vista: {
1958
+ readonly label: "Vista";
1959
+ readonly tone: "neutral";
1960
+ readonly icon: "drafts";
1961
+ };
1962
+ readonly gestion: {
1963
+ readonly label: "En gestión";
1964
+ readonly tone: "primary";
1965
+ readonly icon: "pending_actions";
1966
+ };
1967
+ readonly cerrada: {
1968
+ readonly label: "Cerrada";
1969
+ readonly tone: "success";
1970
+ readonly icon: "check_circle";
1971
+ };
1972
+ };
1973
+ readonly gestion: {
1974
+ readonly por_hacer: {
1975
+ readonly label: "Por hacer";
1976
+ readonly tone: "info";
1977
+ readonly icon: "radio_button_unchecked";
1978
+ };
1979
+ readonly en_curso: {
1980
+ readonly label: "En curso";
1981
+ readonly tone: "primary";
1982
+ readonly icon: "pending";
1983
+ };
1984
+ readonly por_vencer: {
1985
+ readonly label: "Por vencer";
1986
+ readonly tone: "warning";
1987
+ readonly icon: "schedule";
1988
+ };
1989
+ readonly vencida: {
1990
+ readonly label: "Vencida";
1991
+ readonly tone: "danger";
1992
+ readonly icon: "event_busy";
1993
+ };
1994
+ readonly hecha: {
1995
+ readonly label: "Hecha";
1996
+ readonly tone: "success";
1997
+ readonly icon: "check_circle";
1998
+ };
1999
+ };
2000
+ };
2001
+ /** Entidades con vocabulario definido HOY en el catálogo. */
2002
+ type StatusVocabName = keyof typeof STATUS_VOCAB;
2003
+ /** Estados del vocabulario `actuacion` (validado). */
2004
+ type ActuacionStatus = keyof (typeof STATUS_VOCAB)['actuacion'];
2005
+ /** Estados del vocabulario `gestion` (propuesto — confirmar con backend). */
2006
+ type GestionStatus = keyof (typeof STATUS_VOCAB)['gestion'];
2007
+ /** Entidades con vocabulario definido. */
2008
+ declare const STATUS_VOCABS: readonly StatusVocabName[];
2009
+ /**
2010
+ * Entidades que TIENEN estado pero cuyo vocabulario aún NO está en el catálogo:
2011
+ * sus estados/tonos son decisión humana pendiente con el backend (§6 del
2012
+ * golden). Se listan para documentar el hueco, no para inventarlo. Al validarse
2013
+ * se agregan a `STATUS_VOCAB` y se quitan de aquí; `StatusChip` no se toca.
2014
+ */
2015
+ declare const STATUS_VOCABS_PENDING: readonly string[];
2016
+ /**
2017
+ * Estados (claves) de una entidad, en orden de ciclo.
2018
+ * `[]` si la entidad no existe.
2019
+ */
2020
+ declare function statusOrder(vocab: string): string[];
2021
+ /**
2022
+ * Mapa `status → StatusMeta` de una entidad.
2023
+ * `null` si la entidad no está en el catálogo (retorno nullable, a propósito).
2024
+ */
2025
+ declare function statusVocab(vocab: string): StatusVocabMap | null;
2026
+ /**
2027
+ * Resuelve un estado a `StatusMeta` en este orden:
2028
+ * 1. `customMap[status]` — extensión en runtime del módulo consumidor;
2029
+ * 2. catálogo central de la entidad;
2030
+ * 3. `null` — entidad o estado desconocido: el consumidor decide (el átomo
2031
+ * `StatusChip` cae a `neutral` con el `status` crudo como rótulo).
2032
+ *
2033
+ * @param vocab Entidad (p. ej. `'actuacion'`).
2034
+ * @param status Clave del estado YA resuelta por el consumidor (la urgencia de
2035
+ * una tarea se deriva antes de llamar aquí).
2036
+ * @param customMap Vocabulario extra del módulo; gana sobre el catálogo.
2037
+ */
2038
+ declare function resolveStatus(vocab: string, status: string | null | undefined, customMap?: Readonly<Record<string, StatusMeta>>): StatusMeta | null;
2039
+ /**
2040
+ * Opciones listas para dropdown / filtro / orden de una entidad, en orden de
2041
+ * ciclo. `[]` si la entidad no existe.
2042
+ */
2043
+ declare function statusOptions(vocab: string): StatusOption[];
2044
+ /**
2045
+ * Tono semántico → `{ fg, mark }` (strings `var(--ius-*)`).
2046
+ * Único punto del sistema que conoce las vars de color del estado.
2047
+ * Un tono desconocido, `null` o `undefined` cae a `neutral` (nunca falla).
2048
+ */
2049
+ declare function statusToneVars(tone: StatusTone | null | undefined): StatusToneVars;
2050
+
2051
+ /** Tono semántico del estado. */
2052
+ type IusListCardTone = 'neutral' | 'success' | 'warning' | 'danger' | 'info' | 'primary';
2053
+ /** Densidad de la fila. */
2054
+ type IusListCardSize = 'small' | 'medium' | 'large';
2055
+ /** Columna de metadatos (label arriba / valor abajo). */
2056
+ interface IusListCardField {
2057
+ /** Etiqueta superior (opcional; omítela para un valor suelto como el monto). */
2058
+ label?: string;
2059
+ /** Valor mostrado debajo de la etiqueta. */
2060
+ value: string;
2061
+ /** Ícono Material Symbols antes del valor (p.ej. correo, teléfono). */
2062
+ icon?: string;
2063
+ /** Resalta el valor (display, semibold, color primario) — p.ej. el monto. */
2064
+ emphasis?: boolean;
2065
+ /** Alinea el campo a la derecha. */
2066
+ align?: 'start' | 'end';
2067
+ /**
2068
+ * Ancho fijo de ESTA columna (px o CSS). Para que toda la lista comparta la
2069
+ * misma rejilla, el ListView emitirá `--_lc-col-N` (cuando exista); un
2070
+ * `width` aquí gana sobre la rejilla.
2071
+ */
1920
2072
  width?: number | string;
1921
- /** `flex` (`'1 1 auto'`, `'0 0 60px'`, …) si necesitas más control que `width`. */
1922
- flex?: string | number;
1923
- /** Largo máximo de caracteres (habilita auto-avance). */
1924
- maxLength?: number;
1925
- /** Etiqueta accesible del segmento (si el placeholder no basta). */
2073
+ /** Oculta el campo cuando la fila está en hover (para dar lugar a las acciones). */
2074
+ hideOnHover?: boolean;
2075
+ key?: string | number;
2076
+ }
2077
+ /** Estado al final de la fila delega en `ius-status-chip`. */
2078
+ interface IusListCardStatus {
2079
+ label?: string;
2080
+ /** Tono semántico (escape hatch directo cuando no hay vocab). Default `'neutral'`. */
2081
+ tone?: IusListCardTone;
2082
+ /** `true` = ícono del estado (según catálogo) en vez del punto; string = ícono propio. */
2083
+ icon?: boolean | string;
2084
+ /** Vocabulario del catálogo de estados a resolver (p.ej. `'actuacion'`, `'gestion'`). */
2085
+ vocab?: string;
2086
+ /** Clave de estado dentro del `vocab` (p.ej. `'gestion'`, `'cerrada'`). */
2087
+ status?: string;
2088
+ /** Extensión de vocabulario en runtime (espejo de `customMap` del golden). */
2089
+ customMap?: Readonly<Record<string, StatusMeta>>;
2090
+ /** Oculta el estado en hover (p.ej. factura: "No pagada" → acciones). */
2091
+ hideOnHover?: boolean;
2092
+ }
2093
+ /**
2094
+ * Marcador de acceso PERSISTENTE en la fila (NO se oculta en hover), a
2095
+ * diferencia de `actions`. Para accesos a documentos/recursos siempre visibles:
2096
+ * p.ej. escudo = documento del estado, documento = providencia.
2097
+ */
2098
+ interface IusListCardMarker {
2099
+ /** Ícono Material Symbols. */
2100
+ icon: string;
2101
+ /** Etiqueta accesible / tooltip. */
2102
+ label?: string;
1926
2103
  ariaLabel?: string;
1927
- /** Callback opcional al teclear este segmento (además del `valueChange` del conjunto). */
1928
- onChange?: (value: string, event: Event) => void;
2104
+ tooltip?: string;
2105
+ /** Variante del IconButton. Default `'tertiary'`. */
2106
+ variant?: IusIconButtonVariant;
2107
+ onClick?: (event: MouseEvent) => void;
2108
+ key?: string | number;
2109
+ }
2110
+ /** Acción utilitaria revelada en hover (IconButton). */
2111
+ interface IusListCardAction {
2112
+ /** Ícono Material Symbols. */
2113
+ icon: string;
2114
+ /** Etiqueta accesible / tooltip. */
2115
+ label?: string;
2116
+ ariaLabel?: string;
2117
+ /** Tooltip en hover (si no, usa `label`). */
2118
+ tooltip?: string;
2119
+ onClick?: (event: MouseEvent) => void;
2120
+ key?: string | number;
2121
+ }
2122
+ /** Opción del menú de overflow (⋮). Espejo de `IusDropdownItem`/`IusMenuOption`. */
2123
+ interface IusListCardMenuItem {
2124
+ key?: string | number;
2125
+ icon?: string;
2126
+ label?: string;
2127
+ /** Agrupa: al cambiar de `group` inserta un divisor. */
2128
+ group?: string | number;
2129
+ /** Inserta un divisor en su lugar. */
2130
+ separator?: boolean;
2131
+ danger?: boolean;
2132
+ disabled?: boolean;
2133
+ onClick?: (event: MouseEvent) => void;
2134
+ }
2135
+ /** Tag inline en la fila de título (subconjunto de props de `ius-tag`). */
2136
+ interface IusListCardTag {
2137
+ label?: string;
2138
+ tone?: IusTagTone;
2139
+ variant?: IusTagVariant;
2140
+ /** Ícono Material Symbols como prefijo. */
2141
+ icon?: string;
2142
+ /** Punto de acento (si se omite, el rol `status` ya lo activa). */
2143
+ dot?: boolean;
2144
+ key?: string | number;
2145
+ }
2146
+ /** Marca el bloque inicial proyectado (típicamente `<ius-avatar iusListCardLeading>`). */
2147
+ declare class IusListCardLeadingDirective {
2148
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<IusListCardLeadingDirective, never>;
2149
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<IusListCardLeadingDirective, "[iusListCardLeading]", never, {}, {}, never, never, true, never>;
2150
+ }
2151
+ /** Overline rico proyectado (alternativa al input `overline`). */
2152
+ declare class IusListCardOverlineDirective {
2153
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<IusListCardOverlineDirective, never>;
2154
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<IusListCardOverlineDirective, "[iusListCardOverline]", never, {}, {}, never, never, true, never>;
2155
+ }
2156
+ /** Título rico proyectado (alternativa al input `title`). */
2157
+ declare class IusListCardTitleDirective {
2158
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<IusListCardTitleDirective, never>;
2159
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<IusListCardTitleDirective, "[iusListCardTitle]", never, {}, {}, never, never, true, never>;
2160
+ }
2161
+ /** Subtítulo rico proyectado — admite markup (`<b>` resalta cifras). */
2162
+ declare class IusListCardSubtitleDirective {
2163
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<IusListCardSubtitleDirective, never>;
2164
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<IusListCardSubtitleDirective, "[iusListCardSubtitle]", never, {}, {}, never, never, true, never>;
2165
+ }
2166
+ /** Párrafo largo proyectado — ocupa toda la fila (empuja `fields` a 2ª línea). */
2167
+ declare class IusListCardParagraphDirective {
2168
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<IusListCardParagraphDirective, never>;
2169
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<IusListCardParagraphDirective, "[iusListCardParagraph]", never, {}, {}, never, never, true, never>;
1929
2170
  }
1930
2171
  /**
1931
- * MultiTextField — Ius Design v2 (familia inputs).
2172
+ * ListCard — Ius Design v2 (familia data-display).
1932
2173
  *
1933
- * Variación de **TextField** que acopla varios `<input>` dentro de una misma
1934
- * caja separados por divisores verticales — para datos compuestos (tarjeta
1935
- * MM | AAAA + CVV, teléfono con prefijo, NIT + DV…). Reusa el wrapper `.ius-tf`
1936
- * (label con required + iconHelp, 5 estados, size, helpText/errorText) y un
1937
- * **único** botón de limpiar que vacía todos los segmentos. Fuente de verdad:
1938
- * `MultiTextField.jsx` + `MultiTextField.d.ts` (delta sobre `TextField.ng-spec`).
2174
+ * Fila-tarjeta horizontal y flexible para listas cuyos ítems navegan a un
2175
+ * detalle. Layout por slots:
2176
+ * `[leading]·[overline·título·subtítulo·paragraph]·[fields]·[status]·[markers]·[actions+⋮(hover)]·[chevron]`.
2177
+ * Fuente de verdad: `ListCard.jsx` + `ListCard.d.ts` + `ListCard.ng-spec.md`.
2178
+ * Card rica: resuelve su propia composición, NO se monta sobre `Card`.
1939
2179
  *
1940
- * `ControlValueAccessor` **a nivel de conjunto**: el valor es el array de
1941
- * valores por segmento (`string[]`); también se emite en `valueChange`. Cada
1942
- * slot puede además traer su propio `onChange`. Auto-avance al llenar el
1943
- * `maxLength` y Backspace en segmento vacío retrocede.
2180
+ * Compone `ius-avatar` (leading, proyectado), `ius-tag` (tags inline) y
2181
+ * `ius-icon-button` (acciones/markers). Host = la tarjeta (patrón Tag): con
2182
+ * `(clicked)` enlazado se vuelve navegable (role=button, tabindex, Enter en
2183
+ * keydown + Espacio en keyup) y muestra chevron por defecto.
1944
2184
  *
1945
- * Nota: las clases `.ius-tf__*` (label/help/hint/field/clear) se replican en el
1946
- * SCSS porque bajo `ViewEncapsulation.Emulated` las de TextField no alcanzan a
1947
- * otro componente. `showIconHelp` usa `title` nativo como respaldo hasta que
1948
- * exista `ius-popover`. `[data-force]` congela un estado visual en demos.
2185
+ * `status` delega en `ius-status-chip` (vocab+status contra el catálogo, o
2186
+ * tone/label/icon directo) y `menu` (⋮) compone `ius-dropdown` (trigger
2187
+ * IconButton `more_vert` proyectado, hover-only con `data-menu-open` mientras
2188
+ * el panel está abierto).
2189
+ *
2190
+ * No usar para el árbol denso de navegación (EntityRow) ni como ítem de menú
2191
+ * (MenuItem). Primera carga → envolver en Skeleton (patrón externo).
1949
2192
  */
1950
- declare class MultiTextFieldComponent implements ControlValueAccessor {
1951
- protected readonly slotsState: _angular_core.WritableSignal<IusMultiTextFieldSlot[]>;
1952
- /** Segmentos; cada uno un `<input>` separado por un divisor vertical. */
1953
- set slots(value: IusMultiTextFieldSlot[]);
1954
- get slots(): IusMultiTextFieldSlot[];
1955
- /** Label común a todos los segmentos. */
1956
- label?: string;
1957
- /** Indicador de obligatorio (•). */
1958
- required: boolean;
1959
- /** Ícono de ayuda `?` junto al label (respaldo: `title` nativo). */
1960
- showIconHelp: boolean;
1961
- /** Título del contenido de ayuda. */
1962
- iconHelpTitle?: string;
1963
- /** Cuerpo del contenido de ayuda. */
1964
- iconHelpContent?: string;
1965
- /** Línea de ayuda bajo el campo. */
1966
- helpText?: string;
1967
- /** Reemplaza `helpText` cuando `error` es `true`. */
1968
- errorText?: string;
1969
- /** Mostrar/ocultar la línea de ayuda. */
1970
- showHelpText: boolean;
1971
- /** Forzar visibilidad del botón limpiar (por defecto: auto con valor). */
1972
- showClear?: boolean;
1973
- private readonly errorState;
1974
- /** Estado de error global. */
1975
- set error(value: boolean);
1976
- get error(): boolean;
1977
- private readonly disabledState;
1978
- /** Estado deshabilitado global. */
1979
- set disabled(value: boolean);
1980
- get disabled(): boolean;
1981
- protected readonly sizeState: _angular_core.WritableSignal<IusMultiTextFieldSize>;
1982
- set size(value: IusMultiTextFieldSize);
1983
- get size(): IusMultiTextFieldSize;
1984
- protected readonly stateState: _angular_core.WritableSignal<IusMultiTextFieldState | undefined>;
1985
- /** Forzar visualmente un estado completo (solo demos). */
1986
- set state(value: IusMultiTextFieldState | undefined);
1987
- get state(): IusMultiTextFieldState | undefined;
1988
- /** `id` base del campo (los segmentos serán `id-0`, `id-1`, …). */
1989
- id?: string;
1990
- /** Valores del conjunto (array por segmento). */
1991
- readonly valueChange: EventEmitter<string[]>;
1992
- /** Al pulsar el botón de limpiar (después de vaciar). */
1993
- readonly cleared: EventEmitter<void>;
1994
- protected readonly values: _angular_core.WritableSignal<string[]>;
1995
- protected readonly focused: _angular_core.WritableSignal<boolean>;
1996
- /** Tras limpiar en un estado demo, suprime el "valor" simulado. */
1997
- private readonly suppressDemoValue;
1998
- /** Último valor escrito por el CVA (por si llega antes que los slots). */
1999
- private readonly pendingValue;
2000
- private readonly baseIdState;
2001
- private readonly slotInputs;
2002
- private onChange;
2003
- private onTouched;
2004
- protected readonly isDisabled: _angular_core.Signal<boolean>;
2005
- protected readonly isError: _angular_core.Signal<boolean>;
2006
- protected readonly isFocused: _angular_core.Signal<boolean>;
2007
- protected readonly hasAnyValue: _angular_core.Signal<boolean>;
2008
- protected readonly demoHasValue: _angular_core.Signal<boolean>;
2009
- protected get baseId(): string;
2010
- protected get helpId(): string;
2011
- protected get hint(): string | undefined;
2012
- protected get showHint(): boolean;
2013
- protected get helpIconTitle(): string | undefined;
2014
- /** El botón de limpiar está activo (visible y operable). */
2015
- protected get clearActive(): boolean;
2016
- /** Se reserva el hueco del clear (visibility) para no desplazar los segmentos. */
2017
- protected get clearReserved(): boolean;
2018
- protected currentValue(i: number): string;
2019
- /** flex del segmento: width > flex > (maxLength → base auto) > CSS (1 1 auto). */
2020
- protected slotFlex(slot: IusMultiTextFieldSlot): string | null;
2021
- /** width del segmento: solo cuando se deriva del maxLength. */
2022
- protected slotWidth(slot: IusMultiTextFieldSlot): string | null;
2023
- writeValue(value: string[] | null): void;
2024
- registerOnChange(fn: (value: string[]) => void): void;
2025
- registerOnTouched(fn: () => void): void;
2026
- setDisabledState(isDisabled: boolean): void;
2027
- private syncValues;
2028
- private commit;
2029
- private focusSlot;
2030
- protected onSlotInput(i: number, event: Event): void;
2031
- protected onSlotKeyDown(i: number, event: KeyboardEvent): void;
2032
- protected onFocus(): void;
2033
- protected onBlur(): void;
2034
- protected clear(): void;
2035
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<MultiTextFieldComponent, never>;
2036
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<MultiTextFieldComponent, "ius-multi-text-field", never, { "slots": { "alias": "slots"; "required": false; }; "label": { "alias": "label"; "required": false; }; "required": { "alias": "required"; "required": false; }; "showIconHelp": { "alias": "showIconHelp"; "required": false; }; "iconHelpTitle": { "alias": "iconHelpTitle"; "required": false; }; "iconHelpContent": { "alias": "iconHelpContent"; "required": false; }; "helpText": { "alias": "helpText"; "required": false; }; "errorText": { "alias": "errorText"; "required": false; }; "showHelpText": { "alias": "showHelpText"; "required": false; }; "showClear": { "alias": "showClear"; "required": false; }; "error": { "alias": "error"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "size": { "alias": "size"; "required": false; }; "state": { "alias": "state"; "required": false; }; "id": { "alias": "id"; "required": false; }; }, { "valueChange": "valueChange"; "cleared": "cleared"; }, never, never, true, never>;
2037
- static ngAcceptInputType_required: unknown;
2038
- static ngAcceptInputType_showIconHelp: unknown;
2039
- static ngAcceptInputType_showHelpText: unknown;
2040
- static ngAcceptInputType_error: unknown;
2041
- static ngAcceptInputType_disabled: unknown;
2193
+ declare class ListCardComponent implements AfterViewInit, OnChanges, OnDestroy {
2194
+ private readonly el;
2195
+ /** Etiqueta pequeña sobre el título (fecha, "Activo", categoría…). */
2196
+ overline?: string;
2197
+ /** Ícono Material Symbols antes del overline. */
2198
+ overlineIcon?: string;
2199
+ /** Título en negrita (radicado, nombre, "Visa ****0123", plan…). */
2200
+ title?: string;
2201
+ /** Ícono Material Symbols antes del título. */
2202
+ titleIcon?: string;
2203
+ /** Tags inline junto al título (se renderizan con `ius-tag` size small). */
2204
+ tags: IusListCardTag[];
2205
+ /** Subtítulo simple; para markup rico proyectar `[iusListCardSubtitle]`. */
2206
+ subtitle?: string;
2207
+ /** Ícono Material Symbols antes del subtítulo. */
2208
+ subtitleIcon?: string;
2209
+ /**
2210
+ * Párrafo de texto largo (descripción, nota). Tiene prioridad de ancho: ocupa
2211
+ * toda la fila, de modo que un párrafo denso empuja `fields` a la 2ª línea.
2212
+ * Para markup rico proyectar `[iusListCardParagraph]`.
2213
+ */
2214
+ paragraph?: string;
2215
+ /** Columnas de metadatos (label arriba / valor abajo). */
2216
+ fields: IusListCardField[];
2217
+ /** Estado al final: `{vocab,status}` contra el catálogo o `{tone,label,icon}` directo. */
2218
+ status?: IusListCardStatus;
2219
+ /** Acciones reveladas en hover (IconButton por defecto). */
2220
+ actions: IusListCardAction[];
2221
+ /**
2222
+ * Opciones de uso frecuente en un menú de overflow (⋮, `more_vert`).
2223
+ * Hover-only; se mantiene visible mientras su menú está abierto.
2224
+ */
2225
+ menu: IusListCardMenuItem[];
2226
+ /** Accesos PERSISTENTES (no hover): escudo/documento, etc. (IconButton). */
2227
+ markers: IusListCardMarker[];
2228
+ /** Muestra el chevron de navegación. Default: `true` si hay `(clicked)`. */
2229
+ chevron?: boolean;
2230
+ /** No leído: punto navy al inicio + título en negrita. */
2231
+ unread: boolean;
2232
+ /** Densidad. `medium` (default) hereda `--ius-density` del contexto. */
2233
+ size: IusListCardSize;
2234
+ /** Render personalizado de cada acción (original `renderAction`). */
2235
+ renderAction?: TemplateRef<{
2236
+ $implicit: IusListCardAction;
2237
+ index: number;
2238
+ }>;
2239
+ ariaLabel?: string;
2240
+ /** Click de la fila — navega a detalle (original `onClick`). */
2241
+ readonly clicked: EventEmitter<MouseEvent>;
2242
+ private readonly leadingRef;
2243
+ private readonly overlineRef;
2244
+ private readonly titleRef;
2245
+ private readonly subtitleRef;
2246
+ private readonly paragraphRef;
2247
+ protected get hasLeading(): boolean;
2248
+ protected get hasOverline(): boolean;
2249
+ protected get hasTitleRow(): boolean;
2250
+ protected get titleRefPresent(): boolean;
2251
+ protected get hasSubtitle(): boolean;
2252
+ protected get hasParagraph(): boolean;
2253
+ /** Navegable cuando el consumidor enlazó `(clicked)` (espejo de `onClick`). */
2254
+ protected get clickable(): boolean;
2255
+ /** Chevron: valor explícito o sigue a `clickable`. */
2256
+ protected get showChevron(): boolean;
2257
+ protected get hasTrail(): boolean;
2258
+ protected get statusChipSize(): 'small' | 'medium';
2259
+ /** Refleja la apertura del Dropdown en `data-menu-open` (hover-reveal persistente). */
2260
+ protected readonly menuOpen: _angular_core.WritableSignal<boolean>;
2261
+ protected onMenuOpenChange(open: boolean): void;
2262
+ protected onAction(action: IusListCardAction, event: MouseEvent): void;
2263
+ protected onMarker(marker: IusListCardMarker, event: MouseEvent): void;
2264
+ protected fieldWidth(field: IusListCardField): string | null;
2265
+ protected onHostClick(event: MouseEvent): void;
2266
+ /** Enter en keydown y Espacio en keyup activan SOLO con el foco en la fila. */
2267
+ protected onKeyActivate(event: Event): void;
2268
+ /** Espacio en keydown: solo evita el scroll; la activación ocurre en keyup. */
2269
+ protected onSpaceDown(event: Event): void;
2270
+ /** `true` cuando el bloque de `fields` cayó a la 2ª línea → divisor a lo ancho. */
2271
+ protected readonly wrapped: _angular_core.WritableSignal<boolean>;
2272
+ private resizeObserver?;
2273
+ private rafId;
2274
+ private viewReady;
2275
+ ngAfterViewInit(): void;
2276
+ ngOnChanges(): void;
2277
+ ngOnDestroy(): void;
2278
+ private scheduleMeasure;
2279
+ private measureWrap;
2280
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ListCardComponent, never>;
2281
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ListCardComponent, "ius-list-card", never, { "overline": { "alias": "overline"; "required": false; }; "overlineIcon": { "alias": "overlineIcon"; "required": false; }; "title": { "alias": "title"; "required": false; }; "titleIcon": { "alias": "titleIcon"; "required": false; }; "tags": { "alias": "tags"; "required": false; }; "subtitle": { "alias": "subtitle"; "required": false; }; "subtitleIcon": { "alias": "subtitleIcon"; "required": false; }; "paragraph": { "alias": "paragraph"; "required": false; }; "fields": { "alias": "fields"; "required": false; }; "status": { "alias": "status"; "required": false; }; "actions": { "alias": "actions"; "required": false; }; "menu": { "alias": "menu"; "required": false; }; "markers": { "alias": "markers"; "required": false; }; "chevron": { "alias": "chevron"; "required": false; }; "unread": { "alias": "unread"; "required": false; }; "size": { "alias": "size"; "required": false; }; "renderAction": { "alias": "renderAction"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; }, { "clicked": "clicked"; }, ["leadingRef", "overlineRef", "titleRef", "subtitleRef", "paragraphRef"], ["[iusListCardLeading]", "[iusListCardOverline]", "[iusListCardTitle]", "[iusListCardSubtitle]", "[iusListCardParagraph]"], true, never>;
2282
+ static ngAcceptInputType_unread: unknown;
2042
2283
  }
2043
2284
 
2044
- /** Ancho máximo del diálogo — small 380 · medium 520 (default) · large 680px. */
2045
- type IusModalSize = 'small' | 'medium' | 'large';
2046
- /** Tono del círculo del ícono del header. */
2047
- type IusModalIconTone = 'info' | 'success' | 'warning' | 'danger' | 'primary' | 'neutral';
2048
- /** Motivo del cierre emitido por `closed`. */
2049
- type IusModalCloseReason = 'close' | 'esc' | 'scrim' | 'secondary';
2050
2285
  /**
2051
- * Marca el footer libre proyectado. Tiene prioridad sobre el footer de
2052
- * conveniencia (`primaryLabel`/`secondaryLabel`):
2286
+ * Opción de menú tipo **compartido** por Menu, Dropdown y ContextMenu.
2053
2287
  *
2054
- * ```html
2055
- * <ius-modal ...>
2056
- * …cuerpo…
2057
- * <div iusModalFooter>…acciones a medida…</div>
2058
- * </ius-modal>
2059
- * ```
2288
+ * `trailing` acepta texto plano o un `TemplateRef` (equivalente Angular del
2289
+ * slot/ReactNode del golden, según la regla de port `render` → `TemplateRef`).
2060
2290
  */
2061
- declare class IusModalFooterDirective {
2062
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<IusModalFooterDirective, never>;
2063
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<IusModalFooterDirective, "[iusModalFooter]", never, {}, {}, never, never, true, never>;
2291
+ interface IusMenuOption {
2292
+ /** Valor lógico — el que viaja en `valueChange` y marca el check. */
2293
+ value?: string | number;
2294
+ /** Clave de `@for`; si falta se usa `value` y, en último caso, el índice. */
2295
+ key?: string | number;
2296
+ /** Ícono Material Symbols a la izquierda. */
2297
+ icon?: string;
2298
+ /** Texto de la fila. */
2299
+ label?: string;
2300
+ /** Contenido al final de la fila (atajo, valor, chevron). */
2301
+ trailing?: string | TemplateRef<unknown>;
2302
+ /** Al cambiar de grupo se inserta un divisor. */
2303
+ group?: string | number;
2304
+ /** Divisor explícito (la fila no se renderiza). */
2305
+ separator?: boolean;
2306
+ /** Acción destructiva (rojo). */
2307
+ danger?: boolean;
2308
+ /** Fila inerte. */
2309
+ disabled?: boolean;
2310
+ /** Acción propia de la opción. */
2311
+ onClick?: (event: MouseEvent) => void;
2312
+ }
2313
+ /** Fila resuelta o divisor — lo que realmente pinta la plantilla. */
2314
+ interface IusMenuRow {
2315
+ kind: 'separator' | 'item';
2316
+ key: string;
2317
+ item?: IusMenuOption;
2318
+ selected?: boolean;
2064
2319
  }
2065
2320
  /**
2066
- * Modal — Ius Design v2.
2067
- *
2068
- * Diálogo centrado sobre un scrim que exige atención/decisión (confirmaciones,
2069
- * avisos accionables) sin abandonar la pantalla. Se monta vía **CDK Overlay** en
2070
- * `document.body` (no acepta `container`): portal + **scroll-lock** del fondo +
2071
- * **focus-trap** dentro (`cdkTrapFocus`). `Esc`/scrim cierran (configurable).
2072
- * `role="dialog"` `aria-modal="true"`.
2321
+ * Menu — Ius Design v2 (familia overlays). **SUPERFICIE compartida de menú.**
2073
2322
  *
2074
- * Compone `ius-button` (footer) e `ius-icon-button` (cerrar) no introduce
2075
- * controles propios. Para tareas con varios campos usar Drawer; para avisos no
2076
- * bloqueantes usar Alert/Toast.
2323
+ * Lista de **MenuItem** con encabezado opcional, divisores, grupos, ítems
2324
+ * peligrosos/deshabilitados y modo selección única (check a la derecha). Es el
2325
+ * cuerpo que **Dropdown** ancla a un disparador y **ContextMenu** ancla al
2326
+ * cursor: por sí sola **no se posiciona ni gestiona apertura**.
2077
2327
  *
2328
+ * Fuente de verdad: `Menu.jsx` + `Menu.d.ts` + `Menu.ng-spec.md`. Las filas se
2329
+ * renderizan con `size="small"` y `variant="menu"`, como el golden.
2078
2330
  */
2079
- declare class ModalComponent implements AfterViewInit, OnDestroy {
2080
- private readonly overlay;
2081
- private readonly viewContainerRef;
2082
- /** Template con scrim + diálogo; se portalea al overlay al abrir. */
2083
- private tpl;
2084
- /** Footer libre proyectado (`[iusModalFooter]`). Si existe, gana al de conveniencia. */
2085
- protected customFooter?: IusModalFooterDirective;
2086
- private _open;
2087
- /** Apertura controlada. */
2088
- set open(value: boolean);
2089
- get open(): boolean;
2090
- /** Ancho máximo (380·520·680; ≤480px full-width). */
2091
- size: IusModalSize;
2092
- /** Título del header. */
2093
- title?: string;
2094
- /** Descripción breve bajo el título. */
2095
- description?: string;
2096
- /** Ligadura Material Symbols al inicio del header (círculo suave del tono). */
2097
- icon?: string;
2098
- /** Tono del círculo del ícono. */
2099
- iconTone: IusModalIconTone;
2100
- /** Botón de cerrar (×) en el header. */
2101
- showClose: boolean;
2102
- /** Texto del botón primario de conveniencia. */
2103
- primaryLabel?: string;
2104
- /** Loading del primario. */
2105
- primaryLoading: boolean;
2106
- /** Deshabilita el primario. */
2107
- primaryDisabled: boolean;
2108
- /** Acción destructiva: el primario de conveniencia usa `variant="danger"` (rojo). */
2109
- destructive: boolean;
2110
- /** Texto del botón secundario. `null` lo oculta. */
2111
- secondaryLabel: string | null;
2112
- /** Divisores entre header/body/footer. */
2113
- dividers: boolean;
2114
- /** Cerrar al hacer clic en el scrim. */
2115
- closeOnScrim: boolean;
2116
- /** Cerrar con Escape. */
2117
- closeOnEsc: boolean;
2118
- /** z-index del scrim. */
2119
- zIndex: number;
2120
- /** Etiqueta accesible si no hay `title`. */
2121
- ariaLabel?: string;
2122
- /** Cierre con el motivo (`onClose` del golden). */
2123
- readonly closed: EventEmitter<IusModalCloseReason>;
2124
- /** Clic en el primario de conveniencia (`onPrimary`). */
2125
- readonly primary: EventEmitter<MouseEvent>;
2126
- /** Clic en el secundario de conveniencia (`onSecondary`). Si nadie lo escucha, cierra. */
2127
- readonly secondary: EventEmitter<void>;
2128
- private overlayRef;
2129
- private keydownSub;
2130
- private viewReady;
2131
- protected get hasHead(): boolean;
2132
- protected get iconColors(): {
2133
- bg: string;
2134
- fg: string;
2135
- };
2136
- protected get showSecondary(): boolean;
2137
- /** Footer de conveniencia sólo si no hay footer libre y hay algo que mostrar. */
2138
- protected get hasConvenienceFooter(): boolean;
2139
- ngAfterViewInit(): void;
2140
- ngOnDestroy(): void;
2141
- private sync;
2142
- private attach;
2143
- private detach;
2144
- protected onScrimMouseDown(event: MouseEvent): void;
2145
- protected onCloseClick(): void;
2146
- protected onPrimary(event: MouseEvent): void;
2147
- protected onSecondary(): void;
2148
- private emitClose;
2149
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<ModalComponent, never>;
2150
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ModalComponent, "ius-modal", never, { "open": { "alias": "open"; "required": false; }; "size": { "alias": "size"; "required": false; }; "title": { "alias": "title"; "required": false; }; "description": { "alias": "description"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "iconTone": { "alias": "iconTone"; "required": false; }; "showClose": { "alias": "showClose"; "required": false; }; "primaryLabel": { "alias": "primaryLabel"; "required": false; }; "primaryLoading": { "alias": "primaryLoading"; "required": false; }; "primaryDisabled": { "alias": "primaryDisabled"; "required": false; }; "destructive": { "alias": "destructive"; "required": false; }; "secondaryLabel": { "alias": "secondaryLabel"; "required": false; }; "dividers": { "alias": "dividers"; "required": false; }; "closeOnScrim": { "alias": "closeOnScrim"; "required": false; }; "closeOnEsc": { "alias": "closeOnEsc"; "required": false; }; "zIndex": { "alias": "zIndex"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; }, { "closed": "closed"; "primary": "primary"; "secondary": "secondary"; }, ["customFooter"], ["*", "[iusModalFooter]"], true, never>;
2151
- static ngAcceptInputType_open: unknown;
2152
- static ngAcceptInputType_showClose: unknown;
2153
- static ngAcceptInputType_primaryLoading: unknown;
2154
- static ngAcceptInputType_primaryDisabled: unknown;
2155
- static ngAcceptInputType_destructive: unknown;
2156
- static ngAcceptInputType_dividers: unknown;
2157
- static ngAcceptInputType_closeOnScrim: unknown;
2158
- static ngAcceptInputType_closeOnEsc: unknown;
2159
- static ngAcceptInputType_zIndex: unknown;
2160
- }
2161
-
2162
- /**
2163
- * Rol tipográfico → clase de escala (`typography.css`). `body` es alias de
2164
- * `body-base`. Mapa exacto en VARIANT_CLASS/DEFAULT_TAG.
2165
- */
2166
- type IusTextVariant = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'body-lg' | 'emphasis-lg' | 'body-base' | 'emphasis-base' | 'body' | 'caption' | 'body-sm' | 'label' | 'overline';
2167
- /**
2168
- * Alias de color de texto → `--ius-text-*`. `danger`→`--ius-text-error`,
2169
- * `inverse`→`--ius-text-on-primary`.
2170
- */
2171
- type IusTextColor = 'primary' | 'secondary' | 'tertiary' | 'disabled' | 'inverse' | 'success' | 'danger' | 'warning' | 'info' | 'link';
2172
- type IusTextWeight = 'regular' | 'medium' | 'bold';
2173
- type IusTextAlign = 'left' | 'center' | 'right' | 'justify';
2174
- /**
2175
- * Tag polimórfico soportado. Adaptación Angular del `as` (React acepta cualquier
2176
- * `keyof JSX.IntrinsicElements`; aquí un set finito para elegir el template, tal
2177
- * como recomienda la ng-spec §3). Cubre los tags del sistema + inline comunes.
2178
- */
2179
- type IusTextTag = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'p' | 'span' | 'label' | 'div' | 'strong' | 'em' | 'small';
2180
- /**
2181
- * Text — Ius Design v2. Primitiva tipográfica (display-only, sin estado).
2182
- *
2183
- * Wrapper delgado sobre la escala de `typography.css`: mapea `variant` → clase y
2184
- * expone `color / weight / as / align / italic / truncate / tabularNums` con
2185
- * tokens `--ius-*` (cero valores crudos). Contrato único para todo texto plano.
2186
- *
2187
- * El host `ius-text` usa `display: contents`, así que no genera caja propia: el
2188
- * tag renderizado (h1…h5 / p / span / label…) se comporta como hijo directo.
2189
- *
2190
- * Port completo: los 14 variants mapean a su clase real de `typography.css`
2191
- * (incl. `.ius-label`/`.ius-overline`) y los 10 colores a su token `--ius-text-*`
2192
- * (incl. `--ius-text-warning`/`--ius-text-info`), sincronizados desde Claude Design.
2193
- *
2194
- * Fuente de verdad: `components/data-display/Text/Text.jsx` + `Text.d.ts`
2195
- * (contrato en `Text.ng-spec.md` §4).
2196
- */
2197
- declare class TextComponent {
2198
- /** Rol tipográfico → clase de escala + tag por defecto. */
2199
- variant: IusTextVariant;
2200
- /** Color semántico (alias → `--ius-text-*`). Sin valor: hereda el de la clase. */
2201
- color?: IusTextColor;
2202
- /** Peso: override del peso por defecto del variant → `--ius-fw-*`. */
2203
- weight?: IusTextWeight;
2204
- /** Tag polimórfico: override del tag semántico por defecto del variant. */
2205
- as?: IusTextTag;
2206
- /** Alineación (`text-align`). */
2207
- align?: IusTextAlign;
2208
- /** Itálico (clase modificadora en body-base/caption/body-sm; inline en el resto). */
2209
- italic: boolean;
2210
- /** Trunca a una línea con elipsis. */
2211
- truncate: boolean;
2212
- /** Números tabulares (montos/radicados es-CO). */
2213
- tabularNums: boolean;
2214
- /** `for` del `<label>` (sólo aplica cuando el tag renderizado es `label`). */
2215
- for?: string;
2216
- /** Tag efectivo (as > default del variant > span). */
2217
- protected get tag(): IusTextTag;
2218
- private get variantClass();
2219
- /** `ius-text` base + clase de escala (+ modificador itálico si aplica). */
2220
- protected get klass(): string;
2221
- /** Overrides por token (color/weight/align/italic-inline/tabular/truncate). */
2222
- protected get styleObject(): Record<string, string>;
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>;
2225
- static ngAcceptInputType_italic: unknown;
2226
- static ngAcceptInputType_truncate: unknown;
2227
- static ngAcceptInputType_tabularNums: unknown;
2331
+ declare class MenuComponent {
2332
+ /** Opciones del menú (tipo compartido con Dropdown/ContextMenu). */
2333
+ readonly items: _angular_core.InputSignal<readonly IusMenuOption[]>;
2334
+ /** Selección única: marca `value` con un check. */
2335
+ readonly selectable: _angular_core.InputSignalWithTransform<boolean, unknown>;
2336
+ /** Valor elegido en modo `selectable`. */
2337
+ readonly value: _angular_core.InputSignal<string | number | undefined>;
2338
+ /** Encabezado visual del menú. */
2339
+ readonly label: _angular_core.InputSignal<string | undefined>;
2340
+ /** Etiqueta accesible de la superficie. */
2341
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
2342
+ /** Modo `selectable` espejo de `onChange`. */
2343
+ readonly valueChange: _angular_core.OutputEmitterRef<{
2344
+ value: string | number | undefined;
2345
+ item: IusMenuOption;
2346
+ }>;
2347
+ /** Tras activar un ítem — Dropdown/ContextMenu lo usan para cerrar. */
2348
+ readonly itemClick: _angular_core.OutputEmitterRef<{
2349
+ item: IusMenuOption;
2350
+ event: MouseEvent;
2351
+ }>;
2352
+ /**
2353
+ * Aplana `items` a filas pintables insertando los divisores de grupo: al
2354
+ * cambiar `group` respecto de la fila anterior se mete un separador (el
2355
+ * primer ítem nunca lo lleva), y `separator: true` es un divisor explícito.
2356
+ */
2357
+ protected readonly rows: _angular_core.Signal<IusMenuRow[]>;
2358
+ /** `trailing` como TemplateRef (slot rico) — si no, se pinta como texto. */
2359
+ protected trailingTpl(item: IusMenuOption): TemplateRef<unknown> | null;
2360
+ /** `trailing` como texto plano (atajo, valor corto). */
2361
+ protected trailingText(item: IusMenuOption): string | null;
2362
+ protected onItemClick(row: IusMenuRow, event: MouseEvent): void;
2363
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MenuComponent, never>;
2364
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MenuComponent, "ius-menu", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "itemClick": "itemClick"; }, never, never, true, never>;
2228
2365
  }
2229
2366
 
2230
- /** Degradado base según el fondo. */
2231
- type IusLoadingMarkSurface = 'light' | 'dark';
2367
+ /** Familia de color del disparador por defecto. */
2368
+ type IusDropdownTone = 'primary' | 'neutral';
2369
+ /** Tratamiento del disparador por defecto. */
2370
+ type IusDropdownVariant = 'ghost' | 'outline';
2371
+ /** Opción del Dropdown — el tipo compartido de Menu/ContextMenu. */
2372
+ type IusDropdownItem = IusMenuOption;
2232
2373
  /**
2233
- *
2234
- * Cargador de **identidad** Litigiovirtual: tres fichas se deslizan por el
2235
- * cuadrado mientras el conjunto gira y un **cometa** de luz cian orbita el
2236
- * contorno sobre el degradado base navy→cian. Para splash, arranque y esperas
2237
- * largas donde la marca debe estar presente. Para una espera neutra/compacta
2238
- * dentro de la UI botón, fila, panel, usar Loading/CircularProgress; este no
2239
- * lleva etiqueta ni se incrusta en controles.
2240
- *
2374
+ * Marca un disparador propio, en lugar del ghost texto+chevron por defecto:
2375
+ * `<ius-dropdown><ius-icon-button iusDropdownTrigger …/></ius-dropdown>`.
2241
2376
  */
2242
- declare class LoadingMarkComponent {
2243
- /** Lado del cuadro en px. */
2244
- size: number;
2245
- /** `light` navy sólido (default) · `dark` navy→cian sobre superficie navy. */
2246
- surface: IusLoadingMarkSurface;
2247
- /** Congela la animación (figura estática). También respeta reduced-motion. */
2248
- paused: boolean;
2249
- /** Etiqueta accesible. */
2250
- ariaLabel: string;
2251
- private readonly id;
2252
- protected readonly baseId: string;
2253
- protected readonly glowId: string;
2254
- protected readonly softId: string;
2255
- protected readonly maskId: string;
2256
- /** Parada inicial del degradado base (siempre navy). */
2257
- protected get baseFrom(): string;
2258
- /** Parada final: navy en `light`; abre a `--ius-primary-600` en `dark`. */
2259
- protected get baseTo(): string;
2260
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<LoadingMarkComponent, never>;
2261
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<LoadingMarkComponent, "ius-loading-mark", never, { "size": { "alias": "size"; "required": false; }; "surface": { "alias": "surface"; "required": false; }; "paused": { "alias": "paused"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; }, {}, never, never, true, never>;
2262
- static ngAcceptInputType_size: unknown;
2263
- static ngAcceptInputType_paused: unknown;
2264
- }
2265
-
2266
- /** Escala del sistema — small ~34 · medium ~40 (default) · large ~48px. */
2267
- type IusSegmentedSize = 'small' | 'medium' | 'large';
2268
- /** `subtle` = pastilla blanca elevada (default) · `solid` = pastilla navy de marca. */
2269
- type IusSegmentedVariant = 'subtle' | 'solid';
2270
- /** Opción del control (2–5, cortas, todas visibles). */
2271
- interface SegmentedOption {
2272
- /** Valor único (lo que recibe `valueChange`). */
2273
- value: string;
2274
- /** Etiqueta visible (omitible en `iconOnly`). */
2275
- label?: string;
2276
- /** Ligadura Material Symbols Rounded. */
2277
- icon?: string;
2278
- /** Etiqueta accesible cuando `iconOnly` oculta el texto. */
2279
- ariaLabel?: string;
2280
- title?: string;
2281
- /** Deshabilita sólo esta opción. */
2282
- disabled?: boolean;
2377
+ declare class IusDropdownTriggerDirective {
2378
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<IusDropdownTriggerDirective, never>;
2379
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<IusDropdownTriggerDirective, "[iusDropdownTrigger]", never, {}, {}, never, never, true, never>;
2283
2380
  }
2284
2381
  /**
2285
- * SegmentedControl — Ius Design v2.
2382
+ * Dropdown — Ius Design v2 (familia overlays).
2286
2383
  *
2287
- * Selector **único** de pocas opciones cortas, mutuamente excluyentes y **todas
2288
- * visibles a la vez** (Mes/Semana/Día, filtros de estado, conmutadores de modo).
2289
- * Para 0–1 opción Switch; para muchas/largas Select; para acciones → Button.
2384
+ * Menú desplegable accionable: un disparador abre un **Popover** (sin rabito,
2385
+ * `bottom-start` por defecto) con una superficie **Menu**. Dos modos: **acciones**
2386
+ * (cada ítem ejecuta y cierra) y **selección única** (`selectable`, check en la
2387
+ * activa y la etiqueta elegida en el disparador).
2290
2388
  *
2291
- * `role="radiogroup"` + `role="radio"` con `aria-checked`; navegación con
2292
- * ←/→/↑/↓/Home/End (mueve foco y selección) y roving `tabindex`. Implementa
2293
- * `ControlValueAccessor` (`string`) y además soporta `[(value)]` directo.
2389
+ * El disparador por defecto es un botón ghost texto+chevron (el chevron gira al
2390
+ * abrir); `variant="outline"` replica el contenedor del botón de QueryBuilder
2391
+ * (mismo borde/radio/padding/altura) para encajar en barras y SegmentGroup. Con
2392
+ * `[iusDropdownTrigger]` se proyecta un disparador propio.
2294
2393
  *
2295
- * Fuente de verdad: `components/inputs/SegmentedControl/SegmentedControl.jsx` + `.d.ts`.
2394
+ * No es campo de formulario eso es **Select**; para una sola acción →
2395
+ * Button/IconButton. Fuente de verdad: `Dropdown.jsx` + `Dropdown.d.ts` +
2396
+ * `Dropdown.ng-spec.md`.
2296
2397
  */
2297
- declare class SegmentedControlComponent implements ControlValueAccessor {
2298
- /** Opciones mutuamente excluyentes (2–5 cortas; todas visibles). */
2299
- options: SegmentedOption[];
2300
- /** Escala del sistema. */
2301
- size: IusSegmentedSize;
2302
- /** Jerarquía visual de la pastilla seleccionada. */
2303
- variant: IusSegmentedVariant;
2304
- /** Ocupa todo el ancho, repartiendo las opciones por igual. */
2305
- fullWidth: boolean;
2306
- /** Sólo íconos (oculta labels; usa ariaLabel/label como título accesible). */
2307
- iconOnly: boolean;
2308
- /** Etiqueta accesible del grupo. */
2309
- ariaLabel?: string;
2310
- /** `name` de los radios. */
2311
- name?: string;
2312
- private readonly valueState;
2313
- /** Valor seleccionado (controlado / CVA). */
2314
- set value(v: string | undefined);
2315
- get value(): string | undefined;
2316
- private readonly disabledState;
2317
- /** Deshabilita todo el control. */
2318
- set disabled(v: boolean);
2319
- get disabled(): boolean;
2320
- /** Cambio de selección (original `onChange`). Habilita `[(value)]`. */
2321
- readonly valueChange: EventEmitter<string>;
2322
- protected readonly selected: _angular_core.Signal<string | undefined>;
2323
- private readonly optRefs;
2324
- private onChange;
2325
- private onTouched;
2326
- writeValue(value: string): void;
2327
- registerOnChange(fn: (value: string) => void): void;
2328
- registerOnTouched(fn: () => void): void;
2329
- setDisabledState(isDisabled: boolean): void;
2330
- protected isEnabled(o: SegmentedOption): boolean;
2331
- /** Roving tabindex (espejo del golden: seleccionado, o el primero si no hay valor). */
2332
- protected tabIndexFor(o: SegmentedOption, index: number): number;
2333
- private commit;
2334
- private focusAndSelect;
2335
- private focusByOffset;
2336
- protected onOptionClick(o: SegmentedOption): void;
2337
- protected onKeyDown(event: KeyboardEvent, index: number): void;
2338
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<SegmentedControlComponent, never>;
2339
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SegmentedControlComponent, "ius-segmented-control", never, { "options": { "alias": "options"; "required": false; }; "size": { "alias": "size"; "required": false; }; "variant": { "alias": "variant"; "required": false; }; "fullWidth": { "alias": "fullWidth"; "required": false; }; "iconOnly": { "alias": "iconOnly"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; "name": { "alias": "name"; "required": false; }; "value": { "alias": "value"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
2340
- static ngAcceptInputType_fullWidth: unknown;
2341
- static ngAcceptInputType_iconOnly: unknown;
2342
- static ngAcceptInputType_disabled: unknown;
2398
+ declare class DropdownComponent {
2399
+ /** Opciones del menú (mismo shape que `MenuOption`). */
2400
+ readonly items: _angular_core.InputSignal<readonly IusMenuOption[]>;
2401
+ /** Selección única: marca la opción activa con un check. */
2402
+ readonly selectable: _angular_core.InputSignalWithTransform<boolean, unknown>;
2403
+ /** Valor elegido en modo `selectable`. */
2404
+ readonly value: _angular_core.InputSignal<string | number | undefined>;
2405
+ /** Encabezado del menú (y texto del disparador por defecto si no hay elegida). */
2406
+ readonly label: _angular_core.InputSignal<string | undefined>;
2407
+ /** Texto del disparador por defecto (gana sobre la opción elegida y `label`). */
2408
+ readonly triggerLabel: _angular_core.InputSignal<string | undefined>;
2409
+ /** Ícono Material Symbols del disparador por defecto. */
2410
+ readonly triggerIcon: _angular_core.InputSignal<string | undefined>;
2411
+ /** Familia de color del disparador por defecto. */
2412
+ readonly tone: _angular_core.InputSignal<IusDropdownTone>;
2413
+ /** Tratamiento del disparador por defecto. */
2414
+ readonly variant: _angular_core.InputSignal<IusDropdownVariant>;
2415
+ /** Colocación del panel respecto del disparador. */
2416
+ readonly placement: _angular_core.InputSignal<IusPopoverPlacement>;
2417
+ /** Modo controlado (`undefined` = no controlado con `defaultOpen`). */
2418
+ readonly open: _angular_core.InputSignal<boolean | undefined>;
2419
+ /** Estado inicial del modo no controlado. */
2420
+ readonly defaultOpen: _angular_core.InputSignalWithTransform<boolean, unknown>;
2421
+ /** Etiqueta accesible del disparador por defecto. */
2422
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
2423
+ /** Modo `selectable` espejo de `onChange`. */
2424
+ readonly valueChange: _angular_core.OutputEmitterRef<{
2425
+ value: string | number | undefined;
2426
+ item: IusDropdownItem;
2427
+ }>;
2428
+ /** Apertura/cierre del panel. */
2429
+ readonly openChange: _angular_core.OutputEmitterRef<boolean>;
2430
+ protected readonly customTrigger: _angular_core.Signal<IusDropdownTriggerDirective | undefined>;
2431
+ /** `null` = el usuario todavía no ha abierto/cerrado → manda `defaultOpen`. */
2432
+ private readonly internalOpen;
2433
+ /** Controlado por `open` si viene definido; si no, estado interno. */
2434
+ protected readonly isOpen: _angular_core.Signal<boolean>;
2435
+ /** Opción activa en modo `selectable` — alimenta el texto del disparador. */
2436
+ private readonly current;
2437
+ /** `triggerLabel` etiqueta de la opción elegida › `label`. */
2438
+ protected readonly triggerText: _angular_core.Signal<string | undefined>;
2439
+ /** El encabezado del menú solo aplica en modo selección (como el golden). */
2440
+ protected readonly menuLabel: _angular_core.Signal<string | undefined>;
2441
+ protected onOpenChange(open: boolean): void;
2442
+ protected onValueChange(payload: {
2443
+ value: string | number | undefined;
2444
+ item: IusMenuOption;
2445
+ }): void;
2446
+ /** Activar un ítem cierra el panel (acciones y selección). */
2447
+ protected onItemClick(): void;
2448
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DropdownComponent, never>;
2449
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DropdownComponent, "ius-dropdown", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "triggerLabel": { "alias": "triggerLabel"; "required": false; "isSignal": true; }; "triggerIcon": { "alias": "triggerIcon"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "placement": { "alias": "placement"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "defaultOpen": { "alias": "defaultOpen"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "openChange": "openChange"; }, ["customTrigger"], ["[iusDropdownTrigger]"], true, never>;
2343
2450
  }
2344
2451
 
2345
2452
  /** Escala del campo — small ~34 · medium ~40 (default) · large ~48px. */
@@ -2365,6 +2472,12 @@ interface SelectOptionGroup {
2365
2472
  label: string;
2366
2473
  options: SelectOption[];
2367
2474
  }
2475
+ /**
2476
+ * Fábrica de opciones para `creatable`: recibe el texto escrito en el pie del
2477
+ * menú y devuelve la opción a insertar. Devolver `void`/`undefined` usa el
2478
+ * texto como `value` y `label` (espejo de `onCreate` del golden).
2479
+ */
2480
+ type IusSelectCreateFactory = (label: string) => SelectOption | void;
2368
2481
  interface VisibleGroup {
2369
2482
  label: string | null;
2370
2483
  items: {
@@ -2381,9 +2494,10 @@ interface VisibleModel {
2381
2494
  *
2382
2495
  * Campo desplegable que reúne el shell del **TextField** (label + required +
2383
2496
  * iconHelp + prefixIcon + sufix chevron + estados + helpText/errorText, `size`)
2384
- * y abre un menú con **scroll**, **búsqueda en vivo** (caja dentro del menú) y
2385
- * **selección única o múltiple**. Implementa `ControlValueAccessor` completo
2386
- * (valor escalar en single / array en múltiple) y además soporta `[(value)]`.
2497
+ * y abre un menú con **scroll**, **búsqueda en vivo** (caja dentro del menú),
2498
+ * **selección única o múltiple** y —con `creatable`— un **pie para agregar
2499
+ * opciones nuevas en vivo**. Implementa `ControlValueAccessor` completo (valor
2500
+ * escalar en single / array en múltiple) y además soporta `[(value)]`.
2387
2501
  *
2388
2502
  * - Single: muestra la etiqueta elegida; la opción se resalta en azul (fill).
2389
2503
  * - Múltiple: chips removibles dentro del campo + check por opción elegida.
@@ -2393,9 +2507,10 @@ interface VisibleModel {
2393
2507
  * Notas del port a Angular:
2394
2508
  * - El shell `.ius-tf` del TextField está *scoped* (`:host`) en su componente,
2395
2509
  * así que su CSS se re-porta aquí (mismo patrón que el resto del monorepo).
2396
- * - El golden compone `OptionItem` (filas) y `Chip` (chips de múltiple): ya
2397
- * portados como `ius-option-item` / `ius-chip`, se componen aquí directamente
2398
- * (sin CSS inlineado). Los chips de múltiple usan `ius-chip removable`.
2510
+ * - El golden compone `OptionItem` (filas), `Chip` (chips de múltiple),
2511
+ * `Popover` (ícono de ayuda) y `TextButton` (acción del pie `creatable`):
2512
+ * todos ya portados, se componen aquí como `ius-option-item` / `ius-chip` /
2513
+ * `ius-popover` / `ius-text-button` (sin CSS inlineado ni reimplementación).
2399
2514
  * - El menú se portalea a `document.body` vía **CDK Overlay**
2400
2515
  * (`flexibleConnectedTo` el trigger + `scrollStrategy: reposition`), con
2401
2516
  * flip abajo/arriba e igualando el ancho del campo — espejo de
@@ -2403,6 +2518,24 @@ interface VisibleModel {
2403
2518
  * estilos del menú siguen aplicando dentro del overlay porque Angular
2404
2519
  * inyecta el `<style>` scopeado en el `<head>` global (mismo patrón que
2405
2520
  * `ius-modal`, ver `src/lib/modal/modal.component.ts`).
2521
+ *
2522
+ * **Creatable — decisiones del port** (para diseño):
2523
+ * - El golden implementa `creatable` como un **pie propio del menú** con su
2524
+ * campo de texto (`draft`) + `TextButton prefixIcon="add"`, *independiente*
2525
+ * de la caja de búsqueda (conviven). NO es el patrón «la opción nueva
2526
+ * aparece dentro de la lista cuando la búsqueda no matchea ninguna opción»;
2527
+ * si diseño quisiera ese otro patrón, primero hay que cambiar el golden.
2528
+ * - `onCreate` del golden **retorna** la opción a insertar. Un `EventEmitter`
2529
+ * de Angular no puede devolver un valor al emisor, así que el contrato se
2530
+ * parte en dos: `createFactory` (input — la mitad que retorna) + `created`
2531
+ * (output — la mitad que avisa). Ver el TSDoc de cada uno.
2532
+ *
2533
+ * **Divergencia doc-vs-golden anotada** (manda el golden):
2534
+ * - `listMaxH` usa la escala de fila del golden (32/38/46 px por
2535
+ * small/medium/large). El box-model real de `OptionItem` da 32/36/42; el
2536
+ * golden la llama «approx option row height by size» y deja aire de sobra
2537
+ * para el `gap` entre filas. Se conserva la del golden para que `maxVisible`
2538
+ * recorte igual que en el DS.
2406
2539
  */
2407
2540
  declare class SelectComponent implements ControlValueAccessor, OnInit, OnDestroy {
2408
2541
  private readonly optionsState;
@@ -2453,6 +2586,26 @@ declare class SelectComponent implements ControlValueAccessor, OnInit, OnDestroy
2453
2586
  searchPlaceholder: string;
2454
2587
  /** Mensaje cuando la búsqueda no arroja resultados. */
2455
2588
  emptyText: string;
2589
+ /**
2590
+ * Permitir **agregar opciones** desde un pie dentro del menú (campo de texto
2591
+ * + botón «Agregar» con ícono `add`). Las opciones nuevas se anexan a la
2592
+ * lista en vivo —a un grupo sin encabezado al final si la lista está
2593
+ * agrupada— y no duplican `value` existentes. Convive con `searchable`.
2594
+ */
2595
+ creatable: boolean;
2596
+ /** Placeholder del campo de «agregar» (solo con `creatable`). */
2597
+ createPlaceholder: string;
2598
+ /** Texto del botón de «agregar» (solo con `creatable`). */
2599
+ createLabel: string;
2600
+ /**
2601
+ * Fábrica de la opción a insertar — equivalente Angular de `onCreate` del
2602
+ * golden, que **retorna** la opción. Un `EventEmitter` no puede devolver un
2603
+ * valor al emisor, así que la mitad «que retorna» del contrato vive aquí
2604
+ * como input y la mitad «que avisa» vive en el output `created`.
2605
+ * Recibe el texto escrito (ya con `trim`) y devuelve `{value,label,icon?}`;
2606
+ * devolver `void`/`undefined` usa el texto como `value` y `label`.
2607
+ */
2608
+ createFactory?: IusSelectCreateFactory;
2456
2609
  /** Opciones visibles antes de hacer scroll. */
2457
2610
  maxVisible: number;
2458
2611
  /** Texto de ayuda bajo el campo (estado normal). */
@@ -2461,11 +2614,11 @@ declare class SelectComponent implements ControlValueAccessor, OnInit, OnDestroy
2461
2614
  errorText?: string;
2462
2615
  /** Mostrar/ocultar el texto de ayuda. */
2463
2616
  showHelpText: boolean;
2464
- /** Ícono de ayuda `?` junto al label. */
2617
+ /** Ícono de ayuda `?` junto al label (abre `ius-popover` al hover/foco). */
2465
2618
  showIconHelp: boolean;
2466
- /** Título del contenido de ayuda. */
2619
+ /** Título del popover de ayuda. */
2467
2620
  iconHelpTitle?: string;
2468
- /** Cuerpo del contenido de ayuda. */
2621
+ /** Cuerpo del popover de ayuda. */
2469
2622
  iconHelpContent?: string;
2470
2623
  /**
2471
2624
  * Mostrar el botón de limpiar (`cancel`). Solo aparece con valor y campo
@@ -2488,19 +2641,37 @@ declare class SelectComponent implements ControlValueAccessor, OnInit, OnDestroy
2488
2641
  readonly cleared: EventEmitter<void>;
2489
2642
  /** Cambio de apertura del menú (original `onOpenChange`). */
2490
2643
  readonly openChange: EventEmitter<boolean>;
2644
+ /**
2645
+ * Opción agregada por `creatable` — mitad «aviso» del `onCreate` del golden
2646
+ * (la mitad «que retorna la opción» es el input `createFactory`). Solo emite
2647
+ * cuando la opción se anexó de verdad: un texto cuyo `value` ya existe en la
2648
+ * lista no emite nada.
2649
+ */
2650
+ readonly created: EventEmitter<SelectOption>;
2491
2651
  private readonly internalOpen;
2492
2652
  protected readonly query: _angular_core.WritableSignal<string>;
2493
2653
  protected readonly activeIndex: _angular_core.WritableSignal<number>;
2654
+ /** Texto en curso del pie `creatable` (se limpia al agregar y al cerrar). */
2655
+ protected readonly draft: _angular_core.WritableSignal<string>;
2656
+ /** Opciones agregadas en vivo por `creatable` (se anexan a `options`). */
2657
+ private readonly createdOptions;
2494
2658
  /** Ancho del menú (portal CDK) — igualado al ancho del campo. */
2495
2659
  protected readonly menuWidth: _angular_core.WritableSignal<number>;
2496
2660
  private readonly field;
2497
2661
  private readonly menu;
2498
2662
  private readonly search;
2663
+ private readonly createInput;
2499
2664
  private readonly menuTpl;
2500
- protected readonly baseId: string;
2501
- protected readonly helpId: string;
2665
+ /**
2666
+ * `id` de respaldo. `baseId` NO puede ser un inicializador de campo: esos
2667
+ * corren en el constructor, antes de que Angular asigne los `@Input`, así que
2668
+ * `this.id` valdría siempre `undefined` y el `id` del consumidor se perdería.
2669
+ */
2670
+ private readonly fallbackId;
2671
+ protected get baseId(): string;
2672
+ protected get helpId(): string;
2502
2673
  /** `id` único del menú — target de `aria-controls` en el trigger. */
2503
- protected readonly menuId: string;
2674
+ protected get menuId(): string;
2504
2675
  private onChange;
2505
2676
  private onTouched;
2506
2677
  private readonly overlay;
@@ -2511,31 +2682,65 @@ declare class SelectComponent implements ControlValueAccessor, OnInit, OnDestroy
2511
2682
  private typeaheadTimer;
2512
2683
  protected readonly isDisabled: _angular_core.Signal<boolean>;
2513
2684
  protected readonly isError: _angular_core.Signal<boolean>;
2685
+ /**
2686
+ * Apertura efectiva. `state="open"` entra aquí (y no solo en `ngOnInit`) para
2687
+ * que forzar el estado desde un especimen funcione en caliente, igual que el
2688
+ * card remontado del proyecto de diseño.
2689
+ */
2514
2690
  protected readonly isOpen: _angular_core.Signal<boolean>;
2515
2691
  /** `data-focused` del host (espejo del golden): abierto, forzado o error. */
2516
2692
  protected readonly focusedAttr: _angular_core.Signal<true | null>;
2693
+ /**
2694
+ * Opciones efectivas = las de `options` + las agregadas en vivo por
2695
+ * `creatable`. Si la lista viene agrupada, las nuevas van a un grupo sin
2696
+ * encabezado al final (espejo de `mergedOptions` del golden).
2697
+ */
2698
+ private readonly mergedOptions;
2517
2699
  private readonly allFlat;
2518
2700
  protected readonly visible: _angular_core.Signal<VisibleModel>;
2701
+ /** El botón «Agregar» se habilita solo con texto no vacío (golden). */
2702
+ protected readonly createDisabled: _angular_core.Signal<boolean>;
2519
2703
  protected readonly hasValue: _angular_core.Signal<boolean>;
2520
2704
  protected readonly valueArray: _angular_core.Signal<IusSelectValue[]>;
2521
2705
  protected readonly singleValue: _angular_core.Signal<IusSelectValue | null>;
2522
2706
  protected get hint(): string | undefined;
2523
2707
  protected get showHint(): boolean;
2524
2708
  protected get showClearComputed(): boolean;
2525
- protected get helpIconTitle(): string | undefined;
2526
2709
  /**
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
2710
+ * ¿El campo es "clearable-capable"? Espejo de `clearReserved` del golden: solo
2711
+ * entonces el botón de limpiar entra en el flujo (y dentro de ese caso el slot
2712
+ * se reserva con `visibility`). Con `showClear=false` o `disabled` el golden no
2713
+ * pinta el botón, así que tampoco debe quedar el hueco.
2714
+ */
2715
+ protected get clearReserved(): boolean;
2716
+ /** El popover de ayuda solo tiene sentido con título o contenido. */
2717
+ protected get iconHelpEmpty(): boolean;
2718
+ /**
2719
+ * Tamaño de los chips de múltiple. El golden usa un chip **más pequeño que
2720
+ * el campo**: `large → medium`, el resto `small`
2721
+ * (`chipSize` en `Select.jsx`).
2722
+ */
2723
+ protected get chipSize(): 'small' | 'medium';
2724
+ /** Tamaño del `TextButton` del pie `creatable` (golden: `large → medium`). */
2725
+ protected get createButtonSize(): 'small' | 'medium';
2726
+ /**
2727
+ * Alto de fila usado para `maxVisible × itemH`. Escala del golden
2728
+ * (`Select.jsx`: «approx option row height by size») — small 32 · medium 38
2729
+ * · large 46 px. Es una aproximación *deliberadamente* mayor que el
2730
+ * box-model real de `OptionItem` (`--_opt-py`×2 + `--ius-lh-base` = 32/36/42)
2731
+ * porque deja aire para el `gap` (`--ius-space-xxs`) entre filas de
2732
+ * `.ius-selectmenu__list`. Constante estructural del golden, no medida en
2534
2733
  * runtime.
2535
2734
  */
2536
2735
  protected get listMaxH(): number;
2537
2736
  protected labelFor(val: IusSelectValue): string;
2538
2737
  protected isChosen(val: IusSelectValue): boolean;
2738
+ /**
2739
+ * Única fuente del ciclo de vida del overlay: se monta y se desmonta según
2740
+ * `isOpen()`, venga de donde venga (interno, `[open]` controlado o
2741
+ * `state="open"` de un especimen). `attachOverlay` ya es idempotente.
2742
+ */
2743
+ private readonly openSync;
2539
2744
  ngOnInit(): void;
2540
2745
  ngOnDestroy(): void;
2541
2746
  writeValue(value: IusSelectValue | IusSelectValue[] | null): void;
@@ -2547,13 +2752,44 @@ declare class SelectComponent implements ControlValueAccessor, OnInit, OnDestroy
2547
2752
  protected removeChip(val: IusSelectValue): void;
2548
2753
  protected clear(event: Event): void;
2549
2754
  protected toggleOpen(): void;
2755
+ /**
2756
+ * Solo actualiza estado y notifica. El montaje/desmontaje del overlay NO va
2757
+ * aquí: lo gobierna `openSync` a partir de `isOpen()`. Si se hiciera aquí, en
2758
+ * modo controlado (`[open]`) el menú se abriría sin permiso del padre y, al
2759
+ * revés, cambiar `[open]` desde fuera no montaría nada.
2760
+ */
2550
2761
  private setOpen;
2762
+ /**
2763
+ * El alto del menú cambió (filtro de búsqueda, alta de una opción por el pie
2764
+ * `creatable`): re-evalúa flip/posición del overlay en el siguiente frame,
2765
+ * cuando el DOM ya midió el alto nuevo.
2766
+ */
2767
+ private schedulePositionUpdate;
2551
2768
  protected onSearch(event: Event): void;
2769
+ protected onCreateInput(event: Event): void;
2770
+ /**
2771
+ * `Enter` agrega la opción; `Escape` **con texto** solo limpia el borrador y
2772
+ * frena la propagación para que el listener de `document` no cierre el menú
2773
+ * (espejo del golden). Sin texto, `Escape` sigue cerrando el menú.
2774
+ */
2775
+ protected onCreateKeyDown(event: KeyboardEvent): void;
2776
+ /**
2777
+ * Agrega la opción escrita en el pie: la construye con `createFactory` (o
2778
+ * envuelve el texto), la anexa si su `value` no existe ya, emite `created`,
2779
+ * limpia el borrador y devuelve el foco al campo del pie.
2780
+ */
2781
+ protected addItem(): void;
2552
2782
  private moveActive;
2553
2783
  /**
2554
2784
  * ¿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).
2785
+ * cuando el foco está en una caja de texto del menú la de búsqueda **o**
2786
+ * la del pie `creatable`: ahí escribir filtra o redacta el nombre nuevo, y
2787
+ * mover el resaltado sería un efecto colateral indeseado. También se ignora
2788
+ * con modificadores (Ctrl/Alt/Meta).
2789
+ *
2790
+ * (Hoy el pie de `creatable` no enruta a `onTriggerKeyDown` —vive en el
2791
+ * overlay y tiene su propio handler—, pero la guarda se deja explícita para
2792
+ * que reenrutarlo mañana no reintroduzca el bug.)
2557
2793
  */
2558
2794
  private isTypeaheadKey;
2559
2795
  /** Quita diacríticos y normaliza a minúsculas para comparar etiquetas. */
@@ -2575,13 +2811,14 @@ declare class SelectComponent implements ControlValueAccessor, OnInit, OnDestroy
2575
2811
  private updateMenuWidth;
2576
2812
  private readonly onWindowResize;
2577
2813
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SelectComponent, never>;
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>;
2814
+ 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; }; "creatable": { "alias": "creatable"; "required": false; }; "createPlaceholder": { "alias": "createPlaceholder"; "required": false; }; "createLabel": { "alias": "createLabel"; "required": false; }; "createFactory": { "alias": "createFactory"; "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"; "created": "created"; }, never, never, true, never>;
2579
2815
  static ngAcceptInputType_multiple: unknown;
2580
2816
  static ngAcceptInputType_disabled: unknown;
2581
2817
  static ngAcceptInputType_error: unknown;
2582
2818
  static ngAcceptInputType_open: unknown;
2583
2819
  static ngAcceptInputType_required: unknown;
2584
2820
  static ngAcceptInputType_searchable: unknown;
2821
+ static ngAcceptInputType_creatable: unknown;
2585
2822
  static ngAcceptInputType_maxVisible: unknown;
2586
2823
  static ngAcceptInputType_showHelpText: unknown;
2587
2824
  static ngAcceptInputType_showIconHelp: unknown;
@@ -2590,417 +2827,2486 @@ declare class SelectComponent implements ControlValueAccessor, OnInit, OnDestroy
2590
2827
  static ngAcceptInputType_compact: unknown;
2591
2828
  }
2592
2829
 
2830
+ /** Estilo de la paginación. */
2831
+ type IusListViewPaginationVariant = 'compact' | 'numbered';
2832
+
2833
+ /** Escala del header/footer/paginación. */
2834
+ type IusListViewSize = 'small' | 'medium' | 'large';
2835
+ /** Acción utilitaria del header (IconButton tertiary). */
2836
+ interface IusListViewAction {
2837
+ /** Ícono Material Symbols Rounded. */
2838
+ icon: string;
2839
+ /** Etiqueta accesible / tooltip. */
2840
+ label?: string;
2841
+ ariaLabel?: string;
2842
+ onClick?: (event: MouseEvent) => void;
2843
+ disabled?: boolean;
2844
+ key?: string | number;
2845
+ }
2846
+ /** Opción del dropdown de orden. */
2847
+ interface IusListViewSortOption {
2848
+ value: string | number;
2849
+ label: string;
2850
+ /** Agrupa opciones (inserta divisor al cambiar de grupo). */
2851
+ group?: string | number;
2852
+ }
2853
+ /** Marca el slot de filtros secundarios (Tags) del header. */
2854
+ declare class IusListViewFiltersDirective {
2855
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<IusListViewFiltersDirective, never>;
2856
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<IusListViewFiltersDirective, "[iusListViewFilters]", never, {}, {}, never, never, true, never>;
2857
+ }
2858
+ /** Escape-hatch al inicio del header integrado. */
2859
+ declare class IusListViewHeaderStartDirective {
2860
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<IusListViewHeaderStartDirective, never>;
2861
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<IusListViewHeaderStartDirective, "[iusListViewHeaderStart]", never, {}, {}, never, never, true, never>;
2862
+ }
2863
+ /** Escape-hatch al final del header integrado. */
2864
+ declare class IusListViewHeaderEndDirective {
2865
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<IusListViewHeaderEndDirective, never>;
2866
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<IusListViewHeaderEndDirective, "[iusListViewHeaderEnd]", never, {}, {}, never, never, true, never>;
2867
+ }
2593
2868
  /**
2594
- * Un paso del asistente.
2869
+ * Fila-toolbar full-width que reemplaza el header integrado cuando NO hay
2870
+ * selección activa (búsqueda + filtros + controles del listado).
2871
+ */
2872
+ declare class IusListViewToolbarDirective {
2873
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<IusListViewToolbarDirective, never>;
2874
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<IusListViewToolbarDirective, "[iusListViewToolbar]", never, {}, {}, never, never, true, never>;
2875
+ }
2876
+ /** Escape-hatch al inicio del footer. */
2877
+ declare class IusListViewFooterStartDirective {
2878
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<IusListViewFooterStartDirective, never>;
2879
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<IusListViewFooterStartDirective, "[iusListViewFooterStart]", never, {}, {}, never, never, true, never>;
2880
+ }
2881
+ /** Escape-hatch al final del footer. */
2882
+ declare class IusListViewFooterEndDirective {
2883
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<IusListViewFooterEndDirective, never>;
2884
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<IusListViewFooterEndDirective, "[iusListViewFooterEnd]", never, {}, {}, never, never, true, never>;
2885
+ }
2886
+ /**
2887
+ * ListView — Ius Design v2 (familia data-display).
2595
2888
  *
2596
- * `content` (que en el golden React es un `ReactNode`) se resuelve en Angular
2597
- * con un `TemplateRef` por paso (ng-spec §2 / §7): el consumidor declara un
2598
- * `<ng-template>` por paso y lo pasa aquí.
2889
+ * **Cáscara de lista** en tres zonas header (acciones de lista) · body
2890
+ * (scroll con las filas) · footer (conteo sutil + paginación) para cualquier
2891
+ * listado que navega al detalle. No conoce los datos: el consumidor proyecta
2892
+ * las filas (normalmente `ius-list-card`) y maneja orden/filtrado/paginación.
2893
+ * Fuente de verdad: `ListView.jsx` + `ListView.d.ts` + `ListView.ng-spec.md`.
2894
+ *
2895
+ * Header híbrido: controles integrados (seleccionar todo, orden, acciones) +
2896
+ * slots (`iusListViewHeaderStart/End`, `iusListViewFilters`,
2897
+ * `iusListViewToolbar` full-width). Con `selectedCount > 0` el header conmuta a
2898
+ * **modo selección** (conteo + acciones masivas + "Limpiar"). Paginación
2899
+ * numerada homogénea SIEMPRE en el footer (sin scroll infinito).
2900
+ *
2901
+ * `fieldWidths` fija la rejilla de columnas de los `ListCard` descendientes
2902
+ * (emite `--_lc-col-N` en el body). `fit` confina el scroll en el body (el
2903
+ * ancestro debe darle alto acotado). Compone Checkbox, IconButton, TextButton.
2904
+ *
2905
+ * El orden compone `ius-dropdown` (selección única, trigger ghost `swap_vert`
2906
+ * tone neutral, como el golden).
2907
+ *
2908
+ * FALLBACK (API idéntica, reemplazar cuando exista el port):
2909
+ * - paginación: `ius-list-view-pagination` (port interno de Pagination.jsx
2910
+ * sobre ius-button/ius-icon-button/ius-select compact). Reemplazar por
2911
+ * `ius-pagination` cuando exista.
2599
2912
  */
2600
- interface WizardStep {
2601
- /** Identificador opcional del paso. */
2602
- key?: string;
2603
- /** Nombre visible del paso (etiqueta "Paso X de N · label"). */
2913
+ declare class ListViewComponent {
2914
+ /** Oculta por completo el header. */
2915
+ hideHeader: boolean;
2916
+ /** Muestra el checkbox "Seleccionar todo". */
2917
+ selectable: boolean;
2918
+ /** Todas las filas visibles están seleccionadas. */
2919
+ allSelected: boolean;
2920
+ /** Estado indeterminado (algunas seleccionadas). */
2921
+ someSelected: boolean;
2922
+ /** Texto junto al checkbox de selección. */
2923
+ selectLabel: string;
2924
+ /** Opciones de orden → dropdown de selección única en el header. */
2925
+ sortOptions: IusListViewSortOption[];
2926
+ sortValue?: string | number;
2927
+ /** Acciones utilitarias de lista (refrescar, marcar leídos…) → IconButtons. */
2928
+ actions: IusListViewAction[];
2929
+ /** Nº de filas seleccionadas; > 0 activa el modo selección del header. */
2930
+ selectedCount: number;
2931
+ /** Acciones masivas mostradas en modo selección. */
2932
+ selectionActions: IusListViewAction[];
2933
+ /** Separación entre filas (px o CSS). */
2934
+ gap: number | string;
2935
+ /** Padding interno del body. */
2936
+ bodyPadding: number | string;
2937
+ /** Contenedor con superficie + borde + radio y divisores internos. */
2938
+ bordered: boolean;
2939
+ /** Tope sup/inf del track del scrollbar (evita choque con el radio). */
2940
+ scrollTrackMargin: number | string;
2941
+ /** Confina el scroll en la lista (contrato de alto — ver ng-spec). */
2942
+ fit: boolean;
2943
+ /** Rejilla de columnas de `fields` para TODOS los ListCard (hasta 6). */
2944
+ fieldWidths?: Array<number | string | null>;
2945
+ /** Oculta el footer. */
2946
+ hideFooter: boolean;
2947
+ /** Total de elementos (conteo sutil / paginación). */
2948
+ total?: number;
2949
+ /** Sustantivo del conteo. Ej. `procesos`. */
2950
+ countNoun: string;
2951
+ /** Activa la paginación en el footer. */
2952
+ pagination: boolean;
2953
+ paginationVariant: IusListViewPaginationVariant;
2954
+ page?: number;
2955
+ pageSize: number;
2956
+ pageSizeOptions?: number[];
2957
+ size: IusListViewSize;
2958
+ /** Checkbox "Seleccionar todo" (original `onSelectAll`). */
2959
+ readonly selectAll: EventEmitter<boolean>;
2960
+ /** Cambio de orden (original `onSortChange`). */
2961
+ readonly sortChange: EventEmitter<string | number>;
2962
+ /** Limpiar selección (original `onClearSelection`; su enlace muestra "Limpiar"). */
2963
+ readonly clearSelection: EventEmitter<void>;
2964
+ /** Cambio de página (original `onPageChange`). */
2965
+ readonly pageChange: EventEmitter<number>;
2966
+ /** Cambio de tamaño de página (original `onPageSizeChange`). */
2967
+ readonly pageSizeChange: EventEmitter<number>;
2968
+ private readonly filtersRef;
2969
+ private readonly headerStartRef;
2970
+ private readonly headerEndRef;
2971
+ private readonly toolbarRef;
2972
+ private readonly footerStartRef;
2973
+ private readonly footerEndRef;
2974
+ protected get hasFilters(): boolean;
2975
+ protected get hasToolbar(): boolean;
2976
+ protected get inSelection(): boolean;
2977
+ protected get iconSize(): 'small' | 'medium';
2978
+ /** "Limpiar" aparece cuando el consumidor enlazó `(clearSelection)`. */
2979
+ protected get showClear(): boolean;
2980
+ protected get selCountText(): string;
2981
+ protected get countText(): string | null;
2982
+ protected get showFooter(): boolean;
2983
+ protected px(value: number | string | null | undefined): string | null;
2984
+ /** Var `--_lc-col-N` de la rejilla (null deja la columna en auto). */
2985
+ protected colVar(index: number): string | null;
2986
+ protected onAction(action: IusListViewAction, event: MouseEvent): void;
2987
+ /** Sin opción vigente el trigger cae a "Ordenar" (con vigente, el Dropdown muestra su label). */
2988
+ protected get sortTriggerFallback(): string | undefined;
2989
+ protected onSortChange(payload: {
2990
+ value: string | number | undefined;
2991
+ item: IusDropdownItem;
2992
+ }): void;
2993
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ListViewComponent, never>;
2994
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ListViewComponent, "ius-list-view", never, { "hideHeader": { "alias": "hideHeader"; "required": false; }; "selectable": { "alias": "selectable"; "required": false; }; "allSelected": { "alias": "allSelected"; "required": false; }; "someSelected": { "alias": "someSelected"; "required": false; }; "selectLabel": { "alias": "selectLabel"; "required": false; }; "sortOptions": { "alias": "sortOptions"; "required": false; }; "sortValue": { "alias": "sortValue"; "required": false; }; "actions": { "alias": "actions"; "required": false; }; "selectedCount": { "alias": "selectedCount"; "required": false; }; "selectionActions": { "alias": "selectionActions"; "required": false; }; "gap": { "alias": "gap"; "required": false; }; "bodyPadding": { "alias": "bodyPadding"; "required": false; }; "bordered": { "alias": "bordered"; "required": false; }; "scrollTrackMargin": { "alias": "scrollTrackMargin"; "required": false; }; "fit": { "alias": "fit"; "required": false; }; "fieldWidths": { "alias": "fieldWidths"; "required": false; }; "hideFooter": { "alias": "hideFooter"; "required": false; }; "total": { "alias": "total"; "required": false; }; "countNoun": { "alias": "countNoun"; "required": false; }; "pagination": { "alias": "pagination"; "required": false; }; "paginationVariant": { "alias": "paginationVariant"; "required": false; }; "page": { "alias": "page"; "required": false; }; "pageSize": { "alias": "pageSize"; "required": false; }; "pageSizeOptions": { "alias": "pageSizeOptions"; "required": false; }; "size": { "alias": "size"; "required": false; }; }, { "selectAll": "selectAll"; "sortChange": "sortChange"; "clearSelection": "clearSelection"; "pageChange": "pageChange"; "pageSizeChange": "pageSizeChange"; }, ["filtersRef", "headerStartRef", "headerEndRef", "toolbarRef", "footerStartRef", "footerEndRef"], ["[iusListViewToolbar]", "[iusListViewHeaderStart]", "[iusListViewFilters]", "[iusListViewHeaderEnd]", "*", "[iusListViewFooterStart]", "[iusListViewFooterEnd]"], true, never>;
2995
+ static ngAcceptInputType_hideHeader: unknown;
2996
+ static ngAcceptInputType_selectable: unknown;
2997
+ static ngAcceptInputType_allSelected: unknown;
2998
+ static ngAcceptInputType_someSelected: unknown;
2999
+ static ngAcceptInputType_selectedCount: unknown;
3000
+ static ngAcceptInputType_bordered: unknown;
3001
+ static ngAcceptInputType_fit: unknown;
3002
+ static ngAcceptInputType_hideFooter: unknown;
3003
+ static ngAcceptInputType_pagination: unknown;
3004
+ static ngAcceptInputType_pageSize: unknown;
3005
+ }
3006
+
3007
+ /** Doble rol de la fila: seleccionable (option) o valor eliminable (chip). */
3008
+ type IusPersonItemVariant = 'option' | 'chip';
3009
+ /** Escala de avatar + texto. */
3010
+ type IusPersonItemSize = 'small' | 'medium' | 'large';
3011
+ /** Estado forzado — solo demos. */
3012
+ type IusPersonItemState = 'hover' | 'pressed';
3013
+ /** Acción del menú ⋮ del chip (espejo de `IusDropdownItem`/`IusMenuOption`). */
3014
+ interface IusPersonItemAction {
3015
+ key?: string | number;
3016
+ icon?: string;
2604
3017
  label?: string;
2605
- /** Contenido del paso (típicamente un formulario), como plantilla. */
2606
- content?: TemplateRef<unknown> | null;
3018
+ /** Agrupa: al cambiar de `group` inserta un divisor. */
3019
+ group?: string | number;
3020
+ /** Inserta un divisor en su lugar. */
3021
+ separator?: boolean;
3022
+ danger?: boolean;
3023
+ disabled?: boolean;
3024
+ onClick?: (event: MouseEvent) => void;
2607
3025
  }
2608
- /** API que devuelve `createWizard(...)` y consumen `<ius-wizard>` y `<ius-wizard-nav>`. */
2609
- interface WizardApi {
2610
- /** Pasos del flujo. */
2611
- readonly steps: WizardStep[];
2612
- /** Total de pasos. */
2613
- readonly total: number;
2614
- /** Paso actual (1-based). Reactivo (signal-backed). */
2615
- readonly step: number;
2616
- /** Índice actual (0-based). */
2617
- readonly index: number;
2618
- /** Paso actual (`steps[index]`). */
2619
- readonly current: WizardStep | null;
2620
- /** `true` en el primer paso. */
2621
- readonly isFirst: boolean;
2622
- /** `true` en el último paso. */
2623
- readonly isLast: boolean;
2624
- /** Avanza un paso; en el último, dispara `onFinish`. */
2625
- next(): void;
2626
- /** Retrocede un paso (no baja de 1). */
2627
- back(): void;
2628
- /** Salta a un paso (1-based), o función `(prev) => next`. */
2629
- goTo(next: number | ((prev: number) => number)): void;
3026
+ /** Slot a la derecha antes de la X. */
3027
+ declare class IusPersonItemTrailingDirective {
3028
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<IusPersonItemTrailingDirective, never>;
3029
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<IusPersonItemTrailingDirective, "[iusPersonItemTrailing]", never, {}, {}, never, never, true, never>;
2630
3030
  }
2631
- interface UseWizardOptions {
2632
- /** Pasos del flujo. */
2633
- steps: WizardStep[];
2634
- /** Paso inicial (no controlado). Default 1. */
2635
- defaultStep?: number;
2636
- /**
2637
- * Paso inicial controlado (1-based). En el port Angular el estado siempre
2638
- * vive en el controller (signal); pásalo para sembrar el paso inicial y
2639
- * observa los cambios con `onStepChange` / fuérzalos con `goTo`.
2640
- */
2641
- step?: number;
2642
- /** Cambio de paso (recibe el nuevo paso 1-based). */
2643
- onStepChange?: (step: number) => void;
2644
- /** Se dispara al pulsar "siguiente" en el último paso (cierre del flujo). */
2645
- onFinish?: () => void;
3031
+ /** Nombre rico proyectado (alternativa al input `name`). */
3032
+ declare class IusPersonItemNameDirective {
3033
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<IusPersonItemNameDirective, never>;
3034
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<IusPersonItemNameDirective, "[iusPersonItemName]", never, {}, {}, never, never, true, never>;
3035
+ }
3036
+ /**
3037
+ * PersonItem Ius Design v2 (familia data-display).
3038
+ *
3039
+ * Fila-tarjeta genérica de **persona**: avatar + nombre + hasta 2 líneas
3040
+ * (documento, correo, cargo). Doble rol: `option` (fila seleccionable con
3041
+ * estados tintados info + check) / `chip` (valor eliminable con X estilo Chip
3042
+ * y, opcionalmente, menú de acciones). Fuente de verdad: `PersonItem.jsx` +
3043
+ * `PersonItem.d.ts` + `PersonItem.ng-spec.md`. Compone `ius-avatar`.
3044
+ *
3045
+ * Host = la tarjeta (patrón Tag/ListCard): con `(clicked)` enlazado y sin
3046
+ * `disabled` se vuelve botón ARIA (role, tabindex, Enter/Espacio). La X de
3047
+ * eliminar aparece al enlazar `(removed)`.
3048
+ *
3049
+ * `actions` (chip) compone `ius-dropdown` (trigger IconButton `more_vert`
3050
+ * proyectado, antes de la X).
3051
+ *
3052
+ * FALLBACK (API idéntica, reemplazar cuando exista el port):
3053
+ * - superficie: el golden compone `Card` (outlined · radius lg · padding none ·
3054
+ * interactive) — aquí la superficie se replica en `:host` con el CSS verbatim
3055
+ * de Card.jsx (solo los estados que PersonItem usa; los tintes info de option
3056
+ * los sobreescriben igual que el golden). Reemplazar por `ius-card`.
3057
+ *
3058
+ * Para cuenta a la que cambiar → AccountItem; fila de acción → MenuItem; pill
3059
+ * de texto simple → Chip/Tag.
3060
+ */
3061
+ declare class PersonItemComponent {
3062
+ private readonly el;
3063
+ /** Nombre (línea principal, negrita). Para markup rico proyectar `[iusPersonItemName]`. */
3064
+ name?: string;
3065
+ /** Hasta 2 líneas secundarias; `TemplateRef` para contenido rico (no se enmascara). */
3066
+ lines?: Array<string | TemplateRef<unknown>>;
3067
+ /** URL de la fotografía (pasa a `ius-avatar` como `src`). */
3068
+ avatar?: string;
3069
+ /** Ícono Material Symbols del medallón (sin foto/monograma/nombre cae a `person`). */
3070
+ icon?: string;
3071
+ /** Monograma explícito. */
3072
+ monogram?: string;
3073
+ /** Familia de color del medallón. */
3074
+ color: IusAvatarColor;
3075
+ /** Forma del medallón; default square (option) / circle (chip). */
3076
+ shape?: IusAvatarShape;
3077
+ /** Fila seleccionable (`option`) o valor eliminable (`chip`). */
3078
+ variant: IusPersonItemVariant;
3079
+ /** Escala de avatar + texto; `medium` hereda `--ius-density` del contexto. */
3080
+ size: IusPersonItemSize;
3081
+ /** (option) fila elegida: fondo resaltado. */
3082
+ selected: boolean;
3083
+ /** (option) check cuando `selected`. */
3084
+ showCheck: boolean;
3085
+ /** Enmascara las líneas string (email → inicial+dominio; documento → 1ª+últimas 3). */
3086
+ mask: boolean;
3087
+ disabled: boolean;
3088
+ /** (chip) Acciones secundarias en menú ⋮ antes de la X. */
3089
+ actions: IusPersonItemAction[];
3090
+ /** aria del menú de acciones. */
3091
+ actionsLabel: string;
3092
+ /** aria del botón X. */
3093
+ removeLabel: string;
3094
+ /** Estado forzado — solo demos. */
3095
+ state?: IusPersonItemState;
3096
+ ariaLabel?: string;
3097
+ /** (option) fila pulsada (original `onClick`); su enlace vuelve la fila botón. */
3098
+ readonly clicked: EventEmitter<MouseEvent>;
3099
+ /** X pulsada (original `onRemove`); su enlace muestra la X. */
3100
+ readonly removed: EventEmitter<MouseEvent>;
3101
+ private readonly trailingRef;
3102
+ private readonly nameRef;
3103
+ protected get hasTrailing(): boolean;
3104
+ protected get clickable(): boolean;
3105
+ protected get showRemove(): boolean;
3106
+ protected get isChip(): boolean;
3107
+ protected get avatarShape(): IusAvatarShape;
3108
+ protected get avatarSize(): 'small' | 'medium' | 'large';
3109
+ protected get menuIbSize(): 'small' | 'medium';
3110
+ /** Sin foto/monograma/nombre, el medallón cae al ícono genérico `person`. */
3111
+ protected get effIcon(): string | undefined;
3112
+ protected get avatarName(): string | undefined;
3113
+ protected get hasName(): boolean;
3114
+ /** Líneas visibles (mask aplicado solo a strings, como el golden). */
3115
+ protected get displayLines(): Array<{
3116
+ text?: string;
3117
+ tpl?: TemplateRef<unknown>;
3118
+ }>;
3119
+ protected get showMenu(): boolean;
3120
+ protected onRemoveMouseDown(event: MouseEvent): void;
3121
+ protected onRemoveClick(event: MouseEvent): void;
3122
+ protected onHostClick(event: MouseEvent): void;
3123
+ protected onKeyActivate(event: Event): void;
3124
+ protected onSpaceDown(event: Event): void;
3125
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PersonItemComponent, never>;
3126
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PersonItemComponent, "ius-person-item", never, { "name": { "alias": "name"; "required": false; }; "lines": { "alias": "lines"; "required": false; }; "avatar": { "alias": "avatar"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "monogram": { "alias": "monogram"; "required": false; }; "color": { "alias": "color"; "required": false; }; "shape": { "alias": "shape"; "required": false; }; "variant": { "alias": "variant"; "required": false; }; "size": { "alias": "size"; "required": false; }; "selected": { "alias": "selected"; "required": false; }; "showCheck": { "alias": "showCheck"; "required": false; }; "mask": { "alias": "mask"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "actions": { "alias": "actions"; "required": false; }; "actionsLabel": { "alias": "actionsLabel"; "required": false; }; "removeLabel": { "alias": "removeLabel"; "required": false; }; "state": { "alias": "state"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; }, { "clicked": "clicked"; "removed": "removed"; }, ["trailingRef", "nameRef"], ["[iusPersonItemName]", "[iusPersonItemTrailing]"], true, never>;
3127
+ static ngAcceptInputType_selected: unknown;
3128
+ static ngAcceptInputType_showCheck: unknown;
3129
+ static ngAcceptInputType_mask: unknown;
3130
+ static ngAcceptInputType_disabled: unknown;
3131
+ }
3132
+
3133
+ /** Costado desde el que entra el panel. */
3134
+ type IusDrawerSide = 'right' | 'left';
3135
+ /** Ancho del panel — sm 400 · md 440 · lg 560 · xl 720 px (≤480 full-width). */
3136
+ type IusDrawerSize = 'sm' | 'md' | 'lg' | 'xl';
3137
+ /** Título rico proyectado (alternativa al input `title`). */
3138
+ declare class IusDrawerTitleDirective {
3139
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<IusDrawerTitleDirective, never>;
3140
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<IusDrawerTitleDirective, "[iusDrawerTitle]", never, {}, {}, never, never, true, never>;
3141
+ }
3142
+ /** Acciones del header (antes del ×). */
3143
+ declare class IusDrawerHeaderActionsDirective {
3144
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<IusDrawerHeaderActionsDirective, never>;
3145
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<IusDrawerHeaderActionsDirective, "[iusDrawerHeaderActions]", never, {}, {}, never, never, true, never>;
3146
+ }
3147
+ /** Footer sticky (Button primario + Cancelar). */
3148
+ declare class IusDrawerFooterDirective {
3149
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<IusDrawerFooterDirective, never>;
3150
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<IusDrawerFooterDirective, "[iusDrawerFooter]", never, {}, {}, never, never, true, never>;
3151
+ }
3152
+ /**
3153
+ * Drawer (Side Sheet) — Ius Design v2 (familia overlays).
3154
+ *
3155
+ * Panel lateral para flujos de **crear/editar** (varios campos): scrim + panel
3156
+ * que entra desde `side` con header (volver + título + acciones + ×), body con
3157
+ * scroll propio y footer sticky. Fuente de verdad: `Drawer.jsx` + `Drawer.d.ts`
3158
+ * + `Drawer.ng-spec.md`. Confirmaciones breves → Modal.
3159
+ *
3160
+ * Se monta vía **CDK Overlay** en `document.body` (no acepta `container`):
3161
+ * portal + scroll-lock del fondo (`block()`) + focus-trap (`cdkTrapFocus`, que
3162
+ * además restaura el foco al cerrar). `Esc`/scrim cierran (configurable).
3163
+ * La animación replica el golden: `data-visible` desliza, y `data-entered`
3164
+ * suelta el transform al asentarse para que el texto rasterice nítido.
3165
+ *
3166
+ * La flecha de volver emite `back` si está enlazado; si no, cierra.
3167
+ */
3168
+ declare class DrawerComponent implements AfterViewInit, OnDestroy {
3169
+ private readonly overlay;
3170
+ private readonly viewContainerRef;
3171
+ /** Template con scrim + panel; se portalea al overlay al abrir. */
3172
+ private tpl;
3173
+ protected titleSlot?: IusDrawerTitleDirective;
3174
+ protected actionsSlot?: IusDrawerHeaderActionsDirective;
3175
+ protected footerSlot?: IusDrawerFooterDirective;
3176
+ private _open?;
3177
+ /** Apertura controlada (undefined = no controlado con `defaultOpen`). */
3178
+ set open(value: boolean | undefined);
3179
+ get open(): boolean | undefined;
3180
+ /** Estado inicial del modo no controlado. */
3181
+ defaultOpen: boolean;
3182
+ /** Costado desde el que entra. */
3183
+ side: IusDrawerSide;
3184
+ /** Ancho del panel; lg/xl dan aire a formularios de 2 columnas. */
3185
+ size: IusDrawerSize;
3186
+ /** Título del header. Para markup rico proyectar `[iusDrawerTitle]`. */
3187
+ title?: string;
3188
+ centerTitle: boolean;
3189
+ /** Flecha de volver; default: visible si `(back)` está enlazado. */
3190
+ showBack?: boolean;
3191
+ /** × a la derecha. */
3192
+ showClose: boolean;
3193
+ closeOnScrim: boolean;
3194
+ closeOnEsc: boolean;
3195
+ showScrim: boolean;
3196
+ ariaLabel?: string;
3197
+ /** Cierre solicitado (original `onClose`): ×, scrim, Esc o volver sin `(back)`. */
3198
+ readonly closed: EventEmitter<void>;
3199
+ /** Espejo de `onOpenChange`. */
3200
+ readonly openChange: EventEmitter<boolean>;
3201
+ /** Flecha de volver (original `onBack`); si no se enlaza, la flecha cierra. */
3202
+ readonly back: EventEmitter<void>;
3203
+ protected readonly titleId: string;
3204
+ /** Estado de animación: visible desliza; entered suelta el transform. */
3205
+ protected readonly visible: _angular_core.WritableSignal<boolean>;
3206
+ protected readonly entered: _angular_core.WritableSignal<boolean>;
3207
+ private overlayRef;
3208
+ private keydownSub;
3209
+ private internalOpen;
3210
+ private viewReady;
3211
+ private timers;
3212
+ protected get isOpen(): boolean;
3213
+ protected get showBackBtn(): boolean;
3214
+ protected get hasTitle(): boolean;
3215
+ protected get hasActionsZone(): boolean;
3216
+ protected get hasHeader(): boolean;
3217
+ protected get labelledBy(): string | null;
3218
+ ngAfterViewInit(): void;
3219
+ ngOnDestroy(): void;
3220
+ protected requestClose(): void;
3221
+ protected onBackClick(): void;
3222
+ protected onScrimClick(): void;
3223
+ private sync;
3224
+ private attach;
3225
+ private detach;
3226
+ private clearTimers;
3227
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DrawerComponent, never>;
3228
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DrawerComponent, "ius-drawer", never, { "open": { "alias": "open"; "required": false; }; "defaultOpen": { "alias": "defaultOpen"; "required": false; }; "side": { "alias": "side"; "required": false; }; "size": { "alias": "size"; "required": false; }; "title": { "alias": "title"; "required": false; }; "centerTitle": { "alias": "centerTitle"; "required": false; }; "showBack": { "alias": "showBack"; "required": false; }; "showClose": { "alias": "showClose"; "required": false; }; "closeOnScrim": { "alias": "closeOnScrim"; "required": false; }; "closeOnEsc": { "alias": "closeOnEsc"; "required": false; }; "showScrim": { "alias": "showScrim"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; }, { "closed": "closed"; "openChange": "openChange"; "back": "back"; }, ["titleSlot", "actionsSlot", "footerSlot"], ["[iusDrawerTitle]", "[iusDrawerHeaderActions]", "*", "[iusDrawerFooter]"], true, never>;
3229
+ static ngAcceptInputType_defaultOpen: unknown;
3230
+ static ngAcceptInputType_centerTitle: unknown;
3231
+ static ngAcceptInputType_showClose: unknown;
3232
+ static ngAcceptInputType_closeOnScrim: unknown;
3233
+ static ngAcceptInputType_closeOnEsc: unknown;
3234
+ static ngAcceptInputType_showScrim: unknown;
3235
+ }
3236
+
3237
+ /** Identificador de una persona (id o value de la opción). */
3238
+ type IusPersonId = string | number;
3239
+ /** Persona elegible del picker. */
3240
+ interface IusPersonOption {
3241
+ id?: IusPersonId;
3242
+ value?: IusPersonId;
3243
+ name?: string;
3244
+ /** Hasta 2 líneas secundarias (documento, correo, cargo…). */
3245
+ lines?: string[];
3246
+ avatar?: string;
3247
+ monogram?: string;
3248
+ icon?: string;
3249
+ color?: IusAvatarColor;
3250
+ shape?: IusAvatarShape;
3251
+ disabled?: boolean;
3252
+ /** `false` = el chip seleccionado no muestra la X. */
3253
+ removable?: boolean;
3254
+ /** Acciones del chip seleccionado (menú ⋮ del PersonItem). */
3255
+ actions?: IusPersonItemAction[];
3256
+ }
3257
+ /** Contexto del template `renderSelected`. */
3258
+ interface IusPersonPickerSelectedContext {
3259
+ $implicit: IusPersonOption;
3260
+ remove: () => void;
3261
+ }
3262
+ /**
3263
+ * PersonPicker — Ius Design v2 (familia inputs, CVA).
3264
+ *
3265
+ * Selector de **personas** al estilo del Select: un trigger (campo con chevron)
3266
+ * abre en un `ius-popover` la búsqueda en vivo + la lista con scroll de
3267
+ * `ius-person-item` (option); los elegidos se muestran como chips eliminables
3268
+ * bajo el trigger. Fuente de verdad: `PersonPicker.jsx` + `PersonPicker.d.ts` +
3269
+ * `PersonPicker.ng-spec.md`. Single cierra al elegir; multi mantiene abierto y
3270
+ * marca check. Búsqueda por nombre + líneas, normalizada NFD sin diacríticos.
3271
+ *
3272
+ * El panel iguala el ancho del trigger (medición con ResizeObserver) — usa la
3273
+ * piel `panelClass="ius-personpicker-pop"` del Popover para soltar el
3274
+ * `max-width` del panel (mismo patrón que la piel Tooltip). La búsqueda
3275
+ * compone `ius-search-bar`.
3276
+ *
3277
+ * Para enum corto y cerrado → Select; cambiar de cuenta → UserMenu.
3278
+ */
3279
+ declare class PersonPickerComponent implements ControlValueAccessor, AfterViewInit, OnDestroy {
3280
+ /** Personas elegibles. */
3281
+ options: IusPersonOption[];
3282
+ /** Varias personas (arreglo) o una sola (id). */
3283
+ multiple: boolean;
3284
+ /** Texto del trigger sin selección. */
3285
+ placeholder: string;
3286
+ /** Búsqueda en vivo dentro del menú. */
3287
+ searchable: boolean;
3288
+ searchPlaceholder: string;
3289
+ emptyText: string;
3290
+ /** Chips de seleccionados bajo el trigger. */
3291
+ showSelected: boolean;
3292
+ /** Etiqueta del bloque de seleccionados; `null`/`''` la oculta. */
3293
+ selectedLabel: string | null;
3294
+ /** Acciones por seleccionado (arreglo fijo o por opción). */
3295
+ selectedActions?: IusPersonItemAction[] | ((opt: IusPersonOption) => IusPersonItemAction[]);
3296
+ /** Control total del chip seleccionado (contexto `{$implicit, remove}`). */
3297
+ renderSelected?: TemplateRef<IusPersonPickerSelectedContext>;
3298
+ /** Propaga el enmascarado de PersonItem. */
3299
+ mask: boolean;
3300
+ /** Propaga a búsqueda y PersonItem; escala el trigger (34/40/48). */
3301
+ size: IusPersonItemSize;
3302
+ /** Alto máximo de la lista con scroll. */
3303
+ maxHeight: number | string;
3304
+ /** Alto máximo del bloque de seleccionados (activa su scroll propio). */
3305
+ selectedMaxHeight?: number | string;
3306
+ defaultOpen: boolean;
3307
+ private _open?;
3308
+ /** Apertura controlada del menú. */
3309
+ set open(value: boolean | undefined);
3310
+ get open(): boolean | undefined;
3311
+ private readonly inputDisabled;
3312
+ set disabled(value: boolean);
3313
+ get disabled(): boolean;
3314
+ private readonly valueState;
3315
+ /** Valor controlado: arreglo en multi, id único en single (CVA / `[(value)]`). */
3316
+ set value(value: IusPersonId[] | IusPersonId | null | undefined);
3317
+ get value(): IusPersonId[] | IusPersonId | null;
3318
+ /** CVA `onChange` (original `onChange`). */
3319
+ readonly valueChange: EventEmitter<IusPersonId | IusPersonId[] | null>;
3320
+ /** Abrir/cerrar el menú. */
3321
+ readonly openChange: EventEmitter<boolean>;
3322
+ private triggerEl?;
3323
+ protected readonly query: _angular_core.WritableSignal<string>;
3324
+ protected readonly menuWidth: _angular_core.WritableSignal<number | null>;
3325
+ private readonly innerOpen;
3326
+ private readonly cvaDisabled;
3327
+ private resizeObserver?;
3328
+ private initialized;
3329
+ private onChangeFn;
3330
+ private onTouchedFn;
3331
+ ngAfterViewInit(): void;
3332
+ ngOnDestroy(): void;
3333
+ writeValue(value: IusPersonId[] | IusPersonId | null): void;
3334
+ registerOnChange(fn: (value: IusPersonId[] | IusPersonId | null) => void): void;
3335
+ registerOnTouched(fn: () => void): void;
3336
+ setDisabledState(isDisabled: boolean): void;
3337
+ protected get effDisabled(): boolean;
3338
+ protected get isOpen(): boolean;
3339
+ protected optId(opt: IusPersonOption): IusPersonId | undefined;
3340
+ protected get selectedIds(): IusPersonId[];
3341
+ protected isSelected(opt: IusPersonOption): boolean;
3342
+ protected get selectedOptions(): IusPersonOption[];
3343
+ protected get filtered(): IusPersonOption[];
3344
+ protected get triggerText(): string;
3345
+ protected get selectedLabelVisible(): boolean;
3346
+ protected chipActions(opt: IusPersonOption): IusPersonItemAction[];
3347
+ protected selectedCtx(opt: IusPersonOption): IusPersonPickerSelectedContext;
3348
+ protected px(value: number | string | null | undefined): string | null;
3349
+ protected toggleOpen(): void;
3350
+ protected onPopoverOpenChange(open: boolean): void;
3351
+ private setOpen;
3352
+ private measure;
3353
+ protected onQueryChange(value: string): void;
3354
+ protected clearQuery(): void;
3355
+ private commit;
3356
+ protected toggle(opt: IusPersonOption): void;
3357
+ protected remove(opt: IusPersonOption): void;
3358
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PersonPickerComponent, never>;
3359
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PersonPickerComponent, "ius-person-picker", never, { "options": { "alias": "options"; "required": false; }; "multiple": { "alias": "multiple"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "searchable": { "alias": "searchable"; "required": false; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; }; "emptyText": { "alias": "emptyText"; "required": false; }; "showSelected": { "alias": "showSelected"; "required": false; }; "selectedLabel": { "alias": "selectedLabel"; "required": false; }; "selectedActions": { "alias": "selectedActions"; "required": false; }; "renderSelected": { "alias": "renderSelected"; "required": false; }; "mask": { "alias": "mask"; "required": false; }; "size": { "alias": "size"; "required": false; }; "maxHeight": { "alias": "maxHeight"; "required": false; }; "selectedMaxHeight": { "alias": "selectedMaxHeight"; "required": false; }; "defaultOpen": { "alias": "defaultOpen"; "required": false; }; "open": { "alias": "open"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "value": { "alias": "value"; "required": false; }; }, { "valueChange": "valueChange"; "openChange": "openChange"; }, never, never, true, never>;
3360
+ static ngAcceptInputType_multiple: unknown;
3361
+ static ngAcceptInputType_searchable: unknown;
3362
+ static ngAcceptInputType_showSelected: unknown;
3363
+ static ngAcceptInputType_mask: unknown;
3364
+ static ngAcceptInputType_defaultOpen: unknown;
3365
+ static ngAcceptInputType_disabled: unknown;
3366
+ }
3367
+
3368
+ /** Tamaño del campo: small ~34 · medium ~40 (default) · large ~48 px. */
3369
+ type IusMultiTextFieldSize = 'small' | 'medium' | 'large';
3370
+ /** Estado forzado — solo demos / especímenes. */
3371
+ type IusMultiTextFieldState = 'hover' | 'focused' | 'error' | 'disabled';
3372
+ /** Un segmento (`<input>`) del MultiTextField. */
3373
+ interface IusMultiTextFieldSlot {
3374
+ /** Placeholder del segmento. */
3375
+ placeholder?: string;
3376
+ /** `name` del input (envío como form). */
3377
+ name?: string;
3378
+ /** Tipo del `<input>`. Default `text`. */
3379
+ type?: 'text' | 'number' | 'tel' | 'password';
3380
+ /** Valor controlado del segmento. */
3381
+ value?: string;
3382
+ /** Valor inicial (no controlado). */
3383
+ defaultValue?: string;
3384
+ /** Ancho fijo. Número → px; string → CSS literal. */
3385
+ width?: number | string;
3386
+ /** `flex` (`'1 1 auto'`, `'0 0 60px'`, …) si necesitas más control que `width`. */
3387
+ flex?: string | number;
3388
+ /** Largo máximo de caracteres (habilita auto-avance). */
3389
+ maxLength?: number;
3390
+ /** Etiqueta accesible del segmento (si el placeholder no basta). */
3391
+ ariaLabel?: string;
3392
+ /** Callback opcional al teclear este segmento (además del `valueChange` del conjunto). */
3393
+ onChange?: (value: string, event: Event) => void;
3394
+ }
3395
+ /**
3396
+ * MultiTextField — Ius Design v2 (familia inputs).
3397
+ *
3398
+ * Variación de **TextField** que acopla varios `<input>` dentro de una misma
3399
+ * caja separados por divisores verticales — para datos compuestos (tarjeta
3400
+ * MM | AAAA + CVV, teléfono con prefijo, NIT + DV…). Reusa el wrapper `.ius-tf`
3401
+ * (label con required + iconHelp, 5 estados, size, helpText/errorText) y un
3402
+ * **único** botón de limpiar que vacía todos los segmentos. Fuente de verdad:
3403
+ * `MultiTextField.jsx` + `MultiTextField.d.ts` (delta sobre `TextField.ng-spec`).
3404
+ *
3405
+ * `ControlValueAccessor` **a nivel de conjunto**: el valor es el array de
3406
+ * valores por segmento (`string[]`); también se emite en `valueChange`. Cada
3407
+ * slot puede además traer su propio `onChange`. Auto-avance al llenar el
3408
+ * `maxLength` y Backspace en segmento vacío retrocede.
3409
+ *
3410
+ * Nota: las clases `.ius-tf__*` (label/help/hint/field/clear) se replican en el
3411
+ * SCSS porque bajo `ViewEncapsulation.Emulated` las de TextField no alcanzan a
3412
+ * otro componente. `showIconHelp` usa `title` nativo como respaldo hasta que
3413
+ * exista `ius-popover`. `[data-force]` congela un estado visual en demos.
3414
+ */
3415
+ declare class MultiTextFieldComponent implements ControlValueAccessor {
3416
+ protected readonly slotsState: _angular_core.WritableSignal<IusMultiTextFieldSlot[]>;
3417
+ /** Segmentos; cada uno un `<input>` separado por un divisor vertical. */
3418
+ set slots(value: IusMultiTextFieldSlot[]);
3419
+ get slots(): IusMultiTextFieldSlot[];
3420
+ /** Label común a todos los segmentos. */
3421
+ label?: string;
3422
+ /** Indicador de obligatorio (•). */
3423
+ required: boolean;
3424
+ /** Ícono de ayuda `?` junto al label (respaldo: `title` nativo). */
3425
+ showIconHelp: boolean;
3426
+ /** Título del contenido de ayuda. */
3427
+ iconHelpTitle?: string;
3428
+ /** Cuerpo del contenido de ayuda. */
3429
+ iconHelpContent?: string;
3430
+ /** Línea de ayuda bajo el campo. */
3431
+ helpText?: string;
3432
+ /** Reemplaza `helpText` cuando `error` es `true`. */
3433
+ errorText?: string;
3434
+ /** Mostrar/ocultar la línea de ayuda. */
3435
+ showHelpText: boolean;
3436
+ /** Forzar visibilidad del botón limpiar (por defecto: auto con valor). */
3437
+ showClear?: boolean;
3438
+ private readonly errorState;
3439
+ /** Estado de error global. */
3440
+ set error(value: boolean);
3441
+ get error(): boolean;
3442
+ private readonly disabledState;
3443
+ /** Estado deshabilitado global. */
3444
+ set disabled(value: boolean);
3445
+ get disabled(): boolean;
3446
+ protected readonly sizeState: _angular_core.WritableSignal<IusMultiTextFieldSize>;
3447
+ set size(value: IusMultiTextFieldSize);
3448
+ get size(): IusMultiTextFieldSize;
3449
+ protected readonly stateState: _angular_core.WritableSignal<IusMultiTextFieldState | undefined>;
3450
+ /** Forzar visualmente un estado completo (solo demos). */
3451
+ set state(value: IusMultiTextFieldState | undefined);
3452
+ get state(): IusMultiTextFieldState | undefined;
3453
+ /** `id` base del campo (los segmentos serán `id-0`, `id-1`, …). */
3454
+ id?: string;
3455
+ /** Valores del conjunto (array por segmento). */
3456
+ readonly valueChange: EventEmitter<string[]>;
3457
+ /** Al pulsar el botón de limpiar (después de vaciar). */
3458
+ readonly cleared: EventEmitter<void>;
3459
+ protected readonly values: _angular_core.WritableSignal<string[]>;
3460
+ protected readonly focused: _angular_core.WritableSignal<boolean>;
3461
+ /** Tras limpiar en un estado demo, suprime el "valor" simulado. */
3462
+ private readonly suppressDemoValue;
3463
+ /** Último valor escrito por el CVA (por si llega antes que los slots). */
3464
+ private readonly pendingValue;
3465
+ private readonly baseIdState;
3466
+ private readonly slotInputs;
3467
+ private onChange;
3468
+ private onTouched;
3469
+ protected readonly isDisabled: _angular_core.Signal<boolean>;
3470
+ protected readonly isError: _angular_core.Signal<boolean>;
3471
+ protected readonly isFocused: _angular_core.Signal<boolean>;
3472
+ protected readonly hasAnyValue: _angular_core.Signal<boolean>;
3473
+ protected readonly demoHasValue: _angular_core.Signal<boolean>;
3474
+ protected get baseId(): string;
3475
+ protected get helpId(): string;
3476
+ protected get hint(): string | undefined;
3477
+ protected get showHint(): boolean;
3478
+ protected get helpIconTitle(): string | undefined;
3479
+ /** El botón de limpiar está activo (visible y operable). */
3480
+ protected get clearActive(): boolean;
3481
+ /** Se reserva el hueco del clear (visibility) para no desplazar los segmentos. */
3482
+ protected get clearReserved(): boolean;
3483
+ protected currentValue(i: number): string;
3484
+ /** flex del segmento: width > flex > (maxLength → base auto) > CSS (1 1 auto). */
3485
+ protected slotFlex(slot: IusMultiTextFieldSlot): string | null;
3486
+ /** width del segmento: solo cuando se deriva del maxLength. */
3487
+ protected slotWidth(slot: IusMultiTextFieldSlot): string | null;
3488
+ writeValue(value: string[] | null): void;
3489
+ registerOnChange(fn: (value: string[]) => void): void;
3490
+ registerOnTouched(fn: () => void): void;
3491
+ setDisabledState(isDisabled: boolean): void;
3492
+ private syncValues;
3493
+ private commit;
3494
+ private focusSlot;
3495
+ protected onSlotInput(i: number, event: Event): void;
3496
+ protected onSlotKeyDown(i: number, event: KeyboardEvent): void;
3497
+ protected onFocus(): void;
3498
+ protected onBlur(): void;
3499
+ protected clear(): void;
3500
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MultiTextFieldComponent, never>;
3501
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MultiTextFieldComponent, "ius-multi-text-field", never, { "slots": { "alias": "slots"; "required": false; }; "label": { "alias": "label"; "required": false; }; "required": { "alias": "required"; "required": false; }; "showIconHelp": { "alias": "showIconHelp"; "required": false; }; "iconHelpTitle": { "alias": "iconHelpTitle"; "required": false; }; "iconHelpContent": { "alias": "iconHelpContent"; "required": false; }; "helpText": { "alias": "helpText"; "required": false; }; "errorText": { "alias": "errorText"; "required": false; }; "showHelpText": { "alias": "showHelpText"; "required": false; }; "showClear": { "alias": "showClear"; "required": false; }; "error": { "alias": "error"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "size": { "alias": "size"; "required": false; }; "state": { "alias": "state"; "required": false; }; "id": { "alias": "id"; "required": false; }; }, { "valueChange": "valueChange"; "cleared": "cleared"; }, never, never, true, never>;
3502
+ static ngAcceptInputType_required: unknown;
3503
+ static ngAcceptInputType_showIconHelp: unknown;
3504
+ static ngAcceptInputType_showHelpText: unknown;
3505
+ static ngAcceptInputType_error: unknown;
3506
+ static ngAcceptInputType_disabled: unknown;
3507
+ }
3508
+
3509
+ /** Ancho máximo del diálogo — small 380 · medium 520 (default) · large 680px. */
3510
+ type IusModalSize = 'small' | 'medium' | 'large';
3511
+ /** Tono del círculo del ícono del header. */
3512
+ type IusModalIconTone = 'info' | 'success' | 'warning' | 'danger' | 'primary' | 'neutral';
3513
+ /** Motivo del cierre emitido por `closed`. */
3514
+ type IusModalCloseReason = 'close' | 'esc' | 'scrim' | 'secondary';
3515
+ /**
3516
+ * Marca el footer libre proyectado. Tiene prioridad sobre el footer de
3517
+ * conveniencia (`primaryLabel`/`secondaryLabel`):
3518
+ *
3519
+ * ```html
3520
+ * <ius-modal ...>
3521
+ * …cuerpo…
3522
+ * <div iusModalFooter>…acciones a medida…</div>
3523
+ * </ius-modal>
3524
+ * ```
3525
+ */
3526
+ declare class IusModalFooterDirective {
3527
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<IusModalFooterDirective, never>;
3528
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<IusModalFooterDirective, "[iusModalFooter]", never, {}, {}, never, never, true, never>;
3529
+ }
3530
+ /**
3531
+ * Modal — Ius Design v2.
3532
+ *
3533
+ * Diálogo centrado sobre un scrim que exige atención/decisión (confirmaciones,
3534
+ * avisos accionables) sin abandonar la pantalla. Se monta vía **CDK Overlay** en
3535
+ * `document.body` (no acepta `container`): portal + **scroll-lock** del fondo +
3536
+ * **focus-trap** dentro (`cdkTrapFocus`). `Esc`/scrim cierran (configurable).
3537
+ * `role="dialog"` `aria-modal="true"`.
3538
+ *
3539
+ * Compone `ius-button` (footer) e `ius-icon-button` (cerrar) — no introduce
3540
+ * controles propios. Para tareas con varios campos usar Drawer; para avisos no
3541
+ * bloqueantes usar Alert/Toast.
3542
+ *
3543
+ */
3544
+ declare class ModalComponent implements AfterViewInit, OnDestroy {
3545
+ private readonly overlay;
3546
+ private readonly viewContainerRef;
3547
+ /** Template con scrim + diálogo; se portalea al overlay al abrir. */
3548
+ private tpl;
3549
+ /** Footer libre proyectado (`[iusModalFooter]`). Si existe, gana al de conveniencia. */
3550
+ protected customFooter?: IusModalFooterDirective;
3551
+ private _open;
3552
+ /** Apertura controlada. */
3553
+ set open(value: boolean);
3554
+ get open(): boolean;
3555
+ /** Ancho máximo (380·520·680; ≤480px full-width). */
3556
+ size: IusModalSize;
3557
+ /** Título del header. */
3558
+ title?: string;
3559
+ /** Descripción breve bajo el título. */
3560
+ description?: string;
3561
+ /** Ligadura Material Symbols al inicio del header (círculo suave del tono). */
3562
+ icon?: string;
3563
+ /** Tono del círculo del ícono. */
3564
+ iconTone: IusModalIconTone;
3565
+ /** Botón de cerrar (×) en el header. */
3566
+ showClose: boolean;
3567
+ /** Texto del botón primario de conveniencia. */
3568
+ primaryLabel?: string;
3569
+ /** Loading del primario. */
3570
+ primaryLoading: boolean;
3571
+ /** Deshabilita el primario. */
3572
+ primaryDisabled: boolean;
3573
+ /** Acción destructiva: el primario de conveniencia usa `variant="danger"` (rojo). */
3574
+ destructive: boolean;
3575
+ /** Texto del botón secundario. `null` lo oculta. */
3576
+ secondaryLabel: string | null;
3577
+ /** Divisores entre header/body/footer. */
3578
+ dividers: boolean;
3579
+ /** Cerrar al hacer clic en el scrim. */
3580
+ closeOnScrim: boolean;
3581
+ /** Cerrar con Escape. */
3582
+ closeOnEsc: boolean;
3583
+ /** z-index del scrim. */
3584
+ zIndex: number;
3585
+ /** Etiqueta accesible si no hay `title`. */
3586
+ ariaLabel?: string;
3587
+ /** Cierre con el motivo (`onClose` del golden). */
3588
+ readonly closed: EventEmitter<IusModalCloseReason>;
3589
+ /** Clic en el primario de conveniencia (`onPrimary`). */
3590
+ readonly primary: EventEmitter<MouseEvent>;
3591
+ /** Clic en el secundario de conveniencia (`onSecondary`). Si nadie lo escucha, cierra. */
3592
+ readonly secondary: EventEmitter<void>;
3593
+ private overlayRef;
3594
+ private keydownSub;
3595
+ private viewReady;
3596
+ protected get hasHead(): boolean;
3597
+ protected get iconColors(): {
3598
+ bg: string;
3599
+ fg: string;
3600
+ };
3601
+ protected get showSecondary(): boolean;
3602
+ /** Footer de conveniencia sólo si no hay footer libre y hay algo que mostrar. */
3603
+ protected get hasConvenienceFooter(): boolean;
3604
+ ngAfterViewInit(): void;
3605
+ ngOnDestroy(): void;
3606
+ private sync;
3607
+ private attach;
3608
+ private detach;
3609
+ protected onScrimMouseDown(event: MouseEvent): void;
3610
+ protected onCloseClick(): void;
3611
+ protected onPrimary(event: MouseEvent): void;
3612
+ protected onSecondary(): void;
3613
+ private emitClose;
3614
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ModalComponent, never>;
3615
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ModalComponent, "ius-modal", never, { "open": { "alias": "open"; "required": false; }; "size": { "alias": "size"; "required": false; }; "title": { "alias": "title"; "required": false; }; "description": { "alias": "description"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "iconTone": { "alias": "iconTone"; "required": false; }; "showClose": { "alias": "showClose"; "required": false; }; "primaryLabel": { "alias": "primaryLabel"; "required": false; }; "primaryLoading": { "alias": "primaryLoading"; "required": false; }; "primaryDisabled": { "alias": "primaryDisabled"; "required": false; }; "destructive": { "alias": "destructive"; "required": false; }; "secondaryLabel": { "alias": "secondaryLabel"; "required": false; }; "dividers": { "alias": "dividers"; "required": false; }; "closeOnScrim": { "alias": "closeOnScrim"; "required": false; }; "closeOnEsc": { "alias": "closeOnEsc"; "required": false; }; "zIndex": { "alias": "zIndex"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; }, { "closed": "closed"; "primary": "primary"; "secondary": "secondary"; }, ["customFooter"], ["*", "[iusModalFooter]"], true, never>;
3616
+ static ngAcceptInputType_open: unknown;
3617
+ static ngAcceptInputType_showClose: unknown;
3618
+ static ngAcceptInputType_primaryLoading: unknown;
3619
+ static ngAcceptInputType_primaryDisabled: unknown;
3620
+ static ngAcceptInputType_destructive: unknown;
3621
+ static ngAcceptInputType_dividers: unknown;
3622
+ static ngAcceptInputType_closeOnScrim: unknown;
3623
+ static ngAcceptInputType_closeOnEsc: unknown;
3624
+ static ngAcceptInputType_zIndex: unknown;
3625
+ }
3626
+
3627
+ /**
3628
+ * Rol tipográfico → clase de escala (`typography.css`). `body` es alias de
3629
+ * `body-base`. Mapa exacto en VARIANT_CLASS/DEFAULT_TAG.
3630
+ */
3631
+ type IusTextVariant = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'body-lg' | 'emphasis-lg' | 'body-base' | 'emphasis-base' | 'body' | 'caption' | 'body-sm' | 'label' | 'overline';
3632
+ /**
3633
+ * Alias de color de texto → `--ius-text-*`. `danger`→`--ius-text-error`,
3634
+ * `inverse`→`--ius-text-on-primary`.
3635
+ */
3636
+ type IusTextColor = 'primary' | 'secondary' | 'tertiary' | 'disabled' | 'inverse' | 'success' | 'danger' | 'warning' | 'info' | 'link';
3637
+ type IusTextWeight = 'regular' | 'medium' | 'bold';
3638
+ type IusTextAlign = 'left' | 'center' | 'right' | 'justify';
3639
+ /**
3640
+ * Tag polimórfico soportado. Adaptación Angular del `as` (React acepta cualquier
3641
+ * `keyof JSX.IntrinsicElements`; aquí un set finito para elegir el template, tal
3642
+ * como recomienda la ng-spec §3). Cubre los tags del sistema + inline comunes.
3643
+ */
3644
+ type IusTextTag = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'p' | 'span' | 'label' | 'div' | 'strong' | 'em' | 'small';
3645
+ /**
3646
+ * Text — Ius Design v2. Primitiva tipográfica (display-only, sin estado).
3647
+ *
3648
+ * Wrapper delgado sobre la escala de `typography.css`: mapea `variant` → clase y
3649
+ * expone `color / weight / as / align / italic / truncate / tabularNums` con
3650
+ * tokens `--ius-*` (cero valores crudos). Contrato único para todo texto plano.
3651
+ *
3652
+ * El host `ius-text` usa `display: contents`, así que no genera caja propia: el
3653
+ * tag renderizado (h1…h5 / p / span / label…) se comporta como hijo directo.
3654
+ *
3655
+ * Port completo: los 14 variants mapean a su clase real de `typography.css`
3656
+ * (incl. `.ius-label`/`.ius-overline`) y los 10 colores a su token `--ius-text-*`
3657
+ * (incl. `--ius-text-warning`/`--ius-text-info`), sincronizados desde Claude Design.
3658
+ *
3659
+ * Fuente de verdad: `components/data-display/Text/Text.jsx` + `Text.d.ts`
3660
+ * (contrato en `Text.ng-spec.md` §4).
3661
+ */
3662
+ declare class TextComponent {
3663
+ /** Rol tipográfico → clase de escala + tag por defecto. */
3664
+ variant: IusTextVariant;
3665
+ /** Color semántico (alias → `--ius-text-*`). Sin valor: hereda el de la clase. */
3666
+ color?: IusTextColor;
3667
+ /** Peso: override del peso por defecto del variant → `--ius-fw-*`. */
3668
+ weight?: IusTextWeight;
3669
+ /** Tag polimórfico: override del tag semántico por defecto del variant. */
3670
+ as?: IusTextTag;
3671
+ /** Alineación (`text-align`). */
3672
+ align?: IusTextAlign;
3673
+ /** Itálico (clase modificadora en body-base/caption/body-sm; inline en el resto). */
3674
+ italic: boolean;
3675
+ /** Trunca a una línea con elipsis. */
3676
+ truncate: boolean;
3677
+ /** Números tabulares (montos/radicados es-CO). */
3678
+ tabularNums: boolean;
3679
+ /** `for` del `<label>` (sólo aplica cuando el tag renderizado es `label`). */
3680
+ for?: string;
3681
+ /** Tag efectivo (as > default del variant > span). */
3682
+ protected get tag(): IusTextTag;
3683
+ private get variantClass();
3684
+ /** `ius-text` base + clase de escala (+ modificador itálico si aplica). */
3685
+ protected get klass(): string;
3686
+ /** Overrides por token (color/weight/align/italic-inline/tabular/truncate). */
3687
+ protected get styleObject(): Record<string, string>;
3688
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TextComponent, never>;
3689
+ 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>;
3690
+ static ngAcceptInputType_italic: unknown;
3691
+ static ngAcceptInputType_truncate: unknown;
3692
+ static ngAcceptInputType_tabularNums: unknown;
3693
+ }
3694
+
3695
+ /** Degradado base según el fondo. */
3696
+ type IusLoadingMarkSurface = 'light' | 'dark';
3697
+ /**
3698
+ *
3699
+ * Cargador de **identidad** Litigiovirtual: tres fichas se deslizan por el
3700
+ * cuadrado mientras el conjunto gira y un **cometa** de luz cian orbita el
3701
+ * contorno sobre el degradado base navy→cian. Para splash, arranque y esperas
3702
+ * largas donde la marca debe estar presente. Para una espera neutra/compacta
3703
+ * dentro de la UI botón, fila, panel, usar Loading/CircularProgress; este no
3704
+ * lleva etiqueta ni se incrusta en controles.
3705
+ *
3706
+ */
3707
+ declare class LoadingMarkComponent {
3708
+ /** Lado del cuadro en px. */
3709
+ size: number;
3710
+ /** `light` navy sólido (default) · `dark` navy→cian sobre superficie navy. */
3711
+ surface: IusLoadingMarkSurface;
3712
+ /** Congela la animación (figura estática). También respeta reduced-motion. */
3713
+ paused: boolean;
3714
+ /** Etiqueta accesible. */
3715
+ ariaLabel: string;
3716
+ private readonly id;
3717
+ protected readonly baseId: string;
3718
+ protected readonly glowId: string;
3719
+ protected readonly softId: string;
3720
+ protected readonly maskId: string;
3721
+ /** Parada inicial del degradado base (siempre navy). */
3722
+ protected get baseFrom(): string;
3723
+ /** Parada final: navy en `light`; abre a `--ius-primary-600` en `dark`. */
3724
+ protected get baseTo(): string;
3725
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LoadingMarkComponent, never>;
3726
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<LoadingMarkComponent, "ius-loading-mark", never, { "size": { "alias": "size"; "required": false; }; "surface": { "alias": "surface"; "required": false; }; "paused": { "alias": "paused"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; }, {}, never, never, true, never>;
3727
+ static ngAcceptInputType_size: unknown;
3728
+ static ngAcceptInputType_paused: unknown;
3729
+ }
3730
+
3731
+ /** Escala del sistema — small ~34 · medium ~40 (default) · large ~48px. */
3732
+ type IusSegmentedSize = 'small' | 'medium' | 'large';
3733
+ /** `subtle` = pastilla blanca elevada (default) · `solid` = pastilla navy de marca. */
3734
+ type IusSegmentedVariant = 'subtle' | 'solid';
3735
+ /** Opción del control (2–5, cortas, todas visibles). */
3736
+ interface SegmentedOption {
3737
+ /** Valor único (lo que recibe `valueChange`). */
3738
+ value: string;
3739
+ /** Etiqueta visible (omitible en `iconOnly`). */
3740
+ label?: string;
3741
+ /** Ligadura Material Symbols Rounded. */
3742
+ icon?: string;
3743
+ /** Etiqueta accesible cuando `iconOnly` oculta el texto. */
3744
+ ariaLabel?: string;
3745
+ title?: string;
3746
+ /** Deshabilita sólo esta opción. */
3747
+ disabled?: boolean;
3748
+ }
3749
+ /**
3750
+ * SegmentedControl — Ius Design v2.
3751
+ *
3752
+ * Selector **único** de pocas opciones cortas, mutuamente excluyentes y **todas
3753
+ * visibles a la vez** (Mes/Semana/Día, filtros de estado, conmutadores de modo).
3754
+ * Para 0–1 opción → Switch; para muchas/largas → Select; para acciones → Button.
3755
+ *
3756
+ * `role="radiogroup"` + `role="radio"` con `aria-checked`; navegación con
3757
+ * ←/→/↑/↓/Home/End (mueve foco y selección) y roving `tabindex`. Implementa
3758
+ * `ControlValueAccessor` (`string`) y además soporta `[(value)]` directo.
3759
+ *
3760
+ * Fuente de verdad: `components/inputs/SegmentedControl/SegmentedControl.jsx` + `.d.ts`.
3761
+ */
3762
+ declare class SegmentedControlComponent implements ControlValueAccessor {
3763
+ /** Opciones mutuamente excluyentes (2–5 cortas; todas visibles). */
3764
+ options: SegmentedOption[];
3765
+ /** Escala del sistema. */
3766
+ size: IusSegmentedSize;
3767
+ /** Jerarquía visual de la pastilla seleccionada. */
3768
+ variant: IusSegmentedVariant;
3769
+ /** Ocupa todo el ancho, repartiendo las opciones por igual. */
3770
+ fullWidth: boolean;
3771
+ /** Sólo íconos (oculta labels; usa ariaLabel/label como título accesible). */
3772
+ iconOnly: boolean;
3773
+ /** Etiqueta accesible del grupo. */
3774
+ ariaLabel?: string;
3775
+ /** `name` de los radios. */
3776
+ name?: string;
3777
+ private readonly valueState;
3778
+ /** Valor seleccionado (controlado / CVA). */
3779
+ set value(v: string | undefined);
3780
+ get value(): string | undefined;
3781
+ private readonly disabledState;
3782
+ /** Deshabilita todo el control. */
3783
+ set disabled(v: boolean);
3784
+ get disabled(): boolean;
3785
+ /** Cambio de selección (original `onChange`). Habilita `[(value)]`. */
3786
+ readonly valueChange: EventEmitter<string>;
3787
+ protected readonly selected: _angular_core.Signal<string | undefined>;
3788
+ private readonly optRefs;
3789
+ private onChange;
3790
+ private onTouched;
3791
+ writeValue(value: string): void;
3792
+ registerOnChange(fn: (value: string) => void): void;
3793
+ registerOnTouched(fn: () => void): void;
3794
+ setDisabledState(isDisabled: boolean): void;
3795
+ protected isEnabled(o: SegmentedOption): boolean;
3796
+ /** Roving tabindex (espejo del golden: seleccionado, o el primero si no hay valor). */
3797
+ protected tabIndexFor(o: SegmentedOption, index: number): number;
3798
+ private commit;
3799
+ private focusAndSelect;
3800
+ private focusByOffset;
3801
+ protected onOptionClick(o: SegmentedOption): void;
3802
+ protected onKeyDown(event: KeyboardEvent, index: number): void;
3803
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SegmentedControlComponent, never>;
3804
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SegmentedControlComponent, "ius-segmented-control", never, { "options": { "alias": "options"; "required": false; }; "size": { "alias": "size"; "required": false; }; "variant": { "alias": "variant"; "required": false; }; "fullWidth": { "alias": "fullWidth"; "required": false; }; "iconOnly": { "alias": "iconOnly"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; "name": { "alias": "name"; "required": false; }; "value": { "alias": "value"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
3805
+ static ngAcceptInputType_fullWidth: unknown;
3806
+ static ngAcceptInputType_iconOnly: unknown;
3807
+ static ngAcceptInputType_disabled: unknown;
3808
+ }
3809
+
3810
+ /**
3811
+ * Un paso del asistente.
3812
+ *
3813
+ * `content` (que en el golden React es un `ReactNode`) se resuelve en Angular
3814
+ * con un `TemplateRef` por paso (ng-spec §2 / §7): el consumidor declara un
3815
+ * `<ng-template>` por paso y lo pasa aquí.
3816
+ */
3817
+ interface WizardStep {
3818
+ /** Identificador opcional del paso. */
3819
+ key?: string;
3820
+ /** Nombre visible del paso (etiqueta "Paso X de N · label"). */
3821
+ label?: string;
3822
+ /** Contenido del paso (típicamente un formulario), como plantilla. */
3823
+ content?: TemplateRef<unknown> | null;
3824
+ }
3825
+ /** API que devuelve `createWizard(...)` y consumen `<ius-wizard>` y `<ius-wizard-nav>`. */
3826
+ interface WizardApi {
3827
+ /** Pasos del flujo. */
3828
+ readonly steps: WizardStep[];
3829
+ /** Total de pasos. */
3830
+ readonly total: number;
3831
+ /** Paso actual (1-based). Reactivo (signal-backed). */
3832
+ readonly step: number;
3833
+ /** Índice actual (0-based). */
3834
+ readonly index: number;
3835
+ /** Paso actual (`steps[index]`). */
3836
+ readonly current: WizardStep | null;
3837
+ /** `true` en el primer paso. */
3838
+ readonly isFirst: boolean;
3839
+ /** `true` en el último paso. */
3840
+ readonly isLast: boolean;
3841
+ /** Avanza un paso; en el último, dispara `onFinish`. */
3842
+ next(): void;
3843
+ /** Retrocede un paso (no baja de 1). */
3844
+ back(): void;
3845
+ /** Salta a un paso (1-based), o función `(prev) => next`. */
3846
+ goTo(next: number | ((prev: number) => number)): void;
3847
+ }
3848
+ interface UseWizardOptions {
3849
+ /** Pasos del flujo. */
3850
+ steps: WizardStep[];
3851
+ /** Paso inicial (no controlado). Default 1. */
3852
+ defaultStep?: number;
3853
+ /**
3854
+ * Paso inicial controlado (1-based). En el port Angular el estado siempre
3855
+ * vive en el controller (signal); pásalo para sembrar el paso inicial y
3856
+ * observa los cambios con `onStepChange` / fuérzalos con `goTo`.
3857
+ */
3858
+ step?: number;
3859
+ /** Cambio de paso (recibe el nuevo paso 1-based). */
3860
+ onStepChange?: (step: number) => void;
3861
+ /** Se dispara al pulsar "siguiente" en el último paso (cierre del flujo). */
3862
+ onFinish?: () => void;
3863
+ }
3864
+ /**
3865
+ * Controller de estado del Wizard — equivalente Angular del hook `Wizard.use`
3866
+ * de React (ng-spec §2). El paso vive en un `signal` interno, así que leer
3867
+ * `api.step` / `api.current` / `api.isLast` en una plantilla registra la
3868
+ * dependencia y refresca los componentes `OnPush` que consumen la `api`.
3869
+ */
3870
+ declare class WizardController implements WizardApi {
3871
+ readonly steps: WizardStep[];
3872
+ private readonly _step;
3873
+ /** Señal de solo lectura del paso (por si el consumidor la quiere directa). */
3874
+ readonly step$: Signal<number>;
3875
+ private readonly onStepChange?;
3876
+ private readonly onFinish?;
3877
+ constructor(options: UseWizardOptions);
3878
+ get total(): number;
3879
+ get step(): number;
3880
+ get index(): number;
3881
+ get current(): WizardStep | null;
3882
+ get isFirst(): boolean;
3883
+ get isLast(): boolean;
3884
+ goTo: (next: number | ((prev: number) => number)) => void;
3885
+ next: () => void;
3886
+ back: () => void;
3887
+ }
3888
+ /**
3889
+ * `createWizard(options)` — fábrica del estado del asistente (equivalente a
3890
+ * `Wizard.use(...)`). Devuelve la `WizardApi` que leen `<ius-wizard>` y
3891
+ * `<ius-wizard-nav>`.
3892
+ */
3893
+ declare function createWizard(options: UseWizardOptions): WizardApi;
3894
+
3895
+ /**
3896
+ * Wizard (body) — Ius Design v2.
3897
+ *
3898
+ * Cuerpo del asistente: indicador de progreso + etiqueta "Paso X de N · label"
3899
+ * + el contenido del paso activo. **Agnóstico del contenedor** — vive en el
3900
+ * body de un Drawer/Modal o de una página; el footer (`ius-wizard-nav`) lee la
3901
+ * misma `api`. Distinto del `Stepper` (indicador display-only).
3902
+ *
3903
+ * El estado lo gobierna el controller `createWizard(...)` (ver `wizard.ts`),
3904
+ * espejo del hook `Wizard.use` de React (ng-spec §2).
3905
+ *
3906
+ * Nota del port: el indicador por defecto del golden es `LinearProgressBar`
3907
+ * (aún no portado); aquí se inlinea su modo "steps" (`.ius-lpb`, fill/rest)
3908
+ * fiel al golden. Cuando exista `ius-linear-progress-bar`, reemplazar por
3909
+ * composición sin cambiar la API. `indicator` permite pasar un nodo propio.
3910
+ */
3911
+ declare class WizardComponent {
3912
+ /** API de `createWizard(...)`. */
3913
+ api: WizardApi;
3914
+ /** Muestra el indicador de progreso (por defecto la barra "steps"). */
3915
+ showIndicator: boolean;
3916
+ /** Indicador personalizado (reemplaza la barra por defecto). */
3917
+ indicator?: TemplateRef<unknown>;
3918
+ /** Muestra la etiqueta "Paso X de N · label". */
3919
+ showStepLabel: boolean;
3920
+ /** Palabra para "Paso". */
3921
+ stepWord: string;
3922
+ /** Palabra para "de". */
3923
+ ofWord: string;
3924
+ /** Porcentaje del indicador (step/total), espejo del modo stepped del LPB. */
3925
+ protected get percent(): number;
3926
+ protected get ariaNow(): number;
3927
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<WizardComponent, never>;
3928
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WizardComponent, "ius-wizard", never, { "api": { "alias": "api"; "required": true; }; "showIndicator": { "alias": "showIndicator"; "required": false; }; "indicator": { "alias": "indicator"; "required": false; }; "showStepLabel": { "alias": "showStepLabel"; "required": false; }; "stepWord": { "alias": "stepWord"; "required": false; }; "ofWord": { "alias": "ofWord"; "required": false; }; }, {}, never, never, true, never>;
3929
+ static ngAcceptInputType_showIndicator: unknown;
3930
+ static ngAcceptInputType_showStepLabel: unknown;
3931
+ }
3932
+
3933
+ /**
3934
+ * WizardNav (footer) — Ius Design v2.
3935
+ *
3936
+ * Footer de navegación del asistente: **Atrás** (secondary, deshabilitado en el
3937
+ * primero — o `hideBackOnFirst` para ocultarlo) + **Siguiente** (primary, ícono
3938
+ * `arrow_forward`); en el último paso, Siguiente pasa a **Guardar**
3939
+ * (`finishDynamic` activa el modo dynamic loading → success del Button).
3940
+ *
3941
+ * Pensado para el slot `footer` del Drawer/Modal o el footer propio de una
3942
+ * página. Lee la misma `api` que `<ius-wizard>`. Compone `ius-button`.
3943
+ *
3944
+ * El handler final se pasa como `finishAction` (con `finishDynamic` debe
3945
+ * devolver una `Promise` para integrarse con el modo dynamic del Button);
3946
+ * además se emite el output `finish` (ng-spec §4).
3947
+ */
3948
+ declare class WizardNavComponent {
3949
+ /** API de `createWizard(...)`. */
3950
+ api: WizardApi;
3951
+ /** Etiqueta del botón atrás. */
3952
+ backLabel: string;
3953
+ /** Etiqueta del botón siguiente. */
3954
+ nextLabel: string;
3955
+ /** Etiqueta del botón final (último paso). */
3956
+ finishLabel: string;
3957
+ /** Ícono al final del botón siguiente. */
3958
+ nextIcon: string;
3959
+ /** El botón final usa el modo `dynamic` del Button (loading → success). */
3960
+ finishDynamic: boolean;
3961
+ /** Deshabilita "siguiente" (p. ej. validación del paso pendiente). */
3962
+ nextDisabled: boolean;
3963
+ /** Oculta el botón atrás en el primer paso (en vez de deshabilitarlo). */
3964
+ hideBackOnFirst: boolean;
3965
+ /**
3966
+ * Handler del botón final. Con `finishDynamic` debe devolver una `Promise`
3967
+ * (su resolución decide success/error del Button).
3968
+ */
3969
+ finishAction?: () => void | IusButtonActionResult | Promise<IusButtonActionResult | void>;
3970
+ /** Se dispara al pulsar el botón final (original `onFinish`). */
3971
+ readonly finish: EventEmitter<void>;
3972
+ /** `action` para el modo dynamic del Button: emite `finish` y espera el handler. */
3973
+ protected readonly runFinish: () => Promise<IusButtonActionResult | void>;
3974
+ /** Click del botón final en modo NO dynamic. */
3975
+ protected onFinishClick(): void;
3976
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<WizardNavComponent, never>;
3977
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WizardNavComponent, "ius-wizard-nav", never, { "api": { "alias": "api"; "required": true; }; "backLabel": { "alias": "backLabel"; "required": false; }; "nextLabel": { "alias": "nextLabel"; "required": false; }; "finishLabel": { "alias": "finishLabel"; "required": false; }; "nextIcon": { "alias": "nextIcon"; "required": false; }; "finishDynamic": { "alias": "finishDynamic"; "required": false; }; "nextDisabled": { "alias": "nextDisabled"; "required": false; }; "hideBackOnFirst": { "alias": "hideBackOnFirst"; "required": false; }; "finishAction": { "alias": "finishAction"; "required": false; }; }, { "finish": "finish"; }, never, never, true, never>;
3978
+ static ngAcceptInputType_finishDynamic: unknown;
3979
+ static ngAcceptInputType_nextDisabled: unknown;
3980
+ static ngAcceptInputType_hideBackOnFirst: unknown;
3981
+ }
3982
+
3983
+ /** Eje con scroll. */
3984
+ type IusScrollAxis = 'y' | 'x' | 'both';
3985
+ /** Grosor de la barra — `thin` es alias de `small`. */
3986
+ type IusScrollSize = 'small' | 'medium' | 'large' | 'thin';
3987
+ /**
3988
+ * ScrollArea — Ius Design v2.
3989
+ *
3990
+ * Contenedor con scroll **canónico** del sistema: aplica la barra unificada
3991
+ * (utilidad global `.ius-scroll` de `tokens/scrollbar.css`) para que cualquier
3992
+ * área desplazable tenga el mismo thumb pill `neutral-4` (hover `neutral-5`,
3993
+ * track transparente) sin reescribir reglas `::-webkit-scrollbar`. **No** para
3994
+ * el scroll de toda la página (eso lo maneja el documento).
3995
+ *
3996
+ * Nota del port: el `as` polimórfico del golden no aplica — el host es siempre
3997
+ * `<ius-scroll-area>` (`.ius-sa`). El `viewRef` de React se expone como
3998
+ * `getViewport()` (equivalente a un `@ViewChild` del viewport).
3999
+ */
4000
+ declare class ScrollAreaComponent implements AfterViewInit, OnChanges, OnDestroy {
4001
+ /** Eje con scroll. */
4002
+ axis: IusScrollAxis;
4003
+ /** Grosor de barra; `thin` = alias de `small`. */
4004
+ size: IusScrollSize;
4005
+ /** Thumb solo visible en hover/foco (lienzos amplios). */
4006
+ autoHide: boolean;
4007
+ /** Máscara de gradiente en los bordes con scroll disponible. */
4008
+ fade: boolean;
4009
+ /** Límite que dispara el scroll vertical (número → px). */
4010
+ maxHeight?: number | string;
4011
+ /** Límite que dispara el scroll horizontal (número → px). */
4012
+ maxWidth?: number | string;
4013
+ /** Clase(s) extra para el viewport. */
4014
+ viewClassName?: string;
4015
+ /** Reenvía el evento nativo `scroll` del viewport (opcional, ng-spec §3). */
4016
+ readonly scrolled: EventEmitter<Event>;
4017
+ private readonly view;
4018
+ private ro;
4019
+ private readonly onScroll;
4020
+ /** Clases del viewport: base + barra unificada + variante de tamaño/autoHide. */
4021
+ protected get viewClasses(): string;
4022
+ protected get maxHeightCss(): string | null;
4023
+ protected get maxWidthCss(): string | null;
4024
+ private toCss;
4025
+ ngAfterViewInit(): void;
4026
+ ngOnChanges(): void;
4027
+ ngOnDestroy(): void;
4028
+ /** Acceso al viewport (equivalente al `viewRef` del golden). */
4029
+ getViewport(): HTMLElement | null;
4030
+ private updateFade;
4031
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ScrollAreaComponent, never>;
4032
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ScrollAreaComponent, "ius-scroll-area", never, { "axis": { "alias": "axis"; "required": false; }; "size": { "alias": "size"; "required": false; }; "autoHide": { "alias": "autoHide"; "required": false; }; "fade": { "alias": "fade"; "required": false; }; "maxHeight": { "alias": "maxHeight"; "required": false; }; "maxWidth": { "alias": "maxWidth"; "required": false; }; "viewClassName": { "alias": "viewClassName"; "required": false; }; }, { "scrolled": "scrolled"; }, never, ["*"], true, never>;
4033
+ static ngAcceptInputType_autoHide: unknown;
4034
+ static ngAcceptInputType_fade: unknown;
4035
+ }
4036
+
4037
+ /** Tamaño de la fila — heredado del Select. small · medium (default) · large. */
4038
+ type IusOptionItemSize = 'small' | 'medium' | 'large';
4039
+ /**
4040
+ * Estado forzado — **solo demos/especímenes del DS**. En producción usar
4041
+ * `selected`/`multi`/`active`/`disabled`. Sobrescribe la interacción real.
4042
+ */
4043
+ type IusOptionItemState = 'idle' | 'hover' | 'pressed' | 'disabled' | 'selected' | 'selectedVar' | 'selectedHovered';
4044
+ /**
4045
+ * OptionItem — Ius Design.
4046
+ *
4047
+ * Átomo de **fila de opción** dentro del menú (MenuInput) del **Select** (y
4048
+ * SelectNumber, y cualquier lista de opciones del sistema). **No se usa suelto en
4049
+ * formularios** — es la pieza interna que renderiza cada opción. Cubre los 7
4050
+ * estados del especimen Figma: Default · Hovered · Pressed · Disabled · Selected
4051
+ * (multi, check circular al final) · Selected Var (single, relleno azul) ·
4052
+ * Selected Hovered.
4053
+ *
4054
+ * Regla de marca: `multi` + `selected` → check (Selected); single + `selected` →
4055
+ * relleno azul (Selected Var). `active` es el resaltado de navegación por teclado
4056
+ * (mismo fondo que hover) sin marcar la opción como elegida.
4057
+ *
4058
+ * Fuente de verdad: `components/inputs/OptionItem/OptionItem.jsx` + `.d.ts` +
4059
+ * `OptionItem.ng-spec.md`. Todo sale de tokens `--ius-*` (los px 6/11/22 son los
4060
+ * mismos valores crudos que fija el golden para el alto de fila y el disco del
4061
+ * check — excepción documentada por la fuente de verdad).
4062
+ */
4063
+ declare class OptionItemComponent {
4064
+ /** Texto de la opción. Alternativa a la proyección de contenido. */
4065
+ label?: string;
4066
+ /** Ícono Material Symbols a la izquierda (opcional). */
4067
+ icon?: string;
4068
+ /** La opción está elegida. */
4069
+ selected: boolean;
4070
+ /** Selección múltiple: con `selected` → check circular (si no, relleno azul). */
4071
+ multi: boolean;
4072
+ /** Resaltado de navegación por teclado (activa, sin elegir aún). */
4073
+ active: boolean;
4074
+ /** Opción no seleccionable. */
4075
+ disabled: boolean;
4076
+ /** Tamaño de la fila, heredado del Select. */
4077
+ size: IusOptionItemSize;
4078
+ /** Valor de la opción (para `role="option"` / aria). */
4079
+ value?: string | number;
4080
+ /** Estado forzado — **solo demos/especímenes**. */
4081
+ state?: IusOptionItemState;
4082
+ /** Al elegir la opción (original `onSelect`). */
4083
+ readonly selectClicked: EventEmitter<void>;
4084
+ /** ¿Hay un estado forzado activo (demo)? */
4085
+ protected get forced(): boolean;
4086
+ /** ¿La opción se ve como elegida (real o forzada)? */
4087
+ protected get isSelected(): boolean;
4088
+ /** ¿Elegida en modo múltiple (check) vs single (relleno)? */
4089
+ protected get isMultiSel(): boolean;
4090
+ /** Marca de elegido: `check` (multi) o `fill` (single). */
4091
+ protected get variant(): 'check' | 'fill';
4092
+ /** Deshabilitada (real o forzada). */
4093
+ protected get isDisabled(): boolean;
4094
+ /** ¿Mostrar el disco de check al final (solo multi elegido)? */
4095
+ protected get showCheck(): boolean;
4096
+ protected handleClick(): void;
4097
+ protected onMouseDown(event: MouseEvent): void;
4098
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<OptionItemComponent, never>;
4099
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<OptionItemComponent, "ius-option-item", never, { "label": { "alias": "label"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "selected": { "alias": "selected"; "required": false; }; "multi": { "alias": "multi"; "required": false; }; "active": { "alias": "active"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "size": { "alias": "size"; "required": false; }; "value": { "alias": "value"; "required": false; }; "state": { "alias": "state"; "required": false; }; }, { "selectClicked": "selectClicked"; }, never, ["*"], true, never>;
4100
+ static ngAcceptInputType_selected: unknown;
4101
+ static ngAcceptInputType_multi: unknown;
4102
+ static ngAcceptInputType_active: unknown;
4103
+ static ngAcceptInputType_disabled: unknown;
4104
+ }
4105
+
4106
+ /** Tamaño del chip — small ~24 · medium ~28 (default) · large ~32px (alineado a inputs). */
4107
+ type IusChipSize = 'small' | 'medium' | 'large';
4108
+ /** Estado forzado — **solo demos/especímenes del DS**. Sobrescribe la interacción real. */
4109
+ type IusChipState = 'idle' | 'hover' | 'disabled';
4110
+ /**
4111
+ * Chip — Ius Design.
4112
+ *
4113
+ * Etiqueta compacta tipo "pill" que representa un valor seleccionado. Dos modos:
4114
+ * - **Eliminable** (`removable`): relleno azul + botón × circular. Para inputs y
4115
+ * formularios (lo usan Select / CascaderSelect en multiselección) — cada chip es
4116
+ * un valor elegido que el usuario puede quitar.
4117
+ * - **No eliminable** (default): blanco con borde. Para vistas de solo lectura /
4118
+ * display.
4119
+ *
4120
+ * Tres estados (Default · Hovered · Disabled) y tres tamaños. Admite un ícono a la
4121
+ * izquierda. **No** es interactivo (no clickable/toggle) ni maneja color de estado
4122
+ * → para eso usar **Tag**.
4123
+ *
4124
+ * Fuente de verdad: `components/data-display/Chip/Chip.jsx` + `.d.ts` + ng-spec.
4125
+ * Todo sale de tokens `--ius-*`; los px de la pill (3/4/5 py, 8/10/12 px, 16/18/20
4126
+ * de la ×) son los valores que fija el golden para el alto por tamaño (excepción
4127
+ * documentada por la fuente de verdad).
4128
+ */
4129
+ declare class ChipComponent {
4130
+ /** Texto del chip. Alternativa a la proyección de contenido. */
4131
+ label?: string;
4132
+ /** Ícono Material Symbols a la izquierda (opcional). */
4133
+ icon?: string;
4134
+ /** Muestra el botón × y habilita quitar el chip (relleno azul). */
4135
+ removable: boolean;
4136
+ /** Tamaño de la pill. */
4137
+ size: IusChipSize;
4138
+ /** Deshabilitado (atenuado, × no funcional). */
4139
+ disabled: boolean;
4140
+ /** Estado forzado — **solo demos/especímenes**. */
4141
+ state?: IusChipState;
4142
+ /** aria-label del botón quitar. */
4143
+ removeLabel: string;
4144
+ /** Al pulsar la × (original `onRemove`). */
4145
+ readonly removed: EventEmitter<void>;
4146
+ /** Deshabilitado (real o forzado). */
4147
+ protected get isDisabled(): boolean;
4148
+ /** `data-state` solo cuando hay un estado forzado (≠ idle). */
4149
+ protected get forcedState(): IusChipState | null;
4150
+ protected handleRemove(event: MouseEvent): void;
4151
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ChipComponent, never>;
4152
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ChipComponent, "ius-chip", never, { "label": { "alias": "label"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "removable": { "alias": "removable"; "required": false; }; "size": { "alias": "size"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "state": { "alias": "state"; "required": false; }; "removeLabel": { "alias": "removeLabel"; "required": false; }; }, { "removed": "removed"; }, never, ["*"], true, never>;
4153
+ static ngAcceptInputType_removable: unknown;
4154
+ static ngAcceptInputType_disabled: unknown;
4155
+ }
4156
+
4157
+ type IusFlexDirection = 'row' | 'column';
4158
+ type IusFlexGap = 'none' | 'xxs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl';
4159
+ type IusFlexAlign = 'start' | 'center' | 'end' | 'stretch' | 'baseline';
4160
+ type IusFlexJustify = 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly';
4161
+ /**
4162
+ * Flex — primitivo de maquetación (ng-spec components/layout/Flex).
4163
+ *
4164
+ * Contenedor flexbox cuyo `gap` está RESTRINGIDO a la escala --ius-space-*
4165
+ * (no existe gap numérico libre: esa restricción es el punto del componente).
4166
+ * Reemplaza el `<div style="display:flex; gap:…">` a mano.
4167
+ *
4168
+ * Sin estilos propios: todas las reglas viven en la librería de estilos
4169
+ * (tokens.css › sección layout.css, clases .ius-flex + data-attrs) — este
4170
+ * componente es azúcar que emite la clase y los atributos.
4171
+ *
4172
+ * El `as` de la spec se resuelve con el selector de ATRIBUTO, sin nodo extra:
4173
+ * <nav ius-flex gap="sm">…</nav> · <ul ius-flex direction="column">…</ul>
4174
+ * La forma de elemento también es válida: <ius-flex gap="lg">…</ius-flex>.
4175
+ *
4176
+ * Solo estructura: no aporta cáscara de página (AppLayout), superficie (Card)
4177
+ * ni tipografía (Text). Sin outputs, sin estado, sin user-select.
4178
+ */
4179
+ declare class FlexComponent {
4180
+ /** Eje principal; 'column' = patrón stack. Solo emite data-dir en column. */
4181
+ direction: IusFlexDirection;
4182
+ /** Separación entre hijos — SOLO escala --ius-space-*. */
4183
+ gap: IusFlexGap;
4184
+ /** align-items; sin valor no se emite (default del navegador: stretch). */
4185
+ align?: IusFlexAlign;
4186
+ /** justify-content; sin valor no se emite (default: flex-start). */
4187
+ justify?: IusFlexJustify;
4188
+ /** flex-wrap: wrap (patrón cluster). */
4189
+ wrap: boolean;
4190
+ /** inline-flex en vez de flex (grupos que fluyen dentro de texto). */
4191
+ inline: boolean;
4192
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FlexComponent, never>;
4193
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlexComponent, "ius-flex, [ius-flex]", never, { "direction": { "alias": "direction"; "required": false; }; "gap": { "alias": "gap"; "required": false; }; "align": { "alias": "align"; "required": false; }; "justify": { "alias": "justify"; "required": false; }; "wrap": { "alias": "wrap"; "required": false; }; "inline": { "alias": "inline"; "required": false; }; }, {}, never, ["*"], true, never>;
4194
+ }
4195
+
4196
+ type IusDividerOrientation = 'horizontal' | 'vertical';
4197
+ type IusDividerVariant = 'solid' | 'dashed';
4198
+ type IusDividerTextAlign = 'start' | 'center' | 'end';
4199
+ /**
4200
+ * Divider — separador NEUTRO (ng-spec components/data-display/Divider).
4201
+ * Línea fina 1px --ius-neutral-3, horizontal (con etiqueta opcional proyectada)
4202
+ * o vertical (rellena el alto del contenedor). Para separadores con tono
4203
+ * semántico → Alert o borde propio. Sin outputs.
4204
+ *
4205
+ * Etiqueta: contenido proyectado (solo horizontal). textAlign mueve el trazo
4206
+ * corto (stub) al lado del título, como el golden.
4207
+ */
4208
+ declare class DividerComponent implements AfterViewInit {
4209
+ /** Eje; vertical rellena el alto del contenedor (sin etiqueta). */
4210
+ orientation: IusDividerOrientation;
4211
+ /** dashed = separación suave. */
4212
+ variant: IusDividerVariant;
4213
+ /** Alineación de la etiqueta (solo horizontal con etiqueta). */
4214
+ textAlign: IusDividerTextAlign;
4215
+ private labelWrap;
4216
+ protected readonly hasLabel: _angular_core.WritableSignal<boolean>;
4217
+ ngAfterViewInit(): void;
4218
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DividerComponent, never>;
4219
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DividerComponent, "ius-divider", never, { "orientation": { "alias": "orientation"; "required": false; }; "variant": { "alias": "variant"; "required": false; }; "textAlign": { "alias": "textAlign"; "required": false; }; }, {}, never, ["*"], true, never>;
2646
4220
  }
4221
+
4222
+ /** Tratamiento del indicador: punto de color · píldora tonal · píldora neutra. */
4223
+ type IusInsigniaVariant = 'dot' | 'count' | 'count-soft';
4224
+ /** Familia de color: 6 semánticas + 6 frutas categóricas. */
4225
+ type IusInsigniaTone = 'primary' | 'info' | 'success' | 'warning' | 'danger' | 'neutral' | 'durazno' | 'banano' | 'sandia' | 'arandano' | 'uva' | 'aguacate';
4226
+ /** Tamaño. */
4227
+ type IusInsigniaSize = 'small' | 'medium' | 'large';
2647
4228
  /**
2648
- * Controller de estado del Wizard equivalente Angular del hook `Wizard.use`
2649
- * de React (ng-spec §2). El paso vive en un `signal` interno, así que leer
2650
- * `api.step` / `api.current` / `api.isLast` en una plantilla registra la
2651
- * dependencia y refresca los componentes `OnPush` que consumen la `api`.
4229
+ * InsigniaIus Design v2 (familia feedback).
4230
+ *
4231
+ * Indicador atómico de estado o actividad: punto de color (`dot`) o píldora de
4232
+ * contador (`count` tonal · `count-soft` suave), con `label` opcional al lado.
4233
+ * Display puro — sin outputs. Fuente de verdad: `Insignia.jsx` + `Insignia.d.ts`
4234
+ * + `Insignia.ng-spec.md`.
4235
+ *
4236
+ * Para etiqueta con texto contenedor → Tag; para token removible en un campo →
4237
+ * Chip. La consume MenuItem (badge) y la barra de navegación.
2652
4238
  */
2653
- declare class WizardController implements WizardApi {
2654
- readonly steps: WizardStep[];
2655
- private readonly _step;
2656
- /** Señal de solo lectura del paso (por si el consumidor la quiere directa). */
2657
- readonly step$: Signal<number>;
2658
- private readonly onStepChange?;
2659
- private readonly onFinish?;
2660
- constructor(options: UseWizardOptions);
2661
- get total(): number;
2662
- get step(): number;
2663
- get index(): number;
2664
- get current(): WizardStep | null;
2665
- get isFirst(): boolean;
2666
- get isLast(): boolean;
2667
- goTo: (next: number | ((prev: number) => number)) => void;
2668
- next: () => void;
2669
- back: () => void;
4239
+ declare class InsigniaComponent {
4240
+ /** Punto de color · píldora tonal · píldora neutra. */
4241
+ readonly variant: _angular_core.InputSignal<IusInsigniaVariant>;
4242
+ /** Familia de color. */
4243
+ readonly tone: _angular_core.InputSignal<IusInsigniaTone>;
4244
+ /** Tamaño. */
4245
+ readonly size: _angular_core.InputSignal<IusInsigniaSize>;
4246
+ /** Texto junto al indicador (alternativa a proyectar contenido). */
4247
+ readonly label: _angular_core.InputSignal<string | number | undefined>;
4248
+ /** Valor del contador (variantes `count` / `count-soft`). */
4249
+ readonly count: _angular_core.InputSignal<string | number | undefined>;
4250
+ /** Tope antes de mostrar `N+`. */
4251
+ readonly max: _angular_core.InputSignalWithTransform<number, unknown>;
4252
+ /** Halo suave alrededor del punto (solo `dot`). */
4253
+ readonly ring: _angular_core.InputSignalWithTransform<boolean, unknown>;
4254
+ /** Recomendada cuando no hay `label`. */
4255
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
4256
+ /** `count`/`count-soft` renderizan píldora; `dot` renderiza punto. */
4257
+ protected readonly isCount: _angular_core.Signal<boolean>;
4258
+ /** El halo es exclusivo del punto (el golden lo ignora en las píldoras). */
4259
+ protected readonly showRing: _angular_core.Signal<boolean>;
4260
+ /** `count > max` → `${max}+`; los valores string pasan tal cual. */
4261
+ protected readonly displayCount: _angular_core.Signal<string | number | undefined>;
4262
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<InsigniaComponent, never>;
4263
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<InsigniaComponent, "ius-insignia", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "count": { "alias": "count"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "ring": { "alias": "ring"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
4264
+ }
4265
+
4266
+ /** Contexto de uso: fila de overlay (neutral) · fila del NavRail (verde marca). */
4267
+ type IusMenuItemVariant = 'menu' | 'rail';
4268
+ /** Tamaño de la fila. */
4269
+ type IusMenuItemSize = 'small' | 'medium' | 'large';
4270
+ /** Estado forzado — **solo demos/especímenes del DS**. */
4271
+ type IusMenuItemState = 'hover' | 'pressed';
4272
+ /**
4273
+ * Marca contenido libre al final de la fila (chevron, valor, atajo):
4274
+ * `<ius-menu-item><span iusMenuItemTrailing>⌘K</span></ius-menu-item>`.
4275
+ */
4276
+ declare class IusMenuItemTrailingDirective {
4277
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<IusMenuItemTrailingDirective, never>;
4278
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<IusMenuItemTrailingDirective, "[iusMenuItemTrailing]", never, {}, {}, never, never, true, never>;
2670
4279
  }
2671
4280
  /**
2672
- * `createWizard(options)`fábrica del estado del asistente (equivalente a
2673
- * `Wizard.use(...)`). Devuelve la `WizardApi` que leen `<ius-wizard>` y
2674
- * `<ius-wizard-nav>`.
4281
+ * MenuItemIus Design v2 (familia navigation).
4282
+ *
4283
+ * Fila de acción o navegación: ícono + etiqueta + badge/trailing. Unidad
4284
+ * compartida por la superficie **Menu** (overlays) y el **NavRail**:
4285
+ * `variant="menu"` es neutral; `variant="rail"` lleva el ícono verde de marca y
4286
+ * el pressed verde sólido sobre blanco (firma del rail). `danger` (rojo) solo
4287
+ * aplica a `menu` — el caso canónico es «Cerrar sesión».
4288
+ *
4289
+ * Con `href` renderiza `<a>`; si no, `<button type="button">`. Por eso el host
4290
+ * es `display: contents`: el elemento real de la fila (y por tanto el foco, el
4291
+ * `:hover` y la semántica) es el `<a>`/`<button>` interno, tal como el golden.
4292
+ *
4293
+ * Fuente de verdad: `MenuItem.jsx` + `MenuItem.d.ts` + `MenuItem.ng-spec.md`.
4294
+ * Compone Insignia para el badge. Para botón con texto → Button; píldora de
4295
+ * valor → Tag/Chip.
2675
4296
  */
2676
- declare function createWizard(options: UseWizardOptions): WizardApi;
4297
+ declare class MenuItemComponent {
4298
+ /** Ícono Material Symbols a la izquierda. */
4299
+ readonly icon: _angular_core.InputSignal<string | undefined>;
4300
+ /** Texto de la fila (alternativa a proyectar contenido). */
4301
+ readonly label: _angular_core.InputSignal<string | undefined>;
4302
+ /** `number` → Insignia contador; `true` → punto; `null`/`false` → sin badge. */
4303
+ readonly badge: _angular_core.InputSignal<number | boolean | null | undefined>;
4304
+ /** Contexto de uso (menu neutral · rail verde marca). */
4305
+ readonly variant: _angular_core.InputSignal<IusMenuItemVariant>;
4306
+ /** Tamaño de la fila. */
4307
+ readonly size: _angular_core.InputSignal<IusMenuItemSize>;
4308
+ /** Fondo persistente + `aria-current`. */
4309
+ readonly selected: _angular_core.InputSignalWithTransform<boolean, unknown>;
4310
+ /** Fila inerte. */
4311
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
4312
+ /** Acción destructiva (rojo). Solo `variant="menu"`. */
4313
+ readonly danger: _angular_core.InputSignalWithTransform<boolean, unknown>;
4314
+ /** Estado forzado — **solo demos**. */
4315
+ readonly state: _angular_core.InputSignal<IusMenuItemState | undefined>;
4316
+ /** Renderiza la fila como `<a href>`. */
4317
+ readonly href: _angular_core.InputSignal<string | undefined>;
4318
+ /** Etiqueta accesible cuando el texto no basta. */
4319
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
4320
+ /** Rol ARIA del elemento de fila — Menu lo fija en `menuitem`. */
4321
+ readonly itemRole: _angular_core.InputSignal<string | undefined>;
4322
+ /** Al activar la fila (espejo de `onClick`). */
4323
+ readonly clicked: _angular_core.OutputEmitterRef<MouseEvent>;
4324
+ protected readonly trailingRef: _angular_core.Signal<IusMenuItemTrailingDirective | undefined>;
4325
+ /** El `<a>` solo se usa si hay `href` y la fila no está deshabilitada. */
4326
+ protected readonly isLink: _angular_core.Signal<boolean>;
4327
+ /** `null`/`undefined`/`false` = sin badge (el 0 sí se muestra, como el golden). */
4328
+ protected readonly hasBadge: _angular_core.Signal<boolean>;
4329
+ /** `true` → punto; número → píldora de contador. */
4330
+ protected readonly badgeVariant: _angular_core.Signal<IusInsigniaVariant>;
4331
+ /** El punto del rail es informativo (azul); en menu avisa (rojo). */
4332
+ protected readonly badgeTone: _angular_core.Signal<IusInsigniaTone>;
4333
+ /** Valor del contador (solo cuando el badge es numérico). */
4334
+ protected readonly badgeCount: _angular_core.Signal<number | undefined>;
4335
+ protected onClick(event: MouseEvent): void;
4336
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MenuItemComponent, never>;
4337
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MenuItemComponent, "ius-menu-item", never, { "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "badge": { "alias": "badge"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "danger": { "alias": "danger"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "href": { "alias": "href"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "itemRole": { "alias": "itemRole"; "required": false; "isSignal": true; }; }, { "clicked": "clicked"; }, ["trailingRef"], ["*", "[iusMenuItemTrailing]"], true, never>;
4338
+ }
2677
4339
 
4340
+ /** Escala de la barra — small ~34 · medium ~40 (default) · large ~48px. */
4341
+ type IusSearchBarSize = 'small' | 'medium' | 'large';
4342
+ /** Estado forzado — **solo demos/especímenes**. En producción usar `disabled`. */
4343
+ type IusSearchBarState = 'hover' | 'focused' | 'disabled';
2678
4344
  /**
2679
- * Wizard (body) — Ius Design v2.
4345
+ * SearchBar — Ius Design v2.
2680
4346
  *
2681
- * Cuerpo del asistente: indicador de progreso + etiqueta "Paso X de N · label"
2682
- * + el contenido del paso activo. **Agnóstico del contenedor** vive en el
2683
- * body de un Drawer/Modal o de una página; el footer (`ius-wizard-nav`) lee la
2684
- * misma `api`. Distinto del `Stepper` (indicador display-only).
4347
+ * Barra de **búsqueda** (filtrado de tablas, listas y resultados: proceso,
4348
+ * radicado, deudor). Compone: `input[type=search]` + botón circular de limpiar
4349
+ * (slot reservado) + botón de lupa. Tratamiento de color poco intrusivo:
4350
+ * vacía = relleno gris discreto · con criterio = blanco + borde hairline ·
4351
+ * foco = blanco + borde de marca + lupa azul · disabled = gris atenuado.
2685
4352
  *
2686
- * El estado lo gobierna el controller `createWizard(...)` (ver `wizard.ts`),
2687
- * espejo del hook `Wizard.use` de React (ng-spec §2).
4353
+ * **Cuándo NO usarlo:** como campo de formulario con label/validación (eso es
4354
+ * `ius-text-field`), para elegir de una lista cerrada (`ius-select`) o para
4355
+ * filtros estructurados por chips (FilterBar).
2688
4356
  *
2689
- * Nota del port: el indicador por defecto del golden es `LinearProgressBar`
2690
- * (aún no portado); aquí se inlinea su modo "steps" (`.ius-lpb`, fill/rest)
2691
- * fiel al golden. Cuando exista `ius-linear-progress-bar`, reemplazar por
2692
- * composición sin cambiar la API. `indicator` permite pasar un nodo propio.
4357
+ * Implementa `ControlValueAccessor` completo (`string`) para `[(ngModel)]` /
4358
+ * `formControl`, y además soporta `[(value)]`.
4359
+ *
4360
+ * Fuente de verdad: `components/inputs/SearchBar/SearchBar.jsx` + `.d.ts` +
4361
+ * `SearchBar.ng-spec.md` + `searchbar.card.html` / `playground.card.html`.
4362
+ *
4363
+ * ── Notas del port a Angular ─────────────────────────────────────────────
4364
+ * - `.ius-sb` (raíz del golden) **es el host**: no hay div envolvente, porque
4365
+ * uno rompería `:focus-within` y el `role="search"` del contenedor real.
4366
+ * - El botón de limpiar **nunca sale del flujo**: solo alterna `visibility` +
4367
+ * `pointer-events` (`.ius-sb__clear--hidden`), así aparecer/desaparecer no
4368
+ * desplaza el input ni la lupa (geometría estable).
4369
+ * - `blur` → `onTouched()` es un añadido del port (el golden React no tiene
4370
+ * `onBlur`); lo exige el `ControlValueAccessor`.
4371
+ * - Limpiar emite `valueChange('')` además de `cleared` (el golden solo llama
4372
+ * `onClear`): el CVA obliga a propagar el valor nuevo al modelo. Mismo
4373
+ * criterio que `ius-text-field`.
4374
+ *
4375
+ * ── Divergencias doc vs golden (manda el golden; para diseño) ────────────
4376
+ * - `searchbar.card.html` §06 lista `--ius-radius-md (8px)` como radio de la
4377
+ * barra, pero el CSS golden usa `var(--ius-radius-lg)` (14px). Se porta el
4378
+ * golden.
4379
+ * - `SearchBar.prompt.md` y §06 anuncian **anillo de foco** (`--ius-focus-ring`)
4380
+ * en la barra enfocada; el CSS golden lo niega explícitamente
4381
+ * ("sin sombra exterior") y solo aplica el anillo al `:focus-visible` de los
4382
+ * botones internos. Se porta el golden.
4383
+ * - §02 "Anatomía" numera la lupa como pieza 1 (sugiere lupa a la izquierda),
4384
+ * pero el golden renderiza `input → limpiar → lupa`, así que la lupa queda a
4385
+ * la **derecha**. Se porta el golden.
2693
4386
  */
2694
- declare class WizardComponent {
2695
- /** API de `createWizard(...)`. */
2696
- api: WizardApi;
2697
- /** Muestra el indicador de progreso (por defecto la barra "steps"). */
2698
- showIndicator: boolean;
2699
- /** Indicador personalizado (reemplaza la barra por defecto). */
2700
- indicator?: TemplateRef<unknown>;
2701
- /** Muestra la etiqueta "Paso X de N · label". */
2702
- showStepLabel: boolean;
2703
- /** Palabra para "Paso". */
2704
- stepWord: string;
2705
- /** Palabra para "de". */
2706
- ofWord: string;
2707
- /** Porcentaje del indicador (step/total), espejo del modo stepped del LPB. */
2708
- protected get percent(): number;
2709
- protected get ariaNow(): number;
2710
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<WizardComponent, never>;
2711
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WizardComponent, "ius-wizard", never, { "api": { "alias": "api"; "required": true; }; "showIndicator": { "alias": "showIndicator"; "required": false; }; "indicator": { "alias": "indicator"; "required": false; }; "showStepLabel": { "alias": "showStepLabel"; "required": false; }; "stepWord": { "alias": "stepWord"; "required": false; }; "ofWord": { "alias": "ofWord"; "required": false; }; }, {}, never, never, true, never>;
2712
- static ngAcceptInputType_showIndicator: unknown;
2713
- static ngAcceptInputType_showStepLabel: unknown;
4387
+ declare class SearchBarComponent implements ControlValueAccessor {
4388
+ private readonly valueState;
4389
+ /** Marca si el consumidor ató el valor (input `value`, `[(value)]` o CVA). */
4390
+ private readonly boundValue;
4391
+ /** Criterio de búsqueda (controlado). Habilita `[(value)]`. */
4392
+ set value(value: string | null | undefined);
4393
+ get value(): string;
4394
+ /** Criterio inicial (no controlado). Equivale a `defaultValue` del golden. */
4395
+ set defaultValue(value: string | null | undefined);
4396
+ private readonly sizeState;
4397
+ /** Escala de la barra. Sin valor explícito hereda `--ius-control-size`. */
4398
+ set size(value: IusSearchBarSize);
4399
+ get size(): IusSearchBarSize;
4400
+ /** `disabled` recibido como input del template. */
4401
+ private readonly disabledInput;
4402
+ /** `disabled` impuesto por el formulario (`setDisabledState`). */
4403
+ private readonly disabledByForm;
4404
+ /**
4405
+ * Estado deshabilitado. El efectivo es
4406
+ * `input || setDisabledState() || state === 'disabled'`, así una fuente no
4407
+ * pisa a la otra (un `[disabled]="false"` no reactiva un control que el
4408
+ * formulario deshabilitó, ni al revés).
4409
+ */
4410
+ set disabled(value: boolean);
4411
+ get disabled(): boolean;
4412
+ /** Estado visual forzado — **solo demos/especímenes** del DS. */
4413
+ protected readonly stateInput: _angular_core.WritableSignal<IusSearchBarState | undefined>;
4414
+ /**
4415
+ * Fuerza un estado visual (`hover` · `focused` · `disabled`).
4416
+ * **Solo demos/especímenes**: en producción usa `disabled` y deja que el
4417
+ * navegador resuelva hover/foco. Con `hover`/`focused`, la barra vacía y
4418
+ * *sin* valor atado, el golden pinta un criterio de relleno para que se vea
4419
+ * el círculo de limpiar (ver `IUS_SB_DEMO_VALUE`).
4420
+ */
4421
+ set state(value: IusSearchBarState | undefined);
4422
+ get state(): IusSearchBarState | undefined;
4423
+ /** Texto guía dentro del input. Di qué se puede buscar. */
4424
+ placeholder: string;
4425
+ /** Etiqueta accesible del input. */
4426
+ ariaLabel: string;
4427
+ /** `name` del input nativo. */
4428
+ name?: string;
4429
+ /** `id` del input nativo. Si se omite se genera uno estable. */
4430
+ id?: string;
4431
+ /** Cambio de criterio en cada tecla (original `onChange`). Habilita `[(value)]`. */
4432
+ readonly valueChange: EventEmitter<string>;
4433
+ /**
4434
+ * Disparo de búsqueda: Enter o clic en la lupa (original `onSearch`).
4435
+ *
4436
+ * Nota: `input[type=search]` tiene un evento DOM nativo homónimo, pero al
4437
+ * declararse como `@Output` Angular enlaza **solo** este emisor en
4438
+ * `(search)` (no añade listener de DOM), así que no hay doble disparo.
4439
+ */
4440
+ readonly search: EventEmitter<string>;
4441
+ /** Al limpiar con el botón circular (original `onClear`). */
4442
+ readonly cleared: EventEmitter<void>;
4443
+ private readonly inputRef;
4444
+ private readonly autoId;
4445
+ /** Estado forzado que el golden considera "con criterio" (demos). */
4446
+ private readonly demoFilled;
4447
+ /** Disabled efectivo (input + formulario + estado forzado de demo). */
4448
+ protected readonly isDisabled: _angular_core.Signal<boolean>;
4449
+ /** ¿Hay criterio? Gobierna `data-filled` y la visibilidad del círculo ×. */
4450
+ protected readonly filled: _angular_core.Signal<boolean>;
4451
+ /** Valor que se pinta en el input (solo difiere del real en demos). */
4452
+ protected readonly displayValue: _angular_core.Signal<string>;
4453
+ protected get inputId(): string;
4454
+ private onChangeFn;
4455
+ private onTouchedFn;
4456
+ writeValue(value: string): void;
4457
+ registerOnChange(fn: (value: string) => void): void;
4458
+ registerOnTouched(fn: () => void): void;
4459
+ setDisabledState(isDisabled: boolean): void;
4460
+ protected onInput(event: Event): void;
4461
+ protected onBlur(): void;
4462
+ /** Enter en el input o clic en la lupa. */
4463
+ protected triggerSearch(): void;
4464
+ /** Botón circular ×: limpia, notifica y devuelve el foco al input. */
4465
+ protected clear(): void;
4466
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SearchBarComponent, never>;
4467
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SearchBarComponent, "ius-search-bar", never, { "value": { "alias": "value"; "required": false; }; "defaultValue": { "alias": "defaultValue"; "required": false; }; "size": { "alias": "size"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "state": { "alias": "state"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; "name": { "alias": "name"; "required": false; }; "id": { "alias": "id"; "required": false; }; }, { "valueChange": "valueChange"; "search": "search"; "cleared": "cleared"; }, never, never, true, never>;
4468
+ static ngAcceptInputType_disabled: unknown;
2714
4469
  }
2715
4470
 
4471
+ /** Tamaño del campo — small · medium (default) · large. */
4472
+ type IusTextAreaSize = 'small' | 'medium' | 'large';
4473
+ /** Estado forzado visualmente — solo demos / especímenes. */
4474
+ type IusTextAreaState = 'hover' | 'focused' | 'error' | 'disabled';
2716
4475
  /**
2717
- * WizardNav (footer) — Ius Design v2.
4476
+ * TextArea — Ius Design v2 (familia inputs).
2718
4477
  *
2719
- * Footer de navegación del asistente: **Atrás** (secondary, deshabilitado en el
2720
- * primero o `hideBackOnFirst` para ocultarlo) + **Siguiente** (primary, ícono
2721
- * `arrow_forward`); en el último paso, Siguiente pasa a **Guardar**
2722
- * (`finishDynamic` activa el modo dynamic loading success del Button).
4478
+ * Variante **multilínea** de TextField para texto largo de redacción libre
4479
+ * (notas de impulso, observaciones de audiencia, descripciones, comentarios).
4480
+ * Reusa el wrapper `.ius-tf` (label + required + iconHelp + 5 estados + `size`
4481
+ * + helpText/errorText) y **crece con el contenido** desde `rows` hasta
4482
+ * `maxRows`, tras lo cual hace scroll interno. Implementa
4483
+ * `ControlValueAccessor` completo (`[(ngModel)]` / `formControl`) con `string`
4484
+ * como valor.
2723
4485
  *
2724
- * Pensado para el slot `footer` del Drawer/Modal o el footer propio de una
2725
- * página. Lee la misma `api` que `<ius-wizard>`. Compone `ius-button`.
4486
+ * Compone `ius-popover` para la pastilla «?» (`showIconHelp`), igual que
4487
+ * TextField.
2726
4488
  *
2727
- * El handler final se pasa como `finishAction` (con `finishDynamic` debe
2728
- * devolver una `Promise` para integrarse con el modo dynamic del Button);
2729
- * además se emite el output `finish` (ng-spec §4).
4489
+ * **Cuándo NO usarlo**: una sola línea `ius-text-field`; datos segmentados
4490
+ * `ius-multi-text-field`; códigos OTP `ius-code-field`.
4491
+ *
4492
+ * Fuente de verdad: `components/inputs/TextArea/TextArea.jsx` + `TextArea.d.ts`
4493
+ * (delta sobre `TextField.ng-spec.md`) del proyecto Claude Design.
4494
+ *
4495
+ * ---
4496
+ * **Divergencias doc-vs-golden** (manda el `.jsx` golden; quedan anotadas para
4497
+ * que diseño las resuelva):
4498
+ *
4499
+ * 1. **Scrollbar.** `TextArea.ng-spec.md` dice «luego scroll interno con
4500
+ * `.ius-scroll`»; el CSS golden **no** usa `.ius-scroll`: pinta su propio
4501
+ * scrollbar en el `<textarea>` (`::-webkit-scrollbar` de 6px, pulgar
4502
+ * `--ius-neutral-5` con radio pill, `scrollbar-width: thin`). Se portó el
4503
+ * golden.
4504
+ * 2. **`resizable`.** El `.d.ts` y el `.prompt.md` hablan del «control nativo
4505
+ * de arrastre (esquina inferior derecha)»; el golden desactiva el grip
4506
+ * nativo (`resize: none`) y dibuja una **manija propia** `.ius-tf__resize`
4507
+ * (ícono `drag_handle` rotado −45°, arrastre por pointer events, solo
4508
+ * vertical). Se portó el golden.
4509
+ * 3. **Tokens.** El panel «Tokens que consume» de `textarea.card.html` cita
4510
+ * `--ius-neutral-white` y `--ius-stroke` para fondo/borde; el CSS golden
4511
+ * hereda de `.ius-tf`: fondo `--ius-neutral-2` y borde `transparent` en
4512
+ * reposo. Se portó el golden.
4513
+ * 4. **`id` / `className` / `style`** del `.d.ts` no se exponen: el host ya es
4514
+ * el elemento estilable y el `id` del `<textarea>` se genera para enlazar el
4515
+ * `<label for>` (mismo criterio que `ius-text-field`).
4516
+ *
4517
+ * Nota de implementación: las clases `.ius-tf__*` (label/help/hint/field) se
4518
+ * **replican** en este SCSS porque bajo `ViewEncapsulation.Emulated` las de
4519
+ * TextField no alcanzan a otro componente — mismo precedente que
4520
+ * `ius-multi-text-field` y `ius-code-field`.
2730
4521
  */
2731
- declare class WizardNavComponent {
2732
- /** API de `createWizard(...)`. */
2733
- api: WizardApi;
2734
- /** Etiqueta del botón atrás. */
2735
- backLabel: string;
2736
- /** Etiqueta del botón siguiente. */
2737
- nextLabel: string;
2738
- /** Etiqueta del botón final (último paso). */
2739
- finishLabel: string;
2740
- /** Ícono al final del botón siguiente. */
2741
- nextIcon: string;
2742
- /** El botón final usa el modo `dynamic` del Button (loading → success). */
2743
- finishDynamic: boolean;
2744
- /** Deshabilita "siguiente" (p. ej. validación del paso pendiente). */
2745
- nextDisabled: boolean;
2746
- /** Oculta el botón atrás en el primer paso (en vez de deshabilitarlo). */
2747
- hideBackOnFirst: boolean;
4522
+ declare class TextAreaComponent implements ControlValueAccessor {
4523
+ private readonly zone;
4524
+ /** Label sobre el campo (se pinta con `:` final). Sin label si se omite. */
4525
+ label?: string;
4526
+ /** Placeholder dentro del área de texto. */
4527
+ placeholder?: string;
4528
+ /** Punto rojo (•) a la izquierda del label. */
4529
+ required: boolean;
4530
+ /** Línea de ayuda bajo el campo (estado normal). */
4531
+ helpText?: string;
4532
+ /** Reemplaza `helpText` cuando `error` es `true`. */
4533
+ errorText?: string;
4534
+ /** Mostrar/ocultar la línea de ayuda. */
4535
+ showHelpText: boolean;
4536
+ /** Pastilla «?» junto al label (compone `ius-popover` en hover/foco). */
4537
+ showIconHelp: boolean;
4538
+ /** Título del contenido de ayuda (popover). */
4539
+ iconHelpTitle?: string;
4540
+ /** Cuerpo del contenido de ayuda (popover). */
4541
+ iconHelpContent?: string;
4542
+ /** `name` del `<textarea>` (envío como formulario nativo). */
4543
+ name?: string;
4544
+ protected readonly rowsState: _angular_core.WritableSignal<number>;
4545
+ /** Líneas mínimas visibles. Default `3`. */
4546
+ set rows(value: number | string | null | undefined);
4547
+ get rows(): number;
4548
+ private readonly maxRowsState;
4549
+ /** Tope de líneas antes de hacer scroll interno. Sin tope si se omite. */
4550
+ set maxRows(value: number | string | null | undefined);
4551
+ get maxRows(): number | undefined;
4552
+ protected readonly autoGrowState: _angular_core.WritableSignal<boolean>;
2748
4553
  /**
2749
- * Handler del botón final. Con `finishDynamic` debe devolver una `Promise`
2750
- * (su resolución decide success/error del Button).
4554
+ * Crecer con el contenido entre `rows` y `maxRows`. Default `true`.
4555
+ * Con `false` la altura queda fija en `rows`. `resizable` lo anula.
2751
4556
  */
2752
- finishAction?: () => void | IusButtonActionResult | Promise<IusButtonActionResult | void>;
2753
- /** Se dispara al pulsar el botón final (original `onFinish`). */
2754
- readonly finish: EventEmitter<void>;
2755
- /** `action` para el modo dynamic del Button: emite `finish` y espera el handler. */
2756
- protected readonly runFinish: () => Promise<IusButtonActionResult | void>;
2757
- /** Click del botón final en modo NO dynamic. */
2758
- protected onFinishClick(): void;
2759
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<WizardNavComponent, never>;
2760
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WizardNavComponent, "ius-wizard-nav", never, { "api": { "alias": "api"; "required": true; }; "backLabel": { "alias": "backLabel"; "required": false; }; "nextLabel": { "alias": "nextLabel"; "required": false; }; "finishLabel": { "alias": "finishLabel"; "required": false; }; "nextIcon": { "alias": "nextIcon"; "required": false; }; "finishDynamic": { "alias": "finishDynamic"; "required": false; }; "nextDisabled": { "alias": "nextDisabled"; "required": false; }; "hideBackOnFirst": { "alias": "hideBackOnFirst"; "required": false; }; "finishAction": { "alias": "finishAction"; "required": false; }; }, { "finish": "finish"; }, never, never, true, never>;
2761
- static ngAcceptInputType_finishDynamic: unknown;
2762
- static ngAcceptInputType_nextDisabled: unknown;
2763
- static ngAcceptInputType_hideBackOnFirst: unknown;
4557
+ set autoGrow(value: boolean);
4558
+ get autoGrow(): boolean;
4559
+ protected readonly resizableState: _angular_core.WritableSignal<boolean>;
4560
+ /**
4561
+ * Permitir redimensionar a mano arrastrando la manija inferior derecha.
4562
+ * **Excluyente con `autoGrow`** (al activarlo, el auto-crecimiento se apaga).
4563
+ * Default `false`.
4564
+ */
4565
+ set resizable(value: boolean);
4566
+ get resizable(): boolean;
4567
+ protected readonly maxLengthState: _angular_core.WritableSignal<number | undefined>;
4568
+ /** Límite de caracteres (`maxlength` nativo). */
4569
+ set maxLength(value: number | string | null | undefined);
4570
+ get maxLength(): number | undefined;
4571
+ /** Mostrar el contador `n / max` bajo el campo (requiere `maxLength`). */
4572
+ showCount: boolean;
4573
+ private readonly errorState;
4574
+ /** Estado de error (colores + `errorText`). */
4575
+ set error(value: boolean);
4576
+ get error(): boolean;
4577
+ private readonly disabledState;
4578
+ /** Estado deshabilitado (también lo escribe el CVA vía `setDisabledState`). */
4579
+ set disabled(value: boolean);
4580
+ get disabled(): boolean;
4581
+ protected readonly sizeState: _angular_core.WritableSignal<IusTextAreaSize>;
4582
+ /** Tamaño: `small` · `medium` (default) · `large`. */
4583
+ set size(value: IusTextAreaSize);
4584
+ get size(): IusTextAreaSize;
4585
+ protected readonly stateState: _angular_core.WritableSignal<IusTextAreaState | undefined>;
4586
+ /**
4587
+ * Forzar visualmente un estado completo. **Solo demos / especímenes** — no
4588
+ * usar en producción: no altera la interacción real, solo la piel.
4589
+ */
4590
+ set state(value: IusTextAreaState | undefined);
4591
+ get state(): IusTextAreaState | undefined;
4592
+ /** Además del CVA: notifica cada cambio de valor del `<textarea>`. */
4593
+ readonly valueChange: EventEmitter<string>;
4594
+ protected readonly value: _angular_core.WritableSignal<string>;
4595
+ protected readonly focused: _angular_core.WritableSignal<boolean>;
4596
+ protected readonly areaId: string;
4597
+ protected readonly helpId: string;
4598
+ private readonly area;
4599
+ private onChange;
4600
+ private onTouched;
4601
+ /** Cancela los listeners del arrastre en curso (no-op si no hay ninguno). */
4602
+ private stopResize;
4603
+ protected readonly isDisabled: _angular_core.Signal<boolean>;
4604
+ protected readonly isError: _angular_core.Signal<boolean>;
4605
+ protected readonly isFocused: _angular_core.Signal<boolean>;
4606
+ protected get hint(): string | undefined;
4607
+ protected get showHint(): boolean;
4608
+ /** Texto del contador `n / max`, o `null` si no aplica. */
4609
+ protected get count(): string | null;
4610
+ /** `min-height` inline del golden cuando la altura se arrastra a mano. */
4611
+ protected get resizableMinHeight(): string | null;
4612
+ constructor();
4613
+ writeValue(value: string): void;
4614
+ registerOnChange(fn: (value: string) => void): void;
4615
+ registerOnTouched(fn: () => void): void;
4616
+ setDisabledState(isDisabled: boolean): void;
4617
+ protected onInput(event: Event): void;
4618
+ protected onFocus(): void;
4619
+ protected onBlur(): void;
4620
+ /**
4621
+ * Arrastre vertical de la manija (`.ius-tf__resize`). Port del `startResize`
4622
+ * golden: los listeners viven en `window` y se registran fuera de la zona
4623
+ * para no disparar change detection en cada `pointermove`.
4624
+ */
4625
+ protected startResize(event: PointerEvent): void;
4626
+ /**
4627
+ * Ajusta la altura al contenido entre `rows` y `maxRows` (port literal del
4628
+ * `adjust()` golden). Se desactiva con `autoGrow=false` o `resizable=true`,
4629
+ * casos en que la altura la fija el atributo `rows` / el arrastre.
4630
+ */
4631
+ private adjust;
4632
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TextAreaComponent, never>;
4633
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TextAreaComponent, "ius-text-area", never, { "label": { "alias": "label"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "required": { "alias": "required"; "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; }; "name": { "alias": "name"; "required": false; }; "rows": { "alias": "rows"; "required": false; }; "maxRows": { "alias": "maxRows"; "required": false; }; "autoGrow": { "alias": "autoGrow"; "required": false; }; "resizable": { "alias": "resizable"; "required": false; }; "maxLength": { "alias": "maxLength"; "required": false; }; "showCount": { "alias": "showCount"; "required": false; }; "error": { "alias": "error"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "size": { "alias": "size"; "required": false; }; "state": { "alias": "state"; "required": false; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
4634
+ static ngAcceptInputType_required: unknown;
4635
+ static ngAcceptInputType_showHelpText: unknown;
4636
+ static ngAcceptInputType_showIconHelp: unknown;
4637
+ static ngAcceptInputType_autoGrow: unknown;
4638
+ static ngAcceptInputType_resizable: unknown;
4639
+ static ngAcceptInputType_showCount: unknown;
4640
+ static ngAcceptInputType_error: unknown;
4641
+ static ngAcceptInputType_disabled: unknown;
2764
4642
  }
2765
4643
 
2766
- /** Eje con scroll. */
2767
- type IusScrollAxis = 'y' | 'x' | 'both';
2768
- /** Grosor de la barra — `thin` es alias de `small`. */
2769
- type IusScrollSize = 'small' | 'medium' | 'large' | 'thin';
2770
4644
  /**
2771
- * ScrollArea Ius Design v2.
4645
+ * Tono semántico del estado. ALIAS de `StatusTone` (foundation
4646
+ * `status-catalog`): el vocabulario NO se re-declara aquí, solo se le pone el
4647
+ * nombre `Ius*` que usa el resto de la librería.
4648
+ */
4649
+ type IusStatusChipTone = StatusTone;
4650
+ /** Escala tipográfica del chip: `small` = `--ius-fs-sm` · `medium` = `--ius-fs-base`. */
4651
+ type IusStatusChipSize = 'small' | 'medium';
4652
+ /**
4653
+ * StatusChip — Ius Design v2 (familia data-display).
2772
4654
  *
2773
- * Contenedor con scroll **canónico** del sistema: aplica la barra unificada
2774
- * (utilidad global `.ius-scroll` de `tokens/scrollbar.css`) para que cualquier
2775
- * área desplazable tenga el mismo thumb pill `neutral-4` (hover `neutral-5`,
2776
- * track transparente) sin reescribir reglas `::-webkit-scrollbar`. **No** para
2777
- * el scroll de toda la página (eso lo maneja el documento).
4655
+ * **Átomo visual de estado**: marca semántica (punto de 8px, o ícono) + el
4656
+ * rótulo EN EL COLOR DEL TONO, **sin píldora**. Es el patrón reconocible de
4657
+ * "estado", reusable por cualquier entidad del sistema (actuación, tarea,
4658
+ * factura, plan, usuario…). No es interactivo: no tiene outputs, ni foco, ni
4659
+ * máquina de estado.
2778
4660
  *
2779
- * Nota del port: el `as` polimórfico del golden no aplica el host es siempre
2780
- * `<ius-scroll-area>` (`.ius-sa`). El `viewRef` de React se expone como
2781
- * `getViewport()` (equivalente a un `@ViewChild` del viewport).
4661
+ * **QUÉ COMPONE.** Nada visual: es una hoja. Lo que consume es la foundation
4662
+ * `status-catalog` (`resolveStatus`), donde vive el **vocabulario** qué
4663
+ * estados existen por entidad y con qué `label · tone · icon`. El átomo solo
4664
+ * pinta: se le pasa `vocab` + `status` y resuelve; o se le pasan
4665
+ * `tone`/`label`/`icon` directo (escape hatch genérico). `vocab` por defecto =
4666
+ * `actuacion` (ciclo `nueva → vista → gestion → cerrada`). La actuación **no
4667
+ * vence**: el vencimiento es estado de sus TAREAS (`vocab="gestion"`), por eso
4668
+ * `gestion` de actuación es `primary` y no `warning`.
4669
+ *
4670
+ * **Resolución (orden del golden).**
4671
+ * - `meta = resolveStatus(vocab, status, customMap)`
4672
+ * - `tono = tone || meta?.tone || 'neutral'`
4673
+ * - `rótulo = <ng-content> › label › meta?.label › status crudo`
4674
+ * - `glifo = icon===true ? meta?.icon : (string ? ese glifo : ninguno → punto)`
4675
+ *
4676
+ * Un `vocab`/`status` **desconocido nunca falla**: `meta` queda `null` y el chip
4677
+ * cae a `neutral` con el `status` crudo como rótulo.
4678
+ *
4679
+ * **CUÁNDO NO USARLO.**
4680
+ * - Etiqueta / categoría / filtro (píldora con fondo) → `ius-tag`.
4681
+ * - Punto o contador atómico SIN texto → `ius-insignia`.
4682
+ * - Página completa de error/vacío (404, 500) → `ius-status-state`.
4683
+ * - Token de un evento de agenda con hora → `EventPill` (aún no portado).
4684
+ * - Un color de IDENTIDAD/categoría (hue "fruta") → `CategoryPalette`: esto es
4685
+ * ESTADO, y el estado siempre es una familia semántica.
4686
+ *
4687
+ * **A11y.** El host lleva `role="status"`; la marca (punto/ícono) es
4688
+ * `aria-hidden="true"` porque el color NO puede ser el único canal de
4689
+ * información: el rótulo textual es quien comunica el estado.
4690
+ *
4691
+ * `id` / `class` / `style` son passthrough natural del host de Angular: no hay
4692
+ * inputs para ellos.
4693
+ *
4694
+ * FUENTE DE VERDAD. Proyecto Claude Design →
4695
+ * `components/data-display/StatusChip/StatusChip.jsx` + `.d.ts` + `.ng-spec.md`
4696
+ * + `statuschip.card.html` + `playground.card.html`.
4697
+ *
4698
+ * DIVERGENCIAS / DECISIONES DE PORT (para que diseño las resuelva):
4699
+ * 1. `label` es `string` (el golden lo tipa `ReactNode`). Regla 5 del port. Si
4700
+ * hace falta contenido rico se PROYECTA (`<ng-content>`), que gana sobre
4701
+ * `label`.
4702
+ * 2. `icon` como **atributo sin valor** (`<ius-status-chip icon>`) llega como
4703
+ * `''`, no como `true`: se interpreta como `true` (ícono del catálogo), que
4704
+ * es la traducción fiel del `<StatusChip icon />` de React. También se
4705
+ * aceptan los strings `'true'` / `'false'`. Un string no vacío distinto de
4706
+ * esos dos es el glifo Material Symbols. NO se usa `booleanAttribute`:
4707
+ * destruiría el caso string.
4708
+ * 3. `data-size` se omite cuando vale el default (`small`), igual que `ius-tag`
4709
+ * e `ius-insignia`; el golden lo emite siempre. Es equivalente visualmente
4710
+ * (el bloque base del CSS ES el de `small`), pero el DOM difiere.
4711
+ * 4. El golden no expone `aria-label`; se confía en el rótulo textual. Si un
4712
+ * consumidor necesitara un rótulo accesible distinto del visible, lo pone
4713
+ * él sobre el host (passthrough).
2782
4714
  */
2783
- declare class ScrollAreaComponent implements AfterViewInit, OnChanges, OnDestroy {
2784
- /** Eje con scroll. */
2785
- axis: IusScrollAxis;
2786
- /** Grosor de barra; `thin` = alias de `small`. */
2787
- size: IusScrollSize;
2788
- /** Thumb solo visible en hover/foco (lienzos amplios). */
2789
- autoHide: boolean;
2790
- /** Máscara de gradiente en los bordes con scroll disponible. */
2791
- fade: boolean;
2792
- /** Límite que dispara el scroll vertical (número px). */
2793
- maxHeight?: number | string;
2794
- /** Límite que dispara el scroll horizontal (número → px). */
2795
- maxWidth?: number | string;
2796
- /** Clase(s) extra para el viewport. */
2797
- viewClassName?: string;
2798
- /** Reenvía el evento nativo `scroll` del viewport (opcional, ng-spec §3). */
2799
- readonly scrolled: EventEmitter<Event>;
2800
- private readonly view;
2801
- private ro;
2802
- private readonly onScroll;
2803
- /** Clases del viewport: base + barra unificada + variante de tamaño/autoHide. */
2804
- protected get viewClasses(): string;
2805
- protected get maxHeightCss(): string | null;
2806
- protected get maxWidthCss(): string | null;
2807
- private toCss;
4715
+ declare class StatusChipComponent implements AfterViewInit {
4716
+ /**
4717
+ * Entidad cuyo vocabulario (en `status-catalog`) resuelve el `status`.
4718
+ * Default `'actuacion'`. Una entidad fuera del catálogo no falla: el chip cae
4719
+ * a `neutral`.
4720
+ */
4721
+ readonly vocab: _angular_core.InputSignal<string>;
4722
+ /**
4723
+ * Clave del estado DENTRO del `vocab` (p. ej. `'gestion'`). Resuelve rótulo +
4724
+ * tono + ícono. La urgencia de una tarea (`por_vencer`/`vencida`) se DERIVA de
4725
+ * la fecha límite en el consumidor ANTES de llegar aquí.
4726
+ */
4727
+ readonly status: _angular_core.InputSignal<string | undefined>;
4728
+ /**
4729
+ * Fuerza el tono y sobrescribe el del catálogo. Escape hatch genérico para
4730
+ * estados que todavía no tienen vocabulario.
4731
+ */
4732
+ readonly tone: _angular_core.InputSignal<StatusTone | undefined>;
4733
+ /**
4734
+ * Sobrescribe el rótulo. Alternativa a proyectar contenido; si hay
4735
+ * `<ng-content>`, la proyección GANA. Si no resuelve nada, se muestra el
4736
+ * `status` crudo.
4737
+ */
4738
+ readonly label: _angular_core.InputSignal<string | undefined>;
4739
+ /**
4740
+ * Marca del chip. `false`/ausente → punto de 8px (default). `true` (o el
4741
+ * atributo sin valor `icon`) → ícono del estado tomado del catálogo. Un string
4742
+ * no vacío → ese glifo Material Symbols Rounded (p. ej. `'event_busy'`).
4743
+ * Es `boolean | string` a propósito: no lleva `booleanAttribute`.
4744
+ */
4745
+ readonly icon: _angular_core.InputSignal<string | boolean | undefined>;
4746
+ /** Escala tipográfica: `small` (`fs-sm`, default) · `medium` (`fs-base`). */
4747
+ readonly size: _angular_core.InputSignal<IusStatusChipSize>;
4748
+ /**
4749
+ * Extiende / sobrescribe el vocabulario EN RUNTIME (`status → StatusMeta`).
4750
+ * Gana sobre el catálogo central. Si un estado pasado por aquí se vuelve
4751
+ * común, se PROMUEVE a `status-catalog`.
4752
+ */
4753
+ readonly customMap: _angular_core.InputSignal<Readonly<Record<string, StatusMeta>> | undefined>;
4754
+ /**
4755
+ * Retro-compat con el estático `StatusChip.states` del golden: alias al
4756
+ * vocabulario `actuacion` del catálogo. NO re-declara nada; es la misma
4757
+ * referencia que `STATUS_VOCAB.actuacion`.
4758
+ */
4759
+ static readonly states: StatusVocabMap;
4760
+ /**
4761
+ * Retro-compat con el estático `StatusChip.order` del golden: claves de
4762
+ * `actuacion` en orden de ciclo, leídas del catálogo con `statusOrder`.
4763
+ */
4764
+ static readonly order: readonly ActuacionStatus[];
4765
+ /**
4766
+ * Span donde se estampa `<ng-content>`. Se inspecciona UNA sola vez para saber
4767
+ * si el consumidor proyectó rótulo (patrón de `ius-divider`: bajo OnPush
4768
+ * `<ng-content>` no se re-evalúa, así que no hay forma reactiva de saberlo).
4769
+ */
4770
+ private proyeccionRef;
4771
+ /** `true` si el consumidor proyectó contenido no vacío. */
4772
+ protected readonly hayProyeccion: _angular_core.WritableSignal<boolean>;
4773
+ /** Entrada del catálogo, o `null` si el `vocab`/`status` no se reconoce. */
4774
+ protected readonly meta: _angular_core.Signal<StatusMeta | null>;
4775
+ /**
4776
+ * Tono aplicado: `tone` explícito › tono del catálogo › `neutral`.
4777
+ * Se usa `||` (no `??`) para calcar el fallback del golden.
4778
+ */
4779
+ protected readonly tonoEfectivo: _angular_core.Signal<StatusTone>;
4780
+ /**
4781
+ * Rótulo cuando NO hay proyección: `label` › `meta.label` › `status` crudo.
4782
+ * Se usa `??` porque el golden compara con `!= null`: un `label=""` explícito
4783
+ * es un override válido a cadena vacía.
4784
+ */
4785
+ protected readonly rotulo: _angular_core.Signal<string>;
4786
+ /**
4787
+ * Glifo Material Symbols a pintar en lugar del punto, o `null` para el punto.
4788
+ * Se parsea a mano porque `icon` es `boolean | string`: cualquier transform
4789
+ * booleano destruiría el caso "glifo arbitrario".
4790
+ */
4791
+ protected readonly glifo: _angular_core.Signal<string | null>;
4792
+ /** Detección única de proyección (igual que `ius-divider`). */
2808
4793
  ngAfterViewInit(): void;
2809
- ngOnChanges(): void;
2810
- ngOnDestroy(): void;
2811
- /** Acceso al viewport (equivalente al `viewRef` del golden). */
2812
- getViewport(): HTMLElement | null;
2813
- private updateFade;
2814
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<ScrollAreaComponent, never>;
2815
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ScrollAreaComponent, "ius-scroll-area", never, { "axis": { "alias": "axis"; "required": false; }; "size": { "alias": "size"; "required": false; }; "autoHide": { "alias": "autoHide"; "required": false; }; "fade": { "alias": "fade"; "required": false; }; "maxHeight": { "alias": "maxHeight"; "required": false; }; "maxWidth": { "alias": "maxWidth"; "required": false; }; "viewClassName": { "alias": "viewClassName"; "required": false; }; }, { "scrolled": "scrolled"; }, never, ["*"], true, never>;
2816
- static ngAcceptInputType_autoHide: unknown;
2817
- static ngAcceptInputType_fade: unknown;
4794
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StatusChipComponent, never>;
4795
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StatusChipComponent, "ius-status-chip", never, { "vocab": { "alias": "vocab"; "required": false; "isSignal": true; }; "status": { "alias": "status"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "customMap": { "alias": "customMap"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2818
4796
  }
2819
4797
 
2820
- /** Tamaño de la fila heredado del Select. small · medium (default) · large. */
2821
- type IusOptionItemSize = 'small' | 'medium' | 'large';
4798
+ /** Tipo del campo fija los operadores y el control de valor. */
4799
+ type IusFilterFieldType = 'text' | 'enum' | 'number' | 'date';
4800
+ /** Escala de los controles del panel. */
4801
+ type IusQueryBuilderSize = 'small' | 'medium';
4802
+ /** Valor escalar de una regla (el golden nunca castea a número). */
4803
+ type IusFilterValue = string | number;
4804
+ /** Opción de un campo `type: 'enum'`. */
4805
+ interface IusFilterFieldOption {
4806
+ /** Valor único que viaja en la regla. */
4807
+ value: IusFilterValue;
4808
+ /**
4809
+ * Etiqueta visible. En el golden es `ReactNode`; en Angular se degrada a
4810
+ * `string` (regla 5 del port: un ReactNode dentro de un objeto de datos
4811
+ * baja a texto plano).
4812
+ */
4813
+ label: string;
4814
+ }
4815
+ /** Campo filtrable: define los operadores disponibles y el control de valor. */
4816
+ interface IusFilterField {
4817
+ /** Clave del campo (lo que viaja en `IusFilterRule.field`). */
4818
+ value: string;
4819
+ /**
4820
+ * Etiqueta visible en el selector de campo. `ReactNode` en el golden →
4821
+ * `string` aquí (regla 5 del port).
4822
+ */
4823
+ label: string;
4824
+ /** Tipo del campo. Default `text`. */
4825
+ type?: IusFilterFieldType;
4826
+ /**
4827
+ * Ícono Material Symbols del campo. **Reservado**: el selector de campo no
4828
+ * lo muestra (el golden lo omite a propósito para no meter ruido en el
4829
+ * menú). Se conserva en el contrato por paridad con `FilterField.icon`.
4830
+ */
4831
+ icon?: string;
4832
+ /** Opciones para `type: 'enum'`. */
4833
+ options?: IusFilterFieldOption[];
4834
+ /** Placeholder del control de valor (solo `text` / `number`). */
4835
+ placeholder?: string;
4836
+ }
4837
+ /** Regla aplicada: campo · operador · valor. Combinación siempre Y (AND). */
4838
+ interface IusFilterRule {
4839
+ /** Clave del campo (`IusFilterField.value`). */
4840
+ field: string;
4841
+ /** Clave del operador (ver `IUS_FILTER_OPERATORS`). */
4842
+ operator: string;
4843
+ /** Valor del criterio. */
4844
+ value: IusFilterValue;
4845
+ }
2822
4846
  /**
2823
- * Estado forzado **solo demos/especímenes del DS**. En producción usar
2824
- * `selected`/`multi`/`active`/`disabled`. Sobrescribe la interacción real.
4847
+ * Operadores contextuales por tipo de campo espejo literal de `OPERATORS`
4848
+ * del golden. El primero de cada lista es el default al elegir el campo.
4849
+ * Se exporta para que el consumidor pueda pintar las reglas aplicadas (chips,
4850
+ * resumen…) con la misma etiqueta que usa el panel.
2825
4851
  */
2826
- type IusOptionItemState = 'idle' | 'hover' | 'pressed' | 'disabled' | 'selected' | 'selectedVar' | 'selectedHovered';
4852
+ declare const IUS_FILTER_OPERATORS: Readonly<Record<IusFilterFieldType, SelectOption[]>>;
2827
4853
  /**
2828
- * OptionItem Ius Design.
4854
+ * Fila del borrador. `id` es un **contador incremental de módulo** (el `RID`
4855
+ * del golden): es la identidad que usa el `track` del `@for`. Nunca se traquea
4856
+ * por índice — al quitar una fila intermedia Angular reciclaría los
4857
+ * `ius-select`/`ius-text-field` y los valores se cruzarían entre filas.
4858
+ */
4859
+ interface DraftRow {
4860
+ id: number;
4861
+ field: string;
4862
+ operator: string;
4863
+ value: IusFilterValue;
4864
+ }
4865
+ /**
4866
+ * QueryBuilder — Ius Design v2 (familia navigation).
2829
4867
  *
2830
- * Átomo de **fila de opción** dentro del menú (MenuInput) del **Select** (y
2831
- * SelectNumber, y cualquier lista de opciones del sistema). **No se usa suelto en
2832
- * formularios** es la pieza interna que renderiza cada opción. Cubre los 7
2833
- * estados del especimen Figma: Default · Hovered · Pressed · Disabled · Selected
2834
- * (multi, check circular al final) · Selected Var (single, relleno azul) ·
2835
- * Selected Hovered.
4868
+ * Constructor de **filtros secundarios estructurados** (estilo Linear/Vercel):
4869
+ * un botón "Filtros" con contador abre un **Popover** con **filas de criterio**
4870
+ * —campo · operador · valor · quitar— más un footer "Añadir filtro · Limpiar
4871
+ * todo · Aplicar", y un estado vacío.
2836
4872
  *
2837
- * Regla de marca: `multi` + `selected` check (Selected); single + `selected` →
2838
- * relleno azul (Selected Var). `active` es el resaltado de navegación por teclado
2839
- * (mismo fondo que hover) sin marcar la opción como elegida.
4873
+ * Decisiones de UX fijas (vienen del golden, no son configurables):
4874
+ * - **Operadores contextuales** por tipo de campo (text Contiene/Es igual/No
4875
+ * contiene · enum Es/No es · number Igual/≥/≤ · date → Entre/Antes/Después).
4876
+ * - **Staged**: el panel arma un *borrador* y solo confirma al pulsar "Aplicar"
4877
+ * (nunca filtra en vivo). Al abrir, el borrador se re-siembra desde lo aplicado.
4878
+ * - **Solo Y (AND)** y **un criterio por campo**: los campos ya usados se
4879
+ * deshabilitan en el selector y al cubrirlos todos se apaga "Añadir filtro".
2840
4880
  *
2841
- * Fuente de verdad: `components/inputs/OptionItem/OptionItem.jsx` + `.d.ts` +
2842
- * `OptionItem.ng-spec.md`. Todo sale de tokens `--ius-*` (los px 6/11/22 son los
2843
- * mismos valores crudos que fija el golden para el alto de fila y el disco del
2844
- * check excepción documentada por la fuente de verdad).
4881
+ * Compone (no reimplementa) `ius-popover`, `ius-select`, `ius-text-field`,
4882
+ * `ius-icon-button`, `ius-button` y `ius-text-button`.
4883
+ *
4884
+ * **Cuándo NO usarlo**: filtro primario rápido por chips `FilterBar`; rango
4885
+ * de fechas → control dedicado con DatePicker; búsqueda libre → `SearchBar`;
4886
+ * captura de datos → un formulario.
4887
+ *
4888
+ * Fuente de verdad: `components/navigation/QueryBuilder/QueryBuilder.jsx` +
4889
+ * `QueryBuilder.d.ts` + `QueryBuilder.ng-spec.md` del proyecto Claude Design.
4890
+ *
4891
+ * ---
4892
+ * **Divergencias doc-vs-golden anotadas** (manda el golden, diseño decide):
4893
+ * 1. `applyLabel` NO es el texto del botón de confirmar en el caso general: el
4894
+ * golden lo calcula («Aplicar N filtro/filtros» con reglas válidas; «Quitar
4895
+ * filtros» si no hay ninguna válida pero sí aplicadas) y solo cae a
4896
+ * `applyLabel` cuando el borrador y lo aplicado están vacíos. La ng-spec lo
4897
+ * presenta como una etiqueta llana.
4898
+ * 2. Los textos "y" (conjunción), "Selecciona un valor", "Escribe un valor" /
4899
+ * "Escribe un número" y "Quitar filtro" están **fijos en el golden**: no hay
4900
+ * input para traducirlos. Si diseño los quiere configurables, primero
4901
+ * cambia el golden.
4902
+ * 3. El campo `type: 'number'` usa un TextField de texto plano (el golden no
4903
+ * pasa `type="number"`), así que el valor viaja siempre como `string`.
4904
+ * 4. `FilterField.icon` está en el contrato pero el golden **no lo pinta**.
4905
+ *
4906
+ * **Decisiones del port a Angular**:
4907
+ * - El Popover se usa en modo controlado (`[open]` + `(openChange)`) y **sin**
4908
+ * `dismissable`, igual que el golden (que tampoco lo activa). Además, aquí es
4909
+ * obligatorio: el menú del `ius-select` vive en OTRO overlay del CDK, así que
4910
+ * `outsidePointerEvents()` del Popover lo leería como "clic fuera" y cerraría
4911
+ * el panel al elegir cualquier opción. El panel se cierra con el propio botón
4912
+ * "Filtros" o con "Aplicar".
4913
+ * - El ancho/padding del panel (`popoverStyle` del golden) se porta como la
4914
+ * piel `.ius-popover.ius-querybuilder-pop` en `popover/popover.component.scss`
4915
+ * (mismo patrón que `.ius-tooltip` y `.ius-dropdown-pop`): el panel se estampa
4916
+ * desde el template del Popover y lleva SU encapsulación.
4917
+ * - El valor de texto se escribe con `[ngModel]` porque `TextFieldComponent`
4918
+ * expone su valor solo por `ControlValueAccessor`. Hace falta para poder
4919
+ * **vaciar** el control cuando cambia el campo de la fila.
2845
4920
  */
2846
- declare class OptionItemComponent {
2847
- /** Texto de la opción. Alternativa a la proyección de contenido. */
2848
- label?: string;
2849
- /** Ícono Material Symbols a la izquierda (opcional). */
2850
- icon?: string;
2851
- /** La opción está elegida. */
2852
- selected: boolean;
2853
- /** Selección múltiple: con `selected` check circular (si no, relleno azul). */
2854
- multi: boolean;
2855
- /** Resaltado de navegación por teclado (activa, sin elegir aún). */
2856
- active: boolean;
2857
- /** Opción no seleccionable. */
2858
- disabled: boolean;
2859
- /** Tamaño de la fila, heredado del Select. */
2860
- size: IusOptionItemSize;
2861
- /** Valor de la opción (para `role="option"` / aria). */
2862
- value?: string | number;
2863
- /** Estado forzado **solo demos/especímenes**. */
2864
- state?: IusOptionItemState;
2865
- /** Al elegir la opción (original `onSelect`). */
2866
- readonly selectClicked: EventEmitter<void>;
2867
- /** ¿Hay un estado forzado activo (demo)? */
2868
- protected get forced(): boolean;
2869
- /** ¿La opción se ve como elegida (real o forzada)? */
2870
- protected get isSelected(): boolean;
2871
- /** ¿Elegida en modo múltiple (check) vs single (relleno)? */
2872
- protected get isMultiSel(): boolean;
2873
- /** Marca de elegido: `check` (multi) o `fill` (single). */
2874
- protected get variant(): 'check' | 'fill';
2875
- /** Deshabilitada (real o forzada). */
2876
- protected get isDisabled(): boolean;
2877
- /** ¿Mostrar el disco de check al final (solo multi elegido)? */
2878
- protected get showCheck(): boolean;
2879
- protected handleClick(): void;
2880
- protected onMouseDown(event: MouseEvent): void;
2881
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<OptionItemComponent, never>;
2882
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<OptionItemComponent, "ius-option-item", never, { "label": { "alias": "label"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "selected": { "alias": "selected"; "required": false; }; "multi": { "alias": "multi"; "required": false; }; "active": { "alias": "active"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "size": { "alias": "size"; "required": false; }; "value": { "alias": "value"; "required": false; }; "state": { "alias": "state"; "required": false; }; }, { "selectClicked": "selectClicked"; }, never, ["*"], true, never>;
2883
- static ngAcceptInputType_selected: unknown;
2884
- static ngAcceptInputType_multi: unknown;
2885
- static ngAcceptInputType_active: unknown;
2886
- static ngAcceptInputType_disabled: unknown;
4921
+ declare class QueryBuilderComponent {
4922
+ /** Campos filtrables: definen los operadores y el control de valor. */
4923
+ readonly fields: _angular_core.InputSignal<readonly IusFilterField[]>;
4924
+ /**
4925
+ * Reglas aplicadas — **modo controlado**. Si se enlaza, el componente no
4926
+ * guarda estado propio: hay que reaccionar a `apply` y volver a enlazar.
4927
+ */
4928
+ readonly value: _angular_core.InputSignal<readonly IusFilterRule[] | undefined>;
4929
+ /** Reglas iniciales del modo **no controlado**. */
4930
+ readonly defaultValue: _angular_core.InputSignal<readonly IusFilterRule[] | undefined>;
4931
+ /** Texto del botón disparador. */
4932
+ readonly triggerLabel: _angular_core.InputSignal<string>;
4933
+ /** Colocación del panel respecto del disparador. */
4934
+ readonly placement: _angular_core.InputSignal<IusPopoverPlacement>;
4935
+ /** Escala de los controles del panel (se propaga a Select/TextField/botones). */
4936
+ readonly size: _angular_core.InputSignal<IusQueryBuilderSize>;
4937
+ /**
4938
+ * Máximo de filas. Default = `fields.length` (un criterio por campo: no se
4939
+ * repite campo y al cubrirlos todos se desactiva "Añadir filtro"). Fíjalo
4940
+ * solo para un tope distinto.
4941
+ */
4942
+ readonly maxRows: _angular_core.InputSignal<number | undefined>;
4943
+ /** Etiqueta del botón que añade una fila. */
4944
+ readonly addLabel: _angular_core.InputSignal<string>;
4945
+ /** Etiqueta del botón que vacía el borrador. */
4946
+ readonly clearLabel: _angular_core.InputSignal<string>;
4947
+ /**
4948
+ * Etiqueta del botón de confirmar **solo cuando no hay nada que aplicar ni
4949
+ * aplicado**. Ver la divergencia 1 del comentario de cabecera.
4950
+ */
4951
+ readonly applyLabel: _angular_core.InputSignal<string>;
4952
+ /** Título del estado vacío del panel. */
4953
+ readonly emptyTitle: _angular_core.InputSignal<string>;
4954
+ /** Pista del estado vacío del panel. */
4955
+ readonly emptyHint: _angular_core.InputSignal<string>;
4956
+ /**
4957
+ * Reglas válidas al pulsar "Aplicar" (espejo de `onApply`). Nombre fijado
4958
+ * por la ng-spec; no colisiona con ningún evento del DOM.
4959
+ */
4960
+ readonly apply: _angular_core.OutputEmitterRef<IusFilterRule[]>;
4961
+ /** `null` = todavía no se ha aplicado nada → manda `defaultValue`. */
4962
+ private readonly internalApplied;
4963
+ /** Apertura del panel (el Popover se usa en modo controlado). */
4964
+ protected readonly isOpen: _angular_core.WritableSignal<boolean>;
4965
+ /** Borrador del panel: lo que se está armando, aún sin aplicar. */
4966
+ protected readonly draft: _angular_core.WritableSignal<readonly DraftRow[]>;
4967
+ /** Reglas efectivamente aplicadas (controlado › interno › `defaultValue`). */
4968
+ protected readonly applied: _angular_core.Signal<readonly IusFilterRule[]>;
4969
+ /** Contador del disparador. */
4970
+ protected readonly count: _angular_core.Signal<number>;
4971
+ /** Índice campo → definición, para resolver tipo/opciones sin recorrer. */
4972
+ private readonly fieldIndex;
4973
+ /**
4974
+ * Opciones del selector de campo, por fila: un campo ya usado en OTRA fila
4975
+ * se deshabilita (un criterio por campo). Memorizado para no crear arrays
4976
+ * nuevos en cada ciclo de detección (dispararía el setter de `ius-select`).
4977
+ */
4978
+ protected readonly fieldOptions: _angular_core.Signal<Record<number, SelectOption[]>>;
4979
+ /** Opciones del control de valor para los campos `enum`, por campo. */
4980
+ protected readonly enumOptions: _angular_core.Signal<Record<string, SelectOption[]>>;
4981
+ /** Tope efectivo de filas. */
4982
+ protected readonly maxRowsEff: _angular_core.Signal<number>;
4983
+ /** Ya no caben más filas → "Añadir filtro" apagado. */
4984
+ protected readonly atCap: _angular_core.Signal<boolean>;
4985
+ /** Filas del borrador con valor utilizable. */
4986
+ protected readonly validCount: _angular_core.Signal<number>;
4987
+ /** Texto del botón de confirmar (lógica del golden; ver divergencia 1). */
4988
+ protected readonly applyText: _angular_core.Signal<string>;
4989
+ /** Sin nada que aplicar y sin nada aplicado → no hay acción posible. */
4990
+ protected readonly applyDisabled: _angular_core.Signal<boolean>;
4991
+ /** El selector de campo se vuelve buscable con listas largas (golden: `> 6`). */
4992
+ protected readonly fieldsSearchable: _angular_core.Signal<boolean>;
4993
+ /** Tipo del campo (default `text`, como el golden). */
4994
+ protected typeOf(fieldValue: string): IusFilterFieldType;
4995
+ /** Operadores contextuales del campo — referencia estable por tipo. */
4996
+ protected operatorOptions(fieldValue: string): SelectOption[];
4997
+ /** Opciones del selector de campo de una fila (referencia memorizada). */
4998
+ protected fieldOptionsFor(rid: number): SelectOption[];
4999
+ /** Opciones del valor `enum` de un campo. */
5000
+ protected valueOptions(fieldValue: string): SelectOption[];
5001
+ /** El valor `enum` también se vuelve buscable con listas largas (golden: > 6). */
5002
+ protected valueSearchable(fieldValue: string): boolean;
5003
+ /** Placeholder del control de texto (golden: el del campo o uno por tipo). */
5004
+ protected valuePlaceholder(fieldValue: string): string;
5005
+ /** Valor para el `ius-select` de `enum`: `''` → `null` (muestra placeholder). */
5006
+ protected selectValue(value: IusFilterValue): IusSelectValue | null;
5007
+ /** Valor para el `ius-text-field` (siempre `string`). */
5008
+ protected textValue(value: IusFilterValue): string;
5009
+ /**
5010
+ * Al **abrir**, el borrador se re-siembra desde las reglas aplicadas (espejo
5011
+ * del `useEffect([open])` del golden): lo que se dejó a medias sin aplicar se
5012
+ * descarta.
5013
+ */
5014
+ protected onOpenChange(open: boolean): void;
5015
+ /** Crea una fila nueva (espejo de `mkRow`). */
5016
+ private mkRow;
5017
+ /** Parche inmutable de una fila por `id`. */
5018
+ private patch;
5019
+ /** Cambiar el campo resetea operador (al default del tipo) y valor. */
5020
+ protected onFieldChange(rid: number, next: IusSelectValue | IusSelectValue[] | null): void;
5021
+ /** Cambio de operador. */
5022
+ protected onOperatorChange(rid: number, next: IusSelectValue | IusSelectValue[] | null): void;
5023
+ /** Cambio del valor `enum`. */
5024
+ protected onValueChange(rid: number, next: IusSelectValue | IusSelectValue[] | null): void;
5025
+ /** Cambio del valor de texto/número (incluye el botón de limpiar). */
5026
+ protected onTextValueChange(rid: number, next: string): void;
5027
+ /** Normaliza la salida del `ius-select` (single) a escalar. */
5028
+ private scalar;
5029
+ /** Añade una fila con el primer campo libre (respetando `maxRows`). */
5030
+ protected addRow(): void;
5031
+ /** Quita una fila por su `id` (nunca por índice). */
5032
+ protected removeRow(rid: number): void;
5033
+ /** Vacía el borrador (todavía no aplica nada: hay que confirmar). */
5034
+ protected clearAll(): void;
5035
+ /** Confirma el borrador: emite las reglas válidas y cierra el panel. */
5036
+ protected applyDraft(): void;
5037
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<QueryBuilderComponent, never>;
5038
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<QueryBuilderComponent, "ius-query-builder", never, { "fields": { "alias": "fields"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "defaultValue": { "alias": "defaultValue"; "required": false; "isSignal": true; }; "triggerLabel": { "alias": "triggerLabel"; "required": false; "isSignal": true; }; "placement": { "alias": "placement"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "maxRows": { "alias": "maxRows"; "required": false; "isSignal": true; }; "addLabel": { "alias": "addLabel"; "required": false; "isSignal": true; }; "clearLabel": { "alias": "clearLabel"; "required": false; "isSignal": true; }; "applyLabel": { "alias": "applyLabel"; "required": false; "isSignal": true; }; "emptyTitle": { "alias": "emptyTitle"; "required": false; "isSignal": true; }; "emptyHint": { "alias": "emptyHint"; "required": false; "isSignal": true; }; }, { "apply": "apply"; }, never, never, true, never>;
2887
5039
  }
2888
5040
 
2889
- /** Tamaño del chip — small ~24 · medium ~28 (default) · large ~32px (alineado a inputs). */
2890
- type IusChipSize = 'small' | 'medium' | 'large';
2891
- /** Estado forzado — **solo demos/especímenes del DS**. Sobrescribe la interacción real. */
2892
- type IusChipState = 'idle' | 'hover' | 'disabled';
2893
5041
  /**
2894
- * Chip — Ius Design.
5042
+ * SegmentGroup — Ius Design v2 (familia layout).
2895
5043
  *
2896
- * Etiqueta compacta tipo "pill" que representa un valor seleccionado. Dos modos:
2897
- * - **Eliminable** (`removable`): relleno azul + botón × circular. Para inputs y
2898
- * formularios (lo usan Select / CascaderSelect en multiselección) cada chip es
2899
- * un valor elegido que el usuario puede quitar.
2900
- * - **No eliminable** (default): blanco con borde. Para vistas de solo lectura /
2901
- * display.
5044
+ * Agrupa **dos o más controles tipo píldora** ya existentes (`ius-button`
5045
+ * `variant="outline"`, `ius-dropdown` `variant="outline"`, el disparador de
5046
+ * `ius-query-builder`…) en un **bloque segmentado**: el grupo aporta el ÚNICO
5047
+ * shell (borde 1px + radio), los controles internos pierden borde/radio/fondo
5048
+ * propios, el borde compartido se convierte en un **divisor de 1px** y las
5049
+ * esquinas redondeadas quedan solo en el exterior (izquierdas del primero,
5050
+ * derechas del último). Es puramente visual: **cada hijo conserva su propio
5051
+ * clic, su propio menú y su propio estado**; el grupo no tiene outputs.
2902
5052
  *
2903
- * Tres estados (Default · Hovered · Disabled) y tres tamaños. Admite un ícono a la
2904
- * izquierda. **No** es interactivo (no clickable/toggle) ni maneja color de estado
2905
- * → para eso usar **Tag**.
5053
+ * Compone: nada. Solo proyecta (`<ng-content>`) y re-estiliza a sus hijos.
2906
5054
  *
2907
- * Fuente de verdad: `components/data-display/Chip/Chip.jsx` + `.d.ts` + ng-spec.
2908
- * Todo sale de tokens `--ius-*`; los px de la pill (3/4/5 py, 8/10/12 px, 16/18/20
2909
- * de la ×) son los valores que fija el golden para el alto por tamaño (excepción
2910
- * documentada por la fuente de verdad).
5055
+ * **Cuándo NO usarlo**
5056
+ * - Elegir UNA opción entre varias `ius-segmented-control` (eso es un
5057
+ * input con selección única).
5058
+ * - Una acción primaria suelta → `ius-button` a secas.
5059
+ * - Barra de filtros de chips removibles → FilterBar/`ius-chip`.
5060
+ *
5061
+ * **Requisito de los hijos.** Todos con tratamiento outline y la misma altura.
5062
+ * OJO: en esta librería `ius-button variant="outline"` es el outline VERDE
5063
+ * (`--ius-success-*`, port verbatim de `Button.jsx`) y es más alto que los
5064
+ * disparadores outline de Dropdown/QueryBuilder (padding `sm lg` vs `xs sm`).
5065
+ * El grupo estira a todos al alto del más alto, pero el color del texto del
5066
+ * Button sigue siendo el suyo. La `SegmentGroup.prompt.md` describe el outline
5067
+ * como «borde 1px stroke + radio md», que es el de Dropdown/QueryBuilder, no el
5068
+ * del Button: divergencia de diseño a resolver por diseño, no por el port.
5069
+ *
5070
+ * **Divergencias doc-vs-golden** (manda el `.jsx`, según regla del repo):
5071
+ * - `segmentgroup.card.html` (panel «Tokens que consume») cita
5072
+ * `--ius-surface-card` para el fondo y `--ius-radius-lg` (14px) para las
5073
+ * esquinas. `SegmentGroup.jsx` usa `--ius-neutral-white` y
5074
+ * `--ius-radius-md` (8px). Se portó el JSX. El fondo es equivalente
5075
+ * (`--ius-surface-card` → `--ius-neutral-white`), pero el radio SÍ difiere:
5076
+ * 8px reales frente a 14px documentados. Pendiente de que diseño elija.
5077
+ *
5078
+ * Fuente de verdad: `components/layout/SegmentGroup/SegmentGroup.jsx` +
5079
+ * `SegmentGroup.d.ts` + `SegmentGroup.ng-spec.md` (proyecto Claude Design).
5080
+ *
5081
+ * @example
5082
+ * ```html
5083
+ * <ius-segment-group ariaLabel="Filtros de la lista">
5084
+ * <ius-dropdown variant="outline" triggerIcon="calendar_month"
5085
+ * triggerLabel="Últimos 30 días" [items]="rangos" selectable />
5086
+ * <ius-query-builder [fields]="campos" (apply)="aplicar($event)" />
5087
+ * </ius-segment-group>
5088
+ * ```
2911
5089
  */
2912
- declare class ChipComponent {
2913
- /** Texto del chip. Alternativa a la proyección de contenido. */
2914
- label?: string;
2915
- /** Ícono Material Symbols a la izquierda (opcional). */
2916
- icon?: string;
2917
- /** Muestra el botón × y habilita quitar el chip (relleno azul). */
2918
- removable: boolean;
2919
- /** Tamaño de la pill. */
2920
- size: IusChipSize;
2921
- /** Deshabilitado (atenuado, × no funcional). */
2922
- disabled: boolean;
2923
- /** Estado forzado — **solo demos/especímenes**. */
2924
- state?: IusChipState;
2925
- /** aria-label del botón quitar. */
2926
- removeLabel: string;
2927
- /** Al pulsar la × (original `onRemove`). */
2928
- readonly removed: EventEmitter<void>;
2929
- /** Deshabilitado (real o forzado). */
2930
- protected get isDisabled(): boolean;
2931
- /** `data-state` solo cuando hay un estado forzado (≠ idle). */
2932
- protected get forcedState(): IusChipState | null;
2933
- protected handleRemove(event: MouseEvent): void;
2934
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<ChipComponent, never>;
2935
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ChipComponent, "ius-chip", never, { "label": { "alias": "label"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "removable": { "alias": "removable"; "required": false; }; "size": { "alias": "size"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "state": { "alias": "state"; "required": false; }; "removeLabel": { "alias": "removeLabel"; "required": false; }; }, { "removed": "removed"; }, never, ["*"], true, never>;
2936
- static ngAcceptInputType_removable: unknown;
2937
- static ngAcceptInputType_disabled: unknown;
5090
+ declare class SegmentGroupComponent {
5091
+ /**
5092
+ * Etiqueta accesible del grupo — se emite como `aria-label` sobre el
5093
+ * `role="group"` del host. Sin ella el grupo queda sin nombre accesible:
5094
+ * decláralo siempre que el conjunto tenga un significado propio
5095
+ * («Herramientas de la lista», «Filtros»…).
5096
+ */
5097
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
5098
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SegmentGroupComponent, never>;
5099
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SegmentGroupComponent, "ius-segment-group", never, { "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2938
5100
  }
2939
5101
 
2940
- type IusFlexDirection = 'row' | 'column';
2941
- type IusFlexGap = 'none' | 'xxs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl';
2942
- type IusFlexAlign = 'start' | 'center' | 'end' | 'stretch' | 'baseline';
2943
- type IusFlexJustify = 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly';
5102
+ /** Eje del reparto — `horizontal` = áreas lado a lado (divisor vertical). */
5103
+ type IusSplitterOrientation = 'horizontal' | 'vertical';
5104
+ /** Color de módulo del divisor en hover / arrastre / foco. */
5105
+ type IusSplitterAccent = 'primary' | 'info' | 'success' | 'warning' | 'danger' | 'neutral' | 'durazno' | 'banano' | 'sandia' | 'arandano' | 'uva' | 'aguacate';
2944
5106
  /**
2945
- * Flexprimitivo de maquetación (ng-spec components/layout/Flex).
5107
+ * SplitterIus Design v2.
2946
5108
  *
2947
- * Contenedor flexbox cuyo `gap` está RESTRINGIDO a la escala --ius-space-*
2948
- * (no existe gap numérico libre: esa restricción es el punto del componente).
2949
- * Reemplaza el `<div style="display:flex; gap:…">` a mano.
5109
+ * Separa dos áreas (horizontal o verticalmente) con un divisor que el usuario
5110
+ * **arrastra**. La primera área es la redimensionable; la segunda ocupa el resto.
5111
+ * El tamaño se mantiene internamente en **porcentaje** (así se adapta solo cuando
5112
+ * el contenedor cambia de tamaño) y se **reporta en píxeles** por `changed` /
5113
+ * `resizeEnd`. Para 3+ áreas, anidar splitters.
2950
5114
  *
2951
- * Sin estilos propios: todas las reglas viven en la librería de estilos
2952
- * (tokens.css sección layout.css, clases .ius-flex + data-attrs) — este
2953
- * componente es azúcar que emite la clase y los atributos.
5115
+ * Las dos áreas se proyectan por atributo el consumidor marca sus dos hijos
5116
+ * (equivale al `children: [first, second]` del golden React):
2954
5117
  *
2955
- * El `as` de la spec se resuelve con el selector de ATRIBUTO, sin nodo extra:
2956
- * <nav ius-flex gap="sm">…</nav> · <ul ius-flex direction="column">…</ul>
2957
- * La forma de elemento también es válida: <ius-flex gap="lg">…</ius-flex>.
5118
+ * ```html
5119
+ * <ius-splitter [min]="160" [minSecond]="240" accent="info">
5120
+ * <aside iusSplitterFirst>…</aside>
5121
+ * <section iusSplitterSecond>…</section>
5122
+ * </ius-splitter>
5123
+ * ```
2958
5124
  *
2959
- * Solo estructura: no aporta cáscara de página (AppLayout), superficie (Card)
2960
- * ni tipografía (Text). Sin outputs, sin estado, sin user-select.
5125
+ * Controlado vs no controlado: si `size` está presente el componente es
5126
+ * **controlado** (no muta su porcentaje solo; el consumidor reacciona a
5127
+ * `changed`); si no, `defaultSize` fija el tamaño inicial y el componente se
5128
+ * gestiona internamente.
5129
+ *
5130
+ * Notas de port:
5131
+ * - El host `<ius-splitter>` **es** el div raíz `.ius-splitter` del golden.
5132
+ * - `aria-orientation` es `vertical` cuando `orientation` es `horizontal` (el
5133
+ * divisor es la línea vertical) y viceversa: así está en el golden.
5134
+ * - `aria-valuenow` se publica siempre (0 mientras no se ha medido) para no
5135
+ * dejar el `role="separator"` sin valor en el primer tick.
5136
+ * - El gutter de 1px, el grip de 4x24px y el área de agarre de -6px vienen del
5137
+ * CSS golden y se portan tal cual (px fuera de escala documentados).
5138
+ * - `ResizeObserver` no recalcula el porcentaje (ya es relativo), pero sí
5139
+ * reclampa cuando el nuevo total viola `min`/`minSecond`.
2961
5140
  */
2962
- declare class FlexComponent {
2963
- /** Eje principal; 'column' = patrón stack. Solo emite data-dir en column. */
2964
- direction: IusFlexDirection;
2965
- /** Separación entre hijos SOLO escala --ius-space-*. */
2966
- gap: IusFlexGap;
2967
- /** align-items; sin valor no se emite (default del navegador: stretch). */
2968
- align?: IusFlexAlign;
2969
- /** justify-content; sin valor no se emite (default: flex-start). */
2970
- justify?: IusFlexJustify;
2971
- /** flex-wrap: wrap (patrón cluster). */
2972
- wrap: boolean;
2973
- /** inline-flex en vez de flex (grupos que fluyen dentro de texto). */
2974
- inline: boolean;
2975
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<FlexComponent, never>;
2976
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlexComponent, "ius-flex, [ius-flex]", never, { "direction": { "alias": "direction"; "required": false; }; "gap": { "alias": "gap"; "required": false; }; "align": { "alias": "align"; "required": false; }; "justify": { "alias": "justify"; "required": false; }; "wrap": { "alias": "wrap"; "required": false; }; "inline": { "alias": "inline"; "required": false; }; }, {}, never, ["*"], true, never>;
5141
+ declare class SplitterComponent implements AfterViewInit, OnChanges, OnDestroy {
5142
+ /** Eje del reparto: `horizontal` = lado a lado (divisor vertical). */
5143
+ orientation: IusSplitterOrientation;
5144
+ /** Tamaño de la primera área (px o `'40%'`). Presente = componente CONTROLADO. */
5145
+ size?: number | string;
5146
+ /** Tamaño inicial de la primera área cuando NO es controlado. */
5147
+ defaultSize: number | string;
5148
+ /** Color de módulo del divisor en hover / arrastre / foco. */
5149
+ accent: IusSplitterAccent;
5150
+ /** Mínimo de la primera área, en px. */
5151
+ min: number;
5152
+ /** Máximo de la primera área, en px. Omitido = contenedor `minSecond`. */
5153
+ max?: number;
5154
+ /** Mínimo de la segunda área, en px. */
5155
+ minSecond: number;
5156
+ /** Congela el divisor (sin arrastre, sin teclado, sin grip). */
5157
+ disabled: boolean;
5158
+ /** Clase(s) extra para el panel de la primera área. */
5159
+ firstClass?: string;
5160
+ /** Clase(s) extra para el panel de la segunda área. */
5161
+ secondClass?: string;
5162
+ /** Estilos en línea para el panel de la primera área. */
5163
+ firstStyle?: Record<string, string>;
5164
+ /** Estilos en línea para el panel de la segunda área. */
5165
+ secondStyle?: Record<string, string>;
5166
+ /** Tamaño de la primera área en px, durante el arrastre o el teclado. */
5167
+ readonly changed: EventEmitter<number>;
5168
+ /** Tamaño de la primera área en px al terminar el arrastre — para persistir. */
5169
+ readonly resizeEnd: EventEmitter<number>;
5170
+ /** Porcentaje de la primera área; `null` hasta la primera medición. */
5171
+ protected readonly pct: _angular_core.WritableSignal<number | null>;
5172
+ /** Arrastre en curso. */
5173
+ protected readonly dragging: _angular_core.WritableSignal<boolean>;
5174
+ private readonly host;
5175
+ private ro;
5176
+ private viewReady;
5177
+ /** `true` cuando el reparto es lado a lado. */
5178
+ private get horizontal();
5179
+ /** El consumidor manda el tamaño (no se muta el porcentaje en drag/teclado). */
5180
+ private get isControlled();
5181
+ /** Clases del panel de la primera área (base + `firstClass`). */
5182
+ protected get firstClasses(): string;
5183
+ /** Clases del panel de la segunda área (base + `secondClass`). */
5184
+ protected get secondClasses(): string;
5185
+ /** `flex-basis` de la primera área: `%` medido, o el `defaultSize` en crudo. */
5186
+ protected get firstBasis(): string;
5187
+ /** El divisor es la línea perpendicular al eje del reparto (así en el golden). */
5188
+ protected get ariaOrientation(): 'horizontal' | 'vertical';
5189
+ /** Valor del `separator` (porcentaje redondeado). */
5190
+ protected get valueNow(): number;
5191
+ ngAfterViewInit(): void;
5192
+ ngOnChanges(changes: SimpleChanges): void;
5193
+ ngOnDestroy(): void;
5194
+ /** Tamaño útil del host en el eje del reparto. */
5195
+ private measure;
5196
+ /** Deriva el porcentaje inicial desde `size` (controlado) o `defaultSize`. */
5197
+ private sync;
5198
+ /** Acota px de la primera área respetando `min`, `max` y `minSecond`. */
5199
+ private clampPx;
5200
+ /**
5201
+ * El contenedor cambió de tamaño: el porcentaje sigue siendo válido, pero el
5202
+ * nuevo total puede violar `min`/`minSecond` → se reclampa.
5203
+ */
5204
+ private onHostResize;
5205
+ /** Traduce la posición del puntero a tamaño de la primera área y lo emite. */
5206
+ private applyFromPointer;
5207
+ protected onPointerDown(event: PointerEvent): void;
5208
+ protected onPointerMove(event: PointerEvent): void;
5209
+ protected onPointerUp(event: PointerEvent): void;
5210
+ protected onKeyDown(event: KeyboardEvent): void;
5211
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SplitterComponent, never>;
5212
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SplitterComponent, "ius-splitter", never, { "orientation": { "alias": "orientation"; "required": false; }; "size": { "alias": "size"; "required": false; }; "defaultSize": { "alias": "defaultSize"; "required": false; }; "accent": { "alias": "accent"; "required": false; }; "min": { "alias": "min"; "required": false; }; "max": { "alias": "max"; "required": false; }; "minSecond": { "alias": "minSecond"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "firstClass": { "alias": "firstClass"; "required": false; }; "secondClass": { "alias": "secondClass"; "required": false; }; "firstStyle": { "alias": "firstStyle"; "required": false; }; "secondStyle": { "alias": "secondStyle"; "required": false; }; }, { "changed": "changed"; "resizeEnd": "resizeEnd"; }, never, ["[iusSplitterFirst]", "[iusSplitterSecond]"], true, never>;
5213
+ static ngAcceptInputType_min: unknown;
5214
+ static ngAcceptInputType_max: unknown;
5215
+ static ngAcceptInputType_minSecond: unknown;
5216
+ static ngAcceptInputType_disabled: unknown;
2977
5217
  }
2978
5218
 
2979
- type IusDividerOrientation = 'horizontal' | 'vertical';
2980
- type IusDividerVariant = 'solid' | 'dashed';
2981
- type IusDividerTextAlign = 'start' | 'center' | 'end';
2982
5219
  /**
2983
- * Divider separador NEUTRO (ng-spec components/data-display/Divider).
2984
- * Línea fina 1px --ius-neutral-3, horizontal (con etiqueta opcional proyectada)
2985
- * o vertical (rellena el alto del contenedor). Para separadores con tono
2986
- * semántico → Alert o borde propio. Sin outputs.
5220
+ * Color de módulo del divisor del nav (6 semánticos + 6 frutas).
5221
+ * Reusa el contrato del Splitter: es el mismo `accent` que se le pasa.
5222
+ */
5223
+ type IusAppLayoutAccent = IusSplitterAccent;
5224
+ /**
5225
+ * AppLayout — Ius Design v2.
2987
5226
  *
2988
- * Etiqueta: contenido proyectado (solo horizontal). textAlign mueve el trazo
2989
- * corto (stub) al lado del título, como el golden.
5227
+ * Cáscara estructural del ecosistema, de alto completo del viewport: HeaderBar
5228
+ * arriba; debajo, la fila `rail` (NavRail de módulos **o** SettingsNav de
5229
+ * configuración del ecosistema — mutuamente excluyentes) · `nav` (EntityNavigator
5230
+ * **o** SettingsNav de módulo, convive con el rail) · contenido con **scroll
5231
+ * propio** · `overlay` (UserMenu, sheets) por encima de todo.
5232
+ *
5233
+ * Es **solo estructura por slots**: el cambio de módulo y los menús los maneja
5234
+ * el consumidor. Los slots son agnósticos (no imponen qué componente va dentro).
5235
+ *
5236
+ * Slots (por atributo): `header`, `rail`, `nav`, `overlay` y el contenido por
5237
+ * defecto (`children` del golden):
5238
+ *
5239
+ * ```html
5240
+ * <ius-app-layout resizableNav navAccent="uva" (navResizeEnd)="guardar($event)">
5241
+ * <ius-header-bar header />
5242
+ * <nav rail>…</nav>
5243
+ * <aside nav>…</aside>
5244
+ * <section>… contenido del módulo …</section>
5245
+ * <ius-user-menu overlay />
5246
+ * </ius-app-layout>
5247
+ * ```
5248
+ *
5249
+ * Notas de port:
5250
+ * - El host `<ius-app-layout>` **es** el div raíz `.ius-applayout` del golden.
5251
+ * - Los slots `[nav]` y el contenido aparecen en **dos ramas** del golden (con y
5252
+ * sin Splitter), pero un `<ng-content>` con el mismo selector solo puede vivir
5253
+ * una vez a la vez → se declaran en `<ng-template>` (`#navSlot` / `#mainSlot`)
5254
+ * y se instancian con `NgTemplateOutlet`, igual que el golden reusa su
5255
+ * `mainEl`. Las ramas son `@if`/`@else`, así que nunca hay dos instancias
5256
+ * simultáneas del mismo `ng-content`.
5257
+ * - Angular no puede saber si `[nav]` trae contenido antes de renderizar, así que
5258
+ * la rama del Splitter se decide **solo** con `resizableNav && !navCollapsed`
5259
+ * (el golden añade `nav != null`, guarda que aquí no aplica). El consumidor
5260
+ * activa `resizableNav` únicamente cuando proyecta algo en `[nav]` — que es el
5261
+ * uso real. Sin `nav`, la rama no-splitter renderiza el envoltorio
5262
+ * `.ius-applayout__nav` vacío: con `flex: 0 0 auto` colapsa a 0px, así que es
5263
+ * equivalente visual al condicional del golden.
5264
+ * - Por lo mismo, `.ius-applayout__header` y `.ius-applayout__rail` se renderizan
5265
+ * siempre (vacíos colapsan a 0). El `overlay` se proyecta directo, sin
5266
+ * envoltorio, como en el golden.
5267
+ * - El segundo área del Splitter necesita un **elemento real** que reciba el
5268
+ * atributo de proyección (`<ng-container>` no puede llevarlo) → se añade el
5269
+ * envoltorio `.ius-applayout__splitsecond`, propio del port, con estilos que
5270
+ * dejan al `<main>` llenar el panel.
5271
+ * - `navCollapsed` no fija ancho aquí: el golden solo omite el Splitter y el
5272
+ * riel angosto lo define el propio componente del slot `[nav]`
5273
+ * (`.ius-applayout__nav` es `flex: 0 0 auto`, respeta el ancho intrínseco).
5274
+ * - El `pane--first` del Splitter trae `overflow: auto` de su CSS golden; es
5275
+ * correcto y esperado, no se altera.
5276
+ * - `fill` viene en `true` (100vh). Para desactivarlo se usa `[fill]="false"`.
2990
5277
  */
2991
- declare class DividerComponent implements AfterViewInit {
2992
- /** Eje; vertical rellena el alto del contenedor (sin etiqueta). */
2993
- orientation: IusDividerOrientation;
2994
- /** dashed = separación suave. */
2995
- variant: IusDividerVariant;
2996
- /** Alineación de la etiqueta (solo horizontal con etiqueta). */
2997
- textAlign: IusDividerTextAlign;
2998
- private labelWrap;
2999
- protected readonly hasLabel: _angular_core.WritableSignal<boolean>;
3000
- ngAfterViewInit(): void;
3001
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DividerComponent, never>;
3002
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DividerComponent, "ius-divider", never, { "orientation": { "alias": "orientation"; "required": false; }; "variant": { "alias": "variant"; "required": false; }; "textAlign": { "alias": "textAlign"; "required": false; }; }, {}, never, ["*"], true, never>;
5278
+ declare class AppLayoutComponent {
5279
+ /** Envuelve el slot `[nav]` en un Splitter arrastrable. */
5280
+ resizableNav: boolean;
5281
+ /** Nav colapsado (riel angosto): omite el Splitter y usa el ancho del propio nav. */
5282
+ navCollapsed: boolean;
5283
+ /** Ancho inicial del nav redimensionable (número px, o `'300px'` / `'22%'`). */
5284
+ navWidth: number | string;
5285
+ /** Mínimo del nav, en px. */
5286
+ navMin: number;
5287
+ /** Máximo del nav, en px. */
5288
+ navMax: number;
5289
+ /** Mínimo del contenido (segunda área), en px. */
5290
+ navMinSecond: number;
5291
+ /** Color del divisor del nav = color del módulo activo. */
5292
+ navAccent: IusAppLayoutAccent;
5293
+ /** Ocupa el alto completo del viewport (100vh). Desactivar con `[fill]="false"`. */
5294
+ fill: boolean;
5295
+ /** Ancho final del nav en px al soltar el divisor — para persistirlo. */
5296
+ readonly navResizeEnd: EventEmitter<number>;
5297
+ /** Fondo del panel de contenido (equivale al `secondStyle` del golden). */
5298
+ protected readonly mainPaneStyle: Record<string, string>;
5299
+ /** El nav va dentro del Splitter solo si es redimensionable y no está colapsado. */
5300
+ protected get splitNav(): boolean;
5301
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AppLayoutComponent, never>;
5302
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AppLayoutComponent, "ius-app-layout", never, { "resizableNav": { "alias": "resizableNav"; "required": false; }; "navCollapsed": { "alias": "navCollapsed"; "required": false; }; "navWidth": { "alias": "navWidth"; "required": false; }; "navMin": { "alias": "navMin"; "required": false; }; "navMax": { "alias": "navMax"; "required": false; }; "navMinSecond": { "alias": "navMinSecond"; "required": false; }; "navAccent": { "alias": "navAccent"; "required": false; }; "fill": { "alias": "fill"; "required": false; }; }, { "navResizeEnd": "navResizeEnd"; }, never, ["[header]", "[rail]", "[overlay]", "[nav]", "*"], true, never>;
5303
+ static ngAcceptInputType_resizableNav: unknown;
5304
+ static ngAcceptInputType_navCollapsed: unknown;
5305
+ static ngAcceptInputType_navMin: unknown;
5306
+ static ngAcceptInputType_navMax: unknown;
5307
+ static ngAcceptInputType_navMinSecond: unknown;
5308
+ static ngAcceptInputType_fill: unknown;
3003
5309
  }
3004
5310
 
3005
- export { AlertComponent, AvatarComponent, ButtonComponent, CaptchaFieldComponent, CarouselComponent, CheckboxComponent, ChipComponent, CircularProgressComponent, CodeFieldComponent, CountdownComponent, CountdownRingComponent, DescriptionListComponent, DividerComponent, EleniaBubbleComponent, EleniaOrbComponent, EmptyStateComponent, FlexComponent, HeaderBarComponent, ILLUSTRATIONS, ILLUSTRATION_ALIAS, ILLUSTRATION_NAMES, IconButtonComponent, IllustrationComponent, IusAlertActionsDirective, IusAlertTrailingDirective, IusModalFooterDirective, IusTagPrefixDirective, IusTagSuffixDirective, LoadingComponent, LoadingMarkComponent, ModalComponent, MultiTextFieldComponent, NavUserComponent, ORB_PERIODS, OauthButtonComponent, OptionItemComponent, PopoverComponent, ScrollAreaComponent, SegmentedControlComponent, SelectComponent, ShowMoreComponent, StatusStateComponent, TagComponent, TextButtonComponent, TextComponent, TextFieldComponent, TooltipComponent, WizardComponent, WizardController, WizardNavComponent, createWizard, pose, poseIso, poseSpeaking, poseThinking, renderCubeSvg, resolveIllustration, voiceEnv };
3006
- export type { AlertSize, AlertTone, AlertVariant, CountdownDirection, CountdownFormat, CountdownRingSize, CountdownRingTone, DescriptionListItem, DescriptionListLayout, DescriptionListSize, DescriptionListValueClick, IllustrationEntry, IllustrationName, IllustrationSize, IusAvatarColor, IusAvatarShape, IusAvatarSize, IusButtonActionResult, IusButtonSize, IusButtonStatus, IusButtonType, IusButtonVariant, IusCaptchaAppearance, IusCaptchaFieldHandle, IusCaptchaProvider, IusCaptchaSize, IusCaptchaState, IusCaptchaTheme, IusCarouselImage, IusCarouselImageInput, IusCarouselObjectFit, IusCarouselOrder, IusCarouselOverlay, IusCarouselTransition, IusCheckboxLabelPosition, IusCheckboxSize, IusChipSize, IusChipState, IusCircularProgressSize, IusCircularProgressTone, IusCodeFieldSize, IusDividerOrientation, IusDividerTextAlign, IusDividerVariant, IusEleniaBubblePosition, IusEleniaBubbleSize, IusEleniaOrbMood, IusEleniaOrbSurface, IusEmptyStateAction, IusEmptyStateSize, IusEmptyStateTone, IusEmptyStateVariant, IusFlexAlign, IusFlexDirection, IusFlexGap, IusFlexJustify, IusIconButtonShape, IusIconButtonSize, IusIconButtonVariant, IusLoadingMarkSurface, IusLoadingVariant, IusModalCloseReason, IusModalIconTone, IusModalSize, IusMultiTextFieldSize, IusMultiTextFieldSlot, IusMultiTextFieldState, IusNavUserAccount, IusNavUserLayout, IusNavUserUser, IusOAuthButtonSize, IusOAuthButtonType, IusOAuthProvider, IusOptionItemSize, IusOptionItemState, IusPopoverPadding, IusPopoverPlacement, IusPopoverTrigger, IusScrollAxis, IusScrollSize, IusSegmentedSize, IusSegmentedVariant, IusSelectSize, IusSelectState, IusSelectValue, IusShowMoreAlign, IusStatusKind, IusTagRole, IusTagShape, IusTagSize, IusTagState, IusTagTone, IusTagVariant, IusTextAlign, IusTextButtonSize, IusTextButtonType, IusTextColor, IusTextFieldSize, IusTextFieldType, IusTextTag, IusTextVariant, IusTextWeight, IusTooltipTrigger, OrbMood, OrbPose, SegmentedOption, SelectOption, SelectOptionGroup, UseWizardOptions, WizardApi, WizardStep };
5311
+ export { AlertComponent, AppLayoutComponent, AvatarComponent, ButtonComponent, CaptchaFieldComponent, CarouselComponent, CheckboxComponent, ChipComponent, CircularProgressComponent, CodeFieldComponent, CountdownComponent, CountdownRingComponent, DescriptionListComponent, DividerComponent, DrawerComponent, DropdownComponent, EleniaBubbleComponent, EleniaOrbComponent, EmptyStateComponent, FlexComponent, HeaderBarComponent, ILLUSTRATIONS, ILLUSTRATION_ALIAS, ILLUSTRATION_NAMES, IUS_FILTER_OPERATORS, IconButtonComponent, IllustrationComponent, InsigniaComponent, IusAlertActionsDirective, IusAlertTrailingDirective, IusDrawerFooterDirective, IusDrawerHeaderActionsDirective, IusDrawerTitleDirective, IusDropdownTriggerDirective, IusListCardLeadingDirective, IusListCardOverlineDirective, IusListCardParagraphDirective, IusListCardSubtitleDirective, IusListCardTitleDirective, IusListViewFiltersDirective, IusListViewFooterEndDirective, IusListViewFooterStartDirective, IusListViewHeaderEndDirective, IusListViewHeaderStartDirective, IusListViewToolbarDirective, IusMenuItemTrailingDirective, IusModalFooterDirective, IusPersonItemNameDirective, IusPersonItemTrailingDirective, IusTagPrefixDirective, IusTagSuffixDirective, ListCardComponent, ListViewComponent, LoadingComponent, LoadingMarkComponent, MenuComponent, MenuItemComponent, ModalComponent, MultiTextFieldComponent, NavUserComponent, ORB_PERIODS, OauthButtonComponent, OptionItemComponent, PersonItemComponent, PersonPickerComponent, PopoverComponent, QueryBuilderComponent, STATUS_TONES, STATUS_VOCAB, STATUS_VOCABS, STATUS_VOCABS_PENDING, ScrollAreaComponent, SearchBarComponent, SegmentGroupComponent, SegmentedControlComponent, SelectComponent, ShowMoreComponent, SplitterComponent, StatusChipComponent, StatusStateComponent, TagComponent, TextAreaComponent, TextButtonComponent, TextComponent, TextFieldComponent, TooltipComponent, WizardComponent, WizardController, WizardNavComponent, createWizard, pose, poseIso, poseSpeaking, poseThinking, renderCubeSvg, resolveIllustration, resolveStatus, statusOptions, statusOrder, statusToneVars, statusVocab, voiceEnv };
5312
+ export type { ActuacionStatus, AlertSize, AlertTone, AlertVariant, CountdownDirection, CountdownFormat, CountdownRingSize, CountdownRingTone, DescriptionListItem, DescriptionListLayout, DescriptionListSize, DescriptionListValueClick, GestionStatus, IllustrationEntry, IllustrationName, IllustrationSize, IusAppLayoutAccent, IusAvatarColor, IusAvatarShape, IusAvatarSize, IusButtonActionResult, IusButtonSize, IusButtonStatus, IusButtonType, IusButtonVariant, IusCaptchaAppearance, IusCaptchaFieldHandle, IusCaptchaProvider, IusCaptchaSize, IusCaptchaState, IusCaptchaTheme, IusCarouselImage, IusCarouselImageInput, IusCarouselObjectFit, IusCarouselOrder, IusCarouselOverlay, IusCarouselTransition, IusCheckboxLabelPosition, IusCheckboxSize, IusChipSize, IusChipState, IusCircularProgressSize, IusCircularProgressTone, IusCodeFieldSize, IusDividerOrientation, IusDividerTextAlign, IusDividerVariant, IusDrawerSide, IusDrawerSize, IusDropdownItem, IusDropdownTone, IusDropdownVariant, IusEleniaBubblePosition, IusEleniaBubbleSize, IusEleniaOrbMood, IusEleniaOrbSurface, IusEmptyStateAction, IusEmptyStateSize, IusEmptyStateTone, IusEmptyStateVariant, IusFilterField, IusFilterFieldOption, IusFilterFieldType, IusFilterRule, IusFilterValue, IusFlexAlign, IusFlexDirection, IusFlexGap, IusFlexJustify, IusIconButtonShape, IusIconButtonSize, IusIconButtonVariant, IusInsigniaSize, IusInsigniaTone, IusInsigniaVariant, IusListCardAction, IusListCardField, IusListCardMarker, IusListCardMenuItem, IusListCardSize, IusListCardStatus, IusListCardTag, IusListCardTone, IusListViewAction, IusListViewSize, IusListViewSortOption, IusLoadingMarkSurface, IusLoadingVariant, IusMenuItemSize, IusMenuItemState, IusMenuItemVariant, IusMenuOption, IusModalCloseReason, IusModalIconTone, IusModalSize, IusMultiTextFieldSize, IusMultiTextFieldSlot, IusMultiTextFieldState, IusNavUserAccount, IusNavUserLayout, IusNavUserUser, IusOAuthButtonSize, IusOAuthButtonType, IusOAuthProvider, IusOptionItemSize, IusOptionItemState, IusPersonId, IusPersonItemAction, IusPersonItemSize, IusPersonItemState, IusPersonItemVariant, IusPersonOption, IusPersonPickerSelectedContext, IusPopoverPadding, IusPopoverPlacement, IusPopoverTrigger, IusQueryBuilderSize, IusScrollAxis, IusScrollSize, IusSearchBarSize, IusSearchBarState, IusSegmentedSize, IusSegmentedVariant, IusSelectCreateFactory, IusSelectSize, IusSelectState, IusSelectValue, IusShowMoreAlign, IusSplitterAccent, IusSplitterOrientation, IusStatusChipSize, IusStatusChipTone, IusStatusKind, IusTagRole, IusTagShape, IusTagSize, IusTagState, IusTagTone, IusTagVariant, IusTextAlign, IusTextAreaSize, IusTextAreaState, IusTextButtonSize, IusTextButtonType, IusTextColor, IusTextFieldSize, IusTextFieldType, IusTextTag, IusTextVariant, IusTextWeight, IusTooltipTrigger, OrbMood, OrbPose, SegmentedOption, SelectOption, SelectOptionGroup, StatusMeta, StatusOption, StatusTone, StatusToneVars, StatusVocabMap, StatusVocabName, UseWizardOptions, WizardApi, WizardStep };