@ajuarezso/sui-design-system 0.14.3 → 0.15.1

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.14.3",
3
+ "version": "0.15.1",
4
4
  "description": "SUI Design System — librería de componentes Angular (SUI 2.0).",
5
5
  "license": "UNLICENSED",
6
6
  "publishConfig": {
@@ -1587,7 +1587,7 @@ declare class SuiButtonGroupItem {
1587
1587
  /** aria-label para icon-only buttons */
1588
1588
  readonly ariaLabel: _angular_core.InputSignal<string>;
1589
1589
  /** Estado del data-attribute para CSS scoping */
1590
- readonly state: _angular_core.Signal<"disabled" | "default" | "active">;
1590
+ readonly state: _angular_core.Signal<"default" | "active" | "disabled">;
1591
1591
  /** True cuando solo tiene icon (left o right) sin label */
1592
1592
  readonly onlyIcon: _angular_core.Signal<boolean>;
1593
1593
  /**
@@ -1598,7 +1598,7 @@ declare class SuiButtonGroupItem {
1598
1598
  * - 'both' → ambos iconos: padding cuadrado (p)
1599
1599
  * - 'only' → icon-only: padding cuadrado (p) → square box
1600
1600
  */
1601
- readonly iconLayout: _angular_core.Signal<"left" | "right" | "none" | "both" | "only">;
1601
+ readonly iconLayout: _angular_core.Signal<"none" | "left" | "right" | "both" | "only">;
1602
1602
  /** Tamaño del icono en px según size del item (small/xsmall=20, 2xsmall=16) */
1603
1603
  readonly iconSize: _angular_core.Signal<number>;
1604
1604
  readonly clicked: _angular_core.OutputEmitterRef<void>;
@@ -1759,7 +1759,7 @@ declare class SuiButton {
1759
1759
  readonly disabled: _angular_core.InputSignal<boolean>;
1760
1760
  readonly leftIcon: _angular_core.InputSignal<string | null>;
1761
1761
  readonly rightIcon: _angular_core.InputSignal<string | null>;
1762
- readonly type: _angular_core.InputSignal<"button" | "submit" | "reset">;
1762
+ readonly type: _angular_core.InputSignal<"button" | "reset" | "submit">;
1763
1763
  /** Intercept click/Enter/Space — cuando type=submit, busca el form padre y
1764
1764
  dispara requestSubmit(). Reset hace lo mismo con form.reset(). Disabled
1765
1765
  bloquea todo. */
@@ -2143,7 +2143,7 @@ declare class SuiCheckboxCard implements ControlValueAccessor {
2143
2143
  /** RemixIcon name (sin prefijo "ri-") para type='left-icon'. */
2144
2144
  readonly icon: _angular_core.InputSignal<string | null>;
2145
2145
  /** Emoji del catálogo SUI_EMOJI_MAP — alternativa a icon para type='left-icon'. */
2146
- 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>;
2146
+ 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>;
2147
2147
  /** URL directa al emoji para type='left-icon'. Precedencia: icon > emoji > iconSrc. */
2148
2148
  readonly iconSrc: _angular_core.InputSignal<string | null>;
2149
2149
  /** URL de imagen para type='avatar'. Si falla, fallback a iniciales del label. */
@@ -2265,7 +2265,7 @@ declare class SuiLinkButton {
2265
2265
  readonly href: _angular_core.InputSignal<string | null>;
2266
2266
  readonly target: _angular_core.InputSignal<string | null>;
2267
2267
  readonly rel: _angular_core.InputSignal<string | null>;
2268
- readonly type: _angular_core.InputSignal<"button" | "submit" | "reset">;
2268
+ readonly type: _angular_core.InputSignal<"button" | "reset" | "submit">;
2269
2269
  readonly ariaLabel: _angular_core.InputSignal<string | null>;
2270
2270
  readonly clicked: _angular_core.OutputEmitterRef<MouseEvent>;
2271
2271
  readonly iconSize: _angular_core.Signal<number>;
@@ -2584,7 +2584,7 @@ declare class SuiColorDot {
2584
2584
  * - `selected` → dot 12×12 + ring 2px.
2585
2585
  * - `disabled` → dot gris pálido, sin pointer events.
2586
2586
  */
2587
- readonly state: _angular_core.InputSignal<"disabled" | "default" | "hover" | "selected">;
2587
+ readonly state: _angular_core.InputSignal<"default" | "disabled" | "hover" | "selected">;
2588
2588
  /** aria-label override. */
2589
2589
  readonly ariaLabel: _angular_core.InputSignal<string>;
2590
2590
  readonly clicked: _angular_core.OutputEmitterRef<void>;
@@ -3171,7 +3171,7 @@ declare class SuiCompactButton {
3171
3171
  readonly href: _angular_core.InputSignal<string | null>;
3172
3172
  readonly target: _angular_core.InputSignal<string | null>;
3173
3173
  readonly rel: _angular_core.InputSignal<string | null>;
3174
- readonly type: _angular_core.InputSignal<"button" | "submit" | "reset">;
3174
+ readonly type: _angular_core.InputSignal<"button" | "reset" | "submit">;
3175
3175
  readonly ariaLabel: _angular_core.InputSignal<string>;
3176
3176
  readonly clicked: _angular_core.OutputEmitterRef<MouseEvent>;
3177
3177
  readonly iconSize: _angular_core.Signal<number>;
@@ -4310,7 +4310,7 @@ declare class SuiDayCell {
4310
4310
  /** Type=Basic (default) o Range (entre extremos / extremo del range). */
4311
4311
  readonly type: _angular_core.InputSignal<SuiDayCellType>;
4312
4312
  /** Position dentro del range — solo aplica si type=range. */
4313
- readonly rangePosition: _angular_core.InputSignal<"start" | "end" | "in" | null>;
4313
+ readonly rangePosition: _angular_core.InputSignal<"end" | "start" | "in" | null>;
4314
4314
  /** Selected (mode date) o range extremo (start/end con bg primary). */
4315
4315
  readonly selected: _angular_core.InputSignal<boolean>;
4316
4316
  /** Marker dot (evento / pedido / disponibilidad). */
@@ -5037,7 +5037,7 @@ type SuiEmojiName = keyof typeof SUI_EMOJI_MAP;
5037
5037
  type SuiEmojiSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'full';
5038
5038
  declare class SuiEmoji {
5039
5039
  /** Nombre del emoji del catálogo. Si se proveé `src`, este se ignora. */
5040
- 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>;
5040
+ 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>;
5041
5041
  /** URL directa al emoji (override del catálogo). Útil para usar emojis fuera del map. */
5042
5042
  readonly src: _angular_core.InputSignal<string | null>;
5043
5043
  /** Tamaño del emoji. */
@@ -5226,7 +5226,7 @@ declare class SuiFancyButton {
5226
5226
  readonly href: _angular_core.InputSignal<string | null>;
5227
5227
  readonly target: _angular_core.InputSignal<string | null>;
5228
5228
  readonly rel: _angular_core.InputSignal<string | null>;
5229
- readonly htmlType: _angular_core.InputSignal<"button" | "submit" | "reset">;
5229
+ readonly htmlType: _angular_core.InputSignal<"button" | "reset" | "submit">;
5230
5230
  readonly ariaLabel: _angular_core.InputSignal<string | null>;
5231
5231
  readonly clicked: _angular_core.OutputEmitterRef<MouseEvent>;
5232
5232
  readonly iconSize: _angular_core.Signal<number>;
@@ -5448,7 +5448,7 @@ declare class SuiFileUploadCard {
5448
5448
  /** Default status text por state — override-able vía input. */
5449
5449
  protected readonly resolvedStatusText: _angular_core.Signal<string>;
5450
5450
  /** Status icon name por state (Remix Icons). */
5451
- protected readonly statusIconName: _angular_core.Signal<"checkbox-circle-fill" | "error-warning-fill" | "loader-2-fill">;
5451
+ protected readonly statusIconName: _angular_core.Signal<"error-warning-fill" | "checkbox-circle-fill" | "loader-2-fill">;
5452
5452
  /** Compact button (right-side) icon name por state. */
5453
5453
  protected readonly actionIconName: _angular_core.Signal<"close-line" | "delete-bin-line">;
5454
5454
  /** Progress 0–100 clamped. */
@@ -5543,13 +5543,13 @@ declare class SuiFileUpload {
5543
5543
  protected readonly inputRef: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
5544
5544
  protected readonly dragging: _angular_core.WritableSignal<boolean>;
5545
5545
  protected readonly internalError: _angular_core.WritableSignal<string | null>;
5546
- protected readonly state: _angular_core.Signal<"error" | "disabled" | "default" | "dragover">;
5546
+ protected readonly state: _angular_core.Signal<"error" | "default" | "dragover" | "disabled">;
5547
5547
  protected readonly resolvedTitle: _angular_core.Signal<string>;
5548
5548
  protected readonly resolvedSubtitle: _angular_core.Signal<string>;
5549
5549
  protected readonly resolvedErrorMessage: _angular_core.Signal<string | null>;
5550
5550
  /** Icon size px. Figma verified = 24 (medium). small/large/xlarge escalan +4
5551
5551
  * (small 20 → medium 24 → large 28 → xlarge 32) — extensión de proyecto. */
5552
- protected readonly iconSize: _angular_core.Signal<20 | 24 | 32 | 28>;
5552
+ protected readonly iconSize: _angular_core.Signal<32 | 20 | 24 | 28>;
5553
5553
  onClick(): void;
5554
5554
  /** Browse File button — abre el picker. stopPropagation evita doble-open
5555
5555
  * (el host también es clickeable). */
@@ -6193,7 +6193,7 @@ declare class SuiImageUpload {
6193
6193
  * (matchea el escalado del contenedor 32→40 en SCSS). */
6194
6194
  protected readonly iconSize: _angular_core.Signal<16 | 20>;
6195
6195
  protected readonly hasSrc: _angular_core.Signal<boolean>;
6196
- protected readonly state: _angular_core.Signal<"disabled" | "filled" | "dragover" | "empty">;
6196
+ protected readonly state: _angular_core.Signal<"dragover" | "filled" | "disabled" | "empty">;
6197
6197
  protected readonly resolvedTitle: _angular_core.Signal<string>;
6198
6198
  protected readonly resolvedSubtitle: _angular_core.Signal<string>;
6199
6199
  onHostClick(): void;
@@ -7234,8 +7234,34 @@ declare class SuiModal implements AfterViewInit, OnDestroy {
7234
7234
  readonly backdropBlur: _angular_core.InputSignal<boolean>;
7235
7235
  /** Solo afecta en mobile (≤768px): el modal toma todo el ancho desde safe-area-top
7236
7236
  hasta safe-area-bottom, deja el área superior visible (status bar respetado),
7237
- y se eleva con el teclado. En desktop el modal funciona como `size` indica. */
7238
- readonly fullscreen: _angular_core.InputSignal<boolean>;
7237
+ y se eleva con el teclado. En desktop el modal funciona como `size` indica.
7238
+ *
7239
+ * `'auto'` (default) resuelve por plataforma: **dentro de la app nativa va a
7240
+ * pantalla completa, en el navegador móvil queda centrado**. Es lo que
7241
+ * distingue a una app de una web abierta en el teléfono, y hacerlo acá evita
7242
+ * que cada pantalla tenga que acordarse — venía puesto a mano modal por
7243
+ * modal, y de 37 fullscreen de la app 28 se lo habían olvidado.
7244
+ *
7245
+ * `true` fuerza pantalla completa también en la web móvil; `false` la
7246
+ * desactiva siempre. Ese `false` explícito es para las confirmaciones de una
7247
+ * línea con dos botones («¿Cancelar pedido?»): ocupar toda la pantalla para
7248
+ * preguntar sí o no comunica que es un paso más grande de lo que es. */
7249
+ readonly fullscreen: _angular_core.InputSignal<boolean | "auto">;
7250
+ /** ¿Corre dentro de la app nativa? Se lee del DOM y NO del runtime de
7251
+ * Capacitor: el design system no puede depender de la app que lo usa. La
7252
+ * clase la pone el host al arrancar, y es el mismo marcador que este SCSS ya
7253
+ * usa para el safe-area de Android. */
7254
+ private static enApp;
7255
+ /** Se lee al construir CADA modal y no dentro del computed: `enApp()` mira el
7256
+ * DOM y no es una señal, así que un `computed` la evaluaría una sola vez y se
7257
+ * quedaría con esa respuesta para siempre. Si el host marca la plataforma
7258
+ * después de ese primer render —o si el DS se evalúa antes que el arranque de
7259
+ * la app—, el modal quedaría centrado dentro de la app y nadie se enteraría.
7260
+ * Leerlo por instancia da la respuesta vigente cuando el modal nace, que es
7261
+ * cuando importa. */
7262
+ private readonly enAppAlNacer;
7263
+ /** `fullscreen` ya resuelto: es lo que miran la plantilla y el host. */
7264
+ protected readonly esFullscreen: _angular_core.Signal<boolean>;
7239
7265
  /** Quita el padding del body para contenido full-bleed (mapas, imágenes
7240
7266
  grandes). El consumer es responsable de su propio spacing interno. */
7241
7267
  readonly fullBody: _angular_core.InputSignal<boolean>;
@@ -8527,7 +8553,7 @@ declare class SuiRadioCard implements ControlValueAccessor {
8527
8553
  * Emoji del catálogo SUI_EMOJI_MAP — alternativa a icon para type='left-icon'.
8528
8554
  * Si ambos están, icon tiene precedencia.
8529
8555
  */
8530
- 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>;
8556
+ 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>;
8531
8557
  /**
8532
8558
  * URL directa al emoji para type='left-icon'. Útil cuando el consumer ya tiene
8533
8559
  * la URL (ej. FLUENT_EMOJI map del proyecto) y no quiere registrar el emoji
@@ -9609,7 +9635,7 @@ declare class SuiSocialButton {
9609
9635
  readonly href: _angular_core.InputSignal<string | null>;
9610
9636
  readonly target: _angular_core.InputSignal<string | null>;
9611
9637
  readonly rel: _angular_core.InputSignal<string | null>;
9612
- readonly type: _angular_core.InputSignal<"button" | "submit" | "reset">;
9638
+ readonly type: _angular_core.InputSignal<"button" | "reset" | "submit">;
9613
9639
  readonly ariaLabel: _angular_core.InputSignal<string | null>;
9614
9640
  readonly clicked: _angular_core.OutputEmitterRef<MouseEvent>;
9615
9641
  /** Disabled efectivo: el input disabled O el estado loading. */
@@ -9721,7 +9747,7 @@ declare class SuiStatusBadge {
9721
9747
  */
9722
9748
  readonly withDot: _angular_core.InputSignal<boolean>;
9723
9749
  /** Icono Remix mapeado al status. Solo se usa cuando withDot=false. */
9724
- readonly iconName: _angular_core.Signal<"checkbox-circle-fill" | "alert-fill" | "error-warning-fill" | "information-fill" | "forbid-fill">;
9750
+ readonly iconName: _angular_core.Signal<"error-warning-fill" | "alert-fill" | "checkbox-circle-fill" | "information-fill" | "forbid-fill">;
9725
9751
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SuiStatusBadge, never>;
9726
9752
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<SuiStatusBadge, "sui-status-badge", never, { "status": { "alias": "status"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "withDot": { "alias": "withDot"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
9727
9753
  }
@@ -10168,7 +10194,7 @@ declare class SuiSwitchCard implements ControlValueAccessor {
10168
10194
  * `<sui-icon>` proyectado vía `[sui-switch-card-leading]` y se renderiza
10169
10195
  * con las MISMAS dimensiones (20×20 dentro del círculo de 40px).
10170
10196
  */
10171
- 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>;
10197
+ 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>;
10172
10198
  /**
10173
10199
  * URL de imagen para type='avatar' — se renderiza con sui-avatar size=lg
10174
10200
  * (40×40 redonda). Si la imagen falla, fallback automático a iniciales del