@hanzo/booker 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/README.md +78 -0
  2. package/dist/cjs/Booker.cjs +153 -0
  3. package/dist/cjs/Booker.native.js +158 -0
  4. package/dist/cjs/Booker.native.js.map +1 -0
  5. package/dist/cjs/BookingForm.cjs +197 -0
  6. package/dist/cjs/BookingForm.native.js +203 -0
  7. package/dist/cjs/BookingForm.native.js.map +1 -0
  8. package/dist/cjs/CalendarEmbed.cjs +121 -0
  9. package/dist/cjs/CalendarEmbed.native.js +125 -0
  10. package/dist/cjs/CalendarEmbed.native.js.map +1 -0
  11. package/dist/cjs/Confirmation.cjs +177 -0
  12. package/dist/cjs/Confirmation.native.js +185 -0
  13. package/dist/cjs/Confirmation.native.js.map +1 -0
  14. package/dist/cjs/EventHeader.cjs +112 -0
  15. package/dist/cjs/EventHeader.native.js +118 -0
  16. package/dist/cjs/EventHeader.native.js.map +1 -0
  17. package/dist/cjs/MonthCalendar.cjs +177 -0
  18. package/dist/cjs/MonthCalendar.native.js +191 -0
  19. package/dist/cjs/MonthCalendar.native.js.map +1 -0
  20. package/dist/cjs/TimeSlots.cjs +119 -0
  21. package/dist/cjs/TimeSlots.native.js +126 -0
  22. package/dist/cjs/TimeSlots.native.js.map +1 -0
  23. package/dist/cjs/client.cjs +136 -0
  24. package/dist/cjs/client.native.js +267 -0
  25. package/dist/cjs/client.native.js.map +1 -0
  26. package/dist/cjs/hooks.cjs +193 -0
  27. package/dist/cjs/hooks.native.js +221 -0
  28. package/dist/cjs/hooks.native.js.map +1 -0
  29. package/dist/cjs/index.cjs +71 -0
  30. package/dist/cjs/index.native.js +74 -0
  31. package/dist/cjs/index.native.js.map +1 -0
  32. package/dist/cjs/time.cjs +145 -0
  33. package/dist/cjs/time.native.js +150 -0
  34. package/dist/cjs/time.native.js.map +1 -0
  35. package/dist/cjs/useBooker.cjs +151 -0
  36. package/dist/cjs/useBooker.native.js +173 -0
  37. package/dist/cjs/useBooker.native.js.map +1 -0
  38. package/dist/esm/Booker.mjs +128 -0
  39. package/dist/esm/Booker.mjs.map +1 -0
  40. package/dist/esm/Booker.native.js +130 -0
  41. package/dist/esm/Booker.native.js.map +1 -0
  42. package/dist/esm/BookingForm.mjs +172 -0
  43. package/dist/esm/BookingForm.mjs.map +1 -0
  44. package/dist/esm/BookingForm.native.js +175 -0
  45. package/dist/esm/BookingForm.native.js.map +1 -0
  46. package/dist/esm/CalendarEmbed.mjs +96 -0
  47. package/dist/esm/CalendarEmbed.mjs.map +1 -0
  48. package/dist/esm/CalendarEmbed.native.js +97 -0
  49. package/dist/esm/CalendarEmbed.native.js.map +1 -0
  50. package/dist/esm/Confirmation.mjs +152 -0
  51. package/dist/esm/Confirmation.mjs.map +1 -0
  52. package/dist/esm/Confirmation.native.js +157 -0
  53. package/dist/esm/Confirmation.native.js.map +1 -0
  54. package/dist/esm/EventHeader.mjs +87 -0
  55. package/dist/esm/EventHeader.mjs.map +1 -0
  56. package/dist/esm/EventHeader.native.js +90 -0
  57. package/dist/esm/EventHeader.native.js.map +1 -0
  58. package/dist/esm/MonthCalendar.mjs +152 -0
  59. package/dist/esm/MonthCalendar.mjs.map +1 -0
  60. package/dist/esm/MonthCalendar.native.js +163 -0
  61. package/dist/esm/MonthCalendar.native.js.map +1 -0
  62. package/dist/esm/TimeSlots.mjs +94 -0
  63. package/dist/esm/TimeSlots.mjs.map +1 -0
  64. package/dist/esm/TimeSlots.native.js +98 -0
  65. package/dist/esm/TimeSlots.native.js.map +1 -0
  66. package/dist/esm/client.mjs +104 -0
  67. package/dist/esm/client.mjs.map +1 -0
  68. package/dist/esm/client.native.js +232 -0
  69. package/dist/esm/client.native.js.map +1 -0
  70. package/dist/esm/hooks.mjs +165 -0
  71. package/dist/esm/hooks.mjs.map +1 -0
  72. package/dist/esm/hooks.native.js +190 -0
  73. package/dist/esm/hooks.native.js.map +1 -0
  74. package/dist/esm/index.js +13 -0
  75. package/dist/esm/index.js.map +1 -0
  76. package/dist/esm/index.mjs +13 -0
  77. package/dist/esm/index.mjs.map +1 -0
  78. package/dist/esm/index.native.js +13 -0
  79. package/dist/esm/index.native.js.map +1 -0
  80. package/dist/esm/time.mjs +107 -0
  81. package/dist/esm/time.mjs.map +1 -0
  82. package/dist/esm/time.native.js +109 -0
  83. package/dist/esm/time.native.js.map +1 -0
  84. package/dist/esm/useBooker.mjs +126 -0
  85. package/dist/esm/useBooker.mjs.map +1 -0
  86. package/dist/esm/useBooker.native.js +145 -0
  87. package/dist/esm/useBooker.native.js.map +1 -0
  88. package/package.json +61 -0
  89. package/src/Booker.tsx +152 -0
  90. package/src/BookingForm.tsx +180 -0
  91. package/src/CalendarEmbed.tsx +111 -0
  92. package/src/Confirmation.tsx +145 -0
  93. package/src/EventHeader.tsx +85 -0
  94. package/src/MonthCalendar.tsx +179 -0
  95. package/src/TimeSlots.tsx +102 -0
  96. package/src/client.ts +218 -0
  97. package/src/hooks.ts +180 -0
  98. package/src/index.ts +72 -0
  99. package/src/time.ts +131 -0
  100. package/src/useBooker.ts +187 -0
  101. package/types/Booker.d.ts +16 -0
  102. package/types/Booker.d.ts.map +1 -0
  103. package/types/BookingForm.d.ts +13 -0
  104. package/types/BookingForm.d.ts.map +1 -0
  105. package/types/CalendarEmbed.d.ts +15 -0
  106. package/types/CalendarEmbed.d.ts.map +1 -0
  107. package/types/Confirmation.d.ts +12 -0
  108. package/types/Confirmation.d.ts.map +1 -0
  109. package/types/EventHeader.d.ts +10 -0
  110. package/types/EventHeader.d.ts.map +1 -0
  111. package/types/MonthCalendar.d.ts +14 -0
  112. package/types/MonthCalendar.d.ts.map +1 -0
  113. package/types/TimeSlots.d.ts +15 -0
  114. package/types/TimeSlots.d.ts.map +1 -0
  115. package/types/client.d.ts +77 -0
  116. package/types/client.d.ts.map +1 -0
  117. package/types/hooks.d.ts +43 -0
  118. package/types/hooks.d.ts.map +1 -0
  119. package/types/index.d.ts +12 -0
  120. package/types/index.d.ts.map +1 -0
  121. package/types/time.d.ts +38 -0
  122. package/types/time.d.ts.map +1 -0
  123. package/types/useBooker.d.ts +41 -0
  124. package/types/useBooker.d.ts.map +1 -0
@@ -0,0 +1,187 @@
1
+ // Orchestration hook — the one booking state machine both shells consume.
2
+
3
+ import { useEffect, useMemo, useState } from 'react'
4
+ import { DEFAULT_API_URL, type Booking, type BookingResponses, type Slot } from './client'
5
+ import {
6
+ useAvailableSlots,
7
+ useCreateBooking,
8
+ useEventType,
9
+ type AsyncState,
10
+ type SlotsState,
11
+ } from './hooks'
12
+ import type { EventType } from './client'
13
+ import { addMonths, monthRange, startOfMonth, visitorTimeZone } from './time'
14
+
15
+ export type BookerPhase = 'pick' | 'form' | 'done'
16
+
17
+ export interface UseBookerOptions {
18
+ host: string
19
+ eventSlug: string
20
+ apiUrl?: string
21
+ timeZone?: string
22
+ weekStartsOn?: 0 | 1
23
+ onBooked?: (booking: Booking) => void
24
+ /** Auto-select the soonest available day (used by the compact embed). */
25
+ autoSelectFirst?: boolean
26
+ }
27
+
28
+ export interface BookerModel {
29
+ api: string
30
+ timeZone: string
31
+ weekStartsOn: 0 | 1
32
+ event: AsyncState<EventType>
33
+ slots: SlotsState
34
+ viewDate: Date
35
+ availableKeys: Set<string>
36
+ selectedDay: string | null
37
+ daySlots: Slot[]
38
+ selectedSlot: string | null
39
+ phase: BookerPhase
40
+ booking: Booking | null
41
+ submitting: boolean
42
+ error: string | null
43
+ conflict: boolean
44
+ goPrevMonth: () => void
45
+ goNextMonth: () => void
46
+ atFirstMonth: boolean
47
+ selectDay: (key: string) => void
48
+ selectSlot: (iso: string) => void
49
+ submit: (responses: BookingResponses) => Promise<void>
50
+ back: () => void
51
+ reset: () => void
52
+ }
53
+
54
+ export function useBooker(opts: UseBookerOptions): BookerModel {
55
+ const api = opts.apiUrl ?? DEFAULT_API_URL
56
+ const timeZone = opts.timeZone ?? visitorTimeZone()
57
+ const weekStartsOn = opts.weekStartsOn ?? 0
58
+
59
+ const event = useEventType(api, opts.eventSlug, opts.host)
60
+
61
+ const [viewDate, setViewDate] = useState<Date>(() => startOfMonth(new Date()))
62
+ const { startTime, endTime } = useMemo(() => monthRange(viewDate), [viewDate])
63
+
64
+ const slots = useAvailableSlots(api, {
65
+ eventTypeSlug: opts.eventSlug,
66
+ username: opts.host,
67
+ startTime,
68
+ endTime,
69
+ timeZone,
70
+ enabled: !!event.data,
71
+ })
72
+
73
+ const [selectedDay, setSelectedDay] = useState<string | null>(null)
74
+ const [selectedSlot, setSelectedSlot] = useState<string | null>(null)
75
+ const [phase, setPhase] = useState<BookerPhase>('pick')
76
+ const [booking, setBooking] = useState<Booking | null>(null)
77
+
78
+ const create = useCreateBooking(api)
79
+
80
+ const availableKeys = useMemo(() => {
81
+ const map = slots.data ?? {}
82
+ return new Set(Object.keys(map).filter((k) => (map[k]?.length ?? 0) > 0))
83
+ }, [slots.data])
84
+
85
+ const daySlots = useMemo(() => {
86
+ if (!selectedDay) return []
87
+ return slots.data?.[selectedDay] ?? []
88
+ }, [slots.data, selectedDay])
89
+
90
+ // Optionally auto-select the soonest available day once slots arrive.
91
+ useEffect(() => {
92
+ if (!opts.autoSelectFirst) return
93
+ if (selectedDay && availableKeys.has(selectedDay)) return
94
+ const first = [...availableKeys].sort()[0]
95
+ if (first) {
96
+ setSelectedDay(first)
97
+ setSelectedSlot(null)
98
+ }
99
+ }, [opts.autoSelectFirst, availableKeys, selectedDay])
100
+
101
+ const now = startOfMonth(new Date())
102
+ const atFirstMonth =
103
+ viewDate.getFullYear() === now.getFullYear() && viewDate.getMonth() === now.getMonth()
104
+
105
+ const goPrevMonth = () => {
106
+ if (atFirstMonth) return
107
+ setViewDate((d) => addMonths(d, -1))
108
+ setSelectedDay(null)
109
+ setSelectedSlot(null)
110
+ }
111
+ const goNextMonth = () => {
112
+ setViewDate((d) => addMonths(d, 1))
113
+ setSelectedDay(null)
114
+ setSelectedSlot(null)
115
+ }
116
+
117
+ const selectDay = (key: string) => {
118
+ setSelectedDay(key)
119
+ setSelectedSlot(null)
120
+ }
121
+ const selectSlot = (iso: string) => {
122
+ setSelectedSlot(iso)
123
+ setPhase('form')
124
+ create.reset()
125
+ }
126
+ const back = () => {
127
+ setPhase('pick')
128
+ setSelectedSlot(null)
129
+ create.reset()
130
+ }
131
+ const reset = () => {
132
+ setBooking(null)
133
+ setSelectedSlot(null)
134
+ setSelectedDay(null)
135
+ setPhase('pick')
136
+ create.reset()
137
+ slots.refetch()
138
+ }
139
+
140
+ const submit = async (responses: BookingResponses) => {
141
+ if (!selectedSlot) return
142
+ const result = await create.submit({
143
+ eventTypeSlug: opts.eventSlug,
144
+ username: opts.host,
145
+ start: selectedSlot,
146
+ timeZone,
147
+ responses,
148
+ })
149
+ if (result.ok) {
150
+ setBooking(result.booking)
151
+ setPhase('done')
152
+ opts.onBooked?.(result.booking)
153
+ } else if (result.conflict) {
154
+ // Slot was just taken — refresh availability and return to picking.
155
+ slots.refetch()
156
+ setSelectedSlot(null)
157
+ setPhase('pick')
158
+ }
159
+ // non-conflict errors stay visible in the form via `error`.
160
+ }
161
+
162
+ return {
163
+ api,
164
+ timeZone,
165
+ weekStartsOn,
166
+ event,
167
+ slots,
168
+ viewDate,
169
+ availableKeys,
170
+ selectedDay,
171
+ daySlots,
172
+ selectedSlot,
173
+ phase,
174
+ booking,
175
+ submitting: create.submitting,
176
+ error: create.error,
177
+ conflict: create.conflict,
178
+ goPrevMonth,
179
+ goNextMonth,
180
+ atFirstMonth,
181
+ selectDay,
182
+ selectSlot,
183
+ submit,
184
+ back,
185
+ reset,
186
+ }
187
+ }
@@ -0,0 +1,16 @@
1
+ import type { Booking } from './client';
2
+ export interface BookerProps {
3
+ /** Host username (the calendar owner), e.g. "hanzo". */
4
+ host: string;
5
+ /** Event-type slug, e.g. "intro". */
6
+ eventSlug: string;
7
+ /** API base, defaults to https://api.hanzo.ai/v1/calendar */
8
+ apiUrl?: string;
9
+ /** Visitor IANA time zone; defaults to the browser/device zone. */
10
+ timeZone?: string;
11
+ weekStartsOn?: 0 | 1;
12
+ onBooked?: (booking: Booking) => void;
13
+ }
14
+ /** Universal scheduling flow: event → month → times → details → confirmation. */
15
+ export declare function Booker(props: BookerProps): import("react").JSX.Element;
16
+ //# sourceMappingURL=Booker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Booker.d.ts","sourceRoot":"","sources":["../src/Booker.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAQvC,MAAM,WAAW,WAAW;IAC1B,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAA;IACZ,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAA;IACjB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;IACpB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;CACtC;AAED,iFAAiF;AACjF,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,+BAiGxC"}
@@ -0,0 +1,13 @@
1
+ import type { BookingResponses } from './client';
2
+ export interface BookingFormProps {
3
+ slotIso: string;
4
+ timeZone: string;
5
+ eventLength: number;
6
+ submitting?: boolean;
7
+ error?: string | null;
8
+ onSubmit: (responses: BookingResponses) => void;
9
+ onBack: () => void;
10
+ }
11
+ /** Attendee details form for the chosen slot. */
12
+ export declare function BookingForm({ slotIso, timeZone, eventLength, submitting, error, onSubmit, onBack, }: BookingFormProps): import("react").JSX.Element;
13
+ //# sourceMappingURL=BookingForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BookingForm.d.ts","sourceRoot":"","sources":["../src/BookingForm.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAGhD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,QAAQ,EAAE,CAAC,SAAS,EAAE,gBAAgB,KAAK,IAAI,CAAA;IAC/C,MAAM,EAAE,MAAM,IAAI,CAAA;CACnB;AAID,iDAAiD;AACjD,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,QAAQ,EACR,WAAW,EACX,UAAU,EACV,KAAK,EACL,QAAQ,EACR,MAAM,GACP,EAAE,gBAAgB,+BAsGlB"}
@@ -0,0 +1,15 @@
1
+ import type { Booking } from './client';
2
+ export interface CalendarEmbedProps {
3
+ host: string;
4
+ eventSlug: string;
5
+ apiUrl?: string;
6
+ timeZone?: string;
7
+ weekStartsOn?: 0 | 1;
8
+ onBooked?: (booking: Booking) => void;
9
+ }
10
+ /**
11
+ * Compact booking card for a marketing hero — soonest availability inline,
12
+ * no month grid. Same state machine as <Booker>.
13
+ */
14
+ export declare function CalendarEmbed(props: CalendarEmbedProps): import("react").JSX.Element;
15
+ //# sourceMappingURL=CalendarEmbed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CalendarEmbed.d.ts","sourceRoot":"","sources":["../src/CalendarEmbed.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAQvC,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;IACpB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;CACtC;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,+BAwFtD"}
@@ -0,0 +1,12 @@
1
+ import { type Booking } from './client';
2
+ export interface ConfirmationProps {
3
+ /** Provide a booking directly, or a uid to fetch one. */
4
+ booking?: Booking;
5
+ uid?: string;
6
+ apiUrl?: string;
7
+ timeZone?: string;
8
+ onDone?: () => void;
9
+ }
10
+ /** Booking confirmation card. Accepts a booking object or fetches by uid. */
11
+ export declare function Confirmation({ booking, uid, apiUrl, timeZone, onDone, }: ConfirmationProps): import("react").JSX.Element;
12
+ //# sourceMappingURL=Confirmation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Confirmation.d.ts","sourceRoot":"","sources":["../src/Confirmation.tsx"],"names":[],"mappings":"AASA,OAAO,EAAmB,KAAK,OAAO,EAAE,MAAM,UAAU,CAAA;AAKxD,MAAM,WAAW,iBAAiB;IAChC,yDAAyD;IACzD,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;CACpB;AAED,6EAA6E;AAC7E,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,GAAG,EACH,MAAM,EACN,QAAQ,EACR,MAAM,GACP,EAAE,iBAAiB,+BA0FnB"}
@@ -0,0 +1,10 @@
1
+ import type { EventType } from './client';
2
+ export interface EventHeaderProps {
3
+ event: EventType;
4
+ host: string;
5
+ timeZone: string;
6
+ compact?: boolean;
7
+ }
8
+ /** Event identity: host, title, duration, timezone, description. */
9
+ export declare function EventHeader({ event, host, timeZone, compact }: EventHeaderProps): import("react").JSX.Element;
10
+ //# sourceMappingURL=EventHeader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventHeader.d.ts","sourceRoot":"","sources":["../src/EventHeader.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEzC,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,SAAS,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,oEAAoE;AACpE,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,gBAAgB,+BA0C/E"}
@@ -0,0 +1,14 @@
1
+ export interface MonthCalendarProps {
2
+ viewDate: Date;
3
+ availableKeys: Set<string>;
4
+ selectedDay: string | null;
5
+ onSelectDay: (key: string) => void;
6
+ onPrev: () => void;
7
+ onNext: () => void;
8
+ atFirstMonth: boolean;
9
+ weekStartsOn?: 0 | 1;
10
+ loading?: boolean;
11
+ }
12
+ /** Navigable month grid; days with availability are selectable. */
13
+ export declare function MonthCalendar({ viewDate, availableKeys, selectedDay, onSelectDay, onPrev, onNext, atFirstMonth, weekStartsOn, loading, }: MonthCalendarProps): import("react").JSX.Element;
14
+ //# sourceMappingURL=MonthCalendar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MonthCalendar.d.ts","sourceRoot":"","sources":["../src/MonthCalendar.tsx"],"names":[],"mappings":"AASA,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,IAAI,CAAA;IACd,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,YAAY,EAAE,OAAO,CAAA;IACrB,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;IACpB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,mEAAmE;AACnE,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,aAAa,EACb,WAAW,EACX,WAAW,EACX,MAAM,EACN,MAAM,EACN,YAAY,EACZ,YAAgB,EAChB,OAAO,GACR,EAAE,kBAAkB,+BAyDpB"}
@@ -0,0 +1,15 @@
1
+ import type { Slot } from './client';
2
+ export interface TimeSlotsProps {
3
+ dayKey: string | null;
4
+ slots: Slot[];
5
+ timeZone: string;
6
+ onPick: (iso: string) => void;
7
+ selectedIso?: string | null;
8
+ loading?: boolean;
9
+ /** compact = wrap into a flowing grid instead of a tall column */
10
+ compact?: boolean;
11
+ maxHeight?: number;
12
+ }
13
+ /** Time-slot pills for the selected day, shown in the visitor's time zone. */
14
+ export declare function TimeSlots({ dayKey, slots, timeZone, onPick, selectedIso, loading, compact, maxHeight, }: TimeSlotsProps): import("react").JSX.Element;
15
+ //# sourceMappingURL=TimeSlots.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimeSlots.d.ts","sourceRoot":"","sources":["../src/TimeSlots.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAGpC,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,KAAK,EAAE,IAAI,EAAE,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,kEAAkE;IAClE,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,8EAA8E;AAC9E,wBAAgB,SAAS,CAAC,EACxB,MAAM,EACN,KAAK,EACL,QAAQ,EACR,MAAM,EACN,WAAW,EACX,OAAO,EACP,OAAO,EACP,SAAe,GAChB,EAAE,cAAc,+BA4DhB"}
@@ -0,0 +1,77 @@
1
+ export declare const DEFAULT_API_URL = "https://api.hanzo.ai/v1/calendar";
2
+ export declare const CAL_API_VERSION = "2024-08-13";
3
+ export interface Location {
4
+ type?: string;
5
+ link?: string;
6
+ address?: string;
7
+ }
8
+ export interface Profile {
9
+ name?: string | null;
10
+ username?: string | null;
11
+ image?: string | null;
12
+ avatarUrl?: string | null;
13
+ }
14
+ export interface EventType {
15
+ id: number;
16
+ slug: string;
17
+ title: string;
18
+ description: string;
19
+ /** duration in minutes */
20
+ length: number;
21
+ locations: Location[];
22
+ price: number;
23
+ currency: string;
24
+ profile?: Profile;
25
+ }
26
+ export interface Slot {
27
+ /** ISO-8601 UTC instant, e.g. "2026-07-24T16:00:00Z" */
28
+ time: string;
29
+ }
30
+ /** Slots grouped by day key "YYYY-MM-DD" (in the requested time zone). */
31
+ export type SlotsByDay = Record<string, Slot[]>;
32
+ export interface Attendee {
33
+ name?: string;
34
+ email?: string;
35
+ timeZone?: string;
36
+ }
37
+ export interface Booking {
38
+ uid: string;
39
+ status: string;
40
+ start: string;
41
+ end: string;
42
+ title: string;
43
+ location?: string;
44
+ attendees?: Attendee[];
45
+ }
46
+ export interface BookingResponses {
47
+ name: string;
48
+ email: string;
49
+ notes?: string;
50
+ }
51
+ export interface CreateBookingInput {
52
+ eventTypeSlug: string;
53
+ username: string;
54
+ /** ISO instant of the chosen slot */
55
+ start: string;
56
+ timeZone: string;
57
+ responses: BookingResponses;
58
+ }
59
+ export interface SlotsInput {
60
+ eventTypeSlug: string;
61
+ username: string;
62
+ startTime: string;
63
+ endTime: string;
64
+ timeZone: string;
65
+ }
66
+ /** Error carrying the HTTP status; `conflict` marks a 409 (slot just taken). */
67
+ export declare class CalendarError extends Error {
68
+ status: number;
69
+ conflict: boolean;
70
+ constructor(message: string, status: number);
71
+ }
72
+ export declare function fetchEventType(api: string, eventSlug: string, username: string, signal?: AbortSignal): Promise<EventType>;
73
+ export declare function fetchSlots(api: string, input: SlotsInput, signal?: AbortSignal): Promise<SlotsByDay>;
74
+ export declare function createBooking(api: string, input: CreateBookingInput, signal?: AbortSignal): Promise<Booking>;
75
+ export declare function fetchBooking(api: string, uid: string, signal?: AbortSignal): Promise<Booking>;
76
+ export declare function cancelBooking(api: string, uid: string, reason?: string, signal?: AbortSignal): Promise<Booking>;
77
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { type Booking, type BookingResponses, type EventType, type SlotsByDay } from './client';
2
+ export interface AsyncState<T> {
3
+ data: T | null;
4
+ loading: boolean;
5
+ error: string | null;
6
+ }
7
+ export declare function useEventType(api: string, eventSlug: string, username: string): AsyncState<EventType>;
8
+ export interface SlotsQuery {
9
+ eventTypeSlug: string;
10
+ username: string;
11
+ startTime: string;
12
+ endTime: string;
13
+ timeZone: string;
14
+ enabled?: boolean;
15
+ }
16
+ export interface SlotsState extends AsyncState<SlotsByDay> {
17
+ refetch: () => void;
18
+ }
19
+ export declare function useAvailableSlots(api: string, query: SlotsQuery): SlotsState;
20
+ export type SubmitResult = {
21
+ ok: true;
22
+ booking: Booking;
23
+ } | {
24
+ ok: false;
25
+ conflict: boolean;
26
+ message: string;
27
+ };
28
+ export interface CreateBookingState {
29
+ submit: (input: {
30
+ eventTypeSlug: string;
31
+ username: string;
32
+ start: string;
33
+ timeZone: string;
34
+ responses: BookingResponses;
35
+ }) => Promise<SubmitResult>;
36
+ submitting: boolean;
37
+ error: string | null;
38
+ conflict: boolean;
39
+ reset: () => void;
40
+ }
41
+ export declare function useCreateBooking(api: string): CreateBookingState;
42
+ export declare function useBooking(api: string, uid: string | undefined): AsyncState<Booking>;
43
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAGA,OAAO,EAML,KAAK,OAAO,EACZ,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,KAAK,UAAU,EAChB,MAAM,UAAU,CAAA;AAEjB,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,IAAI,EAAE,CAAC,GAAG,IAAI,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB;AAED,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,UAAU,CAAC,SAAS,CAAC,CAkBvB;AAED,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,UAAW,SAAQ,UAAU,CAAC,UAAU,CAAC;IACxD,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,UAAU,CA4B5E;AAED,MAAM,MAAM,YAAY,GACpB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAC9B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAErD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,CAAC,KAAK,EAAE;QACd,aAAa,EAAE,MAAM,CAAA;QACrB,QAAQ,EAAE,MAAM,CAAA;QAChB,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,EAAE,MAAM,CAAA;QAChB,SAAS,EAAE,gBAAgB,CAAA;KAC5B,KAAK,OAAO,CAAC,YAAY,CAAC,CAAA;IAC3B,UAAU,EAAE,OAAO,CAAA;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,QAAQ,EAAE,OAAO,CAAA;IACjB,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,CA+ChE;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,CAmBpF"}
@@ -0,0 +1,12 @@
1
+ export { Booker, type BookerProps } from './Booker';
2
+ export { CalendarEmbed, type CalendarEmbedProps } from './CalendarEmbed';
3
+ export { Confirmation, type ConfirmationProps } from './Confirmation';
4
+ export { EventHeader, type EventHeaderProps } from './EventHeader';
5
+ export { MonthCalendar, type MonthCalendarProps } from './MonthCalendar';
6
+ export { TimeSlots, type TimeSlotsProps } from './TimeSlots';
7
+ export { BookingForm, type BookingFormProps } from './BookingForm';
8
+ export { useBooker, type UseBookerOptions, type BookerModel, type BookerPhase, } from './useBooker';
9
+ export { useEventType, useAvailableSlots, useCreateBooking, useBooking, type AsyncState, type SlotsQuery, type SlotsState, type CreateBookingState, type SubmitResult, } from './hooks';
10
+ export { DEFAULT_API_URL, CAL_API_VERSION, CalendarError, fetchEventType, fetchSlots, createBooking, fetchBooking, cancelBooking, type EventType, type Slot, type SlotsByDay, type Booking, type Attendee, type Location, type Profile, type BookingResponses, type CreateBookingInput, type SlotsInput, } from './client';
11
+ export { visitorTimeZone, ymd, monthMatrix, monthRange, weekdayLabels, formatMonthLabel, formatDayLong, formatSlotTime, formatBookingWhen, dateFromKey, startOfMonth, addMonths, sameMonth, isBeforeToday, type MonthCell, } from './time';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACxE,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAGrE,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAClE,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACxE,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAGlE,OAAO,EACL,SAAS,EACT,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,WAAW,GACjB,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,EACV,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,YAAY,GAClB,MAAM,SAAS,CAAA;AAGhB,OAAO,EACL,eAAe,EACf,eAAe,EACf,aAAa,EACb,cAAc,EACd,UAAU,EACV,aAAa,EACb,YAAY,EACZ,aAAa,EACb,KAAK,SAAS,EACd,KAAK,IAAI,EACT,KAAK,UAAU,EACf,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,OAAO,EACZ,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,UAAU,GAChB,MAAM,UAAU,CAAA;AAGjB,OAAO,EACL,eAAe,EACf,GAAG,EACH,WAAW,EACX,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,SAAS,EACT,SAAS,EACT,aAAa,EACb,KAAK,SAAS,GACf,MAAM,QAAQ,CAAA"}
@@ -0,0 +1,38 @@
1
+ /** The visitor's IANA time zone, e.g. "America/New_York". */
2
+ export declare function visitorTimeZone(): string;
3
+ /** Calendar date "YYYY-MM-DD" from a Date's local components. */
4
+ export declare function ymd(d: Date): string;
5
+ export declare function startOfMonth(d: Date): Date;
6
+ export declare function addMonths(d: Date, n: number): Date;
7
+ export declare function sameMonth(a: Date, b: Date): boolean;
8
+ /** True if the day key is strictly before today (lexicographic works on YYYY-MM-DD). */
9
+ export declare function isBeforeToday(key: string): boolean;
10
+ export interface MonthCell {
11
+ date: Date;
12
+ key: string;
13
+ inMonth: boolean;
14
+ }
15
+ /**
16
+ * A 6×7 grid of days covering the month of `viewDate`, including the leading
17
+ * and trailing days needed to fill whole weeks.
18
+ */
19
+ export declare function monthMatrix(viewDate: Date, weekStartsOn?: number): MonthCell[];
20
+ /**
21
+ * ISO start/end covering the visible month, clamped so the start is never in
22
+ * the past (the backend rejects past ranges anyway).
23
+ */
24
+ export declare function monthRange(viewDate: Date): {
25
+ startTime: string;
26
+ endTime: string;
27
+ };
28
+ /** Short weekday headers ordered from `weekStartsOn` (0 = Sunday). */
29
+ export declare function weekdayLabels(weekStartsOn?: number): string[];
30
+ export declare function formatMonthLabel(d: Date): string;
31
+ export declare function formatDayLong(d: Date): string;
32
+ /** Slot time in the visitor's zone, e.g. "9:00 AM". */
33
+ export declare function formatSlotTime(iso: string, timeZone: string): string;
34
+ /** Full human "when" for a confirmation, e.g. "Monday, July 27, 2026 at 9:00 AM PDT". */
35
+ export declare function formatBookingWhen(iso: string, timeZone: string): string;
36
+ /** A parsed local Date from a "YYYY-MM-DD" key (noon avoids DST edge slips). */
37
+ export declare function dateFromKey(key: string): Date;
38
+ //# sourceMappingURL=time.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../src/time.ts"],"names":[],"mappings":"AAGA,6DAA6D;AAC7D,wBAAgB,eAAe,IAAI,MAAM,CAMxC;AAED,iEAAiE;AACjE,wBAAgB,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAKnC;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAE1C;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAElD;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,OAAO,CAEnD;AAED,wFAAwF;AACxF,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,IAAI,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,OAAO,CAAA;CACjB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,SAAI,GAAG,SAAS,EAAE,CAWzE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,IAAI,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAQjF;AAED,sEAAsE;AACtE,wBAAgB,aAAa,CAAC,YAAY,SAAI,GAAG,MAAM,EAAE,CASxD;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAEhD;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAM7C;AAED,uDAAuD;AACvD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMpE;AAED,yFAAyF;AACzF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAgBvE;AAED,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAG7C"}
@@ -0,0 +1,41 @@
1
+ import { type Booking, type BookingResponses, type Slot } from './client';
2
+ import { type AsyncState, type SlotsState } from './hooks';
3
+ import type { EventType } from './client';
4
+ export type BookerPhase = 'pick' | 'form' | 'done';
5
+ export interface UseBookerOptions {
6
+ host: string;
7
+ eventSlug: string;
8
+ apiUrl?: string;
9
+ timeZone?: string;
10
+ weekStartsOn?: 0 | 1;
11
+ onBooked?: (booking: Booking) => void;
12
+ /** Auto-select the soonest available day (used by the compact embed). */
13
+ autoSelectFirst?: boolean;
14
+ }
15
+ export interface BookerModel {
16
+ api: string;
17
+ timeZone: string;
18
+ weekStartsOn: 0 | 1;
19
+ event: AsyncState<EventType>;
20
+ slots: SlotsState;
21
+ viewDate: Date;
22
+ availableKeys: Set<string>;
23
+ selectedDay: string | null;
24
+ daySlots: Slot[];
25
+ selectedSlot: string | null;
26
+ phase: BookerPhase;
27
+ booking: Booking | null;
28
+ submitting: boolean;
29
+ error: string | null;
30
+ conflict: boolean;
31
+ goPrevMonth: () => void;
32
+ goNextMonth: () => void;
33
+ atFirstMonth: boolean;
34
+ selectDay: (key: string) => void;
35
+ selectSlot: (iso: string) => void;
36
+ submit: (responses: BookingResponses) => Promise<void>;
37
+ back: () => void;
38
+ reset: () => void;
39
+ }
40
+ export declare function useBooker(opts: UseBookerOptions): BookerModel;
41
+ //# sourceMappingURL=useBooker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBooker.d.ts","sourceRoot":"","sources":["../src/useBooker.ts"],"names":[],"mappings":"AAGA,OAAO,EAAmB,KAAK,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,IAAI,EAAE,MAAM,UAAU,CAAA;AAC1F,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,UAAU,EAChB,MAAM,SAAS,CAAA;AAChB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAGzC,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;AAElD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;IACpB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,yEAAyE;IACzE,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,CAAC,GAAG,CAAC,CAAA;IACnB,KAAK,EAAE,UAAU,CAAC,SAAS,CAAC,CAAA;IAC5B,KAAK,EAAE,UAAU,CAAA;IACjB,QAAQ,EAAE,IAAI,CAAA;IACd,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,QAAQ,EAAE,IAAI,EAAE,CAAA;IAChB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,KAAK,EAAE,WAAW,CAAA;IAClB,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;IACvB,UAAU,EAAE,OAAO,CAAA;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,QAAQ,EAAE,OAAO,CAAA;IACjB,WAAW,EAAE,MAAM,IAAI,CAAA;IACvB,WAAW,EAAE,MAAM,IAAI,CAAA;IACvB,YAAY,EAAE,OAAO,CAAA;IACrB,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,MAAM,EAAE,CAAC,SAAS,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACtD,IAAI,EAAE,MAAM,IAAI,CAAA;IAChB,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,WAAW,CAqI7D"}