@spacesync/client 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -10
- package/dist/analog-clock-picker.js +3 -2
- package/dist/booking-schedule-calendars.js +3 -2
- package/dist/booking-schedule-calendars.js.map +1 -1
- package/dist/chat-stick-to-bottom.js +2 -1
- package/dist/chat-stick-to-bottom.js.map +1 -1
- package/dist/{chunk-HCQSED6Q.js → chunk-34332W2P.js} +3 -3
- package/dist/{chunk-HCQSED6Q.js.map → chunk-34332W2P.js.map} +1 -1
- package/dist/chunk-DC4QH6W2.js +17 -0
- package/dist/chunk-DC4QH6W2.js.map +1 -0
- package/dist/{chunk-R4L4TDT3.js → chunk-H3CNZCYU.js} +13 -13
- package/dist/chunk-H3CNZCYU.js.map +1 -0
- package/dist/file-viewer-dialog.js +37 -17
- package/dist/file-viewer-dialog.js.map +1 -1
- package/dist/floor-switcher.js +2 -1
- package/dist/floor-switcher.js.map +1 -1
- package/dist/layout-canvas-view.js +2 -1
- package/dist/layout-canvas-view.js.map +1 -1
- package/dist/page-list-loading.d.ts +20 -0
- package/dist/page-list-loading.js +79 -0
- package/dist/page-list-loading.js.map +1 -0
- package/dist/platform-support-message-composer.js +2 -1
- package/dist/platform-support-message-composer.js.map +1 -1
- package/dist/ui.js +2 -1
- package/package.json +10 -9
- package/dist/chunk-R4L4TDT3.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,14 +1,34 @@
|
|
|
1
1
|
# @spacesync/client
|
|
2
2
|
|
|
3
|
-
Reusable React UI
|
|
3
|
+
Reusable React UI, application shell, theme, and API-client primitives for SpaceSync apps (operator, member).
|
|
4
|
+
|
|
5
|
+
## Publish (this repo)
|
|
6
|
+
|
|
7
|
+
Bump the version in `package.json`, then:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
pnpm publish --access public
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
`prepublishOnly` typechecks and `prepack` builds `dist/` automatically. You must be logged in (`npm login`) to the npm account that can publish `@spacesync/client`.
|
|
14
|
+
|
|
15
|
+
Version bump shortcuts:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm version patch # 0.1.6 → 0.1.7
|
|
19
|
+
npm version minor # 0.1.6 → 0.2.0
|
|
20
|
+
npm version major # 0.1.6 → 1.0.0
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Git pushes do not publish. Only `pnpm publish` (or `npm publish --access public`) does.
|
|
4
24
|
|
|
5
25
|
## Install (consumers)
|
|
6
26
|
|
|
7
27
|
```bash
|
|
8
|
-
|
|
28
|
+
pnpm add @spacesync/client
|
|
9
29
|
```
|
|
10
30
|
|
|
11
|
-
`react` and `react-dom`
|
|
31
|
+
Peer dependencies: `react` and `react-dom` (`^18.3.1`).
|
|
12
32
|
|
|
13
33
|
```tsx
|
|
14
34
|
import { Button } from "@spacesync/client/ui";
|
|
@@ -19,16 +39,12 @@ import { AppWebShell } from "@spacesync/client/app-web-shell";
|
|
|
19
39
|
@import "@spacesync/client/styles/theme.css";
|
|
20
40
|
```
|
|
21
41
|
|
|
22
|
-
## Develop
|
|
42
|
+
## Develop
|
|
23
43
|
|
|
24
|
-
This
|
|
44
|
+
This is a standalone package (not a workspace). From this directory:
|
|
25
45
|
|
|
26
46
|
```bash
|
|
27
|
-
|
|
28
|
-
pnpm install --ignore-workspace
|
|
47
|
+
pnpm install
|
|
29
48
|
pnpm typecheck
|
|
30
49
|
pnpm build
|
|
31
|
-
npm publish --access public
|
|
32
50
|
```
|
|
33
|
-
|
|
34
|
-
To put this on GitHub, copy or move this directory into its own repository and push. Bumping `version` + publishing is what updates npm — git pushes do not.
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
export { AnalogClockPicker } from './chunk-
|
|
2
|
-
import './chunk-
|
|
1
|
+
export { AnalogClockPicker } from './chunk-34332W2P.js';
|
|
2
|
+
import './chunk-H3CNZCYU.js';
|
|
3
3
|
import './chunk-RV5PMZYZ.js';
|
|
4
4
|
import './chunk-L65F4EMK.js';
|
|
5
5
|
import './chunk-PBNBLCC2.js';
|
|
6
6
|
import './chunk-VVXGQKN7.js';
|
|
7
7
|
import './chunk-7YCAAP43.js';
|
|
8
|
+
import './chunk-DC4QH6W2.js';
|
|
8
9
|
import './chunk-LUB7QWGU.js';
|
|
9
10
|
import './chunk-VHINHHZQ.js';
|
|
10
11
|
import './chunk-FCY5FYJB.js';
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { AnalogClockPicker } from './chunk-
|
|
2
|
-
import { formatTimeForDisplay } from './chunk-
|
|
1
|
+
import { AnalogClockPicker } from './chunk-34332W2P.js';
|
|
2
|
+
import { formatTimeForDisplay } from './chunk-H3CNZCYU.js';
|
|
3
3
|
import './chunk-RV5PMZYZ.js';
|
|
4
4
|
import './chunk-L65F4EMK.js';
|
|
5
5
|
import './chunk-PBNBLCC2.js';
|
|
6
6
|
import './chunk-VVXGQKN7.js';
|
|
7
7
|
import './chunk-7YCAAP43.js';
|
|
8
|
+
import './chunk-DC4QH6W2.js';
|
|
8
9
|
import './chunk-LUB7QWGU.js';
|
|
9
10
|
import './chunk-VHINHHZQ.js';
|
|
10
11
|
import './chunk-FCY5FYJB.js';
|
|
@@ -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 * Copied from `@spacesync/client/domain/lib/pricing` so the client has no package dependency.\n */\n\nexport type RepeatType = \"none\" | \"daily\" | \"weekly\" | \"monthly\";\nexport type BookingMode = \"slots\" | \"schedule\";\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 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 /** Daily per-day tiers: single-day booking when true (endDate = startDate + 1 day). */\n oneDayBooking?: boolean;\n}\n\nexport const PRICING_TODAY = new Date().toISOString().split(\"T\")[0];\n\n/** First full month available: next month if today is past the 1st, else current month. */\nexport function computeMinMonth(): string {\n const d = new Date();\n if (d.getDate() === 1) {\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, \"0\")}`;\n }\n const n = new Date(d.getFullYear(), d.getMonth() + 1, 1);\n return `${n.getFullYear()}-${String(n.getMonth() + 1).padStart(2, \"0\")}`;\n}\n\n/** First full week available: next Monday unless today is already Monday. */\nexport function computeMinWeekStart(): string {\n const d = new Date();\n const day = d.getDay();\n if (day === 1) return d.toISOString().split(\"T\")[0];\n const skip = day === 0 ? 1 : 8 - day;\n d.setDate(d.getDate() + skip);\n return d.toISOString().split(\"T\")[0];\n}\n\nexport const MIN_MONTH =\n computeMinMonth() ||\n `${new Date().getFullYear()}-${String(new Date().getMonth() + 2).padStart(2, \"0\")}`;\nexport const MIN_WEEK_START = computeMinWeekStart() || PRICING_TODAY;\n\n/** True when today is not the 1st — meaning the current month is partial. */\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).getTime())) return \"—\";\n const end = new Date(weekFrom);\n end.setDate(end.getDate() + weekCount * 7 - 1);\n const s = new Date(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\nfunction parseDateOnly(date: string): Date {\n const [y, m, d] = date.split(\"-\").map(Number);\n return new Date(y, m - 1, d);\n}\n\nfunction formatDateOnly(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 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 formatDateOnly(d);\n}\n","import { useEffect, useState } from \"react\";\nimport { ChevronLeft, ChevronRight, Info } from \"lucide-react\";\nimport {\n IS_PARTIAL_MONTH,\n MIN_MONTH,\n MIN_WEEK_START,\n PRICING_TODAY,\n addDays,\n diffDays,\n monthCount,\n monthLabel,\n weekRangeLabel,\n type BookingState,\n} from \"../lib/booking-schedule\";\nimport { AnalogClockPicker } from \"./analog-clock-picker\";\nimport { formatTimeForDisplay } from \"../ui/time-field\";\nimport { 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 d.toISOString().split(\"T\")[0];\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 onChange,\n flat = false,\n}: {\n weekFrom: string;\n onChange: (v: string) => 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\n const days = getCalendarGrid(calYear, calMonth);\n const minDate = new Date((MIN_WEEK_START || PRICING_TODAY) + \"T00:00:00\");\n const selectedMonStr = weekFrom || null;\n const hoverMonStr = hoverMon;\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 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=\"mb-1 flex items-center justify-between px-1\">\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=\"mb-0.5 grid grid-cols-7\">\n {[\"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\", \"Su\"].map((d) => (\n <span key={d} className=\"py-0.5 text-center text-[10px] font-medium text-muted-foreground\">\n {d}\n </span>\n ))}\n </div>\n\n {weeks.map((week, wi) => {\n const mondayDate = week[0];\n const monStr = dayStr(mondayDate);\n const isSelectable = mondayDate >= minDate;\n const isSelected = monStr === selectedMonStr;\n const isHovered = monStr === hoverMonStr && isSelectable && !isSelected;\n\n return (\n <div\n key={wi}\n className={`flex cursor-pointer overflow-hidden rounded-xl transition-colors\n ${isSelected ? \"bg-blue-100\" : isHovered ? \"bg-blue-50\" : isSelectable ? \"hover:bg-accent\" : \"cursor-not-allowed\"}`}\n onMouseEnter={() => isSelectable && setHoverMon(monStr)}\n onMouseLeave={() => setHoverMon(null)}\n onClick={() => isSelectable && onChange(monStr)}\n >\n {week.map((d, di) => {\n const isCurrentMonth = d.getMonth() === calMonth;\n const isMon = di === 0;\n const isSelectedMon = isSelected && isMon;\n\n return (\n <div key={di} className=\"flex h-8 flex-1 items-center justify-center\">\n <span\n className={`\n flex h-7 w-7 items-center justify-center rounded-full text-[11px] transition-colors\n ${isSelectedMon ? \"bg-blue-500 font-semibold text-white\" : \"\"}\n ${!isSelectedMon && isSelected ? \"text-blue-700 dark:text-blue-400\" : \"\"}\n ${!isSelected && isSelectable && isCurrentMonth ? \"text-muted-foreground\" : \"\"}\n ${!isSelectable && isCurrentMonth ? \"text-muted-foreground/60\" : \"\"}\n ${!isCurrentMonth ? \"text-muted-foreground/60\" : \"\"}\n `}\n >\n {d.getDate()}\n </span>\n </div>\n );\n })}\n </div>\n );\n })}\n\n <p className=\"mt-1 text-center text-[10px] text-muted-foreground\">Click any row to select that week</p>\n </div>\n );\n}\n\nexport function MonthRangeCalendar({\n monthFrom,\n monthTo,\n onChange,\n flat = false,\n}: {\n monthFrom: string;\n monthTo: string;\n onChange: (from: string, to: string) => void;\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 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 = MIN_MONTH || `${new Date().getFullYear()}-01`;\n\n const [dispFrom, dispTo] = (() => {\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 (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 }\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 <div className={cn(\"flex items-center justify-between\", flat ? \"px-1\" : \"px-4 pb-2 pt-4\")}>\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\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 a month to set the start\n </>\n ) : (\n <>\n <span className=\"h-1.5 w-1.5 shrink-0 animate-pulse rounded-full bg-blue-500\" />\n Now click to set the end 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\n <div\n className={cn(\"grid grid-cols-4\", flat ? \"gap-2 py-1\" : \"px-2 pb-3 pt-1\")}\n style={flat ? undefined : { gap: 0 }}\n >\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 = 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) && !disabled;\n\n return (\n <div\n key={i}\n className={cn(\n \"relative\",\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\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 phase === \"from\" && actualCount > 0 ? \"border-border bg-muted\" : \"border-transparent\",\n ),\n )}\n >\n {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 ) : 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\">No months selected</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 return (\n <div className={cn(\"flex flex-col\", flat ? \"gap-5\" : \"gap-3\")}>\n {IS_PARTIAL_MONTH ? (\n <ScheduleInfoBanner>\n Today is {new Date(PRICING_TODAY).toLocaleDateString(\"en-US\", { month: \"long\", day: \"numeric\" })}.\n Current month is partially elapsed — earliest bookable month is{\" \"}\n <strong>{monthLabel(MIN_MONTH)}</strong>.\n </ScheduleInfoBanner>\n ) : null}\n <ScheduleFieldLabel>Select month range</ScheduleFieldLabel>\n <MonthRangeCalendar\n flat={flat}\n monthFrom={booking.monthFrom}\n monthTo={booking.monthTo}\n onChange={(from, to) => onChange({ monthFrom: from, monthTo: to })}\n />\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 rangeStr = weekRangeLabel(booking.weekFrom, booking.weekCount);\n const isCurrentWeekPartial = new Date(PRICING_TODAY).getDay() !== 1;\n\n return (\n <div className={cn(\"flex flex-col\", flat ? \"gap-5\" : \"gap-3\")}>\n {isCurrentWeekPartial ? (\n <ScheduleInfoBanner>\n This week started on a {new Date(PRICING_TODAY).toLocaleDateString(\"en-US\", { weekday: \"long\" })} — earliest\n full week begins{\" \"}\n <strong>\n {new Date(MIN_WEEK_START).toLocaleDateString(\"en-US\", {\n month: \"long\",\n day: \"numeric\",\n })}\n </strong>\n .\n </ScheduleInfoBanner>\n ) : null}\n\n <div className=\"flex flex-col gap-1.5\">\n <ScheduleFieldLabel>Starting week</ScheduleFieldLabel>\n <WeekCalendarPicker\n flat={flat}\n weekFrom={booking.weekFrom}\n onChange={(v) => onChange({ weekFrom: v })}\n />\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <ScheduleFieldLabel>Number of weeks</ScheduleFieldLabel>\n <div className=\"flex items-center gap-3\">\n <ScheduleStepper\n value={booking.weekCount}\n max={52}\n onChange={(v) => onChange({ weekCount: v })}\n />\n <span className=\"text-xs text-muted-foreground\">\n {booking.weekCount} week{booking.weekCount !== 1 ? \"s\" : \"\"}\n </span>\n </div>\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 = PRICING_TODAY,\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=\"mb-1 flex items-center justify-between px-1\">\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=\"mb-0.5 grid grid-cols-7\">\n {[\"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\", \"Su\"].map((d) => (\n <span key={d} className=\"py-0.5 text-center text-[10px] font-medium text-muted-foreground\">\n {d}\n </span>\n ))}\n </div>\n\n <div className=\"grid grid-cols-7\">\n {days.map((d) => {\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 !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 isSelected && \"bg-blue-500 font-semibold text-white shadow-sm\",\n !isSelected && isSelectable && isCurrentMonth && \"text-foreground hover:bg-accent\",\n !isSelected && isSelectable && !isCurrentMonth && \"text-muted-foreground hover:bg-accent\",\n !isSelectable && isCurrentMonth && \"text-muted-foreground/40\",\n !isSelectable && !isCurrentMonth && \"text-muted-foreground/30\",\n )}\n >\n {d.getDate()}\n </span>\n </button>\n );\n })}\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 = PRICING_TODAY,\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 className=\"mb-1 flex items-center justify-between px-1\">\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\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=\"mb-0.5 grid grid-cols-7\">\n {[\"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\", \"Su\"].map((d) => (\n <span key={d} className=\"py-0.5 text-center text-[10px] font-medium text-muted-foreground\">\n {d}\n </span>\n ))}\n </div>\n\n <div className=\"grid grid-cols-7\">\n {days.map((d) => {\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 = 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 !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 ? \"left-1/2 right-0 rounded-l-full\" : isEnd ? \"left-0 right-1/2 rounded-r-full\" : \"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 (isStart || isEnd || isSingle) && \"bg-blue-500 font-semibold text-white shadow-sm\",\n !isStart && !isEnd && !isSingle && inRange && \"font-medium text-blue-700 dark:text-blue-400\",\n !inRange && isSelectable && isCurrentMonth && \"text-foreground hover:bg-accent\",\n !inRange && isSelectable && !isCurrentMonth && \"text-muted-foreground hover:bg-accent\",\n !isSelectable && isCurrentMonth && \"text-muted-foreground/40\",\n !isSelectable && !isCurrentMonth && \"text-muted-foreground/30\",\n )}\n >\n {d.getDate()}\n </span>\n </button>\n );\n })}\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 <div className=\"flex gap-2\">\n {(\n [\n { key: true, label: \"Single day\" },\n { key: false, label: \"Multiple days\" },\n ] as const\n ).map(({ key, label }) => (\n <button\n key={String(key)}\n type=\"button\"\n onClick={() => {\n const start = booking.startDate || PRICING_TODAY;\n if (key) {\n onChange({ oneDayBooking: true, startDate: start, endDate: addDays(start, 1) });\n } else {\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 className={cn(\n \"flex h-9 flex-1 items-center justify-center rounded-xl border text-sm font-medium transition-colors\",\n oneDay === key\n ? \"border-blue-400 bg-blue-50 text-blue-600 dark:bg-blue-950/40 dark:text-blue-400\"\n : \"border-border bg-card text-muted-foreground hover:bg-accent\",\n )}\n >\n {label}\n </button>\n ))}\n </div>\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\nexport function HourlySchedulePicker({\n scheduleDate,\n scheduleTime,\n onChange,\n timeFormat = \"24h\",\n flat = true,\n}: {\n scheduleDate: string;\n scheduleTime: string;\n onChange: (patch: { scheduleDate?: string; scheduleTime?: string }) => void;\n timeFormat?: \"12h\" | \"24h\";\n flat?: boolean;\n}) {\n const [step, setStep] = useState<HourlyPickerStep>(() => (scheduleDate ? \"time\" : \"date\"));\n\n useEffect(() => {\n if (!scheduleDate) setStep(\"date\");\n }, [scheduleDate]);\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 !scheduleDate && \"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={PRICING_TODAY}\n onChange={(v) => {\n onChange({ scheduleDate: 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 <div className=\"flex flex-col gap-1.5\">\n <ScheduleFieldLabel>Pick a time</ScheduleFieldLabel>\n <div className=\"flex justify-center rounded-2xl border border-border bg-card py-6\">\n <AnalogClockPicker\n value={scheduleTime}\n onChange={(v) => onChange({ scheduleTime: v })}\n timeFormat={timeFormat}\n />\n </div>\n </div>\n\n {scheduleDate && scheduleTime ? (\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(scheduleTime, timeFormat)}\n </span>\n </div>\n </div>\n ) : null}\n </div>\n )}\n </div>\n );\n}\n"]}
|
|
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 * Copied from `@spacesync/client/domain/lib/pricing` so the client has no package dependency.\n */\n\nexport type RepeatType = \"none\" | \"daily\" | \"weekly\" | \"monthly\";\nexport type BookingMode = \"slots\" | \"schedule\";\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 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 /** Daily per-day tiers: single-day booking when true (endDate = startDate + 1 day). */\n oneDayBooking?: boolean;\n}\n\nexport const PRICING_TODAY = new Date().toISOString().split(\"T\")[0];\n\n/** First full month available: next month if today is past the 1st, else current month. */\nexport function computeMinMonth(): string {\n const d = new Date();\n if (d.getDate() === 1) {\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, \"0\")}`;\n }\n const n = new Date(d.getFullYear(), d.getMonth() + 1, 1);\n return `${n.getFullYear()}-${String(n.getMonth() + 1).padStart(2, \"0\")}`;\n}\n\n/** First full week available: next Monday unless today is already Monday. */\nexport function computeMinWeekStart(): string {\n const d = new Date();\n const day = d.getDay();\n if (day === 1) return d.toISOString().split(\"T\")[0];\n const skip = day === 0 ? 1 : 8 - day;\n d.setDate(d.getDate() + skip);\n return d.toISOString().split(\"T\")[0];\n}\n\nexport const MIN_MONTH =\n computeMinMonth() ||\n `${new Date().getFullYear()}-${String(new Date().getMonth() + 2).padStart(2, \"0\")}`;\nexport const MIN_WEEK_START = computeMinWeekStart() || PRICING_TODAY;\n\n/** True when today is not the 1st — meaning the current month is partial. */\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).getTime())) return \"—\";\n const end = new Date(weekFrom);\n end.setDate(end.getDate() + weekCount * 7 - 1);\n const s = new Date(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\nfunction parseDateOnly(date: string): Date {\n const [y, m, d] = date.split(\"-\").map(Number);\n return new Date(y, m - 1, d);\n}\n\nfunction formatDateOnly(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 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 formatDateOnly(d);\n}\n","import { useEffect, useState } from \"react\";\nimport { ChevronLeft, ChevronRight, Info } from \"lucide-react\";\nimport {\n IS_PARTIAL_MONTH,\n MIN_MONTH,\n MIN_WEEK_START,\n PRICING_TODAY,\n addDays,\n diffDays,\n monthCount,\n monthLabel,\n weekRangeLabel,\n type BookingState,\n} from \"../lib/booking-schedule\";\nimport { AnalogClockPicker } from \"./analog-clock-picker\";\nimport { formatTimeForDisplay } from \"../ui/time-field\";\nimport { 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 d.toISOString().split(\"T\")[0];\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 onChange,\n flat = false,\n}: {\n weekFrom: string;\n onChange: (v: string) => 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\n const days = getCalendarGrid(calYear, calMonth);\n const minDate = new Date((MIN_WEEK_START || PRICING_TODAY) + \"T00:00:00\");\n const selectedMonStr = weekFrom || null;\n const hoverMonStr = hoverMon;\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 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=\"mb-1 flex items-center justify-between px-1\">\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=\"mb-0.5 grid grid-cols-7\">\n {[\"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\", \"Su\"].map((d) => (\n <span key={d} className=\"py-0.5 text-center text-[10px] font-medium text-muted-foreground\">\n {d}\n </span>\n ))}\n </div>\n\n {weeks.map((week, wi) => {\n const mondayDate = week[0];\n const monStr = dayStr(mondayDate);\n const isSelectable = mondayDate >= minDate;\n const isSelected = monStr === selectedMonStr;\n const isHovered = monStr === hoverMonStr && isSelectable && !isSelected;\n\n return (\n <div\n key={wi}\n className={`flex cursor-pointer overflow-hidden rounded-xl transition-colors\n ${isSelected ? \"bg-blue-100\" : isHovered ? \"bg-blue-50\" : isSelectable ? \"hover:bg-accent\" : \"cursor-not-allowed\"}`}\n onMouseEnter={() => isSelectable && setHoverMon(monStr)}\n onMouseLeave={() => setHoverMon(null)}\n onClick={() => isSelectable && onChange(monStr)}\n >\n {week.map((d, di) => {\n const isCurrentMonth = d.getMonth() === calMonth;\n const isMon = di === 0;\n const isSelectedMon = isSelected && isMon;\n\n return (\n <div key={di} className=\"flex h-8 flex-1 items-center justify-center\">\n <span\n className={`\n flex h-7 w-7 items-center justify-center rounded-full text-[11px] transition-colors\n ${isSelectedMon ? \"bg-blue-500 font-semibold text-white\" : \"\"}\n ${!isSelectedMon && isSelected ? \"text-blue-700 dark:text-blue-400\" : \"\"}\n ${!isSelected && isSelectable && isCurrentMonth ? \"text-muted-foreground\" : \"\"}\n ${!isSelectable && isCurrentMonth ? \"text-muted-foreground/60\" : \"\"}\n ${!isCurrentMonth ? \"text-muted-foreground/60\" : \"\"}\n `}\n >\n {d.getDate()}\n </span>\n </div>\n );\n })}\n </div>\n );\n })}\n\n <p className=\"mt-1 text-center text-[10px] text-muted-foreground\">Click any row to select that week</p>\n </div>\n );\n}\n\nexport function MonthRangeCalendar({\n monthFrom,\n monthTo,\n onChange,\n flat = false,\n}: {\n monthFrom: string;\n monthTo: string;\n onChange: (from: string, to: string) => void;\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 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 = MIN_MONTH || `${new Date().getFullYear()}-01`;\n\n const [dispFrom, dispTo] = (() => {\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 (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 }\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 <div className={cn(\"flex items-center justify-between\", flat ? \"px-1\" : \"px-4 pb-2 pt-4\")}>\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\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 a month to set the start\n </>\n ) : (\n <>\n <span className=\"h-1.5 w-1.5 shrink-0 animate-pulse rounded-full bg-blue-500\" />\n Now click to set the end 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\n <div\n className={cn(\"grid grid-cols-4\", flat ? \"gap-2 py-1\" : \"px-2 pb-3 pt-1\")}\n style={flat ? undefined : { gap: 0 }}\n >\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 = 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) && !disabled;\n\n return (\n <div\n key={i}\n className={cn(\n \"relative\",\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\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 phase === \"from\" && actualCount > 0 ? \"border-border bg-muted\" : \"border-transparent\",\n ),\n )}\n >\n {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 ) : 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\">No months selected</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 return (\n <div className={cn(\"flex flex-col\", flat ? \"gap-5\" : \"gap-3\")}>\n {IS_PARTIAL_MONTH ? (\n <ScheduleInfoBanner>\n Today is {new Date(PRICING_TODAY).toLocaleDateString(\"en-US\", { month: \"long\", day: \"numeric\" })}.\n Current month is partially elapsed — earliest bookable month is{\" \"}\n <strong>{monthLabel(MIN_MONTH)}</strong>.\n </ScheduleInfoBanner>\n ) : null}\n <ScheduleFieldLabel>Select month range</ScheduleFieldLabel>\n <MonthRangeCalendar\n flat={flat}\n monthFrom={booking.monthFrom}\n monthTo={booking.monthTo}\n onChange={(from, to) => onChange({ monthFrom: from, monthTo: to })}\n />\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 rangeStr = weekRangeLabel(booking.weekFrom, booking.weekCount);\n const isCurrentWeekPartial = new Date(PRICING_TODAY).getDay() !== 1;\n\n return (\n <div className={cn(\"flex flex-col\", flat ? \"gap-5\" : \"gap-3\")}>\n {isCurrentWeekPartial ? (\n <ScheduleInfoBanner>\n This week started on a {new Date(PRICING_TODAY).toLocaleDateString(\"en-US\", { weekday: \"long\" })} — earliest\n full week begins{\" \"}\n <strong>\n {new Date(MIN_WEEK_START).toLocaleDateString(\"en-US\", {\n month: \"long\",\n day: \"numeric\",\n })}\n </strong>\n .\n </ScheduleInfoBanner>\n ) : null}\n\n <div className=\"flex flex-col gap-1.5\">\n <ScheduleFieldLabel>Starting week</ScheduleFieldLabel>\n <WeekCalendarPicker\n flat={flat}\n weekFrom={booking.weekFrom}\n onChange={(v) => onChange({ weekFrom: v })}\n />\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <ScheduleFieldLabel>Number of weeks</ScheduleFieldLabel>\n <div className=\"flex items-center gap-3\">\n <ScheduleStepper\n value={booking.weekCount}\n max={52}\n onChange={(v) => onChange({ weekCount: v })}\n />\n <span className=\"text-xs text-muted-foreground\">\n {booking.weekCount} week{booking.weekCount !== 1 ? \"s\" : \"\"}\n </span>\n </div>\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 = PRICING_TODAY,\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=\"mb-1 flex items-center justify-between px-1\">\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=\"mb-0.5 grid grid-cols-7\">\n {[\"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\", \"Su\"].map((d) => (\n <span key={d} className=\"py-0.5 text-center text-[10px] font-medium text-muted-foreground\">\n {d}\n </span>\n ))}\n </div>\n\n <div className=\"grid grid-cols-7\">\n {days.map((d) => {\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 !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 isSelected && \"bg-blue-500 font-semibold text-white shadow-sm\",\n !isSelected && isSelectable && isCurrentMonth && \"text-foreground hover:bg-accent\",\n !isSelected && isSelectable && !isCurrentMonth && \"text-muted-foreground hover:bg-accent\",\n !isSelectable && isCurrentMonth && \"text-muted-foreground/40\",\n !isSelectable && !isCurrentMonth && \"text-muted-foreground/30\",\n )}\n >\n {d.getDate()}\n </span>\n </button>\n );\n })}\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 = PRICING_TODAY,\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 className=\"mb-1 flex items-center justify-between px-1\">\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\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=\"mb-0.5 grid grid-cols-7\">\n {[\"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\", \"Su\"].map((d) => (\n <span key={d} className=\"py-0.5 text-center text-[10px] font-medium text-muted-foreground\">\n {d}\n </span>\n ))}\n </div>\n\n <div className=\"grid grid-cols-7\">\n {days.map((d) => {\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 = 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 !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 ? \"left-1/2 right-0 rounded-l-full\" : isEnd ? \"left-0 right-1/2 rounded-r-full\" : \"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 (isStart || isEnd || isSingle) && \"bg-blue-500 font-semibold text-white shadow-sm\",\n !isStart && !isEnd && !isSingle && inRange && \"font-medium text-blue-700 dark:text-blue-400\",\n !inRange && isSelectable && isCurrentMonth && \"text-foreground hover:bg-accent\",\n !inRange && isSelectable && !isCurrentMonth && \"text-muted-foreground hover:bg-accent\",\n !isSelectable && isCurrentMonth && \"text-muted-foreground/40\",\n !isSelectable && !isCurrentMonth && \"text-muted-foreground/30\",\n )}\n >\n {d.getDate()}\n </span>\n </button>\n );\n })}\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 <div className=\"flex gap-2\">\n {(\n [\n { key: true, label: \"Single day\" },\n { key: false, label: \"Multiple days\" },\n ] as const\n ).map(({ key, label }) => (\n <button\n key={String(key)}\n type=\"button\"\n onClick={() => {\n const start = booking.startDate || PRICING_TODAY;\n if (key) {\n onChange({ oneDayBooking: true, startDate: start, endDate: addDays(start, 1) });\n } else {\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 className={cn(\n \"flex h-9 flex-1 items-center justify-center rounded-xl border text-sm font-medium transition-colors\",\n oneDay === key\n ? \"border-blue-400 bg-blue-50 text-blue-600 dark:bg-blue-950/40 dark:text-blue-400\"\n : \"border-border bg-card text-muted-foreground hover:bg-accent\",\n )}\n >\n {label}\n </button>\n ))}\n </div>\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\nexport function HourlySchedulePicker({\n scheduleDate,\n scheduleTime,\n onChange,\n timeFormat = \"24h\",\n flat = true,\n}: {\n scheduleDate: string;\n scheduleTime: string;\n onChange: (patch: { scheduleDate?: string; scheduleTime?: string }) => void;\n timeFormat?: \"12h\" | \"24h\";\n flat?: boolean;\n}) {\n const [step, setStep] = useState<HourlyPickerStep>(() => (scheduleDate ? \"time\" : \"date\"));\n\n useEffect(() => {\n if (!scheduleDate) setStep(\"date\");\n }, [scheduleDate]);\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 !scheduleDate && \"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={PRICING_TODAY}\n onChange={(v) => {\n onChange({ scheduleDate: 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 <div className=\"flex flex-col gap-1.5\">\n <ScheduleFieldLabel>Pick a time</ScheduleFieldLabel>\n <div className=\"flex justify-center rounded-2xl border border-border bg-card py-6\">\n <AnalogClockPicker\n value={scheduleTime}\n onChange={(v) => onChange({ scheduleTime: v })}\n timeFormat={timeFormat}\n />\n </div>\n </div>\n\n {scheduleDate && scheduleTime ? (\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(scheduleTime, timeFormat)}\n </span>\n </div>\n </div>\n ) : null}\n </div>\n )}\n </div>\n );\n}\n"]}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import './chunk-
|
|
1
|
+
import './chunk-H3CNZCYU.js';
|
|
2
2
|
import './chunk-RV5PMZYZ.js';
|
|
3
3
|
import './chunk-L65F4EMK.js';
|
|
4
4
|
import './chunk-PBNBLCC2.js';
|
|
5
5
|
import './chunk-VVXGQKN7.js';
|
|
6
6
|
import './chunk-7YCAAP43.js';
|
|
7
|
+
import './chunk-DC4QH6W2.js';
|
|
7
8
|
import './chunk-LUB7QWGU.js';
|
|
8
9
|
import { Button } from './chunk-VHINHHZQ.js';
|
|
9
10
|
import './chunk-FCY5FYJB.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/support/chat-stick-to-bottom.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/support/chat-stick-to-bottom.tsx"],"names":[],"mappings":"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","file":"chat-stick-to-bottom.js","sourcesContent":["import { useCallback, useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { ChevronDown } from \"lucide-react\";\nimport { Button, cn } from \"../ui\";\n\nconst NEAR_BOTTOM_PX = 80;\n\nfunction isNearBottom(el: HTMLElement): boolean {\n return el.scrollHeight - el.scrollTop - el.clientHeight <= NEAR_BOTTOM_PX;\n}\n\nexport function useChatStickToBottom(opts: {\n conversationId: string | null;\n itemCount: number;\n lastItemId?: string | null;\n pinToLatest?: boolean;\n layoutKey?: string | number | null;\n}) {\n const scrollerRef = useRef<HTMLDivElement>(null);\n const bottomRef = useRef<HTMLDivElement>(null);\n const stuckRef = useRef(true);\n const prevConversationId = useRef<string | null>(null);\n const prevItemCount = useRef(0);\n const prevLastItemId = useRef<string | null | undefined>(undefined);\n const [unseenCount, setUnseenCount] = useState(0);\n\n const scrollToBottom = useCallback((behavior: ScrollBehavior = \"smooth\") => {\n const el = scrollerRef.current;\n if (!el) return;\n stuckRef.current = true;\n setUnseenCount(0);\n const run = () => {\n el.scrollTo({ top: el.scrollHeight, behavior });\n bottomRef.current?.scrollIntoView({ block: \"end\", behavior });\n };\n run();\n requestAnimationFrame(() => {\n run();\n requestAnimationFrame(run);\n });\n window.setTimeout(() => {\n if (!stuckRef.current) return;\n el.scrollTop = el.scrollHeight;\n }, 120);\n }, []);\n\n const syncStuckFromScroll = useCallback(() => {\n const el = scrollerRef.current;\n if (!el) return;\n const atBottom = isNearBottom(el);\n stuckRef.current = atBottom;\n if (atBottom) setUnseenCount(0);\n }, []);\n\n useEffect(() => {\n const root = scrollerRef.current;\n const target = bottomRef.current;\n if (!root || !target) return;\n const io = new IntersectionObserver(\n ([entry]) => {\n if (entry?.isIntersecting) {\n stuckRef.current = true;\n setUnseenCount(0);\n }\n },\n { root, threshold: 0, rootMargin: `0px 0px ${NEAR_BOTTOM_PX}px 0px` },\n );\n io.observe(target);\n return () => io.disconnect();\n }, [opts.conversationId, opts.itemCount]);\n\n useEffect(() => {\n const el = scrollerRef.current;\n if (!el) return;\n const onScroll = () => syncStuckFromScroll();\n el.addEventListener(\"scroll\", onScroll, { passive: true });\n const ro = new ResizeObserver(() => {\n if (!stuckRef.current) return;\n el.scrollTop = el.scrollHeight;\n });\n ro.observe(el);\n const inner = el.firstElementChild;\n if (inner) ro.observe(inner);\n return () => {\n el.removeEventListener(\"scroll\", onScroll);\n ro.disconnect();\n };\n }, [opts.conversationId, opts.itemCount, syncStuckFromScroll]);\n\n useLayoutEffect(() => {\n const conversationChanged = prevConversationId.current !== opts.conversationId;\n const lastIdChanged = prevLastItemId.current !== opts.lastItemId;\n const countDelta = opts.itemCount - prevItemCount.current;\n\n if (conversationChanged) {\n stuckRef.current = true;\n setUnseenCount(0);\n prevConversationId.current = opts.conversationId;\n prevItemCount.current = opts.itemCount;\n prevLastItemId.current = opts.lastItemId;\n if (opts.conversationId) scrollToBottom(\"auto\");\n return;\n }\n\n if (!opts.conversationId) {\n prevItemCount.current = opts.itemCount;\n prevLastItemId.current = opts.lastItemId;\n return;\n }\n\n if (lastIdChanged || countDelta > 0) {\n const added = Math.max(countDelta, lastIdChanged ? 1 : 0);\n if (opts.pinToLatest || stuckRef.current) {\n scrollToBottom(\"smooth\");\n } else if (added > 0) {\n setUnseenCount((n) => n + added);\n }\n }\n\n prevItemCount.current = opts.itemCount;\n prevLastItemId.current = opts.lastItemId;\n }, [opts.conversationId, opts.itemCount, opts.lastItemId, opts.pinToLatest, scrollToBottom]);\n\n useLayoutEffect(() => {\n if (!opts.conversationId || !stuckRef.current) return;\n const el = scrollerRef.current;\n if (!el) return;\n el.scrollTop = el.scrollHeight;\n }, [opts.layoutKey, opts.conversationId]);\n\n return {\n scrollerRef,\n bottomRef,\n unseenCount,\n scrollToBottom: () => scrollToBottom(\"smooth\"),\n };\n}\n\nexport function ChatNewMessagesButton({\n count,\n onClick,\n className,\n}: {\n count: number;\n onClick: () => void;\n className?: string;\n}) {\n if (count <= 0) return null;\n const label = count === 1 ? \"1 new message\" : `${count} new messages`;\n return (\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={onClick}\n className={cn(\"pointer-events-auto h-8 rounded-full px-3 shadow-md\", className)}\n aria-label={label}\n >\n <ChevronDown size={14} strokeWidth={2} />\n {label}\n </Button>\n );\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { parseHm, toTimeStr, formatTimeForDisplay } from './chunk-
|
|
1
|
+
import { parseHm, toTimeStr, formatTimeForDisplay } from './chunk-H3CNZCYU.js';
|
|
2
2
|
import { cn } from './chunk-DMPSQ22Q.js';
|
|
3
3
|
import { useRef, useState, useCallback, useMemo } from 'react';
|
|
4
4
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
@@ -377,5 +377,5 @@ function AnalogClockPicker({
|
|
|
377
377
|
}
|
|
378
378
|
|
|
379
379
|
export { AnalogClockPicker };
|
|
380
|
-
//# sourceMappingURL=chunk-
|
|
381
|
-
//# sourceMappingURL=chunk-
|
|
380
|
+
//# sourceMappingURL=chunk-34332W2P.js.map
|
|
381
|
+
//# sourceMappingURL=chunk-34332W2P.js.map
|