@chronowl/widget 1.0.0
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/LICENSE +21 -0
- package/dist/ChronOwlWidget.d.ts +22 -0
- package/dist/components/atoms/Badge.d.ts +10 -0
- package/dist/components/atoms/Button.d.ts +10 -0
- package/dist/components/atoms/Card.d.ts +9 -0
- package/dist/components/atoms/Divider.d.ts +9 -0
- package/dist/components/atoms/Icon.d.ts +10 -0
- package/dist/components/atoms/Input.d.ts +10 -0
- package/dist/components/atoms/Label.d.ts +9 -0
- package/dist/components/atoms/Spinner.d.ts +9 -0
- package/dist/components/atoms/Typography.d.ts +10 -0
- package/dist/components/atoms/index.d.ts +9 -0
- package/dist/components/hooks/useAvailability.d.ts +11 -0
- package/dist/components/hooks/useBooking.d.ts +12 -0
- package/dist/components/hooks/useForm.d.ts +19 -0
- package/dist/components/hooks/useServices.d.ts +10 -0
- package/dist/components/index.d.ts +5 -0
- package/dist/components/molecules/AvailabilitySlot.d.ts +9 -0
- package/dist/components/molecules/ButtonGroup.d.ts +9 -0
- package/dist/components/molecules/ConfirmationBadge.d.ts +9 -0
- package/dist/components/molecules/DateSelector.d.ts +10 -0
- package/dist/components/molecules/EmptyState.d.ts +9 -0
- package/dist/components/molecules/FormGroup.d.ts +10 -0
- package/dist/components/molecules/InputWithIcon.d.ts +9 -0
- package/dist/components/molecules/LoadingState.d.ts +9 -0
- package/dist/components/molecules/ServiceCard.d.ts +10 -0
- package/dist/components/molecules/TimeSelector.d.ts +9 -0
- package/dist/components/molecules/index.d.ts +10 -0
- package/dist/components/organisms/AvailabilityGrid.d.ts +9 -0
- package/dist/components/organisms/BookingForm.d.ts +10 -0
- package/dist/components/organisms/Calendar.d.ts +10 -0
- package/dist/components/organisms/ConfirmationModal.d.ts +10 -0
- package/dist/components/organisms/ErrorModal.d.ts +9 -0
- package/dist/components/organisms/Footer.d.ts +9 -0
- package/dist/components/organisms/Header.d.ts +10 -0
- package/dist/components/organisms/ServiceList.d.ts +9 -0
- package/dist/components/organisms/Stepper.d.ts +10 -0
- package/dist/components/organisms/TimeSlotSelector.d.ts +10 -0
- package/dist/components/organisms/index.d.ts +10 -0
- package/dist/components/pages/BookingPage.d.ts +17 -0
- package/dist/components/pages/ConfirmationPage.d.ts +16 -0
- package/dist/components/pages/ErrorPage.d.ts +14 -0
- package/dist/components/pages/index.d.ts +3 -0
- package/dist/components/templates/BookingPageTemplate.d.ts +11 -0
- package/dist/components/templates/CenteredLayout.d.ts +9 -0
- package/dist/components/templates/MainLayout.d.ts +11 -0
- package/dist/components/templates/index.d.ts +3 -0
- package/dist/constants/api.d.ts +14 -0
- package/dist/constants/design.d.ts +56 -0
- package/dist/favicon.svg +21 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +1 -0
- package/dist/index.mjs +2053 -0
- package/dist/style.css +1 -0
- package/dist/tokens/borders.d.ts +14 -0
- package/dist/tokens/colors.d.ts +56 -0
- package/dist/tokens/elevation.d.ts +15 -0
- package/dist/tokens/index.d.ts +12 -0
- package/dist/tokens/motion.d.ts +38 -0
- package/dist/tokens/spacing.d.ts +28 -0
- package/dist/tokens/typography.d.ts +107 -0
- package/dist/types/api.d.ts +43 -0
- package/dist/types/booking.d.ts +50 -0
- package/dist/types/components.d.ts +242 -0
- package/dist/utils/api.d.ts +10 -0
- package/dist/utils/helpers.d.ts +3 -0
- package/dist/utils/validators.d.ts +6 -0
- package/package.json +55 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constantes de diseño ChronOwl.
|
|
3
|
+
*/
|
|
4
|
+
export declare const BOOKING_STEPS: readonly ["Servicio", "Fecha y hora", "Datos", "Confirmación"];
|
|
5
|
+
export declare const BREAKPOINTS: {
|
|
6
|
+
readonly xs: 320;
|
|
7
|
+
readonly sm: 480;
|
|
8
|
+
readonly md: 768;
|
|
9
|
+
readonly lg: 1024;
|
|
10
|
+
readonly xl: 1200;
|
|
11
|
+
};
|
|
12
|
+
export declare const WIDGET_MAX_WIDTH = 480;
|
|
13
|
+
export declare const TOUCH_TARGET_MIN = 44;
|
|
14
|
+
export declare const LOCALE: {
|
|
15
|
+
readonly es: {
|
|
16
|
+
readonly steps: readonly ["Servicio", "Fecha y hora", "Datos", "Confirmación"];
|
|
17
|
+
readonly selectService: "Selecciona un servicio";
|
|
18
|
+
readonly selectDate: "Selecciona una fecha";
|
|
19
|
+
readonly selectTime: "Selecciona un horario";
|
|
20
|
+
readonly yourData: "Tus datos";
|
|
21
|
+
readonly confirm: "Confirmar reserva";
|
|
22
|
+
readonly continue: "Continuar";
|
|
23
|
+
readonly back: "Volver";
|
|
24
|
+
readonly close: "Cerrar";
|
|
25
|
+
readonly newBooking: "Nueva reserva";
|
|
26
|
+
readonly loading: "Cargando...";
|
|
27
|
+
readonly noSlots: "No hay horarios disponibles";
|
|
28
|
+
readonly noServices: "No hay servicios disponibles";
|
|
29
|
+
readonly bookingConfirmed: "Reserva confirmada";
|
|
30
|
+
readonly bookingError: "Error al crear la reserva";
|
|
31
|
+
readonly required: "Este campo es requerido";
|
|
32
|
+
readonly invalidEmail: "Email no válido";
|
|
33
|
+
readonly poweredBy: "Powered by ChronOwl";
|
|
34
|
+
};
|
|
35
|
+
readonly en: {
|
|
36
|
+
readonly steps: readonly ["Service", "Date & Time", "Details", "Confirmation"];
|
|
37
|
+
readonly selectService: "Select a service";
|
|
38
|
+
readonly selectDate: "Select a date";
|
|
39
|
+
readonly selectTime: "Select a time slot";
|
|
40
|
+
readonly yourData: "Your details";
|
|
41
|
+
readonly confirm: "Confirm booking";
|
|
42
|
+
readonly continue: "Continue";
|
|
43
|
+
readonly back: "Back";
|
|
44
|
+
readonly close: "Close";
|
|
45
|
+
readonly newBooking: "New booking";
|
|
46
|
+
readonly loading: "Loading...";
|
|
47
|
+
readonly noSlots: "No available time slots";
|
|
48
|
+
readonly noServices: "No services available";
|
|
49
|
+
readonly bookingConfirmed: "Booking confirmed";
|
|
50
|
+
readonly bookingError: "Error creating booking";
|
|
51
|
+
readonly required: "This field is required";
|
|
52
|
+
readonly invalidEmail: "Invalid email";
|
|
53
|
+
readonly poweredBy: "Powered by ChronOwl";
|
|
54
|
+
};
|
|
55
|
+
};
|
|
56
|
+
export type SupportedLocale = keyof typeof LOCALE;
|
package/dist/favicon.svg
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" fill="none">
|
|
2
|
+
<!-- Cuerpo del buho -->
|
|
3
|
+
<circle cx="32" cy="34" r="22" fill="#2C3E50"/>
|
|
4
|
+
<!-- Orejas -->
|
|
5
|
+
<path d="M14 18 L20 28 L10 28Z" fill="#2C3E50"/>
|
|
6
|
+
<path d="M50 18 L54 28 L44 28Z" fill="#2C3E50"/>
|
|
7
|
+
<!-- Ojos - fondo -->
|
|
8
|
+
<circle cx="24" cy="32" r="8" fill="#E8F4F8"/>
|
|
9
|
+
<circle cx="40" cy="32" r="8" fill="#E8F4F8"/>
|
|
10
|
+
<!-- Ojos - pupila -->
|
|
11
|
+
<circle cx="24" cy="32" r="4" fill="#1A252F"/>
|
|
12
|
+
<circle cx="40" cy="32" r="4" fill="#1A252F"/>
|
|
13
|
+
<!-- Ojos - brillo -->
|
|
14
|
+
<circle cx="22" cy="30" r="1.5" fill="#FFFFFF"/>
|
|
15
|
+
<circle cx="38" cy="30" r="1.5" fill="#FFFFFF"/>
|
|
16
|
+
<!-- Pico -->
|
|
17
|
+
<path d="M29 40 L32 46 L35 40Z" fill="#F39C12"/>
|
|
18
|
+
<!-- Patas -->
|
|
19
|
+
<path d="M24 54 L22 58 M24 54 L24 58 M24 54 L26 58" stroke="#F39C12" stroke-width="1.5" stroke-linecap="round"/>
|
|
20
|
+
<path d="M40 54 L38 58 M40 54 L40 58 M40 54 L42 58" stroke="#F39C12" stroke-width="1.5" stroke-linecap="round"/>
|
|
21
|
+
</svg>
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { ChronOwlWidget, ChronOwlWidget as default } from './ChronOwlWidget';
|
|
2
|
+
export * from './components';
|
|
3
|
+
export * from './tokens';
|
|
4
|
+
export { useServices } from './components/hooks/useServices';
|
|
5
|
+
export { useAvailability } from './components/hooks/useAvailability';
|
|
6
|
+
export { useBooking } from './components/hooks/useBooking';
|
|
7
|
+
export { useForm } from './components/hooks/useForm';
|
|
8
|
+
export { chronowlApi, configureApi } from './utils/api';
|
|
9
|
+
export { formatDate, formatDateShort, dateToString } from './utils/validators';
|
|
10
|
+
export { cn, formatCurrency, formatDuration } from './utils/helpers';
|
|
11
|
+
export { BOOKING_STEPS, BREAKPOINTS, LOCALE } from './constants/design';
|
|
12
|
+
export { API_ENDPOINTS } from './constants/api';
|
|
13
|
+
export type { ApiResponse, ApiConfig, BookingResponse, CreateBookingParams } from './types/api';
|
|
14
|
+
export type { Service, TimeSlot, BookingData, BookingConfirmation, BookingStep, ChronOwlWidgetProps, Size, ButtonVariant, ButtonColor, BadgeVariant, TypographyVariant, TypographyAs, IconName, ButtonProps, InputProps, LabelProps, BadgeProps, CardProps, DividerProps, IconProps, SpinnerProps, TypographyProps, FormGroupProps, TimeSelectorProps, DateSelectorProps, ServiceCardProps, AvailabilitySlotProps, ConfirmationBadgeProps, EmptyStateProps, LoadingStateProps, InputWithIconProps, ButtonGroupProps, HeaderProps, StepperProps, ServiceListProps, CalendarProps, AvailabilityGridProps, BookingFormProps, ConfirmationModalProps, ErrorModalProps, TimeSlotSelectorProps, FooterProps, MainLayoutProps, CenteredLayoutProps, BookingPageTemplateProps, } from './types/components';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("react/jsx-runtime"),d=require("react"),ke={"display-lg":"text-display-lg","display-md":"text-display-md","display-sm":"text-display-sm","headline-lg":"text-headline-lg","headline-md":"text-headline-md","headline-sm":"text-headline-sm","title-lg":"text-title-lg","title-md":"text-title-md","title-sm":"text-title-sm","body-lg":"text-body-lg","body-md":"text-body-md","body-sm":"text-body-sm","label-lg":"text-label-lg","label-md":"text-label-md","label-sm":"text-label-sm"},Fe={"display-lg":"h1","display-md":"h1","display-sm":"h2","headline-lg":"h2","headline-md":"h3","headline-sm":"h4","title-lg":"h5","title-md":"h6","title-sm":"h6","body-lg":"p","body-md":"p","body-sm":"p","label-lg":"span","label-md":"span","label-sm":"small"},Ee={left:"text-left",center:"text-center",right:"text-right"};function c({variant:a="body-md",as:r,color:t,truncate:n=!1,align:s,children:i,className:l="",...o}){const u=r||Fe[a];return e.jsx(u,{className:["font-sans",ke[a],s?Ee[s]:"",n?"truncate":"",l].filter(Boolean).join(" "),style:t?{color:t}:void 0,...o,children:i})}const Le={sm:"h-8 px-3 text-label-md min-w-[44px]",md:"h-10 px-5 text-label-lg min-w-[44px]",lg:"h-12 px-6 text-label-lg min-w-[44px]"},Me={filled:{primary:"bg-primary text-primary-on hover:bg-tertiary active:bg-tertiary shadow-elevation-1 hover:shadow-elevation-2",secondary:"bg-secondary text-secondary-on hover:bg-secondary-container active:bg-secondary-container shadow-elevation-1",error:"bg-error text-error-on hover:bg-red-800 active:bg-red-900 shadow-elevation-1",success:"bg-success text-success-on hover:bg-green-700 active:bg-green-800 shadow-elevation-1",warning:"bg-warning text-warning-on hover:bg-yellow-600 active:bg-yellow-700 shadow-elevation-1"},tonal:{primary:"bg-primary-container text-primary-on-container hover:bg-secondary-container",secondary:"bg-secondary-container text-secondary-on-container hover:bg-secondary",error:"bg-error-container text-error-on-container hover:bg-red-200",success:"bg-success-container text-success-on-container hover:bg-green-200",warning:"bg-warning-container text-warning-on-container hover:bg-yellow-200"},outlined:{primary:"border border-primary text-primary hover:bg-primary-container",secondary:"border border-neutral-variant text-neutral hover:bg-surface-variant",error:"border border-error text-error hover:bg-error-container",success:"border border-success text-success hover:bg-success-container",warning:"border border-warning text-warning hover:bg-warning-container"},text:{primary:"text-primary hover:bg-primary-container",secondary:"text-neutral hover:bg-surface-variant",error:"text-error hover:bg-error-container",success:"text-success hover:bg-success-container",warning:"text-warning hover:bg-warning-container"}},y=d.forwardRef(({variant:a="filled",color:r="primary",size:t="md",fullWidth:n=!1,loading:s=!1,icon:i,iconPosition:l="start",disabled:o,children:u,className:h="",...b},m)=>{var L;const p=o||s,C="inline-flex items-center justify-center gap-2 font-sans font-bold rounded-full transition-all duration-medium-1 ease-standard focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary select-none cursor-pointer",N=p?"opacity-40 pointer-events-none cursor-not-allowed":"",v=n?"w-full":"",E=[C,Le[t],((L=Me[a])==null?void 0:L[r])??"",N,v,h].filter(Boolean).join(" ");return e.jsx("button",{ref:m,className:E,disabled:p,...b,children:s?e.jsxs("svg",{className:"animate-spin h-4 w-4",viewBox:"0 0 24 24",fill:"none","aria-hidden":"true",children:[e.jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),e.jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"})]}):e.jsxs(e.Fragment,{children:[i&&l==="start"&&e.jsx("span",{className:"inline-flex shrink-0",children:i}),u&&e.jsx("span",{children:u}),i&&l==="end"&&e.jsx("span",{className:"inline-flex shrink-0",children:i})]})})});y.displayName="Button";const Be={sm:16,md:20,lg:24},De={calendar:"M19 4h-1V2h-2v2H8V2H6v2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 16H5V10h14v10zm0-12H5V6h14v2z",clock:"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10 10-4.5 10-10S17.5 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm.5-13H11v6l5.2 3.2.8-1.3-4.5-2.7V7z",check:"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z",close:"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z","chevron-left":"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12l4.58-4.59z","chevron-right":"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6-6-6z","chevron-down":"M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6 1.41-1.41z",search:"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z",user:"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z",mail:"M20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z",phone:"M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1V20c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z",notes:"M14 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V8l-6-6zm2 16H8v-2h8v2zm0-4H8v-2h8v2zm-3-5V3.5L18.5 9H13z",alert:"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z",info:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z",star:"M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27z",location:"M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z",edit:"M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z",trash:"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z","arrow-left":"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z","arrow-right":"M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8-8-8z",spinner:"M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0 4.42 3.58 8 8 8v3l4-4-4-4v3z",owl:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-1-3h6l-1 3H10zm5-5c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-6 0c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm3-5c-2.76 0-5 1.12-5 2.5h10C17 8.12 14.76 7 12 7z"};function f({name:a,size:r="md",color:t,className:n="",...s}){const i=Be[r],l=De[a];return e.jsx("svg",{width:i,height:i,viewBox:"0 0 24 24",fill:t||"currentColor",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",className:n,...s,children:e.jsx("path",{d:l})})}function H({title:a="ChronOwl",subtitle:r,onBack:t,actions:n}){return e.jsxs("header",{className:"flex items-center gap-3 px-4 py-3 bg-surface border-b border-neutral-variant/30",children:[t&&e.jsx(y,{variant:"text",size:"sm",onClick:t,"aria-label":"Volver",className:"shrink-0 -ml-2",children:e.jsx(f,{name:"arrow-left",size:"md"})}),e.jsxs("div",{className:"flex items-center gap-2 flex-1 min-w-0",children:[e.jsx("div",{className:"w-8 h-8 rounded-full bg-primary flex items-center justify-center shrink-0",children:e.jsx(f,{name:"owl",size:"sm",color:"#FFFFFF"})}),e.jsxs("div",{className:"min-w-0",children:[e.jsx(c,{variant:"title-md",as:"h1",truncate:!0,className:"text-surface-on",children:a}),r&&e.jsx(c,{variant:"body-sm",as:"p",truncate:!0,className:"text-surface-on-variant",children:r})]})]}),n&&e.jsx("div",{className:"flex items-center gap-1 shrink-0",children:n})]})}function X({steps:a,currentStep:r,onStepClick:t}){return e.jsx("nav",{"aria-label":"Progreso de reserva",className:"px-4 py-3",children:e.jsx("ol",{className:"flex items-center w-full",children:a.map((n,s)=>{const i=s<r,l=s===r,o=t&&i;return e.jsxs("li",{className:["flex items-center",s<a.length-1?"flex-1":""].join(" "),children:[e.jsxs("button",{type:"button",disabled:!o,onClick:()=>o&&t(s),"aria-current":l?"step":void 0,className:["flex items-center gap-2 group",o?"cursor-pointer":"cursor-default","focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary rounded"].join(" "),children:[e.jsx("span",{className:["flex items-center justify-center w-7 h-7 rounded-full text-label-sm font-bold shrink-0","transition-all duration-medium-1 ease-standard",i?"bg-primary text-primary-on":l?"bg-primary text-primary-on ring-2 ring-primary/30 ring-offset-2":"bg-surface-variant text-surface-on-variant"].join(" "),children:i?"✓":s+1}),e.jsx(c,{variant:"label-md",as:"span",className:["hidden sm:inline",l?"text-primary font-bold":i?"text-surface-on":"text-surface-on-variant"].join(" "),children:n})]}),s<a.length-1&&e.jsx("div",{className:["flex-1 h-0.5 mx-2","transition-colors duration-medium-1 ease-standard",i?"bg-primary":"bg-neutral-variant/40"].join(" ")})]},n)})})})}function W({companyName:a,poweredBy:r=!0}){return e.jsx("footer",{className:"px-4 py-3 border-t border-neutral-variant/30 bg-surface",children:e.jsxs("div",{className:"flex items-center justify-between",children:[a&&e.jsxs(c,{variant:"body-sm",className:"text-surface-on-variant",children:["© ",a]}),r&&e.jsxs("div",{className:"flex items-center gap-1 ml-auto",children:[e.jsx(f,{name:"owl",size:"sm",color:"#7F8C8D"}),e.jsx(c,{variant:"label-sm",className:"text-surface-on-variant",children:"Powered by ChronOwl"})]})]})})}function Z({steps:a,currentStep:r,onStepClick:t,onBack:n,title:s="ChronOwl",children:i,footer:l}){return e.jsxs("div",{className:"chronowl-widget flex flex-col w-full max-w-[480px] mx-auto min-h-[400px] max-h-[90vh] bg-surface rounded-xl shadow-elevation-3 overflow-hidden font-sans",children:[e.jsxs("div",{className:"shrink-0",children:[e.jsx(H,{title:s,subtitle:"Reserva tu cita",onBack:r>0?n:void 0}),e.jsx(X,{steps:a,currentStep:r,onStepClick:t})]}),e.jsx("main",{className:"flex-1 overflow-y-auto px-4 py-4",children:i}),e.jsx("div",{className:"shrink-0",children:l||e.jsx(W,{poweredBy:!0})})]})}const Te={0:"shadow-elevation-0",1:"shadow-elevation-1",2:"shadow-elevation-2",3:"shadow-elevation-3",4:"shadow-elevation-4",5:"shadow-elevation-5"},$e={sm:"p-3",md:"p-4",lg:"p-6"};function ee({elevation:a=1,outlined:r=!1,padding:t="md",children:n,className:s="",...i}){return e.jsx("div",{className:["bg-surface rounded-md font-sans","transition-shadow duration-medium-1 ease-standard",r?"border border-neutral-variant":Te[a],$e[t],s].filter(Boolean).join(" "),...i,children:n})}function ae({service:a,selected:r=!1,onSelect:t}){return e.jsx("button",{type:"button",onClick:()=>t(a),"aria-pressed":r,className:"w-full text-left focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary rounded-md",children:e.jsx(ee,{elevation:r?2:1,className:["transition-all duration-medium-1 ease-standard cursor-pointer","hover:shadow-elevation-2",r?"ring-2 ring-primary bg-primary-container":"hover:bg-surface-variant"].join(" "),children:e.jsxs("div",{className:"flex items-start justify-between gap-3",children:[e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx(c,{variant:"title-sm",className:r?"text-primary-on-container":"text-surface-on",children:a.name}),e.jsx(c,{variant:"body-sm",className:["mt-1",r?"text-primary-on-container/70":"text-surface-on-variant"].join(" "),truncate:!0,children:a.description}),e.jsxs("div",{className:"flex items-center gap-3 mt-2",children:[e.jsxs("span",{className:"inline-flex items-center gap-1 text-body-sm text-surface-on-variant",children:[e.jsx(f,{name:"clock",size:"sm"}),a.duration," min"]}),a.category&&e.jsx("span",{className:"text-body-sm text-surface-on-variant",children:a.category})]})]}),e.jsxs("div",{className:"text-right shrink-0",children:[e.jsxs(c,{variant:"title-md",className:"text-primary",children:[a.currency,a.price]}),r&&e.jsx("span",{className:"inline-flex mt-1",children:e.jsx(f,{name:"check",size:"sm",color:"#2C3E50"})})]})]})})})}const Ie={sm:"h-4 w-4 border-2",md:"h-6 w-6 border-2",lg:"h-10 w-10 border-3"};function Y({size:a="md",color:r,className:t="",...n}){return e.jsx("div",{role:"progressbar","aria-label":"Cargando",className:["inline-block rounded-full border-solid border-current border-r-transparent animate-spin",Ie[a],t].filter(Boolean).join(" "),style:r?{borderColor:r,borderRightColor:"transparent"}:void 0,...n})}function O({message:a="Cargando...",size:r="md"}){return e.jsxs("div",{className:"flex flex-col items-center justify-center py-12 gap-4",children:[e.jsx(Y,{size:r}),e.jsx(c,{variant:"body-md",className:"text-surface-on-variant",children:a})]})}function U({icon:a="calendar",title:r,description:t,action:n}){return e.jsxs("div",{className:"flex flex-col items-center justify-center py-12 px-4 text-center",children:[e.jsx("div",{className:"w-16 h-16 rounded-full bg-surface-variant flex items-center justify-center mb-4",children:e.jsx(f,{name:a,size:"lg",color:"#7F8C8D"})}),e.jsx(c,{variant:"title-md",className:"text-surface-on mb-2",children:r}),t&&e.jsx(c,{variant:"body-md",className:"text-surface-on-variant mb-6 max-w-xs",children:t}),n&&e.jsx(y,{variant:"tonal",onClick:n.onClick,children:n.label})]})}function re({services:a,selectedServiceId:r,onSelectService:t,loading:n=!1}){return n?e.jsx(O,{message:"Cargando servicios..."}):a.length===0?e.jsx(U,{icon:"info",title:"Sin servicios disponibles",description:"No hay servicios configurados en este momento."}):e.jsxs("div",{className:"w-full",children:[e.jsx(c,{variant:"title-sm",className:"mb-3 px-1 text-surface-on",children:"Selecciona un servicio"}),e.jsx("div",{className:"flex flex-col gap-3",children:a.map(s=>e.jsx(ae,{service:s,selected:s.id===r,onSelect:t},s.id))})]})}const Ae=["Lu","Ma","Mi","Ju","Vi","Sa","Do"],K=["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"];function J(a){return`${a.getFullYear()}-${String(a.getMonth()+1).padStart(2,"0")}-${String(a.getDate()).padStart(2,"0")}`}function Q(a,r){return a.getFullYear()===r.getFullYear()&&a.getMonth()===r.getMonth()&&a.getDate()===r.getDate()}function te({selectedDate:a,onSelectDate:r,minDate:t,maxDate:n,disabledDates:s=[],availableDates:i=[]}){const l=new Date,[o,u]=d.useState((a==null?void 0:a.getMonth())??l.getMonth()),[h,b]=d.useState((a==null?void 0:a.getFullYear())??l.getFullYear()),m=d.useMemo(()=>new Set(s),[s]),p=d.useMemo(()=>new Set(i),[i]),C=new Date(h,o+1,0).getDate(),N=(new Date(h,o,1).getDay()+6)%7,v=()=>{o===0?(u(11),b(h-1)):u(o-1)},E=()=>{o===11?(u(0),b(h+1)):u(o+1)},L=x=>{const S=new Date(h,o,x),k=J(S);if(m.has(k)||t&&S<new Date(t.getFullYear(),t.getMonth(),t.getDate())||n&&S>n)return!0;const F=new Date(l.getFullYear(),l.getMonth(),l.getDate());return S<F},g=x=>{if(p.size===0)return!0;const S=J(new Date(h,o,x));return p.has(S)},j=[];for(let x=0;x<N;x++)j.push(null);for(let x=1;x<=C;x++)j.push(x);return e.jsxs("div",{className:"w-full max-w-[320px] mx-auto",children:[e.jsxs("div",{className:"flex items-center justify-between mb-3",children:[e.jsx(y,{variant:"text",size:"sm",onClick:v,"aria-label":"Mes anterior",children:e.jsx(f,{name:"chevron-left",size:"md"})}),e.jsxs(c,{variant:"title-sm",className:"text-surface-on",children:[K[o]," ",h]}),e.jsx(y,{variant:"text",size:"sm",onClick:E,"aria-label":"Mes siguiente",children:e.jsx(f,{name:"chevron-right",size:"md"})})]}),e.jsx("div",{className:"grid grid-cols-7 gap-0.5 mb-1",children:Ae.map(x=>e.jsx("div",{className:"text-center text-label-sm text-surface-on-variant py-1",children:x},x))}),e.jsx("div",{className:"grid grid-cols-7 gap-0.5",children:j.map((x,S)=>{if(x===null)return e.jsx("div",{},`empty-${S}`);const k=new Date(h,o,x),F=L(x),M=g(x)&&!F,D=a?Q(k,a):!1,R=Q(k,l);return e.jsx("button",{type:"button",disabled:F,onClick:()=>M&&r(k),"aria-pressed":D,"aria-label":`${x} de ${K[o]}${F?", no disponible":""}`,className:["aspect-square flex items-center justify-center rounded-full","text-body-sm font-sans min-h-[36px] min-w-[36px]","transition-all duration-short-2 ease-standard","focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-primary",D?"bg-primary text-primary-on font-bold":R&&!F?"border border-primary text-primary font-bold":M?"text-surface-on hover:bg-primary-container cursor-pointer":"text-surface-on-variant opacity-30 cursor-not-allowed"].join(" "),children:x},x)})})]})}function ne({selectedDate:a,onSelectDate:r,minDate:t,maxDate:n,disabledDates:s,availableDates:i}){return e.jsxs("div",{className:"w-full",children:[e.jsx(c,{variant:"title-sm",className:"mb-3 px-1 text-surface-on",children:"Selecciona una fecha"}),e.jsx("div",{className:"bg-surface rounded-md shadow-elevation-1 p-4",children:e.jsx(te,{selectedDate:a,onSelectDate:r,minDate:t,maxDate:n,disabledDates:s,availableDates:i})}),a&&e.jsxs(c,{variant:"body-sm",className:"mt-2 px-1 text-surface-on-variant text-center",children:["Fecha seleccionada:"," ",e.jsx("span",{className:"font-bold text-primary",children:a.toLocaleDateString("es-ES",{weekday:"long",day:"numeric",month:"long"})})]})]})}function se({slots:a,selectedSlotId:r,onSelectSlot:t,columns:n=4}){const s=a.filter(o=>parseInt(o.startTime.split(":")[0],10)<12),i=a.filter(o=>parseInt(o.startTime.split(":")[0],10)>=12),l=o=>e.jsx("div",{className:"grid gap-2",style:{gridTemplateColumns:`repeat(${n}, 1fr)`},children:o.map(u=>{const h=u.id===r;return e.jsx("button",{type:"button",disabled:!u.available,onClick:()=>u.available&&t(u),"aria-pressed":h,className:["py-2 px-2 rounded-sm text-label-lg font-sans text-center","transition-all duration-short-2 ease-standard","min-h-[44px] min-w-[44px]","focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary",h?"bg-primary text-primary-on shadow-elevation-1":u.available?"bg-surface border border-neutral-variant/40 text-surface-on hover:bg-primary-container hover:border-primary/30":"bg-surface-variant text-surface-on-variant opacity-30 cursor-not-allowed"].join(" "),children:u.startTime},u.id)})});return e.jsxs("div",{className:"w-full space-y-4",children:[s.length>0&&e.jsxs("div",{children:[e.jsx(c,{variant:"label-md",className:"mb-2 text-surface-on-variant",children:"Mañana"}),l(s)]}),i.length>0&&e.jsxs("div",{children:[e.jsx(c,{variant:"label-md",className:"mb-2 text-surface-on-variant",children:"Tarde"}),l(i)]})]})}const B=d.forwardRef(({label:a,error:r,helperText:t,leadingIcon:n,trailingIcon:s,fullWidth:i=!0,className:l="",id:o,...u},h)=>{const b=d.useId(),m=o??b,p=!!r,C=["relative",i?"w-full":"inline-flex"].join(" "),N=["peer w-full h-12 px-4 rounded-xs bg-surface border font-sans text-body-lg","text-surface-on placeholder-transparent","transition-all duration-medium-1 ease-standard","focus:outline-none focus:ring-2",n?"pl-11":"",s?"pr-11":"",p?"border-error focus:ring-error focus:border-error":"border-neutral-variant focus:ring-primary focus:border-primary","disabled:opacity-40 disabled:cursor-not-allowed",l].filter(Boolean).join(" "),v=["absolute left-4 top-1/2 -translate-y-1/2 text-body-lg font-sans pointer-events-none","transition-all duration-medium-1 ease-standard origin-left","peer-focus:top-0 peer-focus:text-label-sm peer-focus:bg-surface peer-focus:px-1 peer-focus:-translate-y-1/2 peer-focus:scale-90","peer-[:not(:placeholder-shown)]:top-0 peer-[:not(:placeholder-shown)]:text-label-sm peer-[:not(:placeholder-shown)]:bg-surface peer-[:not(:placeholder-shown)]:px-1 peer-[:not(:placeholder-shown)]:-translate-y-1/2 peer-[:not(:placeholder-shown)]:scale-90",n?"left-11":"",p?"text-error peer-focus:text-error":"text-surface-on-variant peer-focus:text-primary"].filter(Boolean).join(" ");return e.jsxs("div",{className:C,children:[e.jsxs("div",{className:"relative",children:[n&&e.jsx("span",{className:"absolute left-3 top-1/2 -translate-y-1/2 text-surface-on-variant",children:n}),e.jsx("input",{ref:h,id:m,className:N,placeholder:a||" ","aria-invalid":p,"aria-describedby":r?`${m}-error`:t?`${m}-helper`:void 0,...u}),a&&e.jsx("label",{htmlFor:m,className:v,children:a}),s&&e.jsx("span",{className:"absolute right-3 top-1/2 -translate-y-1/2 text-surface-on-variant",children:s})]}),(r||t)&&e.jsx("p",{id:r?`${m}-error`:`${m}-helper`,className:["mt-1 px-4 text-body-sm",p?"text-error":"text-surface-on-variant"].join(" "),children:r||t})]})});B.displayName="Input";function Pe(a){return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(a)}function He(a){return/^[\d\s\-+()]{7,20}$/.test(a)}function We(a,r="es-ES"){return a.toLocaleDateString(r,{weekday:"long",day:"numeric",month:"long",year:"numeric"})}function Oe(a,r="es-ES"){return a.toLocaleDateString(r,{weekday:"short",day:"numeric",month:"short"})}function ie(a){return`${a.getFullYear()}-${String(a.getMonth()+1).padStart(2,"0")}-${String(a.getDate()).padStart(2,"0")}`}function le({onSubmit:a,loading:r=!1,initialValues:t}){const[n,s]=d.useState((t==null?void 0:t.clientName)??""),[i,l]=d.useState((t==null?void 0:t.clientEmail)??""),[o,u]=d.useState((t==null?void 0:t.clientPhone)??""),[h,b]=d.useState((t==null?void 0:t.notes)??""),[m,p]=d.useState({}),C=()=>{const v={};return n.trim()||(v.clientName="El nombre es requerido"),i.trim()?Pe(i)||(v.clientEmail="Email no válido"):v.clientEmail="El email es requerido",o.trim()?He(o)||(v.clientPhone="Teléfono no válido"):v.clientPhone="El teléfono es requerido",p(v),Object.keys(v).length===0},N=v=>{v.preventDefault(),C()&&a({clientName:n.trim(),clientEmail:i.trim(),clientPhone:o.trim(),notes:h.trim()||void 0})};return e.jsxs("form",{onSubmit:N,noValidate:!0,className:"w-full",children:[e.jsx(c,{variant:"title-sm",className:"mb-4 text-surface-on",children:"Tus datos"}),e.jsxs("div",{className:"space-y-4",children:[e.jsx(B,{label:"Nombre completo",type:"text",value:n,onChange:v=>s(v.target.value),error:m.clientName,leadingIcon:e.jsx(f,{name:"user",size:"sm"}),autoComplete:"name",maxLength:100,required:!0}),e.jsx(B,{label:"Email",type:"email",value:i,onChange:v=>l(v.target.value),error:m.clientEmail,leadingIcon:e.jsx(f,{name:"mail",size:"sm"}),autoComplete:"email",maxLength:254,required:!0}),e.jsx(B,{label:"Teléfono",type:"tel",value:o,onChange:v=>u(v.target.value),error:m.clientPhone,leadingIcon:e.jsx(f,{name:"phone",size:"sm"}),autoComplete:"tel",maxLength:20,required:!0}),e.jsx(B,{label:"Notas (opcional)",type:"text",value:h,onChange:v=>b(v.target.value),leadingIcon:e.jsx(f,{name:"notes",size:"sm"}),maxLength:500})]}),e.jsx(y,{type:"submit",variant:"filled",color:"primary",size:"lg",fullWidth:!0,loading:r,className:"mt-6",children:"Confirmar reserva"})]})}function T({orientation:a="horizontal",inset:r=!1,className:t="",...n}){const s=a==="horizontal";return e.jsx("hr",{role:"separator","aria-orientation":a,className:["border-0 bg-neutral-variant",s?"h-px w-full":"w-px h-full",r&&s?"mx-4":"",r&&!s?"my-4":"",t].filter(Boolean).join(" "),...n})}const Re={confirmed:"bg-success-container text-success-on-container",pending:"bg-warning-container text-warning-on-container",cancelled:"bg-error-container text-error-on-container",completed:"bg-primary-container text-primary-on-container",info:"bg-secondary-container text-secondary-on-container"},qe={sm:"text-label-sm px-2 py-0.5",md:"text-label-md px-3 py-1",lg:"text-label-lg px-4 py-1.5"};function oe({variant:a,size:r="md",icon:t,children:n,className:s="",...i}){return e.jsxs("span",{className:["inline-flex items-center gap-1.5 font-sans font-bold rounded-full whitespace-nowrap",Re[a],qe[r],s].filter(Boolean).join(" "),...i,children:[t&&e.jsx("span",{className:"inline-flex shrink-0",children:t}),n]})}const Ye={confirmed:"check",pending:"clock",cancelled:"close",completed:"check",info:"info"};function V({status:a,label:r}){return e.jsx(oe,{variant:a,icon:e.jsx(f,{name:Ye[a],size:"sm"}),children:r})}function ce({open:a,onClose:r,confirmation:t,onNewBooking:n}){const s=d.useRef(null);return d.useEffect(()=>{const i=s.current;i&&(a?i.showModal():i.close())},[a]),d.useEffect(()=>{const i=s.current;if(!i)return;const l=()=>r();return i.addEventListener("close",l),()=>i.removeEventListener("close",l)},[r]),t?e.jsx("dialog",{ref:s,className:["w-[90vw] max-w-md rounded-xl bg-surface shadow-elevation-5 p-0","backdrop:bg-scrim/40 backdrop:backdrop-blur-sm","animate-in fade-in slide-in-from-bottom-4"].join(" "),"aria-labelledby":"confirmation-title",children:e.jsxs("div",{className:"p-6",children:[e.jsx("div",{className:"flex justify-center mb-4",children:e.jsx("div",{className:"w-16 h-16 rounded-full bg-success-container flex items-center justify-center",children:e.jsx(f,{name:"check",size:"lg",color:"#27AE60"})})}),e.jsx(c,{variant:"headline-sm",as:"h2",align:"center",id:"confirmation-title",className:"text-surface-on mb-1",children:"¡Reserva confirmada!"}),e.jsx(c,{variant:"body-md",align:"center",className:"text-surface-on-variant mb-4",children:"Tu cita ha sido agendada exitosamente."}),e.jsx("div",{className:"flex justify-center mb-4",children:e.jsx(V,{status:t.status,label:"Confirmada"})}),e.jsx(T,{className:"my-4"}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(f,{name:"star",size:"sm",color:"#7F8C8D"}),e.jsxs("div",{children:[e.jsx(c,{variant:"label-md",className:"text-surface-on-variant",children:"Servicio"}),e.jsx(c,{variant:"body-md",className:"text-surface-on",children:t.service.name})]})]}),e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(f,{name:"calendar",size:"sm",color:"#7F8C8D"}),e.jsxs("div",{children:[e.jsx(c,{variant:"label-md",className:"text-surface-on-variant",children:"Fecha"}),e.jsx(c,{variant:"body-md",className:"text-surface-on",children:new Date(t.date).toLocaleDateString("es-ES",{weekday:"long",day:"numeric",month:"long",year:"numeric"})})]})]}),e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(f,{name:"clock",size:"sm",color:"#7F8C8D"}),e.jsxs("div",{children:[e.jsx(c,{variant:"label-md",className:"text-surface-on-variant",children:"Hora"}),e.jsxs(c,{variant:"body-md",className:"text-surface-on",children:[t.timeSlot.startTime," - ",t.timeSlot.endTime]})]})]}),e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(f,{name:"user",size:"sm",color:"#7F8C8D"}),e.jsxs("div",{children:[e.jsx(c,{variant:"label-md",className:"text-surface-on-variant",children:"Cliente"}),e.jsx(c,{variant:"body-md",className:"text-surface-on",children:t.clientName}),e.jsx(c,{variant:"body-sm",className:"text-surface-on-variant",children:t.clientEmail})]})]})]}),e.jsx(T,{className:"my-4"}),e.jsxs(c,{variant:"body-sm",align:"center",className:"text-surface-on-variant mb-4",children:["ID de reserva: ",e.jsx("span",{className:"font-bold",children:t.id})]}),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx(y,{variant:"filled",fullWidth:!0,onClick:r,children:"Cerrar"}),n&&e.jsx(y,{variant:"tonal",fullWidth:!0,onClick:n,children:"Nueva reserva"})]})]})}):null}function de({open:a,onClose:r,title:t="Ha ocurrido un error",message:n,onRetry:s}){const i=d.useRef(null);return d.useEffect(()=>{const l=i.current;l&&(a?l.showModal():l.close())},[a]),d.useEffect(()=>{const l=i.current;if(!l)return;const o=()=>r();return l.addEventListener("close",o),()=>l.removeEventListener("close",o)},[r]),e.jsx("dialog",{ref:i,className:["w-[90vw] max-w-sm rounded-xl bg-surface shadow-elevation-5 p-0","backdrop:bg-scrim/40 backdrop:backdrop-blur-sm"].join(" "),"aria-labelledby":"error-title",children:e.jsxs("div",{className:"p-6",children:[e.jsx("div",{className:"flex justify-center mb-4",children:e.jsx("div",{className:"w-14 h-14 rounded-full bg-error-container flex items-center justify-center",children:e.jsx(f,{name:"alert",size:"lg",color:"#C0392B"})})}),e.jsx(c,{variant:"title-lg",as:"h2",align:"center",id:"error-title",className:"text-surface-on mb-2",children:t}),e.jsx(c,{variant:"body-md",align:"center",className:"text-surface-on-variant mb-6",children:n}),e.jsxs("div",{className:"flex flex-col gap-2",children:[s&&e.jsx(y,{variant:"filled",fullWidth:!0,onClick:s,children:"Reintentar"}),e.jsx(y,{variant:s?"tonal":"filled",fullWidth:!0,onClick:r,children:"Cerrar"})]})]})})}const Ue=["Servicio","Fecha y hora","Datos","Confirmación"],Ve={service:0,datetime:1,form:2,confirmation:3};function me({services:a,onFetchSlots:r,onSubmitBooking:t,companyName:n="ChronOwl",title:s=n}){const[i,l]=d.useState("service"),[o,u]=d.useState(null),[h,b]=d.useState(),[m,p]=d.useState(null),[C,N]=d.useState([]),[v,E]=d.useState(!1),[L,g]=d.useState(!1),[j,x]=d.useState(null),[S,k]=d.useState(!1),[F,M]=d.useState(null),D=Ve[i],R=d.useCallback(()=>{i==="datetime"?(l("service"),b(void 0),p(null),N([])):i==="form"&&l("datetime")},[i]),ge=d.useCallback(w=>{const $=["service","datetime","form","confirmation"];w<D&&l($[w])},[D]),be=d.useCallback(w=>{u(w)},[]),ye=d.useCallback(()=>{o&&(l("datetime"),b(void 0),p(null),N([]))},[o]),je=d.useCallback(async w=>{if(b(w),p(null),!o)return;const $=`${w.getFullYear()}-${String(w.getMonth()+1).padStart(2,"0")}-${String(w.getDate()).padStart(2,"0")}`;E(!0);try{const q=await r(o.id,$);N(q)}catch{M("No se pudieron cargar los horarios. Intenta de nuevo."),N([])}finally{E(!1)}},[o,r]),Ne=d.useCallback(w=>{p(w)},[]),Se=d.useCallback(()=>{h&&m&&l("form")},[h,m]),we=d.useCallback(async w=>{if(!o||!h||!m)return;const $=`${h.getFullYear()}-${String(h.getMonth()+1).padStart(2,"0")}-${String(h.getDate()).padStart(2,"0")}`,q={serviceId:o.id,date:$,timeSlotId:m.id,...w};g(!0);try{const ze=await t(q);x(ze),k(!0),l("confirmation")}catch{M("No se pudo completar la reserva. Por favor, intenta de nuevo.")}finally{g(!1)}},[o,h,m,t]),G=d.useCallback(()=>{l("service"),u(null),b(void 0),p(null),N([]),x(null),k(!1)},[]),Ce=()=>{switch(i){case"service":return e.jsxs("div",{children:[e.jsx(re,{services:a,selectedServiceId:o==null?void 0:o.id,onSelectService:be}),o&&e.jsx("div",{className:"mt-6",children:e.jsx(y,{variant:"filled",fullWidth:!0,size:"lg",onClick:ye,icon:e.jsx(f,{name:"arrow-right",size:"sm"}),iconPosition:"end",children:"Continuar"})})]});case"datetime":return e.jsxs("div",{className:"space-y-6",children:[o&&e.jsxs("div",{className:"bg-primary-container rounded-sm px-4 py-3",children:[e.jsx(c,{variant:"label-md",className:"text-primary-on-container/70",children:"Servicio seleccionado"}),e.jsxs(c,{variant:"title-sm",className:"text-primary-on-container",children:[o.name," — ",o.currency,o.price]})]}),e.jsx(ne,{selectedDate:h,onSelectDate:je}),h&&e.jsxs(e.Fragment,{children:[e.jsx(T,{}),v?e.jsx(O,{message:"Buscando horarios...",size:"sm"}):e.jsx(se,{slots:C,selectedSlotId:m==null?void 0:m.id,onSelectSlot:Ne,columns:4})]}),m&&e.jsx("div",{className:"mt-4",children:e.jsx(y,{variant:"filled",fullWidth:!0,size:"lg",onClick:Se,icon:e.jsx(f,{name:"arrow-right",size:"sm"}),iconPosition:"end",children:"Continuar"})})]});case"form":return e.jsxs("div",{className:"space-y-4",children:[o&&h&&m&&e.jsxs("div",{className:"bg-primary-container rounded-sm px-4 py-3 space-y-1",children:[e.jsx(c,{variant:"label-md",className:"text-primary-on-container/70",children:"Resumen de tu reserva"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(f,{name:"star",size:"sm",color:"#2C3E50"}),e.jsx(c,{variant:"body-sm",className:"text-primary-on-container",children:o.name})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(f,{name:"calendar",size:"sm",color:"#2C3E50"}),e.jsx(c,{variant:"body-sm",className:"text-primary-on-container",children:h.toLocaleDateString("es-ES",{weekday:"short",day:"numeric",month:"short"})})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(f,{name:"clock",size:"sm",color:"#2C3E50"}),e.jsxs(c,{variant:"body-sm",className:"text-primary-on-container",children:[m.startTime," - ",m.endTime]})]})]}),e.jsx(T,{}),e.jsx(le,{onSubmit:we,loading:L})]});case"confirmation":return e.jsxs("div",{className:"flex flex-col items-center justify-center py-8",children:[e.jsx("div",{className:"w-16 h-16 rounded-full bg-success-container flex items-center justify-center mb-4",children:e.jsx(f,{name:"check",size:"lg",color:"#27AE60"})}),e.jsx(c,{variant:"headline-sm",align:"center",className:"text-surface-on mb-2",children:"¡Reserva confirmada!"}),e.jsx(c,{variant:"body-md",align:"center",className:"text-surface-on-variant mb-6",children:"Revisa tu email para los detalles."}),e.jsx(y,{variant:"tonal",onClick:G,children:"Nueva reserva"})]})}};return e.jsxs(e.Fragment,{children:[e.jsx(Z,{steps:Ue,currentStep:D,onStepClick:ge,onBack:R,title:s,footer:void 0,children:Ce()}),e.jsx(ce,{open:S,onClose:()=>k(!1),confirmation:j,onNewBooking:G}),e.jsx(de,{open:!!F,onClose:()=>M(null),message:F??"",onRetry:()=>M(null)})]})}function ue({services:a,onFetchSlots:r,onSubmitBooking:t,theme:n="light",companyName:s,className:i=""}){return e.jsx("div",{className:["chronowl-root w-full max-w-[480px]",n==="dark"?"chronowl-dark":"chronowl-light",i].filter(Boolean).join(" "),style:{width:"100%",maxWidth:480},"data-theme":n,children:e.jsx(me,{services:a,onFetchSlots:r,onSubmitBooking:t,companyName:s})})}function xe({htmlFor:a,required:r,children:t,className:n="",...s}){return e.jsxs("label",{htmlFor:a,className:["block text-label-lg text-surface-on font-sans mb-1",n].filter(Boolean).join(" "),...s,children:[t,r&&e.jsx("span",{className:"text-error ml-0.5","aria-label":"requerido",children:"*"})]})}function _e({label:a,htmlFor:r,error:t,helperText:n,required:s,children:i}){return e.jsxs("div",{className:"mb-4 w-full",children:[e.jsx(xe,{htmlFor:r,required:s,children:a}),i,t&&e.jsx(c,{variant:"body-sm",className:"mt-1 px-1 text-error",children:t}),!t&&n&&e.jsx(c,{variant:"body-sm",className:"mt-1 px-1 text-surface-on-variant",children:n})]})}function Ge({slots:a,selectedSlotId:r,onSelectSlot:t,loading:n=!1}){return n?e.jsxs("div",{className:"flex items-center justify-center py-8",children:[e.jsx(Y,{size:"md"}),e.jsx(c,{variant:"body-md",className:"ml-3 text-surface-on-variant",children:"Cargando horarios..."})]}):a.length===0?e.jsx(c,{variant:"body-md",className:"text-center py-8 text-surface-on-variant",children:"No hay horarios disponibles para esta fecha."}):e.jsxs("div",{className:"w-full",children:[e.jsx(c,{variant:"title-sm",className:"mb-3 text-surface-on",children:"Selecciona un horario"}),e.jsx("div",{className:"grid grid-cols-3 sm:grid-cols-4 gap-2",children:a.map(s=>{const i=s.id===r,l=s.available;return e.jsx("button",{type:"button",disabled:!l,onClick:()=>l&&t(s),"aria-pressed":i,"aria-label":`${s.startTime} - ${s.endTime}${l?"":", no disponible"}`,className:["py-2.5 px-3 rounded-sm text-label-lg font-sans text-center","transition-all duration-medium-1 ease-standard","min-h-[44px] min-w-[44px]","focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary",i?"bg-primary text-primary-on shadow-elevation-1":l?"bg-surface-variant text-surface-on hover:bg-primary-container hover:text-primary-on-container":"bg-surface-variant text-surface-on-variant opacity-40 cursor-not-allowed"].join(" "),children:s.startTime},s.id)})})]})}function he({slot:a,selected:r=!1,onSelect:t}){return e.jsxs("button",{type:"button",disabled:!a.available,onClick:()=>a.available&&t(a),"aria-pressed":r,"aria-label":`${a.startTime} a ${a.endTime}${a.available?"":", no disponible"}`,className:["flex flex-col items-center justify-center py-3 px-4 rounded-sm","min-h-[56px] min-w-[44px]","transition-all duration-medium-1 ease-standard","focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary",r?"bg-primary text-primary-on shadow-elevation-1":a.available?"bg-surface-variant text-surface-on hover:bg-primary-container hover:text-primary-on-container border border-transparent hover:border-primary/20":"bg-surface-variant text-surface-on-variant opacity-40 cursor-not-allowed line-through"].join(" "),children:[e.jsx(c,{variant:"label-lg",as:"span",className:"inherit",children:a.startTime}),e.jsx(c,{variant:"body-sm",as:"span",className:"opacity-70",children:a.endTime})]})}const fe=d.forwardRef(({icon:a,iconPosition:r="start",...t},n)=>e.jsx(B,{ref:n,leadingIcon:r==="start"?a:void 0,trailingIcon:r==="end"?a:void 0,...t}));fe.displayName="InputWithIcon";function Ke({children:a,orientation:r="horizontal",fullWidth:t=!1}){return e.jsx("div",{className:["flex gap-3",r==="vertical"?"flex-col":"flex-row items-center",t?"w-full [&>*]:flex-1":""].filter(Boolean).join(" "),role:"group",children:a})}function Je({slots:a,selectedSlotId:r,onSelectSlot:t,loading:n=!1}){if(n)return e.jsx(O,{message:"Buscando horarios disponibles..."});const s=a.filter(i=>i.available);return a.length===0||s.length===0?e.jsx(U,{icon:"clock",title:"Sin horarios disponibles",description:"No hay horarios disponibles para la fecha seleccionada. Intenta con otra fecha."}):e.jsxs("div",{className:"w-full",children:[e.jsxs("div",{className:"flex items-center justify-between mb-3 px-1",children:[e.jsx(c,{variant:"title-sm",className:"text-surface-on",children:"Horarios disponibles"}),e.jsxs(c,{variant:"label-sm",className:"text-surface-on-variant",children:[s.length," disponible",s.length!==1?"s":""]})]}),e.jsx("div",{className:"grid grid-cols-3 sm:grid-cols-4 md:grid-cols-5 gap-2",children:a.map(i=>e.jsx(he,{slot:i,selected:i.id===r,onSelect:t},i.id))})]})}function _({header:a,footer:r,children:t}){return e.jsxs("div",{className:"chronowl-widget flex flex-col w-full max-w-[480px] mx-auto min-h-[400px] max-h-[90vh] bg-surface rounded-xl shadow-elevation-3 overflow-hidden font-sans",children:[a&&e.jsx("div",{className:"shrink-0",children:a}),e.jsx("main",{className:"flex-1 overflow-y-auto px-4 py-4",children:t}),r&&e.jsx("div",{className:"shrink-0",children:r})]})}function Qe({children:a,maxWidth:r="480px"}){return e.jsx("div",{className:"flex items-center justify-center min-h-screen p-4 bg-scrim/40",children:e.jsx("div",{className:"w-full bg-surface rounded-xl shadow-elevation-5 overflow-hidden font-sans",style:{maxWidth:r},children:a})})}function Xe({confirmation:a,onNewBooking:r,onClose:t,companyName:n}){return e.jsx(_,{header:e.jsx(H,{title:"ChronOwl",subtitle:"Reserva confirmada"}),footer:e.jsx(W,{companyName:n,poweredBy:!0}),children:e.jsxs("div",{className:"flex flex-col items-center py-4",children:[e.jsx("div",{className:"w-20 h-20 rounded-full bg-success-container flex items-center justify-center mb-5 animate-bounce",children:e.jsx(f,{name:"check",size:"lg",color:"#27AE60"})}),e.jsx(c,{variant:"headline-sm",align:"center",className:"text-surface-on mb-1",children:"¡Reserva confirmada!"}),e.jsx(c,{variant:"body-md",align:"center",className:"text-surface-on-variant mb-4",children:"Tu cita ha sido agendada exitosamente."}),e.jsx(V,{status:a.status,label:"Confirmada"}),e.jsx(T,{className:"my-5 w-full"}),e.jsxs("div",{className:"w-full space-y-4 bg-surface-variant rounded-md p-4",children:[e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx("div",{className:"w-8 h-8 rounded-full bg-primary-container flex items-center justify-center shrink-0",children:e.jsx(f,{name:"star",size:"sm",color:"#2C3E50"})}),e.jsxs("div",{children:[e.jsx(c,{variant:"label-sm",className:"text-surface-on-variant",children:"Servicio"}),e.jsx(c,{variant:"body-lg",className:"text-surface-on font-bold",children:a.service.name}),e.jsxs(c,{variant:"body-sm",className:"text-surface-on-variant",children:[a.service.duration," min — ",a.service.currency,a.service.price]})]})]}),e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx("div",{className:"w-8 h-8 rounded-full bg-primary-container flex items-center justify-center shrink-0",children:e.jsx(f,{name:"calendar",size:"sm",color:"#2C3E50"})}),e.jsxs("div",{children:[e.jsx(c,{variant:"label-sm",className:"text-surface-on-variant",children:"Fecha y hora"}),e.jsx(c,{variant:"body-lg",className:"text-surface-on font-bold",children:new Date(a.date).toLocaleDateString("es-ES",{weekday:"long",day:"numeric",month:"long",year:"numeric"})}),e.jsxs(c,{variant:"body-sm",className:"text-surface-on-variant",children:[a.timeSlot.startTime," - ",a.timeSlot.endTime]})]})]}),e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx("div",{className:"w-8 h-8 rounded-full bg-primary-container flex items-center justify-center shrink-0",children:e.jsx(f,{name:"user",size:"sm",color:"#2C3E50"})}),e.jsxs("div",{children:[e.jsx(c,{variant:"label-sm",className:"text-surface-on-variant",children:"Cliente"}),e.jsx(c,{variant:"body-lg",className:"text-surface-on font-bold",children:a.clientName}),e.jsx(c,{variant:"body-sm",className:"text-surface-on-variant",children:a.clientEmail})]})]})]}),e.jsxs(c,{variant:"body-sm",align:"center",className:"text-surface-on-variant mt-4",children:["ID de reserva: ",e.jsx("span",{className:"font-bold font-mono",children:a.id})]}),e.jsx(c,{variant:"body-sm",align:"center",className:"text-surface-on-variant mt-1 mb-6",children:"Te hemos enviado un email de confirmación."}),e.jsxs("div",{className:"w-full space-y-2",children:[r&&e.jsx(y,{variant:"filled",fullWidth:!0,size:"lg",onClick:r,children:"Nueva reserva"}),t&&e.jsx(y,{variant:"tonal",fullWidth:!0,size:"lg",onClick:t,children:"Cerrar"})]})]})})}function Ze({title:a="Sin disponibilidad",message:r="No hay horarios disponibles en este momento. Por favor, intenta más tarde.",onRetry:t,onBack:n,companyName:s}){return e.jsx(_,{header:e.jsx(H,{title:"ChronOwl",onBack:n}),footer:e.jsx(W,{companyName:s,poweredBy:!0}),children:e.jsxs("div",{className:"flex flex-col items-center justify-center py-12 px-4",children:[e.jsx("div",{className:"w-20 h-20 rounded-full bg-error-container flex items-center justify-center mb-5",children:e.jsx(f,{name:"alert",size:"lg",color:"#C0392B"})}),e.jsx(c,{variant:"headline-sm",align:"center",className:"text-surface-on mb-2",children:a}),e.jsx(c,{variant:"body-md",align:"center",className:"text-surface-on-variant mb-8 max-w-xs",children:r}),e.jsxs("div",{className:"flex items-center gap-2 mb-8 opacity-30",children:[e.jsx(f,{name:"calendar",size:"lg",color:"#7F8C8D"}),e.jsx(f,{name:"close",size:"md",color:"#C0392B"}),e.jsx(f,{name:"clock",size:"lg",color:"#7F8C8D"})]}),e.jsxs("div",{className:"w-full max-w-xs space-y-3",children:[t&&e.jsx(y,{variant:"filled",fullWidth:!0,size:"lg",onClick:t,icon:e.jsx(f,{name:"spinner",size:"sm"}),iconPosition:"start",children:"Reintentar"}),n&&e.jsx(y,{variant:"tonal",fullWidth:!0,size:"lg",onClick:n,icon:e.jsx(f,{name:"arrow-left",size:"sm"}),iconPosition:"start",children:"Volver al inicio"})]})]})})}const ea={primary:"#2C3E50",onPrimary:"#FFFFFF",primaryContainer:"#E8F4F8",onPrimaryContainer:"#2C3E50",secondary:"#E8F4F8",onSecondary:"#2C3E50",secondaryContainer:"#D1E8F0",onSecondaryContainer:"#1A252F",tertiary:"#1A252F",onTertiary:"#FFFFFF",tertiaryContainer:"#34495E",onTertiaryContainer:"#E8F4F8",neutral:"#7F8C8D",onNeutral:"#FFFFFF",neutralVariant:"#BDC3C7",onNeutralVariant:"#2C3E50",surface:"#FFFFFF",onSurface:"#2C3E50",surfaceVariant:"#F0F3F5",onSurfaceVariant:"#7F8C8D",surfaceDim:"#E0E3E5",surfaceBright:"#FFFFFF",surfaceContainerLowest:"#FFFFFF",surfaceContainerLow:"#F8F9FA",surfaceContainer:"#F0F3F5",surfaceContainerHigh:"#E8EBEE",surfaceContainerHighest:"#E0E3E5",outline:"#BDC3C7",outlineVariant:"#E0E3E5",error:"#C0392B",onError:"#FFFFFF",errorContainer:"#FADBD8",onErrorContainer:"#78281F",warning:"#F39C12",onWarning:"#FFFFFF",warningContainer:"#FEF5E7",onWarningContainer:"#7E5109",success:"#27AE60",onSuccess:"#FFFFFF",successContainer:"#D5F5E3",onSuccessContainer:"#1E8449",inverseSurface:"#2C3E50",inverseOnSurface:"#FFFFFF",inversePrimary:"#A3C4D4",scrim:"#000000",shadow:"#000000"},aa={displayLarge:{fontSize:"57px",lineHeight:"64px",fontWeight:700,letterSpacing:"-0.25px"},displayMedium:{fontSize:"45px",lineHeight:"52px",fontWeight:700,letterSpacing:"0px"},displaySmall:{fontSize:"36px",lineHeight:"44px",fontWeight:700,letterSpacing:"0px"},headlineLarge:{fontSize:"32px",lineHeight:"40px",fontWeight:700,letterSpacing:"0px"},headlineMedium:{fontSize:"28px",lineHeight:"36px",fontWeight:700,letterSpacing:"0px"},headlineSmall:{fontSize:"24px",lineHeight:"32px",fontWeight:700,letterSpacing:"0px"},titleLarge:{fontSize:"22px",lineHeight:"28px",fontWeight:700,letterSpacing:"0px"},titleMedium:{fontSize:"18px",lineHeight:"24px",fontWeight:700,letterSpacing:"0.15px"},titleSmall:{fontSize:"14px",lineHeight:"20px",fontWeight:700,letterSpacing:"0.1px"},bodyLarge:{fontSize:"16px",lineHeight:"24px",fontWeight:400,letterSpacing:"0.15px"},bodyMedium:{fontSize:"14px",lineHeight:"20px",fontWeight:400,letterSpacing:"0.25px"},bodySmall:{fontSize:"12px",lineHeight:"16px",fontWeight:400,letterSpacing:"0.4px"},labelLarge:{fontSize:"14px",lineHeight:"20px",fontWeight:700,letterSpacing:"0.1px"},labelMedium:{fontSize:"12px",lineHeight:"16px",fontWeight:700,letterSpacing:"0.5px"},labelSmall:{fontSize:"11px",lineHeight:"16px",fontWeight:700,letterSpacing:"0.5px"}},ra="'Inter', 'Roboto', system-ui, sans-serif",ta={size0:"0px",size1:"4px",size2:"8px",size3:"12px",size4:"16px",size5:"24px",size6:"32px",size7:"40px",size8:"48px"},na={size0:0,size1:4,size2:8,size3:12,size4:16,size5:24,size6:32,size7:40,size8:48},sa={level0:"none",level1:"0 1px 3px rgba(44, 62, 80, 0.12)",level2:"0 3px 6px rgba(44, 62, 80, 0.16)",level3:"0 6px 10px rgba(44, 62, 80, 0.2)",level4:"0 8px 16px rgba(44, 62, 80, 0.24)",level5:"0 12px 28px rgba(44, 62, 80, 0.3)"},ve={short1:"50ms",short2:"100ms",medium1:"200ms",medium2:"300ms",long1:"400ms",long2:"500ms"},pe={standard:"cubic-bezier(0.2, 0, 0, 1)",emphasized:"cubic-bezier(0.2, 0, 0, 1)",decelerate:"cubic-bezier(0.05, 0.7, 0.1, 1)",accelerate:"cubic-bezier(0.3, 0, 0.8, 0.15)"},ia={duration:ve,easing:pe},la={extraSmall:"4px",small:"8px",medium:"12px",large:"16px",extraLarge:"28px",full:"999px"},I={services:a=>`/api/services/${a}`,availability:(a,r,t)=>`/api/availability/${a}/${r}/${t}`,bookings:"/api/bookings",bookingDetail:(a,r)=>`/api/bookings/${a}/${r}`,cancelBooking:(a,r)=>`/api/bookings/${a}/${r}/cancel`},oa="",ca=3e4;let z={baseUrl:oa,saasId:""};function da(a){if(a.baseUrl!==void 0){const r=a.baseUrl;r&&!r.startsWith("https://")&&!r.includes("localhost")&&!r.includes("127.0.0.1")&&console.warn("[ChronOwl] La URL del API no usa HTTPS. Las API keys se enviarán en texto plano.")}z={...z,...a}}async function P(a,r){if(!z.baseUrl)throw new Error('[ChronOwl] API URL no configurada. Llama a configureApi({ baseUrl: "..." }) primero.');const t=`${z.baseUrl}${a}`,n={"Content-Type":"application/json"};z.apiKey&&(n["x-api-key"]=z.apiKey);const s=new AbortController,i=setTimeout(()=>s.abort(),ca);try{const l=await fetch(t,{...r,headers:{...n,...r==null?void 0:r.headers},signal:s.signal}),o=await l.json();if(!l.ok||!o.success)throw new Error(o.error||`Error ${l.status}`);return o.data}catch(l){throw l.name==="AbortError"?new Error("La solicitud tardó demasiado. Intenta de nuevo."):l}finally{clearTimeout(i)}}const A={async getServices(a){const r=a||z.saasId;return P(I.services(r))},async getAvailability(a,r,t){const n=t||z.saasId;return P(I.availability(n,a,r))},async createBooking(a){return P(I.bookings,{method:"POST",body:JSON.stringify({...a,saasId:a.saasId||z.saasId})})},async cancelBooking(a,r){const t=r||z.saasId;return P(I.cancelBooking(t,a),{method:"PATCH"})}};function ma(a){const[r,t]=d.useState([]),[n,s]=d.useState(!0),[i,l]=d.useState(null),o=d.useCallback(async()=>{s(!0),l(null);try{const u=await A.getServices(a);t(u)}catch(u){l(u instanceof Error?u.message:"Error al cargar servicios")}finally{s(!1)}},[a]);return d.useEffect(()=>{a&&o()},[a,o]),{services:r,loading:n,error:i,refetch:o}}function ua(a){const[r,t]=d.useState([]),[n,s]=d.useState(!1),[i,l]=d.useState(null),o=d.useCallback(async(h,b)=>{s(!0),l(null);try{const m=ie(b),p=await A.getAvailability(h,m,a);t(p)}catch(m){l(m instanceof Error?m.message:"Error al cargar horarios"),t([])}finally{s(!1)}},[a]),u=d.useCallback(()=>{t([]),l(null)},[]);return{slots:r,loading:n,error:i,fetchSlots:o,clearSlots:u}}function xa(a){const[r,t]=d.useState(null),[n,s]=d.useState(!1),[i,l]=d.useState(null),o=d.useCallback(async b=>{s(!0),l(null);try{const m=await A.createBooking({...b,saasId:a});return t(m),m}catch(m){const p=m instanceof Error?m.message:"Error al crear reserva";return l(p),null}finally{s(!1)}},[a]),u=d.useCallback(async b=>{s(!0),l(null);try{await A.cancelBooking(b,a),t(null)}catch(m){l(m instanceof Error?m.message:"Error al cancelar reserva")}finally{s(!1)}},[a]),h=d.useCallback(()=>{t(null),l(null)},[]);return{booking:r,loading:n,error:i,createBooking:o,cancelBooking:u,reset:h}}function ha({initialValues:a,validationRules:r={},onSubmit:t}){const[n,s]=d.useState(a),[i,l]=d.useState({}),[o,u]=d.useState({}),[h,b]=d.useState(!1),m=d.useCallback((g,j)=>{const x=r[g];if(x)return x(j,n)},[r,n]),p=d.useCallback(()=>{const g={};let j=!0;for(const x of Object.keys(n)){const S=m(x,n[x]);S&&(g[x]=S,j=!1)}return l(g),j},[n,m]),C=d.useCallback((g,j)=>{if(s(x=>({...x,[g]:j})),o[g]){const x=m(g,j);l(S=>({...S,[g]:x}))}},[o,m]),N=d.useCallback(g=>{u(x=>({...x,[g]:!0}));const j=m(g,n[g]);l(x=>({...x,[g]:j}))},[n,m]),v=d.useCallback(async()=>{const g={};for(const j of Object.keys(n))g[j]=!0;if(u(g),!!p()){b(!0);try{await t(n)}finally{b(!1)}}},[n,p,t]),E=d.useCallback(()=>{s(a),l({}),u({})},[a]),L=Object.values(i).every(g=>!g);return{values:n,errors:i,touched:o,isValid:L,isSubmitting:h,handleChange:C,handleBlur:N,handleSubmit:v,reset:E}}function fa(...a){return a.filter(Boolean).join(" ")}function va(a,r="$"){return`${r}${a.toLocaleString()}`}function pa(a){if(a<60)return`${a} min`;const r=Math.floor(a/60),t=a%60;return t>0?`${r}h ${t}min`:`${r}h`}const ga=["Servicio","Fecha y hora","Datos","Confirmación"],ba={xs:320,sm:480,md:768,lg:1024,xl:1200},ya={es:{steps:["Servicio","Fecha y hora","Datos","Confirmación"],selectService:"Selecciona un servicio",selectDate:"Selecciona una fecha",selectTime:"Selecciona un horario",yourData:"Tus datos",confirm:"Confirmar reserva",continue:"Continuar",back:"Volver",close:"Cerrar",newBooking:"Nueva reserva",loading:"Cargando...",noSlots:"No hay horarios disponibles",noServices:"No hay servicios disponibles",bookingConfirmed:"Reserva confirmada",bookingError:"Error al crear la reserva",required:"Este campo es requerido",invalidEmail:"Email no válido",poweredBy:"Powered by ChronOwl"},en:{steps:["Service","Date & Time","Details","Confirmation"],selectService:"Select a service",selectDate:"Select a date",selectTime:"Select a time slot",yourData:"Your details",confirm:"Confirm booking",continue:"Continue",back:"Back",close:"Close",newBooking:"New booking",loading:"Loading...",noSlots:"No available time slots",noServices:"No services available",bookingConfirmed:"Booking confirmed",bookingError:"Error creating booking",required:"This field is required",invalidEmail:"Invalid email",poweredBy:"Powered by ChronOwl"}};exports.API_ENDPOINTS=I;exports.AvailabilityGrid=Je;exports.AvailabilitySlot=he;exports.BOOKING_STEPS=ga;exports.BREAKPOINTS=ba;exports.Badge=oe;exports.BookingForm=le;exports.BookingPage=me;exports.BookingPageTemplate=Z;exports.Button=y;exports.ButtonGroup=Ke;exports.Calendar=ne;exports.Card=ee;exports.CenteredLayout=Qe;exports.ChronOwlWidget=ue;exports.ConfirmationBadge=V;exports.ConfirmationModal=ce;exports.ConfirmationPage=Xe;exports.DateSelector=te;exports.Divider=T;exports.EmptyState=U;exports.ErrorModal=de;exports.ErrorPage=Ze;exports.Footer=W;exports.FormGroup=_e;exports.Header=H;exports.Icon=f;exports.Input=B;exports.InputWithIcon=fe;exports.LOCALE=ya;exports.Label=xe;exports.LoadingState=O;exports.MainLayout=_;exports.ServiceCard=ae;exports.ServiceList=re;exports.Spinner=Y;exports.Stepper=X;exports.TimeSelector=Ge;exports.TimeSlotSelector=se;exports.Typography=c;exports.chronowlApi=A;exports.cn=fa;exports.colors=ea;exports.configureApi=da;exports.corners=la;exports.dateToString=ie;exports.default=ue;exports.duration=ve;exports.easing=pe;exports.elevation=sa;exports.fontFamily=ra;exports.formatCurrency=va;exports.formatDate=We;exports.formatDateShort=Oe;exports.formatDuration=pa;exports.motion=ia;exports.spacing=ta;exports.spacingValues=na;exports.typescale=aa;exports.useAvailability=ua;exports.useBooking=xa;exports.useForm=ha;exports.useServices=ma;
|