@fayz-ai/plugin-agenda 0.2.1 → 0.3.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.
Files changed (83) hide show
  1. package/dist/chunk-DRZF6CV2.js +421 -0
  2. package/dist/chunk-DRZF6CV2.js.map +1 -0
  3. package/dist/chunk-LFUELUIT.cjs +423 -0
  4. package/dist/chunk-LFUELUIT.cjs.map +1 -0
  5. package/dist/index.cjs +741 -10
  6. package/dist/index.cjs.map +1 -1
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +741 -10
  9. package/dist/index.js.map +1 -1
  10. package/dist/migrations/index.d.ts +2 -0
  11. package/dist/migrations/index.d.ts.map +1 -0
  12. package/dist/public/BookingWidget.d.ts +4 -2
  13. package/dist/public/BookingWidget.d.ts.map +1 -1
  14. package/dist/public/components/BrandHeader.d.ts +6 -0
  15. package/dist/public/components/BrandHeader.d.ts.map +1 -0
  16. package/dist/public/components/ServiceCard.d.ts +5 -0
  17. package/dist/public/components/ServiceCard.d.ts.map +1 -0
  18. package/dist/public/components/SidebarExtras.d.ts +4 -0
  19. package/dist/public/components/SidebarExtras.d.ts.map +1 -0
  20. package/dist/public/components/StepRailItem.d.ts +4 -0
  21. package/dist/public/components/StepRailItem.d.ts.map +1 -0
  22. package/dist/public/components/SuccessPanel.d.ts +4 -0
  23. package/dist/public/components/SuccessPanel.d.ts.map +1 -0
  24. package/dist/public/components/SummaryRail.d.ts +27 -0
  25. package/dist/public/components/SummaryRail.d.ts.map +1 -0
  26. package/dist/public/components/defaults.d.ts +3 -0
  27. package/dist/public/components/defaults.d.ts.map +1 -0
  28. package/dist/public/context.d.ts +22 -8
  29. package/dist/public/context.d.ts.map +1 -1
  30. package/dist/public/createPublicBookingPlugin.d.ts +27 -10
  31. package/dist/public/createPublicBookingPlugin.d.ts.map +1 -1
  32. package/dist/public/data.d.ts +37 -0
  33. package/dist/public/data.d.ts.map +1 -0
  34. package/dist/public/data.supabase.d.ts +7 -0
  35. package/dist/public/data.supabase.d.ts.map +1 -0
  36. package/dist/public/format.d.ts +18 -0
  37. package/dist/public/format.d.ts.map +1 -0
  38. package/dist/public/hooks.d.ts +13 -11
  39. package/dist/public/hooks.d.ts.map +1 -1
  40. package/dist/public/index.cjs +1016 -613
  41. package/dist/public/index.cjs.map +1 -1
  42. package/dist/public/index.d.ts +15 -4
  43. package/dist/public/index.d.ts.map +1 -1
  44. package/dist/public/index.js +1006 -616
  45. package/dist/public/index.js.map +1 -1
  46. package/dist/public/steps/ContactStep.d.ts +30 -0
  47. package/dist/public/steps/ContactStep.d.ts.map +1 -0
  48. package/dist/public/steps/DateTimeStep.d.ts +23 -0
  49. package/dist/public/steps/DateTimeStep.d.ts.map +1 -0
  50. package/dist/public/steps/OverviewStep.d.ts +16 -0
  51. package/dist/public/steps/OverviewStep.d.ts.map +1 -0
  52. package/dist/public/steps/PaymentStep.d.ts +20 -0
  53. package/dist/public/steps/PaymentStep.d.ts.map +1 -0
  54. package/dist/public/types.d.ts +134 -0
  55. package/dist/public/types.d.ts.map +1 -1
  56. package/package.json +12 -12
  57. package/src/index.ts +11 -0
  58. package/src/migrations/001_public_booking.sql +278 -0
  59. package/src/migrations/index.ts +282 -0
  60. package/src/public/BookingWidget.tsx +136 -713
  61. package/src/public/components/BrandHeader.tsx +27 -0
  62. package/src/public/components/ServiceCard.tsx +39 -0
  63. package/src/public/components/SidebarExtras.tsx +30 -0
  64. package/src/public/components/StepRailItem.tsx +27 -0
  65. package/src/public/components/SuccessPanel.tsx +27 -0
  66. package/src/public/components/SummaryRail.tsx +90 -0
  67. package/src/public/components/defaults.ts +14 -0
  68. package/src/public/context.tsx +64 -7
  69. package/src/public/createPublicBookingPlugin.ts +131 -21
  70. package/src/public/data.supabase.ts +94 -0
  71. package/src/public/data.ts +99 -0
  72. package/src/public/format.ts +61 -0
  73. package/src/public/hooks.ts +22 -34
  74. package/src/public/index.ts +57 -4
  75. package/src/public/steps/ContactStep.tsx +179 -0
  76. package/src/public/steps/DateTimeStep.tsx +138 -0
  77. package/src/public/steps/OverviewStep.tsx +81 -0
  78. package/src/public/steps/PaymentStep.tsx +180 -0
  79. package/src/public/types.ts +169 -3
  80. package/dist/chunk-GAJVIEXM.cjs +0 -870
  81. package/dist/chunk-GAJVIEXM.cjs.map +0 -1
  82. package/dist/chunk-U6VTLOHN.js +0 -867
  83. package/dist/chunk-U6VTLOHN.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config.ts","../src/AgendaContext.tsx","../src/calendar-styles.ts","../src/hooks/useAgendaSettings.ts","../src/components/MiniCalendar.tsx","../src/components/SearchCombobox.tsx","../src/components/BookingPaymentPanel.tsx","../src/types.ts","../src/components/AppointmentModal.tsx","../src/components/FloatingPanel.tsx","../src/components/AppointmentPopover.tsx","../src/components/EventContextMenu.tsx","../src/components/AgendaMobileList.tsx","../src/views/CalendarView.tsx","../src/AgendaPage.tsx","../src/store.ts","../src/registries.ts","../src/components/AgendaGeneralSettings.tsx","../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/bridges/create-financial-bridge.ts","../src/integrations/google-calendar/data/supabase.ts","../src/integrations/google-calendar/connectorDef.tsx","../src/integrations/google-calendar/connector.ts","../src/integrations/google-calendar/mapping.ts","../src/integrations/google-calendar/index.ts","../src/index.ts"],"names":["createPluginContext","usePluginPrefs","getCurrentLocale","React","useMemo","jsxs","jsx","ChevronLeft","ChevronRight","useState","useRef","useEffect","useCallback","Plus","Search","createPortal","Banknote","QrCode","CreditCard","ArrowRightLeft","FileCheck","formatCurrency","useTranslation","t","Check","ExternalLink","Fragment","X","Calendar","CheckSquare","Ban","cn","TooltipProvider","Tooltip","TooltipTrigger","TooltipContent","provider","Modal","ModalContent","ModalTitle","User","DollarSign","Clock","AlertTriangle","CrudFormPage","getSupabaseClientOptional","CrudDetailPage","PersonLink","toast","MapPin","Briefcase","CircleDot","FileText","Button","HandCoins","STYLE_ID","fmtCurrency","Pencil","Trash2","ptBrLocale","booking","ChevronDown","Settings","FullCalendar","dayGridPlugin","timeGridPlugin","resourceTimeGridPlugin","interactionPlugin","listPlugin","ConfirmDialog","usePluginRuntimeOptional","setAgendaTenantId","createStore","dedup","getScheduleBlockConfig","setScheduleBlockConfig","SettingsGroup","ToggleRow","SelectRow","RefreshCw","History","CheckCircle2","AlertCircle","bookingToEvent","registerTranslations","createSafeDataProvider","createSupabaseAgendaProvider","createMockAgendaProvider","PluginSettingsPanel"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { PluginRegistryDef, PluginScope, VerticalId } from '@fayz-ai/core'\nimport type { EntityLookup } from '@fayz-ai/saas'\nimport type { AgendaDataProvider } from './data/types'\nimport type { StatusConfig, BookingTypeConfig } from './types'\nimport type { AgendaFinancialBridge } from './financial-bridge'\nimport type { EntityDef } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Public options interface\n// ---------------------------------------------------------------------------\n\nexport interface AgendaPluginLabels {\n pageTitle: string\n pageSubtitle: string\n calendar: string\n dayView: string\n weekView: string\n monthView: string\n listView: string\n workingHours: string\n confirmations: string\n newAppointment: string\n filters: string\n}\n\nexport interface ConfirmationChannelOption {\n id: string\n label: string\n icon: string\n}\n\nexport interface CancellationReasonOption {\n id: string\n label: string\n requiresNotes?: boolean\n}\n\nexport interface CancellationDetailsProvider {\n listReasons(): Promise<CancellationReasonOption[]>\n saveCancellationDetails(input: {\n bookingId: string\n reasonId: string\n notes?: string\n cancelledAt?: string\n }): Promise<void>\n}\n\nexport interface ExternalBookingSource {\n type: string\n id?: string\n [key: string]: unknown\n}\n\nexport interface LocationOption {\n id: string\n name: string\n isHQ?: boolean\n}\n\nexport interface AgendaPluginOptions {\n modules?: {\n workingHours?: boolean\n confirmations?: boolean\n conflictDetection?: boolean\n dragAndDrop?: boolean\n locationSelection?: boolean\n /** Enable financial integration (auto-enabled when financialBridge is provided) */\n financial?: boolean\n }\n labels?: Partial<AgendaPluginLabels>\n currency?: { code?: string; locale?: string; symbol?: string }\n\n /** Booking kind used in saas_core.bookings.kind (default: 'appointment') */\n bookingKind?: string\n\n /** Order kind for financial records (default: 'service_order') */\n orderKind?: string\n\n /** Schedule kind in saas_core.schedules.kind (default: 'working_hours') */\n scheduleKind?: string\n\n /** Booking type tabs shown in the appointment modal */\n bookingTypes?: BookingTypeConfig[]\n\n /**\n * Simplifies the agenda to Google-Calendar-style events (no client /\n * professional / service). When set to 'simple', the plugin exposes a single\n * \"Evento\" booking type whose modal shows only title / date-time / notes.\n * Ignored when an explicit `bookingTypes` override is provided.\n */\n eventMode?: 'simple'\n\n /** Booking status options */\n statuses?: StatusConfig[]\n\n /** Default calendar view (default: 'resourceTimeGridWeek'). Options: 'dayGridMonth', 'timeGridWeek', 'resourceTimeGridWeek', 'listWeek' */\n defaultCalendarView?: string\n\n /** Calendar visible time range (default: '07:00'-'21:00') */\n businessHours?: { startTime: string; endTime: string }\n\n /** Slot duration in minutes (default: 30) */\n slotDuration?: number\n\n /** Person kind for professionals (default: 'staff') */\n professionalKind?: string\n\n /** Person kind for clients (default: 'customer') */\n clientKind?: string\n\n /** Auto-create an order when creating a booking (default: true) */\n autoCreateOrder?: boolean\n\n /** Contact/client lookup */\n contactLookup?: EntityLookup\n\n /** Client entity definition for the Client tab in booking modal */\n clientEntityDef?: EntityDef\n\n /** Service lookup */\n serviceLookup?: EntityLookup\n\n /** Professional/staff lookup */\n professionalLookup?: EntityLookup\n\n /** Location lookup */\n locationLookup?: EntityLookup\n\n /** Called when user clicks a selected entity link (e.g. view client profile) */\n onEntityClick?: (type: 'client' | 'service' | 'professional', id: string) => void\n\n /** Business locations for unit filtering */\n locations?: LocationOption[]\n\n /** Confirmation channel options */\n confirmationChannels?: ConfirmationChannelOption[]\n\n /** Optional app/plugin bridge for cancel-time reason capture. */\n cancellationDetails?: CancellationDetailsProvider\n\n /** Called after a booking is created from an external operational source. */\n onBookingCreated?: (input: { bookingId: string; source?: ExternalBookingSource }) => void | Promise<void>\n\n /** App-owned registries shown under /settings/agenda Properties. */\n settingsRegistries?: PluginRegistryDef[]\n\n /** Financial bridge for agenda × financial cross-plugin integration */\n financialBridge?: AgendaFinancialBridge\n\n /** Data provider — defaults to Supabase, falls back to mock */\n dataProvider?: AgendaDataProvider\n\n /** Default values for schedule block advanced settings */\n scheduleBlockDefaults?: {\n bufferMinutes?: number\n maxConcurrent?: number\n minAdvanceHours?: number\n maxAdvanceDays?: number\n }\n\n navPosition?: number\n navSection?: 'main' | 'secondary'\n scope?: PluginScope\n verticalId?: VerticalId\n}\n\n// ---------------------------------------------------------------------------\n// Defaults\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_LABELS: AgendaPluginLabels = {\n pageTitle: 'Agenda',\n pageSubtitle: 'Calendar and appointment management',\n calendar: 'Calendar',\n dayView: 'Day',\n weekView: 'Week',\n monthView: 'Month',\n listView: 'Agenda',\n workingHours: 'Working Hours',\n confirmations: 'Confirmations',\n newAppointment: 'New Appointment',\n filters: 'Filters',\n}\n\nconst DEFAULT_CURRENCY = { code: 'BRL', locale: 'pt-BR', symbol: 'R$' }\n\nconst DEFAULT_STATUSES: StatusConfig[] = [\n { value: 'scheduled', label: 'Scheduled', color: '#6366f1' },\n { value: 'confirmed', label: 'Confirmed', color: '#3b82f6' },\n { value: 'in_progress', label: 'In Progress', color: '#f59e0b', availableWhen: 'today_only' },\n { value: 'completed', label: 'Completed', color: '#10b981', availableWhen: 'today_or_past' },\n { value: 'cancelled', label: 'Cancelled', color: '#ef4444' },\n { value: 'no_show', label: 'No Show', color: '#6b7280', availableWhen: 'today_or_past' },\n]\n\nconst DEFAULT_BOOKING_TYPES: BookingTypeConfig[] = [\n {\n id: 'appointment', label: 'Appointment', icon: 'Calendar', color: '#6366f1',\n fields: { client: true, professional: true, services: true, location: true, status: true },\n requiresServices: true, requiresClient: true,\n },\n {\n id: 'task', label: 'Task', icon: 'CheckSquare', color: '#f59e0b',\n fields: { client: false, professional: true, services: false, location: false, status: true },\n requiresServices: false, requiresClient: false,\n },\n {\n id: 'block', label: 'Block', icon: 'Ban', color: '#6b7280',\n fields: { client: false, professional: true, services: false, location: false, status: false },\n requiresServices: false, requiresClient: false,\n },\n]\n\n// Simple / Google-Calendar-style event — a single \"Evento\" type with just a\n// free-text title, date-time and notes. No client / professional / service.\n// Used by personal-finance-style agendas (see eventMode: 'simple').\nconst SIMPLE_EVENT_BOOKING_TYPES: BookingTypeConfig[] = [\n {\n id: 'event', label: 'Event', icon: 'Calendar', color: '#6366f1',\n fields: { title: true, client: false, professional: false, services: false, location: false, status: false },\n requiresServices: false, requiresClient: false,\n },\n]\n\n// ---------------------------------------------------------------------------\n// Resolved config — fully merged, no optionals\n// ---------------------------------------------------------------------------\n\nexport interface AgendaModules {\n workingHours: boolean\n confirmations: boolean\n conflictDetection: boolean\n dragAndDrop: boolean\n locationSelection: boolean\n financial: boolean\n}\n\n/**\n * Derived UI capabilities — computed ONCE in resolveConfig from the resolved\n * bookingTypes so no component ever re-derives \"is this a simple event agenda?\"\n * ad-hoc. A capability is enabled when ANY booking type uses that field. In\n * eventMode:'simple' the single \"Evento\" type disables\n * client/professional/services/location/status, so every consumer (popover,\n * filter rail, modal) hides the professional/service/status machinery in one\n * place instead of scattering `eventMode === 'simple'` checks.\n */\nexport interface AgendaCapabilities {\n title: boolean\n client: boolean\n professional: boolean\n services: boolean\n location: boolean\n status: boolean\n}\n\nexport interface AgendaCurrency {\n code: string\n locale: string\n symbol: string\n}\n\nexport interface ResolvedAgendaConfig {\n modules: AgendaModules\n /** Whether this is a simple Google-Calendar-style event agenda (eventMode:'simple'). */\n simpleMode: boolean\n /** Derived once from bookingTypes — see AgendaCapabilities. */\n capabilities: AgendaCapabilities\n labels: AgendaPluginLabels\n currency: AgendaCurrency\n bookingKind: string\n orderKind: string\n scheduleKind: string\n statuses: StatusConfig[]\n bookingTypes: BookingTypeConfig[]\n businessHours: { startTime: string; endTime: string }\n slotDuration: number\n professionalKind: string\n clientKind: string\n autoCreateOrder: boolean\n locations: LocationOption[]\n confirmationChannels: ConfirmationChannelOption[]\n cancellationDetails?: CancellationDetailsProvider\n onBookingCreated?: (input: { bookingId: string; source?: ExternalBookingSource }) => void | Promise<void>\n contactLookup?: EntityLookup\n clientEntityDef?: EntityDef\n serviceLookup?: EntityLookup\n professionalLookup?: EntityLookup\n locationLookup?: EntityLookup\n onEntityClick?: (type: 'client' | 'service' | 'professional', id: string) => void\n financialBridge?: AgendaFinancialBridge\n scheduleBlockDefaults: {\n bufferMinutes: number\n maxConcurrent: number\n minAdvanceHours: number\n maxAdvanceDays: number\n }\n defaultCalendarView: string\n}\n\n// ---------------------------------------------------------------------------\n// Config resolver\n// ---------------------------------------------------------------------------\n\nexport function resolveConfig(options?: AgendaPluginOptions): ResolvedAgendaConfig {\n // ── eventMode:'simple' derives ALL module + capability defaults ONCE, here. ──\n // Simple = Google-Calendar-style events (title/description + timestamp). It\n // flips professional/service machinery OFF by default: no working-hours /\n // schedule checks, no confirmations outreach, no conflict (double-booking)\n // detection, no location. Explicit `modules.*` re-enable individually. Full\n // mode (beauty) is unchanged — every default below matches the old behavior\n // when `simple` is false. Field-level machinery (client/professional/\n // services/location/status/title) is derived into `capabilities` from the\n // resolved bookingTypes, so components never test eventMode themselves.\n const simple = options?.eventMode === 'simple'\n const bookingTypes = options?.bookingTypes\n ?? (simple ? SIMPLE_EVENT_BOOKING_TYPES : DEFAULT_BOOKING_TYPES)\n const capabilities: AgendaCapabilities = {\n title: bookingTypes.some((bt) => bt.fields.title === true),\n client: bookingTypes.some((bt) => bt.fields.client),\n professional: bookingTypes.some((bt) => bt.fields.professional),\n services: bookingTypes.some((bt) => bt.fields.services),\n location: bookingTypes.some((bt) => bt.fields.location),\n status: bookingTypes.some((bt) => bt.fields.status),\n }\n return {\n modules: {\n // Off-unless-explicit in simple mode (`?? !simple`); default-on in full.\n workingHours: options?.modules?.workingHours ?? !simple,\n confirmations: options?.modules?.confirmations ?? !simple,\n conflictDetection: options?.modules?.conflictDetection ?? !simple,\n dragAndDrop: options?.modules?.dragAndDrop !== false,\n locationSelection: options?.modules?.locationSelection === true,\n financial: options?.modules?.financial ?? !!options?.financialBridge,\n },\n simpleMode: simple,\n capabilities,\n labels: { ...DEFAULT_LABELS, ...options?.labels },\n currency: { ...DEFAULT_CURRENCY, ...options?.currency },\n bookingKind: options?.bookingKind ?? 'appointment',\n orderKind: options?.orderKind ?? 'service_order',\n scheduleKind: options?.scheduleKind ?? 'working_hours',\n statuses: options?.statuses ?? DEFAULT_STATUSES,\n bookingTypes,\n businessHours: options?.businessHours ?? { startTime: '07:00', endTime: '21:00' },\n slotDuration: options?.slotDuration ?? 30,\n professionalKind: options?.professionalKind ?? 'staff',\n clientKind: options?.clientKind ?? 'customer',\n autoCreateOrder: options?.autoCreateOrder !== false,\n locations: options?.locations ?? [],\n confirmationChannels: options?.confirmationChannels ?? [],\n cancellationDetails: options?.cancellationDetails,\n onBookingCreated: options?.onBookingCreated,\n contactLookup: options?.contactLookup,\n clientEntityDef: options?.clientEntityDef,\n serviceLookup: options?.serviceLookup,\n professionalLookup: options?.professionalLookup,\n locationLookup: options?.locationLookup,\n onEntityClick: options?.onEntityClick,\n financialBridge: options?.financialBridge,\n scheduleBlockDefaults: {\n bufferMinutes: options?.scheduleBlockDefaults?.bufferMinutes ?? 0,\n maxConcurrent: options?.scheduleBlockDefaults?.maxConcurrent ?? 1,\n minAdvanceHours: options?.scheduleBlockDefaults?.minAdvanceHours ?? 0,\n maxAdvanceDays: options?.scheduleBlockDefaults?.maxAdvanceDays ?? 60,\n },\n defaultCalendarView: options?.defaultCalendarView ?? 'resourceTimeGridWeek',\n }\n}\n","import { createPluginContext } from '@fayz-ai/saas'\nimport type { ResolvedAgendaConfig } from './config'\nimport type { AgendaDataProvider } from './data/types'\nimport type { AgendaUIState } from './store'\n\nconst ctx = createPluginContext<ResolvedAgendaConfig, AgendaDataProvider, AgendaUIState>('AgendaPage')\n\nexport const AgendaContextProvider = ctx.ContextProvider\nexport const useAgendaConfig = ctx.useConfig\nexport const useAgendaProvider = ctx.useProvider\nexport const useAgendaStore = ctx.useStore\n","/**\n * Injects agenda calendar CSS at runtime.\n * This ensures styles work both in symlinked dev mode and when consumed\n * as a built package (where CSS side-effect imports are extracted by tsup\n * and not automatically loaded).\n */\n\nconst STYLE_ID = 'saas-agenda-calendar-styles'\n\nconst css = /* css */ `\n/* Dark mode content background — uses the content token */\n.dark .agenda-calendar,\n.dark .agenda-calendar .fc,\n.dark .agenda-calendar .fc-view-harness,\n.dark .agenda-calendar .fc-timegrid,\n.dark .agenda-calendar .fc-scrollgrid,\n.dark .agenda-calendar .fc-timegrid-col,\n.dark .agenda-calendar .fc-daygrid-body,\n.dark .agenda-calendar .fc-timegrid-slot-lane {\n background-color: hsl(var(--content));\n}\n\n/* FullCalendar — Google Calendar inspired theme */\n\n.agenda-calendar {\n --fc-border-color: hsl(var(--border));\n --fc-today-bg-color: transparent;\n --fc-now-indicator-color: hsl(var(--destructive));\n --fc-highlight-color: hsl(var(--primary) / 0.06);\n --fc-non-business-color: hsl(var(--muted) / 0.15);\n --fc-neutral-bg-color: transparent;\n --fc-page-bg-color: transparent;\n --fc-event-border-color: transparent;\n}\n\n.agenda-calendar .fc {\n font-family: inherit;\n background: transparent;\n}\n\n.agenda-calendar .fc .fc-view-harness {\n background: transparent;\n}\n\n/* ── Column headers ── */\n.agenda-calendar .fc-col-header-cell {\n background: transparent;\n border-bottom: 1px solid var(--fc-border-color);\n border-left: none;\n border-right: none;\n border-top: none;\n}\n\n.agenda-calendar .fc-col-header-cell-cushion {\n padding: 8px 4px;\n font-weight: 400;\n font-size: 0.7rem;\n color: hsl(var(--muted-foreground));\n text-decoration: none;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n}\n\n/* Today's column header */\n.agenda-calendar .fc-day-today .fc-col-header-cell-cushion {\n color: hsl(var(--primary));\n font-weight: 600;\n}\n\n/* Resource header (professional columns) */\n.agenda-calendar .fc .fc-resource-header {\n background: transparent;\n border-bottom: 1px solid var(--fc-border-color);\n}\n\n/* ── Time slots — compact ── */\n.agenda-calendar .fc-timegrid-slot {\n height: 1.5rem;\n border-bottom: 1px solid hsl(var(--border) / 0.4);\n}\n\n.agenda-calendar .fc-timegrid-slot-label {\n vertical-align: top;\n border: none;\n}\n\n.agenda-calendar .fc-timegrid-slot-label-cushion {\n font-size: 0.65rem;\n color: hsl(var(--muted-foreground) / 0.7);\n padding: 1px 8px 0 0;\n}\n\n/* Half-hour lines lighter */\n.agenda-calendar .fc-timegrid-slot-minor {\n border-bottom-style: none;\n}\n\n/* Column dividers */\n.agenda-calendar .fc-timegrid-col {\n border-right: 1px solid hsl(var(--border) / 0.5);\n}\n\n/* ── Events ── */\n.agenda-calendar .fc-event {\n border-radius: 6px;\n border-width: 0;\n border-left: 4px solid;\n cursor: pointer;\n transition: opacity 0.15s, box-shadow 0.15s, backdrop-filter 0.15s;\n font-size: 0.7rem;\n line-height: 1.3;\n margin: 0 2px;\n overflow: hidden;\n backdrop-filter: blur(8px) saturate(140%);\n -webkit-backdrop-filter: blur(8px) saturate(140%);\n}\n\n.agenda-calendar .fc-event .fc-event-main {\n background: inherit;\n border-radius: inherit;\n overflow: hidden;\n}\n\n.agenda-calendar .fc-event:not(.fc-bg-event):hover {\n opacity: 0.92;\n box-shadow: 0 2px 8px rgba(0,0,0,0.12);\n backdrop-filter: blur(12px) saturate(160%);\n -webkit-backdrop-filter: blur(12px) saturate(160%);\n}\n\n.agenda-calendar .fc-bg-event {\n pointer-events: none;\n}\n\n/* ── Now indicator ── */\n.agenda-calendar .fc-timegrid-now-indicator-line {\n border-color: hsl(var(--destructive));\n border-width: 2px;\n}\n\n.agenda-calendar .fc-timegrid-now-indicator-arrow {\n border-top-color: hsl(var(--destructive));\n}\n\n/* ── Month view ── */\n.agenda-calendar .fc-daygrid-day-number {\n font-size: 0.8rem;\n padding: 4px 8px;\n text-decoration: none;\n color: hsl(var(--foreground));\n}\n\n.agenda-calendar .fc-daygrid-day.fc-day-today .fc-daygrid-day-number {\n background-color: hsl(var(--primary));\n color: hsl(var(--primary-foreground));\n border-radius: 50%;\n width: 1.5rem;\n height: 1.5rem;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.75rem;\n}\n\n/* ── Selection ── */\n.agenda-calendar .fc-highlight {\n background: hsl(var(--primary) / 0.08);\n}\n\n/* ── Links ── */\n.agenda-calendar .fc a {\n text-decoration: none;\n color: inherit;\n}\n\n/* ── Scrollbar ── */\n.agenda-calendar .fc-scroller {\n scrollbar-width: thin;\n scrollbar-color: hsl(var(--muted-foreground) / 0.12) transparent;\n}\n\n.agenda-calendar .fc-scroller::-webkit-scrollbar {\n width: 6px;\n}\n\n.agenda-calendar .fc-scroller::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.agenda-calendar .fc-scroller::-webkit-scrollbar-thumb {\n background: hsl(var(--muted-foreground) / 0.12);\n border-radius: 3px;\n}\n\n/* ── Clean up borders ── */\n.agenda-calendar .fc .fc-timegrid {\n border: none;\n}\n\n.agenda-calendar .fc-scrollgrid {\n border: none !important;\n}\n\n.agenda-calendar .fc-scrollgrid td:last-child {\n border-right: none;\n}\n\n/* ── Unavailable time background — opaque/disabled feel ── */\n.agenda-calendar .fc-unavailable-bg {\n background: hsl(var(--muted-foreground) / 0.08) !important;\n background-image: repeating-linear-gradient(\n 45deg,\n transparent,\n transparent 4px,\n hsl(var(--muted-foreground) / 0.04) 4px,\n hsl(var(--muted-foreground) / 0.04) 8px\n ) !important;\n border-radius: 0;\n border-left: none !important;\n}\n\n/* ── Location label on schedule blocks ── */\n.agenda-calendar .fc-location-label {\n background: transparent !important;\n border: none !important;\n border-left-width: 0 !important;\n cursor: default !important;\n pointer-events: none;\n box-shadow: none !important;\n z-index: 1 !important;\n margin: 0 4px !important;\n font-weight: 500 !important;\n}\n\n.agenda-calendar .fc-location-label .fc-event-main {\n padding: 0 !important;\n}\n\n/* Week view day header with date */\n.agenda-calendar .fc-timegrid .fc-col-header-cell {\n padding: 4px 0;\n}\n\n/* ── Alternating resource column backgrounds ── */\n.agenda-calendar .fc-resource-alt {\n background-color: hsl(var(--muted) / 0.4) !important;\n}\n\n.dark .agenda-calendar .fc-resource-alt {\n background-color: hsl(var(--muted-foreground) / 0.08) !important;\n}\n\n/* Resource group header separator — stronger border between professionals */\n.agenda-calendar .fc-resource-group {\n border-left: 2px solid hsl(var(--border));\n}\n\n/* Also stripe the resource header label for the alt group */\n.agenda-calendar th.fc-resource-alt {\n background-color: hsl(var(--muted) / 0.4) !important;\n}\n\n.dark .agenda-calendar th.fc-resource-alt {\n background-color: hsl(var(--muted-foreground) / 0.06) !important;\n}\n`\n\nlet injected = false\n\nexport function injectCalendarStyles(): void {\n if (injected) return\n if (typeof document === 'undefined') return\n\n // Check if already present (e.g. from CSS import in dev mode)\n if (document.getElementById(STYLE_ID)) {\n injected = true\n return\n }\n\n const style = document.createElement('style')\n style.id = STYLE_ID\n style.textContent = css\n document.head.appendChild(style)\n injected = true\n}\n","import { usePluginPrefs } from '@fayz-ai/saas'\n\nconst DEFAULTS = {\n startTime: '07:00',\n endTime: '21:00',\n}\n\nexport function useAgendaSettings() {\n const prefs = usePluginPrefs('agenda', DEFAULTS)\n\n return {\n startTime: prefs.get('startTime'),\n endTime: prefs.get('endTime'),\n setStartTime: (v: string) => prefs.set('startTime', v),\n setEndTime: (v: string) => prefs.set('endTime', v),\n }\n}\n","import React, { useMemo } from 'react'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { getCurrentLocale } from '@fayz-ai/core'\n\ninterface MiniCalendarProps {\n selectedDate: Date\n onDateSelect: (date: Date) => void\n onMonthChange?: (date: Date) => void\n}\n\nconst DAY_LABELS: Record<string, string[]> = {\n en: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n 'pt-BR': ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],\n}\n\nfunction isSameDay(a: Date, b: Date) {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate()\n}\n\nfunction isToday(d: Date) {\n return isSameDay(d, new Date())\n}\n\nfunction toDateLocale(locale: string): string {\n if (locale === 'pt-BR') return 'pt-BR'\n return 'en-US'\n}\n\nexport function MiniCalendar({ selectedDate, onDateSelect, onMonthChange }: MiniCalendarProps) {\n const locale = getCurrentLocale()\n const [viewMonth, setViewMonth] = React.useState(() => new Date(selectedDate.getFullYear(), selectedDate.getMonth(), 1))\n\n const monthLabel = viewMonth.toLocaleDateString(toDateLocale(locale), { month: 'long', year: 'numeric' })\n const dayLabels = DAY_LABELS[locale] ?? DAY_LABELS.en\n\n const weeks = useMemo(() => {\n const year = viewMonth.getFullYear()\n const month = viewMonth.getMonth()\n const firstDay = new Date(year, month, 1)\n const startOffset = firstDay.getDay()\n const daysInMonth = new Date(year, month + 1, 0).getDate()\n\n const cells: (Date | null)[] = []\n for (let i = 0; i < startOffset; i++) cells.push(null)\n for (let d = 1; d <= daysInMonth; d++) cells.push(new Date(year, month, d))\n while (cells.length % 7 !== 0) cells.push(null)\n\n const rows: (Date | null)[][] = []\n for (let i = 0; i < cells.length; i += 7) rows.push(cells.slice(i, i + 7))\n return rows\n }, [viewMonth])\n\n function prevMonth() {\n const d = new Date(viewMonth.getFullYear(), viewMonth.getMonth() - 1, 1)\n setViewMonth(d)\n onMonthChange?.(d)\n }\n\n function nextMonth() {\n const d = new Date(viewMonth.getFullYear(), viewMonth.getMonth() + 1, 1)\n setViewMonth(d)\n onMonthChange?.(d)\n }\n\n function handleClick(date: Date) {\n onDateSelect(date)\n }\n\n return (\n <div className=\"select-none\">\n {/* Month header */}\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-sm font-medium capitalize\">{monthLabel}</span>\n <div className=\"flex items-center gap-0.5\">\n <button onClick={prevMonth} className=\"flex h-6 w-6 items-center justify-center rounded-full hover:bg-muted transition-colors\">\n <ChevronLeft className=\"h-3.5 w-3.5\" />\n </button>\n <button onClick={nextMonth} className=\"flex h-6 w-6 items-center justify-center rounded-full hover:bg-muted transition-colors\">\n <ChevronRight className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n </div>\n\n {/* Day labels */}\n <div className=\"grid grid-cols-7 mb-0.5\">\n {dayLabels.map((label, i) => (\n <div key={i} className=\"flex h-6 w-6 items-center justify-center text-[10px] font-medium text-muted-foreground mx-auto\">\n {label}\n </div>\n ))}\n </div>\n\n {/* Dates */}\n {weeks.map((week, wi) => (\n <div key={wi} className=\"grid grid-cols-7\">\n {week.map((date, di) => {\n if (!date) return <div key={di} className=\"h-6 w-6 mx-auto\" />\n const selected = isSameDay(date, selectedDate)\n const today = isToday(date)\n return (\n <button\n key={di}\n onClick={() => handleClick(date)}\n className={`flex h-6 w-6 items-center justify-center rounded-full text-[11px] mx-auto transition-colors ${\n selected\n ? 'bg-primary text-primary-foreground'\n : today\n ? 'bg-primary/10 text-primary font-semibold'\n : 'hover:bg-muted text-foreground'\n }`}\n >\n {date.getDate()}\n </button>\n )\n })}\n </div>\n ))}\n </div>\n )\n}\n","import React, { useState, useEffect, useRef, useCallback } from 'react'\nimport { createPortal } from 'react-dom'\nimport { Search, Plus } from 'lucide-react'\n\n// ---------------------------------------------------------------------------\n// Reusable search combobox with keyboard navigation + optional create\n// ---------------------------------------------------------------------------\n\nexport interface ComboboxOption {\n id: string\n label: string\n subtitle?: string\n price?: number\n data?: Record<string, unknown>\n}\n\ninterface SearchComboboxProps {\n value: string\n onChange: (value: string) => void\n onSelect: (option: ComboboxOption) => void\n options: ComboboxOption[]\n placeholder?: string\n autoFocus?: boolean\n onBlurEmpty?: () => void\n renderRight?: (option: ComboboxOption) => React.ReactNode\n /** Show a \"+ Create ...\" option when search has no exact match */\n allowCreate?: boolean\n /** Called when user clicks the create option. Receives the current search text. */\n onCreateNew?: (searchText: string) => void\n /** Label for the create option (default: 'Create') */\n createLabel?: string\n className?: string\n /** Minimal style — no border/bg, just underline on focus. For inline use. */\n minimal?: boolean\n /** Inline label shown when collapsed. Click reveals the search input. */\n inlineLabel?: string\n /** Icon for the inline label: 'search' (default) or 'plus' (for \"add\" actions) */\n inlineIcon?: 'search' | 'plus'\n /** Show a loading skeleton in the dropdown while results are being fetched */\n loading?: boolean\n /** Called when the input gains focus */\n onFocus?: () => void\n}\n\nexport function SearchCombobox({\n value, onChange, onSelect, options, placeholder, autoFocus, onBlurEmpty,\n renderRight, allowCreate, onCreateNew, createLabel = 'Create', className, minimal, inlineLabel, inlineIcon = 'search',\n loading, onFocus: onFocusProp,\n}: SearchComboboxProps) {\n const [open, setOpen] = useState(false)\n const [activeIndex, setActiveIndex] = useState(-1)\n const [expanded, setExpanded] = useState(!inlineLabel)\n const [dropRect, setDropRect] = useState<DOMRect | null>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const wrapperRef = useRef<HTMLDivElement>(null)\n const listRef = useRef<HTMLDivElement>(null)\n\n // When value is set externally (e.g. edit mode), auto-expand; collapse when cleared\n useEffect(() => {\n if (value && inlineLabel) setExpanded(true)\n if (!value && inlineLabel && !open) setExpanded(false)\n }, [value, open])\n\n function updateRect() {\n if (wrapperRef.current) setDropRect(wrapperRef.current.getBoundingClientRect())\n }\n\n // Show create option only when dropdown is open, has text, and no exact match\n const showCreate = open && allowCreate && onCreateNew && value.trim().length > 0 &&\n !options.some((o) => o.label.toLowerCase() === value.trim().toLowerCase())\n\n const totalItems = options.length + (showCreate ? 1 : 0)\n\n useEffect(() => { setActiveIndex(-1) }, [options])\n useEffect(() => {\n if ((options.length > 0 || showCreate || loading) && document.activeElement === inputRef.current) setOpen(true)\n }, [options, showCreate, loading])\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (!open || totalItems === 0) {\n if (e.key === 'ArrowDown' && totalItems > 0) {\n e.preventDefault()\n setOpen(true)\n setActiveIndex(0)\n }\n return\n }\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n setActiveIndex((prev) => (prev + 1) % totalItems)\n break\n case 'ArrowUp':\n e.preventDefault()\n setActiveIndex((prev) => (prev <= 0 ? totalItems - 1 : prev - 1))\n break\n case 'Enter':\n e.preventDefault()\n if (activeIndex >= 0 && activeIndex < options.length) {\n onSelect(options[activeIndex])\n setOpen(false)\n setActiveIndex(-1)\n } else if (showCreate && activeIndex === options.length) {\n onCreateNew?.(value.trim())\n setOpen(false)\n setActiveIndex(-1)\n }\n break\n case 'Escape':\n e.preventDefault()\n setOpen(false)\n setActiveIndex(-1)\n break\n }\n }, [open, options, totalItems, activeIndex, onSelect, showCreate, onCreateNew, value])\n\n useEffect(() => {\n if (activeIndex < 0 || !listRef.current) return\n const items = listRef.current.children\n if (items[activeIndex]) (items[activeIndex] as HTMLElement).scrollIntoView({ block: 'nearest' })\n }, [activeIndex])\n\n function handleBlur() {\n setTimeout(() => {\n setOpen(false)\n setActiveIndex(-1)\n if (!value && onBlurEmpty) onBlurEmpty()\n if (!value && inlineLabel) setExpanded(false)\n }, 200)\n }\n\n const hasDropdown = open && (options.length > 0 || showCreate || loading)\n\n // Collapsed inline label — click to expand\n if (!expanded && inlineLabel) {\n const isPlus = inlineIcon === 'plus'\n return (\n <button type=\"button\" onClick={() => { setExpanded(true); setTimeout(() => inputRef.current?.focus(), 50) }}\n className={`flex items-center gap-1.5 w-full text-left text-sm py-1.5 pl-2 transition-colors ${\n isPlus ? 'text-primary hover:text-primary/80' : 'text-muted-foreground hover:text-foreground'\n } ${className ?? ''}`}>\n {isPlus && <Plus className=\"h-3.5 w-3.5 shrink-0\" />}\n {inlineLabel}\n </button>\n )\n }\n\n return (\n <div ref={wrapperRef} className={`relative ${className ?? ''}`}>\n {!minimal && (\n <Search className=\"absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground pointer-events-none\" />\n )}\n <input\n ref={inputRef}\n type=\"text\"\n value={value}\n onChange={(e) => { onChange(e.target.value); updateRect(); setOpen(true) }}\n onFocus={() => { updateRect(); onFocusProp?.(); if (options.length > 0 || showCreate || loading) setOpen(true) }}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n autoFocus={autoFocus}\n className={minimal\n ? 'w-full bg-transparent pl-2 pr-3 py-1.5 text-sm placeholder:text-muted-foreground focus:outline-none border-b border-transparent hover:border-border focus:border-foreground transition-colors'\n : 'w-full rounded-lg border bg-background pl-8 pr-3 py-2 text-sm placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring'\n }\n role=\"combobox\"\n aria-expanded={hasDropdown}\n aria-autocomplete=\"list\"\n aria-activedescendant={activeIndex >= 0 ? `combobox-opt-${activeIndex}` : undefined}\n />\n {hasDropdown && dropRect && createPortal(\n <div ref={listRef} role=\"listbox\" data-modal-passthrough\n style={{ position: 'fixed', left: dropRect.left, top: dropRect.bottom + 4, width: dropRect.width, zIndex: 9999, pointerEvents: 'auto' }}\n className=\"fayz-glass-surface max-h-52 overflow-y-auto rounded-lg border bg-popover shadow-lg py-0.5 animate-in fade-in zoom-in-95 duration-100\">\n {loading && options.length === 0 && (\n <div className=\"flex items-center gap-2 px-3 py-2 text-sm text-muted-foreground\">\n <svg className=\"h-3.5 w-3.5 animate-spin shrink-0\" viewBox=\"0 0 16 16\" fill=\"none\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" opacity=\"0.25\" />\n <path d=\"M14.5 8a6.5 6.5 0 00-6.5-6.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n <span>Buscando…</span>\n </div>\n )}\n {options.map((opt, i) => (\n <div key={opt.id} id={`combobox-opt-${i}`} role=\"option\" aria-selected={i === activeIndex}\n onMouseDown={(e) => { e.preventDefault(); onSelect(opt); setOpen(false) }}\n onMouseEnter={() => setActiveIndex(i)}\n className={`flex w-full items-center gap-2 px-3 py-2 text-sm cursor-pointer transition-colors ${\n i === activeIndex ? 'bg-primary/10 text-primary' : 'hover:bg-muted/50'\n }`}>\n <div className=\"flex-1 min-w-0\">\n <p className=\"truncate font-medium\">{opt.label}</p>\n {opt.subtitle && <p className=\"truncate text-[11px] text-muted-foreground\">{opt.subtitle}</p>}\n </div>\n {renderRight && <div className=\"shrink-0\">{renderRight(opt)}</div>}\n </div>\n ))}\n {showCreate && (\n <div id={`combobox-opt-${options.length}`} role=\"option\" aria-selected={activeIndex === options.length}\n onMouseDown={(e) => { e.preventDefault(); onCreateNew?.(value.trim()); setOpen(false) }}\n onMouseEnter={() => setActiveIndex(options.length)}\n className={`flex w-full items-center gap-2 px-3 py-2 text-sm cursor-pointer transition-colors border-t ${\n activeIndex === options.length ? 'bg-primary/10 text-primary' : 'hover:bg-muted/50'\n }`}>\n <Plus className=\"h-3.5 w-3.5 shrink-0\" />\n <span>{createLabel} &ldquo;<span className=\"font-medium\">{value.trim()}</span>&rdquo;</span>\n </div>\n )}\n </div>,\n document.body,\n )}\n </div>\n )\n}\n","import React, { useState, useEffect } from 'react'\nimport { createPortal } from 'react-dom'\nimport { X, Check, Banknote, QrCode, CreditCard, ArrowRightLeft, FileCheck, ExternalLink } from 'lucide-react'\nimport { useAgendaConfig } from '../AgendaContext'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { BookingPaymentDetail } from '../financial-bridge'\n\n// ---------------------------------------------------------------------------\n// Payment method type visuals (mirrors financial PaymentModal)\n// ---------------------------------------------------------------------------\n\nconst TYPE_ICONS: Record<string, React.ElementType> = {\n cash: Banknote, pix: QrCode, credit_card: CreditCard, debit_card: CreditCard,\n bank_transfer: ArrowRightLeft, check: FileCheck,\n}\n\nconst TYPE_COLORS: Record<string, string> = {\n cash: 'border-success/30 bg-success/5 hover:bg-success/10 data-[active=true]:border-success data-[active=true]:bg-success/15',\n pix: 'border-teal-500/30 bg-teal-500/5 hover:bg-teal-500/10 data-[active=true]:border-teal-500 data-[active=true]:bg-teal-500/15',\n credit_card: 'border-info/30 bg-info/5 hover:bg-info/10 data-[active=true]:border-info data-[active=true]:bg-info/15',\n debit_card: 'border-magic/30 bg-magic/5 hover:bg-magic/10 data-[active=true]:border-magic data-[active=true]:bg-magic/15',\n bank_transfer: 'border-warning/30 bg-warning/5 hover:bg-warning/10 data-[active=true]:border-warning data-[active=true]:bg-warning/15',\n check: 'border-input/30 bg-muted/5 hover:bg-muted/10 data-[active=true]:border-input data-[active=true]:bg-muted/15',\n}\n\nconst ICON_COLORS: Record<string, string> = {\n cash: 'text-success', pix: 'text-teal-500', credit_card: 'text-info',\n debit_card: 'text-magic', bank_transfer: 'text-warning', check: 'text-muted-foreground',\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\ninterface Props {\n orderId: string\n orderTotal: number\n services?: Array<{ name: string; price: number; durationMinutes: number }>\n onClose: () => void\n onPaymentChange?: () => void\n formatCurrency: (amount: number) => string\n /** Render inline (no portal overlay) — for embedding in tabs */\n inline?: boolean\n}\n\nexport function BookingPaymentPanel({ orderId, orderTotal, services, onClose, onPaymentChange, formatCurrency, inline }: Props) {\n const t = useTranslation()\n const config = useAgendaConfig()\n const bridge = config.financialBridge!\n\n const [visible, setVisible] = useState(false)\n const [loading, setLoading] = useState(true)\n const [detail, setDetail] = useState<BookingPaymentDetail | null>(null)\n\n // Payment form\n const [selectedTypeId, setSelectedTypeId] = useState('')\n const [paymentTypes, setPaymentTypes] = useState<Array<{ id: string; name: string; transactionType?: string }>>([])\n const [bankAccounts, setBankAccounts] = useState<Array<{ id: string; name: string; accountType: string }>>([])\n const [filteredMethods, setFilteredMethods] = useState<Array<{ id: string; name: string }>>([])\n const [selectedBankId, setSelectedBankId] = useState('')\n const [paymentMethodId, setPaymentMethodId] = useState('')\n const [cardBrand, setCardBrand] = useState('')\n const [cardInstallments, setCardInstallments] = useState(1)\n const [processing, setProcessing] = useState(false)\n const [justPaid, setJustPaid] = useState(false)\n\n useEffect(() => { requestAnimationFrame(() => setVisible(true)) }, [])\n\n // Single combined fetch for all initial data\n useEffect(() => {\n let cancelled = false\n setLoading(true)\n Promise.all([\n bridge.getPaymentDetail(orderId).catch(() => null),\n bridge.getPaymentMethodTypes().catch(() => [] as typeof paymentTypes),\n bridge.getBankAccounts().catch(() => [] as typeof bankAccounts),\n ]).then(([d, types, accounts]) => {\n if (cancelled) return\n setDetail(d)\n setPaymentTypes(types)\n setBankAccounts(accounts)\n setLoading(false)\n })\n return () => { cancelled = true }\n }, [orderId])\n\n function handleClose() {\n setVisible(false)\n setTimeout(onClose, 200)\n }\n\n const selectedType = paymentTypes.find((t) => t.id === selectedTypeId)\n const txType = selectedType?.transactionType ?? ''\n const needsBank = ['bank_transfer', 'pix', 'check'].includes(txType)\n const needsCard = txType === 'credit_card' || txType === 'debit_card'\n const needsCardInstallments = txType === 'credit_card'\n\n function handleSelectType(typeId: string) {\n setSelectedTypeId(typeId)\n setSelectedBankId('')\n setPaymentMethodId('')\n setCardBrand('')\n setCardInstallments(1)\n // Fetch specific payment methods for this type\n if (bridge.getPaymentMethods) {\n bridge.getPaymentMethods(typeId).then(setFilteredMethods).catch(() => setFilteredMethods([]))\n }\n }\n\n async function handleCheckout() {\n if (!selectedTypeId) return\n setProcessing(true)\n try {\n const result = await bridge.checkout(orderId, {\n paymentMethodTypeId: selectedTypeId,\n paymentMethodId: paymentMethodId || undefined,\n bankAccountId: needsBank ? selectedBankId || undefined : undefined,\n cardBrand: needsCard ? cardBrand || undefined : undefined,\n cardInstallments: needsCardInstallments ? cardInstallments : undefined,\n })\n setDetail(result)\n setJustPaid(true)\n onPaymentChange?.()\n // Show confirmation animation, then transition to summary\n setTimeout(() => setJustPaid(false), 2200)\n } catch { /* toast */ }\n setProcessing(false)\n }\n\n const isPaid = detail?.status === 'paid'\n\n const content = (\n <div className=\"px-5 py-4 space-y-4\">\n\n {/* Loading */}\n {loading && (\n <div className=\"space-y-3 py-2\">\n {[...Array(3)].map((_, i) => (\n <div key={i} className=\"h-8 rounded-lg bg-muted animate-pulse\" />\n ))}\n </div>\n )}\n\n {/* Just paid — confirmation animation */}\n {!loading && isPaid && justPaid && (\n <div className=\"text-center py-8 space-y-2 animate-in fade-in zoom-in-95 duration-300\">\n <div className=\"flex h-14 w-14 mx-auto items-center justify-center rounded-full bg-success/10 animate-bounce\" style={{ animationDuration: '600ms', animationIterationCount: '2' }}>\n <Check className=\"h-7 w-7 text-success\" />\n </div>\n <p className=\"text-sm font-semibold text-success\">{t('agenda.payment.checkoutComplete')}</p>\n <p className=\"text-xs text-muted-foreground\">{formatCurrency(detail!.totalAmount)}</p>\n </div>\n )}\n\n {/* Invoice summary — shown after animation or when returning to an already-paid/pending booking */}\n {!loading && detail && detail.status !== 'none' && !justPaid && (\n <div className=\"space-y-3 animate-in fade-in duration-300\">\n {/* Movement rows with inline status badge */}\n {detail.movements.length > 0 ? (\n <div className=\"space-y-1.5\">\n {detail.movements.map((mov) => {\n const methodName = mov.paymentMethodTypeName\n const txKey = (methodName ?? '').toLowerCase().replace(/\\s+/g, '_')\n const Icon = TYPE_ICONS[txKey] ?? Banknote\n const iconColor = ICON_COLORS[txKey] ?? 'text-muted-foreground'\n const isMovPaid = mov.status === 'paid'\n const isPartial = mov.status === 'partial'\n const isOverdue = mov.status === 'overdue'\n\n return (\n <div key={mov.id} className=\"flex items-center gap-3 rounded-lg border px-3 py-2.5\">\n <Icon className={`h-4 w-4 shrink-0 ${isMovPaid ? iconColor : 'text-muted-foreground'}`} />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium truncate\">\n {methodName ?? '—'}\n {mov.cardBrand ? ` · ${mov.cardBrand}` : ''}\n {mov.cardInstallments && mov.cardInstallments > 1 ? ` ${mov.cardInstallments}x` : ''}\n </p>\n <p className=\"text-[10px] text-muted-foreground\">\n {mov.paymentDate ?? mov.dueDate}\n {detail.movements.length > 1 && mov.installmentNumber ? ` · ${t('agenda.payment.installment')} ${mov.installmentNumber}` : ''}\n </p>\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n {isMovPaid && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-success/10 px-2 py-0.5 text-[10px] font-medium text-success\">\n <Check className=\"h-2.5 w-2.5\" /> {t('agenda.payment.paid')}\n </span>\n )}\n {isPartial && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-warning/10 px-2 py-0.5 text-[10px] font-medium text-warning\">\n ! {formatCurrency(mov.paidAmount)}/{formatCurrency(mov.amount)}\n </span>\n )}\n {isOverdue && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-destructive/10 px-2 py-0.5 text-[10px] font-medium text-destructive\">\n ! {t('agenda.payment.overdue')}\n </span>\n )}\n {mov.status === 'pending' && (\n <span className=\"inline-flex items-center rounded-full bg-muted px-2 py-0.5 text-[10px] font-medium text-muted-foreground\">\n {t('agenda.payment.pending')}\n </span>\n )}\n <span className=\"text-sm font-semibold\">{formatCurrency(mov.paidAmount || mov.amount)}</span>\n </div>\n </div>\n )\n })}\n </div>\n ) : (\n <div className=\"flex items-center justify-between text-sm px-1\">\n <span className=\"text-muted-foreground\">{t('agenda.payment.total')}</span>\n <span className=\"font-semibold\">{formatCurrency(detail.totalAmount)}</span>\n </div>\n )}\n\n {/* Invoice ref + link */}\n <div className=\"flex items-center justify-between\">\n {detail.referenceNumber && (\n <span className=\"text-[10px] font-mono text-muted-foreground\">#{detail.referenceNumber}</span>\n )}\n <a\n href={`#/financial/receivables/detail/${detail.invoiceId}`}\n className=\"inline-flex items-center gap-1.5 text-xs font-medium text-primary hover:underline ml-auto\"\n >\n {t('agenda.payment.viewInvoice')}\n <ExternalLink className=\"h-3 w-3\" />\n </a>\n </div>\n </div>\n )}\n\n {/* Checkout view — only when no invoice exists yet */}\n {!loading && (!detail || detail.movements.length === 0) && (\n <>\n {/* Service summary */}\n {services && services.length > 0 && (\n <div>\n <p className=\"text-[11px] font-medium text-muted-foreground mb-2\">{t('agenda.payment.serviceSummary')}</p>\n <div className=\"space-y-0.5\">\n {services.map((svc, i) => (\n <div key={i} className=\"flex items-center justify-between text-sm py-1\">\n <span className=\"truncate\">{svc.name}</span>\n <span className=\"shrink-0 text-muted-foreground\">{formatCurrency(svc.price)}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Total */}\n <div className=\"flex items-center justify-between text-sm font-semibold pt-2 border-t\">\n <span>{t('agenda.payment.total')}</span>\n <span>{formatCurrency(orderTotal)}</span>\n </div>\n\n {/* Payment method grid */}\n <div>\n <p className=\"text-[11px] font-medium text-muted-foreground mb-2\">{t('agenda.payment.paymentMethod')}</p>\n {paymentTypes.length === 0 ? (\n <div className=\"rounded-lg border border-dashed border-input bg-muted/30 px-3 py-3 text-center\">\n <p className=\"text-xs text-muted-foreground\">{t('agenda.payment.noMethods')}</p>\n <a href=\"#/financial/settings\" className=\"mt-1.5 inline-block text-xs font-medium text-primary hover:underline\">\n {t('agenda.payment.configureMethods')} →\n </a>\n </div>\n ) : (\n <div className=\"grid grid-cols-3 gap-1.5\">\n {paymentTypes.map((pt) => {\n const ptTx = pt.transactionType ?? pt.name.toLowerCase().replace(/\\s+/g, '_')\n const Icon = TYPE_ICONS[ptTx] ?? Banknote\n const colorClass = TYPE_COLORS[ptTx] ?? TYPE_COLORS.cash\n const iconColor = ICON_COLORS[ptTx] ?? ICON_COLORS.cash\n const isActive = selectedTypeId === pt.id\n return (\n <button\n key={pt.id}\n type=\"button\"\n data-active={isActive}\n onClick={() => handleSelectType(pt.id)}\n className={`flex flex-col items-center gap-1 rounded-lg border p-2.5 text-[10px] font-medium transition-all ${colorClass}`}\n >\n <Icon className={`h-4 w-4 ${iconColor}`} />\n <span className=\"truncate w-full text-center\">{pt.name}</span>\n </button>\n )\n })}\n </div>\n )}\n </div>\n\n {/* Extra fields based on payment type */}\n {selectedTypeId && (\n <div className=\"space-y-3\">\n {/* Specific payment method (filtered by type) */}\n {filteredMethods.length > 0 && (\n <div>\n <label className=\"text-[11px] font-medium text-muted-foreground\">\n {needsCard ? t('agenda.payment.card') : t('agenda.payment.method')}\n </label>\n <select value={paymentMethodId} onChange={(e) => setPaymentMethodId(e.target.value)}\n className=\"w-full mt-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2.5 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-ring\">\n <option value=\"\">{t('agenda.payment.select')}</option>\n {filteredMethods.map((m) => <option key={m.id} value={m.id}>{m.name}</option>)}\n </select>\n </div>\n )}\n\n {/* Card brand + installments */}\n {needsCard && (\n <div className={`grid gap-2.5 ${needsCardInstallments ? 'grid-cols-2' : 'grid-cols-1'}`}>\n <div>\n <label className=\"text-[11px] font-medium text-muted-foreground\">{t('agenda.payment.cardBrand')}</label>\n <select value={cardBrand} onChange={(e) => setCardBrand(e.target.value)}\n className=\"w-full mt-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2.5 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-ring\">\n <option value=\"\">{t('agenda.payment.selectBrand')}</option>\n {['Visa', 'Mastercard', 'American Express', 'Elo', 'Hipercard', 'Diners Club'].map((b) => (\n <option key={b} value={b}>{b}</option>\n ))}\n </select>\n </div>\n {needsCardInstallments && (\n <div>\n <label className=\"text-[11px] font-medium text-muted-foreground\">{t('agenda.payment.cardInstallments')}</label>\n <select value={cardInstallments} onChange={(e) => setCardInstallments(Number(e.target.value))}\n className=\"w-full mt-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2.5 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-ring\">\n {Array.from({ length: 12 }, (_, i) => i + 1).map((n) => (\n <option key={n} value={n}>{n}x {n > 1 ? formatCurrency(orderTotal / n) : ''}</option>\n ))}\n </select>\n </div>\n )}\n </div>\n )}\n\n {/* Bank account */}\n {needsBank && bankAccounts.length > 0 && (\n <div>\n <label className=\"text-[11px] font-medium text-muted-foreground\">{t('agenda.payment.bankAccount')}</label>\n <select value={selectedBankId} onChange={(e) => setSelectedBankId(e.target.value)}\n className=\"w-full mt-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2.5 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-ring\">\n <option value=\"\">{t('agenda.payment.selectAccount')}</option>\n {bankAccounts.map((a) => (\n <option key={a.id} value={a.id}>{a.name}</option>\n ))}\n </select>\n </div>\n )}\n </div>\n )}\n\n {/* Confirm button */}\n <button\n type=\"button\"\n onClick={handleCheckout}\n disabled={processing || !selectedTypeId}\n className=\"w-full rounded-lg bg-primary border border-primary py-2.5 text-sm font-medium text-primary-foreground hover:bg-primary/90 shadow-button-primary active:shadow-button-inset disabled:opacity-40 transition-colors\"\n >\n {processing\n ? t('agenda.payment.checkingOut')\n : `${t('agenda.payment.checkout')} ${formatCurrency(orderTotal)}`\n }\n </button>\n </>\n )}\n </div>\n )\n\n if (inline) return content\n\n return createPortal(\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center transition-colors duration-200\"\n style={{ backgroundColor: visible ? 'rgba(0,0,0,0.5)' : 'rgba(0,0,0,0)' }}\n onClick={handleClose}\n >\n <div\n className=\"w-full max-w-md rounded-xl border bg-card shadow-2xl mx-4 transition-all duration-200 max-h-[90vh] overflow-y-auto\"\n style={{ opacity: visible ? 1 : 0, transform: visible ? 'scale(1) translateY(0)' : 'scale(0.95) translateY(8px)' }}\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"flex items-center justify-between px-5 py-4 border-b sticky top-0 bg-card z-10\">\n <h3 className=\"text-base font-semibold\">{t('agenda.payment.title')}</h3>\n <button onClick={handleClose} className=\"p-1 text-muted-foreground hover:text-foreground transition-colors\">\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n {content}\n </div>\n </div>,\n document.body,\n )\n}\n","// ---------------------------------------------------------------------------\n// Agenda Plugin — Pure TypeScript types\n// Zero dependencies. Maps to saas_core archetype tables.\n// ---------------------------------------------------------------------------\n\n// ============================================================\n// ENUMS / LITERALS\n// ============================================================\n\n/** Booking status lifecycle */\nexport type BookingStatus =\n | 'scheduled'\n | 'confirmed'\n | 'in_progress'\n | 'completed'\n | 'cancelled'\n | 'no_show'\n\n/** Confirmation outreach status */\nexport type ConfirmationStatus = 'pending' | 'sent' | 'confirmed' | 'declined'\n\n/** Booking type identifier — extensible via string literal union */\nexport type BookingTypeId = 'appointment' | 'task' | 'out_of_office' | 'block' | (string & {})\n\n/** Configuration for a booking type (event type) */\nexport interface BookingTypeConfig {\n id: BookingTypeId\n label: string\n icon: string\n color: string\n fields: {\n /** Free-text event title (maps to the booking's display name). Used by\n * simple / Google-Calendar-style events that have no client party. */\n title?: boolean\n client: boolean\n professional: boolean\n services: boolean\n location: boolean\n status: boolean\n }\n requiresServices: boolean\n requiresClient: boolean\n}\n\n// ============================================================\n// CORE ENTITIES\n// ============================================================\n\n/** A booking service line item (from saas_core.booking_items) */\nexport interface BookingService {\n id: string\n serviceId: string | null\n name: string\n durationMinutes: number\n price: number\n assigneeId: string | null\n}\n\n/** Calendar booking — the main entity rendered on the calendar (from v_bookings view on orders) */\nexport interface CalendarBooking {\n id: string\n tenantId: string\n kind: string\n /** Lifecycle stage: booked, invoiced, paid, etc. */\n stage?: string\n /** Financial direction: credit, debit, null */\n direction?: string | null\n startsAt: string\n endsAt: string | null\n status: BookingStatus\n notes: string | null\n /** In unified model, orderId === id (the booking IS the order) */\n orderId: string | null\n locationId: string | null\n metadata: Record<string, unknown>\n\n // Client (party)\n clientId: string | null\n clientName: string | null\n clientPhone: string | null\n clientEmail: string | null\n clientAvatarUrl: string | null\n\n // Professional (assignee)\n professionalId: string | null\n professionalName: string | null\n professionalAvatarUrl: string | null\n\n // Location\n locationName: string | null\n\n // Order totals\n orderTotal: number | null\n orderStatus: string | null\n /** Payment status from financial bridge (enriched at runtime) */\n paymentStatus?: import('./financial-bridge').BookingPaymentStatus\n\n // Aggregated services\n services: BookingService[] | null\n totalDurationMinutes: number | null\n\n createdAt: string\n updatedAt: string\n}\n\n/** Professional / staff resource for the calendar */\nexport interface Professional {\n id: string\n name: string\n avatarUrl: string | null\n locationId: string | null\n locationName: string | null\n isActive: boolean\n}\n\n/** Working hours schedule (from saas_core.schedules) */\nexport interface Schedule {\n id: string\n tenantId: string\n kind: string\n assigneeId: string | null\n locationId: string | null\n dayOfWeek: number | null\n specificDate: string | null\n startsAt: string\n endsAt: string\n isActive: boolean\n metadata: Record<string, unknown>\n}\n\n/** Available time slot */\nexport interface TimeSlot {\n start: string\n end: string\n}\n\n/** Confirmation record stored in booking metadata */\nexport interface ConfirmationRecord {\n channel: string\n sentAt: string\n status: ConfirmationStatus\n confirmedAt?: string\n}\n\n// ============================================================\n// STATUS CONFIGURATION\n// ============================================================\n\n/**\n * When a status is available for selection relative to the booking date.\n * - 'always' — any date (e.g. scheduled, confirmed, cancelled)\n * - 'today_or_past' — booking is today or earlier (e.g. completed, no_show)\n * - 'today_only' — booking is today (e.g. in_progress)\n */\nexport type StatusAvailability = 'always' | 'today_or_past' | 'today_only'\n\nexport interface StatusConfig {\n value: string\n label: string\n color: string\n /** When this status can be selected (default: 'always') */\n availableWhen?: StatusAvailability\n}\n\n/** Check if a status is available for a given booking date */\nexport function isStatusAvailable(status: StatusConfig, bookingStartsAt: string): boolean {\n const when = status.availableWhen ?? 'always'\n if (when === 'always') return true\n const bookingDate = bookingStartsAt.slice(0, 10)\n const today = new Date().toISOString().slice(0, 10)\n if (when === 'today_or_past') return bookingDate <= today\n if (when === 'today_only') return bookingDate === today\n return true\n}\n\n// ============================================================\n// MODAL TAB EXTENSION\n// ============================================================\n\n/** Props passed to every booking modal tab component */\nexport interface BookingModalTabProps {\n bookingId?: string\n clientId: string\n orderId: string | null\n services: Array<{ name: string; price: number; durationMinutes: number }>\n formatCurrency: (amount: number) => string\n onDataChange?: () => void\n}\n\n/** A tab registered in the booking edit modal */\nexport interface BookingModalTab {\n id: string\n label: string\n icon: string\n order: number\n component: React.ComponentType<BookingModalTabProps>\n visible?: (ctx: { mode: 'create' | 'edit'; clientId?: string; orderId?: string }) => boolean\n}\n\n// ============================================================\n// INPUT TYPES (create / mutate)\n// ============================================================\n\nexport interface CreateBookingInput {\n kind?: BookingTypeId\n clientId: string\n professionalId: string\n locationId?: string\n startsAt: string\n notes?: string\n /** Free-text event title for simple events (no client party). Maps to the\n * booking's display name (clientName in the read model). */\n title?: string\n services: CreateBookingServiceInput[]\n}\n\nexport interface CreateBookingServiceInput {\n serviceId: string\n name: string\n durationMinutes: number\n price: number\n assigneeId?: string\n}\n\nexport interface UpdateBookingInput {\n clientId?: string\n professionalId?: string\n locationId?: string\n startsAt?: string\n endsAt?: string\n status?: BookingStatus\n notes?: string\n /** Free-text event title for simple events (no client party). */\n title?: string\n services?: CreateBookingServiceInput[]\n}\n\nexport interface SaveScheduleInput {\n assigneeId: string\n locationId?: string\n dayOfWeek?: number\n specificDate?: string\n startsAt: string\n endsAt: string\n isActive?: boolean\n metadata?: Record<string, unknown>\n}\n\n// ============================================================\n// QUERY / FILTER TYPES\n// ============================================================\n\nexport interface BookingQuery {\n dateRange: { start: string; end: string }\n professionalIds?: string[]\n locationId?: string\n statuses?: string[]\n kind?: string\n}\n\nexport interface ConflictCheckParams {\n assigneeId: string\n startsAt: string\n endsAt: string\n excludeBookingId?: string\n}\n\nexport interface AvailableSlotsParams {\n assigneeId: string\n date: string\n durationMinutes: number\n slotInterval?: number\n}\n","import React, { useState, useEffect, useMemo, useRef } from 'react'\nimport { createPortal } from 'react-dom'\nimport { Clock, AlertTriangle, X, User, Briefcase, FileText, CircleDot, Plus, MapPin, Calendar, DollarSign, CheckSquare, Ban, Check, HandCoins } from 'lucide-react'\n\nconst BOOKING_TYPE_ICONS: Record<string, React.ElementType> = {\n Calendar, CheckSquare, Ban,\n}\nimport {\n Modal, ModalContent, ModalTitle,\n} from '@fayz-ai/ui'\nimport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from '@fayz-ai/ui'\nimport { cn } from '@fayz-ai/ui'\nimport { SearchCombobox, type ComboboxOption } from './SearchCombobox'\nimport { PersonLink } from '@fayz-ai/saas'\nimport { BookingPaymentPanel } from './BookingPaymentPanel'\nimport { CrudDetailPage } from '@fayz-ai/saas'\nimport { CrudFormPage } from '@fayz-ai/saas'\nimport { Button } from '@fayz-ai/ui'\nimport { useAgendaConfig, useAgendaProvider, useAgendaStore } from '../AgendaContext'\nimport { useTranslation } from '@fayz-ai/core'\nimport { getCurrentLocale } from '@fayz-ai/core'\nimport { isStatusAvailable } from '../types'\nimport type { CreateBookingInput, BookingTypeId } from '../types'\nimport type { ExternalBookingSource } from '../config'\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction fmtCurrency(amount: number, locale: string, code: string): string {\n return new Intl.NumberFormat(locale, { style: 'currency', currency: code }).format(amount)\n}\n\nfunction formatCompactDate(dateStr: string, locale: string): string {\n const d = new Date(dateStr + 'T00:00:00')\n return d.toLocaleDateString(locale === 'pt-BR' ? 'pt-BR' : 'en-US', {\n weekday: 'short', month: 'short', day: 'numeric',\n })\n}\n\ninterface ServiceItem { serviceId: string; name: string; durationMinutes: number; price: number }\ninterface CancellationReasonItem { id: string; label: string; requiresNotes?: boolean }\n\n// ---------------------------------------------------------------------------\n// Inline editable number — allows clearing, commits on blur/enter\n// ---------------------------------------------------------------------------\n\nfunction InlineNumber({ value, onChange, min = 0, step = 1, className, disabled, tooltip }: {\n value: number; onChange: (v: number) => void; min?: number; step?: number\n className?: string; disabled?: boolean; tooltip?: string\n}) {\n const [draft, setDraft] = useState(String(value))\n const [focused, setFocused] = useState(false)\n\n useEffect(() => { if (!focused) setDraft(String(value)) }, [value, focused])\n\n function commit() {\n setFocused(false)\n const v = parseFloat(draft)\n if (!isNaN(v) && v >= min) {\n onChange(v)\n } else {\n setDraft(String(value))\n }\n }\n\n const input = (\n <input\n type=\"text\"\n inputMode=\"decimal\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onFocus={(e) => { setFocused(true); e.target.select() }}\n onBlur={commit}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); commit() } }}\n disabled={disabled}\n className={cn(\n 'text-right text-[11px] text-muted-foreground bg-transparent border-b border-transparent hover:border-muted-foreground/40 focus:border-foreground focus:outline-none tabular-nums',\n className,\n )}\n />\n )\n\n if (!tooltip) return input\n\n return (\n <TooltipProvider delayDuration={400}>\n <Tooltip>\n <TooltipTrigger asChild>{input}</TooltipTrigger>\n <TooltipContent side=\"top\" className=\"text-xs\">{tooltip}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Custom Status Select\n// ---------------------------------------------------------------------------\n\nfunction StatusSelect({ value, onChange, statuses, bookingDate }: {\n value: string; onChange: (v: string) => void\n statuses: Array<{ value: string; label: string; color: string; availableWhen?: string }>\n bookingDate?: string\n}) {\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLDivElement>(null)\n const dropdownRef = useRef<HTMLDivElement>(null)\n const current = statuses.find((s) => s.value === value)\n\n useEffect(() => {\n if (!open) return\n const handler = (e: MouseEvent) => {\n const target = e.target as Node\n if (ref.current?.contains(target)) return\n if (dropdownRef.current?.contains(target)) return\n setOpen(false)\n }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [open])\n\n const btnRef = useRef<HTMLButtonElement>(null)\n const [dropRect, setDropRect] = useState<DOMRect | null>(null)\n\n function handleOpen() {\n if (btnRef.current) setDropRect(btnRef.current.getBoundingClientRect())\n setOpen((p) => !p)\n }\n\n return (\n <div ref={ref} className=\"relative flex-1\">\n <button ref={btnRef} type=\"button\" onClick={handleOpen}\n className=\"flex items-center gap-2 rounded-md px-2 py-1.5 text-sm hover:bg-muted/30 transition-colors text-left w-full\">\n {current && <>\n <span className=\"h-2 w-2 rounded-full shrink-0\" style={{ backgroundColor: current.color }} />\n <span>{current.label}</span>\n </>}\n <svg className=\"ml-auto h-3 w-3 text-muted-foreground shrink-0\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </button>\n {open && dropRect && createPortal(\n <div ref={dropdownRef} data-modal-passthrough style={{ position: 'fixed', left: dropRect.left, top: dropRect.bottom + 4, width: dropRect.width, zIndex: 9999, pointerEvents: 'auto' }}\n className=\"fayz-glass-surface rounded-lg border bg-popover shadow-lg py-1 animate-in fade-in zoom-in-95 duration-100\">\n {statuses.map((s: any) => {\n const available = !bookingDate || isStatusAvailable(s as any, bookingDate)\n return (\n <button key={s.value} type=\"button\" disabled={!available}\n onClick={() => { if (available) { onChange(s.value); setOpen(false) } }}\n className={`flex w-full items-center gap-2.5 px-3 py-1.5 text-sm transition-colors ${\n !available ? 'opacity-30 cursor-not-allowed' : s.value === value ? 'bg-muted/30' : 'hover:bg-muted/50'\n }`}>\n <span className=\"h-2 w-2 rounded-full shrink-0\" style={{ backgroundColor: s.color }} />\n <span>{s.label}</span>\n </button>\n )\n })}\n </div>,\n document.body,\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Professional Select — compact inline dropdown with initials\n// ---------------------------------------------------------------------------\n\nfunction ProfessionalSelect({ value, onChange, professionals }: {\n value: string; onChange: (v: string) => void\n professionals: Array<{ id: string; name: string }>\n}) {\n const t = useTranslation()\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLDivElement>(null)\n const current = professionals.find((p) => p.id === value)\n\n useEffect(() => {\n if (!open) return\n const handler = (e: MouseEvent) => { if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false) }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [open])\n\n return (\n <div ref={ref} className=\"relative flex-1\">\n <button type=\"button\" onClick={() => setOpen((p) => !p)}\n className=\"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm hover:bg-muted/30 transition-colors text-left\">\n {current ? (\n <span>{current.name}</span>\n ) : (\n <span className=\"text-muted-foreground\">{t('agenda.appointment.selectProfessional')}</span>\n )}\n <svg className=\"ml-auto h-3 w-3 text-muted-foreground shrink-0\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </button>\n {open && (\n <div className=\"fayz-glass-surface absolute top-full left-0 right-0 z-50 mt-1 rounded-lg border bg-popover shadow-lg py-1 animate-in fade-in zoom-in-95 duration-100\">\n {professionals.map((p: any) => (\n <button key={p.id} type=\"button\"\n onClick={() => { onChange(p.id); setOpen(false) }}\n className={`flex w-full items-center gap-2 px-3 py-1.5 text-sm hover:bg-muted/50 transition-colors ${p.id === value ? 'bg-muted/30' : ''}`}>\n <span>{p.name}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Location Select — compact inline dropdown\n// ---------------------------------------------------------------------------\n\nfunction LocationSelect({ value, onChange, locations }: {\n value: string; onChange: (v: string) => void\n locations: Array<{ id: string; name: string }>\n}) {\n const t = useTranslation()\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLDivElement>(null)\n const current = locations.find((l) => l.id === value)\n\n useEffect(() => {\n if (!open) return\n const handler = (e: MouseEvent) => { if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false) }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [open])\n\n return (\n <div ref={ref} className=\"relative flex-1\">\n <button type=\"button\" onClick={() => setOpen((p) => !p)}\n className=\"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm hover:bg-muted/30 transition-colors text-left\">\n {current ? (\n <span>{current.name}</span>\n ) : (\n <span className=\"text-muted-foreground\">{t('agenda.appointment.selectLocation')}</span>\n )}\n <svg className=\"ml-auto h-3 w-3 text-muted-foreground shrink-0\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </button>\n {open && (\n <div className=\"fayz-glass-surface absolute top-full left-0 right-0 z-50 mt-1 rounded-lg border bg-popover shadow-lg py-1 animate-in fade-in zoom-in-95 duration-100 max-h-48 overflow-y-auto\">\n {locations.map((l: any) => (\n <button key={l.id} type=\"button\"\n onClick={() => { onChange(l.id); setOpen(false) }}\n className={`flex w-full items-center gap-2 px-3 py-1.5 text-sm hover:bg-muted/50 transition-colors ${l.id === value ? 'bg-muted/30' : ''}`}>\n <span>{l.name}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Appointment Modal — Google Calendar-inspired compact layout\n// ---------------------------------------------------------------------------\n\ninterface Props {\n open: boolean\n mode: 'create' | 'edit'\n bookingId?: string\n prefill?: Partial<CreateBookingInput> & { endsAt?: string }\n initialTab?: string\n externalSource?: ExternalBookingSource\n onClose: () => void\n onCreated?: (bookingId: string, source?: ExternalBookingSource) => void\n}\n\nexport function AppointmentModal({ open, mode, bookingId, prefill, initialTab, externalSource, onClose, onCreated }: Props) {\n const t = useTranslation()\n const locale = getCurrentLocale()\n const config = useAgendaConfig()\n const provider = useAgendaProvider()\n const initialSnapshot = useRef<string>('')\n const createBooking = useAgendaStore((s) => s.createBooking)\n const updateBooking = useAgendaStore((s) => s.updateBooking)\n const deleteBooking = useAgendaStore((s) => s.deleteBooking)\n const fetchBookings = useAgendaStore((s) => s.fetchBookings)\n const agendaDateRange = useAgendaStore((s) => s.dateRange)\n const professionals = useAgendaStore((s) => s.professionals)\n const storeLocations = useAgendaStore((s) => s.locations)\n\n // --- State ---\n // Default to the first configured booking type (e.g. 'event' in simple mode,\n // 'appointment' otherwise) so single-type agendas resolve their type cleanly.\n const defaultBookingType = (config.bookingTypes[0]?.id ?? 'appointment') as BookingTypeId\n const [loading, setLoading] = useState(mode === 'edit')\n const [bookingType, setBookingType] = useState<BookingTypeId>(prefill?.kind ?? defaultBookingType)\n const [title, setTitle] = useState('')\n const [clientId, setClientId] = useState(prefill?.clientId ?? '')\n const [clientSearch, setClientSearch] = useState('')\n const [clientPhone, setClientPhone] = useState('')\n const [professionalId, setProfessionalId] = useState(prefill?.professionalId ?? '')\n const [locationId, setLocationId] = useState(prefill?.locationId ?? '')\n const [services, setServices] = useState<ServiceItem[]>([])\n const [serviceSearch, setServiceSearch] = useState('')\n const [date, setDate] = useState(() => {\n if (prefill?.startsAt) return prefill.startsAt.slice(0, 10)\n return new Date().toISOString().slice(0, 10)\n })\n const [startTime, setStartTime] = useState(() => {\n if (prefill?.startsAt) {\n const d = new Date(prefill.startsAt)\n return `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`\n }\n return '09:00'\n })\n const [status, setStatus] = useState('scheduled')\n const [notes, setNotes] = useState('')\n const [showNotes, setShowNotes] = useState(false)\n const [saving, setSaving] = useState(false)\n const [conflict, setConflict] = useState(false)\n const [quickCreate, setQuickCreate] = useState(false)\n const [newClientName, setNewClientName] = useState('')\n const [newClientPhone, setNewClientPhone] = useState('')\n const [newClientEmail, setNewClientEmail] = useState('')\n const [creatingClient, setCreatingClient] = useState(false)\n const [clientOptions, setClientOptions] = useState<ComboboxOption[]>([])\n const [clientSearching, setClientSearching] = useState(false)\n const [serviceOptions, setServiceOptions] = useState<ComboboxOption[]>([])\n const [initialServiceOptions, setInitialServiceOptions] = useState<ComboboxOption[]>([])\n const [editingDate, setEditingDate] = useState(false)\n const [editingTime, setEditingTime] = useState(false)\n const [confirmingDelete, setConfirmingDelete] = useState(false)\n const [deleting, setDeleting] = useState(false)\n const [editOrderId, setEditOrderId] = useState<string | null>(null)\n const [editOrderTotal, setEditOrderTotal] = useState(0)\n const [editPaymentStatus, setEditPaymentStatus] = useState<import('../financial-bridge').BookingPaymentStatus>('none')\n const [paymentStatusLoading, setPaymentStatusLoading] = useState(false)\n const [modalTab, setModalTab] = useState<'appointment' | 'client' | 'financial'>('appointment')\n const [clientData, setClientData] = useState<Record<string, any> | null>(null)\n const [clientDataLoading, setClientDataLoading] = useState(false)\n const [clientEditing, setClientEditing] = useState(false)\n const [cancellationReasons, setCancellationReasons] = useState<CancellationReasonItem[]>([])\n const [cancellationReasonId, setCancellationReasonId] = useState('')\n const [cancellationNotes, setCancellationNotes] = useState('')\n const [cancellationReasonsLoading, setCancellationReasonsLoading] = useState(false)\n\n // Active booking type config\n const activeType = config.bookingTypes.find((bt) => bt.id === bookingType) ?? config.bookingTypes[0]\n\n // Reset form when modal opens\n useEffect(() => {\n if (!open) return\n setClientId(prefill?.clientId ?? ''); setClientSearch(''); setClientPhone('')\n setProfessionalId(prefill?.professionalId ?? ''); setLocationId(prefill?.locationId ?? ''); setServices([])\n setServiceSearch(''); setNotes(''); setStatus('scheduled'); setShowNotes(false)\n setConflict(false); setLoading(mode === 'edit')\n setQuickCreate(false); setNewClientName(''); setNewClientPhone(''); setNewClientEmail(''); setCreatingClient(false)\n setBookingType(prefill?.kind ?? defaultBookingType); setTitle('')\n setEditingDate(false); setEditingTime(false); setConfirmingDelete(false); setDeleting(false)\n setEditOrderId(null); setEditOrderTotal(0); setEditPaymentStatus('none'); setPaymentStatusLoading(false)\n setClientData(null); setClientDataLoading(false); setClientEditing(false)\n setCancellationReasonId(''); setCancellationNotes(''); setCancellationReasonsLoading(false)\n setModalTab((initialTab as 'appointment' | 'client' | 'financial') || 'appointment')\n if (!prefill?.professionalId && professionals.length === 1) setProfessionalId(professionals[0].id)\n setDate(() => {\n if (prefill?.startsAt) return prefill.startsAt.slice(0, 10)\n return new Date().toISOString().slice(0, 10)\n })\n setStartTime(() => {\n if (prefill?.startsAt) {\n const d = new Date(prefill.startsAt)\n return `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`\n }\n return '09:00'\n })\n }, [open])\n\n // Edit: load existing\n useEffect(() => {\n if (!open || mode !== 'edit' || !bookingId) return\n setLoading(true)\n provider.getBookingById(bookingId).then((b) => {\n if (!b) { setLoading(false); return }\n setBookingType((b.kind as BookingTypeId) ?? defaultBookingType)\n setTitle(b.clientName ?? '')\n setClientId(b.clientId ?? ''); setClientSearch(b.clientName ?? '')\n setProfessionalId(b.professionalId ?? ''); setLocationId(b.locationId ?? '')\n setDate(b.startsAt.slice(0, 10))\n const d = new Date(b.startsAt)\n setStartTime(`${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`)\n setStatus(b.status); setNotes(b.notes ?? '')\n if (b.notes) setShowNotes(true)\n if (b.services) setServices(b.services.map((s: any) => ({\n serviceId: s.serviceId ?? '', name: s.name, durationMinutes: s.durationMinutes, price: s.price,\n })))\n setEditOrderId(b.orderId ?? null)\n setEditOrderTotal(b.orderTotal ?? 0)\n setEditPaymentStatus(b.paymentStatus ?? 'none')\n // Save initial snapshot for dirty check\n const svcSnap = b.services ? b.services.map((s: any) => ({ id: s.serviceId ?? '', dur: s.durationMinutes, price: s.price })) : []\n initialSnapshot.current = JSON.stringify({\n title: b.clientName ?? '',\n clientId: b.clientId ?? '', professionalId: b.professionalId ?? '', locationId: b.locationId ?? '',\n date: b.startsAt.slice(0, 10),\n startTime: `${String(new Date(b.startsAt).getHours()).padStart(2, '0')}:${String(new Date(b.startsAt).getMinutes()).padStart(2, '0')}`,\n status: b.status, notes: b.notes ?? '', cancellationReasonId: '', cancellationNotes: '', services: svcSnap,\n })\n setLoading(false)\n // Resolve payment status from bridge if available\n if (b.orderId && config.financialBridge) {\n setPaymentStatusLoading(true)\n config.financialBridge.resolvePaymentStatuses([b.orderId]).then((map) => {\n const summary = map.get(b.orderId!)\n if (summary) {\n setEditPaymentStatus(summary.status)\n setEditOrderTotal(summary.totalAmount)\n }\n }).catch(() => {}).finally(() => setPaymentStatusLoading(false))\n }\n }).catch(() => setLoading(false))\n }, [open, mode, bookingId])\n\n // Fetch client data when client tab is opened\n useEffect(() => {\n if (modalTab !== 'client' || !clientId || !config.contactLookup || clientData) return\n setClientDataLoading(true)\n config.contactLookup.getById(clientId).then((result) => {\n setClientData(result?.data ?? null)\n setClientDataLoading(false)\n }).catch(() => setClientDataLoading(false))\n }, [modalTab, clientId])\n\n useEffect(() => {\n if (!open || status !== 'cancelled' || !config.cancellationDetails || cancellationReasons.length > 0) return\n setCancellationReasonsLoading(true)\n config.cancellationDetails.listReasons()\n .then((reasons) => setCancellationReasons(reasons))\n .catch(() => setCancellationReasons([]))\n .finally(() => setCancellationReasonsLoading(false))\n }, [open, status, config.cancellationDetails, cancellationReasons.length])\n\n // Fetch initial service list when modal opens\n useEffect(() => {\n if (!open || !config.serviceLookup) return\n const lookup = config.serviceLookup\n const fetch = lookup.list ? () => lookup.list!() : () => lookup.search('')\n fetch().then((results) => {\n const opts = results.map((r: any) => ({ id: r.id, label: r.label, subtitle: r.subtitle, price: r.price, data: r.data }))\n setInitialServiceOptions(opts)\n }).catch(() => setInitialServiceOptions([]))\n }, [open])\n\n // Search effects\n useEffect(() => {\n if (!config.contactLookup || clientSearch.length < 1 || clientId) { setClientOptions([]); setClientSearching(false); return }\n setClientSearching(true)\n const timer = setTimeout(async () => {\n try {\n const results = await config.contactLookup!.search(clientSearch)\n setClientOptions(results.map((r: any) => ({ id: r.id, label: r.label, subtitle: r.subtitle, price: r.price, data: r.data })))\n } catch { setClientOptions([]) }\n setClientSearching(false)\n }, 250)\n return () => clearTimeout(timer)\n }, [clientSearch, clientId])\n\n useEffect(() => {\n if (!config.serviceLookup || serviceSearch.length < 1) { setServiceOptions([]); return }\n const timer = setTimeout(async () => {\n try {\n const results = await config.serviceLookup!.search(serviceSearch)\n setServiceOptions(results.map((r: any) => ({ id: r.id, label: r.label, subtitle: r.subtitle, price: r.price, data: r.data })))\n } catch { setServiceOptions([]) }\n }, 250)\n return () => clearTimeout(timer)\n }, [serviceSearch])\n\n // Computed\n const serviceDuration = services.reduce((sum, s) => sum + s.durationMinutes, 0)\n const selectionDuration = useMemo(() => {\n if (!prefill?.startsAt || !prefill?.endsAt) return 0\n return Math.round((new Date(prefill.endsAt).getTime() - new Date(prefill.startsAt).getTime()) / 60000)\n }, [prefill?.startsAt, prefill?.endsAt])\n const totalDuration = serviceDuration > 0 ? serviceDuration : selectionDuration\n const totalPrice = services.reduce((sum, s) => sum + s.price, 0)\n const { currency } = config\n\n const endTime = useMemo(() => {\n const [h, m] = startTime.split(':').map(Number)\n const total = h * 60 + m + totalDuration\n return `${String(Math.floor(total / 60) % 24).padStart(2, '0')}:${String(total % 60).padStart(2, '0')}`\n }, [startTime, totalDuration])\n\n // Conflict check\n useEffect(() => {\n if (!professionalId || totalDuration === 0) { setConflict(false); return }\n const timer = setTimeout(() => {\n provider.checkConflict({\n assigneeId: professionalId, startsAt: `${date}T${startTime}:00`, endsAt: `${date}T${endTime}:00`, excludeBookingId: bookingId,\n }).then(setConflict).catch(() => setConflict(false))\n }, 300)\n return () => clearTimeout(timer)\n }, [professionalId, date, startTime, endTime, bookingId])\n\n function selectClient(opt: ComboboxOption) {\n setClientId(opt.id); setClientSearch(opt.label); setClientOptions([])\n setClientPhone((opt.data?.phone as string) ?? '')\n }\n function addService(opt: ComboboxOption) {\n const duration = (opt.data?.duration_minutes as number) || 60\n setServices((p) => [...p, { serviceId: opt.id, name: opt.label, durationMinutes: duration, price: opt.price ?? 0 }])\n setServiceSearch(''); setServiceOptions([])\n }\n function removeService(idx: number) { setServices((p) => p.filter((_, i) => i !== idx)) }\n\n async function handleSubmit(e: React.FormEvent) {\n e.preventDefault()\n if (!canSubmit) return\n setSaving(true)\n try {\n const startsAt = new Date(`${date}T${startTime}:00`).toISOString()\n if (mode === 'create') {\n const newBooking = await createBooking({ kind: bookingType, clientId, professionalId, locationId: locationId || undefined, startsAt, notes: notes || undefined,\n title: activeType.fields.title ? title.trim() : undefined,\n services: services.map((s: any) => ({ serviceId: s.serviceId, name: s.name, durationMinutes: s.durationMinutes, price: s.price })) })\n onClose()\n onCreated?.(newBooking.id, externalSource)\n } else if (bookingId) {\n await updateBooking(bookingId, {\n clientId, professionalId, locationId: locationId || undefined, startsAt, notes: notes || undefined, status: status as any,\n title: activeType.fields.title ? title.trim() : undefined,\n services: services.map((s: any) => ({ serviceId: s.serviceId, name: s.name, durationMinutes: s.durationMinutes, price: s.price })),\n })\n if (status === 'cancelled' && config.cancellationDetails && cancellationReasonId) {\n await config.cancellationDetails.saveCancellationDetails({\n bookingId,\n reasonId: cancellationReasonId,\n notes: cancellationNotes.trim() || undefined,\n cancelledAt: new Date().toISOString(),\n })\n }\n onClose()\n }\n } catch { /* toast */ }\n setSaving(false)\n }\n\n async function handleDelete() {\n if (!bookingId) return\n setDeleting(true)\n try { await deleteBooking(bookingId); onClose() } catch { /* toast */ }\n setDeleting(false)\n }\n\n const isPaidBooking = editPaymentStatus === 'paid'\n const selectedCancellationReason = cancellationReasons.find((reason) => reason.id === cancellationReasonId)\n const needsCancellationReason = mode === 'edit' && status === 'cancelled' && !!config.cancellationDetails\n const needsCancellationNotes = needsCancellationReason && !!selectedCancellationReason?.requiresNotes\n\n // Dirty check — only enable Update when something changed\n const formSnapshot = useMemo(() =>\n JSON.stringify({ title, clientId, professionalId, locationId, date, startTime, status, notes, cancellationReasonId, cancellationNotes, services: services.map((s: any) => ({ id: s.serviceId, dur: s.durationMinutes, price: s.price })) }),\n [title, clientId, professionalId, locationId, date, startTime, status, notes, cancellationReasonId, cancellationNotes, services]\n )\n const isDirty = mode === 'create' || formSnapshot !== initialSnapshot.current\n\n const canSubmit = (\n (!activeType.fields.title || title.trim()) &&\n (!activeType.requiresClient || clientId) &&\n (!activeType.fields.professional || professionalId) &&\n (!activeType.requiresServices || services.length > 0) &&\n (!needsCancellationReason || !!cancellationReasonId) &&\n (!needsCancellationNotes || !!cancellationNotes.trim()) &&\n !conflict && !saving\n )\n\n const showTabs = config.bookingTypes.length > 1\n\n return (\n <Modal open={open} onOpenChange={(v) => { if (!v) onClose() }}>\n <ModalContent size=\"lg\" noPadding>\n\n {/* ═══ TOP — type tabs + date/time ═══ */}\n <div className=\"px-5 pt-4 pb-3 shrink-0 space-y-3\">\n <ModalTitle className=\"sr-only\">\n {mode === 'create' ? t('agenda.appointment.new') : t('agenda.appointment.edit')}\n </ModalTitle>\n\n {/* Booking type tabs (create) or section tabs (edit) */}\n {showTabs && mode === 'create' ? (\n <div className=\"flex gap-1 border-b fayz-glass-divider\">\n {config.bookingTypes.map((bt) => {\n const label = t(`agenda.bookingType.${bt.id}`) || bt.label\n const isActive = bookingType === bt.id\n const BtIcon = BOOKING_TYPE_ICONS[bt.icon] ?? Calendar\n return (\n <button key={bt.id} type=\"button\" onClick={() => setBookingType(bt.id)}\n className={`relative flex items-center gap-1.5 pb-2 px-2 text-xs font-medium transition-colors ${\n isActive ? 'text-foreground' : 'text-muted-foreground hover:text-foreground'\n }`}>\n <BtIcon className=\"h-3.5 w-3.5\" />\n {label}\n {isActive && (\n <span className=\"absolute bottom-0 left-0 right-0 h-0.5 rounded-full bg-foreground\" />\n )}\n </button>\n )\n })}\n </div>\n ) : mode === 'edit' && (\n (config.clientEntityDef && clientId) || (config.modules.financial && editOrderId) ? (\n <div className=\"flex gap-1 border-b fayz-glass-divider\">\n {([\n { id: 'appointment' as const, label: t(`agenda.bookingType.${bookingType}`) || activeType.label, icon: Calendar, show: true },\n { id: 'client' as const, label: t('agenda.appointment.clientTab'), icon: User, show: !!config.clientEntityDef && !!clientId },\n { id: 'financial' as const, label: t('agenda.payment.title'), icon: DollarSign, show: config.modules.financial && !!editOrderId },\n ]).filter((tab) => tab.show).map((tab) => {\n const isActive = modalTab === tab.id\n return (\n <button key={tab.id} type=\"button\" onClick={() => setModalTab(tab.id)}\n className={`relative flex items-center gap-1.5 pb-2 px-2 text-xs font-medium transition-colors ${\n isActive ? 'text-foreground' : 'text-muted-foreground hover:text-foreground'\n }`}>\n <tab.icon className=\"h-3.5 w-3.5\" />\n {tab.label}\n {tab.id === 'financial' && editPaymentStatus === 'paid' && (\n <span className=\"h-1.5 w-1.5 rounded-full bg-success\" />\n )}\n {tab.id === 'financial' && editPaymentStatus !== 'paid' && (\n (editPaymentStatus !== 'none' || (totalPrice > 0 && date <= new Date().toISOString().slice(0, 10)))\n ) && (\n <span className=\"h-1.5 w-1.5 rounded-full bg-warning\" />\n )}\n {isActive && (\n <span className=\"absolute bottom-0 left-0 right-0 h-0.5 rounded-full bg-foreground\" />\n )}\n </button>\n )\n })}\n </div>\n ) : (\n <h2 className=\"text-sm font-semibold\">\n {t(`agenda.bookingType.${bookingType}`) || activeType.label}\n </h2>\n )\n )}\n\n {/* Date/time + professional row — hidden on financial tab */}\n {modalTab === 'appointment' && (\n <>\n <div className=\"flex items-center gap-3\">\n <Clock className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <div className=\"flex items-center gap-1.5 text-sm flex-1 min-w-0\">\n {editingDate ? (\n <input type=\"date\" value={date} autoFocus\n onChange={(e) => { setDate(e.target.value); setEditingDate(false) }}\n onBlur={() => setEditingDate(false)}\n className=\"bg-transparent text-sm font-medium focus:outline-none border-b border-foreground w-auto shrink-0\" />\n ) : (\n <button type=\"button\" onClick={() => setEditingDate(true)}\n className=\"px-0.5 py-0.5 font-medium border-b border-transparent hover:border-foreground transition-colors shrink-0\">\n {formatCompactDate(date, locale)}\n </button>\n )}\n {editingTime ? (\n <input type=\"time\" value={startTime} autoFocus\n onChange={(e) => { if (e.target.value) { setStartTime(e.target.value); setEditingTime(false) } }}\n onBlur={() => setEditingTime(false)}\n className=\"bg-transparent text-xs text-muted-foreground focus:outline-none border-b border-foreground w-auto shrink-0\" />\n ) : (\n <button type=\"button\" onClick={() => setEditingTime(true)}\n className=\"px-0.5 py-0.5 text-xs text-muted-foreground border-b border-transparent hover:border-foreground transition-colors shrink-0\">\n {startTime}\n </button>\n )}\n <span className=\"text-[11px] text-muted-foreground/60\">—</span>\n <span className=\"text-[11px] text-muted-foreground/60\">{endTime}</span>\n\n {/* Professional — right-aligned on the same row */}\n {activeType.fields.professional && (\n <div className=\"ml-auto shrink-0\">\n <ProfessionalSelect value={professionalId} onChange={setProfessionalId} professionals={professionals} />\n </div>\n )}\n </div>\n </div>\n\n {conflict && (\n <div className=\"flex items-center gap-2 rounded-lg bg-destructive/10 px-3 py-1.5 text-xs text-destructive\">\n <AlertTriangle className=\"h-3.5 w-3.5 shrink-0\" />\n {t('agenda.appointment.conflict')}\n </div>\n )}\n </>\n )}\n </div>\n\n {/* ═══ BODY ═══ */}\n <div className=\"flex flex-col flex-1 min-h-0 overflow-hidden\">\n\n {/* Client tab content — reuses the same CrudDetailPage as /clients/:id */}\n {modalTab === 'client' && clientId && config.clientEntityDef && (\n <div className=\"flex-1 overflow-y-auto px-5 py-4\">\n {clientDataLoading ? (\n <div className=\"space-y-3 py-2\">\n {[...Array(4)].map((_, i) => (\n <div key={i} className=\"h-8 rounded-lg bg-muted animate-pulse\" />\n ))}\n </div>\n ) : clientData ? (\n clientEditing ? (\n <CrudFormPage\n embedded\n entityDef={config.clientEntityDef}\n mode=\"edit\"\n initialData={clientData}\n namePlural=\"\"\n onCancel={() => setClientEditing(false)}\n onSubmit={async (data) => {\n try {\n const { getSupabaseClientOptional } = await import('@fayz-ai/core')\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return\n const dbData: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(data)) {\n dbData[k.replace(/[A-Z]/g, (m) => '_' + m.toLowerCase())] = v\n }\n await supabase.schema('saas_core').from('persons').update(dbData).eq('id', clientId)\n setClientData({ ...clientData, ...data })\n setClientEditing(false)\n } catch { /* toast */ }\n }}\n />\n ) : (\n <CrudDetailPage\n embedded\n entityDef={config.clientEntityDef}\n item={clientData}\n namePlural=\"\"\n basePath=\"\"\n onBack={() => setModalTab('appointment')}\n onEdit={() => setClientEditing(true)}\n />\n )\n ) : (\n <p className=\"text-sm text-muted-foreground py-4 text-center\">{t('agenda.appointment.noClientData')}</p>\n )}\n </div>\n )}\n\n {/* Financial tab content */}\n {modalTab === 'financial' && editOrderId && config.financialBridge && (\n <div className=\"flex-1 overflow-y-auto\">\n <BookingPaymentPanel\n orderId={editOrderId}\n orderTotal={editOrderTotal}\n services={services.map((s: any) => ({ name: s.name, price: s.price, durationMinutes: s.durationMinutes }))}\n formatCurrency={(v) => fmtCurrency(v, currency.locale, currency.code)}\n inline\n onClose={() => setModalTab('appointment')}\n onPaymentChange={() => {\n config.financialBridge!.getPaymentDetail(editOrderId).then((d) => {\n if (d) { setEditPaymentStatus(d.status); setEditOrderTotal(d.totalAmount) }\n }).catch(() => {})\n // Propagate to the calendar card + popover badge (booking.paymentStatus\n // is ledger-derived) so they update without a page refresh.\n if (agendaDateRange.start) fetchBookings(agendaDateRange)\n }}\n />\n </div>\n )}\n\n {/* Appointment tab content */}\n <form onSubmit={handleSubmit} className=\"flex flex-col flex-1 min-h-0 overflow-hidden\" style={{ display: modalTab === 'appointment' ? undefined : 'none' }}>\n <div className=\"border-t fayz-glass-divider px-5 py-3 space-y-1 flex-1 overflow-y-auto\">\n\n {/* Loading skeleton */}\n {loading && (\n <div className=\"space-y-2 py-2\">\n {[...Array(4)].map((_, i) => (\n <div key={i} className=\"flex items-center gap-3 py-1.5\">\n <div className=\"h-4 w-4 rounded bg-muted animate-pulse shrink-0\" />\n <div className=\"h-8 flex-1 rounded-lg bg-muted animate-pulse\" />\n </div>\n ))}\n </div>\n )}\n\n {!loading && <>\n\n {/* Title — free-text event name (simple / Google-Calendar-style events) */}\n {activeType.fields.title && (\n <div className=\"flex items-center gap-3 py-1\">\n <Calendar className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <input type=\"text\" value={title} onChange={(e) => setTitle(e.target.value)}\n placeholder={t('agenda.appointment.addTitle')} autoFocus={mode === 'create'}\n className=\"w-full flex-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2.5 py-1.5 text-sm font-medium focus:outline-none focus:ring-2 focus:ring-ring\" />\n </div>\n )}\n\n {/* Client */}\n {activeType.fields.client && (\n <div className=\"flex items-center gap-3 py-1\">\n <User className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <div className=\"flex-1\">\n {clientId && !quickCreate ? (\n <div className=\"flex items-center gap-2 rounded-md bg-muted/30 px-2.5 py-1.5 text-sm\">\n <PersonLink personId={clientId} name={clientSearch} size=\"default\" className=\"flex-1 min-w-0\" />\n {clientPhone && <span className=\"text-[10px] text-muted-foreground shrink-0\">{clientPhone}</span>}\n {!isPaidBooking && (\n <button type=\"button\" onClick={() => { setClientId(''); setClientSearch(''); setClientPhone('') }}\n className=\"p-0.5 text-muted-foreground hover:text-destructive shrink-0\">\n <X className=\"h-3 w-3\" />\n </button>\n )}\n </div>\n ) : !quickCreate ? (\n <SearchCombobox\n value={clientSearch}\n onChange={(v) => { setClientSearch(v); setClientId('') }}\n onSelect={selectClient}\n options={clientOptions}\n loading={clientSearching}\n placeholder={t('agenda.appointment.searchClient')}\n allowCreate\n createLabel={t('agenda.appointment.newClient')}\n onCreateNew={(name) => { setQuickCreate(true); setNewClientName(name); setNewClientPhone(''); setNewClientEmail('') }}\n minimal\n inlineLabel={t('agenda.appointment.addClient')}\n />\n ) : (\n <div className=\"rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] p-2.5 space-y-2\">\n <div className=\"flex items-center gap-2\">\n <input type=\"text\" value={newClientName} onChange={(e) => setNewClientName(e.target.value)}\n placeholder={t('agenda.appointment.name')} className=\"flex-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2.5 py-1.5 text-sm font-medium focus:outline-none focus:ring-2 focus:ring-ring\" autoFocus />\n <button type=\"button\" onClick={() => setQuickCreate(false)}\n className=\"p-1 text-muted-foreground hover:text-foreground shrink-0\"><X className=\"h-3.5 w-3.5\" /></button>\n </div>\n <div className=\"grid grid-cols-2 gap-2\">\n <input type=\"tel\" value={newClientPhone} onChange={(e) => setNewClientPhone(e.target.value)}\n placeholder={t('agenda.appointment.phone')} className=\"rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2.5 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-ring\" />\n <input type=\"email\" value={newClientEmail} onChange={(e) => setNewClientEmail(e.target.value)}\n placeholder={t('agenda.appointment.emailOptional')} className=\"rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2.5 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-ring\" />\n </div>\n <button type=\"button\" disabled={creatingClient || !newClientName.trim()}\n onClick={async () => {\n setCreatingClient(true)\n try {\n const { getSupabaseClientOptional } = await import('@fayz-ai/core')\n const { getAgendaTenantId } = await import('../lib/tenant')\n const supabase = getSupabaseClientOptional() as any\n const tenantId = getAgendaTenantId()\n if (!supabase || !tenantId) throw new Error('Not initialized')\n\n // 1. Insert into saas_core.persons (archetype table)\n const { data: personRow, error: personError } = await supabase.schema('saas_core').from('persons').insert({\n tenant_id: tenantId, kind: config.clientKind, name: newClientName.trim(),\n phone: newClientPhone.trim() || null, email: newClientEmail.trim() || null,\n }).select('id, name').single()\n if (personError) throw personError\n\n // 2. Insert into public.clients (project extension table)\n const { error: clientError } = await supabase.from('clients').insert({\n person_id: personRow.id, tenant_id: tenantId,\n })\n if (clientError) {\n // Rollback person if extension insert fails\n await supabase.schema('saas_core').from('persons').delete().eq('id', personRow.id)\n throw clientError\n }\n\n setClientId(personRow.id); setClientSearch(personRow.name); setQuickCreate(false)\n } catch (err: any) {\n const { toast } = await import('@fayz-ai/ui')\n toast.error(t('agenda.appointment.createClientFailed'), { description: err?.message })\n }\n setCreatingClient(false)\n }}\n className=\"w-full rounded-md bg-primary border border-primary px-3 py-1.5 text-xs font-medium text-primary-foreground hover:bg-primary/90 shadow-button-primary active:shadow-button-inset disabled:opacity-40 transition-colors\">\n {creatingClient ? t('agenda.appointment.creating') : t('agenda.appointment.create')}\n </button>\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Location */}\n {activeType.fields.location && config.modules.locationSelection && (storeLocations.length > 0 || config.locations.length > 0) && (\n <div className=\"flex items-center gap-3 py-1\">\n <MapPin className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <LocationSelect\n value={locationId}\n onChange={setLocationId}\n locations={storeLocations.length > 0 ? storeLocations : config.locations}\n />\n </div>\n )}\n\n {/* Services */}\n {activeType.fields.services && (\n <div className=\"flex items-start gap-3 py-1\">\n <Briefcase className=\"h-4 w-4 mt-1.5 text-muted-foreground shrink-0\" />\n <div className=\"flex-1\">\n {services.length > 0 && (\n <div className=\"space-y-0.5 mb-1\">\n {services.map((svc, idx) => (\n <div key={idx} className=\"flex items-center rounded-md bg-muted/30 px-2.5 py-1.5 text-sm\">\n <span className=\"flex-1 truncate min-w-0\">{svc.name}</span>\n <div className=\"flex items-center gap-0.5 shrink-0 ml-3\">\n <InlineNumber\n value={svc.durationMinutes}\n onChange={(v) => setServices((p) => p.map((s, i) => i === idx ? { ...s, durationMinutes: Math.round(v) } : s))}\n min={5}\n step={5}\n className=\"w-10 shrink-0\"\n disabled={isPaidBooking}\n tooltip={t('agenda.appointment.duration')}\n />\n <span className=\"text-[11px] text-muted-foreground\">min</span>\n </div>\n <div className=\"flex items-center gap-0.5 shrink-0 ml-3\">\n <span className=\"text-[11px] text-muted-foreground\">{currency.symbol}</span>\n <InlineNumber\n value={svc.price}\n onChange={(v) => setServices((p) => p.map((s, i) => i === idx ? { ...s, price: v } : s))}\n min={0}\n step={0.01}\n className=\"w-14 shrink-0\"\n disabled={isPaidBooking}\n tooltip={t('agenda.appointment.price')}\n />\n </div>\n {!isPaidBooking && (\n <button type=\"button\" onClick={() => removeService(idx)} className=\"p-0.5 ml-2 text-muted-foreground hover:text-destructive shrink-0\">\n <X className=\"h-3 w-3\" />\n </button>\n )}\n </div>\n ))}\n </div>\n )}\n\n {!isPaidBooking && <SearchCombobox\n value={serviceSearch}\n onChange={setServiceSearch}\n onSelect={addService}\n options={serviceOptions}\n placeholder={t('agenda.appointment.searchService')}\n onBlurEmpty={() => {}}\n onFocus={() => { if (!serviceSearch && serviceOptions.length === 0) setServiceOptions(initialServiceOptions) }}\n renderRight={(opt) => {\n const dur = (opt.data?.duration_minutes as number) || 0\n const hasPrice = opt.price != null\n if (!hasPrice && !dur) return null\n return (\n <span className=\"text-muted-foreground text-xs whitespace-nowrap\">\n {hasPrice && fmtCurrency(opt.price!, currency.locale, currency.code)}\n {hasPrice && dur > 0 && ' · '}\n {dur > 0 && `${dur}min`}\n </span>\n )\n }}\n minimal\n inlineLabel={services.length > 0 ? t('agenda.appointment.addService') : t('agenda.appointment.addServiceFirst')}\n inlineIcon={services.length > 0 ? 'plus' : 'search'}\n />}\n </div>\n </div>\n )}\n\n {/* Status */}\n {activeType.fields.status && (\n <div className=\"flex items-center gap-3 py-1\">\n <CircleDot className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <StatusSelect value={status} onChange={setStatus} statuses={config.statuses} bookingDate={date} />\n </div>\n )}\n\n {needsCancellationReason && (\n <div className=\"flex items-start gap-3 py-1\">\n <Ban className=\"h-4 w-4 mt-2 text-muted-foreground shrink-0\" />\n <div className=\"flex-1 space-y-2\">\n <select\n value={cancellationReasonId}\n onChange={(event) => setCancellationReasonId(event.target.value)}\n disabled={cancellationReasonsLoading}\n className=\"w-full rounded-input border border-input bg-card px-2.5 py-1.5 text-sm shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] focus:outline-none focus:ring-2 focus:ring-ring\"\n >\n <option value=\"\">{cancellationReasonsLoading ? t('agenda.cancellation.loadingReasons') : t('agenda.cancellation.selectReason')}</option>\n {cancellationReasons.map((reason) => (\n <option key={reason.id} value={reason.id}>\n {reason.label}{reason.requiresNotes ? ' *' : ''}\n </option>\n ))}\n </select>\n <textarea\n value={cancellationNotes}\n onChange={(event) => setCancellationNotes(event.target.value)}\n placeholder={needsCancellationNotes ? t('agenda.cancellation.notesRequired') : t('agenda.cancellation.notesOptional')}\n rows={2}\n className=\"w-full rounded-input border border-input bg-card px-2.5 py-1.5 text-sm resize-none shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n </div>\n )}\n\n {/* Notes — progressive disclosure */}\n {!showNotes ? (\n <div className=\"flex items-center gap-3 py-1\">\n <FileText className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <button type=\"button\" onClick={() => setShowNotes(true)}\n className=\"text-sm text-muted-foreground hover:text-foreground transition-colors text-left py-1.5 pl-2\">\n {t('agenda.appointment.addNotes')}\n </button>\n </div>\n ) : (\n <div className=\"flex items-start gap-3 py-1\">\n <FileText className=\"h-4 w-4 mt-2 text-muted-foreground shrink-0\" />\n <textarea value={notes} onChange={(e) => setNotes(e.target.value)}\n placeholder={t('agenda.appointment.addDescription')} rows={2} autoFocus\n className=\"w-full flex-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2.5 py-1.5 text-sm resize-none focus:outline-none focus:ring-2 focus:ring-ring\" />\n </div>\n )}\n\n </>}\n </div>\n\n {/* Appointment footer — inside form for submit */}\n {modalTab === 'appointment' && !clientEditing && (\n <div className=\"px-5 py-2.5 border-t fayz-glass-divider bg-transparent shrink-0 sm:rounded-b-2xl\">\n {confirmingDelete ? (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-destructive font-medium\">{t('agenda.appointment.deleteConfirm')}</span>\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => setConfirmingDelete(false)}>\n {t('agenda.appointment.cancel')}\n </Button>\n <Button type=\"button\" variant=\"destructive\" size=\"sm\" onClick={handleDelete} disabled={deleting}>\n {deleting ? t('agenda.appointment.deleting') : t('agenda.appointment.confirmDelete')}\n </Button>\n </div>\n </div>\n ) : (\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n {mode === 'edit' && (\n <button type=\"button\" onClick={() => setConfirmingDelete(true)} className=\"text-xs text-destructive font-medium hover:underline\">{t('agenda.appointment.delete')}</button>\n )}\n {services.length > 0 && (\n <span className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <Clock className=\"h-3 w-3\" />\n {totalDuration}min\n {config.modules.financial && totalPrice > 0 && mode === 'edit' ? (\n paymentStatusLoading ? (\n <span className=\"h-4 w-16 rounded-full bg-muted animate-pulse\" />\n ) : isPaidBooking ? (\n <button type=\"button\" onClick={(e) => { e.stopPropagation(); setModalTab('financial') }}\n className=\"inline-flex items-center gap-1 rounded-full bg-success/10 px-2 py-0.5 text-[10px] font-medium text-success hover:bg-success/20 transition-colors\">\n <Check className=\"h-2.5 w-2.5\" />\n {fmtCurrency(totalPrice, currency.locale, currency.code)} &middot; {t('agenda.payment.paid')}\n </button>\n ) : date <= new Date().toISOString().slice(0, 10) ? (\n <button type=\"button\" onClick={(e) => { e.stopPropagation(); setModalTab('financial') }}\n className=\"inline-flex items-center gap-1 rounded-full bg-warning/10 px-2 py-0.5 text-[10px] font-medium text-warning hover:bg-warning/20 transition-colors\">\n <HandCoins className=\"h-3 w-3\" />\n {fmtCurrency(totalPrice, currency.locale, currency.code)} &middot; {t('agenda.payment.collect')}\n </button>\n ) : (\n <span>&middot; {fmtCurrency(totalPrice, currency.locale, currency.code)}</span>\n )\n ) : (\n <span>&middot; {fmtCurrency(totalPrice, currency.locale, currency.code)}</span>\n )}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onClose} className=\"hidden sm:inline-flex\">\n {t('agenda.appointment.cancel')}\n </Button>\n <Button type=\"submit\" variant=\"default\" size=\"sm\" disabled={!canSubmit || !isDirty}>\n {saving ? t('agenda.appointment.saving') : mode === 'create' ? t('agenda.appointment.save') : t('agenda.appointment.update')}\n </Button>\n </div>\n </div>\n )}\n </div>\n )}\n </form>\n\n {/* Non-appointment tab footer — outside form */}\n {modalTab !== 'appointment' && !clientEditing && (\n <div className=\"px-5 py-2.5 border-t fayz-glass-divider bg-transparent shrink-0 sm:rounded-b-2xl\">\n <div className=\"flex items-center\">\n <button type=\"button\" onClick={() => { setModalTab('appointment'); setClientEditing(false) }}\n className=\"inline-flex items-center gap-1 text-xs font-medium text-muted-foreground hover:text-foreground transition-colors\">\n <svg className=\"h-3 w-3\" viewBox=\"0 0 16 16\" fill=\"none\"><path d=\"M10 12L6 8l4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>\n {t('agenda.payment.backToAppointment')}\n </button>\n </div>\n </div>\n )}\n </div>\n </ModalContent>\n\n </Modal>\n )\n}\n","import React, { useEffect, useRef, useState, useCallback } from 'react'\nimport { createPortal } from 'react-dom'\n\n// ---------------------------------------------------------------------------\n// Inject animations once\n// ---------------------------------------------------------------------------\n\nconst STYLE_ID = 'saas-floating-panel'\nif (typeof document !== 'undefined' && !document.getElementById(STYLE_ID)) {\n const s = document.createElement('style')\n s.id = STYLE_ID\n s.textContent = `\n @keyframes _fp-dismiss { from { opacity:1; transform:scale(1) } to { opacity:0; transform:scale(.96) } }\n @keyframes _fp-expand { from { opacity:1; transform:scale(1) } to { opacity:0; transform:scale(1.08) } }\n .saas-fp-dismissing { animation: _fp-dismiss 150ms ease-in forwards; pointer-events: none }\n .saas-fp-expanding { animation: _fp-expand 200ms ease-in forwards; pointer-events: none }\n `\n document.head.appendChild(s)\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype Phase = 'visible' | 'dismissing' | 'expanding'\n\nexport interface FloatingPanelRef {\n /** Dismiss with fade-out, then call onClose */\n dismiss: () => void\n /** Expand-out animation (e.g. popover → modal), then call callback */\n expandThen: (callback: () => void) => void\n}\n\ninterface FloatingPanelProps {\n position: { x: number; y: number }\n width: number\n height: number\n /** Offset from cursor (default: { x: 0, y: 0 }) */\n offset?: { x: number; y: number }\n onClose: () => void\n className?: string\n children: (ref: FloatingPanelRef) => React.ReactNode\n zIndex?: number\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function FloatingPanel({\n position, width, height, offset, onClose, className, children, zIndex = 100,\n}: FloatingPanelProps) {\n const ref = useRef<HTMLDivElement>(null)\n const [phase, setPhase] = useState<Phase>('visible')\n const phaseRef = useRef<Phase>('visible')\n phaseRef.current = phase\n const onCloseRef = useRef(onClose)\n onCloseRef.current = onClose\n const expandCallbackRef = useRef<(() => void) | null>(null)\n\n const dismiss = useCallback(() => {\n if (phaseRef.current !== 'visible') return\n setPhase('dismissing')\n setTimeout(() => onCloseRef.current(), 150)\n }, [])\n\n const expandThen = useCallback((callback: () => void) => {\n if (phaseRef.current !== 'visible') return\n expandCallbackRef.current = callback\n setPhase('expanding')\n setTimeout(() => {\n callback()\n onCloseRef.current()\n }, 220)\n }, [])\n\n // Outside click + Escape\n useEffect(() => {\n function handleClick(e: MouseEvent) {\n if (phaseRef.current !== 'visible') return\n if (ref.current && !ref.current.contains(e.target as Node)) {\n // Don't dismiss if clicking another calendar event — let eventClick handle it\n const target = e.target as HTMLElement\n if (target.closest('.fc-event')) return\n dismiss()\n }\n }\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') dismiss()\n }\n document.addEventListener('mousedown', handleClick)\n document.addEventListener('keydown', handleKey)\n return () => {\n document.removeEventListener('mousedown', handleClick)\n document.removeEventListener('keydown', handleKey)\n }\n }, [dismiss])\n\n // Clamp position to viewport\n const ox = offset?.x ?? 0\n const oy = offset?.y ?? 0\n let x = position.x + ox\n let y = position.y + oy\n if (x + width > window.innerWidth - 12) x = x - width - ox * 2\n if (y + height > window.innerHeight - 12) y = y - height - oy * 2\n if (x < 12) x = 12\n if (y < 12) y = 12\n\n const panelRef: FloatingPanelRef = { dismiss, expandThen }\n\n return createPortal(\n <div ref={ref}\n style={{ position: 'fixed', left: x, top: y, zIndex, transition: phase === 'visible' ? 'left 200ms ease-out, top 200ms ease-out' : undefined }}\n className={`fayz-glass-surface rounded-modal border bg-popover shadow-lg overflow-hidden ${\n phase === 'expanding' ? 'saas-fp-expanding'\n : phase === 'dismissing' ? 'saas-fp-dismissing'\n : 'animate-in fade-in zoom-in-95 duration-150'\n } ${className ?? ''}`}>\n {children(panelRef)}\n </div>,\n document.body,\n )\n}\n","import React, { useState, useRef, useEffect } from 'react'\nimport { X, Pencil, Trash2, Clock, MapPin, User, FileText, DollarSign, Check, AlertTriangle, HandCoins } from 'lucide-react'\nimport { PersonLink } from '@fayz-ai/saas'\nimport { FloatingPanel, type FloatingPanelRef } from './FloatingPanel'\nimport { useAgendaConfig, useAgendaStore } from '../AgendaContext'\nimport { useTranslation } from '@fayz-ai/core'\nimport { isStatusAvailable } from '../types'\nimport type { CalendarBooking } from '../types'\n\ninterface Props {\n booking: CalendarBooking\n position: { x: number; y: number }\n onClose: () => void\n onEdit: (id: string) => void\n}\n\nfunction fmtTime(iso: string) {\n return new Date(iso).toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' })\n}\nfunction fmtDate(iso: string) {\n return new Date(iso).toLocaleDateString(undefined, { weekday: 'long', month: 'long', day: 'numeric' })\n}\nfunction fmtCurrency(amount: number, locale: string, code: string) {\n return new Intl.NumberFormat(locale, { style: 'currency', currency: code }).format(amount)\n}\n\n// Inline status select for the popover\nfunction PopoverStatusSelect({ value, statuses, bookingStartsAt, onChange }: {\n value: string; statuses: Array<{ value: string; label: string; color: string; availableWhen?: string }>\n bookingStartsAt: string; onChange: (v: string) => void\n}) {\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLDivElement>(null)\n const current = statuses.find((s) => s.value === value)\n\n useEffect(() => {\n if (!open) return\n const h = (e: MouseEvent) => { if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false) }\n document.addEventListener('mousedown', h)\n return () => document.removeEventListener('mousedown', h)\n }, [open])\n\n return (\n <div ref={ref} className=\"relative inline-block\">\n <button type=\"button\" onClick={() => setOpen((p) => !p)}\n className=\"inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-medium transition-colors hover:opacity-80\"\n style={{ backgroundColor: (current?.color ?? '#6b7280') + '18', color: current?.color ?? '#6b7280' }}>\n <span className=\"h-2 w-2 rounded-full\" style={{ backgroundColor: current?.color }} />\n {current?.label ?? value}\n <svg className=\"h-3 w-3 opacity-50\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </button>\n {open && (\n <div className=\"fayz-glass-surface absolute bottom-full left-0 z-50 mb-1 rounded-lg border bg-popover shadow-lg py-1 animate-in fade-in zoom-in-95 duration-100 min-w-[140px]\">\n {statuses.map((s) => {\n const available = isStatusAvailable(s as any, bookingStartsAt)\n return (\n <button key={s.value} type=\"button\" disabled={!available}\n onClick={() => { if (available) { onChange(s.value); setOpen(false) } }}\n className={`flex w-full items-center gap-2 px-3 py-1.5 text-xs transition-colors ${\n !available ? 'opacity-30 cursor-not-allowed' : s.value === value ? 'bg-muted/30' : 'hover:bg-muted/50'\n }`}>\n <span className=\"h-2 w-2 rounded-full shrink-0\" style={{ backgroundColor: s.color }} />\n <span>{s.label}</span>\n </button>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n\nexport function AppointmentPopover({ booking, position, onClose, onEdit }: Props) {\n const t = useTranslation()\n const config = useAgendaConfig()\n const deleteBooking = useAgendaStore((s) => s.deleteBooking)\n const updateStatus = useAgendaStore((s) => s.updateBookingStatus)\n const openModal = useAgendaStore((s) => s.openAppointmentModal)\n const [confirmingDelete, setConfirmingDelete] = useState(false)\n const [deleting, setDeleting] = useState(false)\n const statusConfig = config.statuses.find((s) => s.value === booking.status)\n const color = statusConfig?.color ?? '#6b7280'\n const timeRange = `${fmtTime(booking.startsAt)}${booking.endsAt ? ' – ' + fmtTime(booking.endsAt) : ''}`\n\n async function handleDelete() {\n setDeleting(true)\n try { await deleteBooking(booking.id); onClose() } catch { setDeleting(false) }\n }\n\n return (\n <>\n <FloatingPanel position={position} width={320} height={340} onClose={onClose}>\n {(panel) => (\n <>\n {/* Action bar */}\n <div className=\"flex items-center justify-end gap-0.5 px-3 pt-3 pb-1\">\n {confirmingDelete ? (\n <>\n <span className=\"text-xs text-destructive font-medium mr-auto pl-1\">{t('agenda.appointment.deleteConfirm')}</span>\n <button onClick={() => setConfirmingDelete(false)}\n className=\"rounded px-2 py-0.5 text-[11px] font-medium hover:bg-muted/50 transition-colors\">{t('agenda.appointment.cancel')}</button>\n <button onClick={handleDelete} disabled={deleting}\n className=\"rounded bg-destructive border border-destructive px-2 py-0.5 text-[11px] font-medium text-destructive-foreground hover:bg-destructive/90 shadow-button-primary active:shadow-button-inset disabled:opacity-40 transition-colors\">{deleting ? t('agenda.appointment.deleting') : t('agenda.appointment.confirmDelete')}</button>\n </>\n ) : (\n <>\n <button onClick={() => panel.expandThen(() => onEdit(booking.id))}\n className=\"p-1.5 rounded-full hover:bg-muted transition-colors\" title={t('common.edit')}>\n <Pencil className=\"h-4 w-4 text-muted-foreground\" />\n </button>\n <button onClick={() => setConfirmingDelete(true)}\n className=\"p-1.5 rounded-full hover:bg-destructive/10 transition-colors\" title={t('common.delete')}>\n <Trash2 className=\"h-4 w-4 text-muted-foreground hover:text-destructive\" />\n </button>\n <button onClick={panel.dismiss} className=\"p-1.5 rounded-full hover:bg-muted transition-colors\">\n <X className=\"h-4 w-4 text-muted-foreground\" />\n </button>\n </>\n )}\n </div>\n\n {/* Content */}\n <div className=\"px-5 pb-5 space-y-3\">\n <div className=\"flex items-start gap-3\">\n <span className=\"mt-1.5 h-3 w-3 rounded shrink-0\" style={{ backgroundColor: color }} />\n <div className=\"min-w-0\">\n {/* Client agendas link to the person; simple events (no client\n capability) render the free-text title as a plain heading —\n booking.clientName carries the event title in that model. */}\n {config.capabilities.client ? (\n <PersonLink personId={booking.clientId} name={booking.clientName ?? 'Unknown'} className=\"text-base\" />\n ) : (\n <p className=\"text-base font-medium truncate\">{booking.clientName || t('agenda.appointment.untitled')}</p>\n )}\n <p className=\"text-sm text-muted-foreground mt-0.5\">{fmtDate(booking.startsAt)} &middot; {timeRange}</p>\n </div>\n </div>\n\n {booking.services && booking.services.length > 0 && (\n <div className=\"flex items-start gap-3\">\n <Clock className=\"h-4 w-4 mt-0.5 text-muted-foreground shrink-0\" />\n <div className=\"text-sm space-y-0.5\">\n {booking.services.map((svc) => (\n <p key={svc.id}>{svc.name} <span className=\"text-muted-foreground\">({svc.durationMinutes}min)</span></p>\n ))}\n </div>\n </div>\n )}\n\n {config.capabilities.professional && booking.professionalName && (\n <div className=\"flex items-center gap-3\">\n <User className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <span className=\"text-sm\">{booking.professionalName}</span>\n </div>\n )}\n\n {booking.locationName && (\n <div className=\"flex items-center gap-3\">\n <MapPin className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <span className=\"text-sm\">{booking.locationName}</span>\n </div>\n )}\n\n {booking.notes && (\n <div className=\"flex items-start gap-3\">\n <FileText className=\"h-4 w-4 mt-0.5 text-muted-foreground shrink-0\" />\n <p className=\"text-sm text-muted-foreground\">{booking.notes}</p>\n </div>\n )}\n\n {booking.orderTotal != null && booking.orderTotal > 0 && (() => {\n const total = fmtCurrency(booking.orderTotal, config.currency.locale, config.currency.code)\n const ps = booking.paymentStatus ?? 'none'\n const hasFinancial = config.modules.financial && booking.orderId\n\n // No financial module — just show total\n if (!hasFinancial) {\n return (\n <div className=\"pt-2 border-t fayz-glass-divider flex items-center justify-between text-sm\">\n <span className=\"text-muted-foreground\">{t('agenda.appointment.total')}</span>\n <span className=\"font-medium\">{total}</span>\n </div>\n )\n }\n\n const badgeConfig: Record<string, { icon: React.ElementType; bg: string; text: string; label: string }> = {\n none: { icon: HandCoins, bg: 'bg-warning/10 hover:bg-warning/15', text: 'text-warning', label: `${total} · ${t('agenda.payment.collect')}` },\n pending: { icon: Clock, bg: 'bg-warning/10 hover:bg-warning/15', text: 'text-warning', label: `${total} · ${t('agenda.payment.pending')}` },\n partial: { icon: DollarSign, bg: 'bg-warning/10 hover:bg-warning/15', text: 'text-warning', label: `${total} · ${t('agenda.payment.partial')}` },\n paid: { icon: Check, bg: 'bg-success/10 hover:bg-success/15', text: 'text-success', label: `${total} · ${t('agenda.payment.paid')}` },\n overdue: { icon: AlertTriangle, bg: 'bg-destructive/10 hover:bg-destructive/15', text: 'text-destructive', label: `${total} · ${t('agenda.payment.overdue')}` },\n cancelled: { icon: X, bg: 'bg-muted hover:bg-muted/80', text: 'text-muted-foreground', label: `${total} · ${t('agenda.payment.cancelled')}` },\n }\n const cfg = badgeConfig[ps] ?? badgeConfig.none\n const StatusIcon = cfg.icon\n\n return (\n <div className=\"pt-2 border-t fayz-glass-divider flex items-center justify-between\">\n <span className=\"text-xs text-muted-foreground\">{t('agenda.appointment.total')}</span>\n <button\n type=\"button\"\n onClick={() => { onClose(); openModal('edit', { bookingId: booking.id, initialTab: 'financial' }) }}\n className={`inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[11px] font-medium transition-colors ${cfg.bg} ${cfg.text}`}\n >\n <StatusIcon className=\"h-3 w-3\" />\n {cfg.label}\n </button>\n </div>\n )\n })()}\n\n {/* Status workflow — hidden for simple events (no status capability). */}\n {config.capabilities.status && (\n <div className=\"pt-2 border-t fayz-glass-divider\">\n <PopoverStatusSelect\n value={booking.status}\n statuses={config.statuses}\n bookingStartsAt={booking.startsAt}\n onChange={(v) => { updateStatus(booking.id, v); onClose() }}\n />\n </div>\n )}\n </div>\n </>\n )}\n </FloatingPanel>\n </>\n )\n}\n","import React, { useRef, useState, useMemo } from 'react'\nimport { createPortal } from 'react-dom'\nimport { Pencil, Trash2, Check } from 'lucide-react'\nimport { FloatingPanel } from './FloatingPanel'\nimport { useAgendaConfig, useAgendaStore } from '../AgendaContext'\nimport { useTranslation } from '@fayz-ai/core'\nimport { isStatusAvailable } from '../types'\nimport type { CalendarBooking } from '../types'\n\n// ---------------------------------------------------------------------------\n// Tooltip — portaled to body\n// ---------------------------------------------------------------------------\n\nfunction Tooltip({ anchor, label }: { anchor: DOMRect; label: string }) {\n return createPortal(\n <div style={{ position: 'fixed', left: anchor.left + anchor.width / 2, top: anchor.bottom + 6, transform: 'translateX(-50%)', zIndex: 120 }}\n className=\"pointer-events-none\">\n <div className=\"rounded-md bg-foreground text-background px-2 py-0.5 text-[11px] font-medium whitespace-nowrap shadow-lg\">\n {label}\n </div>\n </div>,\n document.body,\n )\n}\n\n// ---------------------------------------------------------------------------\n// Status dot with portaled tooltip\n// ---------------------------------------------------------------------------\n\nfunction StatusDot({ color, label, isActive, disabled, onClick }: {\n color: string; label: string; isActive: boolean; disabled?: boolean; onClick: () => void\n}) {\n const [hover, setHover] = useState(false)\n const btnRef = useRef<HTMLButtonElement>(null)\n const [rect, setRect] = useState<DOMRect | null>(null)\n\n return (\n <>\n <button ref={btnRef} type=\"button\" onClick={disabled ? undefined : onClick} disabled={disabled}\n onMouseEnter={() => { setHover(true); if (btnRef.current) setRect(btnRef.current.getBoundingClientRect()) }}\n onMouseLeave={() => setHover(false)}\n className={`flex h-7 w-7 items-center justify-center rounded-full transition-all ${\n disabled ? 'opacity-25 cursor-not-allowed' : isActive ? 'ring-2 ring-offset-2 ring-offset-popover' : 'hover:scale-110'\n }`}\n style={{ backgroundColor: color, ['--tw-ring-color' as any]: isActive ? color : undefined }}>\n {isActive && <Check className=\"h-3.5 w-3.5 text-white\" strokeWidth={2.5} />}\n </button>\n {hover && rect && <Tooltip anchor={rect} label={label} />}\n </>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Context Menu\n// ---------------------------------------------------------------------------\n\ninterface Props {\n booking: CalendarBooking\n position: { x: number; y: number }\n onClose: () => void\n onEdit: (id: string) => void\n}\n\nexport function EventContextMenu({ booking, position, onClose, onEdit }: Props) {\n const t = useTranslation()\n const config = useAgendaConfig()\n const updateStatus = useAgendaStore((s) => s.updateBookingStatus)\n const deleteBooking = useAgendaStore((s) => s.deleteBooking)\n const [confirming, setConfirming] = useState(false)\n const [deleting, setDeleting] = useState(false)\n\n async function handleDelete() {\n setDeleting(true)\n try { await deleteBooking(booking.id); onClose() } catch { setDeleting(false) }\n }\n\n return (\n <FloatingPanel position={position} width={230} height={180} offset={{ x: 4, y: 4 }} onClose={onClose} zIndex={110}>\n {(panel) => (\n <>\n <div className=\"py-1\">\n <button onClick={() => panel.expandThen(() => onEdit(booking.id))}\n className=\"flex w-full items-center gap-3 px-4 py-2 text-sm hover:bg-muted/50 transition-colors\">\n <Pencil className=\"h-4 w-4 text-muted-foreground\" /> {t('agenda.contextMenu.edit')}\n </button>\n {confirming ? (\n <div className=\"flex items-center justify-between px-4 py-2\">\n <span className=\"text-xs text-destructive font-medium\">{t('agenda.appointment.deleteConfirm')}</span>\n <div className=\"flex items-center gap-1.5\">\n <button onClick={() => setConfirming(false)}\n className=\"rounded px-2 py-0.5 text-[11px] font-medium hover:bg-muted/50 transition-colors\">{t('agenda.appointment.cancel')}</button>\n <button onClick={handleDelete} disabled={deleting}\n className=\"rounded bg-destructive border border-destructive px-2 py-0.5 text-[11px] font-medium text-destructive-foreground hover:bg-destructive/90 shadow-button-primary active:shadow-button-inset disabled:opacity-40 transition-colors\">{deleting ? t('agenda.appointment.deleting') : t('agenda.appointment.confirmDelete')}</button>\n </div>\n </div>\n ) : (\n <button onClick={() => setConfirming(true)}\n className=\"flex w-full items-center gap-3 px-4 py-2 text-sm hover:bg-muted/50 transition-colors text-destructive\">\n <Trash2 className=\"h-4 w-4\" /> {t('agenda.contextMenu.delete')}\n </button>\n )}\n </div>\n\n {/* Status workflow — hidden for simple events (no status capability). */}\n {config.capabilities.status && (\n <div className=\"border-t px-4 py-3\">\n <p className=\"text-[11px] font-medium text-muted-foreground mb-2\">{t('agenda.contextMenu.changeStatus')}</p>\n <div className=\"flex items-center gap-1.5\">\n {config.statuses.map((s) => {\n const available = isStatusAvailable(s, booking.startsAt)\n return (\n <StatusDot key={s.value} color={s.color} label={available ? s.label : `${s.label} ${t('agenda.contextMenu.notAvailable')}`}\n isActive={booking.status === s.value}\n disabled={!available}\n onClick={() => { if (available) { updateStatus(booking.id, s.value); panel.dismiss() } }} />\n )\n })}\n </div>\n </div>\n )}\n </>\n )}\n </FloatingPanel>\n )\n}\n","import React, { useMemo } from 'react'\nimport { formatCurrency, useTranslation, getCurrentLocale } from '@fayz-ai/core'\nimport type { CalendarBooking } from '../types'\n\n// ---------------------------------------------------------------------------\n// Mobile agenda list — a thumb-friendly, date-grouped list of upcoming items.\n// Rendered on <md viewports instead of the FullCalendar grid. Each row shows a\n// category/status dot, the title, the time, and (for finance-style events) the\n// amount. Fed straight from the store bookings so it works for any seeded app.\n// ---------------------------------------------------------------------------\n\nfunction startOfDay(d: Date): Date {\n const x = new Date(d)\n x.setHours(0, 0, 0, 0)\n return x\n}\n\nfunction timeLabel(iso: string): string {\n const d = new Date(iso)\n return `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`\n}\n\nexport interface AgendaMobileListProps {\n bookings: CalendarBooking[]\n statusColors: Record<string, string>\n currencyCode: string\n onSelect: (booking: CalendarBooking) => void\n}\n\nexport function AgendaMobileList({ bookings, statusColors, currencyCode, onSelect }: AgendaMobileListProps) {\n const t = useTranslation()\n const locale = getCurrentLocale() === 'pt-BR' ? 'pt-BR' : 'en'\n\n const groups = useMemo(() => {\n const todayStart = startOfDay(new Date()).getTime()\n const sorted = bookings\n .filter((b) => !!b.startsAt)\n .slice()\n .sort((a, b) => (a.startsAt < b.startsAt ? -1 : a.startsAt > b.startsAt ? 1 : 0))\n const map = new Map<string, CalendarBooking[]>()\n for (const b of sorted) {\n const day = startOfDay(new Date(b.startsAt))\n if (day.getTime() < todayStart) continue // upcoming only\n const key = day.toISOString().slice(0, 10)\n const list = map.get(key) ?? []\n list.push(b)\n map.set(key, list)\n }\n return Array.from(map.entries()).map(([key, items]) => ({ key, date: new Date(key + 'T00:00:00'), items }))\n }, [bookings])\n\n function dayLabel(date: Date): string {\n const today = startOfDay(new Date())\n const diff = Math.round((startOfDay(date).getTime() - today.getTime()) / 86400000)\n if (diff === 0) return t('agenda.list.today')\n if (diff === 1) return t('agenda.list.tomorrow')\n return date.toLocaleDateString(locale, { weekday: 'long', day: 'numeric', month: 'long' })\n }\n\n if (groups.length === 0) {\n return (\n <div className=\"flex-1 flex flex-col items-center justify-center px-6 py-16 text-center text-muted-foreground\">\n <p className=\"text-sm\">{t('agenda.list.empty')}</p>\n </div>\n )\n }\n\n return (\n <div className=\"flex-1 overflow-y-auto px-3 py-3 space-y-5\">\n {groups.map((g) => (\n <div key={g.key}>\n <h3 className=\"px-1 pb-1.5 text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {dayLabel(g.date)}\n </h3>\n <div className=\"space-y-1.5\">\n {g.items.map((b) => {\n const color = statusColors[b.status] ?? '#6b7280'\n const hasAmount = typeof b.orderTotal === 'number' && b.orderTotal > 0\n return (\n <button\n key={b.id}\n onClick={() => onSelect(b)}\n className=\"flex w-full items-center gap-3 rounded-lg border bg-card px-3 py-2.5 text-left shadow-sm transition-colors active:bg-muted/50\"\n >\n <span className=\"h-2.5 w-2.5 shrink-0 rounded-full\" style={{ backgroundColor: color }} />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-foreground\">{b.clientName ?? '—'}</p>\n <p className=\"text-xs text-muted-foreground\">{timeLabel(b.startsAt)}</p>\n </div>\n {hasAmount && (\n <span className=\"shrink-0 text-sm font-semibold tabular-nums text-foreground\">\n {formatCurrency(b.orderTotal, currencyCode)}\n </span>\n )}\n </button>\n )\n })}\n </div>\n </div>\n ))}\n </div>\n )\n}\n","import React, { useRef, useEffect, useCallback, useMemo, useState } from 'react'\nimport { injectCalendarStyles } from '../calendar-styles'\nimport FullCalendar from '@fullcalendar/react'\nimport dayGridPlugin from '@fullcalendar/daygrid'\nimport timeGridPlugin from '@fullcalendar/timegrid'\nimport resourceTimeGridPlugin from '@fullcalendar/resource-timegrid'\nimport interactionPlugin from '@fullcalendar/interaction'\nimport listPlugin from '@fullcalendar/list'\nimport ptBrLocale from '@fullcalendar/core/locales/pt-br'\nimport type { EventInput, EventClickArg, DateSelectArg, EventDropArg } from '@fullcalendar/core'\nimport { ChevronLeft, ChevronRight, Plus, ChevronDown, Settings } from 'lucide-react'\nimport { usePluginPrefs } from '@fayz-ai/saas'\nimport { getCurrentLocale } from '@fayz-ai/core'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useAgendaConfig, useAgendaStore } from '../AgendaContext'\nimport { useAgendaSettings } from '../hooks/useAgendaSettings'\nimport { MiniCalendar } from '../components/MiniCalendar'\nimport { AppointmentModal } from '../components/AppointmentModal'\nimport { AppointmentPopover } from '../components/AppointmentPopover'\nimport { PersonLink } from '@fayz-ai/saas'\nimport { EventContextMenu } from '../components/EventContextMenu'\nimport { AgendaMobileList } from '../components/AgendaMobileList'\nimport { ConfirmDialog } from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport type { CalendarBooking, Schedule } from '../types'\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction bookingToEvent(booking: CalendarBooking, statusColors: Record<string, string>): EventInput {\n const color = statusColors[booking.status] ?? '#6b7280'\n const serviceNames = booking.services?.map((s) => s.name).join(', ') ?? ''\n return {\n id: booking.id,\n resourceId: booking.professionalId ?? undefined,\n title: booking.clientName ?? 'Unknown',\n start: booking.startsAt,\n end: booking.endsAt ?? undefined,\n backgroundColor: color + '30',\n borderColor: color,\n textColor: color,\n extendedProps: { booking, serviceNames },\n }\n}\n\n/**\n * Generate FullCalendar background events showing unavailable time.\n * For each day, creates background blocks for the gaps OUTSIDE working hours\n * within the visible business hours window. This grays out non-working time.\n */\nfunction generateAvailabilityEvents(\n schedules: Schedule[],\n professionals: { id: string }[],\n dateRange: { start: string; end: string } | null,\n businessHours?: { startTime: string; endTime: string },\n locationMap?: Map<string, string>,\n): EventInput[] {\n if (!dateRange || schedules.length === 0) return []\n\n const bgEvents: EventInput[] = []\n const startDate = new Date(dateRange.start)\n const endDate = new Date(dateRange.end)\n const bizStart = businessHours?.startTime ?? '08:00'\n const bizEnd = businessHours?.endTime ?? '20:00'\n\n // Group schedules by assignee\n const byAssignee = new Map<string, Schedule[]>()\n for (const s of schedules) {\n const aid = s.assigneeId\n if (!aid) continue\n const list = byAssignee.get(aid) ?? []\n list.push(s)\n byAssignee.set(aid, list)\n }\n\n function timeToMinutes(t: string): number {\n const [h, m] = t.split(':').map(Number)\n return h * 60 + m\n }\n\n function minutesToTime(m: number): string {\n return `${String(Math.floor(m / 60)).padStart(2, '0')}:${String(m % 60).padStart(2, '0')}`\n }\n\n const bizStartMin = timeToMinutes(bizStart)\n const bizEndMin = timeToMinutes(bizEnd)\n\n for (const prof of professionals) {\n const profSchedules = byAssignee.get(prof.id) ?? []\n\n // Separate weekly and date-specific schedules\n const weekly = profSchedules.filter((s) => s.dayOfWeek != null && !s.specificDate)\n const exceptions = profSchedules.filter((s) => s.specificDate != null)\n const exceptionDates = new Set(exceptions.map((s) => s.specificDate!))\n\n const current = new Date(startDate)\n while (current < endDate) {\n const dateStr = current.toISOString().slice(0, 10)\n const dayOfWeek = current.getDay()\n\n // Get working periods for this day\n let daySchedules: Schedule[]\n if (exceptionDates.has(dateStr)) {\n daySchedules = exceptions.filter((s) => s.specificDate === dateStr && s.isActive)\n } else {\n daySchedules = weekly.filter((s) => s.dayOfWeek === dayOfWeek && s.isActive)\n }\n\n // Convert working periods to sorted minute ranges, preserving locationId\n const workRanges = daySchedules\n .map((s) => {\n const locId = s.locationId ?? (s.metadata?.locationId as string | undefined)\n return {\n start: timeToMinutes(s.startsAt),\n end: timeToMinutes(s.endsAt),\n locationName: locId && locationMap ? locationMap.get(locId) : undefined,\n }\n })\n .sort((a, b) => a.start - b.start)\n\n // Compute unavailable gaps within business hours\n let cursor = bizStartMin\n for (const range of workRanges) {\n const availStart = Math.max(range.start, bizStartMin)\n const availEnd = Math.min(range.end, bizEndMin)\n\n // Gap before this working range = unavailable\n if (cursor < availStart) {\n bgEvents.push({\n resourceId: prof.id,\n start: dateStr + 'T' + minutesToTime(cursor) + ':00',\n end: dateStr + 'T' + minutesToTime(availStart) + ':00',\n display: 'background',\n classNames: ['fc-unavailable-bg'],\n })\n }\n\n // Location label on available range\n if (availStart < availEnd && range.locationName) {\n bgEvents.push({\n id: `loc-${prof.id}-${dateStr}-${minutesToTime(availStart)}`,\n resourceId: prof.id,\n start: dateStr + 'T' + minutesToTime(availStart) + ':00',\n end: dateStr + 'T' + minutesToTime(availStart + 20) + ':00',\n title: range.locationName,\n display: 'auto',\n editable: false,\n backgroundColor: 'transparent',\n borderColor: 'transparent',\n textColor: '#a3a3a3',\n classNames: ['fc-location-label'],\n extendedProps: { isLocationLabel: true },\n })\n }\n\n cursor = Math.max(cursor, availEnd)\n }\n\n // Gap after last working range = unavailable\n if (cursor < bizEndMin) {\n bgEvents.push({\n resourceId: prof.id,\n start: dateStr + 'T' + minutesToTime(cursor) + ':00',\n end: dateStr + 'T' + minutesToTime(bizEndMin) + ':00',\n display: 'background',\n classNames: ['fc-unavailable-bg'],\n })\n }\n\n\n current.setDate(current.getDate() + 1)\n }\n }\n\n return bgEvents\n}\n\n// ---------------------------------------------------------------------------\n// Loading skeleton — mimics the resource-timegrid-week layout\n// ---------------------------------------------------------------------------\n\nfunction CalendarSkeleton({ profCount = 2 }: { profCount?: number }) {\n const days = ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT']\n const hours = ['07:00', '08:00', '09:00', '10:00', '11:00', '12:00', '13:00', '14:00', '15:00', '16:00', '17:00', '18:00', '19:00', '20:00']\n\n return (\n <div className=\"flex-1 overflow-hidden animate-pulse\">\n <div className=\"flex border-b\" style={{ paddingLeft: 56 }}>\n {Array.from({ length: profCount }).map((_, pi) => (\n <div key={pi} className=\"flex-1 border-r last:border-r-0 py-2 px-3\">\n <div className=\"flex items-center justify-center gap-2\">\n <div className=\"h-6 w-6 rounded-full bg-muted\" />\n <div className=\"h-3 w-20 rounded bg-muted\" />\n </div>\n </div>\n ))}\n </div>\n <div className=\"flex border-b\" style={{ paddingLeft: 56 }}>\n {Array.from({ length: profCount }).map((_, pi) => (\n <div key={pi} className=\"flex-1 flex border-r last:border-r-0\">\n {days.map((d) => (\n <div key={d} className=\"flex-1 py-1.5 text-center\">\n <span className=\"text-[10px] text-muted-foreground/40\">{d}</span>\n </div>\n ))}\n </div>\n ))}\n </div>\n <div className=\"relative\">\n {hours.map((h) => (\n <div key={h} className=\"flex border-b border-border/30\" style={{ height: 50 }}>\n <div className=\"w-14 shrink-0 pr-2 text-right\">\n <span className=\"text-[10px] text-muted-foreground/30\">{h}</span>\n </div>\n <div className=\"flex-1 flex\">\n {Array.from({ length: profCount * 7 }).map((_, ci) => (\n <div key={ci} className={`flex-1 border-r border-border/20 ${Math.floor(ci / 7) % 2 === 1 ? 'bg-muted/20' : ''}`} />\n ))}\n </div>\n </div>\n ))}\n </div>\n </div>\n )\n}\n\n// Resource views — one column per professional. Used when the app has staff.\nconst RESOURCE_VIEW_OPTIONS = [\n { key: 'resourceTimeGridDay', labelKey: 'agenda.calendar.viewDay' },\n { key: 'resourceTimeGridWeek', labelKey: 'agenda.calendar.viewWeek' },\n { key: 'dayGridMonth', labelKey: 'agenda.calendar.viewMonth' },\n] as const\n\n// Non-resource variants — used when there are no professionals/resources (e.g. a\n// personal-finance agenda). A resource timegrid renders an EMPTY grid with zero\n// resource columns and drops events that have no resourceId, so those apps fall\n// back to a plain month/day/week calendar.\nconst PLAIN_VIEW_OPTIONS = [\n { key: 'timeGridDay', labelKey: 'agenda.calendar.viewDay' },\n { key: 'timeGridWeek', labelKey: 'agenda.calendar.viewWeek' },\n { key: 'dayGridMonth', labelKey: 'agenda.calendar.viewMonth' },\n { key: 'listMonth', labelKey: 'agenda.calendar.viewList' },\n] as const\n\n// Sentinel view key for the thumb-friendly mobile agenda list (AgendaMobileList),\n// which is NOT a FullCalendar view. Selected by default on <md so B2C opens on the\n// list; picking any grid option (Dia/Semana/Mês) mounts the real calendar instead.\nconst MOBILE_LIST_VIEW = '__mobileList__'\n\n/** Collapse a resource view to a plain month calendar when there are no resources. */\nfunction viewForNoResources(view: string): string {\n return view.startsWith('resource') ? 'dayGridMonth' : view\n}\n\n/** Promote a plain timegrid to its resource variant when the app has resources. */\nfunction viewForResources(view: string): string {\n if (view === 'timeGridWeek') return 'resourceTimeGridWeek'\n if (view === 'timeGridDay') return 'resourceTimeGridDay'\n return view\n}\n\n/** Small viewport (<md) → render the thumb-friendly agenda list instead of the grid. */\nfunction useIsMobile(): boolean {\n const [isMobile, setIsMobile] = useState(() =>\n typeof window !== 'undefined' && window.matchMedia('(max-width: 767px)').matches)\n useEffect(() => {\n if (typeof window === 'undefined') return\n const mq = window.matchMedia('(max-width: 767px)')\n const onChange = () => setIsMobile(mq.matches)\n mq.addEventListener('change', onChange)\n return () => mq.removeEventListener('change', onChange)\n }, [])\n return isMobile\n}\n\n// ---------------------------------------------------------------------------\n// Calendar View\n// ---------------------------------------------------------------------------\n\nexport function CalendarView() {\n injectCalendarStyles()\n const config = useAgendaConfig()\n const t = useTranslation()\n const currentLocale = getCurrentLocale()\n const fcLocale = currentLocale === 'pt-BR' ? ptBrLocale : undefined\n const calendarRef = useRef<FullCalendar>(null)\n const prefs = usePluginPrefs('agenda', { calendarView: config.defaultCalendarView ?? 'resourceTimeGridWeek' })\n const agendaSettings = useAgendaSettings()\n const effectiveBusinessHours = {\n startTime: agendaSettings.startTime,\n endTime: agendaSettings.endTime,\n }\n\n const bookings = useAgendaStore((s) => s.bookings)\n const bookingsLoading = useAgendaStore((s) => s.bookingsLoading)\n const professionals = useAgendaStore((s) => s.professionals)\n const professionalsLoading = useAgendaStore((s) => s.professionalsLoading)\n const currentView = useAgendaStore((s) => s.currentView)\n const selectedProfIds = useAgendaStore((s) => s.selectedProfessionalIds)\n const selectedStatuses = useAgendaStore((s) => s.selectedStatuses)\n const schedules = useAgendaStore((s) => s.schedules)\n const fetchBookings = useAgendaStore((s) => s.fetchBookings)\n const fetchProfessionals = useAgendaStore((s) => s.fetchProfessionals)\n const fetchLocations = useAgendaStore((s) => s.fetchLocations)\n const storeLocations = useAgendaStore((s) => s.locations)\n const fetchSchedules = useAgendaStore((s) => s.fetchSchedules)\n const rescheduleBooking = useAgendaStore((s) => s.rescheduleBooking)\n const setView = useAgendaStore((s) => s.setView)\n const setFilters = useAgendaStore((s) => s.setFilters)\n const _openModal = useAgendaStore((s) => s.openAppointmentModal)\n const closeModal = useAgendaStore((s) => s.closeAppointmentModal)\n const modalState = useAgendaStore((s) => s.appointmentModal)\n\n // Resource-capable = the app has professionals/staff. When it doesn't (e.g. a\n // personal-finance agenda), resource views render empty, so we force plain\n // (non-resource) views and default to a month calendar.\n const isMobile = useIsMobile()\n const resourceCapable = professionals.length > 0\n const viewOptions = resourceCapable ? RESOURCE_VIEW_OPTIONS : PLAIN_VIEW_OPTIONS\n\n // Mobile (<md) has its own view selection, independent of the desktop pref: it\n // defaults to the thumb-friendly list and lets the user switch to any grid view\n // (Dia/Semana/Mês) without changing the desktop's stored calendarView. The list\n // sentinel replaces FullCalendar's own listMonth so mobile always gets the rich\n // AgendaMobileList, and a list option is offered even for resource apps.\n const [mobileView, setMobileView] = useState<string>(MOBILE_LIST_VIEW)\n const mobileViewOptions = useMemo(\n () => [\n ...viewOptions.filter((o) => o.key !== 'listMonth'),\n { key: MOBILE_LIST_VIEW, labelKey: 'agenda.calendar.viewList' },\n ],\n [viewOptions],\n )\n const mobileGridActive = isMobile && mobileView !== MOBILE_LIST_VIEW\n\n const [selectedBooking, setSelectedBooking] = useState<CalendarBooking | null>(null)\n const [popoverAnchor, setPopoverAnchor] = useState<{ x: number; y: number } | null>(null)\n const [popoverVisible, _setPopoverVisible] = useState(false)\n const popoverVisibleRef = useRef(false)\n const setPopoverVisible = useCallback((v: boolean) => { popoverVisibleRef.current = v; _setPopoverVisible(v) }, [])\n const [contextMenu, setContextMenu] = useState<{ booking: CalendarBooking; x: number; y: number } | null>(null)\n const [contextMenuVisible, _setContextMenuVisible] = useState(false)\n const contextMenuVisibleRef = useRef(false)\n const setContextMenuVisible = useCallback((v: boolean) => { contextMenuVisibleRef.current = v; _setContextMenuVisible(v) }, [])\n const [scheduleConfirm, setScheduleConfirm] = useState<{ onConfirm: () => void } | null>(null)\n const [calendarTitle, setCalendarTitle] = useState('')\n const [selectedDate, setSelectedDate] = useState(new Date())\n const [profSectionOpen, setProfSectionOpen] = useState(true)\n const [statusSectionOpen, setStatusSectionOpen] = useState(false)\n const [visibleRange, setVisibleRange] = useState<{ start: string; end: string } | null>(null)\n\n // Wrap openModal to always dismiss popover/context menu first\n const openModal: typeof _openModal = useCallback((...args) => {\n setPopoverVisible(false); setSelectedBooking(null); setPopoverAnchor(null)\n setContextMenuVisible(false); setContextMenu(null)\n _openModal(...args)\n }, [_openModal])\n\n const statusColors = useMemo(() => {\n const map: Record<string, string> = {}\n for (const s of config.statuses) map[s.value] = s.color\n return map\n }, [config.statuses])\n\n useEffect(() => {\n fetchProfessionals(); fetchSchedules()\n if (config.modules.locationSelection) fetchLocations()\n }, [])\n\n // Keep the view consistent with resource-capability, in case a stale/shared\n // pref selected the wrong variant. No resources → a resource view is an empty\n // grid that drops the seeded events; resources → a plain timegrid loses the\n // per-professional columns.\n useEffect(() => {\n const api = calendarRef.current?.getApi()\n if (!api) return\n if (!resourceCapable && currentView.startsWith('resource')) {\n api.changeView('dayGridMonth')\n } else if (resourceCapable && (currentView === 'timeGridWeek' || currentView === 'timeGridDay')) {\n api.changeView(viewForResources(currentView))\n }\n }, [resourceCapable, currentView])\n\n // Mobile renders the agenda list (no FullCalendar), so the grid's datesSet —\n // which normally drives fetchBookings — never fires. Fetch a wide upcoming\n // window directly so the list has data.\n useEffect(() => {\n if (!isMobile) return\n const start = new Date(); start.setHours(0, 0, 0, 0); start.setDate(start.getDate() - 1)\n const end = new Date(start); end.setDate(end.getDate() + 91)\n fetchBookings({ start: start.toISOString(), end: end.toISOString() })\n }, [isMobile, fetchBookings])\n\n const resources = useMemo(() => {\n const filtered = selectedProfIds.length > 0\n ? professionals.filter((p) => selectedProfIds.includes(p.id))\n : professionals\n return filtered.map((p) => ({\n id: p.id, title: p.name,\n extendedProps: { avatarUrl: p.avatarUrl, locationName: p.locationName },\n }))\n }, [professionals, selectedProfIds])\n\n const bookingEvents = useMemo(() =>\n bookings.map((b) => bookingToEvent(b, statusColors)), [bookings, statusColors])\n\n // Merge static config locations with dynamically fetched locations\n const allLocations = useMemo(() => {\n const map = new Map<string, string>()\n for (const loc of config.locations) map.set(loc.id, loc.name)\n for (const loc of storeLocations) map.set(loc.id, loc.name)\n return map\n }, [config.locations, storeLocations])\n\n const locationMap = useMemo(() => {\n if (!config.modules.locationSelection || allLocations.size === 0) return undefined\n return allLocations\n }, [config.modules.locationSelection, allLocations])\n\n const availabilityEvents = useMemo(() =>\n generateAvailabilityEvents(schedules, professionals, visibleRange, effectiveBusinessHours, locationMap),\n [schedules, professionals, visibleRange, effectiveBusinessHours, locationMap])\n\n const events = useMemo(() =>\n [...bookingEvents, ...availabilityEvents], [bookingEvents, availabilityEvents])\n\n const storedView = prefs.get('calendarView')\n const effectiveInitialView = resourceCapable ? viewForResources(storedView) : viewForNoResources(storedView)\n\n // ── Calendar handlers ──\n const handleDatesSet = useCallback((arg: { startStr: string; endStr: string; view: { title: string; type: string } }) => {\n setCalendarTitle(arg.view.title)\n setView(arg.view.type)\n setVisibleRange({ start: arg.startStr, end: arg.endStr })\n fetchBookings({ start: arg.startStr, end: arg.endStr })\n }, [fetchBookings, setView])\n\n // Double-click → open edit directly\n // Right-click → context menu\n const handleEventDidMount = useCallback((arg: { event: any; el: HTMLElement }) => {\n const booking = arg.event.extendedProps?.booking as CalendarBooking | undefined\n if (booking) arg.el.setAttribute('data-booking-id', booking.id)\n arg.el.addEventListener('dblclick', (e) => {\n e.preventDefault()\n e.stopPropagation()\n skipClickRef.current = true\n const booking = arg.event.extendedProps.booking as CalendarBooking\n setSelectedBooking(null)\n setPopoverAnchor(null)\n setContextMenu(null)\n openModal('edit', { bookingId: booking.id })\n })\n arg.el.addEventListener('contextmenu', (e) => {\n e.preventDefault()\n const booking = arg.event.extendedProps.booking as CalendarBooking\n const menuW = 210, menuH = 200\n let x = e.clientX + 4\n let y = e.clientY + 4\n if (x + menuW > window.innerWidth - 12) x = x - menuW\n if (y + menuH > window.innerHeight - 12) y = y - menuH\n setContextMenu({ booking, x, y })\n setContextMenuVisible(true)\n setSelectedBooking(null)\n setPopoverAnchor(null)\n })\n }, [])\n\n // Flag to suppress single-click after a double-click\n const skipClickRef = useRef(false)\n\n // Hover timer — show popover after 4s hover on a booking event\n const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const handleEventMouseEnter = useCallback((arg: { event: any; el: HTMLElement }) => {\n if (arg.event.display === 'background') return\n if (arg.event.extendedProps?.isLocationLabel) return\n const booking = arg.event.extendedProps.booking as CalendarBooking\n if (!booking) return\n\n hoverTimerRef.current = setTimeout(() => {\n const rect = arg.el.getBoundingClientRect()\n const popW = 320, popH = 340\n let x = rect.right + 8\n let y = rect.top + rect.height / 2 - popH / 2\n if (x + popW > window.innerWidth - 16) x = rect.left - popW - 8\n if (x < 16) x = Math.max(16, rect.left + rect.width / 2 - popW / 2)\n if (y + popH > window.innerHeight - 16) y = window.innerHeight - popH - 16\n if (y < 16) y = 16\n setSelectedBooking(booking)\n setPopoverAnchor({ x, y })\n setPopoverVisible(true)\n }, 3000)\n }, [])\n\n const handleEventMouseLeave = useCallback(() => {\n if (hoverTimerRef.current) {\n clearTimeout(hoverTimerRef.current)\n hoverTimerRef.current = null\n }\n }, [])\n\n // Single click — open popover instantly, or slide to new position if already open\n const handleEventClick = useCallback((arg: EventClickArg) => {\n if (skipClickRef.current) { skipClickRef.current = false; return }\n // Ignore clicks on background availability events and location labels\n if (arg.event.display === 'background') return\n if (arg.event.extendedProps?.isLocationLabel) return\n setContextMenu(null); setContextMenuVisible(false)\n const booking = arg.event.extendedProps.booking as CalendarBooking\n if (!booking) return\n const rect = arg.el.getBoundingClientRect()\n const popW = 320, popH = 340\n let x = rect.right + 8\n let y = rect.top + rect.height / 2 - popH / 2\n if (x + popW > window.innerWidth - 16) x = rect.left - popW - 8\n if (x < 16) x = Math.max(16, rect.left + rect.width / 2 - popW / 2)\n if (y + popH > window.innerHeight - 16) y = window.innerHeight - popH - 16\n if (y < 16) y = 16\n // Always update — if popover is already open it slides to the new position\n setSelectedBooking(booking)\n setPopoverAnchor({ x, y })\n setPopoverVisible(true)\n }, [])\n\n // Find the schedule block covering a given time slot for a professional\n const findScheduleForSlot = useCallback((professionalId: string | undefined, dateTimeStr: string): Schedule | null => {\n if (!professionalId) return null\n const dt = new Date(dateTimeStr)\n const dateStr = dt.toISOString().slice(0, 10)\n const dayOfWeek = dt.getDay()\n const timeMin = dt.getHours() * 60 + dt.getMinutes()\n\n const profSchedules = schedules.filter((s) => s.assigneeId === professionalId)\n const exceptions = profSchedules.filter((s) => s.specificDate === dateStr && s.isActive)\n const weekly = profSchedules.filter((s) => s.dayOfWeek === dayOfWeek && s.isActive && !s.specificDate)\n const daySchedules = exceptions.length > 0 ? exceptions : weekly\n\n for (const s of daySchedules) {\n const [sh, sm] = s.startsAt.split(':').map(Number)\n const [eh, em] = s.endsAt.split(':').map(Number)\n if (timeMin >= sh * 60 + sm && timeMin < eh * 60 + em) return s\n }\n return null\n }, [schedules])\n\n const handleSelect = useCallback((arg: DateSelectArg) => {\n calendarRef.current?.getApi().unselect()\n\n // Don't open create if popover/context menu is showing — dismiss them instead\n if (popoverVisibleRef.current || contextMenuVisibleRef.current) {\n setPopoverVisible(false); setSelectedBooking(null); setPopoverAnchor(null)\n setContextMenuVisible(false); setContextMenu(null)\n return\n }\n\n const professionalId = arg.resource?.id\n const schedule = findScheduleForSlot(professionalId, arg.startStr)\n\n const proceed = () => {\n const locId = schedule?.locationId ?? (schedule?.metadata?.locationId as string | undefined)\n openModal('create', { prefill: { startsAt: arg.startStr, endsAt: arg.endStr, professionalId, locationId: locId || undefined } })\n }\n\n // Warn if no schedule covers this slot — only when the working-hours module\n // is on (off by default in eventMode:'simple', so simple/Google-Calendar\n // events never surface the \"no open schedule for this professional\" dialog).\n if (config.modules.workingHours && !schedule) {\n setScheduleConfirm({ onConfirm: proceed })\n return\n }\n\n proceed()\n }, [openModal, findScheduleForSlot, config.modules.workingHours])\n\n const handleEventDrop = useCallback(async (arg: EventDropArg) => {\n const booking = arg.event.extendedProps.booking as CalendarBooking\n try { await rescheduleBooking(booking.id, arg.event.startStr, arg.event.endStr, arg.newResource?.id ?? undefined) }\n catch { arg.revert() }\n }, [rescheduleBooking])\n\n const handleViewChange = useCallback((v: string) => {\n calendarRef.current?.getApi().changeView(v)\n prefs.set('calendarView', v)\n }, [prefs])\n // Mobile switcher: swap between the list sentinel and a real grid view. When a\n // grid is picked we also sync the store's currentView so the resource-collapse\n // effect doesn't fight the freshly-mounted mobile calendar; if it's already\n // mounted (grid → grid), changeView animates in place.\n const handleMobileViewChange = useCallback((v: string) => {\n setMobileView(v)\n if (v === MOBILE_LIST_VIEW) return\n setView(v)\n calendarRef.current?.getApi()?.changeView(v)\n }, [setView])\n const handlePrev = useCallback(() => calendarRef.current?.getApi().prev(), [])\n const handleNext = useCallback(() => calendarRef.current?.getApi().next(), [])\n const handleToday = useCallback(() => { calendarRef.current?.getApi().today(); setSelectedDate(new Date()) }, [])\n\n function handleMiniDateSelect(date: Date) {\n setSelectedDate(date)\n calendarRef.current?.getApi().gotoDate(date)\n }\n\n function toggleProfessional(id: string) {\n const next = selectedProfIds.includes(id)\n ? selectedProfIds.filter((p) => p !== id)\n : [...selectedProfIds, id]\n setFilters({ professionalIds: next })\n }\n\n function toggleStatus(value: string) {\n const next = selectedStatuses.includes(value)\n ? selectedStatuses.filter((s) => s !== value)\n : [...selectedStatuses, value]\n setFilters({ statuses: next })\n }\n\n // Alternating resource backgrounds — apply via DOM after render\n const wrapperRef = useRef<HTMLDivElement>(null)\n\n // Responsive day headers — collapse weekday names to a single initial (S M T\n // W T F S, Google-Calendar style) when day columns get too narrow. Measured\n // from the actual rendered column width so it adapts to resource count + view.\n const [dayHeaderCompact, setDayHeaderCompact] = useState(false)\n useEffect(() => {\n const container = wrapperRef.current\n if (!container) return\n let frame = 0\n const measure = () => {\n // Measure an actual DAY column ([data-date]) — in resource views the first\n // .fc-col-header-cell is the wide resource header, not a day column.\n const cell = container.querySelector('.fc-col-header-cell[data-date]') as HTMLElement | null\n if (!cell) return\n const colWidth = cell.getBoundingClientRect().width\n // Collapse to single-letter ONLY when the full weekday label can't fit.\n // Measure the widest full line (\"WED\" / \"12/14\") in the header's font so\n // the breakpoint adapts to font + locale instead of a magic number.\n const cushion = (cell.querySelector('.fc-col-header-cell-cushion') as HTMLElement | null) ?? cell\n const cs = getComputedStyle(cushion)\n const probe = document.createElement('span')\n probe.style.cssText = 'position:absolute;visibility:hidden;white-space:nowrap;top:-9999px'\n probe.style.fontSize = cs.fontSize\n probe.style.fontWeight = cs.fontWeight\n probe.style.fontFamily = cs.fontFamily\n probe.style.letterSpacing = cs.letterSpacing\n probe.style.textTransform = cs.textTransform\n document.body.appendChild(probe)\n probe.textContent = 'Wed'\n const weekdayWidth = probe.getBoundingClientRect().width\n probe.textContent = '12/14'\n const dateWidth = probe.getBoundingClientRect().width\n probe.remove()\n const needed = Math.max(weekdayWidth, dateWidth) + 12 // text + cushion padding\n setDayHeaderCompact(colWidth < needed)\n }\n // FullCalendar reflows its inner day columns on a later tick than the\n // container resize, so re-measure across a few frames to read settled widths.\n const timers: ReturnType<typeof setTimeout>[] = []\n const schedule = () => {\n cancelAnimationFrame(frame)\n frame = requestAnimationFrame(measure)\n timers.forEach(clearTimeout)\n timers.length = 0\n timers.push(setTimeout(measure, 130), setTimeout(measure, 330))\n }\n schedule()\n const ro = new ResizeObserver(schedule)\n ro.observe(container)\n return () => { cancelAnimationFrame(frame); timers.forEach(clearTimeout); ro.disconnect() }\n }, [resources, currentView, visibleRange])\n\n const applyResourceStriping = useCallback(() => {\n const container = wrapperRef.current\n if (!container) return\n const resourceIds = resources.map((r: { id: string }) => r.id)\n if (resourceIds.length < 2) return\n container.querySelectorAll('[data-resource-id]').forEach((el: Element) => {\n const rid = el.getAttribute('data-resource-id')\n const idx = rid ? resourceIds.indexOf(rid) : -1\n el.classList.toggle('fc-resource-alt', idx % 2 === 1)\n })\n }, [resources])\n\n useEffect(() => {\n applyResourceStriping()\n const t1 = setTimeout(applyResourceStriping, 100)\n const t2 = setTimeout(applyResourceStriping, 300)\n return () => { clearTimeout(t1); clearTimeout(t2) }\n }, [applyResourceStriping, currentView, visibleRange, bookings])\n\n // Listen for cross-plugin booking open requests (e.g., from financial invoice detail)\n useEffect(() => {\n function handleOpenBooking(e: Event) {\n const detail = (e as CustomEvent).detail ?? {}\n const externalSource = detail.source\n ? { type: String(detail.source), id: detail.waitlistId, waitlistId: detail.waitlistId }\n : undefined\n if (detail.bookingId) {\n openModal('edit', { bookingId: detail.bookingId, externalSource })\n return\n }\n openModal('create', {\n prefill: detail.prefill ?? {\n clientId: detail.clientId,\n professionalId: detail.professionalId,\n locationId: detail.locationId,\n startsAt: detail.startsAt,\n },\n externalSource,\n })\n }\n window.addEventListener('agenda:open-booking', handleOpenBooking)\n return () => window.removeEventListener('agenda:open-booking', handleOpenBooking)\n }, [openModal])\n\n // Custom day header: weekday + date stacked. When columns get narrow it\n // collapses the weekday to a single initial (S / 16, Google-Calendar style).\n // Always returns explicit content — returning undefined renders an EMPTY\n // header in the React adapter rather than falling back to the default.\n const dayHeaderContent = useCallback((arg: any) => {\n const date: Date = arg.date\n const dateLocale = currentLocale === 'pt-BR' ? 'pt-BR' : 'en'\n // Inline styles (not CSS classes) so stacking is guaranteed regardless of\n // the runtime style-injection state.\n const wrapStyle: React.CSSProperties = { display: 'flex', flexDirection: 'column', alignItems: 'center', lineHeight: 1.15 }\n const dateStyle: React.CSSProperties = { fontSize: '0.65rem', opacity: 0.75 }\n if (dayHeaderCompact) {\n const letter = date.toLocaleDateString(dateLocale, { weekday: 'narrow' })\n return (\n <div style={wrapStyle}>\n <span style={{ fontWeight: 600 }}>{letter}</span>\n <span style={dateStyle}>{date.getDate()}</span>\n </div>\n )\n }\n const weekday = date.toLocaleDateString(dateLocale, { weekday: 'short' })\n return (\n <div style={wrapStyle}>\n <span>{weekday}</span>\n <span style={dateStyle}>{`${date.getMonth() + 1}/${date.getDate()}`}</span>\n </div>\n )\n }, [dayHeaderCompact, currentLocale])\n\n const resourceLabelContent = useCallback((arg: any) => {\n const { id, title, extendedProps } = arg.resource\n const initials = title.split(' ').map((n: string) => n[0]).join('').slice(0, 2)\n return (\n <div className=\"flex items-center gap-2 px-2 py-1.5\">\n <div className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-primary/10 text-[10px] font-bold text-primary\">{initials}</div>\n <div className=\"min-w-0\">\n <PersonLink\n personId={id}\n name={title}\n size=\"sm\"\n tab=\"schedule\"\n profileHref={`#/registry/staff/${id}/schedule`}\n />\n {extendedProps?.locationName && <p className=\"text-[10px] text-muted-foreground truncate\">{extendedProps.locationName}</p>}\n </div>\n </div>\n )\n }, [])\n\n const eventContent = useCallback((arg: any) => {\n // Location label events — render as a small tag\n if (arg.event.extendedProps?.isLocationLabel) {\n return (\n <div className=\"px-1.5 py-0.5 overflow-hidden\">\n <p className=\"text-[10px] font-medium truncate\">{arg.event.title}</p>\n </div>\n )\n }\n const serviceNames = arg.event.extendedProps?.serviceNames\n const start = arg.event.start\n const end = arg.event.end\n const fmt = (d: Date) => `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`\n const timeRange = start && end ? `${fmt(start)} – ${fmt(end)}` : start ? fmt(start) : ''\n return (\n <div className=\"px-1.5 py-0.5 overflow-hidden leading-tight h-full\">\n <div className=\"flex items-start justify-between gap-1\">\n <p className=\"text-[11px] font-semibold truncate\">{arg.event.title}</p>\n {serviceNames && <p className=\"text-[10px] opacity-60 truncate shrink-0 max-w-[45%] text-right\">{serviceNames}</p>}\n </div>\n {timeRange && <p className=\"text-[9px] opacity-50\">{timeRange}</p>}\n </div>\n )\n }, [])\n\n return (\n <div className=\"flex h-[calc(100vh-7.5rem)]\">\n {/* ═══ LEFT SIDEBAR — hidden on mobile ═══ */}\n <div className=\"hidden md:flex w-[220px] shrink-0 flex-col overflow-y-auto py-4 px-3 mr-4\">\n {/* + Create button */}\n <button\n onClick={() => openModal('create')}\n className=\"flex items-center gap-2 rounded-button bg-primary text-primary-foreground border border-primary pl-3 pr-4 py-1.5 text-sm font-semibold hover:bg-primary/90 shadow-button-primary active:shadow-button-inset transition-all mb-6 w-fit\"\n >\n <Plus className=\"h-4 w-4\" />\n {t('agenda.sidebar.create')}\n </button>\n\n {/* Mini month calendar */}\n <MiniCalendar selectedDate={selectedDate} onDateSelect={handleMiniDateSelect} />\n\n {/* Agendas (professional filter) — hidden when no booking type uses a\n professional (e.g. eventMode:'simple'). */}\n {config.capabilities.professional && (<>\n <div className=\"h-px bg-border my-4\" />\n\n <button onClick={() => setProfSectionOpen((p) => !p)}\n className=\"flex items-center justify-between w-full text-xs font-medium text-muted-foreground hover:text-foreground py-1 transition-colors\">\n <span>Agendas</span>\n <ChevronDown className={`h-3.5 w-3.5 transition-transform ${profSectionOpen ? '' : '-rotate-90'}`} />\n </button>\n {profSectionOpen && (\n <div className=\"mt-1.5 space-y-0.5\">\n {professionals.map((prof) => {\n const active = selectedProfIds.length === 0 || selectedProfIds.includes(prof.id)\n return (\n <label key={prof.id} className=\"flex items-center gap-2.5 rounded px-1 py-1 cursor-pointer hover:bg-muted/50 transition-colors\">\n <span className={`flex h-4 w-4 shrink-0 items-center justify-center rounded-sm border-2 transition-colors ${\n active ? 'border-primary bg-primary' : 'border-muted-foreground/30'\n }`}>\n {active && <svg className=\"h-2.5 w-2.5 text-primary-foreground\" viewBox=\"0 0 12 12\" fill=\"none\"><path d=\"M2 6l3 3 5-5\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>}\n </span>\n <span className={`text-xs truncate ${active ? 'text-foreground' : 'text-muted-foreground'}`}>{prof.name}</span>\n <input type=\"checkbox\" className=\"sr-only\" checked={active} onChange={() => toggleProfessional(prof.id)} />\n </label>\n )\n })}\n </div>\n )}\n </>)}\n\n {/* Status filter — hidden when no booking type uses a status workflow\n (e.g. eventMode:'simple'). */}\n {config.capabilities.status && (<>\n <div className=\"h-px bg-border my-4\" />\n\n <button onClick={() => setStatusSectionOpen((p) => !p)}\n className=\"flex items-center justify-between w-full text-xs font-medium text-muted-foreground hover:text-foreground py-1 transition-colors\">\n <span>Status</span>\n <ChevronDown className={`h-3.5 w-3.5 transition-transform ${statusSectionOpen ? '' : '-rotate-90'}`} />\n </button>\n {statusSectionOpen && (\n <div className=\"mt-1.5 space-y-0.5\">\n {config.statuses.map((st) => {\n const active = selectedStatuses.length === 0 || selectedStatuses.includes(st.value)\n return (\n <label key={st.value} className=\"flex items-center gap-2.5 rounded px-1 py-1 cursor-pointer hover:bg-muted/50 transition-colors\">\n <span className=\"flex h-4 w-4 shrink-0 items-center justify-center rounded-sm border-2 transition-colors\"\n style={{ borderColor: active ? st.color : st.color + '40', backgroundColor: active ? st.color : 'transparent' }}>\n {active && <svg className=\"h-2.5 w-2.5 text-white\" viewBox=\"0 0 12 12\" fill=\"none\"><path d=\"M2 6l3 3 5-5\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>}\n </span>\n <span className={`text-xs ${active ? 'text-foreground' : 'text-muted-foreground'}`}>{st.label}</span>\n <input type=\"checkbox\" className=\"sr-only\" checked={active} onChange={() => toggleStatus(st.value)} />\n </label>\n )\n })}\n </div>\n )}\n </>)}\n </div>\n\n {/* ═══ MAIN AREA ═══ */}\n <div className=\"flex-1 flex flex-col min-w-0 overflow-hidden\">\n {/* Toolbar */}\n <div className=\"shrink-0 border-b\">\n {/* Row 1 — create + date nav + title (left), desktop switcher + settings\n (right). Extra right padding on mobile clears the transparent header's\n floating profile avatar, which otherwise overlaps the settings gear. */}\n <div className=\"flex items-center justify-between pl-4 pr-14 md:px-4 h-12\">\n <div className=\"flex items-center gap-3 min-w-0\">\n {/* Mobile create button */}\n <button onClick={() => openModal('create')}\n className=\"md:hidden flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-primary text-primary-foreground\">\n <Plus className=\"h-4 w-4\" />\n </button>\n\n {/* Date navigation drives the FullCalendar api — shown on desktop and,\n on mobile, only when a grid view is active (the list paginates\n itself, so it has no grid to page through). */}\n <div className={`${mobileGridActive ? 'flex' : 'hidden'} md:flex items-center gap-3`}>\n <button onClick={handleToday}\n className=\"rounded-md border px-3 py-1 text-sm font-medium hover:bg-muted bg-card shadow-button active:shadow-button-inset transition-colors\">\n {t('agenda.toolbar.today')}\n </button>\n <div className=\"flex items-center gap-0.5\">\n <button onClick={handlePrev} className=\"flex h-7 w-7 items-center justify-center rounded-full hover:bg-muted transition-colors\">\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n <button onClick={handleNext} className=\"flex h-7 w-7 items-center justify-center rounded-full hover:bg-muted transition-colors\">\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n <h1 className=\"text-base sm:text-lg font-normal truncate\">{isMobile && !mobileGridActive ? t('agenda.calendar.viewAgenda') : calendarTitle}</h1>\n </div>\n\n <div className=\"flex items-center gap-1 shrink-0\">\n <div className=\"hidden md:flex items-center gap-1\">\n {viewOptions.map((opt) => (\n <button key={opt.key} onClick={() => handleViewChange(opt.key)}\n className={`rounded-md px-3 py-1 text-sm transition-colors ${\n currentView === opt.key\n ? 'bg-primary/10 text-primary font-medium'\n : 'text-muted-foreground hover:bg-muted/50'\n }`}>\n {t(opt.labelKey)}\n </button>\n ))}\n </div>\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => window.location.hash = '/settings/agenda'}\n title=\"Agenda Settings\"\n className=\"ml-1\"\n >\n <Settings className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n\n {/* Row 2 (mobile only) — compact segmented view switcher on its own row so\n it never collides with the floating avatar. Dia/Semana/Mês mount the\n calendar; Lista returns to the thumb-friendly agenda list. */}\n <div className=\"flex md:hidden items-center gap-1 overflow-x-auto px-3 pb-2\">\n {mobileViewOptions.map((opt) => (\n <button key={opt.key} onClick={() => handleMobileViewChange(opt.key)}\n className={`shrink-0 rounded-md px-3 py-1 text-sm transition-colors ${\n mobileView === opt.key\n ? 'bg-primary/10 text-primary font-medium'\n : 'text-muted-foreground hover:bg-muted/50'\n }`}>\n {t(opt.labelKey)}\n </button>\n ))}\n </div>\n </div>\n\n {/* Mobile list view → thumb-friendly agenda list; otherwise (desktop, or a\n mobile grid view the user switched to) → FullCalendar grid. */}\n {isMobile && !mobileGridActive ? (\n <AgendaMobileList\n bookings={bookings}\n statusColors={statusColors}\n currencyCode={config.currency.code}\n onSelect={(b) => openModal('edit', { bookingId: b.id })}\n />\n ) : professionalsLoading && professionals.length === 0 ? (\n <CalendarSkeleton profCount={2} />\n ) : (\n <div ref={wrapperRef} className=\"flex-1 overflow-hidden agenda-calendar\">\n <FullCalendar\n ref={calendarRef}\n plugins={[dayGridPlugin, timeGridPlugin, resourceTimeGridPlugin, interactionPlugin, listPlugin]}\n initialView={mobileGridActive ? mobileView : effectiveInitialView}\n schedulerLicenseKey=\"CC-Attribution-NonCommercial-NoDerivatives\"\n resources={resourceCapable ? resources : undefined}\n events={events}\n headerToolbar={false}\n locale={fcLocale}\n height=\"100%\"\n slotMinTime={effectiveBusinessHours.startTime + ':00'}\n slotMaxTime={effectiveBusinessHours.endTime + ':00'}\n slotDuration={{ minutes: config.slotDuration }}\n allDaySlot={false}\n nowIndicator={true}\n editable={config.modules.dragAndDrop}\n selectable={true}\n selectMirror={true}\n eventOverlap={false}\n datesSet={handleDatesSet}\n eventDidMount={handleEventDidMount}\n eventClick={handleEventClick}\n eventMouseEnter={handleEventMouseEnter}\n eventMouseLeave={handleEventMouseLeave}\n select={handleSelect}\n eventDrop={handleEventDrop}\n resourceLabelContent={resourceLabelContent}\n dayHeaderContent={dayHeaderContent}\n eventContent={eventContent}\n resourceOrder=\"title\"\n stickyHeaderDates={true}\n expandRows={false}\n eventTimeFormat={{ hour: '2-digit', minute: '2-digit', hour12: false }}\n slotLabelFormat={{ hour: '2-digit', minute: '2-digit', hour12: false }}\n />\n </div>\n )}\n </div>\n\n {/* Popover — stays mounted until animation finishes */}\n {selectedBooking && popoverAnchor && popoverVisible && (\n <AppointmentPopover booking={selectedBooking} position={popoverAnchor}\n onClose={() => {\n // Called AFTER the popover's exit animation finishes\n setPopoverVisible(false)\n setSelectedBooking(null)\n setPopoverAnchor(null)\n }}\n onEdit={(id) => {\n setPopoverVisible(false)\n setSelectedBooking(null)\n setPopoverAnchor(null)\n openModal('edit', { bookingId: id })\n }} />\n )}\n\n {/* Context Menu */}\n {contextMenu && (\n <EventContextMenu\n booking={contextMenu.booking}\n position={{ x: contextMenu.x, y: contextMenu.y }}\n onClose={() => { setContextMenuVisible(false); setContextMenu(null) }}\n onEdit={(id) => { setContextMenuVisible(false); setContextMenu(null); openModal('edit', { bookingId: id }) }}\n />\n )}\n\n {/* No-schedule confirm */}\n <ConfirmDialog\n open={!!scheduleConfirm}\n variant=\"warning\"\n title={t('agenda.calendar.noScheduleConfirm')}\n confirmLabel={t('common.confirm')}\n cancelLabel={t('common.cancel')}\n onConfirm={() => { const cb = scheduleConfirm?.onConfirm; setScheduleConfirm(null); cb?.() }}\n onCancel={() => setScheduleConfirm(null)}\n />\n\n {/* Modal — always mounted, Radix controls open/close animation */}\n <AppointmentModal\n open={modalState.open}\n mode={modalState.mode}\n bookingId={modalState.bookingId}\n prefill={modalState.prefill}\n initialTab={modalState.initialTab}\n externalSource={modalState.externalSource}\n onClose={closeModal}\n onCreated={(newId, source) => {\n if (config.onBookingCreated) {\n void Promise.resolve(config.onBookingCreated({ bookingId: newId, source })).catch((error: unknown) => {\n console.error('Failed to run agenda booking-created bridge', error)\n })\n }\n // After a short delay (let calendar re-render), find the event and show popover\n setTimeout(() => {\n const booking = bookings.find((b: CalendarBooking) => b.id === newId)\n if (!booking) return\n const el = document.querySelector(`[data-booking-id=\"${newId}\"]`) as HTMLElement | null\n if (el) {\n const rect = el.getBoundingClientRect()\n const popW = 320, popH = 340\n let x = rect.right + 8\n let y = rect.top + rect.height / 2 - popH / 2\n if (x + popW > window.innerWidth - 16) x = rect.left - popW - 8\n if (y + popH > window.innerHeight - 16) y = window.innerHeight - popH - 16\n if (y < 16) y = 16\n setSelectedBooking(booking)\n setPopoverAnchor({ x, y })\n setPopoverVisible(true)\n }\n }, 400)\n }} />\n </div>\n )\n}\n","import React from 'react'\nimport { usePluginRuntimeOptional } from '@fayz-ai/core'\nimport type { StoreApi } from 'zustand/vanilla'\nimport { AgendaContextProvider } from './AgendaContext'\nimport type { ResolvedAgendaConfig } from './config'\nimport type { AgendaDataProvider } from './data/types'\nimport type { AgendaUIState } from './store'\nimport { CalendarView } from './views/CalendarView'\nimport { setAgendaTenantId } from './lib/tenant'\n\n// ---------------------------------------------------------------------------\n// Main page — clean single-page calendar, no module nav wrapper\n// ---------------------------------------------------------------------------\n\nexport function AgendaPage({ config, provider, store }: {\n config: ResolvedAgendaConfig\n provider: AgendaDataProvider\n store: StoreApi<AgendaUIState>\n}) {\n const runtime = usePluginRuntimeOptional()\n const tenantId = runtime?.context.tenant?.id\n\n React.useEffect(() => {\n setAgendaTenantId(tenantId)\n return () => setAgendaTenantId(undefined)\n }, [tenantId])\n\n return (\n <AgendaContextProvider config={config} provider={provider} store={store}>\n <CalendarView />\n </AgendaContextProvider>\n )\n}\n","import { createStore, type StoreApi } from 'zustand/vanilla'\nimport { dedup } from '@fayz-ai/saas'\nimport { toast } from '@fayz-ai/ui'\nimport { getScheduleBlockConfig, setScheduleBlockConfig } from '@fayz-ai/saas'\nimport type { AgendaDataProvider } from './data/types'\nimport type { AgendaFinancialBridge } from './financial-bridge'\nimport type { ExternalBookingSource } from './config'\nimport type {\n CalendarBooking, Professional, Schedule,\n CreateBookingInput, UpdateBookingInput, BookingQuery,\n} from './types'\n\n// ---------------------------------------------------------------------------\n// Store state\n// ---------------------------------------------------------------------------\n\nexport interface AgendaUIState {\n // Calendar data\n bookings: CalendarBooking[]\n bookingsLoading: boolean\n dateRange: { start: string; end: string }\n currentView: string\n selectedDate: string\n\n // Resources\n professionals: Professional[]\n professionalsLoading: boolean\n\n // Filters\n selectedProfessionalIds: string[]\n selectedLocationId: string | null\n selectedStatuses: string[]\n\n // Locations\n locations: Array<{ id: string; name: string }>\n\n // Schedules\n schedules: Schedule[]\n schedulesLoading: boolean\n\n // Confirmations\n pendingConfirmations: CalendarBooking[]\n confirmationsLoading: boolean\n\n // Modal state\n appointmentModal: {\n open: boolean\n mode: 'create' | 'edit'\n bookingId?: string\n prefill?: Partial<CreateBookingInput> & { endsAt?: string }\n initialTab?: string\n externalSource?: ExternalBookingSource\n }\n\n // Actions\n fetchBookings(range: { start: string; end: string }): Promise<void>\n fetchProfessionals(): Promise<void>\n fetchLocations(): Promise<void>\n fetchSchedules(professionalId?: string): Promise<void>\n fetchConfirmations(): Promise<void>\n createBooking(input: CreateBookingInput): Promise<CalendarBooking>\n updateBooking(id: string, data: UpdateBookingInput): Promise<CalendarBooking>\n deleteBooking(id: string): Promise<void>\n updateBookingStatus(id: string, status: string): Promise<void>\n rescheduleBooking(id: string, newStart: string, newEnd: string, newProfessionalId?: string): Promise<void>\n setFilters(filters: Partial<{ professionalIds: string[]; locationId: string | null; statuses: string[] }>): void\n setView(view: string): void\n setSelectedDate(date: string): void\n openAppointmentModal(mode: 'create' | 'edit', options?: { bookingId?: string; prefill?: Partial<CreateBookingInput> & { endsAt?: string }; initialTab?: string; externalSource?: ExternalBookingSource }): void\n closeAppointmentModal(): void\n}\n\n// ---------------------------------------------------------------------------\n// Store factory\n// ---------------------------------------------------------------------------\n\nfunction getCurrentBookingQuery(state: AgendaUIState, dateRange = state.dateRange): BookingQuery {\n return {\n dateRange,\n professionalIds: state.selectedProfessionalIds.length ? state.selectedProfessionalIds : undefined,\n locationId: state.selectedLocationId ?? undefined,\n statuses: state.selectedStatuses.length ? state.selectedStatuses : undefined,\n }\n}\n\nexport function createAgendaStore(provider: AgendaDataProvider, financialBridge?: AgendaFinancialBridge): StoreApi<AgendaUIState> {\n return createStore<AgendaUIState>((set, get) => ({\n bookings: [],\n bookingsLoading: false,\n dateRange: { start: '', end: '' },\n currentView: 'resourceTimeGridDay',\n selectedDate: new Date().toISOString().slice(0, 10),\n\n professionals: [],\n professionalsLoading: false,\n\n selectedProfessionalIds: [],\n selectedLocationId: null,\n selectedStatuses: ['scheduled', 'confirmed', 'in_progress', 'completed'],\n\n locations: [],\n\n schedules: [],\n schedulesLoading: false,\n\n pendingConfirmations: [],\n confirmationsLoading: false,\n\n appointmentModal: { open: false, mode: 'create' },\n\n async fetchBookings(range) {\n const key = `agenda:bookings:${range.start}:${range.end}`\n return dedup(key, async () => {\n set({ bookingsLoading: true, dateRange: range })\n const state = get()\n const query = getCurrentBookingQuery(state, range)\n let bookings = await provider.getBookings(query)\n\n // Enrich with payment status if financial bridge is available\n if (financialBridge) {\n const orderIds = bookings.map((b) => b.orderId).filter((id): id is string => !!id)\n if (orderIds.length > 0) {\n try {\n const statuses = await financialBridge.resolvePaymentStatuses(orderIds)\n bookings = bookings.map((b) => {\n if (!b.orderId) return b\n const summary = statuses.get(b.orderId)\n return summary ? { ...b, paymentStatus: summary.status } : b\n })\n } catch { /* non-blocking */ }\n }\n }\n\n set({ bookings, bookingsLoading: false })\n })\n },\n\n async fetchProfessionals() {\n return dedup('agenda:professionals', async () => {\n set({ professionalsLoading: true })\n const professionals = await provider.getProfessionals()\n set({ professionals, professionalsLoading: false })\n })\n },\n\n async fetchLocations() {\n return dedup('agenda:locations', async () => {\n if (!provider.getLocations) return\n const locations = await provider.getLocations()\n set({ locations })\n // Update global schedule block config so ScheduleEditor picks up locations\n const current = getScheduleBlockConfig()\n if (current) {\n setScheduleBlockConfig({ ...current, locations })\n }\n })\n },\n\n async fetchSchedules(professionalId) {\n return dedup('agenda:schedules:' + (professionalId ?? 'all'), async () => {\n set({ schedulesLoading: true })\n const schedules = await provider.getSchedules(professionalId)\n set({ schedules, schedulesLoading: false })\n })\n },\n\n async fetchConfirmations() {\n return dedup('agenda:confirmations', async () => {\n set({ confirmationsLoading: true })\n const pendingConfirmations = await provider.getConfirmationsPending()\n set({ pendingConfirmations, confirmationsLoading: false })\n })\n },\n\n async createBooking(input) {\n try {\n const booking = await provider.createBooking(input)\n // Refresh bookings for current range\n const state = get()\n if (state.dateRange.start && state.dateRange.end) {\n const bookings = await provider.getBookings(getCurrentBookingQuery(state))\n set({ bookings })\n }\n toast.success('Appointment created')\n return booking\n } catch (err: any) {\n toast.error('Failed to create appointment', { description: err?.message })\n throw err\n }\n },\n\n async updateBooking(id, data) {\n try {\n const booking = await provider.updateBooking(id, data)\n const state = get()\n if (state.dateRange.start && state.dateRange.end) {\n const bookings = await provider.getBookings(getCurrentBookingQuery(state))\n set({ bookings })\n }\n toast.success('Appointment updated')\n return booking\n } catch (err: any) {\n toast.error('Failed to update appointment', { description: err?.message })\n throw err\n }\n },\n\n async deleteBooking(id) {\n try {\n await provider.deleteBooking(id)\n const state = get()\n if (state.dateRange.start && state.dateRange.end) {\n const bookings = await provider.getBookings(getCurrentBookingQuery(state))\n set({ bookings })\n }\n toast.success('Appointment deleted')\n } catch (err: any) {\n toast.error('Failed to delete appointment', { description: err?.message })\n throw err\n }\n },\n\n async updateBookingStatus(id, status) {\n // Optimistic update — change color immediately\n const prev = get().bookings\n set({ bookings: prev.map((b) => b.id === id ? { ...b, status: status as any } : b) })\n try {\n await provider.updateBookingStatus(id, status)\n // Refresh from server to get full data\n const state = get()\n if (state.dateRange.start && state.dateRange.end) {\n const bookings = await provider.getBookings(getCurrentBookingQuery(state))\n set({ bookings })\n }\n toast.success('Status updated')\n } catch (err: any) {\n // Rollback on failure\n set({ bookings: prev })\n toast.error('Failed to update status', { description: err?.message })\n throw err\n }\n },\n\n async rescheduleBooking(id, newStart, newEnd, newProfessionalId) {\n try {\n // Check for conflicts\n const existing = get().bookings.find((b) => b.id === id)\n const assigneeId = newProfessionalId ?? existing?.professionalId\n if (assigneeId) {\n const hasConflict = await provider.checkConflict({\n assigneeId,\n startsAt: newStart,\n endsAt: newEnd,\n excludeBookingId: id,\n })\n if (hasConflict) {\n toast.error('Time conflict detected', { description: 'This professional already has an appointment at this time.' })\n throw new Error('Time conflict')\n }\n }\n await provider.updateBooking(id, {\n startsAt: newStart,\n endsAt: newEnd,\n ...(newProfessionalId && { professionalId: newProfessionalId }),\n })\n const state = get()\n if (state.dateRange.start && state.dateRange.end) {\n const bookings = await provider.getBookings(getCurrentBookingQuery(state))\n set({ bookings })\n }\n toast.success('Appointment rescheduled')\n } catch (err: any) {\n if (err?.message !== 'Time conflict') {\n toast.error('Failed to reschedule', { description: err?.message })\n }\n throw err\n }\n },\n\n setFilters(filters) {\n set({\n ...(filters.professionalIds !== undefined && { selectedProfessionalIds: filters.professionalIds }),\n ...(filters.locationId !== undefined && { selectedLocationId: filters.locationId }),\n ...(filters.statuses !== undefined && { selectedStatuses: filters.statuses }),\n })\n // Re-fetch with new filters\n const { dateRange } = get()\n if (dateRange.start && dateRange.end) {\n get().fetchBookings(dateRange)\n }\n },\n\n setView(view) { set({ currentView: view }) },\n setSelectedDate(date) { set({ selectedDate: date }) },\n\n openAppointmentModal(mode, options) {\n set({ appointmentModal: { open: true, mode, bookingId: options?.bookingId, prefill: options?.prefill, initialTab: options?.initialTab, externalSource: options?.externalSource } })\n },\n\n closeAppointmentModal() {\n // Only toggle open — keep mode/bookingId/prefill intact so layout\n // doesn't shift during the close animation\n set((state) => ({ appointmentModal: { ...state.appointmentModal, open: false } }))\n },\n }))\n}\n","import type { PluginRegistryDef } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Holidays (saas_core.holidays — tenant-scoped)\n// ---------------------------------------------------------------------------\n\nconst holidayEntity: EntityDef = {\n name: 'Holiday',\n namePlural: 'Holidays',\n icon: 'TreePalm',\n displayField: 'name',\n defaultSort: 'date',\n defaultSortDir: 'asc',\n fields: [\n { key: 'name', label: 'Name', type: 'text', required: true, showInTable: true },\n { key: 'date', label: 'Date', type: 'date', required: true, showInTable: true, sortable: true },\n { key: 'recurring', label: 'Recurring Annually', type: 'boolean', showInTable: true, defaultValue: false },\n { key: 'description', label: 'Description', type: 'text', showInTable: false },\n { key: 'isActive', label: 'Active', type: 'boolean', showInTable: true, defaultValue: true },\n ],\n data: {\n table: 'holidays',\n schema: 'saas_core',\n tenantScoped: true,\n },\n}\n\nexport const agendaRegistries: PluginRegistryDef[] = [\n {\n id: 'holidays',\n entity: holidayEntity,\n icon: 'TreePalm',\n description: 'Non-working days and recurring holidays',\n },\n]\n","import React from 'react'\nimport { SettingsGroup, ToggleRow, SelectRow } from '@fayz-ai/saas'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useAgendaSettings } from '../hooks/useAgendaSettings'\n\nconst HOUR_OPTIONS = Array.from({ length: 18 }, (_, i) => {\n const h = (5 + i).toString().padStart(2, '0')\n return { value: `${h}:00`, label: `${h}:00` }\n})\n\nexport function AgendaGeneralSettings() {\n const t = useTranslation()\n const { startTime, endTime, setStartTime, setEndTime } = useAgendaSettings()\n return (\n <div className=\"space-y-4\">\n <SettingsGroup title={t('agenda.settings.scheduling')} description={t('agenda.settings.schedulingDesc')}>\n <ToggleRow label={t('agenda.settings.conflictDetection')} description={t('agenda.settings.conflictDetectionDesc')} checked={true} onChange={() => {}} />\n <ToggleRow label={t('agenda.settings.dragDrop')} description={t('agenda.settings.dragDropDesc')} checked={true} onChange={() => {}} />\n <ToggleRow label={t('agenda.settings.autoCreateOrder')} description={t('agenda.settings.autoCreateOrderDesc')} checked={true} onChange={() => {}} />\n </SettingsGroup>\n\n <SettingsGroup title={t('agenda.settings.locations')} description={t('agenda.settings.locationsDesc')}>\n <ToggleRow label={t('agenda.settings.enableLocation')} description={t('agenda.settings.enableLocationDesc')} checked={false} onChange={() => {}} />\n </SettingsGroup>\n\n <SettingsGroup title={t('agenda.settings.workingHours')} description={t('agenda.settings.workingHoursDesc')}>\n <ToggleRow label={t('agenda.settings.enableWorkingHours')} description={t('agenda.settings.enableWorkingHoursDesc')} checked={true} onChange={() => {}} />\n <ToggleRow label={t('agenda.settings.blockOutside')} description={t('agenda.settings.blockOutsideDesc')} checked={false} onChange={() => {}} />\n </SettingsGroup>\n\n <SettingsGroup title={t('agenda.settings.confirmations')} description={t('agenda.settings.confirmationsDesc')}>\n <ToggleRow label={t('agenda.settings.enableConfirmations')} description={t('agenda.settings.enableConfirmationsDesc')} checked={true} onChange={() => {}} />\n <ToggleRow label={t('agenda.settings.autoConfirm')} description={t('agenda.settings.autoConfirmDesc')} checked={false} onChange={() => {}} />\n <ToggleRow label={t('agenda.settings.reminder')} description={t('agenda.settings.reminderDesc')} checked={true} onChange={() => {}} />\n </SettingsGroup>\n\n <SettingsGroup title={t('agenda.settings.calendarDisplay')} description={t('agenda.settings.calendarDisplayDesc')}>\n <SelectRow\n label={t('agenda.settings.dayStartTime')}\n description={t('agenda.settings.dayStartTimeDesc')}\n value={startTime}\n options={HOUR_OPTIONS}\n onChange={setStartTime}\n />\n <SelectRow\n label={t('agenda.settings.dayEndTime')}\n description={t('agenda.settings.dayEndTimeDesc')}\n value={endTime}\n options={HOUR_OPTIONS}\n onChange={setEndTime}\n />\n <ToggleRow label={t('agenda.settings.showCancelled')} description={t('agenda.settings.showCancelledDesc')} checked={false} onChange={() => {}} />\n <ToggleRow label={t('agenda.settings.showNoShow')} description={t('agenda.settings.showNoShowDesc')} checked={true} onChange={() => {}} />\n <ToggleRow label={t('agenda.settings.compact')} description={t('agenda.settings.compactDesc')} checked={false} onChange={() => {}} />\n </SettingsGroup>\n\n <SettingsGroup title={t('agenda.settings.notifications')} description={t('agenda.settings.notificationsDesc')}>\n <ToggleRow label={t('agenda.settings.newBookingNotif')} description={t('agenda.settings.newBookingNotifDesc')} checked={true} onChange={() => {}} />\n <ToggleRow label={t('agenda.settings.cancelAlerts')} description={t('agenda.settings.cancelAlertsDesc')} checked={true} onChange={() => {}} />\n <ToggleRow label={t('agenda.settings.noShowTracking')} description={t('agenda.settings.noShowTrackingDesc')} checked={false} onChange={() => {}} />\n </SettingsGroup>\n </div>\n )\n}\n","// agenda.* — merged plugin-own + saas-core central i18n\nexport const en: Record<string, string> = {\n \"agenda.appointment.addDescription\": \"Add description...\",\n \"agenda.appointment.addService\": \"Add service\",\n \"agenda.appointment.cancel\": \"Cancel\",\n \"agenda.appointment.clientTab\": \"Client\",\n \"agenda.appointment.noClientData\": \"No client data available\",\n \"agenda.appointment.client\": \"Client\",\n \"agenda.appointment.conflict\": \"Time conflict — this professional is already booked at this time.\",\n \"agenda.appointment.create\": \"Create\",\n \"agenda.appointment.createClientFailed\": \"Failed to create client\",\n \"agenda.appointment.creating\": \"Creating...\",\n \"agenda.appointment.delete\": \"Delete\",\n \"agenda.appointment.deleteConfirm\": \"Delete this appointment?\",\n \"agenda.appointment.confirmDelete\": \"Delete\",\n \"agenda.appointment.deleting\": \"Deleting…\",\n \"agenda.appointment.edit\": \"Edit Appointment\",\n \"agenda.appointment.emailOptional\": \"Email (optional)\",\n \"agenda.appointment.location\": \"Location\",\n \"agenda.appointment.name\": \"Name\",\n \"agenda.appointment.new\": \"New Appointment\",\n \"agenda.appointment.newClient\": \"New client\",\n \"agenda.appointment.notes\": \"Notes\",\n \"agenda.appointment.phone\": \"Phone\",\n \"agenda.appointment.professional\": \"Professional\",\n \"agenda.appointment.save\": \"Save\",\n \"agenda.appointment.saving\": \"Saving...\",\n \"agenda.appointment.searchClient\": \"Search client...\",\n \"agenda.appointment.searchService\": \"Search service to add...\",\n \"agenda.appointment.selectLocation\": \"Select location...\",\n \"agenda.appointment.selectProfessional\": \"Select professional...\",\n \"agenda.appointment.services\": \"Services\",\n \"agenda.appointment.status\": \"Status\",\n \"agenda.appointment.to\": \"to\",\n \"agenda.appointment.total\": \"Total\",\n \"agenda.appointment.update\": \"Update\",\n \"agenda.payment.title\": \"Payment\",\n \"agenda.payment.generateInvoice\": \"Generate invoice\",\n \"agenda.payment.generating\": \"Generating…\",\n \"agenda.payment.pending\": \"Pending\",\n \"agenda.payment.partial\": \"Partial\",\n \"agenda.payment.paid\": \"Paid\",\n \"agenda.payment.collect\": \"Collect\",\n \"agenda.payment.overdue\": \"Overdue\",\n \"agenda.payment.cancelled\": \"Cancelled\",\n \"agenda.payment.none\": \"Payment\",\n \"agenda.payment.pay\": \"Pay\",\n \"agenda.payment.paying\": \"Paying…\",\n \"agenda.payment.remaining\": \"Remaining\",\n \"agenda.payment.installment\": \"Installment\",\n \"agenda.payment.total\": \"Total\",\n \"agenda.payment.noInvoice\": \"No invoice generated\",\n \"agenda.payment.selectAccount\": \"Select account\",\n \"agenda.payment.registerPayment\": \"Register payment\",\n \"agenda.payment.registerPaymentHint\": \"Record a payment for this appointment\",\n \"agenda.payment.pendingHint\": \"Invoice generated, awaiting payment\",\n \"agenda.payment.partialHint\": \"Partially paid, tap to complete\",\n \"agenda.payment.paidHint\": \"Payment completed\",\n \"agenda.payment.overdueHint\": \"Payment overdue\",\n \"agenda.payment.backToAppointment\": \"Back to appointment\",\n \"agenda.payment.checkout\": \"Confirm\",\n \"agenda.payment.checkingOut\": \"Processing…\",\n \"agenda.payment.serviceSummary\": \"Service summary\",\n \"agenda.payment.paymentMethod\": \"Payment method\",\n \"agenda.payment.noMethods\": \"No payment methods configured.\",\n \"agenda.payment.configureMethods\": \"Set up payment methods\",\n \"agenda.payment.checkoutComplete\": \"Payment confirmed\",\n \"agenda.payment.card\": \"Card\",\n \"agenda.payment.method\": \"Method\",\n \"agenda.payment.select\": \"Select…\",\n \"agenda.payment.cardBrand\": \"Brand\",\n \"agenda.payment.selectBrand\": \"Select brand…\",\n \"agenda.payment.cardInstallments\": \"Installments\",\n \"agenda.payment.bankAccount\": \"Account\",\n \"agenda.payment.viewInvoice\": \"View invoice details\",\n \"agenda.calendar.agendas\": \"Agendas\",\n \"agenda.calendar.create\": \"Create\",\n \"agenda.calendar.next\": \"Next\",\n \"agenda.calendar.previous\": \"Previous\",\n \"agenda.calendar.status\": \"Status\",\n \"agenda.calendar.today\": \"Today\",\n \"agenda.calendar.viewAgenda\": \"Agenda\",\n \"agenda.calendar.viewDay\": \"Day\",\n \"agenda.calendar.viewList\": \"List\",\n \"agenda.calendar.viewMonth\": \"Month\",\n \"agenda.calendar.viewWeek\": \"Week\",\n \"agenda.list.today\": \"Today\",\n \"agenda.list.tomorrow\": \"Tomorrow\",\n \"agenda.list.empty\": \"No upcoming items\",\n \"agenda.confirmations.confirmed\": \"Confirmed:\",\n \"agenda.confirmations.empty\": \"No pending confirmations\",\n \"agenda.confirmations.emptySubtitle\": \"All upcoming appointments have been confirmed\",\n \"agenda.confirmations.loading\": \"Loading...\",\n \"agenda.confirmations.subtitle\": \"Upcoming appointments pending confirmation\",\n \"agenda.confirmations.unknownClient\": \"Unknown client\",\n \"agenda.confirmations.sendWhatsApp\": \"Send WhatsApp\",\n \"agenda.confirmations.call\": \"Call\",\n \"agenda.confirmations.markConfirmed\": \"Mark Confirmed\",\n \"agenda.confirmations.markCancelled\": \"Mark Cancelled\",\n \"agenda.cancellation.loadingReasons\": \"Loading reasons...\",\n \"agenda.cancellation.notesOptional\": \"Cancellation notes (optional)\",\n \"agenda.cancellation.notesRequired\": \"Cancellation notes required\",\n \"agenda.cancellation.selectReason\": \"Select cancellation reason\",\n \"agenda.contextMenu.changeStatus\": \"Change status\",\n \"agenda.contextMenu.delete\": \"Delete\",\n \"agenda.contextMenu.edit\": \"Edit\",\n \"agenda.contextMenu.notAvailable\": \"(not available)\",\n \"agenda.index.settingsSubtitle\": \"Working hours, scheduling preferences, and confirmations\",\n \"agenda.index.settingsTitle\": \"Agenda Settings\",\n \"settings.plugin.agenda-working-hours\": \"Working Hours\",\n \"agenda.popover.unknown\": \"Unknown\",\n \"agenda.settings.autoConfirm\": \"Auto-confirm\",\n \"agenda.settings.autoConfirmDesc\": \"Automatically confirm new bookings\",\n \"agenda.settings.autoCreateOrder\": \"Auto-create Order\",\n \"agenda.settings.autoCreateOrderDesc\": \"Automatically create a financial order for new bookings\",\n \"agenda.settings.blockOutside\": \"Block Outside Hours\",\n \"agenda.settings.blockOutsideDesc\": \"Prevent bookings outside working hours\",\n \"agenda.settings.calendarDisplay\": \"Calendar Display\",\n \"agenda.settings.calendarDisplayDesc\": \"Visual settings for the calendar\",\n \"agenda.settings.cancelAlerts\": \"Cancellation Alerts\",\n \"agenda.settings.cancelAlertsDesc\": \"Notify when a booking is cancelled\",\n \"agenda.settings.compact\": \"Compact Mode\",\n \"agenda.settings.compactDesc\": \"Use smaller event blocks\",\n \"agenda.settings.confirmations\": \"Confirmations\",\n \"agenda.settings.confirmationsDesc\": \"Booking confirmation settings\",\n \"agenda.settings.conflictDetection\": \"Conflict Detection\",\n \"agenda.settings.conflictDetectionDesc\": \"Warn when bookings overlap\",\n \"agenda.settings.dragDrop\": \"Drag & Drop\",\n \"agenda.settings.dragDropDesc\": \"Allow rescheduling by dragging events\",\n \"agenda.settings.enableConfirmations\": \"Enable Confirmations\",\n \"agenda.settings.enableConfirmationsDesc\": \"Require confirmation for new bookings\",\n \"agenda.settings.enableLocation\": \"Enable Location Selection\",\n \"agenda.settings.enableLocationDesc\": \"Show location picker in booking modal\",\n \"agenda.settings.enableWorkingHours\": \"Enable Working Hours\",\n \"agenda.settings.enableWorkingHoursDesc\": \"Show working hours overlay on calendar\",\n \"agenda.settings.locations\": \"Locations\",\n \"agenda.settings.locationsDesc\": \"Multi-location settings\",\n \"agenda.settings.newBookingNotif\": \"New Booking Alerts\",\n \"agenda.settings.newBookingNotifDesc\": \"Notify when a new booking is created\",\n \"agenda.settings.noShowTracking\": \"No-show Tracking\",\n \"agenda.settings.noShowTrackingDesc\": \"Track and alert on no-shows\",\n \"agenda.settings.notifications\": \"Notifications\",\n \"agenda.settings.notificationsDesc\": \"Notification preferences\",\n \"agenda.settings.reminder\": \"Reminders\",\n \"agenda.settings.reminderDesc\": \"Send reminders before appointments\",\n \"agenda.settings.scheduling\": \"Scheduling\",\n \"agenda.settings.schedulingDesc\": \"Configure scheduling behavior\",\n \"agenda.settings.showCancelled\": \"Show Cancelled\",\n \"agenda.settings.showCancelledDesc\": \"Display cancelled bookings on calendar\",\n \"agenda.settings.showNoShow\": \"Show No-shows\",\n \"agenda.settings.showNoShowDesc\": \"Display no-show bookings on calendar\",\n \"agenda.settings.workingHours\": \"Working Hours\",\n \"agenda.settings.workingHoursDesc\": \"Working hours and availability\",\n \"agenda.sidebar.agendas\": \"Agendas\",\n \"agenda.sidebar.allLocations\": \"All locations\",\n \"agenda.sidebar.create\": \"Create\",\n \"agenda.sidebar.location\": \"Location\",\n \"agenda.sidebar.status\": \"Status\",\n \"agenda.toolbar.next\": \"Next\",\n \"agenda.toolbar.previous\": \"Previous\",\n \"agenda.toolbar.today\": \"Today\",\n \"agenda.workingHours.addBreak\": \"Add break\",\n \"agenda.workingHours.copyToAll\": \"Copy to all\",\n \"agenda.workingHours.dayOff\": \"Day off\",\n \"agenda.workingHours.removePeriod\": \"Remove period\",\n \"agenda.workingHours.professional\": \"Professional\",\n \"agenda.workingHours.save\": \"Save\",\n \"agenda.workingHours.saveFailed\": \"Failed to save\",\n \"agenda.workingHours.saved\": \"Working hours saved\",\n \"agenda.workingHours.saving\": \"Saving...\",\n \"agenda.workingHours.subtitle\": \"Manage working hours per professional\",\n \"agenda.workingHours.to\": \"to\",\n \"agenda.title\": \"Agenda\",\n \"agenda.calendar.title\": \"Calendar\",\n \"agenda.calendar.noScheduleConfirm\": \"This time slot has no open schedule for this professional. Do you want to book anyway?\",\n \"agenda.calendar.newAppointment\": \"New Appointment\",\n \"agenda.booking.create\": \"New Appointment\",\n \"agenda.booking.edit\": \"Edit Appointment\",\n \"agenda.booking.delete\": \"Delete Appointment\",\n \"agenda.booking.deleteConfirm\": \"Are you sure you want to delete this appointment?\",\n \"agenda.booking.client\": \"Client\",\n \"agenda.booking.professional\": \"Professional\",\n \"agenda.booking.services\": \"Services\",\n \"agenda.booking.date\": \"Date\",\n \"agenda.booking.time\": \"Time\",\n \"agenda.booking.duration\": \"Duration\",\n \"agenda.booking.notes\": \"Notes\",\n \"agenda.booking.status\": \"Status\",\n \"agenda.booking.save\": \"Save Appointment\",\n \"agenda.booking.saving\": \"Saving...\",\n \"agenda.confirmations.title\": \"Confirmations\",\n \"agenda.confirmations.pending\": \"Pending Confirmations\",\n \"agenda.confirmations.emptyDescription\": \"All upcoming appointments have been confirmed\",\n \"agenda.confirmations.confirm\": \"Confirm\",\n \"agenda.confirmations.cancel\": \"Cancel\",\n \"agenda.workingHours.title\": \"Working Hours\",\n \"agenda.workingHours.addPeriod\": \"Add period\",\n \"agenda.workingHours.loading\": \"Loading...\",\n \"agenda.appointment.addClient\": \"Add client\",\n \"agenda.appointment.addServiceFirst\": \"Add service\",\n \"agenda.appointment.addNotes\": \"Add notes\",\n \"agenda.appointment.duration\": \"Duration (minutes)\",\n \"agenda.appointment.price\": \"Price\",\n \"agenda.appointment.title\": \"Title\",\n \"agenda.appointment.addTitle\": \"Add a title\",\n \"agenda.appointment.untitled\": \"(no title)\",\n \"agenda.bookingType.appointment\": \"Appointment\",\n \"agenda.bookingType.event\": \"Event\",\n \"agenda.bookingType.task\": \"Task\",\n \"agenda.bookingType.out_of_office\": \"Out of Office\",\n \"agenda.bookingType.block\": \"Block\",\n \"agenda.settings.title\": \"Agenda Settings\",\n \"agenda.settings.slotDuration\": \"Slot Duration\",\n \"agenda.settings.bookingKind\": \"Booking Kind\",\n \"agenda.settings.dayStartTime\": \"Day Start Time\",\n \"agenda.settings.dayStartTimeDesc\": \"First hour shown on the calendar\",\n \"agenda.settings.dayEndTime\": \"Day End Time\",\n \"agenda.settings.dayEndTimeDesc\": \"Last hour shown on the calendar\",\n}\n","// agenda.* — merged plugin-own + saas-core central i18n\nexport const ptBR: Record<string, string> = {\n \"agenda.appointment.addDescription\": \"Adicionar descrição...\",\n \"agenda.appointment.addService\": \"Adicionar serviço\",\n \"agenda.appointment.cancel\": \"Cancelar\",\n \"agenda.appointment.clientTab\": \"Cliente\",\n \"agenda.appointment.noClientData\": \"Dados do cliente não disponíveis\",\n \"agenda.appointment.client\": \"Cliente\",\n \"agenda.appointment.conflict\": \"Conflito de horário — este profissional já está reservado neste horário.\",\n \"agenda.appointment.create\": \"Criar\",\n \"agenda.appointment.createClientFailed\": \"Falha ao criar cliente\",\n \"agenda.appointment.creating\": \"Criando...\",\n \"agenda.appointment.delete\": \"Excluir\",\n \"agenda.appointment.deleteConfirm\": \"Excluir este agendamento?\",\n \"agenda.appointment.confirmDelete\": \"Excluir\",\n \"agenda.appointment.deleting\": \"Excluindo…\",\n \"agenda.appointment.edit\": \"Editar Agendamento\",\n \"agenda.appointment.emailOptional\": \"E-mail (opcional)\",\n \"agenda.appointment.location\": \"Local\",\n \"agenda.appointment.name\": \"Nome\",\n \"agenda.appointment.new\": \"Novo Agendamento\",\n \"agenda.appointment.newClient\": \"Novo cliente\",\n \"agenda.appointment.notes\": \"Observações\",\n \"agenda.appointment.phone\": \"Telefone\",\n \"agenda.appointment.professional\": \"Profissional\",\n \"agenda.appointment.save\": \"Salvar\",\n \"agenda.appointment.saving\": \"Salvando...\",\n \"agenda.appointment.searchClient\": \"Buscar cliente...\",\n \"agenda.appointment.searchService\": \"Buscar serviço para adicionar...\",\n \"agenda.appointment.selectLocation\": \"Selecionar local...\",\n \"agenda.appointment.selectProfessional\": \"Selecionar profissional...\",\n \"agenda.appointment.services\": \"Serviços\",\n \"agenda.appointment.status\": \"Status\",\n \"agenda.appointment.to\": \"até\",\n \"agenda.appointment.total\": \"Total\",\n \"agenda.appointment.update\": \"Atualizar\",\n \"agenda.payment.title\": \"Recebimento\",\n \"agenda.payment.generateInvoice\": \"Gerar recebimento\",\n \"agenda.payment.generating\": \"Gerando…\",\n \"agenda.payment.pending\": \"Pendente\",\n \"agenda.payment.partial\": \"Parcial\",\n \"agenda.payment.paid\": \"Pago\",\n \"agenda.payment.collect\": \"Receber\",\n \"agenda.payment.overdue\": \"Vencido\",\n \"agenda.payment.cancelled\": \"Cancelado\",\n \"agenda.payment.none\": \"Recebimento\",\n \"agenda.payment.pay\": \"Pagar\",\n \"agenda.payment.paying\": \"Pagando…\",\n \"agenda.payment.remaining\": \"Restante\",\n \"agenda.payment.installment\": \"Parcela\",\n \"agenda.payment.total\": \"Total\",\n \"agenda.payment.noInvoice\": \"Sem recebimento gerado\",\n \"agenda.payment.selectAccount\": \"Selecionar conta\",\n \"agenda.payment.registerPayment\": \"Registrar recebimento\",\n \"agenda.payment.registerPaymentHint\": \"Registrar pagamento deste agendamento\",\n \"agenda.payment.pendingHint\": \"Fatura gerada, aguardando pagamento\",\n \"agenda.payment.partialHint\": \"Parcialmente pago, toque para completar\",\n \"agenda.payment.paidHint\": \"Pagamento realizado\",\n \"agenda.payment.overdueHint\": \"Pagamento vencido\",\n \"agenda.payment.backToAppointment\": \"Voltar ao agendamento\",\n \"agenda.payment.checkout\": \"Confirmar\",\n \"agenda.payment.checkingOut\": \"Processando…\",\n \"agenda.payment.serviceSummary\": \"Resumo do atendimento\",\n \"agenda.payment.paymentMethod\": \"Forma de pagamento\",\n \"agenda.payment.noMethods\": \"Nenhuma forma de pagamento configurada.\",\n \"agenda.payment.configureMethods\": \"Configurar formas de pagamento\",\n \"agenda.payment.checkoutComplete\": \"Pagamento confirmado\",\n \"agenda.payment.card\": \"Cartão\",\n \"agenda.payment.method\": \"Método\",\n \"agenda.payment.select\": \"Selecionar…\",\n \"agenda.payment.cardBrand\": \"Bandeira\",\n \"agenda.payment.selectBrand\": \"Selecionar bandeira…\",\n \"agenda.payment.cardInstallments\": \"Parcelas\",\n \"agenda.payment.bankAccount\": \"Conta\",\n \"agenda.payment.viewInvoice\": \"Ver detalhes da fatura\",\n \"agenda.calendar.agendas\": \"Agendas\",\n \"agenda.calendar.create\": \"Criar\",\n \"agenda.calendar.next\": \"Próximo\",\n \"agenda.calendar.previous\": \"Anterior\",\n \"agenda.calendar.status\": \"Status\",\n \"agenda.calendar.today\": \"Hoje\",\n \"agenda.calendar.viewAgenda\": \"Agenda\",\n \"agenda.calendar.viewDay\": \"Dia\",\n \"agenda.calendar.viewList\": \"Lista\",\n \"agenda.calendar.viewMonth\": \"Mês\",\n \"agenda.calendar.viewWeek\": \"Semana\",\n \"agenda.list.today\": \"Hoje\",\n \"agenda.list.tomorrow\": \"Amanhã\",\n \"agenda.list.empty\": \"Nenhum item próximo\",\n \"agenda.confirmations.confirmed\": \"Confirmado:\",\n \"agenda.confirmations.empty\": \"Nenhuma confirmação pendente\",\n \"agenda.confirmations.emptySubtitle\": \"Todos os agendamentos futuros foram confirmados\",\n \"agenda.confirmations.loading\": \"Carregando...\",\n \"agenda.confirmations.subtitle\": \"Agendamentos futuros pendentes de confirmação\",\n \"agenda.confirmations.unknownClient\": \"Cliente desconhecido\",\n \"agenda.confirmations.sendWhatsApp\": \"Enviar WhatsApp\",\n \"agenda.confirmations.call\": \"Ligar\",\n \"agenda.confirmations.markConfirmed\": \"Marcar Confirmado\",\n \"agenda.confirmations.markCancelled\": \"Marcar Cancelado\",\n \"agenda.cancellation.loadingReasons\": \"Carregando motivos...\",\n \"agenda.cancellation.notesOptional\": \"Observações do cancelamento (opcional)\",\n \"agenda.cancellation.notesRequired\": \"Observações do cancelamento obrigatórias\",\n \"agenda.cancellation.selectReason\": \"Selecionar motivo do cancelamento\",\n \"agenda.contextMenu.changeStatus\": \"Alterar status\",\n \"agenda.contextMenu.delete\": \"Excluir\",\n \"agenda.contextMenu.edit\": \"Editar\",\n \"agenda.contextMenu.notAvailable\": \"(indisponível)\",\n \"agenda.index.settingsSubtitle\": \"Horários de funcionamento, preferências de agendamento e confirmações\",\n \"agenda.index.settingsTitle\": \"Configurações da Agenda\",\n \"settings.plugin.agenda-working-hours\": \"Horário de Funcionamento\",\n \"agenda.popover.unknown\": \"Desconhecido\",\n \"agenda.settings.autoConfirm\": \"Confirmar Automaticamente\",\n \"agenda.settings.autoConfirmDesc\": \"Confirmar automaticamente novos agendamentos\",\n \"agenda.settings.autoCreateOrder\": \"Criar Pedido Automaticamente\",\n \"agenda.settings.autoCreateOrderDesc\": \"Criar automaticamente um pedido financeiro para novos agendamentos\",\n \"agenda.settings.blockOutside\": \"Bloquear Fora do Horário\",\n \"agenda.settings.blockOutsideDesc\": \"Impedir agendamentos fora do horário de funcionamento\",\n \"agenda.settings.calendarDisplay\": \"Exibição do Calendário\",\n \"agenda.settings.calendarDisplayDesc\": \"Configurações visuais do calendário\",\n \"agenda.settings.cancelAlerts\": \"Alertas de Cancelamento\",\n \"agenda.settings.cancelAlertsDesc\": \"Notificar quando um agendamento é cancelado\",\n \"agenda.settings.compact\": \"Modo Compacto\",\n \"agenda.settings.compactDesc\": \"Usar blocos de eventos menores\",\n \"agenda.settings.confirmations\": \"Confirmações\",\n \"agenda.settings.confirmationsDesc\": \"Configurações de confirmação de agendamento\",\n \"agenda.settings.conflictDetection\": \"Detecção de Conflitos\",\n \"agenda.settings.conflictDetectionDesc\": \"Alertar quando agendamentos se sobrepõem\",\n \"agenda.settings.dragDrop\": \"Arrastar e Soltar\",\n \"agenda.settings.dragDropDesc\": \"Permitir reagendamento arrastando eventos\",\n \"agenda.settings.enableConfirmations\": \"Habilitar Confirmações\",\n \"agenda.settings.enableConfirmationsDesc\": \"Exigir confirmação para novos agendamentos\",\n \"agenda.settings.enableLocation\": \"Habilitar Seleção de Local\",\n \"agenda.settings.enableLocationDesc\": \"Mostrar seletor de local no modal de agendamento\",\n \"agenda.settings.enableWorkingHours\": \"Habilitar Horário de Funcionamento\",\n \"agenda.settings.enableWorkingHoursDesc\": \"Mostrar sobreposição de horário de funcionamento no calendário\",\n \"agenda.settings.locations\": \"Locais\",\n \"agenda.settings.locationsDesc\": \"Configurações de múltiplos locais\",\n \"agenda.settings.newBookingNotif\": \"Alertas de Novo Agendamento\",\n \"agenda.settings.newBookingNotifDesc\": \"Notificar quando um novo agendamento é criado\",\n \"agenda.settings.noShowTracking\": \"Rastreamento de Ausências\",\n \"agenda.settings.noShowTrackingDesc\": \"Rastrear e alertar sobre ausências\",\n \"agenda.settings.notifications\": \"Notificações\",\n \"agenda.settings.notificationsDesc\": \"Preferências de notificação\",\n \"agenda.settings.reminder\": \"Lembretes\",\n \"agenda.settings.reminderDesc\": \"Enviar lembretes antes dos compromissos\",\n \"agenda.settings.scheduling\": \"Agendamento\",\n \"agenda.settings.schedulingDesc\": \"Configurar comportamento do agendamento\",\n \"agenda.settings.showCancelled\": \"Mostrar Cancelados\",\n \"agenda.settings.showCancelledDesc\": \"Exibir agendamentos cancelados no calendário\",\n \"agenda.settings.showNoShow\": \"Mostrar Ausências\",\n \"agenda.settings.showNoShowDesc\": \"Exibir ausências no calendário\",\n \"agenda.settings.workingHours\": \"Horário de Funcionamento\",\n \"agenda.settings.workingHoursDesc\": \"Horários e disponibilidade\",\n \"agenda.sidebar.agendas\": \"Agendas\",\n \"agenda.sidebar.allLocations\": \"Todos os locais\",\n \"agenda.sidebar.create\": \"Criar\",\n \"agenda.sidebar.location\": \"Local\",\n \"agenda.sidebar.status\": \"Status\",\n \"agenda.toolbar.next\": \"Próximo\",\n \"agenda.toolbar.previous\": \"Anterior\",\n \"agenda.toolbar.today\": \"Hoje\",\n \"agenda.workingHours.addBreak\": \"Adicionar intervalo\",\n \"agenda.workingHours.copyToAll\": \"Copiar para todos\",\n \"agenda.workingHours.dayOff\": \"Folga\",\n \"agenda.workingHours.removePeriod\": \"Remover período\",\n \"agenda.workingHours.professional\": \"Profissional\",\n \"agenda.workingHours.save\": \"Salvar\",\n \"agenda.workingHours.saveFailed\": \"Falha ao salvar\",\n \"agenda.workingHours.saved\": \"Horários de trabalho salvos\",\n \"agenda.workingHours.saving\": \"Salvando...\",\n \"agenda.workingHours.subtitle\": \"Gerenciar horários de trabalho por profissional\",\n \"agenda.workingHours.to\": \"até\",\n \"agenda.title\": \"Agenda\",\n \"agenda.calendar.title\": \"Calendário\",\n \"agenda.calendar.noScheduleConfirm\": \"Este horário não possui agenda aberta para este profissional. Deseja agendar mesmo assim?\",\n \"agenda.calendar.newAppointment\": \"Novo Agendamento\",\n \"agenda.booking.create\": \"Novo Agendamento\",\n \"agenda.booking.edit\": \"Editar Agendamento\",\n \"agenda.booking.delete\": \"Excluir Agendamento\",\n \"agenda.booking.deleteConfirm\": \"Tem certeza que deseja excluir este agendamento?\",\n \"agenda.booking.client\": \"Cliente\",\n \"agenda.booking.professional\": \"Profissional\",\n \"agenda.booking.services\": \"Serviços\",\n \"agenda.booking.date\": \"Data\",\n \"agenda.booking.time\": \"Horário\",\n \"agenda.booking.duration\": \"Duração\",\n \"agenda.booking.notes\": \"Observações\",\n \"agenda.booking.status\": \"Status\",\n \"agenda.booking.save\": \"Salvar Agendamento\",\n \"agenda.booking.saving\": \"Salvando...\",\n \"agenda.confirmations.title\": \"Confirmações\",\n \"agenda.confirmations.pending\": \"Confirmações Pendentes\",\n \"agenda.confirmations.emptyDescription\": \"Todos os agendamentos futuros foram confirmados\",\n \"agenda.confirmations.confirm\": \"Confirmar\",\n \"agenda.confirmations.cancel\": \"Cancelar\",\n \"agenda.workingHours.title\": \"Horário de Trabalho\",\n \"agenda.workingHours.addPeriod\": \"Adicionar período\",\n \"agenda.workingHours.loading\": \"Carregando...\",\n \"agenda.appointment.addClient\": \"Adicionar cliente\",\n \"agenda.appointment.addServiceFirst\": \"Adicionar serviço\",\n \"agenda.appointment.addNotes\": \"Adicionar observações\",\n \"agenda.appointment.duration\": \"Duração (minutos)\",\n \"agenda.appointment.price\": \"Preço\",\n \"agenda.appointment.title\": \"Título\",\n \"agenda.appointment.addTitle\": \"Adicionar um título\",\n \"agenda.appointment.untitled\": \"(sem título)\",\n \"agenda.bookingType.appointment\": \"Agendamento\",\n \"agenda.bookingType.event\": \"Evento\",\n \"agenda.bookingType.task\": \"Tarefa\",\n \"agenda.bookingType.out_of_office\": \"Ausência\",\n \"agenda.bookingType.block\": \"Bloqueio\",\n \"agenda.settings.title\": \"Configurações da Agenda\",\n \"agenda.settings.slotDuration\": \"Duração do Intervalo\",\n \"agenda.settings.bookingKind\": \"Tipo de Agendamento\",\n \"agenda.settings.dayStartTime\": \"Horário de Início\",\n \"agenda.settings.dayStartTimeDesc\": \"Primeiro horário exibido no calendário\",\n \"agenda.settings.dayEndTime\": \"Horário de Término\",\n \"agenda.settings.dayEndTimeDesc\": \"Último horário exibido no calendário\",\n}\n","import { en } from './en'\nimport { ptBR } from './pt-BR'\n\nexport const agendaLocales: Record<string, Record<string, string>> = {\n en,\n 'pt-BR': ptBR,\n}\n","// ---------------------------------------------------------------------------\n// Bridge factory: adapts FinancialDataProvider → AgendaFinancialBridge\n// Consumer apps call this at plugin wiring time.\n// ---------------------------------------------------------------------------\n\nimport type { FinancialDataProvider } from '@fayz-ai/plugin-financial'\nimport type { AgendaFinancialBridge, BookingPaymentSummary, BookingPaymentDetail, BookingPaymentStatus } from '../financial-bridge'\nimport { getSupabaseClientOptional } from '@fayz-ai/core'\n\n/**\n * Pure commission math: percentage of a realized order total, rounded to cents.\n * Exported for unit-testing and reuse; the bridge method below wraps the I/O.\n * Returns 0 for a non-positive base or rate so callers can skip empty accruals.\n */\nexport function computeCommissionAmount(total: number, ratePercent: number): number {\n const base = Number(total) || 0\n const rate = Number(ratePercent) || 0\n if (base <= 0 || rate <= 0) return 0\n return Math.round(base * (rate / 100) * 100) / 100\n}\n\nfunction computeStatus(movements: Array<{ status: string }>): BookingPaymentStatus {\n if (movements.length === 0) return 'none'\n const allPaid = movements.every((m) => m.status === 'paid')\n if (allPaid) return 'paid'\n const allCancelled = movements.every((m) => m.status === 'cancelled')\n if (allCancelled) return 'cancelled'\n const anyOverdue = movements.some((m) => m.status === 'overdue')\n if (anyOverdue) return 'overdue'\n const anyPaid = movements.some((m) => m.status === 'paid' || m.status === 'partial')\n if (anyPaid) return 'partial'\n return 'pending'\n}\n\n/**\n * Create an AgendaFinancialBridge backed by the financial plugin's data provider.\n *\n * @example\n * const financialProvider = createSupabaseFinancialProvider()\n * const agenda = createAgendaPlugin({\n * financialBridge: createFinancialBridge(financialProvider),\n * })\n */\nexport function createFinancialBridge(provider: FinancialDataProvider): AgendaFinancialBridge {\n return {\n async resolvePaymentStatuses(orderIds: string[]): Promise<Map<string, BookingPaymentSummary>> {\n const result = new Map<string, BookingPaymentSummary>()\n if (orderIds.length === 0) return result\n\n // Single batch query instead of N individual getInvoiceById calls\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return result\n\n try {\n const [{ data: orders }, { data: movements }] = await Promise.all([\n supabase\n .schema('saas_core')\n .from('orders')\n .select('id, kind, status, total, reference_number, metadata')\n .in('id', orderIds),\n supabase\n .from('financial_movements')\n .select('invoice_id, status, paid_amount')\n .in('invoice_id', orderIds),\n ])\n\n const movementsByOrderId = new Map<string, Array<{ status: string; paid_amount: number }>>()\n for (const movement of movements ?? []) {\n const invoiceId = movement.invoice_id as string | undefined\n if (!invoiceId) continue\n movementsByOrderId.set(invoiceId, [...(movementsByOrderId.get(invoiceId) ?? []), movement])\n }\n\n for (const order of orders ?? []) {\n const orderMovements = movementsByOrderId.get(order.id) ?? []\n const meta = (order.metadata ?? {}) as Record<string, unknown>\n const paidAmount = orderMovements.length > 0\n ? orderMovements.reduce((sum, movement) => sum + (Number(movement.paid_amount) || 0), 0)\n : Number(meta.paidAmount) || 0\n\n result.set(order.id, {\n invoiceId: order.id,\n referenceNumber: order.reference_number as string | undefined,\n status: orderMovements.length > 0 ? computeStatus(orderMovements) : mapInvoiceStatus(order.status as string),\n totalAmount: Number(order.total) || 0,\n paidAmount,\n })\n }\n } catch { /* non-blocking */ }\n\n return result\n },\n\n async getPaymentDetail(orderId: string): Promise<BookingPaymentDetail | null> {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return null\n\n // Single query: get order + movements in parallel\n const [orderRes, movRes] = await Promise.all([\n supabase.schema('saas_core').from('orders').select('id, status, total, reference_number, metadata').eq('id', orderId).single(),\n supabase.from('financial_movements').select('*').eq('invoice_id', orderId).order('due_date'),\n ])\n\n const order = orderRes.data\n if (!order) return null\n const meta = (order.metadata ?? {}) as Record<string, unknown>\n\n // Collect unique payment_method_type_ids to resolve names in one query\n const typeIds = [...new Set((movRes.data ?? []).map((m: any) => m.payment_method_type_id).filter(Boolean))]\n let typeNames: Record<string, string> = {}\n if (typeIds.length > 0) {\n const { data: types } = await supabase.from('payment_method_types').select('id, name').in('id', typeIds)\n typeNames = Object.fromEntries((types ?? []).map((t: any) => [t.id, t.name]))\n }\n\n const movements = (movRes.data ?? []).map((m: Record<string, unknown>) => ({\n id: String(m.id),\n amount: Number(m.amount) || 0,\n paidAmount: Number(m.paid_amount) || 0,\n status: String(m.status ?? 'pending'),\n dueDate: String(m.due_date ?? ''),\n installmentNumber: m.installment_number != null ? Number(m.installment_number) : undefined,\n paymentDate: m.payment_date ? String(m.payment_date) : undefined,\n paymentMethodTypeName: m.payment_method_type_id ? typeNames[String(m.payment_method_type_id)] : undefined,\n cardBrand: m.card_brand ? String(m.card_brand) : undefined,\n cardInstallments: m.card_installments ? Number(m.card_installments) : undefined,\n }))\n\n return {\n invoiceId: order.id,\n referenceNumber: order.reference_number as string | undefined,\n status: movements.length > 0 ? computeStatus(movements) : mapInvoiceStatus(order.status as string),\n totalAmount: Number(order.total) || 0,\n paidAmount: Number(meta.paidAmount) || 0,\n movements,\n }\n },\n\n async createInvoiceFromOrder(orderId: string, options?: {\n installments?: number\n dueDate?: string\n paymentMethodTypeId?: string\n }): Promise<string> {\n // Promote the existing order to an invoice_receivable atomically via the\n // shared DB function (ref + stage/direction + N installments, idempotent).\n // status='invoiced' is valid for appointment/service_order (CHECK).\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) throw new Error('Supabase not available')\n const { error } = await supabase.rpc('fn_invoice_from_order', {\n p_order_id: orderId,\n p_due_date: options?.dueDate ?? null,\n p_status: 'invoiced',\n p_installments: options?.installments ?? 1,\n p_direction: 'credit',\n })\n if (error) throw new Error(error.message)\n return orderId\n },\n\n async payMovement(input) {\n await provider.payMovement({\n movementId: input.movementId,\n amount: input.amount,\n paymentDate: input.paymentDate,\n paymentMethodTypeId: input.paymentMethodTypeId,\n paymentMethodId: input.paymentMethodId,\n bankAccountId: input.bankAccountId,\n cardBrand: input.cardBrand,\n cardInstallments: input.cardInstallments,\n })\n },\n\n async createCommissionMovement(orderId, options) {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return null\n\n // Order carries the assigned professional (assignee_id) and realized total.\n const { data: order } = await supabase\n .schema('saas_core')\n .from('orders')\n .select('id, tenant_id, assignee_id, total')\n .eq('id', orderId)\n .single()\n if (!order || !order.assignee_id) return null // no professional → no commission\n\n // Per-professional rate lives on staff_members, surfaced via v_staff (id = person id).\n const { data: staff } = await supabase\n .from('v_staff')\n .select('commission_rate')\n .eq('id', order.assignee_id)\n .single()\n\n const rate = Number(staff?.commission_rate) || 0\n const base = Number(order.total) || 0\n const amount = computeCommissionAmount(base, rate)\n if (amount <= 0) return null // nothing configured/realized to accrue\n\n // Idempotent: one commission accrual per order. Reuse if already present.\n const { data: existing } = await supabase\n .from('financial_movements')\n .select('id')\n .eq('invoice_id', orderId)\n .eq('movement_kind', 'commission')\n .limit(1)\n if (existing && existing.length > 0) return existing[0].id as string\n\n const dueDate = options?.dueDate ?? new Date().toISOString().slice(0, 10)\n\n const { data: inserted } = await supabase\n .from('financial_movements')\n .insert({\n tenant_id: order.tenant_id,\n invoice_id: orderId,\n direction: 'debit', // payable to the professional\n movement_kind: 'commission',\n amount,\n paid_amount: 0,\n status: 'pending',\n due_date: dueDate,\n metadata: {\n source: 'agenda',\n kind: 'commission',\n professionalId: order.assignee_id,\n commissionRate: rate,\n baseAmount: base,\n },\n })\n .select('id')\n .single()\n\n return (inserted?.id as string | undefined) ?? null\n },\n\n async checkout(orderId, input) {\n // 1. Create invoice (single installment, due today)\n const today = new Date().toISOString().slice(0, 10)\n const invoiceId = await this.createInvoiceFromOrder(orderId, { installments: 1, dueDate: today })\n\n // 2. Get the created movement\n const detail = await this.getPaymentDetail(invoiceId)\n if (!detail || detail.movements.length === 0) throw new Error('No movement created')\n\n const movement = detail.movements[0]\n\n // 3. Pay it in full\n await this.payMovement({\n movementId: movement.id,\n amount: movement.amount,\n paymentDate: today,\n paymentMethodTypeId: input.paymentMethodTypeId,\n paymentMethodId: input.paymentMethodId,\n bankAccountId: input.bankAccountId,\n cardBrand: input.cardBrand,\n cardInstallments: input.cardInstallments,\n })\n\n // 4. Return updated detail\n return (await this.getPaymentDetail(invoiceId))!\n },\n\n async getPaymentMethodTypes() {\n const types = await provider.getPaymentMethodTypes()\n return types.map((t: any) => ({ id: t.id, name: t.name, transactionType: t.transactionType }))\n },\n\n async getBankAccounts() {\n const accounts = await provider.getBankAccounts()\n return accounts\n .filter((a: any) => a.isActive)\n .map((a: any) => ({ id: a.id, name: a.name, accountType: a.accountType }))\n },\n\n async getPaymentMethods(paymentMethodTypeId: string) {\n const methods = await provider.getPaymentMethods()\n return methods\n .filter((m: any) => m.paymentMethodTypeId === paymentMethodTypeId && m.isActive)\n .map((m: any) => ({ id: m.id, name: m.name }))\n },\n }\n}\n\nfunction mapInvoiceStatus(status: string): BookingPaymentStatus {\n switch (status) {\n case 'paid': return 'paid'\n case 'partial': return 'partial'\n case 'overdue': return 'overdue'\n case 'cancelled': return 'cancelled'\n case 'invoiced': return 'pending'\n case 'pending': return 'pending'\n case 'scheduled': return 'none'\n case 'confirmed': return 'none'\n case 'in_progress': return 'none'\n case 'completed': return 'none'\n case 'no_show': return 'none'\n case 'booked': return 'none'\n default: return 'pending'\n }\n}\n","// Google Calendar integration (control plane) — Supabase client.\n//\n// Thin client: reads/writes the calendar_integrations row and invokes the\n// google-calendar-sync edge function for OAuth connect + manual sync. The\n// function holds the OAuth client secret and does the Calendar API work.\nimport { getSupabaseClientOptional } from '@fayz-ai/core'\nimport type { CalendarIntegration, CalendarSyncLogEntry } from '../types'\n\nconst FUNCTION = 'google-calendar-sync'\n\nfunction sb() {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) throw new Error('Supabase not initialized')\n return supabase\n}\n\nexport interface GoogleCalendarProvider {\n getIntegration(): Promise<CalendarIntegration | null>\n /** Start the OAuth connect flow — returns the Google consent URL to redirect to. */\n getConnectUrl(redirectTo?: string): Promise<string>\n setCalendar(calendarId: string): Promise<void>\n disconnect(): Promise<void>\n /** Manually pull external changes now (inbound). */\n syncNow(): Promise<{ fetched: number; written: number }>\n getSyncLog(): Promise<CalendarSyncLogEntry[]>\n}\n\nexport function createGoogleCalendarProvider(): GoogleCalendarProvider {\n return {\n async getIntegration() {\n const { data } = await sb().from('calendar_integrations').select('*').eq('provider', 'google').limit(1).maybeSingle()\n if (!data) return null\n return {\n id: data.id,\n provider: data.provider,\n calendarId: data.calendar_id ?? 'primary',\n active: data.active ?? true,\n connected: !!data.oauth_refresh_token,\n lastSyncAt: data.last_sync_at ?? undefined,\n }\n },\n\n async getConnectUrl(redirectTo) {\n const { data, error } = await sb().functions.invoke(FUNCTION, {\n body: { action: 'oauth_start', redirectTo: redirectTo ?? window.location.href },\n })\n if (error) throw new Error(error.message)\n return (data as { url: string }).url\n },\n\n async setCalendar(calendarId) {\n await sb().from('calendar_integrations').update({ calendar_id: calendarId, updated_at: new Date().toISOString() }).eq('provider', 'google')\n },\n\n async disconnect() {\n await sb().from('calendar_integrations').update({ active: false, oauth_refresh_token: null, oauth_access_token: null }).eq('provider', 'google')\n },\n\n async syncNow() {\n const { data, error } = await sb().functions.invoke(FUNCTION, { body: { action: 'pull_events', trigger: 'manual' } })\n if (error) throw new Error(error.message)\n return data as { fetched: number; written: number }\n },\n\n async getSyncLog() {\n const { data } = await sb().from('calendar_sync_log').select('*').order('created_at', { ascending: false }).limit(20)\n return (data ?? []).map((r: any) => ({\n id: r.id, direction: r.direction, trigger: r.trigger ?? undefined,\n status: r.status, fetched: r.fetched ?? 0, written: r.written ?? 0,\n error: r.error ?? undefined, createdAt: r.created_at,\n }))\n },\n }\n}\n","// Google Calendar as a unified ConnectorDefinition.\n//\n// Surfaces inside plugin-agenda's settings → Integrations tab (the host),\n// rendered by the shared ConnectorsHub. The hub handles the OAuth connect/\n// disconnect; the ExtraPanel below adds the calendar picker, manual sync and\n// run history (only meaningful once connected).\nimport React, { useEffect, useState } from 'react'\nimport { RefreshCw, History, CheckCircle2, AlertCircle, Loader2 } from 'lucide-react'\nimport { Button, toast } from '@fayz-ai/ui'\nimport type { ConnectorDefinition } from '@fayz-ai/core'\nimport { createGoogleCalendarProvider } from './data/supabase'\nimport type { CalendarSyncLogEntry } from './types'\n\nconst provider = createGoogleCalendarProvider()\n\nfunction GoogleCalendarExtraPanel() {\n const [connected, setConnected] = useState(false)\n const [calendarId, setCalendarId] = useState('primary')\n const [syncing, setSyncing] = useState(false)\n const [log, setLog] = useState<CalendarSyncLogEntry[]>([])\n const [loaded, setLoaded] = useState(false)\n\n async function load() {\n const integ = await provider.getIntegration()\n setConnected(!!integ?.connected)\n if (integ) { setCalendarId(integ.calendarId); void provider.getSyncLog().then(setLog) }\n setLoaded(true)\n }\n useEffect(() => { void load() }, [])\n\n // Before connecting there's nothing to configure here.\n if (!loaded || !connected) return null\n\n async function handleSaveCalendar() {\n await provider.setCalendar(calendarId)\n toast.success('Saved')\n }\n async function handleSyncNow() {\n setSyncing(true)\n try { const r = await provider.syncNow(); toast.success(`Synced — ${r.written} updated`); void provider.getSyncLog().then(setLog) }\n catch (e: any) { toast.error(e?.message ?? 'Sync failed') }\n finally { setSyncing(false) }\n }\n\n return (\n <div className=\"space-y-4 border-t pt-4\">\n <div className=\"flex flex-wrap items-end gap-3\">\n <label className=\"block flex-1 min-w-[200px]\">\n <span className=\"text-xs font-medium text-muted-foreground\">Calendar ID</span>\n <input value={calendarId} onChange={(e) => setCalendarId(e.target.value)} placeholder=\"primary\"\n className=\"w-full mt-1 rounded-input border border-input bg-card px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring\" />\n </label>\n <Button variant=\"outline\" size=\"sm\" onClick={handleSaveCalendar}>Save</Button>\n <Button variant=\"outline\" size=\"sm\" onClick={handleSyncNow} disabled={syncing}>\n <RefreshCw className={`h-3.5 w-3.5 ${syncing ? 'animate-spin' : ''}`} /> Sync now\n </Button>\n </div>\n\n {log.length > 0 && (\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2\"><History className=\"h-4 w-4 text-muted-foreground\" /><h4 className=\"text-sm font-semibold\">History</h4></div>\n <div className=\"rounded-md border divide-y text-sm\">\n {log.map((r) => (\n <div key={r.id} className=\"flex items-center gap-3 px-3 py-2\">\n <span className=\"text-muted-foreground text-xs\">{new Date(r.createdAt).toLocaleString()}</span>\n <span className=\"text-[10px] uppercase tracking-wide px-1 py-px rounded bg-muted text-muted-foreground\">{r.direction}</span>\n <span className=\"ml-auto text-xs\">{r.written} written / {r.fetched} fetched</span>\n {r.status === 'success'\n ? <CheckCircle2 className=\"h-3.5 w-3.5 text-success\" />\n : <AlertCircle className=\"h-3.5 w-3.5 text-warning\" />}\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n )\n}\n\nexport const googleCalendarConnectorDef: ConnectorDefinition = {\n id: 'google-calendar',\n hostPluginId: 'agenda',\n name: 'Google Calendar',\n description: 'Two-way sync between your bookings and Google Calendar.',\n icon: 'Calendar',\n authKind: 'oauth',\n async getStatus() {\n const integ = await provider.getIntegration()\n return { connected: !!integ?.connected }\n },\n startOAuth: (redirectTo) => provider.getConnectUrl(redirectTo),\n disconnect: () => provider.disconnect(),\n ExtraPanel: GoogleCalendarExtraPanel,\n}\n","// Google Calendar connector descriptor (control-plane metadata).\n//\n// Declares the connector against the SDK integration spine so the platform can\n// reason about what it syncs. The actual data-plane verbs run in the\n// google-calendar-sync edge function; this is the typed contract + capabilities.\nimport type { Connector } from '@fayz-ai/core'\n\nexport const googleCalendarConnector: Connector = {\n id: 'google-calendar',\n provider: 'google',\n pluginId: 'agenda',\n authKind: 'oauth',\n capabilities: [\n {\n entity: 'booking',\n direction: 'bidirectional',\n triggers: ['on-write', 'scheduled', 'webhook'],\n },\n ],\n}\n","// Booking ↔ Google Calendar event mapping (pure helpers).\n//\n// Shared shape used both by the SDK (docs/tests) and mirrored by the edge\n// function. Keeping it pure makes the field decisions reviewable in one place.\nimport type { CalendarBooking } from '../../types'\nimport type { GCalEvent } from './types'\n\nexport interface GCalEventInput {\n summary: string\n description?: string\n start: { dateTime: string; timeZone?: string }\n end: { dateTime: string; timeZone?: string }\n}\n\n/** Build the event title from the booking's services + client. */\nexport function bookingSummary(b: Pick<CalendarBooking, 'services' | 'clientName'>): string {\n const services = (b.services ?? []).map((s) => s.name).filter(Boolean).join(', ')\n const who = b.clientName ?? ''\n if (services && who) return `${services} — ${who}`\n return services || who || 'Appointment'\n}\n\n/** Map a Fayz booking to a Google Calendar event input. Returns null when the booking has no end. */\nexport function bookingToEvent(b: CalendarBooking, timeZone?: string): GCalEventInput | null {\n if (!b.startsAt || !b.endsAt) return null\n const notes = [b.notes, b.professionalName ? `Pro: ${b.professionalName}` : '', b.locationName ?? '']\n .filter(Boolean).join('\\n')\n return {\n summary: bookingSummary(b),\n description: notes || undefined,\n start: { dateTime: b.startsAt, timeZone },\n end: { dateTime: b.endsAt, timeZone },\n }\n}\n\n/** Map an inbound Google event change to a partial booking update (reschedule/cancel). */\nexport function eventToBookingPatch(ev: GCalEvent): { startsAt?: string; endsAt?: string; status?: 'cancelled' } {\n if (ev.status === 'cancelled') return { status: 'cancelled' }\n return {\n startsAt: ev.start?.dateTime,\n endsAt: ev.end?.dateTime,\n }\n}\n","// Google Calendar integration — official (in-SDK) addon for plugin-agenda.\n//\n// Settings-only PluginManifest: contributes a \"Google Calendar\" tab to /settings\n// for connecting an account and running a manual sync. Outbound (booking →\n// Google) is automatic via a DB trigger; inbound (Google → booking) via pg_cron\n// or a Google watch webhook. The data plane is the google-calendar-sync edge\n// function (see ./functions/google-calendar-sync). The booking↔event link lives\n// on saas_core.bookings.metadata.googleCalendarEventId.\n//\n// Graduation path: extract to its own `@fayz-ai/plugin-google-calendar` package.\nimport type { PluginManifest } from '@fayz-ai/core'\nimport { googleCalendarConnectorDef } from './connectorDef'\n\nexport { createGoogleCalendarProvider } from './data/supabase'\nexport { googleCalendarConnector } from './connector'\nexport { googleCalendarConnectorDef } from './connectorDef'\nexport { bookingToEvent, eventToBookingPatch, bookingSummary } from './mapping'\nexport * from './types'\n\n// Addon plugin: contributes the Google Calendar connector into its host\n// (plugin-agenda). It appears in Agenda settings → Integrations — no top-level\n// settings tab of its own. See packages/saas ConnectorsHub.\nexport function createGoogleCalendarPlugin(): PluginManifest {\n return {\n id: 'google-calendar',\n name: 'Google Calendar',\n icon: 'Calendar',\n version: '0.1.0',\n scope: 'addon',\n defaultEnabled: true,\n dependencies: ['agenda'],\n navigation: [],\n routes: [],\n connectors: [googleCalendarConnectorDef],\n }\n}\n","import React from 'react'\nimport type { PluginManifest } from '@fayz-ai/core'\nimport { createSafeDataProvider, registerTranslations } from '@fayz-ai/core'\nimport type { AgendaPluginOptions } from './config'\nimport { resolveConfig } from './config'\nimport { AgendaPage } from './AgendaPage'\nimport { createSupabaseAgendaProvider } from './data/supabase'\nimport { createMockAgendaProvider } from './data/mock'\nimport { setAgendaTenantId } from './lib/tenant'\nimport { createAgendaStore } from './store'\nimport { agendaRegistries } from './registries'\nimport { AgendaGeneralSettings } from './components/AgendaGeneralSettings'\nimport { agendaLocales } from './locales'\nimport { setScheduleBlockConfig, getScheduleBlockConfig, PluginSettingsPanel } from '@fayz-ai/saas'\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createAgendaPlugin(options?: AgendaPluginOptions): PluginManifest {\n const config = resolveConfig(options)\n registerTranslations(agendaLocales)\n const provider = options?.dataProvider ?? createSafeDataProvider(\n () => createSupabaseAgendaProvider(),\n () => createMockAgendaProvider(),\n )\n const store = createAgendaStore(provider, options?.financialBridge)\n const registries = [...agendaRegistries, ...(options?.settingsRegistries ?? [])]\n\n // Register schedule block config globally so ScheduleEditor can read it\n setScheduleBlockConfig({\n defaults: config.scheduleBlockDefaults,\n showServices: !!config.serviceLookup,\n showConcurrent: true,\n showBookingWindow: true,\n showLocations: config.modules.locationSelection,\n locations: config.locations.map((l) => ({ id: l.id, name: l.name })),\n // Lazy fetcher — called by ScheduleEditor when locations are needed but empty\n fetchLocations: config.modules.locationSelection && provider.getLocations\n ? async () => {\n const locations = await provider.getLocations!()\n const current = getScheduleBlockConfig()\n if (current) setScheduleBlockConfig({ ...current, locations })\n return locations\n }\n : undefined,\n })\n\n const PageComponent: React.FC<any> = () =>\n React.createElement(AgendaPage, { config, provider, store })\n\n return {\n id: 'agenda',\n name: config.labels.pageTitle,\n icon: 'Calendar',\n version: '1.0.0',\n scope: options?.scope ?? 'universal',\n verticalId: options?.verticalId,\n // Booking/scheduling is business-ops (clinic, salon, services) — targets\n // the saas/admin Panel world, not the ecommerce storefront.\n scaffolds: ['saas'],\n defaultEnabled: true,\n dependencies: [],\n declaredFeatures: [\n { id: 'appointments', label: config.labels.pageTitle, group: config.labels.pageTitle },\n { id: 'agenda.schedules', label: 'Schedule Management', group: config.labels.pageTitle },\n ],\n\n navigation: [\n {\n section: options?.navSection ?? 'main',\n position: options?.navPosition ?? 2,\n label: config.labels.pageTitle,\n route: '/agenda',\n icon: 'Calendar',\n permission: { feature: 'appointments', action: 'read' as const },\n },\n ],\n\n routes: [\n {\n path: '/agenda',\n component: PageComponent,\n permission: { feature: 'appointments', action: 'read' as const },\n },\n ],\n\n widgets: [],\n\n aiTools: [\n {\n id: 'agenda.list-appointments',\n name: 'listAppointments',\n description: 'Lists upcoming appointments for a given date or date range, optionally filtered by professional.',\n icon: 'Calendar',\n mode: 'read' as const,\n category: 'Scheduling',\n parameters: {\n type: 'object' as const,\n properties: {\n date: { type: 'string' as const, description: 'Date (YYYY-MM-DD) or \"today\", \"tomorrow\", \"this week\"' },\n professional: { type: 'string' as const, description: 'Professional name to filter by' },\n },\n },\n suggestions: [\n { label: \"What's on the agenda today?\" },\n { label: 'Show me tomorrow\\'s appointments' },\n { label: 'Who has the most bookings this week?' },\n ],\n permission: { feature: 'appointments', action: 'read' as const },\n },\n {\n id: 'agenda.create-appointment',\n name: 'createAppointment',\n description: 'Creates a new appointment for a client with a specific professional and service.',\n icon: 'CalendarPlus',\n mode: 'persist' as const,\n category: 'Scheduling',\n parameters: {\n type: 'object' as const,\n properties: {\n client: { type: 'string' as const, description: 'Client name' },\n professional: { type: 'string' as const, description: 'Professional name' },\n service: { type: 'string' as const, description: 'Service name' },\n date: { type: 'string' as const, description: 'Date (YYYY-MM-DD)' },\n time: { type: 'string' as const, description: 'Time (HH:MM)' },\n },\n required: ['client', 'professional', 'service', 'date', 'time'],\n },\n suggestions: [\n { label: 'Book a haircut for Sarah tomorrow at 10am' },\n ],\n permission: { feature: 'appointments', action: 'create' as const },\n },\n {\n id: 'agenda.check-availability',\n name: 'checkAvailability',\n description: 'Checks available time slots for a professional on a given date.',\n icon: 'Clock',\n mode: 'read' as const,\n category: 'Scheduling',\n parameters: {\n type: 'object' as const,\n properties: {\n professional: { type: 'string' as const, description: 'Professional name' },\n date: { type: 'string' as const, description: 'Date (YYYY-MM-DD) or \"today\", \"tomorrow\"' },\n duration: { type: 'number' as const, description: 'Required duration in minutes' },\n },\n required: ['professional', 'date'],\n },\n suggestions: [\n { label: 'When is Ana available tomorrow?' },\n { label: 'Find a 90-minute slot for Carlos this week' },\n ],\n permission: { feature: 'appointments', action: 'read' as const },\n },\n ],\n\n registries,\n\n settings: [\n {\n id: 'agenda',\n label: 'Agenda',\n icon: 'Calendar',\n // Standard layout: General | Integrations (Google Calendar addon) | Properties.\n component: (() => {\n const AgendaSettingsTab: React.FC = () => React.createElement(PluginSettingsPanel, {\n title: 'Agenda',\n generalSettings: React.createElement(AgendaGeneralSettings),\n registries,\n hostPluginId: 'agenda',\n routeBase: '/settings/agenda',\n })\n AgendaSettingsTab.displayName = 'AgendaSettingsTab'\n return AgendaSettingsTab as unknown as React.ComponentType<unknown>\n })(),\n order: 5,\n permission: { feature: 'appointments', action: 'read' as const },\n },\n ],\n locales: agendaLocales,\n }\n}\n\n// Re-export types for consumers\nexport type { AgendaPluginOptions } from './config'\nexport type { ResolvedAgendaConfig } from './config'\nexport type { AgendaDataProvider } from './data/types'\n// Seedable in-memory provider — apps pass a seed to render the calendar with\n// app-specific events instead of the built-in salon sample.\nexport { createMockAgendaProvider } from './data/mock'\nexport type { MockAgendaSeed, MockAgendaProviderOptions } from './data/mock'\nexport type { AgendaFinancialBridge, BookingPaymentStatus, BookingPaymentSummary, BookingPaymentDetail } from './financial-bridge'\nexport { createFinancialBridge, computeCommissionAmount } from './bridges/create-financial-bridge'\n\n// Google Calendar integration (official addon) — settings-only plugin + helpers\nexport { createGoogleCalendarPlugin, createGoogleCalendarProvider, googleCalendarConnector, bookingToEvent, eventToBookingPatch } from './integrations/google-calendar'\n"]}
1
+ {"version":3,"sources":["../src/config.ts","../src/AgendaContext.tsx","../src/calendar-styles.ts","../src/hooks/useAgendaSettings.ts","../src/components/MiniCalendar.tsx","../src/components/SearchCombobox.tsx","../src/components/BookingPaymentPanel.tsx","../src/types.ts","../src/components/AppointmentModal.tsx","../src/components/FloatingPanel.tsx","../src/components/AppointmentPopover.tsx","../src/components/EventContextMenu.tsx","../src/components/AgendaMobileList.tsx","../src/views/CalendarView.tsx","../src/AgendaPage.tsx","../src/data/supabase.ts","../src/store.ts","../src/registries.ts","../src/components/AgendaGeneralSettings.tsx","../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/migrations/index.ts","../src/bridges/create-financial-bridge.ts","../src/integrations/google-calendar/data/supabase.ts","../src/integrations/google-calendar/connectorDef.tsx","../src/integrations/google-calendar/connector.ts","../src/integrations/google-calendar/mapping.ts","../src/integrations/google-calendar/index.ts","../src/index.ts"],"names":["createPluginContext","usePluginPrefs","getCurrentLocale","React","useMemo","jsxs","jsx","ChevronLeft","ChevronRight","useState","useRef","useEffect","useCallback","Plus","Search","createPortal","Banknote","QrCode","CreditCard","ArrowRightLeft","FileCheck","formatCurrency","useTranslation","t","Check","ExternalLink","Fragment","X","Calendar","CheckSquare","Ban","cn","TooltipProvider","Tooltip","TooltipTrigger","TooltipContent","provider","Modal","ModalContent","ModalTitle","User","DollarSign","Clock","AlertTriangle","CrudFormPage","getSupabaseClientOptional","CrudDetailPage","PersonLink","getAgendaTenantId","toast","MapPin","Briefcase","CircleDot","FileText","Button","HandCoins","STYLE_ID","fmtCurrency","Pencil","Trash2","ptBrLocale","booking","ChevronDown","Settings","FullCalendar","dayGridPlugin","timeGridPlugin","resourceTimeGridPlugin","interactionPlugin","listPlugin","ConfirmDialog","usePluginRuntimeOptional","setAgendaTenantId","getActiveTenantId","createStore","dedup","getScheduleBlockConfig","setScheduleBlockConfig","SettingsGroup","ToggleRow","SelectRow","RefreshCw","History","CheckCircle2","AlertCircle","bookingToEvent","registerTranslations","createSafeDataProvider","createMockAgendaProvider","PluginSettingsPanel"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { PluginRegistryDef, PluginScope, VerticalId } from '@fayz-ai/core'\nimport type { EntityLookup } from '@fayz-ai/saas'\nimport type { AgendaDataProvider } from './data/types'\nimport type { StatusConfig, BookingTypeConfig } from './types'\nimport type { AgendaFinancialBridge } from './financial-bridge'\nimport type { EntityDef } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Public options interface\n// ---------------------------------------------------------------------------\n\nexport interface AgendaPluginLabels {\n pageTitle: string\n pageSubtitle: string\n calendar: string\n dayView: string\n weekView: string\n monthView: string\n listView: string\n workingHours: string\n confirmations: string\n newAppointment: string\n filters: string\n}\n\nexport interface ConfirmationChannelOption {\n id: string\n label: string\n icon: string\n}\n\nexport interface CancellationReasonOption {\n id: string\n label: string\n requiresNotes?: boolean\n}\n\nexport interface CancellationDetailsProvider {\n listReasons(): Promise<CancellationReasonOption[]>\n saveCancellationDetails(input: {\n bookingId: string\n reasonId: string\n notes?: string\n cancelledAt?: string\n }): Promise<void>\n}\n\nexport interface ExternalBookingSource {\n type: string\n id?: string\n [key: string]: unknown\n}\n\nexport interface LocationOption {\n id: string\n name: string\n isHQ?: boolean\n}\n\nexport interface AgendaPluginOptions {\n modules?: {\n workingHours?: boolean\n confirmations?: boolean\n conflictDetection?: boolean\n dragAndDrop?: boolean\n locationSelection?: boolean\n /** Enable financial integration (auto-enabled when financialBridge is provided) */\n financial?: boolean\n }\n labels?: Partial<AgendaPluginLabels>\n currency?: { code?: string; locale?: string; symbol?: string }\n\n /** Booking kind used in saas_core.bookings.kind (default: 'appointment') */\n bookingKind?: string\n\n /** Order kind for financial records (default: 'service_order') */\n orderKind?: string\n\n /** Schedule kind in saas_core.schedules.kind (default: 'working_hours') */\n scheduleKind?: string\n\n /** Booking type tabs shown in the appointment modal */\n bookingTypes?: BookingTypeConfig[]\n\n /**\n * Simplifies the agenda to Google-Calendar-style events (no client /\n * professional / service). When set to 'simple', the plugin exposes a single\n * \"Evento\" booking type whose modal shows only title / date-time / notes.\n * Ignored when an explicit `bookingTypes` override is provided.\n */\n eventMode?: 'simple'\n\n /** Booking status options */\n statuses?: StatusConfig[]\n\n /** Default calendar view (default: 'resourceTimeGridWeek'). Options: 'dayGridMonth', 'timeGridWeek', 'resourceTimeGridWeek', 'listWeek' */\n defaultCalendarView?: string\n\n /** Calendar visible time range (default: '07:00'-'21:00') */\n businessHours?: { startTime: string; endTime: string }\n\n /** Slot duration in minutes (default: 30) */\n slotDuration?: number\n\n /** Person kind for professionals (default: 'staff') */\n professionalKind?: string\n\n /** Person kind for clients (default: 'customer') */\n clientKind?: string\n\n /** Auto-create an order when creating a booking (default: true) */\n autoCreateOrder?: boolean\n\n /** Contact/client lookup */\n contactLookup?: EntityLookup\n\n /** Client entity definition for the Client tab in booking modal */\n clientEntityDef?: EntityDef\n\n /** Service lookup */\n serviceLookup?: EntityLookup\n\n /** Professional/staff lookup */\n professionalLookup?: EntityLookup\n\n /** Location lookup */\n locationLookup?: EntityLookup\n\n /** Called when user clicks a selected entity link (e.g. view client profile) */\n onEntityClick?: (type: 'client' | 'service' | 'professional', id: string) => void\n\n /** Business locations for unit filtering */\n locations?: LocationOption[]\n\n /** Confirmation channel options */\n confirmationChannels?: ConfirmationChannelOption[]\n\n /** Optional app/plugin bridge for cancel-time reason capture. */\n cancellationDetails?: CancellationDetailsProvider\n\n /** Called after a booking is created from an external operational source. */\n onBookingCreated?: (input: { bookingId: string; source?: ExternalBookingSource }) => void | Promise<void>\n\n /** App-owned registries shown under /settings/agenda Properties. */\n settingsRegistries?: PluginRegistryDef[]\n\n /** Financial bridge for agenda × financial cross-plugin integration */\n financialBridge?: AgendaFinancialBridge\n\n /** Data provider — defaults to Supabase, falls back to mock */\n dataProvider?: AgendaDataProvider\n\n /** Default values for schedule block advanced settings */\n scheduleBlockDefaults?: {\n bufferMinutes?: number\n maxConcurrent?: number\n minAdvanceHours?: number\n maxAdvanceDays?: number\n }\n\n navPosition?: number\n navSection?: 'main' | 'secondary'\n scope?: PluginScope\n verticalId?: VerticalId\n}\n\n// ---------------------------------------------------------------------------\n// Defaults\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_LABELS: AgendaPluginLabels = {\n pageTitle: 'Agenda',\n pageSubtitle: 'Calendar and appointment management',\n calendar: 'Calendar',\n dayView: 'Day',\n weekView: 'Week',\n monthView: 'Month',\n listView: 'Agenda',\n workingHours: 'Working Hours',\n confirmations: 'Confirmations',\n newAppointment: 'New Appointment',\n filters: 'Filters',\n}\n\nconst DEFAULT_CURRENCY = { code: 'BRL', locale: 'pt-BR', symbol: 'R$' }\n\nconst DEFAULT_STATUSES: StatusConfig[] = [\n { value: 'scheduled', label: 'Scheduled', color: '#6366f1' },\n { value: 'confirmed', label: 'Confirmed', color: '#3b82f6' },\n { value: 'in_progress', label: 'In Progress', color: '#f59e0b', availableWhen: 'today_only' },\n { value: 'completed', label: 'Completed', color: '#10b981', availableWhen: 'today_or_past' },\n { value: 'cancelled', label: 'Cancelled', color: '#ef4444' },\n { value: 'no_show', label: 'No Show', color: '#6b7280', availableWhen: 'today_or_past' },\n]\n\nconst DEFAULT_BOOKING_TYPES: BookingTypeConfig[] = [\n {\n id: 'appointment', label: 'Appointment', icon: 'Calendar', color: '#6366f1',\n fields: { client: true, professional: true, services: true, location: true, status: true },\n requiresServices: true, requiresClient: true,\n },\n {\n id: 'task', label: 'Task', icon: 'CheckSquare', color: '#f59e0b',\n fields: { client: false, professional: true, services: false, location: false, status: true },\n requiresServices: false, requiresClient: false,\n },\n {\n id: 'block', label: 'Block', icon: 'Ban', color: '#6b7280',\n fields: { client: false, professional: true, services: false, location: false, status: false },\n requiresServices: false, requiresClient: false,\n },\n]\n\n// Simple / Google-Calendar-style event — a single \"Evento\" type with just a\n// free-text title, date-time and notes. No client / professional / service.\n// Used by personal-finance-style agendas (see eventMode: 'simple').\nconst SIMPLE_EVENT_BOOKING_TYPES: BookingTypeConfig[] = [\n {\n id: 'event', label: 'Event', icon: 'Calendar', color: '#6366f1',\n fields: { title: true, client: false, professional: false, services: false, location: false, status: false },\n requiresServices: false, requiresClient: false,\n },\n]\n\n// ---------------------------------------------------------------------------\n// Resolved config — fully merged, no optionals\n// ---------------------------------------------------------------------------\n\nexport interface AgendaModules {\n workingHours: boolean\n confirmations: boolean\n conflictDetection: boolean\n dragAndDrop: boolean\n locationSelection: boolean\n financial: boolean\n}\n\n/**\n * Derived UI capabilities — computed ONCE in resolveConfig from the resolved\n * bookingTypes so no component ever re-derives \"is this a simple event agenda?\"\n * ad-hoc. A capability is enabled when ANY booking type uses that field. In\n * eventMode:'simple' the single \"Evento\" type disables\n * client/professional/services/location/status, so every consumer (popover,\n * filter rail, modal) hides the professional/service/status machinery in one\n * place instead of scattering `eventMode === 'simple'` checks.\n */\nexport interface AgendaCapabilities {\n title: boolean\n client: boolean\n professional: boolean\n services: boolean\n location: boolean\n status: boolean\n}\n\nexport interface AgendaCurrency {\n code: string\n locale: string\n symbol: string\n}\n\nexport interface ResolvedAgendaConfig {\n modules: AgendaModules\n /** Whether this is a simple Google-Calendar-style event agenda (eventMode:'simple'). */\n simpleMode: boolean\n /** Derived once from bookingTypes — see AgendaCapabilities. */\n capabilities: AgendaCapabilities\n labels: AgendaPluginLabels\n currency: AgendaCurrency\n bookingKind: string\n orderKind: string\n scheduleKind: string\n statuses: StatusConfig[]\n bookingTypes: BookingTypeConfig[]\n businessHours: { startTime: string; endTime: string }\n slotDuration: number\n professionalKind: string\n clientKind: string\n autoCreateOrder: boolean\n locations: LocationOption[]\n confirmationChannels: ConfirmationChannelOption[]\n cancellationDetails?: CancellationDetailsProvider\n onBookingCreated?: (input: { bookingId: string; source?: ExternalBookingSource }) => void | Promise<void>\n contactLookup?: EntityLookup\n clientEntityDef?: EntityDef\n serviceLookup?: EntityLookup\n professionalLookup?: EntityLookup\n locationLookup?: EntityLookup\n onEntityClick?: (type: 'client' | 'service' | 'professional', id: string) => void\n financialBridge?: AgendaFinancialBridge\n scheduleBlockDefaults: {\n bufferMinutes: number\n maxConcurrent: number\n minAdvanceHours: number\n maxAdvanceDays: number\n }\n defaultCalendarView: string\n}\n\n// ---------------------------------------------------------------------------\n// Config resolver\n// ---------------------------------------------------------------------------\n\nexport function resolveConfig(options?: AgendaPluginOptions): ResolvedAgendaConfig {\n // ── eventMode:'simple' derives ALL module + capability defaults ONCE, here. ──\n // Simple = Google-Calendar-style events (title/description + timestamp). It\n // flips professional/service machinery OFF by default: no working-hours /\n // schedule checks, no confirmations outreach, no conflict (double-booking)\n // detection, no location. Explicit `modules.*` re-enable individually. Full\n // mode (beauty) is unchanged — every default below matches the old behavior\n // when `simple` is false. Field-level machinery (client/professional/\n // services/location/status/title) is derived into `capabilities` from the\n // resolved bookingTypes, so components never test eventMode themselves.\n const simple = options?.eventMode === 'simple'\n const bookingTypes = options?.bookingTypes\n ?? (simple ? SIMPLE_EVENT_BOOKING_TYPES : DEFAULT_BOOKING_TYPES)\n const capabilities: AgendaCapabilities = {\n title: bookingTypes.some((bt) => bt.fields.title === true),\n client: bookingTypes.some((bt) => bt.fields.client),\n professional: bookingTypes.some((bt) => bt.fields.professional),\n services: bookingTypes.some((bt) => bt.fields.services),\n location: bookingTypes.some((bt) => bt.fields.location),\n status: bookingTypes.some((bt) => bt.fields.status),\n }\n return {\n modules: {\n // Off-unless-explicit in simple mode (`?? !simple`); default-on in full.\n workingHours: options?.modules?.workingHours ?? !simple,\n confirmations: options?.modules?.confirmations ?? !simple,\n conflictDetection: options?.modules?.conflictDetection ?? !simple,\n dragAndDrop: options?.modules?.dragAndDrop !== false,\n locationSelection: options?.modules?.locationSelection === true,\n financial: options?.modules?.financial ?? !!options?.financialBridge,\n },\n simpleMode: simple,\n capabilities,\n labels: { ...DEFAULT_LABELS, ...options?.labels },\n currency: { ...DEFAULT_CURRENCY, ...options?.currency },\n bookingKind: options?.bookingKind ?? 'appointment',\n orderKind: options?.orderKind ?? 'service_order',\n scheduleKind: options?.scheduleKind ?? 'working_hours',\n statuses: options?.statuses ?? DEFAULT_STATUSES,\n bookingTypes,\n businessHours: options?.businessHours ?? { startTime: '07:00', endTime: '21:00' },\n slotDuration: options?.slotDuration ?? 30,\n professionalKind: options?.professionalKind ?? 'staff',\n clientKind: options?.clientKind ?? 'customer',\n autoCreateOrder: options?.autoCreateOrder !== false,\n locations: options?.locations ?? [],\n confirmationChannels: options?.confirmationChannels ?? [],\n cancellationDetails: options?.cancellationDetails,\n onBookingCreated: options?.onBookingCreated,\n contactLookup: options?.contactLookup,\n clientEntityDef: options?.clientEntityDef,\n serviceLookup: options?.serviceLookup,\n professionalLookup: options?.professionalLookup,\n locationLookup: options?.locationLookup,\n onEntityClick: options?.onEntityClick,\n financialBridge: options?.financialBridge,\n scheduleBlockDefaults: {\n bufferMinutes: options?.scheduleBlockDefaults?.bufferMinutes ?? 0,\n maxConcurrent: options?.scheduleBlockDefaults?.maxConcurrent ?? 1,\n minAdvanceHours: options?.scheduleBlockDefaults?.minAdvanceHours ?? 0,\n maxAdvanceDays: options?.scheduleBlockDefaults?.maxAdvanceDays ?? 60,\n },\n defaultCalendarView: options?.defaultCalendarView ?? 'resourceTimeGridWeek',\n }\n}\n","import { createPluginContext } from '@fayz-ai/saas'\nimport type { ResolvedAgendaConfig } from './config'\nimport type { AgendaDataProvider } from './data/types'\nimport type { AgendaUIState } from './store'\n\nconst ctx = createPluginContext<ResolvedAgendaConfig, AgendaDataProvider, AgendaUIState>('AgendaPage')\n\nexport const AgendaContextProvider = ctx.ContextProvider\nexport const useAgendaConfig = ctx.useConfig\nexport const useAgendaProvider = ctx.useProvider\nexport const useAgendaStore = ctx.useStore\n","/**\n * Injects agenda calendar CSS at runtime.\n * This ensures styles work both in symlinked dev mode and when consumed\n * as a built package (where CSS side-effect imports are extracted by tsup\n * and not automatically loaded).\n */\n\nconst STYLE_ID = 'saas-agenda-calendar-styles'\n\nconst css = /* css */ `\n/* Dark mode content background — uses the content token */\n.dark .agenda-calendar,\n.dark .agenda-calendar .fc,\n.dark .agenda-calendar .fc-view-harness,\n.dark .agenda-calendar .fc-timegrid,\n.dark .agenda-calendar .fc-scrollgrid,\n.dark .agenda-calendar .fc-timegrid-col,\n.dark .agenda-calendar .fc-daygrid-body,\n.dark .agenda-calendar .fc-timegrid-slot-lane {\n background-color: hsl(var(--content));\n}\n\n/* FullCalendar — Google Calendar inspired theme */\n\n.agenda-calendar {\n --fc-border-color: hsl(var(--border));\n --fc-today-bg-color: transparent;\n --fc-now-indicator-color: hsl(var(--destructive));\n --fc-highlight-color: hsl(var(--primary) / 0.06);\n --fc-non-business-color: hsl(var(--muted) / 0.15);\n --fc-neutral-bg-color: transparent;\n --fc-page-bg-color: transparent;\n --fc-event-border-color: transparent;\n}\n\n.agenda-calendar .fc {\n font-family: inherit;\n background: transparent;\n}\n\n.agenda-calendar .fc .fc-view-harness {\n background: transparent;\n}\n\n/* ── Column headers ── */\n.agenda-calendar .fc-col-header-cell {\n background: transparent;\n border-bottom: 1px solid var(--fc-border-color);\n border-left: none;\n border-right: none;\n border-top: none;\n}\n\n.agenda-calendar .fc-col-header-cell-cushion {\n padding: 8px 4px;\n font-weight: 400;\n font-size: 0.7rem;\n color: hsl(var(--muted-foreground));\n text-decoration: none;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n}\n\n/* Today's column header */\n.agenda-calendar .fc-day-today .fc-col-header-cell-cushion {\n color: hsl(var(--primary));\n font-weight: 600;\n}\n\n/* Resource header (professional columns) */\n.agenda-calendar .fc .fc-resource-header {\n background: transparent;\n border-bottom: 1px solid var(--fc-border-color);\n}\n\n/* ── Time slots — compact ── */\n.agenda-calendar .fc-timegrid-slot {\n height: 1.5rem;\n border-bottom: 1px solid hsl(var(--border) / 0.4);\n}\n\n.agenda-calendar .fc-timegrid-slot-label {\n vertical-align: top;\n border: none;\n}\n\n.agenda-calendar .fc-timegrid-slot-label-cushion {\n font-size: 0.65rem;\n color: hsl(var(--muted-foreground) / 0.7);\n padding: 1px 8px 0 0;\n}\n\n/* Half-hour lines lighter */\n.agenda-calendar .fc-timegrid-slot-minor {\n border-bottom-style: none;\n}\n\n/* Column dividers */\n.agenda-calendar .fc-timegrid-col {\n border-right: 1px solid hsl(var(--border) / 0.5);\n}\n\n/* ── Events ── */\n.agenda-calendar .fc-event {\n border-radius: 6px;\n border-width: 0;\n border-left: 4px solid;\n cursor: pointer;\n transition: opacity 0.15s, box-shadow 0.15s, backdrop-filter 0.15s;\n font-size: 0.7rem;\n line-height: 1.3;\n margin: 0 2px;\n overflow: hidden;\n backdrop-filter: blur(8px) saturate(140%);\n -webkit-backdrop-filter: blur(8px) saturate(140%);\n}\n\n.agenda-calendar .fc-event .fc-event-main {\n background: inherit;\n border-radius: inherit;\n overflow: hidden;\n}\n\n.agenda-calendar .fc-event:not(.fc-bg-event):hover {\n opacity: 0.92;\n box-shadow: 0 2px 8px rgba(0,0,0,0.12);\n backdrop-filter: blur(12px) saturate(160%);\n -webkit-backdrop-filter: blur(12px) saturate(160%);\n}\n\n.agenda-calendar .fc-bg-event {\n pointer-events: none;\n}\n\n/* ── Now indicator ── */\n.agenda-calendar .fc-timegrid-now-indicator-line {\n border-color: hsl(var(--destructive));\n border-width: 2px;\n}\n\n.agenda-calendar .fc-timegrid-now-indicator-arrow {\n border-top-color: hsl(var(--destructive));\n}\n\n/* ── Month view ── */\n.agenda-calendar .fc-daygrid-day-number {\n font-size: 0.8rem;\n padding: 4px 8px;\n text-decoration: none;\n color: hsl(var(--foreground));\n}\n\n.agenda-calendar .fc-daygrid-day.fc-day-today .fc-daygrid-day-number {\n background-color: hsl(var(--primary));\n color: hsl(var(--primary-foreground));\n border-radius: 50%;\n width: 1.5rem;\n height: 1.5rem;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.75rem;\n}\n\n/* ── Selection ── */\n.agenda-calendar .fc-highlight {\n background: hsl(var(--primary) / 0.08);\n}\n\n/* ── Links ── */\n.agenda-calendar .fc a {\n text-decoration: none;\n color: inherit;\n}\n\n/* ── Scrollbar ── */\n.agenda-calendar .fc-scroller {\n scrollbar-width: thin;\n scrollbar-color: hsl(var(--muted-foreground) / 0.12) transparent;\n}\n\n.agenda-calendar .fc-scroller::-webkit-scrollbar {\n width: 6px;\n}\n\n.agenda-calendar .fc-scroller::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.agenda-calendar .fc-scroller::-webkit-scrollbar-thumb {\n background: hsl(var(--muted-foreground) / 0.12);\n border-radius: 3px;\n}\n\n/* ── Clean up borders ── */\n.agenda-calendar .fc .fc-timegrid {\n border: none;\n}\n\n.agenda-calendar .fc-scrollgrid {\n border: none !important;\n}\n\n.agenda-calendar .fc-scrollgrid td:last-child {\n border-right: none;\n}\n\n/* ── Unavailable time background — opaque/disabled feel ── */\n.agenda-calendar .fc-unavailable-bg {\n background: hsl(var(--muted-foreground) / 0.08) !important;\n background-image: repeating-linear-gradient(\n 45deg,\n transparent,\n transparent 4px,\n hsl(var(--muted-foreground) / 0.04) 4px,\n hsl(var(--muted-foreground) / 0.04) 8px\n ) !important;\n border-radius: 0;\n border-left: none !important;\n}\n\n/* ── Location label on schedule blocks ── */\n.agenda-calendar .fc-location-label {\n background: transparent !important;\n border: none !important;\n border-left-width: 0 !important;\n cursor: default !important;\n pointer-events: none;\n box-shadow: none !important;\n z-index: 1 !important;\n margin: 0 4px !important;\n font-weight: 500 !important;\n}\n\n.agenda-calendar .fc-location-label .fc-event-main {\n padding: 0 !important;\n}\n\n/* Week view day header with date */\n.agenda-calendar .fc-timegrid .fc-col-header-cell {\n padding: 4px 0;\n}\n\n/* ── Alternating resource column backgrounds ── */\n.agenda-calendar .fc-resource-alt {\n background-color: hsl(var(--muted) / 0.4) !important;\n}\n\n.dark .agenda-calendar .fc-resource-alt {\n background-color: hsl(var(--muted-foreground) / 0.08) !important;\n}\n\n/* Resource group header separator — stronger border between professionals */\n.agenda-calendar .fc-resource-group {\n border-left: 2px solid hsl(var(--border));\n}\n\n/* Also stripe the resource header label for the alt group */\n.agenda-calendar th.fc-resource-alt {\n background-color: hsl(var(--muted) / 0.4) !important;\n}\n\n.dark .agenda-calendar th.fc-resource-alt {\n background-color: hsl(var(--muted-foreground) / 0.06) !important;\n}\n`\n\nlet injected = false\n\nexport function injectCalendarStyles(): void {\n if (injected) return\n if (typeof document === 'undefined') return\n\n // Check if already present (e.g. from CSS import in dev mode)\n if (document.getElementById(STYLE_ID)) {\n injected = true\n return\n }\n\n const style = document.createElement('style')\n style.id = STYLE_ID\n style.textContent = css\n document.head.appendChild(style)\n injected = true\n}\n","import { usePluginPrefs } from '@fayz-ai/saas'\n\nconst DEFAULTS = {\n startTime: '07:00',\n endTime: '21:00',\n}\n\nexport function useAgendaSettings() {\n const prefs = usePluginPrefs('agenda', DEFAULTS)\n\n return {\n startTime: prefs.get('startTime'),\n endTime: prefs.get('endTime'),\n setStartTime: (v: string) => prefs.set('startTime', v),\n setEndTime: (v: string) => prefs.set('endTime', v),\n }\n}\n","import React, { useMemo } from 'react'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { getCurrentLocale } from '@fayz-ai/core'\n\ninterface MiniCalendarProps {\n selectedDate: Date\n onDateSelect: (date: Date) => void\n onMonthChange?: (date: Date) => void\n}\n\nconst DAY_LABELS: Record<string, string[]> = {\n en: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n 'pt-BR': ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],\n}\n\nfunction isSameDay(a: Date, b: Date) {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate()\n}\n\nfunction isToday(d: Date) {\n return isSameDay(d, new Date())\n}\n\nfunction toDateLocale(locale: string): string {\n if (locale === 'pt-BR') return 'pt-BR'\n return 'en-US'\n}\n\nexport function MiniCalendar({ selectedDate, onDateSelect, onMonthChange }: MiniCalendarProps) {\n const locale = getCurrentLocale()\n const [viewMonth, setViewMonth] = React.useState(() => new Date(selectedDate.getFullYear(), selectedDate.getMonth(), 1))\n\n const monthLabel = viewMonth.toLocaleDateString(toDateLocale(locale), { month: 'long', year: 'numeric' })\n const dayLabels = DAY_LABELS[locale] ?? DAY_LABELS.en\n\n const weeks = useMemo(() => {\n const year = viewMonth.getFullYear()\n const month = viewMonth.getMonth()\n const firstDay = new Date(year, month, 1)\n const startOffset = firstDay.getDay()\n const daysInMonth = new Date(year, month + 1, 0).getDate()\n\n const cells: (Date | null)[] = []\n for (let i = 0; i < startOffset; i++) cells.push(null)\n for (let d = 1; d <= daysInMonth; d++) cells.push(new Date(year, month, d))\n while (cells.length % 7 !== 0) cells.push(null)\n\n const rows: (Date | null)[][] = []\n for (let i = 0; i < cells.length; i += 7) rows.push(cells.slice(i, i + 7))\n return rows\n }, [viewMonth])\n\n function prevMonth() {\n const d = new Date(viewMonth.getFullYear(), viewMonth.getMonth() - 1, 1)\n setViewMonth(d)\n onMonthChange?.(d)\n }\n\n function nextMonth() {\n const d = new Date(viewMonth.getFullYear(), viewMonth.getMonth() + 1, 1)\n setViewMonth(d)\n onMonthChange?.(d)\n }\n\n function handleClick(date: Date) {\n onDateSelect(date)\n }\n\n return (\n <div className=\"select-none\">\n {/* Month header */}\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-sm font-medium capitalize\">{monthLabel}</span>\n <div className=\"flex items-center gap-0.5\">\n <button onClick={prevMonth} className=\"flex h-6 w-6 items-center justify-center rounded-full hover:bg-muted transition-colors\">\n <ChevronLeft className=\"h-3.5 w-3.5\" />\n </button>\n <button onClick={nextMonth} className=\"flex h-6 w-6 items-center justify-center rounded-full hover:bg-muted transition-colors\">\n <ChevronRight className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n </div>\n\n {/* Day labels */}\n <div className=\"grid grid-cols-7 mb-0.5\">\n {dayLabels.map((label, i) => (\n <div key={i} className=\"flex h-6 w-6 items-center justify-center text-[10px] font-medium text-muted-foreground mx-auto\">\n {label}\n </div>\n ))}\n </div>\n\n {/* Dates */}\n {weeks.map((week, wi) => (\n <div key={wi} className=\"grid grid-cols-7\">\n {week.map((date, di) => {\n if (!date) return <div key={di} className=\"h-6 w-6 mx-auto\" />\n const selected = isSameDay(date, selectedDate)\n const today = isToday(date)\n return (\n <button\n key={di}\n onClick={() => handleClick(date)}\n className={`flex h-6 w-6 items-center justify-center rounded-full text-[11px] mx-auto transition-colors ${\n selected\n ? 'bg-primary text-primary-foreground'\n : today\n ? 'bg-primary/10 text-primary font-semibold'\n : 'hover:bg-muted text-foreground'\n }`}\n >\n {date.getDate()}\n </button>\n )\n })}\n </div>\n ))}\n </div>\n )\n}\n","import React, { useState, useEffect, useRef, useCallback } from 'react'\nimport { createPortal } from 'react-dom'\nimport { Search, Plus } from 'lucide-react'\n\n// ---------------------------------------------------------------------------\n// Reusable search combobox with keyboard navigation + optional create\n// ---------------------------------------------------------------------------\n\nexport interface ComboboxOption {\n id: string\n label: string\n subtitle?: string\n price?: number\n data?: Record<string, unknown>\n}\n\ninterface SearchComboboxProps {\n value: string\n onChange: (value: string) => void\n onSelect: (option: ComboboxOption) => void\n options: ComboboxOption[]\n placeholder?: string\n autoFocus?: boolean\n onBlurEmpty?: () => void\n renderRight?: (option: ComboboxOption) => React.ReactNode\n /** Show a \"+ Create ...\" option when search has no exact match */\n allowCreate?: boolean\n /** Called when user clicks the create option. Receives the current search text. */\n onCreateNew?: (searchText: string) => void\n /** Label for the create option (default: 'Create') */\n createLabel?: string\n className?: string\n /** Minimal style — no border/bg, just underline on focus. For inline use. */\n minimal?: boolean\n /** Inline label shown when collapsed. Click reveals the search input. */\n inlineLabel?: string\n /** Icon for the inline label: 'search' (default) or 'plus' (for \"add\" actions) */\n inlineIcon?: 'search' | 'plus'\n /** Show a loading skeleton in the dropdown while results are being fetched */\n loading?: boolean\n /** Called when the input gains focus */\n onFocus?: () => void\n}\n\nexport function SearchCombobox({\n value, onChange, onSelect, options, placeholder, autoFocus, onBlurEmpty,\n renderRight, allowCreate, onCreateNew, createLabel = 'Create', className, minimal, inlineLabel, inlineIcon = 'search',\n loading, onFocus: onFocusProp,\n}: SearchComboboxProps) {\n const [open, setOpen] = useState(false)\n const [activeIndex, setActiveIndex] = useState(-1)\n const [expanded, setExpanded] = useState(!inlineLabel)\n const [dropRect, setDropRect] = useState<DOMRect | null>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const wrapperRef = useRef<HTMLDivElement>(null)\n const listRef = useRef<HTMLDivElement>(null)\n\n // When value is set externally (e.g. edit mode), auto-expand; collapse when cleared\n useEffect(() => {\n if (value && inlineLabel) setExpanded(true)\n if (!value && inlineLabel && !open) setExpanded(false)\n }, [value, open])\n\n function updateRect() {\n if (wrapperRef.current) setDropRect(wrapperRef.current.getBoundingClientRect())\n }\n\n // Show create option only when dropdown is open, has text, and no exact match\n const showCreate = open && allowCreate && onCreateNew && value.trim().length > 0 &&\n !options.some((o) => o.label.toLowerCase() === value.trim().toLowerCase())\n\n const totalItems = options.length + (showCreate ? 1 : 0)\n\n useEffect(() => { setActiveIndex(-1) }, [options])\n useEffect(() => {\n if ((options.length > 0 || showCreate || loading) && document.activeElement === inputRef.current) setOpen(true)\n }, [options, showCreate, loading])\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (!open || totalItems === 0) {\n if (e.key === 'ArrowDown' && totalItems > 0) {\n e.preventDefault()\n setOpen(true)\n setActiveIndex(0)\n }\n return\n }\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n setActiveIndex((prev) => (prev + 1) % totalItems)\n break\n case 'ArrowUp':\n e.preventDefault()\n setActiveIndex((prev) => (prev <= 0 ? totalItems - 1 : prev - 1))\n break\n case 'Enter':\n e.preventDefault()\n if (activeIndex >= 0 && activeIndex < options.length) {\n onSelect(options[activeIndex])\n setOpen(false)\n setActiveIndex(-1)\n } else if (showCreate && activeIndex === options.length) {\n onCreateNew?.(value.trim())\n setOpen(false)\n setActiveIndex(-1)\n }\n break\n case 'Escape':\n e.preventDefault()\n setOpen(false)\n setActiveIndex(-1)\n break\n }\n }, [open, options, totalItems, activeIndex, onSelect, showCreate, onCreateNew, value])\n\n useEffect(() => {\n if (activeIndex < 0 || !listRef.current) return\n const items = listRef.current.children\n if (items[activeIndex]) (items[activeIndex] as HTMLElement).scrollIntoView({ block: 'nearest' })\n }, [activeIndex])\n\n function handleBlur() {\n setTimeout(() => {\n setOpen(false)\n setActiveIndex(-1)\n if (!value && onBlurEmpty) onBlurEmpty()\n if (!value && inlineLabel) setExpanded(false)\n }, 200)\n }\n\n const hasDropdown = open && (options.length > 0 || showCreate || loading)\n\n // Collapsed inline label — click to expand\n if (!expanded && inlineLabel) {\n const isPlus = inlineIcon === 'plus'\n return (\n <button type=\"button\" onClick={() => { setExpanded(true); setTimeout(() => inputRef.current?.focus(), 50) }}\n className={`flex items-center gap-1.5 w-full text-left text-sm py-1.5 pl-2 transition-colors ${\n isPlus ? 'text-primary hover:text-primary/80' : 'text-muted-foreground hover:text-foreground'\n } ${className ?? ''}`}>\n {isPlus && <Plus className=\"h-3.5 w-3.5 shrink-0\" />}\n {inlineLabel}\n </button>\n )\n }\n\n return (\n <div ref={wrapperRef} className={`relative ${className ?? ''}`}>\n {!minimal && (\n <Search className=\"absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground pointer-events-none\" />\n )}\n <input\n ref={inputRef}\n type=\"text\"\n value={value}\n onChange={(e) => { onChange(e.target.value); updateRect(); setOpen(true) }}\n onFocus={() => { updateRect(); onFocusProp?.(); if (options.length > 0 || showCreate || loading) setOpen(true) }}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n autoFocus={autoFocus}\n className={minimal\n ? 'w-full bg-transparent pl-2 pr-3 py-1.5 text-sm placeholder:text-muted-foreground focus:outline-none border-b border-transparent hover:border-border focus:border-foreground transition-colors'\n : 'w-full rounded-lg border bg-background pl-8 pr-3 py-2 text-sm placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring'\n }\n role=\"combobox\"\n aria-expanded={hasDropdown}\n aria-autocomplete=\"list\"\n aria-activedescendant={activeIndex >= 0 ? `combobox-opt-${activeIndex}` : undefined}\n />\n {hasDropdown && dropRect && createPortal(\n <div ref={listRef} role=\"listbox\" data-modal-passthrough\n style={{ position: 'fixed', left: dropRect.left, top: dropRect.bottom + 4, width: dropRect.width, zIndex: 9999, pointerEvents: 'auto' }}\n className=\"fayz-glass-surface max-h-52 overflow-y-auto rounded-lg border bg-popover shadow-lg py-0.5 animate-in fade-in zoom-in-95 duration-100\">\n {loading && options.length === 0 && (\n <div className=\"flex items-center gap-2 px-3 py-2 text-sm text-muted-foreground\">\n <svg className=\"h-3.5 w-3.5 animate-spin shrink-0\" viewBox=\"0 0 16 16\" fill=\"none\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" opacity=\"0.25\" />\n <path d=\"M14.5 8a6.5 6.5 0 00-6.5-6.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n <span>Buscando…</span>\n </div>\n )}\n {options.map((opt, i) => (\n <div key={opt.id} id={`combobox-opt-${i}`} role=\"option\" aria-selected={i === activeIndex}\n onMouseDown={(e) => { e.preventDefault(); onSelect(opt); setOpen(false) }}\n onMouseEnter={() => setActiveIndex(i)}\n className={`flex w-full items-center gap-2 px-3 py-2 text-sm cursor-pointer transition-colors ${\n i === activeIndex ? 'bg-primary/10 text-primary' : 'hover:bg-muted/50'\n }`}>\n <div className=\"flex-1 min-w-0\">\n <p className=\"truncate font-medium\">{opt.label}</p>\n {opt.subtitle && <p className=\"truncate text-[11px] text-muted-foreground\">{opt.subtitle}</p>}\n </div>\n {renderRight && <div className=\"shrink-0\">{renderRight(opt)}</div>}\n </div>\n ))}\n {showCreate && (\n <div id={`combobox-opt-${options.length}`} role=\"option\" aria-selected={activeIndex === options.length}\n onMouseDown={(e) => { e.preventDefault(); onCreateNew?.(value.trim()); setOpen(false) }}\n onMouseEnter={() => setActiveIndex(options.length)}\n className={`flex w-full items-center gap-2 px-3 py-2 text-sm cursor-pointer transition-colors border-t ${\n activeIndex === options.length ? 'bg-primary/10 text-primary' : 'hover:bg-muted/50'\n }`}>\n <Plus className=\"h-3.5 w-3.5 shrink-0\" />\n <span>{createLabel} &ldquo;<span className=\"font-medium\">{value.trim()}</span>&rdquo;</span>\n </div>\n )}\n </div>,\n document.body,\n )}\n </div>\n )\n}\n","import React, { useState, useEffect } from 'react'\nimport { createPortal } from 'react-dom'\nimport { X, Check, Banknote, QrCode, CreditCard, ArrowRightLeft, FileCheck, ExternalLink } from 'lucide-react'\nimport { useAgendaConfig } from '../AgendaContext'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { BookingPaymentDetail } from '../financial-bridge'\n\n// ---------------------------------------------------------------------------\n// Payment method type visuals (mirrors financial PaymentModal)\n// ---------------------------------------------------------------------------\n\nconst TYPE_ICONS: Record<string, React.ElementType> = {\n cash: Banknote, pix: QrCode, credit_card: CreditCard, debit_card: CreditCard,\n bank_transfer: ArrowRightLeft, check: FileCheck,\n}\n\nconst TYPE_COLORS: Record<string, string> = {\n cash: 'border-success/30 bg-success/5 hover:bg-success/10 data-[active=true]:border-success data-[active=true]:bg-success/15',\n pix: 'border-teal-500/30 bg-teal-500/5 hover:bg-teal-500/10 data-[active=true]:border-teal-500 data-[active=true]:bg-teal-500/15',\n credit_card: 'border-info/30 bg-info/5 hover:bg-info/10 data-[active=true]:border-info data-[active=true]:bg-info/15',\n debit_card: 'border-magic/30 bg-magic/5 hover:bg-magic/10 data-[active=true]:border-magic data-[active=true]:bg-magic/15',\n bank_transfer: 'border-warning/30 bg-warning/5 hover:bg-warning/10 data-[active=true]:border-warning data-[active=true]:bg-warning/15',\n check: 'border-input/30 bg-muted/5 hover:bg-muted/10 data-[active=true]:border-input data-[active=true]:bg-muted/15',\n}\n\nconst ICON_COLORS: Record<string, string> = {\n cash: 'text-success', pix: 'text-teal-500', credit_card: 'text-info',\n debit_card: 'text-magic', bank_transfer: 'text-warning', check: 'text-muted-foreground',\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\ninterface Props {\n orderId: string\n orderTotal: number\n services?: Array<{ name: string; price: number; durationMinutes: number }>\n onClose: () => void\n onPaymentChange?: () => void\n formatCurrency: (amount: number) => string\n /** Render inline (no portal overlay) — for embedding in tabs */\n inline?: boolean\n}\n\nexport function BookingPaymentPanel({ orderId, orderTotal, services, onClose, onPaymentChange, formatCurrency, inline }: Props) {\n const t = useTranslation()\n const config = useAgendaConfig()\n const bridge = config.financialBridge!\n\n const [visible, setVisible] = useState(false)\n const [loading, setLoading] = useState(true)\n const [detail, setDetail] = useState<BookingPaymentDetail | null>(null)\n\n // Payment form\n const [selectedTypeId, setSelectedTypeId] = useState('')\n const [paymentTypes, setPaymentTypes] = useState<Array<{ id: string; name: string; transactionType?: string }>>([])\n const [bankAccounts, setBankAccounts] = useState<Array<{ id: string; name: string; accountType: string }>>([])\n const [filteredMethods, setFilteredMethods] = useState<Array<{ id: string; name: string }>>([])\n const [selectedBankId, setSelectedBankId] = useState('')\n const [paymentMethodId, setPaymentMethodId] = useState('')\n const [cardBrand, setCardBrand] = useState('')\n const [cardInstallments, setCardInstallments] = useState(1)\n const [processing, setProcessing] = useState(false)\n const [justPaid, setJustPaid] = useState(false)\n\n useEffect(() => { requestAnimationFrame(() => setVisible(true)) }, [])\n\n // Single combined fetch for all initial data\n useEffect(() => {\n let cancelled = false\n setLoading(true)\n Promise.all([\n bridge.getPaymentDetail(orderId).catch(() => null),\n bridge.getPaymentMethodTypes().catch(() => [] as typeof paymentTypes),\n bridge.getBankAccounts().catch(() => [] as typeof bankAccounts),\n ]).then(([d, types, accounts]) => {\n if (cancelled) return\n setDetail(d)\n setPaymentTypes(types)\n setBankAccounts(accounts)\n setLoading(false)\n })\n return () => { cancelled = true }\n }, [orderId])\n\n function handleClose() {\n setVisible(false)\n setTimeout(onClose, 200)\n }\n\n const selectedType = paymentTypes.find((t) => t.id === selectedTypeId)\n const txType = selectedType?.transactionType ?? ''\n const needsBank = ['bank_transfer', 'pix', 'check'].includes(txType)\n const needsCard = txType === 'credit_card' || txType === 'debit_card'\n const needsCardInstallments = txType === 'credit_card'\n\n function handleSelectType(typeId: string) {\n setSelectedTypeId(typeId)\n setSelectedBankId('')\n setPaymentMethodId('')\n setCardBrand('')\n setCardInstallments(1)\n // Fetch specific payment methods for this type\n if (bridge.getPaymentMethods) {\n bridge.getPaymentMethods(typeId).then(setFilteredMethods).catch(() => setFilteredMethods([]))\n }\n }\n\n async function handleCheckout() {\n if (!selectedTypeId) return\n setProcessing(true)\n try {\n const result = await bridge.checkout(orderId, {\n paymentMethodTypeId: selectedTypeId,\n paymentMethodId: paymentMethodId || undefined,\n bankAccountId: needsBank ? selectedBankId || undefined : undefined,\n cardBrand: needsCard ? cardBrand || undefined : undefined,\n cardInstallments: needsCardInstallments ? cardInstallments : undefined,\n })\n setDetail(result)\n setJustPaid(true)\n onPaymentChange?.()\n // Show confirmation animation, then transition to summary\n setTimeout(() => setJustPaid(false), 2200)\n } catch { /* toast */ }\n setProcessing(false)\n }\n\n const isPaid = detail?.status === 'paid'\n\n const content = (\n <div className=\"px-5 py-4 space-y-4\">\n\n {/* Loading */}\n {loading && (\n <div className=\"space-y-3 py-2\">\n {[...Array(3)].map((_, i) => (\n <div key={i} className=\"h-8 rounded-lg bg-muted animate-pulse\" />\n ))}\n </div>\n )}\n\n {/* Just paid — confirmation animation */}\n {!loading && isPaid && justPaid && (\n <div className=\"text-center py-8 space-y-2 animate-in fade-in zoom-in-95 duration-300\">\n <div className=\"flex h-14 w-14 mx-auto items-center justify-center rounded-full bg-success/10 animate-bounce\" style={{ animationDuration: '600ms', animationIterationCount: '2' }}>\n <Check className=\"h-7 w-7 text-success\" />\n </div>\n <p className=\"text-sm font-semibold text-success\">{t('agenda.payment.checkoutComplete')}</p>\n <p className=\"text-xs text-muted-foreground\">{formatCurrency(detail!.totalAmount)}</p>\n </div>\n )}\n\n {/* Invoice summary — shown after animation or when returning to an already-paid/pending booking */}\n {!loading && detail && detail.status !== 'none' && !justPaid && (\n <div className=\"space-y-3 animate-in fade-in duration-300\">\n {/* Movement rows with inline status badge */}\n {detail.movements.length > 0 ? (\n <div className=\"space-y-1.5\">\n {detail.movements.map((mov) => {\n const methodName = mov.paymentMethodTypeName\n const txKey = (methodName ?? '').toLowerCase().replace(/\\s+/g, '_')\n const Icon = TYPE_ICONS[txKey] ?? Banknote\n const iconColor = ICON_COLORS[txKey] ?? 'text-muted-foreground'\n const isMovPaid = mov.status === 'paid'\n const isPartial = mov.status === 'partial'\n const isOverdue = mov.status === 'overdue'\n\n return (\n <div key={mov.id} className=\"flex items-center gap-3 rounded-lg border px-3 py-2.5\">\n <Icon className={`h-4 w-4 shrink-0 ${isMovPaid ? iconColor : 'text-muted-foreground'}`} />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium truncate\">\n {methodName ?? '—'}\n {mov.cardBrand ? ` · ${mov.cardBrand}` : ''}\n {mov.cardInstallments && mov.cardInstallments > 1 ? ` ${mov.cardInstallments}x` : ''}\n </p>\n <p className=\"text-[10px] text-muted-foreground\">\n {mov.paymentDate ?? mov.dueDate}\n {detail.movements.length > 1 && mov.installmentNumber ? ` · ${t('agenda.payment.installment')} ${mov.installmentNumber}` : ''}\n </p>\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n {isMovPaid && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-success/10 px-2 py-0.5 text-[10px] font-medium text-success\">\n <Check className=\"h-2.5 w-2.5\" /> {t('agenda.payment.paid')}\n </span>\n )}\n {isPartial && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-warning/10 px-2 py-0.5 text-[10px] font-medium text-warning\">\n ! {formatCurrency(mov.paidAmount)}/{formatCurrency(mov.amount)}\n </span>\n )}\n {isOverdue && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-destructive/10 px-2 py-0.5 text-[10px] font-medium text-destructive\">\n ! {t('agenda.payment.overdue')}\n </span>\n )}\n {mov.status === 'pending' && (\n <span className=\"inline-flex items-center rounded-full bg-muted px-2 py-0.5 text-[10px] font-medium text-muted-foreground\">\n {t('agenda.payment.pending')}\n </span>\n )}\n <span className=\"text-sm font-semibold\">{formatCurrency(mov.paidAmount || mov.amount)}</span>\n </div>\n </div>\n )\n })}\n </div>\n ) : (\n <div className=\"flex items-center justify-between text-sm px-1\">\n <span className=\"text-muted-foreground\">{t('agenda.payment.total')}</span>\n <span className=\"font-semibold\">{formatCurrency(detail.totalAmount)}</span>\n </div>\n )}\n\n {/* Invoice ref + link */}\n <div className=\"flex items-center justify-between\">\n {detail.referenceNumber && (\n <span className=\"text-[10px] font-mono text-muted-foreground\">#{detail.referenceNumber}</span>\n )}\n <a\n href={`#/financial/receivables/detail/${detail.invoiceId}`}\n className=\"inline-flex items-center gap-1.5 text-xs font-medium text-primary hover:underline ml-auto\"\n >\n {t('agenda.payment.viewInvoice')}\n <ExternalLink className=\"h-3 w-3\" />\n </a>\n </div>\n </div>\n )}\n\n {/* Checkout view — only when no invoice exists yet */}\n {!loading && (!detail || detail.movements.length === 0) && (\n <>\n {/* Service summary */}\n {services && services.length > 0 && (\n <div>\n <p className=\"text-[11px] font-medium text-muted-foreground mb-2\">{t('agenda.payment.serviceSummary')}</p>\n <div className=\"space-y-0.5\">\n {services.map((svc, i) => (\n <div key={i} className=\"flex items-center justify-between text-sm py-1\">\n <span className=\"truncate\">{svc.name}</span>\n <span className=\"shrink-0 text-muted-foreground\">{formatCurrency(svc.price)}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Total */}\n <div className=\"flex items-center justify-between text-sm font-semibold pt-2 border-t\">\n <span>{t('agenda.payment.total')}</span>\n <span>{formatCurrency(orderTotal)}</span>\n </div>\n\n {/* Payment method grid */}\n <div>\n <p className=\"text-[11px] font-medium text-muted-foreground mb-2\">{t('agenda.payment.paymentMethod')}</p>\n {paymentTypes.length === 0 ? (\n <div className=\"rounded-lg border border-dashed border-input bg-muted/30 px-3 py-3 text-center\">\n <p className=\"text-xs text-muted-foreground\">{t('agenda.payment.noMethods')}</p>\n <a href=\"#/financial/settings\" className=\"mt-1.5 inline-block text-xs font-medium text-primary hover:underline\">\n {t('agenda.payment.configureMethods')} →\n </a>\n </div>\n ) : (\n <div className=\"grid grid-cols-3 gap-1.5\">\n {paymentTypes.map((pt) => {\n const ptTx = pt.transactionType ?? pt.name.toLowerCase().replace(/\\s+/g, '_')\n const Icon = TYPE_ICONS[ptTx] ?? Banknote\n const colorClass = TYPE_COLORS[ptTx] ?? TYPE_COLORS.cash\n const iconColor = ICON_COLORS[ptTx] ?? ICON_COLORS.cash\n const isActive = selectedTypeId === pt.id\n return (\n <button\n key={pt.id}\n type=\"button\"\n data-active={isActive}\n onClick={() => handleSelectType(pt.id)}\n className={`flex flex-col items-center gap-1 rounded-lg border p-2.5 text-[10px] font-medium transition-all ${colorClass}`}\n >\n <Icon className={`h-4 w-4 ${iconColor}`} />\n <span className=\"truncate w-full text-center\">{pt.name}</span>\n </button>\n )\n })}\n </div>\n )}\n </div>\n\n {/* Extra fields based on payment type */}\n {selectedTypeId && (\n <div className=\"space-y-3\">\n {/* Specific payment method (filtered by type) */}\n {filteredMethods.length > 0 && (\n <div>\n <label className=\"text-[11px] font-medium text-muted-foreground\">\n {needsCard ? t('agenda.payment.card') : t('agenda.payment.method')}\n </label>\n <select value={paymentMethodId} onChange={(e) => setPaymentMethodId(e.target.value)}\n className=\"w-full mt-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2.5 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-ring\">\n <option value=\"\">{t('agenda.payment.select')}</option>\n {filteredMethods.map((m) => <option key={m.id} value={m.id}>{m.name}</option>)}\n </select>\n </div>\n )}\n\n {/* Card brand + installments */}\n {needsCard && (\n <div className={`grid gap-2.5 ${needsCardInstallments ? 'grid-cols-2' : 'grid-cols-1'}`}>\n <div>\n <label className=\"text-[11px] font-medium text-muted-foreground\">{t('agenda.payment.cardBrand')}</label>\n <select value={cardBrand} onChange={(e) => setCardBrand(e.target.value)}\n className=\"w-full mt-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2.5 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-ring\">\n <option value=\"\">{t('agenda.payment.selectBrand')}</option>\n {['Visa', 'Mastercard', 'American Express', 'Elo', 'Hipercard', 'Diners Club'].map((b) => (\n <option key={b} value={b}>{b}</option>\n ))}\n </select>\n </div>\n {needsCardInstallments && (\n <div>\n <label className=\"text-[11px] font-medium text-muted-foreground\">{t('agenda.payment.cardInstallments')}</label>\n <select value={cardInstallments} onChange={(e) => setCardInstallments(Number(e.target.value))}\n className=\"w-full mt-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2.5 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-ring\">\n {Array.from({ length: 12 }, (_, i) => i + 1).map((n) => (\n <option key={n} value={n}>{n}x {n > 1 ? formatCurrency(orderTotal / n) : ''}</option>\n ))}\n </select>\n </div>\n )}\n </div>\n )}\n\n {/* Bank account */}\n {needsBank && bankAccounts.length > 0 && (\n <div>\n <label className=\"text-[11px] font-medium text-muted-foreground\">{t('agenda.payment.bankAccount')}</label>\n <select value={selectedBankId} onChange={(e) => setSelectedBankId(e.target.value)}\n className=\"w-full mt-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2.5 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-ring\">\n <option value=\"\">{t('agenda.payment.selectAccount')}</option>\n {bankAccounts.map((a) => (\n <option key={a.id} value={a.id}>{a.name}</option>\n ))}\n </select>\n </div>\n )}\n </div>\n )}\n\n {/* Confirm button */}\n <button\n type=\"button\"\n onClick={handleCheckout}\n disabled={processing || !selectedTypeId}\n className=\"w-full rounded-lg bg-primary border border-primary py-2.5 text-sm font-medium text-primary-foreground hover:bg-primary/90 shadow-button-primary active:shadow-button-inset disabled:opacity-40 transition-colors\"\n >\n {processing\n ? t('agenda.payment.checkingOut')\n : `${t('agenda.payment.checkout')} ${formatCurrency(orderTotal)}`\n }\n </button>\n </>\n )}\n </div>\n )\n\n if (inline) return content\n\n return createPortal(\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center transition-colors duration-200\"\n style={{ backgroundColor: visible ? 'rgba(0,0,0,0.5)' : 'rgba(0,0,0,0)' }}\n onClick={handleClose}\n >\n <div\n className=\"w-full max-w-md rounded-xl border bg-card shadow-2xl mx-4 transition-all duration-200 max-h-[90vh] overflow-y-auto\"\n style={{ opacity: visible ? 1 : 0, transform: visible ? 'scale(1) translateY(0)' : 'scale(0.95) translateY(8px)' }}\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"flex items-center justify-between px-5 py-4 border-b sticky top-0 bg-card z-10\">\n <h3 className=\"text-base font-semibold\">{t('agenda.payment.title')}</h3>\n <button onClick={handleClose} className=\"p-1 text-muted-foreground hover:text-foreground transition-colors\">\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n {content}\n </div>\n </div>,\n document.body,\n )\n}\n","// ---------------------------------------------------------------------------\n// Agenda Plugin — Pure TypeScript types\n// Zero dependencies. Maps to saas_core archetype tables.\n// ---------------------------------------------------------------------------\n\n// ============================================================\n// ENUMS / LITERALS\n// ============================================================\n\n/** Booking status lifecycle */\nexport type BookingStatus =\n | 'scheduled'\n | 'confirmed'\n | 'in_progress'\n | 'completed'\n | 'cancelled'\n | 'no_show'\n\n/** Confirmation outreach status */\nexport type ConfirmationStatus = 'pending' | 'sent' | 'confirmed' | 'declined'\n\n/** Booking type identifier — extensible via string literal union */\nexport type BookingTypeId = 'appointment' | 'task' | 'out_of_office' | 'block' | (string & {})\n\n/** Configuration for a booking type (event type) */\nexport interface BookingTypeConfig {\n id: BookingTypeId\n label: string\n icon: string\n color: string\n fields: {\n /** Free-text event title (maps to the booking's display name). Used by\n * simple / Google-Calendar-style events that have no client party. */\n title?: boolean\n client: boolean\n professional: boolean\n services: boolean\n location: boolean\n status: boolean\n }\n requiresServices: boolean\n requiresClient: boolean\n}\n\n// ============================================================\n// CORE ENTITIES\n// ============================================================\n\n/** A booking service line item (from saas_core.booking_items) */\nexport interface BookingService {\n id: string\n serviceId: string | null\n name: string\n durationMinutes: number\n price: number\n assigneeId: string | null\n}\n\n/** Calendar booking — the main entity rendered on the calendar (from v_bookings view on orders) */\nexport interface CalendarBooking {\n id: string\n tenantId: string\n kind: string\n /** Lifecycle stage: booked, invoiced, paid, etc. */\n stage?: string\n /** Financial direction: credit, debit, null */\n direction?: string | null\n startsAt: string\n endsAt: string | null\n status: BookingStatus\n notes: string | null\n /** In unified model, orderId === id (the booking IS the order) */\n orderId: string | null\n locationId: string | null\n metadata: Record<string, unknown>\n\n // Client (party)\n clientId: string | null\n clientName: string | null\n clientPhone: string | null\n clientEmail: string | null\n clientAvatarUrl: string | null\n\n // Professional (assignee)\n professionalId: string | null\n professionalName: string | null\n professionalAvatarUrl: string | null\n\n // Location\n locationName: string | null\n\n // Order totals\n orderTotal: number | null\n orderStatus: string | null\n /** Payment status from financial bridge (enriched at runtime) */\n paymentStatus?: import('./financial-bridge').BookingPaymentStatus\n\n // Aggregated services\n services: BookingService[] | null\n totalDurationMinutes: number | null\n\n createdAt: string\n updatedAt: string\n}\n\n/** Professional / staff resource for the calendar */\nexport interface Professional {\n id: string\n name: string\n avatarUrl: string | null\n locationId: string | null\n locationName: string | null\n isActive: boolean\n}\n\n/** Working hours schedule (from saas_core.schedules) */\nexport interface Schedule {\n id: string\n tenantId: string\n kind: string\n assigneeId: string | null\n locationId: string | null\n dayOfWeek: number | null\n specificDate: string | null\n startsAt: string\n endsAt: string\n isActive: boolean\n metadata: Record<string, unknown>\n}\n\n/** Available time slot */\nexport interface TimeSlot {\n start: string\n end: string\n}\n\n/** Confirmation record stored in booking metadata */\nexport interface ConfirmationRecord {\n channel: string\n sentAt: string\n status: ConfirmationStatus\n confirmedAt?: string\n}\n\n// ============================================================\n// STATUS CONFIGURATION\n// ============================================================\n\n/**\n * When a status is available for selection relative to the booking date.\n * - 'always' — any date (e.g. scheduled, confirmed, cancelled)\n * - 'today_or_past' — booking is today or earlier (e.g. completed, no_show)\n * - 'today_only' — booking is today (e.g. in_progress)\n */\nexport type StatusAvailability = 'always' | 'today_or_past' | 'today_only'\n\nexport interface StatusConfig {\n value: string\n label: string\n color: string\n /** When this status can be selected (default: 'always') */\n availableWhen?: StatusAvailability\n}\n\n/** Check if a status is available for a given booking date */\nexport function isStatusAvailable(status: StatusConfig, bookingStartsAt: string): boolean {\n const when = status.availableWhen ?? 'always'\n if (when === 'always') return true\n const bookingDate = bookingStartsAt.slice(0, 10)\n const today = new Date().toISOString().slice(0, 10)\n if (when === 'today_or_past') return bookingDate <= today\n if (when === 'today_only') return bookingDate === today\n return true\n}\n\n// ============================================================\n// MODAL TAB EXTENSION\n// ============================================================\n\n/** Props passed to every booking modal tab component */\nexport interface BookingModalTabProps {\n bookingId?: string\n clientId: string\n orderId: string | null\n services: Array<{ name: string; price: number; durationMinutes: number }>\n formatCurrency: (amount: number) => string\n onDataChange?: () => void\n}\n\n/** A tab registered in the booking edit modal */\nexport interface BookingModalTab {\n id: string\n label: string\n icon: string\n order: number\n component: React.ComponentType<BookingModalTabProps>\n visible?: (ctx: { mode: 'create' | 'edit'; clientId?: string; orderId?: string }) => boolean\n}\n\n// ============================================================\n// INPUT TYPES (create / mutate)\n// ============================================================\n\nexport interface CreateBookingInput {\n kind?: BookingTypeId\n clientId: string\n professionalId: string\n locationId?: string\n startsAt: string\n notes?: string\n /** Free-text event title for simple events (no client party). Maps to the\n * booking's display name (clientName in the read model). */\n title?: string\n services: CreateBookingServiceInput[]\n}\n\nexport interface CreateBookingServiceInput {\n serviceId: string\n name: string\n durationMinutes: number\n price: number\n assigneeId?: string\n}\n\nexport interface UpdateBookingInput {\n clientId?: string\n professionalId?: string\n locationId?: string\n startsAt?: string\n endsAt?: string\n status?: BookingStatus\n notes?: string\n /** Free-text event title for simple events (no client party). */\n title?: string\n services?: CreateBookingServiceInput[]\n}\n\nexport interface SaveScheduleInput {\n assigneeId: string\n locationId?: string\n dayOfWeek?: number\n specificDate?: string\n startsAt: string\n endsAt: string\n isActive?: boolean\n metadata?: Record<string, unknown>\n}\n\n// ============================================================\n// QUERY / FILTER TYPES\n// ============================================================\n\nexport interface BookingQuery {\n dateRange: { start: string; end: string }\n professionalIds?: string[]\n locationId?: string\n statuses?: string[]\n kind?: string\n}\n\nexport interface ConflictCheckParams {\n assigneeId: string\n startsAt: string\n endsAt: string\n excludeBookingId?: string\n}\n\nexport interface AvailableSlotsParams {\n assigneeId: string\n date: string\n durationMinutes: number\n slotInterval?: number\n}\n","import React, { useState, useEffect, useMemo, useRef } from 'react'\nimport { createPortal } from 'react-dom'\nimport { Clock, AlertTriangle, X, User, Briefcase, FileText, CircleDot, Plus, MapPin, Calendar, DollarSign, CheckSquare, Ban, Check, HandCoins } from 'lucide-react'\n\nconst BOOKING_TYPE_ICONS: Record<string, React.ElementType> = {\n Calendar, CheckSquare, Ban,\n}\nimport {\n Modal, ModalContent, ModalTitle,\n} from '@fayz-ai/ui'\nimport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from '@fayz-ai/ui'\nimport { cn } from '@fayz-ai/ui'\nimport { SearchCombobox, type ComboboxOption } from './SearchCombobox'\nimport { PersonLink } from '@fayz-ai/saas'\nimport { BookingPaymentPanel } from './BookingPaymentPanel'\nimport { CrudDetailPage } from '@fayz-ai/saas'\nimport { CrudFormPage } from '@fayz-ai/saas'\nimport { Button } from '@fayz-ai/ui'\nimport { useAgendaConfig, useAgendaProvider, useAgendaStore } from '../AgendaContext'\nimport { useTranslation } from '@fayz-ai/core'\nimport { getCurrentLocale } from '@fayz-ai/core'\nimport { isStatusAvailable } from '../types'\nimport type { CreateBookingInput, BookingTypeId } from '../types'\nimport type { ExternalBookingSource } from '../config'\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction fmtCurrency(amount: number, locale: string, code: string): string {\n return new Intl.NumberFormat(locale, { style: 'currency', currency: code }).format(amount)\n}\n\nfunction formatCompactDate(dateStr: string, locale: string): string {\n const d = new Date(dateStr + 'T00:00:00')\n return d.toLocaleDateString(locale === 'pt-BR' ? 'pt-BR' : 'en-US', {\n weekday: 'short', month: 'short', day: 'numeric',\n })\n}\n\ninterface ServiceItem { serviceId: string; name: string; durationMinutes: number; price: number }\ninterface CancellationReasonItem { id: string; label: string; requiresNotes?: boolean }\n\n// ---------------------------------------------------------------------------\n// Inline editable number — allows clearing, commits on blur/enter\n// ---------------------------------------------------------------------------\n\nfunction InlineNumber({ value, onChange, min = 0, step = 1, className, disabled, tooltip }: {\n value: number; onChange: (v: number) => void; min?: number; step?: number\n className?: string; disabled?: boolean; tooltip?: string\n}) {\n const [draft, setDraft] = useState(String(value))\n const [focused, setFocused] = useState(false)\n\n useEffect(() => { if (!focused) setDraft(String(value)) }, [value, focused])\n\n function commit() {\n setFocused(false)\n const v = parseFloat(draft)\n if (!isNaN(v) && v >= min) {\n onChange(v)\n } else {\n setDraft(String(value))\n }\n }\n\n const input = (\n <input\n type=\"text\"\n inputMode=\"decimal\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onFocus={(e) => { setFocused(true); e.target.select() }}\n onBlur={commit}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); commit() } }}\n disabled={disabled}\n className={cn(\n 'text-right text-[11px] text-muted-foreground bg-transparent border-b border-transparent hover:border-muted-foreground/40 focus:border-foreground focus:outline-none tabular-nums',\n className,\n )}\n />\n )\n\n if (!tooltip) return input\n\n return (\n <TooltipProvider delayDuration={400}>\n <Tooltip>\n <TooltipTrigger asChild>{input}</TooltipTrigger>\n <TooltipContent side=\"top\" className=\"text-xs\">{tooltip}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Custom Status Select\n// ---------------------------------------------------------------------------\n\nfunction StatusSelect({ value, onChange, statuses, bookingDate }: {\n value: string; onChange: (v: string) => void\n statuses: Array<{ value: string; label: string; color: string; availableWhen?: string }>\n bookingDate?: string\n}) {\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLDivElement>(null)\n const dropdownRef = useRef<HTMLDivElement>(null)\n const current = statuses.find((s) => s.value === value)\n\n useEffect(() => {\n if (!open) return\n const handler = (e: MouseEvent) => {\n const target = e.target as Node\n if (ref.current?.contains(target)) return\n if (dropdownRef.current?.contains(target)) return\n setOpen(false)\n }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [open])\n\n const btnRef = useRef<HTMLButtonElement>(null)\n const [dropRect, setDropRect] = useState<DOMRect | null>(null)\n\n function handleOpen() {\n if (btnRef.current) setDropRect(btnRef.current.getBoundingClientRect())\n setOpen((p) => !p)\n }\n\n return (\n <div ref={ref} className=\"relative flex-1\">\n <button ref={btnRef} type=\"button\" onClick={handleOpen}\n className=\"flex items-center gap-2 rounded-md px-2 py-1.5 text-sm hover:bg-muted/30 transition-colors text-left w-full\">\n {current && <>\n <span className=\"h-2 w-2 rounded-full shrink-0\" style={{ backgroundColor: current.color }} />\n <span>{current.label}</span>\n </>}\n <svg className=\"ml-auto h-3 w-3 text-muted-foreground shrink-0\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </button>\n {open && dropRect && createPortal(\n <div ref={dropdownRef} data-modal-passthrough style={{ position: 'fixed', left: dropRect.left, top: dropRect.bottom + 4, width: dropRect.width, zIndex: 9999, pointerEvents: 'auto' }}\n className=\"fayz-glass-surface rounded-lg border bg-popover shadow-lg py-1 animate-in fade-in zoom-in-95 duration-100\">\n {statuses.map((s: any) => {\n const available = !bookingDate || isStatusAvailable(s as any, bookingDate)\n return (\n <button key={s.value} type=\"button\" disabled={!available}\n onClick={() => { if (available) { onChange(s.value); setOpen(false) } }}\n className={`flex w-full items-center gap-2.5 px-3 py-1.5 text-sm transition-colors ${\n !available ? 'opacity-30 cursor-not-allowed' : s.value === value ? 'bg-muted/30' : 'hover:bg-muted/50'\n }`}>\n <span className=\"h-2 w-2 rounded-full shrink-0\" style={{ backgroundColor: s.color }} />\n <span>{s.label}</span>\n </button>\n )\n })}\n </div>,\n document.body,\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Professional Select — compact inline dropdown with initials\n// ---------------------------------------------------------------------------\n\nfunction ProfessionalSelect({ value, onChange, professionals }: {\n value: string; onChange: (v: string) => void\n professionals: Array<{ id: string; name: string }>\n}) {\n const t = useTranslation()\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLDivElement>(null)\n const current = professionals.find((p) => p.id === value)\n\n useEffect(() => {\n if (!open) return\n const handler = (e: MouseEvent) => { if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false) }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [open])\n\n return (\n <div ref={ref} className=\"relative flex-1\">\n <button type=\"button\" onClick={() => setOpen((p) => !p)}\n className=\"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm hover:bg-muted/30 transition-colors text-left\">\n {current ? (\n <span>{current.name}</span>\n ) : (\n <span className=\"text-muted-foreground\">{t('agenda.appointment.selectProfessional')}</span>\n )}\n <svg className=\"ml-auto h-3 w-3 text-muted-foreground shrink-0\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </button>\n {open && (\n <div className=\"fayz-glass-surface absolute top-full left-0 right-0 z-50 mt-1 rounded-lg border bg-popover shadow-lg py-1 animate-in fade-in zoom-in-95 duration-100\">\n {professionals.map((p: any) => (\n <button key={p.id} type=\"button\"\n onClick={() => { onChange(p.id); setOpen(false) }}\n className={`flex w-full items-center gap-2 px-3 py-1.5 text-sm hover:bg-muted/50 transition-colors ${p.id === value ? 'bg-muted/30' : ''}`}>\n <span>{p.name}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Location Select — compact inline dropdown\n// ---------------------------------------------------------------------------\n\nfunction LocationSelect({ value, onChange, locations }: {\n value: string; onChange: (v: string) => void\n locations: Array<{ id: string; name: string }>\n}) {\n const t = useTranslation()\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLDivElement>(null)\n const current = locations.find((l) => l.id === value)\n\n useEffect(() => {\n if (!open) return\n const handler = (e: MouseEvent) => { if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false) }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [open])\n\n return (\n <div ref={ref} className=\"relative flex-1\">\n <button type=\"button\" onClick={() => setOpen((p) => !p)}\n className=\"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm hover:bg-muted/30 transition-colors text-left\">\n {current ? (\n <span>{current.name}</span>\n ) : (\n <span className=\"text-muted-foreground\">{t('agenda.appointment.selectLocation')}</span>\n )}\n <svg className=\"ml-auto h-3 w-3 text-muted-foreground shrink-0\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </button>\n {open && (\n <div className=\"fayz-glass-surface absolute top-full left-0 right-0 z-50 mt-1 rounded-lg border bg-popover shadow-lg py-1 animate-in fade-in zoom-in-95 duration-100 max-h-48 overflow-y-auto\">\n {locations.map((l: any) => (\n <button key={l.id} type=\"button\"\n onClick={() => { onChange(l.id); setOpen(false) }}\n className={`flex w-full items-center gap-2 px-3 py-1.5 text-sm hover:bg-muted/50 transition-colors ${l.id === value ? 'bg-muted/30' : ''}`}>\n <span>{l.name}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Appointment Modal — Google Calendar-inspired compact layout\n// ---------------------------------------------------------------------------\n\ninterface Props {\n open: boolean\n mode: 'create' | 'edit'\n bookingId?: string\n prefill?: Partial<CreateBookingInput> & { endsAt?: string }\n initialTab?: string\n externalSource?: ExternalBookingSource\n onClose: () => void\n onCreated?: (bookingId: string, source?: ExternalBookingSource) => void\n}\n\nexport function AppointmentModal({ open, mode, bookingId, prefill, initialTab, externalSource, onClose, onCreated }: Props) {\n const t = useTranslation()\n const locale = getCurrentLocale()\n const config = useAgendaConfig()\n const provider = useAgendaProvider()\n const initialSnapshot = useRef<string>('')\n const createBooking = useAgendaStore((s) => s.createBooking)\n const updateBooking = useAgendaStore((s) => s.updateBooking)\n const deleteBooking = useAgendaStore((s) => s.deleteBooking)\n const fetchBookings = useAgendaStore((s) => s.fetchBookings)\n const agendaDateRange = useAgendaStore((s) => s.dateRange)\n const professionals = useAgendaStore((s) => s.professionals)\n const storeLocations = useAgendaStore((s) => s.locations)\n\n // --- State ---\n // Default to the first configured booking type (e.g. 'event' in simple mode,\n // 'appointment' otherwise) so single-type agendas resolve their type cleanly.\n const defaultBookingType = (config.bookingTypes[0]?.id ?? 'appointment') as BookingTypeId\n const [loading, setLoading] = useState(mode === 'edit')\n const [bookingType, setBookingType] = useState<BookingTypeId>(prefill?.kind ?? defaultBookingType)\n const [title, setTitle] = useState('')\n const [clientId, setClientId] = useState(prefill?.clientId ?? '')\n const [clientSearch, setClientSearch] = useState('')\n const [clientPhone, setClientPhone] = useState('')\n const [professionalId, setProfessionalId] = useState(prefill?.professionalId ?? '')\n const [locationId, setLocationId] = useState(prefill?.locationId ?? '')\n const [services, setServices] = useState<ServiceItem[]>([])\n const [serviceSearch, setServiceSearch] = useState('')\n const [date, setDate] = useState(() => {\n if (prefill?.startsAt) return prefill.startsAt.slice(0, 10)\n return new Date().toISOString().slice(0, 10)\n })\n const [startTime, setStartTime] = useState(() => {\n if (prefill?.startsAt) {\n const d = new Date(prefill.startsAt)\n return `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`\n }\n return '09:00'\n })\n const [status, setStatus] = useState('scheduled')\n const [notes, setNotes] = useState('')\n const [showNotes, setShowNotes] = useState(false)\n const [saving, setSaving] = useState(false)\n const [conflict, setConflict] = useState(false)\n const [quickCreate, setQuickCreate] = useState(false)\n const [newClientName, setNewClientName] = useState('')\n const [newClientPhone, setNewClientPhone] = useState('')\n const [newClientEmail, setNewClientEmail] = useState('')\n const [creatingClient, setCreatingClient] = useState(false)\n const [clientOptions, setClientOptions] = useState<ComboboxOption[]>([])\n const [clientSearching, setClientSearching] = useState(false)\n const [serviceOptions, setServiceOptions] = useState<ComboboxOption[]>([])\n const [initialServiceOptions, setInitialServiceOptions] = useState<ComboboxOption[]>([])\n const [editingDate, setEditingDate] = useState(false)\n const [editingTime, setEditingTime] = useState(false)\n const [confirmingDelete, setConfirmingDelete] = useState(false)\n const [deleting, setDeleting] = useState(false)\n const [editOrderId, setEditOrderId] = useState<string | null>(null)\n const [editOrderTotal, setEditOrderTotal] = useState(0)\n const [editPaymentStatus, setEditPaymentStatus] = useState<import('../financial-bridge').BookingPaymentStatus>('none')\n const [paymentStatusLoading, setPaymentStatusLoading] = useState(false)\n const [modalTab, setModalTab] = useState<'appointment' | 'client' | 'financial'>('appointment')\n const [clientData, setClientData] = useState<Record<string, any> | null>(null)\n const [clientDataLoading, setClientDataLoading] = useState(false)\n const [clientEditing, setClientEditing] = useState(false)\n const [cancellationReasons, setCancellationReasons] = useState<CancellationReasonItem[]>([])\n const [cancellationReasonId, setCancellationReasonId] = useState('')\n const [cancellationNotes, setCancellationNotes] = useState('')\n const [cancellationReasonsLoading, setCancellationReasonsLoading] = useState(false)\n\n // Active booking type config\n const activeType = config.bookingTypes.find((bt) => bt.id === bookingType) ?? config.bookingTypes[0]\n\n // Reset form when modal opens\n useEffect(() => {\n if (!open) return\n setClientId(prefill?.clientId ?? ''); setClientSearch(''); setClientPhone('')\n setProfessionalId(prefill?.professionalId ?? ''); setLocationId(prefill?.locationId ?? ''); setServices([])\n setServiceSearch(''); setNotes(''); setStatus('scheduled'); setShowNotes(false)\n setConflict(false); setLoading(mode === 'edit')\n setQuickCreate(false); setNewClientName(''); setNewClientPhone(''); setNewClientEmail(''); setCreatingClient(false)\n setBookingType(prefill?.kind ?? defaultBookingType); setTitle('')\n setEditingDate(false); setEditingTime(false); setConfirmingDelete(false); setDeleting(false)\n setEditOrderId(null); setEditOrderTotal(0); setEditPaymentStatus('none'); setPaymentStatusLoading(false)\n setClientData(null); setClientDataLoading(false); setClientEditing(false)\n setCancellationReasonId(''); setCancellationNotes(''); setCancellationReasonsLoading(false)\n setModalTab((initialTab as 'appointment' | 'client' | 'financial') || 'appointment')\n if (!prefill?.professionalId && professionals.length === 1) setProfessionalId(professionals[0].id)\n setDate(() => {\n if (prefill?.startsAt) return prefill.startsAt.slice(0, 10)\n return new Date().toISOString().slice(0, 10)\n })\n setStartTime(() => {\n if (prefill?.startsAt) {\n const d = new Date(prefill.startsAt)\n return `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`\n }\n return '09:00'\n })\n }, [open])\n\n // Edit: load existing\n useEffect(() => {\n if (!open || mode !== 'edit' || !bookingId) return\n setLoading(true)\n provider.getBookingById(bookingId).then((b) => {\n if (!b) { setLoading(false); return }\n setBookingType((b.kind as BookingTypeId) ?? defaultBookingType)\n setTitle(b.clientName ?? '')\n setClientId(b.clientId ?? ''); setClientSearch(b.clientName ?? '')\n setProfessionalId(b.professionalId ?? ''); setLocationId(b.locationId ?? '')\n setDate(b.startsAt.slice(0, 10))\n const d = new Date(b.startsAt)\n setStartTime(`${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`)\n setStatus(b.status); setNotes(b.notes ?? '')\n if (b.notes) setShowNotes(true)\n if (b.services) setServices(b.services.map((s: any) => ({\n serviceId: s.serviceId ?? '', name: s.name, durationMinutes: s.durationMinutes, price: s.price,\n })))\n setEditOrderId(b.orderId ?? null)\n setEditOrderTotal(b.orderTotal ?? 0)\n setEditPaymentStatus(b.paymentStatus ?? 'none')\n // Save initial snapshot for dirty check\n const svcSnap = b.services ? b.services.map((s: any) => ({ id: s.serviceId ?? '', dur: s.durationMinutes, price: s.price })) : []\n initialSnapshot.current = JSON.stringify({\n title: b.clientName ?? '',\n clientId: b.clientId ?? '', professionalId: b.professionalId ?? '', locationId: b.locationId ?? '',\n date: b.startsAt.slice(0, 10),\n startTime: `${String(new Date(b.startsAt).getHours()).padStart(2, '0')}:${String(new Date(b.startsAt).getMinutes()).padStart(2, '0')}`,\n status: b.status, notes: b.notes ?? '', cancellationReasonId: '', cancellationNotes: '', services: svcSnap,\n })\n setLoading(false)\n // Resolve payment status from bridge if available\n if (b.orderId && config.financialBridge) {\n setPaymentStatusLoading(true)\n config.financialBridge.resolvePaymentStatuses([b.orderId]).then((map) => {\n const summary = map.get(b.orderId!)\n if (summary) {\n setEditPaymentStatus(summary.status)\n setEditOrderTotal(summary.totalAmount)\n }\n }).catch(() => {}).finally(() => setPaymentStatusLoading(false))\n }\n }).catch(() => setLoading(false))\n }, [open, mode, bookingId])\n\n // Fetch client data when client tab is opened\n useEffect(() => {\n if (modalTab !== 'client' || !clientId || !config.contactLookup || clientData) return\n setClientDataLoading(true)\n config.contactLookup.getById(clientId).then((result) => {\n setClientData(result?.data ?? null)\n setClientDataLoading(false)\n }).catch(() => setClientDataLoading(false))\n }, [modalTab, clientId])\n\n useEffect(() => {\n if (!open || status !== 'cancelled' || !config.cancellationDetails || cancellationReasons.length > 0) return\n setCancellationReasonsLoading(true)\n config.cancellationDetails.listReasons()\n .then((reasons) => setCancellationReasons(reasons))\n .catch(() => setCancellationReasons([]))\n .finally(() => setCancellationReasonsLoading(false))\n }, [open, status, config.cancellationDetails, cancellationReasons.length])\n\n // Fetch initial service list when modal opens\n useEffect(() => {\n if (!open || !config.serviceLookup) return\n const lookup = config.serviceLookup\n const fetch = lookup.list ? () => lookup.list!() : () => lookup.search('')\n fetch().then((results) => {\n const opts = results.map((r: any) => ({ id: r.id, label: r.label, subtitle: r.subtitle, price: r.price, data: r.data }))\n setInitialServiceOptions(opts)\n }).catch(() => setInitialServiceOptions([]))\n }, [open])\n\n // Search effects\n useEffect(() => {\n if (!config.contactLookup || clientSearch.length < 1 || clientId) { setClientOptions([]); setClientSearching(false); return }\n setClientSearching(true)\n const timer = setTimeout(async () => {\n try {\n const results = await config.contactLookup!.search(clientSearch)\n setClientOptions(results.map((r: any) => ({ id: r.id, label: r.label, subtitle: r.subtitle, price: r.price, data: r.data })))\n } catch { setClientOptions([]) }\n setClientSearching(false)\n }, 250)\n return () => clearTimeout(timer)\n }, [clientSearch, clientId])\n\n useEffect(() => {\n if (!config.serviceLookup || serviceSearch.length < 1) { setServiceOptions([]); return }\n const timer = setTimeout(async () => {\n try {\n const results = await config.serviceLookup!.search(serviceSearch)\n setServiceOptions(results.map((r: any) => ({ id: r.id, label: r.label, subtitle: r.subtitle, price: r.price, data: r.data })))\n } catch { setServiceOptions([]) }\n }, 250)\n return () => clearTimeout(timer)\n }, [serviceSearch])\n\n // Computed\n const serviceDuration = services.reduce((sum, s) => sum + s.durationMinutes, 0)\n const selectionDuration = useMemo(() => {\n if (!prefill?.startsAt || !prefill?.endsAt) return 0\n return Math.round((new Date(prefill.endsAt).getTime() - new Date(prefill.startsAt).getTime()) / 60000)\n }, [prefill?.startsAt, prefill?.endsAt])\n const totalDuration = serviceDuration > 0 ? serviceDuration : selectionDuration\n const totalPrice = services.reduce((sum, s) => sum + s.price, 0)\n const { currency } = config\n\n const endTime = useMemo(() => {\n const [h, m] = startTime.split(':').map(Number)\n const total = h * 60 + m + totalDuration\n return `${String(Math.floor(total / 60) % 24).padStart(2, '0')}:${String(total % 60).padStart(2, '0')}`\n }, [startTime, totalDuration])\n\n // Conflict check\n useEffect(() => {\n if (!professionalId || totalDuration === 0) { setConflict(false); return }\n const timer = setTimeout(() => {\n provider.checkConflict({\n assigneeId: professionalId, startsAt: `${date}T${startTime}:00`, endsAt: `${date}T${endTime}:00`, excludeBookingId: bookingId,\n }).then(setConflict).catch(() => setConflict(false))\n }, 300)\n return () => clearTimeout(timer)\n }, [professionalId, date, startTime, endTime, bookingId])\n\n function selectClient(opt: ComboboxOption) {\n setClientId(opt.id); setClientSearch(opt.label); setClientOptions([])\n setClientPhone((opt.data?.phone as string) ?? '')\n }\n function addService(opt: ComboboxOption) {\n const duration = (opt.data?.duration_minutes as number) || 60\n setServices((p) => [...p, { serviceId: opt.id, name: opt.label, durationMinutes: duration, price: opt.price ?? 0 }])\n setServiceSearch(''); setServiceOptions([])\n }\n function removeService(idx: number) { setServices((p) => p.filter((_, i) => i !== idx)) }\n\n async function handleSubmit(e: React.FormEvent) {\n e.preventDefault()\n if (!canSubmit) return\n setSaving(true)\n try {\n const startsAt = new Date(`${date}T${startTime}:00`).toISOString()\n if (mode === 'create') {\n const newBooking = await createBooking({ kind: bookingType, clientId, professionalId, locationId: locationId || undefined, startsAt, notes: notes || undefined,\n title: activeType.fields.title ? title.trim() : undefined,\n services: services.map((s: any) => ({ serviceId: s.serviceId, name: s.name, durationMinutes: s.durationMinutes, price: s.price })) })\n onClose()\n onCreated?.(newBooking.id, externalSource)\n } else if (bookingId) {\n await updateBooking(bookingId, {\n clientId, professionalId, locationId: locationId || undefined, startsAt, notes: notes || undefined, status: status as any,\n title: activeType.fields.title ? title.trim() : undefined,\n services: services.map((s: any) => ({ serviceId: s.serviceId, name: s.name, durationMinutes: s.durationMinutes, price: s.price })),\n })\n if (status === 'cancelled' && config.cancellationDetails && cancellationReasonId) {\n await config.cancellationDetails.saveCancellationDetails({\n bookingId,\n reasonId: cancellationReasonId,\n notes: cancellationNotes.trim() || undefined,\n cancelledAt: new Date().toISOString(),\n })\n }\n onClose()\n }\n } catch { /* toast */ }\n setSaving(false)\n }\n\n async function handleDelete() {\n if (!bookingId) return\n setDeleting(true)\n try { await deleteBooking(bookingId); onClose() } catch { /* toast */ }\n setDeleting(false)\n }\n\n const isPaidBooking = editPaymentStatus === 'paid'\n const selectedCancellationReason = cancellationReasons.find((reason) => reason.id === cancellationReasonId)\n const needsCancellationReason = mode === 'edit' && status === 'cancelled' && !!config.cancellationDetails\n const needsCancellationNotes = needsCancellationReason && !!selectedCancellationReason?.requiresNotes\n\n // Dirty check — only enable Update when something changed\n const formSnapshot = useMemo(() =>\n JSON.stringify({ title, clientId, professionalId, locationId, date, startTime, status, notes, cancellationReasonId, cancellationNotes, services: services.map((s: any) => ({ id: s.serviceId, dur: s.durationMinutes, price: s.price })) }),\n [title, clientId, professionalId, locationId, date, startTime, status, notes, cancellationReasonId, cancellationNotes, services]\n )\n const isDirty = mode === 'create' || formSnapshot !== initialSnapshot.current\n\n const canSubmit = (\n (!activeType.fields.title || title.trim()) &&\n (!activeType.requiresClient || clientId) &&\n (!activeType.fields.professional || professionalId) &&\n (!activeType.requiresServices || services.length > 0) &&\n (!needsCancellationReason || !!cancellationReasonId) &&\n (!needsCancellationNotes || !!cancellationNotes.trim()) &&\n !conflict && !saving\n )\n\n const showTabs = config.bookingTypes.length > 1\n\n return (\n <Modal open={open} onOpenChange={(v) => { if (!v) onClose() }}>\n <ModalContent size=\"lg\" noPadding>\n\n {/* ═══ TOP — type tabs + date/time ═══ */}\n <div className=\"px-5 pt-4 pb-3 shrink-0 space-y-3\">\n <ModalTitle className=\"sr-only\">\n {mode === 'create' ? t('agenda.appointment.new') : t('agenda.appointment.edit')}\n </ModalTitle>\n\n {/* Booking type tabs (create) or section tabs (edit) */}\n {showTabs && mode === 'create' ? (\n <div className=\"flex gap-1 border-b fayz-glass-divider\">\n {config.bookingTypes.map((bt) => {\n const label = t(`agenda.bookingType.${bt.id}`) || bt.label\n const isActive = bookingType === bt.id\n const BtIcon = BOOKING_TYPE_ICONS[bt.icon] ?? Calendar\n return (\n <button key={bt.id} type=\"button\" onClick={() => setBookingType(bt.id)}\n className={`relative flex items-center gap-1.5 pb-2 px-2 text-xs font-medium transition-colors ${\n isActive ? 'text-foreground' : 'text-muted-foreground hover:text-foreground'\n }`}>\n <BtIcon className=\"h-3.5 w-3.5\" />\n {label}\n {isActive && (\n <span className=\"absolute bottom-0 left-0 right-0 h-0.5 rounded-full bg-foreground\" />\n )}\n </button>\n )\n })}\n </div>\n ) : mode === 'edit' && (\n (config.clientEntityDef && clientId) || (config.modules.financial && editOrderId) ? (\n <div className=\"flex gap-1 border-b fayz-glass-divider\">\n {([\n { id: 'appointment' as const, label: t(`agenda.bookingType.${bookingType}`) || activeType.label, icon: Calendar, show: true },\n { id: 'client' as const, label: t('agenda.appointment.clientTab'), icon: User, show: !!config.clientEntityDef && !!clientId },\n { id: 'financial' as const, label: t('agenda.payment.title'), icon: DollarSign, show: config.modules.financial && !!editOrderId },\n ]).filter((tab) => tab.show).map((tab) => {\n const isActive = modalTab === tab.id\n return (\n <button key={tab.id} type=\"button\" onClick={() => setModalTab(tab.id)}\n className={`relative flex items-center gap-1.5 pb-2 px-2 text-xs font-medium transition-colors ${\n isActive ? 'text-foreground' : 'text-muted-foreground hover:text-foreground'\n }`}>\n <tab.icon className=\"h-3.5 w-3.5\" />\n {tab.label}\n {tab.id === 'financial' && editPaymentStatus === 'paid' && (\n <span className=\"h-1.5 w-1.5 rounded-full bg-success\" />\n )}\n {tab.id === 'financial' && editPaymentStatus !== 'paid' && (\n (editPaymentStatus !== 'none' || (totalPrice > 0 && date <= new Date().toISOString().slice(0, 10)))\n ) && (\n <span className=\"h-1.5 w-1.5 rounded-full bg-warning\" />\n )}\n {isActive && (\n <span className=\"absolute bottom-0 left-0 right-0 h-0.5 rounded-full bg-foreground\" />\n )}\n </button>\n )\n })}\n </div>\n ) : (\n <h2 className=\"text-sm font-semibold\">\n {t(`agenda.bookingType.${bookingType}`) || activeType.label}\n </h2>\n )\n )}\n\n {/* Date/time + professional row — hidden on financial tab */}\n {modalTab === 'appointment' && (\n <>\n <div className=\"flex items-center gap-3\">\n <Clock className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <div className=\"flex items-center gap-1.5 text-sm flex-1 min-w-0\">\n {editingDate ? (\n <input type=\"date\" value={date} autoFocus\n onChange={(e) => { setDate(e.target.value); setEditingDate(false) }}\n onBlur={() => setEditingDate(false)}\n className=\"bg-transparent text-sm font-medium focus:outline-none border-b border-foreground w-auto shrink-0\" />\n ) : (\n <button type=\"button\" onClick={() => setEditingDate(true)}\n className=\"px-0.5 py-0.5 font-medium border-b border-transparent hover:border-foreground transition-colors shrink-0\">\n {formatCompactDate(date, locale)}\n </button>\n )}\n {editingTime ? (\n <input type=\"time\" value={startTime} autoFocus\n onChange={(e) => { if (e.target.value) { setStartTime(e.target.value); setEditingTime(false) } }}\n onBlur={() => setEditingTime(false)}\n className=\"bg-transparent text-xs text-muted-foreground focus:outline-none border-b border-foreground w-auto shrink-0\" />\n ) : (\n <button type=\"button\" onClick={() => setEditingTime(true)}\n className=\"px-0.5 py-0.5 text-xs text-muted-foreground border-b border-transparent hover:border-foreground transition-colors shrink-0\">\n {startTime}\n </button>\n )}\n <span className=\"text-[11px] text-muted-foreground/60\">—</span>\n <span className=\"text-[11px] text-muted-foreground/60\">{endTime}</span>\n\n {/* Professional — right-aligned on the same row */}\n {activeType.fields.professional && (\n <div className=\"ml-auto shrink-0\">\n <ProfessionalSelect value={professionalId} onChange={setProfessionalId} professionals={professionals} />\n </div>\n )}\n </div>\n </div>\n\n {conflict && (\n <div className=\"flex items-center gap-2 rounded-lg bg-destructive/10 px-3 py-1.5 text-xs text-destructive\">\n <AlertTriangle className=\"h-3.5 w-3.5 shrink-0\" />\n {t('agenda.appointment.conflict')}\n </div>\n )}\n </>\n )}\n </div>\n\n {/* ═══ BODY ═══ */}\n <div className=\"flex flex-col flex-1 min-h-0 overflow-hidden\">\n\n {/* Client tab content — reuses the same CrudDetailPage as /clients/:id */}\n {modalTab === 'client' && clientId && config.clientEntityDef && (\n <div className=\"flex-1 overflow-y-auto px-5 py-4\">\n {clientDataLoading ? (\n <div className=\"space-y-3 py-2\">\n {[...Array(4)].map((_, i) => (\n <div key={i} className=\"h-8 rounded-lg bg-muted animate-pulse\" />\n ))}\n </div>\n ) : clientData ? (\n clientEditing ? (\n <CrudFormPage\n embedded\n entityDef={config.clientEntityDef}\n mode=\"edit\"\n initialData={clientData}\n namePlural=\"\"\n onCancel={() => setClientEditing(false)}\n onSubmit={async (data) => {\n try {\n const { getSupabaseClientOptional } = await import('@fayz-ai/core')\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return\n const dbData: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(data)) {\n dbData[k.replace(/[A-Z]/g, (m) => '_' + m.toLowerCase())] = v\n }\n await supabase.schema('saas_core').from('persons').update(dbData).eq('id', clientId)\n setClientData({ ...clientData, ...data })\n setClientEditing(false)\n } catch { /* toast */ }\n }}\n />\n ) : (\n <CrudDetailPage\n embedded\n entityDef={config.clientEntityDef}\n item={clientData}\n namePlural=\"\"\n basePath=\"\"\n onBack={() => setModalTab('appointment')}\n onEdit={() => setClientEditing(true)}\n />\n )\n ) : (\n <p className=\"text-sm text-muted-foreground py-4 text-center\">{t('agenda.appointment.noClientData')}</p>\n )}\n </div>\n )}\n\n {/* Financial tab content */}\n {modalTab === 'financial' && editOrderId && config.financialBridge && (\n <div className=\"flex-1 overflow-y-auto\">\n <BookingPaymentPanel\n orderId={editOrderId}\n orderTotal={editOrderTotal}\n services={services.map((s: any) => ({ name: s.name, price: s.price, durationMinutes: s.durationMinutes }))}\n formatCurrency={(v) => fmtCurrency(v, currency.locale, currency.code)}\n inline\n onClose={() => setModalTab('appointment')}\n onPaymentChange={() => {\n config.financialBridge!.getPaymentDetail(editOrderId).then((d) => {\n if (d) { setEditPaymentStatus(d.status); setEditOrderTotal(d.totalAmount) }\n }).catch(() => {})\n // Propagate to the calendar card + popover badge (booking.paymentStatus\n // is ledger-derived) so they update without a page refresh.\n if (agendaDateRange.start) fetchBookings(agendaDateRange)\n }}\n />\n </div>\n )}\n\n {/* Appointment tab content */}\n <form onSubmit={handleSubmit} className=\"flex flex-col flex-1 min-h-0 overflow-hidden\" style={{ display: modalTab === 'appointment' ? undefined : 'none' }}>\n <div className=\"border-t fayz-glass-divider px-5 py-3 space-y-1 flex-1 overflow-y-auto\">\n\n {/* Loading skeleton */}\n {loading && (\n <div className=\"space-y-2 py-2\">\n {[...Array(4)].map((_, i) => (\n <div key={i} className=\"flex items-center gap-3 py-1.5\">\n <div className=\"h-4 w-4 rounded bg-muted animate-pulse shrink-0\" />\n <div className=\"h-8 flex-1 rounded-lg bg-muted animate-pulse\" />\n </div>\n ))}\n </div>\n )}\n\n {!loading && <>\n\n {/* Title — free-text event name (simple / Google-Calendar-style events) */}\n {activeType.fields.title && (\n <div className=\"flex items-center gap-3 py-1\">\n <Calendar className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <input type=\"text\" value={title} onChange={(e) => setTitle(e.target.value)}\n placeholder={t('agenda.appointment.addTitle')} autoFocus={mode === 'create'}\n className=\"w-full flex-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2.5 py-1.5 text-sm font-medium focus:outline-none focus:ring-2 focus:ring-ring\" />\n </div>\n )}\n\n {/* Client */}\n {activeType.fields.client && (\n <div className=\"flex items-center gap-3 py-1\">\n <User className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <div className=\"flex-1\">\n {clientId && !quickCreate ? (\n <div className=\"flex items-center gap-2 rounded-md bg-muted/30 px-2.5 py-1.5 text-sm\">\n <PersonLink personId={clientId} name={clientSearch} size=\"default\" className=\"flex-1 min-w-0\" />\n {clientPhone && <span className=\"text-[10px] text-muted-foreground shrink-0\">{clientPhone}</span>}\n {!isPaidBooking && (\n <button type=\"button\" onClick={() => { setClientId(''); setClientSearch(''); setClientPhone('') }}\n className=\"p-0.5 text-muted-foreground hover:text-destructive shrink-0\">\n <X className=\"h-3 w-3\" />\n </button>\n )}\n </div>\n ) : !quickCreate ? (\n <SearchCombobox\n value={clientSearch}\n onChange={(v) => { setClientSearch(v); setClientId('') }}\n onSelect={selectClient}\n options={clientOptions}\n loading={clientSearching}\n placeholder={t('agenda.appointment.searchClient')}\n allowCreate\n createLabel={t('agenda.appointment.newClient')}\n onCreateNew={(name) => { setQuickCreate(true); setNewClientName(name); setNewClientPhone(''); setNewClientEmail('') }}\n minimal\n inlineLabel={t('agenda.appointment.addClient')}\n />\n ) : (\n <div className=\"rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] p-2.5 space-y-2\">\n <div className=\"flex items-center gap-2\">\n <input type=\"text\" value={newClientName} onChange={(e) => setNewClientName(e.target.value)}\n placeholder={t('agenda.appointment.name')} className=\"flex-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2.5 py-1.5 text-sm font-medium focus:outline-none focus:ring-2 focus:ring-ring\" autoFocus />\n <button type=\"button\" onClick={() => setQuickCreate(false)}\n className=\"p-1 text-muted-foreground hover:text-foreground shrink-0\"><X className=\"h-3.5 w-3.5\" /></button>\n </div>\n <div className=\"grid grid-cols-2 gap-2\">\n <input type=\"tel\" value={newClientPhone} onChange={(e) => setNewClientPhone(e.target.value)}\n placeholder={t('agenda.appointment.phone')} className=\"rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2.5 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-ring\" />\n <input type=\"email\" value={newClientEmail} onChange={(e) => setNewClientEmail(e.target.value)}\n placeholder={t('agenda.appointment.emailOptional')} className=\"rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2.5 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-ring\" />\n </div>\n <button type=\"button\" disabled={creatingClient || !newClientName.trim()}\n onClick={async () => {\n setCreatingClient(true)\n try {\n const { getSupabaseClientOptional } = await import('@fayz-ai/core')\n const { getAgendaTenantId } = await import('../lib/tenant')\n const supabase = getSupabaseClientOptional() as any\n const tenantId = getAgendaTenantId()\n if (!supabase || !tenantId) throw new Error('Not initialized')\n\n // 1. Insert into saas_core.persons (archetype table)\n const { data: personRow, error: personError } = await supabase.schema('saas_core').from('persons').insert({\n tenant_id: tenantId, kind: config.clientKind, name: newClientName.trim(),\n phone: newClientPhone.trim() || null, email: newClientEmail.trim() || null,\n }).select('id, name').single()\n if (personError) throw personError\n\n // 2. Insert into public.clients (project extension table)\n const { error: clientError } = await supabase.from('clients').insert({\n person_id: personRow.id, tenant_id: tenantId,\n })\n if (clientError) {\n // Rollback person if extension insert fails\n await supabase.schema('saas_core').from('persons').delete().eq('id', personRow.id)\n throw clientError\n }\n\n setClientId(personRow.id); setClientSearch(personRow.name); setQuickCreate(false)\n } catch (err: any) {\n const { toast } = await import('@fayz-ai/ui')\n toast.error(t('agenda.appointment.createClientFailed'), { description: err?.message })\n }\n setCreatingClient(false)\n }}\n className=\"w-full rounded-md bg-primary border border-primary px-3 py-1.5 text-xs font-medium text-primary-foreground hover:bg-primary/90 shadow-button-primary active:shadow-button-inset disabled:opacity-40 transition-colors\">\n {creatingClient ? t('agenda.appointment.creating') : t('agenda.appointment.create')}\n </button>\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Location */}\n {activeType.fields.location && config.modules.locationSelection && (storeLocations.length > 0 || config.locations.length > 0) && (\n <div className=\"flex items-center gap-3 py-1\">\n <MapPin className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <LocationSelect\n value={locationId}\n onChange={setLocationId}\n locations={storeLocations.length > 0 ? storeLocations : config.locations}\n />\n </div>\n )}\n\n {/* Services */}\n {activeType.fields.services && (\n <div className=\"flex items-start gap-3 py-1\">\n <Briefcase className=\"h-4 w-4 mt-1.5 text-muted-foreground shrink-0\" />\n <div className=\"flex-1\">\n {services.length > 0 && (\n <div className=\"space-y-0.5 mb-1\">\n {services.map((svc, idx) => (\n <div key={idx} className=\"flex items-center rounded-md bg-muted/30 px-2.5 py-1.5 text-sm\">\n <span className=\"flex-1 truncate min-w-0\">{svc.name}</span>\n <div className=\"flex items-center gap-0.5 shrink-0 ml-3\">\n <InlineNumber\n value={svc.durationMinutes}\n onChange={(v) => setServices((p) => p.map((s, i) => i === idx ? { ...s, durationMinutes: Math.round(v) } : s))}\n min={5}\n step={5}\n className=\"w-10 shrink-0\"\n disabled={isPaidBooking}\n tooltip={t('agenda.appointment.duration')}\n />\n <span className=\"text-[11px] text-muted-foreground\">min</span>\n </div>\n <div className=\"flex items-center gap-0.5 shrink-0 ml-3\">\n <span className=\"text-[11px] text-muted-foreground\">{currency.symbol}</span>\n <InlineNumber\n value={svc.price}\n onChange={(v) => setServices((p) => p.map((s, i) => i === idx ? { ...s, price: v } : s))}\n min={0}\n step={0.01}\n className=\"w-14 shrink-0\"\n disabled={isPaidBooking}\n tooltip={t('agenda.appointment.price')}\n />\n </div>\n {!isPaidBooking && (\n <button type=\"button\" onClick={() => removeService(idx)} className=\"p-0.5 ml-2 text-muted-foreground hover:text-destructive shrink-0\">\n <X className=\"h-3 w-3\" />\n </button>\n )}\n </div>\n ))}\n </div>\n )}\n\n {!isPaidBooking && <SearchCombobox\n value={serviceSearch}\n onChange={setServiceSearch}\n onSelect={addService}\n options={serviceOptions}\n placeholder={t('agenda.appointment.searchService')}\n onBlurEmpty={() => {}}\n onFocus={() => { if (!serviceSearch && serviceOptions.length === 0) setServiceOptions(initialServiceOptions) }}\n renderRight={(opt) => {\n const dur = (opt.data?.duration_minutes as number) || 0\n const hasPrice = opt.price != null\n if (!hasPrice && !dur) return null\n return (\n <span className=\"text-muted-foreground text-xs whitespace-nowrap\">\n {hasPrice && fmtCurrency(opt.price!, currency.locale, currency.code)}\n {hasPrice && dur > 0 && ' · '}\n {dur > 0 && `${dur}min`}\n </span>\n )\n }}\n minimal\n inlineLabel={services.length > 0 ? t('agenda.appointment.addService') : t('agenda.appointment.addServiceFirst')}\n inlineIcon={services.length > 0 ? 'plus' : 'search'}\n />}\n </div>\n </div>\n )}\n\n {/* Status */}\n {activeType.fields.status && (\n <div className=\"flex items-center gap-3 py-1\">\n <CircleDot className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <StatusSelect value={status} onChange={setStatus} statuses={config.statuses} bookingDate={date} />\n </div>\n )}\n\n {needsCancellationReason && (\n <div className=\"flex items-start gap-3 py-1\">\n <Ban className=\"h-4 w-4 mt-2 text-muted-foreground shrink-0\" />\n <div className=\"flex-1 space-y-2\">\n <select\n value={cancellationReasonId}\n onChange={(event) => setCancellationReasonId(event.target.value)}\n disabled={cancellationReasonsLoading}\n className=\"w-full rounded-input border border-input bg-card px-2.5 py-1.5 text-sm shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] focus:outline-none focus:ring-2 focus:ring-ring\"\n >\n <option value=\"\">{cancellationReasonsLoading ? t('agenda.cancellation.loadingReasons') : t('agenda.cancellation.selectReason')}</option>\n {cancellationReasons.map((reason) => (\n <option key={reason.id} value={reason.id}>\n {reason.label}{reason.requiresNotes ? ' *' : ''}\n </option>\n ))}\n </select>\n <textarea\n value={cancellationNotes}\n onChange={(event) => setCancellationNotes(event.target.value)}\n placeholder={needsCancellationNotes ? t('agenda.cancellation.notesRequired') : t('agenda.cancellation.notesOptional')}\n rows={2}\n className=\"w-full rounded-input border border-input bg-card px-2.5 py-1.5 text-sm resize-none shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n </div>\n )}\n\n {/* Notes — progressive disclosure */}\n {!showNotes ? (\n <div className=\"flex items-center gap-3 py-1\">\n <FileText className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <button type=\"button\" onClick={() => setShowNotes(true)}\n className=\"text-sm text-muted-foreground hover:text-foreground transition-colors text-left py-1.5 pl-2\">\n {t('agenda.appointment.addNotes')}\n </button>\n </div>\n ) : (\n <div className=\"flex items-start gap-3 py-1\">\n <FileText className=\"h-4 w-4 mt-2 text-muted-foreground shrink-0\" />\n <textarea value={notes} onChange={(e) => setNotes(e.target.value)}\n placeholder={t('agenda.appointment.addDescription')} rows={2} autoFocus\n className=\"w-full flex-1 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2.5 py-1.5 text-sm resize-none focus:outline-none focus:ring-2 focus:ring-ring\" />\n </div>\n )}\n\n </>}\n </div>\n\n {/* Appointment footer — inside form for submit */}\n {modalTab === 'appointment' && !clientEditing && (\n <div className=\"px-5 py-2.5 border-t fayz-glass-divider bg-transparent shrink-0 sm:rounded-b-2xl\">\n {confirmingDelete ? (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-destructive font-medium\">{t('agenda.appointment.deleteConfirm')}</span>\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => setConfirmingDelete(false)}>\n {t('agenda.appointment.cancel')}\n </Button>\n <Button type=\"button\" variant=\"destructive\" size=\"sm\" onClick={handleDelete} disabled={deleting}>\n {deleting ? t('agenda.appointment.deleting') : t('agenda.appointment.confirmDelete')}\n </Button>\n </div>\n </div>\n ) : (\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n {mode === 'edit' && (\n <button type=\"button\" onClick={() => setConfirmingDelete(true)} className=\"text-xs text-destructive font-medium hover:underline\">{t('agenda.appointment.delete')}</button>\n )}\n {services.length > 0 && (\n <span className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <Clock className=\"h-3 w-3\" />\n {totalDuration}min\n {config.modules.financial && totalPrice > 0 && mode === 'edit' ? (\n paymentStatusLoading ? (\n <span className=\"h-4 w-16 rounded-full bg-muted animate-pulse\" />\n ) : isPaidBooking ? (\n <button type=\"button\" onClick={(e) => { e.stopPropagation(); setModalTab('financial') }}\n className=\"inline-flex items-center gap-1 rounded-full bg-success/10 px-2 py-0.5 text-[10px] font-medium text-success hover:bg-success/20 transition-colors\">\n <Check className=\"h-2.5 w-2.5\" />\n {fmtCurrency(totalPrice, currency.locale, currency.code)} &middot; {t('agenda.payment.paid')}\n </button>\n ) : date <= new Date().toISOString().slice(0, 10) ? (\n <button type=\"button\" onClick={(e) => { e.stopPropagation(); setModalTab('financial') }}\n className=\"inline-flex items-center gap-1 rounded-full bg-warning/10 px-2 py-0.5 text-[10px] font-medium text-warning hover:bg-warning/20 transition-colors\">\n <HandCoins className=\"h-3 w-3\" />\n {fmtCurrency(totalPrice, currency.locale, currency.code)} &middot; {t('agenda.payment.collect')}\n </button>\n ) : (\n <span>&middot; {fmtCurrency(totalPrice, currency.locale, currency.code)}</span>\n )\n ) : (\n <span>&middot; {fmtCurrency(totalPrice, currency.locale, currency.code)}</span>\n )}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onClose} className=\"hidden sm:inline-flex\">\n {t('agenda.appointment.cancel')}\n </Button>\n <Button type=\"submit\" variant=\"default\" size=\"sm\" disabled={!canSubmit || !isDirty}>\n {saving ? t('agenda.appointment.saving') : mode === 'create' ? t('agenda.appointment.save') : t('agenda.appointment.update')}\n </Button>\n </div>\n </div>\n )}\n </div>\n )}\n </form>\n\n {/* Non-appointment tab footer — outside form */}\n {modalTab !== 'appointment' && !clientEditing && (\n <div className=\"px-5 py-2.5 border-t fayz-glass-divider bg-transparent shrink-0 sm:rounded-b-2xl\">\n <div className=\"flex items-center\">\n <button type=\"button\" onClick={() => { setModalTab('appointment'); setClientEditing(false) }}\n className=\"inline-flex items-center gap-1 text-xs font-medium text-muted-foreground hover:text-foreground transition-colors\">\n <svg className=\"h-3 w-3\" viewBox=\"0 0 16 16\" fill=\"none\"><path d=\"M10 12L6 8l4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>\n {t('agenda.payment.backToAppointment')}\n </button>\n </div>\n </div>\n )}\n </div>\n </ModalContent>\n\n </Modal>\n )\n}\n","import React, { useEffect, useRef, useState, useCallback } from 'react'\nimport { createPortal } from 'react-dom'\n\n// ---------------------------------------------------------------------------\n// Inject animations once\n// ---------------------------------------------------------------------------\n\nconst STYLE_ID = 'saas-floating-panel'\nif (typeof document !== 'undefined' && !document.getElementById(STYLE_ID)) {\n const s = document.createElement('style')\n s.id = STYLE_ID\n s.textContent = `\n @keyframes _fp-dismiss { from { opacity:1; transform:scale(1) } to { opacity:0; transform:scale(.96) } }\n @keyframes _fp-expand { from { opacity:1; transform:scale(1) } to { opacity:0; transform:scale(1.08) } }\n .saas-fp-dismissing { animation: _fp-dismiss 150ms ease-in forwards; pointer-events: none }\n .saas-fp-expanding { animation: _fp-expand 200ms ease-in forwards; pointer-events: none }\n `\n document.head.appendChild(s)\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype Phase = 'visible' | 'dismissing' | 'expanding'\n\nexport interface FloatingPanelRef {\n /** Dismiss with fade-out, then call onClose */\n dismiss: () => void\n /** Expand-out animation (e.g. popover → modal), then call callback */\n expandThen: (callback: () => void) => void\n}\n\ninterface FloatingPanelProps {\n position: { x: number; y: number }\n width: number\n height: number\n /** Offset from cursor (default: { x: 0, y: 0 }) */\n offset?: { x: number; y: number }\n onClose: () => void\n className?: string\n children: (ref: FloatingPanelRef) => React.ReactNode\n zIndex?: number\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function FloatingPanel({\n position, width, height, offset, onClose, className, children, zIndex = 100,\n}: FloatingPanelProps) {\n const ref = useRef<HTMLDivElement>(null)\n const [phase, setPhase] = useState<Phase>('visible')\n const phaseRef = useRef<Phase>('visible')\n phaseRef.current = phase\n const onCloseRef = useRef(onClose)\n onCloseRef.current = onClose\n const expandCallbackRef = useRef<(() => void) | null>(null)\n\n const dismiss = useCallback(() => {\n if (phaseRef.current !== 'visible') return\n setPhase('dismissing')\n setTimeout(() => onCloseRef.current(), 150)\n }, [])\n\n const expandThen = useCallback((callback: () => void) => {\n if (phaseRef.current !== 'visible') return\n expandCallbackRef.current = callback\n setPhase('expanding')\n setTimeout(() => {\n callback()\n onCloseRef.current()\n }, 220)\n }, [])\n\n // Outside click + Escape\n useEffect(() => {\n function handleClick(e: MouseEvent) {\n if (phaseRef.current !== 'visible') return\n if (ref.current && !ref.current.contains(e.target as Node)) {\n // Don't dismiss if clicking another calendar event — let eventClick handle it\n const target = e.target as HTMLElement\n if (target.closest('.fc-event')) return\n dismiss()\n }\n }\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') dismiss()\n }\n document.addEventListener('mousedown', handleClick)\n document.addEventListener('keydown', handleKey)\n return () => {\n document.removeEventListener('mousedown', handleClick)\n document.removeEventListener('keydown', handleKey)\n }\n }, [dismiss])\n\n // Clamp position to viewport\n const ox = offset?.x ?? 0\n const oy = offset?.y ?? 0\n let x = position.x + ox\n let y = position.y + oy\n if (x + width > window.innerWidth - 12) x = x - width - ox * 2\n if (y + height > window.innerHeight - 12) y = y - height - oy * 2\n if (x < 12) x = 12\n if (y < 12) y = 12\n\n const panelRef: FloatingPanelRef = { dismiss, expandThen }\n\n return createPortal(\n <div ref={ref}\n style={{ position: 'fixed', left: x, top: y, zIndex, transition: phase === 'visible' ? 'left 200ms ease-out, top 200ms ease-out' : undefined }}\n className={`fayz-glass-surface rounded-modal border bg-popover shadow-lg overflow-hidden ${\n phase === 'expanding' ? 'saas-fp-expanding'\n : phase === 'dismissing' ? 'saas-fp-dismissing'\n : 'animate-in fade-in zoom-in-95 duration-150'\n } ${className ?? ''}`}>\n {children(panelRef)}\n </div>,\n document.body,\n )\n}\n","import React, { useState, useRef, useEffect } from 'react'\nimport { X, Pencil, Trash2, Clock, MapPin, User, FileText, DollarSign, Check, AlertTriangle, HandCoins } from 'lucide-react'\nimport { PersonLink } from '@fayz-ai/saas'\nimport { FloatingPanel, type FloatingPanelRef } from './FloatingPanel'\nimport { useAgendaConfig, useAgendaStore } from '../AgendaContext'\nimport { useTranslation } from '@fayz-ai/core'\nimport { isStatusAvailable } from '../types'\nimport type { CalendarBooking } from '../types'\n\ninterface Props {\n booking: CalendarBooking\n position: { x: number; y: number }\n onClose: () => void\n onEdit: (id: string) => void\n}\n\nfunction fmtTime(iso: string) {\n return new Date(iso).toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' })\n}\nfunction fmtDate(iso: string) {\n return new Date(iso).toLocaleDateString(undefined, { weekday: 'long', month: 'long', day: 'numeric' })\n}\nfunction fmtCurrency(amount: number, locale: string, code: string) {\n return new Intl.NumberFormat(locale, { style: 'currency', currency: code }).format(amount)\n}\n\n// Inline status select for the popover\nfunction PopoverStatusSelect({ value, statuses, bookingStartsAt, onChange }: {\n value: string; statuses: Array<{ value: string; label: string; color: string; availableWhen?: string }>\n bookingStartsAt: string; onChange: (v: string) => void\n}) {\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLDivElement>(null)\n const current = statuses.find((s) => s.value === value)\n\n useEffect(() => {\n if (!open) return\n const h = (e: MouseEvent) => { if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false) }\n document.addEventListener('mousedown', h)\n return () => document.removeEventListener('mousedown', h)\n }, [open])\n\n return (\n <div ref={ref} className=\"relative inline-block\">\n <button type=\"button\" onClick={() => setOpen((p) => !p)}\n className=\"inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-medium transition-colors hover:opacity-80\"\n style={{ backgroundColor: (current?.color ?? '#6b7280') + '18', color: current?.color ?? '#6b7280' }}>\n <span className=\"h-2 w-2 rounded-full\" style={{ backgroundColor: current?.color }} />\n {current?.label ?? value}\n <svg className=\"h-3 w-3 opacity-50\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </button>\n {open && (\n <div className=\"fayz-glass-surface absolute bottom-full left-0 z-50 mb-1 rounded-lg border bg-popover shadow-lg py-1 animate-in fade-in zoom-in-95 duration-100 min-w-[140px]\">\n {statuses.map((s) => {\n const available = isStatusAvailable(s as any, bookingStartsAt)\n return (\n <button key={s.value} type=\"button\" disabled={!available}\n onClick={() => { if (available) { onChange(s.value); setOpen(false) } }}\n className={`flex w-full items-center gap-2 px-3 py-1.5 text-xs transition-colors ${\n !available ? 'opacity-30 cursor-not-allowed' : s.value === value ? 'bg-muted/30' : 'hover:bg-muted/50'\n }`}>\n <span className=\"h-2 w-2 rounded-full shrink-0\" style={{ backgroundColor: s.color }} />\n <span>{s.label}</span>\n </button>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n\nexport function AppointmentPopover({ booking, position, onClose, onEdit }: Props) {\n const t = useTranslation()\n const config = useAgendaConfig()\n const deleteBooking = useAgendaStore((s) => s.deleteBooking)\n const updateStatus = useAgendaStore((s) => s.updateBookingStatus)\n const openModal = useAgendaStore((s) => s.openAppointmentModal)\n const [confirmingDelete, setConfirmingDelete] = useState(false)\n const [deleting, setDeleting] = useState(false)\n const statusConfig = config.statuses.find((s) => s.value === booking.status)\n const color = statusConfig?.color ?? '#6b7280'\n const timeRange = `${fmtTime(booking.startsAt)}${booking.endsAt ? ' – ' + fmtTime(booking.endsAt) : ''}`\n\n async function handleDelete() {\n setDeleting(true)\n try { await deleteBooking(booking.id); onClose() } catch { setDeleting(false) }\n }\n\n return (\n <>\n <FloatingPanel position={position} width={320} height={340} onClose={onClose}>\n {(panel) => (\n <>\n {/* Action bar */}\n <div className=\"flex items-center justify-end gap-0.5 px-3 pt-3 pb-1\">\n {confirmingDelete ? (\n <>\n <span className=\"text-xs text-destructive font-medium mr-auto pl-1\">{t('agenda.appointment.deleteConfirm')}</span>\n <button onClick={() => setConfirmingDelete(false)}\n className=\"rounded px-2 py-0.5 text-[11px] font-medium hover:bg-muted/50 transition-colors\">{t('agenda.appointment.cancel')}</button>\n <button onClick={handleDelete} disabled={deleting}\n className=\"rounded bg-destructive border border-destructive px-2 py-0.5 text-[11px] font-medium text-destructive-foreground hover:bg-destructive/90 shadow-button-primary active:shadow-button-inset disabled:opacity-40 transition-colors\">{deleting ? t('agenda.appointment.deleting') : t('agenda.appointment.confirmDelete')}</button>\n </>\n ) : (\n <>\n <button onClick={() => panel.expandThen(() => onEdit(booking.id))}\n className=\"p-1.5 rounded-full hover:bg-muted transition-colors\" title={t('common.edit')}>\n <Pencil className=\"h-4 w-4 text-muted-foreground\" />\n </button>\n <button onClick={() => setConfirmingDelete(true)}\n className=\"p-1.5 rounded-full hover:bg-destructive/10 transition-colors\" title={t('common.delete')}>\n <Trash2 className=\"h-4 w-4 text-muted-foreground hover:text-destructive\" />\n </button>\n <button onClick={panel.dismiss} className=\"p-1.5 rounded-full hover:bg-muted transition-colors\">\n <X className=\"h-4 w-4 text-muted-foreground\" />\n </button>\n </>\n )}\n </div>\n\n {/* Content */}\n <div className=\"px-5 pb-5 space-y-3\">\n <div className=\"flex items-start gap-3\">\n <span className=\"mt-1.5 h-3 w-3 rounded shrink-0\" style={{ backgroundColor: color }} />\n <div className=\"min-w-0\">\n {/* Client agendas link to the person; simple events (no client\n capability) render the free-text title as a plain heading —\n booking.clientName carries the event title in that model. */}\n {config.capabilities.client ? (\n <PersonLink personId={booking.clientId} name={booking.clientName ?? 'Unknown'} className=\"text-base\" />\n ) : (\n <p className=\"text-base font-medium truncate\">{booking.clientName || t('agenda.appointment.untitled')}</p>\n )}\n <p className=\"text-sm text-muted-foreground mt-0.5\">{fmtDate(booking.startsAt)} &middot; {timeRange}</p>\n </div>\n </div>\n\n {booking.services && booking.services.length > 0 && (\n <div className=\"flex items-start gap-3\">\n <Clock className=\"h-4 w-4 mt-0.5 text-muted-foreground shrink-0\" />\n <div className=\"text-sm space-y-0.5\">\n {booking.services.map((svc) => (\n <p key={svc.id}>{svc.name} <span className=\"text-muted-foreground\">({svc.durationMinutes}min)</span></p>\n ))}\n </div>\n </div>\n )}\n\n {config.capabilities.professional && booking.professionalName && (\n <div className=\"flex items-center gap-3\">\n <User className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <span className=\"text-sm\">{booking.professionalName}</span>\n </div>\n )}\n\n {booking.locationName && (\n <div className=\"flex items-center gap-3\">\n <MapPin className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <span className=\"text-sm\">{booking.locationName}</span>\n </div>\n )}\n\n {booking.notes && (\n <div className=\"flex items-start gap-3\">\n <FileText className=\"h-4 w-4 mt-0.5 text-muted-foreground shrink-0\" />\n <p className=\"text-sm text-muted-foreground\">{booking.notes}</p>\n </div>\n )}\n\n {booking.orderTotal != null && booking.orderTotal > 0 && (() => {\n const total = fmtCurrency(booking.orderTotal, config.currency.locale, config.currency.code)\n const ps = booking.paymentStatus ?? 'none'\n const hasFinancial = config.modules.financial && booking.orderId\n\n // No financial module — just show total\n if (!hasFinancial) {\n return (\n <div className=\"pt-2 border-t fayz-glass-divider flex items-center justify-between text-sm\">\n <span className=\"text-muted-foreground\">{t('agenda.appointment.total')}</span>\n <span className=\"font-medium\">{total}</span>\n </div>\n )\n }\n\n const badgeConfig: Record<string, { icon: React.ElementType; bg: string; text: string; label: string }> = {\n none: { icon: HandCoins, bg: 'bg-warning/10 hover:bg-warning/15', text: 'text-warning', label: `${total} · ${t('agenda.payment.collect')}` },\n pending: { icon: Clock, bg: 'bg-warning/10 hover:bg-warning/15', text: 'text-warning', label: `${total} · ${t('agenda.payment.pending')}` },\n partial: { icon: DollarSign, bg: 'bg-warning/10 hover:bg-warning/15', text: 'text-warning', label: `${total} · ${t('agenda.payment.partial')}` },\n paid: { icon: Check, bg: 'bg-success/10 hover:bg-success/15', text: 'text-success', label: `${total} · ${t('agenda.payment.paid')}` },\n overdue: { icon: AlertTriangle, bg: 'bg-destructive/10 hover:bg-destructive/15', text: 'text-destructive', label: `${total} · ${t('agenda.payment.overdue')}` },\n cancelled: { icon: X, bg: 'bg-muted hover:bg-muted/80', text: 'text-muted-foreground', label: `${total} · ${t('agenda.payment.cancelled')}` },\n }\n const cfg = badgeConfig[ps] ?? badgeConfig.none\n const StatusIcon = cfg.icon\n\n return (\n <div className=\"pt-2 border-t fayz-glass-divider flex items-center justify-between\">\n <span className=\"text-xs text-muted-foreground\">{t('agenda.appointment.total')}</span>\n <button\n type=\"button\"\n onClick={() => { onClose(); openModal('edit', { bookingId: booking.id, initialTab: 'financial' }) }}\n className={`inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[11px] font-medium transition-colors ${cfg.bg} ${cfg.text}`}\n >\n <StatusIcon className=\"h-3 w-3\" />\n {cfg.label}\n </button>\n </div>\n )\n })()}\n\n {/* Status workflow — hidden for simple events (no status capability). */}\n {config.capabilities.status && (\n <div className=\"pt-2 border-t fayz-glass-divider\">\n <PopoverStatusSelect\n value={booking.status}\n statuses={config.statuses}\n bookingStartsAt={booking.startsAt}\n onChange={(v) => { updateStatus(booking.id, v); onClose() }}\n />\n </div>\n )}\n </div>\n </>\n )}\n </FloatingPanel>\n </>\n )\n}\n","import React, { useRef, useState, useMemo } from 'react'\nimport { createPortal } from 'react-dom'\nimport { Pencil, Trash2, Check } from 'lucide-react'\nimport { FloatingPanel } from './FloatingPanel'\nimport { useAgendaConfig, useAgendaStore } from '../AgendaContext'\nimport { useTranslation } from '@fayz-ai/core'\nimport { isStatusAvailable } from '../types'\nimport type { CalendarBooking } from '../types'\n\n// ---------------------------------------------------------------------------\n// Tooltip — portaled to body\n// ---------------------------------------------------------------------------\n\nfunction Tooltip({ anchor, label }: { anchor: DOMRect; label: string }) {\n return createPortal(\n <div style={{ position: 'fixed', left: anchor.left + anchor.width / 2, top: anchor.bottom + 6, transform: 'translateX(-50%)', zIndex: 120 }}\n className=\"pointer-events-none\">\n <div className=\"rounded-md bg-foreground text-background px-2 py-0.5 text-[11px] font-medium whitespace-nowrap shadow-lg\">\n {label}\n </div>\n </div>,\n document.body,\n )\n}\n\n// ---------------------------------------------------------------------------\n// Status dot with portaled tooltip\n// ---------------------------------------------------------------------------\n\nfunction StatusDot({ color, label, isActive, disabled, onClick }: {\n color: string; label: string; isActive: boolean; disabled?: boolean; onClick: () => void\n}) {\n const [hover, setHover] = useState(false)\n const btnRef = useRef<HTMLButtonElement>(null)\n const [rect, setRect] = useState<DOMRect | null>(null)\n\n return (\n <>\n <button ref={btnRef} type=\"button\" onClick={disabled ? undefined : onClick} disabled={disabled}\n onMouseEnter={() => { setHover(true); if (btnRef.current) setRect(btnRef.current.getBoundingClientRect()) }}\n onMouseLeave={() => setHover(false)}\n className={`flex h-7 w-7 items-center justify-center rounded-full transition-all ${\n disabled ? 'opacity-25 cursor-not-allowed' : isActive ? 'ring-2 ring-offset-2 ring-offset-popover' : 'hover:scale-110'\n }`}\n style={{ backgroundColor: color, ['--tw-ring-color' as any]: isActive ? color : undefined }}>\n {isActive && <Check className=\"h-3.5 w-3.5 text-white\" strokeWidth={2.5} />}\n </button>\n {hover && rect && <Tooltip anchor={rect} label={label} />}\n </>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Context Menu\n// ---------------------------------------------------------------------------\n\ninterface Props {\n booking: CalendarBooking\n position: { x: number; y: number }\n onClose: () => void\n onEdit: (id: string) => void\n}\n\nexport function EventContextMenu({ booking, position, onClose, onEdit }: Props) {\n const t = useTranslation()\n const config = useAgendaConfig()\n const updateStatus = useAgendaStore((s) => s.updateBookingStatus)\n const deleteBooking = useAgendaStore((s) => s.deleteBooking)\n const [confirming, setConfirming] = useState(false)\n const [deleting, setDeleting] = useState(false)\n\n async function handleDelete() {\n setDeleting(true)\n try { await deleteBooking(booking.id); onClose() } catch { setDeleting(false) }\n }\n\n return (\n <FloatingPanel position={position} width={230} height={180} offset={{ x: 4, y: 4 }} onClose={onClose} zIndex={110}>\n {(panel) => (\n <>\n <div className=\"py-1\">\n <button onClick={() => panel.expandThen(() => onEdit(booking.id))}\n className=\"flex w-full items-center gap-3 px-4 py-2 text-sm hover:bg-muted/50 transition-colors\">\n <Pencil className=\"h-4 w-4 text-muted-foreground\" /> {t('agenda.contextMenu.edit')}\n </button>\n {confirming ? (\n <div className=\"flex items-center justify-between px-4 py-2\">\n <span className=\"text-xs text-destructive font-medium\">{t('agenda.appointment.deleteConfirm')}</span>\n <div className=\"flex items-center gap-1.5\">\n <button onClick={() => setConfirming(false)}\n className=\"rounded px-2 py-0.5 text-[11px] font-medium hover:bg-muted/50 transition-colors\">{t('agenda.appointment.cancel')}</button>\n <button onClick={handleDelete} disabled={deleting}\n className=\"rounded bg-destructive border border-destructive px-2 py-0.5 text-[11px] font-medium text-destructive-foreground hover:bg-destructive/90 shadow-button-primary active:shadow-button-inset disabled:opacity-40 transition-colors\">{deleting ? t('agenda.appointment.deleting') : t('agenda.appointment.confirmDelete')}</button>\n </div>\n </div>\n ) : (\n <button onClick={() => setConfirming(true)}\n className=\"flex w-full items-center gap-3 px-4 py-2 text-sm hover:bg-muted/50 transition-colors text-destructive\">\n <Trash2 className=\"h-4 w-4\" /> {t('agenda.contextMenu.delete')}\n </button>\n )}\n </div>\n\n {/* Status workflow — hidden for simple events (no status capability). */}\n {config.capabilities.status && (\n <div className=\"border-t px-4 py-3\">\n <p className=\"text-[11px] font-medium text-muted-foreground mb-2\">{t('agenda.contextMenu.changeStatus')}</p>\n <div className=\"flex items-center gap-1.5\">\n {config.statuses.map((s) => {\n const available = isStatusAvailable(s, booking.startsAt)\n return (\n <StatusDot key={s.value} color={s.color} label={available ? s.label : `${s.label} ${t('agenda.contextMenu.notAvailable')}`}\n isActive={booking.status === s.value}\n disabled={!available}\n onClick={() => { if (available) { updateStatus(booking.id, s.value); panel.dismiss() } }} />\n )\n })}\n </div>\n </div>\n )}\n </>\n )}\n </FloatingPanel>\n )\n}\n","import React, { useMemo } from 'react'\nimport { formatCurrency, useTranslation, getCurrentLocale } from '@fayz-ai/core'\nimport type { CalendarBooking } from '../types'\n\n// ---------------------------------------------------------------------------\n// Mobile agenda list — a thumb-friendly, date-grouped list of upcoming items.\n// Rendered on <md viewports instead of the FullCalendar grid. Each row shows a\n// category/status dot, the title, the time, and (for finance-style events) the\n// amount. Fed straight from the store bookings so it works for any seeded app.\n// ---------------------------------------------------------------------------\n\nfunction startOfDay(d: Date): Date {\n const x = new Date(d)\n x.setHours(0, 0, 0, 0)\n return x\n}\n\nfunction timeLabel(iso: string): string {\n const d = new Date(iso)\n return `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`\n}\n\nexport interface AgendaMobileListProps {\n bookings: CalendarBooking[]\n statusColors: Record<string, string>\n currencyCode: string\n onSelect: (booking: CalendarBooking) => void\n}\n\nexport function AgendaMobileList({ bookings, statusColors, currencyCode, onSelect }: AgendaMobileListProps) {\n const t = useTranslation()\n const locale = getCurrentLocale() === 'pt-BR' ? 'pt-BR' : 'en'\n\n const groups = useMemo(() => {\n const todayStart = startOfDay(new Date()).getTime()\n const sorted = bookings\n .filter((b) => !!b.startsAt)\n .slice()\n .sort((a, b) => (a.startsAt < b.startsAt ? -1 : a.startsAt > b.startsAt ? 1 : 0))\n const map = new Map<string, CalendarBooking[]>()\n for (const b of sorted) {\n const day = startOfDay(new Date(b.startsAt))\n if (day.getTime() < todayStart) continue // upcoming only\n const key = day.toISOString().slice(0, 10)\n const list = map.get(key) ?? []\n list.push(b)\n map.set(key, list)\n }\n return Array.from(map.entries()).map(([key, items]) => ({ key, date: new Date(key + 'T00:00:00'), items }))\n }, [bookings])\n\n function dayLabel(date: Date): string {\n const today = startOfDay(new Date())\n const diff = Math.round((startOfDay(date).getTime() - today.getTime()) / 86400000)\n if (diff === 0) return t('agenda.list.today')\n if (diff === 1) return t('agenda.list.tomorrow')\n return date.toLocaleDateString(locale, { weekday: 'long', day: 'numeric', month: 'long' })\n }\n\n if (groups.length === 0) {\n return (\n <div className=\"flex-1 flex flex-col items-center justify-center px-6 py-16 text-center text-muted-foreground\">\n <p className=\"text-sm\">{t('agenda.list.empty')}</p>\n </div>\n )\n }\n\n return (\n <div className=\"flex-1 overflow-y-auto px-3 py-3 space-y-5\">\n {groups.map((g) => (\n <div key={g.key}>\n <h3 className=\"px-1 pb-1.5 text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {dayLabel(g.date)}\n </h3>\n <div className=\"space-y-1.5\">\n {g.items.map((b) => {\n const color = statusColors[b.status] ?? '#6b7280'\n const hasAmount = typeof b.orderTotal === 'number' && b.orderTotal > 0\n return (\n <button\n key={b.id}\n onClick={() => onSelect(b)}\n className=\"flex w-full items-center gap-3 rounded-lg border bg-card px-3 py-2.5 text-left shadow-sm transition-colors active:bg-muted/50\"\n >\n <span className=\"h-2.5 w-2.5 shrink-0 rounded-full\" style={{ backgroundColor: color }} />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-foreground\">{b.clientName ?? '—'}</p>\n <p className=\"text-xs text-muted-foreground\">{timeLabel(b.startsAt)}</p>\n </div>\n {hasAmount && (\n <span className=\"shrink-0 text-sm font-semibold tabular-nums text-foreground\">\n {formatCurrency(b.orderTotal, currencyCode)}\n </span>\n )}\n </button>\n )\n })}\n </div>\n </div>\n ))}\n </div>\n )\n}\n","import React, { useRef, useEffect, useCallback, useMemo, useState } from 'react'\nimport { injectCalendarStyles } from '../calendar-styles'\nimport FullCalendar from '@fullcalendar/react'\nimport dayGridPlugin from '@fullcalendar/daygrid'\nimport timeGridPlugin from '@fullcalendar/timegrid'\nimport resourceTimeGridPlugin from '@fullcalendar/resource-timegrid'\nimport interactionPlugin from '@fullcalendar/interaction'\nimport listPlugin from '@fullcalendar/list'\nimport ptBrLocale from '@fullcalendar/core/locales/pt-br'\nimport type { EventInput, EventClickArg, DateSelectArg, EventDropArg } from '@fullcalendar/core'\nimport { ChevronLeft, ChevronRight, Plus, ChevronDown, Settings } from 'lucide-react'\nimport { usePluginPrefs } from '@fayz-ai/saas'\nimport { getCurrentLocale } from '@fayz-ai/core'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useAgendaConfig, useAgendaStore } from '../AgendaContext'\nimport { useAgendaSettings } from '../hooks/useAgendaSettings'\nimport { MiniCalendar } from '../components/MiniCalendar'\nimport { AppointmentModal } from '../components/AppointmentModal'\nimport { AppointmentPopover } from '../components/AppointmentPopover'\nimport { PersonLink } from '@fayz-ai/saas'\nimport { EventContextMenu } from '../components/EventContextMenu'\nimport { AgendaMobileList } from '../components/AgendaMobileList'\nimport { ConfirmDialog } from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport type { CalendarBooking, Schedule } from '../types'\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction bookingToEvent(booking: CalendarBooking, statusColors: Record<string, string>): EventInput {\n const color = statusColors[booking.status] ?? '#6b7280'\n const serviceNames = booking.services?.map((s) => s.name).join(', ') ?? ''\n return {\n id: booking.id,\n resourceId: booking.professionalId ?? undefined,\n title: booking.clientName ?? 'Unknown',\n start: booking.startsAt,\n end: booking.endsAt ?? undefined,\n backgroundColor: color + '30',\n borderColor: color,\n textColor: color,\n extendedProps: { booking, serviceNames },\n }\n}\n\n/**\n * Generate FullCalendar background events showing unavailable time.\n * For each day, creates background blocks for the gaps OUTSIDE working hours\n * within the visible business hours window. This grays out non-working time.\n */\nfunction generateAvailabilityEvents(\n schedules: Schedule[],\n professionals: { id: string }[],\n dateRange: { start: string; end: string } | null,\n businessHours?: { startTime: string; endTime: string },\n locationMap?: Map<string, string>,\n): EventInput[] {\n if (!dateRange || schedules.length === 0) return []\n\n const bgEvents: EventInput[] = []\n const startDate = new Date(dateRange.start)\n const endDate = new Date(dateRange.end)\n const bizStart = businessHours?.startTime ?? '08:00'\n const bizEnd = businessHours?.endTime ?? '20:00'\n\n // Group schedules by assignee\n const byAssignee = new Map<string, Schedule[]>()\n for (const s of schedules) {\n const aid = s.assigneeId\n if (!aid) continue\n const list = byAssignee.get(aid) ?? []\n list.push(s)\n byAssignee.set(aid, list)\n }\n\n function timeToMinutes(t: string): number {\n const [h, m] = t.split(':').map(Number)\n return h * 60 + m\n }\n\n function minutesToTime(m: number): string {\n return `${String(Math.floor(m / 60)).padStart(2, '0')}:${String(m % 60).padStart(2, '0')}`\n }\n\n const bizStartMin = timeToMinutes(bizStart)\n const bizEndMin = timeToMinutes(bizEnd)\n\n for (const prof of professionals) {\n const profSchedules = byAssignee.get(prof.id) ?? []\n\n // Separate weekly and date-specific schedules\n const weekly = profSchedules.filter((s) => s.dayOfWeek != null && !s.specificDate)\n const exceptions = profSchedules.filter((s) => s.specificDate != null)\n const exceptionDates = new Set(exceptions.map((s) => s.specificDate!))\n\n const current = new Date(startDate)\n while (current < endDate) {\n const dateStr = current.toISOString().slice(0, 10)\n const dayOfWeek = current.getDay()\n\n // Get working periods for this day\n let daySchedules: Schedule[]\n if (exceptionDates.has(dateStr)) {\n daySchedules = exceptions.filter((s) => s.specificDate === dateStr && s.isActive)\n } else {\n daySchedules = weekly.filter((s) => s.dayOfWeek === dayOfWeek && s.isActive)\n }\n\n // Convert working periods to sorted minute ranges, preserving locationId\n const workRanges = daySchedules\n .map((s) => {\n const locId = s.locationId ?? (s.metadata?.locationId as string | undefined)\n return {\n start: timeToMinutes(s.startsAt),\n end: timeToMinutes(s.endsAt),\n locationName: locId && locationMap ? locationMap.get(locId) : undefined,\n }\n })\n .sort((a, b) => a.start - b.start)\n\n // Compute unavailable gaps within business hours\n let cursor = bizStartMin\n for (const range of workRanges) {\n const availStart = Math.max(range.start, bizStartMin)\n const availEnd = Math.min(range.end, bizEndMin)\n\n // Gap before this working range = unavailable\n if (cursor < availStart) {\n bgEvents.push({\n resourceId: prof.id,\n start: dateStr + 'T' + minutesToTime(cursor) + ':00',\n end: dateStr + 'T' + minutesToTime(availStart) + ':00',\n display: 'background',\n classNames: ['fc-unavailable-bg'],\n })\n }\n\n // Location label on available range\n if (availStart < availEnd && range.locationName) {\n bgEvents.push({\n id: `loc-${prof.id}-${dateStr}-${minutesToTime(availStart)}`,\n resourceId: prof.id,\n start: dateStr + 'T' + minutesToTime(availStart) + ':00',\n end: dateStr + 'T' + minutesToTime(availStart + 20) + ':00',\n title: range.locationName,\n display: 'auto',\n editable: false,\n backgroundColor: 'transparent',\n borderColor: 'transparent',\n textColor: '#a3a3a3',\n classNames: ['fc-location-label'],\n extendedProps: { isLocationLabel: true },\n })\n }\n\n cursor = Math.max(cursor, availEnd)\n }\n\n // Gap after last working range = unavailable\n if (cursor < bizEndMin) {\n bgEvents.push({\n resourceId: prof.id,\n start: dateStr + 'T' + minutesToTime(cursor) + ':00',\n end: dateStr + 'T' + minutesToTime(bizEndMin) + ':00',\n display: 'background',\n classNames: ['fc-unavailable-bg'],\n })\n }\n\n\n current.setDate(current.getDate() + 1)\n }\n }\n\n return bgEvents\n}\n\n// ---------------------------------------------------------------------------\n// Loading skeleton — mimics the resource-timegrid-week layout\n// ---------------------------------------------------------------------------\n\nfunction CalendarSkeleton({ profCount = 2 }: { profCount?: number }) {\n const days = ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT']\n const hours = ['07:00', '08:00', '09:00', '10:00', '11:00', '12:00', '13:00', '14:00', '15:00', '16:00', '17:00', '18:00', '19:00', '20:00']\n\n return (\n <div className=\"flex-1 overflow-hidden animate-pulse\">\n <div className=\"flex border-b\" style={{ paddingLeft: 56 }}>\n {Array.from({ length: profCount }).map((_, pi) => (\n <div key={pi} className=\"flex-1 border-r last:border-r-0 py-2 px-3\">\n <div className=\"flex items-center justify-center gap-2\">\n <div className=\"h-6 w-6 rounded-full bg-muted\" />\n <div className=\"h-3 w-20 rounded bg-muted\" />\n </div>\n </div>\n ))}\n </div>\n <div className=\"flex border-b\" style={{ paddingLeft: 56 }}>\n {Array.from({ length: profCount }).map((_, pi) => (\n <div key={pi} className=\"flex-1 flex border-r last:border-r-0\">\n {days.map((d) => (\n <div key={d} className=\"flex-1 py-1.5 text-center\">\n <span className=\"text-[10px] text-muted-foreground/40\">{d}</span>\n </div>\n ))}\n </div>\n ))}\n </div>\n <div className=\"relative\">\n {hours.map((h) => (\n <div key={h} className=\"flex border-b border-border/30\" style={{ height: 50 }}>\n <div className=\"w-14 shrink-0 pr-2 text-right\">\n <span className=\"text-[10px] text-muted-foreground/30\">{h}</span>\n </div>\n <div className=\"flex-1 flex\">\n {Array.from({ length: profCount * 7 }).map((_, ci) => (\n <div key={ci} className={`flex-1 border-r border-border/20 ${Math.floor(ci / 7) % 2 === 1 ? 'bg-muted/20' : ''}`} />\n ))}\n </div>\n </div>\n ))}\n </div>\n </div>\n )\n}\n\n// Resource views — one column per professional. Used when the app has staff.\nconst RESOURCE_VIEW_OPTIONS = [\n { key: 'resourceTimeGridDay', labelKey: 'agenda.calendar.viewDay' },\n { key: 'resourceTimeGridWeek', labelKey: 'agenda.calendar.viewWeek' },\n { key: 'dayGridMonth', labelKey: 'agenda.calendar.viewMonth' },\n] as const\n\n// Non-resource variants — used when there are no professionals/resources (e.g. a\n// personal-finance agenda). A resource timegrid renders an EMPTY grid with zero\n// resource columns and drops events that have no resourceId, so those apps fall\n// back to a plain month/day/week calendar.\nconst PLAIN_VIEW_OPTIONS = [\n { key: 'timeGridDay', labelKey: 'agenda.calendar.viewDay' },\n { key: 'timeGridWeek', labelKey: 'agenda.calendar.viewWeek' },\n { key: 'dayGridMonth', labelKey: 'agenda.calendar.viewMonth' },\n { key: 'listMonth', labelKey: 'agenda.calendar.viewList' },\n] as const\n\n// Sentinel view key for the thumb-friendly mobile agenda list (AgendaMobileList),\n// which is NOT a FullCalendar view. Selected by default on <md so B2C opens on the\n// list; picking any grid option (Dia/Semana/Mês) mounts the real calendar instead.\nconst MOBILE_LIST_VIEW = '__mobileList__'\n\n/** Collapse a resource view to a plain month calendar when there are no resources. */\nfunction viewForNoResources(view: string): string {\n return view.startsWith('resource') ? 'dayGridMonth' : view\n}\n\n/** Promote a plain timegrid to its resource variant when the app has resources. */\nfunction viewForResources(view: string): string {\n if (view === 'timeGridWeek') return 'resourceTimeGridWeek'\n if (view === 'timeGridDay') return 'resourceTimeGridDay'\n return view\n}\n\n/** Small viewport (<md) → render the thumb-friendly agenda list instead of the grid. */\nfunction useIsMobile(): boolean {\n const [isMobile, setIsMobile] = useState(() =>\n typeof window !== 'undefined' && window.matchMedia('(max-width: 767px)').matches)\n useEffect(() => {\n if (typeof window === 'undefined') return\n const mq = window.matchMedia('(max-width: 767px)')\n const onChange = () => setIsMobile(mq.matches)\n mq.addEventListener('change', onChange)\n return () => mq.removeEventListener('change', onChange)\n }, [])\n return isMobile\n}\n\n// ---------------------------------------------------------------------------\n// Calendar View\n// ---------------------------------------------------------------------------\n\nexport function CalendarView() {\n injectCalendarStyles()\n const config = useAgendaConfig()\n const t = useTranslation()\n const currentLocale = getCurrentLocale()\n const fcLocale = currentLocale === 'pt-BR' ? ptBrLocale : undefined\n const calendarRef = useRef<FullCalendar>(null)\n const prefs = usePluginPrefs('agenda', { calendarView: config.defaultCalendarView ?? 'resourceTimeGridWeek' })\n const agendaSettings = useAgendaSettings()\n const effectiveBusinessHours = {\n startTime: agendaSettings.startTime,\n endTime: agendaSettings.endTime,\n }\n\n const bookings = useAgendaStore((s) => s.bookings)\n const bookingsLoading = useAgendaStore((s) => s.bookingsLoading)\n const professionals = useAgendaStore((s) => s.professionals)\n const professionalsLoading = useAgendaStore((s) => s.professionalsLoading)\n const currentView = useAgendaStore((s) => s.currentView)\n const selectedProfIds = useAgendaStore((s) => s.selectedProfessionalIds)\n const selectedStatuses = useAgendaStore((s) => s.selectedStatuses)\n const schedules = useAgendaStore((s) => s.schedules)\n const fetchBookings = useAgendaStore((s) => s.fetchBookings)\n const fetchProfessionals = useAgendaStore((s) => s.fetchProfessionals)\n const fetchLocations = useAgendaStore((s) => s.fetchLocations)\n const storeLocations = useAgendaStore((s) => s.locations)\n const fetchSchedules = useAgendaStore((s) => s.fetchSchedules)\n const rescheduleBooking = useAgendaStore((s) => s.rescheduleBooking)\n const setView = useAgendaStore((s) => s.setView)\n const setFilters = useAgendaStore((s) => s.setFilters)\n const _openModal = useAgendaStore((s) => s.openAppointmentModal)\n const closeModal = useAgendaStore((s) => s.closeAppointmentModal)\n const modalState = useAgendaStore((s) => s.appointmentModal)\n\n // Resource-capable = the app has professionals/staff. When it doesn't (e.g. a\n // personal-finance agenda), resource views render empty, so we force plain\n // (non-resource) views and default to a month calendar.\n const isMobile = useIsMobile()\n const resourceCapable = professionals.length > 0\n const viewOptions = resourceCapable ? RESOURCE_VIEW_OPTIONS : PLAIN_VIEW_OPTIONS\n\n // Mobile (<md) has its own view selection, independent of the desktop pref: it\n // defaults to the thumb-friendly list and lets the user switch to any grid view\n // (Dia/Semana/Mês) without changing the desktop's stored calendarView. The list\n // sentinel replaces FullCalendar's own listMonth so mobile always gets the rich\n // AgendaMobileList, and a list option is offered even for resource apps.\n const [mobileView, setMobileView] = useState<string>(MOBILE_LIST_VIEW)\n const mobileViewOptions = useMemo(\n () => [\n ...viewOptions.filter((o) => o.key !== 'listMonth'),\n { key: MOBILE_LIST_VIEW, labelKey: 'agenda.calendar.viewList' },\n ],\n [viewOptions],\n )\n const mobileGridActive = isMobile && mobileView !== MOBILE_LIST_VIEW\n\n const [selectedBooking, setSelectedBooking] = useState<CalendarBooking | null>(null)\n const [popoverAnchor, setPopoverAnchor] = useState<{ x: number; y: number } | null>(null)\n const [popoverVisible, _setPopoverVisible] = useState(false)\n const popoverVisibleRef = useRef(false)\n const setPopoverVisible = useCallback((v: boolean) => { popoverVisibleRef.current = v; _setPopoverVisible(v) }, [])\n const [contextMenu, setContextMenu] = useState<{ booking: CalendarBooking; x: number; y: number } | null>(null)\n const [contextMenuVisible, _setContextMenuVisible] = useState(false)\n const contextMenuVisibleRef = useRef(false)\n const setContextMenuVisible = useCallback((v: boolean) => { contextMenuVisibleRef.current = v; _setContextMenuVisible(v) }, [])\n const [scheduleConfirm, setScheduleConfirm] = useState<{ onConfirm: () => void } | null>(null)\n const [calendarTitle, setCalendarTitle] = useState('')\n const [selectedDate, setSelectedDate] = useState(new Date())\n const [profSectionOpen, setProfSectionOpen] = useState(true)\n const [statusSectionOpen, setStatusSectionOpen] = useState(false)\n const [visibleRange, setVisibleRange] = useState<{ start: string; end: string } | null>(null)\n\n // Wrap openModal to always dismiss popover/context menu first\n const openModal: typeof _openModal = useCallback((...args) => {\n setPopoverVisible(false); setSelectedBooking(null); setPopoverAnchor(null)\n setContextMenuVisible(false); setContextMenu(null)\n _openModal(...args)\n }, [_openModal])\n\n const statusColors = useMemo(() => {\n const map: Record<string, string> = {}\n for (const s of config.statuses) map[s.value] = s.color\n return map\n }, [config.statuses])\n\n useEffect(() => {\n fetchProfessionals(); fetchSchedules()\n if (config.modules.locationSelection) fetchLocations()\n }, [])\n\n // Keep the view consistent with resource-capability, in case a stale/shared\n // pref selected the wrong variant. No resources → a resource view is an empty\n // grid that drops the seeded events; resources → a plain timegrid loses the\n // per-professional columns.\n useEffect(() => {\n const api = calendarRef.current?.getApi()\n if (!api) return\n if (!resourceCapable && currentView.startsWith('resource')) {\n api.changeView('dayGridMonth')\n } else if (resourceCapable && (currentView === 'timeGridWeek' || currentView === 'timeGridDay')) {\n api.changeView(viewForResources(currentView))\n }\n }, [resourceCapable, currentView])\n\n // Mobile renders the agenda list (no FullCalendar), so the grid's datesSet —\n // which normally drives fetchBookings — never fires. Fetch a wide upcoming\n // window directly so the list has data.\n useEffect(() => {\n if (!isMobile) return\n const start = new Date(); start.setHours(0, 0, 0, 0); start.setDate(start.getDate() - 1)\n const end = new Date(start); end.setDate(end.getDate() + 91)\n fetchBookings({ start: start.toISOString(), end: end.toISOString() })\n }, [isMobile, fetchBookings])\n\n const resources = useMemo(() => {\n const filtered = selectedProfIds.length > 0\n ? professionals.filter((p) => selectedProfIds.includes(p.id))\n : professionals\n return filtered.map((p) => ({\n id: p.id, title: p.name,\n extendedProps: { avatarUrl: p.avatarUrl, locationName: p.locationName },\n }))\n }, [professionals, selectedProfIds])\n\n const bookingEvents = useMemo(() =>\n bookings.map((b) => bookingToEvent(b, statusColors)), [bookings, statusColors])\n\n // Merge static config locations with dynamically fetched locations\n const allLocations = useMemo(() => {\n const map = new Map<string, string>()\n for (const loc of config.locations) map.set(loc.id, loc.name)\n for (const loc of storeLocations) map.set(loc.id, loc.name)\n return map\n }, [config.locations, storeLocations])\n\n const locationMap = useMemo(() => {\n if (!config.modules.locationSelection || allLocations.size === 0) return undefined\n return allLocations\n }, [config.modules.locationSelection, allLocations])\n\n const availabilityEvents = useMemo(() =>\n generateAvailabilityEvents(schedules, professionals, visibleRange, effectiveBusinessHours, locationMap),\n [schedules, professionals, visibleRange, effectiveBusinessHours, locationMap])\n\n const events = useMemo(() =>\n [...bookingEvents, ...availabilityEvents], [bookingEvents, availabilityEvents])\n\n const storedView = prefs.get('calendarView')\n const effectiveInitialView = resourceCapable ? viewForResources(storedView) : viewForNoResources(storedView)\n\n // ── Calendar handlers ──\n const handleDatesSet = useCallback((arg: { startStr: string; endStr: string; view: { title: string; type: string } }) => {\n setCalendarTitle(arg.view.title)\n setView(arg.view.type)\n setVisibleRange({ start: arg.startStr, end: arg.endStr })\n fetchBookings({ start: arg.startStr, end: arg.endStr })\n }, [fetchBookings, setView])\n\n // Double-click → open edit directly\n // Right-click → context menu\n const handleEventDidMount = useCallback((arg: { event: any; el: HTMLElement }) => {\n const booking = arg.event.extendedProps?.booking as CalendarBooking | undefined\n if (booking) arg.el.setAttribute('data-booking-id', booking.id)\n arg.el.addEventListener('dblclick', (e) => {\n e.preventDefault()\n e.stopPropagation()\n skipClickRef.current = true\n const booking = arg.event.extendedProps.booking as CalendarBooking\n setSelectedBooking(null)\n setPopoverAnchor(null)\n setContextMenu(null)\n openModal('edit', { bookingId: booking.id })\n })\n arg.el.addEventListener('contextmenu', (e) => {\n e.preventDefault()\n const booking = arg.event.extendedProps.booking as CalendarBooking\n const menuW = 210, menuH = 200\n let x = e.clientX + 4\n let y = e.clientY + 4\n if (x + menuW > window.innerWidth - 12) x = x - menuW\n if (y + menuH > window.innerHeight - 12) y = y - menuH\n setContextMenu({ booking, x, y })\n setContextMenuVisible(true)\n setSelectedBooking(null)\n setPopoverAnchor(null)\n })\n }, [])\n\n // Flag to suppress single-click after a double-click\n const skipClickRef = useRef(false)\n\n // Hover timer — show popover after 4s hover on a booking event\n const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const handleEventMouseEnter = useCallback((arg: { event: any; el: HTMLElement }) => {\n if (arg.event.display === 'background') return\n if (arg.event.extendedProps?.isLocationLabel) return\n const booking = arg.event.extendedProps.booking as CalendarBooking\n if (!booking) return\n\n hoverTimerRef.current = setTimeout(() => {\n const rect = arg.el.getBoundingClientRect()\n const popW = 320, popH = 340\n let x = rect.right + 8\n let y = rect.top + rect.height / 2 - popH / 2\n if (x + popW > window.innerWidth - 16) x = rect.left - popW - 8\n if (x < 16) x = Math.max(16, rect.left + rect.width / 2 - popW / 2)\n if (y + popH > window.innerHeight - 16) y = window.innerHeight - popH - 16\n if (y < 16) y = 16\n setSelectedBooking(booking)\n setPopoverAnchor({ x, y })\n setPopoverVisible(true)\n }, 3000)\n }, [])\n\n const handleEventMouseLeave = useCallback(() => {\n if (hoverTimerRef.current) {\n clearTimeout(hoverTimerRef.current)\n hoverTimerRef.current = null\n }\n }, [])\n\n // Single click — open popover instantly, or slide to new position if already open\n const handleEventClick = useCallback((arg: EventClickArg) => {\n if (skipClickRef.current) { skipClickRef.current = false; return }\n // Ignore clicks on background availability events and location labels\n if (arg.event.display === 'background') return\n if (arg.event.extendedProps?.isLocationLabel) return\n setContextMenu(null); setContextMenuVisible(false)\n const booking = arg.event.extendedProps.booking as CalendarBooking\n if (!booking) return\n const rect = arg.el.getBoundingClientRect()\n const popW = 320, popH = 340\n let x = rect.right + 8\n let y = rect.top + rect.height / 2 - popH / 2\n if (x + popW > window.innerWidth - 16) x = rect.left - popW - 8\n if (x < 16) x = Math.max(16, rect.left + rect.width / 2 - popW / 2)\n if (y + popH > window.innerHeight - 16) y = window.innerHeight - popH - 16\n if (y < 16) y = 16\n // Always update — if popover is already open it slides to the new position\n setSelectedBooking(booking)\n setPopoverAnchor({ x, y })\n setPopoverVisible(true)\n }, [])\n\n // Find the schedule block covering a given time slot for a professional\n const findScheduleForSlot = useCallback((professionalId: string | undefined, dateTimeStr: string): Schedule | null => {\n if (!professionalId) return null\n const dt = new Date(dateTimeStr)\n const dateStr = dt.toISOString().slice(0, 10)\n const dayOfWeek = dt.getDay()\n const timeMin = dt.getHours() * 60 + dt.getMinutes()\n\n const profSchedules = schedules.filter((s) => s.assigneeId === professionalId)\n const exceptions = profSchedules.filter((s) => s.specificDate === dateStr && s.isActive)\n const weekly = profSchedules.filter((s) => s.dayOfWeek === dayOfWeek && s.isActive && !s.specificDate)\n const daySchedules = exceptions.length > 0 ? exceptions : weekly\n\n for (const s of daySchedules) {\n const [sh, sm] = s.startsAt.split(':').map(Number)\n const [eh, em] = s.endsAt.split(':').map(Number)\n if (timeMin >= sh * 60 + sm && timeMin < eh * 60 + em) return s\n }\n return null\n }, [schedules])\n\n const handleSelect = useCallback((arg: DateSelectArg) => {\n calendarRef.current?.getApi().unselect()\n\n // Don't open create if popover/context menu is showing — dismiss them instead\n if (popoverVisibleRef.current || contextMenuVisibleRef.current) {\n setPopoverVisible(false); setSelectedBooking(null); setPopoverAnchor(null)\n setContextMenuVisible(false); setContextMenu(null)\n return\n }\n\n const professionalId = arg.resource?.id\n const schedule = findScheduleForSlot(professionalId, arg.startStr)\n\n const proceed = () => {\n const locId = schedule?.locationId ?? (schedule?.metadata?.locationId as string | undefined)\n openModal('create', { prefill: { startsAt: arg.startStr, endsAt: arg.endStr, professionalId, locationId: locId || undefined } })\n }\n\n // Warn if no schedule covers this slot — only when the working-hours module\n // is on (off by default in eventMode:'simple', so simple/Google-Calendar\n // events never surface the \"no open schedule for this professional\" dialog).\n if (config.modules.workingHours && !schedule) {\n setScheduleConfirm({ onConfirm: proceed })\n return\n }\n\n proceed()\n }, [openModal, findScheduleForSlot, config.modules.workingHours])\n\n const handleEventDrop = useCallback(async (arg: EventDropArg) => {\n const booking = arg.event.extendedProps.booking as CalendarBooking\n try { await rescheduleBooking(booking.id, arg.event.startStr, arg.event.endStr, arg.newResource?.id ?? undefined) }\n catch { arg.revert() }\n }, [rescheduleBooking])\n\n const handleViewChange = useCallback((v: string) => {\n calendarRef.current?.getApi().changeView(v)\n prefs.set('calendarView', v)\n }, [prefs])\n // Mobile switcher: swap between the list sentinel and a real grid view. When a\n // grid is picked we also sync the store's currentView so the resource-collapse\n // effect doesn't fight the freshly-mounted mobile calendar; if it's already\n // mounted (grid → grid), changeView animates in place.\n const handleMobileViewChange = useCallback((v: string) => {\n setMobileView(v)\n if (v === MOBILE_LIST_VIEW) return\n setView(v)\n calendarRef.current?.getApi()?.changeView(v)\n }, [setView])\n const handlePrev = useCallback(() => calendarRef.current?.getApi().prev(), [])\n const handleNext = useCallback(() => calendarRef.current?.getApi().next(), [])\n const handleToday = useCallback(() => { calendarRef.current?.getApi().today(); setSelectedDate(new Date()) }, [])\n\n function handleMiniDateSelect(date: Date) {\n setSelectedDate(date)\n calendarRef.current?.getApi().gotoDate(date)\n }\n\n function toggleProfessional(id: string) {\n const next = selectedProfIds.includes(id)\n ? selectedProfIds.filter((p) => p !== id)\n : [...selectedProfIds, id]\n setFilters({ professionalIds: next })\n }\n\n function toggleStatus(value: string) {\n const next = selectedStatuses.includes(value)\n ? selectedStatuses.filter((s) => s !== value)\n : [...selectedStatuses, value]\n setFilters({ statuses: next })\n }\n\n // Alternating resource backgrounds — apply via DOM after render\n const wrapperRef = useRef<HTMLDivElement>(null)\n\n // Responsive day headers — collapse weekday names to a single initial (S M T\n // W T F S, Google-Calendar style) when day columns get too narrow. Measured\n // from the actual rendered column width so it adapts to resource count + view.\n const [dayHeaderCompact, setDayHeaderCompact] = useState(false)\n useEffect(() => {\n const container = wrapperRef.current\n if (!container) return\n let frame = 0\n const measure = () => {\n // Measure an actual DAY column ([data-date]) — in resource views the first\n // .fc-col-header-cell is the wide resource header, not a day column.\n const cell = container.querySelector('.fc-col-header-cell[data-date]') as HTMLElement | null\n if (!cell) return\n const colWidth = cell.getBoundingClientRect().width\n // Collapse to single-letter ONLY when the full weekday label can't fit.\n // Measure the widest full line (\"WED\" / \"12/14\") in the header's font so\n // the breakpoint adapts to font + locale instead of a magic number.\n const cushion = (cell.querySelector('.fc-col-header-cell-cushion') as HTMLElement | null) ?? cell\n const cs = getComputedStyle(cushion)\n const probe = document.createElement('span')\n probe.style.cssText = 'position:absolute;visibility:hidden;white-space:nowrap;top:-9999px'\n probe.style.fontSize = cs.fontSize\n probe.style.fontWeight = cs.fontWeight\n probe.style.fontFamily = cs.fontFamily\n probe.style.letterSpacing = cs.letterSpacing\n probe.style.textTransform = cs.textTransform\n document.body.appendChild(probe)\n probe.textContent = 'Wed'\n const weekdayWidth = probe.getBoundingClientRect().width\n probe.textContent = '12/14'\n const dateWidth = probe.getBoundingClientRect().width\n probe.remove()\n const needed = Math.max(weekdayWidth, dateWidth) + 12 // text + cushion padding\n setDayHeaderCompact(colWidth < needed)\n }\n // FullCalendar reflows its inner day columns on a later tick than the\n // container resize, so re-measure across a few frames to read settled widths.\n const timers: ReturnType<typeof setTimeout>[] = []\n const schedule = () => {\n cancelAnimationFrame(frame)\n frame = requestAnimationFrame(measure)\n timers.forEach(clearTimeout)\n timers.length = 0\n timers.push(setTimeout(measure, 130), setTimeout(measure, 330))\n }\n schedule()\n const ro = new ResizeObserver(schedule)\n ro.observe(container)\n return () => { cancelAnimationFrame(frame); timers.forEach(clearTimeout); ro.disconnect() }\n }, [resources, currentView, visibleRange])\n\n const applyResourceStriping = useCallback(() => {\n const container = wrapperRef.current\n if (!container) return\n const resourceIds = resources.map((r: { id: string }) => r.id)\n if (resourceIds.length < 2) return\n container.querySelectorAll('[data-resource-id]').forEach((el: Element) => {\n const rid = el.getAttribute('data-resource-id')\n const idx = rid ? resourceIds.indexOf(rid) : -1\n el.classList.toggle('fc-resource-alt', idx % 2 === 1)\n })\n }, [resources])\n\n useEffect(() => {\n applyResourceStriping()\n const t1 = setTimeout(applyResourceStriping, 100)\n const t2 = setTimeout(applyResourceStriping, 300)\n return () => { clearTimeout(t1); clearTimeout(t2) }\n }, [applyResourceStriping, currentView, visibleRange, bookings])\n\n // Listen for cross-plugin booking open requests (e.g., from financial invoice detail)\n useEffect(() => {\n function handleOpenBooking(e: Event) {\n const detail = (e as CustomEvent).detail ?? {}\n const externalSource = detail.source\n ? { type: String(detail.source), id: detail.waitlistId, waitlistId: detail.waitlistId }\n : undefined\n if (detail.bookingId) {\n openModal('edit', { bookingId: detail.bookingId, externalSource })\n return\n }\n openModal('create', {\n prefill: detail.prefill ?? {\n clientId: detail.clientId,\n professionalId: detail.professionalId,\n locationId: detail.locationId,\n startsAt: detail.startsAt,\n },\n externalSource,\n })\n }\n window.addEventListener('agenda:open-booking', handleOpenBooking)\n return () => window.removeEventListener('agenda:open-booking', handleOpenBooking)\n }, [openModal])\n\n // Custom day header: weekday + date stacked. When columns get narrow it\n // collapses the weekday to a single initial (S / 16, Google-Calendar style).\n // Always returns explicit content — returning undefined renders an EMPTY\n // header in the React adapter rather than falling back to the default.\n const dayHeaderContent = useCallback((arg: any) => {\n const date: Date = arg.date\n const dateLocale = currentLocale === 'pt-BR' ? 'pt-BR' : 'en'\n // Inline styles (not CSS classes) so stacking is guaranteed regardless of\n // the runtime style-injection state.\n const wrapStyle: React.CSSProperties = { display: 'flex', flexDirection: 'column', alignItems: 'center', lineHeight: 1.15 }\n const dateStyle: React.CSSProperties = { fontSize: '0.65rem', opacity: 0.75 }\n if (dayHeaderCompact) {\n const letter = date.toLocaleDateString(dateLocale, { weekday: 'narrow' })\n return (\n <div style={wrapStyle}>\n <span style={{ fontWeight: 600 }}>{letter}</span>\n <span style={dateStyle}>{date.getDate()}</span>\n </div>\n )\n }\n const weekday = date.toLocaleDateString(dateLocale, { weekday: 'short' })\n return (\n <div style={wrapStyle}>\n <span>{weekday}</span>\n <span style={dateStyle}>{`${date.getMonth() + 1}/${date.getDate()}`}</span>\n </div>\n )\n }, [dayHeaderCompact, currentLocale])\n\n const resourceLabelContent = useCallback((arg: any) => {\n const { id, title, extendedProps } = arg.resource\n const initials = title.split(' ').map((n: string) => n[0]).join('').slice(0, 2)\n return (\n <div className=\"flex items-center gap-2 px-2 py-1.5\">\n <div className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-primary/10 text-[10px] font-bold text-primary\">{initials}</div>\n <div className=\"min-w-0\">\n <PersonLink\n personId={id}\n name={title}\n size=\"sm\"\n tab=\"schedule\"\n profileHref={`#/registry/staff/${id}/schedule`}\n />\n {extendedProps?.locationName && <p className=\"text-[10px] text-muted-foreground truncate\">{extendedProps.locationName}</p>}\n </div>\n </div>\n )\n }, [])\n\n const eventContent = useCallback((arg: any) => {\n // Location label events — render as a small tag\n if (arg.event.extendedProps?.isLocationLabel) {\n return (\n <div className=\"px-1.5 py-0.5 overflow-hidden\">\n <p className=\"text-[10px] font-medium truncate\">{arg.event.title}</p>\n </div>\n )\n }\n const serviceNames = arg.event.extendedProps?.serviceNames\n const start = arg.event.start\n const end = arg.event.end\n const fmt = (d: Date) => `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`\n const timeRange = start && end ? `${fmt(start)} – ${fmt(end)}` : start ? fmt(start) : ''\n return (\n <div className=\"px-1.5 py-0.5 overflow-hidden leading-tight h-full\">\n <div className=\"flex items-start justify-between gap-1\">\n <p className=\"text-[11px] font-semibold truncate\">{arg.event.title}</p>\n {serviceNames && <p className=\"text-[10px] opacity-60 truncate shrink-0 max-w-[45%] text-right\">{serviceNames}</p>}\n </div>\n {timeRange && <p className=\"text-[9px] opacity-50\">{timeRange}</p>}\n </div>\n )\n }, [])\n\n return (\n <div className=\"flex h-[calc(100vh-7.5rem)]\">\n {/* ═══ LEFT SIDEBAR — hidden on mobile ═══ */}\n <div className=\"hidden md:flex w-[220px] shrink-0 flex-col overflow-y-auto py-4 px-3 mr-4\">\n {/* + Create button */}\n <button\n onClick={() => openModal('create')}\n className=\"flex items-center gap-2 rounded-button bg-primary text-primary-foreground border border-primary pl-3 pr-4 py-1.5 text-sm font-semibold hover:bg-primary/90 shadow-button-primary active:shadow-button-inset transition-all mb-6 w-fit\"\n >\n <Plus className=\"h-4 w-4\" />\n {t('agenda.sidebar.create')}\n </button>\n\n {/* Mini month calendar */}\n <MiniCalendar selectedDate={selectedDate} onDateSelect={handleMiniDateSelect} />\n\n {/* Agendas (professional filter) — hidden when no booking type uses a\n professional (e.g. eventMode:'simple'). */}\n {config.capabilities.professional && (<>\n <div className=\"h-px bg-border my-4\" />\n\n <button onClick={() => setProfSectionOpen((p) => !p)}\n className=\"flex items-center justify-between w-full text-xs font-medium text-muted-foreground hover:text-foreground py-1 transition-colors\">\n <span>Agendas</span>\n <ChevronDown className={`h-3.5 w-3.5 transition-transform ${profSectionOpen ? '' : '-rotate-90'}`} />\n </button>\n {profSectionOpen && (\n <div className=\"mt-1.5 space-y-0.5\">\n {professionals.map((prof) => {\n const active = selectedProfIds.length === 0 || selectedProfIds.includes(prof.id)\n return (\n <label key={prof.id} className=\"flex items-center gap-2.5 rounded px-1 py-1 cursor-pointer hover:bg-muted/50 transition-colors\">\n <span className={`flex h-4 w-4 shrink-0 items-center justify-center rounded-sm border-2 transition-colors ${\n active ? 'border-primary bg-primary' : 'border-muted-foreground/30'\n }`}>\n {active && <svg className=\"h-2.5 w-2.5 text-primary-foreground\" viewBox=\"0 0 12 12\" fill=\"none\"><path d=\"M2 6l3 3 5-5\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>}\n </span>\n <span className={`text-xs truncate ${active ? 'text-foreground' : 'text-muted-foreground'}`}>{prof.name}</span>\n <input type=\"checkbox\" className=\"sr-only\" checked={active} onChange={() => toggleProfessional(prof.id)} />\n </label>\n )\n })}\n </div>\n )}\n </>)}\n\n {/* Status filter — hidden when no booking type uses a status workflow\n (e.g. eventMode:'simple'). */}\n {config.capabilities.status && (<>\n <div className=\"h-px bg-border my-4\" />\n\n <button onClick={() => setStatusSectionOpen((p) => !p)}\n className=\"flex items-center justify-between w-full text-xs font-medium text-muted-foreground hover:text-foreground py-1 transition-colors\">\n <span>Status</span>\n <ChevronDown className={`h-3.5 w-3.5 transition-transform ${statusSectionOpen ? '' : '-rotate-90'}`} />\n </button>\n {statusSectionOpen && (\n <div className=\"mt-1.5 space-y-0.5\">\n {config.statuses.map((st) => {\n const active = selectedStatuses.length === 0 || selectedStatuses.includes(st.value)\n return (\n <label key={st.value} className=\"flex items-center gap-2.5 rounded px-1 py-1 cursor-pointer hover:bg-muted/50 transition-colors\">\n <span className=\"flex h-4 w-4 shrink-0 items-center justify-center rounded-sm border-2 transition-colors\"\n style={{ borderColor: active ? st.color : st.color + '40', backgroundColor: active ? st.color : 'transparent' }}>\n {active && <svg className=\"h-2.5 w-2.5 text-white\" viewBox=\"0 0 12 12\" fill=\"none\"><path d=\"M2 6l3 3 5-5\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/></svg>}\n </span>\n <span className={`text-xs ${active ? 'text-foreground' : 'text-muted-foreground'}`}>{st.label}</span>\n <input type=\"checkbox\" className=\"sr-only\" checked={active} onChange={() => toggleStatus(st.value)} />\n </label>\n )\n })}\n </div>\n )}\n </>)}\n </div>\n\n {/* ═══ MAIN AREA ═══ */}\n <div className=\"flex-1 flex flex-col min-w-0 overflow-hidden\">\n {/* Toolbar */}\n <div className=\"shrink-0 border-b\">\n {/* Row 1 — create + date nav + title (left), desktop switcher + settings\n (right). Extra right padding on mobile clears the transparent header's\n floating profile avatar, which otherwise overlaps the settings gear. */}\n <div className=\"flex items-center justify-between pl-4 pr-14 md:px-4 h-12\">\n <div className=\"flex items-center gap-3 min-w-0\">\n {/* Mobile create button */}\n <button onClick={() => openModal('create')}\n className=\"md:hidden flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-primary text-primary-foreground\">\n <Plus className=\"h-4 w-4\" />\n </button>\n\n {/* Date navigation drives the FullCalendar api — shown on desktop and,\n on mobile, only when a grid view is active (the list paginates\n itself, so it has no grid to page through). */}\n <div className={`${mobileGridActive ? 'flex' : 'hidden'} md:flex items-center gap-3`}>\n <button onClick={handleToday}\n className=\"rounded-md border px-3 py-1 text-sm font-medium hover:bg-muted bg-card shadow-button active:shadow-button-inset transition-colors\">\n {t('agenda.toolbar.today')}\n </button>\n <div className=\"flex items-center gap-0.5\">\n <button onClick={handlePrev} className=\"flex h-7 w-7 items-center justify-center rounded-full hover:bg-muted transition-colors\">\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n <button onClick={handleNext} className=\"flex h-7 w-7 items-center justify-center rounded-full hover:bg-muted transition-colors\">\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n <h1 className=\"text-base sm:text-lg font-normal truncate\">{isMobile && !mobileGridActive ? t('agenda.calendar.viewAgenda') : calendarTitle}</h1>\n </div>\n\n <div className=\"flex items-center gap-1 shrink-0\">\n <div className=\"hidden md:flex items-center gap-1\">\n {viewOptions.map((opt) => (\n <button key={opt.key} onClick={() => handleViewChange(opt.key)}\n className={`rounded-md px-3 py-1 text-sm transition-colors ${\n currentView === opt.key\n ? 'bg-primary/10 text-primary font-medium'\n : 'text-muted-foreground hover:bg-muted/50'\n }`}>\n {t(opt.labelKey)}\n </button>\n ))}\n </div>\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => window.location.hash = '/settings/agenda'}\n title=\"Agenda Settings\"\n className=\"ml-1\"\n >\n <Settings className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n\n {/* Row 2 (mobile only) — compact segmented view switcher on its own row so\n it never collides with the floating avatar. Dia/Semana/Mês mount the\n calendar; Lista returns to the thumb-friendly agenda list. */}\n <div className=\"flex md:hidden items-center gap-1 overflow-x-auto px-3 pb-2\">\n {mobileViewOptions.map((opt) => (\n <button key={opt.key} onClick={() => handleMobileViewChange(opt.key)}\n className={`shrink-0 rounded-md px-3 py-1 text-sm transition-colors ${\n mobileView === opt.key\n ? 'bg-primary/10 text-primary font-medium'\n : 'text-muted-foreground hover:bg-muted/50'\n }`}>\n {t(opt.labelKey)}\n </button>\n ))}\n </div>\n </div>\n\n {/* Mobile list view → thumb-friendly agenda list; otherwise (desktop, or a\n mobile grid view the user switched to) → FullCalendar grid. */}\n {isMobile && !mobileGridActive ? (\n <AgendaMobileList\n bookings={bookings}\n statusColors={statusColors}\n currencyCode={config.currency.code}\n onSelect={(b) => openModal('edit', { bookingId: b.id })}\n />\n ) : professionalsLoading && professionals.length === 0 ? (\n <CalendarSkeleton profCount={2} />\n ) : (\n <div ref={wrapperRef} className=\"flex-1 overflow-hidden agenda-calendar\">\n <FullCalendar\n ref={calendarRef}\n plugins={[dayGridPlugin, timeGridPlugin, resourceTimeGridPlugin, interactionPlugin, listPlugin]}\n initialView={mobileGridActive ? mobileView : effectiveInitialView}\n schedulerLicenseKey=\"CC-Attribution-NonCommercial-NoDerivatives\"\n resources={resourceCapable ? resources : undefined}\n events={events}\n headerToolbar={false}\n locale={fcLocale}\n height=\"100%\"\n slotMinTime={effectiveBusinessHours.startTime + ':00'}\n slotMaxTime={effectiveBusinessHours.endTime + ':00'}\n slotDuration={{ minutes: config.slotDuration }}\n allDaySlot={false}\n nowIndicator={true}\n editable={config.modules.dragAndDrop}\n selectable={true}\n selectMirror={true}\n eventOverlap={false}\n datesSet={handleDatesSet}\n eventDidMount={handleEventDidMount}\n eventClick={handleEventClick}\n eventMouseEnter={handleEventMouseEnter}\n eventMouseLeave={handleEventMouseLeave}\n select={handleSelect}\n eventDrop={handleEventDrop}\n resourceLabelContent={resourceLabelContent}\n dayHeaderContent={dayHeaderContent}\n eventContent={eventContent}\n resourceOrder=\"title\"\n stickyHeaderDates={true}\n expandRows={false}\n eventTimeFormat={{ hour: '2-digit', minute: '2-digit', hour12: false }}\n slotLabelFormat={{ hour: '2-digit', minute: '2-digit', hour12: false }}\n />\n </div>\n )}\n </div>\n\n {/* Popover — stays mounted until animation finishes */}\n {selectedBooking && popoverAnchor && popoverVisible && (\n <AppointmentPopover booking={selectedBooking} position={popoverAnchor}\n onClose={() => {\n // Called AFTER the popover's exit animation finishes\n setPopoverVisible(false)\n setSelectedBooking(null)\n setPopoverAnchor(null)\n }}\n onEdit={(id) => {\n setPopoverVisible(false)\n setSelectedBooking(null)\n setPopoverAnchor(null)\n openModal('edit', { bookingId: id })\n }} />\n )}\n\n {/* Context Menu */}\n {contextMenu && (\n <EventContextMenu\n booking={contextMenu.booking}\n position={{ x: contextMenu.x, y: contextMenu.y }}\n onClose={() => { setContextMenuVisible(false); setContextMenu(null) }}\n onEdit={(id) => { setContextMenuVisible(false); setContextMenu(null); openModal('edit', { bookingId: id }) }}\n />\n )}\n\n {/* No-schedule confirm */}\n <ConfirmDialog\n open={!!scheduleConfirm}\n variant=\"warning\"\n title={t('agenda.calendar.noScheduleConfirm')}\n confirmLabel={t('common.confirm')}\n cancelLabel={t('common.cancel')}\n onConfirm={() => { const cb = scheduleConfirm?.onConfirm; setScheduleConfirm(null); cb?.() }}\n onCancel={() => setScheduleConfirm(null)}\n />\n\n {/* Modal — always mounted, Radix controls open/close animation */}\n <AppointmentModal\n open={modalState.open}\n mode={modalState.mode}\n bookingId={modalState.bookingId}\n prefill={modalState.prefill}\n initialTab={modalState.initialTab}\n externalSource={modalState.externalSource}\n onClose={closeModal}\n onCreated={(newId, source) => {\n if (config.onBookingCreated) {\n void Promise.resolve(config.onBookingCreated({ bookingId: newId, source })).catch((error: unknown) => {\n console.error('Failed to run agenda booking-created bridge', error)\n })\n }\n // After a short delay (let calendar re-render), find the event and show popover\n setTimeout(() => {\n const booking = bookings.find((b: CalendarBooking) => b.id === newId)\n if (!booking) return\n const el = document.querySelector(`[data-booking-id=\"${newId}\"]`) as HTMLElement | null\n if (el) {\n const rect = el.getBoundingClientRect()\n const popW = 320, popH = 340\n let x = rect.right + 8\n let y = rect.top + rect.height / 2 - popH / 2\n if (x + popW > window.innerWidth - 16) x = rect.left - popW - 8\n if (y + popH > window.innerHeight - 16) y = window.innerHeight - popH - 16\n if (y < 16) y = 16\n setSelectedBooking(booking)\n setPopoverAnchor({ x, y })\n setPopoverVisible(true)\n }\n }, 400)\n }} />\n </div>\n )\n}\n","import React from 'react'\nimport { usePluginRuntimeOptional } from '@fayz-ai/core'\nimport type { StoreApi } from 'zustand/vanilla'\nimport { AgendaContextProvider } from './AgendaContext'\nimport type { ResolvedAgendaConfig } from './config'\nimport type { AgendaDataProvider } from './data/types'\nimport type { AgendaUIState } from './store'\nimport { CalendarView } from './views/CalendarView'\nimport { setAgendaTenantId } from './lib/tenant'\n\n// ---------------------------------------------------------------------------\n// Main page — clean single-page calendar, no module nav wrapper\n// ---------------------------------------------------------------------------\n\nexport function AgendaPage({ config, provider, store }: {\n config: ResolvedAgendaConfig\n provider: AgendaDataProvider\n store: StoreApi<AgendaUIState>\n}) {\n const runtime = usePluginRuntimeOptional()\n const tenantId = runtime?.context.tenant?.id\n\n React.useEffect(() => {\n setAgendaTenantId(tenantId)\n return () => setAgendaTenantId(undefined)\n }, [tenantId])\n\n return (\n <AgendaContextProvider config={config} provider={provider} store={store}>\n <CalendarView />\n </AgendaContextProvider>\n )\n}\n","import type { AgendaDataProvider } from './types'\nimport type {\n CalendarBooking, Professional, Schedule, TimeSlot,\n CreateBookingInput, UpdateBookingInput, SaveScheduleInput,\n BookingQuery, ConflictCheckParams, AvailableSlotsParams, BookingStatus,\n} from '../types'\nimport { getSupabaseClientOptional, getActiveTenantId } from '@fayz-ai/core'\nimport { getAgendaTenantId } from '../lib/tenant'\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getTenantId(): string | undefined {\n // Plugin-local override wins; else fall back to the app's active tenant so\n // writes stamp the right tenant_id and pass orders/bookings RLS.\n return getAgendaTenantId() ?? getActiveTenantId()\n}\n\nfunction snakeToCamel(obj: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(obj)) {\n result[key.replace(/_([a-z])/g, (_, c) => c.toUpperCase())] = value\n }\n return result\n}\n\nfunction getClients() {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) throw new Error('Supabase not initialized')\n return { core: supabase.schema('saas_core'), pub: supabase }\n}\n\nfunction mapBooking(row: Record<string, unknown>): CalendarBooking {\n return snakeToCamel(row) as unknown as CalendarBooking\n}\n\nfunction mapSchedule(row: Record<string, unknown>): Schedule {\n return snakeToCamel(row) as unknown as Schedule\n}\n\nfunction addMinutes(iso: string, minutes: number): string {\n const d = new Date(iso)\n d.setMinutes(d.getMinutes() + minutes)\n return d.toISOString()\n}\n\nfunction unique(values: Array<string | null | undefined>): string[] {\n return Array.from(new Set(values.filter((value): value is string => !!value)))\n}\n\nfunction indexById(rows: any[] | null | undefined): Map<string, any> {\n return new Map((rows ?? []).filter((row) => row?.id).map((row) => [row.id, row]))\n}\n\nfunction groupBy<T>(rows: T[], getKey: (row: T) => string | null | undefined): Map<string, T[]> {\n const grouped = new Map<string, T[]>()\n for (const row of rows) {\n const key = getKey(row)\n if (!key) continue\n grouped.set(key, [...(grouped.get(key) ?? []), row])\n }\n return grouped\n}\n\nfunction getDurationMinutes(startsAt: string, endsAt: string | null | undefined): number | null {\n if (!endsAt) return null\n return Math.round((new Date(endsAt).getTime() - new Date(startsAt).getTime()) / 60000)\n}\n\nfunction mergeBookings(viewBookings: CalendarBooking[], canonicalBookings: CalendarBooking[]): CalendarBooking[] {\n const canonicalIds = new Set(canonicalBookings.map((booking) => booking.id))\n const canonicalOrderIds = new Set(canonicalBookings.map((booking) => booking.orderId).filter(Boolean))\n const merged = [\n ...canonicalBookings,\n ...viewBookings.filter((booking) => {\n if (canonicalIds.has(booking.id)) return false\n if (booking.orderId && canonicalOrderIds.has(booking.orderId)) return false\n if (canonicalOrderIds.has(booking.id)) return false\n return true\n }),\n ]\n\n return merged.sort((a, b) => new Date(a.startsAt).getTime() - new Date(b.startsAt).getTime())\n}\n\nasync function hydrateCanonicalBookings(core: any, bookings: any[]): Promise<CalendarBooking[]> {\n const personIds = unique(bookings.flatMap((booking) => [booking.party_id, booking.assignee_id]))\n const locationIds = unique(bookings.map((booking) => booking.location_id))\n const orderIds = unique(bookings.map((booking) => booking.order_id))\n const bookingIds = unique(bookings.map((booking) => booking.id))\n\n const [\n { data: persons, error: personsError },\n { data: locations, error: locationsError },\n { data: orders, error: ordersError },\n { data: items, error: itemsError },\n ] = await Promise.all([\n personIds.length\n ? core.from('persons').select('id, name, phone, email, avatar_url').in('id', personIds)\n : Promise.resolve({ data: [], error: null }),\n locationIds.length\n ? core.from('locations').select('id, name').in('id', locationIds)\n : Promise.resolve({ data: [], error: null }),\n orderIds.length\n ? core.from('orders').select('id, total, status').in('id', orderIds)\n : Promise.resolve({ data: [], error: null }),\n orderIds.length\n ? core.from('order_items').select('id, order_id, service_id, name, duration_minutes, unit_price, assignee_id, sort_order').in('order_id', orderIds)\n : Promise.resolve({ data: [], error: null }),\n ])\n\n if (personsError) throw personsError\n if (locationsError) throw locationsError\n if (ordersError) throw ordersError\n if (itemsError) throw itemsError\n\n const personsById = indexById(persons)\n const locationsById = indexById(locations)\n const ordersById = indexById(orders)\n // S4: line items come from order_items (single source), keyed by order_id.\n const itemsByOrderId = groupBy(items ?? [], (item: any) => item.order_id)\n\n return bookings.map((booking) => {\n const client = booking.party_id ? personsById.get(booking.party_id) : null\n const professional = booking.assignee_id ? personsById.get(booking.assignee_id) : null\n const location = booking.location_id ? locationsById.get(booking.location_id) : null\n const order = booking.order_id ? ordersById.get(booking.order_id) : null\n const bookingItems = ((booking.order_id ? itemsByOrderId.get(booking.order_id) : null) ?? [])\n .sort((a: any, b: any) => (a.sort_order ?? 0) - (b.sort_order ?? 0))\n .map((item: any) => ({\n id: item.id,\n serviceId: item.service_id,\n name: item.name,\n durationMinutes: item.duration_minutes,\n price: item.unit_price,\n assigneeId: item.assignee_id,\n }))\n const itemDuration = bookingItems.reduce((sum: number, item: any) => sum + (item.durationMinutes ?? 0), 0)\n\n return {\n id: booking.id,\n tenantId: booking.tenant_id,\n kind: booking.kind,\n startsAt: booking.starts_at,\n endsAt: booking.ends_at,\n status: booking.status,\n notes: booking.notes,\n orderId: booking.order_id,\n locationId: booking.location_id,\n metadata: booking.metadata ?? {},\n clientId: booking.party_id,\n // Simple events (no party) fall back to the title stored in metadata.\n clientName: client?.name ?? (booking.metadata?.title as string | undefined) ?? null,\n clientPhone: client?.phone ?? null,\n clientEmail: client?.email ?? null,\n clientAvatarUrl: client?.avatar_url ?? null,\n professionalId: booking.assignee_id,\n professionalName: professional?.name ?? null,\n professionalAvatarUrl: professional?.avatar_url ?? null,\n locationName: location?.name ?? null,\n orderTotal: order?.total ?? null,\n orderStatus: order?.status ?? null,\n services: bookingItems.length ? bookingItems : null,\n totalDurationMinutes: itemDuration || getDurationMinutes(booking.starts_at, booking.ends_at),\n createdAt: booking.created_at,\n updatedAt: booking.updated_at,\n } satisfies CalendarBooking\n })\n}\n\nasync function getCanonicalBookings(core: any, query: BookingQuery): Promise<CalendarBooking[]> {\n let q = core.from('bookings')\n .select('id, tenant_id, kind, starts_at, ends_at, status, notes, order_id, location_id, metadata, party_id, assignee_id, created_at, updated_at')\n .gte('starts_at', query.dateRange.start)\n .lte('starts_at', query.dateRange.end)\n\n if (query.kind) q = q.eq('kind', query.kind)\n if (query.statuses?.length) q = q.in('status', query.statuses)\n if (query.professionalIds?.length) q = q.in('assignee_id', query.professionalIds)\n if (query.locationId) q = q.eq('location_id', query.locationId)\n\n const { data, error } = await q.order('starts_at', { ascending: true })\n if (error) throw error\n return hydrateCanonicalBookings(core, data ?? [])\n}\n\nasync function getCanonicalBookingById(core: any, id: string): Promise<CalendarBooking | null> {\n const columns = 'id, tenant_id, kind, starts_at, ends_at, status, notes, order_id, location_id, metadata, party_id, assignee_id, created_at, updated_at'\n let { data, error } = await core.from('bookings').select(columns).eq('id', id).maybeSingle()\n if (error) throw error\n\n if (!data) {\n const fallback = await core.from('bookings').select(columns).eq('order_id', id).maybeSingle()\n if (fallback.error) throw fallback.error\n data = fallback.data\n }\n\n if (!data) return null\n const [booking] = await hydrateCanonicalBookings(core, [data])\n return booking ?? null\n}\n\n// ---------------------------------------------------------------------------\n// Supabase Agenda Provider\n// ---------------------------------------------------------------------------\n\nexport function createSupabaseAgendaProvider(): AgendaDataProvider {\n return {\n // v_bookings is in public schema (PostgREST default)\n async getBookings(query: BookingQuery): Promise<CalendarBooking[]> {\n const { core, pub } = getClients()\n let q = pub.from('v_bookings').select('*')\n .gte('starts_at', query.dateRange.start)\n .lte('starts_at', query.dateRange.end)\n\n if (query.kind) q = q.eq('kind', query.kind)\n if (query.statuses?.length) q = q.in('status', query.statuses)\n if (query.professionalIds?.length) q = q.in('professional_id', query.professionalIds)\n if (query.locationId) q = q.eq('location_id', query.locationId)\n\n q = q.order('starts_at', { ascending: true })\n\n const { data, error } = await q\n if (error) throw error\n const viewBookings = (data ?? []).map(mapBooking)\n const canonicalBookings = await getCanonicalBookings(core, query)\n return mergeBookings(viewBookings, canonicalBookings)\n },\n\n async getBookingById(id: string): Promise<CalendarBooking | null> {\n const { core, pub } = getClients()\n const { data, error } = await pub.from('v_bookings').select('*').eq('id', id).maybeSingle()\n if (error) throw error\n if (data) return mapBooking(data as Record<string, unknown>)\n return getCanonicalBookingById(core, id)\n },\n\n async createBooking(input: CreateBookingInput): Promise<CalendarBooking> {\n const { core } = getClients()\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('No active tenant')\n\n const hasServices = input.services.length > 0\n const totalDuration = input.services.reduce((sum, s) => sum + s.durationMinutes, 0)\n const totalPrice = input.services.reduce((sum, s) => sum + s.price, 0)\n const endsAt = addMinutes(input.startsAt, totalDuration || 30)\n const serviceNames = input.services.map((s: any) => s.name).join(', ')\n\n // Resolve client name for metadata (used by financial detail view)\n let contactName: string | undefined\n if (input.clientId) {\n const { data: person } = await core.from('persons').select('name').eq('id', input.clientId).single()\n contactName = person?.name as string | undefined\n }\n\n // Simple / Google-Calendar-style events have no client party — persist the\n // free-text title in metadata so the read model can surface it as the name.\n const eventTitle = input.title?.trim() || undefined\n\n const { data: order, error: orderErr } = await core.from('orders').insert({\n tenant_id: tenantId,\n kind: input.kind ?? 'appointment',\n status: 'scheduled',\n party_id: input.clientId || null,\n assignee_id: input.professionalId,\n location_id: input.locationId ?? null,\n subtotal: totalPrice,\n total: totalPrice,\n notes: input.notes ?? null,\n metadata: {\n source: 'agenda',\n ...(serviceNames ? { serviceNames, itemsSummary: serviceNames } : {}),\n ...(contactName ? { contactName } : {}),\n ...(eventTitle ? { title: eventTitle } : {}),\n },\n }).select('id').single()\n if (orderErr) throw orderErr\n\n const { data: booking, error: bookingErr } = await core.from('bookings').insert({\n tenant_id: tenantId,\n kind: input.kind ?? 'appointment',\n party_id: input.clientId || null,\n assignee_id: input.professionalId,\n location_id: input.locationId ?? null,\n order_id: order.id,\n starts_at: input.startsAt,\n ends_at: endsAt,\n status: 'scheduled',\n notes: input.notes ?? null,\n metadata: {\n source: 'agenda',\n ...(serviceNames ? { serviceNames, itemsSummary: serviceNames } : {}),\n ...(contactName ? { contactName } : {}),\n ...(eventTitle ? { title: eventTitle } : {}),\n },\n }).select('id').single()\n if (bookingErr) throw bookingErr\n\n if (hasServices) {\n // S4: line items live ONLY in order_items now (booking_items deprecated).\n const orderItems = input.services.map((s, i) => ({\n order_id: order.id,\n service_id: s.serviceId,\n name: s.name,\n quantity: 1,\n unit_price: s.price,\n total: s.price,\n sort_order: i,\n duration_minutes: s.durationMinutes,\n assignee_id: s.assigneeId ?? input.professionalId,\n }))\n const { error: oiErr } = await core.from('order_items').insert(orderItems)\n if (oiErr) throw oiErr\n }\n\n const createdBooking = await this.getBookingById(booking.id)\n if (!createdBooking) throw new Error('Created booking did not resolve from agenda read model')\n return createdBooking\n },\n\n async updateBooking(id: string, data: UpdateBookingInput): Promise<CalendarBooking> {\n const { core } = getClients()\n const { data: existing, error: existingErr } = await core.from('bookings')\n .select('id, order_id, starts_at, assignee_id, metadata')\n .eq('id', id)\n .single()\n if (existingErr) throw existingErr\n\n const updates: Record<string, unknown> = {}\n if (data.startsAt) updates.starts_at = data.startsAt\n if (data.endsAt) updates.ends_at = data.endsAt\n // Simple-event title lives in metadata (no client party) — merge, don't clobber.\n if (data.title !== undefined) {\n updates.metadata = { ...(existing?.metadata as Record<string, unknown> ?? {}), title: data.title }\n }\n if (data.status) {\n // Only update the agenda status — never touch the financial stage\n updates.status = data.status\n }\n if (data.notes !== undefined) updates.notes = data.notes\n if (data.professionalId) updates.assignee_id = data.professionalId\n if (data.clientId) updates.party_id = data.clientId\n if (data.locationId) updates.location_id = data.locationId\n\n // Recalculate totals when services are updated\n if (data.services) {\n const totalDuration = data.services.reduce((s, svc) => s + svc.durationMinutes, 0)\n const totalPrice = data.services.reduce((s, svc) => s + svc.price, 0)\n // Recalculate ends_at from startsAt + total duration\n const startsAt = data.startsAt ?? (existing?.starts_at as string | undefined)\n if (startsAt) {\n const ends = new Date(new Date(startsAt).getTime() + totalDuration * 60000)\n updates.ends_at = ends.toISOString()\n }\n }\n\n const effectiveAssigneeId = data.professionalId ?? (existing?.assignee_id as string | null | undefined) ?? null\n\n const { error } = await core.from('bookings').update(updates).eq('id', id)\n if (error) throw error\n\n // S4: services are updated only in order_items below (booking_items deprecated).\n const orderId = existing?.order_id as string | null | undefined\n if (orderId) {\n const orderUpdates: Record<string, unknown> = {}\n if (data.notes !== undefined) orderUpdates.notes = data.notes\n if (data.professionalId) orderUpdates.assignee_id = data.professionalId\n if (data.clientId) orderUpdates.party_id = data.clientId\n if (data.locationId) orderUpdates.location_id = data.locationId\n\n if (data.services) {\n const totalPrice = data.services.reduce((s, svc) => s + svc.price, 0)\n orderUpdates.subtotal = totalPrice\n orderUpdates.total = totalPrice\n }\n\n if (Object.keys(orderUpdates).length > 0) {\n const { error: orderErr } = await core.from('orders').update(orderUpdates).eq('id', orderId)\n if (orderErr) throw orderErr\n }\n\n if (data.services) {\n await core.from('order_items').delete().eq('order_id', orderId)\n if (data.services.length > 0) {\n const items = data.services.map((svc, idx) => ({\n order_id: orderId,\n service_id: svc.serviceId || null,\n name: svc.name,\n quantity: 1,\n unit_price: svc.price,\n total: svc.price,\n sort_order: idx,\n duration_minutes: svc.durationMinutes,\n assignee_id: svc.assigneeId ?? effectiveAssigneeId,\n }))\n const { error: itemErr } = await core.from('order_items').insert(items)\n if (itemErr) throw itemErr\n }\n }\n }\n\n return (await this.getBookingById(id))!\n },\n\n async deleteBooking(id: string): Promise<void> {\n const { core, pub } = getClients()\n const { data: booking, error: bookingErr } = await core.from('bookings')\n .select('order_id')\n .eq('id', id)\n .single()\n if (bookingErr) throw bookingErr\n\n const orderId = booking?.order_id as string | null | undefined\n const { count, error: movementErr } = orderId\n ? await pub.from('financial_movements').select('id', { count: 'exact', head: true }).eq('invoice_id', orderId)\n : { count: 0, error: null }\n if (movementErr) throw movementErr\n\n if (orderId && (count ?? 0) > 0) {\n // Cancel movements + order (don't delete financial records)\n await pub.from('financial_movements').update({ status: 'cancelled' }).eq('invoice_id', orderId)\n await core.from('orders').update({ status: 'cancelled' }).eq('id', orderId)\n const { error } = await core.from('bookings').update({ status: 'cancelled' }).eq('id', id)\n if (error) throw error\n } else {\n // Safe to delete — remove any movements first (FK constraint)\n if (orderId) {\n await pub.from('financial_movements').delete().eq('invoice_id', orderId)\n }\n const { error } = await core.from('bookings').delete().eq('id', id)\n if (error) throw error\n if (orderId) {\n const { error: orderErr } = await core.from('orders').delete().eq('id', orderId)\n if (orderErr) throw orderErr\n }\n }\n },\n\n async updateBookingStatus(id: string, status: string): Promise<CalendarBooking> {\n return this.updateBooking(id, { status: status as BookingStatus })\n },\n\n async checkConflict(params: ConflictCheckParams): Promise<boolean> {\n const { core } = getClients()\n let q = core.from('bookings').select('id', { count: 'exact', head: true })\n .eq('assignee_id', params.assigneeId)\n .eq('kind', 'appointment')\n .not('status', 'in', '(\"cancelled\",\"no_show\")')\n .not('starts_at', 'is', null)\n .lt('starts_at', params.endsAt)\n .gt('ends_at', params.startsAt)\n\n if (params.excludeBookingId) {\n q = q.neq('id', params.excludeBookingId)\n }\n\n const { count, error } = await q\n if (error) throw error\n return (count ?? 0) > 0\n },\n\n async getAvailableSlots(params: AvailableSlotsParams): Promise<TimeSlot[]> {\n const { pub } = getClients()\n const { data, error } = await pub.rpc('get_available_slots', {\n p_tenant_id: getTenantId(),\n p_assignee_id: params.assigneeId,\n p_date: params.date,\n p_duration_minutes: params.durationMinutes,\n p_slot_interval: params.slotInterval ?? 30,\n })\n if (error) throw error\n return (data ?? []).map((row: any) => ({ start: row.slot_start, end: row.slot_end }))\n },\n\n async getSchedules(professionalId?: string): Promise<Schedule[]> {\n const { core } = getClients()\n let q = core.from('schedules').select('*').eq('kind', 'working_hours')\n if (professionalId) q = q.eq('assignee_id', professionalId)\n q = q.order('day_of_week').order('starts_at')\n\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(mapSchedule)\n },\n\n async saveSchedule(input: SaveScheduleInput): Promise<Schedule> {\n const { core } = getClients()\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('No active tenant')\n\n const { data, error } = await core.from('schedules').insert({\n tenant_id: tenantId,\n kind: 'working_hours',\n assignee_id: input.assigneeId,\n location_id: input.locationId ?? null,\n day_of_week: input.dayOfWeek ?? null,\n specific_date: input.specificDate ?? null,\n starts_at: input.startsAt,\n ends_at: input.endsAt,\n is_active: input.isActive !== false,\n metadata: input.metadata ?? {},\n }).select('*').single()\n if (error) throw error\n return mapSchedule(data as Record<string, unknown>)\n },\n\n async deleteSchedule(id: string): Promise<void> {\n const { core } = getClients()\n const { error } = await core.from('schedules').delete().eq('id', id)\n if (error) throw error\n },\n\n async getProfessionals(): Promise<Professional[]> {\n const { core } = getClients()\n const { data, error } = await core.from('persons')\n .select('id, name, avatar_url, is_active')\n .eq('kind', 'staff')\n .eq('is_active', true)\n .order('name')\n if (error) throw error\n return (data ?? []).map((p: any) => ({\n id: p.id, name: p.name, avatarUrl: p.avatar_url,\n locationId: null, locationName: null, isActive: p.is_active,\n }))\n },\n\n async getLocations(): Promise<Array<{ id: string; name: string }>> {\n const { core } = getClients()\n const { data, error } = await core.from('locations')\n .select('id, name')\n .eq('is_active', true)\n .order('name')\n if (error) throw error\n return (data ?? []).map((l: any) => ({ id: l.id, name: l.name }))\n },\n\n async getConfirmationsPending(daysAhead = 2): Promise<CalendarBooking[]> {\n const { pub } = getClients()\n const now = new Date().toISOString()\n const cutoff = new Date()\n cutoff.setDate(cutoff.getDate() + daysAhead)\n\n const { data, error } = await pub.from('v_bookings').select('*')\n .eq('status', 'scheduled')\n .gte('starts_at', now)\n .lte('starts_at', cutoff.toISOString())\n .order('starts_at')\n if (error) throw error\n return (data ?? []).map(mapBooking)\n },\n\n async sendConfirmation(bookingId: string, channel: string): Promise<void> {\n const { core } = getClients()\n const { data: booking } = await core.from('bookings').select('metadata').eq('id', bookingId).single()\n const metadata = (booking?.metadata ?? {}) as Record<string, unknown>\n const confirmations = (metadata.confirmations as any[] ?? [])\n confirmations.push({ channel, sentAt: new Date().toISOString(), status: 'sent' })\n await core.from('bookings').update({ metadata: { ...metadata, confirmations } }).eq('id', bookingId)\n },\n\n async completeBooking(bookingId: string): Promise<{ booking: CalendarBooking; orderId: string }> {\n const { core } = getClients()\n const { data: existing, error: existingErr } = await core.from('bookings')\n .select('order_id')\n .eq('id', bookingId)\n .single()\n if (existingErr) throw existingErr\n\n const { error } = await core.from('bookings')\n .update({ status: 'completed' })\n .eq('id', bookingId)\n if (error) throw error\n\n const orderId = existing?.order_id as string | null | undefined\n const booking = await this.getBookingById(bookingId)\n if (!booking) throw new Error('Booking not found')\n return { booking, orderId: orderId ?? bookingId }\n },\n }\n}\n","import { createStore, type StoreApi } from 'zustand/vanilla'\nimport { dedup } from '@fayz-ai/saas'\nimport { toast } from '@fayz-ai/ui'\nimport { getScheduleBlockConfig, setScheduleBlockConfig } from '@fayz-ai/saas'\nimport type { AgendaDataProvider } from './data/types'\nimport type { AgendaFinancialBridge } from './financial-bridge'\nimport type { ExternalBookingSource } from './config'\nimport type {\n CalendarBooking, Professional, Schedule,\n CreateBookingInput, UpdateBookingInput, BookingQuery,\n} from './types'\n\n// ---------------------------------------------------------------------------\n// Store state\n// ---------------------------------------------------------------------------\n\nexport interface AgendaUIState {\n // Calendar data\n bookings: CalendarBooking[]\n bookingsLoading: boolean\n dateRange: { start: string; end: string }\n currentView: string\n selectedDate: string\n\n // Resources\n professionals: Professional[]\n professionalsLoading: boolean\n\n // Filters\n selectedProfessionalIds: string[]\n selectedLocationId: string | null\n selectedStatuses: string[]\n\n // Locations\n locations: Array<{ id: string; name: string }>\n\n // Schedules\n schedules: Schedule[]\n schedulesLoading: boolean\n\n // Confirmations\n pendingConfirmations: CalendarBooking[]\n confirmationsLoading: boolean\n\n // Modal state\n appointmentModal: {\n open: boolean\n mode: 'create' | 'edit'\n bookingId?: string\n prefill?: Partial<CreateBookingInput> & { endsAt?: string }\n initialTab?: string\n externalSource?: ExternalBookingSource\n }\n\n // Actions\n fetchBookings(range: { start: string; end: string }): Promise<void>\n fetchProfessionals(): Promise<void>\n fetchLocations(): Promise<void>\n fetchSchedules(professionalId?: string): Promise<void>\n fetchConfirmations(): Promise<void>\n createBooking(input: CreateBookingInput): Promise<CalendarBooking>\n updateBooking(id: string, data: UpdateBookingInput): Promise<CalendarBooking>\n deleteBooking(id: string): Promise<void>\n updateBookingStatus(id: string, status: string): Promise<void>\n rescheduleBooking(id: string, newStart: string, newEnd: string, newProfessionalId?: string): Promise<void>\n setFilters(filters: Partial<{ professionalIds: string[]; locationId: string | null; statuses: string[] }>): void\n setView(view: string): void\n setSelectedDate(date: string): void\n openAppointmentModal(mode: 'create' | 'edit', options?: { bookingId?: string; prefill?: Partial<CreateBookingInput> & { endsAt?: string }; initialTab?: string; externalSource?: ExternalBookingSource }): void\n closeAppointmentModal(): void\n}\n\n// ---------------------------------------------------------------------------\n// Store factory\n// ---------------------------------------------------------------------------\n\nfunction getCurrentBookingQuery(state: AgendaUIState, dateRange = state.dateRange): BookingQuery {\n return {\n dateRange,\n professionalIds: state.selectedProfessionalIds.length ? state.selectedProfessionalIds : undefined,\n locationId: state.selectedLocationId ?? undefined,\n statuses: state.selectedStatuses.length ? state.selectedStatuses : undefined,\n }\n}\n\nexport function createAgendaStore(provider: AgendaDataProvider, financialBridge?: AgendaFinancialBridge): StoreApi<AgendaUIState> {\n return createStore<AgendaUIState>((set, get) => ({\n bookings: [],\n bookingsLoading: false,\n dateRange: { start: '', end: '' },\n currentView: 'resourceTimeGridDay',\n selectedDate: new Date().toISOString().slice(0, 10),\n\n professionals: [],\n professionalsLoading: false,\n\n selectedProfessionalIds: [],\n selectedLocationId: null,\n selectedStatuses: ['scheduled', 'confirmed', 'in_progress', 'completed'],\n\n locations: [],\n\n schedules: [],\n schedulesLoading: false,\n\n pendingConfirmations: [],\n confirmationsLoading: false,\n\n appointmentModal: { open: false, mode: 'create' },\n\n async fetchBookings(range) {\n const key = `agenda:bookings:${range.start}:${range.end}`\n return dedup(key, async () => {\n set({ bookingsLoading: true, dateRange: range })\n const state = get()\n const query = getCurrentBookingQuery(state, range)\n let bookings = await provider.getBookings(query)\n\n // Enrich with payment status if financial bridge is available\n if (financialBridge) {\n const orderIds = bookings.map((b) => b.orderId).filter((id): id is string => !!id)\n if (orderIds.length > 0) {\n try {\n const statuses = await financialBridge.resolvePaymentStatuses(orderIds)\n bookings = bookings.map((b) => {\n if (!b.orderId) return b\n const summary = statuses.get(b.orderId)\n return summary ? { ...b, paymentStatus: summary.status } : b\n })\n } catch { /* non-blocking */ }\n }\n }\n\n set({ bookings, bookingsLoading: false })\n })\n },\n\n async fetchProfessionals() {\n return dedup('agenda:professionals', async () => {\n set({ professionalsLoading: true })\n const professionals = await provider.getProfessionals()\n set({ professionals, professionalsLoading: false })\n })\n },\n\n async fetchLocations() {\n return dedup('agenda:locations', async () => {\n if (!provider.getLocations) return\n const locations = await provider.getLocations()\n set({ locations })\n // Update global schedule block config so ScheduleEditor picks up locations\n const current = getScheduleBlockConfig()\n if (current) {\n setScheduleBlockConfig({ ...current, locations })\n }\n })\n },\n\n async fetchSchedules(professionalId) {\n return dedup('agenda:schedules:' + (professionalId ?? 'all'), async () => {\n set({ schedulesLoading: true })\n const schedules = await provider.getSchedules(professionalId)\n set({ schedules, schedulesLoading: false })\n })\n },\n\n async fetchConfirmations() {\n return dedup('agenda:confirmations', async () => {\n set({ confirmationsLoading: true })\n const pendingConfirmations = await provider.getConfirmationsPending()\n set({ pendingConfirmations, confirmationsLoading: false })\n })\n },\n\n async createBooking(input) {\n try {\n const booking = await provider.createBooking(input)\n // Refresh bookings for current range\n const state = get()\n if (state.dateRange.start && state.dateRange.end) {\n const bookings = await provider.getBookings(getCurrentBookingQuery(state))\n set({ bookings })\n }\n toast.success('Appointment created')\n return booking\n } catch (err: any) {\n toast.error('Failed to create appointment', { description: err?.message })\n throw err\n }\n },\n\n async updateBooking(id, data) {\n try {\n const booking = await provider.updateBooking(id, data)\n const state = get()\n if (state.dateRange.start && state.dateRange.end) {\n const bookings = await provider.getBookings(getCurrentBookingQuery(state))\n set({ bookings })\n }\n toast.success('Appointment updated')\n return booking\n } catch (err: any) {\n toast.error('Failed to update appointment', { description: err?.message })\n throw err\n }\n },\n\n async deleteBooking(id) {\n try {\n await provider.deleteBooking(id)\n const state = get()\n if (state.dateRange.start && state.dateRange.end) {\n const bookings = await provider.getBookings(getCurrentBookingQuery(state))\n set({ bookings })\n }\n toast.success('Appointment deleted')\n } catch (err: any) {\n toast.error('Failed to delete appointment', { description: err?.message })\n throw err\n }\n },\n\n async updateBookingStatus(id, status) {\n // Optimistic update — change color immediately\n const prev = get().bookings\n set({ bookings: prev.map((b) => b.id === id ? { ...b, status: status as any } : b) })\n try {\n await provider.updateBookingStatus(id, status)\n // Refresh from server to get full data\n const state = get()\n if (state.dateRange.start && state.dateRange.end) {\n const bookings = await provider.getBookings(getCurrentBookingQuery(state))\n set({ bookings })\n }\n toast.success('Status updated')\n } catch (err: any) {\n // Rollback on failure\n set({ bookings: prev })\n toast.error('Failed to update status', { description: err?.message })\n throw err\n }\n },\n\n async rescheduleBooking(id, newStart, newEnd, newProfessionalId) {\n try {\n // Check for conflicts\n const existing = get().bookings.find((b) => b.id === id)\n const assigneeId = newProfessionalId ?? existing?.professionalId\n if (assigneeId) {\n const hasConflict = await provider.checkConflict({\n assigneeId,\n startsAt: newStart,\n endsAt: newEnd,\n excludeBookingId: id,\n })\n if (hasConflict) {\n toast.error('Time conflict detected', { description: 'This professional already has an appointment at this time.' })\n throw new Error('Time conflict')\n }\n }\n await provider.updateBooking(id, {\n startsAt: newStart,\n endsAt: newEnd,\n ...(newProfessionalId && { professionalId: newProfessionalId }),\n })\n const state = get()\n if (state.dateRange.start && state.dateRange.end) {\n const bookings = await provider.getBookings(getCurrentBookingQuery(state))\n set({ bookings })\n }\n toast.success('Appointment rescheduled')\n } catch (err: any) {\n if (err?.message !== 'Time conflict') {\n toast.error('Failed to reschedule', { description: err?.message })\n }\n throw err\n }\n },\n\n setFilters(filters) {\n set({\n ...(filters.professionalIds !== undefined && { selectedProfessionalIds: filters.professionalIds }),\n ...(filters.locationId !== undefined && { selectedLocationId: filters.locationId }),\n ...(filters.statuses !== undefined && { selectedStatuses: filters.statuses }),\n })\n // Re-fetch with new filters\n const { dateRange } = get()\n if (dateRange.start && dateRange.end) {\n get().fetchBookings(dateRange)\n }\n },\n\n setView(view) { set({ currentView: view }) },\n setSelectedDate(date) { set({ selectedDate: date }) },\n\n openAppointmentModal(mode, options) {\n set({ appointmentModal: { open: true, mode, bookingId: options?.bookingId, prefill: options?.prefill, initialTab: options?.initialTab, externalSource: options?.externalSource } })\n },\n\n closeAppointmentModal() {\n // Only toggle open — keep mode/bookingId/prefill intact so layout\n // doesn't shift during the close animation\n set((state) => ({ appointmentModal: { ...state.appointmentModal, open: false } }))\n },\n }))\n}\n","import type { PluginRegistryDef } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Holidays (saas_core.holidays — tenant-scoped)\n// ---------------------------------------------------------------------------\n\nconst holidayEntity: EntityDef = {\n name: 'Holiday',\n namePlural: 'Holidays',\n icon: 'TreePalm',\n displayField: 'name',\n defaultSort: 'date',\n defaultSortDir: 'asc',\n fields: [\n { key: 'name', label: 'Name', type: 'text', required: true, showInTable: true },\n { key: 'date', label: 'Date', type: 'date', required: true, showInTable: true, sortable: true },\n { key: 'recurring', label: 'Recurring Annually', type: 'boolean', showInTable: true, defaultValue: false },\n { key: 'description', label: 'Description', type: 'text', showInTable: false },\n { key: 'isActive', label: 'Active', type: 'boolean', showInTable: true, defaultValue: true },\n ],\n data: {\n table: 'holidays',\n schema: 'saas_core',\n tenantScoped: true,\n },\n}\n\nexport const agendaRegistries: PluginRegistryDef[] = [\n {\n id: 'holidays',\n entity: holidayEntity,\n icon: 'TreePalm',\n description: 'Non-working days and recurring holidays',\n },\n]\n","import React from 'react'\nimport { SettingsGroup, ToggleRow, SelectRow } from '@fayz-ai/saas'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useAgendaSettings } from '../hooks/useAgendaSettings'\n\nconst HOUR_OPTIONS = Array.from({ length: 18 }, (_, i) => {\n const h = (5 + i).toString().padStart(2, '0')\n return { value: `${h}:00`, label: `${h}:00` }\n})\n\nexport function AgendaGeneralSettings() {\n const t = useTranslation()\n const { startTime, endTime, setStartTime, setEndTime } = useAgendaSettings()\n return (\n <div className=\"space-y-4\">\n <SettingsGroup title={t('agenda.settings.scheduling')} description={t('agenda.settings.schedulingDesc')}>\n <ToggleRow label={t('agenda.settings.conflictDetection')} description={t('agenda.settings.conflictDetectionDesc')} checked={true} onChange={() => {}} />\n <ToggleRow label={t('agenda.settings.dragDrop')} description={t('agenda.settings.dragDropDesc')} checked={true} onChange={() => {}} />\n <ToggleRow label={t('agenda.settings.autoCreateOrder')} description={t('agenda.settings.autoCreateOrderDesc')} checked={true} onChange={() => {}} />\n </SettingsGroup>\n\n <SettingsGroup title={t('agenda.settings.locations')} description={t('agenda.settings.locationsDesc')}>\n <ToggleRow label={t('agenda.settings.enableLocation')} description={t('agenda.settings.enableLocationDesc')} checked={false} onChange={() => {}} />\n </SettingsGroup>\n\n <SettingsGroup title={t('agenda.settings.workingHours')} description={t('agenda.settings.workingHoursDesc')}>\n <ToggleRow label={t('agenda.settings.enableWorkingHours')} description={t('agenda.settings.enableWorkingHoursDesc')} checked={true} onChange={() => {}} />\n <ToggleRow label={t('agenda.settings.blockOutside')} description={t('agenda.settings.blockOutsideDesc')} checked={false} onChange={() => {}} />\n </SettingsGroup>\n\n <SettingsGroup title={t('agenda.settings.confirmations')} description={t('agenda.settings.confirmationsDesc')}>\n <ToggleRow label={t('agenda.settings.enableConfirmations')} description={t('agenda.settings.enableConfirmationsDesc')} checked={true} onChange={() => {}} />\n <ToggleRow label={t('agenda.settings.autoConfirm')} description={t('agenda.settings.autoConfirmDesc')} checked={false} onChange={() => {}} />\n <ToggleRow label={t('agenda.settings.reminder')} description={t('agenda.settings.reminderDesc')} checked={true} onChange={() => {}} />\n </SettingsGroup>\n\n <SettingsGroup title={t('agenda.settings.calendarDisplay')} description={t('agenda.settings.calendarDisplayDesc')}>\n <SelectRow\n label={t('agenda.settings.dayStartTime')}\n description={t('agenda.settings.dayStartTimeDesc')}\n value={startTime}\n options={HOUR_OPTIONS}\n onChange={setStartTime}\n />\n <SelectRow\n label={t('agenda.settings.dayEndTime')}\n description={t('agenda.settings.dayEndTimeDesc')}\n value={endTime}\n options={HOUR_OPTIONS}\n onChange={setEndTime}\n />\n <ToggleRow label={t('agenda.settings.showCancelled')} description={t('agenda.settings.showCancelledDesc')} checked={false} onChange={() => {}} />\n <ToggleRow label={t('agenda.settings.showNoShow')} description={t('agenda.settings.showNoShowDesc')} checked={true} onChange={() => {}} />\n <ToggleRow label={t('agenda.settings.compact')} description={t('agenda.settings.compactDesc')} checked={false} onChange={() => {}} />\n </SettingsGroup>\n\n <SettingsGroup title={t('agenda.settings.notifications')} description={t('agenda.settings.notificationsDesc')}>\n <ToggleRow label={t('agenda.settings.newBookingNotif')} description={t('agenda.settings.newBookingNotifDesc')} checked={true} onChange={() => {}} />\n <ToggleRow label={t('agenda.settings.cancelAlerts')} description={t('agenda.settings.cancelAlertsDesc')} checked={true} onChange={() => {}} />\n <ToggleRow label={t('agenda.settings.noShowTracking')} description={t('agenda.settings.noShowTrackingDesc')} checked={false} onChange={() => {}} />\n </SettingsGroup>\n </div>\n )\n}\n","// agenda.* — merged plugin-own + saas-core central i18n\nexport const en: Record<string, string> = {\n \"agenda.appointment.addDescription\": \"Add description...\",\n \"agenda.appointment.addService\": \"Add service\",\n \"agenda.appointment.cancel\": \"Cancel\",\n \"agenda.appointment.clientTab\": \"Client\",\n \"agenda.appointment.noClientData\": \"No client data available\",\n \"agenda.appointment.client\": \"Client\",\n \"agenda.appointment.conflict\": \"Time conflict — this professional is already booked at this time.\",\n \"agenda.appointment.create\": \"Create\",\n \"agenda.appointment.createClientFailed\": \"Failed to create client\",\n \"agenda.appointment.creating\": \"Creating...\",\n \"agenda.appointment.delete\": \"Delete\",\n \"agenda.appointment.deleteConfirm\": \"Delete this appointment?\",\n \"agenda.appointment.confirmDelete\": \"Delete\",\n \"agenda.appointment.deleting\": \"Deleting…\",\n \"agenda.appointment.edit\": \"Edit Appointment\",\n \"agenda.appointment.emailOptional\": \"Email (optional)\",\n \"agenda.appointment.location\": \"Location\",\n \"agenda.appointment.name\": \"Name\",\n \"agenda.appointment.new\": \"New Appointment\",\n \"agenda.appointment.newClient\": \"New client\",\n \"agenda.appointment.notes\": \"Notes\",\n \"agenda.appointment.phone\": \"Phone\",\n \"agenda.appointment.professional\": \"Professional\",\n \"agenda.appointment.save\": \"Save\",\n \"agenda.appointment.saving\": \"Saving...\",\n \"agenda.appointment.searchClient\": \"Search client...\",\n \"agenda.appointment.searchService\": \"Search service to add...\",\n \"agenda.appointment.selectLocation\": \"Select location...\",\n \"agenda.appointment.selectProfessional\": \"Select professional...\",\n \"agenda.appointment.services\": \"Services\",\n \"agenda.appointment.status\": \"Status\",\n \"agenda.appointment.to\": \"to\",\n \"agenda.appointment.total\": \"Total\",\n \"agenda.appointment.update\": \"Update\",\n \"agenda.payment.title\": \"Payment\",\n \"agenda.payment.generateInvoice\": \"Generate invoice\",\n \"agenda.payment.generating\": \"Generating…\",\n \"agenda.payment.pending\": \"Pending\",\n \"agenda.payment.partial\": \"Partial\",\n \"agenda.payment.paid\": \"Paid\",\n \"agenda.payment.collect\": \"Collect\",\n \"agenda.payment.overdue\": \"Overdue\",\n \"agenda.payment.cancelled\": \"Cancelled\",\n \"agenda.payment.none\": \"Payment\",\n \"agenda.payment.pay\": \"Pay\",\n \"agenda.payment.paying\": \"Paying…\",\n \"agenda.payment.remaining\": \"Remaining\",\n \"agenda.payment.installment\": \"Installment\",\n \"agenda.payment.total\": \"Total\",\n \"agenda.payment.noInvoice\": \"No invoice generated\",\n \"agenda.payment.selectAccount\": \"Select account\",\n \"agenda.payment.registerPayment\": \"Register payment\",\n \"agenda.payment.registerPaymentHint\": \"Record a payment for this appointment\",\n \"agenda.payment.pendingHint\": \"Invoice generated, awaiting payment\",\n \"agenda.payment.partialHint\": \"Partially paid, tap to complete\",\n \"agenda.payment.paidHint\": \"Payment completed\",\n \"agenda.payment.overdueHint\": \"Payment overdue\",\n \"agenda.payment.backToAppointment\": \"Back to appointment\",\n \"agenda.payment.checkout\": \"Confirm\",\n \"agenda.payment.checkingOut\": \"Processing…\",\n \"agenda.payment.serviceSummary\": \"Service summary\",\n \"agenda.payment.paymentMethod\": \"Payment method\",\n \"agenda.payment.noMethods\": \"No payment methods configured.\",\n \"agenda.payment.configureMethods\": \"Set up payment methods\",\n \"agenda.payment.checkoutComplete\": \"Payment confirmed\",\n \"agenda.payment.card\": \"Card\",\n \"agenda.payment.method\": \"Method\",\n \"agenda.payment.select\": \"Select…\",\n \"agenda.payment.cardBrand\": \"Brand\",\n \"agenda.payment.selectBrand\": \"Select brand…\",\n \"agenda.payment.cardInstallments\": \"Installments\",\n \"agenda.payment.bankAccount\": \"Account\",\n \"agenda.payment.viewInvoice\": \"View invoice details\",\n \"agenda.calendar.agendas\": \"Agendas\",\n \"agenda.calendar.create\": \"Create\",\n \"agenda.calendar.next\": \"Next\",\n \"agenda.calendar.previous\": \"Previous\",\n \"agenda.calendar.status\": \"Status\",\n \"agenda.calendar.today\": \"Today\",\n \"agenda.calendar.viewAgenda\": \"Agenda\",\n \"agenda.calendar.viewDay\": \"Day\",\n \"agenda.calendar.viewList\": \"List\",\n \"agenda.calendar.viewMonth\": \"Month\",\n \"agenda.calendar.viewWeek\": \"Week\",\n \"agenda.list.today\": \"Today\",\n \"agenda.list.tomorrow\": \"Tomorrow\",\n \"agenda.list.empty\": \"No upcoming items\",\n \"agenda.confirmations.confirmed\": \"Confirmed:\",\n \"agenda.confirmations.empty\": \"No pending confirmations\",\n \"agenda.confirmations.emptySubtitle\": \"All upcoming appointments have been confirmed\",\n \"agenda.confirmations.loading\": \"Loading...\",\n \"agenda.confirmations.subtitle\": \"Upcoming appointments pending confirmation\",\n \"agenda.confirmations.unknownClient\": \"Unknown client\",\n \"agenda.confirmations.sendWhatsApp\": \"Send WhatsApp\",\n \"agenda.confirmations.call\": \"Call\",\n \"agenda.confirmations.markConfirmed\": \"Mark Confirmed\",\n \"agenda.confirmations.markCancelled\": \"Mark Cancelled\",\n \"agenda.cancellation.loadingReasons\": \"Loading reasons...\",\n \"agenda.cancellation.notesOptional\": \"Cancellation notes (optional)\",\n \"agenda.cancellation.notesRequired\": \"Cancellation notes required\",\n \"agenda.cancellation.selectReason\": \"Select cancellation reason\",\n \"agenda.contextMenu.changeStatus\": \"Change status\",\n \"agenda.contextMenu.delete\": \"Delete\",\n \"agenda.contextMenu.edit\": \"Edit\",\n \"agenda.contextMenu.notAvailable\": \"(not available)\",\n \"agenda.index.settingsSubtitle\": \"Working hours, scheduling preferences, and confirmations\",\n \"agenda.index.settingsTitle\": \"Agenda Settings\",\n \"settings.plugin.agenda-working-hours\": \"Working Hours\",\n \"agenda.popover.unknown\": \"Unknown\",\n \"agenda.settings.autoConfirm\": \"Auto-confirm\",\n \"agenda.settings.autoConfirmDesc\": \"Automatically confirm new bookings\",\n \"agenda.settings.autoCreateOrder\": \"Auto-create Order\",\n \"agenda.settings.autoCreateOrderDesc\": \"Automatically create a financial order for new bookings\",\n \"agenda.settings.blockOutside\": \"Block Outside Hours\",\n \"agenda.settings.blockOutsideDesc\": \"Prevent bookings outside working hours\",\n \"agenda.settings.calendarDisplay\": \"Calendar Display\",\n \"agenda.settings.calendarDisplayDesc\": \"Visual settings for the calendar\",\n \"agenda.settings.cancelAlerts\": \"Cancellation Alerts\",\n \"agenda.settings.cancelAlertsDesc\": \"Notify when a booking is cancelled\",\n \"agenda.settings.compact\": \"Compact Mode\",\n \"agenda.settings.compactDesc\": \"Use smaller event blocks\",\n \"agenda.settings.confirmations\": \"Confirmations\",\n \"agenda.settings.confirmationsDesc\": \"Booking confirmation settings\",\n \"agenda.settings.conflictDetection\": \"Conflict Detection\",\n \"agenda.settings.conflictDetectionDesc\": \"Warn when bookings overlap\",\n \"agenda.settings.dragDrop\": \"Drag & Drop\",\n \"agenda.settings.dragDropDesc\": \"Allow rescheduling by dragging events\",\n \"agenda.settings.enableConfirmations\": \"Enable Confirmations\",\n \"agenda.settings.enableConfirmationsDesc\": \"Require confirmation for new bookings\",\n \"agenda.settings.enableLocation\": \"Enable Location Selection\",\n \"agenda.settings.enableLocationDesc\": \"Show location picker in booking modal\",\n \"agenda.settings.enableWorkingHours\": \"Enable Working Hours\",\n \"agenda.settings.enableWorkingHoursDesc\": \"Show working hours overlay on calendar\",\n \"agenda.settings.locations\": \"Locations\",\n \"agenda.settings.locationsDesc\": \"Multi-location settings\",\n \"agenda.settings.newBookingNotif\": \"New Booking Alerts\",\n \"agenda.settings.newBookingNotifDesc\": \"Notify when a new booking is created\",\n \"agenda.settings.noShowTracking\": \"No-show Tracking\",\n \"agenda.settings.noShowTrackingDesc\": \"Track and alert on no-shows\",\n \"agenda.settings.notifications\": \"Notifications\",\n \"agenda.settings.notificationsDesc\": \"Notification preferences\",\n \"agenda.settings.reminder\": \"Reminders\",\n \"agenda.settings.reminderDesc\": \"Send reminders before appointments\",\n \"agenda.settings.scheduling\": \"Scheduling\",\n \"agenda.settings.schedulingDesc\": \"Configure scheduling behavior\",\n \"agenda.settings.showCancelled\": \"Show Cancelled\",\n \"agenda.settings.showCancelledDesc\": \"Display cancelled bookings on calendar\",\n \"agenda.settings.showNoShow\": \"Show No-shows\",\n \"agenda.settings.showNoShowDesc\": \"Display no-show bookings on calendar\",\n \"agenda.settings.workingHours\": \"Working Hours\",\n \"agenda.settings.workingHoursDesc\": \"Working hours and availability\",\n \"agenda.sidebar.agendas\": \"Agendas\",\n \"agenda.sidebar.allLocations\": \"All locations\",\n \"agenda.sidebar.create\": \"Create\",\n \"agenda.sidebar.location\": \"Location\",\n \"agenda.sidebar.status\": \"Status\",\n \"agenda.toolbar.next\": \"Next\",\n \"agenda.toolbar.previous\": \"Previous\",\n \"agenda.toolbar.today\": \"Today\",\n \"agenda.workingHours.addBreak\": \"Add break\",\n \"agenda.workingHours.copyToAll\": \"Copy to all\",\n \"agenda.workingHours.dayOff\": \"Day off\",\n \"agenda.workingHours.removePeriod\": \"Remove period\",\n \"agenda.workingHours.professional\": \"Professional\",\n \"agenda.workingHours.save\": \"Save\",\n \"agenda.workingHours.saveFailed\": \"Failed to save\",\n \"agenda.workingHours.saved\": \"Working hours saved\",\n \"agenda.workingHours.saving\": \"Saving...\",\n \"agenda.workingHours.subtitle\": \"Manage working hours per professional\",\n \"agenda.workingHours.to\": \"to\",\n \"agenda.title\": \"Agenda\",\n \"agenda.calendar.title\": \"Calendar\",\n \"agenda.calendar.noScheduleConfirm\": \"This time slot has no open schedule for this professional. Do you want to book anyway?\",\n \"agenda.calendar.newAppointment\": \"New Appointment\",\n \"agenda.booking.create\": \"New Appointment\",\n \"agenda.booking.edit\": \"Edit Appointment\",\n \"agenda.booking.delete\": \"Delete Appointment\",\n \"agenda.booking.deleteConfirm\": \"Are you sure you want to delete this appointment?\",\n \"agenda.booking.client\": \"Client\",\n \"agenda.booking.professional\": \"Professional\",\n \"agenda.booking.services\": \"Services\",\n \"agenda.booking.date\": \"Date\",\n \"agenda.booking.time\": \"Time\",\n \"agenda.booking.duration\": \"Duration\",\n \"agenda.booking.notes\": \"Notes\",\n \"agenda.booking.status\": \"Status\",\n \"agenda.booking.save\": \"Save Appointment\",\n \"agenda.booking.saving\": \"Saving...\",\n \"agenda.confirmations.title\": \"Confirmations\",\n \"agenda.confirmations.pending\": \"Pending Confirmations\",\n \"agenda.confirmations.emptyDescription\": \"All upcoming appointments have been confirmed\",\n \"agenda.confirmations.confirm\": \"Confirm\",\n \"agenda.confirmations.cancel\": \"Cancel\",\n \"agenda.workingHours.title\": \"Working Hours\",\n \"agenda.workingHours.addPeriod\": \"Add period\",\n \"agenda.workingHours.loading\": \"Loading...\",\n \"agenda.appointment.addClient\": \"Add client\",\n \"agenda.appointment.addServiceFirst\": \"Add service\",\n \"agenda.appointment.addNotes\": \"Add notes\",\n \"agenda.appointment.duration\": \"Duration (minutes)\",\n \"agenda.appointment.price\": \"Price\",\n \"agenda.appointment.title\": \"Title\",\n \"agenda.appointment.addTitle\": \"Add a title\",\n \"agenda.appointment.untitled\": \"(no title)\",\n \"agenda.bookingType.appointment\": \"Appointment\",\n \"agenda.bookingType.event\": \"Event\",\n \"agenda.bookingType.task\": \"Task\",\n \"agenda.bookingType.out_of_office\": \"Out of Office\",\n \"agenda.bookingType.block\": \"Block\",\n \"agenda.settings.title\": \"Agenda Settings\",\n \"agenda.settings.slotDuration\": \"Slot Duration\",\n \"agenda.settings.bookingKind\": \"Booking Kind\",\n \"agenda.settings.dayStartTime\": \"Day Start Time\",\n \"agenda.settings.dayStartTimeDesc\": \"First hour shown on the calendar\",\n \"agenda.settings.dayEndTime\": \"Day End Time\",\n \"agenda.settings.dayEndTimeDesc\": \"Last hour shown on the calendar\",\n}\n","// agenda.* — merged plugin-own + saas-core central i18n\nexport const ptBR: Record<string, string> = {\n \"agenda.appointment.addDescription\": \"Adicionar descrição...\",\n \"agenda.appointment.addService\": \"Adicionar serviço\",\n \"agenda.appointment.cancel\": \"Cancelar\",\n \"agenda.appointment.clientTab\": \"Cliente\",\n \"agenda.appointment.noClientData\": \"Dados do cliente não disponíveis\",\n \"agenda.appointment.client\": \"Cliente\",\n \"agenda.appointment.conflict\": \"Conflito de horário — este profissional já está reservado neste horário.\",\n \"agenda.appointment.create\": \"Criar\",\n \"agenda.appointment.createClientFailed\": \"Falha ao criar cliente\",\n \"agenda.appointment.creating\": \"Criando...\",\n \"agenda.appointment.delete\": \"Excluir\",\n \"agenda.appointment.deleteConfirm\": \"Excluir este agendamento?\",\n \"agenda.appointment.confirmDelete\": \"Excluir\",\n \"agenda.appointment.deleting\": \"Excluindo…\",\n \"agenda.appointment.edit\": \"Editar Agendamento\",\n \"agenda.appointment.emailOptional\": \"E-mail (opcional)\",\n \"agenda.appointment.location\": \"Local\",\n \"agenda.appointment.name\": \"Nome\",\n \"agenda.appointment.new\": \"Novo Agendamento\",\n \"agenda.appointment.newClient\": \"Novo cliente\",\n \"agenda.appointment.notes\": \"Observações\",\n \"agenda.appointment.phone\": \"Telefone\",\n \"agenda.appointment.professional\": \"Profissional\",\n \"agenda.appointment.save\": \"Salvar\",\n \"agenda.appointment.saving\": \"Salvando...\",\n \"agenda.appointment.searchClient\": \"Buscar cliente...\",\n \"agenda.appointment.searchService\": \"Buscar serviço para adicionar...\",\n \"agenda.appointment.selectLocation\": \"Selecionar local...\",\n \"agenda.appointment.selectProfessional\": \"Selecionar profissional...\",\n \"agenda.appointment.services\": \"Serviços\",\n \"agenda.appointment.status\": \"Status\",\n \"agenda.appointment.to\": \"até\",\n \"agenda.appointment.total\": \"Total\",\n \"agenda.appointment.update\": \"Atualizar\",\n \"agenda.payment.title\": \"Recebimento\",\n \"agenda.payment.generateInvoice\": \"Gerar recebimento\",\n \"agenda.payment.generating\": \"Gerando…\",\n \"agenda.payment.pending\": \"Pendente\",\n \"agenda.payment.partial\": \"Parcial\",\n \"agenda.payment.paid\": \"Pago\",\n \"agenda.payment.collect\": \"Receber\",\n \"agenda.payment.overdue\": \"Vencido\",\n \"agenda.payment.cancelled\": \"Cancelado\",\n \"agenda.payment.none\": \"Recebimento\",\n \"agenda.payment.pay\": \"Pagar\",\n \"agenda.payment.paying\": \"Pagando…\",\n \"agenda.payment.remaining\": \"Restante\",\n \"agenda.payment.installment\": \"Parcela\",\n \"agenda.payment.total\": \"Total\",\n \"agenda.payment.noInvoice\": \"Sem recebimento gerado\",\n \"agenda.payment.selectAccount\": \"Selecionar conta\",\n \"agenda.payment.registerPayment\": \"Registrar recebimento\",\n \"agenda.payment.registerPaymentHint\": \"Registrar pagamento deste agendamento\",\n \"agenda.payment.pendingHint\": \"Fatura gerada, aguardando pagamento\",\n \"agenda.payment.partialHint\": \"Parcialmente pago, toque para completar\",\n \"agenda.payment.paidHint\": \"Pagamento realizado\",\n \"agenda.payment.overdueHint\": \"Pagamento vencido\",\n \"agenda.payment.backToAppointment\": \"Voltar ao agendamento\",\n \"agenda.payment.checkout\": \"Confirmar\",\n \"agenda.payment.checkingOut\": \"Processando…\",\n \"agenda.payment.serviceSummary\": \"Resumo do atendimento\",\n \"agenda.payment.paymentMethod\": \"Forma de pagamento\",\n \"agenda.payment.noMethods\": \"Nenhuma forma de pagamento configurada.\",\n \"agenda.payment.configureMethods\": \"Configurar formas de pagamento\",\n \"agenda.payment.checkoutComplete\": \"Pagamento confirmado\",\n \"agenda.payment.card\": \"Cartão\",\n \"agenda.payment.method\": \"Método\",\n \"agenda.payment.select\": \"Selecionar…\",\n \"agenda.payment.cardBrand\": \"Bandeira\",\n \"agenda.payment.selectBrand\": \"Selecionar bandeira…\",\n \"agenda.payment.cardInstallments\": \"Parcelas\",\n \"agenda.payment.bankAccount\": \"Conta\",\n \"agenda.payment.viewInvoice\": \"Ver detalhes da fatura\",\n \"agenda.calendar.agendas\": \"Agendas\",\n \"agenda.calendar.create\": \"Criar\",\n \"agenda.calendar.next\": \"Próximo\",\n \"agenda.calendar.previous\": \"Anterior\",\n \"agenda.calendar.status\": \"Status\",\n \"agenda.calendar.today\": \"Hoje\",\n \"agenda.calendar.viewAgenda\": \"Agenda\",\n \"agenda.calendar.viewDay\": \"Dia\",\n \"agenda.calendar.viewList\": \"Lista\",\n \"agenda.calendar.viewMonth\": \"Mês\",\n \"agenda.calendar.viewWeek\": \"Semana\",\n \"agenda.list.today\": \"Hoje\",\n \"agenda.list.tomorrow\": \"Amanhã\",\n \"agenda.list.empty\": \"Nenhum item próximo\",\n \"agenda.confirmations.confirmed\": \"Confirmado:\",\n \"agenda.confirmations.empty\": \"Nenhuma confirmação pendente\",\n \"agenda.confirmations.emptySubtitle\": \"Todos os agendamentos futuros foram confirmados\",\n \"agenda.confirmations.loading\": \"Carregando...\",\n \"agenda.confirmations.subtitle\": \"Agendamentos futuros pendentes de confirmação\",\n \"agenda.confirmations.unknownClient\": \"Cliente desconhecido\",\n \"agenda.confirmations.sendWhatsApp\": \"Enviar WhatsApp\",\n \"agenda.confirmations.call\": \"Ligar\",\n \"agenda.confirmations.markConfirmed\": \"Marcar Confirmado\",\n \"agenda.confirmations.markCancelled\": \"Marcar Cancelado\",\n \"agenda.cancellation.loadingReasons\": \"Carregando motivos...\",\n \"agenda.cancellation.notesOptional\": \"Observações do cancelamento (opcional)\",\n \"agenda.cancellation.notesRequired\": \"Observações do cancelamento obrigatórias\",\n \"agenda.cancellation.selectReason\": \"Selecionar motivo do cancelamento\",\n \"agenda.contextMenu.changeStatus\": \"Alterar status\",\n \"agenda.contextMenu.delete\": \"Excluir\",\n \"agenda.contextMenu.edit\": \"Editar\",\n \"agenda.contextMenu.notAvailable\": \"(indisponível)\",\n \"agenda.index.settingsSubtitle\": \"Horários de funcionamento, preferências de agendamento e confirmações\",\n \"agenda.index.settingsTitle\": \"Configurações da Agenda\",\n \"settings.plugin.agenda-working-hours\": \"Horário de Funcionamento\",\n \"agenda.popover.unknown\": \"Desconhecido\",\n \"agenda.settings.autoConfirm\": \"Confirmar Automaticamente\",\n \"agenda.settings.autoConfirmDesc\": \"Confirmar automaticamente novos agendamentos\",\n \"agenda.settings.autoCreateOrder\": \"Criar Pedido Automaticamente\",\n \"agenda.settings.autoCreateOrderDesc\": \"Criar automaticamente um pedido financeiro para novos agendamentos\",\n \"agenda.settings.blockOutside\": \"Bloquear Fora do Horário\",\n \"agenda.settings.blockOutsideDesc\": \"Impedir agendamentos fora do horário de funcionamento\",\n \"agenda.settings.calendarDisplay\": \"Exibição do Calendário\",\n \"agenda.settings.calendarDisplayDesc\": \"Configurações visuais do calendário\",\n \"agenda.settings.cancelAlerts\": \"Alertas de Cancelamento\",\n \"agenda.settings.cancelAlertsDesc\": \"Notificar quando um agendamento é cancelado\",\n \"agenda.settings.compact\": \"Modo Compacto\",\n \"agenda.settings.compactDesc\": \"Usar blocos de eventos menores\",\n \"agenda.settings.confirmations\": \"Confirmações\",\n \"agenda.settings.confirmationsDesc\": \"Configurações de confirmação de agendamento\",\n \"agenda.settings.conflictDetection\": \"Detecção de Conflitos\",\n \"agenda.settings.conflictDetectionDesc\": \"Alertar quando agendamentos se sobrepõem\",\n \"agenda.settings.dragDrop\": \"Arrastar e Soltar\",\n \"agenda.settings.dragDropDesc\": \"Permitir reagendamento arrastando eventos\",\n \"agenda.settings.enableConfirmations\": \"Habilitar Confirmações\",\n \"agenda.settings.enableConfirmationsDesc\": \"Exigir confirmação para novos agendamentos\",\n \"agenda.settings.enableLocation\": \"Habilitar Seleção de Local\",\n \"agenda.settings.enableLocationDesc\": \"Mostrar seletor de local no modal de agendamento\",\n \"agenda.settings.enableWorkingHours\": \"Habilitar Horário de Funcionamento\",\n \"agenda.settings.enableWorkingHoursDesc\": \"Mostrar sobreposição de horário de funcionamento no calendário\",\n \"agenda.settings.locations\": \"Locais\",\n \"agenda.settings.locationsDesc\": \"Configurações de múltiplos locais\",\n \"agenda.settings.newBookingNotif\": \"Alertas de Novo Agendamento\",\n \"agenda.settings.newBookingNotifDesc\": \"Notificar quando um novo agendamento é criado\",\n \"agenda.settings.noShowTracking\": \"Rastreamento de Ausências\",\n \"agenda.settings.noShowTrackingDesc\": \"Rastrear e alertar sobre ausências\",\n \"agenda.settings.notifications\": \"Notificações\",\n \"agenda.settings.notificationsDesc\": \"Preferências de notificação\",\n \"agenda.settings.reminder\": \"Lembretes\",\n \"agenda.settings.reminderDesc\": \"Enviar lembretes antes dos compromissos\",\n \"agenda.settings.scheduling\": \"Agendamento\",\n \"agenda.settings.schedulingDesc\": \"Configurar comportamento do agendamento\",\n \"agenda.settings.showCancelled\": \"Mostrar Cancelados\",\n \"agenda.settings.showCancelledDesc\": \"Exibir agendamentos cancelados no calendário\",\n \"agenda.settings.showNoShow\": \"Mostrar Ausências\",\n \"agenda.settings.showNoShowDesc\": \"Exibir ausências no calendário\",\n \"agenda.settings.workingHours\": \"Horário de Funcionamento\",\n \"agenda.settings.workingHoursDesc\": \"Horários e disponibilidade\",\n \"agenda.sidebar.agendas\": \"Agendas\",\n \"agenda.sidebar.allLocations\": \"Todos os locais\",\n \"agenda.sidebar.create\": \"Criar\",\n \"agenda.sidebar.location\": \"Local\",\n \"agenda.sidebar.status\": \"Status\",\n \"agenda.toolbar.next\": \"Próximo\",\n \"agenda.toolbar.previous\": \"Anterior\",\n \"agenda.toolbar.today\": \"Hoje\",\n \"agenda.workingHours.addBreak\": \"Adicionar intervalo\",\n \"agenda.workingHours.copyToAll\": \"Copiar para todos\",\n \"agenda.workingHours.dayOff\": \"Folga\",\n \"agenda.workingHours.removePeriod\": \"Remover período\",\n \"agenda.workingHours.professional\": \"Profissional\",\n \"agenda.workingHours.save\": \"Salvar\",\n \"agenda.workingHours.saveFailed\": \"Falha ao salvar\",\n \"agenda.workingHours.saved\": \"Horários de trabalho salvos\",\n \"agenda.workingHours.saving\": \"Salvando...\",\n \"agenda.workingHours.subtitle\": \"Gerenciar horários de trabalho por profissional\",\n \"agenda.workingHours.to\": \"até\",\n \"agenda.title\": \"Agenda\",\n \"agenda.calendar.title\": \"Calendário\",\n \"agenda.calendar.noScheduleConfirm\": \"Este horário não possui agenda aberta para este profissional. Deseja agendar mesmo assim?\",\n \"agenda.calendar.newAppointment\": \"Novo Agendamento\",\n \"agenda.booking.create\": \"Novo Agendamento\",\n \"agenda.booking.edit\": \"Editar Agendamento\",\n \"agenda.booking.delete\": \"Excluir Agendamento\",\n \"agenda.booking.deleteConfirm\": \"Tem certeza que deseja excluir este agendamento?\",\n \"agenda.booking.client\": \"Cliente\",\n \"agenda.booking.professional\": \"Profissional\",\n \"agenda.booking.services\": \"Serviços\",\n \"agenda.booking.date\": \"Data\",\n \"agenda.booking.time\": \"Horário\",\n \"agenda.booking.duration\": \"Duração\",\n \"agenda.booking.notes\": \"Observações\",\n \"agenda.booking.status\": \"Status\",\n \"agenda.booking.save\": \"Salvar Agendamento\",\n \"agenda.booking.saving\": \"Salvando...\",\n \"agenda.confirmations.title\": \"Confirmações\",\n \"agenda.confirmations.pending\": \"Confirmações Pendentes\",\n \"agenda.confirmations.emptyDescription\": \"Todos os agendamentos futuros foram confirmados\",\n \"agenda.confirmations.confirm\": \"Confirmar\",\n \"agenda.confirmations.cancel\": \"Cancelar\",\n \"agenda.workingHours.title\": \"Horário de Trabalho\",\n \"agenda.workingHours.addPeriod\": \"Adicionar período\",\n \"agenda.workingHours.loading\": \"Carregando...\",\n \"agenda.appointment.addClient\": \"Adicionar cliente\",\n \"agenda.appointment.addServiceFirst\": \"Adicionar serviço\",\n \"agenda.appointment.addNotes\": \"Adicionar observações\",\n \"agenda.appointment.duration\": \"Duração (minutos)\",\n \"agenda.appointment.price\": \"Preço\",\n \"agenda.appointment.title\": \"Título\",\n \"agenda.appointment.addTitle\": \"Adicionar um título\",\n \"agenda.appointment.untitled\": \"(sem título)\",\n \"agenda.bookingType.appointment\": \"Agendamento\",\n \"agenda.bookingType.event\": \"Evento\",\n \"agenda.bookingType.task\": \"Tarefa\",\n \"agenda.bookingType.out_of_office\": \"Ausência\",\n \"agenda.bookingType.block\": \"Bloqueio\",\n \"agenda.settings.title\": \"Configurações da Agenda\",\n \"agenda.settings.slotDuration\": \"Duração do Intervalo\",\n \"agenda.settings.bookingKind\": \"Tipo de Agendamento\",\n \"agenda.settings.dayStartTime\": \"Horário de Início\",\n \"agenda.settings.dayStartTimeDesc\": \"Primeiro horário exibido no calendário\",\n \"agenda.settings.dayEndTime\": \"Horário de Término\",\n \"agenda.settings.dayEndTimeDesc\": \"Último horário exibido no calendário\",\n}\n","import { en } from './en'\nimport { ptBR } from './pt-BR'\n\nexport const agendaLocales: Record<string, Record<string, string>> = {\n en,\n 'pt-BR': ptBR,\n}\n","// AUTO-GENERATED from 001_public_booking.sql — regenerate with scripts/embed-migrations.mjs\n// (kept in sync so the manifest can declare migrations as data, plugin-tasks pattern)\n\nexport const MIGRATION_001_PUBLIC_BOOKING = `-- ============================================================================\n-- plugin-agenda 001: booking read model + public (anon) booking surface\n--\n-- Ships the objects the agenda providers reference but the spine (packages/db\n-- migrations 001–008) does not define:\n-- §1 order_items columns the admin provider writes (duration/assignee)\n-- §2 public.v_bookings — admin read model (authenticated, RLS applies)\n-- §3 public.v_public_services — anon-readable service catalog\n-- §4 public.get_available_slots — anon RPC (mirrors the mock algorithm)\n-- §5 public.create_public_booking — anon RPC (validated, race-safe write)\n--\n-- Anon-access design: public booking pages run with the publishable key and no\n-- session, so the canonical tenant RLS yields nothing. Anon access is granted\n-- ONLY via the column-whitelisted view (§3) and SECURITY DEFINER RPCs (§4, §5)\n-- with tight input validation and hardcoded statuses.\n-- ============================================================================\n\n-- §1 — columns the agenda provider writes but 004_archetypes lacks\nALTER TABLE saas_core.order_items\n ADD COLUMN IF NOT EXISTS duration_minutes integer,\n ADD COLUMN IF NOT EXISTS assignee_id uuid REFERENCES saas_core.persons(id) ON DELETE SET NULL;\n\n-- Upsert key for public customers (per tenant, by normalized phone)\nCREATE UNIQUE INDEX IF NOT EXISTS persons_tenant_customer_phone\n ON saas_core.persons(tenant_id, phone)\n WHERE kind = 'customer' AND phone IS NOT NULL;\n\n-- Slot-conflict scan\nCREATE INDEX IF NOT EXISTS bookings_assignee_time\n ON saas_core.bookings(assignee_id, starts_at, ends_at)\n WHERE status NOT IN ('cancelled', 'no_show');\n\n-- §2 — admin read model (security_invoker → underlying RLS applies; anon sees 0 rows)\nCREATE OR REPLACE VIEW public.v_bookings\nWITH (security_invoker = true) AS\nSELECT\n b.id, b.tenant_id, b.kind, b.starts_at, b.ends_at, b.status, b.notes,\n b.order_id, b.location_id, b.metadata, b.created_at, b.updated_at,\n b.party_id AS client_id,\n COALESCE(pc.name, b.metadata->>'title') AS client_name,\n pc.phone AS client_phone,\n pc.email AS client_email,\n pc.avatar_url AS client_avatar_url,\n b.assignee_id AS professional_id,\n ps.name AS professional_name,\n ps.avatar_url AS professional_avatar_url,\n l.name AS location_name,\n o.total AS order_total,\n o.status AS order_status,\n (EXTRACT(EPOCH FROM (COALESCE(b.ends_at, b.starts_at) - b.starts_at))::int / 60)\n AS total_duration_minutes\nFROM saas_core.bookings b\nLEFT JOIN saas_core.persons pc ON pc.id = b.party_id\nLEFT JOIN saas_core.persons ps ON ps.id = b.assignee_id\nLEFT JOIN saas_core.locations l ON l.id = b.location_id\nLEFT JOIN saas_core.orders o ON o.id = b.order_id;\n\nGRANT SELECT ON public.v_bookings TO authenticated, service_role;\nREVOKE SELECT ON public.v_bookings FROM anon;\n\n-- §3 — anon-readable public catalog (owner-rights view = deliberate, whitelisted)\nCREATE OR REPLACE VIEW public.v_public_services AS\nSELECT\n s.id, s.tenant_id, s.name, s.description, s.price, s.currency,\n COALESCE(s.duration_minutes, 30) AS duration_minutes,\n s.image_url,\n COALESCE((s.metadata->>'sort_order')::int, 0) AS sort_order\nFROM saas_core.services s\nWHERE s.is_active AND s.status = 'active';\n\nGRANT SELECT ON public.v_public_services TO anon, authenticated, service_role;\n\n-- §4 — availability RPC (mirrors plugin-agenda/src/data/mock.ts getAvailableSlots)\nCREATE OR REPLACE FUNCTION public.get_available_slots(\n p_tenant_id uuid,\n p_date date,\n p_duration_minutes integer,\n p_assignee_id uuid DEFAULT NULL,\n p_slot_interval integer DEFAULT 30\n) RETURNS TABLE (slot_start timestamptz, slot_end timestamptz)\nLANGUAGE plpgsql STABLE SECURITY DEFINER\nSET search_path = saas_core, public\nAS $$\nDECLARE\n v_tz text;\nBEGIN\n -- tight validation: this function is anon-callable\n IF p_duration_minutes IS NULL OR p_duration_minutes NOT BETWEEN 5 AND 480 THEN\n RAISE EXCEPTION 'invalid duration';\n END IF;\n IF p_slot_interval IS NULL OR p_slot_interval NOT BETWEEN 5 AND 240 THEN\n RAISE EXCEPTION 'invalid interval';\n END IF;\n IF p_date IS NULL OR p_date < current_date OR p_date > current_date + 90 THEN\n RETURN;\n END IF;\n\n SELECT COALESCE(t.settings->>'timezone', 'America/Sao_Paulo') INTO v_tz\n FROM tenants t WHERE t.id = p_tenant_id;\n IF v_tz IS NULL THEN RETURN; END IF; -- unknown tenant → empty, not an error\n\n RETURN QUERY\n WITH day_schedules AS (\n SELECT sc.assignee_id, sc.starts_at AS win_start, sc.ends_at AS win_end\n FROM schedules sc\n WHERE sc.tenant_id = p_tenant_id\n AND sc.kind = 'working_hours'\n AND sc.is_active\n AND (p_assignee_id IS NULL OR sc.assignee_id = p_assignee_id)\n AND (\n sc.specific_date = p_date\n OR (sc.specific_date IS NULL AND sc.day_of_week = EXTRACT(dow FROM p_date)::smallint)\n )\n ),\n candidate AS (\n SELECT\n ds.assignee_id,\n gs AS s_start,\n gs + make_interval(mins => p_duration_minutes) AS s_end\n FROM day_schedules ds\n CROSS JOIN LATERAL generate_series(\n (p_date + ds.win_start) AT TIME ZONE v_tz,\n ((p_date + ds.win_end) AT TIME ZONE v_tz) - make_interval(mins => p_duration_minutes),\n make_interval(mins => p_slot_interval)\n ) AS gs\n )\n SELECT DISTINCT c.s_start, c.s_end\n FROM candidate c\n WHERE NOT EXISTS (\n SELECT 1 FROM bookings b\n WHERE b.tenant_id = p_tenant_id\n AND b.assignee_id = c.assignee_id\n AND b.status NOT IN ('cancelled', 'no_show')\n AND b.starts_at < c.s_end\n AND COALESCE(b.ends_at, b.starts_at) > c.s_start\n )\n ORDER BY 1;\nEND;\n$$;\n\nREVOKE ALL ON FUNCTION public.get_available_slots(uuid, date, integer, uuid, integer) FROM public;\nGRANT EXECUTE ON FUNCTION public.get_available_slots(uuid, date, integer, uuid, integer)\n TO anon, authenticated, service_role;\n\n-- §5 — public booking write RPC (validated, race-safe, hardcoded statuses)\nCREATE OR REPLACE FUNCTION public.create_public_booking(\n p_tenant_id uuid,\n p_service_id uuid,\n p_starts_at timestamptz,\n p_name text,\n p_phone text,\n p_email text DEFAULT NULL,\n p_notes text DEFAULT NULL\n) RETURNS TABLE (booking_id uuid, starts_at timestamptz, ends_at timestamptz)\nLANGUAGE plpgsql SECURITY DEFINER\nSET search_path = saas_core, public\nAS $$\nDECLARE\n v_service record;\n v_person_id uuid;\n v_assignee uuid;\n v_ends timestamptz;\n v_order uuid;\n v_booking uuid;\n v_phone text;\n v_tz text;\n v_notes text;\nBEGIN\n -- validation: anon-callable, everything tight\n IF p_name IS NULL OR length(trim(p_name)) NOT BETWEEN 2 AND 120 THEN\n RAISE EXCEPTION 'invalid name';\n END IF;\n v_phone := regexp_replace(COALESCE(p_phone, ''), '\\\\D', '', 'g');\n IF length(v_phone) NOT BETWEEN 8 AND 15 THEN\n RAISE EXCEPTION 'invalid phone';\n END IF;\n IF p_email IS NOT NULL AND (length(p_email) > 254 OR p_email !~ '^[^@\\\\s]+@[^@\\\\s]+\\\\.[^@\\\\s]+$') THEN\n RAISE EXCEPTION 'invalid email';\n END IF;\n v_notes := left(p_notes, 500);\n IF p_starts_at IS NULL OR p_starts_at <= now() OR p_starts_at > now() + interval '90 days' THEN\n RAISE EXCEPTION 'invalid start';\n END IF;\n\n SELECT s.id, s.name, s.price, COALESCE(s.duration_minutes, 30) AS duration_minutes\n INTO v_service\n FROM services s\n WHERE s.id = p_service_id AND s.tenant_id = p_tenant_id\n AND s.is_active AND s.status = 'active';\n IF NOT FOUND THEN RAISE EXCEPTION 'unknown service'; END IF;\n\n v_ends := p_starts_at + make_interval(mins => v_service.duration_minutes);\n SELECT COALESCE(t.settings->>'timezone', 'America/Sao_Paulo') INTO v_tz\n FROM tenants t WHERE t.id = p_tenant_id;\n IF v_tz IS NULL THEN RAISE EXCEPTION 'unknown tenant'; END IF;\n\n -- pick the assignee whose working hours cover the slot\n SELECT sc.assignee_id INTO v_assignee\n FROM schedules sc\n WHERE sc.tenant_id = p_tenant_id\n AND sc.kind = 'working_hours'\n AND sc.is_active\n AND (\n sc.specific_date = (p_starts_at AT TIME ZONE v_tz)::date\n OR (sc.specific_date IS NULL\n AND sc.day_of_week = EXTRACT(dow FROM p_starts_at AT TIME ZONE v_tz)::smallint)\n )\n AND (p_starts_at AT TIME ZONE v_tz)::time >= sc.starts_at\n AND (v_ends AT TIME ZONE v_tz)::time <= sc.ends_at\n ORDER BY sc.assignee_id\n LIMIT 1;\n IF v_assignee IS NULL THEN RAISE EXCEPTION 'slot outside working hours'; END IF;\n\n -- serialize per (tenant, assignee) to kill the double-book race\n PERFORM pg_advisory_xact_lock(hashtextextended(p_tenant_id::text || v_assignee::text, 0));\n\n IF EXISTS (\n SELECT 1 FROM bookings b\n WHERE b.tenant_id = p_tenant_id\n AND b.assignee_id = v_assignee\n AND b.status NOT IN ('cancelled', 'no_show')\n AND b.starts_at < v_ends\n AND COALESCE(b.ends_at, b.starts_at) > p_starts_at\n ) THEN\n RAISE EXCEPTION 'slot no longer available';\n END IF;\n\n -- anti-spam: cap open future public bookings per phone per tenant\n IF (\n SELECT count(*) FROM bookings b\n JOIN persons p ON p.id = b.party_id\n WHERE b.tenant_id = p_tenant_id\n AND p.phone = v_phone\n AND b.starts_at > now()\n AND b.status = 'scheduled'\n ) >= 3 THEN\n RAISE EXCEPTION 'too many open bookings for this phone';\n END IF;\n\n -- upsert the customer by (tenant, phone) — matches persons_tenant_customer_phone\n INSERT INTO persons (tenant_id, kind, name, phone, email, metadata)\n VALUES (p_tenant_id, 'customer', trim(p_name), v_phone, p_email,\n jsonb_build_object('source', 'public_booking'))\n ON CONFLICT (tenant_id, phone) WHERE kind = 'customer' AND phone IS NOT NULL\n DO UPDATE SET\n name = EXCLUDED.name,\n email = COALESCE(EXCLUDED.email, persons.email),\n updated_at = now()\n RETURNING id INTO v_person_id;\n\n -- order + booking + order_item (statuses hardcoded — caller cannot set)\n INSERT INTO orders (tenant_id, kind, status, party_id, assignee_id, subtotal, total, notes, metadata)\n VALUES (p_tenant_id, 'appointment', 'scheduled', v_person_id, v_assignee,\n v_service.price, v_service.price, v_notes,\n jsonb_build_object('source', 'public_booking',\n 'serviceNames', v_service.name,\n 'contactName', trim(p_name)))\n RETURNING id INTO v_order;\n\n INSERT INTO bookings (tenant_id, kind, party_id, assignee_id, order_id,\n starts_at, ends_at, status, notes, metadata)\n VALUES (p_tenant_id, 'appointment', v_person_id, v_assignee, v_order,\n p_starts_at, v_ends, 'scheduled', v_notes,\n jsonb_build_object('source', 'public_booking', 'serviceNames', v_service.name))\n RETURNING id INTO v_booking;\n\n INSERT INTO order_items (order_id, service_id, name, quantity, unit_price, total,\n sort_order, duration_minutes, assignee_id)\n VALUES (v_order, v_service.id, v_service.name, 1, v_service.price, v_service.price,\n 0, v_service.duration_minutes, v_assignee);\n\n RETURN QUERY SELECT v_booking, p_starts_at, v_ends;\nEND;\n$$;\n\nREVOKE ALL ON FUNCTION public.create_public_booking(uuid, uuid, timestamptz, text, text, text, text) FROM public;\nGRANT EXECUTE ON FUNCTION public.create_public_booking(uuid, uuid, timestamptz, text, text, text, text)\n TO anon, authenticated, service_role;\n`\n","// ---------------------------------------------------------------------------\n// Bridge factory: adapts FinancialDataProvider → AgendaFinancialBridge\n// Consumer apps call this at plugin wiring time.\n// ---------------------------------------------------------------------------\n\nimport type { FinancialDataProvider } from '@fayz-ai/plugin-financial'\nimport type { AgendaFinancialBridge, BookingPaymentSummary, BookingPaymentDetail, BookingPaymentStatus } from '../financial-bridge'\nimport { getSupabaseClientOptional } from '@fayz-ai/core'\n\n/**\n * Pure commission math: percentage of a realized order total, rounded to cents.\n * Exported for unit-testing and reuse; the bridge method below wraps the I/O.\n * Returns 0 for a non-positive base or rate so callers can skip empty accruals.\n */\nexport function computeCommissionAmount(total: number, ratePercent: number): number {\n const base = Number(total) || 0\n const rate = Number(ratePercent) || 0\n if (base <= 0 || rate <= 0) return 0\n return Math.round(base * (rate / 100) * 100) / 100\n}\n\nfunction computeStatus(movements: Array<{ status: string }>): BookingPaymentStatus {\n if (movements.length === 0) return 'none'\n const allPaid = movements.every((m) => m.status === 'paid')\n if (allPaid) return 'paid'\n const allCancelled = movements.every((m) => m.status === 'cancelled')\n if (allCancelled) return 'cancelled'\n const anyOverdue = movements.some((m) => m.status === 'overdue')\n if (anyOverdue) return 'overdue'\n const anyPaid = movements.some((m) => m.status === 'paid' || m.status === 'partial')\n if (anyPaid) return 'partial'\n return 'pending'\n}\n\n/**\n * Create an AgendaFinancialBridge backed by the financial plugin's data provider.\n *\n * @example\n * const financialProvider = createSupabaseFinancialProvider()\n * const agenda = createAgendaPlugin({\n * financialBridge: createFinancialBridge(financialProvider),\n * })\n */\nexport function createFinancialBridge(provider: FinancialDataProvider): AgendaFinancialBridge {\n return {\n async resolvePaymentStatuses(orderIds: string[]): Promise<Map<string, BookingPaymentSummary>> {\n const result = new Map<string, BookingPaymentSummary>()\n if (orderIds.length === 0) return result\n\n // Single batch query instead of N individual getInvoiceById calls\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return result\n\n try {\n const [{ data: orders }, { data: movements }] = await Promise.all([\n supabase\n .schema('saas_core')\n .from('orders')\n .select('id, kind, status, total, reference_number, metadata')\n .in('id', orderIds),\n supabase\n .from('financial_movements')\n .select('invoice_id, status, paid_amount')\n .in('invoice_id', orderIds),\n ])\n\n const movementsByOrderId = new Map<string, Array<{ status: string; paid_amount: number }>>()\n for (const movement of movements ?? []) {\n const invoiceId = movement.invoice_id as string | undefined\n if (!invoiceId) continue\n movementsByOrderId.set(invoiceId, [...(movementsByOrderId.get(invoiceId) ?? []), movement])\n }\n\n for (const order of orders ?? []) {\n const orderMovements = movementsByOrderId.get(order.id) ?? []\n const meta = (order.metadata ?? {}) as Record<string, unknown>\n const paidAmount = orderMovements.length > 0\n ? orderMovements.reduce((sum, movement) => sum + (Number(movement.paid_amount) || 0), 0)\n : Number(meta.paidAmount) || 0\n\n result.set(order.id, {\n invoiceId: order.id,\n referenceNumber: order.reference_number as string | undefined,\n status: orderMovements.length > 0 ? computeStatus(orderMovements) : mapInvoiceStatus(order.status as string),\n totalAmount: Number(order.total) || 0,\n paidAmount,\n })\n }\n } catch { /* non-blocking */ }\n\n return result\n },\n\n async getPaymentDetail(orderId: string): Promise<BookingPaymentDetail | null> {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return null\n\n // Single query: get order + movements in parallel\n const [orderRes, movRes] = await Promise.all([\n supabase.schema('saas_core').from('orders').select('id, status, total, reference_number, metadata').eq('id', orderId).single(),\n supabase.from('financial_movements').select('*').eq('invoice_id', orderId).order('due_date'),\n ])\n\n const order = orderRes.data\n if (!order) return null\n const meta = (order.metadata ?? {}) as Record<string, unknown>\n\n // Collect unique payment_method_type_ids to resolve names in one query\n const typeIds = [...new Set((movRes.data ?? []).map((m: any) => m.payment_method_type_id).filter(Boolean))]\n let typeNames: Record<string, string> = {}\n if (typeIds.length > 0) {\n const { data: types } = await supabase.from('payment_method_types').select('id, name').in('id', typeIds)\n typeNames = Object.fromEntries((types ?? []).map((t: any) => [t.id, t.name]))\n }\n\n const movements = (movRes.data ?? []).map((m: Record<string, unknown>) => ({\n id: String(m.id),\n amount: Number(m.amount) || 0,\n paidAmount: Number(m.paid_amount) || 0,\n status: String(m.status ?? 'pending'),\n dueDate: String(m.due_date ?? ''),\n installmentNumber: m.installment_number != null ? Number(m.installment_number) : undefined,\n paymentDate: m.payment_date ? String(m.payment_date) : undefined,\n paymentMethodTypeName: m.payment_method_type_id ? typeNames[String(m.payment_method_type_id)] : undefined,\n cardBrand: m.card_brand ? String(m.card_brand) : undefined,\n cardInstallments: m.card_installments ? Number(m.card_installments) : undefined,\n }))\n\n return {\n invoiceId: order.id,\n referenceNumber: order.reference_number as string | undefined,\n status: movements.length > 0 ? computeStatus(movements) : mapInvoiceStatus(order.status as string),\n totalAmount: Number(order.total) || 0,\n paidAmount: Number(meta.paidAmount) || 0,\n movements,\n }\n },\n\n async createInvoiceFromOrder(orderId: string, options?: {\n installments?: number\n dueDate?: string\n paymentMethodTypeId?: string\n }): Promise<string> {\n // Promote the existing order to an invoice_receivable atomically via the\n // shared DB function (ref + stage/direction + N installments, idempotent).\n // status='invoiced' is valid for appointment/service_order (CHECK).\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) throw new Error('Supabase not available')\n const { error } = await supabase.rpc('fn_invoice_from_order', {\n p_order_id: orderId,\n p_due_date: options?.dueDate ?? null,\n p_status: 'invoiced',\n p_installments: options?.installments ?? 1,\n p_direction: 'credit',\n })\n if (error) throw new Error(error.message)\n return orderId\n },\n\n async payMovement(input) {\n await provider.payMovement({\n movementId: input.movementId,\n amount: input.amount,\n paymentDate: input.paymentDate,\n paymentMethodTypeId: input.paymentMethodTypeId,\n paymentMethodId: input.paymentMethodId,\n bankAccountId: input.bankAccountId,\n cardBrand: input.cardBrand,\n cardInstallments: input.cardInstallments,\n })\n },\n\n async createCommissionMovement(orderId, options) {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return null\n\n // Order carries the assigned professional (assignee_id) and realized total.\n const { data: order } = await supabase\n .schema('saas_core')\n .from('orders')\n .select('id, tenant_id, assignee_id, total')\n .eq('id', orderId)\n .single()\n if (!order || !order.assignee_id) return null // no professional → no commission\n\n // Per-professional rate lives on staff_members, surfaced via v_staff (id = person id).\n const { data: staff } = await supabase\n .from('v_staff')\n .select('commission_rate')\n .eq('id', order.assignee_id)\n .single()\n\n const rate = Number(staff?.commission_rate) || 0\n const base = Number(order.total) || 0\n const amount = computeCommissionAmount(base, rate)\n if (amount <= 0) return null // nothing configured/realized to accrue\n\n // Idempotent: one commission accrual per order. Reuse if already present.\n const { data: existing } = await supabase\n .from('financial_movements')\n .select('id')\n .eq('invoice_id', orderId)\n .eq('movement_kind', 'commission')\n .limit(1)\n if (existing && existing.length > 0) return existing[0].id as string\n\n const dueDate = options?.dueDate ?? new Date().toISOString().slice(0, 10)\n\n const { data: inserted } = await supabase\n .from('financial_movements')\n .insert({\n tenant_id: order.tenant_id,\n invoice_id: orderId,\n direction: 'debit', // payable to the professional\n movement_kind: 'commission',\n amount,\n paid_amount: 0,\n status: 'pending',\n due_date: dueDate,\n metadata: {\n source: 'agenda',\n kind: 'commission',\n professionalId: order.assignee_id,\n commissionRate: rate,\n baseAmount: base,\n },\n })\n .select('id')\n .single()\n\n return (inserted?.id as string | undefined) ?? null\n },\n\n async checkout(orderId, input) {\n // 1. Create invoice (single installment, due today)\n const today = new Date().toISOString().slice(0, 10)\n const invoiceId = await this.createInvoiceFromOrder(orderId, { installments: 1, dueDate: today })\n\n // 2. Get the created movement\n const detail = await this.getPaymentDetail(invoiceId)\n if (!detail || detail.movements.length === 0) throw new Error('No movement created')\n\n const movement = detail.movements[0]\n\n // 3. Pay it in full\n await this.payMovement({\n movementId: movement.id,\n amount: movement.amount,\n paymentDate: today,\n paymentMethodTypeId: input.paymentMethodTypeId,\n paymentMethodId: input.paymentMethodId,\n bankAccountId: input.bankAccountId,\n cardBrand: input.cardBrand,\n cardInstallments: input.cardInstallments,\n })\n\n // 4. Return updated detail\n return (await this.getPaymentDetail(invoiceId))!\n },\n\n async getPaymentMethodTypes() {\n const types = await provider.getPaymentMethodTypes()\n return types.map((t: any) => ({ id: t.id, name: t.name, transactionType: t.transactionType }))\n },\n\n async getBankAccounts() {\n const accounts = await provider.getBankAccounts()\n return accounts\n .filter((a: any) => a.isActive)\n .map((a: any) => ({ id: a.id, name: a.name, accountType: a.accountType }))\n },\n\n async getPaymentMethods(paymentMethodTypeId: string) {\n const methods = await provider.getPaymentMethods()\n return methods\n .filter((m: any) => m.paymentMethodTypeId === paymentMethodTypeId && m.isActive)\n .map((m: any) => ({ id: m.id, name: m.name }))\n },\n }\n}\n\nfunction mapInvoiceStatus(status: string): BookingPaymentStatus {\n switch (status) {\n case 'paid': return 'paid'\n case 'partial': return 'partial'\n case 'overdue': return 'overdue'\n case 'cancelled': return 'cancelled'\n case 'invoiced': return 'pending'\n case 'pending': return 'pending'\n case 'scheduled': return 'none'\n case 'confirmed': return 'none'\n case 'in_progress': return 'none'\n case 'completed': return 'none'\n case 'no_show': return 'none'\n case 'booked': return 'none'\n default: return 'pending'\n }\n}\n","// Google Calendar integration (control plane) — Supabase client.\n//\n// Thin client: reads/writes the calendar_integrations row and invokes the\n// google-calendar-sync edge function for OAuth connect + manual sync. The\n// function holds the OAuth client secret and does the Calendar API work.\nimport { getSupabaseClientOptional } from '@fayz-ai/core'\nimport type { CalendarIntegration, CalendarSyncLogEntry } from '../types'\n\nconst FUNCTION = 'google-calendar-sync'\n\nfunction sb() {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) throw new Error('Supabase not initialized')\n return supabase\n}\n\nexport interface GoogleCalendarProvider {\n getIntegration(): Promise<CalendarIntegration | null>\n /** Start the OAuth connect flow — returns the Google consent URL to redirect to. */\n getConnectUrl(redirectTo?: string): Promise<string>\n setCalendar(calendarId: string): Promise<void>\n disconnect(): Promise<void>\n /** Manually pull external changes now (inbound). */\n syncNow(): Promise<{ fetched: number; written: number }>\n getSyncLog(): Promise<CalendarSyncLogEntry[]>\n}\n\nexport function createGoogleCalendarProvider(): GoogleCalendarProvider {\n return {\n async getIntegration() {\n const { data } = await sb().from('calendar_integrations').select('*').eq('provider', 'google').limit(1).maybeSingle()\n if (!data) return null\n return {\n id: data.id,\n provider: data.provider,\n calendarId: data.calendar_id ?? 'primary',\n active: data.active ?? true,\n connected: !!data.oauth_refresh_token,\n lastSyncAt: data.last_sync_at ?? undefined,\n }\n },\n\n async getConnectUrl(redirectTo) {\n const { data, error } = await sb().functions.invoke(FUNCTION, {\n body: { action: 'oauth_start', redirectTo: redirectTo ?? window.location.href },\n })\n if (error) throw new Error(error.message)\n return (data as { url: string }).url\n },\n\n async setCalendar(calendarId) {\n await sb().from('calendar_integrations').update({ calendar_id: calendarId, updated_at: new Date().toISOString() }).eq('provider', 'google')\n },\n\n async disconnect() {\n await sb().from('calendar_integrations').update({ active: false, oauth_refresh_token: null, oauth_access_token: null }).eq('provider', 'google')\n },\n\n async syncNow() {\n const { data, error } = await sb().functions.invoke(FUNCTION, { body: { action: 'pull_events', trigger: 'manual' } })\n if (error) throw new Error(error.message)\n return data as { fetched: number; written: number }\n },\n\n async getSyncLog() {\n const { data } = await sb().from('calendar_sync_log').select('*').order('created_at', { ascending: false }).limit(20)\n return (data ?? []).map((r: any) => ({\n id: r.id, direction: r.direction, trigger: r.trigger ?? undefined,\n status: r.status, fetched: r.fetched ?? 0, written: r.written ?? 0,\n error: r.error ?? undefined, createdAt: r.created_at,\n }))\n },\n }\n}\n","// Google Calendar as a unified ConnectorDefinition.\n//\n// Surfaces inside plugin-agenda's settings → Integrations tab (the host),\n// rendered by the shared ConnectorsHub. The hub handles the OAuth connect/\n// disconnect; the ExtraPanel below adds the calendar picker, manual sync and\n// run history (only meaningful once connected).\nimport React, { useEffect, useState } from 'react'\nimport { RefreshCw, History, CheckCircle2, AlertCircle, Loader2 } from 'lucide-react'\nimport { Button, toast } from '@fayz-ai/ui'\nimport type { ConnectorDefinition } from '@fayz-ai/core'\nimport { createGoogleCalendarProvider } from './data/supabase'\nimport type { CalendarSyncLogEntry } from './types'\n\nconst provider = createGoogleCalendarProvider()\n\nfunction GoogleCalendarExtraPanel() {\n const [connected, setConnected] = useState(false)\n const [calendarId, setCalendarId] = useState('primary')\n const [syncing, setSyncing] = useState(false)\n const [log, setLog] = useState<CalendarSyncLogEntry[]>([])\n const [loaded, setLoaded] = useState(false)\n\n async function load() {\n const integ = await provider.getIntegration()\n setConnected(!!integ?.connected)\n if (integ) { setCalendarId(integ.calendarId); void provider.getSyncLog().then(setLog) }\n setLoaded(true)\n }\n useEffect(() => { void load() }, [])\n\n // Before connecting there's nothing to configure here.\n if (!loaded || !connected) return null\n\n async function handleSaveCalendar() {\n await provider.setCalendar(calendarId)\n toast.success('Saved')\n }\n async function handleSyncNow() {\n setSyncing(true)\n try { const r = await provider.syncNow(); toast.success(`Synced — ${r.written} updated`); void provider.getSyncLog().then(setLog) }\n catch (e: any) { toast.error(e?.message ?? 'Sync failed') }\n finally { setSyncing(false) }\n }\n\n return (\n <div className=\"space-y-4 border-t pt-4\">\n <div className=\"flex flex-wrap items-end gap-3\">\n <label className=\"block flex-1 min-w-[200px]\">\n <span className=\"text-xs font-medium text-muted-foreground\">Calendar ID</span>\n <input value={calendarId} onChange={(e) => setCalendarId(e.target.value)} placeholder=\"primary\"\n className=\"w-full mt-1 rounded-input border border-input bg-card px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring\" />\n </label>\n <Button variant=\"outline\" size=\"sm\" onClick={handleSaveCalendar}>Save</Button>\n <Button variant=\"outline\" size=\"sm\" onClick={handleSyncNow} disabled={syncing}>\n <RefreshCw className={`h-3.5 w-3.5 ${syncing ? 'animate-spin' : ''}`} /> Sync now\n </Button>\n </div>\n\n {log.length > 0 && (\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2\"><History className=\"h-4 w-4 text-muted-foreground\" /><h4 className=\"text-sm font-semibold\">History</h4></div>\n <div className=\"rounded-md border divide-y text-sm\">\n {log.map((r) => (\n <div key={r.id} className=\"flex items-center gap-3 px-3 py-2\">\n <span className=\"text-muted-foreground text-xs\">{new Date(r.createdAt).toLocaleString()}</span>\n <span className=\"text-[10px] uppercase tracking-wide px-1 py-px rounded bg-muted text-muted-foreground\">{r.direction}</span>\n <span className=\"ml-auto text-xs\">{r.written} written / {r.fetched} fetched</span>\n {r.status === 'success'\n ? <CheckCircle2 className=\"h-3.5 w-3.5 text-success\" />\n : <AlertCircle className=\"h-3.5 w-3.5 text-warning\" />}\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n )\n}\n\nexport const googleCalendarConnectorDef: ConnectorDefinition = {\n id: 'google-calendar',\n hostPluginId: 'agenda',\n name: 'Google Calendar',\n description: 'Two-way sync between your bookings and Google Calendar.',\n icon: 'Calendar',\n authKind: 'oauth',\n async getStatus() {\n const integ = await provider.getIntegration()\n return { connected: !!integ?.connected }\n },\n startOAuth: (redirectTo) => provider.getConnectUrl(redirectTo),\n disconnect: () => provider.disconnect(),\n ExtraPanel: GoogleCalendarExtraPanel,\n}\n","// Google Calendar connector descriptor (control-plane metadata).\n//\n// Declares the connector against the SDK integration spine so the platform can\n// reason about what it syncs. The actual data-plane verbs run in the\n// google-calendar-sync edge function; this is the typed contract + capabilities.\nimport type { Connector } from '@fayz-ai/core'\n\nexport const googleCalendarConnector: Connector = {\n id: 'google-calendar',\n provider: 'google',\n pluginId: 'agenda',\n authKind: 'oauth',\n capabilities: [\n {\n entity: 'booking',\n direction: 'bidirectional',\n triggers: ['on-write', 'scheduled', 'webhook'],\n },\n ],\n}\n","// Booking ↔ Google Calendar event mapping (pure helpers).\n//\n// Shared shape used both by the SDK (docs/tests) and mirrored by the edge\n// function. Keeping it pure makes the field decisions reviewable in one place.\nimport type { CalendarBooking } from '../../types'\nimport type { GCalEvent } from './types'\n\nexport interface GCalEventInput {\n summary: string\n description?: string\n start: { dateTime: string; timeZone?: string }\n end: { dateTime: string; timeZone?: string }\n}\n\n/** Build the event title from the booking's services + client. */\nexport function bookingSummary(b: Pick<CalendarBooking, 'services' | 'clientName'>): string {\n const services = (b.services ?? []).map((s) => s.name).filter(Boolean).join(', ')\n const who = b.clientName ?? ''\n if (services && who) return `${services} — ${who}`\n return services || who || 'Appointment'\n}\n\n/** Map a Fayz booking to a Google Calendar event input. Returns null when the booking has no end. */\nexport function bookingToEvent(b: CalendarBooking, timeZone?: string): GCalEventInput | null {\n if (!b.startsAt || !b.endsAt) return null\n const notes = [b.notes, b.professionalName ? `Pro: ${b.professionalName}` : '', b.locationName ?? '']\n .filter(Boolean).join('\\n')\n return {\n summary: bookingSummary(b),\n description: notes || undefined,\n start: { dateTime: b.startsAt, timeZone },\n end: { dateTime: b.endsAt, timeZone },\n }\n}\n\n/** Map an inbound Google event change to a partial booking update (reschedule/cancel). */\nexport function eventToBookingPatch(ev: GCalEvent): { startsAt?: string; endsAt?: string; status?: 'cancelled' } {\n if (ev.status === 'cancelled') return { status: 'cancelled' }\n return {\n startsAt: ev.start?.dateTime,\n endsAt: ev.end?.dateTime,\n }\n}\n","// Google Calendar integration — official (in-SDK) addon for plugin-agenda.\n//\n// Settings-only PluginManifest: contributes a \"Google Calendar\" tab to /settings\n// for connecting an account and running a manual sync. Outbound (booking →\n// Google) is automatic via a DB trigger; inbound (Google → booking) via pg_cron\n// or a Google watch webhook. The data plane is the google-calendar-sync edge\n// function (see ./functions/google-calendar-sync). The booking↔event link lives\n// on saas_core.bookings.metadata.googleCalendarEventId.\n//\n// Graduation path: extract to its own `@fayz-ai/plugin-google-calendar` package.\nimport type { PluginManifest } from '@fayz-ai/core'\nimport { googleCalendarConnectorDef } from './connectorDef'\n\nexport { createGoogleCalendarProvider } from './data/supabase'\nexport { googleCalendarConnector } from './connector'\nexport { googleCalendarConnectorDef } from './connectorDef'\nexport { bookingToEvent, eventToBookingPatch, bookingSummary } from './mapping'\nexport * from './types'\n\n// Addon plugin: contributes the Google Calendar connector into its host\n// (plugin-agenda). It appears in Agenda settings → Integrations — no top-level\n// settings tab of its own. See packages/saas ConnectorsHub.\nexport function createGoogleCalendarPlugin(): PluginManifest {\n return {\n id: 'google-calendar',\n name: 'Google Calendar',\n icon: 'Calendar',\n version: '0.1.0',\n scope: 'addon',\n defaultEnabled: true,\n dependencies: ['agenda'],\n navigation: [],\n routes: [],\n connectors: [googleCalendarConnectorDef],\n }\n}\n","import React from 'react'\nimport type { PluginManifest } from '@fayz-ai/core'\nimport { createSafeDataProvider, registerTranslations } from '@fayz-ai/core'\nimport type { AgendaPluginOptions } from './config'\nimport { resolveConfig } from './config'\nimport { AgendaPage } from './AgendaPage'\nimport { createSupabaseAgendaProvider } from './data/supabase'\nimport { createMockAgendaProvider } from './data/mock'\nimport { setAgendaTenantId } from './lib/tenant'\nimport { createAgendaStore } from './store'\nimport { agendaRegistries } from './registries'\nimport { AgendaGeneralSettings } from './components/AgendaGeneralSettings'\nimport { agendaLocales } from './locales'\nimport { MIGRATION_001_PUBLIC_BOOKING } from './migrations'\nimport { setScheduleBlockConfig, getScheduleBlockConfig, PluginSettingsPanel } from '@fayz-ai/saas'\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createAgendaPlugin(options?: AgendaPluginOptions): PluginManifest {\n const config = resolveConfig(options)\n registerTranslations(agendaLocales)\n const provider = options?.dataProvider ?? createSafeDataProvider(\n () => createSupabaseAgendaProvider(),\n () => createMockAgendaProvider(),\n )\n const store = createAgendaStore(provider, options?.financialBridge)\n const registries = [...agendaRegistries, ...(options?.settingsRegistries ?? [])]\n\n // Register schedule block config globally so ScheduleEditor can read it\n setScheduleBlockConfig({\n defaults: config.scheduleBlockDefaults,\n showServices: !!config.serviceLookup,\n showConcurrent: true,\n showBookingWindow: true,\n showLocations: config.modules.locationSelection,\n locations: config.locations.map((l) => ({ id: l.id, name: l.name })),\n // Lazy fetcher — called by ScheduleEditor when locations are needed but empty\n fetchLocations: config.modules.locationSelection && provider.getLocations\n ? async () => {\n const locations = await provider.getLocations!()\n const current = getScheduleBlockConfig()\n if (current) setScheduleBlockConfig({ ...current, locations })\n return locations\n }\n : undefined,\n })\n\n const PageComponent: React.FC<any> = () =>\n React.createElement(AgendaPage, { config, provider, store })\n\n return {\n id: 'agenda',\n name: config.labels.pageTitle,\n icon: 'Calendar',\n version: '1.0.0',\n scope: options?.scope ?? 'universal',\n verticalId: options?.verticalId,\n // Booking/scheduling is business-ops (clinic, salon, services) — targets\n // the saas/admin Panel world, not the ecommerce storefront.\n scaffolds: ['saas'],\n defaultEnabled: true,\n dependencies: [],\n declaredFeatures: [\n { id: 'appointments', label: config.labels.pageTitle, group: config.labels.pageTitle },\n { id: 'agenda.schedules', label: 'Schedule Management', group: config.labels.pageTitle },\n ],\n\n navigation: [\n {\n section: options?.navSection ?? 'main',\n position: options?.navPosition ?? 2,\n label: config.labels.pageTitle,\n route: '/agenda',\n icon: 'Calendar',\n permission: { feature: 'appointments', action: 'read' as const },\n },\n ],\n\n routes: [\n {\n path: '/agenda',\n component: PageComponent,\n permission: { feature: 'appointments', action: 'read' as const },\n },\n ],\n\n widgets: [],\n\n aiTools: [\n {\n id: 'agenda.list-appointments',\n name: 'listAppointments',\n description: 'Lists upcoming appointments for a given date or date range, optionally filtered by professional.',\n icon: 'Calendar',\n mode: 'read' as const,\n category: 'Scheduling',\n parameters: {\n type: 'object' as const,\n properties: {\n date: { type: 'string' as const, description: 'Date (YYYY-MM-DD) or \"today\", \"tomorrow\", \"this week\"' },\n professional: { type: 'string' as const, description: 'Professional name to filter by' },\n },\n },\n suggestions: [\n { label: \"What's on the agenda today?\" },\n { label: 'Show me tomorrow\\'s appointments' },\n { label: 'Who has the most bookings this week?' },\n ],\n permission: { feature: 'appointments', action: 'read' as const },\n },\n {\n id: 'agenda.create-appointment',\n name: 'createAppointment',\n description: 'Creates a new appointment for a client with a specific professional and service.',\n icon: 'CalendarPlus',\n mode: 'persist' as const,\n category: 'Scheduling',\n parameters: {\n type: 'object' as const,\n properties: {\n client: { type: 'string' as const, description: 'Client name' },\n professional: { type: 'string' as const, description: 'Professional name' },\n service: { type: 'string' as const, description: 'Service name' },\n date: { type: 'string' as const, description: 'Date (YYYY-MM-DD)' },\n time: { type: 'string' as const, description: 'Time (HH:MM)' },\n },\n required: ['client', 'professional', 'service', 'date', 'time'],\n },\n suggestions: [\n { label: 'Book a haircut for Sarah tomorrow at 10am' },\n ],\n permission: { feature: 'appointments', action: 'create' as const },\n },\n {\n id: 'agenda.check-availability',\n name: 'checkAvailability',\n description: 'Checks available time slots for a professional on a given date.',\n icon: 'Clock',\n mode: 'read' as const,\n category: 'Scheduling',\n parameters: {\n type: 'object' as const,\n properties: {\n professional: { type: 'string' as const, description: 'Professional name' },\n date: { type: 'string' as const, description: 'Date (YYYY-MM-DD) or \"today\", \"tomorrow\"' },\n duration: { type: 'number' as const, description: 'Required duration in minutes' },\n },\n required: ['professional', 'date'],\n },\n suggestions: [\n { label: 'When is Ana available tomorrow?' },\n { label: 'Find a 90-minute slot for Carlos this week' },\n ],\n permission: { feature: 'appointments', action: 'read' as const },\n },\n ],\n\n registries,\n\n settings: [\n {\n id: 'agenda',\n label: 'Agenda',\n icon: 'Calendar',\n // Standard layout: General | Integrations (Google Calendar addon) | Properties.\n component: (() => {\n const AgendaSettingsTab: React.FC = () => React.createElement(PluginSettingsPanel, {\n title: 'Agenda',\n generalSettings: React.createElement(AgendaGeneralSettings),\n registries,\n hostPluginId: 'agenda',\n routeBase: '/settings/agenda',\n })\n AgendaSettingsTab.displayName = 'AgendaSettingsTab'\n return AgendaSettingsTab as unknown as React.ComponentType<unknown>\n })(),\n order: 5,\n permission: { feature: 'appointments', action: 'read' as const },\n },\n ],\n migrations: [\n {\n id: 'agenda-001-public-booking',\n version: '0.3.0',\n sql: MIGRATION_001_PUBLIC_BOOKING,\n description:\n 'Booking read model (v_bookings) + anon public booking surface (v_public_services, get_available_slots, create_public_booking) + order_items duration/assignee columns',\n },\n ],\n\n locales: agendaLocales,\n }\n}\n\n// Re-export types for consumers\nexport type { AgendaPluginOptions } from './config'\nexport type { ResolvedAgendaConfig } from './config'\nexport type { AgendaDataProvider } from './data/types'\n// Seedable in-memory provider — apps pass a seed to render the calendar with\n// app-specific events instead of the built-in salon sample.\nexport { createMockAgendaProvider } from './data/mock'\nexport type { MockAgendaSeed, MockAgendaProviderOptions } from './data/mock'\nexport type { AgendaFinancialBridge, BookingPaymentStatus, BookingPaymentSummary, BookingPaymentDetail } from './financial-bridge'\nexport { createFinancialBridge, computeCommissionAmount } from './bridges/create-financial-bridge'\n\n// Google Calendar integration (official addon) — settings-only plugin + helpers\nexport { createGoogleCalendarPlugin, createGoogleCalendarProvider, googleCalendarConnector, bookingToEvent, eventToBookingPatch } from './integrations/google-calendar'\n"]}