@ajuarezso/sui-design-system 0.5.5 → 0.7.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.
@@ -23,6 +23,93 @@ interface SuiTabBar {
23
23
  }
24
24
  declare const SUI_TAB_BAR: InjectionToken<SuiTabBar>;
25
25
 
26
+ type SuiBadgeColor = 'gray' | 'blue' | 'orange' | 'red' | 'green' | 'yellow' | 'purple' | 'sky' | 'pink' | 'teal';
27
+ type SuiBadgeVariant = 'filled' | 'light' | 'lighter' | 'stroke' | 'dark';
28
+ type SuiBadgeSize = 'small' | 'medium';
29
+ type SuiBadgeType = 'basic' | 'with-dot' | 'left-icon' | 'right-icon' | 'number';
30
+ /**
31
+ * Config de badge embebido en otros componentes (checkbox-label, switch-label,
32
+ * integration-switch, checkbox-card, radio-card, switch-card). Un solo input
33
+ * `[badge]` reemplaza al par booleano + badgeLabel; acepta string shorthand
34
+ * (`badge="NEW"`) para el caso común. Los componentes que renderizan un
35
+ * <sui-badge> real honran color/variant/size (defaults orange/light/small);
36
+ * las cards usan su render Figma-exacto y toman solo `label`.
37
+ */
38
+ interface SuiBadgeConfig {
39
+ label: string;
40
+ color?: SuiBadgeColor;
41
+ variant?: SuiBadgeVariant;
42
+ size?: SuiBadgeSize;
43
+ }
44
+ /**
45
+ * SUI Badge — SUI Design System 2.0
46
+ *
47
+ * Figma file: 8p1k72aKKvzJV4XcvPS4VO
48
+ * Variants pulled for verification:
49
+ * - 118:2584 Basic/Filled/Small/Gray
50
+ * - 118:2587 Basic/Light/Small/Gray
51
+ * - 118:2590 Basic/Lighter/Small/Gray
52
+ * - 118:2616 With Dot/Filled/Small/Gray
53
+ * - 118:2322 Left Icon/Light/Small/Gray
54
+ * - 289:7551 Right Icon/Stroke/Small/Gray
55
+ * - 118:2686 Basic/Filled/Small/Gray/Number=On
56
+ * - 119:2361 Basic/Filled/Medium/Gray
57
+ *
58
+ * EXACT (pulled):
59
+ * - Small: padding py=2px, font Subheading/2X Small 11/12/0.22px UPPERCASE, ss11 features
60
+ * - Medium basic: padding px=8 py=2 (119:2361), font Label/X Small 12/16/0 NO uppercase, ss11
61
+ * - Radius: 999 (full)
62
+ * - Per-type padding Small: Basic=px8 / LeftIcon=pl4 pr8 / RightIcon=pl8 pr4 /
63
+ * WithDot=pr8 ONLY (no left, no py) / Number=p2 (near-square, text w12)
64
+ * - WithDot box: dot vive en CONTAINER 16×16 (full-height del badge small),
65
+ * círculo r=2 → DIÁMETRO 4px centrado (asset SVG 118:2632). El dot del Badge
66
+ * regular (4px) es DISTINTO del dot del sui-status-badge (6px, r=3) — assets
67
+ * separados en el DS, NO unificar.
68
+ * - WithDot Medium (119:2369): padding pl2 pr8 py2, dot box SIGUE 16×16 (NO 20).
69
+ * - Style colors: Filled=bg-base+text-white, Light=bg-light+text-dark,
70
+ * Lighter=bg-lighter+text-BASE (NOT dark!), Stroke=border1-base+text-base
71
+ *
72
+ * INFERRED (declared approximations):
73
+ * - Medium Left/Right Icon padding: same asymmetric pattern as Small (4/8 vs 8/4)
74
+ * - Medium Number: p=2 (proportional to Small)
75
+ * - Medium icon size: 16x16 (scaled from Small's 12x12)
76
+ *
77
+ * PENDING VERIFY (inferido, sin confirmar pixel-exacto en Figma):
78
+ * - Medium Left Icon / Right Icon: el padding asimétrico (pl4/pr8, pl8/pr4) se
79
+ * asumió igual al Small. No se pulló la variante Medium+LeftIcon/RightIcon
80
+ * específica del archivo — el frame 118:2324 es too-large para pull directo.
81
+ * - Medium icon slot size 16×16: escalado del Small (12×12) sin confirmar contra
82
+ * una variante Medium con icono real.
83
+ * - Number type: el width del label (12px small / 16px medium) y el padding p2
84
+ * se infirieron de la variante Small Number=On (118:2686); no se confirmó si
85
+ * un número de 2 dígitos ('99') reflowea el width o se mantiene fijo.
86
+ * - Disabled: Figma demuestra Disabled=On solo en color Gray (representativo).
87
+ * El override universal a tokens disabled (todos los colores) es extrapolación
88
+ * intencional — más completa que la demo, asumida consistente con SUI 2.0.
89
+ *
90
+ * CUSTOM (not in Figma 118:2324 — add-on local del proyecto):
91
+ * - `variant='dark'` — glass translúcido vibrante pensado para superficies
92
+ * oscuras. El color tiñe el bg (22% alpha) y borde (45% alpha) del
93
+ * state-base, texto blanco para contraste. Se mantiene porque está en
94
+ * uso en pantallas con backgrounds oscuros (master-preview, etc.).
95
+ * Sin `[color]`, cae al fallback white-glass neutral.
96
+ *
97
+ * - `disabled` state: implementado con override de bg/border/text a tokens
98
+ * disabled-300 y faded-light/lighter (matchea visual figma), NO con
99
+ * `opacity` (que produciría tintes desaturados en lugar de gris uniforme).
100
+ */
101
+ declare class SuiBadge {
102
+ readonly color: _angular_core.InputSignal<SuiBadgeColor>;
103
+ readonly variant: _angular_core.InputSignal<SuiBadgeVariant>;
104
+ readonly size: _angular_core.InputSignal<SuiBadgeSize>;
105
+ readonly type: _angular_core.InputSignal<SuiBadgeType>;
106
+ readonly disabled: _angular_core.InputSignal<boolean>;
107
+ /** Internal: true when the badge renders its built-in dot (type=with-dot). */
108
+ readonly showsDot: _angular_core.Signal<boolean>;
109
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiBadge, never>;
110
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiBadge, "sui-badge", never, { "color": { "alias": "color"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, ["[data-slot=start]", "*", "[data-slot=end]"], true, never>;
111
+ }
112
+
26
113
  type SuiAccordionFlipIcon = 'off' | 'on';
27
114
  /**
28
115
  * SUI Accordion — SUI Design System 2.0
@@ -123,9 +210,11 @@ type SuiAccordionFlipIcon = 'off' | 'on';
123
210
  * el contenido proyectado se monta solo cuando se abre la primera vez,
124
211
  * y permanece en el DOM (no se desmuenta al cerrar) para conservar
125
212
  * state interno y evitar re-medir.
126
- * - `leftIcon` (boolean) gates si se muestra el slot izquierdo cuando
127
- * `flipIcon=off`. Cuando `flipIcon=on`, el slot izquierdo nunca aparece
128
- * (el toggle ocupa esa posición — coincide con Figma 210:4105/4111/4117).
213
+ * - `leftIcon` (string | boolean) controla el slot izquierdo cuando
214
+ * `flipIcon=off`: true = icono default 'question-line', string = nombre
215
+ * custom (Remix), false = sin icono. Cuando `flipIcon=on`, el slot
216
+ * izquierdo nunca aparece (el toggle ocupa esa posición — coincide con
217
+ * Figma 210:4105/4111/4117).
129
218
  *
130
219
  * iOS WKWebView :active fix: el host es interactive (botón), aplicamos los
131
220
  * listeners touchstart/touchend para liberar :active inmediatamente.
@@ -185,24 +274,29 @@ declare class SuiAccordion {
185
274
  */
186
275
  readonly flipIcon: _angular_core.InputSignal<SuiAccordionFlipIcon>;
187
276
  /**
188
- * Si false, oculta el icono izquierdo (solo aplica con flipIcon=off).
189
- * Por default `true`; el icono por default es `question-line`.
190
- */
191
- readonly leftIcon: _angular_core.InputSignal<boolean>;
192
- /**
193
- * Nombre del icono izquierdo (Remix Icon, sin prefijo `ri-`).
194
- * Solo se renderiza si `flipIcon=off` y `leftIcon=true`.
195
- * Default: 'question-line'.
277
+ * Icono izquierdo (solo aplica con `flipIcon=off`):
278
+ * - `true` (default) → icono default `question-line`
279
+ * - string → nombre custom del Remix Icon (sin prefijo `ri-`)
280
+ * - `false` → sin icono
196
281
  */
197
- readonly leftIconName: _angular_core.InputSignal<string>;
282
+ readonly leftIcon: _angular_core.InputSignal<string | boolean>;
283
+ /** Nombre resuelto del icono izquierdo; `null` = no renderizar el slot. */
284
+ protected readonly leftIconName: _angular_core.Signal<string | null>;
198
285
  /**
199
- * Badge opcional en el header (ej. "New" / "Old" / "Updated"). Vacío = sin badge.
200
- * Usado en el catálogo (master-preview) para marcar el estado de homologación
201
- * de cada componente. Aditivo: sin valor, el header se renderiza igual que antes.
286
+ * Badge opcional en el header — string shorthand (`badge="New"`) o
287
+ * `SuiBadgeConfig` ({ label, color?, variant?, size? }, tipado sui-badge).
288
+ * `null` = sin badge. Render con `<sui-badge>` real.
289
+ *
290
+ * Defaults cuando el config no trae color/variant/size: color `green` +
291
+ * variant `lighter` + size `small` — equivalente visual del viejo enum
292
+ * `badgeColor='new'` (texto success-base sobre bg success-lighter = variant
293
+ * `lighter` de sui-badge). Mapeo del enum eliminado → el consumer lo pasa
294
+ * ahora via config: new→`color: 'green'` · upd→`color: 'blue'` ·
295
+ * old→`color: 'gray'`.
202
296
  */
203
- readonly badge: _angular_core.InputSignal<string>;
204
- /** Variante de color del badge del header: new (verde) | upd (azul) | old (gris). */
205
- readonly badgeColor: _angular_core.InputSignal<"new" | "old" | "upd">;
297
+ readonly badge: _angular_core.InputSignal<string | SuiBadgeConfig | null>;
298
+ /** Config resuelta del badge (string → { label }; null → null). */
299
+ protected readonly badgeCfg: _angular_core.Signal<SuiBadgeConfig | null>;
206
300
  /** Estado del data-attribute (default | active) — usa _resolvedOpen para
207
301
  * consistencia visual con el data-state del body (que también usa
208
302
  * _resolvedOpen). El icono y el bg cambian junto con la animation. */
@@ -270,7 +364,7 @@ declare class SuiAccordion {
270
364
  private readonly syncOpen;
271
365
  toggle(): void;
272
366
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiAccordion, never>;
273
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiAccordion, "sui-accordion", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "lazy": { "alias": "lazy"; "required": false; "isSignal": true; }; "flipIcon": { "alias": "flipIcon"; "required": false; "isSignal": true; }; "leftIcon": { "alias": "leftIcon"; "required": false; "isSignal": true; }; "leftIconName": { "alias": "leftIconName"; "required": false; "isSignal": true; }; "badge": { "alias": "badge"; "required": false; "isSignal": true; }; "badgeColor": { "alias": "badgeColor"; "required": false; "isSignal": true; }; }, { "open": "openChange"; }, never, ["[sui-accordion-body]", "*"], true, never>;
367
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiAccordion, "sui-accordion", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "lazy": { "alias": "lazy"; "required": false; "isSignal": true; }; "flipIcon": { "alias": "flipIcon"; "required": false; "isSignal": true; }; "leftIcon": { "alias": "leftIcon"; "required": false; "isSignal": true; }; "badge": { "alias": "badge"; "required": false; "isSignal": true; }; }, { "open": "openChange"; }, never, ["[sui-accordion-body]", "*"], true, never>;
274
368
  }
275
369
 
276
370
  /**
@@ -280,6 +374,17 @@ declare class SuiAccordion {
280
374
  */
281
375
  type SuiAvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl';
282
376
  type SuiAvatarColor = 'slate' | 'gray' | 'blue' | 'orange' | 'red' | 'green' | 'yellow' | 'purple' | 'sky' | 'pink' | 'teal';
377
+ /**
378
+ * Config del avatar que exponen los componentes con <sui-avatar> interno
379
+ * (command-menu-item, content-card, notification…). Mismo espíritu que
380
+ * SuiBadgeConfig/SuiLinkConfig: un objeto en vez de N props sueltos.
381
+ * String shorthand = src directo.
382
+ */
383
+ interface SuiAvatarConfig {
384
+ src?: string | null;
385
+ initials?: string;
386
+ color?: SuiAvatarColor;
387
+ }
283
388
  /**
284
389
  * BottomStatus types (Figma 245:18721): indicador bottom-right.
285
390
  * Online/offline/away/busy renderizan como dot; `company` renderiza el
@@ -904,7 +1009,7 @@ declare class SuiAlert {
904
1009
  * `small` (12/16) en los compactos (small/xsmall). Mapea el tipo del action al
905
1010
  * tamaño del alert.
906
1011
  */
907
- readonly actionLinkSize: _angular_core.Signal<"medium" | "small">;
1012
+ readonly actionLinkSize: _angular_core.Signal<"small" | "medium">;
908
1013
  /**
909
1014
  * Tamaño del `sui-compact-button` del cierre, mapeado del size del alert para
910
1015
  * conservar el footprint del icono: xsmall (icon 16) → compact `medium`;
@@ -1064,93 +1169,6 @@ declare class SuiAvatarGroup {
1064
1169
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiAvatarGroup, "sui-avatar-group", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1065
1170
  }
1066
1171
 
1067
- type SuiBadgeColor = 'gray' | 'blue' | 'orange' | 'red' | 'green' | 'yellow' | 'purple' | 'sky' | 'pink' | 'teal';
1068
- type SuiBadgeVariant = 'filled' | 'light' | 'lighter' | 'stroke' | 'dark';
1069
- type SuiBadgeSize = 'small' | 'medium';
1070
- type SuiBadgeType = 'basic' | 'with-dot' | 'left-icon' | 'right-icon' | 'number';
1071
- /**
1072
- * Config de badge embebido en otros componentes (checkbox-label, switch-label,
1073
- * integration-switch, checkbox-card, radio-card, switch-card). Un solo input
1074
- * `[badge]` reemplaza al par booleano + badgeLabel; acepta string shorthand
1075
- * (`badge="NEW"`) para el caso común. Los componentes que renderizan un
1076
- * <sui-badge> real honran color/variant/size (defaults orange/light/small);
1077
- * las cards usan su render Figma-exacto y toman solo `label`.
1078
- */
1079
- interface SuiBadgeConfig {
1080
- label: string;
1081
- color?: SuiBadgeColor;
1082
- variant?: SuiBadgeVariant;
1083
- size?: SuiBadgeSize;
1084
- }
1085
- /**
1086
- * SUI Badge — SUI Design System 2.0
1087
- *
1088
- * Figma file: 8p1k72aKKvzJV4XcvPS4VO
1089
- * Variants pulled for verification:
1090
- * - 118:2584 Basic/Filled/Small/Gray
1091
- * - 118:2587 Basic/Light/Small/Gray
1092
- * - 118:2590 Basic/Lighter/Small/Gray
1093
- * - 118:2616 With Dot/Filled/Small/Gray
1094
- * - 118:2322 Left Icon/Light/Small/Gray
1095
- * - 289:7551 Right Icon/Stroke/Small/Gray
1096
- * - 118:2686 Basic/Filled/Small/Gray/Number=On
1097
- * - 119:2361 Basic/Filled/Medium/Gray
1098
- *
1099
- * EXACT (pulled):
1100
- * - Small: padding py=2px, font Subheading/2X Small 11/12/0.22px UPPERCASE, ss11 features
1101
- * - Medium basic: padding px=8 py=2 (119:2361), font Label/X Small 12/16/0 NO uppercase, ss11
1102
- * - Radius: 999 (full)
1103
- * - Per-type padding Small: Basic=px8 / LeftIcon=pl4 pr8 / RightIcon=pl8 pr4 /
1104
- * WithDot=pr8 ONLY (no left, no py) / Number=p2 (near-square, text w12)
1105
- * - WithDot box: dot vive en CONTAINER 16×16 (full-height del badge small),
1106
- * círculo r=2 → DIÁMETRO 4px centrado (asset SVG 118:2632). El dot del Badge
1107
- * regular (4px) es DISTINTO del dot del sui-status-badge (6px, r=3) — assets
1108
- * separados en el DS, NO unificar.
1109
- * - WithDot Medium (119:2369): padding pl2 pr8 py2, dot box SIGUE 16×16 (NO 20).
1110
- * - Style colors: Filled=bg-base+text-white, Light=bg-light+text-dark,
1111
- * Lighter=bg-lighter+text-BASE (NOT dark!), Stroke=border1-base+text-base
1112
- *
1113
- * INFERRED (declared approximations):
1114
- * - Medium Left/Right Icon padding: same asymmetric pattern as Small (4/8 vs 8/4)
1115
- * - Medium Number: p=2 (proportional to Small)
1116
- * - Medium icon size: 16x16 (scaled from Small's 12x12)
1117
- *
1118
- * PENDING VERIFY (inferido, sin confirmar pixel-exacto en Figma):
1119
- * - Medium Left Icon / Right Icon: el padding asimétrico (pl4/pr8, pl8/pr4) se
1120
- * asumió igual al Small. No se pulló la variante Medium+LeftIcon/RightIcon
1121
- * específica del archivo — el frame 118:2324 es too-large para pull directo.
1122
- * - Medium icon slot size 16×16: escalado del Small (12×12) sin confirmar contra
1123
- * una variante Medium con icono real.
1124
- * - Number type: el width del label (12px small / 16px medium) y el padding p2
1125
- * se infirieron de la variante Small Number=On (118:2686); no se confirmó si
1126
- * un número de 2 dígitos ('99') reflowea el width o se mantiene fijo.
1127
- * - Disabled: Figma demuestra Disabled=On solo en color Gray (representativo).
1128
- * El override universal a tokens disabled (todos los colores) es extrapolación
1129
- * intencional — más completa que la demo, asumida consistente con SUI 2.0.
1130
- *
1131
- * CUSTOM (not in Figma 118:2324 — add-on local del proyecto):
1132
- * - `variant='dark'` — glass translúcido vibrante pensado para superficies
1133
- * oscuras. El color tiñe el bg (22% alpha) y borde (45% alpha) del
1134
- * state-base, texto blanco para contraste. Se mantiene porque está en
1135
- * uso en pantallas con backgrounds oscuros (master-preview, etc.).
1136
- * Sin `[color]`, cae al fallback white-glass neutral.
1137
- *
1138
- * - `disabled` state: implementado con override de bg/border/text a tokens
1139
- * disabled-300 y faded-light/lighter (matchea visual figma), NO con
1140
- * `opacity` (que produciría tintes desaturados en lugar de gris uniforme).
1141
- */
1142
- declare class SuiBadge {
1143
- readonly color: _angular_core.InputSignal<SuiBadgeColor>;
1144
- readonly variant: _angular_core.InputSignal<SuiBadgeVariant>;
1145
- readonly size: _angular_core.InputSignal<SuiBadgeSize>;
1146
- readonly type: _angular_core.InputSignal<SuiBadgeType>;
1147
- readonly disabled: _angular_core.InputSignal<boolean>;
1148
- /** Internal: true when the badge renders its built-in dot (type=with-dot). */
1149
- readonly showsDot: _angular_core.Signal<boolean>;
1150
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiBadge, never>;
1151
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiBadge, "sui-badge", never, { "color": { "alias": "color"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, ["[data-slot=start]", "*", "[data-slot=end]"], true, never>;
1152
- }
1153
-
1154
1172
  type SuiBannerVariant = 'info' | 'success' | 'warning' | 'error' | 'feature';
1155
1173
  type SuiBannerStyle = 'filled' | 'light' | 'lighter' | 'stroke';
1156
1174
  /**
@@ -1629,6 +1647,15 @@ declare class SuiButtonGroup {
1629
1647
  type SuiButtonColor = 'primary' | 'neutral' | 'error';
1630
1648
  type SuiButtonVariant = 'filled' | 'stroke' | 'lighter' | 'ghost';
1631
1649
  type SuiButtonSize = '2xsmall' | 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge';
1650
+ /**
1651
+ * Config de los botones internos de footers (drawer-footer, filter-panel-footer):
1652
+ * { label, disabled? } con string shorthand = solo label. Interfaz COMPARTIDA
1653
+ * para que ambos footers expongan el mismo contrato.
1654
+ */
1655
+ interface SuiFooterButtonConfig {
1656
+ label: string;
1657
+ disabled?: boolean;
1658
+ }
1632
1659
  /**
1633
1660
  * SUI Button — SUI Design System 2.0
1634
1661
  *
@@ -1913,7 +1940,7 @@ declare class SuiCheckboxCard implements ControlValueAccessor {
1913
1940
  /** RemixIcon name (sin prefijo "ri-") para type='left-icon'. */
1914
1941
  readonly icon: _angular_core.InputSignal<string | null>;
1915
1942
  /** Emoji del catálogo SUI_EMOJI_MAP — alternativa a icon para type='left-icon'. */
1916
- readonly emoji: _angular_core.InputSignal<"warning" | "label" | "thinking-face" | "grinning-face" | "smiling-face-hearts" | "face-with-rolling-eyes" | "face-screaming" | "partying-face" | "star-struck" | "sleeping-face" | "pensive-face" | "confused-face" | "neutral-face" | "slightly-smiling-face" | "grinning-face-smiling-eyes" | "package" | "receipt" | "money-bag" | "money-with-wings" | "shopping-cart" | "shopping-bags" | "card-index-dividers" | "bell" | "bell-with-slash" | "pushpin" | "mobile-phone" | "gear" | "locked" | "unlocked" | "wrench" | "hammer" | "magnifying-glass-tilted-left" | "spiral-calendar" | "bar-chart" | "delivery-truck" | "motorcycle" | "rocket" | "house" | "office-building" | "shop" | "dollar-banknote" | "glowing-star" | "kick-scooter" | "check-mark" | "check-mark-button" | "cross-mark" | "no-entry" | "sparkles" | "party-popper" | "waving-hand" | "thumbs-up" | "clapping-hands" | "handshake" | "busts-in-silhouette" | "pizza" | "hamburger" | "taco" | "birthday-cake" | null>;
1943
+ readonly emoji: _angular_core.InputSignal<"label" | "warning" | "thinking-face" | "grinning-face" | "smiling-face-hearts" | "face-with-rolling-eyes" | "face-screaming" | "partying-face" | "star-struck" | "sleeping-face" | "pensive-face" | "confused-face" | "neutral-face" | "slightly-smiling-face" | "grinning-face-smiling-eyes" | "package" | "receipt" | "money-bag" | "money-with-wings" | "shopping-cart" | "shopping-bags" | "card-index-dividers" | "bell" | "bell-with-slash" | "pushpin" | "mobile-phone" | "gear" | "locked" | "unlocked" | "wrench" | "hammer" | "magnifying-glass-tilted-left" | "spiral-calendar" | "bar-chart" | "delivery-truck" | "motorcycle" | "rocket" | "house" | "office-building" | "shop" | "dollar-banknote" | "glowing-star" | "kick-scooter" | "check-mark" | "check-mark-button" | "cross-mark" | "no-entry" | "sparkles" | "party-popper" | "waving-hand" | "thumbs-up" | "clapping-hands" | "handshake" | "busts-in-silhouette" | "pizza" | "hamburger" | "taco" | "birthday-cake" | null>;
1917
1944
  /** URL directa al emoji para type='left-icon'. Precedencia: icon > emoji > iconSrc. */
1918
1945
  readonly iconSrc: _angular_core.InputSignal<string | null>;
1919
1946
  /** URL de imagen para type='avatar'. Si falla, fallback a iniciales del label. */
@@ -1948,6 +1975,101 @@ declare class SuiCheckboxCard implements ControlValueAccessor {
1948
1975
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiCheckboxCard, "sui-checkbox-card", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "sublabel": { "alias": "sublabel"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "emoji": { "alias": "emoji"; "required": false; "isSignal": true; }; "iconSrc": { "alias": "iconSrc"; "required": false; "isSignal": true; }; "imageUrl": { "alias": "imageUrl"; "required": false; "isSignal": true; }; "badge": { "alias": "badge"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "checked": { "alias": "checked"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; "checkedChange2": "checkedChange2"; }, never, ["[slot=leading]"], true, never>;
1949
1976
  }
1950
1977
 
1978
+ type SuiLinkButtonVariant = 'gray' | 'black' | 'primary' | 'error' | 'modifiable';
1979
+ /**
1980
+ * Config del "link" que exponen los componentes con Link Button integrado
1981
+ * (checkbox-label, switch-label, drawer-header/footer, progress-bar-label).
1982
+ * String shorthand = solo label (renderiza <button> + output linkClick);
1983
+ * con `href` el link es un <a> real. `rel` default 'noopener noreferrer'
1984
+ * cuando target='_blank' (mismo patrón objeto que SuiBadgeConfig).
1985
+ */
1986
+ interface SuiLinkConfig {
1987
+ label: string;
1988
+ href?: string;
1989
+ target?: string;
1990
+ rel?: string;
1991
+ }
1992
+ type SuiLinkButtonSize = 'medium' | 'small';
1993
+ /**
1994
+ * SUI Link Button — SUI Design System 2.0
1995
+ *
1996
+ * Figma file: 8p1k72aKKvzJV4XcvPS4VO
1997
+ * Frame: 168:4889 ("Link Buttons [1.1]") — 80 variants total
1998
+ *
1999
+ * EXACT (pulled from Figma + verified against sui-tokens.scss):
2000
+ * Anatomy
2001
+ * Container flex / inline-flex, gap=4px, items=center
2002
+ * Medium size text 14/20/-0.6%, icons 20×20
2003
+ * Small size text 12/16/0, icons 16×16
2004
+ * Font features 'ss11' 1, 'calt' 0, 'liga' 0
2005
+ * Underline (hover / focus / underline=on): línea continua SOLO
2006
+ * bajo el texto (los iconos chevron NO van subrayados —
2007
+ * Figma 169:1391/169:1419: la clase `underline` vive solo
2008
+ * en el <p>). Implementado vía ::after en
2009
+ * .sui-link-button__text (NO `text-decoration` sobre el
2010
+ * flex, que se fragmentaba en 3 trazos icon|text|icon).
2011
+ * Variant × State color matrix
2012
+ * Gray Default → text/sub-600 | Hover → sub-600 + underline | Focus → strong-950 + underline | Disabled → disabled-300
2013
+ * Black Default → text/strong-950 | Hover → strong-950 + underline
2014
+ * Primary Default → primary-base | Hover → primary-dark + underline
2015
+ * Error Default → state/error/base | Hover → red/700 + underline
2016
+ * Modifiable → currentColor (consumer-controlled)
2017
+ *
2018
+ * Token map (Figma → sui-tokens.scss):
2019
+ * text/sub-600 #5c5c5c → --sui-text-sub-600
2020
+ * text/strong-950 #171717 → --sui-text-strong-950
2021
+ * text/disabled-300 #d1d1d1 → --sui-text-disabled-300
2022
+ * primary-base #335cff → --sui-primary-base (project remaps to orange #fa7319)
2023
+ * primary-dark #2547d0 → --sui-primary-dark (project remaps to dark orange #e16614)
2024
+ * state/error/base #fb3748 → --sui-state-error-base
2025
+ * red/700 #d02533 → --sui-red-700
2026
+ * icon/* same as text/* per token level
2027
+ *
2028
+ * FOCUS states PULLED from Figma (2026-05-29) — el Focus mantiene el color
2029
+ * BASE + underline; solo el Hover oscurece. Nodos verificados:
2030
+ * Gray focus 169:1034 → strong-950 + underline
2031
+ * Black focus 169:1090 → strong-950 + underline
2032
+ * Primary focus 169:1138 → primary-base (NO dark) + underline
2033
+ * Error focus 169:1187 → error-base (NO red-700) + underline
2034
+ * (Hover: Primary 169:1134 → primary-dark; Error 169:1183 → red-700)
2035
+ *
2036
+ * PENDING VERIFY (inferred, NOT pulled):
2037
+ * - Modifiable Focus / Hover / Disabled: currentColor para hover/focus; disabled assumed --sui-text-disabled-300
2038
+ * - Underline=On styling para todos: misma decoration spec que Gray (decoration solid, thickness/position from-font, skip-ink none)
2039
+ * - Active state: no es variante Figma; tactile-press scale(0.97) por convención project
2040
+ * - Figma usa font-feature 'cv09' 1 además de 'ss11' 1 'calt' 0 'liga' 0; SUI omite cv09 (alterna del 9) — diferencia tipográfica menor, no afecta layout
2041
+ *
2042
+ * Usage:
2043
+ * <sui-link-button variant="primary" leftIcon="arrow-left-s-line">Volver</sui-link-button>
2044
+ * <sui-link-button variant="error" [underline]="true" (click)="onDelete()">Eliminar</sui-link-button>
2045
+ * <sui-link-button variant="primary" href="https://docs.example" target="_blank">Ver documentación</sui-link-button>
2046
+ *
2047
+ * Floating vs inline: el componente es `display: inline-flex` con baseline align,
2048
+ * por lo que fluye dentro de un párrafo como un link normal. Para uso "flotante"
2049
+ * (toast actions, notification CTA), el consumer lo posiciona libremente — el
2050
+ * componente no impone position/z-index propios.
2051
+ */
2052
+ declare class SuiLinkButton {
2053
+ readonly variant: _angular_core.InputSignal<SuiLinkButtonVariant>;
2054
+ readonly size: _angular_core.InputSignal<SuiLinkButtonSize>;
2055
+ readonly underline: _angular_core.InputSignal<boolean>;
2056
+ readonly disabled: _angular_core.InputSignal<boolean>;
2057
+ readonly leftIcon: _angular_core.InputSignal<string | null>;
2058
+ readonly rightIcon: _angular_core.InputSignal<string | null>;
2059
+ /** Cuando se setea, el componente renderiza un <a> nativo en vez de <button>. */
2060
+ readonly href: _angular_core.InputSignal<string | null>;
2061
+ readonly target: _angular_core.InputSignal<string | null>;
2062
+ readonly rel: _angular_core.InputSignal<string | null>;
2063
+ readonly type: _angular_core.InputSignal<"button" | "submit" | "reset">;
2064
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
2065
+ readonly clicked: _angular_core.OutputEmitterRef<MouseEvent>;
2066
+ readonly iconSize: _angular_core.Signal<number>;
2067
+ readonly isAnchor: _angular_core.Signal<boolean>;
2068
+ onClick(event: MouseEvent): void;
2069
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiLinkButton, never>;
2070
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiLinkButton, "sui-link-button", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "underline": { "alias": "underline"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "leftIcon": { "alias": "leftIcon"; "required": false; "isSignal": true; }; "rightIcon": { "alias": "rightIcon"; "required": false; "isSignal": true; }; "href": { "alias": "href"; "required": false; "isSignal": true; }; "target": { "alias": "target"; "required": false; "isSignal": true; }; "rel": { "alias": "rel"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "clicked": "clicked"; }, never, ["*"], true, never>;
2071
+ }
2072
+
1951
2073
  /**
1952
2074
  * SUI Checkbox Label — SUI Design System 2.0
1953
2075
  *
@@ -2025,7 +2147,13 @@ declare class SuiCheckboxLabel implements ControlValueAccessor {
2025
2147
  protected readonly badgeCfg: _angular_core.Signal<SuiBadgeConfig | null>;
2026
2148
  /** Texto del Link Button opcional debajo de la description. Solo se renderiza
2027
2149
  cuando description tiene valor. */
2028
- readonly linkLabel: _angular_core.InputSignal<string | null>;
2150
+ /** Link Button bajo la descripción — string shorthand (solo label, emite
2151
+ * `linkClick`) o SuiLinkConfig { label, href?, target?, rel? }: con href
2152
+ * renderiza <a> real; rel automático 'noopener noreferrer' para _blank.
2153
+ * (Mismo patrón objeto que `badge`/SuiBadgeConfig.) */
2154
+ readonly link: _angular_core.InputSignal<string | SuiLinkConfig | null>;
2155
+ /** Config resuelta del link (string → { label }, rel automático). */
2156
+ protected readonly linkCfg: _angular_core.Signal<SuiLinkConfig | null>;
2029
2157
  /** Si true, invierte orden: [content] [checkbox] (label a la izquierda). */
2030
2158
  readonly flip: _angular_core.InputSignal<boolean>;
2031
2159
  /** Deshabilita el checkbox + wrapper. */
@@ -2052,7 +2180,7 @@ declare class SuiCheckboxLabel implements ControlValueAccessor {
2052
2180
  registerOnTouched(fn: () => void): void;
2053
2181
  setDisabledState(isDisabled: boolean): void;
2054
2182
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiCheckboxLabel, never>;
2055
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiCheckboxLabel, "sui-checkbox-label", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "sublabel": { "alias": "sublabel"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "badge": { "alias": "badge"; "required": false; "isSignal": true; }; "linkLabel": { "alias": "linkLabel"; "required": false; "isSignal": true; }; "flip": { "alias": "flip"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; "active": { "alias": "active"; "required": false; "isSignal": true; }; }, { "active": "activeChange"; "linkClick": "linkClick"; }, never, never, true, never>;
2183
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiCheckboxLabel, "sui-checkbox-label", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "sublabel": { "alias": "sublabel"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "badge": { "alias": "badge"; "required": false; "isSignal": true; }; "link": { "alias": "link"; "required": false; "isSignal": true; }; "flip": { "alias": "flip"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; "active": { "alias": "active"; "required": false; "isSignal": true; }; }, { "active": "activeChange"; "linkClick": "linkClick"; }, never, never, true, never>;
2056
2184
  }
2057
2185
 
2058
2186
  type SuiCircularProgressBarColor = 'blue' | 'green' | 'orange' | 'red' | 'purple';
@@ -2523,19 +2651,27 @@ declare class SuiColorPicker {
2523
2651
  * - navigateLabel: string ('Navigate' por default)
2524
2652
  * - selectLabel: string ('Select')
2525
2653
  * - helpText: string | null ('Not what you're looking for? Try the')
2526
- * - helpLinkLabel: string ('Help Center')
2527
- * - helpHref: string | null (si null, renderiza button)
2654
+ * — copy previo al link; null oculta el bloque de ayuda completo
2655
+ * - helpLink: SuiLinkConfig | string | null ('Help Center') — string
2656
+ * shorthand = solo label (renderiza <button>, emite helpClicked);
2657
+ * SuiLinkConfig { label, href?, target?, rel? } = <a> real con
2658
+ * rel automático 'noopener noreferrer' si target='_blank'.
2659
+ * (Patrón canon `link` de sui-checkbox-label.)
2528
2660
  * - (helpClicked): output cuando el link se clickea
2529
2661
  */
2530
2662
  declare class SuiCommandMenuFooter {
2531
2663
  readonly navigateLabel: _angular_core.InputSignal<string>;
2532
2664
  readonly selectLabel: _angular_core.InputSignal<string>;
2533
2665
  readonly helpText: _angular_core.InputSignal<string | null>;
2534
- readonly helpLinkLabel: _angular_core.InputSignal<string>;
2535
- readonly helpHref: _angular_core.InputSignal<string | null>;
2666
+ /** Link de ayuda — string shorthand (solo label, emite `helpClicked`) o
2667
+ * SuiLinkConfig { label, href?, target?, rel? }: con href renderiza <a> real;
2668
+ * rel automático 'noopener noreferrer' para _blank. null = sin link. */
2669
+ readonly helpLink: _angular_core.InputSignal<string | SuiLinkConfig | null>;
2670
+ /** Config resuelta del link (string → { label }, rel automático). */
2671
+ protected readonly helpLinkCfg: _angular_core.Signal<SuiLinkConfig | null>;
2536
2672
  readonly helpClicked: _angular_core.OutputEmitterRef<MouseEvent>;
2537
2673
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiCommandMenuFooter, never>;
2538
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiCommandMenuFooter, "sui-command-menu-footer", never, { "navigateLabel": { "alias": "navigateLabel"; "required": false; "isSignal": true; }; "selectLabel": { "alias": "selectLabel"; "required": false; "isSignal": true; }; "helpText": { "alias": "helpText"; "required": false; "isSignal": true; }; "helpLinkLabel": { "alias": "helpLinkLabel"; "required": false; "isSignal": true; }; "helpHref": { "alias": "helpHref"; "required": false; "isSignal": true; }; }, { "helpClicked": "helpClicked"; }, never, never, true, never>;
2674
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiCommandMenuFooter, "sui-command-menu-footer", never, { "navigateLabel": { "alias": "navigateLabel"; "required": false; "isSignal": true; }; "selectLabel": { "alias": "selectLabel"; "required": false; "isSignal": true; }; "helpText": { "alias": "helpText"; "required": false; "isSignal": true; }; "helpLink": { "alias": "helpLink"; "required": false; "isSignal": true; }; }, { "helpClicked": "helpClicked"; }, never, never, true, never>;
2539
2675
  }
2540
2676
 
2541
2677
  /**
@@ -2557,7 +2693,8 @@ declare class SuiCommandMenuFooter {
2557
2693
  * - medium (64) → multi-line (title row + description)
2558
2694
  *
2559
2695
  * **Optional bits** (right-aligned, en este orden):
2560
- * - badge: sui-badge (gray pill, ej. "Pro")
2696
+ * - badge: sui-badge — string shorthand (pill gray/lighter, ej. "Pro") o
2697
+ * SuiBadgeConfig { label, color?, variant?, size? }
2561
2698
  * - shortcut: sui-kbd con texto (ej. "⌘K")
2562
2699
  * - button: chevron arrow-right (Default) / lifted compact-button (Hover)
2563
2700
  *
@@ -2594,6 +2731,11 @@ declare class SuiCommandMenuFooter {
2594
2731
  * description="Edita tu nombre, email, contraseña."
2595
2732
  * shortcut="⌘K"
2596
2733
  * [showButton]="true" />
2734
+ *
2735
+ * <sui-command-menu-item type="avatar" size="medium"
2736
+ * [avatar]="{ initials: 'JB', color: 'purple' }"
2737
+ * title="James Brown"
2738
+ * [badge]="{ label: 'Pro', color: 'purple', variant: 'light' }" />
2597
2739
  */
2598
2740
  type SuiCommandMenuItemType = 'basic' | 'left-icon' | 'avatar' | 'brand' | 'company' | 'country';
2599
2741
  type SuiCommandMenuItemSize = 'small' | 'medium';
@@ -2607,14 +2749,18 @@ declare class SuiCommandMenuItem {
2607
2749
  readonly description: _angular_core.InputSignal<string | null>;
2608
2750
  /** Type=left-icon: nombre RemixIcon para el leading. */
2609
2751
  readonly icon: _angular_core.InputSignal<string | null>;
2610
- /** Type=avatar/company: src de la imagen (opcional, sino fallback initials). */
2611
- readonly avatarSrc: _angular_core.InputSignal<string | null>;
2612
- readonly avatarInitials: _angular_core.InputSignal<string>;
2613
- readonly avatarColor: _angular_core.InputSignal<SuiAvatarColor>;
2752
+ /** Type=avatar/company: avatar — string shorthand (src de la imagen) o
2753
+ SuiAvatarConfig { src?, initials?, color? } (tipado como sui-avatar).
2754
+ null = sin datos (sui-avatar cae a su placeholder). */
2755
+ readonly avatar: _angular_core.InputSignal<string | SuiAvatarConfig | null>;
2756
+ protected readonly avatarCfg: _angular_core.Signal<SuiAvatarConfig | null>;
2614
2757
  /** Type=country: slug del país. */
2615
2758
  readonly flagName: _angular_core.InputSignal<"abkhazia" | "afghanistan" | "aland-islands" | "albania" | "algeria" | "american-samoa" | "andorra" | "angola" | "anguilla" | "antigua-and-barbuda" | "argentina" | "armenia" | "aruba" | "australia" | "austria" | "azerbaijan" | "azores-islands" | "bahamas" | "bahrain" | "balearic-islands" | "bangladesh" | "barbados" | "basque-country" | "belarus" | "belgium" | "belize" | "benin" | "bermuda" | "bhutan" | "bolivia" | "bonaire" | "bosnia-and-herzegovina" | "botswana" | "brazil" | "british-columbia" | "british-indian-ocean-territory" | "british-virgin-islands" | "brunei" | "bulgaria" | "burkina-faso" | "burundi" | "cambodia" | "cameroon" | "canada" | "canary-islands" | "cape-verde" | "cayman-islands" | "central-african-republic" | "ceuta" | "chad" | "chile" | "china" | "christmas-island" | "cocos-island" | "colombia" | "comoros" | "cook-islands" | "corsica" | "costa-rica" | "croatia" | "cuba" | "curacao" | "cyprus" | "czech-republic" | "democratic-republic-of-congo" | "denmark" | "djibouti" | "dominica" | "dominican-republic" | "east-timor" | "ecuador" | "egypt" | "el-salvador" | "england" | "equatorial-guinea" | "eritrea" | "estonia" | "ethiopia" | "european-union" | "falkland-islands" | "faroe-islands" | "fiji" | "finland" | "france" | "french-polynesia" | "gabon" | "galapagos-islands" | "gambia" | "georgia" | "germany" | "ghana" | "gibraltar" | "greece" | "greenland" | "grenada" | "guam" | "guatemala" | "guernsey" | "guinea-bissau" | "guinea" | "guyana" | "haiti" | "hawaii" | "honduras" | "hong-kong" | "hungary" | "iceland" | "india" | "indonesia" | "iran" | "iraq" | "ireland" | "isle-of-man" | "israel" | "italy" | "ivory-coast" | "jamaica" | "japan" | "jersey" | "jordan" | "kazakhstan" | "kenya" | "kiribati" | "kosovo" | "kuwait" | "kyrgyzstan" | "laos" | "latvia" | "lebanon" | "lesotho" | "liberia" | "libya" | "liechtenstein" | "lithuania" | "luxembourg" | "macao" | "madagascar" | "madeira" | "malawi" | "malaysia" | "maldives" | "mali" | "malta" | "marshall-island" | "martinique" | "mauritania" | "mauritus" | "melilla" | "mexico" | "micronesia" | "moldova" | "monaco" | "mongolia" | "montenegro" | "montserrat" | "morocco" | "mozambique" | "myanmar" | "namibia" | "nato" | "nauru" | "nepal" | "netherlands" | "new-zealand" | "nicaragua" | "niger" | "nigeria" | "niue" | "norfolk-island" | "north-korea" | "northern-cyprus" | "northern-marianas-islands" | "norway" | "oman" | "orkney-islands" | "ossetia" | "pakistan" | "palau" | "palestine" | "panama" | "papua-new-guinea" | "paraguay" | "peru" | "philippines" | "pitcairn-islands" | "poland" | "portugal" | "puerto-rico" | "qatar" | "rapa-nui" | "republic-of-macedonia" | "republic-of-the-congo" | "romania" | "russia" | "rwanda" | "saba-island" | "sahrawi-arab-democratic-republic" | "saint-kitts-and-nevis" | "samoa" | "san-marino" | "sao-tome-and-prince" | "sardinia" | "saudi-arabia" | "scotland" | "senegal" | "serbia" | "seychelles" | "sierra-leone" | "singapore" | "sint-eustatius" | "sint-maarten" | "slovakia" | "slovania" | "solomon-islands" | "somalia" | "somaliland" | "south-africa" | "south-korea" | "south-sudan" | "spain" | "sri-lanka" | "st-barts" | "st-lucia" | "st-vincent-and-the-grenadines" | "sudan" | "suriname" | "swaziland" | "sweden" | "switzerland" | "syria" | "taijikistan" | "taiwan" | "tanzania" | "thailand" | "tibet" | "togo" | "tokelau" | "tonga" | "transnistria" | "trinidad-and-tobago" | "tunisia" | "turkey" | "turkmenistan" | "turks-and-caicos" | "tuvalu" | "uganda" | "ukraine" | "united-arab-emirates" | "united-kingdom" | "united-nations" | "united-states" | "uruguay" | "uzbekistan" | "vanuatu" | "vatican-city" | "venezuela" | "vietnam" | "virgin-islands" | "wales" | "yemen" | "zambia" | "zimbabwe" | null>;
2616
- /** Right side: badge text (sui-badge gray). */
2617
- readonly badge: _angular_core.InputSignal<string | null>;
2759
+ /** Right side: badge — string shorthand (pill gray/lighter, ej. "Pro") o
2760
+ SuiBadgeConfig { label, color?, variant?, size? } (tipado como sui-badge).
2761
+ null = sin badge. */
2762
+ readonly badge: _angular_core.InputSignal<string | SuiBadgeConfig | null>;
2763
+ protected readonly badgeCfg: _angular_core.Signal<SuiBadgeConfig | null>;
2618
2764
  /** Right side: shortcut text (sui-kbd, ej. "⌘K"). */
2619
2765
  readonly shortcut: _angular_core.InputSignal<string | null>;
2620
2766
  /** Right side: chevron button (arrow-right). */
@@ -2628,7 +2774,7 @@ declare class SuiCommandMenuItem {
2628
2774
  onClick(event: MouseEvent): void;
2629
2775
  onButtonClick(event: MouseEvent): void;
2630
2776
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiCommandMenuItem, never>;
2631
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiCommandMenuItem, "sui-command-menu-item", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": true; "isSignal": true; }; "sublabel": { "alias": "sublabel"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "avatarSrc": { "alias": "avatarSrc"; "required": false; "isSignal": true; }; "avatarInitials": { "alias": "avatarInitials"; "required": false; "isSignal": true; }; "avatarColor": { "alias": "avatarColor"; "required": false; "isSignal": true; }; "flagName": { "alias": "flagName"; "required": false; "isSignal": true; }; "badge": { "alias": "badge"; "required": false; "isSignal": true; }; "shortcut": { "alias": "shortcut"; "required": false; "isSignal": true; }; "showButton": { "alias": "showButton"; "required": false; "isSignal": true; }; }, { "clicked": "clicked"; "buttonClicked": "buttonClicked"; }, never, ["[slot=brand]"], true, never>;
2777
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiCommandMenuItem, "sui-command-menu-item", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": true; "isSignal": true; }; "sublabel": { "alias": "sublabel"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "avatar": { "alias": "avatar"; "required": false; "isSignal": true; }; "flagName": { "alias": "flagName"; "required": false; "isSignal": true; }; "badge": { "alias": "badge"; "required": false; "isSignal": true; }; "shortcut": { "alias": "shortcut"; "required": false; "isSignal": true; }; "showButton": { "alias": "showButton"; "required": false; "isSignal": true; }; }, { "clicked": "clicked"; "buttonClicked": "buttonClicked"; }, never, ["[slot=brand]"], true, never>;
2632
2778
  }
2633
2779
 
2634
2780
  /**
@@ -3092,19 +3238,21 @@ type SuiContentCardType = 'basic' | 'left-icon' | 'avatar' | 'card-provider' | '
3092
3238
  * basic → sin leading
3093
3239
  * left-icon → cuadro 40×40 radius-10 border stroke-soft-200 bg-white-0,
3094
3240
  * sui-icon `icon` 20px color icon-sub-600
3095
- * avatar → sui-avatar size=md (40px) src/initials
3241
+ * avatar → sui-avatar size=md (40px) via input `avatar` (config u src)
3096
3242
  * card-provider → cuadro 40×28 (ratio tarjeta) radius-6 con brand logo centrado
3097
3243
  * brand → cuadro 40×40 radius-10 border + sui-brand-logo `brand`
3098
3244
  * company → sui-avatar size=md con companyLogoSrc / iniciales
3099
3245
  *
3100
- * Badge (input `badge` + `badgeColor`): vive DENTRO del Title row (al lado del
3101
- * título), usando <sui-badge size="small" [color]="badgeColor()" variant="lighter">.
3246
+ * Badge (input `badge: SuiBadgeConfig | string | null`): vive DENTRO del Title row
3247
+ * (al lado del título), usando <sui-badge>. String shorthand = solo el label con los
3248
+ * defaults de la card (color 'orange', variant 'lighter', size 'small'); el objeto
3249
+ * SuiBadgeConfig { label, color?, variant?, size? } controla el badge completo.
3102
3250
  * El DS de Figma especifica AZUL (state/information/light #c0d5ff → sui-badge
3103
3251
  * color="blue"). El proyecto Master Pedidos prefiere NARANJA por branding, así que
3104
- * `badgeColor` default = 'orange', PERO es un input configurable: cualquier consumer
3105
- * que necesite el color del DS u otro semántico pasa `[badgeColor]="'blue'"` sin
3106
- * forkear el template. La tipografía del badge small es Subheading/2X Small 11/12
3107
- * UPPERCASE tracking 0.22px (0.02em), provista por el propio sui-badge.
3252
+ * el fallback de color = 'orange'; cualquier consumer que necesite el color del DS
3253
+ * u otro semántico pasa `[badge]="{ label: 'X', color: 'blue' }"` sin forkear el
3254
+ * template. La tipografía del badge small es Subheading/2X Small 11/12 UPPERCASE
3255
+ * tracking 0.22px (0.02em), provista por el propio sui-badge.
3108
3256
  *
3109
3257
  * Token map (Figma → sui-tokens):
3110
3258
  * bg/white-0 → --sui-bg-white-0 (#ffffff, card bg + leading bg)
@@ -3162,10 +3310,10 @@ type SuiContentCardType = 'basic' | 'left-icon' | 'avatar' | 'card-provider' | '
3162
3310
  * <sui-content-card type="left-icon" icon="bank-card-line"
3163
3311
  * title="Visa **** 4242" subtitle="Expira 09/27"
3164
3312
  * badge="Principal" (dismiss)="onRemove()" />
3165
- * <sui-content-card type="avatar" [avatarSrc]="user.photo"
3313
+ * <sui-content-card type="avatar" [avatar]="{ src: user.photo, initials: 'AT' }"
3166
3314
  * title="Ana Torres" subtitle="ana@correo.com" />
3167
- * <sui-content-card type="brand" brand="stripe"
3168
- * title="Stripe" subtitle="Conectado" badge="Activo" />
3315
+ * <sui-content-card type="brand" brand="stripe" title="Stripe" subtitle="Conectado"
3316
+ * [badge]="{ label: 'Activo', color: 'green' }" />
3169
3317
  */
3170
3318
  declare class SuiContentCard {
3171
3319
  /** Tipo de leading visual. */
@@ -3174,20 +3322,18 @@ declare class SuiContentCard {
3174
3322
  readonly title: _angular_core.InputSignal<string>;
3175
3323
  /** Subtítulo — Paragraph/Small, text-sub-600. */
3176
3324
  readonly subtitle: _angular_core.InputSignal<string>;
3177
- /** Texto del badge inline (Title row). Vacío → no se renderiza el badge. */
3178
- readonly badge: _angular_core.InputSignal<string>;
3179
- /**
3180
- * Color del badge inline. Default 'orange' (branding Master Pedidos). El DS de
3181
- * Figma especifica 'blue' (state/information/light); pasar [badgeColor]="'blue'"
3182
- * para alinearse al DS, o cualquier otro SuiBadgeColor semántico.
3183
- */
3184
- readonly badgeColor: _angular_core.InputSignal<SuiBadgeColor>;
3325
+ /** Badge inline (Title row) — string shorthand ('Principal') o SuiBadgeConfig
3326
+ (label + color/variant/size, tipado como sui-badge). Fallbacks de la card:
3327
+ color 'orange' (branding; el DS de Figma usa 'blue'), variant 'lighter',
3328
+ size 'small'. null/'' = sin badge. */
3329
+ readonly badge: _angular_core.InputSignal<string | SuiBadgeConfig | null>;
3330
+ protected readonly badgeCfg: _angular_core.Signal<SuiBadgeConfig | null>;
3185
3331
  /** RemixIcon name (sin 'ri-') para type=left-icon. */
3186
3332
  readonly icon: _angular_core.InputSignal<string | null>;
3187
- /** Foto del avatar para type=avatar / company. */
3188
- readonly avatarSrc: _angular_core.InputSignal<string | null>;
3189
- /** Iniciales fallback del avatar (type=avatar / company). */
3190
- readonly avatarInitials: _angular_core.InputSignal<string>;
3333
+ /** Avatar del leading (type=avatar / company) — string shorthand (src directo)
3334
+ o SuiAvatarConfig { src?, initials?, color? }. null = sin avatar. */
3335
+ readonly avatar: _angular_core.InputSignal<string | SuiAvatarConfig | null>;
3336
+ protected readonly avatarCfg: _angular_core.Signal<SuiAvatarConfig | null>;
3191
3337
  /** Logo de empresa para type=company (mini-avatar bottom-right del sui-avatar). */
3192
3338
  readonly companyLogoSrc: _angular_core.InputSignal<string | null>;
3193
3339
  /** Marca para type=brand / card-provider. */
@@ -3207,7 +3353,7 @@ declare class SuiContentCard {
3207
3353
  readonly hasLeading: _angular_core.Signal<boolean>;
3208
3354
  onDismiss(event: MouseEvent): void;
3209
3355
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiContentCard, never>;
3210
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiContentCard, "sui-content-card", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "badge": { "alias": "badge"; "required": false; "isSignal": true; }; "badgeColor": { "alias": "badgeColor"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "avatarSrc": { "alias": "avatarSrc"; "required": false; "isSignal": true; }; "avatarInitials": { "alias": "avatarInitials"; "required": false; "isSignal": true; }; "companyLogoSrc": { "alias": "companyLogoSrc"; "required": false; "isSignal": true; }; "brand": { "alias": "brand"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; "dismissAriaLabel": { "alias": "dismissAriaLabel"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "dismiss": "dismiss"; }, never, never, true, never>;
3356
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiContentCard, "sui-content-card", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "badge": { "alias": "badge"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "avatar": { "alias": "avatar"; "required": false; "isSignal": true; }; "companyLogoSrc": { "alias": "companyLogoSrc"; "required": false; "isSignal": true; }; "brand": { "alias": "brand"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; "dismissAriaLabel": { "alias": "dismissAriaLabel"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "dismiss": "dismiss"; }, never, never, true, never>;
3211
3357
  }
3212
3358
 
3213
3359
  type SuiContentDividerType = 'line' | 'line-spacing' | 'text-line' | 'text' | 'solid-text' | 'icon-button' | 'icon-button-group' | 'text-button' | 'text-button-group';
@@ -3869,13 +4015,14 @@ type SuiDrawerFooterType = 'stretch' | 'basic' | 'checkbox' | 'toggle' | 'steppe
3869
4015
  * radius-full → --sui-radius-full (stepper dots)
3870
4016
  *
3871
4017
  * Decisiones de homologación (vs reporte Drawer):
3872
- * - primaryDisabled / secondaryDisabled: NO existen como variant en Figma,
3873
- * pero se PRESERVAN — necesarios para flujos con validación. extraFeature.
3874
- * - stepperCurrent / stepperTotal: Figma es decorativo (3 dots fijos); el SUI
3875
- * los hace dinámicos/multi-step real. Se PRESERVAN (mejora funcional).
3876
- * - type='link-button' con linkLabel vacío ('') ahora NO renderiza el link
4018
+ * - `disabled` de los botones: NO existe como variant en Figma, pero se
4019
+ * PRESERVA (via SuiFooterButtonConfig.disabled) — necesario para flujos
4020
+ * con validación. extraFeature.
4021
+ * - stepper { current, total }: Figma es decorativo (3 dots fijos); el SUI
4022
+ * lo hace dinámico/multi-step real. Se PRESERVA (mejora funcional).
4023
+ * - type='link-button' con link null o label vacío NO renderiza el link
3877
4024
  * (antes renderizaba un sui-link-button vacío). Corrige openQuestion del
3878
- * reporte sin tocar API pública (mismo input/output/type).
4025
+ * reporte.
3879
4026
  *
3880
4027
  * Confirmado contra Figma live (2026-05-29):
3881
4028
  * - Stepper Dot [1.1] (479:14399): gap inter-dot = 10px exacto, dots 8×8,
@@ -3887,8 +4034,8 @@ type SuiDrawerFooterType = 'stretch' | 'basic' | 'checkbox' | 'toggle' | 'steppe
3887
4034
  * Usage:
3888
4035
  * <sui-drawer-footer
3889
4036
  * type="stretch"
3890
- * primaryLabel="Continuar"
3891
- * secondaryLabel="Cancelar"
4037
+ * primaryButton="Continuar"
4038
+ * secondaryButton="Cancelar"
3892
4039
  * (primaryClick)="save()"
3893
4040
  * (secondaryClick)="cancel()"
3894
4041
  * />
@@ -3897,28 +4044,31 @@ type SuiDrawerFooterType = 'stretch' | 'basic' | 'checkbox' | 'toggle' | 'steppe
3897
4044
  * type="checkbox"
3898
4045
  * checkboxLabel="No mostrar de nuevo"
3899
4046
  * [(checkboxActive)]="dontShowAgain"
3900
- * primaryLabel="Continuar"
4047
+ * [primaryButton]="{ label: 'Continuar', disabled: !valido }"
3901
4048
  * (primaryClick)="save()"
3902
4049
  * />
3903
4050
  *
3904
4051
  * <sui-drawer-footer
3905
4052
  * type="stepper"
3906
- * [stepperCurrent]="2"
3907
- * [stepperTotal]="5"
3908
- * primaryLabel="Siguiente"
3909
- * secondaryLabel="Atrás"
4053
+ * [stepper]="{ current: 2, total: 5 }"
4054
+ * primaryButton="Siguiente"
4055
+ * secondaryButton="Atrás"
3910
4056
  * />
3911
4057
  */
3912
4058
  declare class SuiDrawerFooter {
3913
4059
  readonly type: _angular_core.InputSignal<SuiDrawerFooterType>;
3914
- /** Label del botón primario (filled primary-base). */
3915
- readonly primaryLabel: _angular_core.InputSignal<string>;
3916
- /** Label del botón secundario (stroke neutral). null = ocultar. */
3917
- readonly secondaryLabel: _angular_core.InputSignal<string | null>;
3918
- /** Disabled state del botón primario. */
3919
- readonly primaryDisabled: _angular_core.InputSignal<boolean>;
3920
- /** Disabled state del botón secundario. */
3921
- readonly secondaryDisabled: _angular_core.InputSignal<boolean>;
4060
+ /** Botón primario (filled primary-base) — string shorthand (solo label) o
4061
+ * SuiFooterButtonConfig { label, disabled? }. Interfaz compartida con
4062
+ * sui-filter-panel-footer. */
4063
+ readonly primaryButton: _angular_core.InputSignal<string | SuiFooterButtonConfig>;
4064
+ /** Botón secundario (stroke neutral) — string shorthand o
4065
+ * SuiFooterButtonConfig. null (o label vacío) = ocultar. */
4066
+ readonly secondaryButton: _angular_core.InputSignal<string | SuiFooterButtonConfig | null>;
4067
+ /** Config resuelta del botón primario (string → { label }). */
4068
+ protected readonly primaryCfg: _angular_core.Signal<SuiFooterButtonConfig>;
4069
+ /** Config resuelta del botón secundario (string → { label }; null/label vacío
4070
+ * = oculto — regla DS: config presente = visible). */
4071
+ protected readonly secondaryCfg: _angular_core.Signal<SuiFooterButtonConfig | null>;
3922
4072
  /** Label del checkbox (type='checkbox'). */
3923
4073
  readonly checkboxLabel: _angular_core.InputSignal<string>;
3924
4074
  /** Two-way del checkbox state. */
@@ -3927,12 +4077,24 @@ declare class SuiDrawerFooter {
3927
4077
  readonly toggleLabel: _angular_core.InputSignal<string>;
3928
4078
  /** Two-way del switch state. */
3929
4079
  readonly toggleActive: _angular_core.ModelSignal<boolean>;
3930
- /** Stepper actual (0-indexed, type='stepper'). */
3931
- readonly stepperCurrent: _angular_core.InputSignal<number>;
3932
- /** Total de steps (type='stepper'). Default 3. */
3933
- readonly stepperTotal: _angular_core.InputSignal<number>;
3934
- /** Label del link button (type='link-button'). */
3935
- readonly linkLabel: _angular_core.InputSignal<string>;
4080
+ /** Stepper (type='stepper') — { current (0-indexed), total }. null cae al
4081
+ * default Figma (3 dots, primero activo). */
4082
+ readonly stepper: _angular_core.InputSignal<{
4083
+ current: number;
4084
+ total: number;
4085
+ } | null>;
4086
+ /** Config resuelta del stepper (null → default { current: 0, total: 3 }). */
4087
+ protected readonly stepperCfg: _angular_core.Signal<{
4088
+ current: number;
4089
+ total: number;
4090
+ }>;
4091
+ /** Link button (type='link-button') — string shorthand (solo label, emite
4092
+ * `linkClick`) o SuiLinkConfig { label, href?, target?, rel? }: con href
4093
+ * renderiza <a> real; rel automático 'noopener noreferrer' para _blank.
4094
+ * null o label vacío no renderiza el link. */
4095
+ readonly link: _angular_core.InputSignal<string | SuiLinkConfig | null>;
4096
+ /** Config resuelta del link (string → { label }, rel automático). */
4097
+ protected readonly linkCfg: _angular_core.Signal<SuiLinkConfig | null>;
3936
4098
  readonly primaryClick: _angular_core.OutputEmitterRef<Event>;
3937
4099
  readonly secondaryClick: _angular_core.OutputEmitterRef<Event>;
3938
4100
  readonly linkClick: _angular_core.OutputEmitterRef<MouseEvent>;
@@ -3942,7 +4104,7 @@ declare class SuiDrawerFooter {
3942
4104
  onSecondary(event: Event): void;
3943
4105
  onLink(event: MouseEvent): void;
3944
4106
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiDrawerFooter, never>;
3945
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiDrawerFooter, "sui-drawer-footer", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "primaryLabel": { "alias": "primaryLabel"; "required": false; "isSignal": true; }; "secondaryLabel": { "alias": "secondaryLabel"; "required": false; "isSignal": true; }; "primaryDisabled": { "alias": "primaryDisabled"; "required": false; "isSignal": true; }; "secondaryDisabled": { "alias": "secondaryDisabled"; "required": false; "isSignal": true; }; "checkboxLabel": { "alias": "checkboxLabel"; "required": false; "isSignal": true; }; "checkboxActive": { "alias": "checkboxActive"; "required": false; "isSignal": true; }; "toggleLabel": { "alias": "toggleLabel"; "required": false; "isSignal": true; }; "toggleActive": { "alias": "toggleActive"; "required": false; "isSignal": true; }; "stepperCurrent": { "alias": "stepperCurrent"; "required": false; "isSignal": true; }; "stepperTotal": { "alias": "stepperTotal"; "required": false; "isSignal": true; }; "linkLabel": { "alias": "linkLabel"; "required": false; "isSignal": true; }; }, { "checkboxActive": "checkboxActiveChange"; "toggleActive": "toggleActiveChange"; "primaryClick": "primaryClick"; "secondaryClick": "secondaryClick"; "linkClick": "linkClick"; }, never, never, true, never>;
4107
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiDrawerFooter, "sui-drawer-footer", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "primaryButton": { "alias": "primaryButton"; "required": false; "isSignal": true; }; "secondaryButton": { "alias": "secondaryButton"; "required": false; "isSignal": true; }; "checkboxLabel": { "alias": "checkboxLabel"; "required": false; "isSignal": true; }; "checkboxActive": { "alias": "checkboxActive"; "required": false; "isSignal": true; }; "toggleLabel": { "alias": "toggleLabel"; "required": false; "isSignal": true; }; "toggleActive": { "alias": "toggleActive"; "required": false; "isSignal": true; }; "stepper": { "alias": "stepper"; "required": false; "isSignal": true; }; "link": { "alias": "link"; "required": false; "isSignal": true; }; }, { "checkboxActive": "checkboxActiveChange"; "toggleActive": "toggleActiveChange"; "primaryClick": "primaryClick"; "secondaryClick": "secondaryClick"; "linkClick": "linkClick"; }, never, never, true, never>;
3946
4108
  }
3947
4109
 
3948
4110
  type SuiDrawerHeaderType = 'basic' | 'left-icon';
@@ -3973,8 +4135,8 @@ type SuiDrawerHeaderSize = 'small' | 'large' | 'xlarge';
3973
4135
  * Link Button (opcional, input `button=true` en Figma) — un Link Button
3974
4136
  * gray/medium/underlined (14/20/-0.6%, text/sub-600) entre el
3975
4137
  * content y el dismiss icon. Solo aparece en Basic+Small y
3976
- * LeftIcon+Small en Figma. Homologado vía `linkLabel` +
3977
- * `linkClick` (usa sui-link-button size=medium).
4138
+ * LeftIcon+Small en Figma. Homologado vía `link` (SuiLinkConfig
4139
+ * | string) + `linkClick` (usa sui-link-button size=medium).
3978
4140
  *
3979
4141
  * Divider (opcional, posición=absolute bottom) — 1px stroke-soft-200
3980
4142
  *
@@ -3988,16 +4150,20 @@ type SuiDrawerHeaderSize = 'small' | 'large' | 'xlarge';
3988
4150
  * radius-full → --sui-radius-full (badge + icon-badge)
3989
4151
  * shadow x-small → --sui-regular-shadow-x-small (icon-badge frame)
3990
4152
  *
3991
- * Badge: círculo 20×20 fijo en Figma (siempre muestra "2"). El SUI usa
3992
- * min-width:20px + height:20px → para 1 dígito es un círculo 20×20 exacto;
3993
- * para 2+ dígitos crece en width manteniendo height 20 (pill), comportamiento
3994
- * DS estándar de un number-badge. NO se fuerza width:20px fijo para no recortar
3995
- * números >= 10 (ver openQuestion del reporte).
4153
+ * Badge (`badge: SuiBadgeConfig | number | string | null`):
4154
+ * - number → badge NUMÉRICO Figma (círculo error 20×20, span custom): círculo
4155
+ * 20×20 fijo en Figma (siempre muestra "2"). El SUI usa min-width:20px +
4156
+ * height:20px → para 1 dígito es un círculo 20×20 exacto; para 2+ dígitos
4157
+ * crece en width manteniendo height 20 (pill), comportamiento DS estándar de
4158
+ * un number-badge. NO se fuerza width:20px fijo para no recortar números
4159
+ * >= 10 (ver openQuestion del reporte).
4160
+ * - string / SuiBadgeConfig → <sui-badge> estándar con los fallbacks canon del
4161
+ * patrón (orange/light/small), igual que checkbox-label/switch-label.
3996
4162
  *
3997
4163
  * Confirmado contra Figma live (2026-05-29):
3998
4164
  * - Link Button SOLO existe en variants Small. El prop `button` solo está
3999
4165
  * en Basic+Small (3187:5673) y LeftIcon+Small; las variants Large
4000
- * (3187:4549) NO lo tienen. El template gatea `linkLabel() && size()==='small'`.
4166
+ * (3187:4549) NO lo tienen. El template gatea `linkCfg() && size()==='small'`.
4001
4167
  * - Link Button color = text/sub-600 (gray variant del sui-link-button).
4002
4168
  * - Posición: entre content y dismiss icon (orden de capas Figma confirmado).
4003
4169
  *
@@ -4026,17 +4192,29 @@ declare class SuiDrawerHeader {
4026
4192
  readonly description: _angular_core.InputSignal<string | null>;
4027
4193
  /** RemixIcon name (sin 'ri-') para variant left-icon. */
4028
4194
  readonly icon: _angular_core.InputSignal<string | null>;
4029
- /** Número del badge built-in al lado del title (style.error.base). null = no badge. */
4030
- readonly badgeNumber: _angular_core.InputSignal<number | null>;
4031
- /**
4032
- * Label del Link Button inline del header (Figma input `button=true`).
4033
- * Cuando es '' (default) NO se renderiza el link. Cualquier string lo muestra
4034
- * entre el content y el dismiss icon — PERO solo cuando size='small', porque
4035
- * Figma define el Link Button únicamente en Basic+Small / LeftIcon+Small
4036
- * (las variants Large no tienen el prop `button`). Pasar linkLabel con
4037
- * size='large' no renderiza nada (se gatea en el template).
4038
- */
4039
- readonly linkLabel: _angular_core.InputSignal<string>;
4195
+ /** Badge junto al title — union de 3 formas:
4196
+ * - `number` → badge NUMÉRICO built-in del Figma (círculo state/error/base
4197
+ * 20×20, span custom). `0` es válido (se renderiza).
4198
+ * - `string` → shorthand de badge estándar (solo label, fallbacks canon).
4199
+ * - `SuiBadgeConfig` → <sui-badge> con color/variant/size (defaults
4200
+ * orange/light/small, mismo patrón que checkbox-label).
4201
+ * null = sin badge. */
4202
+ readonly badge: _angular_core.InputSignal<string | number | SuiBadgeConfig | null>;
4203
+ /** Valor del badge numérico Figma (render span custom). null si el badge no es number. */
4204
+ protected readonly badgeNum: _angular_core.Signal<number | null>;
4205
+ /** Config resuelta del badge estándar (string → { label }). null si number/sin badge. */
4206
+ protected readonly badgeCfg: _angular_core.Signal<SuiBadgeConfig | null>;
4207
+ /** Link Button inline del header (Figma input `button=true`) — string
4208
+ * shorthand (solo label, emite `linkClick`) o SuiLinkConfig
4209
+ * { label, href?, target?, rel? }: con href renderiza <a> real; rel
4210
+ * automático 'noopener noreferrer' para _blank. (Mismo patrón objeto que
4211
+ * `badge`/SuiBadgeConfig.) Se muestra entre el content y el dismiss icon —
4212
+ * PERO solo cuando size='small', porque Figma define el Link Button
4213
+ * únicamente en Basic+Small / LeftIcon+Small (las variants Large no tienen
4214
+ * el prop `button`). Pasar link con size='large' no renderiza nada. */
4215
+ readonly link: _angular_core.InputSignal<string | SuiLinkConfig | null>;
4216
+ /** Config resuelta del link (string → { label }, rel automático). */
4217
+ protected readonly linkCfg: _angular_core.Signal<SuiLinkConfig | null>;
4040
4218
  /** Muestra el close button trailing. Default true. */
4041
4219
  readonly showDismiss: _angular_core.InputSignal<boolean>;
4042
4220
  /** Muestra divider 1px al fondo del header. Default false. */
@@ -4045,12 +4223,12 @@ declare class SuiDrawerHeader {
4045
4223
  readonly dismissAriaLabel: _angular_core.InputSignal<string>;
4046
4224
  /** Click en el close button. */
4047
4225
  readonly dismiss: _angular_core.OutputEmitterRef<MouseEvent>;
4048
- /** Click en el Link Button inline (solo cuando linkLabel !== ''). */
4226
+ /** Click en el Link Button inline (solo cuando `link` está set). */
4049
4227
  readonly linkClick: _angular_core.OutputEmitterRef<MouseEvent>;
4050
4228
  onDismiss(event: MouseEvent): void;
4051
4229
  onLink(event: MouseEvent): void;
4052
4230
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiDrawerHeader, never>;
4053
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiDrawerHeader, "sui-drawer-header", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "badgeNumber": { "alias": "badgeNumber"; "required": false; "isSignal": true; }; "linkLabel": { "alias": "linkLabel"; "required": false; "isSignal": true; }; "showDismiss": { "alias": "showDismiss"; "required": false; "isSignal": true; }; "showDivider": { "alias": "showDivider"; "required": false; "isSignal": true; }; "dismissAriaLabel": { "alias": "dismissAriaLabel"; "required": false; "isSignal": true; }; }, { "dismiss": "dismiss"; "linkClick": "linkClick"; }, never, never, true, never>;
4231
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiDrawerHeader, "sui-drawer-header", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "badge": { "alias": "badge"; "required": false; "isSignal": true; }; "link": { "alias": "link"; "required": false; "isSignal": true; }; "showDismiss": { "alias": "showDismiss"; "required": false; "isSignal": true; }; "showDivider": { "alias": "showDivider"; "required": false; "isSignal": true; }; "dismissAriaLabel": { "alias": "dismissAriaLabel"; "required": false; "isSignal": true; }; }, { "dismiss": "dismiss"; "linkClick": "linkClick"; }, never, never, true, never>;
4054
4232
  }
4055
4233
 
4056
4234
  /**
@@ -4278,6 +4456,18 @@ type SuiDropdownMenuPopupRole = 'menu' | 'listbox' | 'true';
4278
4456
  declare class SuiDropdownMenu {
4279
4457
  /** Si true, el panel matchea el ancho del trigger. Default: auto width. */
4280
4458
  readonly matchWidth: _angular_core.InputSignal<boolean>;
4459
+ /** Estrategia ante espacio insuficiente. Default (true): el pane se ENCOGE
4460
+ * al espacio libre (correcto para menús de items con scroll interno).
4461
+ * Para paneles de tamaño FIJO (color picker): false + push=true — el panel
4462
+ * se corre (puede tapar el trigger) pero se muestra ENTERO. */
4463
+ readonly flexibleDimensions: _angular_core.InputSignal<boolean>;
4464
+ /** withPush del CDK: empuja el pane dentro del viewport si no cabe.
4465
+ * ⚠️ Caveat CDK: un pane pusheado queda con coordenadas fijas y NO
4466
+ * re-ancla al origin al scrollear (flota despegado del trigger) — bug
4467
+ * real con el color picker 2026-07-21. Preferir push=false: el pane
4468
+ * queda anclado y sigue el scroll; si no cabe, sobresale del viewport
4469
+ * como cualquier popover nativo. */
4470
+ readonly push: _angular_core.InputSignal<boolean>;
4281
4471
  /** Min-width fijo del panel (px). Si matchWidth + minWidth: `max(triggerWidth, minWidth)`. */
4282
4472
  readonly minWidth: _angular_core.InputSignal<number | null>;
4283
4473
  /** Position primary. Default: auto = below con fallback above. */
@@ -4322,7 +4512,7 @@ declare class SuiDropdownMenu {
4322
4512
  open(): void;
4323
4513
  close(): void;
4324
4514
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiDropdownMenu, never>;
4325
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiDropdownMenu, "sui-dropdown-menu", ["suiDropdownMenu"], { "matchWidth": { "alias": "matchWidth"; "required": false; "isSignal": true; }; "minWidth": { "alias": "minWidth"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "viewportMargin": { "alias": "viewportMargin"; "required": false; "isSignal": true; }; "panelClass": { "alias": "panelClass"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "popupRole": { "alias": "popupRole"; "required": false; "isSignal": true; }; "origin": { "alias": "origin"; "required": false; "isSignal": true; }; }, { "openedChange": "openedChange"; }, ["_panel"], ["[trigger]"], true, never>;
4515
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiDropdownMenu, "sui-dropdown-menu", ["suiDropdownMenu"], { "matchWidth": { "alias": "matchWidth"; "required": false; "isSignal": true; }; "flexibleDimensions": { "alias": "flexibleDimensions"; "required": false; "isSignal": true; }; "push": { "alias": "push"; "required": false; "isSignal": true; }; "minWidth": { "alias": "minWidth"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "viewportMargin": { "alias": "viewportMargin"; "required": false; "isSignal": true; }; "panelClass": { "alias": "panelClass"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "popupRole": { "alias": "popupRole"; "required": false; "isSignal": true; }; "origin": { "alias": "origin"; "required": false; "isSignal": true; }; }, { "openedChange": "openedChange"; }, ["_panel"], ["[trigger]"], true, never>;
4326
4516
  }
4327
4517
 
4328
4518
  /**
@@ -4465,7 +4655,7 @@ type SuiEmojiName = keyof typeof SUI_EMOJI_MAP;
4465
4655
  type SuiEmojiSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'full';
4466
4656
  declare class SuiEmoji {
4467
4657
  /** Nombre del emoji del catálogo. Si se proveé `src`, este se ignora. */
4468
- readonly name: _angular_core.InputSignal<"warning" | "label" | "thinking-face" | "grinning-face" | "smiling-face-hearts" | "face-with-rolling-eyes" | "face-screaming" | "partying-face" | "star-struck" | "sleeping-face" | "pensive-face" | "confused-face" | "neutral-face" | "slightly-smiling-face" | "grinning-face-smiling-eyes" | "package" | "receipt" | "money-bag" | "money-with-wings" | "shopping-cart" | "shopping-bags" | "card-index-dividers" | "bell" | "bell-with-slash" | "pushpin" | "mobile-phone" | "gear" | "locked" | "unlocked" | "wrench" | "hammer" | "magnifying-glass-tilted-left" | "spiral-calendar" | "bar-chart" | "delivery-truck" | "motorcycle" | "rocket" | "house" | "office-building" | "shop" | "dollar-banknote" | "glowing-star" | "kick-scooter" | "check-mark" | "check-mark-button" | "cross-mark" | "no-entry" | "sparkles" | "party-popper" | "waving-hand" | "thumbs-up" | "clapping-hands" | "handshake" | "busts-in-silhouette" | "pizza" | "hamburger" | "taco" | "birthday-cake" | null>;
4658
+ readonly name: _angular_core.InputSignal<"label" | "warning" | "thinking-face" | "grinning-face" | "smiling-face-hearts" | "face-with-rolling-eyes" | "face-screaming" | "partying-face" | "star-struck" | "sleeping-face" | "pensive-face" | "confused-face" | "neutral-face" | "slightly-smiling-face" | "grinning-face-smiling-eyes" | "package" | "receipt" | "money-bag" | "money-with-wings" | "shopping-cart" | "shopping-bags" | "card-index-dividers" | "bell" | "bell-with-slash" | "pushpin" | "mobile-phone" | "gear" | "locked" | "unlocked" | "wrench" | "hammer" | "magnifying-glass-tilted-left" | "spiral-calendar" | "bar-chart" | "delivery-truck" | "motorcycle" | "rocket" | "house" | "office-building" | "shop" | "dollar-banknote" | "glowing-star" | "kick-scooter" | "check-mark" | "check-mark-button" | "cross-mark" | "no-entry" | "sparkles" | "party-popper" | "waving-hand" | "thumbs-up" | "clapping-hands" | "handshake" | "busts-in-silhouette" | "pizza" | "hamburger" | "taco" | "birthday-cake" | null>;
4469
4659
  /** URL directa al emoji (override del catálogo). Útil para usar emojis fuera del map. */
4470
4660
  readonly src: _angular_core.InputSignal<string | null>;
4471
4661
  /** Tamaño del emoji. */
@@ -4481,6 +4671,15 @@ declare class SuiEmoji {
4481
4671
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiEmoji, "sui-emoji", never, { "name": { "alias": "name"; "required": false; "isSignal": true; }; "src": { "alias": "src"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4482
4672
  }
4483
4673
 
4674
+ /**
4675
+ * Config del CTA del empty state. String shorthand = solo label (el botón
4676
+ * emite `actionClicked`); con `route` el botón navega vía routerLink.
4677
+ * (Mismo patrón objeto que `badge`/`link` de sui-checkbox-label.)
4678
+ */
4679
+ interface SuiEmptyStateAction {
4680
+ label: string;
4681
+ route?: string;
4682
+ }
4484
4683
  /**
4485
4684
  * SUI Empty State — SUI Design System 2.0
4486
4685
  *
@@ -4512,24 +4711,28 @@ declare class SuiEmoji {
4512
4711
  * ilustración default es el zorro (mascota canon de los empty states).
4513
4712
  * - title (required): heading
4514
4713
  * - subtitle: descripción
4515
- * - actionLabel + actionRoute: botón con routerLink
4516
- * - actionLabel solo: botón emite (actionClicked)
4714
+ * - action: string shorthand (solo label → botón emite actionClicked) o
4715
+ * { label, route? } — con route el botón navega vía routerLink
4517
4716
  */
4518
4717
  declare class SuiEmptyState {
4519
4718
  /** URL de Fluent Emoji (3D o animado) — override del zorro default. */
4520
4719
  emoji: _angular_core.InputSignal<string>;
4521
4720
  title: _angular_core.InputSignal<string>;
4522
4721
  subtitle: _angular_core.InputSignal<string>;
4523
- actionLabel: _angular_core.InputSignal<string>;
4524
- actionRoute: _angular_core.InputSignal<string>;
4722
+ /** CTA del empty state — string shorthand (solo label, emite `actionClicked`)
4723
+ o SuiEmptyStateAction { label, route? } (con route usa routerLink).
4724
+ null/'' = sin botón. */
4725
+ action: _angular_core.InputSignal<string | SuiEmptyStateAction | null>;
4525
4726
  actionClicked: _angular_core.OutputEmitterRef<void>;
4727
+ /** Config resuelta del CTA (string → { label }; sin label → null). */
4728
+ protected readonly actionCfg: _angular_core.Signal<SuiEmptyStateAction | null>;
4526
4729
  /** URL del emoji. Default = zorro (mascota canon de empty states del proyecto):
4527
4730
  todo empty muestra el zorro salvo que pase un `emoji` URL distinto explícito.
4528
4731
  Centralizar el default acá garantiza consistencia en TODOS los empty —
4529
4732
  incluidas las secciones reutilizables — sin tocar cada uso. */
4530
4733
  protected readonly resolvedEmojiSrc: _angular_core.Signal<string>;
4531
4734
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiEmptyState, never>;
4532
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiEmptyState, "sui-empty-state", never, { "emoji": { "alias": "emoji"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": true; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "actionLabel": { "alias": "actionLabel"; "required": false; "isSignal": true; }; "actionRoute": { "alias": "actionRoute"; "required": false; "isSignal": true; }; }, { "actionClicked": "actionClicked"; }, never, never, true, never>;
4735
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiEmptyState, "sui-empty-state", never, { "emoji": { "alias": "emoji"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": true; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "action": { "alias": "action"; "required": false; "isSignal": true; }; }, { "actionClicked": "actionClicked"; }, never, never, true, never>;
4533
4736
  }
4534
4737
  /** Zorro animado (Fluent Emoji) — emoji default canon de los empty states. */
4535
4738
  declare const EMPTY_STATE_FOX_EMOJI = "https://raw.githubusercontent.com/Tarikul-Islam-Anik/Animated-Fluent-Emojis/master/Emojis/Animals/Fox.png";
@@ -4739,6 +4942,15 @@ declare class SuiFileIcon {
4739
4942
  }
4740
4943
 
4741
4944
  type SuiFileUploadCardState = 'in-progress' | 'success' | 'error';
4945
+ /**
4946
+ * Config del archivo mostrado en la card. String shorthand = filename directo
4947
+ * (mismo patrón objeto que `badge`/`link` de sui-checkbox-label).
4948
+ * `extension` fuerza el tipo del file-icon; si falta se extrae del filename.
4949
+ */
4950
+ interface SuiFileUploadCardFile {
4951
+ filename: string;
4952
+ extension?: string;
4953
+ }
4742
4954
  /**
4743
4955
  * SUI File Upload Card — SUI Design System 2.0
4744
4956
  *
@@ -4822,8 +5034,9 @@ type SuiFileUploadCardState = 'in-progress' | 'success' | 'error';
4822
5034
  * error-warning-fill (error) → --sui-state-error-base (rojo) — íd.
4823
5035
  *
4824
5036
  * Inputs:
4825
- * - filename: string visible (default "file.pdf")
4826
- * - extension: override del FileIcon (extrae de filename si vacío)
5037
+ * - file: string shorthand (= filename, default "file.pdf") o
5038
+ * { filename, extension? } — extension overridea el FileIcon
5039
+ * (si falta se extrae del filename)
4827
5040
  * - description: texto secundario izquierdo (ej. "0 KB of 120 KB")
4828
5041
  * - state: 'in-progress' | 'success' | 'error'
4829
5042
  * - progress: 0–100 — solo se muestra si state==='in-progress'
@@ -4838,8 +5051,10 @@ type SuiFileUploadCardState = 'in-progress' | 'success' | 'error';
4838
5051
  * - retryClicked: click en "Try Again" (solo state==='error')
4839
5052
  */
4840
5053
  declare class SuiFileUploadCard {
4841
- readonly filename: _angular_core.InputSignal<string>;
4842
- readonly extension: _angular_core.InputSignal<string>;
5054
+ /** Archivo mostrado — string shorthand (= filename) o { filename, extension? }. */
5055
+ readonly file: _angular_core.InputSignal<string | SuiFileUploadCardFile>;
5056
+ /** Config resuelta del archivo (string → { filename }). */
5057
+ protected readonly fileCfg: _angular_core.Signal<Required<SuiFileUploadCardFile>>;
4843
5058
  readonly description: _angular_core.InputSignal<string>;
4844
5059
  readonly state: _angular_core.InputSignal<SuiFileUploadCardState>;
4845
5060
  readonly progress: _angular_core.InputSignal<number>;
@@ -4859,7 +5074,7 @@ declare class SuiFileUploadCard {
4859
5074
  protected onAction(): void;
4860
5075
  protected onRetry(): void;
4861
5076
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiFileUploadCard, never>;
4862
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiFileUploadCard, "sui-file-upload-card", never, { "filename": { "alias": "filename"; "required": false; "isSignal": true; }; "extension": { "alias": "extension"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "progress": { "alias": "progress"; "required": false; "isSignal": true; }; "statusText": { "alias": "statusText"; "required": false; "isSignal": true; }; "showStatus": { "alias": "showStatus"; "required": false; "isSignal": true; }; "retryLabel": { "alias": "retryLabel"; "required": false; "isSignal": true; }; }, { "actionClicked": "actionClicked"; "retryClicked": "retryClicked"; }, never, never, true, never>;
5077
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiFileUploadCard, "sui-file-upload-card", never, { "file": { "alias": "file"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "progress": { "alias": "progress"; "required": false; "isSignal": true; }; "statusText": { "alias": "statusText"; "required": false; "isSignal": true; }; "showStatus": { "alias": "showStatus"; "required": false; "isSignal": true; }; "retryLabel": { "alias": "retryLabel"; "required": false; "isSignal": true; }; }, { "actionClicked": "actionClicked"; "retryClicked": "retryClicked"; }, never, never, true, never>;
4863
5078
  }
4864
5079
 
4865
5080
  type SuiFileUploadSize = 'small' | 'medium' | 'large' | 'xlarge';
@@ -5118,19 +5333,24 @@ declare class SuiFilterItem {
5118
5333
  *
5119
5334
  * Usage:
5120
5335
  * <sui-filter-panel-header label="Filters" leftIcon="equalizer-line"
5121
- * [clearable]="true" (clear)="onClear()" />
5336
+ * [clear]="true" (clearClick)="onClear()" />
5337
+ * <sui-filter-panel-header label="Filtros" clear="Limpiar"
5338
+ * (clearClick)="onClear()" />
5122
5339
  */
5123
5340
  declare class SuiFilterPanelHeader {
5124
5341
  readonly label: _angular_core.InputSignal<string>;
5125
5342
  /** Icono opcional a la izquierda del label (20×20). */
5126
5343
  readonly leftIcon: _angular_core.InputSignal<string | null>;
5127
- /** Muestra el link "Clear" a la derecha. */
5128
- readonly clearable: _angular_core.InputSignal<boolean>;
5129
- /** Texto del link de limpieza. */
5130
- readonly clearLabel: _angular_core.InputSignal<string>;
5131
- readonly clear: _angular_core.OutputEmitterRef<void>;
5344
+ /** Link de limpieza a la derecha: `true` = label default 'Clear', string =
5345
+ * label custom, `false` (default) = oculto. */
5346
+ readonly clear: _angular_core.InputSignal<string | boolean>;
5347
+ /** Label resuelto del link (null = oculto). */
5348
+ protected readonly clearLabelCfg: _angular_core.Signal<string | null>;
5349
+ /** Click en el link de limpieza. (Renombrado de `clear` — el nombre lo tomó
5350
+ * el input consolidado; input y output no pueden compartir nombre.) */
5351
+ readonly clearClick: _angular_core.OutputEmitterRef<void>;
5132
5352
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiFilterPanelHeader, never>;
5133
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiFilterPanelHeader, "sui-filter-panel-header", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "leftIcon": { "alias": "leftIcon"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "clearLabel": { "alias": "clearLabel"; "required": false; "isSignal": true; }; }, { "clear": "clear"; }, never, never, true, never>;
5353
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiFilterPanelHeader, "sui-filter-panel-header", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "leftIcon": { "alias": "leftIcon"; "required": false; "isSignal": true; }; "clear": { "alias": "clear"; "required": false; "isSignal": true; }; }, { "clearClick": "clearClick"; }, never, never, true, never>;
5134
5354
  }
5135
5355
 
5136
5356
  /**
@@ -5165,20 +5385,27 @@ declare class SuiFilterPanelHeader {
5165
5385
  *
5166
5386
  * Usage:
5167
5387
  * <sui-filter-panel-footer (clear)="onClear()" (apply)="onApply()" />
5168
- * <sui-filter-panel-footer clearLabel="Reset" applyLabel="Aplicar filtros"
5169
- * [applyDisabled]="!dirty()" (apply)="onApply()" />
5388
+ * <sui-filter-panel-footer clearButton="Reset"
5389
+ * [applyButton]="{ label: 'Aplicar filtros', disabled: !dirty() }"
5390
+ * (apply)="onApply()" />
5170
5391
  */
5171
5392
  declare class SuiFilterPanelFooter {
5172
- readonly clearLabel: _angular_core.InputSignal<string>;
5173
- readonly applyLabel: _angular_core.InputSignal<string>;
5174
- readonly clearDisabled: _angular_core.InputSignal<boolean>;
5175
- readonly applyDisabled: _angular_core.InputSignal<boolean>;
5393
+ /** Botón "Clear" (stroke neutral) — string shorthand (solo label) o
5394
+ * SuiFooterButtonConfig { label, disabled? }. Interfaz compartida con
5395
+ * sui-drawer-footer. */
5396
+ readonly clearButton: _angular_core.InputSignal<string | SuiFooterButtonConfig>;
5397
+ /** Botón "Apply" (filled primary) — string shorthand o SuiFooterButtonConfig. */
5398
+ readonly applyButton: _angular_core.InputSignal<string | SuiFooterButtonConfig>;
5176
5399
  /** Tamaño de los botones. Default 'small' (Figma: p-8px/radius-8 = size small). */
5177
- readonly size: _angular_core.InputSignal<"medium" | "small">;
5400
+ readonly size: _angular_core.InputSignal<"small" | "medium">;
5401
+ /** Config resuelta del botón Clear (string → { label }). */
5402
+ protected readonly clearCfg: _angular_core.Signal<SuiFooterButtonConfig>;
5403
+ /** Config resuelta del botón Apply (string → { label }). */
5404
+ protected readonly applyCfg: _angular_core.Signal<SuiFooterButtonConfig>;
5178
5405
  readonly clear: _angular_core.OutputEmitterRef<void>;
5179
5406
  readonly apply: _angular_core.OutputEmitterRef<void>;
5180
5407
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiFilterPanelFooter, never>;
5181
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiFilterPanelFooter, "sui-filter-panel-footer", never, { "clearLabel": { "alias": "clearLabel"; "required": false; "isSignal": true; }; "applyLabel": { "alias": "applyLabel"; "required": false; "isSignal": true; }; "clearDisabled": { "alias": "clearDisabled"; "required": false; "isSignal": true; }; "applyDisabled": { "alias": "applyDisabled"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, { "clear": "clear"; "apply": "apply"; }, never, never, true, never>;
5408
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiFilterPanelFooter, "sui-filter-panel-footer", never, { "clearButton": { "alias": "clearButton"; "required": false; "isSignal": true; }; "applyButton": { "alias": "applyButton"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, { "clear": "clear"; "apply": "apply"; }, never, never, true, never>;
5182
5409
  }
5183
5410
 
5184
5411
  type SuiFormHintVariant = 'neutral' | 'error' | 'success' | 'warning' | 'disabled';
@@ -5261,18 +5488,21 @@ type SuiFormLabelSize = 'xsmall' | 'small' | 'medium';
5261
5488
  * - Required → input `required` (asterisco)
5262
5489
  * - Sublabel → input `sublabel` (texto secundario)
5263
5490
  * - Info → input `tooltip` (icono ℹ + tooltip)
5264
- * - Button → input `linkText` + output `linkClick` (link tipo "Help?" a la derecha)
5491
+ * - Button → input `link` + output `linkClick` (link tipo "Help?" a la derecha)
5265
5492
  *
5266
5493
  * @input label: string (required) — Texto principal del label
5267
5494
  * @input sublabel: string | null — Texto secundario pequeño (ej. "Optional", "Required")
5268
5495
  * @input required: boolean — Muestra asterisco al final del label principal
5269
5496
  * @input tooltip: string | null — Tooltip sobre icono info (ℹ) al final del label
5270
- * @input linkText: string | null — Texto del link de acción a la derecha (variante "Button"
5271
- * de Figma, ej. "Help?"). Si null, no se renderiza el link.
5497
+ * @input link: SuiLinkConfig | string | null — Link de acción a la derecha (variante
5498
+ * "Button" de Figma, ej. "Help?"). String shorthand = solo label (emite `linkClick`);
5499
+ * SuiLinkConfig { label, href?, target?, rel? } = <a> real con rel automático
5500
+ * 'noopener noreferrer' si target='_blank' (patrón canon sui-checkbox-label).
5501
+ * Si null, no se renderiza el link.
5272
5502
  * @input size: 'xsmall' | 'small' | 'medium' — Tamaño visual, default 'medium'
5273
5503
  * @input disabled: boolean — Atenúa todo el label (text/sublabel/asterisco/icono/link)
5274
5504
  * @input for: string | null — Attr `for` del <label> para accesibilidad
5275
- * @output linkClick: void — Emite cuando se clickea el link de acción ("Button" variant)
5505
+ * @output linkClick: MouseEvent — Emite cuando se clickea el link de acción ("Button" variant)
5276
5506
  *
5277
5507
  * Variantes (todas verificadas contra el variantMatrix de la auditoría;
5278
5508
  * los valores cromáticos exactos quedan PENDING VERIFY hasta re-correr MCP Figma):
@@ -5286,7 +5516,12 @@ type SuiFormLabelSize = 'xsmall' | 'small' | 'medium';
5286
5516
  * (registrado en SUI_CUSTOM_ICONS) — círculo relleno con "i" serif, NO el
5287
5517
  * ri-information-fill de RemixIcon (i recta). Color --sui-icon-disabled-300 (#d1d1d1)
5288
5518
  * via currentColor; el vector queda ~12.5px centrado en slot 20px (padding 18.75%).
5289
- * - linkText: link --sui-primary-base alineado a la derecha (margin-left: auto).
5519
+ * - link: sui-link-button variant="gray" size="small" alineado a la derecha
5520
+ * (margin-left: auto). En Figma el nodo del link ES una instancia de
5521
+ * "Link Buttons [1.1]" (266:2814) → se renderiza con el COMPONENTE real,
5522
+ * no un <button> maqueta (canon: ningún button custom donde un SUI sirve).
5523
+ * Variant gray = 12/16/500 text/sub-600 base + disabled-300, idéntico al
5524
+ * spec verificado del label.
5290
5525
  * - disabled: --sui-text-disabled-300 / --sui-icon-disabled-300 en todo, sin cursor pointer.
5291
5526
  * - sizes: xsmall/small/medium — tipografía escala con el field que acompaña.
5292
5527
  *
@@ -5302,11 +5537,14 @@ declare class SuiFormLabel {
5302
5537
  readonly required: _angular_core.InputSignal<boolean>;
5303
5538
  /** Tooltip opcional sobre un icono info (ℹ) al final del label */
5304
5539
  readonly tooltip: _angular_core.InputSignal<string | null>;
5305
- /**
5306
- * Texto del link de acción a la derecha (variante "Button" de Figma, ej. "Help?").
5307
- * Si null/vacío, no se renderiza el link.
5308
- */
5309
- readonly linkText: _angular_core.InputSignal<string | null>;
5540
+ /** Link de acción a la derecha (variante "Button" de Figma, ej. "Help?") —
5541
+ * string shorthand (solo label, emite `linkClick`) o SuiLinkConfig
5542
+ * { label, href?, target?, rel? }: con href renderiza <a> real; rel
5543
+ * automático 'noopener noreferrer' para _blank. Si null/vacío, no se
5544
+ * renderiza el link. (Patrón canon `link` de sui-checkbox-label.) */
5545
+ readonly link: _angular_core.InputSignal<string | SuiLinkConfig | null>;
5546
+ /** Config resuelta del link (string → { label }, rel automático). */
5547
+ protected readonly linkCfg: _angular_core.Signal<SuiLinkConfig | null>;
5310
5548
  /** Tamaño visual — matchea al field que acompaña */
5311
5549
  readonly size: _angular_core.InputSignal<SuiFormLabelSize>;
5312
5550
  /** Atenúa todo el label (estado Disabled de Figma) */
@@ -5314,9 +5552,12 @@ declare class SuiFormLabel {
5314
5552
  /** ID del field controlado (para accesibilidad `for` attribute) */
5315
5553
  readonly for: _angular_core.InputSignal<string | null>;
5316
5554
  /** Emite cuando se clickea el link de acción (variante "Button" de Figma) */
5317
- readonly linkClick: _angular_core.OutputEmitterRef<void>;
5555
+ readonly linkClick: _angular_core.OutputEmitterRef<MouseEvent>;
5556
+ /** Click del link: stop-propagation para no disparar la activación del <label>
5557
+ * contenedor. sui-link-button ya bloquea el click cuando está disabled. */
5558
+ onLinkClick(event: MouseEvent): void;
5318
5559
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiFormLabel, never>;
5319
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiFormLabel, "sui-form-label", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "sublabel": { "alias": "sublabel"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "tooltip": { "alias": "tooltip"; "required": false; "isSignal": true; }; "linkText": { "alias": "linkText"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "for": { "alias": "for"; "required": false; "isSignal": true; }; }, { "linkClick": "linkClick"; }, never, never, true, never>;
5560
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiFormLabel, "sui-form-label", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "sublabel": { "alias": "sublabel"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "tooltip": { "alias": "tooltip"; "required": false; "isSignal": true; }; "link": { "alias": "link"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "for": { "alias": "for"; "required": false; "isSignal": true; }; }, { "linkClick": "linkClick"; }, never, never, true, never>;
5320
5561
  }
5321
5562
 
5322
5563
  /**
@@ -5350,6 +5591,13 @@ declare class SuiIcon {
5350
5591
 
5351
5592
  type SuiImageUploadProfileAlignment = 'vertical' | 'horizontal';
5352
5593
  type SuiImageUploadProfileType = 'avatar' | 'company';
5594
+ /** Copy de los botones de acción (i18n). Cada key es opcional — lo no seteado
5595
+ * cae al default en español (tuteo): Subir / Eliminar / Cambiar. */
5596
+ interface SuiImageUploadProfileLabels {
5597
+ upload?: string;
5598
+ remove?: string;
5599
+ change?: string;
5600
+ }
5353
5601
  /**
5354
5602
  * SUI Image Upload Profile — SUI Design System 2.0
5355
5603
  *
@@ -5396,9 +5644,10 @@ type SuiImageUploadProfileType = 'avatar' | 'company';
5396
5644
  * + "Change" (stroke neutral) — node 452:847
5397
5645
  * Geometría Figma: p-6 uniforme, radius-8, inner text-wrap px-4,
5398
5646
  * Label/Small 14/20/-0.6% 500. Mapea EXACTO a <sui-button size="xsmall">.
5399
- * Labels configurables via inputs (uploadLabel/removeLabel/changeLabel) —
5400
- * en Figma están hardcodeadas en inglés; acá el default va en español
5401
- * (tuteo peruano) y el consumer puede overridear para i18n.
5647
+ * Labels configurables via el input objeto `labels`
5648
+ * ({ upload?, remove?, change? }) — en Figma están hardcodeadas en inglés;
5649
+ * acá el default va en español (tuteo peruano) y el consumer puede
5650
+ * overridear (parcial o total) para i18n.
5402
5651
  *
5403
5652
  * Type=Company (452:792 / 452:1006): el avatar es un SLOT `pickCompany` —
5404
5653
  * el consumer pasa el logo real de la empresa. Acá se expone como
@@ -5431,7 +5680,8 @@ type SuiImageUploadProfileType = 'avatar' | 'company';
5431
5680
  * - subtitle: subtítulo (Paragraph/Small). Default hint de dimensiones.
5432
5681
  * - alignment: 'vertical' (texto + avatar 64) | 'horizontal' (avatar 56, sin texto).
5433
5682
  * - type: 'avatar' (silueta humana) | 'company' (silueta edificios).
5434
- * - uploadLabel / removeLabel / changeLabel: copy de los botones (i18n).
5683
+ * - labels: copy de los botones (i18n) — { upload?, remove?, change? },
5684
+ * defaults Subir / Eliminar / Cambiar.
5435
5685
  * - disabled: deshabilita los botones (no se puede interactuar).
5436
5686
  * - loading: estado de carga (botones deshabilitados mientras sube).
5437
5687
  *
@@ -5457,9 +5707,10 @@ declare class SuiImageUploadProfile implements ControlValueAccessor {
5457
5707
  readonly subtitle: _angular_core.InputSignal<string>;
5458
5708
  readonly alignment: _angular_core.InputSignal<SuiImageUploadProfileAlignment>;
5459
5709
  readonly type: _angular_core.InputSignal<SuiImageUploadProfileType>;
5460
- readonly uploadLabel: _angular_core.InputSignal<string>;
5461
- readonly removeLabel: _angular_core.InputSignal<string>;
5462
- readonly changeLabel: _angular_core.InputSignal<string>;
5710
+ /** Copy de los botones (i18n) — objeto parcial; lo no seteado cae al default. */
5711
+ readonly labels: _angular_core.InputSignal<SuiImageUploadProfileLabels>;
5712
+ /** Labels resueltas con los defaults en español (tuteo). */
5713
+ protected readonly labelsCfg: _angular_core.Signal<Required<SuiImageUploadProfileLabels>>;
5463
5714
  readonly disabled: _angular_core.InputSignal<boolean>;
5464
5715
  readonly loading: _angular_core.InputSignal<boolean>;
5465
5716
  readonly upload: _angular_core.OutputEmitterRef<void>;
@@ -5499,7 +5750,7 @@ declare class SuiImageUploadProfile implements ControlValueAccessor {
5499
5750
  registerOnTouched(fn: () => void): void;
5500
5751
  setDisabledState(isDisabled: boolean): void;
5501
5752
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiImageUploadProfile, never>;
5502
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiImageUploadProfile, "sui-image-upload-profile", never, { "imageUrl": { "alias": "imageUrl"; "required": false; "isSignal": true; }; "companyLogoSrc": { "alias": "companyLogoSrc"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "alignment": { "alias": "alignment"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "uploadLabel": { "alias": "uploadLabel"; "required": false; "isSignal": true; }; "removeLabel": { "alias": "removeLabel"; "required": false; "isSignal": true; }; "changeLabel": { "alias": "changeLabel"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; }, { "upload": "upload"; "remove": "remove"; "change": "change"; }, never, never, true, never>;
5753
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiImageUploadProfile, "sui-image-upload-profile", never, { "imageUrl": { "alias": "imageUrl"; "required": false; "isSignal": true; }; "companyLogoSrc": { "alias": "companyLogoSrc"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "alignment": { "alias": "alignment"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; }, { "upload": "upload"; "remove": "remove"; "change": "change"; }, never, never, true, never>;
5503
5754
  }
5504
5755
 
5505
5756
  type SuiImageUploadShape = 'circle' | 'rect';
@@ -6071,6 +6322,19 @@ declare class SuiInput implements ControlValueAccessor {
6071
6322
 
6072
6323
  type SuiIntegrationSwitchType = 'horizontal' | 'vertical';
6073
6324
  type SuiIntegrationSwitchAppearance = 'card' | 'list';
6325
+ /**
6326
+ * Config del manage button embebido. Un solo input `[manage]` reemplaza al
6327
+ * trío showManage/manageLabel/manageIcon (mismo patrón objeto que
6328
+ * `badge`/SuiBadgeConfig — canon sui-checkbox-label):
6329
+ * - `true` (default) → botón con defaults ('Manage' + settings-2-line)
6330
+ * - `'Configurar'` → string shorthand: label custom, icon default
6331
+ * - `{ label, icon }` → config completa
6332
+ * - `false` / `null` → sin botón
6333
+ */
6334
+ interface SuiIntegrationManageConfig {
6335
+ label?: string;
6336
+ icon?: string;
6337
+ }
6074
6338
  /**
6075
6339
  * SUI Integration Switch — SUI Design System 2.0
6076
6340
  *
@@ -6133,9 +6397,13 @@ type SuiIntegrationSwitchAppearance = 'card' | 'list';
6133
6397
  * description="Seamless collaboration and document management."
6134
6398
  * brandIconSrc="/assets/brand/microsoft.svg"
6135
6399
  * [(active)]="integrations.microsoft"
6136
- * [badge]="true"
6137
- * (manage)="openSettings('microsoft')"
6400
+ * badge="NEW"
6401
+ * (manageClick)="openSettings('microsoft')"
6138
6402
  * />
6403
+ *
6404
+ * <!-- Manage custom (config objeto) · sin manage -->
6405
+ * <sui-integration-switch title="..." [manage]="{ label: 'Configurar', icon: 'tools-line' }" />
6406
+ * <sui-integration-switch title="..." [manage]="false" />
6139
6407
  */
6140
6408
  declare class SuiIntegrationSwitch implements ControlValueAccessor {
6141
6409
  readonly type: _angular_core.InputSignal<SuiIntegrationSwitchType>;
@@ -6150,10 +6418,11 @@ declare class SuiIntegrationSwitch implements ControlValueAccessor {
6150
6418
  (label + color/variant/size, tipado como sui-badge). null = sin badge. */
6151
6419
  readonly badge: _angular_core.InputSignal<string | SuiBadgeConfig | null>;
6152
6420
  protected readonly badgeCfg: _angular_core.Signal<SuiBadgeConfig | null>;
6153
- /** Mostrar el manage button. Default true. */
6154
- readonly showManage: _angular_core.InputSignal<boolean>;
6155
- readonly manageLabel: _angular_core.InputSignal<string>;
6156
- readonly manageIcon: _angular_core.InputSignal<string>;
6421
+ /** Manage button — true = defaults ('Manage' + settings-2-line), string =
6422
+ label custom con icon default, SuiIntegrationManageConfig = todo,
6423
+ false/null = oculto. */
6424
+ readonly manage: _angular_core.InputSignal<string | boolean | SuiIntegrationManageConfig | null>;
6425
+ protected readonly manageCfg: _angular_core.Signal<Required<SuiIntegrationManageConfig> | null>;
6157
6426
  /** Mostrar el switch toggle. Default true. */
6158
6427
  readonly showToggle: _angular_core.InputSignal<boolean>;
6159
6428
  readonly disabled: _angular_core.InputSignal<boolean>;
@@ -6163,8 +6432,9 @@ declare class SuiIntegrationSwitch implements ControlValueAccessor {
6163
6432
  * two-way con `input + output` separados (input `active` + output `activeChange`). */
6164
6433
  readonly active: _angular_core.InputSignal<boolean>;
6165
6434
  readonly activeChange: _angular_core.OutputEmitterRef<boolean>;
6166
- /** Click en el manage button. */
6167
- readonly manage: _angular_core.OutputEmitterRef<MouseEvent>;
6435
+ /** Click en el manage button. (Nombrado como checkbox-label.linkClick —
6436
+ el nombre `manage` lo ocupa el input config del botón.) */
6437
+ readonly manageClick: _angular_core.OutputEmitterRef<MouseEvent>;
6168
6438
  private readonly _disabledByForm;
6169
6439
  readonly isDisabled: _angular_core.Signal<boolean>;
6170
6440
  /** CVA buffer — usado SOLO en form mode (formControlName/formControl). */
@@ -6183,7 +6453,7 @@ declare class SuiIntegrationSwitch implements ControlValueAccessor {
6183
6453
  registerOnTouched(fn: () => void): void;
6184
6454
  setDisabledState(isDisabled: boolean): void;
6185
6455
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiIntegrationSwitch, never>;
6186
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiIntegrationSwitch, "sui-integration-switch", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "brandIconSrc": { "alias": "brandIconSrc"; "required": false; "isSignal": true; }; "brandIcon": { "alias": "brandIcon"; "required": false; "isSignal": true; }; "badge": { "alias": "badge"; "required": false; "isSignal": true; }; "showManage": { "alias": "showManage"; "required": false; "isSignal": true; }; "manageLabel": { "alias": "manageLabel"; "required": false; "isSignal": true; }; "manageIcon": { "alias": "manageIcon"; "required": false; "isSignal": true; }; "showToggle": { "alias": "showToggle"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "active": { "alias": "active"; "required": false; "isSignal": true; }; }, { "activeChange": "activeChange"; "manage": "manage"; }, never, ["[sui-integration-brand]"], true, never>;
6456
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiIntegrationSwitch, "sui-integration-switch", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "brandIconSrc": { "alias": "brandIconSrc"; "required": false; "isSignal": true; }; "brandIcon": { "alias": "brandIcon"; "required": false; "isSignal": true; }; "badge": { "alias": "badge"; "required": false; "isSignal": true; }; "manage": { "alias": "manage"; "required": false; "isSignal": true; }; "showToggle": { "alias": "showToggle"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "active": { "alias": "active"; "required": false; "isSignal": true; }; }, { "activeChange": "activeChange"; "manageClick": "manageClick"; }, never, ["[sui-integration-brand]"], true, never>;
6187
6457
  }
6188
6458
 
6189
6459
  /**
@@ -6319,88 +6589,6 @@ declare class SuiKeyIcon {
6319
6589
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiKeyIcon, "sui-key-icon", never, { "name": { "alias": "name"; "required": true; "isSignal": true; }; "styleVariant": { "alias": "styleVariant"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
6320
6590
  }
6321
6591
 
6322
- type SuiLinkButtonVariant = 'gray' | 'black' | 'primary' | 'error' | 'modifiable';
6323
- type SuiLinkButtonSize = 'medium' | 'small';
6324
- /**
6325
- * SUI Link Button — SUI Design System 2.0
6326
- *
6327
- * Figma file: 8p1k72aKKvzJV4XcvPS4VO
6328
- * Frame: 168:4889 ("Link Buttons [1.1]") — 80 variants total
6329
- *
6330
- * EXACT (pulled from Figma + verified against sui-tokens.scss):
6331
- * Anatomy
6332
- * Container flex / inline-flex, gap=4px, items=center
6333
- * Medium size text 14/20/-0.6%, icons 20×20
6334
- * Small size text 12/16/0, icons 16×16
6335
- * Font features 'ss11' 1, 'calt' 0, 'liga' 0
6336
- * Underline (hover / focus / underline=on): línea continua SOLO
6337
- * bajo el texto (los iconos chevron NO van subrayados —
6338
- * Figma 169:1391/169:1419: la clase `underline` vive solo
6339
- * en el <p>). Implementado vía ::after en
6340
- * .sui-link-button__text (NO `text-decoration` sobre el
6341
- * flex, que se fragmentaba en 3 trazos icon|text|icon).
6342
- * Variant × State color matrix
6343
- * Gray Default → text/sub-600 | Hover → sub-600 + underline | Focus → strong-950 + underline | Disabled → disabled-300
6344
- * Black Default → text/strong-950 | Hover → strong-950 + underline
6345
- * Primary Default → primary-base | Hover → primary-dark + underline
6346
- * Error Default → state/error/base | Hover → red/700 + underline
6347
- * Modifiable → currentColor (consumer-controlled)
6348
- *
6349
- * Token map (Figma → sui-tokens.scss):
6350
- * text/sub-600 #5c5c5c → --sui-text-sub-600
6351
- * text/strong-950 #171717 → --sui-text-strong-950
6352
- * text/disabled-300 #d1d1d1 → --sui-text-disabled-300
6353
- * primary-base #335cff → --sui-primary-base (project remaps to orange #fa7319)
6354
- * primary-dark #2547d0 → --sui-primary-dark (project remaps to dark orange #e16614)
6355
- * state/error/base #fb3748 → --sui-state-error-base
6356
- * red/700 #d02533 → --sui-red-700
6357
- * icon/* same as text/* per token level
6358
- *
6359
- * FOCUS states PULLED from Figma (2026-05-29) — el Focus mantiene el color
6360
- * BASE + underline; solo el Hover oscurece. Nodos verificados:
6361
- * Gray focus 169:1034 → strong-950 + underline
6362
- * Black focus 169:1090 → strong-950 + underline
6363
- * Primary focus 169:1138 → primary-base (NO dark) + underline
6364
- * Error focus 169:1187 → error-base (NO red-700) + underline
6365
- * (Hover: Primary 169:1134 → primary-dark; Error 169:1183 → red-700)
6366
- *
6367
- * PENDING VERIFY (inferred, NOT pulled):
6368
- * - Modifiable Focus / Hover / Disabled: currentColor para hover/focus; disabled assumed --sui-text-disabled-300
6369
- * - Underline=On styling para todos: misma decoration spec que Gray (decoration solid, thickness/position from-font, skip-ink none)
6370
- * - Active state: no es variante Figma; tactile-press scale(0.97) por convención project
6371
- * - Figma usa font-feature 'cv09' 1 además de 'ss11' 1 'calt' 0 'liga' 0; SUI omite cv09 (alterna del 9) — diferencia tipográfica menor, no afecta layout
6372
- *
6373
- * Usage:
6374
- * <sui-link-button variant="primary" leftIcon="arrow-left-s-line">Volver</sui-link-button>
6375
- * <sui-link-button variant="error" [underline]="true" (click)="onDelete()">Eliminar</sui-link-button>
6376
- * <sui-link-button variant="primary" href="https://docs.example" target="_blank">Ver documentación</sui-link-button>
6377
- *
6378
- * Floating vs inline: el componente es `display: inline-flex` con baseline align,
6379
- * por lo que fluye dentro de un párrafo como un link normal. Para uso "flotante"
6380
- * (toast actions, notification CTA), el consumer lo posiciona libremente — el
6381
- * componente no impone position/z-index propios.
6382
- */
6383
- declare class SuiLinkButton {
6384
- readonly variant: _angular_core.InputSignal<SuiLinkButtonVariant>;
6385
- readonly size: _angular_core.InputSignal<SuiLinkButtonSize>;
6386
- readonly underline: _angular_core.InputSignal<boolean>;
6387
- readonly disabled: _angular_core.InputSignal<boolean>;
6388
- readonly leftIcon: _angular_core.InputSignal<string | null>;
6389
- readonly rightIcon: _angular_core.InputSignal<string | null>;
6390
- /** Cuando se setea, el componente renderiza un <a> nativo en vez de <button>. */
6391
- readonly href: _angular_core.InputSignal<string | null>;
6392
- readonly target: _angular_core.InputSignal<string | null>;
6393
- readonly rel: _angular_core.InputSignal<string | null>;
6394
- readonly type: _angular_core.InputSignal<"button" | "submit" | "reset">;
6395
- readonly ariaLabel: _angular_core.InputSignal<string | null>;
6396
- readonly clicked: _angular_core.OutputEmitterRef<MouseEvent>;
6397
- readonly iconSize: _angular_core.Signal<number>;
6398
- readonly isAnchor: _angular_core.Signal<boolean>;
6399
- onClick(event: MouseEvent): void;
6400
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiLinkButton, never>;
6401
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiLinkButton, "sui-link-button", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "underline": { "alias": "underline"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "leftIcon": { "alias": "leftIcon"; "required": false; "isSignal": true; }; "rightIcon": { "alias": "rightIcon"; "required": false; "isSignal": true; }; "href": { "alias": "href"; "required": false; "isSignal": true; }; "target": { "alias": "target"; "required": false; "isSignal": true; }; "rel": { "alias": "rel"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "clicked": "clicked"; }, never, ["*", "*"], true, never>;
6402
- }
6403
-
6404
6592
  /**
6405
6593
  * SUI Modal Sheet — bottom sheet con breakpoints (estilo Apple Maps / Ionic ion-modal sheet).
6406
6594
  *
@@ -6629,7 +6817,7 @@ type SuiModalStatusAlignment = 'horizontal' | 'vertical';
6629
6817
  * @input closeOnEscape — boolean — close on Escape key (default: true)
6630
6818
  * @input showClose — boolean — show X button (default: true)
6631
6819
  * @input iconVariant — SuiModalIconVariant | null — circular icon in header
6632
- * @input statusAlignment — 'horizontal' | 'vertical' — layout del icono+texto.
6820
+ * @input statusAlignment — 'horizontal' | 'vertical' | null — anatomía Status Modal (480:1372); null = header normal.
6633
6821
  * 'vertical' = patrón Status Modal de Figma (default: 'horizontal')
6634
6822
  * @input backdropBlur — boolean — blur(10px) del fondo. default true (look
6635
6823
  * glass del proyecto); opt-out con [backdropBlur]="false"
@@ -6657,11 +6845,11 @@ declare class SuiModal implements AfterViewInit, OnDestroy {
6657
6845
  contenedor circular bg `neutral-lighter` + color `sub-600`. Si NO se
6658
6846
  pasa y hay `iconVariant`, fallback al variant semántico. */
6659
6847
  readonly headerIcon: _angular_core.InputSignal<string | null>;
6660
- /** Layout del header con icono. `vertical` = patrón Status Modal de Figma
6661
- (node 480:1372): icono centrado arriba, texto centrado en columna,
6662
- tipografía escalada. Requiere `iconVariant` o `headerIcon` para tener
6663
- efecto visible. */
6664
- readonly statusAlignment: _angular_core.InputSignal<SuiModalStatusAlignment>;
6848
+ /** Anatomía Status Modal de Figma (set 480:1372) — null (default) = header
6849
+ normal (Modal Header 466:4778). `horizontal`: tile cuadrado + texto en
6850
+ fila dentro del body (480:1366). `vertical`: icono centrado arriba +
6851
+ texto centrado en columna. Requiere `iconVariant` o `headerIcon`. */
6852
+ readonly statusAlignment: _angular_core.InputSignal<SuiModalStatusAlignment | null>;
6665
6853
  /** Aplica `backdrop-filter: blur(10px)` al overlay. Por defecto `true` —
6666
6854
  extra-feature "glass" del proyecto encima del overlay-gray plano del DS
6667
6855
  (rgba(51,51,51,0.24)). Pasar `[backdropBlur]="false"` lo quita y deja el
@@ -6730,14 +6918,12 @@ declare class SuiModal implements AfterViewInit, OnDestroy {
6730
6918
  /** data-variant del círculo: si hay variant semántico lo usa; si solo hay
6731
6919
  * headerIcon custom, retorna 'neutral'. */
6732
6920
  protected readonly resolvedIconVariant: _angular_core.Signal<string>;
6733
- /** True cuando el modal está en modo Status vertical Y hay un icono que
6734
- * mostrar. En este modo el icono+texto se renderizan centrados en el body,
6735
- * no en el header horizontal. */
6921
+ /** Modo Status Modal activo (statusAlignment seteado + icono presente):
6922
+ * el icono+texto se renderizan en el body con la anatomía 480:1372 y el
6923
+ * header queda solo con el close flotante. */
6924
+ readonly isStatus: _angular_core.Signal<boolean>;
6736
6925
  readonly isStatusVertical: _angular_core.Signal<boolean>;
6737
- /** True cuando el header con icono debe renderizar el icono "flat" (24px sin
6738
- * círculo): patrón Figma "Modal Header / Small" (size sin description). Solo
6739
- * aplica en modo horizontal con icono y SIN description. */
6740
- readonly isCompactHeader: _angular_core.Signal<boolean>;
6926
+ readonly isStatusHorizontal: _angular_core.Signal<boolean>;
6741
6927
  private _previousFocus;
6742
6928
  private _escapeHandler?;
6743
6929
  ngAfterViewInit(): void;
@@ -6756,6 +6942,111 @@ declare class SuiModal implements AfterViewInit, OnDestroy {
6756
6942
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiModal, "sui-modal", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "closeOnBackdrop": { "alias": "closeOnBackdrop"; "required": false; "isSignal": true; }; "closeOnEscape": { "alias": "closeOnEscape"; "required": false; "isSignal": true; }; "showClose": { "alias": "showClose"; "required": false; "isSignal": true; }; "iconVariant": { "alias": "iconVariant"; "required": false; "isSignal": true; }; "headerIcon": { "alias": "headerIcon"; "required": false; "isSignal": true; }; "statusAlignment": { "alias": "statusAlignment"; "required": false; "isSignal": true; }; "backdropBlur": { "alias": "backdropBlur"; "required": false; "isSignal": true; }; "fullscreen": { "alias": "fullscreen"; "required": false; "isSignal": true; }; "fullBody": { "alias": "fullBody"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "closed": "closed"; }, never, ["*", "[slot=footer]"], true, never>;
6757
6943
  }
6758
6944
 
6945
+ /** Variantes semánticas del icono de status (mismo union que sui-modal). */
6946
+ type SuiModalHeaderVariant = 'info' | 'success' | 'warning' | 'error';
6947
+ /**
6948
+ * SUI Modal Header — SUI Design System 2.0
6949
+ *
6950
+ * Figma file: 8p1k72aKKvzJV4XcvPS4VO
6951
+ * Component set: 466:4778 ("Modal Header [1.1]") — 6 Types × 2 Sizes
6952
+ * Types: Basic · Left Icon · Error · Warning · Success · Information
6953
+ * Sizes: Medium (min-height 80, title + description) ·
6954
+ * Small (min-height 56, título; icono FLAT 24 sin círculo)
6955
+ *
6956
+ * Es la ÚNICA fuente de verdad de la anatomía del header de modal: sui-modal
6957
+ * lo renderiza internamente y también se usa standalone para componer paneles
6958
+ * custom (par de sui-modal-footer).
6959
+ *
6960
+ * EXACT (Figma 466:4777 medium / 472:298 small — homologado con sui-modal):
6961
+ * Container flex align-center · padding 16px 56px 16px 20px (pr 56 reserva
6962
+ * el close absolute) · border-bottom stroke-soft-200 · bg white-0
6963
+ * · min-height 80 (small: 56) · gap 16 (small: 12; con icono: 14
6964
+ * en ambos sizes — cascade fix nodo "with-icon")
6965
+ * Title Label/Small (14/500/20/−0.006em), strong-950
6966
+ * Description Paragraph/X-Small (12/400/16), sub-600, margen-top 4
6967
+ * Status icon medium: círculo padding-10 radius-full state lighter/base,
6968
+ * icono 20 · small: flat 24 sin círculo (Figma "Small")
6969
+ * Close sui-compact-button ghost large, absolute top 16 right 16
6970
+ *
6971
+ * Tipos: `iconVariant` (semántico) o `icon` (custom, type Left Icon, círculo
6972
+ * neutral — prioridad). Ambos null → Basic.
6973
+ * `titleId`/`descriptionId` opcionales: ids para aria-labelledby/describedby
6974
+ * del dialog contenedor (los usa sui-modal).
6975
+ *
6976
+ * Usage:
6977
+ * <sui-modal-header title="Editar producto" description="Cambios en vivo."
6978
+ * iconVariant="info" (closed)="cerrar()" />
6979
+ * <sui-modal-header size="small" title="Filtros" (closed)="cerrar()" />
6980
+ */
6981
+ declare class SuiModalHeader {
6982
+ /** Título del header (Label/Small). */
6983
+ readonly title: _angular_core.InputSignal<string>;
6984
+ /** Descripción bajo el título (Paragraph/X-Small). */
6985
+ readonly description: _angular_core.InputSignal<string | null>;
6986
+ /** medium (80): título + descripción · small (56): título; icono flat 24. */
6987
+ readonly size: _angular_core.InputSignal<"small" | "medium">;
6988
+ /** Icono semántico de status (círculo state lighter/base en medium). */
6989
+ readonly iconVariant: _angular_core.InputSignal<SuiModalHeaderVariant | null>;
6990
+ /** Icono custom (type "Left Icon" de Figma). Prioridad sobre iconVariant. */
6991
+ readonly icon: _angular_core.InputSignal<string | null>;
6992
+ /** Muestra el botón de cerrar (default true). */
6993
+ readonly showClose: _angular_core.InputSignal<boolean>;
6994
+ /** id del h2 del título — para aria-labelledby del dialog contenedor. */
6995
+ readonly titleId: _angular_core.InputSignal<string | null>;
6996
+ /** id del p de la descripción — para aria-describedby del dialog contenedor. */
6997
+ readonly descriptionId: _angular_core.InputSignal<string | null>;
6998
+ /** Click en el botón de cerrar. */
6999
+ readonly closed: _angular_core.OutputEmitterRef<void>;
7000
+ protected readonly iconName: _angular_core.Signal<string | null>;
7001
+ /** Variant efectivo para el data-attr del círculo (custom icon = neutral). */
7002
+ protected readonly resolvedVariant: _angular_core.Signal<string | null>;
7003
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiModalHeader, never>;
7004
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiModalHeader, "sui-modal-header", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "iconVariant": { "alias": "iconVariant"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "showClose": { "alias": "showClose"; "required": false; "isSignal": true; }; "titleId": { "alias": "titleId"; "required": false; "isSignal": true; }; "descriptionId": { "alias": "descriptionId"; "required": false; "isSignal": true; }; }, { "closed": "closed"; }, never, never, true, never>;
7005
+ }
7006
+
7007
+ /**
7008
+ * SUI Modal Footer — SUI Design System 2.0
7009
+ *
7010
+ * Figma file: 8p1k72aKKvzJV4XcvPS4VO
7011
+ * Component set: 472:566 ("Modal Footer [1.1]") — 7 Types:
7012
+ * Basic · Checkbox · Information · Toggle · Stepper · Link Button · Stretch
7013
+ *
7014
+ * Componente STANDALONE para componer modales/paneles custom (par del
7015
+ * sui-modal-header). Diseño componible en vez de 7 types hardcodeados:
7016
+ * - Los botones (derecha) via `primaryButton`/`secondaryButton` con la
7017
+ * interfaz COMPARTIDA SuiFooterButtonConfig (string shorthand = label).
7018
+ * - El slot izquierdo (los "types" de Figma) via <ng-content>: proyecta
7019
+ * ahí un <sui-checkbox-label>, <sui-switch-label>, <sui-link-button>,
7020
+ * texto informativo o el stepper — las stories muestran cada uno.
7021
+ * - `stretch` (type Stretch): los botones ocupan todo el ancho 50/50.
7022
+ *
7023
+ * EXACT (Figma 472:567): container bg white-0 + border-top soft-200,
7024
+ * padding 16px 20px · actions a la derecha gap-12 · botones size small.
7025
+ *
7026
+ * Usage:
7027
+ * <sui-modal-footer primaryButton="Continuar" secondaryButton="Cancelar"
7028
+ * (primaryClick)="save()" (secondaryClick)="close()" />
7029
+ *
7030
+ * <sui-modal-footer [primaryButton]="{ label: 'Eliminar', disabled: !ok }">
7031
+ * <sui-checkbox-label label="No volver a preguntar" [(active)]="skip" />
7032
+ * </sui-modal-footer>
7033
+ */
7034
+ declare class SuiModalFooter {
7035
+ /** Botón primario (derecha) — string shorthand o { label, disabled? }. */
7036
+ readonly primaryButton: _angular_core.InputSignal<string | SuiFooterButtonConfig | null>;
7037
+ /** Botón secundario (izquierda del primario) — string o config. */
7038
+ readonly secondaryButton: _angular_core.InputSignal<string | SuiFooterButtonConfig | null>;
7039
+ /** Type Stretch de Figma: los botones ocupan todo el ancho (50/50). */
7040
+ readonly stretch: _angular_core.InputSignal<boolean>;
7041
+ readonly primaryClick: _angular_core.OutputEmitterRef<void>;
7042
+ readonly secondaryClick: _angular_core.OutputEmitterRef<void>;
7043
+ private cfg;
7044
+ protected readonly primaryCfg: _angular_core.Signal<SuiFooterButtonConfig | null>;
7045
+ protected readonly secondaryCfg: _angular_core.Signal<SuiFooterButtonConfig | null>;
7046
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiModalFooter, never>;
7047
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiModalFooter, "sui-modal-footer", never, { "primaryButton": { "alias": "primaryButton"; "required": false; "isSignal": true; }; "secondaryButton": { "alias": "secondaryButton"; "required": false; "isSignal": true; }; "stretch": { "alias": "stretch"; "required": false; "isSignal": true; }; }, { "primaryClick": "primaryClick"; "secondaryClick": "secondaryClick"; }, never, ["*"], true, never>;
7048
+ }
7049
+
6759
7050
  /**
6760
7051
  * SUI Notification Footer — SUI Design System 2.0
6761
7052
  *
@@ -6793,12 +7084,17 @@ declare class SuiModal implements AfterViewInit, OnDestroy {
6793
7084
  * API:
6794
7085
  * - usePrefix: string ('Use') — texto antes de las teclas
6795
7086
  * - useSuffix: string ('to navigate') — texto después de las teclas
6796
- * - manageLabel: string ('Manage Notification')
6797
- * - showManage: boolean (true) — toggle del link (Figma prop `button`)
7087
+ * - manage: SuiLinkConfig | string | boolean | null (true) — link de gestión
7088
+ * (Figma prop `button`): true = label default 'Manage Notification';
7089
+ * string = label custom; SuiLinkConfig { label, href?, target?, rel? }
7090
+ * = <a> real con rel automático 'noopener noreferrer' si
7091
+ * target='_blank'; false/null = oculto.
7092
+ * (Patrón canon `link` de sui-checkbox-label.)
6798
7093
  * - (manageClick): output<MouseEvent> — click en "Manage Notification"
6799
7094
  *
6800
7095
  * Uso:
6801
7096
  * <sui-notification-footer (manageClick)="abrirAjustes()" />
7097
+ * <sui-notification-footer [manage]="{ label: 'Ajustes', href: '/ajustes' }" />
6802
7098
  *
6803
7099
  * PENDING VERIFY:
6804
7100
  * - El frame Figma es 540px fijo; acá el host es width 100% para encajar en el
@@ -6807,13 +7103,21 @@ declare class SuiModal implements AfterViewInit, OnDestroy {
6807
7103
  * que existe en RemixIcon; si el panel real usa otro glyph, ajustar el name.
6808
7104
  */
6809
7105
  declare class SuiNotificationFooter {
7106
+ /** Label default del link de gestión (Figma "Manage Notification"). */
7107
+ private static readonly DEFAULT_MANAGE_LABEL;
6810
7108
  readonly usePrefix: _angular_core.InputSignal<string>;
6811
7109
  readonly useSuffix: _angular_core.InputSignal<string>;
6812
- readonly manageLabel: _angular_core.InputSignal<string>;
6813
- readonly showManage: _angular_core.InputSignal<boolean>;
7110
+ /** Link de gestión — true = label default ('Manage Notification'); string =
7111
+ * label custom (emite `manageClick`); SuiLinkConfig { label, href?, target?,
7112
+ * rel? }: con href renderiza <a> real, rel automático 'noopener noreferrer'
7113
+ * para _blank. false/null = oculto (Figma prop `button` off). */
7114
+ readonly manage: _angular_core.InputSignal<string | boolean | SuiLinkConfig | null>;
7115
+ /** Config resuelta del link (true → label default, string → { label },
7116
+ * rel automático). null cuando el link está oculto. */
7117
+ protected readonly manageCfg: _angular_core.Signal<SuiLinkConfig | null>;
6814
7118
  readonly manageClick: _angular_core.OutputEmitterRef<MouseEvent>;
6815
7119
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiNotificationFooter, never>;
6816
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiNotificationFooter, "sui-notification-footer", never, { "usePrefix": { "alias": "usePrefix"; "required": false; "isSignal": true; }; "useSuffix": { "alias": "useSuffix"; "required": false; "isSignal": true; }; "manageLabel": { "alias": "manageLabel"; "required": false; "isSignal": true; }; "showManage": { "alias": "showManage"; "required": false; "isSignal": true; }; }, { "manageClick": "manageClick"; }, never, never, true, never>;
7120
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiNotificationFooter, "sui-notification-footer", never, { "usePrefix": { "alias": "usePrefix"; "required": false; "isSignal": true; }; "useSuffix": { "alias": "useSuffix"; "required": false; "isSignal": true; }; "manage": { "alias": "manage"; "required": false; "isSignal": true; }; }, { "manageClick": "manageClick"; }, never, never, true, never>;
6817
7121
  }
6818
7122
 
6819
7123
  /**
@@ -6984,7 +7288,8 @@ type SuiNotificationStyle = 'filled' | 'light' | 'lighter' | 'stroke';
6984
7288
  * Extra features preservadas (no Figma, producto):
6985
7289
  * - status variant×style (alert inline)
6986
7290
  * - unread dot (8px primary-base — Figma node 4308:731)
6987
- * - avatarInitials fallback
7291
+ * - avatar config `{ src?, initials? }` (string shorthand = src) con
7292
+ * fallback a initials
6988
7293
  * - dismissible (X close)
6989
7294
  * - showIcon/iconName status icons
6990
7295
  */
@@ -6994,13 +7299,18 @@ declare class SuiNotification {
6994
7299
  readonly title: _angular_core.InputSignal<string | null>;
6995
7300
  readonly description: _angular_core.InputSignal<string | null>;
6996
7301
  readonly timestamp: _angular_core.InputSignal<string | null>;
6997
- readonly avatarSrc: _angular_core.InputSignal<string | null>;
6998
- readonly avatarInitials: _angular_core.InputSignal<string | null>;
7302
+ /** Avatar del item de panel — string shorthand (URL = src directo) o
7303
+ * SuiAvatarConfig { src?, initials? } (mismo patrón objeto que
7304
+ * `badge`/`link` de sui-checkbox-label). null = sin avatar (modelo
7305
+ * status inline). Su presencia activa el modelo item de panel. */
7306
+ readonly avatar: _angular_core.InputSignal<string | SuiAvatarConfig | null>;
7307
+ /** Config resuelta del avatar (string → { src }). */
7308
+ protected readonly avatarCfg: _angular_core.Signal<SuiAvatarConfig | null>;
6999
7309
  readonly showIcon: _angular_core.InputSignal<boolean>;
7000
7310
  readonly dismissible: _angular_core.InputSignal<boolean>;
7001
7311
  readonly unread: _angular_core.InputSignal<boolean>;
7002
7312
  /** Item body type. 'basic' keeps the legacy/alert layout (no body slot). */
7003
- readonly type: _angular_core.InputSignal<"file" | "button" | "basic" | "message">;
7313
+ readonly type: _angular_core.InputSignal<"basic" | "file" | "button" | "message">;
7004
7314
  /** When true, item paints the Figma hover bg + reveals the more-2-line button. */
7005
7315
  readonly showMore: _angular_core.InputSignal<boolean>;
7006
7316
  /** Forces the hover affordance visible (e.g. keyboard-focused row). */
@@ -7029,7 +7339,7 @@ declare class SuiNotification {
7029
7339
  onDismiss(): void;
7030
7340
  onMore(event: MouseEvent): void;
7031
7341
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiNotification, never>;
7032
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiNotification, "sui-notification", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "variantStyle": { "alias": "variantStyle"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "timestamp": { "alias": "timestamp"; "required": false; "isSignal": true; }; "avatarSrc": { "alias": "avatarSrc"; "required": false; "isSignal": true; }; "avatarInitials": { "alias": "avatarInitials"; "required": false; "isSignal": true; }; "showIcon": { "alias": "showIcon"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; "unread": { "alias": "unread"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "showMore": { "alias": "showMore"; "required": false; "isSignal": true; }; "active": { "alias": "active"; "required": false; "isSignal": true; }; }, { "dismissed": "dismissed"; "moreClicked": "moreClicked"; }, never, ["[slot=company-logo]", "[slot=file]", "[slot=message]", "*", "[slot=actions]"], true, never>;
7342
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiNotification, "sui-notification", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "variantStyle": { "alias": "variantStyle"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "timestamp": { "alias": "timestamp"; "required": false; "isSignal": true; }; "avatar": { "alias": "avatar"; "required": false; "isSignal": true; }; "showIcon": { "alias": "showIcon"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; "unread": { "alias": "unread"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "showMore": { "alias": "showMore"; "required": false; "isSignal": true; }; "active": { "alias": "active"; "required": false; "isSignal": true; }; }, { "dismissed": "dismissed"; "moreClicked": "moreClicked"; }, never, ["[slot=company-logo]", "[slot=file]", "[slot=message]", "*", "[slot=actions]"], true, never>;
7033
7343
  }
7034
7344
 
7035
7345
  type SuiOtpInputType = 'number' | 'text';
@@ -7327,10 +7637,12 @@ declare class SuiPopover {
7327
7637
  readonly nextLabel: _angular_core.InputSignal<string>;
7328
7638
  /** Renderear el botón secundario (Back). Si false, solo se muestra el primario. */
7329
7639
  readonly doubleButton: _angular_core.InputSignal<boolean>;
7330
- /** Paso actual (1-based) — usado en text-stepper y stepper. */
7331
- readonly currentStep: _angular_core.InputSignal<number>;
7332
- /** Total de pasos — usado en text-stepper y stepper. */
7333
- readonly totalSteps: _angular_core.InputSignal<number>;
7640
+ /** Progreso del stepper — { current (1-based), total }. Usado en text-stepper
7641
+ * y stepper. null cae al default del sample de Figma ({ current: 1, total: 4 }). */
7642
+ readonly step: _angular_core.InputSignal<{
7643
+ current: number;
7644
+ total: number;
7645
+ } | null>;
7334
7646
  /** Click en el botón X de dismiss. */
7335
7647
  readonly dismissed: _angular_core.OutputEmitterRef<void>;
7336
7648
  /** Click en el botón secundario (Back). */
@@ -7347,12 +7659,14 @@ declare class SuiPopover {
7347
7659
  readonly isTextStepper: _angular_core.Signal<boolean>;
7348
7660
  /** True para footer con dot indicator. */
7349
7661
  readonly isDotStepper: _angular_core.Signal<boolean>;
7662
+ /** Config resuelta del step (null → default { current: 1, total: 4 }). */
7663
+ private readonly stepCfg;
7350
7664
  /** Texto "Step X of N" del text-stepper. */
7351
7665
  readonly stepperText: _angular_core.Signal<string>;
7352
7666
  /** Array de dots para el stepper. Cada item: índice activo => primary. */
7353
7667
  readonly dots: _angular_core.Signal<boolean[]>;
7354
7668
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiPopover, never>;
7355
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiPopover, "sui-popover", never, { "position": { "alias": "position"; "required": false; "isSignal": true; }; "tail": { "alias": "tail"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "dismissIcon": { "alias": "dismissIcon"; "required": false; "isSignal": true; }; "footer": { "alias": "footer"; "required": false; "isSignal": true; }; "backLabel": { "alias": "backLabel"; "required": false; "isSignal": true; }; "nextLabel": { "alias": "nextLabel"; "required": false; "isSignal": true; }; "doubleButton": { "alias": "doubleButton"; "required": false; "isSignal": true; }; "currentStep": { "alias": "currentStep"; "required": false; "isSignal": true; }; "totalSteps": { "alias": "totalSteps"; "required": false; "isSignal": true; }; }, { "dismissed": "dismissed"; "back": "back"; "next": "next"; }, never, ["[data-slot=body]"], true, never>;
7669
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiPopover, "sui-popover", never, { "position": { "alias": "position"; "required": false; "isSignal": true; }; "tail": { "alias": "tail"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "dismissIcon": { "alias": "dismissIcon"; "required": false; "isSignal": true; }; "footer": { "alias": "footer"; "required": false; "isSignal": true; }; "backLabel": { "alias": "backLabel"; "required": false; "isSignal": true; }; "nextLabel": { "alias": "nextLabel"; "required": false; "isSignal": true; }; "doubleButton": { "alias": "doubleButton"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; }, { "dismissed": "dismissed"; "back": "back"; "next": "next"; }, never, ["[data-slot=body]"], true, never>;
7356
7670
  }
7357
7671
 
7358
7672
  type SuiProgressBarColor = 'blue' | 'green' | 'orange' | 'red' | 'purple';
@@ -7452,8 +7766,9 @@ type SuiProgressBarLabelType = 'on-top' | 'on-right';
7452
7766
  * pending-verify): el primary de este proyecto nunca será azul.
7453
7767
  *
7454
7768
  * Decisiones (responde openQuestions del audit):
7455
- * - #2: el texto del link NO es hardcoded "Upgrade" → input `linkLabel`
7456
- * (default 'Upgrade'). La acción se expone vía output `linkClick`.
7769
+ * - #2: el texto del link NO es hardcoded "Upgrade" → input `link`
7770
+ * (string shorthand o SuiLinkConfig; default 'Upgrade'). La acción se
7771
+ * expone vía output `linkClick`; con `href` el <a> además navega.
7457
7772
  * - #3: es componente SUI nuevo (`sui-progress-bar-label`) que COMPONE
7458
7773
  * `sui-progress-bar` internamente (no proyección de contenido), para
7459
7774
  * mantener la barra como única fuente de verdad del fill.
@@ -7470,14 +7785,17 @@ type SuiProgressBarLabelType = 'on-top' | 'on-right';
7470
7785
  * - value: number 0–100 (delegado a sui-progress-bar).
7471
7786
  * - type: 'on-top' (default) | 'on-right'.
7472
7787
  * - title: string — título (sólo on-top). Se espera no-vacío en
7473
- * on-top (la fila head se omite si title='' y showPercentage
7788
+ * on-top (la fila head se omite si title='' y percentage
7474
7789
  * es false, para no dejar una fila invisible ocupando alto).
7475
- * - showPercentage: boolean (default true) — muestra el % textual.
7476
- * - percentageText: string opcional — override del texto del % (default `${value}%`).
7790
+ * - percentage: boolean | string (default true) — true muestra `${value}%`,
7791
+ * string lo reemplaza por un texto custom, false lo oculta.
7477
7792
  * - showBottom: boolean (default false) — fila inferior link+descripción (sólo on-top).
7478
7793
  * - description: string — texto descriptivo (fila inferior).
7479
- * - showLink: boolean (default false) — muestra el link.
7480
- * - linkLabel: string (default 'Upgrade') — texto del link.
7794
+ * - link: SuiLinkConfig | string | null (default null = sin link) —
7795
+ * string = solo label (el <a> no navega, emite linkClick);
7796
+ * objeto { label, href?, target?, rel? } = <a> con navegación
7797
+ * real; rel automático 'noopener noreferrer' si target='_blank'.
7798
+ * Presente = visible (contrato config del DS, sin flag show).
7481
7799
  * - color / size: delegados a sui-progress-bar.
7482
7800
  * - ariaLabel: delegado a sui-progress-bar.
7483
7801
  *
@@ -7488,22 +7806,30 @@ declare class SuiProgressBarLabel {
7488
7806
  readonly value: _angular_core.InputSignal<number>;
7489
7807
  readonly type: _angular_core.InputSignal<SuiProgressBarLabelType>;
7490
7808
  readonly title: _angular_core.InputSignal<string>;
7491
- readonly showPercentage: _angular_core.InputSignal<boolean>;
7492
- readonly percentageText: _angular_core.InputSignal<string | null>;
7809
+ /** % textual — true = `${value}%` automático · string = texto custom · false = oculto. */
7810
+ readonly percentage: _angular_core.InputSignal<string | boolean>;
7493
7811
  readonly showBottom: _angular_core.InputSignal<boolean>;
7494
7812
  readonly description: _angular_core.InputSignal<string>;
7495
- readonly showLink: _angular_core.InputSignal<boolean>;
7496
- readonly linkLabel: _angular_core.InputSignal<string>;
7813
+ /** Link de la fila inferior — string shorthand (solo label, el <a> no navega
7814
+ * y emite `linkClick`) o SuiLinkConfig { label, href?, target?, rel? }: con
7815
+ * `href` el <a> navega de verdad; rel automático 'noopener noreferrer' para
7816
+ * target='_blank'. Presente = visible; null (default) = sin link.
7817
+ * (Mismo patrón objeto que sui-checkbox-label.link / SuiBadgeConfig.) */
7818
+ readonly link: _angular_core.InputSignal<string | SuiLinkConfig | null>;
7497
7819
  readonly color: _angular_core.InputSignal<SuiProgressBarColor>;
7498
7820
  readonly size: _angular_core.InputSignal<SuiProgressBarSize>;
7499
7821
  readonly ariaLabel: _angular_core.InputSignal<string | null>;
7500
7822
  readonly linkClick: _angular_core.OutputEmitterRef<void>;
7823
+ /** Config resuelta del link (string → { label }, rel automático). */
7824
+ protected readonly linkCfg: _angular_core.Signal<SuiLinkConfig | null>;
7501
7825
  readonly clampedValue: _angular_core.Signal<number>;
7502
7826
  /** Texto del % mostrado: override explícito o `${value}%`. */
7827
+ /** Mostrar el bloque de % (percentage !== false). */
7828
+ readonly showPercent: _angular_core.Signal<boolean>;
7503
7829
  readonly percentLabel: _angular_core.Signal<string>;
7504
7830
  onLinkClick(event: Event): void;
7505
7831
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiProgressBarLabel, never>;
7506
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiProgressBarLabel, "sui-progress-bar-label", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "showPercentage": { "alias": "showPercentage"; "required": false; "isSignal": true; }; "percentageText": { "alias": "percentageText"; "required": false; "isSignal": true; }; "showBottom": { "alias": "showBottom"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "showLink": { "alias": "showLink"; "required": false; "isSignal": true; }; "linkLabel": { "alias": "linkLabel"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "linkClick": "linkClick"; }, never, never, true, never>;
7832
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiProgressBarLabel, "sui-progress-bar-label", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "percentage": { "alias": "percentage"; "required": false; "isSignal": true; }; "showBottom": { "alias": "showBottom"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "link": { "alias": "link"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "linkClick": "linkClick"; }, never, never, true, never>;
7507
7833
  }
7508
7834
 
7509
7835
  type SuiRadioValue = string | number | null;
@@ -7552,7 +7878,7 @@ declare class SuiRadio {
7552
7878
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiRadio, "sui-radio", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "standaloneChecked": { "alias": "standaloneChecked"; "required": false; "isSignal": true; }; }, { "standaloneChecked": "standaloneCheckedChange"; }, never, never, true, never>;
7553
7879
  }
7554
7880
 
7555
- type SuiRadioCardType = 'basic' | 'left-icon' | 'avatar';
7881
+ type SuiRadioCardType = 'basic' | 'left-icon' | 'avatar' | 'card-provider' | 'brand' | 'company';
7556
7882
  /**
7557
7883
  * SUI Radio Card — SUI Design System 2.0
7558
7884
  *
@@ -7671,7 +7997,7 @@ declare class SuiRadioCard implements ControlValueAccessor {
7671
7997
  * Emoji del catálogo SUI_EMOJI_MAP — alternativa a icon para type='left-icon'.
7672
7998
  * Si ambos están, icon tiene precedencia.
7673
7999
  */
7674
- readonly emoji: _angular_core.InputSignal<"warning" | "label" | "thinking-face" | "grinning-face" | "smiling-face-hearts" | "face-with-rolling-eyes" | "face-screaming" | "partying-face" | "star-struck" | "sleeping-face" | "pensive-face" | "confused-face" | "neutral-face" | "slightly-smiling-face" | "grinning-face-smiling-eyes" | "package" | "receipt" | "money-bag" | "money-with-wings" | "shopping-cart" | "shopping-bags" | "card-index-dividers" | "bell" | "bell-with-slash" | "pushpin" | "mobile-phone" | "gear" | "locked" | "unlocked" | "wrench" | "hammer" | "magnifying-glass-tilted-left" | "spiral-calendar" | "bar-chart" | "delivery-truck" | "motorcycle" | "rocket" | "house" | "office-building" | "shop" | "dollar-banknote" | "glowing-star" | "kick-scooter" | "check-mark" | "check-mark-button" | "cross-mark" | "no-entry" | "sparkles" | "party-popper" | "waving-hand" | "thumbs-up" | "clapping-hands" | "handshake" | "busts-in-silhouette" | "pizza" | "hamburger" | "taco" | "birthday-cake" | null>;
8000
+ readonly emoji: _angular_core.InputSignal<"label" | "warning" | "thinking-face" | "grinning-face" | "smiling-face-hearts" | "face-with-rolling-eyes" | "face-screaming" | "partying-face" | "star-struck" | "sleeping-face" | "pensive-face" | "confused-face" | "neutral-face" | "slightly-smiling-face" | "grinning-face-smiling-eyes" | "package" | "receipt" | "money-bag" | "money-with-wings" | "shopping-cart" | "shopping-bags" | "card-index-dividers" | "bell" | "bell-with-slash" | "pushpin" | "mobile-phone" | "gear" | "locked" | "unlocked" | "wrench" | "hammer" | "magnifying-glass-tilted-left" | "spiral-calendar" | "bar-chart" | "delivery-truck" | "motorcycle" | "rocket" | "house" | "office-building" | "shop" | "dollar-banknote" | "glowing-star" | "kick-scooter" | "check-mark" | "check-mark-button" | "cross-mark" | "no-entry" | "sparkles" | "party-popper" | "waving-hand" | "thumbs-up" | "clapping-hands" | "handshake" | "busts-in-silhouette" | "pizza" | "hamburger" | "taco" | "birthday-cake" | null>;
7675
8001
  /**
7676
8002
  * URL directa al emoji para type='left-icon'. Útil cuando el consumer ya tiene
7677
8003
  * la URL (ej. FLUENT_EMOJI map del proyecto) y no quiere registrar el emoji
@@ -7684,6 +8010,9 @@ declare class SuiRadioCard implements ControlValueAccessor {
7684
8010
  * label. Para los otros types se ignora.
7685
8011
  */
7686
8012
  readonly imageUrl: _angular_core.InputSignal<string | null>;
8013
+ /** Company del sui-brand-logo para type='brand' (Figma 515:4383 — logo 40px).
8014
+ Para logos fuera del catálogo, usar `imageUrl` (fallback circular). */
8015
+ readonly brand: _angular_core.InputSignal<"adobe" | "amazon" | "apple" | "bitcoin" | "discord" | "dropbox" | "facebook" | "figma" | "framer" | "github" | "google" | "instagram" | "linkedin" | "microsoft" | "netflix" | "notion" | "paypal" | "pinterest" | "slack" | "spotify" | "stripe" | "telegram" | "twitch" | "webflow" | "whatsapp" | "wise" | "x-twitter" | "youtube" | null>;
7687
8016
  /** Badge junto al label — string shorthand ('NEW') o SuiBadgeConfig
7688
8017
  (label + color/variant/size, tipado como sui-badge). null = sin badge. */
7689
8018
  readonly badge: _angular_core.InputSignal<string | SuiBadgeConfig | null>;
@@ -7712,7 +8041,81 @@ declare class SuiRadioCard implements ControlValueAccessor {
7712
8041
  registerOnTouched(fn: () => void): void;
7713
8042
  setDisabledState(isDisabled: boolean): void;
7714
8043
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiRadioCard, never>;
7715
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiRadioCard, "sui-radio-card", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "sublabel": { "alias": "sublabel"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "emoji": { "alias": "emoji"; "required": false; "isSignal": true; }; "iconSrc": { "alias": "iconSrc"; "required": false; "isSignal": true; }; "imageUrl": { "alias": "imageUrl"; "required": false; "isSignal": true; }; "badge": { "alias": "badge"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "checked": { "alias": "checked"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; "selected": "selected"; }, never, never, true, never>;
8044
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiRadioCard, "sui-radio-card", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "sublabel": { "alias": "sublabel"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "emoji": { "alias": "emoji"; "required": false; "isSignal": true; }; "iconSrc": { "alias": "iconSrc"; "required": false; "isSignal": true; }; "imageUrl": { "alias": "imageUrl"; "required": false; "isSignal": true; }; "brand": { "alias": "brand"; "required": false; "isSignal": true; }; "badge": { "alias": "badge"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "checked": { "alias": "checked"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; "selected": "selected"; }, never, never, true, never>;
8045
+ }
8046
+
8047
+ /**
8048
+ * SUI Radio Label — SUI Design System 2.0
8049
+ *
8050
+ * Figma file: 8p1k72aKKvzJV4XcvPS4VO
8051
+ * Component set: 515:4282 ("Radio Label [1.1]") — 8 variants
8052
+ * Active(off/on) × Description(off/on) × Flip(off/on)
8053
+ *
8054
+ * Anatomía IDÉNTICA a sui-checkbox-label (misma familia label en Figma):
8055
+ * Container flex gap-8 items-start · radio 20×20 shrink-0
8056
+ * description=off → fila gap-4: Label (14/20 Regular) + Sublabel + Badge
8057
+ * description=on → columna gap-10: Title (Label 14/20 MEDIUM + Sublabel +
8058
+ * Badge) · Description 12/16 sub-600 · Link Button 12/16
8059
+ * Flip → radio a la derecha (CSS order, DOM order estable)
8060
+ *
8061
+ * Semántica de GRUPO (patrón sui-radio-card, NO el CVA boolean del checkbox):
8062
+ * - `value` requerido; dentro de <sui-radio-group> el group manda
8063
+ * (group.value() === value() ⇒ checked; click ⇒ group.select(value)).
8064
+ * - Standalone: model two-way `checked` + output `selected`.
8065
+ * - El sui-radio interno es SOLO visual (pointer-events none en SCSS):
8066
+ * todos los clicks/teclas los maneja el host — una sola fuente de
8067
+ * selección, sin doble-toggle.
8068
+ *
8069
+ * A11y: host role="radio" + aria-checked + Space/Enter seleccionan.
8070
+ * iOS WKWebView fix: touchstart/touchend en host (SUI canon).
8071
+ *
8072
+ * Usage:
8073
+ * <sui-radio-group [(ngModel)]="plan">
8074
+ * <sui-radio-label value="free" label="Freemium" />
8075
+ * <sui-radio-label value="pro" label="Pro" sublabel="(recomendado)"
8076
+ * badge="NEW" description="Facturación mensual."
8077
+ * [link]="{ label: 'Ver precios', href: '/precios' }" />
8078
+ * </sui-radio-group>
8079
+ */
8080
+ declare class SuiRadioLabel {
8081
+ private readonly group;
8082
+ /** Valor que representa esta opción dentro del grupo. */
8083
+ readonly value: _angular_core.InputSignal<string>;
8084
+ /** Texto principal del label. */
8085
+ readonly label: _angular_core.InputSignal<string>;
8086
+ /** Sublabel opcional (12/16 sub-600 al lado del label). */
8087
+ readonly sublabel: _angular_core.InputSignal<string | null>;
8088
+ /** Descripción opcional debajo del title (variant "with description"). */
8089
+ readonly description: _angular_core.InputSignal<string | null>;
8090
+ /** Badge junto al label — string shorthand ('NEW') o SuiBadgeConfig
8091
+ (label + color/variant/size). null = sin badge. */
8092
+ readonly badge: _angular_core.InputSignal<string | SuiBadgeConfig | null>;
8093
+ protected readonly badgeCfg: _angular_core.Signal<SuiBadgeConfig | null>;
8094
+ /** Link Button bajo la descripción — string shorthand (solo label, emite
8095
+ * `linkClick`) o SuiLinkConfig { label, href?, target?, rel? }: con href
8096
+ * renderiza <a> real; rel automático 'noopener noreferrer' para _blank. */
8097
+ readonly link: _angular_core.InputSignal<string | SuiLinkConfig | null>;
8098
+ /** Config resuelta del link (string → { label }, rel automático). */
8099
+ protected readonly linkCfg: _angular_core.Signal<SuiLinkConfig | null>;
8100
+ /** Si true, invierte orden: [content] [radio] (radio a la derecha). */
8101
+ readonly flip: _angular_core.InputSignal<boolean>;
8102
+ /** Deshabilita el radio + wrapper. */
8103
+ readonly disabled: _angular_core.InputSignal<boolean>;
8104
+ /** Standalone mode (sin group): two-way binding del estado checked. */
8105
+ readonly checked: _angular_core.ModelSignal<boolean>;
8106
+ /** Emite el value cuando se selecciona. */
8107
+ readonly selected: _angular_core.OutputEmitterRef<string>;
8108
+ /** Click en el Link Button (stop-propagation interno — no selecciona). */
8109
+ readonly linkClick: _angular_core.OutputEmitterRef<MouseEvent>;
8110
+ readonly isDisabled: _angular_core.Signal<boolean>;
8111
+ /** Checked resuelto: group-driven > standalone. */
8112
+ readonly isChecked: _angular_core.Signal<boolean>;
8113
+ onLabelClick(event: MouseEvent): void;
8114
+ onKeySelect(event: Event): void;
8115
+ private select;
8116
+ onLinkClick(event: MouseEvent): void;
8117
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiRadioLabel, never>;
8118
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiRadioLabel, "sui-radio-label", never, { "value": { "alias": "value"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "sublabel": { "alias": "sublabel"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "badge": { "alias": "badge"; "required": false; "isSignal": true; }; "link": { "alias": "link"; "required": false; "isSignal": true; }; "flip": { "alias": "flip"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "checked": { "alias": "checked"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; "selected": "selected"; "linkClick": "linkClick"; }, never, never, true, never>;
7716
8119
  }
7717
8120
 
7718
8121
  declare class SuiRadioGroup implements ControlValueAccessor {
@@ -8099,8 +8502,8 @@ type SuiSelectSize = 'xsmall' | 'small' | 'medium';
8099
8502
  * - brand → 🎗️ logo/thumbnail (placeholder: award-line)
8100
8503
  * - company → 🏢 logo/thumbnail (placeholder: building-line)
8101
8504
  *
8102
- * El default `'basic'` NO renderea left-icon a menos que `leftIcon` esté
8103
- * activado o se proyecte `[slot=leading]` — preserva la API previa.
8505
+ * El default `'basic'` NO renderea left-icon a menos que `leadingIcon` esté
8506
+ * activado (true o string) o haya imageUrl/flag — el slot es opt-in.
8104
8507
  */
8105
8508
  type SuiSelectType = 'basic' | 'country' | 'avatar' | 'provider' | 'brand' | 'company';
8106
8509
  interface SuiSelectOption<T = any> {
@@ -8136,10 +8539,11 @@ interface SuiSelectOption<T = any> {
8136
8539
  * @input options: SuiSelectOption<T>[]
8137
8540
  *
8138
8541
  * @input type — left-decoration kind (basic/country/avatar/provider/brand/company)
8139
- * @input leftIcon — activa el slot de left-decoration (default false: opt-in)
8140
- * @input leadingIcon — RemixIcon name custom para el left slot (override del default por type)
8542
+ * @input leadingIcon — left-decoration: true = icono default por type, string =
8543
+ * RemixIcon custom, false = sin icono (default: opt-in)
8141
8544
  * @input imageUrl — imagen del left slot cuando hay value (avatar/brand/provider/company logo)
8142
- * @input badge — texto del badge inline entre value y chevron (null = sin badge)
8545
+ * @input badge — badge inline entre value y chevron: string shorthand o
8546
+ * SuiBadgeConfig { label, color?, variant?, size? }. null = sin badge.
8143
8547
  * Slot proyectado: `[slot=leading]` → left-decoration totalmente custom (gana sobre todo)
8144
8548
  *
8145
8549
  * @model value: T | null — two-way con FormControl via CVA
@@ -8151,7 +8555,8 @@ interface SuiSelectOption<T = any> {
8151
8555
  * (basic=flashlight, country=global, avatar=user, provider=bank-card-rect).
8152
8556
  * - badge: confirmado decorativo en el DS (px-8 py-2, radius-full,
8153
8557
  * bg state/information/lighter, text state/information/base 12/16 medium).
8154
- * Alimentado por el input `badge` (string) — no hay signal interno.
8558
+ * Renderizado con <sui-badge> real — defaults orange/lighter/medium (brand
8559
+ * naranja, DECISIONES.md §1) replican pixel-exacto el chip del Figma.
8155
8560
  */
8156
8561
  declare class SuiSelect<T = any> implements ControlValueAccessor {
8157
8562
  readonly size: _angular_core.InputSignal<SuiSelectSize>;
@@ -8164,16 +8569,18 @@ declare class SuiSelect<T = any> implements ControlValueAccessor {
8164
8569
  readonly hint: _angular_core.InputSignal<string | null>;
8165
8570
  /** Tipo de left-decoration del trigger (Figma Select[1.1] Type variant). */
8166
8571
  readonly type: _angular_core.InputSignal<SuiSelectType>;
8167
- /** Activa el slot de left-decoration. Default false (opt-in, preserva API previa). */
8168
- readonly leftIcon: _angular_core.InputSignal<boolean>;
8169
- /** RemixIcon name custom para el left slot (override del default-por-type). */
8170
- readonly leadingIcon: _angular_core.InputSignal<string | null>;
8572
+ /** Left-decoration del trigger — true = icono default por type, string =
8573
+ RemixIcon custom, false = sin icono (default: opt-in). Consolida el par
8574
+ leftIcon (boolean) + leadingIcon (string) previo. */
8575
+ readonly leadingIcon: _angular_core.InputSignal<string | boolean>;
8171
8576
  /** sui-flag name para `type="country"` (override; sino el option selected puede traerla). */
8172
8577
  readonly flag: _angular_core.InputSignal<"abkhazia" | "afghanistan" | "aland-islands" | "albania" | "algeria" | "american-samoa" | "andorra" | "angola" | "anguilla" | "antigua-and-barbuda" | "argentina" | "armenia" | "aruba" | "australia" | "austria" | "azerbaijan" | "azores-islands" | "bahamas" | "bahrain" | "balearic-islands" | "bangladesh" | "barbados" | "basque-country" | "belarus" | "belgium" | "belize" | "benin" | "bermuda" | "bhutan" | "bolivia" | "bonaire" | "bosnia-and-herzegovina" | "botswana" | "brazil" | "british-columbia" | "british-indian-ocean-territory" | "british-virgin-islands" | "brunei" | "bulgaria" | "burkina-faso" | "burundi" | "cambodia" | "cameroon" | "canada" | "canary-islands" | "cape-verde" | "cayman-islands" | "central-african-republic" | "ceuta" | "chad" | "chile" | "china" | "christmas-island" | "cocos-island" | "colombia" | "comoros" | "cook-islands" | "corsica" | "costa-rica" | "croatia" | "cuba" | "curacao" | "cyprus" | "czech-republic" | "democratic-republic-of-congo" | "denmark" | "djibouti" | "dominica" | "dominican-republic" | "east-timor" | "ecuador" | "egypt" | "el-salvador" | "england" | "equatorial-guinea" | "eritrea" | "estonia" | "ethiopia" | "european-union" | "falkland-islands" | "faroe-islands" | "fiji" | "finland" | "france" | "french-polynesia" | "gabon" | "galapagos-islands" | "gambia" | "georgia" | "germany" | "ghana" | "gibraltar" | "greece" | "greenland" | "grenada" | "guam" | "guatemala" | "guernsey" | "guinea-bissau" | "guinea" | "guyana" | "haiti" | "hawaii" | "honduras" | "hong-kong" | "hungary" | "iceland" | "india" | "indonesia" | "iran" | "iraq" | "ireland" | "isle-of-man" | "israel" | "italy" | "ivory-coast" | "jamaica" | "japan" | "jersey" | "jordan" | "kazakhstan" | "kenya" | "kiribati" | "kosovo" | "kuwait" | "kyrgyzstan" | "laos" | "latvia" | "lebanon" | "lesotho" | "liberia" | "libya" | "liechtenstein" | "lithuania" | "luxembourg" | "macao" | "madagascar" | "madeira" | "malawi" | "malaysia" | "maldives" | "mali" | "malta" | "marshall-island" | "martinique" | "mauritania" | "mauritus" | "melilla" | "mexico" | "micronesia" | "moldova" | "monaco" | "mongolia" | "montenegro" | "montserrat" | "morocco" | "mozambique" | "myanmar" | "namibia" | "nato" | "nauru" | "nepal" | "netherlands" | "new-zealand" | "nicaragua" | "niger" | "nigeria" | "niue" | "norfolk-island" | "north-korea" | "northern-cyprus" | "northern-marianas-islands" | "norway" | "oman" | "orkney-islands" | "ossetia" | "pakistan" | "palau" | "palestine" | "panama" | "papua-new-guinea" | "paraguay" | "peru" | "philippines" | "pitcairn-islands" | "poland" | "portugal" | "puerto-rico" | "qatar" | "rapa-nui" | "republic-of-macedonia" | "republic-of-the-congo" | "romania" | "russia" | "rwanda" | "saba-island" | "sahrawi-arab-democratic-republic" | "saint-kitts-and-nevis" | "samoa" | "san-marino" | "sao-tome-and-prince" | "sardinia" | "saudi-arabia" | "scotland" | "senegal" | "serbia" | "seychelles" | "sierra-leone" | "singapore" | "sint-eustatius" | "sint-maarten" | "slovakia" | "slovania" | "solomon-islands" | "somalia" | "somaliland" | "south-africa" | "south-korea" | "south-sudan" | "spain" | "sri-lanka" | "st-barts" | "st-lucia" | "st-vincent-and-the-grenadines" | "sudan" | "suriname" | "swaziland" | "sweden" | "switzerland" | "syria" | "taijikistan" | "taiwan" | "tanzania" | "thailand" | "tibet" | "togo" | "tokelau" | "tonga" | "transnistria" | "trinidad-and-tobago" | "tunisia" | "turkey" | "turkmenistan" | "turks-and-caicos" | "tuvalu" | "uganda" | "ukraine" | "united-arab-emirates" | "united-kingdom" | "united-nations" | "united-states" | "uruguay" | "uzbekistan" | "vanuatu" | "vatican-city" | "venezuela" | "vietnam" | "virgin-islands" | "wales" | "yemen" | "zambia" | "zimbabwe" | null>;
8173
8578
  /** Imagen del left slot cuando hay value (avatar/brand/provider/company logo). */
8174
8579
  readonly imageUrl: _angular_core.InputSignal<string | null>;
8175
- /** Texto del badge inline entre value y chevron (null = sin badge). */
8176
- readonly badge: _angular_core.InputSignal<string | null>;
8580
+ /** Badge inline entre value y chevron — string shorthand ('New') o
8581
+ SuiBadgeConfig (label + color/variant/size). null = sin badge. */
8582
+ readonly badge: _angular_core.InputSignal<string | SuiBadgeConfig | null>;
8583
+ protected readonly badgeCfg: _angular_core.Signal<SuiBadgeConfig | null>;
8177
8584
  /** Texto secundario del label (ej. "Optional", "Required") */
8178
8585
  readonly sublabel: _angular_core.InputSignal<string | null>;
8179
8586
  /** Muestra asterisco rojo en el label */
@@ -8194,8 +8601,11 @@ declare class SuiSelect<T = any> implements ControlValueAccessor {
8194
8601
  * provider=bank-card, brand=award, company=building).
8195
8602
  */
8196
8603
  private readonly _defaultIconByType;
8197
- /** Icono efectivo del left slot: custom > default-por-type. */
8604
+ /** Icono efectivo del left slot: string custom > default-por-type (true). */
8198
8605
  readonly leadingIconName: _angular_core.Signal<string>;
8606
+ /** Muestra el slot de left-decoration: leadingIcon activo (true o string)
8607
+ o presencia de imageUrl/flag. */
8608
+ readonly showLeading: _angular_core.Signal<boolean>;
8199
8609
  /** Muestra la imagen (avatar/logo) en vez del ícono cuando hay imageUrl. */
8200
8610
  readonly showLeadingImage: _angular_core.Signal<boolean>;
8201
8611
  /** Trigger element — pasado al sui-dropdown-menu como [origin]. */
@@ -8221,7 +8631,7 @@ declare class SuiSelect<T = any> implements ControlValueAccessor {
8221
8631
  setDisabledState(isDisabled: boolean): void;
8222
8632
  private _moveHighlight;
8223
8633
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiSelect<any>, never>;
8224
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiSelect<any>, "sui-select", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "leftIcon": { "alias": "leftIcon"; "required": false; "isSignal": true; }; "leadingIcon": { "alias": "leadingIcon"; "required": false; "isSignal": true; }; "flag": { "alias": "flag"; "required": false; "isSignal": true; }; "imageUrl": { "alias": "imageUrl"; "required": false; "isSignal": true; }; "badge": { "alias": "badge"; "required": false; "isSignal": true; }; "sublabel": { "alias": "sublabel"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "tooltip": { "alias": "tooltip"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, ["[slot=leading]"], true, never>;
8634
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiSelect<any>, "sui-select", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "leadingIcon": { "alias": "leadingIcon"; "required": false; "isSignal": true; }; "flag": { "alias": "flag"; "required": false; "isSignal": true; }; "imageUrl": { "alias": "imageUrl"; "required": false; "isSignal": true; }; "badge": { "alias": "badge"; "required": false; "isSignal": true; }; "sublabel": { "alias": "sublabel"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "tooltip": { "alias": "tooltip"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, ["[slot=leading]"], true, never>;
8225
8635
  }
8226
8636
 
8227
8637
  interface SuiSidebarItem {
@@ -8261,6 +8671,30 @@ interface SuiSidebarItem {
8261
8671
  tooltip?: string;
8262
8672
  }
8263
8673
  type SuiSidebarMobileMode = 'drawer' | 'sheet';
8674
+ /** Config del brand header (logo + nombre + subtítulo). Patrón objeto, como `profile`. */
8675
+ interface SuiSidebarBrandConfig {
8676
+ /** Nombre de la marca / workspace en el header */
8677
+ name: string;
8678
+ /** Texto secundario debajo del nombre (ej. "HR Management" o "SUPERADMIN") */
8679
+ subtitle?: string;
8680
+ /**
8681
+ * Cuando true, el subtitle se renderiza como <sui-badge variant="filled"
8682
+ * color="orange" size="small"> (típico para roles tipo "SUPERADMIN").
8683
+ * Cuando false (default) → texto plano sub-600.
8684
+ */
8685
+ subtitleAsBadge?: boolean;
8686
+ /** URL de imagen del brand logo (40×40 rounded-full) */
8687
+ logo?: string;
8688
+ /** Fallback (emoji o texto corto) cuando no hay logo */
8689
+ fallback?: string;
8690
+ }
8691
+ /** Config del search slot (Figma prop search=true). Patrón objeto, como `profile`. */
8692
+ interface SuiSidebarSearchConfig {
8693
+ /** Placeholder del input. Default 'Search...'. */
8694
+ placeholder?: string;
8695
+ /** Shortcut pill dentro del search (ej. '⌘1'). Omitir → sin pill. */
8696
+ shortcut?: string;
8697
+ }
8264
8698
  interface SuiSidebarProfile {
8265
8699
  name: string;
8266
8700
  avatarUrl?: string;
@@ -8289,29 +8723,23 @@ declare class SuiSidebar {
8289
8723
  * - 'information': azul --sui-state-information-base (Figma canon SUI, opt-in)
8290
8724
  */
8291
8725
  readonly indicatorColor: _angular_core.InputSignal<SuiSidebarIndicatorColor>;
8292
- readonly brandName: _angular_core.InputSignal<string>;
8293
- /** Texto secundario debajo del nombre (ej. "HR Management" o "SUPERADMIN") */
8294
- readonly brandSubtitle: _angular_core.InputSignal<string | null>;
8295
8726
  /**
8296
- * Cuando true, el subtitle se renderiza como <sui-badge variant="filled"
8297
- * color="orange" size="small"> (typical para roles tipo "SUPERADMIN").
8298
- * Cuando false (default) → texto plano sub-600.
8727
+ * Config del brand header: { name, subtitle?, subtitleAsBadge?, logo?, fallback? }.
8728
+ * null → header sin nombre (solo el placeholder building-line).
8299
8729
  */
8300
- readonly brandSubtitleAsBadge: _angular_core.InputSignal<boolean>;
8301
- /** URL de imagen del brand logo (40×40 rounded-full) */
8302
- readonly brandLogo: _angular_core.InputSignal<string | null>;
8303
- /** Fallback (emoji o texto corto) cuando no hay logo */
8304
- readonly brandFallback: _angular_core.InputSignal<string | null>;
8730
+ readonly brand: _angular_core.InputSignal<SuiSidebarBrandConfig | null>;
8305
8731
  /**
8306
8732
  * Muestra el Compact Button del header (expand-up-down-line) — workspace
8307
8733
  * switcher de Figma. Emite (headerButtonClicked) al click. Default false.
8308
8734
  */
8309
8735
  readonly showHeaderButton: _angular_core.InputSignal<boolean>;
8310
- /** Renderiza el Text Input de búsqueda encima de las secciones. Default false. */
8311
- readonly searchable: _angular_core.InputSignal<boolean>;
8312
- readonly searchPlaceholder: _angular_core.InputSignal<string>;
8313
- /** Shortcut pill dentro del search (ej. '⌘1'). null → sin pill. */
8314
- readonly searchShortcut: _angular_core.InputSignal<string | null>;
8736
+ /**
8737
+ * Search encima de las secciones:
8738
+ * - `false` / `null` (default): sin search
8739
+ * - `true`: search con defaults (placeholder 'Search...', sin shortcut)
8740
+ * - objeto `{ placeholder?, shortcut? }`: search configurado
8741
+ */
8742
+ readonly search: _angular_core.InputSignal<boolean | SuiSidebarSearchConfig | null>;
8315
8743
  /** Valor del input de búsqueda (2-way). */
8316
8744
  readonly searchValue: _angular_core.ModelSignal<string>;
8317
8745
  readonly items: _angular_core.InputSignal<SuiSidebarItem[]>;
@@ -8369,6 +8797,16 @@ declare class SuiSidebar {
8369
8797
  readonly profileClicked: _angular_core.OutputEmitterRef<void>;
8370
8798
  /** Submit del search input (Enter). Emite el valor actual. */
8371
8799
  readonly searchSubmitted: _angular_core.OutputEmitterRef<string>;
8800
+ /** Brand normalizado — nunca null para simplificar los binds del template. */
8801
+ protected readonly brandCfg: _angular_core.Signal<SuiSidebarBrandConfig>;
8802
+ /**
8803
+ * Search normalizado: null → sin search; objeto con defaults aplicados
8804
+ * (placeholder 'Search...') cuando search=true o config parcial.
8805
+ */
8806
+ protected readonly searchCfg: _angular_core.Signal<{
8807
+ placeholder: string;
8808
+ shortcut: string | null;
8809
+ } | null>;
8372
8810
  /**
8373
8811
  * Resuelve cuándo un item sin route está "activo" via activeRoute.
8374
8812
  * Match por prefijo: '/master/inicio' activa también '/master/inicio/sub'.
@@ -8383,7 +8821,7 @@ declare class SuiSidebar {
8383
8821
  protected onSearchInput(value: string): void;
8384
8822
  protected onSearchSubmit(): void;
8385
8823
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiSidebar, never>;
8386
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiSidebar, "sui-sidebar", never, { "collapsed": { "alias": "collapsed"; "required": false; "isSignal": true; }; "indicatorColor": { "alias": "indicatorColor"; "required": false; "isSignal": true; }; "brandName": { "alias": "brandName"; "required": false; "isSignal": true; }; "brandSubtitle": { "alias": "brandSubtitle"; "required": false; "isSignal": true; }; "brandSubtitleAsBadge": { "alias": "brandSubtitleAsBadge"; "required": false; "isSignal": true; }; "brandLogo": { "alias": "brandLogo"; "required": false; "isSignal": true; }; "brandFallback": { "alias": "brandFallback"; "required": false; "isSignal": true; }; "showHeaderButton": { "alias": "showHeaderButton"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "searchShortcut": { "alias": "searchShortcut"; "required": false; "isSignal": true; }; "searchValue": { "alias": "searchValue"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "secondaryItems": { "alias": "secondaryItems"; "required": false; "isSignal": true; }; "supportingItems": { "alias": "supportingItems"; "required": false; "isSignal": true; }; "supportingAnchorBottom": { "alias": "supportingAnchorBottom"; "required": false; "isSignal": true; }; "itemsLabel": { "alias": "itemsLabel"; "required": false; "isSignal": true; }; "secondaryItemsLabel": { "alias": "secondaryItemsLabel"; "required": false; "isSignal": true; }; "supportingItemsLabel": { "alias": "supportingItemsLabel"; "required": false; "isSignal": true; }; "activeRoute": { "alias": "activeRoute"; "required": false; "isSignal": true; }; "profile": { "alias": "profile"; "required": false; "isSignal": true; }; "profileDropdown": { "alias": "profileDropdown"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "closeOnNavigate": { "alias": "closeOnNavigate"; "required": false; "isSignal": true; }; "showBackdrop": { "alias": "showBackdrop"; "required": false; "isSignal": true; }; "mobileMode": { "alias": "mobileMode"; "required": false; "isSignal": true; }; }, { "searchValue": "searchValueChange"; "open": "openChange"; "itemClicked": "itemClicked"; "logoutClicked": "logoutClicked"; "backdropClicked": "backdropClicked"; "headerButtonClicked": "headerButtonClicked"; "profileClicked": "profileClicked"; "searchSubmitted": "searchSubmitted"; }, never, ["[feature-card]"], true, never>;
8824
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiSidebar, "sui-sidebar", never, { "collapsed": { "alias": "collapsed"; "required": false; "isSignal": true; }; "indicatorColor": { "alias": "indicatorColor"; "required": false; "isSignal": true; }; "brand": { "alias": "brand"; "required": false; "isSignal": true; }; "showHeaderButton": { "alias": "showHeaderButton"; "required": false; "isSignal": true; }; "search": { "alias": "search"; "required": false; "isSignal": true; }; "searchValue": { "alias": "searchValue"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "secondaryItems": { "alias": "secondaryItems"; "required": false; "isSignal": true; }; "supportingItems": { "alias": "supportingItems"; "required": false; "isSignal": true; }; "supportingAnchorBottom": { "alias": "supportingAnchorBottom"; "required": false; "isSignal": true; }; "itemsLabel": { "alias": "itemsLabel"; "required": false; "isSignal": true; }; "secondaryItemsLabel": { "alias": "secondaryItemsLabel"; "required": false; "isSignal": true; }; "supportingItemsLabel": { "alias": "supportingItemsLabel"; "required": false; "isSignal": true; }; "activeRoute": { "alias": "activeRoute"; "required": false; "isSignal": true; }; "profile": { "alias": "profile"; "required": false; "isSignal": true; }; "profileDropdown": { "alias": "profileDropdown"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "closeOnNavigate": { "alias": "closeOnNavigate"; "required": false; "isSignal": true; }; "showBackdrop": { "alias": "showBackdrop"; "required": false; "isSignal": true; }; "mobileMode": { "alias": "mobileMode"; "required": false; "isSignal": true; }; }, { "searchValue": "searchValueChange"; "open": "openChange"; "itemClicked": "itemClicked"; "logoutClicked": "logoutClicked"; "backdropClicked": "backdropClicked"; "headerButtonClicked": "headerButtonClicked"; "profileClicked": "profileClicked"; "searchSubmitted": "searchSubmitted"; }, never, ["[feature-card]"], true, never>;
8387
8825
  }
8388
8826
 
8389
8827
  /**
@@ -8940,6 +9378,20 @@ declare class SuiImgRetry {
8940
9378
  * (ej. random por visita) y la pase por `[fallbackColor]`. El componente NO
8941
9379
  * hace random internamente — se mantiene presentacional y puro. */
8942
9380
  declare const SUI_PRODUCT_FALLBACK_COLORS: readonly ["var(--sui-state-information-base)", "var(--sui-state-warning-base)", "var(--sui-state-error-base)", "var(--sui-state-success-base)", "var(--sui-state-feature-base)", "var(--sui-state-highlighted-base)"];
9381
+ /** Config de la imagen del producto. El input `image` también acepta string
9382
+ * shorthand (= solo la `url`, `position` default 50). */
9383
+ interface SuiProductCardImage {
9384
+ url: string;
9385
+ /** Encuadre vertical de la imagen (CSS object-position Y, 0–100). Default 50. */
9386
+ position?: number;
9387
+ }
9388
+ /** Config del fallback sin imagen. */
9389
+ interface SuiProductCardFallback {
9390
+ /** `'name'` = banda de color + nombre (default) · `'icon'` = ícono. */
9391
+ variant?: 'name' | 'icon';
9392
+ /** Color de la banda del variant `'name'` (CSS color o `var(--sui-...)`). */
9393
+ color?: string | null;
9394
+ }
8943
9395
  declare class SuiProductCard {
8944
9396
  /** Nombre del producto (título de la card + fuente del color del fallback). */
8945
9397
  readonly name: _angular_core.InputSignal<string>;
@@ -8947,10 +9399,10 @@ declare class SuiProductCard {
8947
9399
  readonly description: _angular_core.InputSignal<string>;
8948
9400
  /** Precio numérico; se formatea a 2 decimales. */
8949
9401
  readonly price: _angular_core.InputSignal<number>;
8950
- /** URL de la imagen. Ausente → se usa `fallbackVariant`. */
8951
- readonly imageUrl: _angular_core.InputSignal<string | null>;
8952
- /** Encuadre vertical de la imagen (CSS object-position Y, 0–100). */
8953
- readonly imagePosition: _angular_core.InputSignal<number>;
9402
+ /** Imagen del producto — string shorthand (solo URL) o SuiProductCardImage
9403
+ * { url, position? } para fine-tuning del encuadre vertical.
9404
+ * null → se usa `fallbackVariant`. */
9405
+ readonly image: _angular_core.InputSignal<string | SuiProductCardImage | null>;
8954
9406
  /** false → card atenuada + tag "Agotado", sin botón de agregar. */
8955
9407
  readonly available: _angular_core.InputSignal<boolean>;
8956
9408
  /** Cantidad en el carrito. > 0 → muestra el stepper en vez del botón "+". */
@@ -8959,12 +9411,12 @@ declare class SuiProductCard {
8959
9411
  readonly closed: _angular_core.InputSignal<boolean>;
8960
9412
  /** Prefijo de moneda. */
8961
9413
  readonly currencySymbol: _angular_core.InputSignal<string>;
8962
- /** Fallback sin imagen: `'name'` = banda de color + nombre; `'icon'` = ícono. */
8963
- readonly fallbackVariant: _angular_core.InputSignal<"name" | "icon">;
8964
- /** Color del fallback `'name'` (CSS color o `var(--sui-...)`). Lo decide el
8965
- * consumidor (ej. random por visita usando `SUI_PRODUCT_FALLBACK_COLORS`).
8966
- * Si no se pasa, cae a un default determinista por nombre (puro, sin random). */
8967
- readonly fallbackColor: _angular_core.InputSignal<string | null>;
9414
+ /** Fallback sin imagen — `{ variant?, color? }`. `variant`: `'name'` = banda
9415
+ * de color + nombre (default) · `'icon'` = ícono. `color`: CSS color o
9416
+ * `var(--sui-...)` para la banda del variant `'name'` (ej. random por visita
9417
+ * usando `SUI_PRODUCT_FALLBACK_COLORS`); sin color cae a un default
9418
+ * determinista por nombre (puro, sin random). */
9419
+ readonly fallback: _angular_core.InputSignal<SuiProductCardFallback | null>;
8968
9420
  /** Texto del tag cuando no está disponible. */
8969
9421
  readonly unavailableLabel: _angular_core.InputSignal<string>;
8970
9422
  /** Tap en la card (abrir detalle del producto). */
@@ -8977,19 +9429,24 @@ declare class SuiProductCard {
8977
9429
  readonly decrement: _angular_core.OutputEmitterRef<void>;
8978
9430
  readonly formattedPrice: _angular_core.Signal<string>;
8979
9431
  readonly showStepper: _angular_core.Signal<boolean>;
9432
+ /** Config resuelta de la imagen (string → { url }; `position` default 50).
9433
+ * null = sin imagen → fallback. */
9434
+ readonly imageCfg: _angular_core.Signal<Required<SuiProductCardImage> | null>;
9435
+ /** Config resuelta del fallback (null → variant `'name'`, sin color explícito). */
9436
+ private readonly fallbackCfg;
8980
9437
  readonly showNamedFallback: _angular_core.Signal<boolean>;
8981
9438
  readonly showIconFallback: _angular_core.Signal<boolean>;
8982
- /** Color resuelto del fallback `'name'`. Usa `fallbackColor` si el consumidor
9439
+ /** Color resuelto del fallback `'name'`. Usa `fallback.color` si el consumidor
8983
9440
  * lo pasa; si no, un default DETERMINISTA por nombre (puro, sin `Math.random`
8984
9441
  * ni efectos → seguro para SSR/hidratación y testeable). La variedad "random
8985
- * por visita" la implementa el consumidor pasando `[fallbackColor]`. */
9442
+ * por visita" la implementa el consumidor pasando `color` en el config. */
8986
9443
  readonly resolvedFallbackColor: _angular_core.Signal<string>;
8987
9444
  onCard(): void;
8988
9445
  onAdd(event: Event): void;
8989
9446
  onInc(event: Event): void;
8990
9447
  onDec(event: Event): void;
8991
9448
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiProductCard, never>;
8992
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiProductCard, "sui-product-card", never, { "name": { "alias": "name"; "required": true; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "price": { "alias": "price"; "required": true; "isSignal": true; }; "imageUrl": { "alias": "imageUrl"; "required": false; "isSignal": true; }; "imagePosition": { "alias": "imagePosition"; "required": false; "isSignal": true; }; "available": { "alias": "available"; "required": false; "isSignal": true; }; "quantity": { "alias": "quantity"; "required": false; "isSignal": true; }; "closed": { "alias": "closed"; "required": false; "isSignal": true; }; "currencySymbol": { "alias": "currencySymbol"; "required": false; "isSignal": true; }; "fallbackVariant": { "alias": "fallbackVariant"; "required": false; "isSignal": true; }; "fallbackColor": { "alias": "fallbackColor"; "required": false; "isSignal": true; }; "unavailableLabel": { "alias": "unavailableLabel"; "required": false; "isSignal": true; }; }, { "openDetail": "openDetail"; "add": "add"; "increment": "increment"; "decrement": "decrement"; }, never, never, true, never>;
9449
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiProductCard, "sui-product-card", never, { "name": { "alias": "name"; "required": true; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "price": { "alias": "price"; "required": true; "isSignal": true; }; "image": { "alias": "image"; "required": false; "isSignal": true; }; "available": { "alias": "available"; "required": false; "isSignal": true; }; "quantity": { "alias": "quantity"; "required": false; "isSignal": true; }; "closed": { "alias": "closed"; "required": false; "isSignal": true; }; "currencySymbol": { "alias": "currencySymbol"; "required": false; "isSignal": true; }; "fallback": { "alias": "fallback"; "required": false; "isSignal": true; }; "unavailableLabel": { "alias": "unavailableLabel"; "required": false; "isSignal": true; }; }, { "openDetail": "openDetail"; "add": "add"; "increment": "increment"; "decrement": "decrement"; }, never, never, true, never>;
8993
9450
  }
8994
9451
 
8995
9452
  /**
@@ -9121,7 +9578,7 @@ declare class SuiSwitchCard implements ControlValueAccessor {
9121
9578
  * `<sui-icon>` proyectado vía `[sui-switch-card-leading]` y se renderiza
9122
9579
  * con las MISMAS dimensiones (20×20 dentro del círculo de 40px).
9123
9580
  */
9124
- readonly emoji: _angular_core.InputSignal<"warning" | "label" | "thinking-face" | "grinning-face" | "smiling-face-hearts" | "face-with-rolling-eyes" | "face-screaming" | "partying-face" | "star-struck" | "sleeping-face" | "pensive-face" | "confused-face" | "neutral-face" | "slightly-smiling-face" | "grinning-face-smiling-eyes" | "package" | "receipt" | "money-bag" | "money-with-wings" | "shopping-cart" | "shopping-bags" | "card-index-dividers" | "bell" | "bell-with-slash" | "pushpin" | "mobile-phone" | "gear" | "locked" | "unlocked" | "wrench" | "hammer" | "magnifying-glass-tilted-left" | "spiral-calendar" | "bar-chart" | "delivery-truck" | "motorcycle" | "rocket" | "house" | "office-building" | "shop" | "dollar-banknote" | "glowing-star" | "kick-scooter" | "check-mark" | "check-mark-button" | "cross-mark" | "no-entry" | "sparkles" | "party-popper" | "waving-hand" | "thumbs-up" | "clapping-hands" | "handshake" | "busts-in-silhouette" | "pizza" | "hamburger" | "taco" | "birthday-cake" | null>;
9581
+ readonly emoji: _angular_core.InputSignal<"label" | "warning" | "thinking-face" | "grinning-face" | "smiling-face-hearts" | "face-with-rolling-eyes" | "face-screaming" | "partying-face" | "star-struck" | "sleeping-face" | "pensive-face" | "confused-face" | "neutral-face" | "slightly-smiling-face" | "grinning-face-smiling-eyes" | "package" | "receipt" | "money-bag" | "money-with-wings" | "shopping-cart" | "shopping-bags" | "card-index-dividers" | "bell" | "bell-with-slash" | "pushpin" | "mobile-phone" | "gear" | "locked" | "unlocked" | "wrench" | "hammer" | "magnifying-glass-tilted-left" | "spiral-calendar" | "bar-chart" | "delivery-truck" | "motorcycle" | "rocket" | "house" | "office-building" | "shop" | "dollar-banknote" | "glowing-star" | "kick-scooter" | "check-mark" | "check-mark-button" | "cross-mark" | "no-entry" | "sparkles" | "party-popper" | "waving-hand" | "thumbs-up" | "clapping-hands" | "handshake" | "busts-in-silhouette" | "pizza" | "hamburger" | "taco" | "birthday-cake" | null>;
9125
9582
  /**
9126
9583
  * URL de imagen para type='avatar' — se renderiza con sui-avatar size=lg
9127
9584
  * (40×40 redonda). Si la imagen falla, fallback automático a iniciales del
@@ -9234,7 +9691,13 @@ declare class SuiSwitchLabel implements ControlValueAccessor {
9234
9691
  (label + color/variant/size, tipado como sui-badge). null = sin badge. */
9235
9692
  readonly badge: _angular_core.InputSignal<string | SuiBadgeConfig | null>;
9236
9693
  protected readonly badgeCfg: _angular_core.Signal<SuiBadgeConfig | null>;
9237
- readonly linkLabel: _angular_core.InputSignal<string | null>;
9694
+ /** Link Button bajo la descripción — string shorthand (solo label, emite
9695
+ * `linkClick`) o SuiLinkConfig { label, href?, target?, rel? }: con href
9696
+ * renderiza <a> real; rel automático 'noopener noreferrer' para _blank.
9697
+ * (Mismo patrón objeto que `badge`/SuiBadgeConfig.) */
9698
+ readonly link: _angular_core.InputSignal<string | SuiLinkConfig | null>;
9699
+ /** Config resuelta del link (string → { label }, rel automático). */
9700
+ protected readonly linkCfg: _angular_core.Signal<SuiLinkConfig | null>;
9238
9701
  /** Si true, invierte orden: [content] [switch] (label a la izquierda). */
9239
9702
  readonly flip: _angular_core.InputSignal<boolean>;
9240
9703
  readonly disabled: _angular_core.InputSignal<boolean>;
@@ -9267,7 +9730,7 @@ declare class SuiSwitchLabel implements ControlValueAccessor {
9267
9730
  registerOnTouched(fn: () => void): void;
9268
9731
  setDisabledState(isDisabled: boolean): void;
9269
9732
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiSwitchLabel, never>;
9270
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiSwitchLabel, "sui-switch-label", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "sublabel": { "alias": "sublabel"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "badge": { "alias": "badge"; "required": false; "isSignal": true; }; "linkLabel": { "alias": "linkLabel"; "required": false; "isSignal": true; }; "flip": { "alias": "flip"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "active": { "alias": "active"; "required": false; "isSignal": true; }; }, { "activeChange": "activeChange"; "linkClick": "linkClick"; }, never, never, true, never>;
9733
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiSwitchLabel, "sui-switch-label", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "sublabel": { "alias": "sublabel"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "badge": { "alias": "badge"; "required": false; "isSignal": true; }; "link": { "alias": "link"; "required": false; "isSignal": true; }; "flip": { "alias": "flip"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "active": { "alias": "active"; "required": false; "isSignal": true; }; }, { "activeChange": "activeChange"; "linkClick": "linkClick"; }, never, never, true, never>;
9271
9734
  }
9272
9735
 
9273
9736
  interface SuiTabChipItem {
@@ -9909,13 +10372,15 @@ declare class SuiTagInput implements ControlValueAccessor {
9909
10372
  readonly error: _angular_core.InputSignal<boolean>;
9910
10373
  readonly errorMessage: _angular_core.InputSignal<string | null>;
9911
10374
  /**
9912
- * Renderiza el icono trailing del frame "Basic" (Figma `rightIcon`, node 428:4819).
9913
- * Default: `info-custom-fill` 20×20 coloreado text-soft-400. Para sustituir el
10375
+ * Icono trailing del frame "Basic" (Figma `rightIcon`, node 428:4819).
10376
+ * `true` = icono default `info-custom-fill` 20×20 coloreado text-soft-400;
10377
+ * string = nombre de icono custom; `false` = sin icono. Para sustituir el
9914
10378
  * contenido del slot proyectá markup en `[slot=right]` (equivalente `pickRight`).
10379
+ * (Mismo patrón fusionado que `badge`/`link` de sui-checkbox-label.)
9915
10380
  */
9916
- readonly rightIcon: _angular_core.InputSignal<boolean>;
9917
- /** Nombre del icono trailing cuando rightIcon=true y no se proyecta `[slot=right]`. */
9918
- readonly rightIconName: _angular_core.InputSignal<string>;
10381
+ readonly rightIcon: _angular_core.InputSignal<string | boolean>;
10382
+ /** Nombre resuelto del icono trailing (null = no se renderiza). */
10383
+ protected readonly rightIconCfg: _angular_core.Signal<string | null>;
9919
10384
  readonly label: _angular_core.InputSignal<string | null>;
9920
10385
  readonly sublabel: _angular_core.InputSignal<string | null>;
9921
10386
  readonly required: _angular_core.InputSignal<boolean>;
@@ -9964,7 +10429,7 @@ declare class SuiTagInput implements ControlValueAccessor {
9964
10429
  registerOnTouched(fn: () => void): void;
9965
10430
  setDisabledState(isDisabled: boolean): void;
9966
10431
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiTagInput, never>;
9967
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiTagInput, "sui-tag-input", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "rightIcon": { "alias": "rightIcon"; "required": false; "isSignal": true; }; "rightIconName": { "alias": "rightIconName"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "sublabel": { "alias": "sublabel"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "tooltip": { "alias": "tooltip"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "commaSeparator": { "alias": "commaSeparator"; "required": false; "isSignal": true; }; "allowDuplicates": { "alias": "allowDuplicates"; "required": false; "isSignal": true; }; "maxTags": { "alias": "maxTags"; "required": false; "isSignal": true; }; "addOnBlur": { "alias": "addOnBlur"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "tagAdded": "tagAdded"; "tagRemoved": "tagRemoved"; }, never, ["[slot=right]"], true, never>;
10432
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiTagInput, "sui-tag-input", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "rightIcon": { "alias": "rightIcon"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "sublabel": { "alias": "sublabel"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "tooltip": { "alias": "tooltip"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "commaSeparator": { "alias": "commaSeparator"; "required": false; "isSignal": true; }; "allowDuplicates": { "alias": "allowDuplicates"; "required": false; "isSignal": true; }; "maxTags": { "alias": "maxTags"; "required": false; "isSignal": true; }; "addOnBlur": { "alias": "addOnBlur"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "tagAdded": "tagAdded"; "tagRemoved": "tagRemoved"; }, never, ["[slot=right]"], true, never>;
9968
10433
  }
9969
10434
 
9970
10435
  type SuiTagStyle = 'stroke' | 'gray';
@@ -10517,7 +10982,7 @@ declare class SuiTimePicker implements ControlValueAccessor {
10517
10982
  readonly error: _angular_core.InputSignal<boolean>;
10518
10983
  readonly placeholder: _angular_core.InputSignal<string>;
10519
10984
  readonly disabled: _angular_core.InputSignal<boolean>;
10520
- readonly size: _angular_core.InputSignal<"medium" | "small">;
10985
+ readonly size: _angular_core.InputSignal<"small" | "medium">;
10521
10986
  /** Formato de display: '12h' (AM/PM) o '24h'. */
10522
10987
  readonly format: _angular_core.InputSignal<SuiTimeFormat>;
10523
10988
  /** Incremento de minutos de la lista (1, 5, 15, ...). Default 5. */
@@ -10888,5 +11353,5 @@ declare class SuiTooltipPanel {
10888
11353
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiTooltipPanel, "sui-tooltip-panel", never, { "text": { "alias": "text"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "theme": { "alias": "theme"; "required": false; "isSignal": true; }; "showArrow": { "alias": "showArrow"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; }, { "dismissed": "dismissed"; }, never, never, true, never>;
10889
11354
  }
10890
11355
 
10891
- export { DAY_LABELS_ES, DEFAULT_DURATION_PRESETS, DEFAULT_PRESETS, EMPTY_STATE_FOX_EMOJI, SUI_BRAND_LOGO_COMPANIES, SUI_COLOR_DOT_COLORS, SUI_COLOR_DOT_HEX, SUI_CUSTOM_ICONS, SUI_EMOJI_MAP, SUI_FLAG_NAMES, SUI_HEX_TO_COLOR, SUI_KEY_ICON_COLORS, SUI_KEY_ICON_SIZES, SUI_NAVBAR_VISIBILITY, SUI_PRODUCT_FALLBACK_COLORS, SUI_TAB_BAR, SuiAccordion, SuiActivityFeed, SuiActivityFilter, SuiAlert, SuiAppStoreBadge, SuiAvatar, SuiAvatarGroup, SuiBadge, SuiBanner, SuiBrandLogo, SuiBreadcrumbItem, SuiBreadcrumbs, SuiButton, SuiButtonGroup, SuiButtonGroupItem, SuiCard, SuiCheckbox, SuiCheckboxCard, SuiCheckboxLabel, SuiCircularProgressBar, SuiColorDot, SuiColorPicker, SuiCommandMenuFooter, SuiCommandMenuItem, SuiCommandMenuSearch, SuiCompactAvatarGroup, SuiCompactButton, SuiCompactSelect, SuiCompactSelectForInput, SuiContentCard, SuiContentDivider, SuiCounterInput, SuiDateSelector, SuiDatepicker, SuiDayCell, SuiDayLabel, SuiDivider, SuiDrawerFooter, SuiDrawerHeader, SuiDropdownCaption, SuiDropdownItem, SuiDropdownMenu, SuiDropdownPanel, SuiDropdownSearch, SuiEmoji, SuiEmptyState, SuiFancyButton, SuiFileIcon, SuiFileUpload, SuiFileUploadCard, SuiFilterBar, SuiFilterItem, SuiFilterPanelFooter, SuiFilterPanelHeader, SuiFlag, SuiFormHint, SuiFormLabel, SuiIcon, SuiImageUpload, SuiImageUploadProfile, SuiImgRetry, SuiInlineInput, SuiInlineSelect, SuiInput, SuiIntegrationSwitch, SuiKbd, SuiKeyIcon, SuiLinkButton, SuiModal, SuiModalSheet, SuiNotification, SuiNotificationFooter, SuiNotificationTabMenu, SuiOtpInput, SuiPageHeader, SuiPagination, SuiPeriodRange, SuiPopover, SuiProductCard, SuiProgressBar, SuiProgressBarLabel, SuiRadio, SuiRadioCard, SuiRadioGroup, SuiRating, SuiRichEditor, SuiRichEditorItem, SuiSegmentedControl, SuiSelect, SuiSidebar, SuiSlider, SuiSocialButton, SuiStatusBadge, SuiStepper, SuiStoreCard, SuiSwitch, SuiSwitchCard, SuiSwitchLabel, SuiTabChips, SuiTabMenuHorizontal, SuiTabMenuVertical, SuiTable, SuiTableCellDirective, SuiTag, SuiTagInput, SuiTextarea, SuiTimePicker, SuiTimePickerDuration, SuiTimePickerItem, SuiTimePickerStatus, SuiToastOutlet, SuiToastService, SuiTooltip, SuiTooltipPanel, buildCalendarGrid, buildHourList, buildMinuteList, formatDateInput, formatDateShort, formatMonthYear, formatTime, isSameTime, normalizeHex, pad2, parseTime, to12h, to24h };
10892
- export type { CalendarCell, CalendarRow, DatepickerPreset, DatepickerPresetId, SuiAccordionFlipIcon, SuiActivityAvatarRef, SuiActivityFeedItem, SuiActivityFile, SuiActivityFilterState, SuiActivityTask, SuiActivityTaskState, SuiAlertAction, SuiAlertSize, SuiAlertStyle, SuiAlertVariant, SuiAppStoreBadgeAppearance, SuiAppStoreBadgeCompany, SuiAvatarColor, SuiAvatarGroupItem, SuiAvatarSize, SuiAvatarStatus, SuiAvatarTopBadge, SuiBadgeColor, SuiBadgeConfig, SuiBadgeSize, SuiBadgeType, SuiBadgeVariant, SuiBannerStyle, SuiBannerVariant, SuiBrandLogoCompany, SuiBrandLogoSize, SuiBrandLogoStyle, SuiBreadcrumbDivider, SuiBreadcrumbEntry, SuiButtonColor, SuiButtonGroupEntry, SuiButtonGroupItemSize, SuiButtonSize, SuiButtonVariant, SuiCardSize, SuiCardVariant, SuiCheckboxCardType, SuiCheckboxSize, SuiCircularProgressBarColor, SuiCircularProgressBarSize, SuiColorDotColor, SuiCommandMenuItemSize, SuiCommandMenuItemType, SuiCompactAvatarGroupAppearance, SuiCompactAvatarGroupSize, SuiCompactButtonSize, SuiCompactButtonStyle, SuiCompactSelectForInputItem, SuiCompactSelectForInputSize, SuiCompactSelectItem, SuiCompactSelectSize, SuiCompactSelectType, SuiContentCardType, SuiContentDividerItem, SuiContentDividerType, SuiCounterInputSize, SuiDateRange, SuiDatepickerCalendars, SuiDatepickerMode, SuiDayCellType, SuiDividerOrientation, SuiDrawerFooterType, SuiDrawerHeaderSize, SuiDrawerHeaderType, SuiDropdownItemMode, SuiDropdownItemSize, SuiDropdownMenuPopupRole, SuiDropdownMenuPosition, SuiEmojiName, SuiEmojiSize, SuiFancyButtonSize, SuiFancyButtonType, SuiFileIconColor, SuiFileIconSize, SuiFileUploadCardState, SuiFileUploadSize, SuiFilterItemState, SuiFlagName, SuiFlagSize, SuiFormHintSize, SuiFormHintVariant, SuiFormLabelSize, SuiImageUploadProfileAlignment, SuiImageUploadProfileType, SuiImageUploadShape, SuiImageUploadSize, SuiInlineSelectItem, SuiInlineSelectType, SuiInputSize, SuiInputType, SuiIntegrationSwitchAppearance, SuiIntegrationSwitchType, SuiKbdVariant, SuiKeyIconColor, SuiKeyIconSize, SuiKeyIconStyle, SuiLinkButtonSize, SuiLinkButtonVariant, SuiModalIconVariant, SuiModalSize, SuiModalStatusAlignment, SuiNavbarVisibility, SuiNotificationStyle, SuiNotificationTab, SuiNotificationVariant, SuiOtpInputType, SuiPaginationInfoFormat, SuiPaginationSize, SuiPaginationType, SuiPopoverFooter, SuiPopoverPosition, SuiProgressBarColor, SuiProgressBarLabelType, SuiProgressBarSize, SuiRadioCardType, SuiRadioSize, SuiRadioValue, SuiRatingAlignment, SuiRatingAppearance, SuiRatingReviewLink, SuiRatingSize, SuiRatingType, SuiRichEditorAction, SuiRichEditorCommand, SuiRichEditorItemState, SuiRichEditorItemType, SuiRichEditorLayout, SuiSegmentedControlItem, SuiSegmentedControlSize, SuiSelectOption, SuiSelectSize, SuiSelectType, SuiSidebarIndicatorColor, SuiSidebarItem, SuiSidebarMobileMode, SuiSidebarProfile, SuiSliderType, SuiSocialButtonBrand, SuiSocialButtonStyle, SuiStatusBadgeAppearance, SuiStatusBadgeStatus, SuiStepperItem, SuiStepperSize, SuiStepperState, SuiStepperVariant, SuiStoreCardData, SuiSwitchCardType, SuiSwitchSize, SuiTabBar, SuiTabChipItem, SuiTabMenuHorizontalItem, SuiTabMenuHorizontalSize, SuiTabMenuVerticalItem, SuiTabMenuVerticalStyle, SuiTableCellMisc, SuiTableCellPriority, SuiTableColumn, SuiTableSize, SuiTagInputSize, SuiTagStyle, SuiTimeDurationPreset, SuiTimeFormat, SuiTimePeriod, SuiTimePickerItemDirection, SuiTimePickerStatusType, SuiTimeValue, SuiToastAction, SuiToastData, SuiToastItem, SuiToastPosition, SuiToastStyle, SuiToastVariant, SuiTooltipLargeData, SuiTooltipPosition, SuiTooltipSize, SuiTooltipTheme };
11356
+ export { DAY_LABELS_ES, DEFAULT_DURATION_PRESETS, DEFAULT_PRESETS, EMPTY_STATE_FOX_EMOJI, SUI_BRAND_LOGO_COMPANIES, SUI_COLOR_DOT_COLORS, SUI_COLOR_DOT_HEX, SUI_CUSTOM_ICONS, SUI_EMOJI_MAP, SUI_FLAG_NAMES, SUI_HEX_TO_COLOR, SUI_KEY_ICON_COLORS, SUI_KEY_ICON_SIZES, SUI_NAVBAR_VISIBILITY, SUI_PRODUCT_FALLBACK_COLORS, SUI_TAB_BAR, SuiAccordion, SuiActivityFeed, SuiActivityFilter, SuiAlert, SuiAppStoreBadge, SuiAvatar, SuiAvatarGroup, SuiBadge, SuiBanner, SuiBrandLogo, SuiBreadcrumbItem, SuiBreadcrumbs, SuiButton, SuiButtonGroup, SuiButtonGroupItem, SuiCard, SuiCheckbox, SuiCheckboxCard, SuiCheckboxLabel, SuiCircularProgressBar, SuiColorDot, SuiColorPicker, SuiCommandMenuFooter, SuiCommandMenuItem, SuiCommandMenuSearch, SuiCompactAvatarGroup, SuiCompactButton, SuiCompactSelect, SuiCompactSelectForInput, SuiContentCard, SuiContentDivider, SuiCounterInput, SuiDateSelector, SuiDatepicker, SuiDayCell, SuiDayLabel, SuiDivider, SuiDrawerFooter, SuiDrawerHeader, SuiDropdownCaption, SuiDropdownItem, SuiDropdownMenu, SuiDropdownPanel, SuiDropdownSearch, SuiEmoji, SuiEmptyState, SuiFancyButton, SuiFileIcon, SuiFileUpload, SuiFileUploadCard, SuiFilterBar, SuiFilterItem, SuiFilterPanelFooter, SuiFilterPanelHeader, SuiFlag, SuiFormHint, SuiFormLabel, SuiIcon, SuiImageUpload, SuiImageUploadProfile, SuiImgRetry, SuiInlineInput, SuiInlineSelect, SuiInput, SuiIntegrationSwitch, SuiKbd, SuiKeyIcon, SuiLinkButton, SuiModal, SuiModalFooter, SuiModalHeader, SuiModalSheet, SuiNotification, SuiNotificationFooter, SuiNotificationTabMenu, SuiOtpInput, SuiPageHeader, SuiPagination, SuiPeriodRange, SuiPopover, SuiProductCard, SuiProgressBar, SuiProgressBarLabel, SuiRadio, SuiRadioCard, SuiRadioGroup, SuiRadioLabel, SuiRating, SuiRichEditor, SuiRichEditorItem, SuiSegmentedControl, SuiSelect, SuiSidebar, SuiSlider, SuiSocialButton, SuiStatusBadge, SuiStepper, SuiStoreCard, SuiSwitch, SuiSwitchCard, SuiSwitchLabel, SuiTabChips, SuiTabMenuHorizontal, SuiTabMenuVertical, SuiTable, SuiTableCellDirective, SuiTag, SuiTagInput, SuiTextarea, SuiTimePicker, SuiTimePickerDuration, SuiTimePickerItem, SuiTimePickerStatus, SuiToastOutlet, SuiToastService, SuiTooltip, SuiTooltipPanel, buildCalendarGrid, buildHourList, buildMinuteList, formatDateInput, formatDateShort, formatMonthYear, formatTime, isSameTime, normalizeHex, pad2, parseTime, to12h, to24h };
11357
+ export type { CalendarCell, CalendarRow, DatepickerPreset, DatepickerPresetId, SuiAccordionFlipIcon, SuiActivityAvatarRef, SuiActivityFeedItem, SuiActivityFile, SuiActivityFilterState, SuiActivityTask, SuiActivityTaskState, SuiAlertAction, SuiAlertSize, SuiAlertStyle, SuiAlertVariant, SuiAppStoreBadgeAppearance, SuiAppStoreBadgeCompany, SuiAvatarColor, SuiAvatarConfig, SuiAvatarGroupItem, SuiAvatarSize, SuiAvatarStatus, SuiAvatarTopBadge, SuiBadgeColor, SuiBadgeConfig, SuiBadgeSize, SuiBadgeType, SuiBadgeVariant, SuiBannerStyle, SuiBannerVariant, SuiBrandLogoCompany, SuiBrandLogoSize, SuiBrandLogoStyle, SuiBreadcrumbDivider, SuiBreadcrumbEntry, SuiButtonColor, SuiButtonGroupEntry, SuiButtonGroupItemSize, SuiButtonSize, SuiButtonVariant, SuiCardSize, SuiCardVariant, SuiCheckboxCardType, SuiCheckboxSize, SuiCircularProgressBarColor, SuiCircularProgressBarSize, SuiColorDotColor, SuiCommandMenuItemSize, SuiCommandMenuItemType, SuiCompactAvatarGroupAppearance, SuiCompactAvatarGroupSize, SuiCompactButtonSize, SuiCompactButtonStyle, SuiCompactSelectForInputItem, SuiCompactSelectForInputSize, SuiCompactSelectItem, SuiCompactSelectSize, SuiCompactSelectType, SuiContentCardType, SuiContentDividerItem, SuiContentDividerType, SuiCounterInputSize, SuiDateRange, SuiDatepickerCalendars, SuiDatepickerMode, SuiDayCellType, SuiDividerOrientation, SuiDrawerFooterType, SuiDrawerHeaderSize, SuiDrawerHeaderType, SuiDropdownItemMode, SuiDropdownItemSize, SuiDropdownMenuPopupRole, SuiDropdownMenuPosition, SuiEmojiName, SuiEmojiSize, SuiEmptyStateAction, SuiFancyButtonSize, SuiFancyButtonType, SuiFileIconColor, SuiFileIconSize, SuiFileUploadCardFile, SuiFileUploadCardState, SuiFileUploadSize, SuiFilterItemState, SuiFlagName, SuiFlagSize, SuiFooterButtonConfig, SuiFormHintSize, SuiFormHintVariant, SuiFormLabelSize, SuiImageUploadProfileAlignment, SuiImageUploadProfileLabels, SuiImageUploadProfileType, SuiImageUploadShape, SuiImageUploadSize, SuiInlineSelectItem, SuiInlineSelectType, SuiInputSize, SuiInputType, SuiIntegrationManageConfig, SuiIntegrationSwitchAppearance, SuiIntegrationSwitchType, SuiKbdVariant, SuiKeyIconColor, SuiKeyIconSize, SuiKeyIconStyle, SuiLinkButtonSize, SuiLinkButtonVariant, SuiLinkConfig, SuiModalHeaderVariant, SuiModalIconVariant, SuiModalSize, SuiModalStatusAlignment, SuiNavbarVisibility, SuiNotificationStyle, SuiNotificationTab, SuiNotificationVariant, SuiOtpInputType, SuiPaginationInfoFormat, SuiPaginationSize, SuiPaginationType, SuiPopoverFooter, SuiPopoverPosition, SuiProductCardFallback, SuiProductCardImage, SuiProgressBarColor, SuiProgressBarLabelType, SuiProgressBarSize, SuiRadioCardType, SuiRadioSize, SuiRadioValue, SuiRatingAlignment, SuiRatingAppearance, SuiRatingReviewLink, SuiRatingSize, SuiRatingType, SuiRichEditorAction, SuiRichEditorCommand, SuiRichEditorItemState, SuiRichEditorItemType, SuiRichEditorLayout, SuiSegmentedControlItem, SuiSegmentedControlSize, SuiSelectOption, SuiSelectSize, SuiSelectType, SuiSidebarBrandConfig, SuiSidebarIndicatorColor, SuiSidebarItem, SuiSidebarMobileMode, SuiSidebarProfile, SuiSidebarSearchConfig, SuiSliderType, SuiSocialButtonBrand, SuiSocialButtonStyle, SuiStatusBadgeAppearance, SuiStatusBadgeStatus, SuiStepperItem, SuiStepperSize, SuiStepperState, SuiStepperVariant, SuiStoreCardData, SuiSwitchCardType, SuiSwitchSize, SuiTabBar, SuiTabChipItem, SuiTabMenuHorizontalItem, SuiTabMenuHorizontalSize, SuiTabMenuVerticalItem, SuiTabMenuVerticalStyle, SuiTableCellMisc, SuiTableCellPriority, SuiTableColumn, SuiTableSize, SuiTagInputSize, SuiTagStyle, SuiTimeDurationPreset, SuiTimeFormat, SuiTimePeriod, SuiTimePickerItemDirection, SuiTimePickerStatusType, SuiTimeValue, SuiToastAction, SuiToastData, SuiToastItem, SuiToastPosition, SuiToastStyle, SuiToastVariant, SuiTooltipLargeData, SuiTooltipPosition, SuiTooltipSize, SuiTooltipTheme };