@kaufmann-lab/ui 0.1.16 → 0.1.18

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.
@@ -0,0 +1,53 @@
1
+ import * as _angular_core from '@angular/core';
2
+
3
+ /**
4
+ * Franja fija en la base de una pantalla completa para apps mobile del
5
+ * ecosistema: encapsula el padding con `safe-area-inset-bottom` (para no
6
+ * invadir la zona del home indicator), el borde superior y el fondo —
7
+ * cualquier acción, chip de estado o hint que necesite vivir pegado al
8
+ * borde inferior del dispositivo se proyecta acá vía `<ng-content>`.
9
+ *
10
+ * <kf-mobile-footer>
11
+ * <kf-button>Cerrar orden</kf-button>
12
+ * </kf-mobile-footer>
13
+ */
14
+ declare class MobileFooter {
15
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobileFooter, never>;
16
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobileFooter, "kf-mobile-footer", never, {}, {}, never, ["*"], true, never>;
17
+ }
18
+
19
+ /**
20
+ * Encabezado de pantalla completa (fondo navy) para apps mobile del
21
+ * ecosistema — cubre tanto la raíz de un tab (sin volver) como el detalle
22
+ * de un flujo (con volver).
23
+ *
24
+ * <kf-mobile-header title="Mis asignaciones" />
25
+ *
26
+ * <kf-mobile-header title="STAR-20841" subtitle="Cerrado hoy · 15:18" [showBack]="true" (back)="onBack()" />
27
+ *
28
+ * Sin `kf-text` para `eyebrow`/`title`/`subtitle`: su `tone` es un set
29
+ * cerrado sin blanco/inverso, y sus variantes fijan `color` explícito sobre
30
+ * el elemento interno — un `color: white` heredado desde afuera nunca le
31
+ * gana a esa declaración directa. Markup propio con los tokens reales.
32
+ *
33
+ * El botón "volver" tampoco es `kf-button`: su `variant="ghost"` fija el
34
+ * mismo token de color que este fondo navy (el ícono quedaría invisible).
35
+ */
36
+ declare class MobileHeader {
37
+ readonly title: _angular_core.InputSignal<string>;
38
+ /** Línea chica y translúcida ARRIBA del título — ej. un folio o un saludo. */
39
+ readonly eyebrow: _angular_core.InputSignal<string | undefined>;
40
+ /** `true` cuando `eyebrow` es un código (folio) — usa tipografía monoespaciada. */
41
+ readonly eyebrowMono: _angular_core.InputSignal<boolean>;
42
+ /** Línea chica y translúcida DEBAJO del título — ej. "Cerrado hoy · 15:18". */
43
+ readonly subtitle: _angular_core.InputSignal<string | undefined>;
44
+ readonly showBack: _angular_core.InputSignal<boolean>;
45
+ /** El componente no navega por sí solo: cada pantalla decide qué significa
46
+ * "volver" (`Location.back()`, retroceder un paso del flujo, etc.). */
47
+ readonly back: _angular_core.OutputEmitterRef<void>;
48
+ protected onBackClick(): void;
49
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobileHeader, never>;
50
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobileHeader, "kf-mobile-header", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; "eyebrow": { "alias": "eyebrow"; "required": false; "isSignal": true; }; "eyebrowMono": { "alias": "eyebrowMono"; "required": false; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "showBack": { "alias": "showBack"; "required": false; "isSignal": true; }; }, { "back": "back"; }, never, ["[kf-mobile-header-trailing]"], true, never>;
51
+ }
52
+
53
+ export { MobileFooter, MobileHeader };
@@ -0,0 +1,154 @@
1
+ import { Signal } from '@angular/core';
2
+
3
+ /** Opciones de `formatNumber` — todas opcionales. */
4
+ interface FormatNumberOptions {
5
+ /** Cantidad de decimales a mostrar. Default `0`. */
6
+ decimals?: number;
7
+ /** Locale de `Intl`/`toLocaleString` — decide separador de miles y de
8
+ * decimales. Default `'es'` (punto de miles, coma decimal). */
9
+ locale?: string;
10
+ }
11
+ /**
12
+ * Separador de miles genérico — sin signo, sin asumir que el valor es
13
+ * dinero. Cubre casos como kilometraje/horómetro (`formatNumber(45231,
14
+ * { locale: 'en-US' })` → `'45,231'`), no solo moneda.
15
+ *
16
+ * formatNumber(16800); // '16.800'
17
+ * formatNumber(16800.5, { decimals: 2 }); // '16.800,50'
18
+ * formatNumber(45231, { locale: 'en-US' }); // '45,231'
19
+ */
20
+ declare function formatNumber(value: number, options?: FormatNumberOptions): string;
21
+ /** Opciones de `formatCurrency` — extiende `FormatNumberOptions` con el
22
+ * signo/prefijo de moneda. */
23
+ interface FormatCurrencyOptions extends FormatNumberOptions {
24
+ /** Símbolo o prefijo antepuesto al monto. Default `'$'`. */
25
+ sign?: string;
26
+ }
27
+ /**
28
+ * Formatea un monto de dinero — compone sobre `formatNumber` agregando el
29
+ * signo. Mismos defaults que la convención de OTD (punto de miles, sin
30
+ * decimales, prefijo `$`), overrideables para otra moneda/país/formato:
31
+ *
32
+ * formatCurrency(16800); // '$16.800'
33
+ * formatCurrency(16800.5, { decimals: 2 }); // '$16.800,50'
34
+ * formatCurrency(16800, { sign: '' }); // '16.800'
35
+ * formatCurrency(16800, { sign: 'US$', locale: 'en-US' }); // 'US$16,800'
36
+ */
37
+ declare function formatCurrency(amount: number, options?: FormatCurrencyOptions): string;
38
+ /**
39
+ * Inverso de `formatNumber` — recupera el número crudo de un valor ya
40
+ * formateado con el mismo `locale`. Solo soporta `locale` cuyo separador de
41
+ * miles y decimal sean `'.'`/`','` (`es`) o `','`/`'.'` (`en-US`) — son los
42
+ * 2 casos reales del ecosistema hoy; si aparece un tercer locale con otros
43
+ * separadores, extender acá antes de usarlo.
44
+ */
45
+ declare function parseNumber(formatted: string, locale?: string): number;
46
+ /**
47
+ * Inverso de `formatCurrency` — recupera el número crudo de un monto ya
48
+ * formateado, descartando cualquier signo/prefijo de moneda.
49
+ *
50
+ * parseCurrency('$16.800'); // 16800
51
+ */
52
+ declare function parseCurrency(formatted: string, locale?: string): number;
53
+ /** "12:40" — hora en formato de 24 horas. */
54
+ declare function formatClockTime(date: Date): string;
55
+ /**
56
+ * Quita espacios (incluido cualquier espacio en blanco intermedio, no solo
57
+ * al principio/final) y puntos de un identificador de documento — un
58
+ * espacio invisible (ej. pegado por accidente desde otra fuente) es un
59
+ * motivo de rechazo silencioso real que un usuario no sabe explicarse.
60
+ * Genérico: sirve tanto para RUT (`formatChileanRut` ya lo usa por
61
+ * dentro) como para cualquier otro identificador con el mismo problema.
62
+ *
63
+ * sanitizeDocumentId(' 51 00004-8 '); // '5100004-8'
64
+ * sanitizeDocumentId('12.345.678-9'); // '12345678-9'
65
+ */
66
+ declare function sanitizeDocumentId(raw: string): string;
67
+ /**
68
+ * Formatea un RUT chileno insertando el guion automáticamente a medida
69
+ * que se escribe — igual que un input de tarjeta de crédito, el usuario
70
+ * solo tipea dígitos (y opcionalmente `k`/`K` como dígito verificador) y
71
+ * el guion aparece solo antes del último carácter. Solo da forma al
72
+ * string — no valida si el dígito verificador es matemáticamente
73
+ * correcto (ver `isValidChileanRut` para eso) ni si la cuenta existe
74
+ * (eso lo confirma GAM del lado servidor al autenticar).
75
+ *
76
+ * formatChileanRut('123456789'); // '12345678-9'
77
+ * formatChileanRut('5100004-8'); // '5100004-8' (ya formateado, idempotente)
78
+ * formatChileanRut('5100004k'); // '5100004-k'
79
+ * formatChileanRut('510000 4-8 '); // '5100004-8' (espacios ignorados)
80
+ */
81
+ declare function formatChileanRut(raw: string): string;
82
+ /**
83
+ * Valida un RUT chileno YA formateado (`cuerpo-DV`, ej. `'12345678-9'`)
84
+ * contra el algoritmo módulo 11 real — a diferencia del `pattern` de
85
+ * `document-id.config.ts` en cada portal consumidor (que solo exige la
86
+ * FORMA: dígitos + guion + dígito verificador), esta función confirma
87
+ * que el dígito verificador sea matemáticamente correcto para ese
88
+ * cuerpo. Sigue sin confirmar que la cuenta exista — eso solo lo sabe
89
+ * GAM al autenticar — pero atrapa el error tipográfico más común
90
+ * (invertir/cambiar un dígito) antes de intentar el login.
91
+ *
92
+ * isValidChileanRut('20236276-1'); // true (DV real de ese cuerpo)
93
+ * isValidChileanRut('20236276-8'); // false (DV real es '1', no '8')
94
+ * isValidChileanRut('no-es-rut'); // false (ni siquiera tiene la forma)
95
+ */
96
+ declare function isValidChileanRut(rut: string): boolean;
97
+
98
+ /**
99
+ * Signal reactivo con el estado actual de un media query — para cuando un
100
+ * componente necesita SABER en qué lado de un breakpoint está (no solo
101
+ * mostrar/ocultar con CSS). Un `@media` en `styles` no alcanza cuando la
102
+ * decisión no es puramente visual: por ejemplo, un componente hijo que
103
+ * recibe un input booleano (`[collapsed]`) no puede "leer" un breakpoint
104
+ * CSS del padre — necesita que alguien en TypeScript se lo diga.
105
+ *
106
+ * Encontrado al construir `SidebarShell`: el estado `collapsed` (colapso
107
+ * del rail en desktop) se pasaba tal cual a cada `kf-sidebar-nav-item`, sin
108
+ * importar el viewport. En mobile, donde el rail deslizado siempre muestra
109
+ * etiquetas completas (ver estilos de `SidebarShell`), los ítems seguían
110
+ * ocultando su label si el usuario había dejado el rail colapsado en
111
+ * desktop antes de achicar la ventana — un CSS que dice "en mobile se ve
112
+ * ancho" no cambia el valor del input que ya llegó al hijo.
113
+ *
114
+ * Debe llamarse dentro de un contexto de inyección (el `constructor` de un
115
+ * componente, o un campo de clase inicializado ahí — mismo requisito que
116
+ * cualquier función que use `inject()`).
117
+ *
118
+ * protected readonly isMobile = matchMediaSignal('(max-width: 900px)');
119
+ * // ...
120
+ * [collapsed]="collapsed() && !isMobile()"
121
+ */
122
+ declare function matchMediaSignal(query: string): Signal<boolean>;
123
+
124
+ /**
125
+ * Navegación estándar de ARIA tabs/listbox/radiogroup: flechas mueven el
126
+ * foco entre opciones y activan la seleccionada. Usado por `kf-tabs`,
127
+ * `kf-folder-tabs` (orientación horizontal) y `kf-selectable-card-group`
128
+ * (vertical) — todos comparten la misma forma (lista de opciones con
129
+ * `value`, botones identificados por `idPrefix + value`).
130
+ *
131
+ * `orientation` decide qué par de flechas avanza/retrocede — mismo patrón
132
+ * que exige el WAI-ARIA Authoring Practices para radiogroup vertical
133
+ * (ArrowDown/ArrowUp) vs. tablist horizontal (ArrowRight/ArrowLeft). Home/End
134
+ * funcionan igual en ambas orientaciones.
135
+ *
136
+ * `select` es responsabilidad del consumidor: esta función solo calcula
137
+ * cuál es la siguiente opción y mueve el foco al botón correspondiente.
138
+ */
139
+ declare function handleArrowKeyNavigation<T extends {
140
+ value: string;
141
+ }>(event: KeyboardEvent, options: T[], currentValue: string, idPrefix: string, select: (value: string) => void, orientation?: 'horizontal' | 'vertical'): void;
142
+
143
+ /**
144
+ * Normaliza texto para comparación de búsqueda insensible a mayúsculas y
145
+ * diacríticos — así "cor" encuentre "Córdoba" sin necesidad de tildes.
146
+ *
147
+ * Compartida entre `Select` y `MultiSelect` (`/core`, los dos componentes con
148
+ * buscador interno auto-activado por `searchThreshold`) y `QuotePicker`
149
+ * (`/business`).
150
+ */
151
+ declare function normalizeForSearch(text: string): string;
152
+
153
+ export { formatChileanRut, formatClockTime, formatCurrency, formatNumber, handleArrowKeyNavigation, isValidChileanRut, matchMediaSignal, normalizeForSearch, parseCurrency, parseNumber, sanitizeDocumentId };
154
+ export type { FormatCurrencyOptions, FormatNumberOptions };