@litigiovirtual/ius-design-components 2.2.11 → 2.3.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@litigiovirtual/ius-design-components",
3
- "version": "2.2.11",
3
+ "version": "2.3.0",
4
4
  "peerDependencies": {
5
5
  "@angular/cdk": ">=22.0.0 <23.0.0",
6
6
  "@angular/common": ">=22.0.0 <23.0.0",
@@ -36,6 +36,11 @@ interface SizePreset$2 {
36
36
  * idle. Una excepción de `action` cae a `error`; resolver sin valor es
37
37
  * `success`. `dynamic` ignora los inputs manuales `loading`/`status`.
38
38
  *
39
+ * En loading/success/error el contenido (prefixIcon + label + sufixIcon) sigue
40
+ * en el flujo con `visibility:hidden` para conservar el ancho natural, y el
41
+ * spinner o el ícono `check_circle`/`error` se superpone centrado en
42
+ * `.ius-btn__overlay` (§4/§7).
43
+ *
39
44
  * Nota: el `state` de la spec ("solo demos") se omite de la API pública —
40
45
  * mismo criterio que TextField. El playground congela hover/pressed con el
41
46
  * atributo `data-force` en el host (solo CSS); loading/success/error/disabled
@@ -893,7 +898,7 @@ declare class AlertComponent {
893
898
  /** Divisor sobre la fila de acciones. */
894
899
  readonly actionsDivider: _angular_core.InputSignalWithTransform<boolean, unknown>;
895
900
  /** Alineación (auto: `center` si hay `trailing` sin `actions`). */
896
- readonly align: _angular_core.InputSignal<"start" | "center" | undefined>;
901
+ readonly align: _angular_core.InputSignal<"center" | "start" | undefined>;
897
902
  /** `status` (default, no interrumpe) o `alert` (asertivo). */
898
903
  readonly role: _angular_core.InputSignal<"alert" | "status">;
899
904
  /** Al pulsar × (original: `onClose`). */
@@ -904,7 +909,7 @@ declare class AlertComponent {
904
909
  protected readonly hasTrailing: _angular_core.Signal<boolean>;
905
910
  /** trailing y actions son excluyentes: si hay ambos, gana actions. */
906
911
  protected readonly showTrailing: _angular_core.Signal<boolean>;
907
- protected readonly computedAlign: _angular_core.Signal<"start" | "center">;
912
+ protected readonly computedAlign: _angular_core.Signal<"center" | "start">;
908
913
  protected readonly iconName: _angular_core.Signal<string | null>;
909
914
  protected readonly chip: _angular_core.Signal<boolean>;
910
915
  protected readonly showHead: _angular_core.Signal<boolean>;
@@ -4939,6 +4944,14 @@ interface WizardApi {
4939
4944
  back(): void;
4940
4945
  /** Salta a un paso (1-based), o función `(prev) => next`. */
4941
4946
  goTo(next: number | ((prev: number) => number)): void;
4947
+ /**
4948
+ * `true` mientras el botón final dinámico de `ius-wizard-nav`
4949
+ * (`finishDynamic`) no está en reposo (loading · success · error). Sirve para
4950
+ * bloquear otras salidas (p. ej. `backDisabled` del PageHeader). Lo expone
4951
+ * `createWizard`; una api armada a mano puede omitirlo y escuchar el output
4952
+ * `finishingChange` del nav. `back()` llamado directo no se bloquea.
4953
+ */
4954
+ readonly finishing?: boolean;
4942
4955
  }
4943
4956
  interface UseWizardOptions {
4944
4957
  /**
@@ -4977,6 +4990,8 @@ declare class WizardController implements WizardApi {
4977
4990
  private readonly internal?;
4978
4991
  /** Señal de solo lectura del paso (1-based, acotado al total). */
4979
4992
  readonly step$: Signal<number>;
4993
+ /** Espera del botón final; la escribe `ius-wizard-nav` (golden `_setFinishing`). */
4994
+ private readonly finishingSource;
4980
4995
  private readonly onStepChange?;
4981
4996
  private readonly onFinish?;
4982
4997
  constructor(options: UseWizardOptions);
@@ -4987,6 +5002,12 @@ declare class WizardController implements WizardApi {
4987
5002
  get current(): WizardStep | null;
4988
5003
  get isFirst(): boolean;
4989
5004
  get isLast(): boolean;
5005
+ get finishing(): boolean;
5006
+ /**
5007
+ * Lo llama `ius-wizard-nav` al entrar en la espera del botón final y al
5008
+ * volver a reposo. No es para el consumidor: este lee `finishing`.
5009
+ */
5010
+ setFinishing(finishing: boolean): void;
4990
5011
  goTo: (next: number | ((prev: number) => number)) => void;
4991
5012
  next: () => void;
4992
5013
  back: () => void;
@@ -5043,8 +5064,16 @@ declare class WizardComponent {
5043
5064
  * El handler final se pasa como `finishAction` (con `finishDynamic` debe
5044
5065
  * devolver una `Promise` para integrarse con el modo dynamic del Button);
5045
5066
  * además se emite el output `finish` (ng-spec §4).
5067
+ *
5068
+ * Espera del botón final (`finishDynamic`): mientras está en loading · success ·
5069
+ * error, «Atrás» queda deshabilitado, `api.finishing` es `true` (api de
5070
+ * `createWizard`) y `finishingChange` avisa `true` al entrar y `false` al volver
5071
+ * a reposo. El nav espeja la fase del Button con sus mismos tiempos, como el
5072
+ * golden. Si el nav se destruye en plena espera limpia sus timers sin avisar
5073
+ * (igual que el golden) y libera `api.finishing`, para que una api que
5074
+ * sobrevive no quede bloqueada.
5046
5075
  */
5047
- declare class WizardNavComponent {
5076
+ declare class WizardNavComponent implements OnDestroy {
5048
5077
  /** API de `createWizard(...)`. */
5049
5078
  api: WizardApi;
5050
5079
  /** Etiqueta del botón atrás. */
@@ -5055,12 +5084,17 @@ declare class WizardNavComponent {
5055
5084
  finishLabel: string;
5056
5085
  /** Ícono al final del botón siguiente. */
5057
5086
  nextIcon: string;
5058
- /** El botón final usa el modo `dynamic` del Button (loading → success). */
5087
+ /**
5088
+ * El botón final usa el modo `dynamic` del Button (loading → success/error).
5089
+ * Mientras no está en reposo, «Atrás» se deshabilita solo.
5090
+ */
5059
5091
  finishDynamic: boolean;
5060
5092
  /** Deshabilita "siguiente" (p. ej. validación del paso pendiente). */
5061
5093
  nextDisabled: boolean;
5062
5094
  /** Oculta el botón atrás en el primer paso (en vez de deshabilitarlo). */
5063
5095
  hideBackOnFirst: boolean;
5096
+ /** Deshabilita «Atrás» a mano (con `finishDynamic` ya lo hace solo durante la espera). */
5097
+ backDisabled: boolean;
5064
5098
  /**
5065
5099
  * Handler del botón final. Con `finishDynamic` debe devolver una `Promise`
5066
5100
  * (su resolución decide success/error del Button).
@@ -5068,15 +5102,30 @@ declare class WizardNavComponent {
5068
5102
  finishAction?: () => void | IusButtonActionResult | Promise<IusButtonActionResult | void>;
5069
5103
  /** Se dispara al pulsar el botón final (original `onFinish`). */
5070
5104
  readonly finish: EventEmitter<void>;
5105
+ /**
5106
+ * Espera del botón final (`finishDynamic`, original `onFinishingChange`):
5107
+ * `true` al entrar en loading y `false` al volver a reposo tras success/error.
5108
+ * Mismo dato que `api.finishing`, para quien arma la api a mano.
5109
+ */
5110
+ readonly finishingChange: EventEmitter<boolean>;
5111
+ /** Espejo de la fase del Button dinámico: `true` desde loading hasta volver a idle. */
5112
+ protected readonly busy: _angular_core.WritableSignal<boolean>;
5113
+ private timers;
5114
+ private destroyed;
5071
5115
  /** `action` para el modo dynamic del Button: emite `finish` y espera el handler. */
5072
5116
  protected readonly runFinish: () => Promise<IusButtonActionResult | void>;
5117
+ ngOnDestroy(): void;
5073
5118
  /** Click del botón final en modo NO dynamic. */
5074
5119
  protected onFinishClick(): void;
5120
+ /** Solo en los cambios reposo ↔ espera: nunca en cada fase intermedia. */
5121
+ private setBusy;
5122
+ private later;
5075
5123
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WizardNavComponent, never>;
5076
- 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>;
5124
+ 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; }; "backDisabled": { "alias": "backDisabled"; "required": false; }; "finishAction": { "alias": "finishAction"; "required": false; }; }, { "finish": "finish"; "finishingChange": "finishingChange"; }, never, never, true, never>;
5077
5125
  static ngAcceptInputType_finishDynamic: unknown;
5078
5126
  static ngAcceptInputType_nextDisabled: unknown;
5079
5127
  static ngAcceptInputType_hideBackOnFirst: unknown;
5128
+ static ngAcceptInputType_backDisabled: unknown;
5080
5129
  }
5081
5130
 
5082
5131
  /** Eje con scroll. */
@@ -8171,6 +8220,12 @@ declare class PageHeaderComponent {
8171
8220
  readonly showBack: _angular_core.InputSignalWithTransform<boolean, unknown>;
8172
8221
  /** Texto accesible de la flecha de volver. */
8173
8222
  readonly backLabel: _angular_core.InputSignal<string>;
8223
+ /**
8224
+ * Flecha de volver desactivada en su sitio (`ius-icon-button` disabled): no se
8225
+ * mueve ni desaparece y no emite `back`. Caso: asistente cuyo botón final
8226
+ * espera (`api.finishing` / `finishingChange` de `ius-wizard-nav`).
8227
+ */
8228
+ readonly backDisabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
8174
8229
  /** Separador inferior. */
8175
8230
  readonly divider: _angular_core.InputSignalWithTransform<boolean, unknown>;
8176
8231
  /** Fondo blanco + borde + radio. */
@@ -8194,7 +8249,7 @@ declare class PageHeaderComponent {
8194
8249
  /** Volver es leading: si hay breadcrumb, encabeza esa fila. */
8195
8250
  protected readonly backInBreadcrumb: _angular_core.Signal<boolean>;
8196
8251
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PageHeaderComponent, never>;
8197
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<PageHeaderComponent, "ius-page-header", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "overline": { "alias": "overline"; "required": false; "isSignal": true; }; "titleLevel": { "alias": "titleLevel"; "required": false; "isSignal": true; }; "density": { "alias": "density"; "required": false; "isSignal": true; }; "showBack": { "alias": "showBack"; "required": false; "isSignal": true; }; "backLabel": { "alias": "backLabel"; "required": false; "isSignal": true; }; "divider": { "alias": "divider"; "required": false; "isSignal": true; }; "surface": { "alias": "surface"; "required": false; "isSignal": true; }; }, { "back": "back"; }, ["breadcrumbRef", "actionsRef", "toolbarRef", "overlineRef", "titleRef", "subtitleRef"], ["[iusPageHeaderBreadcrumb]", "[iusPageHeaderOverline]", "[iusPageHeaderTitle]", "[iusPageHeaderSubtitle]", "[iusPageHeaderActions]", "[iusPageHeaderToolbar]"], true, never>;
8252
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PageHeaderComponent, "ius-page-header", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "overline": { "alias": "overline"; "required": false; "isSignal": true; }; "titleLevel": { "alias": "titleLevel"; "required": false; "isSignal": true; }; "density": { "alias": "density"; "required": false; "isSignal": true; }; "showBack": { "alias": "showBack"; "required": false; "isSignal": true; }; "backLabel": { "alias": "backLabel"; "required": false; "isSignal": true; }; "backDisabled": { "alias": "backDisabled"; "required": false; "isSignal": true; }; "divider": { "alias": "divider"; "required": false; "isSignal": true; }; "surface": { "alias": "surface"; "required": false; "isSignal": true; }; }, { "back": "back"; }, ["breadcrumbRef", "actionsRef", "toolbarRef", "overlineRef", "titleRef", "subtitleRef"], ["[iusPageHeaderBreadcrumb]", "[iusPageHeaderOverline]", "[iusPageHeaderTitle]", "[iusPageHeaderSubtitle]", "[iusPageHeaderActions]", "[iusPageHeaderToolbar]"], true, never>;
8198
8253
  }
8199
8254
 
8200
8255
  /**
@@ -8512,6 +8567,12 @@ interface IusBreadcrumbItem {
8512
8567
  href?: string;
8513
8568
  /** Ícono Material Symbols a la izquierda del label (p. ej. `person`, `folder_open`, `gavel`). */
8514
8569
  icon?: string;
8570
+ /**
8571
+ * Desactiva el crumb: texto sin enlace (`aria-disabled`, `text-disabled`) que no
8572
+ * emite `navigate`; en el menú "…" la opción queda deshabilitada. Caso: bloquear
8573
+ * la salida de un asistente mientras su botón final espera.
8574
+ */
8575
+ disabled?: boolean;
8515
8576
  }
8516
8577
  type IusBreadcrumbSeparator = 'chevron' | 'slash';
8517
8578
  type IusBreadcrumbSize = 'small' | 'medium';