@ajuarezso/sui-design-system 0.7.23 → 0.7.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ajuarezso/sui-design-system",
3
- "version": "0.7.23",
3
+ "version": "0.7.25",
4
4
  "description": "SUI Design System — librería de componentes Angular (SUI 2.0).",
5
5
  "license": "UNLICENSED",
6
6
  "publishConfig": {
@@ -1921,6 +1921,9 @@ type SuiCheckboxCardType = 'basic' | 'left-icon' | 'avatar' | 'card-provider' |
1921
1921
  * badge→bordeado con texto disabled-300. CONFIRMADO (262:254/258/259).
1922
1922
  * - Badge "NEW": variant Light color Information (state/information/light +
1923
1923
  * dark), NO primary-base. CONFIRMADO (261:3928). Corregido del naranja previo.
1924
+ * Renderiza un `<sui-badge>` real (homologación familia radio/checkbox card):
1925
+ * defaults color 'blue' (→ state information, fiel Figma) + variant 'light' +
1926
+ * size 'small'; la SuiBadgeConfig del consumer puede overridear los tres.
1924
1927
  * - 6 types completos (basic/left-icon/avatar + card-provider/brand/company via
1925
1928
  * slot proyectado). CONFIRMADO contra los 24 variants.
1926
1929
  *
@@ -1978,7 +1981,9 @@ declare class SuiCheckboxCard implements ControlValueAccessor {
1978
1981
  /** URL de imagen para type='avatar'. Si falla, fallback a iniciales del label. */
1979
1982
  readonly imageUrl: _angular_core.InputSignal<string | null>;
1980
1983
  /** Badge junto al label — string shorthand ('NEW') o SuiBadgeConfig
1981
- (label + color/variant/size, tipado como sui-badge). null = sin badge. */
1984
+ (label + color/variant/size, tipado como sui-badge). Renderiza un
1985
+ `<sui-badge>` real; defaults blue/light/small (information azul, fiel
1986
+ Figma 261:3928). null = sin badge. */
1982
1987
  readonly badge: _angular_core.InputSignal<string | SuiBadgeConfig | null>;
1983
1988
  protected readonly badgeCfg: _angular_core.Signal<SuiBadgeConfig | null>;
1984
1989
  /** Indeterminate state (tri-state checkbox). */
@@ -3044,7 +3049,7 @@ declare class SuiFlag {
3044
3049
  * - SIN border (el input padre tiene su propio border)
3045
3050
  * - SIN focus ring (el input padre maneja el focus state)
3046
3051
  * - SIN error state (heredado del input padre)
3047
- * - X-Small usa flag 16×16 (vs 24×24 del compact-select normal)
3052
+ * - X-Small usa flag 16×16, medium/small 20×20 (mismo patrón que el compact-select normal)
3048
3053
  * - Menu matchea trigger width con minWidth=200
3049
3054
  *
3050
3055
  * `ControlValueAccessor` implementado — funciona con `formControlName`.
@@ -5281,7 +5286,7 @@ declare class SuiFileUpload {
5281
5286
  protected readonly inputRef: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
5282
5287
  protected readonly dragging: _angular_core.WritableSignal<boolean>;
5283
5288
  protected readonly internalError: _angular_core.WritableSignal<string | null>;
5284
- protected readonly state: _angular_core.Signal<"default" | "error" | "disabled" | "dragover">;
5289
+ protected readonly state: _angular_core.Signal<"error" | "default" | "disabled" | "dragover">;
5285
5290
  protected readonly resolvedTitle: _angular_core.Signal<string>;
5286
5291
  protected readonly resolvedSubtitle: _angular_core.Signal<string>;
5287
5292
  protected readonly resolvedErrorMessage: _angular_core.Signal<string | null>;
@@ -6141,6 +6146,9 @@ type SuiInputType = 'text' | 'email' | 'password' | 'number' | 'tel' | 'url' | '
6141
6146
  * @input required: boolean — Muestra asterisco rojo en el label
6142
6147
  * @input tooltip: string | null — Tooltip en ícono info del label
6143
6148
  * @input hint: string | null — Mensaje de ayuda debajo del field
6149
+ * @input hintIcon: string | null — Icono Remix del hint neutral (ej. 'information-fill',
6150
+ * como en el set de Figma 266:5251). null (default) = sin icono. No afecta el
6151
+ * estado error (sui-form-hint conserva su icono default por variant).
6144
6152
  * @input error: boolean — Activa borde rojo + muestra errorMessage
6145
6153
  * @input errorMessage: string | null — Mensaje de error
6146
6154
  *
@@ -6196,6 +6204,15 @@ declare class SuiInput implements ControlValueAccessor {
6196
6204
  readonly errorMessage: _angular_core.InputSignal<string | null>;
6197
6205
  readonly label: _angular_core.InputSignal<string | null>;
6198
6206
  readonly hint: _angular_core.InputSignal<string | null>;
6207
+ /**
6208
+ * Icono Remix del hint neutral (ej. 'information-fill' ⓘ como en el set de
6209
+ * Figma). null (default) = sin icono — comportamiento previo. Aditivo: en
6210
+ * estado error NO aplica (el hint de error mantiene su icono default).
6211
+ */
6212
+ readonly hintIcon: _angular_core.InputSignal<string | null>;
6213
+ /** Icon efectivo para sui-form-hint: solo aplica al hint neutral. En error se
6214
+ pasa undefined → sui-form-hint usa su default por variant (information-fill). */
6215
+ protected readonly _resolvedHintIcon: _angular_core.Signal<string | undefined>;
6199
6216
  readonly autocomplete: _angular_core.InputSignal<string | null>;
6200
6217
  /** Texto secundario del label (ej. "Optional", "Required") */
6201
6218
  readonly sublabel: _angular_core.InputSignal<string | null>;
@@ -6346,7 +6363,7 @@ declare class SuiInput implements ControlValueAccessor {
6346
6363
  registerOnTouched(fn: () => void): void;
6347
6364
  setDisabledState(isDisabled: boolean): void;
6348
6365
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiInput, never>;
6349
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiInput, "sui-input", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "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; }; "autocomplete": { "alias": "autocomplete"; "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; }; "maxlength": { "alias": "maxlength"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "paste": { "alias": "paste"; "required": false; "isSignal": true; }; "prefix": { "alias": "prefix"; "required": false; "isSignal": true; }; "showClear": { "alias": "showClear"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "iconPosition": { "alias": "iconPosition"; "required": false; "isSignal": true; }; "closeOnOutsideClick": { "alias": "closeOnOutsideClick"; "required": false; "isSignal": true; }; "leadingDivider": { "alias": "leadingDivider"; "required": false; "isSignal": true; }; "trailingDivider": { "alias": "trailingDivider"; "required": false; "isSignal": true; }; "leadingControl": { "alias": "leadingControl"; "required": false; "isSignal": true; }; "trailingControl": { "alias": "trailingControl"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, ["[data-slot=start]", "[data-slot=end]"], true, never>;
6366
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiInput, "sui-input", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "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; }; "hintIcon": { "alias": "hintIcon"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "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; }; "maxlength": { "alias": "maxlength"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "paste": { "alias": "paste"; "required": false; "isSignal": true; }; "prefix": { "alias": "prefix"; "required": false; "isSignal": true; }; "showClear": { "alias": "showClear"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "iconPosition": { "alias": "iconPosition"; "required": false; "isSignal": true; }; "closeOnOutsideClick": { "alias": "closeOnOutsideClick"; "required": false; "isSignal": true; }; "leadingDivider": { "alias": "leadingDivider"; "required": false; "isSignal": true; }; "trailingDivider": { "alias": "trailingDivider"; "required": false; "isSignal": true; }; "leadingControl": { "alias": "leadingControl"; "required": false; "isSignal": true; }; "trailingControl": { "alias": "trailingControl"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, ["[data-slot=start]", "[data-slot=end]"], true, never>;
6350
6367
  }
6351
6368
 
6352
6369
  type SuiIntegrationSwitchType = 'horizontal' | 'vertical';
@@ -6512,10 +6529,10 @@ declare class SuiIntegrationSwitch implements ControlValueAccessor {
6512
6529
  * padding: 2px 6px
6513
6530
  * Icon content (16×16):
6514
6531
  * padding: 2px (all sides)
6515
- * color: inherit (consumer del sui-icon decide)
6532
+ * color: var(--text/sub-600) #5c5c5c (forzado por el scss sobre el sui-icon proyectado)
6516
6533
  *
6517
- * Auto-detección: si el contenido proyectado contiene `<sui-icon>` se asume
6518
- * variant `subtle` por default; consumer puede override con `[variant]="default"`.
6534
+ * El variant NO se auto-detecta: default es `default`; para el caso icono el
6535
+ * consumer debe pasar `variant="subtle"` explícito.
6519
6536
  *
6520
6537
  * Uso:
6521
6538
  * <sui-kbd>⌘K</sui-kbd> <!-- text default -->
@@ -7069,13 +7086,11 @@ declare class SuiModalFooter {
7069
7086
  readonly secondaryButton: _angular_core.InputSignal<string | SuiFooterButtonConfig | null>;
7070
7087
  /** Type Stretch de Figma: los botones ocupan todo el ancho (50/50). */
7071
7088
  readonly stretch: _angular_core.InputSignal<boolean>;
7072
- /** Modal padre (por element injector — el footer se declara dentro de
7073
- <sui-modal> en el template del consumer). Null en uso standalone. */
7074
- private readonly modal;
7075
- /** Size explícito de los botones. Si no se pasa, el DS legisla solo
7076
- (fuente única, regla del proyecto): `large` (48px) dentro de un modal
7077
- fullscreen — touch targets móviles — y `small` (36px, canon Figma
7078
- 472:566) en dialogs normales. */
7089
+ /** Size explícito de los botones. Si no se pasa, el DS legisla `large`
7090
+ (48px) en TODOS los modales — decisión de marca del proyecto (2026-07-23):
7091
+ touch target consistente entre dialogs y hojas fullscreen, por encima del
7092
+ canon Figma 472:566 que dibuja `small` (36px). Pasar buttonSize para
7093
+ forzar otro tamaño en un caso puntual. */
7079
7094
  readonly buttonSize: _angular_core.InputSignal<SuiButtonSize | null>;
7080
7095
  protected readonly effectiveButtonSize: _angular_core.Signal<SuiButtonSize>;
7081
7096
  readonly primaryClick: _angular_core.OutputEmitterRef<void>;
@@ -7301,9 +7316,13 @@ type SuiNotificationStyle = 'filled' | 'light' | 'lighter' | 'stroke';
7301
7316
  * derecha (input `showMore` → output `moreClicked`).
7302
7317
  * ────────────────────────────────────────────────────────────────────────────
7303
7318
  *
7304
- * PENDING VERIFY (MCP Figma caído en la homologación 2026-05-29; specs tomados
7305
- * de .claude/sui-audit/reports.json que SÍ tuvo acceso a Figma):
7306
- * - File card: bg-white, border stroke/soft-200, radius-8, shadow xs.
7319
+ * VERIFIED 2026-07-23 (screenshot MCP del set 4308:731 — sella el PENDING
7320
+ * VERIFY heredado de la homologación 2026-05-29):
7321
+ * - Items de panel = filas PLANAS: sin border/shadow propios (el radius-12
7322
+ * solo se manifiesta en el fill bg-weak-50 del hover, redondeado en Figma).
7323
+ * - File card: hug-content con icono attachment-line 16 + "(4mb)" muted
7324
+ * (soft-400); bg-white, border stroke/soft-200, radius-8, shadow xs.
7325
+ * - Message bubble: hug-content (radius asimétrico tl4 tr8 br10 bl8 OK).
7307
7326
  * - Button-type: Deny stroke + Approve filled, px-10 py-6 radius-8.
7308
7327
  * - Company logo: 16×16 circle, antes del texto de descripción.
7309
7328
  * - Hover: bg --sui-bg-weak-50 (#f7f7f7) + more-2-line 20px compact radius-6.
@@ -7486,13 +7505,15 @@ declare class SuiOtpInput implements ControlValueAccessor {
7486
7505
  * SUI Page Header — header reutilizable para cada page del empresa.
7487
7506
  *
7488
7507
  * Reemplaza al topbar contextual en mobile. Cada page lo coloca arriba del
7489
- * todo (antes de cualquier contenido). Absorbe el safe-area-inset-top y
7490
- * deja un espacio visual coherente entre pages.
7508
+ * todo (antes de cualquier contenido) y deja un espacio visual coherente
7509
+ * entre pages. El safe-area-inset-top lo maneja el layout/container de la
7510
+ * página, NO este componente (padding vertical fijo, sin env()).
7491
7511
  *
7492
7512
  * Slots:
7493
- * - default → contenido principal (cards, listas, etc.)
7494
7513
  * - [slot=actions] → botones a la derecha (siempre visibles, no scrollean
7495
7514
  * con la página). Útil para "Guardar", "Agregar", filtros.
7515
+ * No hay slot default: el contenido de la página va DESPUÉS del header,
7516
+ * no dentro — cualquier contenido proyectado sin slot="actions" se descarta.
7496
7517
  *
7497
7518
  * Inputs:
7498
7519
  * - title: string visible (h1)
@@ -7994,13 +8015,13 @@ type SuiRadioCardType = 'basic' | 'left-icon' | 'avatar' | 'card-provider' | 'br
7994
8015
  * (el component_set no publica variant Focus distinto del Hover/Active). Es
7995
8016
  * extensión de a11y del proyecto, no rompe fidelidad visual con Figma.
7996
8017
  *
7997
- * NOT IMPLEMENTED (Figma types sin uso real en el proyecto — over-engineering NOW):
7998
- * - type='card-provider' (515:4374): slot 32×24 radius-4 para logo de tarjeta.
7999
- * - type='brand' (515:4383): slot 40×40 logo externo sin frame.
8000
- * - type='company' (515:4392): slot 40×40 circle con bg color del consumer.
8001
- * Cero consumers en el repo (los type=brand/company existentes son de
8002
- * sui-command-menu-item, no de este card). Agregarlos implica content
8003
- * projection + assets de marca. Diferido — agregar cuando surja el caso.
8018
+ * IMPLEMENTED 2026-07-21 (types completos del set Figma):
8019
+ * - type='card-provider' (515:4374): slot 32×24 radius-4 para logo de tarjeta
8020
+ * (imageUrl).
8021
+ * - type='brand' (515:4383): slot 40×40 logo externo sin frame
8022
+ * (sui-brand-logo via [brand], o imageUrl circular de fallback).
8023
+ * - type='company' (515:4392): slot 40×40 circle radius-full
8024
+ * (imageUrl, fallback sui-avatar con iniciales del label).
8004
8025
  *
8005
8026
  * Form integration:
8006
8027
  * - Implementa ControlValueAccessor: usable con [(ngModel)] / [formControl].
@@ -8223,6 +8244,8 @@ interface SuiRatingCellView {
8223
8244
  * + border stroke/soft-200 + regular-shadow x-small (0 1px 2px rgba(10,13,20,.03));
8224
8245
  * hover → bg weak-50 sin border ni shadow. Es la versión "tarjeta" del input de
8225
8246
  * estrellas/corazones (distinta del bare 'inline' y del segmented 'bar').
8247
+ * Estado EMPTY: glyph RELLENO gris sólido ("Empty Filled" star-fill/heart-3-fill
8248
+ * en stroke/sub-300), NO el outline del inline — ver cellIconName().
8226
8249
  * - 'bar' → 5 cells horizontales con border + padding (matches Rating Bar).
8227
8250
  * Usado para input formulario (modal review en order-tracking, rate-order
8228
8251
  * CSAT survey). Permite type='emoji'|'number' además de star/heart.
@@ -8241,9 +8264,10 @@ interface SuiRatingCellView {
8241
8264
  * selected agrega bg weak-50. emoji: solo selected sale de grayscale.
8242
8265
  *
8243
8266
  * PENDING VERIFY (revisar en device / master-preview tras deploy):
8244
- * - 'cell' appearance: confirmar visual contra Figma 532:4160 con MCP sano
8245
- * (padding 12 / radius 10 / icon 32 / shadow x-small). Pendiente: el screenshot
8246
- * no se pudo verificar al implementar (Figma MCP caído por timeout).
8267
+ * - 'cell' appearance: screenshot MCP de 532:4160 verificado 2026-07-23 —
8268
+ * confirmó que el empty es glyph RELLENO gris (fix aplicado en cellIconName).
8269
+ * Queda pendiente medir chrome fino en device (padding 12 / radius 10 /
8270
+ * icon 32 / shadow x-small).
8247
8271
  * - 'bar-area' homologado a Figma 535:5057: card 132px = bar 36px + input 96px;
8248
8272
  * textarea resize:none, min-height 72px, top-aligned (text node y=12 en Figma)
8249
8273
  * - hover 'Empty Filled' star/heart: glyph relleno sólido en stroke/sub-300
@@ -8373,6 +8397,15 @@ declare class SuiRating implements ControlValueAccessor {
8373
8397
  setDisabledState(isDisabled: boolean): void;
8374
8398
  /** Map del fill al icon name de Remix. */
8375
8399
  iconName(type: SuiRatingType, fill: 'empty' | 'half' | 'full'): string;
8400
+ /**
8401
+ * Icon name para el template iconCell (appearances 'inline' y 'cell').
8402
+ * En appearance='cell' el estado EMPTY renderiza el glyph RELLENO gris
8403
+ * (star-fill / heart-3-fill en stroke/sub-300) — Figma Rating Cell 532:4160
8404
+ * usa el atom "Empty Filled" (relleno sólido neutro), NO el outline
8405
+ * "Empty Line" del inline. Verificado contra screenshot MCP 2026-07-23.
8406
+ * inline mantiene el outline (Rating Items 532:4137 / Rating Review 532:4340).
8407
+ */
8408
+ cellIconName(fill: 'empty' | 'half' | 'full'): string;
8376
8409
  /**
8377
8410
  * Icon name para una celda de bar/bar-area según su estado visual (Figma 535:4535).
8378
8411
  * El glyph de HOVER ("Empty Filled") y SELECTED ("Full") es el mismo relleno sólido
@@ -8613,7 +8646,8 @@ declare class SuiSelect<T = any> implements ControlValueAccessor {
8613
8646
  RemixIcon custom, false = sin icono (default: opt-in). Consolida el par
8614
8647
  leftIcon (boolean) + leadingIcon (string) previo. */
8615
8648
  readonly leadingIcon: _angular_core.InputSignal<string | boolean>;
8616
- /** sui-flag name para `type="country"` (override; sino el option selected puede traerla). */
8649
+ /** sui-flag name para `type="country"` — se muestra SOLO con selección hecha;
8650
+ en estado vacío el left slot renderea el globo (global-line), fiel a Figma. */
8617
8651
  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>;
8618
8652
  /** Imagen del left slot cuando hay value (avatar/brand/provider/company logo). */
8619
8653
  readonly imageUrl: _angular_core.InputSignal<string | null>;
@@ -9559,10 +9593,12 @@ type SuiSwitchCardType = 'basic' | 'left-icon' | 'avatar' | 'card-provider' | 'b
9559
9593
  * - Sublabel: 12/16 regular sub-600
9560
9594
  * - Description: 12/16 regular sub-600
9561
9595
  * - Title row gap: 4px, Body gap: 4px
9562
- * - Built-in NEW badge: padding 2/8, radius 999, bg state/information/light, text
9563
- * state/information/dark, 11/12 500 0.22px uppercase. Color INFORMATION azul,
9564
- * fiel a Figma (DECISIONES.md §1: para este badge "se cambió a azul (fiel Figma)";
9565
- * el naranja de marca aplica solo al active border / focus ring).
9596
+ * - Badge junto al label: <sui-badge> real honrando SuiBadgeConfig
9597
+ * (color/variant/size). Defaults blue/light/small = bg state/information/light,
9598
+ * text state/information/dark, 11/12 500 0.22px uppercase, padding 2/8,
9599
+ * radius 999 — color INFORMATION azul, fiel a Figma (DECISIONES.md §1: para
9600
+ * este badge "se cambió a azul (fiel Figma)"; el naranja de marca aplica solo
9601
+ * al active border / focus ring).
9566
9602
  *
9567
9603
  * LEADING SLOTS (verified vs Figma 2026-05-29, pull per-type design-context):
9568
9604
  * - basic → sin leading.
@@ -9595,8 +9631,8 @@ type SuiSwitchCardType = 'basic' | 'left-icon' | 'avatar' | 'card-provider' | 'b
9595
9631
  * - Switch internal margin-top 2px para baseline align: convención visual.
9596
9632
  *
9597
9633
  * COLOR MAPPING:
9598
- * #c0d5ff → --sui-state-information-light (NEW badge bg, fiel Figma)
9599
- * #122368 → --sui-state-information-dark (NEW badge text, fiel Figma)
9634
+ * #c0d5ff → --sui-state-information-light (badge default bg, via sui-badge blue/light)
9635
+ * #122368 → --sui-state-information-dark (badge default text, via sui-badge blue/light)
9600
9636
  * No hex hardcoded fuera de los fallbacks de los tokens.
9601
9637
  *
9602
9638
  * Form integration:
@@ -10167,6 +10203,8 @@ interface SuiTabMenuHorizontalItem<T = string> {
10167
10203
  declare class SuiTabMenuHorizontal<T = string> {
10168
10204
  readonly tabs: _angular_core.InputSignal<SuiTabMenuHorizontalItem<T>[]>;
10169
10205
  readonly active: _angular_core.ModelSignal<T | undefined>;
10206
+ /** PENDING spec: hoy solo emite data-sui-size (sin reglas scss) y el set de
10207
+ Figma no tiene eje size. Se conserva por compat de consumers. */
10170
10208
  readonly size: _angular_core.InputSignal<SuiTabMenuHorizontalSize>;
10171
10209
  readonly tabChange: _angular_core.OutputEmitterRef<T>;
10172
10210
  isActive(tab: SuiTabMenuHorizontalItem<T>): boolean;
@@ -11045,6 +11083,11 @@ declare class SuiTimePicker implements ControlValueAccessor {
11045
11083
  protected readonly triggerEl: _angular_core.Signal<ElementRef<HTMLElement> | undefined>;
11046
11084
  /** Ref al sui-dropdown-menu interno — para invocar open/close (modo popover). */
11047
11085
  private readonly _menu;
11086
+ /** Columnas scrollables del panel (hora / minuto / periodo) — la query
11087
+ alcanza también la embedded view proyectada al CDK Overlay porque el
11088
+ ng-template se declara en este componente. */
11089
+ private readonly _columnEls;
11090
+ private readonly _injector;
11048
11091
  private _onChange;
11049
11092
  private _onTouched;
11050
11093
  constructor();
@@ -11063,6 +11106,14 @@ declare class SuiTimePicker implements ControlValueAccessor {
11063
11106
  hourLabelOf(item: ColumnItem): string;
11064
11107
  toggle(): void;
11065
11108
  openPopover(): void;
11109
+ /**
11110
+ * Scrollea cada columna (hora / minuto / periodo) para que su opción activa
11111
+ * quede centrada en el viewport de la columna (equivalente a block: 'center').
11112
+ * Instantáneo (sin behavior smooth): al abrir, el panel aparece ya
11113
+ * posicionado. Con step que no contiene el minuto exacto (-1) la columna se
11114
+ * deja en su scroll actual.
11115
+ */
11116
+ private _scrollColumnsToSelection;
11066
11117
  cancel(): void;
11067
11118
  apply(): void;
11068
11119
  /**