@kaufmann-lab/ui 0.1.13 → 0.1.15

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.13",
3
+ "version": "0.1.15",
4
4
  "description": "Shared Angular component library for the Kaufmann frontends",
5
5
  "license": "MIT",
6
6
  "author": "Kaufmann Lab",
@@ -31,7 +31,7 @@ import { ControlValueAccessor } from '@angular/forms';
31
31
  * de vehículos; reusarlo para "fijar" generaría ambigüedad con los markers
32
32
  * de mapa.
33
33
  */
34
- type IconName = 'activity' | 'alert-circle' | 'alert-octagon' | 'alert-triangle' | 'award' | 'bar-chart' | 'bell' | 'bus' | 'calculator' | 'calendar' | 'car' | 'cart' | 'check' | 'check-circle' | 'check-square' | 'chevron-down' | 'chevron-left' | 'chevron-left-bar' | 'chevron-right' | 'clipboard' | 'clock' | 'credit-card' | 'crosshair' | 'download' | 'edit' | 'external-link' | 'eye' | 'eye-off' | 'file' | 'filter' | 'gauge' | 'gift' | 'grid' | 'history' | 'home' | 'inbox' | 'layers' | 'list' | 'log-out' | 'map' | 'map-pin' | 'maximize' | 'menu' | 'message-circle' | 'mic' | 'mic-off' | 'minimize' | 'minus' | 'monitor' | 'more-vertical' | 'navigation' | 'pause' | 'phone' | 'pin' | 'play' | 'plus' | 'search' | 'settings' | 'shield-check' | 'sort' | 'star' | 'ticket' | 'tool' | 'trash' | 'truck' | 'upload-cloud' | 'user' | 'user-search' | 'video' | 'x' | 'zap';
34
+ type IconName = 'activity' | 'alert-circle' | 'alert-octagon' | 'alert-triangle' | 'award' | 'bar-chart' | 'bell' | 'bus' | 'calculator' | 'calendar' | 'car' | 'cart' | 'check' | 'check-circle' | 'check-square' | 'chevron-down' | 'chevron-left' | 'chevron-left-bar' | 'chevron-right' | 'clipboard' | 'clock' | 'credit-card' | 'crosshair' | 'download' | 'edit' | 'external-link' | 'eye' | 'eye-off' | 'file' | 'filter' | 'gauge' | 'gift' | 'grid' | 'history' | 'home' | 'inbox' | 'layers' | 'list' | 'log-out' | 'mail' | 'map' | 'map-pin' | 'maximize' | 'menu' | 'message-circle' | 'mic' | 'mic-off' | 'minimize' | 'minus' | 'monitor' | 'more-vertical' | 'navigation' | 'pause' | 'phone' | 'pin' | 'play' | 'plus' | 'search' | 'settings' | 'shield-check' | 'sort' | 'star' | 'ticket' | 'tool' | 'trash' | 'truck' | 'upload-cloud' | 'user' | 'user-search' | 'video' | 'x' | 'zap';
35
35
 
36
36
  type IconSize = 'sm' | 'md' | 'lg';
37
37
  /** Ángulos de rotación soportados por `rotate` — cubre los casos reales del
@@ -724,6 +724,39 @@ declare class CompanySelector {
724
724
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CompanySelector, "kf-company-selector", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "companies": { "alias": "companies"; "required": true; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "meta": { "alias": "meta"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
725
725
  }
726
726
 
727
+ /**
728
+ * Popover de "Datos de contacto" de una persona (asesor, ejecutivo — nombre
729
+ * genérico a propósito, sin lógica de negocio de ninguna pantalla concreta
730
+ * adentro). Cada canal (`whatsapp`/`phone`/`email`) se muestra SOLO si
731
+ * viene con dato — nunca los 3 fijos — y si ninguno viene, un estado vacío
732
+ * explícito en vez de un panel a medio llenar. Mismo criterio que ya
733
+ * resolvía `sitio-privado-one-way-frontend` (repo hermano de Chile) para
734
+ * el asesor de taller, ahora como pieza compartida del design system.
735
+ *
736
+ * <kf-contact-popover
737
+ * [name]="advisor.name"
738
+ * [whatsapp]="advisor.whatsapp"
739
+ * [phone]="advisor.phone"
740
+ * [email]="advisor.email"
741
+ * />
742
+ */
743
+ declare class ContactPopover {
744
+ readonly name: _angular_core.InputSignal<string>;
745
+ readonly title: _angular_core.InputSignal<string>;
746
+ readonly whatsapp: _angular_core.InputSignal<string | null>;
747
+ readonly phone: _angular_core.InputSignal<string | null>;
748
+ readonly email: _angular_core.InputSignal<string | null>;
749
+ protected readonly open: _angular_core.WritableSignal<boolean>;
750
+ protected readonly whatsappHref: _angular_core.Signal<string | null>;
751
+ protected readonly phoneHref: _angular_core.Signal<string | null>;
752
+ protected readonly emailHref: _angular_core.Signal<string | null>;
753
+ protected readonly hasContactMethods: _angular_core.Signal<boolean>;
754
+ protected onToggle(): void;
755
+ protected onClose(): void;
756
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ContactPopover, never>;
757
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ContactPopover, "kf-contact-popover", never, { "name": { "alias": "name"; "required": true; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "whatsapp": { "alias": "whatsapp"; "required": false; "isSignal": true; }; "phone": { "alias": "phone"; "required": false; "isSignal": true; }; "email": { "alias": "email"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
758
+ }
759
+
727
760
  /**
728
761
  * Marcador genérico para contenido aún por definir (página 38) — comunica
729
762
  * "contenido disponible para uso" sin parecer un error, a diferencia de
@@ -1380,8 +1413,15 @@ declare class DropdownItem {
1380
1413
  readonly tone: _angular_core.InputSignal<DropdownItemTone>;
1381
1414
  /** Ícono opcional al inicio de la fila. */
1382
1415
  readonly icon: _angular_core.InputSignal<IconName | undefined>;
1416
+ /**
1417
+ * Deshabilita el ítem (ej. una acción cuyo endpoint todavía no existe,
1418
+ * caso real de "Factura" en `kf-row-actions` de Taller). Default `false`
1419
+ * a propósito — ningún consumidor existente (ej. el menú de sesión del
1420
+ * Shell) pasa esta prop hoy, así que no cambia su comportamiento.
1421
+ */
1422
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
1383
1423
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DropdownItem, never>;
1384
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DropdownItem, "kf-dropdown-item", never, { "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
1424
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DropdownItem, "kf-dropdown-item", never, { "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
1385
1425
  }
1386
1426
 
1387
1427
  type DropdownPanelVariant = 'solid' | 'dark';
@@ -2885,6 +2925,11 @@ declare class Modal {
2885
2925
  readonly open: _angular_core.ModelSignal<boolean>;
2886
2926
  /** Permite cerrar con el botón, `Escape` o clic en el backdrop. */
2887
2927
  readonly dismissible: _angular_core.InputSignalWithTransform<boolean, unknown>;
2928
+ /** Ancho por defecto: `480px` (sin pasar nada). Un modal con contenido
2929
+ * tabular/ancho (ej. una lista de varios campos por fila) puede pedir
2930
+ * más, ej. `width="720px"` — sigue topeado por `100vw` en pantallas
2931
+ * angostas, mismo `min()` de siempre. */
2932
+ readonly width: _angular_core.InputSignal<string | null>;
2888
2933
  protected readonly titleId: string;
2889
2934
  private readonly dialog;
2890
2935
  private readonly document;
@@ -2903,7 +2948,7 @@ declare class Modal {
2903
2948
  */
2904
2949
  protected onHostClick(event: MouseEvent): void;
2905
2950
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<Modal, never>;
2906
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<Modal, "kf-modal", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; }, { "open": "openChange"; }, never, ["*", "[footer]"], true, never>;
2951
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Modal, "kf-modal", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; }, { "open": "openChange"; }, never, ["*", "[footer]"], true, never>;
2907
2952
  }
2908
2953
 
2909
2954
  /** Color de la franja izquierda y del fondo. */
@@ -3510,6 +3555,59 @@ declare class ReserveBlock {
3510
3555
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<ReserveBlock, "kf-reserve-block", never, { "emptyLabel": { "alias": "emptyLabel"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": true; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "actionLabel": { "alias": "actionLabel"; "required": false; "isSignal": true; }; "actionHref": { "alias": "actionHref"; "required": false; "isSignal": true; }; "grow": { "alias": "grow"; "required": false; "isSignal": true; }; }, {}, never, ["[actions]"], true, never>;
3511
3556
  }
3512
3557
 
3558
+ type RowActionKind = 'link' | 'button';
3559
+ /**
3560
+ * Una acción de fila — mismo shape que ya usaba `WorkshopRowAction` en
3561
+ * `web-portal-latam-frontend` antes de este componente (Taller, tab
3562
+ * "Trabajos terminados"), ahora compartido: `kind: 'link'` navega (necesita
3563
+ * `href`, `onClick` se ignora), `kind: 'button'` dispara `onClick` en la
3564
+ * pantalla actual. `disabled` aplica a ambos — un link sin `href` (o
3565
+ * explícitamente `disabled`) se renderiza inerte en vez de clickeable, en
3566
+ * vez de omitirse del todo: el consumidor decide que la acción EXISTE pero
3567
+ * no está disponible todavía (ej. "Factura" mientras no exista el endpoint
3568
+ * de descarga).
3569
+ */
3570
+ interface RowAction {
3571
+ readonly kind: RowActionKind;
3572
+ readonly icon: IconName;
3573
+ readonly label: string;
3574
+ readonly href?: string | null;
3575
+ readonly disabled?: boolean;
3576
+ readonly onClick?: () => void;
3577
+ }
3578
+ type RowActionsMode = 'auto' | 'inline' | 'menu';
3579
+ /**
3580
+ * Columna "Acciones" de cualquier tabla del ecosistema. Decide su propia
3581
+ * forma según cuántas acciones recibe — no hace falta que cada tabla elija
3582
+ * a mano entre "botones sueltos" y "menú":
3583
+ *
3584
+ * - `inline` (`actions().length <= inlineLimit()`, default 2): un
3585
+ * ícono-botón de 32px por acción, sin texto — el `label` vive en un
3586
+ * `kfTooltip`. Todas las acciones quedan visibles sin clic extra.
3587
+ * - `menu` (más de `inlineLimit()`): un único botón "kebab" que abre un
3588
+ * `kf-dropdown-panel` con una fila por acción.
3589
+ *
3590
+ * `mode` fuerza uno de los dos modos sin importar cuántas acciones haya
3591
+ * (ej. una tabla que prefiere el kebab siempre, aunque tenga una sola
3592
+ * acción, por consistencia visual con otra columna).
3593
+ *
3594
+ * <kf-row-actions [actions]="rowActions(row)" />
3595
+ * <kf-row-actions [actions]="rowActions(row)" mode="menu" />
3596
+ */
3597
+ declare class RowActions {
3598
+ readonly actions: _angular_core.InputSignal<readonly RowAction[]>;
3599
+ readonly mode: _angular_core.InputSignal<RowActionsMode>;
3600
+ /** Desde cuántas acciones el modo `auto` pasa de `inline` a `menu`. */
3601
+ readonly inlineLimit: _angular_core.InputSignal<number>;
3602
+ protected readonly menuOpen: _angular_core.WritableSignal<boolean>;
3603
+ protected readonly effectiveMode: _angular_core.Signal<"menu" | "inline">;
3604
+ protected onToggleMenu(): void;
3605
+ protected onButtonAction(action: RowAction): void;
3606
+ protected onMenuLinkClick(): void;
3607
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RowActions, never>;
3608
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<RowActions, "kf-row-actions", never, { "actions": { "alias": "actions"; "required": true; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "inlineLimit": { "alias": "inlineLimit"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3609
+ }
3610
+
3513
3611
  /**
3514
3612
  * Título de sub-sección con chip de ícono, pensado para anidarse dentro de
3515
3613
  * cards o paneles (a diferencia de `PageHeader`, que encabeza una página
@@ -4518,5 +4616,5 @@ declare class ViewToggle {
4518
4616
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<ViewToggle, "kf-view-toggle", never, { "view": { "alias": "view"; "required": true; "isSignal": true; }; }, { "viewChange": "viewChange"; }, never, never, true, never>;
4519
4617
  }
4520
4618
 
4521
- export { ActionTile, AdminBadge, Alert, AlertRow, AuthLayout, AuthLayoutSso, Avatar, Badge, Breadcrumb, BucketProgress, Button, Card, Carousel, CarouselSlide, Checkbox, Chip, Collapsible, CompanySelector, ContentSlot, ContentState, ContentViewer, DEFAULT_PAGE_SIZE_OPTIONS, DataTable, Divider, DocumentRow, Drawer, DrawerLogout, DrawerSession, Dropdown, DropdownItem, DropdownPanel, EmptyState, EventTimeline, FeatureCard, Field, FieldLabel, Filter, FilterChips, FolderTabs, FolderTabsPanel, Footer, FormatInputDirective, Icon, Input, JourneyStepper, Link, MAP_CONFIG, MapControls, MapView, MetricCard, MobileFooter, MobileHeader, Modal, MultiSelect, NoteBlock, PageHeader, Pagination, Panel, PortalHeader, Progress, PulseDot, QuotePicker, ReserveBlock, STYLE_BY_THEME, SectionHeader, SectionNav, SectionNavItem, SectionNavSubsection, Segmented, Select, SelectableCardGroup, SidebarShell, Skeleton, Spinner, SsoButton, StatCard, StatTile, StatusPill, THEME_LABEL, THEME_ORDER, Tabs, Text, Textarea, TileGrid, ToastHost, ToastService, TooltipDirective, VehicleHeader, ViewToggle, dataTableViewSignal, formatChileanRut, formatClockTime, formatCurrency, formatNumber, isValidChileanRut, matchMediaSignal, parseCurrency, parseNumber, provideMapConfig, sanitizeDocumentId };
4522
- export type { AlertRowTone, AlertTone, AuthLayoutBackground, BreadcrumbItem, BucketProgressItem, CompanySelectorMeta, ContentStateKind, ContentStateLoad, ContentViewerType, DataTableCardRole, DataTableColumn, DataTableDensity, DataTableSort, DataTableView, DividerOrientation, DocumentRowTone, DrawerSide, DropdownItemTone, DropdownPanelVariant, EventTimelineItem, EventTimelineTone, FilterFieldChange, FilterFieldConfig, FilterFieldType, FilterValue, FolderTabOption, FooterLink, FormatCurrencyOptions, FormatNumberOptions, IconName, IconRotation, IconSize, JourneyStep, JourneyStepStatus, JourneyStepperColorScheme, JourneyStepperSurface, LinkVariant, MapConfig, MapControlKind, MapLatLng, MapMarker, MapMarkerTone, MapPopupAction, MapSize, MapTheme, MapVariant, MultiSelectOption, NoteBlockTone, PageHeaderTitleSize, PaginationItem, PortalHeaderAdminAction, PortalHeaderNavItem, ProgressTone, QuotePickerChip, QuotePickerSortOption, SectionNavSubsectionData, SegmentedOption, SelectableCardOption, SidebarNavItemData, SkeletonVariant, SpinnerSize, SsoProvider, StatCardTone, StatTileTone, StatTileVariant, TabOption, TextAs, TextTone, TextVariant, ToastAction, ToastOptions, ToastPromiseMessages, ToastState, ToastTone, TooltipPosition, VehicleHeaderStatus, ViewToggleOption };
4619
+ export { ActionTile, AdminBadge, Alert, AlertRow, AuthLayout, AuthLayoutSso, Avatar, Badge, Breadcrumb, BucketProgress, Button, Card, Carousel, CarouselSlide, Checkbox, Chip, Collapsible, CompanySelector, ContactPopover, ContentSlot, ContentState, ContentViewer, DEFAULT_PAGE_SIZE_OPTIONS, DataTable, Divider, DocumentRow, Drawer, DrawerLogout, DrawerSession, Dropdown, DropdownItem, DropdownPanel, EmptyState, EventTimeline, FeatureCard, Field, FieldLabel, Filter, FilterChips, FolderTabs, FolderTabsPanel, Footer, FormatInputDirective, Icon, Input, JourneyStepper, Link, MAP_CONFIG, MapControls, MapView, MetricCard, MobileFooter, MobileHeader, Modal, MultiSelect, NoteBlock, PageHeader, Pagination, Panel, PortalHeader, Progress, PulseDot, QuotePicker, ReserveBlock, RowActions, STYLE_BY_THEME, SectionHeader, SectionNav, SectionNavItem, SectionNavSubsection, Segmented, Select, SelectableCardGroup, SidebarShell, Skeleton, Spinner, SsoButton, StatCard, StatTile, StatusPill, THEME_LABEL, THEME_ORDER, Tabs, Text, Textarea, TileGrid, ToastHost, ToastService, TooltipDirective, VehicleHeader, ViewToggle, dataTableViewSignal, formatChileanRut, formatClockTime, formatCurrency, formatNumber, isValidChileanRut, matchMediaSignal, parseCurrency, parseNumber, provideMapConfig, sanitizeDocumentId };
4620
+ export type { AlertRowTone, AlertTone, AuthLayoutBackground, BreadcrumbItem, BucketProgressItem, CompanySelectorMeta, ContentStateKind, ContentStateLoad, ContentViewerType, DataTableCardRole, DataTableColumn, DataTableDensity, DataTableSort, DataTableView, DividerOrientation, DocumentRowTone, DrawerSide, DropdownItemTone, DropdownPanelVariant, EventTimelineItem, EventTimelineTone, FilterFieldChange, FilterFieldConfig, FilterFieldType, FilterValue, FolderTabOption, FooterLink, FormatCurrencyOptions, FormatNumberOptions, IconName, IconRotation, IconSize, JourneyStep, JourneyStepStatus, JourneyStepperColorScheme, JourneyStepperSurface, LinkVariant, MapConfig, MapControlKind, MapLatLng, MapMarker, MapMarkerTone, MapPopupAction, MapSize, MapTheme, MapVariant, MultiSelectOption, NoteBlockTone, PageHeaderTitleSize, PaginationItem, PortalHeaderAdminAction, PortalHeaderNavItem, ProgressTone, QuotePickerChip, QuotePickerSortOption, RowAction, RowActionKind, RowActionsMode, SectionNavSubsectionData, SegmentedOption, SelectableCardOption, SidebarNavItemData, SkeletonVariant, SpinnerSize, SsoProvider, StatCardTone, StatTileTone, StatTileVariant, TabOption, TextAs, TextTone, TextVariant, ToastAction, ToastOptions, ToastPromiseMessages, ToastState, ToastTone, TooltipPosition, VehicleHeaderStatus, ViewToggleOption };