pixelon 0.4.3 → 0.5.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.
@@ -11,6 +11,17 @@ export declare function usePlaceSuggestions(query: string, enabled: boolean): {
11
11
  } | null>;
12
12
  clear: () => void;
13
13
  };
14
+ /** SPEC-131 T6 — la dirección formateada de Google repite tramos.
15
+ *
16
+ * Medido: el `formattedAddress` de una calle de El Poblado vuelve como
17
+ * «Cl 10 #43-20, El Poblado, Medellín, El Poblado, Medellín, Antioquia», porque el nombre del
18
+ * lugar ya trae el barrio y la ciudad que luego añade la parte administrativa. Esa cadena se
19
+ * guarda tal cual y aparece en el chat, en la ficha, en la tabla y en Conversaciones.
20
+ *
21
+ * Se comparan los tramos sin tildes ni mayúsculas, que es donde estaba el otro caso visto
22
+ * («Itagüí, Itagüi»), y se conserva el primero de cada uno: el orden de una dirección va de lo
23
+ * particular a lo general, así que el que sobra siempre es el segundo. */
24
+ export declare function limpiarDireccion(address: string): string;
14
25
  /**
15
26
  * Traduce una coordenada a una dirección legible.
16
27
  * Requiere Geocoding habilitado en la clave del navegador; si no lo está, devuelve null y el
@@ -14,6 +14,7 @@ export interface ReactiveCrudProps {
14
14
  onCreateClose?: () => void;
15
15
  }
16
16
  export declare function matchesVisibleWhen(a: RowActionDef, row: Record<string, unknown>): boolean;
17
+ export declare function laQueTocaAhora(actions: RowActionDef[], row: Record<string, unknown>): RowActionDef | undefined;
17
18
  export declare function matchesDisabledWhen(a: RowActionDef, row: Record<string, unknown>): boolean;
18
19
  export declare function disabledReasonFor(a: RowActionDef, row: Record<string, unknown>): string | undefined;
19
20
  export declare function matchesDoneWhen(a: RowActionDef, row: Record<string, unknown>): boolean;
@@ -0,0 +1,10 @@
1
+ import type { ChatEventBus } from '../../../../../../core/eventBus/chatEventBus';
2
+ import type { ReactiveCrudTranscript } from './types';
3
+ export interface TranscriptSectionProps {
4
+ transcript: ReactiveCrudTranscript;
5
+ /** Valores del registro (fila + detalle): de ahí sale el id de la conversación. */
6
+ values: Record<string, unknown>;
7
+ eventBus?: ChatEventBus;
8
+ }
9
+ export declare function TranscriptSection({ transcript, values, eventBus }: TranscriptSectionProps): import("react/jsx-runtime").JSX.Element | null;
10
+ export default TranscriptSection;
@@ -114,8 +114,28 @@ export interface RowActionDef {
114
114
  * SPEC-113: es el respaldo — una condición con `reason` propio manda sobre este. */
115
115
  disabledReason?: string;
116
116
  /** SPEC-007: muestra un ✓ al final cuando `String(row[field])` está en `in` (ej. inspección ya
117
- * registrada). Indicador de "hecho"; no bloquea reejecutar la acción. */
117
+ * registrada). Indicador de "hecho"; no bloquea reejecutar la acción.
118
+ *
119
+ * SPEC-129 T6: y es lo que decide qué queda escrito en una tarjeta ya gastada. Ahí solo se
120
+ * muestra lo que CUMPLE esta condición, porque es lo único que consta que se hizo: si el paso se
121
+ * cerró por otro camino —el barrido liberó la grúa, la operadora canceló— no hay nada que marcar
122
+ * y la tarjeta se queda con su frase, sin inventar un ✓. */
118
123
  doneWhen?: RowActionVisibleWhen;
124
+ /** SPEC-129 T6: cómo se llama esto una vez hecho. «Registrar inspección» → «Inspección
125
+ * registrada». En una tarjeta gastada el botón ya no es una oferta sino un acta, y un acta se
126
+ * escribe en pasado. Sin esto se cae a `label`, que sigue leyéndose bien con el ✓ al lado. */
127
+ doneLabel?: string;
128
+ /** SPEC-127 T4: cuándo esta acción es LA QUE TOCA AHORA. La que cumple va primera y destacada;
129
+ * el resto pasa a un segundo plano, disponible pero sin competir.
130
+ *
131
+ * No es lo mismo que `intent: 'primary'`, que describe la acción SIEMPRE («asignar es una acción
132
+ * importante»). Esto describe el MOMENTO: el mensaje que acompaña la tarjeta dice «Confírmalo
133
+ * para que la grúa salga», y entonces confirmar el pago es lo único que se le está pidiendo,
134
+ * aunque a su alrededor quepan siete cosas más.
135
+ *
136
+ * Si ninguna acción la cumple —o dos la cumplen— la tarjeta se comporta como antes: ninguna se
137
+ * destaca. Es preferible no señalar nada que señalar mal. */
138
+ ahoraToca?: RowActionVisibleWhen | RowActionVisibleWhen[];
119
139
  endpoint: EndpointRef;
120
140
  /** SPEC-002: varias llamadas en orden (ej. inspección = register-inspection foto + video). Si
121
141
  * se define, tiene prioridad sobre `endpoint`; todos comparten el mismo contexto del form. */
@@ -142,6 +162,23 @@ export interface ReactiveCrudDetail {
142
162
  /** Campo de la fila para el título del drawer (ej. 'service_number'). */
143
163
  titleField?: string;
144
164
  }
165
+ export interface ReactiveCrudTranscript {
166
+ /** Campo de la fila con el id de la conversación (ej. 'origin_chat_id'). */
167
+ chatIdField: string;
168
+ /** Endpoint que devuelve `{ lines, total, from_user }`; recibe `{ [param]: <chatIdField> }`. */
169
+ get: EndpointRef;
170
+ /** Clave del cuerpo donde viaja el id (default 'chat_id'). */
171
+ param?: string;
172
+ /** Título de la sección. Ej: 'Conversación con el cliente'. */
173
+ title?: string;
174
+ /** Qué decir cuando la otra parte no ha escrito nada. Es una respuesta, no un hueco. */
175
+ silentText?: string;
176
+ /** Con qué nombre se pinta cada lado. */
177
+ labels?: {
178
+ user?: string;
179
+ assistant?: string;
180
+ };
181
+ }
145
182
  export interface ReactiveCrudConfig {
146
183
  title?: string;
147
184
  /** Campo id de la fila (getRowKey de LumiCrud es obligatorio). */
@@ -154,6 +191,8 @@ export interface ReactiveCrudConfig {
154
191
  };
155
192
  /** Vista "Ver" con campos + galería de archivos. */
156
193
  detail?: ReactiveCrudDetail;
194
+ /** SPEC-128 T5 — conversación en solo lectura dentro de «Ver». Ver `ReactiveCrudTranscript`. */
195
+ transcript?: ReactiveCrudTranscript;
157
196
  rowActions?: RowActionDef[];
158
197
  filters?: FilterFieldConfig[];
159
198
  /** SPEC-014 — con qué filtros NACE la tabla. `filters` (arriba) dice qué se PUEDE filtrar; esto,
@@ -15,6 +15,12 @@ export interface ServicesMapConfig {
15
15
  data: {
16
16
  list: EndpointRef;
17
17
  };
18
+ /** SPEC-131 T6 — qué pide el mapa cuando nadie acota nada.
19
+ *
20
+ * Un mapa de seguimiento sin filtro devuelve el historial entero, y eso es lo que recibía quien
21
+ * preguntaba «¿ya viene mi grúa?». El `filter` de la instancia PISA esto: cuando quien emite el
22
+ * componente sí sabe qué acotar, manda él. */
23
+ defaultFilter?: Record<string, unknown>;
18
24
  mapping: ServicesMapMapping;
19
25
  /** Icono para todos los puntos cuando la fila no trae uno. */
20
26
  defaultIcon?: string;
@@ -48,6 +54,9 @@ export interface ServicesMapConfig {
48
54
  emptyText?: string;
49
55
  /** Aviso de las filas que no se pudieron ubicar. `{n}` se reemplaza por el número. */
50
56
  missingText?: string;
57
+ /** SPEC-127 — el mismo aviso cuando falta UNA sola. Sin esto se lee «1 servicios sin
58
+ * ubicación registrada». Opcional: sin él se usa `missingText` para cualquier número. */
59
+ missingTextOne?: string;
51
60
  outsideText?: string;
52
61
  loadingText?: string;
53
62
  };
@@ -22,7 +22,6 @@ export { ServicesMap } from './ServicesMap/ServicesMap';
22
22
  export { ServicesMapChat } from './ServicesMap/ServicesMapChat';
23
23
  export type { ServicesMapConfig } from './ServicesMap/types';
24
24
  export { ServiceShortcuts } from './ServiceShortcuts/ServiceShortcuts';
25
- export { ServiceShortcutsChat } from './ServiceShortcuts/ServiceShortcutsChat';
26
25
  export { ChatNavigator } from './ChatNavigator/ChatNavigator';
27
26
  export { ChatNavigatorChat } from './ChatNavigator/ChatNavigatorChat';
28
27
  export type { ChatNavigatorConfig, ChatNavigatorItem, ChatNavigatorEndpoint } from './ChatNavigator/types';
@@ -14,9 +14,16 @@ export interface UseAutoScrollOptions {
14
14
  * desconectarlo), dos envíos seguidos dejaban dos observadores compitiendo por mover el scroll,
15
15
  * y ninguno se limpiaba al desmontar.
16
16
  */
17
+ /** SPEC-131 T3 — cuánto espacio hay que reservar al final para que el objetivo pueda subir arriba.
18
+ *
19
+ * Lo que falte y nada más: si desde el objetivo hasta el final ya hay una pantalla de contenido,
20
+ * no hace falta reservar nada. Reservar `clientHeight` a ciegas mete una pantalla de blanco al
21
+ * final, y con el scroll topado eso deja la conversación entera por encima del borde superior. */
22
+ export declare function reservaNecesaria(clientHeight: number, scrollHeight: number, targetTop: number): number;
17
23
  export declare const useAutoScroll: ({ messagesEndRef, messagesContainerRef, }: UseAutoScrollOptions) => {
18
24
  scrollToLastUserMessage: () => void;
19
25
  pinLastUserMessage: () => void;
20
26
  scrollToProactive: () => void;
21
- scrollToBottom: () => void;
27
+ scrollToBottom: (suave?: boolean) => void;
28
+ aterrizarAlFinal: () => void;
22
29
  };
@@ -0,0 +1,13 @@
1
+ export interface LineaResumen {
2
+ label: string;
3
+ valor: string;
4
+ }
5
+ interface CampoResumible {
6
+ name: string;
7
+ label?: string;
8
+ moleculeType?: string;
9
+ uiProps?: Record<string, unknown>;
10
+ }
11
+ /** Lo que se va a enviar, en el orden del formulario y sin los campos vacíos. */
12
+ export declare function resumenParaConfirmar(campos: ReadonlyArray<CampoResumible>, datos: Record<string, unknown> | null | undefined): LineaResumen[];
13
+ export {};
@@ -51,6 +51,12 @@ export interface RenderFieldConfig {
51
51
  formatValue?: (value: unknown, row: unknown) => React.ReactNode;
52
52
  /** Función para parsear el valor antes de submit */
53
53
  parseValue?: (value: unknown) => unknown;
54
+ /** SPEC-131 T7 — cuántas columnas ocupa el campo en el formulario.
55
+ *
56
+ * En un grid las celdas de una fila comparten altura, así que un campo que se despliega —el de
57
+ * ubicación, que abre un mapa de verificación al elegir la dirección— deja a su hermana con
58
+ * cientos de píxeles de blanco al lado. Los campos que crecen ocupan la fila entera. */
59
+ gridSpan?: number;
54
60
  }
55
61
  /**
56
62
  * Estado de paginación
@@ -19,6 +19,17 @@ export interface ChatConfig {
19
19
  * sola es preferible a un panel que se apaga por una conexión mala; el backend sigue rechazando
20
20
  * lo que no toca. */
21
21
  chatIsForeign?: boolean;
22
+ /** SPEC-128 — DE QUIÉN es esta conversación (el agente que la atiende).
23
+ *
24
+ * `chatIsForeign` dice «esto es de otro»; esto dice **de quién**. No es lo mismo, y hasta ahora
25
+ * solo existía lo primero: la operadora abría la conversación del solicitante y sus componentes
26
+ * se pintaban con el rol de ELLA, así que veía «Gestionar servicios» donde al cliente se le
27
+ * ofreció «Solicitar una grúa». Un mensaje del pasado no es una pregunta sobre quién mira: es el
28
+ * registro de lo que se dijo, y para pintarlo bien hay que saber a quién se le dijo.
29
+ *
30
+ * El host lo pone porque es quien sabe qué conversación está abriendo. Opcional: sin él, los
31
+ * componentes se comportan como antes (deciden por quien mira). */
32
+ chatAgentName?: string;
22
33
  /** IANA timezone identifier (e.g. "America/Bogota") */
23
34
  timezone: string;
24
35
  /** BCP 47 locale string (e.g. "es-CO") */
@@ -59,6 +70,20 @@ export interface ChatConfig {
59
70
  * Se tipa como bag genérico para no acoplar `core` a los tipos del componente.
60
71
  */
61
72
  resolveModuleConfig?: (module: string) => Record<string, unknown> | undefined;
73
+ /**
74
+ * SPEC-128: qué acciones toca mostrar en un MOMENTO del flujo. Lo provee el host, que es quien
75
+ * sabe qué significa «comprobante_subido» en su producto — aquí solo se sabe que hay momentos.
76
+ *
77
+ * Existe porque la tarjeta tenía que ADIVINAR en qué punto estaba, mirando campos de la fila y
78
+ * decidiendo con cuatro capas de condiciones cuáles de las quince acciones mostrar. Salían ocho
79
+ * botones para una decisión, y pasos futuros apagados ocupando tres cuartas partes. Y cuando dos
80
+ * momentos comparten los mismos datos, adivinar es imposible.
81
+ *
82
+ * Devolver `undefined` significa «no sé de ese momento»: entonces se decide por el estado, como
83
+ * siempre. Una lista VACÍA es distinto — es «en este momento no hay nada que hacer», y la tarjeta
84
+ * enseña solo «Ver».
85
+ */
86
+ resolveMomento?: (momento: string) => string[] | undefined;
62
87
  /**
63
88
  * SPEC-022: clave de Google Maps JavaScript API para el componente `map_view`. La provee el
64
89
  * HOST desde su entorno; no viaja en el payload del LLM (es configuración de despliegue, y el
@@ -0,0 +1,12 @@
1
+ export interface Separadores {
2
+ /** El que agrupa los miles: `.` en es-CO, `,` en en-US. */
3
+ miles: string;
4
+ /** El que abre los decimales: `,` en es-CO, `.` en en-US. */
5
+ decimal: string;
6
+ }
7
+ /** Cómo se escriben los números en ese locale, según el propio navegador.
8
+ *
9
+ * Se deriva en vez de tabularse: una tabla de locales se queda corta en cuanto alguien vende en
10
+ * otro país, y `Intl` ya lo sabe. Si el locale no se entiende, se responde el formato de la casa
11
+ * en vez de reventar — un número mal separado es feo; un formulario que no pinta, inservible. */
12
+ export declare function separadoresDelLocale(locale?: string): Separadores;