@apps-megafy/ui 0.1.22
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/components.json +17 -0
- package/dist/components/AttachmentViewer/index.d.ts +7 -0
- package/dist/components/AttachmentViewer/index.d.ts.map +1 -0
- package/dist/components/AttachmentViewer/index.js +15 -0
- package/dist/components/AttachmentViewer/index.js.map +1 -0
- package/dist/components/CameraCapture/index.d.ts +7 -0
- package/dist/components/CameraCapture/index.d.ts.map +1 -0
- package/dist/components/CameraCapture/index.js +153 -0
- package/dist/components/CameraCapture/index.js.map +1 -0
- package/dist/components/ChatInput/index.d.ts +19 -0
- package/dist/components/ChatInput/index.d.ts.map +1 -0
- package/dist/components/ChatInput/index.js +124 -0
- package/dist/components/ChatInput/index.js.map +1 -0
- package/dist/components/ChoiceCardPanel/index.d.ts +11 -0
- package/dist/components/ChoiceCardPanel/index.d.ts.map +1 -0
- package/dist/components/ChoiceCardPanel/index.js +101 -0
- package/dist/components/ChoiceCardPanel/index.js.map +1 -0
- package/dist/components/ConfirmationSummaryCard/index.d.ts +7 -0
- package/dist/components/ConfirmationSummaryCard/index.d.ts.map +1 -0
- package/dist/components/ConfirmationSummaryCard/index.js +7 -0
- package/dist/components/ConfirmationSummaryCard/index.js.map +1 -0
- package/dist/components/ConsentViewer/index.d.ts +9 -0
- package/dist/components/ConsentViewer/index.d.ts.map +1 -0
- package/dist/components/ConsentViewer/index.js +8 -0
- package/dist/components/ConsentViewer/index.js.map +1 -0
- package/dist/components/FrontendWidgetsArea/index.d.ts +17 -0
- package/dist/components/FrontendWidgetsArea/index.d.ts.map +1 -0
- package/dist/components/FrontendWidgetsArea/index.js +329 -0
- package/dist/components/FrontendWidgetsArea/index.js.map +1 -0
- package/dist/components/MessageArea/index.d.ts +14 -0
- package/dist/components/MessageArea/index.d.ts.map +1 -0
- package/dist/components/MessageArea/index.js +17 -0
- package/dist/components/MessageArea/index.js.map +1 -0
- package/dist/components/MessageBubble/index.d.ts +11 -0
- package/dist/components/MessageBubble/index.d.ts.map +1 -0
- package/dist/components/MessageBubble/index.js +17 -0
- package/dist/components/MessageBubble/index.js.map +1 -0
- package/dist/components/ProgressSteps/index.d.ts +23 -0
- package/dist/components/ProgressSteps/index.d.ts.map +1 -0
- package/dist/components/ProgressSteps/index.js +50 -0
- package/dist/components/ProgressSteps/index.js.map +1 -0
- package/dist/components/QuestionCardPanel/CardShell.d.ts +14 -0
- package/dist/components/QuestionCardPanel/CardShell.d.ts.map +1 -0
- package/dist/components/QuestionCardPanel/CardShell.js +8 -0
- package/dist/components/QuestionCardPanel/CardShell.js.map +1 -0
- package/dist/components/QuestionCardPanel/index.d.ts +11 -0
- package/dist/components/QuestionCardPanel/index.d.ts.map +1 -0
- package/dist/components/QuestionCardPanel/index.js +17 -0
- package/dist/components/QuestionCardPanel/index.js.map +1 -0
- package/dist/components/QuickActionButton/index.d.ts +6 -0
- package/dist/components/QuickActionButton/index.d.ts.map +1 -0
- package/dist/components/QuickActionButton/index.js +7 -0
- package/dist/components/QuickActionButton/index.js.map +1 -0
- package/dist/components/QuickActionsArea/index.d.ts +8 -0
- package/dist/components/QuickActionsArea/index.d.ts.map +1 -0
- package/dist/components/QuickActionsArea/index.js +10 -0
- package/dist/components/QuickActionsArea/index.js.map +1 -0
- package/dist/components/RegenerateMessageButton/index.d.ts +3 -0
- package/dist/components/RegenerateMessageButton/index.d.ts.map +1 -0
- package/dist/components/RegenerateMessageButton/index.js +7 -0
- package/dist/components/RegenerateMessageButton/index.js.map +1 -0
- package/dist/components/RichText/index.d.ts +6 -0
- package/dist/components/RichText/index.d.ts.map +1 -0
- package/dist/components/RichText/index.js +113 -0
- package/dist/components/RichText/index.js.map +1 -0
- package/dist/components/TimeEstimateCard/index.d.ts +7 -0
- package/dist/components/TimeEstimateCard/index.d.ts.map +1 -0
- package/dist/components/TimeEstimateCard/index.js +14 -0
- package/dist/components/TimeEstimateCard/index.js.map +1 -0
- package/dist/components/UploadDocumentButton/index.d.ts +3 -0
- package/dist/components/UploadDocumentButton/index.d.ts.map +1 -0
- package/dist/components/UploadDocumentButton/index.js +7 -0
- package/dist/components/UploadDocumentButton/index.js.map +1 -0
- package/dist/components/primitives/Avatar.d.ts +8 -0
- package/dist/components/primitives/Avatar.d.ts.map +1 -0
- package/dist/components/primitives/Avatar.js +6 -0
- package/dist/components/primitives/Avatar.js.map +1 -0
- package/dist/components/primitives/Button.d.ts +12 -0
- package/dist/components/primitives/Button.d.ts.map +1 -0
- package/dist/components/primitives/Button.js +34 -0
- package/dist/components/primitives/Button.js.map +1 -0
- package/dist/components/primitives/Dialog.d.ts +11 -0
- package/dist/components/primitives/Dialog.d.ts.map +1 -0
- package/dist/components/primitives/Dialog.js +16 -0
- package/dist/components/primitives/Dialog.js.map +1 -0
- package/dist/components/primitives/index.d.ts +4 -0
- package/dist/components/primitives/index.d.ts.map +1 -0
- package/dist/components/primitives/index.js +4 -0
- package/dist/components/primitives/index.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +6 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/types.d.ts +126 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +52 -0
- package/src/styles.css +107 -0
package/components.json
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://ui.shadcn.com/schema.json",
|
|
3
|
+
"style": "default",
|
|
4
|
+
"rsc": false,
|
|
5
|
+
"tsx": true,
|
|
6
|
+
"tailwind": {
|
|
7
|
+
"config": "../../tailwind.config.ts",
|
|
8
|
+
"css": "src/styles.css",
|
|
9
|
+
"baseColor": "neutral",
|
|
10
|
+
"cssVariables": true
|
|
11
|
+
},
|
|
12
|
+
"aliases": {
|
|
13
|
+
"components": "@/components",
|
|
14
|
+
"utils": "@/lib/utils"
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AgentAttachment } from '../../types';
|
|
2
|
+
export interface AttachmentViewerProps {
|
|
3
|
+
attachments: AgentAttachment[];
|
|
4
|
+
className?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function AttachmentViewer({ attachments, className }: AttachmentViewerProps): import("react").JSX.Element | null;
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/AttachmentViewer/index.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAWnD,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,gBAAgB,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,qBAAqB,sCA0IjF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import * as DialogPrimitive from '@radix-ui/react-dialog';
|
|
3
|
+
import { Download, ExternalLink, FileText, ImageIcon, X } from 'lucide-react';
|
|
4
|
+
import { useState } from 'react';
|
|
5
|
+
import { cn } from '../../lib/utils';
|
|
6
|
+
import { Button } from '../primitives/Button';
|
|
7
|
+
import { Dialog, DialogDescription, DialogOverlay, DialogPortal, DialogTitle, } from '../primitives/Dialog';
|
|
8
|
+
export function AttachmentViewer({ attachments, className }) {
|
|
9
|
+
const [selected, setSelected] = useState(null);
|
|
10
|
+
if (!attachments.length) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
return (_jsxs(_Fragment, { children: [_jsx("div", { className: cn('grid gap-2 sm:grid-cols-2', className), children: attachments.map((attachment) => (_jsxs("button", { type: "button", onClick: () => setSelected(attachment), className: "group relative overflow-hidden rounded-2xl border border-border bg-background text-left text-foreground shadow-xs transition-all duration-300 hover:-translate-y-0.5 hover:border-primary/40 hover:shadow-glow focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", style: { color: 'hsl(var(--foreground))' }, children: [attachment.kind === 'image' ? (_jsx("div", { className: "aspect-[16/10] bg-muted", children: _jsx("img", { src: attachment.previewUrl ?? attachment.url, alt: attachment.name, className: "h-full w-full object-cover transition duration-500 group-hover:scale-[1.03]" }) })) : (_jsxs("div", { className: "flex min-h-24 items-center gap-3 bg-muted/60 p-4", children: [_jsx("span", { className: "flex h-11 w-11 shrink-0 items-center justify-center rounded-2xl bg-primary/10 text-primary", children: _jsx(FileText, { className: "h-5 w-5" }) }), _jsxs("div", { className: "min-w-0", children: [_jsx("p", { className: "truncate text-sm font-medium text-foreground", style: { color: 'hsl(var(--foreground))' }, children: attachment.name }), attachment.sizeLabel ? (_jsx("p", { className: "text-xs text-muted-foreground", style: { color: 'hsl(var(--muted-foreground))' }, children: attachment.sizeLabel })) : null] })] })), _jsxs("div", { className: "flex items-center justify-between gap-3 p-3", children: [_jsxs("span", { className: "flex min-w-0 items-center gap-2 text-sm font-medium text-foreground", children: [attachment.kind === 'image' ? (_jsx(ImageIcon, { className: "h-4 w-4 shrink-0 text-primary" })) : (_jsx(FileText, { className: "h-4 w-4 shrink-0 text-primary" })), _jsx("span", { className: "truncate", style: { color: 'hsl(var(--foreground))' }, children: attachment.name })] }), _jsx(ExternalLink, { className: "h-4 w-4 shrink-0 text-muted-foreground transition group-hover:text-primary", style: { color: 'hsl(var(--muted-foreground))' } })] })] }, attachment.id))) }), _jsx(Dialog, { open: Boolean(selected), onOpenChange: (open) => !open && setSelected(null), children: _jsxs(DialogPortal, { container: document.body, children: [_jsx(DialogOverlay, {}), _jsxs(DialogPrimitive.Content, { className: "fixed inset-0 z-50 m-auto flex h-fit w-[min(1440px,calc(100vw-16px))] max-w-full flex-col gap-3 overflow-x-hidden rounded-3xl border border-border bg-card p-3 text-card-foreground shadow-glow outline-none data-[state=open]:animate-agent-in sm:p-4", children: [selected ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex min-w-0 items-start justify-between gap-4 px-1 pr-12 sm:px-2 sm:pr-16", children: [_jsxs("div", { className: "min-w-0", children: [_jsx(DialogTitle, { className: "truncate text-base font-semibold sm:text-lg", children: selected.name }), _jsxs(DialogDescription, { className: "truncate text-sm text-muted-foreground", children: [selected.mimeType ?? selected.kind, selected.sizeLabel ? ` · ${selected.sizeLabel}` : ''] })] }), _jsx(Button, { asChild: true, variant: "outline", size: "sm", className: "hidden rounded-full sm:mr-2 sm:inline-flex", children: _jsxs("a", { href: selected.downloadUrl ?? selected.url, download: selected.name, children: [_jsx(Download, { className: "h-4 w-4" }), "Descargar"] }) })] }), _jsx("div", { className: "max-h-[78dvh] overflow-auto overflow-x-hidden rounded-2xl border border-border bg-muted/40", children: selected.kind === 'image' ? (_jsx("img", { src: selected.url, alt: selected.name, className: "mx-auto max-h-[78dvh] w-full max-w-xl object-contain" })) : (_jsx("iframe", { title: selected.name, src: selected.url, className: "h-[78dvh] w-full bg-background" })) })] })) : null, _jsxs(DialogPrimitive.Close, { className: "absolute right-3 top-3 rounded-md p-2 text-muted-foreground transition hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", children: [_jsx(X, { className: "h-4 w-4" }), _jsx("span", { className: "sr-only", children: "Cerrar" })] })] })] }) })] }));
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/AttachmentViewer/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface CameraCaptureProps {
|
|
2
|
+
open: boolean;
|
|
3
|
+
onClose: () => void;
|
|
4
|
+
onCapture: (file: File) => void;
|
|
5
|
+
}
|
|
6
|
+
export declare function CameraCapture({ open, onClose, onCapture }: CameraCaptureProps): import("react").JSX.Element;
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/CameraCapture/index.tsx"],"names":[],"mappings":"AAaA,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;CACjC;AAED,wBAAgB,aAAa,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,kBAAkB,+BA2Q7E"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
// CameraCapture.tsx — cambios marcados con // ← NUEVO
|
|
3
|
+
import * as DialogPrimitive from '@radix-ui/react-dialog';
|
|
4
|
+
import { Camera, FlipHorizontal2, RefreshCw, VideoOff, X } from 'lucide-react';
|
|
5
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
6
|
+
import { cn } from '../../lib/utils';
|
|
7
|
+
import { Button } from '../primitives/Button';
|
|
8
|
+
import { Dialog, DialogDescription, DialogOverlay, DialogPortal, DialogTitle } from '../primitives/Dialog';
|
|
9
|
+
const CAPTURE_ASPECT_RATIO = 4 / 3;
|
|
10
|
+
export function CameraCapture({ open, onClose, onCapture }) {
|
|
11
|
+
const videoRef = useRef(null);
|
|
12
|
+
const canvasRef = useRef(null);
|
|
13
|
+
const streamRef = useRef(null);
|
|
14
|
+
const [cameraState, setCameraState] = useState('idle');
|
|
15
|
+
const [facingMode, setFacingMode] = useState('environment');
|
|
16
|
+
const [errorMessage, setErrorMessage] = useState('');
|
|
17
|
+
const [hasMultipleCameras, setHasMultipleCameras] = useState(false);
|
|
18
|
+
const stopStream = useCallback(() => {
|
|
19
|
+
streamRef.current?.getTracks().forEach((t) => t.stop());
|
|
20
|
+
streamRef.current = null;
|
|
21
|
+
if (videoRef.current)
|
|
22
|
+
videoRef.current.srcObject = null;
|
|
23
|
+
}, []);
|
|
24
|
+
const startCamera = useCallback(async (facing) => {
|
|
25
|
+
setCameraState('requesting');
|
|
26
|
+
setErrorMessage('');
|
|
27
|
+
stopStream();
|
|
28
|
+
if (!navigator.mediaDevices?.getUserMedia) {
|
|
29
|
+
setCameraState('unavailable');
|
|
30
|
+
setErrorMessage('Tu navegador no soporta acceso a la cámara.');
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
const stream = await navigator.mediaDevices.getUserMedia({
|
|
35
|
+
video: {
|
|
36
|
+
facingMode: facing,
|
|
37
|
+
width: { ideal: 1600 },
|
|
38
|
+
height: { ideal: 1200 },
|
|
39
|
+
aspectRatio: { ideal: CAPTURE_ASPECT_RATIO },
|
|
40
|
+
},
|
|
41
|
+
audio: false,
|
|
42
|
+
});
|
|
43
|
+
streamRef.current = stream;
|
|
44
|
+
if (videoRef.current) {
|
|
45
|
+
videoRef.current.srcObject = stream;
|
|
46
|
+
await videoRef.current.play();
|
|
47
|
+
}
|
|
48
|
+
const devices = await navigator.mediaDevices.enumerateDevices();
|
|
49
|
+
setHasMultipleCameras(devices.filter((d) => d.kind === 'videoinput').length > 1);
|
|
50
|
+
setCameraState('active');
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
stopStream();
|
|
54
|
+
if (err instanceof DOMException) {
|
|
55
|
+
if (err.name === 'NotAllowedError' || err.name === 'PermissionDeniedError') {
|
|
56
|
+
setCameraState('denied');
|
|
57
|
+
setErrorMessage('Permiso de cámara denegado. Habilitalo en la configuración del navegador e intentá de nuevo.');
|
|
58
|
+
}
|
|
59
|
+
else if (err.name === 'NotFoundError' || err.name === 'DevicesNotFoundError') {
|
|
60
|
+
setCameraState('unavailable');
|
|
61
|
+
setErrorMessage('No se encontró ninguna cámara en este dispositivo.');
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
setCameraState('error');
|
|
65
|
+
setErrorMessage('No se pudo acceder a la cámara. Intentá de nuevo.');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
setCameraState('error');
|
|
70
|
+
setErrorMessage('Ocurrió un error inesperado al acceder a la cámara.');
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}, [stopStream]);
|
|
74
|
+
useEffect(() => {
|
|
75
|
+
if (open) {
|
|
76
|
+
startCamera(facingMode);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
stopStream();
|
|
80
|
+
setCameraState('idle');
|
|
81
|
+
}
|
|
82
|
+
return stopStream;
|
|
83
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
84
|
+
}, [open]);
|
|
85
|
+
// Reiniciar stream al cambiar cámara
|
|
86
|
+
useEffect(() => {
|
|
87
|
+
if (open && cameraState !== 'requesting')
|
|
88
|
+
startCamera(facingMode);
|
|
89
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
90
|
+
}, [facingMode]);
|
|
91
|
+
const handleCapture = useCallback(() => {
|
|
92
|
+
const video = videoRef.current;
|
|
93
|
+
const canvas = canvasRef.current;
|
|
94
|
+
if (!video || !canvas || cameraState !== 'active')
|
|
95
|
+
return;
|
|
96
|
+
const source = getCenteredAspectCrop(video.videoWidth, video.videoHeight, CAPTURE_ASPECT_RATIO);
|
|
97
|
+
canvas.width = source.width;
|
|
98
|
+
canvas.height = source.height;
|
|
99
|
+
canvas
|
|
100
|
+
.getContext('2d')
|
|
101
|
+
?.drawImage(video, source.x, source.y, source.width, source.height, 0, 0, source.width, source.height);
|
|
102
|
+
canvas.toBlob((blob) => {
|
|
103
|
+
if (!blob)
|
|
104
|
+
return;
|
|
105
|
+
const file = new File([blob], `foto-${Date.now()}.jpg`, { type: 'image/jpeg' });
|
|
106
|
+
stopStream();
|
|
107
|
+
onCapture(file);
|
|
108
|
+
onClose();
|
|
109
|
+
}, 'image/jpeg', 0.92);
|
|
110
|
+
}, [cameraState, onCapture, onClose, stopStream]);
|
|
111
|
+
// ← NUEVO: capturar con la barra espaciadora
|
|
112
|
+
useEffect(() => {
|
|
113
|
+
const handleKeyDown = (e) => {
|
|
114
|
+
if (e.code === 'Space' && !e.repeat) {
|
|
115
|
+
e.preventDefault(); // evita scroll de página
|
|
116
|
+
handleCapture();
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
if (open)
|
|
120
|
+
window.addEventListener('keydown', handleKeyDown);
|
|
121
|
+
return () => window.removeEventListener('keydown', handleKeyDown);
|
|
122
|
+
}, [open, handleCapture]);
|
|
123
|
+
const handleClose = useCallback(() => {
|
|
124
|
+
stopStream();
|
|
125
|
+
onClose();
|
|
126
|
+
}, [onClose, stopStream]);
|
|
127
|
+
const flipCamera = useCallback(() => setFacingMode((p) => (p === 'environment' ? 'user' : 'environment')), []);
|
|
128
|
+
const isActive = cameraState === 'active';
|
|
129
|
+
const isLoading = cameraState === 'requesting' || cameraState === 'idle';
|
|
130
|
+
const hasError = ['denied', 'unavailable', 'error'].includes(cameraState);
|
|
131
|
+
const canRetry = cameraState === 'error';
|
|
132
|
+
return (_jsx(Dialog, { open: open, onOpenChange: (o) => !o && handleClose(), children: _jsxs(DialogPortal, { container: typeof document !== 'undefined' ? document.body : undefined, children: [_jsx(DialogOverlay, { className: "bg-black/90" }), _jsxs(DialogPrimitive.Content, { className: cn('fixed inset-0 z-50 flex flex-col bg-black outline-none', 'data-[state=open]:animate-agent-in', 'sm:inset-auto sm:left-1/2 sm:top-1/2 sm:-translate-x-1/2 sm:-translate-y-1/2', 'sm:w-[min(480px,calc(100vw-24px))] sm:overflow-hidden sm:rounded-3xl sm:border sm:border-border'), children: [_jsxs("div", { className: "flex shrink-0 items-center justify-between px-4 py-3", children: [_jsxs("div", { children: [_jsx(DialogTitle, { className: "text-base font-semibold text-white", children: "Tomar foto" }), _jsx(DialogDescription, { className: "mt-0.5 text-xs text-white/50", children: isActive ? (_jsxs(_Fragment, { children: ["Encuadr\u00E1 el documento y presion\u00E1 el bot\u00F3n", _jsx("kbd", { className: "ml-1.5 hidden sm:inline-flex items-center gap-0.5 rounded border border-white/20 bg-white/10 px-1 py-px font-mono text-[10px] text-white/60", children: "Espacio" })] })) : isLoading ? ('Accediendo a la cámara…') : (' ') })] }), _jsx("button", { type: "button", onClick: handleClose, "aria-label": "Cerrar", className: "flex h-9 w-9 items-center justify-center rounded-xl text-white/60 transition hover:bg-white/10 hover:text-white", children: _jsx(X, { className: "h-5 w-5" }) })] }), _jsx("div", { className: "relative min-h-0 flex-1 flex items-center justify-center overflow-hidden bg-black px-4 py-3 sm:px-5", children: _jsxs("div", { className: "relative aspect-[4/3] w-full max-w-[720px] overflow-hidden rounded-2xl border border-white/10 bg-black shadow-2xl sm:rounded-3xl", children: [_jsx("video", { ref: videoRef, playsInline: true, muted: true, className: cn('h-full w-full object-cover', !isActive && 'invisible') }), _jsx("canvas", { ref: canvasRef, className: "hidden" }), isLoading && (_jsxs("div", { className: "absolute inset-0 flex flex-col items-center justify-center gap-3 text-white", children: [_jsx(Camera, { className: "h-10 w-10 animate-pulse opacity-60" }), _jsx("p", { className: "text-sm opacity-60", children: "Accediendo a la c\u00E1mara\u2026" })] })), hasError && (_jsxs("div", { className: "absolute inset-0 flex flex-col items-center justify-center gap-4 px-8 text-center text-white", children: [_jsx(VideoOff, { className: "h-10 w-10 text-destructive" }), _jsx("p", { className: "text-sm leading-relaxed text-white/80", children: errorMessage }), canRetry && (_jsxs(Button, { variant: "outline", size: "sm", onClick: () => startCamera(facingMode), className: "rounded-full border-white/20 text-white hover:bg-white/10", children: [_jsx(RefreshCw, { className: "h-3.5 w-3.5" }), "Reintentar"] }))] }))] }) }), _jsxs("div", { className: "shrink-0 flex items-center justify-center gap-10 bg-black py-7", children: [isActive && hasMultipleCameras ? (_jsx("button", { type: "button", onClick: flipCamera, "aria-label": "Cambiar c\u00E1mara", className: "flex h-11 w-11 items-center justify-center rounded-full bg-white/10 text-white transition hover:bg-white/20 active:scale-95", children: _jsx(FlipHorizontal2, { className: "h-5 w-5" }) })) : (_jsx("div", { className: "h-11 w-11" })), _jsx("button", { type: "button", onClick: handleCapture, disabled: !isActive, "aria-label": "Tomar foto", className: cn('h-[72px] w-[72px] rounded-full border-[5px] border-white shadow-xl transition', isActive
|
|
133
|
+
? 'bg-white/90 hover:scale-105 active:scale-95'
|
|
134
|
+
: 'bg-white/20 cursor-not-allowed') }), _jsx("div", { className: "h-11 w-11" })] })] })] }) }));
|
|
135
|
+
}
|
|
136
|
+
function getCenteredAspectCrop(width, height, aspectRatio) {
|
|
137
|
+
const frameRatio = width / height;
|
|
138
|
+
let cropWidth = width;
|
|
139
|
+
let cropHeight = height;
|
|
140
|
+
if (frameRatio > aspectRatio) {
|
|
141
|
+
cropWidth = Math.round(height * aspectRatio);
|
|
142
|
+
}
|
|
143
|
+
else if (frameRatio < aspectRatio) {
|
|
144
|
+
cropHeight = Math.round(width / aspectRatio);
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
x: Math.max(0, Math.floor((width - cropWidth) / 2)),
|
|
148
|
+
y: Math.max(0, Math.floor((height - cropHeight) / 2)),
|
|
149
|
+
width: cropWidth,
|
|
150
|
+
height: cropHeight,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/CameraCapture/index.tsx"],"names":[],"mappings":";AAAA,sDAAsD;AAEtD,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjE,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAG3G,MAAM,oBAAoB,GAAG,CAAC,GAAG,CAAC,CAAC;AAQnC,MAAM,UAAU,aAAa,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAsB;IAC5E,MAAM,QAAQ,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,MAAM,CAAoB,IAAI,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,MAAM,CAAqB,IAAI,CAAC,CAAC;IACnD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAc,MAAM,CAAC,CAAC;IACpE,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAyB,aAAa,CAAC,CAAC;IACpF,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACrD,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEpE,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;QACzB,IAAI,QAAQ,CAAC,OAAO;YAAE,QAAQ,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAC1D,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,WAAW,GAAG,WAAW,CAC7B,KAAK,EAAE,MAA8B,EAAE,EAAE;QACvC,cAAc,CAAC,YAAY,CAAC,CAAC;QAC7B,eAAe,CAAC,EAAE,CAAC,CAAC;QACpB,UAAU,EAAE,CAAC;QAEb,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC;YAC1C,cAAc,CAAC,aAAa,CAAC,CAAC;YAC9B,eAAe,CAAC,6CAA6C,CAAC,CAAC;YAC/D,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC;gBACvD,KAAK,EAAE;oBACL,UAAU,EAAE,MAAM;oBAClB,KAAK,EAAG,EAAE,KAAK,EAAE,IAAI,EAAE;oBACvB,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;oBACvB,WAAW,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE;iBAC7C;gBACD,KAAK,EAAE,KAAK;aACb,CAAC,CAAC;YACH,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;YAE3B,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACrB,QAAQ,CAAC,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC;gBACpC,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAChC,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,gBAAgB,EAAE,CAAC;YAChE,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACjF,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,UAAU,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,YAAY,EAAE,CAAC;gBAChC,IAAI,GAAG,CAAC,IAAI,KAAK,iBAAiB,IAAI,GAAG,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;oBAC3E,cAAc,CAAC,QAAQ,CAAC,CAAC;oBACzB,eAAe,CACb,8FAA8F,CAC/F,CAAC;gBACJ,CAAC;qBAAM,IAAI,GAAG,CAAC,IAAI,KAAK,eAAe,IAAI,GAAG,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;oBAC/E,cAAc,CAAC,aAAa,CAAC,CAAC;oBAC9B,eAAe,CAAC,oDAAoD,CAAC,CAAC;gBACxE,CAAC;qBAAM,CAAC;oBACN,cAAc,CAAC,OAAO,CAAC,CAAC;oBACxB,eAAe,CAAC,mDAAmD,CAAC,CAAC;gBACvE,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,cAAc,CAAC,OAAO,CAAC,CAAC;gBACxB,eAAe,CAAC,qDAAqD,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;IACH,CAAC,EACD,CAAC,UAAU,CAAC,CACb,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,IAAI,EAAE,CAAC;YACT,WAAW,CAAC,UAAU,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,UAAU,EAAE,CAAC;YACb,cAAc,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;QACD,OAAO,UAAU,CAAC;QAClB,uDAAuD;IACzD,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,qCAAqC;IACrC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,IAAI,IAAI,WAAW,KAAK,YAAY;YAAE,WAAW,CAAC,UAAU,CAAC,CAAC;QAClE,uDAAuD;IACzD,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE;QACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;QAC/B,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC;QACjC,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,IAAI,WAAW,KAAK,QAAQ;YAAE,OAAO;QAE1D,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAC;QAChG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC5B,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC9B,MAAM;aACH,UAAU,CAAC,IAAI,CAAC;YACjB,EAAE,SAAS,CACT,KAAK,EACL,MAAM,CAAC,CAAC,EACR,MAAM,CAAC,CAAC,EACR,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,MAAM,EACb,CAAC,EACD,CAAC,EACD,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,MAAM,CACd,CAAC;QAEJ,MAAM,CAAC,MAAM,CACX,CAAC,IAAI,EAAE,EAAE;YACP,IAAI,CAAC,IAAI;gBAAE,OAAO;YAClB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;YAChF,UAAU,EAAE,CAAC;YACb,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,OAAO,EAAE,CAAC;QACZ,CAAC,EACD,YAAY,EACZ,IAAI,CACL,CAAC;IACJ,CAAC,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;IAElD,6CAA6C;IAC7C,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,aAAa,GAAG,CAAC,CAAgB,EAAE,EAAE;YACzC,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;gBACpC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,yBAAyB;gBAC7C,aAAa,EAAE,CAAC;YAClB,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,IAAI;YAAE,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QAC5D,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACpE,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC;IAE1B,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE;QACnC,UAAU,EAAE,CAAC;QACb,OAAO,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;IAE1B,MAAM,UAAU,GAAG,WAAW,CAC5B,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,EAC1E,EAAE,CACH,CAAC;IAEF,MAAM,QAAQ,GAAI,WAAW,KAAK,QAAQ,CAAC;IAC3C,MAAM,SAAS,GAAG,WAAW,KAAK,YAAY,IAAI,WAAW,KAAK,MAAM,CAAC;IACzE,MAAM,QAAQ,GAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC3E,MAAM,QAAQ,GAAI,WAAW,KAAK,OAAO,CAAC;IAE1C,OAAO,CACL,KAAC,MAAM,IAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,YAC1D,MAAC,YAAY,IAAC,SAAS,EAAE,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,aAClF,KAAC,aAAa,IAAC,SAAS,EAAC,aAAa,GAAG,EACzC,MAAC,eAAe,CAAC,OAAO,IACtB,SAAS,EAAE,EAAE,CACX,wDAAwD,EACxD,oCAAoC,EACpC,8EAA8E,EAC9E,iGAAiG,CAClG,aAGD,eAAK,SAAS,EAAC,sDAAsD,aACnE,0BACE,KAAC,WAAW,IAAC,SAAS,EAAC,oCAAoC,2BAE7C,EACd,KAAC,iBAAiB,IAAC,SAAS,EAAC,8BAA8B,YACxD,QAAQ,CAAC,CAAC,CAAC,CACV,0FAGE,cAAK,SAAS,EAAC,6IAA6I,wBAEtJ,IACL,CACJ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CACd,yBAAyB,CAC1B,CAAC,CAAC,CAAC,CACF,GAAG,CACJ,GACiB,IAChB,EACN,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,WAAW,gBACT,QAAQ,EACnB,SAAS,EAAC,iHAAiH,YAE3H,KAAC,CAAC,IAAC,SAAS,EAAC,SAAS,GAAG,GAClB,IACL,EAGN,cAAK,SAAS,EAAC,qGAAqG,YAClH,eAAK,SAAS,EAAC,kIAAkI,aAC/I,gBACE,GAAG,EAAE,QAAQ,EACb,WAAW,QACX,KAAK,QACL,SAAS,EAAE,EAAE,CAAC,4BAA4B,EAAE,CAAC,QAAQ,IAAI,WAAW,CAAC,GACrE,EACF,iBAAQ,GAAG,EAAE,SAAS,EAAE,SAAS,EAAC,QAAQ,GAAG,EAE5C,SAAS,IAAI,CACZ,eAAK,SAAS,EAAC,6EAA6E,aAC1F,KAAC,MAAM,IAAC,SAAS,EAAC,oCAAoC,GAAG,EACzD,YAAG,SAAS,EAAC,oBAAoB,kDAA4B,IACzD,CACP,EAEA,QAAQ,IAAI,CACX,eAAK,SAAS,EAAC,8FAA8F,aAC3G,KAAC,QAAQ,IAAC,SAAS,EAAC,4BAA4B,GAAG,EACnD,YAAG,SAAS,EAAC,uCAAuC,YAAE,YAAY,GAAK,EACtE,QAAQ,IAAI,CACX,MAAC,MAAM,IACL,OAAO,EAAC,SAAS,EACjB,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,EACtC,SAAS,EAAC,2DAA2D,aAErE,KAAC,SAAS,IAAC,SAAS,EAAC,aAAa,GAAG,kBAE9B,CACV,IACG,CACP,IACG,GACF,EAGN,eAAK,SAAS,EAAC,gEAAgE,aAC5E,QAAQ,IAAI,kBAAkB,CAAC,CAAC,CAAC,CAChC,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,UAAU,gBACR,qBAAgB,EAC3B,SAAS,EAAC,6HAA6H,YAEvI,KAAC,eAAe,IAAC,SAAS,EAAC,SAAS,GAAG,GAChC,CACV,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,WAAW,GAAG,CAC9B,EAED,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,CAAC,QAAQ,gBACR,YAAY,EACvB,SAAS,EAAE,EAAE,CACX,+EAA+E,EAC/E,QAAQ;wCACN,CAAC,CAAC,6CAA6C;wCAC/C,CAAC,CAAC,gCAAgC,CACrC,GACD,EAEF,cAAK,SAAS,EAAC,WAAW,GAAG,IACzB,IACkB,IACb,GACR,CACV,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAa,EAAE,MAAc,EAAE,WAAmB;IAC/E,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,CAAC;IAClC,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,UAAU,GAAG,MAAM,CAAC;IAExB,IAAI,UAAU,GAAG,WAAW,EAAE,CAAC;QAC7B,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC;IAC/C,CAAC;SAAM,IAAI,UAAU,GAAG,WAAW,EAAE,CAAC;QACpC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,WAAW,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO;QACL,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QACnD,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE,UAAU;KACnB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface ChatInputProps {
|
|
2
|
+
value: string;
|
|
3
|
+
onChange: (value: string) => void;
|
|
4
|
+
onSubmit: () => void;
|
|
5
|
+
onUploadClick?: () => void;
|
|
6
|
+
onCameraClick?: () => void;
|
|
7
|
+
onMicClick?: () => void;
|
|
8
|
+
isRecording?: boolean;
|
|
9
|
+
isTranscribing?: boolean;
|
|
10
|
+
disabled?: boolean;
|
|
11
|
+
micDisabled?: boolean;
|
|
12
|
+
micDisabledReason?: string;
|
|
13
|
+
isStreaming?: boolean;
|
|
14
|
+
placeholder?: string;
|
|
15
|
+
maxLength?: number;
|
|
16
|
+
className?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function ChatInput({ value, onChange, onSubmit, onUploadClick, onCameraClick, onMicClick, isRecording, isTranscribing, disabled, micDisabled, micDisabledReason, isStreaming, placeholder, maxLength, className, }: ChatInputProps): import("react").JSX.Element;
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ChatInput/index.tsx"],"names":[],"mappings":"AAOA,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAgED,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,aAAa,EACb,UAAU,EACV,WAAmB,EACnB,cAAsB,EACtB,QAAQ,EACR,WAAW,EACX,iBAAiB,EACjB,WAAW,EACX,WAAqC,EACrC,SAAS,EACT,SAAS,GACV,EAAE,cAAc,+BA+MhB"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { ArrowUp, Camera, Loader2, Mic, Paperclip, Plus } from "lucide-react";
|
|
3
|
+
import { useEffect, useRef, useState } from "react";
|
|
4
|
+
import { cn } from "../../lib/utils";
|
|
5
|
+
import { Button } from "../primitives/Button";
|
|
6
|
+
const WAVE_BARS = [
|
|
7
|
+
{ maxH: 0.35, duration: 0.7 },
|
|
8
|
+
{ maxH: 0.65, duration: 0.5 },
|
|
9
|
+
{ maxH: 1.0, duration: 0.6 },
|
|
10
|
+
{ maxH: 0.75, duration: 0.45 },
|
|
11
|
+
{ maxH: 0.5, duration: 0.8 },
|
|
12
|
+
{ maxH: 0.9, duration: 0.55 },
|
|
13
|
+
{ maxH: 0.6, duration: 0.65 },
|
|
14
|
+
{ maxH: 0.4, duration: 0.5 },
|
|
15
|
+
{ maxH: 0.8, duration: 0.7 },
|
|
16
|
+
{ maxH: 0.55, duration: 0.6 },
|
|
17
|
+
{ maxH: 0.95, duration: 0.48 },
|
|
18
|
+
{ maxH: 0.45, duration: 0.75 },
|
|
19
|
+
];
|
|
20
|
+
function SoundWave() {
|
|
21
|
+
return (_jsxs(_Fragment, { children: [_jsx("style", { children: `
|
|
22
|
+
@keyframes sound-bar {
|
|
23
|
+
0%, 100% { transform: scaleY(0.15); }
|
|
24
|
+
50% { transform: scaleY(1); }
|
|
25
|
+
}
|
|
26
|
+
@keyframes rec-dot {
|
|
27
|
+
0%, 49% { opacity: 1; }
|
|
28
|
+
50%, 100% { opacity: 0; }
|
|
29
|
+
}
|
|
30
|
+
` }), _jsx("div", { className: "flex items-center gap-[3px] h-6", "aria-hidden": "true", children: WAVE_BARS.map((bar, i) => (_jsx("span", { className: "w-[3px] rounded-full bg-primary origin-center", style: {
|
|
31
|
+
height: `${Math.round(bar.maxH * 24)}px`,
|
|
32
|
+
animation: `sound-bar ${bar.duration}s ease-in-out infinite`,
|
|
33
|
+
animationDelay: `${(i * 0.07).toFixed(2)}s`,
|
|
34
|
+
} }, i))) })] }));
|
|
35
|
+
}
|
|
36
|
+
function RecordingIndicator({ elapsed }) {
|
|
37
|
+
const m = Math.floor(elapsed / 60);
|
|
38
|
+
const s = elapsed % 60;
|
|
39
|
+
return (_jsxs("div", { className: "flex items-center gap-1.5 shrink-0", children: [_jsx("span", { className: "w-1.5 h-1.5 rounded-full bg-primary", style: { animation: "rec-dot 1s step-start infinite" }, "aria-hidden": "true" }), _jsxs("span", { className: "text-[13px] font-mono text-primary tabular-nums leading-none", children: [m, ":", String(s).padStart(2, "0")] })] }));
|
|
40
|
+
}
|
|
41
|
+
export function ChatInput({ value, onChange, onSubmit, onUploadClick, onCameraClick, onMicClick, isRecording = false, isTranscribing = false, disabled, micDisabled, micDisabledReason, isStreaming, placeholder = "Escribí tu mensaje...", maxLength, className, }) {
|
|
42
|
+
const rootRef = useRef(null);
|
|
43
|
+
const textareaRef = useRef(null);
|
|
44
|
+
const timerRef = useRef(null);
|
|
45
|
+
const attachMenuRef = useRef(null);
|
|
46
|
+
const [elapsed, setElapsed] = useState(0);
|
|
47
|
+
const [attachMenuOpen, setAttachMenuOpen] = useState(false);
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
const root = rootRef.current;
|
|
50
|
+
if (!root || typeof ResizeObserver === "undefined")
|
|
51
|
+
return;
|
|
52
|
+
const publishHeight = () => {
|
|
53
|
+
document.documentElement.style.setProperty("--admission-chat-input-height", `${Math.ceil(root.getBoundingClientRect().height)}px`);
|
|
54
|
+
};
|
|
55
|
+
publishHeight();
|
|
56
|
+
const observer = new ResizeObserver(publishHeight);
|
|
57
|
+
observer.observe(root);
|
|
58
|
+
window.addEventListener("resize", publishHeight);
|
|
59
|
+
return () => {
|
|
60
|
+
observer.disconnect();
|
|
61
|
+
window.removeEventListener("resize", publishHeight);
|
|
62
|
+
document.documentElement.style.removeProperty("--admission-chat-input-height");
|
|
63
|
+
};
|
|
64
|
+
}, []);
|
|
65
|
+
useEffect(() => {
|
|
66
|
+
const textarea = textareaRef.current;
|
|
67
|
+
if (!textarea)
|
|
68
|
+
return;
|
|
69
|
+
textarea.style.height = "0px";
|
|
70
|
+
textarea.style.height = `${Math.min(textarea.scrollHeight, 160)}px`;
|
|
71
|
+
}, [value]);
|
|
72
|
+
useEffect(() => {
|
|
73
|
+
if (isRecording) {
|
|
74
|
+
setElapsed(0);
|
|
75
|
+
timerRef.current = setInterval(() => {
|
|
76
|
+
setElapsed((prev) => prev + 1);
|
|
77
|
+
}, 1000);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
if (timerRef.current) {
|
|
81
|
+
clearInterval(timerRef.current);
|
|
82
|
+
timerRef.current = null;
|
|
83
|
+
}
|
|
84
|
+
setElapsed(0);
|
|
85
|
+
}
|
|
86
|
+
return () => {
|
|
87
|
+
if (timerRef.current)
|
|
88
|
+
clearInterval(timerRef.current);
|
|
89
|
+
};
|
|
90
|
+
}, [isRecording]);
|
|
91
|
+
// Cerrar menú al hacer clic fuera
|
|
92
|
+
useEffect(() => {
|
|
93
|
+
if (!attachMenuOpen)
|
|
94
|
+
return;
|
|
95
|
+
const handleOutside = (e) => {
|
|
96
|
+
if (attachMenuRef.current && !attachMenuRef.current.contains(e.target)) {
|
|
97
|
+
setAttachMenuOpen(false);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
document.addEventListener("mousedown", handleOutside);
|
|
101
|
+
return () => document.removeEventListener("mousedown", handleOutside);
|
|
102
|
+
}, [attachMenuOpen]);
|
|
103
|
+
const hasAttachOptions = Boolean(onUploadClick || onCameraClick);
|
|
104
|
+
const isMicDisabled = (!isRecording && (micDisabled ?? disabled)) || isTranscribing || !onMicClick;
|
|
105
|
+
const handleKeyDown = (event) => {
|
|
106
|
+
if (event.key === "Enter" && !event.shiftKey) {
|
|
107
|
+
event.preventDefault();
|
|
108
|
+
if (value.trim() && !disabled) {
|
|
109
|
+
onSubmit();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
return (_jsx("div", { ref: rootRef, className: cn("relative z-10 border-t border-border/70 bg-background/85 p-3 backdrop-blur-xl sm:p-4", className), children: _jsxs("div", { className: "mx-auto flex max-w-4xl items-end gap-2 rounded-[1.35rem] border border-border bg-card/95 p-2 shadow-[0_18px_60px_hsl(var(--foreground)/0.08)] transition-all duration-300 focus-within:border-primary/40 focus-within:shadow-glow", children: [_jsxs("div", { ref: attachMenuRef, className: "relative shrink-0", children: [attachMenuOpen && (_jsxs("div", { className: "absolute bottom-full left-0 mb-2 flex min-w-[148px] flex-col gap-0.5 rounded-2xl border border-border bg-card p-1.5 shadow-glow", style: { animation: "attach-menu-in 0.15s ease-out both" }, children: [_jsx("style", { children: `
|
|
114
|
+
@keyframes attach-menu-in {
|
|
115
|
+
from { opacity: 0; transform: translateY(6px) scale(0.96); }
|
|
116
|
+
to { opacity: 1; transform: translateY(0) scale(1); }
|
|
117
|
+
}
|
|
118
|
+
` }), onCameraClick && (_jsxs("button", { type: "button", onClick: () => { setAttachMenuOpen(false); onCameraClick(); }, className: "flex items-center gap-2.5 rounded-xl px-3 py-2.5 text-sm font-medium text-foreground transition-colors hover:bg-muted", children: [_jsx(Camera, { className: "h-4 w-4 shrink-0 text-primary" }), "C\u00E1mara"] })), onUploadClick && (_jsxs("button", { type: "button", onClick: () => { setAttachMenuOpen(false); onUploadClick(); }, className: "flex items-center gap-2.5 rounded-xl px-3 py-2.5 text-sm font-medium text-foreground transition-colors hover:bg-muted", children: [_jsx(Paperclip, { className: "h-4 w-4 shrink-0 text-primary" }), "Archivo"] }))] })), _jsx(Button, { type: "button", size: "icon", variant: "ghost", disabled: disabled || !hasAttachOptions, onClick: () => setAttachMenuOpen((prev) => !prev), "aria-label": "Adjuntar", "aria-expanded": attachMenuOpen, className: cn("h-11 w-11 rounded-2xl transition-all duration-200", attachMenuOpen
|
|
119
|
+
? "rotate-45 text-primary hover:text-primary"
|
|
120
|
+
: "text-muted-foreground hover:text-foreground"), children: _jsx(Plus, { className: "h-4 w-4" }) })] }), _jsxs("div", { className: "relative flex-1 min-h-11 flex items-center", children: [_jsx("textarea", { ref: textareaRef, value: value, onChange: (event) => onChange(event.target.value), onKeyDown: handleKeyDown, disabled: disabled || isRecording, maxLength: maxLength, rows: 1, placeholder: isRecording ? "" : placeholder, className: cn("w-full max-h-40 min-h-11 resize-none bg-transparent px-1 py-2.5 text-[15px] leading-6 outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed transition-opacity duration-200", isRecording && "opacity-0 pointer-events-none select-none") }), isRecording && (_jsxs("div", { className: "absolute inset-0 flex items-center gap-3 px-1 pointer-events-none", children: [_jsx(RecordingIndicator, { elapsed: elapsed }), _jsx(SoundWave, {})] }))] }), _jsx(Button, { type: "button", size: "icon", variant: "ghost", disabled: isMicDisabled, onClick: onMicClick, "aria-label": isRecording ? "Detener grabación" : "Grabar audio", title: isMicDisabled ? micDisabledReason : undefined, className: cn("relative h-11 w-11 shrink-0 rounded-2xl transition-colors", isRecording
|
|
121
|
+
? "text-destructive hover:text-destructive"
|
|
122
|
+
: "text-muted-foreground hover:text-foreground"), children: isTranscribing ? (_jsx(Loader2, { className: "h-4 w-4 animate-spin" })) : (_jsxs(_Fragment, { children: [isRecording && (_jsx("span", { className: "absolute inset-0 rounded-2xl bg-destructive/20 animate-record-ring" })), _jsx(Mic, { className: "relative h-4 w-4" })] })) }), _jsx(Button, { type: "button", size: "icon", variant: value.trim() ? "glow" : "secondary", disabled: disabled || !value.trim(), onClick: onSubmit, "aria-label": "Enviar mensaje", className: "h-11 w-11 shrink-0 rounded-2xl", children: _jsx(ArrowUp, { className: cn("h-4 w-4", isStreaming && "animate-stream-pulse") }) })] }) }));
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/ChatInput/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ChoiceCardWidget } from "../../types";
|
|
2
|
+
export interface ChoiceCardPanelProps {
|
|
3
|
+
widget: ChoiceCardWidget;
|
|
4
|
+
answers: Record<string, string | string[]>;
|
|
5
|
+
onAnswer: (fieldId: string, value: string | string[]) => void;
|
|
6
|
+
onSubmit: (answers: Record<string, string>) => void;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
className?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function ChoiceCardPanel({ widget, answers, onAnswer, onSubmit, disabled, className, }: ChoiceCardPanelProps): import("react").JSX.Element;
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ChoiceCardPanel/index.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,gBAAgB,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAC3C,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,IAAI,CAAC;IAC9D,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;IACpD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,SAAS,GACV,EAAE,oBAAoB,+BA2KtB"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Check } from "lucide-react";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { cn } from "../../lib/utils";
|
|
5
|
+
import { CardShell } from "../QuestionCardPanel/CardShell";
|
|
6
|
+
export function ChoiceCardPanel({ widget, answers, onAnswer, onSubmit, disabled, className, }) {
|
|
7
|
+
const [freeTextValues, setFreeTextValues] = useState({});
|
|
8
|
+
const getSelectedLabels = (fieldId, multiSelect) => {
|
|
9
|
+
const v = answers[fieldId];
|
|
10
|
+
if (multiSelect)
|
|
11
|
+
return Array.isArray(v) ? v : [];
|
|
12
|
+
return typeof v === "string" && v ? [v] : [];
|
|
13
|
+
};
|
|
14
|
+
const isFieldAnswered = (fieldId, multiSelect) => getSelectedLabels(fieldId, multiSelect).length > 0;
|
|
15
|
+
const allFreeTextFilled = widget.fields.every((f) => {
|
|
16
|
+
const selected = getSelectedLabels(f.fieldId, f.multiSelect);
|
|
17
|
+
return f.options.every((opt) => {
|
|
18
|
+
if (!opt.freeText || !selected.includes(opt.label))
|
|
19
|
+
return true;
|
|
20
|
+
return (freeTextValues[f.fieldId]?.[opt.label] ?? "").trim().length > 0;
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
const answeredCount = widget.fields.filter((f) => isFieldAnswered(f.fieldId, f.multiSelect)).length;
|
|
24
|
+
const totalFields = widget.fields.length;
|
|
25
|
+
const allAnswered = answeredCount >= totalFields && allFreeTextFilled;
|
|
26
|
+
const remaining = totalFields - answeredCount;
|
|
27
|
+
const handleToggle = (fieldId, optionLabel, multiSelect, exclusive) => {
|
|
28
|
+
if (disabled)
|
|
29
|
+
return;
|
|
30
|
+
if (multiSelect) {
|
|
31
|
+
const current = getSelectedLabels(fieldId, true);
|
|
32
|
+
let updated;
|
|
33
|
+
if (exclusive) {
|
|
34
|
+
updated = current.includes(optionLabel) ? [] : [optionLabel];
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
const field = widget.fields.find((f) => f.fieldId === fieldId);
|
|
38
|
+
const exclusiveLabels = field?.options.filter((o) => o.exclusive).map((o) => o.label) ?? [];
|
|
39
|
+
if (current.includes(optionLabel)) {
|
|
40
|
+
updated = current.filter((v) => v !== optionLabel);
|
|
41
|
+
setFreeTextValues((prev) => {
|
|
42
|
+
const fieldTexts = { ...(prev[fieldId] ?? {}) };
|
|
43
|
+
delete fieldTexts[optionLabel];
|
|
44
|
+
return { ...prev, [fieldId]: fieldTexts };
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
updated = [...current.filter((v) => !exclusiveLabels.includes(v)), optionLabel];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
onAnswer(fieldId, updated);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
const current = getSelectedLabels(fieldId, false)[0] ?? "";
|
|
55
|
+
if (current === optionLabel)
|
|
56
|
+
return;
|
|
57
|
+
if (current) {
|
|
58
|
+
setFreeTextValues((prev) => {
|
|
59
|
+
const fieldTexts = { ...(prev[fieldId] ?? {}) };
|
|
60
|
+
delete fieldTexts[current];
|
|
61
|
+
return { ...prev, [fieldId]: fieldTexts };
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
onAnswer(fieldId, optionLabel);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
const handleFreeText = (fieldId, optionLabel, text) => {
|
|
68
|
+
setFreeTextValues((prev) => ({
|
|
69
|
+
...prev,
|
|
70
|
+
[fieldId]: { ...(prev[fieldId] ?? {}), [optionLabel]: text },
|
|
71
|
+
}));
|
|
72
|
+
};
|
|
73
|
+
const handleSubmit = () => {
|
|
74
|
+
const serialized = {};
|
|
75
|
+
for (const field of widget.fields) {
|
|
76
|
+
const selected = getSelectedLabels(field.fieldId, field.multiSelect);
|
|
77
|
+
const parts = selected.map((label) => {
|
|
78
|
+
const opt = field.options.find((o) => o.label === label);
|
|
79
|
+
if (opt?.freeText) {
|
|
80
|
+
const text = (freeTextValues[field.fieldId]?.[label] ?? "").trim();
|
|
81
|
+
return text ? `${label}: ${text}` : label;
|
|
82
|
+
}
|
|
83
|
+
return label;
|
|
84
|
+
});
|
|
85
|
+
serialized[field.fieldId] = parts.join(" | ");
|
|
86
|
+
}
|
|
87
|
+
onSubmit(serialized);
|
|
88
|
+
};
|
|
89
|
+
return (_jsx(CardShell, { label: widget.label, description: widget.description, remaining: remaining, total: totalFields, allAnswered: allAnswered, disabled: disabled, onSubmit: handleSubmit, className: className, children: _jsx("div", { className: "flex flex-col divide-y divide-border/40", children: widget.fields.map((field) => {
|
|
90
|
+
const selectedLabels = getSelectedLabels(field.fieldId, field.multiSelect);
|
|
91
|
+
return (_jsxs("div", { className: "py-3", children: [widget.fields.length > 1 && (_jsx("p", { className: "mb-2 text-xs font-medium text-muted-foreground", children: field.label })), _jsx("div", { className: "flex flex-col gap-1.5", children: field.options.map((opt) => {
|
|
92
|
+
const isSelected = selectedLabels.includes(opt.label);
|
|
93
|
+
const showFreeText = isSelected && opt.freeText;
|
|
94
|
+
const freeText = freeTextValues[field.fieldId]?.[opt.label] ?? "";
|
|
95
|
+
return (_jsxs("div", { children: [_jsxs("button", { type: "button", disabled: disabled, onClick: () => handleToggle(field.fieldId, opt.label, field.multiSelect, opt.exclusive ?? false), "aria-pressed": isSelected, className: cn("flex w-full items-center gap-3 rounded-xl border px-3 py-2.5 text-left text-sm transition-all duration-150", isSelected
|
|
96
|
+
? "border-primary bg-primary/8 text-foreground"
|
|
97
|
+
: "border-border/60 bg-transparent text-foreground hover:border-primary/40 hover:bg-primary/4", disabled && "cursor-not-allowed opacity-60"), children: [_jsx("span", { className: cn("flex h-4 w-4 shrink-0 items-center justify-center border-2 transition-all", field.multiSelect ? "rounded-[4px]" : "rounded-full", isSelected ? "border-primary bg-primary" : "border-border"), children: isSelected && _jsx(Check, { className: "h-2.5 w-2.5 text-primary-foreground" }) }), _jsx("span", { className: "flex-1", children: opt.label })] }), showFreeText && (_jsx("div", { className: "mt-1.5 pl-7", children: _jsx("input", { type: "text", placeholder: "Especifica cu\u00E1l...", value: freeText, onChange: (e) => handleFreeText(field.fieldId, opt.label, e.target.value), disabled: disabled, autoFocus: true, className: "w-full rounded-lg border border-primary/30 bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:border-primary focus:outline-none" }) }))] }, opt.label));
|
|
98
|
+
}) })] }, field.fieldId));
|
|
99
|
+
}) }) }));
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/ChoiceCardPanel/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ConfirmationSummary } from '../../types';
|
|
2
|
+
export interface ConfirmationSummaryCardProps {
|
|
3
|
+
summary: ConfirmationSummary;
|
|
4
|
+
className?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function ConfirmationSummaryCard({ summary, className, }: ConfirmationSummaryCardProps): import("react").JSX.Element;
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ConfirmationSummaryCard/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGvD,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,mBAAmB,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,uBAAuB,CAAC,EACtC,OAAO,EACP,SAAS,GACV,EAAE,4BAA4B,+BA+D9B"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { CheckCircle2, ClipboardCheck, FileText, UserRound } from 'lucide-react';
|
|
3
|
+
import { cn } from '../../lib/utils';
|
|
4
|
+
export function ConfirmationSummaryCard({ summary, className, }) {
|
|
5
|
+
return (_jsxs("section", { className: cn('mt-4 overflow-hidden rounded-lg border border-primary/20 bg-primary/[0.03] shadow-[0_0_0_1px_hsl(var(--primary)/0.04),0_14px_34px_hsl(var(--foreground)/0.08)]', className), children: [_jsx("div", { className: "border-b border-primary/10 bg-card/80 px-4 py-3", children: _jsxs("div", { className: "flex items-start gap-3", children: [_jsx("span", { className: "mt-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-primary/10 text-primary", children: _jsx(ClipboardCheck, { className: "h-5 w-5" }) }), _jsxs("div", { className: "min-w-0", children: [_jsx("h3", { className: "text-sm font-semibold text-foreground", children: summary.title }), summary.description ? (_jsx("p", { className: "mt-1 text-xs leading-5 text-muted-foreground", children: summary.description })) : null] })] }) }), _jsx("div", { className: cn('grid gap-3 p-3 sm:grid-cols-1', summary.sections.length > 1 && 'sm:grid-cols-2'), children: summary.sections.map((section) => (_jsxs("div", { className: "rounded-lg border border-border/80 bg-card/90 p-3", children: [_jsxs("div", { className: "mb-3 flex items-center gap-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: [section.id.includes('document') ? (_jsx(FileText, { className: "h-3.5 w-3.5" })) : (_jsx(UserRound, { className: "h-3.5 w-3.5" })), _jsx("span", { children: section.title })] }), _jsx("dl", { className: "space-y-2", children: section.items.map((item) => (_jsxs("div", { className: "grid gap-0.5", children: [_jsx("dt", { className: "text-[0.7rem] font-medium uppercase tracking-wide text-muted-foreground", children: item.label }), _jsx("dd", { className: "break-words text-sm font-medium leading-5 text-foreground", children: item.value })] }, item.id))) })] }, section.id))) }), _jsxs("div", { className: "flex items-center gap-2 border-t border-primary/10 bg-primary/[0.04] px-4 py-3 text-xs font-medium text-muted-foreground", children: [_jsx(CheckCircle2, { className: "h-4 w-4 shrink-0 text-primary" }), _jsx("span", { children: "Confirma solo si los datos y documentos cargados son correctos." })] })] }));
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/ConfirmationSummaryCard/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGjF,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAOrC,MAAM,UAAU,uBAAuB,CAAC,EACtC,OAAO,EACP,SAAS,GACoB;IAC7B,OAAO,CACL,mBACE,SAAS,EAAE,EAAE,CACX,gKAAgK,EAChK,SAAS,CACV,aAED,cAAK,SAAS,EAAC,iDAAiD,YAC9D,eAAK,SAAS,EAAC,wBAAwB,aACrC,eAAM,SAAS,EAAC,gGAAgG,YAC9G,KAAC,cAAc,IAAC,SAAS,EAAC,SAAS,GAAG,GACjC,EACP,eAAK,SAAS,EAAC,SAAS,aACtB,aAAI,SAAS,EAAC,uCAAuC,YAAE,OAAO,CAAC,KAAK,GAAM,EACzE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CACrB,YAAG,SAAS,EAAC,8CAA8C,YACxD,OAAO,CAAC,WAAW,GAClB,CACL,CAAC,CAAC,CAAC,IAAI,IACJ,IACF,GACF,EAEN,cACE,SAAS,EAAE,EAAE,CAAC,+BAA+B,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,gBAAgB,CAAC,YAE9F,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CACjC,eAEE,SAAS,EAAC,mDAAmD,aAE7D,eAAK,SAAS,EAAC,kGAAkG,aAC9G,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CACjC,KAAC,QAAQ,IAAC,SAAS,EAAC,aAAa,GAAG,CACrC,CAAC,CAAC,CAAC,CACF,KAAC,SAAS,IAAC,SAAS,EAAC,aAAa,GAAG,CACtC,EACD,yBAAO,OAAO,CAAC,KAAK,GAAQ,IACxB,EAEN,aAAI,SAAS,EAAC,WAAW,YACtB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAC3B,eAAmB,SAAS,EAAC,cAAc,aACzC,aAAI,SAAS,EAAC,yEAAyE,YACpF,IAAI,CAAC,KAAK,GACR,EACL,aAAI,SAAS,EAAC,2DAA2D,YACtE,IAAI,CAAC,KAAK,GACR,KANG,IAAI,CAAC,EAAE,CAOX,CACP,CAAC,GACC,KAvBA,OAAO,CAAC,EAAE,CAwBX,CACP,CAAC,GACE,EAEN,eAAK,SAAS,EAAC,0HAA0H,aACvI,KAAC,YAAY,IAAC,SAAS,EAAC,+BAA+B,GAAG,EAC1D,6FAA4E,IACxE,IACE,CACX,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface ConsentViewerProps {
|
|
2
|
+
title: string;
|
|
3
|
+
body: string;
|
|
4
|
+
accepted?: boolean;
|
|
5
|
+
onAccept?: () => void;
|
|
6
|
+
className?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function ConsentViewer({ title, body, accepted, onAccept, className }: ConsentViewerProps): import("react").JSX.Element;
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ConsentViewer/index.tsx"],"names":[],"mappings":"AAKA,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,kBAAkB,+BAqB/F"}
|