@spacesync/client 0.1.9 → 0.1.11

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 (129) hide show
  1. package/dist/analog-clock-picker.js +3 -11
  2. package/dist/analog-clock-picker.js.map +1 -1
  3. package/dist/booking-schedule-calendars.d.ts +1 -29
  4. package/dist/booking-schedule-calendars.js +6 -92
  5. package/dist/booking-schedule-calendars.js.map +1 -1
  6. package/dist/booking-schedule.d.ts +71 -0
  7. package/dist/booking-schedule.js +3 -0
  8. package/dist/booking-schedule.js.map +1 -0
  9. package/dist/booking-space-layout-picker.js +8 -11
  10. package/dist/booking-space-layout-picker.js.map +1 -1
  11. package/dist/button-Iem7kbk0.d.ts +16 -0
  12. package/dist/chat-stick-to-bottom.js +0 -10
  13. package/dist/chat-stick-to-bottom.js.map +1 -1
  14. package/dist/chunk-2IZODKTR.js +116 -0
  15. package/dist/chunk-2IZODKTR.js.map +1 -0
  16. package/dist/chunk-2TT2ZGMT.js +21 -0
  17. package/dist/chunk-2TT2ZGMT.js.map +1 -0
  18. package/dist/chunk-3MAGTCCN.js +192 -0
  19. package/dist/chunk-3MAGTCCN.js.map +1 -0
  20. package/dist/chunk-56H7UFAW.js +237 -0
  21. package/dist/chunk-56H7UFAW.js.map +1 -0
  22. package/dist/chunk-5HOK5JHR.js +60 -0
  23. package/dist/chunk-5HOK5JHR.js.map +1 -0
  24. package/dist/{chunk-H7EX6B6N.js → chunk-5NOKULX2.js} +5 -4
  25. package/dist/chunk-5NOKULX2.js.map +1 -0
  26. package/dist/chunk-6VJQIBC3.js +715 -0
  27. package/dist/chunk-6VJQIBC3.js.map +1 -0
  28. package/dist/chunk-BQVMO33N.js +133 -0
  29. package/dist/chunk-BQVMO33N.js.map +1 -0
  30. package/dist/chunk-CXXOKCLJ.js +37 -0
  31. package/dist/chunk-CXXOKCLJ.js.map +1 -0
  32. package/dist/chunk-FN4BWFDX.js +43 -0
  33. package/dist/chunk-FN4BWFDX.js.map +1 -0
  34. package/dist/chunk-HRHDOLWU.js +62 -0
  35. package/dist/chunk-HRHDOLWU.js.map +1 -0
  36. package/dist/chunk-HZB2EHEH.js +216 -0
  37. package/dist/chunk-HZB2EHEH.js.map +1 -0
  38. package/dist/chunk-IBGGQXTH.js +21 -0
  39. package/dist/chunk-IBGGQXTH.js.map +1 -0
  40. package/dist/chunk-JCEOU7BU.js +128 -0
  41. package/dist/chunk-JCEOU7BU.js.map +1 -0
  42. package/dist/{chunk-RV5PMZYZ.js → chunk-MBZAYH5D.js} +4 -18
  43. package/dist/chunk-MBZAYH5D.js.map +1 -0
  44. package/dist/chunk-NWVNYKND.js +153 -0
  45. package/dist/chunk-NWVNYKND.js.map +1 -0
  46. package/dist/chunk-OTSA5ROL.js +209 -0
  47. package/dist/chunk-OTSA5ROL.js.map +1 -0
  48. package/dist/chunk-OV5ODANJ.js +224 -0
  49. package/dist/chunk-OV5ODANJ.js.map +1 -0
  50. package/dist/chunk-PPMJZVR4.js +37 -0
  51. package/dist/chunk-PPMJZVR4.js.map +1 -0
  52. package/dist/{chunk-CKCXQBHQ.js → chunk-RC5SWZPB.js} +5 -4
  53. package/dist/chunk-RC5SWZPB.js.map +1 -0
  54. package/dist/chunk-SHMKDGFF.js +75 -0
  55. package/dist/chunk-SHMKDGFF.js.map +1 -0
  56. package/dist/chunk-T3SOBIYA.js +61 -0
  57. package/dist/chunk-T3SOBIYA.js.map +1 -0
  58. package/dist/chunk-TH5RASJS.js +97 -0
  59. package/dist/chunk-TH5RASJS.js.map +1 -0
  60. package/dist/{chunk-LUB7QWGU.js → chunk-VIJ2HWPZ.js} +5 -159
  61. package/dist/chunk-VIJ2HWPZ.js.map +1 -0
  62. package/dist/chunk-VQ63T7CJ.js +22 -0
  63. package/dist/chunk-VQ63T7CJ.js.map +1 -0
  64. package/dist/chunk-XDVGFHK4.js +50 -0
  65. package/dist/chunk-XDVGFHK4.js.map +1 -0
  66. package/dist/chunk-XI4BQY5T.js +188 -0
  67. package/dist/chunk-XI4BQY5T.js.map +1 -0
  68. package/dist/detail-page-header.js +1 -1
  69. package/dist/file-viewer-dialog.js +3 -9
  70. package/dist/file-viewer-dialog.js.map +1 -1
  71. package/dist/floor-switcher.js +5 -9
  72. package/dist/floor-switcher.js.map +1 -1
  73. package/dist/layout-canvas-view.js +8 -11
  74. package/dist/page-list-chrome.js +5 -3
  75. package/dist/page-list-loading.js +5 -3
  76. package/dist/page-list-loading.js.map +1 -1
  77. package/dist/platform-support-message-composer.js +2 -10
  78. package/dist/platform-support-message-composer.js.map +1 -1
  79. package/dist/sidebar-Dzvrjr69.d.ts +85 -0
  80. package/dist/styles/theme.css +52 -2
  81. package/dist/styles/theme.css.map +1 -1
  82. package/dist/theme-appearance-control.js +2 -1
  83. package/dist/theme-appearance-control.js.map +1 -1
  84. package/dist/ui/accordion.d.ts +9 -0
  85. package/dist/ui/accordion.js +4 -0
  86. package/dist/ui/accordion.js.map +1 -0
  87. package/dist/ui/calendar.d.ts +6 -0
  88. package/dist/ui/calendar.js +4 -0
  89. package/dist/ui/calendar.js.map +1 -0
  90. package/dist/ui/carousel.d.ts +22 -0
  91. package/dist/ui/carousel.js +5 -0
  92. package/dist/ui/carousel.js.map +1 -0
  93. package/dist/ui/chart.d.ts +42 -0
  94. package/dist/ui/chart.js +229 -0
  95. package/dist/ui/chart.js.map +1 -0
  96. package/dist/ui/command.d.ts +19 -0
  97. package/dist/ui/command.js +5 -0
  98. package/dist/ui/command.js.map +1 -0
  99. package/dist/ui/context-menu.d.ts +27 -0
  100. package/dist/ui/context-menu.js +4 -0
  101. package/dist/ui/context-menu.js.map +1 -0
  102. package/dist/ui/form.d.ts +27 -0
  103. package/dist/ui/form.js +5 -0
  104. package/dist/ui/form.js.map +1 -0
  105. package/dist/ui/input-otp.d.ts +13 -0
  106. package/dist/ui/input-otp.js +4 -0
  107. package/dist/ui/input-otp.js.map +1 -0
  108. package/dist/ui/menubar.d.ts +28 -0
  109. package/dist/ui/menubar.js +4 -0
  110. package/dist/ui/menubar.js.map +1 -0
  111. package/dist/ui/navigation-menu.d.ts +17 -0
  112. package/dist/ui/navigation-menu.js +4 -0
  113. package/dist/ui/navigation-menu.js.map +1 -0
  114. package/dist/ui/resizable.d.ts +10 -0
  115. package/dist/ui/resizable.js +4 -0
  116. package/dist/ui/resizable.js.map +1 -0
  117. package/dist/ui/sidebar.d.ts +7 -0
  118. package/dist/ui/sidebar.js +9 -0
  119. package/dist/ui/sidebar.js.map +1 -0
  120. package/dist/ui.d.ts +28 -272
  121. package/dist/ui.js +2427 -6
  122. package/dist/ui.js.map +1 -1
  123. package/package.json +9 -1
  124. package/dist/chunk-CKCXQBHQ.js.map +0 -1
  125. package/dist/chunk-F7MU5T46.js +0 -5146
  126. package/dist/chunk-F7MU5T46.js.map +0 -1
  127. package/dist/chunk-H7EX6B6N.js.map +0 -1
  128. package/dist/chunk-LUB7QWGU.js.map +0 -1
  129. package/dist/chunk-RV5PMZYZ.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/booking-schedule.ts","../src/booking/booking-schedule-calendars.tsx"],"names":[],"mappings":"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","file":"booking-schedule-calendars.js","sourcesContent":["/**\n * Date / schedule helpers used by booking-schedule calendars.\n */\n\nexport type RepeatType = \"none\" | \"daily\" | \"weekly\" | \"monthly\";\nexport type BookingMode = \"slots\" | \"schedule\";\nexport type ScheduleChargeBy = \"minutes\" | \"hours\" | \"days\" | \"weeks\" | \"months\" | \"quantity\";\n\nexport type PartialElapsedUnit = \"days\" | \"hours\" | \"minutes\";\n\nexport interface PartialElapsed {\n amount: number;\n unit: PartialElapsedUnit;\n}\n\n/** Editor state for slot / schedule / daily / item shaped tiers */\nexport interface BookingState {\n slotCount: number;\n bookingDate: string;\n bookingMode: BookingMode;\n scheduleDate: string;\n scheduleTime: string;\n scheduleEndTime: string;\n repeatType: RepeatType;\n repeatEveryDays: number;\n repeatEveryWeeks: number;\n repeatOnDays: string[];\n repeatEveryMonths: number;\n repeatUntilDate: string;\n startDate: string;\n endDate: string;\n monthFrom: string;\n monthTo: string;\n weekFrom: string;\n weekCount: number;\n itemQuantity: number;\n oneDayBooking?: boolean;\n}\n\nexport interface ScheduleDefaultsConfig {\n chargeBy: ScheduleChargeBy;\n}\n\n/** YYYY-MM-DD in local timezone (never UTC ISO split). */\nexport function localDateYmd(d: Date): string {\n const y = d.getFullYear();\n const m = String(d.getMonth() + 1).padStart(2, \"0\");\n const day = String(d.getDate()).padStart(2, \"0\");\n return `${y}-${m}-${day}`;\n}\n\nexport function todayLocalYmd(now: Date = new Date()): string {\n return localDateYmd(now);\n}\n\n/** @deprecated Prefer `todayLocalYmd()` — kept for existing imports. */\nexport function pricingTodayYmd(now: Date = new Date()): string {\n return todayLocalYmd(now);\n}\n\nexport const PRICING_TODAY = todayLocalYmd();\n\nexport function currentMonthYm(now: Date = new Date()): string {\n return `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, \"0\")}`;\n}\n\n/** Monday of the current local week (YYYY-MM-DD). */\nexport function currentWeekStart(now: Date = new Date()): string {\n const d = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n const day = d.getDay();\n const offset = day === 0 ? -6 : 1 - day;\n d.setDate(d.getDate() + offset);\n return localDateYmd(d);\n}\n\n/** First full month default: next month if today is past the 1st, else current month. */\nexport function computeMinMonth(now: Date = new Date()): string {\n if (now.getDate() === 1) {\n return currentMonthYm(now);\n }\n const n = new Date(now.getFullYear(), now.getMonth() + 1, 1);\n return currentMonthYm(n);\n}\n\n/** First full week default: next Monday unless today is already Monday. */\nexport function computeMinWeekStart(now: Date = new Date()): string {\n const day = now.getDay();\n if (day === 1) return todayLocalYmd(now);\n const d = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n const skip = day === 0 ? 1 : 8 - day;\n d.setDate(d.getDate() + skip);\n return localDateYmd(d);\n}\n\nexport const MIN_MONTH = computeMinMonth();\nexport const MIN_WEEK_START = computeMinWeekStart();\n\nexport const IS_PARTIAL_MONTH = new Date().getDate() !== 1;\n\nexport function monthLabel(ym: string): string {\n const [y, m] = ym.split(\"-\").map(Number);\n return new Date(y, m - 1, 1).toLocaleDateString(\"en-US\", { month: \"long\", year: \"numeric\" });\n}\n\nexport function monthCount(from: string, to: string): number {\n if (!from || !to || !from.includes(\"-\") || !to.includes(\"-\")) return 0;\n const [fy, fm] = from.split(\"-\").map(Number);\n const [ty, tm] = to.split(\"-\").map(Number);\n return (ty - fy) * 12 + (tm - fm) + 1;\n}\n\nexport function weekRangeLabel(weekFrom: string, weekCount: number): string {\n if (!weekFrom || isNaN(new Date(weekFrom + \"T00:00:00\").getTime())) return \"—\";\n const end = parseDateOnly(weekFrom);\n end.setDate(end.getDate() + weekCount * 7 - 1);\n const s = parseDateOnly(weekFrom).toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" });\n const e = end.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\", year: \"numeric\" });\n return `${s} – ${e}`;\n}\n\n/** Inclusive number of Mon-anchored weeks from `weekFrom` through `weekToMon`. */\nexport function weekCountBetween(weekFrom: string, weekToMon: string): number {\n if (!weekFrom || !weekToMon) return 0;\n if (weekToMon < weekFrom) return 1;\n return Math.floor(diffDays(weekFrom, weekToMon) / 7) + 1;\n}\n\nexport function addMonthsYm(ym: string, delta: number): string {\n const [y, m] = ym.split(\"-\").map(Number);\n const d = new Date(y, (m ?? 1) - 1 + delta, 1);\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, \"0\")}`;\n}\n\nfunction parseDateOnly(date: string): Date {\n const [y, m, d] = date.split(\"-\").map(Number);\n return new Date(y, m - 1, d);\n}\n\nexport function diffDays(a: string, b: string): number {\n const da = parseDateOnly(a);\n const db = parseDateOnly(b);\n return Math.max(0, Math.round((db.getTime() - da.getTime()) / 86_400_000));\n}\n\nexport function addDays(date: string, days: number): string {\n const d = parseDateOnly(date);\n d.setDate(d.getDate() + days);\n return localDateYmd(d);\n}\n\nfunction hmMinutes(hm: string): number | null {\n const [h, m] = hm.split(\":\").map(Number);\n if (!Number.isFinite(h) || !Number.isFinite(m)) return null;\n return h * 60 + m;\n}\n\nfunction isSlotCharge(chargeBy: ScheduleChargeBy): boolean {\n return chargeBy === \"hours\" || chargeBy === \"minutes\";\n}\n\nfunction isPeriodCharge(chargeBy: ScheduleChargeBy): boolean {\n return chargeBy === \"days\" || chargeBy === \"weeks\" || chargeBy === \"months\";\n}\n\nfunction snapScheduleEndTime(from: string, end: string, chargeBy: ScheduleChargeBy): string {\n if (end && end > from) return end;\n const fromMin = hmMinutes(from);\n if (fromMin == null) return end || \"10:00\";\n const delta = chargeBy === \"minutes\" ? 1 : 60;\n const next = fromMin + delta;\n return `${String(Math.floor(next / 60)).padStart(2, \"0\")}:${String(next % 60).padStart(2, \"0\")}`;\n}\n\nfunction minNeededTimeHm(prepMinutes: number, now: Date = new Date()): string {\n const earliest = new Date(now.getTime() + prepMinutes * 60_000);\n if (earliest.getSeconds() > 0 || earliest.getMilliseconds() > 0) {\n earliest.setMinutes(earliest.getMinutes() + 1);\n }\n earliest.setSeconds(0, 0);\n return `${String(earliest.getHours()).padStart(2, \"0\")}:${String(earliest.getMinutes()).padStart(2, \"0\")}`;\n}\n\n/** Elapsed time in the selected in-progress booking period, if any. */\nexport function partialElapsed(\n config: ScheduleDefaultsConfig,\n booking: BookingState,\n now: Date = new Date(),\n): PartialElapsed | null {\n const today = todayLocalYmd(now);\n\n if (config.chargeBy === \"months\") {\n const cur = currentMonthYm(now);\n const min = computeMinMonth(now);\n if (!booking.monthFrom || booking.monthFrom !== cur || booking.monthFrom >= min) return null;\n const days = diffDays(`${booking.monthFrom}-01`, today);\n return days > 0 ? { amount: days, unit: \"days\" } : null;\n }\n\n if (config.chargeBy === \"weeks\") {\n const cur = currentWeekStart(now);\n const min = computeMinWeekStart(now);\n if (!booking.weekFrom || booking.weekFrom !== cur || booking.weekFrom >= min) return null;\n const days = diffDays(booking.weekFrom, today);\n return days > 0 ? { amount: days, unit: \"days\" } : null;\n }\n\n if (config.chargeBy === \"days\") {\n if (!booking.startDate) return null;\n if (booking.startDate < today) {\n const days = diffDays(booking.startDate, today);\n return days > 0 ? { amount: days, unit: \"days\" } : null;\n }\n if (booking.oneDayBooking !== false && booking.startDate === today) {\n const hours = now.getHours() + now.getMinutes() / 60;\n const rounded = Math.floor(hours);\n return rounded > 0 ? { amount: rounded, unit: \"hours\" } : null;\n }\n return null;\n }\n\n if (isSlotCharge(config.chargeBy)) {\n if (booking.scheduleDate !== today || !booking.scheduleTime) return null;\n const startMin = hmMinutes(booking.scheduleTime);\n const nowMin = now.getHours() * 60 + now.getMinutes();\n if (startMin == null || startMin >= nowMin) return null;\n const elapsed = nowMin - startMin;\n if (config.chargeBy === \"minutes\") {\n return elapsed > 0 ? { amount: elapsed, unit: \"minutes\" } : null;\n }\n const hours = Math.floor(elapsed / 60);\n return hours > 0 ? { amount: hours, unit: \"hours\" } : null;\n }\n\n return null;\n}\n\nexport function formatPartialElapsedLabel(elapsed: PartialElapsed): string {\n const { amount, unit } = elapsed;\n if (unit === \"days\") return `${amount} day${amount !== 1 ? \"s\" : \"\"}`;\n if (unit === \"hours\") return `${amount} hour${amount !== 1 ? \"s\" : \"\"}`;\n return `${amount} minute${amount !== 1 ? \"s\" : \"\"}`;\n}\n\n/** Patch empty schedule fields with tier-appropriate defaults. */\nexport function applyBookingScheduleDefaults(\n config: ScheduleDefaultsConfig,\n booking: BookingState,\n options?: { preparationMinutes?: number; now?: Date },\n): Partial<BookingState> {\n const now = options?.now ?? new Date();\n const today = todayLocalYmd(now);\n const patch: Partial<BookingState> = {};\n\n if (isSlotCharge(config.chargeBy)) {\n if (!booking.scheduleDate) patch.scheduleDate = today;\n if (!booking.scheduleTime) patch.scheduleTime = \"09:00\";\n const from = patch.scheduleTime ?? booking.scheduleTime ?? \"09:00\";\n if (!booking.scheduleEndTime) {\n patch.scheduleEndTime = snapScheduleEndTime(from, \"\", config.chargeBy);\n }\n return patch;\n }\n\n if (config.chargeBy === \"days\") {\n if (!booking.startDate) {\n patch.startDate = today;\n patch.endDate = addDays(today, 1);\n patch.oneDayBooking = true;\n } else if (!booking.endDate) {\n patch.endDate = addDays(booking.startDate, 1);\n }\n if (booking.oneDayBooking === undefined) patch.oneDayBooking = true;\n return patch;\n }\n\n if (config.chargeBy === \"weeks\") {\n if (!booking.weekFrom) patch.weekFrom = computeMinWeekStart(now);\n if (!booking.weekCount) patch.weekCount = 1;\n return patch;\n }\n\n if (config.chargeBy === \"months\") {\n const min = computeMinMonth(now);\n if (!booking.monthFrom) patch.monthFrom = min;\n if (!booking.monthTo) patch.monthTo = patch.monthFrom ?? booking.monthFrom ?? min;\n return patch;\n }\n\n if (config.chargeBy === \"quantity\") {\n if (!booking.scheduleDate) patch.scheduleDate = today;\n let time = booking.scheduleTime || \"09:00\";\n const prep = options?.preparationMinutes ?? 0;\n if (prep > 0 && (patch.scheduleDate ?? booking.scheduleDate ?? today) === today) {\n const floor = minNeededTimeHm(prep, now);\n if (time < floor) time = floor;\n }\n if (!booking.scheduleTime) patch.scheduleTime = time;\n if (!booking.itemQuantity) patch.itemQuantity = 1;\n return patch;\n }\n\n return patch;\n}\n","import { useEffect, useState } from \"react\";\nimport { ChevronLeft, ChevronRight, Info } from \"lucide-react\";\nimport {\n MIN_MONTH,\n MIN_WEEK_START,\n PRICING_TODAY,\n addDays,\n addMonthsYm,\n currentMonthYm,\n currentWeekStart,\n diffDays,\n localDateYmd,\n monthCount,\n monthLabel,\n todayLocalYmd,\n weekCountBetween,\n weekRangeLabel,\n type BookingState,\n} from \"../lib/booking-schedule\";\nimport {\n TimeField,\n addMinutesToHm,\n formatTimeForDisplay,\n hourlyEndTimes,\n snapScheduleEndTime,\n} from \"../ui/time-field\";\nimport { CheckboxField, cn } from \"../ui\";\n\nconst MONTH_NAMES = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\n\nfunction dayStr(d: Date): string {\n return localDateYmd(d);\n}\n\n/** Nav row, weekday row, and cells share hairlines so the calendar reads as one framed block. */\nconst calendarBlockClass = \"flex flex-col overflow-hidden rounded-xl border border-border/60\";\nconst calendarNavRowClass =\n \"flex items-center justify-between border-b border-border/40 px-2 py-1.5\";\nconst calendarWeekdayRowClass = \"grid grid-cols-7 border-b border-border/40\";\nconst calendarWeekdayCellClass =\n \"flex h-9 items-center justify-center border-r border-border/40 text-[10px] font-medium text-muted-foreground last:border-r-0\";\n\n/** Hairlines between cells of a fixed-column grid, without an outer frame. */\nfunction cellGridLines(index: number, total: number, cols: number): string {\n return cn(\n \"border-border/40\",\n index % cols !== cols - 1 && \"border-r\",\n index < total - cols && \"border-b\",\n );\n}\n\nfunction weekEndMonday(weekFrom: string, weekCount: number): string {\n if (!weekFrom || weekCount < 1) return weekFrom;\n return addDays(weekFrom, (weekCount - 1) * 7);\n}\n\n/** Returns dates for a Mon-anchored calendar grid (5 or 6 rows). */\nfunction getCalendarGrid(year: number, month: number): Date[] {\n const firstDay = new Date(year, month, 1);\n const dow = firstDay.getDay();\n const startOffset = dow === 0 ? -6 : 1 - dow;\n const days: Date[] = [];\n for (let i = 0; i < 35; i++) {\n days.push(new Date(year, month, 1 + startOffset + i));\n }\n if (days[days.length - 1] < new Date(year, month + 1, 0)) {\n for (let i = 35; i < 42; i++) {\n days.push(new Date(year, month, 1 + startOffset + i));\n }\n }\n return days;\n}\n\nexport function ScheduleFieldLabel({ children }: { children: React.ReactNode }) {\n return <label className=\"text-xs font-medium text-muted-foreground\">{children}</label>;\n}\n\nexport function ScheduleInfoBanner({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"flex items-start gap-2 rounded-xl border border-blue-100 bg-blue-50 px-3 py-2.5 dark:border-blue-900/50 dark:bg-blue-950/40\">\n <Info size={13} className=\"mt-0.5 shrink-0 text-blue-400\" />\n <span className=\"text-xs leading-relaxed text-blue-700 dark:text-blue-400\">{children}</span>\n </div>\n );\n}\n\nexport function ScheduleStepper({\n value,\n min = 1,\n max = 100,\n onChange,\n}: {\n value: number;\n min?: number;\n max?: number;\n onChange: (v: number) => void;\n}) {\n return (\n <div className=\"flex w-32 items-center overflow-hidden rounded-xl border border-border bg-card\">\n <button\n type=\"button\"\n onClick={() => onChange(Math.max(min, value - 1))}\n className=\"flex h-9 w-9 shrink-0 items-center justify-center border-r border-border text-sm text-muted-foreground hover:bg-accent\"\n >\n −\n </button>\n <span className=\"flex-1 text-center text-sm font-medium text-foreground\">{value}</span>\n <button\n type=\"button\"\n onClick={() => onChange(Math.min(max, value + 1))}\n className=\"flex h-9 w-9 shrink-0 items-center justify-center border-l border-border text-sm text-muted-foreground hover:bg-accent\"\n >\n +\n </button>\n </div>\n );\n}\n\nexport function WeekCalendarPicker({\n weekFrom,\n weekCount,\n rangeMode,\n onChange,\n flat = false,\n}: {\n weekFrom: string;\n weekCount: number;\n rangeMode: boolean;\n onChange: (weekFrom: string, weekCount: number) => void;\n flat?: boolean;\n}) {\n const initDate = new Date((weekFrom || MIN_WEEK_START) + \"T00:00:00\");\n const [calYear, setCalYear] = useState(initDate.getFullYear());\n const [calMonth, setCalMonth] = useState(initDate.getMonth());\n const [hoverMon, setHoverMon] = useState<string | null>(null);\n const [phase, setPhase] = useState<\"from\" | \"to\">(\"from\");\n\n useEffect(() => {\n setPhase(\"from\");\n }, [rangeMode]);\n\n const days = getCalendarGrid(calYear, calMonth);\n const minDate = new Date((currentWeekStart() || PRICING_TODAY) + \"T00:00:00\");\n const endMon = weekEndMonday(weekFrom, weekCount);\n\n const [dispFrom, dispTo] = (() => {\n if (!rangeMode || !weekFrom) return [weekFrom, endMon];\n if (phase === \"to\" && hoverMon) {\n if (hoverMon >= weekFrom) return [weekFrom, hoverMon];\n return [hoverMon, hoverMon];\n }\n return [weekFrom, endMon];\n })();\n\n const previewCount =\n rangeMode && phase === \"to\" && hoverMon && hoverMon >= weekFrom\n ? weekCountBetween(weekFrom, hoverMon)\n : weekCount;\n\n const prevMonth = () => {\n if (calMonth === 0) {\n setCalYear((y) => y - 1);\n setCalMonth(11);\n } else setCalMonth((m) => m - 1);\n };\n const nextMonth = () => {\n if (calMonth === 11) {\n setCalYear((y) => y + 1);\n setCalMonth(0);\n } else setCalMonth((m) => m + 1);\n };\n\n const weeks: Date[][] = [];\n for (let i = 0; i < days.length; i += 7) weeks.push(days.slice(i, i + 7));\n\n const handleWeekClick = (monStr: string) => {\n if (!rangeMode) {\n onChange(monStr, 1);\n return;\n }\n if (phase === \"from\") {\n onChange(monStr, 1);\n setPhase(\"to\");\n return;\n }\n if (monStr >= weekFrom) {\n onChange(weekFrom, weekCountBetween(weekFrom, monStr));\n setPhase(\"from\");\n return;\n }\n onChange(monStr, 1);\n setPhase(\"to\");\n };\n\n return (\n <div\n className={cn(\n \"flex select-none flex-col\",\n flat ? \"gap-3\" : \"gap-1 rounded-2xl border border-border bg-card p-3\",\n )}\n >\n {rangeMode ? (\n <div\n className={cn(\n \"flex items-center gap-2 px-1 text-[11px] font-medium\",\n phase === \"to\" ? \"text-blue-600 dark:text-blue-400\" : \"text-muted-foreground\",\n )}\n >\n {phase === \"from\" ? (\n <>\n <span className=\"h-1.5 w-1.5 shrink-0 rounded-full bg-muted-foreground/50\" />\n Click the first week\n </>\n ) : (\n <>\n <span className=\"h-1.5 w-1.5 shrink-0 animate-pulse rounded-full bg-blue-500\" />\n Click the last week\n <button\n type=\"button\"\n onClick={() => {\n onChange(weekFrom, 1);\n setPhase(\"to\");\n }}\n className=\"ml-auto text-[10px] text-blue-400 underline underline-offset-2 hover:text-blue-600 dark:text-blue-400\"\n >\n Reset\n </button>\n </>\n )}\n </div>\n ) : null}\n\n <div className={calendarBlockClass}>\n <div className={calendarNavRowClass}>\n <button\n type=\"button\"\n onClick={prevMonth}\n className=\"flex h-7 w-7 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-accent hover:text-muted-foreground\"\n >\n <ChevronLeft size={12} strokeWidth={2.25} />\n </button>\n <span className=\"text-xs font-semibold text-muted-foreground\">\n {MONTH_NAMES[calMonth]} {calYear}\n </span>\n <button\n type=\"button\"\n onClick={nextMonth}\n className=\"flex h-7 w-7 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-accent hover:text-muted-foreground\"\n >\n <ChevronRight size={12} strokeWidth={2.25} />\n </button>\n </div>\n\n <div className={calendarWeekdayRowClass}>\n {[\"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\", \"Su\"].map((d) => (\n <span key={d} className={calendarWeekdayCellClass}>\n {d}\n </span>\n ))}\n </div>\n\n <div className=\"flex flex-col divide-y divide-border/40\">\n {weeks.map((week, wi) => {\n const mondayDate = week[0];\n const monStr = dayStr(mondayDate);\n const isSelectable = mondayDate >= minDate;\n const isStartWeek = Boolean(weekFrom) && monStr === dispFrom;\n const isEndWeek = Boolean(weekFrom) && monStr === dispTo;\n const inRange =\n rangeMode && Boolean(weekFrom) && monStr >= dispFrom && monStr <= dispTo;\n const isSelected = rangeMode ? inRange : monStr === weekFrom;\n\n return (\n <div\n key={wi}\n className={cn(\n \"relative flex cursor-pointer transition-colors\",\n isSelected && (isStartWeek || isEndWeek) && \"bg-blue-100/80\",\n isSelected && !isStartWeek && !isEndWeek && \"bg-blue-50\",\n isSelectable ? \"hover:bg-accent/60\" : \"cursor-not-allowed opacity-60\",\n )}\n onMouseEnter={() => isSelectable && setHoverMon(monStr)}\n onMouseLeave={() => setHoverMon(null)}\n onClick={() => isSelectable && handleWeekClick(monStr)}\n >\n {week.map((d, di) => {\n const isCurrentMonth = d.getMonth() === calMonth;\n const isMon = di === 0;\n const isSun = di === 6;\n const filled = rangeMode\n ? (isStartWeek && isMon) || (isEndWeek && isSun)\n : isSelected && isMon;\n\n return (\n <div\n key={di}\n className=\"relative z-10 flex h-9 flex-1 items-center justify-center border-r border-border/40 last:border-r-0\"\n >\n <span\n className={cn(\n \"flex h-7 w-7 items-center justify-center rounded-full text-[11px] transition-colors\",\n isCurrentMonth ? \"text-muted-foreground\" : \"text-muted-foreground/50\",\n !isSelectable && \"text-muted-foreground/40\",\n isSelected && \"font-medium text-blue-700 dark:text-blue-300\",\n filled && \"bg-blue-500 font-semibold text-white shadow-sm\",\n )}\n >\n {d.getDate()}\n </span>\n </div>\n );\n })}\n </div>\n );\n })}\n </div>\n </div>\n\n <p className=\"mt-1 text-center text-[10px] text-muted-foreground\">\n {rangeMode\n ? phase === \"from\"\n ? \"Click a week to start the range\"\n : previewCount > 1\n ? `${previewCount} weeks · ${weekRangeLabel(dispFrom, previewCount)}`\n : \"Click a week to finish the range\"\n : weekFrom\n ? `Selected week of ${formatDateLabel(weekFrom)}`\n : \"Click any row to select that week\"}\n </p>\n </div>\n );\n}\n\nexport function MonthRangeCalendar({\n monthFrom,\n monthTo,\n onChange,\n rangeMode,\n flat = false,\n}: {\n monthFrom: string;\n monthTo: string;\n onChange: (from: string, to: string) => void;\n rangeMode: boolean;\n flat?: boolean;\n}) {\n const initYear = monthFrom ? parseInt(monthFrom.split(\"-\")[0], 10) : new Date().getFullYear();\n const [calYear, setCalYear] = useState(initYear);\n const [phase, setPhase] = useState<\"from\" | \"to\">(\"from\");\n const [hoverYm, setHoverYm] = useState<string | null>(null);\n\n useEffect(() => {\n setPhase(\"from\");\n }, [rangeMode]);\n\n const ABBR = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n const toYm = (y: number, m: number) => `${y}-${String(m + 1).padStart(2, \"0\")}`;\n const minYm = currentMonthYm() || `${new Date().getFullYear()}-01`;\n\n const [dispFrom, dispTo] = (() => {\n if (!rangeMode) return [monthFrom, monthFrom || monthTo];\n if (phase === \"to\" && hoverYm) {\n if (hoverYm >= monthFrom) return [monthFrom, hoverYm];\n return [hoverYm, hoverYm];\n }\n return [monthFrom, monthTo];\n })();\n const isSingle = dispFrom === dispTo;\n\n const handleClick = (ymStr: string) => {\n if (ymStr < minYm) return;\n if (!rangeMode) {\n onChange(ymStr, ymStr);\n return;\n }\n if (phase === \"from\") {\n onChange(ymStr, ymStr);\n setPhase(\"to\");\n } else if (ymStr >= monthFrom) {\n onChange(monthFrom, ymStr);\n setPhase(\"from\");\n } else {\n onChange(ymStr, ymStr);\n setPhase(\"to\");\n }\n };\n\n const actualCount = monthCount(monthFrom, monthTo);\n const previewCount = monthCount(dispFrom, dispTo);\n\n return (\n <div\n className={cn(\n \"select-none\",\n flat ? \"flex flex-col gap-5\" : \"overflow-hidden rounded-2xl border border-border bg-card\",\n )}\n >\n {rangeMode ? (\n <div\n className={cn(\n \"flex items-center gap-2 text-[11px] font-medium transition-colors\",\n flat\n ? phase === \"to\"\n ? \"text-blue-600 dark:text-blue-400\"\n : \"text-muted-foreground\"\n : cn(\n \"px-4 py-2 text-[10px]\",\n phase === \"to\"\n ? \"bg-blue-50 text-blue-600 dark:bg-blue-950/40 dark:text-blue-400\"\n : \"bg-transparent text-muted-foreground\",\n ),\n )}\n >\n {phase === \"from\" ? (\n <>\n <span className=\"h-1.5 w-1.5 shrink-0 rounded-full bg-muted-foreground/50\" />\n Click the first month\n </>\n ) : (\n <>\n <span className=\"h-1.5 w-1.5 shrink-0 animate-pulse rounded-full bg-blue-500\" />\n Click the last month\n <button\n type=\"button\"\n onClick={() => {\n onChange(monthFrom, monthFrom);\n setPhase(\"to\");\n }}\n className=\"ml-auto text-[10px] text-blue-400 underline underline-offset-2 hover:text-blue-600 dark:text-blue-400\"\n >\n Reset\n </button>\n </>\n )}\n </div>\n ) : null}\n\n <div className={cn(calendarBlockClass, !flat && \"mx-3 mb-3\")}>\n <div className={calendarNavRowClass}>\n <button\n type=\"button\"\n onClick={() => setCalYear((y) => y - 1)}\n className=\"flex h-7 w-7 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-accent hover:text-muted-foreground\"\n >\n <ChevronLeft size={12} strokeWidth={2.25} />\n </button>\n <span className=\"text-xs font-semibold text-muted-foreground\">{calYear}</span>\n <button\n type=\"button\"\n onClick={() => setCalYear((y) => y + 1)}\n className=\"flex h-7 w-7 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-accent hover:text-muted-foreground\"\n >\n <ChevronRight size={12} strokeWidth={2.25} />\n </button>\n </div>\n\n <div className=\"grid grid-cols-4\">\n {ABBR.map((label, i) => {\n const ymStr = toYm(calYear, i);\n const disabled = ymStr < minYm;\n const inRange = !disabled && ymStr >= dispFrom && ymStr <= dispTo;\n const isFrom = ymStr === dispFrom;\n const isTo = ymStr === dispTo;\n const showStrip = rangeMode && inRange && !isSingle;\n const sLeft = isFrom ? \"left-1/2\" : \"left-0\";\n const sRight = isTo ? \"right-1/2\" : \"right-0\";\n const filled = (isFrom || isTo || (!rangeMode && ymStr === monthFrom)) && !disabled;\n\n return (\n <div\n key={i}\n className={cn(\n \"relative\",\n cellGridLines(i, 12, 4),\n flat ? \"h-14\" : \"h-12\",\n disabled ? \"cursor-not-allowed\" : \"cursor-pointer\",\n )}\n onMouseEnter={() => !disabled && setHoverYm(ymStr)}\n onMouseLeave={() => setHoverYm(null)}\n onClick={() => handleClick(ymStr)}\n >\n {showStrip ? (\n <div className={`absolute bottom-1.5 top-1.5 bg-blue-100 ${sLeft} ${sRight}`} />\n ) : null}\n <div\n className={cn(\n \"relative z-10 flex w-full items-center justify-center\",\n flat ? \"h-14\" : \"h-12\",\n )}\n >\n <span\n className={`flex h-9 w-9 items-center justify-center rounded-full text-xs font-medium transition-all duration-100\n ${\n filled\n ? \"bg-blue-500 text-white shadow-md shadow-blue-200\"\n : inRange\n ? \"text-blue-700 dark:text-blue-400\"\n : !disabled\n ? \"text-muted-foreground hover:bg-accent\"\n : \"text-muted-foreground/60\"\n }`}\n >\n {label}\n </span>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n\n <div\n className={cn(\n \"flex items-center justify-between transition-colors\",\n flat\n ? \"border-t border-border/70 pt-4 text-xs\"\n : cn(\n \"border-t px-4 py-2.5\",\n rangeMode && phase === \"from\" && actualCount > 0\n ? \"border-border bg-muted\"\n : \"border-transparent\",\n ),\n )}\n >\n {!rangeMode && monthFrom ? (\n <>\n <span className=\"text-[10px] text-muted-foreground\">{monthLabel(monthFrom)}</span>\n <span className=\"rounded-full bg-blue-50 px-2 py-0.5 text-[10px] font-semibold text-blue-600 dark:bg-blue-950/40 dark:text-blue-400\">\n 1 month\n </span>\n </>\n ) : rangeMode && phase === \"from\" && actualCount > 0 ? (\n <>\n <span className=\"text-[10px] text-muted-foreground\">\n {monthLabel(monthFrom)} → {monthLabel(monthTo)}\n </span>\n <span className=\"rounded-full bg-blue-50 px-2 py-0.5 text-[10px] font-semibold text-blue-600 dark:bg-blue-950/40 dark:text-blue-400\">\n {actualCount} month{actualCount !== 1 ? \"s\" : \"\"}\n </span>\n </>\n ) : rangeMode && phase === \"to\" ? (\n <>\n <span className=\"text-[10px] text-muted-foreground\">\n {hoverYm && hoverYm >= monthFrom\n ? `${monthLabel(monthFrom)} → ${monthLabel(hoverYm)}`\n : `Start: ${monthLabel(monthFrom)}`}\n </span>\n {hoverYm && hoverYm >= monthFrom && previewCount > 0 ? (\n <span className=\"text-[10px] font-medium text-blue-400\">\n {previewCount} month{previewCount !== 1 ? \"s\" : \"\"}\n </span>\n ) : null}\n </>\n ) : (\n <span className=\"text-[10px] text-muted-foreground/60\">\n {rangeMode ? \"Select a month range\" : \"Click a month to book\"}\n </span>\n )}\n </div>\n </div>\n );\n}\n\nexport function MonthPeriodPicker({\n booking,\n onChange,\n flat = true,\n}: {\n booking: BookingState;\n onChange: (patch: Partial<BookingState>) => void;\n flat?: boolean;\n}) {\n const [rangeMode, setRangeMode] = useState(\n () => Boolean(booking.monthFrom && booking.monthTo && booking.monthFrom !== booking.monthTo),\n );\n\n useEffect(() => {\n if (booking.monthFrom && booking.monthTo && booking.monthFrom !== booking.monthTo) {\n setRangeMode(true);\n }\n }, [booking.monthFrom, booking.monthTo]);\n\n const monthCountSelected = monthCount(booking.monthFrom, booking.monthTo);\n\n return (\n <div className={cn(\"flex flex-col\", flat ? \"gap-5\" : \"gap-3\")}>\n <ScheduleInfoBanner>\n Current month is available at full price, or choose a future month.\n </ScheduleInfoBanner>\n\n <CheckboxField\n size=\"sm\"\n label=\"Select multiple months\"\n className=\"w-fit items-center\"\n checked={rangeMode}\n onCheckedChange={(checked) => {\n setRangeMode(checked);\n const from = booking.monthFrom || currentMonthYm();\n if (!checked) {\n onChange({ monthFrom: from, monthTo: from });\n return;\n }\n const to =\n booking.monthTo && booking.monthTo > from ? booking.monthTo : addMonthsYm(from, 1);\n onChange({ monthFrom: from, monthTo: to });\n }}\n />\n\n <ScheduleFieldLabel>{rangeMode ? \"Select month range\" : \"Select month\"}</ScheduleFieldLabel>\n <MonthRangeCalendar\n flat={flat}\n rangeMode={rangeMode}\n monthFrom={booking.monthFrom}\n monthTo={booking.monthTo}\n onChange={(from, to) => onChange({ monthFrom: from, monthTo: to })}\n />\n\n {monthCountSelected > 0 ? (\n <div className=\"flex items-center justify-between rounded-xl border border-border bg-muted px-3 py-2.5\">\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-[10px] text-muted-foreground\">Period</span>\n <span className=\"text-xs font-medium text-muted-foreground\">\n {rangeMode && monthCountSelected > 1\n ? `${monthLabel(booking.monthFrom)} → ${monthLabel(booking.monthTo)}`\n : monthLabel(booking.monthFrom)}\n </span>\n </div>\n <span className=\"rounded-lg bg-blue-50 px-2 py-1 text-xs font-semibold text-blue-600 dark:bg-blue-950/40 dark:text-blue-400\">\n {monthCountSelected} month{monthCountSelected !== 1 ? \"s\" : \"\"}\n </span>\n </div>\n ) : null}\n </div>\n );\n}\n\nexport function WeekPeriodPicker({\n booking,\n onChange,\n flat = true,\n}: {\n booking: BookingState;\n onChange: (patch: Partial<BookingState>) => void;\n flat?: boolean;\n}) {\n const [rangeMode, setRangeMode] = useState(() => booking.weekCount > 1);\n\n useEffect(() => {\n if (booking.weekCount > 1) setRangeMode(true);\n }, [booking.weekCount]);\n\n const rangeStr = weekRangeLabel(booking.weekFrom, booking.weekCount);\n\n return (\n <div className={cn(\"flex flex-col\", flat ? \"gap-5\" : \"gap-3\")}>\n <ScheduleInfoBanner>\n Current week is available at full price, or choose a future week.\n </ScheduleInfoBanner>\n\n <CheckboxField\n size=\"sm\"\n label=\"Select multiple weeks\"\n className=\"w-fit items-center\"\n checked={rangeMode}\n onCheckedChange={(checked) => {\n setRangeMode(checked);\n const from = booking.weekFrom || currentWeekStart();\n if (!checked) {\n onChange({ weekFrom: from, weekCount: 1 });\n return;\n }\n onChange({\n weekFrom: from,\n weekCount: Math.max(2, booking.weekCount),\n });\n }}\n />\n\n <div className=\"flex flex-col gap-1.5\">\n <ScheduleFieldLabel>{rangeMode ? \"Select week range\" : \"Select week\"}</ScheduleFieldLabel>\n <WeekCalendarPicker\n flat={flat}\n rangeMode={rangeMode}\n weekFrom={booking.weekFrom}\n weekCount={booking.weekCount}\n onChange={(weekFrom, weekCount) => onChange({ weekFrom, weekCount })}\n />\n </div>\n\n {booking.weekFrom && booking.weekCount > 0 ? (\n <div className=\"flex items-center justify-between rounded-xl border border-border bg-muted px-3 py-2.5\">\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-[10px] text-muted-foreground\">Period</span>\n <span className=\"text-xs font-medium text-muted-foreground\">{rangeStr}</span>\n </div>\n <span className=\"rounded-lg bg-blue-50 px-2 py-1 text-xs font-semibold text-blue-600 dark:bg-blue-950/40 dark:text-blue-400\">\n {booking.weekCount} week{booking.weekCount !== 1 ? \"s\" : \"\"}\n </span>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction formatDateLabel(iso: string): string {\n if (!iso) return \"—\";\n return new Date(iso + \"T00:00:00\").toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n\nfunction isBillableDay(day: string, start: string, end: string): boolean {\n return Boolean(start && end && day >= start && day < end);\n}\n\nexport function DayCalendarPicker({\n selectedDate,\n onChange,\n minDate = todayLocalYmd(),\n flat = false,\n}: {\n selectedDate: string;\n onChange: (date: string) => void;\n minDate?: string;\n flat?: boolean;\n}) {\n const initDate = new Date((selectedDate || minDate) + \"T00:00:00\");\n const [calYear, setCalYear] = useState(initDate.getFullYear());\n const [calMonth, setCalMonth] = useState(initDate.getMonth());\n\n const days = getCalendarGrid(calYear, calMonth);\n\n const prevMonth = () => {\n if (calMonth === 0) {\n setCalYear((y) => y - 1);\n setCalMonth(11);\n } else setCalMonth((m) => m - 1);\n };\n const nextMonth = () => {\n if (calMonth === 11) {\n setCalYear((y) => y + 1);\n setCalMonth(0);\n } else setCalMonth((m) => m + 1);\n };\n\n return (\n <div\n className={cn(\n \"flex select-none flex-col\",\n flat ? \"gap-3\" : \"gap-1 rounded-2xl border border-border bg-card p-3\",\n )}\n >\n <div className={calendarBlockClass}>\n <div className={calendarNavRowClass}>\n <button\n type=\"button\"\n onClick={prevMonth}\n className=\"flex h-7 w-7 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-accent\"\n >\n <ChevronLeft size={12} strokeWidth={2.25} />\n </button>\n <span className=\"text-xs font-semibold text-muted-foreground\">\n {MONTH_NAMES[calMonth]} {calYear}\n </span>\n <button\n type=\"button\"\n onClick={nextMonth}\n className=\"flex h-7 w-7 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-accent\"\n >\n <ChevronRight size={12} strokeWidth={2.25} />\n </button>\n </div>\n\n <div className={calendarWeekdayRowClass}>\n {[\"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\", \"Su\"].map((d) => (\n <span key={d} className={calendarWeekdayCellClass}>\n {d}\n </span>\n ))}\n </div>\n\n <div className=\"grid grid-cols-7\">\n {days.map((d, i) => {\n const ds = dayStr(d);\n const isCurrentMonth = d.getMonth() === calMonth;\n const isSelectable = ds >= minDate;\n const isSelected = ds === selectedDate;\n\n return (\n <button\n key={ds}\n type=\"button\"\n disabled={!isSelectable}\n onClick={() => isSelectable && onChange(ds)}\n className={cn(\n \"flex h-9 items-center justify-center\",\n cellGridLines(i, days.length, 7),\n !isSelectable && \"cursor-not-allowed\",\n )}\n >\n <span\n className={cn(\n \"flex h-8 w-8 items-center justify-center rounded-full text-[11px] transition-colors\",\n isSelectable && isCurrentMonth && \"text-foreground hover:bg-accent\",\n isSelectable && !isCurrentMonth && \"text-muted-foreground hover:bg-accent\",\n !isSelectable && isCurrentMonth && \"text-muted-foreground/40\",\n !isSelectable && !isCurrentMonth && \"text-muted-foreground/30\",\n isSelected && \"bg-blue-500 font-semibold text-white shadow-sm\",\n )}\n >\n {d.getDate()}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n\n {selectedDate ? (\n <p className=\"mt-1 text-center text-[10px] text-muted-foreground\">\n Selected {formatDateLabel(selectedDate)}\n </p>\n ) : (\n <p className=\"mt-1 text-center text-[10px] text-muted-foreground\">Click a day to book</p>\n )}\n </div>\n );\n}\n\nexport function DayRangeCalendar({\n startDate,\n endDate,\n onChange,\n minDate = currentWeekStart(),\n flat = false,\n}: {\n startDate: string;\n endDate: string;\n onChange: (start: string, end: string) => void;\n minDate?: string;\n flat?: boolean;\n}) {\n const initDate = new Date((startDate || minDate) + \"T00:00:00\");\n const [calYear, setCalYear] = useState(initDate.getFullYear());\n const [calMonth, setCalMonth] = useState(initDate.getMonth());\n const [phase, setPhase] = useState<\"from\" | \"to\">(\"from\");\n const [hoverDay, setHoverDay] = useState<string | null>(null);\n\n const days = getCalendarGrid(calYear, calMonth);\n const lastBillableDay = endDate ? addDays(endDate, -1) : \"\";\n\n const [dispStart, dispEnd] = (() => {\n if (phase === \"to\" && hoverDay && startDate) {\n if (hoverDay >= startDate) return [startDate, addDays(hoverDay, 1)];\n return [hoverDay, addDays(hoverDay, 1)];\n }\n return [startDate, endDate];\n })();\n\n const dayCount = startDate && endDate ? diffDays(startDate, endDate) : 0;\n\n const handleClick = (ds: string) => {\n if (ds < minDate) return;\n if (phase === \"from\") {\n onChange(ds, addDays(ds, 1));\n setPhase(\"to\");\n return;\n }\n if (ds < startDate) {\n onChange(ds, addDays(ds, 1));\n setPhase(\"to\");\n return;\n }\n onChange(startDate, addDays(ds, 1));\n setPhase(\"from\");\n };\n\n const prevMonth = () => {\n if (calMonth === 0) {\n setCalYear((y) => y - 1);\n setCalMonth(11);\n } else setCalMonth((m) => m - 1);\n };\n const nextMonth = () => {\n if (calMonth === 11) {\n setCalYear((y) => y + 1);\n setCalMonth(0);\n } else setCalMonth((m) => m + 1);\n };\n\n return (\n <div\n className={cn(\n \"flex select-none flex-col\",\n flat ? \"gap-3\" : \"gap-1 rounded-2xl border border-border bg-card p-3\",\n )}\n >\n <div\n className={cn(\n \"flex items-center gap-2 px-1 text-[11px] font-medium\",\n phase === \"to\" ? \"text-blue-600 dark:text-blue-400\" : \"text-muted-foreground\",\n )}\n >\n {phase === \"from\" ? (\n <>\n <span className=\"h-1.5 w-1.5 shrink-0 rounded-full bg-muted-foreground/50\" />\n Click the first day\n </>\n ) : (\n <>\n <span className=\"h-1.5 w-1.5 shrink-0 animate-pulse rounded-full bg-blue-500\" />\n Click the last day\n <button\n type=\"button\"\n onClick={() => {\n onChange(startDate, addDays(startDate, 1));\n setPhase(\"to\");\n }}\n className=\"ml-auto text-[10px] text-blue-400 underline underline-offset-2 hover:text-blue-600 dark:text-blue-400\"\n >\n Reset\n </button>\n </>\n )}\n </div>\n\n <div className={calendarBlockClass}>\n <div className={calendarNavRowClass}>\n <button\n type=\"button\"\n onClick={prevMonth}\n className=\"flex h-7 w-7 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-accent\"\n >\n <ChevronLeft size={12} strokeWidth={2.25} />\n </button>\n <span className=\"text-xs font-semibold text-muted-foreground\">\n {MONTH_NAMES[calMonth]} {calYear}\n </span>\n <button\n type=\"button\"\n onClick={nextMonth}\n className=\"flex h-7 w-7 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-accent\"\n >\n <ChevronRight size={12} strokeWidth={2.25} />\n </button>\n </div>\n\n <div className={calendarWeekdayRowClass}>\n {[\"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\", \"Su\"].map((d) => (\n <span key={d} className={calendarWeekdayCellClass}>\n {d}\n </span>\n ))}\n </div>\n\n <div className=\"grid grid-cols-7\">\n {days.map((d, i) => {\n const ds = dayStr(d);\n const isCurrentMonth = d.getMonth() === calMonth;\n const isSelectable = ds >= minDate;\n const inRange = isBillableDay(ds, dispStart, dispEnd);\n const isStart = ds === dispStart;\n const isEnd = ds === lastBillableDay && dispEnd && diffDays(dispStart, dispEnd) > 1;\n const isSingle =\n dispStart && dispEnd && diffDays(dispStart, dispEnd) === 1 && ds === dispStart;\n\n return (\n <button\n key={ds}\n type=\"button\"\n disabled={!isSelectable}\n onMouseEnter={() => isSelectable && setHoverDay(ds)}\n onMouseLeave={() => setHoverDay(null)}\n onClick={() => isSelectable && handleClick(ds)}\n className={cn(\n \"relative flex h-9 items-center justify-center\",\n cellGridLines(i, days.length, 7),\n !isSelectable && \"cursor-not-allowed\",\n )}\n >\n {inRange && !isSingle ? (\n <span\n className={cn(\n \"absolute inset-y-1.5 bg-blue-100\",\n isStart\n ? \"left-1/2 right-0 rounded-l-full\"\n : isEnd\n ? \"left-0 right-1/2 rounded-r-full\"\n : \"inset-x-0\",\n )}\n />\n ) : null}\n <span\n className={cn(\n \"relative z-10 flex h-8 w-8 items-center justify-center rounded-full text-[11px] transition-colors\",\n !inRange && isSelectable && isCurrentMonth && \"text-foreground hover:bg-accent\",\n !inRange &&\n isSelectable &&\n !isCurrentMonth &&\n \"text-muted-foreground hover:bg-accent\",\n !isSelectable && isCurrentMonth && \"text-muted-foreground/40\",\n !isSelectable && !isCurrentMonth && \"text-muted-foreground/30\",\n inRange && \"font-medium text-blue-700 dark:text-blue-300\",\n (isStart || isEnd || isSingle) &&\n \"bg-blue-500 font-semibold text-white shadow-sm\",\n )}\n >\n {d.getDate()}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n\n <div className=\"flex items-center justify-between border-t border-border/70 pt-3 text-xs\">\n {dayCount > 0 ? (\n <>\n <span className=\"text-[10px] text-muted-foreground\">\n {formatDateLabel(startDate)}\n {dayCount > 1 ? ` → ${formatDateLabel(lastBillableDay)}` : \"\"}\n </span>\n <span className=\"rounded-full bg-blue-50 px-2 py-0.5 text-[10px] font-semibold text-blue-600 dark:bg-blue-950/40 dark:text-blue-400\">\n {dayCount} day{dayCount !== 1 ? \"s\" : \"\"}\n </span>\n </>\n ) : (\n <span className=\"text-[10px] text-muted-foreground/60\">Select a date range</span>\n )}\n </div>\n </div>\n );\n}\n\nexport function DayPeriodPicker({\n booking,\n onChange,\n flat = true,\n}: {\n booking: BookingState;\n onChange: (patch: Partial<BookingState>) => void;\n flat?: boolean;\n}) {\n const oneDay = booking.oneDayBooking ?? true;\n const dayCount = oneDay ? 1 : diffDays(booking.startDate, booking.endDate);\n\n return (\n <div className={cn(\"flex flex-col\", flat ? \"gap-5\" : \"gap-3\")}>\n <CheckboxField\n size=\"sm\"\n label=\"Select a date range\"\n className=\"w-fit items-center\"\n checked={!oneDay}\n onCheckedChange={(checked) => {\n const start = booking.startDate || todayLocalYmd();\n if (!checked) {\n onChange({ oneDayBooking: true, startDate: start, endDate: addDays(start, 1) });\n return;\n }\n const end =\n booking.endDate && booking.endDate > start && diffDays(start, booking.endDate) > 1\n ? booking.endDate\n : addDays(start, 7);\n onChange({ oneDayBooking: false, startDate: start, endDate: end });\n }}\n />\n\n {oneDay ? (\n <DayCalendarPicker\n flat={flat}\n selectedDate={booking.startDate}\n onChange={(v) => onChange({ startDate: v, endDate: addDays(v, 1) })}\n />\n ) : (\n <DayRangeCalendar\n flat={flat}\n startDate={booking.startDate}\n endDate={booking.endDate}\n onChange={(start, end) => onChange({ startDate: start, endDate: end })}\n />\n )}\n\n {dayCount > 0 ? (\n <div className=\"flex items-center justify-between rounded-xl border border-border bg-muted px-3 py-2.5\">\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-[10px] text-muted-foreground\">Period</span>\n <span className=\"text-xs font-medium text-muted-foreground\">\n {oneDay\n ? formatDateLabel(booking.startDate)\n : `${formatDateLabel(booking.startDate)} → ${formatDateLabel(addDays(booking.endDate, -1))}`}\n </span>\n </div>\n <span className=\"rounded-lg bg-blue-50 px-2 py-1 text-xs font-semibold text-blue-600 dark:bg-blue-950/40 dark:text-blue-400\">\n {dayCount} day{dayCount !== 1 ? \"s\" : \"\"}\n </span>\n </div>\n ) : null}\n </div>\n );\n}\n\ntype HourlyPickerStep = \"date\" | \"time\";\n\nfunction HourlyTimeRangeFields({\n fromTime,\n scheduleEndTime,\n chargeBy,\n timeFormat,\n toOptions,\n minTo,\n onFromChange,\n onToChange,\n vertical = false,\n}: {\n fromTime: string;\n scheduleEndTime: string;\n chargeBy: \"hours\" | \"minutes\";\n timeFormat: \"12h\" | \"24h\";\n toOptions: string[];\n minTo: string | undefined;\n onFromChange: (nextFrom: string) => void;\n onToChange: (v: string) => void;\n vertical?: boolean;\n}) {\n const fields = (\n <>\n <div className=\"flex flex-col gap-1.5\">\n <ScheduleFieldLabel>From</ScheduleFieldLabel>\n <TimeField value={fromTime} onChange={onFromChange} timeFormat={timeFormat} />\n </div>\n {vertical ? <div className=\"h-px bg-border\" aria-hidden /> : null}\n <div className=\"flex flex-col gap-1.5\">\n <ScheduleFieldLabel>To</ScheduleFieldLabel>\n {chargeBy === \"hours\" ? (\n <TimeField\n value={scheduleEndTime}\n onChange={onToChange}\n timeFormat={timeFormat}\n allowedTimes={toOptions}\n disabled={toOptions.length === 0}\n placeholder={toOptions.length === 0 ? \"No later times\" : \"Select time\"}\n />\n ) : (\n <TimeField\n value={scheduleEndTime}\n onChange={onToChange}\n timeFormat={timeFormat}\n minTime={minTo}\n disabled={!minTo}\n placeholder={minTo ? \"Select time\" : \"No later times\"}\n />\n )}\n </div>\n </>\n );\n\n if (vertical) {\n return <div className=\"flex flex-col gap-4\">{fields}</div>;\n }\n\n return <div className=\"grid grid-cols-2 gap-3\">{fields}</div>;\n}\n\nexport function HourlySchedulePicker({\n scheduleDate,\n scheduleTime,\n scheduleEndTime = \"\",\n onChange,\n timeFormat = \"24h\",\n flat = true,\n chargeBy = \"hours\",\n splitLayout = false,\n stackLayout = false,\n}: {\n scheduleDate: string;\n scheduleTime: string;\n scheduleEndTime?: string;\n onChange: (patch: {\n scheduleDate?: string;\n scheduleTime?: string;\n scheduleEndTime?: string;\n }) => void;\n timeFormat?: \"12h\" | \"24h\";\n flat?: boolean;\n chargeBy?: \"hours\" | \"minutes\";\n /** Calendar and time pickers side-by-side; From / To stacked on the right. */\n splitLayout?: boolean;\n /** Calendar on top; From / To stacked underneath (always visible). */\n stackLayout?: boolean;\n}) {\n const [step, setStep] = useState<HourlyPickerStep>(\"date\");\n const fromTime = scheduleTime || \"09:00\";\n const toOptions = chargeBy === \"hours\" ? hourlyEndTimes(fromTime) : [];\n const minTo = chargeBy === \"minutes\" ? addMinutesToHm(fromTime, 1) ?? undefined : undefined;\n\n const handleFromChange = (nextFrom: string) => {\n onChange({\n scheduleTime: nextFrom,\n scheduleEndTime: snapScheduleEndTime(nextFrom, scheduleEndTime, chargeBy),\n });\n };\n\n const handleDateChange = (v: string) => {\n const nextFrom = scheduleTime || \"09:00\";\n onChange({\n scheduleDate: v,\n scheduleTime: nextFrom,\n scheduleEndTime:\n scheduleEndTime || snapScheduleEndTime(nextFrom, \"\", chargeBy) || \"10:00\",\n });\n };\n\n const summary =\n scheduleDate && fromTime && scheduleEndTime ? (\n <div className=\"flex items-center justify-between rounded-xl border border-border bg-muted px-3 py-2.5\">\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-[10px] text-muted-foreground\">Scheduled for</span>\n <span className=\"text-xs font-medium text-foreground\">\n {formatDateLabel(scheduleDate)} · {formatTimeForDisplay(fromTime, timeFormat)} →{\" \"}\n {formatTimeForDisplay(scheduleEndTime, timeFormat)}\n </span>\n </div>\n </div>\n ) : null;\n\n const timeFields = (\n <HourlyTimeRangeFields\n fromTime={fromTime}\n scheduleEndTime={scheduleEndTime}\n chargeBy={chargeBy}\n timeFormat={timeFormat}\n toOptions={toOptions}\n minTo={minTo}\n onFromChange={handleFromChange}\n onToChange={(v) => onChange({ scheduleEndTime: v })}\n vertical={splitLayout || stackLayout}\n />\n );\n\n if (stackLayout) {\n return (\n <div className={cn(\"flex flex-col gap-5\", flat ? \"\" : \"rounded-2xl border border-border bg-card p-4\")}>\n <div className=\"flex flex-col gap-1.5\">\n <ScheduleFieldLabel>Date</ScheduleFieldLabel>\n <DayCalendarPicker\n flat={flat}\n selectedDate={scheduleDate}\n minDate={todayLocalYmd()}\n onChange={handleDateChange}\n />\n </div>\n {timeFields}\n {summary}\n </div>\n );\n }\n\n if (splitLayout) {\n return (\n <div className={cn(\"flex flex-col gap-5\", flat ? \"\" : \"rounded-2xl border border-border bg-card p-4\")}>\n <div className=\"flex flex-col gap-5 sm:flex-row sm:items-start\">\n <div className=\"min-w-0 flex-1\">\n <ScheduleFieldLabel>Date</ScheduleFieldLabel>\n <div className=\"mt-1.5\">\n <DayCalendarPicker\n flat={flat}\n selectedDate={scheduleDate}\n minDate={todayLocalYmd()}\n onChange={handleDateChange}\n />\n </div>\n </div>\n <div className=\"hidden w-px shrink-0 self-stretch bg-border sm:block\" aria-hidden />\n <div className=\"min-w-[9.5rem] shrink-0 sm:w-44\">\n <ScheduleFieldLabel>Time</ScheduleFieldLabel>\n <div className=\"mt-1.5\">{timeFields}</div>\n </div>\n </div>\n {summary}\n </div>\n );\n }\n\n return (\n <div className={cn(\"flex flex-col gap-5\", flat ? \"\" : \"rounded-2xl border border-border bg-card p-4\")}>\n <div className=\"flex items-center gap-1.5 text-[11px] font-medium text-muted-foreground\">\n <span\n className={cn(\n step === \"date\" && \"font-semibold text-blue-600 dark:text-blue-400\",\n scheduleDate && step !== \"date\" && \"text-foreground\",\n )}\n >\n Date\n </span>\n <span aria-hidden>·</span>\n <span\n className={cn(\n step === \"time\" && \"font-semibold text-blue-600 dark:text-blue-400\",\n step !== \"time\" && \"text-muted-foreground/60\",\n )}\n >\n Time\n </span>\n </div>\n\n {step === \"date\" ? (\n <div className=\"flex flex-col gap-3\">\n <ScheduleFieldLabel>Pick a day</ScheduleFieldLabel>\n <DayCalendarPicker\n flat={flat}\n selectedDate={scheduleDate}\n minDate={todayLocalYmd()}\n onChange={(v) => {\n handleDateChange(v);\n setStep(\"time\");\n }}\n />\n <p className=\"text-center text-[11px] text-muted-foreground\">Select a day to set the time</p>\n </div>\n ) : (\n <div className=\"flex flex-col gap-5\">\n <button\n type=\"button\"\n onClick={() => setStep(\"date\")}\n className=\"inline-flex w-fit items-center gap-2 rounded-xl border border-border bg-muted/60 px-3 py-2 text-left transition-colors hover:bg-muted\"\n >\n <ChevronLeft size={14} className=\"shrink-0 text-muted-foreground\" />\n <div>\n <p className=\"text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">Date</p>\n <p className=\"text-sm font-medium text-foreground\">{formatDateLabel(scheduleDate)}</p>\n </div>\n <span className=\"ml-2 text-[11px] font-medium text-blue-600 dark:text-blue-400\">Change</span>\n </button>\n\n {timeFields}\n\n {summary}\n </div>\n )}\n </div>\n );\n}\n\nexport function ServiceNeededAtPicker({\n scheduleDate,\n scheduleTime,\n onChange,\n timeFormat = \"24h\",\n flat = true,\n stackLayout = true,\n minDate = todayLocalYmd(),\n preparationMinutes = 0,\n}: {\n scheduleDate: string;\n scheduleTime: string;\n onChange: (patch: {\n scheduleDate?: string;\n scheduleTime?: string;\n scheduleEndTime?: string;\n startDate?: string;\n endDate?: string;\n }) => void;\n timeFormat?: \"12h\" | \"24h\";\n flat?: boolean;\n stackLayout?: boolean;\n minDate?: string;\n /** When booking for today, earliest Needed-at is now + this many minutes. */\n preparationMinutes?: number;\n}) {\n const neededTime = scheduleTime || \"09:00\";\n const todayYmd = todayLocalYmd();\n const minTimeToday =\n preparationMinutes > 0 && scheduleDate === todayYmd\n ? minNeededTimeHm(preparationMinutes)\n : undefined;\n\n const syncNeeded = (date: string, time: string) => {\n let nextTime = time;\n if (preparationMinutes > 0 && date === todayYmd) {\n const floor = minNeededTimeHm(preparationMinutes);\n if (floor && nextTime < floor) nextTime = floor;\n }\n onChange({\n scheduleDate: date,\n scheduleTime: nextTime,\n scheduleEndTime: nextTime,\n startDate: date,\n endDate: date,\n });\n };\n\n const handleDateChange = (v: string) => syncNeeded(v, neededTime);\n const handleTimeChange = (v: string) => {\n if (!scheduleDate) return;\n syncNeeded(scheduleDate, v);\n };\n\n const summary =\n scheduleDate && neededTime ? (\n <div className=\"flex items-center justify-between rounded-xl border border-border bg-muted px-3 py-2.5\">\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-[10px] text-muted-foreground\">Needed at</span>\n <span className=\"text-xs font-medium text-foreground\">\n {formatDateLabel(scheduleDate)} · {formatTimeForDisplay(neededTime, timeFormat)}\n </span>\n </div>\n </div>\n ) : null;\n\n const timeField = (\n <div className=\"flex flex-col gap-1.5\">\n <ScheduleFieldLabel>Needed at</ScheduleFieldLabel>\n <TimeField\n value={neededTime}\n onChange={handleTimeChange}\n timeFormat={timeFormat}\n minTime={minTimeToday}\n disabled={Boolean(minTimeToday && !minTimeToday)}\n placeholder={minTimeToday ? \"Select time\" : undefined}\n />\n </div>\n );\n\n if (stackLayout) {\n return (\n <div className={cn(\"flex flex-col gap-5\", flat ? \"\" : \"rounded-2xl border border-border bg-card p-4\")}>\n <div className=\"flex flex-col gap-1.5\">\n <ScheduleFieldLabel>Date</ScheduleFieldLabel>\n <DayCalendarPicker\n flat={flat}\n selectedDate={scheduleDate}\n minDate={minDate}\n onChange={handleDateChange}\n />\n </div>\n {timeField}\n {summary}\n </div>\n );\n }\n\n return (\n <div className={cn(\"flex flex-col gap-5 sm:flex-row sm:items-start\", flat ? \"\" : \"rounded-2xl border border-border bg-card p-4\")}>\n <div className=\"min-w-0 flex-1\">\n <ScheduleFieldLabel>Date</ScheduleFieldLabel>\n <div className=\"mt-1.5\">\n <DayCalendarPicker\n flat={flat}\n selectedDate={scheduleDate}\n minDate={minDate}\n onChange={handleDateChange}\n />\n </div>\n </div>\n <div className=\"hidden w-px shrink-0 self-stretch bg-border sm:block\" aria-hidden />\n <div className=\"min-w-[9.5rem] shrink-0 sm:w-44\">{timeField}</div>\n {summary ? <div className=\"w-full\">{summary}</div> : null}\n </div>\n );\n}\n\nfunction minNeededTimeHm(prepMinutes: number, now: Date = new Date()): string {\n const earliest = new Date(now.getTime() + prepMinutes * 60_000);\n if (earliest.getSeconds() > 0 || earliest.getMilliseconds() > 0) {\n earliest.setMinutes(earliest.getMinutes() + 1);\n }\n earliest.setSeconds(0, 0);\n return `${String(earliest.getHours()).padStart(2, \"0\")}:${String(earliest.getMinutes()).padStart(2, \"0\")}`;\n}\n"]}
1
+ {"version":3,"sources":["../src/booking/booking-schedule-calendars.tsx"],"names":[],"mappings":"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","file":"booking-schedule-calendars.js","sourcesContent":["import { useEffect, useState } from \"react\";\nimport { ChevronLeft, ChevronRight, Info } from \"lucide-react\";\nimport {\n MIN_MONTH,\n MIN_WEEK_START,\n PRICING_TODAY,\n addDays,\n addMonthsYm,\n currentMonthYm,\n currentWeekStart,\n diffDays,\n localDateYmd,\n monthCount,\n monthLabel,\n todayLocalYmd,\n weekCountBetween,\n weekRangeLabel,\n type BookingState,\n} from \"../lib/booking-schedule\";\nimport {\n TimeField,\n addMinutesToHm,\n formatTimeForDisplay,\n hourlyEndTimes,\n snapScheduleEndTime,\n} from \"../ui/time-field\";\nimport { CheckboxField } from \"../ui/checkbox-field\";\nimport { cn } from \"../ui/utils\";\n\nconst MONTH_NAMES = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\n\nfunction dayStr(d: Date): string {\n return localDateYmd(d);\n}\n\n/** Nav row, weekday row, and cells share hairlines so the calendar reads as one framed block. */\nconst calendarBlockClass = \"flex flex-col overflow-hidden rounded-xl border border-border/60\";\nconst calendarNavRowClass =\n \"flex items-center justify-between border-b border-border/40 px-2 py-1.5\";\nconst calendarWeekdayRowClass = \"grid grid-cols-7 border-b border-border/40\";\nconst calendarWeekdayCellClass =\n \"flex h-9 items-center justify-center border-r border-border/40 text-[10px] font-medium text-muted-foreground last:border-r-0\";\n\n/** Hairlines between cells of a fixed-column grid, without an outer frame. */\nfunction cellGridLines(index: number, total: number, cols: number): string {\n return cn(\n \"border-border/40\",\n index % cols !== cols - 1 && \"border-r\",\n index < total - cols && \"border-b\",\n );\n}\n\nfunction weekEndMonday(weekFrom: string, weekCount: number): string {\n if (!weekFrom || weekCount < 1) return weekFrom;\n return addDays(weekFrom, (weekCount - 1) * 7);\n}\n\n/** Returns dates for a Mon-anchored calendar grid (5 or 6 rows). */\nfunction getCalendarGrid(year: number, month: number): Date[] {\n const firstDay = new Date(year, month, 1);\n const dow = firstDay.getDay();\n const startOffset = dow === 0 ? -6 : 1 - dow;\n const days: Date[] = [];\n for (let i = 0; i < 35; i++) {\n days.push(new Date(year, month, 1 + startOffset + i));\n }\n if (days[days.length - 1] < new Date(year, month + 1, 0)) {\n for (let i = 35; i < 42; i++) {\n days.push(new Date(year, month, 1 + startOffset + i));\n }\n }\n return days;\n}\n\nexport function ScheduleFieldLabel({ children }: { children: React.ReactNode }) {\n return <label className=\"text-xs font-medium text-muted-foreground\">{children}</label>;\n}\n\nexport function ScheduleInfoBanner({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"flex items-start gap-2 rounded-xl border border-blue-100 bg-blue-50 px-3 py-2.5 dark:border-blue-900/50 dark:bg-blue-950/40\">\n <Info size={13} className=\"mt-0.5 shrink-0 text-blue-400\" />\n <span className=\"text-xs leading-relaxed text-blue-700 dark:text-blue-400\">{children}</span>\n </div>\n );\n}\n\nexport function ScheduleStepper({\n value,\n min = 1,\n max = 100,\n onChange,\n}: {\n value: number;\n min?: number;\n max?: number;\n onChange: (v: number) => void;\n}) {\n return (\n <div className=\"flex w-32 items-center overflow-hidden rounded-xl border border-border bg-card\">\n <button\n type=\"button\"\n onClick={() => onChange(Math.max(min, value - 1))}\n className=\"flex h-9 w-9 shrink-0 items-center justify-center border-r border-border text-sm text-muted-foreground hover:bg-accent\"\n >\n −\n </button>\n <span className=\"flex-1 text-center text-sm font-medium text-foreground\">{value}</span>\n <button\n type=\"button\"\n onClick={() => onChange(Math.min(max, value + 1))}\n className=\"flex h-9 w-9 shrink-0 items-center justify-center border-l border-border text-sm text-muted-foreground hover:bg-accent\"\n >\n +\n </button>\n </div>\n );\n}\n\nexport function WeekCalendarPicker({\n weekFrom,\n weekCount,\n rangeMode,\n onChange,\n flat = false,\n}: {\n weekFrom: string;\n weekCount: number;\n rangeMode: boolean;\n onChange: (weekFrom: string, weekCount: number) => void;\n flat?: boolean;\n}) {\n const initDate = new Date((weekFrom || MIN_WEEK_START) + \"T00:00:00\");\n const [calYear, setCalYear] = useState(initDate.getFullYear());\n const [calMonth, setCalMonth] = useState(initDate.getMonth());\n const [hoverMon, setHoverMon] = useState<string | null>(null);\n const [phase, setPhase] = useState<\"from\" | \"to\">(\"from\");\n\n useEffect(() => {\n setPhase(\"from\");\n }, [rangeMode]);\n\n const days = getCalendarGrid(calYear, calMonth);\n const minDate = new Date((currentWeekStart() || PRICING_TODAY) + \"T00:00:00\");\n const endMon = weekEndMonday(weekFrom, weekCount);\n\n const [dispFrom, dispTo] = (() => {\n if (!rangeMode || !weekFrom) return [weekFrom, endMon];\n if (phase === \"to\" && hoverMon) {\n if (hoverMon >= weekFrom) return [weekFrom, hoverMon];\n return [hoverMon, hoverMon];\n }\n return [weekFrom, endMon];\n })();\n\n const previewCount =\n rangeMode && phase === \"to\" && hoverMon && hoverMon >= weekFrom\n ? weekCountBetween(weekFrom, hoverMon)\n : weekCount;\n\n const prevMonth = () => {\n if (calMonth === 0) {\n setCalYear((y) => y - 1);\n setCalMonth(11);\n } else setCalMonth((m) => m - 1);\n };\n const nextMonth = () => {\n if (calMonth === 11) {\n setCalYear((y) => y + 1);\n setCalMonth(0);\n } else setCalMonth((m) => m + 1);\n };\n\n const weeks: Date[][] = [];\n for (let i = 0; i < days.length; i += 7) weeks.push(days.slice(i, i + 7));\n\n const handleWeekClick = (monStr: string) => {\n if (!rangeMode) {\n onChange(monStr, 1);\n return;\n }\n if (phase === \"from\") {\n onChange(monStr, 1);\n setPhase(\"to\");\n return;\n }\n if (monStr >= weekFrom) {\n onChange(weekFrom, weekCountBetween(weekFrom, monStr));\n setPhase(\"from\");\n return;\n }\n onChange(monStr, 1);\n setPhase(\"to\");\n };\n\n return (\n <div\n className={cn(\n \"flex select-none flex-col\",\n flat ? \"gap-3\" : \"gap-1 rounded-2xl border border-border bg-card p-3\",\n )}\n >\n {rangeMode ? (\n <div\n className={cn(\n \"flex items-center gap-2 px-1 text-[11px] font-medium\",\n phase === \"to\" ? \"text-blue-600 dark:text-blue-400\" : \"text-muted-foreground\",\n )}\n >\n {phase === \"from\" ? (\n <>\n <span className=\"h-1.5 w-1.5 shrink-0 rounded-full bg-muted-foreground/50\" />\n Click the first week\n </>\n ) : (\n <>\n <span className=\"h-1.5 w-1.5 shrink-0 animate-pulse rounded-full bg-blue-500\" />\n Click the last week\n <button\n type=\"button\"\n onClick={() => {\n onChange(weekFrom, 1);\n setPhase(\"to\");\n }}\n className=\"ml-auto text-[10px] text-blue-400 underline underline-offset-2 hover:text-blue-600 dark:text-blue-400\"\n >\n Reset\n </button>\n </>\n )}\n </div>\n ) : null}\n\n <div className={calendarBlockClass}>\n <div className={calendarNavRowClass}>\n <button\n type=\"button\"\n onClick={prevMonth}\n className=\"flex h-7 w-7 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-accent hover:text-muted-foreground\"\n >\n <ChevronLeft size={12} strokeWidth={2.25} />\n </button>\n <span className=\"text-xs font-semibold text-muted-foreground\">\n {MONTH_NAMES[calMonth]} {calYear}\n </span>\n <button\n type=\"button\"\n onClick={nextMonth}\n className=\"flex h-7 w-7 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-accent hover:text-muted-foreground\"\n >\n <ChevronRight size={12} strokeWidth={2.25} />\n </button>\n </div>\n\n <div className={calendarWeekdayRowClass}>\n {[\"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\", \"Su\"].map((d) => (\n <span key={d} className={calendarWeekdayCellClass}>\n {d}\n </span>\n ))}\n </div>\n\n <div className=\"flex flex-col divide-y divide-border/40\">\n {weeks.map((week, wi) => {\n const mondayDate = week[0];\n const monStr = dayStr(mondayDate);\n const isSelectable = mondayDate >= minDate;\n const isStartWeek = Boolean(weekFrom) && monStr === dispFrom;\n const isEndWeek = Boolean(weekFrom) && monStr === dispTo;\n const inRange =\n rangeMode && Boolean(weekFrom) && monStr >= dispFrom && monStr <= dispTo;\n const isSelected = rangeMode ? inRange : monStr === weekFrom;\n\n return (\n <div\n key={wi}\n className={cn(\n \"relative flex cursor-pointer transition-colors\",\n isSelected && (isStartWeek || isEndWeek) && \"bg-blue-100/80\",\n isSelected && !isStartWeek && !isEndWeek && \"bg-blue-50\",\n isSelectable ? \"hover:bg-accent/60\" : \"cursor-not-allowed opacity-60\",\n )}\n onMouseEnter={() => isSelectable && setHoverMon(monStr)}\n onMouseLeave={() => setHoverMon(null)}\n onClick={() => isSelectable && handleWeekClick(monStr)}\n >\n {week.map((d, di) => {\n const isCurrentMonth = d.getMonth() === calMonth;\n const isMon = di === 0;\n const isSun = di === 6;\n const filled = rangeMode\n ? (isStartWeek && isMon) || (isEndWeek && isSun)\n : isSelected && isMon;\n\n return (\n <div\n key={di}\n className=\"relative z-10 flex h-9 flex-1 items-center justify-center border-r border-border/40 last:border-r-0\"\n >\n <span\n className={cn(\n \"flex h-7 w-7 items-center justify-center rounded-full text-[11px] transition-colors\",\n isCurrentMonth ? \"text-muted-foreground\" : \"text-muted-foreground/50\",\n !isSelectable && \"text-muted-foreground/40\",\n isSelected && \"font-medium text-blue-700 dark:text-blue-300\",\n filled && \"bg-blue-500 font-semibold text-white shadow-sm\",\n )}\n >\n {d.getDate()}\n </span>\n </div>\n );\n })}\n </div>\n );\n })}\n </div>\n </div>\n\n <p className=\"mt-1 text-center text-[10px] text-muted-foreground\">\n {rangeMode\n ? phase === \"from\"\n ? \"Click a week to start the range\"\n : previewCount > 1\n ? `${previewCount} weeks · ${weekRangeLabel(dispFrom, previewCount)}`\n : \"Click a week to finish the range\"\n : weekFrom\n ? `Selected week of ${formatDateLabel(weekFrom)}`\n : \"Click any row to select that week\"}\n </p>\n </div>\n );\n}\n\nexport function MonthRangeCalendar({\n monthFrom,\n monthTo,\n onChange,\n rangeMode,\n flat = false,\n}: {\n monthFrom: string;\n monthTo: string;\n onChange: (from: string, to: string) => void;\n rangeMode: boolean;\n flat?: boolean;\n}) {\n const initYear = monthFrom ? parseInt(monthFrom.split(\"-\")[0], 10) : new Date().getFullYear();\n const [calYear, setCalYear] = useState(initYear);\n const [phase, setPhase] = useState<\"from\" | \"to\">(\"from\");\n const [hoverYm, setHoverYm] = useState<string | null>(null);\n\n useEffect(() => {\n setPhase(\"from\");\n }, [rangeMode]);\n\n const ABBR = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n const toYm = (y: number, m: number) => `${y}-${String(m + 1).padStart(2, \"0\")}`;\n const minYm = currentMonthYm() || `${new Date().getFullYear()}-01`;\n\n const [dispFrom, dispTo] = (() => {\n if (!rangeMode) return [monthFrom, monthFrom || monthTo];\n if (phase === \"to\" && hoverYm) {\n if (hoverYm >= monthFrom) return [monthFrom, hoverYm];\n return [hoverYm, hoverYm];\n }\n return [monthFrom, monthTo];\n })();\n const isSingle = dispFrom === dispTo;\n\n const handleClick = (ymStr: string) => {\n if (ymStr < minYm) return;\n if (!rangeMode) {\n onChange(ymStr, ymStr);\n return;\n }\n if (phase === \"from\") {\n onChange(ymStr, ymStr);\n setPhase(\"to\");\n } else if (ymStr >= monthFrom) {\n onChange(monthFrom, ymStr);\n setPhase(\"from\");\n } else {\n onChange(ymStr, ymStr);\n setPhase(\"to\");\n }\n };\n\n const actualCount = monthCount(monthFrom, monthTo);\n const previewCount = monthCount(dispFrom, dispTo);\n\n return (\n <div\n className={cn(\n \"select-none\",\n flat ? \"flex flex-col gap-5\" : \"overflow-hidden rounded-2xl border border-border bg-card\",\n )}\n >\n {rangeMode ? (\n <div\n className={cn(\n \"flex items-center gap-2 text-[11px] font-medium transition-colors\",\n flat\n ? phase === \"to\"\n ? \"text-blue-600 dark:text-blue-400\"\n : \"text-muted-foreground\"\n : cn(\n \"px-4 py-2 text-[10px]\",\n phase === \"to\"\n ? \"bg-blue-50 text-blue-600 dark:bg-blue-950/40 dark:text-blue-400\"\n : \"bg-transparent text-muted-foreground\",\n ),\n )}\n >\n {phase === \"from\" ? (\n <>\n <span className=\"h-1.5 w-1.5 shrink-0 rounded-full bg-muted-foreground/50\" />\n Click the first month\n </>\n ) : (\n <>\n <span className=\"h-1.5 w-1.5 shrink-0 animate-pulse rounded-full bg-blue-500\" />\n Click the last month\n <button\n type=\"button\"\n onClick={() => {\n onChange(monthFrom, monthFrom);\n setPhase(\"to\");\n }}\n className=\"ml-auto text-[10px] text-blue-400 underline underline-offset-2 hover:text-blue-600 dark:text-blue-400\"\n >\n Reset\n </button>\n </>\n )}\n </div>\n ) : null}\n\n <div className={cn(calendarBlockClass, !flat && \"mx-3 mb-3\")}>\n <div className={calendarNavRowClass}>\n <button\n type=\"button\"\n onClick={() => setCalYear((y) => y - 1)}\n className=\"flex h-7 w-7 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-accent hover:text-muted-foreground\"\n >\n <ChevronLeft size={12} strokeWidth={2.25} />\n </button>\n <span className=\"text-xs font-semibold text-muted-foreground\">{calYear}</span>\n <button\n type=\"button\"\n onClick={() => setCalYear((y) => y + 1)}\n className=\"flex h-7 w-7 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-accent hover:text-muted-foreground\"\n >\n <ChevronRight size={12} strokeWidth={2.25} />\n </button>\n </div>\n\n <div className=\"grid grid-cols-4\">\n {ABBR.map((label, i) => {\n const ymStr = toYm(calYear, i);\n const disabled = ymStr < minYm;\n const inRange = !disabled && ymStr >= dispFrom && ymStr <= dispTo;\n const isFrom = ymStr === dispFrom;\n const isTo = ymStr === dispTo;\n const showStrip = rangeMode && inRange && !isSingle;\n const sLeft = isFrom ? \"left-1/2\" : \"left-0\";\n const sRight = isTo ? \"right-1/2\" : \"right-0\";\n const filled = (isFrom || isTo || (!rangeMode && ymStr === monthFrom)) && !disabled;\n\n return (\n <div\n key={i}\n className={cn(\n \"relative\",\n cellGridLines(i, 12, 4),\n flat ? \"h-14\" : \"h-12\",\n disabled ? \"cursor-not-allowed\" : \"cursor-pointer\",\n )}\n onMouseEnter={() => !disabled && setHoverYm(ymStr)}\n onMouseLeave={() => setHoverYm(null)}\n onClick={() => handleClick(ymStr)}\n >\n {showStrip ? (\n <div className={`absolute bottom-1.5 top-1.5 bg-blue-100 ${sLeft} ${sRight}`} />\n ) : null}\n <div\n className={cn(\n \"relative z-10 flex w-full items-center justify-center\",\n flat ? \"h-14\" : \"h-12\",\n )}\n >\n <span\n className={`flex h-9 w-9 items-center justify-center rounded-full text-xs font-medium transition-all duration-100\n ${\n filled\n ? \"bg-blue-500 text-white shadow-md shadow-blue-200\"\n : inRange\n ? \"text-blue-700 dark:text-blue-400\"\n : !disabled\n ? \"text-muted-foreground hover:bg-accent\"\n : \"text-muted-foreground/60\"\n }`}\n >\n {label}\n </span>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n\n <div\n className={cn(\n \"flex items-center justify-between transition-colors\",\n flat\n ? \"border-t border-border/70 pt-4 text-xs\"\n : cn(\n \"border-t px-4 py-2.5\",\n rangeMode && phase === \"from\" && actualCount > 0\n ? \"border-border bg-muted\"\n : \"border-transparent\",\n ),\n )}\n >\n {!rangeMode && monthFrom ? (\n <>\n <span className=\"text-[10px] text-muted-foreground\">{monthLabel(monthFrom)}</span>\n <span className=\"rounded-full bg-blue-50 px-2 py-0.5 text-[10px] font-semibold text-blue-600 dark:bg-blue-950/40 dark:text-blue-400\">\n 1 month\n </span>\n </>\n ) : rangeMode && phase === \"from\" && actualCount > 0 ? (\n <>\n <span className=\"text-[10px] text-muted-foreground\">\n {monthLabel(monthFrom)} → {monthLabel(monthTo)}\n </span>\n <span className=\"rounded-full bg-blue-50 px-2 py-0.5 text-[10px] font-semibold text-blue-600 dark:bg-blue-950/40 dark:text-blue-400\">\n {actualCount} month{actualCount !== 1 ? \"s\" : \"\"}\n </span>\n </>\n ) : rangeMode && phase === \"to\" ? (\n <>\n <span className=\"text-[10px] text-muted-foreground\">\n {hoverYm && hoverYm >= monthFrom\n ? `${monthLabel(monthFrom)} → ${monthLabel(hoverYm)}`\n : `Start: ${monthLabel(monthFrom)}`}\n </span>\n {hoverYm && hoverYm >= monthFrom && previewCount > 0 ? (\n <span className=\"text-[10px] font-medium text-blue-400\">\n {previewCount} month{previewCount !== 1 ? \"s\" : \"\"}\n </span>\n ) : null}\n </>\n ) : (\n <span className=\"text-[10px] text-muted-foreground/60\">\n {rangeMode ? \"Select a month range\" : \"Click a month to book\"}\n </span>\n )}\n </div>\n </div>\n );\n}\n\nexport function MonthPeriodPicker({\n booking,\n onChange,\n flat = true,\n}: {\n booking: BookingState;\n onChange: (patch: Partial<BookingState>) => void;\n flat?: boolean;\n}) {\n const [rangeMode, setRangeMode] = useState(\n () => Boolean(booking.monthFrom && booking.monthTo && booking.monthFrom !== booking.monthTo),\n );\n\n useEffect(() => {\n if (booking.monthFrom && booking.monthTo && booking.monthFrom !== booking.monthTo) {\n setRangeMode(true);\n }\n }, [booking.monthFrom, booking.monthTo]);\n\n const monthCountSelected = monthCount(booking.monthFrom, booking.monthTo);\n\n return (\n <div className={cn(\"flex flex-col\", flat ? \"gap-5\" : \"gap-3\")}>\n <ScheduleInfoBanner>\n Current month is available at full price, or choose a future month.\n </ScheduleInfoBanner>\n\n <CheckboxField\n size=\"sm\"\n label=\"Select multiple months\"\n className=\"w-fit items-center\"\n checked={rangeMode}\n onCheckedChange={(checked) => {\n setRangeMode(checked);\n const from = booking.monthFrom || currentMonthYm();\n if (!checked) {\n onChange({ monthFrom: from, monthTo: from });\n return;\n }\n const to =\n booking.monthTo && booking.monthTo > from ? booking.monthTo : addMonthsYm(from, 1);\n onChange({ monthFrom: from, monthTo: to });\n }}\n />\n\n <ScheduleFieldLabel>{rangeMode ? \"Select month range\" : \"Select month\"}</ScheduleFieldLabel>\n <MonthRangeCalendar\n flat={flat}\n rangeMode={rangeMode}\n monthFrom={booking.monthFrom}\n monthTo={booking.monthTo}\n onChange={(from, to) => onChange({ monthFrom: from, monthTo: to })}\n />\n\n {monthCountSelected > 0 ? (\n <div className=\"flex items-center justify-between rounded-xl border border-border bg-muted px-3 py-2.5\">\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-[10px] text-muted-foreground\">Period</span>\n <span className=\"text-xs font-medium text-muted-foreground\">\n {rangeMode && monthCountSelected > 1\n ? `${monthLabel(booking.monthFrom)} → ${monthLabel(booking.monthTo)}`\n : monthLabel(booking.monthFrom)}\n </span>\n </div>\n <span className=\"rounded-lg bg-blue-50 px-2 py-1 text-xs font-semibold text-blue-600 dark:bg-blue-950/40 dark:text-blue-400\">\n {monthCountSelected} month{monthCountSelected !== 1 ? \"s\" : \"\"}\n </span>\n </div>\n ) : null}\n </div>\n );\n}\n\nexport function WeekPeriodPicker({\n booking,\n onChange,\n flat = true,\n}: {\n booking: BookingState;\n onChange: (patch: Partial<BookingState>) => void;\n flat?: boolean;\n}) {\n const [rangeMode, setRangeMode] = useState(() => booking.weekCount > 1);\n\n useEffect(() => {\n if (booking.weekCount > 1) setRangeMode(true);\n }, [booking.weekCount]);\n\n const rangeStr = weekRangeLabel(booking.weekFrom, booking.weekCount);\n\n return (\n <div className={cn(\"flex flex-col\", flat ? \"gap-5\" : \"gap-3\")}>\n <ScheduleInfoBanner>\n Current week is available at full price, or choose a future week.\n </ScheduleInfoBanner>\n\n <CheckboxField\n size=\"sm\"\n label=\"Select multiple weeks\"\n className=\"w-fit items-center\"\n checked={rangeMode}\n onCheckedChange={(checked) => {\n setRangeMode(checked);\n const from = booking.weekFrom || currentWeekStart();\n if (!checked) {\n onChange({ weekFrom: from, weekCount: 1 });\n return;\n }\n onChange({\n weekFrom: from,\n weekCount: Math.max(2, booking.weekCount),\n });\n }}\n />\n\n <div className=\"flex flex-col gap-1.5\">\n <ScheduleFieldLabel>{rangeMode ? \"Select week range\" : \"Select week\"}</ScheduleFieldLabel>\n <WeekCalendarPicker\n flat={flat}\n rangeMode={rangeMode}\n weekFrom={booking.weekFrom}\n weekCount={booking.weekCount}\n onChange={(weekFrom, weekCount) => onChange({ weekFrom, weekCount })}\n />\n </div>\n\n {booking.weekFrom && booking.weekCount > 0 ? (\n <div className=\"flex items-center justify-between rounded-xl border border-border bg-muted px-3 py-2.5\">\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-[10px] text-muted-foreground\">Period</span>\n <span className=\"text-xs font-medium text-muted-foreground\">{rangeStr}</span>\n </div>\n <span className=\"rounded-lg bg-blue-50 px-2 py-1 text-xs font-semibold text-blue-600 dark:bg-blue-950/40 dark:text-blue-400\">\n {booking.weekCount} week{booking.weekCount !== 1 ? \"s\" : \"\"}\n </span>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction formatDateLabel(iso: string): string {\n if (!iso) return \"—\";\n return new Date(iso + \"T00:00:00\").toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n\nfunction isBillableDay(day: string, start: string, end: string): boolean {\n return Boolean(start && end && day >= start && day < end);\n}\n\nexport function DayCalendarPicker({\n selectedDate,\n onChange,\n minDate = todayLocalYmd(),\n flat = false,\n}: {\n selectedDate: string;\n onChange: (date: string) => void;\n minDate?: string;\n flat?: boolean;\n}) {\n const initDate = new Date((selectedDate || minDate) + \"T00:00:00\");\n const [calYear, setCalYear] = useState(initDate.getFullYear());\n const [calMonth, setCalMonth] = useState(initDate.getMonth());\n\n const days = getCalendarGrid(calYear, calMonth);\n\n const prevMonth = () => {\n if (calMonth === 0) {\n setCalYear((y) => y - 1);\n setCalMonth(11);\n } else setCalMonth((m) => m - 1);\n };\n const nextMonth = () => {\n if (calMonth === 11) {\n setCalYear((y) => y + 1);\n setCalMonth(0);\n } else setCalMonth((m) => m + 1);\n };\n\n return (\n <div\n className={cn(\n \"flex select-none flex-col\",\n flat ? \"gap-3\" : \"gap-1 rounded-2xl border border-border bg-card p-3\",\n )}\n >\n <div className={calendarBlockClass}>\n <div className={calendarNavRowClass}>\n <button\n type=\"button\"\n onClick={prevMonth}\n className=\"flex h-7 w-7 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-accent\"\n >\n <ChevronLeft size={12} strokeWidth={2.25} />\n </button>\n <span className=\"text-xs font-semibold text-muted-foreground\">\n {MONTH_NAMES[calMonth]} {calYear}\n </span>\n <button\n type=\"button\"\n onClick={nextMonth}\n className=\"flex h-7 w-7 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-accent\"\n >\n <ChevronRight size={12} strokeWidth={2.25} />\n </button>\n </div>\n\n <div className={calendarWeekdayRowClass}>\n {[\"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\", \"Su\"].map((d) => (\n <span key={d} className={calendarWeekdayCellClass}>\n {d}\n </span>\n ))}\n </div>\n\n <div className=\"grid grid-cols-7\">\n {days.map((d, i) => {\n const ds = dayStr(d);\n const isCurrentMonth = d.getMonth() === calMonth;\n const isSelectable = ds >= minDate;\n const isSelected = ds === selectedDate;\n\n return (\n <button\n key={ds}\n type=\"button\"\n disabled={!isSelectable}\n onClick={() => isSelectable && onChange(ds)}\n className={cn(\n \"flex h-9 items-center justify-center\",\n cellGridLines(i, days.length, 7),\n !isSelectable && \"cursor-not-allowed\",\n )}\n >\n <span\n className={cn(\n \"flex h-8 w-8 items-center justify-center rounded-full text-[11px] transition-colors\",\n isSelectable && isCurrentMonth && \"text-foreground hover:bg-accent\",\n isSelectable && !isCurrentMonth && \"text-muted-foreground hover:bg-accent\",\n !isSelectable && isCurrentMonth && \"text-muted-foreground/40\",\n !isSelectable && !isCurrentMonth && \"text-muted-foreground/30\",\n isSelected && \"bg-blue-500 font-semibold text-white shadow-sm\",\n )}\n >\n {d.getDate()}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n\n {selectedDate ? (\n <p className=\"mt-1 text-center text-[10px] text-muted-foreground\">\n Selected {formatDateLabel(selectedDate)}\n </p>\n ) : (\n <p className=\"mt-1 text-center text-[10px] text-muted-foreground\">Click a day to book</p>\n )}\n </div>\n );\n}\n\nexport function DayRangeCalendar({\n startDate,\n endDate,\n onChange,\n minDate = currentWeekStart(),\n flat = false,\n}: {\n startDate: string;\n endDate: string;\n onChange: (start: string, end: string) => void;\n minDate?: string;\n flat?: boolean;\n}) {\n const initDate = new Date((startDate || minDate) + \"T00:00:00\");\n const [calYear, setCalYear] = useState(initDate.getFullYear());\n const [calMonth, setCalMonth] = useState(initDate.getMonth());\n const [phase, setPhase] = useState<\"from\" | \"to\">(\"from\");\n const [hoverDay, setHoverDay] = useState<string | null>(null);\n\n const days = getCalendarGrid(calYear, calMonth);\n const lastBillableDay = endDate ? addDays(endDate, -1) : \"\";\n\n const [dispStart, dispEnd] = (() => {\n if (phase === \"to\" && hoverDay && startDate) {\n if (hoverDay >= startDate) return [startDate, addDays(hoverDay, 1)];\n return [hoverDay, addDays(hoverDay, 1)];\n }\n return [startDate, endDate];\n })();\n\n const dayCount = startDate && endDate ? diffDays(startDate, endDate) : 0;\n\n const handleClick = (ds: string) => {\n if (ds < minDate) return;\n if (phase === \"from\") {\n onChange(ds, addDays(ds, 1));\n setPhase(\"to\");\n return;\n }\n if (ds < startDate) {\n onChange(ds, addDays(ds, 1));\n setPhase(\"to\");\n return;\n }\n onChange(startDate, addDays(ds, 1));\n setPhase(\"from\");\n };\n\n const prevMonth = () => {\n if (calMonth === 0) {\n setCalYear((y) => y - 1);\n setCalMonth(11);\n } else setCalMonth((m) => m - 1);\n };\n const nextMonth = () => {\n if (calMonth === 11) {\n setCalYear((y) => y + 1);\n setCalMonth(0);\n } else setCalMonth((m) => m + 1);\n };\n\n return (\n <div\n className={cn(\n \"flex select-none flex-col\",\n flat ? \"gap-3\" : \"gap-1 rounded-2xl border border-border bg-card p-3\",\n )}\n >\n <div\n className={cn(\n \"flex items-center gap-2 px-1 text-[11px] font-medium\",\n phase === \"to\" ? \"text-blue-600 dark:text-blue-400\" : \"text-muted-foreground\",\n )}\n >\n {phase === \"from\" ? (\n <>\n <span className=\"h-1.5 w-1.5 shrink-0 rounded-full bg-muted-foreground/50\" />\n Click the first day\n </>\n ) : (\n <>\n <span className=\"h-1.5 w-1.5 shrink-0 animate-pulse rounded-full bg-blue-500\" />\n Click the last day\n <button\n type=\"button\"\n onClick={() => {\n onChange(startDate, addDays(startDate, 1));\n setPhase(\"to\");\n }}\n className=\"ml-auto text-[10px] text-blue-400 underline underline-offset-2 hover:text-blue-600 dark:text-blue-400\"\n >\n Reset\n </button>\n </>\n )}\n </div>\n\n <div className={calendarBlockClass}>\n <div className={calendarNavRowClass}>\n <button\n type=\"button\"\n onClick={prevMonth}\n className=\"flex h-7 w-7 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-accent\"\n >\n <ChevronLeft size={12} strokeWidth={2.25} />\n </button>\n <span className=\"text-xs font-semibold text-muted-foreground\">\n {MONTH_NAMES[calMonth]} {calYear}\n </span>\n <button\n type=\"button\"\n onClick={nextMonth}\n className=\"flex h-7 w-7 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-accent\"\n >\n <ChevronRight size={12} strokeWidth={2.25} />\n </button>\n </div>\n\n <div className={calendarWeekdayRowClass}>\n {[\"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\", \"Su\"].map((d) => (\n <span key={d} className={calendarWeekdayCellClass}>\n {d}\n </span>\n ))}\n </div>\n\n <div className=\"grid grid-cols-7\">\n {days.map((d, i) => {\n const ds = dayStr(d);\n const isCurrentMonth = d.getMonth() === calMonth;\n const isSelectable = ds >= minDate;\n const inRange = isBillableDay(ds, dispStart, dispEnd);\n const isStart = ds === dispStart;\n const isEnd = ds === lastBillableDay && dispEnd && diffDays(dispStart, dispEnd) > 1;\n const isSingle =\n dispStart && dispEnd && diffDays(dispStart, dispEnd) === 1 && ds === dispStart;\n\n return (\n <button\n key={ds}\n type=\"button\"\n disabled={!isSelectable}\n onMouseEnter={() => isSelectable && setHoverDay(ds)}\n onMouseLeave={() => setHoverDay(null)}\n onClick={() => isSelectable && handleClick(ds)}\n className={cn(\n \"relative flex h-9 items-center justify-center\",\n cellGridLines(i, days.length, 7),\n !isSelectable && \"cursor-not-allowed\",\n )}\n >\n {inRange && !isSingle ? (\n <span\n className={cn(\n \"absolute inset-y-1.5 bg-blue-100\",\n isStart\n ? \"left-1/2 right-0 rounded-l-full\"\n : isEnd\n ? \"left-0 right-1/2 rounded-r-full\"\n : \"inset-x-0\",\n )}\n />\n ) : null}\n <span\n className={cn(\n \"relative z-10 flex h-8 w-8 items-center justify-center rounded-full text-[11px] transition-colors\",\n !inRange && isSelectable && isCurrentMonth && \"text-foreground hover:bg-accent\",\n !inRange &&\n isSelectable &&\n !isCurrentMonth &&\n \"text-muted-foreground hover:bg-accent\",\n !isSelectable && isCurrentMonth && \"text-muted-foreground/40\",\n !isSelectable && !isCurrentMonth && \"text-muted-foreground/30\",\n inRange && \"font-medium text-blue-700 dark:text-blue-300\",\n (isStart || isEnd || isSingle) &&\n \"bg-blue-500 font-semibold text-white shadow-sm\",\n )}\n >\n {d.getDate()}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n\n <div className=\"flex items-center justify-between border-t border-border/70 pt-3 text-xs\">\n {dayCount > 0 ? (\n <>\n <span className=\"text-[10px] text-muted-foreground\">\n {formatDateLabel(startDate)}\n {dayCount > 1 ? ` → ${formatDateLabel(lastBillableDay)}` : \"\"}\n </span>\n <span className=\"rounded-full bg-blue-50 px-2 py-0.5 text-[10px] font-semibold text-blue-600 dark:bg-blue-950/40 dark:text-blue-400\">\n {dayCount} day{dayCount !== 1 ? \"s\" : \"\"}\n </span>\n </>\n ) : (\n <span className=\"text-[10px] text-muted-foreground/60\">Select a date range</span>\n )}\n </div>\n </div>\n );\n}\n\nexport function DayPeriodPicker({\n booking,\n onChange,\n flat = true,\n}: {\n booking: BookingState;\n onChange: (patch: Partial<BookingState>) => void;\n flat?: boolean;\n}) {\n const oneDay = booking.oneDayBooking ?? true;\n const dayCount = oneDay ? 1 : diffDays(booking.startDate, booking.endDate);\n\n return (\n <div className={cn(\"flex flex-col\", flat ? \"gap-5\" : \"gap-3\")}>\n <CheckboxField\n size=\"sm\"\n label=\"Select a date range\"\n className=\"w-fit items-center\"\n checked={!oneDay}\n onCheckedChange={(checked) => {\n const start = booking.startDate || todayLocalYmd();\n if (!checked) {\n onChange({ oneDayBooking: true, startDate: start, endDate: addDays(start, 1) });\n return;\n }\n const end =\n booking.endDate && booking.endDate > start && diffDays(start, booking.endDate) > 1\n ? booking.endDate\n : addDays(start, 7);\n onChange({ oneDayBooking: false, startDate: start, endDate: end });\n }}\n />\n\n {oneDay ? (\n <DayCalendarPicker\n flat={flat}\n selectedDate={booking.startDate}\n onChange={(v) => onChange({ startDate: v, endDate: addDays(v, 1) })}\n />\n ) : (\n <DayRangeCalendar\n flat={flat}\n startDate={booking.startDate}\n endDate={booking.endDate}\n onChange={(start, end) => onChange({ startDate: start, endDate: end })}\n />\n )}\n\n {dayCount > 0 ? (\n <div className=\"flex items-center justify-between rounded-xl border border-border bg-muted px-3 py-2.5\">\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-[10px] text-muted-foreground\">Period</span>\n <span className=\"text-xs font-medium text-muted-foreground\">\n {oneDay\n ? formatDateLabel(booking.startDate)\n : `${formatDateLabel(booking.startDate)} → ${formatDateLabel(addDays(booking.endDate, -1))}`}\n </span>\n </div>\n <span className=\"rounded-lg bg-blue-50 px-2 py-1 text-xs font-semibold text-blue-600 dark:bg-blue-950/40 dark:text-blue-400\">\n {dayCount} day{dayCount !== 1 ? \"s\" : \"\"}\n </span>\n </div>\n ) : null}\n </div>\n );\n}\n\ntype HourlyPickerStep = \"date\" | \"time\";\n\nfunction HourlyTimeRangeFields({\n fromTime,\n scheduleEndTime,\n chargeBy,\n timeFormat,\n toOptions,\n minTo,\n onFromChange,\n onToChange,\n vertical = false,\n}: {\n fromTime: string;\n scheduleEndTime: string;\n chargeBy: \"hours\" | \"minutes\";\n timeFormat: \"12h\" | \"24h\";\n toOptions: string[];\n minTo: string | undefined;\n onFromChange: (nextFrom: string) => void;\n onToChange: (v: string) => void;\n vertical?: boolean;\n}) {\n const fields = (\n <>\n <div className=\"flex flex-col gap-1.5\">\n <ScheduleFieldLabel>From</ScheduleFieldLabel>\n <TimeField value={fromTime} onChange={onFromChange} timeFormat={timeFormat} />\n </div>\n {vertical ? <div className=\"h-px bg-border\" aria-hidden /> : null}\n <div className=\"flex flex-col gap-1.5\">\n <ScheduleFieldLabel>To</ScheduleFieldLabel>\n {chargeBy === \"hours\" ? (\n <TimeField\n value={scheduleEndTime}\n onChange={onToChange}\n timeFormat={timeFormat}\n allowedTimes={toOptions}\n disabled={toOptions.length === 0}\n placeholder={toOptions.length === 0 ? \"No later times\" : \"Select time\"}\n />\n ) : (\n <TimeField\n value={scheduleEndTime}\n onChange={onToChange}\n timeFormat={timeFormat}\n minTime={minTo}\n disabled={!minTo}\n placeholder={minTo ? \"Select time\" : \"No later times\"}\n />\n )}\n </div>\n </>\n );\n\n if (vertical) {\n return <div className=\"flex flex-col gap-4\">{fields}</div>;\n }\n\n return <div className=\"grid grid-cols-2 gap-3\">{fields}</div>;\n}\n\nexport function HourlySchedulePicker({\n scheduleDate,\n scheduleTime,\n scheduleEndTime = \"\",\n onChange,\n timeFormat = \"24h\",\n flat = true,\n chargeBy = \"hours\",\n splitLayout = false,\n stackLayout = false,\n}: {\n scheduleDate: string;\n scheduleTime: string;\n scheduleEndTime?: string;\n onChange: (patch: {\n scheduleDate?: string;\n scheduleTime?: string;\n scheduleEndTime?: string;\n }) => void;\n timeFormat?: \"12h\" | \"24h\";\n flat?: boolean;\n chargeBy?: \"hours\" | \"minutes\";\n /** Calendar and time pickers side-by-side; From / To stacked on the right. */\n splitLayout?: boolean;\n /** Calendar on top; From / To stacked underneath (always visible). */\n stackLayout?: boolean;\n}) {\n const [step, setStep] = useState<HourlyPickerStep>(\"date\");\n const fromTime = scheduleTime || \"09:00\";\n const toOptions = chargeBy === \"hours\" ? hourlyEndTimes(fromTime) : [];\n const minTo = chargeBy === \"minutes\" ? addMinutesToHm(fromTime, 1) ?? undefined : undefined;\n\n const handleFromChange = (nextFrom: string) => {\n onChange({\n scheduleTime: nextFrom,\n scheduleEndTime: snapScheduleEndTime(nextFrom, scheduleEndTime, chargeBy),\n });\n };\n\n const handleDateChange = (v: string) => {\n const nextFrom = scheduleTime || \"09:00\";\n onChange({\n scheduleDate: v,\n scheduleTime: nextFrom,\n scheduleEndTime:\n scheduleEndTime || snapScheduleEndTime(nextFrom, \"\", chargeBy) || \"10:00\",\n });\n };\n\n const summary =\n scheduleDate && fromTime && scheduleEndTime ? (\n <div className=\"flex items-center justify-between rounded-xl border border-border bg-muted px-3 py-2.5\">\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-[10px] text-muted-foreground\">Scheduled for</span>\n <span className=\"text-xs font-medium text-foreground\">\n {formatDateLabel(scheduleDate)} · {formatTimeForDisplay(fromTime, timeFormat)} →{\" \"}\n {formatTimeForDisplay(scheduleEndTime, timeFormat)}\n </span>\n </div>\n </div>\n ) : null;\n\n const timeFields = (\n <HourlyTimeRangeFields\n fromTime={fromTime}\n scheduleEndTime={scheduleEndTime}\n chargeBy={chargeBy}\n timeFormat={timeFormat}\n toOptions={toOptions}\n minTo={minTo}\n onFromChange={handleFromChange}\n onToChange={(v) => onChange({ scheduleEndTime: v })}\n vertical={splitLayout || stackLayout}\n />\n );\n\n if (stackLayout) {\n return (\n <div className={cn(\"flex flex-col gap-5\", flat ? \"\" : \"rounded-2xl border border-border bg-card p-4\")}>\n <div className=\"flex flex-col gap-1.5\">\n <ScheduleFieldLabel>Date</ScheduleFieldLabel>\n <DayCalendarPicker\n flat={flat}\n selectedDate={scheduleDate}\n minDate={todayLocalYmd()}\n onChange={handleDateChange}\n />\n </div>\n {timeFields}\n {summary}\n </div>\n );\n }\n\n if (splitLayout) {\n return (\n <div className={cn(\"flex flex-col gap-5\", flat ? \"\" : \"rounded-2xl border border-border bg-card p-4\")}>\n <div className=\"flex flex-col gap-5 sm:flex-row sm:items-start\">\n <div className=\"min-w-0 flex-1\">\n <ScheduleFieldLabel>Date</ScheduleFieldLabel>\n <div className=\"mt-1.5\">\n <DayCalendarPicker\n flat={flat}\n selectedDate={scheduleDate}\n minDate={todayLocalYmd()}\n onChange={handleDateChange}\n />\n </div>\n </div>\n <div className=\"hidden w-px shrink-0 self-stretch bg-border sm:block\" aria-hidden />\n <div className=\"min-w-[9.5rem] shrink-0 sm:w-44\">\n <ScheduleFieldLabel>Time</ScheduleFieldLabel>\n <div className=\"mt-1.5\">{timeFields}</div>\n </div>\n </div>\n {summary}\n </div>\n );\n }\n\n return (\n <div className={cn(\"flex flex-col gap-5\", flat ? \"\" : \"rounded-2xl border border-border bg-card p-4\")}>\n <div className=\"flex items-center gap-1.5 text-[11px] font-medium text-muted-foreground\">\n <span\n className={cn(\n step === \"date\" && \"font-semibold text-blue-600 dark:text-blue-400\",\n scheduleDate && step !== \"date\" && \"text-foreground\",\n )}\n >\n Date\n </span>\n <span aria-hidden>·</span>\n <span\n className={cn(\n step === \"time\" && \"font-semibold text-blue-600 dark:text-blue-400\",\n step !== \"time\" && \"text-muted-foreground/60\",\n )}\n >\n Time\n </span>\n </div>\n\n {step === \"date\" ? (\n <div className=\"flex flex-col gap-3\">\n <ScheduleFieldLabel>Pick a day</ScheduleFieldLabel>\n <DayCalendarPicker\n flat={flat}\n selectedDate={scheduleDate}\n minDate={todayLocalYmd()}\n onChange={(v) => {\n handleDateChange(v);\n setStep(\"time\");\n }}\n />\n <p className=\"text-center text-[11px] text-muted-foreground\">Select a day to set the time</p>\n </div>\n ) : (\n <div className=\"flex flex-col gap-5\">\n <button\n type=\"button\"\n onClick={() => setStep(\"date\")}\n className=\"inline-flex w-fit items-center gap-2 rounded-xl border border-border bg-muted/60 px-3 py-2 text-left transition-colors hover:bg-muted\"\n >\n <ChevronLeft size={14} className=\"shrink-0 text-muted-foreground\" />\n <div>\n <p className=\"text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">Date</p>\n <p className=\"text-sm font-medium text-foreground\">{formatDateLabel(scheduleDate)}</p>\n </div>\n <span className=\"ml-2 text-[11px] font-medium text-blue-600 dark:text-blue-400\">Change</span>\n </button>\n\n {timeFields}\n\n {summary}\n </div>\n )}\n </div>\n );\n}\n\nexport function ServiceNeededAtPicker({\n scheduleDate,\n scheduleTime,\n onChange,\n timeFormat = \"24h\",\n flat = true,\n stackLayout = true,\n minDate = todayLocalYmd(),\n preparationMinutes = 0,\n}: {\n scheduleDate: string;\n scheduleTime: string;\n onChange: (patch: {\n scheduleDate?: string;\n scheduleTime?: string;\n scheduleEndTime?: string;\n startDate?: string;\n endDate?: string;\n }) => void;\n timeFormat?: \"12h\" | \"24h\";\n flat?: boolean;\n stackLayout?: boolean;\n minDate?: string;\n /** When booking for today, earliest Needed-at is now + this many minutes. */\n preparationMinutes?: number;\n}) {\n const neededTime = scheduleTime || \"09:00\";\n const todayYmd = todayLocalYmd();\n const minTimeToday =\n preparationMinutes > 0 && scheduleDate === todayYmd\n ? minNeededTimeHm(preparationMinutes)\n : undefined;\n\n const syncNeeded = (date: string, time: string) => {\n let nextTime = time;\n if (preparationMinutes > 0 && date === todayYmd) {\n const floor = minNeededTimeHm(preparationMinutes);\n if (floor && nextTime < floor) nextTime = floor;\n }\n onChange({\n scheduleDate: date,\n scheduleTime: nextTime,\n scheduleEndTime: nextTime,\n startDate: date,\n endDate: date,\n });\n };\n\n const handleDateChange = (v: string) => syncNeeded(v, neededTime);\n const handleTimeChange = (v: string) => {\n if (!scheduleDate) return;\n syncNeeded(scheduleDate, v);\n };\n\n const summary =\n scheduleDate && neededTime ? (\n <div className=\"flex items-center justify-between rounded-xl border border-border bg-muted px-3 py-2.5\">\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-[10px] text-muted-foreground\">Needed at</span>\n <span className=\"text-xs font-medium text-foreground\">\n {formatDateLabel(scheduleDate)} · {formatTimeForDisplay(neededTime, timeFormat)}\n </span>\n </div>\n </div>\n ) : null;\n\n const timeField = (\n <div className=\"flex flex-col gap-1.5\">\n <ScheduleFieldLabel>Needed at</ScheduleFieldLabel>\n <TimeField\n value={neededTime}\n onChange={handleTimeChange}\n timeFormat={timeFormat}\n minTime={minTimeToday}\n disabled={Boolean(minTimeToday && !minTimeToday)}\n placeholder={minTimeToday ? \"Select time\" : undefined}\n />\n </div>\n );\n\n if (stackLayout) {\n return (\n <div className={cn(\"flex flex-col gap-5\", flat ? \"\" : \"rounded-2xl border border-border bg-card p-4\")}>\n <div className=\"flex flex-col gap-1.5\">\n <ScheduleFieldLabel>Date</ScheduleFieldLabel>\n <DayCalendarPicker\n flat={flat}\n selectedDate={scheduleDate}\n minDate={minDate}\n onChange={handleDateChange}\n />\n </div>\n {timeField}\n {summary}\n </div>\n );\n }\n\n return (\n <div className={cn(\"flex flex-col gap-5 sm:flex-row sm:items-start\", flat ? \"\" : \"rounded-2xl border border-border bg-card p-4\")}>\n <div className=\"min-w-0 flex-1\">\n <ScheduleFieldLabel>Date</ScheduleFieldLabel>\n <div className=\"mt-1.5\">\n <DayCalendarPicker\n flat={flat}\n selectedDate={scheduleDate}\n minDate={minDate}\n onChange={handleDateChange}\n />\n </div>\n </div>\n <div className=\"hidden w-px shrink-0 self-stretch bg-border sm:block\" aria-hidden />\n <div className=\"min-w-[9.5rem] shrink-0 sm:w-44\">{timeField}</div>\n {summary ? <div className=\"w-full\">{summary}</div> : null}\n </div>\n );\n}\n\nfunction minNeededTimeHm(prepMinutes: number, now: Date = new Date()): string {\n const earliest = new Date(now.getTime() + prepMinutes * 60_000);\n if (earliest.getSeconds() > 0 || earliest.getMilliseconds() > 0) {\n earliest.setMinutes(earliest.getMinutes() + 1);\n }\n earliest.setSeconds(0, 0);\n return `${String(earliest.getHours()).padStart(2, \"0\")}:${String(earliest.getMinutes()).padStart(2, \"0\")}`;\n}\n"]}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Date / schedule helpers used by booking-schedule calendars.
3
+ */
4
+ type RepeatType = "none" | "daily" | "weekly" | "monthly";
5
+ type BookingMode = "slots" | "schedule";
6
+ type ScheduleChargeBy = "minutes" | "hours" | "days" | "weeks" | "months" | "quantity";
7
+ type PartialElapsedUnit = "days" | "hours" | "minutes";
8
+ interface PartialElapsed {
9
+ amount: number;
10
+ unit: PartialElapsedUnit;
11
+ }
12
+ /** Editor state for slot / schedule / daily / item shaped tiers */
13
+ interface BookingState {
14
+ slotCount: number;
15
+ bookingDate: string;
16
+ bookingMode: BookingMode;
17
+ scheduleDate: string;
18
+ scheduleTime: string;
19
+ scheduleEndTime: string;
20
+ repeatType: RepeatType;
21
+ repeatEveryDays: number;
22
+ repeatEveryWeeks: number;
23
+ repeatOnDays: string[];
24
+ repeatEveryMonths: number;
25
+ repeatUntilDate: string;
26
+ startDate: string;
27
+ endDate: string;
28
+ monthFrom: string;
29
+ monthTo: string;
30
+ weekFrom: string;
31
+ weekCount: number;
32
+ itemQuantity: number;
33
+ oneDayBooking?: boolean;
34
+ }
35
+ interface ScheduleDefaultsConfig {
36
+ chargeBy: ScheduleChargeBy;
37
+ }
38
+ /** YYYY-MM-DD in local timezone (never UTC ISO split). */
39
+ declare function localDateYmd(d: Date): string;
40
+ declare function todayLocalYmd(now?: Date): string;
41
+ /** @deprecated Prefer `todayLocalYmd()` — kept for existing imports. */
42
+ declare function pricingTodayYmd(now?: Date): string;
43
+ declare const PRICING_TODAY: string;
44
+ declare function currentMonthYm(now?: Date): string;
45
+ /** Monday of the current local week (YYYY-MM-DD). */
46
+ declare function currentWeekStart(now?: Date): string;
47
+ /** First full month default: next month if today is past the 1st, else current month. */
48
+ declare function computeMinMonth(now?: Date): string;
49
+ /** First full week default: next Monday unless today is already Monday. */
50
+ declare function computeMinWeekStart(now?: Date): string;
51
+ declare const MIN_MONTH: string;
52
+ declare const MIN_WEEK_START: string;
53
+ declare const IS_PARTIAL_MONTH: boolean;
54
+ declare function monthLabel(ym: string): string;
55
+ declare function monthCount(from: string, to: string): number;
56
+ declare function weekRangeLabel(weekFrom: string, weekCount: number): string;
57
+ /** Inclusive number of Mon-anchored weeks from `weekFrom` through `weekToMon`. */
58
+ declare function weekCountBetween(weekFrom: string, weekToMon: string): number;
59
+ declare function addMonthsYm(ym: string, delta: number): string;
60
+ declare function diffDays(a: string, b: string): number;
61
+ declare function addDays(date: string, days: number): string;
62
+ /** Elapsed time in the selected in-progress booking period, if any. */
63
+ declare function partialElapsed(config: ScheduleDefaultsConfig, booking: BookingState, now?: Date): PartialElapsed | null;
64
+ declare function formatPartialElapsedLabel(elapsed: PartialElapsed): string;
65
+ /** Patch empty schedule fields with tier-appropriate defaults. */
66
+ declare function applyBookingScheduleDefaults(config: ScheduleDefaultsConfig, booking: BookingState, options?: {
67
+ preparationMinutes?: number;
68
+ now?: Date;
69
+ }): Partial<BookingState>;
70
+
71
+ export { type BookingMode, type BookingState, IS_PARTIAL_MONTH, MIN_MONTH, MIN_WEEK_START, PRICING_TODAY, type PartialElapsed, type PartialElapsedUnit, type RepeatType, type ScheduleChargeBy, type ScheduleDefaultsConfig, addDays, addMonthsYm, applyBookingScheduleDefaults, computeMinMonth, computeMinWeekStart, currentMonthYm, currentWeekStart, diffDays, formatPartialElapsedLabel, localDateYmd, monthCount, monthLabel, partialElapsed, pricingTodayYmd, todayLocalYmd, weekCountBetween, weekRangeLabel };
@@ -0,0 +1,3 @@
1
+ export { IS_PARTIAL_MONTH, MIN_MONTH, MIN_WEEK_START, PRICING_TODAY, addDays, addMonthsYm, applyBookingScheduleDefaults, computeMinMonth, computeMinWeekStart, currentMonthYm, currentWeekStart, diffDays, formatPartialElapsedLabel, localDateYmd, monthCount, monthLabel, partialElapsed, pricingTodayYmd, todayLocalYmd, weekCountBetween, weekRangeLabel } from './chunk-OTSA5ROL.js';
2
+ //# sourceMappingURL=booking-schedule.js.map
3
+ //# sourceMappingURL=booking-schedule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"booking-schedule.js"}