@kaufmann-lab/ui 0.1.27 → 0.1.28

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": "@kaufmann-lab/ui",
3
- "version": "0.1.27",
3
+ "version": "0.1.28",
4
4
  "description": "Shared Angular component library for the Kaufmann frontends",
5
5
  "license": "MIT",
6
6
  "author": "Kaufmann Lab",
@@ -220,11 +220,44 @@ declare class Button {
220
220
  type AlertTone = 'info' | 'ok' | 'warn' | 'error';
221
221
  /** Forma del aviso: `card` (default, con borde y esquinas) o `bar` (franja compacta de ancho completo). */
222
222
  type AlertVariant = 'card' | 'bar';
223
+ /**
224
+ * Apariencia de la variante `card`: `tile` (default), `tint` o `rail`. Ver el
225
+ * JSDoc de `Alert` para cuándo usar cada una.
226
+ */
227
+ type AlertAppearance = 'tile' | 'tint' | 'rail';
223
228
  /**
224
229
  * Banner contextual que vive dentro del flujo: validaciones, avisos de
225
230
  * vencimiento, confirmaciones. Persiste hasta que se descarta o hasta que la
226
231
  * condición que lo causó desaparece — para feedback efímero está el toast.
227
232
  *
233
+ * Diseño sobrio: el título va en peso 600 con la tipografía de cuerpo y el
234
+ * mensaje con medida de lectura limitada, ambos en los neutros del sistema (el
235
+ * color del tono nunca se usa para texto). El ícono va centrado en vertical
236
+ * respecto al aviso. El color sale siempre de los tokens (`*-strong`), nunca de
237
+ * un input. Ninguna apariencia lleva borde ni acento lateral de color.
238
+ *
239
+ * `appearance` elige cómo se muestra el tono (solo aplica a `variant="card"`):
240
+ *
241
+ * - `tile` (default): aviso estándar dentro de pantallas y cards. Tarjeta de
242
+ * superficie y borde neutros; el color vive solo en el ícono, un tile sólido de
243
+ * 40px con glifo blanco.
244
+ *
245
+ * <kf-alert tone="warn" title="SOAT por vencer">Vence el 15/08.</kf-alert>
246
+ *
247
+ * - `tint`: aviso liviano sobre fondos neutros o en zonas densas, donde el tinte
248
+ * basta. Relleno suave del tono, sin borde ni tile; glifo de 24px en el color
249
+ * fuerte del tono.
250
+ *
251
+ * <kf-alert appearance="tint" tone="info">Cita confirmada para el jueves.</kf-alert>
252
+ *
253
+ * - `rail`: aviso destacado que debe notarse al primer vistazo, p. ej. errores o
254
+ * bloqueos. Panel de ícono de 56px a todo el alto, con el fondo del tono más
255
+ * intenso, y cuerpo neutro con borde neutro.
256
+ *
257
+ * <kf-alert appearance="rail" tone="error" title="Pago rechazado">
258
+ * Tu banco no autorizó el cargo.
259
+ * </kf-alert>
260
+ *
228
261
  * `open` es two-way: el botón de cerrar lo pone en `false` y el componente
229
262
  * deja de renderizar. El consumidor puede volver a abrirlo poniéndolo en
230
263
  * `true` (ej. cuando la validación falla otra vez).
@@ -238,13 +271,16 @@ type AlertVariant = 'card' | 'bar';
238
271
  * tonos y mismo `role` (`alert` para `error`/`warn`, `status` para el resto)
239
272
  * que la variante `card`. Pensada para el borde de una página o de un panel
240
273
  * (ej. "Estás viendo datos de otro cliente"), donde una tarjeta con margen
241
- * sobra.
274
+ * sobra. `variant="bar"` ignora `appearance`: la franja siempre usa su propia
275
+ * superficie tintada.
242
276
  *
243
277
  * <kf-alert variant="bar" tone="warn" title="Modo suplantación">Viendo como Ana Pérez.</kf-alert>
244
278
  *
245
- * Los elementos con el atributo `kfAlertActions` se proyectan en una fila
246
- * propia bajo el mensaje (con salto de línea si no caben, también en la
247
- * variante `bar`). Sin ellos la fila no existe y el aviso queda igual.
279
+ * Los elementos con el atributo `kfAlertActions` se proyectan a la derecha del
280
+ * mensaje cuando hay ancho y, si no caben, en una fila propia bajo él, apilados
281
+ * y alineados al inicio (en la variante `bar` siempre van en fila propia). Si los
282
+ * envuelves en un solo `<div kfAlertActions>`, el aviso separa a sus hijos (12px).
283
+ * Sin ellos la zona no existe y el aviso queda igual.
248
284
  *
249
285
  * <kf-alert tone="warn" title="SOAT por vencer">
250
286
  * Vence el 15/08.
@@ -255,7 +291,12 @@ declare class Alert {
255
291
  readonly tone: _angular_core.InputSignal<AlertTone>;
256
292
  /** `card` (default) o `bar` (franja compacta de ancho completo). */
257
293
  readonly variant: _angular_core.InputSignal<AlertVariant>;
258
- /** Línea en negrita arriba del mensaje. Vacío deja solo el contenido proyectado. */
294
+ /**
295
+ * `tile` (default), `tint` o `rail`. Solo aplica a `variant="card"`; `bar` la
296
+ * ignora. Se expone en el host como `data-appearance`.
297
+ */
298
+ readonly appearance: _angular_core.InputSignal<AlertAppearance>;
299
+ /** Título (peso 600) arriba del mensaje. Vacío deja solo el contenido proyectado. */
259
300
  readonly title: _angular_core.InputSignal<string>;
260
301
  readonly dismissible: _angular_core.InputSignalWithTransform<boolean, unknown>;
261
302
  /** Visibilidad, two-way: `[(open)]="hasError"`. */
@@ -266,8 +307,10 @@ declare class Alert {
266
307
  */
267
308
  protected readonly ariaRole: _angular_core.Signal<"alert" | "status">;
268
309
  protected readonly toneIcon: _angular_core.Signal<IconName>;
310
+ /** Glifo: 16px en `bar`, 20px en `tile` y 24px en `tint`/`rail`. */
311
+ protected readonly iconSize: _angular_core.Signal<IconSize>;
269
312
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<Alert, never>;
270
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<Alert, "kf-alert", never, { "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; }, { "open": "openChange"; }, never, ["*", "[kfAlertActions]"], true, never>;
313
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Alert, "kf-alert", never, { "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; }, { "open": "openChange"; }, never, ["*", "[kfAlertActions]"], true, never>;
271
314
  }
272
315
 
273
316
  type AlertRowTone = 'warn' | 'error' | 'neutral';
@@ -4720,6 +4763,8 @@ declare class Spinner {
4720
4763
  }
4721
4764
 
4722
4765
  type StatCardTone = 'primary' | 'success' | 'error' | 'purple' | 'warn' | 'info' | 'neutral';
4766
+ /** Tono de la insignia (`badge`): los roles semánticos de `kf-badge` salvo `service`. */
4767
+ type StatCardBadgeTone = 'neutral' | 'ok' | 'warn' | 'error' | 'info';
4723
4768
  /** Densidad de la card: `'compact'` reduce el padding, el ícono y el valor. */
4724
4769
  type StatCardDensity = 'default' | 'compact';
4725
4770
  /**
@@ -4746,6 +4791,21 @@ type StatCardDensity = 'default' | 'compact';
4746
4791
  * <kf-stat-card icon="clock" tone="warn" value="7" label="Por vencer" [bar]="35" hint="7 de 20"
4747
4792
  * clickable [pressed]="filter() === 'due'" (cardClick)="toggle('due')" />
4748
4793
  *
4794
+ * - `badge` (+ `badgeTone`, default `'neutral'`): insignia (`kf-badge`) a la
4795
+ * derecha de la etiqueta, para un estado puntual ("Urgente", "Nuevo"). Es
4796
+ * texto real en el DOM, así que un lector de pantalla lo lee tras la
4797
+ * etiqueta: el tono refuerza el significado, no lo porta solo. Si el
4798
+ * ancho no alcanza, baja a la línea siguiente en vez de recortarse. Sin
4799
+ * `badge` (o con texto vacío) la card no cambia. Funciona con `density`,
4800
+ * `clickable` y `loading`.
4801
+ *
4802
+ * <kf-stat-card icon="clock" tone="warn" value="7" label="Por vencer" badge="Urgente" badgeTone="error" />
4803
+ *
4804
+ * Alto: la card ocupa el 100% del alto de su contenedor cuando este lo fija
4805
+ * (celda de una grilla o ítem estirado de un flex), de modo que las cards de
4806
+ * una misma fila miden igual sin `::ng-deep`. En un contenedor de alto
4807
+ * automático mide lo que su contenido, como siempre.
4808
+ *
4749
4809
  * `density` (`'default'` | `'compact'`): `'compact'` es la variante para
4750
4810
  * pantallas angostas — padding de `--kf-space-md`, ícono de 40px y valor de
4751
4811
  * `--kf-font-size-title-sm`, con el mismo contenido. Si la card mide 210px de
@@ -4761,7 +4821,7 @@ type StatCardDensity = 'default' | 'compact';
4761
4821
  * `loading` (default `false`): mientras es `true` la card dibuja su esqueleto
4762
4822
  * en vez del contenido, con el MISMO cascarón (borde, padding, ícono de 50px)
4763
4823
  * y líneas del alto real de cada texto — valor, etiqueta y, si se pasaron,
4764
- * nota, barra y `hint` —, así que al llegar los datos no hay salto de
4824
+ * nota, barra, `hint` e insignia —, así que al llegar los datos no hay salto de
4765
4825
  * layout. Pasa los mismos inputs que usarás cargada para que el esqueleto
4766
4826
  * reserve las mismas líneas. Marca la card con `aria-busy="true"`, no es
4767
4827
  * clicable ni expone su texto a lectores de pantalla mientras carga.
@@ -4778,6 +4838,10 @@ declare class StatCard {
4778
4838
  readonly bar: _angular_core.InputSignal<number | null | undefined>;
4779
4839
  /** Texto secundario bajo la barra (o bajo la nota si no hay barra). */
4780
4840
  readonly hint: _angular_core.InputSignal<string | undefined>;
4841
+ /** Texto de la insignia a la derecha de la etiqueta; vacío/ausente = sin insignia. */
4842
+ readonly badge: _angular_core.InputSignal<string | undefined>;
4843
+ /** Tono semántico de la insignia (`kf-badge`). */
4844
+ readonly badgeTone: _angular_core.InputSignal<StatCardBadgeTone>;
4781
4845
  /**
4782
4846
  * Estado de alternancia (`aria-pressed`) cuando la card es `clickable`.
4783
4847
  * `null` (default) = no aplica: el atributo no se emite.
@@ -4793,7 +4857,7 @@ declare class StatCard {
4793
4857
  protected readonly barTone: _angular_core.Signal<ProgressTone>;
4794
4858
  protected readonly hasBar: _angular_core.Signal<boolean>;
4795
4859
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StatCard, never>;
4796
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StatCard, "kf-stat-card", never, { "icon": { "alias": "icon"; "required": true; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "note": { "alias": "note"; "required": false; "isSignal": true; }; "bar": { "alias": "bar"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "pressed": { "alias": "pressed"; "required": false; "isSignal": true; }; "density": { "alias": "density"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; }, { "cardClick": "cardClick"; }, never, never, true, never>;
4860
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StatCard, "kf-stat-card", never, { "icon": { "alias": "icon"; "required": true; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "note": { "alias": "note"; "required": false; "isSignal": true; }; "bar": { "alias": "bar"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "badge": { "alias": "badge"; "required": false; "isSignal": true; }; "badgeTone": { "alias": "badgeTone"; "required": false; "isSignal": true; }; "pressed": { "alias": "pressed"; "required": false; "isSignal": true; }; "density": { "alias": "density"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; }, { "cardClick": "cardClick"; }, never, never, true, never>;
4797
4861
  }
4798
4862
 
4799
4863
  /** Vocabulario semántico único de tono, compartido con `TextTone`. */
@@ -5537,4 +5601,4 @@ declare class ViewToggle {
5537
5601
  }
5538
5602
 
5539
5603
  export { ActionTile, AdminBadge, Alert, AlertRow, Avatar, Badge, Breadcrumb, BucketProgress, Button, Calendar, Card, Carousel, CarouselSlide, Checkbox, Chip, Collapsible, ContactPopover, ContentSlot, ContentState, ContentStateLoading, ContentViewer, CursorPager, DATA_TABLE_MAX_SKELETON_ROWS, DEFAULT_MILESTONE_TIMELINE_LABELS, DEFAULT_PAGE_SIZE_OPTIONS, DataTable, Divider, DocumentRow, Drawer, Dropdown, DropdownItem, DropdownPanel, EmptyState, EventTimeline, FeatureCard, Field, FieldLabel, FileInput, Filter, FilterChips, FolderTabs, FolderTabsPanel, Footer, FormatInputDirective, Icon, Input, JourneyStepper, LIST_TOOLBAR_HYSTERESIS, Link, ListToolbar, MetricCard, MilestoneTimeline, Modal, MultiSelect, NoteBlock, OptionList, PROGRESS_STATUS, PROGRESS_STATUS_LABEL, PageHeader, Pagination, Panel, PopoverDirective, PortalHeader, Progress, PulseDot, RowActions, SKELETON_PRESET_MAX_COUNT, SectionHeader, SectionNav, SectionNavItem, SectionNavSubsection, Segmented, Select, SelectableCardGroup, SidebarShell, Skeleton, SkeletonPreset, Spinner, StatCard, StatTile, StatusMark, StatusNode, StatusPill, Switch, TOAST_DEFAULT_DURATION_MS, Tabs, Text, Textarea, TileGrid, TimeSlotPicker, ToastHost, ToastService, TooltipDirective, ViewToggle, dataTableViewSignal, formatFileSize, resolveListToolbarMode };
5540
- export type { AlertRowTone, AlertTone, AlertVariant, BreadcrumbItem, BucketProgressItem, CalendarDay, ContentStateKind, ContentStateLoad, ContentViewerType, DataTableCardRole, DataTableCellClick, DataTableColumn, DataTableDensity, DataTableItemLabel, DataTableSort, DataTableView, DividerOrientation, DocumentRowTone, DrawerRole, DrawerSide, DropdownItemTone, DropdownPanelRole, DropdownPanelVariant, EmptyStateTone, EventTimelineItem, EventTimelineTone, FileRejection, FileRejectionReason, FilterChipOption, FilterFieldChange, FilterFieldConfig, FilterFieldType, FilterValue, FolderTabOption, FooterLink, IconName, IconRotation, IconSize, InputBound, JourneyStep, JourneyStepStatus, JourneyStepperColorScheme, JourneyStepperOrientation, JourneyStepperSurface, LinkVariant, ListToolbarMode, MilestoneGroup, MilestoneItem, MilestoneTimelineLabels, ModalSize, MultiSelectOption, NoteBlockTone, OptionListOption, PageHeaderTitleSize, PaginationItem, PopoverPlacement, PortalHeaderAdminAction, PortalHeaderNavItem, ProgressSize, ProgressStatus, ProgressTone, RowAction, RowActionKind, RowActionsMode, SectionNavSubsectionData, SegmentedOption, SelectOption, SelectableCardOption, SidebarNavItemData, SkeletonPresetVariant, SkeletonVariant, SpinnerSize, StatCardDensity, StatCardTone, StatTileTone, StatTileVariant, SwitchSize, TabOption, TextAs, TextTone, TextVariant, TimeSlot, ToastAction, ToastOptions, ToastPromiseMessages, ToastState, ToastTone, TooltipPosition, ViewToggleOption };
5604
+ export type { AlertAppearance, AlertRowTone, AlertTone, AlertVariant, BreadcrumbItem, BucketProgressItem, CalendarDay, ContentStateKind, ContentStateLoad, ContentViewerType, DataTableCardRole, DataTableCellClick, DataTableColumn, DataTableDensity, DataTableItemLabel, DataTableSort, DataTableView, DividerOrientation, DocumentRowTone, DrawerRole, DrawerSide, DropdownItemTone, DropdownPanelRole, DropdownPanelVariant, EmptyStateTone, EventTimelineItem, EventTimelineTone, FileRejection, FileRejectionReason, FilterChipOption, FilterFieldChange, FilterFieldConfig, FilterFieldType, FilterValue, FolderTabOption, FooterLink, IconName, IconRotation, IconSize, InputBound, JourneyStep, JourneyStepStatus, JourneyStepperColorScheme, JourneyStepperOrientation, JourneyStepperSurface, LinkVariant, ListToolbarMode, MilestoneGroup, MilestoneItem, MilestoneTimelineLabels, ModalSize, MultiSelectOption, NoteBlockTone, OptionListOption, PageHeaderTitleSize, PaginationItem, PopoverPlacement, PortalHeaderAdminAction, PortalHeaderNavItem, ProgressSize, ProgressStatus, ProgressTone, RowAction, RowActionKind, RowActionsMode, SectionNavSubsectionData, SegmentedOption, SelectOption, SelectableCardOption, SidebarNavItemData, SkeletonPresetVariant, SkeletonVariant, SpinnerSize, StatCardBadgeTone, StatCardDensity, StatCardTone, StatTileTone, StatTileVariant, SwitchSize, TabOption, TextAs, TextTone, TextVariant, TimeSlot, ToastAction, ToastOptions, ToastPromiseMessages, ToastState, ToastTone, TooltipPosition, ViewToggleOption };
@@ -370,7 +370,7 @@ declare class MapView {
370
370
  protected readonly isPreview: _angular_core.Signal<boolean>;
371
371
  protected readonly containerRole: _angular_core.Signal<"img" | "region">;
372
372
  /** Ver estado de carga/error real, más abajo (`status`). */
373
- protected readonly status: _angular_core.WritableSignal<"loading" | "ready" | "error">;
373
+ protected readonly status: _angular_core.WritableSignal<"error" | "loading" | "ready">;
374
374
  /** Elección manual del consumidor final vía el control `mapStyle` — pisa
375
375
  * `theme()` de forma sostenida (no vuelve a `theme()` sola) hasta que se
376
376
  * destruya este `kf-map`; ver `resolvedTheme()`. */