@kaufmann-lab/ui 0.1.1 → 0.1.3

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.1",
3
+ "version": "0.1.3",
4
4
  "description": "Shared Angular component library for the Kaufmann frontends",
5
5
  "license": "MIT",
6
6
  "author": "Kaufmann Lab",
@@ -2,11 +2,23 @@ import * as _angular_core from '@angular/core';
2
2
  import { AfterContentInit, TemplateRef, AfterViewInit } from '@angular/core';
3
3
  import { ControlValueAccessor } from '@angular/forms';
4
4
 
5
- /** Nombre de cada uno de los 59 íconos del design system (página 5). */
6
- 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' | 'download' | 'edit' | 'external-link' | 'eye' | 'file' | 'filter' | 'gauge' | 'gift' | 'grid' | 'history' | 'inbox' | 'layers' | 'list' | 'map' | 'map-pin' | 'menu' | 'mic' | 'mic-off' | 'more-vertical' | 'pause' | 'phone' | 'play' | 'plus' | 'search' | 'settings' | 'shield-check' | 'sort' | 'star' | 'ticket' | 'tool' | 'trash' | 'truck' | 'upload-cloud' | 'user' | 'user-search' | 'video' | 'x';
5
+ /**
6
+ * Nombre de cada ícono del design system. Página 5 del PDF fija un set de
7
+ * 59; `eye-off` es una extensión propia por fuera de ese set, agregada para
8
+ * el toggle de mostrar/ocultar contraseña de `Input` — no hay un ícono de
9
+ * "ojo tachado" en la spec original porque esa interacción no estaba
10
+ * contemplada ahí.
11
+ *
12
+ * Separado de `Icon.ts` a propósito: este type es el contrato público que
13
+ * comparten `Icon`, `icons/index.ts` (registro) y cualquier componente que
14
+ * reciba un `IconName` (`Button`, `MetricCard`, etc.) — no debería requerir
15
+ * importar el componente `Icon` completo solo para tipar una prop.
16
+ */
17
+ 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' | 'download' | 'edit' | 'external-link' | 'eye' | 'eye-off' | 'file' | 'filter' | 'gauge' | 'gift' | 'grid' | 'history' | 'inbox' | 'layers' | 'list' | 'map' | 'map-pin' | 'menu' | 'mic' | 'mic-off' | 'more-vertical' | 'pause' | 'phone' | 'play' | 'plus' | 'search' | 'settings' | 'shield-check' | 'sort' | 'star' | 'ticket' | 'tool' | 'trash' | 'truck' | 'upload-cloud' | 'user' | 'user-search' | 'video' | 'x';
18
+
7
19
  type IconSize = 'sm' | 'md' | 'lg';
8
20
  /**
9
- * Ícono de trazo del design system — 59 glyphs (página 5), grilla 24×24,
21
+ * Ícono de trazo del design system — 60 glyphs (59 de la página 5 + `eye-off`), grilla 24×24,
10
22
  * grosor de trazo 1.9px. Referencia un sprite SVG embebido (ver
11
23
  * `icon-sprite.ts`) vía `<use>`, así que no hay peso de red adicional por
12
24
  * cada instancia: el sprite se inyecta al DOM una única vez, la primera
@@ -577,6 +589,22 @@ declare class DataTable<T = unknown> {
577
589
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DataTable<any>, "kf-data-table", never, { "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "rows": { "alias": "rows"; "required": true; "isSignal": true; }; "rowKey": { "alias": "rowKey"; "required": false; "isSignal": true; }; "flush": { "alias": "flush"; "required": false; "isSignal": true; }; "cardable": { "alias": "cardable"; "required": false; "isSignal": true; }; "defaultView": { "alias": "defaultView"; "required": false; "isSignal": true; }; "render": { "alias": "render"; "required": false; "isSignal": true; }; "cellTemplates": { "alias": "cellTemplates"; "required": false; "isSignal": true; }; }, { "rowClick": "rowClick"; }, never, ["[empty]", "[footer]"], true, never>;
578
590
  }
579
591
 
592
+ type DividerOrientation = 'horizontal' | 'vertical';
593
+ /**
594
+ * Línea separadora decorativa entre bloques de contenido (ej. columnas de
595
+ * metadata en `kf-company-selector`). `vertical` necesita que el contenedor
596
+ * padre sea flex/grid con altura definida — se estira con `align-self:
597
+ * stretch`; sin eso no tiene alto propio y no se ve.
598
+ *
599
+ * <kf-divider />
600
+ * <kf-divider orientation="vertical" />
601
+ */
602
+ declare class Divider {
603
+ readonly orientation: _angular_core.InputSignal<DividerOrientation>;
604
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Divider, never>;
605
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Divider, "kf-divider", never, { "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
606
+ }
607
+
580
608
  /**
581
609
  * Placeholder para una sección sin contenido. Dos tonos, con anatomía
582
610
  * distinta (páginas 27-28 del design system, que los trata como piezas
@@ -780,6 +808,16 @@ declare class FolderTabs {
780
808
  * <kf-input label="Correo" formControlName="email"
781
809
  * [invalid]="email.invalid && email.touched"
782
810
  * [errorMessage]="email.touched && email.hasError('required') ? 'Ingresa tu correo.' : undefined" />
811
+ *
812
+ * `toggleable` solo tiene efecto cuando `type="password"`: agrega un botón
813
+ * de ojo al final del campo que alterna la visibilidad del valor tipeado
814
+ * (cambia el `type` real del `<input>` nativo entre `password` y `text`,
815
+ * nunca expone el valor en el DOM de otra forma). El botón es `type="button"`
816
+ * — nunca dispara submit del form contenedor — y anuncia su acción con
817
+ * `aria-label` dinámico y `aria-pressed`, ya que es un toggle, no un botón
818
+ * de una sola acción.
819
+ *
820
+ * <kf-input type="password" label="Contraseña" toggleable formControlName="password" />
783
821
  */
784
822
  declare class Input implements ControlValueAccessor, AfterViewInit {
785
823
  private static nextId;
@@ -798,6 +836,8 @@ declare class Input implements ControlValueAccessor, AfterViewInit {
798
836
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
799
837
  readonly type: _angular_core.InputSignal<string>;
800
838
  readonly placeholder: _angular_core.InputSignal<string>;
839
+ /** Agrega el botón de mostrar/ocultar — sin efecto si `type` no es `"password"`. */
840
+ readonly toggleable: _angular_core.InputSignalWithTransform<boolean, unknown>;
801
841
  protected readonly inputId: string;
802
842
  protected readonly hintId: string;
803
843
  protected readonly errorId: string;
@@ -807,6 +847,17 @@ declare class Input implements ControlValueAccessor, AfterViewInit {
807
847
  private readonly disabledByForm;
808
848
  /** Disabled real: por input() directo o por el FormControl asociado. */
809
849
  protected readonly isDisabled: _angular_core.Signal<boolean>;
850
+ /** Estado interno del toggle — irrelevante si `showPasswordToggle()` es false. */
851
+ protected readonly passwordVisible: _angular_core.WritableSignal<boolean>;
852
+ /** El botón solo tiene sentido si el campo realmente es de contraseña. */
853
+ protected readonly showPasswordToggle: _angular_core.Signal<boolean>;
854
+ /**
855
+ * `type` real que recibe el `<input>` nativo: igual a `type()` salvo
856
+ * cuando el toggle está activo y visible, donde pasa a `text` para
857
+ * mostrar el valor en claro sin cambiar `type()` en sí (evita que un
858
+ * consumidor que lee `type()` desde afuera vea un valor inconsistente).
859
+ */
860
+ protected readonly effectiveType: _angular_core.Signal<string>;
810
861
  private onChange;
811
862
  private onTouched;
812
863
  ngAfterViewInit(): void;
@@ -816,8 +867,14 @@ declare class Input implements ControlValueAccessor, AfterViewInit {
816
867
  setDisabledState(isDisabled: boolean): void;
817
868
  protected onInput(rawValue: string): void;
818
869
  protected onBlur(): void;
870
+ /**
871
+ * Alterna la visibilidad del valor. No dispara `onBlur`/pierde el foco:
872
+ * el botón vive dentro del mismo `.kf-input__field`, así que un click acá
873
+ * no debe tratarse como si el usuario hubiese abandonado el campo.
874
+ */
875
+ protected onTogglePasswordVisibility(): void;
819
876
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<Input, never>;
820
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<Input, "kf-input", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "suffix": { "alias": "suffix"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
877
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Input, "kf-input", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "suffix": { "alias": "suffix"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "toggleable": { "alias": "toggleable"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
821
878
  }
822
879
 
823
880
  /**
@@ -1524,5 +1581,5 @@ declare class ViewToggle {
1524
1581
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<ViewToggle, "kf-view-toggle", never, { "view": { "alias": "view"; "required": true; "isSignal": true; }; }, { "viewChange": "viewChange"; }, never, never, true, never>;
1525
1582
  }
1526
1583
 
1527
- export { ActionTile, AdminBadge, Alert, Avatar, Badge, Breadcrumb, Button, Card, Carousel, CarouselSlide, Checkbox, Chip, CompanySelector, ContentSlot, ContentState, DataTable, EmptyState, FeatureCard, Field, FieldLabel, FilterChips, FolderTabs, Icon, Input, MetricCard, Modal, MultiSelect, PageHeader, Pagination, Panel, PortalHeader, ReserveBlock, SectionHeader, Segmented, Select, SelectMenu, Skeleton, Spinner, StatTile, StatusPill, Tabs, ToastHost, ToastService, VehicleHeader, ViewToggle };
1528
- export type { AlertTone, BreadcrumbItem, CompanySelectorMeta, ContentStateKind, ContentStateLoad, DataTableCardRole, DataTableColumn, DataTableView, FolderTabOption, IconName, IconSize, MultiSelectOption, PaginationItem, PortalHeaderAdminAction, PortalHeaderNavItem, SegmentedOption, SelectMenuOption, SkeletonVariant, SpinnerSize, TabOption, ToastOptions, ToastPromiseMessages, ToastState, ToastTone, VehicleHeaderStatus, ViewToggleOption };
1584
+ export { ActionTile, AdminBadge, Alert, Avatar, Badge, Breadcrumb, Button, Card, Carousel, CarouselSlide, Checkbox, Chip, CompanySelector, ContentSlot, ContentState, DataTable, Divider, EmptyState, FeatureCard, Field, FieldLabel, FilterChips, FolderTabs, Icon, Input, MetricCard, Modal, MultiSelect, PageHeader, Pagination, Panel, PortalHeader, ReserveBlock, SectionHeader, Segmented, Select, SelectMenu, Skeleton, Spinner, StatTile, StatusPill, Tabs, ToastHost, ToastService, VehicleHeader, ViewToggle };
1585
+ export type { AlertTone, BreadcrumbItem, CompanySelectorMeta, ContentStateKind, ContentStateLoad, DataTableCardRole, DataTableColumn, DataTableView, DividerOrientation, FolderTabOption, IconName, IconSize, MultiSelectOption, PaginationItem, PortalHeaderAdminAction, PortalHeaderNavItem, SegmentedOption, SelectMenuOption, SkeletonVariant, SpinnerSize, TabOption, ToastOptions, ToastPromiseMessages, ToastState, ToastTone, VehicleHeaderStatus, ViewToggleOption };