@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.
Files changed (103) hide show
  1. package/components.json +17 -0
  2. package/dist/components/AttachmentViewer/index.d.ts +7 -0
  3. package/dist/components/AttachmentViewer/index.d.ts.map +1 -0
  4. package/dist/components/AttachmentViewer/index.js +15 -0
  5. package/dist/components/AttachmentViewer/index.js.map +1 -0
  6. package/dist/components/CameraCapture/index.d.ts +7 -0
  7. package/dist/components/CameraCapture/index.d.ts.map +1 -0
  8. package/dist/components/CameraCapture/index.js +153 -0
  9. package/dist/components/CameraCapture/index.js.map +1 -0
  10. package/dist/components/ChatInput/index.d.ts +19 -0
  11. package/dist/components/ChatInput/index.d.ts.map +1 -0
  12. package/dist/components/ChatInput/index.js +124 -0
  13. package/dist/components/ChatInput/index.js.map +1 -0
  14. package/dist/components/ChoiceCardPanel/index.d.ts +11 -0
  15. package/dist/components/ChoiceCardPanel/index.d.ts.map +1 -0
  16. package/dist/components/ChoiceCardPanel/index.js +101 -0
  17. package/dist/components/ChoiceCardPanel/index.js.map +1 -0
  18. package/dist/components/ConfirmationSummaryCard/index.d.ts +7 -0
  19. package/dist/components/ConfirmationSummaryCard/index.d.ts.map +1 -0
  20. package/dist/components/ConfirmationSummaryCard/index.js +7 -0
  21. package/dist/components/ConfirmationSummaryCard/index.js.map +1 -0
  22. package/dist/components/ConsentViewer/index.d.ts +9 -0
  23. package/dist/components/ConsentViewer/index.d.ts.map +1 -0
  24. package/dist/components/ConsentViewer/index.js +8 -0
  25. package/dist/components/ConsentViewer/index.js.map +1 -0
  26. package/dist/components/FrontendWidgetsArea/index.d.ts +17 -0
  27. package/dist/components/FrontendWidgetsArea/index.d.ts.map +1 -0
  28. package/dist/components/FrontendWidgetsArea/index.js +329 -0
  29. package/dist/components/FrontendWidgetsArea/index.js.map +1 -0
  30. package/dist/components/MessageArea/index.d.ts +14 -0
  31. package/dist/components/MessageArea/index.d.ts.map +1 -0
  32. package/dist/components/MessageArea/index.js +17 -0
  33. package/dist/components/MessageArea/index.js.map +1 -0
  34. package/dist/components/MessageBubble/index.d.ts +11 -0
  35. package/dist/components/MessageBubble/index.d.ts.map +1 -0
  36. package/dist/components/MessageBubble/index.js +17 -0
  37. package/dist/components/MessageBubble/index.js.map +1 -0
  38. package/dist/components/ProgressSteps/index.d.ts +23 -0
  39. package/dist/components/ProgressSteps/index.d.ts.map +1 -0
  40. package/dist/components/ProgressSteps/index.js +50 -0
  41. package/dist/components/ProgressSteps/index.js.map +1 -0
  42. package/dist/components/QuestionCardPanel/CardShell.d.ts +14 -0
  43. package/dist/components/QuestionCardPanel/CardShell.d.ts.map +1 -0
  44. package/dist/components/QuestionCardPanel/CardShell.js +8 -0
  45. package/dist/components/QuestionCardPanel/CardShell.js.map +1 -0
  46. package/dist/components/QuestionCardPanel/index.d.ts +11 -0
  47. package/dist/components/QuestionCardPanel/index.d.ts.map +1 -0
  48. package/dist/components/QuestionCardPanel/index.js +17 -0
  49. package/dist/components/QuestionCardPanel/index.js.map +1 -0
  50. package/dist/components/QuickActionButton/index.d.ts +6 -0
  51. package/dist/components/QuickActionButton/index.d.ts.map +1 -0
  52. package/dist/components/QuickActionButton/index.js +7 -0
  53. package/dist/components/QuickActionButton/index.js.map +1 -0
  54. package/dist/components/QuickActionsArea/index.d.ts +8 -0
  55. package/dist/components/QuickActionsArea/index.d.ts.map +1 -0
  56. package/dist/components/QuickActionsArea/index.js +10 -0
  57. package/dist/components/QuickActionsArea/index.js.map +1 -0
  58. package/dist/components/RegenerateMessageButton/index.d.ts +3 -0
  59. package/dist/components/RegenerateMessageButton/index.d.ts.map +1 -0
  60. package/dist/components/RegenerateMessageButton/index.js +7 -0
  61. package/dist/components/RegenerateMessageButton/index.js.map +1 -0
  62. package/dist/components/RichText/index.d.ts +6 -0
  63. package/dist/components/RichText/index.d.ts.map +1 -0
  64. package/dist/components/RichText/index.js +113 -0
  65. package/dist/components/RichText/index.js.map +1 -0
  66. package/dist/components/TimeEstimateCard/index.d.ts +7 -0
  67. package/dist/components/TimeEstimateCard/index.d.ts.map +1 -0
  68. package/dist/components/TimeEstimateCard/index.js +14 -0
  69. package/dist/components/TimeEstimateCard/index.js.map +1 -0
  70. package/dist/components/UploadDocumentButton/index.d.ts +3 -0
  71. package/dist/components/UploadDocumentButton/index.d.ts.map +1 -0
  72. package/dist/components/UploadDocumentButton/index.js +7 -0
  73. package/dist/components/UploadDocumentButton/index.js.map +1 -0
  74. package/dist/components/primitives/Avatar.d.ts +8 -0
  75. package/dist/components/primitives/Avatar.d.ts.map +1 -0
  76. package/dist/components/primitives/Avatar.js +6 -0
  77. package/dist/components/primitives/Avatar.js.map +1 -0
  78. package/dist/components/primitives/Button.d.ts +12 -0
  79. package/dist/components/primitives/Button.d.ts.map +1 -0
  80. package/dist/components/primitives/Button.js +34 -0
  81. package/dist/components/primitives/Button.js.map +1 -0
  82. package/dist/components/primitives/Dialog.d.ts +11 -0
  83. package/dist/components/primitives/Dialog.d.ts.map +1 -0
  84. package/dist/components/primitives/Dialog.js +16 -0
  85. package/dist/components/primitives/Dialog.js.map +1 -0
  86. package/dist/components/primitives/index.d.ts +4 -0
  87. package/dist/components/primitives/index.d.ts.map +1 -0
  88. package/dist/components/primitives/index.js +4 -0
  89. package/dist/components/primitives/index.js.map +1 -0
  90. package/dist/index.d.ts +20 -0
  91. package/dist/index.d.ts.map +1 -0
  92. package/dist/index.js +20 -0
  93. package/dist/index.js.map +1 -0
  94. package/dist/lib/utils.d.ts +3 -0
  95. package/dist/lib/utils.d.ts.map +1 -0
  96. package/dist/lib/utils.js +6 -0
  97. package/dist/lib/utils.js.map +1 -0
  98. package/dist/types.d.ts +126 -0
  99. package/dist/types.d.ts.map +1 -0
  100. package/dist/types.js +2 -0
  101. package/dist/types.js.map +1 -0
  102. package/package.json +52 -0
  103. package/src/styles.css +107 -0
@@ -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":"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"}
@@ -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"}