pixelon 0.3.31 → 0.3.74
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/dist/components/atoms/chat/Icon/Icon.d.ts +4 -0
- package/dist/components/atoms/lumi/Button/Button.d.ts +2 -0
- package/dist/components/atoms/lumi/Card/Card.d.ts +12 -0
- package/dist/components/atoms/lumi/Card/index.d.ts +3 -0
- package/dist/components/atoms/lumi/Card/types.d.ts +32 -0
- package/dist/components/atoms/lumi/Icon/Icon.d.ts +3 -0
- package/dist/components/atoms/lumi/Input/Input.d.ts +2 -0
- package/dist/components/atoms/lumi/index.d.ts +1 -0
- package/dist/components/molecules/chat/ChatFloatingActions/ChatFloatingActions.d.ts +42 -0
- package/dist/components/molecules/chat/ChatFloatingActions/index.d.ts +2 -0
- package/dist/components/molecules/chat/FileViewer/FileViewer.d.ts +2 -1
- package/dist/components/molecules/chat/FullscreenViewer/FullscreenViewer.d.ts +2 -1
- package/dist/components/molecules/chat/NewMessageDivider/NewMessageDivider.d.ts +6 -0
- package/dist/components/molecules/chat/StructuredContent/components/Cart/Cart.d.ts +3 -0
- package/dist/components/molecules/chat/StructuredContent/components/ChatNavigator/ChatNavigator.d.ts +8 -0
- package/dist/components/molecules/chat/StructuredContent/components/ChatNavigator/ChatNavigatorChat.d.ts +3 -0
- package/dist/components/molecules/chat/StructuredContent/components/ChatNavigator/chatNavigatorChips.d.ts +7 -0
- package/dist/components/molecules/chat/StructuredContent/components/ChatNavigator/types.d.ts +88 -0
- package/dist/components/molecules/chat/StructuredContent/components/FileField/FileField.d.ts +4 -0
- package/dist/components/molecules/chat/StructuredContent/components/FileField/types.d.ts +19 -0
- package/dist/components/molecules/chat/StructuredContent/components/LocationField/LocationField.d.ts +4 -0
- package/dist/components/molecules/chat/StructuredContent/components/LocationField/types.d.ts +32 -0
- package/dist/components/molecules/chat/StructuredContent/components/LocationField/usePlaces.d.ts +19 -0
- package/dist/components/molecules/chat/StructuredContent/components/MapView/MapView.d.ts +4 -0
- package/dist/components/molecules/chat/StructuredContent/components/MapView/MapViewChat.d.ts +3 -0
- package/dist/components/molecules/chat/StructuredContent/components/MapView/markerIcons.d.ts +9 -0
- package/dist/components/molecules/chat/StructuredContent/components/MapView/types.d.ts +90 -0
- package/dist/components/molecules/chat/StructuredContent/components/MapView/useGoogleMaps.d.ts +8 -0
- package/dist/components/molecules/chat/StructuredContent/components/ProductCard/ProductCard.d.ts +3 -0
- package/dist/components/molecules/chat/StructuredContent/components/ProductCarousel/ProductCarousel.d.ts +3 -0
- package/dist/components/molecules/chat/StructuredContent/components/ProductManager/ProductManager.d.ts +3 -0
- package/dist/components/molecules/chat/StructuredContent/components/ReactiveCrud/ActionFormDrawer.d.ts +12 -0
- package/dist/components/molecules/chat/StructuredContent/components/ReactiveCrud/DetailDrawer.d.ts +18 -0
- package/dist/components/molecules/chat/StructuredContent/components/ReactiveCrud/PriceNegotiationChat.d.ts +4 -0
- package/dist/components/molecules/chat/StructuredContent/components/ReactiveCrud/ReactiveCrud.d.ts +20 -0
- package/dist/components/molecules/chat/StructuredContent/components/ReactiveCrud/ReactiveCrudChat.d.ts +4 -0
- package/dist/components/molecules/chat/StructuredContent/components/ReactiveCrud/ReactiveCrudItemChat.d.ts +4 -0
- package/dist/components/molecules/chat/StructuredContent/components/ReactiveCrud/buildCrudYupSchema.d.ts +3 -0
- package/dist/components/molecules/chat/StructuredContent/components/ReactiveCrud/formatters.d.ts +4 -0
- package/dist/components/molecules/chat/StructuredContent/components/ReactiveCrud/optionsLoader.d.ts +5 -0
- package/dist/components/molecules/chat/StructuredContent/components/ReactiveCrud/types.d.ts +148 -0
- package/dist/components/molecules/chat/StructuredContent/components/ReactiveCrud/useReactiveCrud.d.ts +19 -0
- package/dist/components/molecules/chat/StructuredContent/components/ReactiveMap/ReactiveMap.d.ts +12 -0
- package/dist/components/molecules/chat/StructuredContent/components/ReactiveMap/ReactiveMapChat.d.ts +3 -0
- package/dist/components/molecules/chat/StructuredContent/components/ReactiveMap/types.d.ts +36 -0
- package/dist/components/molecules/chat/StructuredContent/components/ServiceShortcuts/ServiceShortcuts.d.ts +21 -0
- package/dist/components/molecules/chat/StructuredContent/components/ServiceShortcuts/ServiceShortcutsChat.d.ts +3 -0
- package/dist/components/molecules/chat/StructuredContent/components/ServicesMap/ServicesMap.d.ts +14 -0
- package/dist/components/molecules/chat/StructuredContent/components/ServicesMap/ServicesMapChat.d.ts +3 -0
- package/dist/components/molecules/chat/StructuredContent/components/ServicesMap/outliers.d.ts +14 -0
- package/dist/components/molecules/chat/StructuredContent/components/ServicesMap/types.d.ts +54 -0
- package/dist/components/molecules/chat/StructuredContent/components/UserTools/UserTools.d.ts +10 -0
- package/dist/components/molecules/chat/StructuredContent/components/UserTools/UserToolsChat.d.ts +3 -0
- package/dist/components/molecules/chat/StructuredContent/components/UserTools/types.d.ts +17 -0
- package/dist/components/molecules/chat/StructuredContent/components/index.d.ts +21 -0
- package/dist/components/molecules/chat/StructuredContent/helpers/types.d.ts +2 -0
- package/dist/components/molecules/chat/StructuredContent/helpers/uploadViaEventBus.d.ts +2 -0
- package/dist/components/molecules/lumi/BottomSheet/BottomSheet.d.ts +29 -0
- package/dist/components/molecules/lumi/BottomSheet/index.d.ts +1 -0
- package/dist/components/molecules/lumi/Drawer/useDrawerKeyboardLock.d.ts +18 -0
- package/dist/components/molecules/lumi/Filter/types.d.ts +4 -0
- package/dist/components/molecules/lumi/LiveIndicator/LiveIndicator.d.ts +28 -0
- package/dist/components/molecules/lumi/LiveIndicator/index.d.ts +1 -0
- package/dist/components/molecules/lumi/Menu/types.d.ts +5 -0
- package/dist/components/molecules/lumi/SessionExpiryPrompt/SessionExpiryPrompt.d.ts +25 -0
- package/dist/components/molecules/lumi/SessionExpiryPrompt/index.d.ts +1 -0
- package/dist/components/molecules/lumi/index.d.ts +2 -0
- package/dist/components/organisms/chat/Chat/hooks/useAutoScroll.d.ts +6 -0
- package/dist/components/organisms/chat/Chat/hooks/useChatHandlers.d.ts +1 -2
- package/dist/components/organisms/chat/Chat/hooks/useInputFocus.d.ts +1 -0
- package/dist/components/organisms/lumi/DashboardSidebar/types.d.ts +13 -0
- package/dist/components/organisms/lumi/SessionExpiryPrompt/SessionExpiryPrompt.d.ts +24 -0
- package/dist/components/organisms/lumi/SessionExpiryPrompt/index.d.ts +1 -0
- package/dist/components/organisms/lumi/index.d.ts +1 -0
- package/dist/components/templates/lumi/Crud/Crud.d.ts +1 -1
- package/dist/components/templates/lumi/Crud/types.d.ts +27 -0
- package/dist/core/chat/ChatConfigContext.d.ts +18 -0
- package/dist/core/chat/chatMessage.d.ts +3 -0
- package/dist/core/constants/chat.d.ts +1 -0
- package/dist/core/constants/lumi.d.ts +4 -0
- package/dist/core/eventBus/chatEventBus.d.ts +84 -0
- package/dist/core/eventBus/fleetCache.d.ts +3 -0
- package/dist/core/eventBus/index.d.ts +2 -1
- package/dist/core/types.d.ts +7 -0
- package/dist/index.d.ts +24 -1
- package/dist/index.esm.js +17308 -13831
- package/dist/index.js +17321 -13829
- package/dist/styles.css +1 -1
- package/dist/styles.css.map +1 -1
- package/package.json +1 -1
- package/src/styles/domains/_chat.scss +10 -0
- package/src/styles/index.scss +20 -0
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import type { FieldValidation } from '../ReactiveForm/types';
|
|
2
|
+
import type { FilterFieldConfig, FilterManager } from '../../../../lumi/Filter/types';
|
|
3
|
+
export type CrudMolecule = 'INPUT' | 'INPUT_NUMBER' | 'INPUT_CURRENCY' | 'TEXTAREA' | 'SELECT' | 'DATE_INPUT' | 'TIME_INPUT' | 'CHECKBOX' | 'BADGE' | 'FILE'
|
|
4
|
+
/** SPEC-023 — ubicación: un campo con dos vías (mi ubicación / buscar dirección) que produce
|
|
5
|
+
* dirección + coordenadas. Requiere `bind` para saber a qué claves van los tres valores. */
|
|
6
|
+
| 'LOCATION'
|
|
7
|
+
/** SPEC-011 — columna que abre la conversación: el valor de la celda es el chatId; al click
|
|
8
|
+
* emite OPEN_CHAT. Vacío → sin botón. Solo tabla (showInForm:false). */
|
|
9
|
+
| 'CHAT_LINK';
|
|
10
|
+
/** Endpoint de escritura/lectura. `payloadMap` resuelve `$campo` contra el contexto. */
|
|
11
|
+
export interface EndpointRef {
|
|
12
|
+
service: string;
|
|
13
|
+
url: string;
|
|
14
|
+
method: string;
|
|
15
|
+
payloadMap?: Record<string, string>;
|
|
16
|
+
/** SPEC-002: si apunta a un campo array (`$photos`), ejecuta el endpoint UNA vez por elemento;
|
|
17
|
+
* en el payloadMap, `$item` es el elemento actual (ej. inspección con N fotos). */
|
|
18
|
+
forEach?: string;
|
|
19
|
+
}
|
|
20
|
+
/** Carga de opciones para un SELECT (mismo patrón que reactive_form). */
|
|
21
|
+
export interface CrudFieldOptionsEndpoint {
|
|
22
|
+
service: string;
|
|
23
|
+
url: string;
|
|
24
|
+
method: string;
|
|
25
|
+
value_field: string;
|
|
26
|
+
label_field: string;
|
|
27
|
+
response_path?: string;
|
|
28
|
+
/** SPEC-002: body de la request (ej. { all_data: true } para listas paginadas). */
|
|
29
|
+
body?: Record<string, unknown>;
|
|
30
|
+
}
|
|
31
|
+
export interface ReactiveCrudField {
|
|
32
|
+
name: string;
|
|
33
|
+
label: string;
|
|
34
|
+
moleculeType: CrudMolecule;
|
|
35
|
+
/** SPEC-023 — solo para LOCATION: a qué claves del payload van los tres valores del campo.
|
|
36
|
+
* Un campo produce tres datos, así que el consumidor declara su destino en vez de que el
|
|
37
|
+
* componente invente convenciones por sufijo. */
|
|
38
|
+
bind?: {
|
|
39
|
+
address: string;
|
|
40
|
+
lat: string;
|
|
41
|
+
lng: string;
|
|
42
|
+
source?: string;
|
|
43
|
+
};
|
|
44
|
+
showInTable?: boolean;
|
|
45
|
+
showInForm?: boolean;
|
|
46
|
+
showInModes?: Array<'create' | 'edit' | 'view'>;
|
|
47
|
+
required?: boolean;
|
|
48
|
+
placeholder?: string;
|
|
49
|
+
options?: Array<{
|
|
50
|
+
value: string;
|
|
51
|
+
label: string;
|
|
52
|
+
color?: string;
|
|
53
|
+
}>;
|
|
54
|
+
optionsEndpoint?: CrudFieldOptionsEndpoint;
|
|
55
|
+
validation?: FieldValidation;
|
|
56
|
+
/** Clave del registro de formatters (§8) — NO función inline. */
|
|
57
|
+
format?: string;
|
|
58
|
+
/** Ancho de columna. `number` = fracción flex si la columna NO es fija (ej. 2 = 2 partes);
|
|
59
|
+
* con `fixed` un número se toma como px. `string` = valor CSS exacto (ej. '150px', '20%'). */
|
|
60
|
+
columnWidth?: number | string;
|
|
61
|
+
/** SPEC-006 — muestra un botón de copiar junto al valor en el detalle "Ver" (solo si hay dato). */
|
|
62
|
+
copyable?: boolean;
|
|
63
|
+
/** Fija la columna al hacer scroll horizontal (sticky). Requiere `columnWidth` y
|
|
64
|
+
* `tableScroll.x` en el config. Típico: la 1ª columna con `fixed: 'left'`. */
|
|
65
|
+
fixed?: 'left' | 'right';
|
|
66
|
+
align?: 'left' | 'center' | 'right';
|
|
67
|
+
/** SPEC-002 (solo FILE): filtro del picker, ej. 'image/*' | 'video/*' | 'application/pdf'. */
|
|
68
|
+
accept?: string;
|
|
69
|
+
/** SPEC-002 (solo FILE): tipo para el media/file-manager: 'image'|'video'|'file'|'audio'. */
|
|
70
|
+
fileType?: string;
|
|
71
|
+
/** SPEC-002 (solo FILE): permite seleccionar y subir varios archivos; el valor es un array de ids. */
|
|
72
|
+
multiple?: boolean;
|
|
73
|
+
/** SPEC-012 (solo CHAT_LINK): abre VARIOS chats desde distintos campos de la fila (role-aware).
|
|
74
|
+
* Renderiza un botón por fuente con valor. Si se omite, usa el `name` (un solo chat). */
|
|
75
|
+
chats?: Array<{
|
|
76
|
+
field: string;
|
|
77
|
+
label?: string;
|
|
78
|
+
}>;
|
|
79
|
+
}
|
|
80
|
+
/** Visibilidad de una acción según el valor de un campo de la fila (dato, no función). */
|
|
81
|
+
export interface RowActionVisibleWhen {
|
|
82
|
+
field: string;
|
|
83
|
+
in: string[];
|
|
84
|
+
}
|
|
85
|
+
export interface RowActionDef {
|
|
86
|
+
key: string;
|
|
87
|
+
label: string;
|
|
88
|
+
icon?: string;
|
|
89
|
+
intent?: 'primary' | 'secondary' | 'danger';
|
|
90
|
+
visibleWhen?: RowActionVisibleWhen;
|
|
91
|
+
/** SPEC-007: la acción se muestra pero queda DESHABILITADA cuando `String(row[field])` está en
|
|
92
|
+
* `in` (ej. "Iniciar" deshabilitado hasta que `has_inspection` sea true). */
|
|
93
|
+
disabledWhen?: RowActionVisibleWhen;
|
|
94
|
+
/** SPEC-007: tooltip cuando la acción está deshabilitada (ej. "Registra la inspección primero"). */
|
|
95
|
+
disabledReason?: string;
|
|
96
|
+
/** SPEC-007: muestra un ✓ al final cuando `String(row[field])` está en `in` (ej. inspección ya
|
|
97
|
+
* registrada). Indicador de "hecho"; no bloquea reejecutar la acción. */
|
|
98
|
+
doneWhen?: RowActionVisibleWhen;
|
|
99
|
+
endpoint: EndpointRef;
|
|
100
|
+
/** SPEC-002: varias llamadas en orden (ej. inspección = register-inspection foto + video). Si
|
|
101
|
+
* se define, tiene prioridad sobre `endpoint`; todos comparten el mismo contexto del form. */
|
|
102
|
+
endpoints?: EndpointRef[];
|
|
103
|
+
/** Sub-form declarativo para acciones con input (asignar→grúa, completar→precio). SPEC-001 T2. */
|
|
104
|
+
form?: {
|
|
105
|
+
fields: ReactiveCrudField[];
|
|
106
|
+
payloadMap?: Record<string, string>;
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/** Vista de detalle ("Ver"): campos read-only + galería de archivos (fotos/videos/docs). */
|
|
110
|
+
export interface ReactiveCrudDetail {
|
|
111
|
+
/** Endpoint que devuelve el detalle agregado; recibe { service_id: <idField> }. */
|
|
112
|
+
get: EndpointRef;
|
|
113
|
+
/** Ruta al array de documentos dentro de la respuesta (default 'documents'). */
|
|
114
|
+
documentsPath?: string;
|
|
115
|
+
/** Campo del documento con el id del archivo en el media store (default 'media_file_id'). */
|
|
116
|
+
mediaIdField?: string;
|
|
117
|
+
/** Cómo resolver la URL del archivo: GET a `urlPath` con `{id}` reemplazado → { url }. */
|
|
118
|
+
media?: {
|
|
119
|
+
service: string;
|
|
120
|
+
urlPath: string;
|
|
121
|
+
};
|
|
122
|
+
/** Campo de la fila para el título del drawer (ej. 'service_number'). */
|
|
123
|
+
titleField?: string;
|
|
124
|
+
}
|
|
125
|
+
export interface ReactiveCrudConfig {
|
|
126
|
+
title?: string;
|
|
127
|
+
/** Campo id de la fila (getRowKey de LumiCrud es obligatorio). */
|
|
128
|
+
idField: string;
|
|
129
|
+
fields: ReactiveCrudField[];
|
|
130
|
+
data: {
|
|
131
|
+
list: EndpointRef;
|
|
132
|
+
create?: EndpointRef;
|
|
133
|
+
get?: EndpointRef;
|
|
134
|
+
};
|
|
135
|
+
/** Vista "Ver" con campos + galería de archivos. */
|
|
136
|
+
detail?: ReactiveCrudDetail;
|
|
137
|
+
rowActions?: RowActionDef[];
|
|
138
|
+
filters?: FilterFieldConfig[];
|
|
139
|
+
pageSize?: number;
|
|
140
|
+
labels?: Record<string, string>;
|
|
141
|
+
/** Scroll de la tabla. `x` habilita el scroll horizontal responsive + columnas `fixed`.
|
|
142
|
+
* Ej: `{ x: 1100 }` — bajo ese ancho aparece scroll y la 1ª columna queda fija. */
|
|
143
|
+
tableScroll?: {
|
|
144
|
+
x?: number | string;
|
|
145
|
+
y?: number | string;
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
export type { FilterManager };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type ChatEventBus } from '../../../../../../core/eventBus/chatEventBus';
|
|
2
|
+
import type { EndpointRef, ReactiveCrudConfig, FilterManager } from './types';
|
|
3
|
+
export declare function useReactiveCrud(config: ReactiveCrudConfig, eventBus?: ChatEventBus): {
|
|
4
|
+
rows: Record<string, unknown>[];
|
|
5
|
+
total: number;
|
|
6
|
+
loading: boolean;
|
|
7
|
+
error: string | null;
|
|
8
|
+
actionError: string | null;
|
|
9
|
+
clearActionError: () => void;
|
|
10
|
+
skip: number;
|
|
11
|
+
pageSize: number;
|
|
12
|
+
filters: FilterManager[];
|
|
13
|
+
setSkip: import("react").Dispatch<import("react").SetStateAction<number>>;
|
|
14
|
+
setFilters: import("react").Dispatch<import("react").SetStateAction<FilterManager[]>>;
|
|
15
|
+
reload: () => Promise<void>;
|
|
16
|
+
create: (values: Record<string, unknown>) => Promise<void>;
|
|
17
|
+
runEndpoint: (ep: EndpointRef, ctx: Record<string, unknown>) => Promise<void>;
|
|
18
|
+
runEndpoints: (eps: EndpointRef[], ctx: Record<string, unknown>) => Promise<void>;
|
|
19
|
+
};
|
package/dist/components/molecules/chat/StructuredContent/components/ReactiveMap/ReactiveMap.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ChatEventBus } from '../../../../../../core/eventBus/chatEventBus';
|
|
3
|
+
import type { ReactiveMapConfig } from './types';
|
|
4
|
+
export interface ReactiveMapProps {
|
|
5
|
+
config: ReactiveMapConfig;
|
|
6
|
+
eventBus?: ChatEventBus;
|
|
7
|
+
apiKey?: string;
|
|
8
|
+
/** Filtro que llega desde el LLM (ej. un número de servicio o un estado). */
|
|
9
|
+
filter?: Record<string, unknown>;
|
|
10
|
+
}
|
|
11
|
+
export declare const ReactiveMap: React.FC<ReactiveMapProps>;
|
|
12
|
+
export default ReactiveMap;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { EndpointRef } from '../ReactiveCrud/types';
|
|
2
|
+
export interface ReactiveMapMapping {
|
|
3
|
+
/** Campo de la fila que identifica el registro. */
|
|
4
|
+
id: string;
|
|
5
|
+
lat: string;
|
|
6
|
+
lng: string;
|
|
7
|
+
/** Campo para la etiqueta del marcador (ej. el número de servicio). */
|
|
8
|
+
label?: string;
|
|
9
|
+
/** Campo del que sale el icono; si no, se usa `defaultIcon`. */
|
|
10
|
+
icon?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface ReactiveMapConfig {
|
|
13
|
+
title?: string;
|
|
14
|
+
/** De dónde salen las filas. Se pide por el chatEventBus, como en ReactiveCrud. */
|
|
15
|
+
data: {
|
|
16
|
+
list: EndpointRef;
|
|
17
|
+
};
|
|
18
|
+
mapping: ReactiveMapMapping;
|
|
19
|
+
/** Icono para todos los puntos cuando la fila no trae uno. */
|
|
20
|
+
defaultIcon?: string;
|
|
21
|
+
/** Color por valor de un campo (mismo espíritu que la columna BADGE del crud). */
|
|
22
|
+
colorBy?: {
|
|
23
|
+
field: string;
|
|
24
|
+
map: Record<string, string>;
|
|
25
|
+
fallback?: string;
|
|
26
|
+
};
|
|
27
|
+
/** Endpoint del trayecto de UN registro. Sin esto, no se ofrecen rutas. */
|
|
28
|
+
route?: EndpointRef;
|
|
29
|
+
height?: number;
|
|
30
|
+
labels?: {
|
|
31
|
+
emptyText?: string;
|
|
32
|
+
/** Aviso de las filas que no se pudieron ubicar. `{n}` se reemplaza por el número. */
|
|
33
|
+
missingText?: string;
|
|
34
|
+
loadingText?: string;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { type ChatEventBus } from '../../../../../../core/eventBus/chatEventBus';
|
|
3
|
+
export interface ServiceShortcut {
|
|
4
|
+
id: string;
|
|
5
|
+
label: string;
|
|
6
|
+
hint?: string;
|
|
7
|
+
/** A dónde llevar. Alternativa a `prompt`. */
|
|
8
|
+
route?: string;
|
|
9
|
+
prompt?: string;
|
|
10
|
+
icon?: 'map' | 'list' | 'tow' | 'search' | 'user';
|
|
11
|
+
}
|
|
12
|
+
export interface ServiceShortcutsProps {
|
|
13
|
+
options: ServiceShortcut[];
|
|
14
|
+
eventBus?: ChatEventBus;
|
|
15
|
+
/** SPEC-052 — id ya elegido: apaga el grupo entero y marca cuál fue. */
|
|
16
|
+
selectedId?: string;
|
|
17
|
+
/** SPEC-052 — avisa al host para que persista la elección. */
|
|
18
|
+
onSelect?: (id: string) => void;
|
|
19
|
+
}
|
|
20
|
+
export declare const ServiceShortcuts: React.FC<ServiceShortcutsProps>;
|
|
21
|
+
export default ServiceShortcuts;
|
package/dist/components/molecules/chat/StructuredContent/components/ServicesMap/ServicesMap.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ChatEventBus } from '../../../../../../core/eventBus/chatEventBus';
|
|
3
|
+
import type { ServicesMapConfig } from './types';
|
|
4
|
+
export interface ServicesMapProps {
|
|
5
|
+
config: ServicesMapConfig;
|
|
6
|
+
eventBus?: ChatEventBus;
|
|
7
|
+
apiKey?: string;
|
|
8
|
+
/** Filtro que llega desde el LLM (ej. un número de servicio o un estado). */
|
|
9
|
+
filter?: Record<string, unknown>;
|
|
10
|
+
/** En una ruta dedicada el mapa llena el contenedor; en el chat va acotado. */
|
|
11
|
+
fill?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare const ServicesMap: React.FC<ServicesMapProps>;
|
|
14
|
+
export default ServicesMap;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { MapPoint } from '../MapView/types';
|
|
2
|
+
/** Radio, en kilómetros, dentro del cual un punto se considera parte del grupo. */
|
|
3
|
+
export declare const FIT_RADIUS_KM = 60;
|
|
4
|
+
export interface EncuadreResult {
|
|
5
|
+
/** Los mismos puntos, con `fit: false` en los que quedan fuera del ajuste. */
|
|
6
|
+
points: MapPoint[];
|
|
7
|
+
/** Cuántos quedaron fuera. Sirve para decirlo, que es la otra mitad de apartarlos. */
|
|
8
|
+
outside: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Marca como no-encuadrables los puntos que se alejan del grupo.
|
|
12
|
+
* Con menos de `MIN_POINTS` no toca nada: dos puntos lejanos son un trayecto, no un error.
|
|
13
|
+
*/
|
|
14
|
+
export declare function markFitOutliers(points: MapPoint[], radiusKm?: number): EncuadreResult;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { EndpointRef } from '../ReactiveCrud/types';
|
|
2
|
+
export interface ServicesMapMapping {
|
|
3
|
+
/** Campo de la fila que identifica el registro. */
|
|
4
|
+
id: string;
|
|
5
|
+
lat: string;
|
|
6
|
+
lng: string;
|
|
7
|
+
/** Campo para la etiqueta del marcador (ej. el número de servicio). */
|
|
8
|
+
label?: string;
|
|
9
|
+
/** Campo del que sale el icono; si no, se usa `defaultIcon`. */
|
|
10
|
+
icon?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface ServicesMapConfig {
|
|
13
|
+
title?: string;
|
|
14
|
+
/** De dónde salen las filas. Se pide por el chatEventBus, como en ReactiveCrud. */
|
|
15
|
+
data: {
|
|
16
|
+
list: EndpointRef;
|
|
17
|
+
};
|
|
18
|
+
mapping: ServicesMapMapping;
|
|
19
|
+
/** Icono para todos los puntos cuando la fila no trae uno. */
|
|
20
|
+
defaultIcon?: string;
|
|
21
|
+
/** Color por valor de un campo (mismo espíritu que la columna BADGE del crud). */
|
|
22
|
+
colorBy?: {
|
|
23
|
+
field: string;
|
|
24
|
+
map: Record<string, string>;
|
|
25
|
+
fallback?: string;
|
|
26
|
+
};
|
|
27
|
+
/** Endpoint del trayecto de UN registro. Sin esto, no se ofrecen rutas. */
|
|
28
|
+
route?: EndpointRef;
|
|
29
|
+
/** SPEC-025 — capa de grúas en movimiento. Sin esto, el mapa es solo de puntos fijos.
|
|
30
|
+
* Las posiciones NO se piden acá: las publica el host en el bus (`FLEET_POSITIONS`) tras
|
|
31
|
+
* abrir el WS, igual que las conversaciones. El componente nunca abre sockets. */
|
|
32
|
+
live?: {
|
|
33
|
+
/** Icono de la grúa en movimiento. */
|
|
34
|
+
icon?: string;
|
|
35
|
+
color?: string;
|
|
36
|
+
/** Color de una posición SIMULADA, para que no se confunda con una real (R5). */
|
|
37
|
+
simulatedColor?: string;
|
|
38
|
+
/** Milisegundos del desplazamiento entre dos reportes (R7). */
|
|
39
|
+
animateMs?: number;
|
|
40
|
+
labels?: {
|
|
41
|
+
/** `{n}` se reemplaza por el número de grúas en movimiento. */
|
|
42
|
+
liveText?: string;
|
|
43
|
+
simulatedText?: string;
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
height?: number;
|
|
47
|
+
labels?: {
|
|
48
|
+
emptyText?: string;
|
|
49
|
+
/** Aviso de las filas que no se pudieron ubicar. `{n}` se reemplaza por el número. */
|
|
50
|
+
missingText?: string;
|
|
51
|
+
outsideText?: string;
|
|
52
|
+
loadingText?: string;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { UserToolsConfig } from './types';
|
|
3
|
+
export interface UserToolsProps {
|
|
4
|
+
config: UserToolsConfig;
|
|
5
|
+
/** (id, nuevoValor). El host decide qué hacer y dónde guardarlo. */
|
|
6
|
+
onChange?: (id: string, value: boolean) => void;
|
|
7
|
+
className?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare const UserTools: React.FC<UserToolsProps>;
|
|
10
|
+
export default UserTools;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type UserToolKind = 'toggle';
|
|
2
|
+
export interface UserToolItem {
|
|
3
|
+
id: string;
|
|
4
|
+
label: string;
|
|
5
|
+
/** Qué implica activarlo. Una línea. */
|
|
6
|
+
hint?: string;
|
|
7
|
+
kind: UserToolKind;
|
|
8
|
+
/** Estado actual. Lo pone quien resuelve la config: el componente no lee almacenamiento. */
|
|
9
|
+
value: boolean;
|
|
10
|
+
disabled?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface UserToolsConfig {
|
|
13
|
+
title?: string;
|
|
14
|
+
/** Frase de contexto bajo el título. */
|
|
15
|
+
description?: string;
|
|
16
|
+
items: UserToolItem[];
|
|
17
|
+
}
|
|
@@ -10,3 +10,24 @@ export { TimeInputWithConfirm } from './TimeInputWithConfirm/TimeInputWithConfir
|
|
|
10
10
|
export { ReactiveForm } from './ReactiveForm/ReactiveForm';
|
|
11
11
|
export { CarouselDisplay } from './CarouselDisplay/CarouselDisplay';
|
|
12
12
|
export { ActionMenu } from './ActionMenu/ActionMenu';
|
|
13
|
+
export { ReactiveCrud } from './ReactiveCrud/ReactiveCrud';
|
|
14
|
+
export { ReactiveCrudChat } from './ReactiveCrud/ReactiveCrudChat';
|
|
15
|
+
export { ReactiveCrudItemChat } from './ReactiveCrud/ReactiveCrudItemChat';
|
|
16
|
+
export { PriceNegotiationChat } from './ReactiveCrud/PriceNegotiationChat';
|
|
17
|
+
export { MapView } from './MapView/MapView';
|
|
18
|
+
export { MapViewChat } from './MapView/MapViewChat';
|
|
19
|
+
export type { MapPoint, MapViewProps, MapViewLabels } from './MapView/types';
|
|
20
|
+
export { LocationField } from './LocationField/LocationField';
|
|
21
|
+
export type { LocationValue, LocationSource, LocationFieldProps } from './LocationField/types';
|
|
22
|
+
export { ServicesMap } from './ServicesMap/ServicesMap';
|
|
23
|
+
export { ServicesMapChat } from './ServicesMap/ServicesMapChat';
|
|
24
|
+
export type { ServicesMapConfig } from './ServicesMap/types';
|
|
25
|
+
export { ServiceShortcuts } from './ServiceShortcuts/ServiceShortcuts';
|
|
26
|
+
export { ServiceShortcutsChat } from './ServiceShortcuts/ServiceShortcutsChat';
|
|
27
|
+
export { ChatNavigator } from './ChatNavigator/ChatNavigator';
|
|
28
|
+
export { ChatNavigatorChat } from './ChatNavigator/ChatNavigatorChat';
|
|
29
|
+
export type { ChatNavigatorConfig, ChatNavigatorItem, ChatNavigatorEndpoint } from './ChatNavigator/types';
|
|
30
|
+
export { UserTools } from './UserTools/UserTools';
|
|
31
|
+
export { UserToolsChat } from './UserTools/UserToolsChat';
|
|
32
|
+
export type { UserToolsConfig, UserToolItem } from './UserTools/types';
|
|
33
|
+
export type { ReactiveCrudConfig, ReactiveCrudField, RowActionDef, EndpointRef, } from './ReactiveCrud/types';
|
|
@@ -30,3 +30,5 @@ export type OnConfirm = (value: unknown, label: string) => void;
|
|
|
30
30
|
export declare function getSubmitActionId(component: UIComponentData): string | undefined;
|
|
31
31
|
export declare const TERMINAL_STATUS: Set<string>;
|
|
32
32
|
export declare const DISPLAY_COMPONENTS: Set<string>;
|
|
33
|
+
export declare const PERSISTENT_COMPONENTS: Set<string>;
|
|
34
|
+
export declare const PURE_DISPLAY_COMPONENTS: Set<string>;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface BottomSheetProps {
|
|
3
|
+
open: boolean;
|
|
4
|
+
children: React.ReactNode;
|
|
5
|
+
/** Se llama al pulsar Escape o el fondo, cuando esos gestos están permitidos. */
|
|
6
|
+
onClose?: () => void;
|
|
7
|
+
/** El asa que indica que esto es una hoja. */
|
|
8
|
+
showGrabber?: boolean;
|
|
9
|
+
/** Cerrar al pulsar el fondo. Apagado por defecto: en decisiones importantes, un toque
|
|
10
|
+
* perdido no debería descartar la hoja. */
|
|
11
|
+
closeOnBackdrop?: boolean;
|
|
12
|
+
/** Cerrar con Escape. Encendido por defecto. */
|
|
13
|
+
closeOnEscape?: boolean;
|
|
14
|
+
/** Etiqueta accesible cuando la hoja actúa como diálogo. */
|
|
15
|
+
ariaLabelledBy?: string;
|
|
16
|
+
className?: string;
|
|
17
|
+
}
|
|
18
|
+
/** Hoja que sube desde abajo, sobre una capa oscura.
|
|
19
|
+
*
|
|
20
|
+
* MOLÉCULA — compone el átomo `Card` como superficie y añade lo suyo: la capa, la posición, el
|
|
21
|
+
* asa, y el comportamiento de una capa modal (portal, bloqueo del scroll de fondo, Escape).
|
|
22
|
+
* No sabe qué contiene: sirve igual para un aviso, un formulario o un menú de acciones.
|
|
23
|
+
*
|
|
24
|
+
* Responsive por dentro: A SANGRE en móvil —de borde a borde, apoyada abajo, donde llega el
|
|
25
|
+
* pulgar— y tarjeta centrada y despegada en escritorio, porque a sangre en una pantalla ancha
|
|
26
|
+
* la hoja se leería como una franja y el texto quedaría perdido de lado a lado.
|
|
27
|
+
*/
|
|
28
|
+
export declare const BottomSheet: React.FC<BottomSheetProps>;
|
|
29
|
+
export default BottomSheet;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { BottomSheet, type BottomSheetProps } from './BottomSheet';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { RefObject } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* SPEC-016 — Mismo enfoque que useKeyboardLock del chat, pero para los inputs de un drawer/form.
|
|
4
|
+
*
|
|
5
|
+
* Problema: en iOS Safari, al tocar un input dentro de un overlay fixed con el teclado cerrado, Safari
|
|
6
|
+
* hace su scroll por defecto para "acomodar" el input → la página/overlay salta (y en el chat anidado
|
|
7
|
+
* asoma el overlay de atrás con otro título). El chat lo evita con el truco del proxy-textarea.
|
|
8
|
+
*
|
|
9
|
+
* Aquí replicamos el truco para CUALQUIER input/textarea dentro del contenedor:
|
|
10
|
+
* 1. Con el teclado cerrado, al tocar un input interceptamos el touchend → enfocamos un proxy invisible
|
|
11
|
+
* en top:0 (Safari abre el teclado SIN scrollear).
|
|
12
|
+
* 2. Cuando el teclado se asienta (visualViewport.resize, con debounce), pasamos el foco al input real
|
|
13
|
+
* con preventScroll y lo llevamos a la vista dentro de su scroller (sin salto).
|
|
14
|
+
* 3. Si el teclado YA está abierto (cambio de campo), no interceptamos: el foco nativo ya reposiciona bien.
|
|
15
|
+
*
|
|
16
|
+
* No-op fuera de Safari. Los <select> nativos y los dropdowns custom (no son input/textarea) no se tocan.
|
|
17
|
+
*/
|
|
18
|
+
export declare function useDrawerKeyboardLock<T extends HTMLElement>(containerRef: RefObject<T | null>, isOpen: boolean): void;
|
|
@@ -67,6 +67,10 @@ export interface FilterManager {
|
|
|
67
67
|
condition: FilterConditionType;
|
|
68
68
|
/** Valor de comparación */
|
|
69
69
|
value: unknown;
|
|
70
|
+
/** SPEC-006 — extremo inicial de un rango (condición 'between'). */
|
|
71
|
+
initialValue?: unknown;
|
|
72
|
+
/** SPEC-006 — extremo final de un rango (condición 'between'). */
|
|
73
|
+
finalValue?: unknown;
|
|
70
74
|
/** Grupo para operaciones OR (opcional) */
|
|
71
75
|
group?: number | null;
|
|
72
76
|
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export type LiveIndicatorTone = 'live' | 'warning' | 'idle';
|
|
3
|
+
/** Cuánto sitio ocupa:
|
|
4
|
+
* - `full` — punto + frase + detalle + acción. Para una pantalla.
|
|
5
|
+
* - `compact` — pastilla: punto + etiqueta corta. Para una barra.
|
|
6
|
+
* - `dot` — solo el punto. Para cuando el estado se resume en encendido/apagado y el
|
|
7
|
+
* control vive en otra parte; la frase queda para el título y la asistencia. */
|
|
8
|
+
export type LiveIndicatorDensity = 'full' | 'compact' | 'dot';
|
|
9
|
+
export interface LiveIndicatorProps {
|
|
10
|
+
/** La frase que lee el usuario. Corta: esto convive con el resto de la interfaz. */
|
|
11
|
+
label: string;
|
|
12
|
+
/** Detalle secundario (un contador, una hora, una causa). */
|
|
13
|
+
hint?: string;
|
|
14
|
+
/** `live` late; `warning` avisa sin alarmar; `idle` está apagado. */
|
|
15
|
+
tone?: LiveIndicatorTone;
|
|
16
|
+
/** Texto del botón de parada. Sin él, el indicador es solo informativo. */
|
|
17
|
+
actionLabel?: string;
|
|
18
|
+
onAction?: () => void;
|
|
19
|
+
className?: string;
|
|
20
|
+
/** SPEC-037 T2 — cuánto sitio ocupa. Por defecto `full`.
|
|
21
|
+
* En `compact` y `dot` el `hint` no se pinta (no cabe) pero sigue describiendo el estado en
|
|
22
|
+
* el título y para lectores de pantalla, y `actionLabel` deja de ser un botón aparte: pasa a
|
|
23
|
+
* ser lo que hace el toque. Sin `onAction` el indicador no es pulsable y se anuncia como
|
|
24
|
+
* estado, que es lo correcto cuando el control vive en otra pantalla. */
|
|
25
|
+
density?: LiveIndicatorDensity;
|
|
26
|
+
}
|
|
27
|
+
export declare const LiveIndicator: React.FC<LiveIndicatorProps>;
|
|
28
|
+
export default LiveIndicator;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { LiveIndicator, type LiveIndicatorProps, type LiveIndicatorTone } from './LiveIndicator';
|
|
@@ -23,6 +23,9 @@ export interface MenuItemData {
|
|
|
23
23
|
/** Nombre del icono de lumi (string que mapea a LUMI_ICON_TYPES)
|
|
24
24
|
* Ejemplo: "home" → LUMI_ICON_TYPES.HOME */
|
|
25
25
|
icon?: string;
|
|
26
|
+
/** Contador/etiqueta que se pinta a la derecha del título (notificaciones sin leer,
|
|
27
|
+
* items pendientes...). No se renderiza cuando viene vacío, 0 o undefined. */
|
|
28
|
+
badge?: number | string;
|
|
26
29
|
/** Fecha de creación */
|
|
27
30
|
createdDate: string;
|
|
28
31
|
/** Fecha de actualización */
|
|
@@ -80,6 +83,8 @@ export interface MenuItemProps {
|
|
|
80
83
|
title: string;
|
|
81
84
|
/** Icono del item (nombre en string) */
|
|
82
85
|
icon?: string;
|
|
86
|
+
/** Contador/etiqueta a la derecha del título. Oculto si viene vacío, 0 o undefined. */
|
|
87
|
+
badge?: number | string;
|
|
83
88
|
/** Ruta para React Router */
|
|
84
89
|
to?: string;
|
|
85
90
|
/** Si el item está deshabilitado */
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface SessionExpiryPromptProps {
|
|
3
|
+
/** Controlado por el consumidor: este componente no decide cuándo aparecer. */
|
|
4
|
+
open: boolean;
|
|
5
|
+
/** Segundos que quedan; se muestran para que la urgencia sea un dato, no una sensación. */
|
|
6
|
+
secondsLeft?: number;
|
|
7
|
+
title?: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
continueLabel?: string;
|
|
10
|
+
endLabel?: string;
|
|
11
|
+
onContinue: () => void;
|
|
12
|
+
onEnd: () => void;
|
|
13
|
+
}
|
|
14
|
+
/** SPEC-029 B2 — aviso de sesión por expirar: hoja inferior a ancho completo.
|
|
15
|
+
*
|
|
16
|
+
* MOLÉCULA: compone el átomo `Button` en vez de pintar sus propios botones. Lo que aporta es la
|
|
17
|
+
* composición —capa, hoja, jerarquía de las dos salidas—, no un estilo de botón paralelo que
|
|
18
|
+
* mañana se desincronizaría del resto del sistema.
|
|
19
|
+
*
|
|
20
|
+
* Componente TONTO a propósito: no sabe qué es un token, ni cuándo vence, ni a quién hay que
|
|
21
|
+
* preguntarle. Recibe `open` y devuelve dos decisiones. Quién decide mostrarlo es el host, que
|
|
22
|
+
* es quien conoce la política.
|
|
23
|
+
*/
|
|
24
|
+
export declare const SessionExpiryPrompt: React.FC<SessionExpiryPromptProps>;
|
|
25
|
+
export default SessionExpiryPrompt;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { SessionExpiryPrompt, type SessionExpiryPromptProps } from './SessionExpiryPrompt';
|
|
@@ -12,3 +12,5 @@ export { Tabs, type TabsProps, type TabItem, type TabType, type TabPosition, typ
|
|
|
12
12
|
export { Filter, FilterRow, type FilterProps, type FilterFieldConfig, type FilterValue, type FilterManager, } from './Filter';
|
|
13
13
|
export { DropdownMenu, type DropdownMenuProps, type DropdownMenuOption } from './DropdownMenu';
|
|
14
14
|
export { Notification, type NotificationProps, type NotificationType, type NotificationMode, type NotificationPosition } from './Notification';
|
|
15
|
+
export { BottomSheet, type BottomSheetProps } from './BottomSheet';
|
|
16
|
+
export { LiveIndicator, type LiveIndicatorProps, type LiveIndicatorTone } from './LiveIndicator';
|
|
@@ -8,9 +8,15 @@ export interface UseAutoScrollOptions {
|
|
|
8
8
|
* - scrollToLastUserMessage: espera nuevo user message y lo posiciona arriba
|
|
9
9
|
* - pinLastUserMessage: re-posiciona el último user message arriba (sin esperar nuevo)
|
|
10
10
|
* - scrollToBottom: scroll al fondo (botón scroll-down)
|
|
11
|
+
*
|
|
12
|
+
* SPEC-041 — el observador vive en un ref, no en una variable del cuerpo del hook.
|
|
13
|
+
* Antes se reiniciaba a `null` en cada render: el observador quedaba huérfano (nadie podía
|
|
14
|
+
* desconectarlo), dos envíos seguidos dejaban dos observadores compitiendo por mover el scroll,
|
|
15
|
+
* y ninguno se limpiaba al desmontar.
|
|
11
16
|
*/
|
|
12
17
|
export declare const useAutoScroll: ({ messagesEndRef, messagesContainerRef, }: UseAutoScrollOptions) => {
|
|
13
18
|
scrollToLastUserMessage: () => void;
|
|
14
19
|
pinLastUserMessage: () => void;
|
|
20
|
+
scrollToProactive: () => void;
|
|
15
21
|
scrollToBottom: () => void;
|
|
16
22
|
};
|
|
@@ -2,7 +2,6 @@ export interface UseChatHandlersOptions {
|
|
|
2
2
|
onSend: (content: string, files?: File[]) => void;
|
|
3
3
|
onInputChange: (value: string) => void;
|
|
4
4
|
clearAttachments: () => void;
|
|
5
|
-
scrollToLastUserMessage: () => void;
|
|
6
5
|
}
|
|
7
6
|
export interface UseChatHandlersReturn {
|
|
8
7
|
handleSendWithFiles: (content: string, files?: File[]) => void;
|
|
@@ -12,4 +11,4 @@ export interface UseChatHandlersReturn {
|
|
|
12
11
|
* Hook para manejar las acciones del chat como envío de mensajes
|
|
13
12
|
* Centraliza la lógica de envío y manejo de eventos del input
|
|
14
13
|
*/
|
|
15
|
-
export declare const useChatHandlers: ({ onSend, onInputChange, clearAttachments
|
|
14
|
+
export declare const useChatHandlers: ({ onSend, onInputChange, clearAttachments }: UseChatHandlersOptions) => UseChatHandlersReturn;
|
|
@@ -7,4 +7,5 @@ export declare const useInputFocus: ({ showThinking, messages }: UseInputFocusOp
|
|
|
7
7
|
handleInputFocus: () => void;
|
|
8
8
|
handleMainClick: (e: React.MouseEvent) => void;
|
|
9
9
|
handleFooterClick: (e: React.MouseEvent, componentPrefix: string) => void;
|
|
10
|
+
isKeyboardOpen: boolean;
|
|
10
11
|
};
|
|
@@ -41,10 +41,23 @@ export interface DashboardSidebarProps {
|
|
|
41
41
|
* @default 'light'
|
|
42
42
|
*/
|
|
43
43
|
theme?: 'light' | 'dark';
|
|
44
|
+
/**
|
|
45
|
+
* SPEC-011 — título del sidebar. Se pasa al Drawer para que use su `__title`, que es el mismo
|
|
46
|
+
* de todos los drawers. Antes el consumidor lo metía por `headerExtra` como un `<span>` suelto,
|
|
47
|
+
* y ahí solo heredaba el tamaño base: se veía más pequeño que el resto de cabeceras.
|
|
48
|
+
*/
|
|
49
|
+
title?: string;
|
|
44
50
|
/**
|
|
45
51
|
* Contenido extra en el header del drawer (junto al botón de close)
|
|
46
52
|
*/
|
|
47
53
|
headerExtra?: React.ReactNode;
|
|
54
|
+
/**
|
|
55
|
+
* SPEC-037 T3 — pie del sidebar, debajo del menú y separado de él.
|
|
56
|
+
*
|
|
57
|
+
* Para lo que NO es navegación: cerrar sesión, la versión, un aviso. Colarlo como un ítem más
|
|
58
|
+
* del menú lo haría indistinguible de un destino, y cerrar sesión no lleva a ninguna parte.
|
|
59
|
+
*/
|
|
60
|
+
footer?: React.ReactNode;
|
|
48
61
|
/**
|
|
49
62
|
* Si muestra el botón de cerrar en el drawer
|
|
50
63
|
* @default true
|